{
  "path": "/3mjlkkbla7k2o",
  "site": "at://did:plc:xg2vq45muivyy3xwatcehspu/site.standard.publication/3m3zpxhfl3c2s",
  "tags": [
    "markdown",
    "react",
    "rust",
    "tauri",
    "devlog",
    "flutter",
    "dart",
    "solidjs"
  ],
  "$type": "site.standard.document",
  "title": "What I did while distracted",
  "content": {
    "$type": "pub.leaflet.content",
    "pages": [
      {
        "id": "019d8e86-7a4d-7bb8-be5f-19d4a0a28409",
        "$type": "pub.leaflet.pages.linearDocument",
        "blocks": [
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 184,
                    "byteStart": 173
                  },
                  "features": [
                    {
                      "uri": "https://github.com/stormlightlabs/writer",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "This Jackie Robinson day I found myself wearing my royal blue Brooklyn Dodgers cap almost all day, and working on both iterations of Lazurite and mapping out what v0.4.0 of Commonplace will look like. "
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 124,
                    "byteStart": 104
                  },
                  "features": [
                    {
                      "uri": "https://pub.dev/packages/flutter_native_splash",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 225,
                    "byteStart": 220
                  },
                  "features": [
                    {
                      "uri": "http://npmx.dev/package/sharp",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "The amount of assets you have to add coupled with XML in a mobile app really blows my mind. I added the native splash screen package to the flutter toolchain coupled with a small bun program to generate the images (with sharp) from the Lazurite logo and it produced 55 assets. The diff just to add a splash screen was one of the more absurd I've had recently. Icons are no different."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 57,
                    "byteStart": 47
                  },
                  "features": [
                    {
                      "uri": "https://developer.apple.com/app-store/review/guidelines/#design",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "I've been working through the app store review guidelines."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 69,
                    "byteStart": 58
                  },
                  "features": [
                    {
                      "uri": "https://tangled.org/desertthunder.dev/lazurite-desktop",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 230,
                    "byteStart": 222
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                },
                {
                  "index": {
                    "byteEnd": 324,
                    "byteStart": 292
                  },
                  "features": [
                    {
                      "uri": "https://github.com/egoist/tailwindcss-icons",
                      "$type": "pub.leaflet.richtext.facet#link"
                    }
                  ]
                }
              ],
              "plaintext": "Speaking of icons, the way I have icons setup in Lazurite for desktop is a little silly. I use my favorite functional paradigm on the frontend, namely union/enumerated types and switch/match cases. I have a giant union of IconKind strings that map to icon classes from remix, exposed through egoist's tailwindcssicons plugin. This gives me intellisense all the way down which is super nice."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.code",
              "language": "tsx",
              "plaintext": "export function Icon(props: IconProps) {\n  const [local, rest] = splitProps(props, [\"class\", \"iconClass\", \"kind\", \"name\"]);\n\n  return (\n    <span {...rest} class=\"flex items-center justify-center\" classList={{ [local.class ?? \"\"]: !!local.class }}>\n      <Switch>\n        <Match when={!!local.iconClass}>\n          <i class={local.iconClass} />\n        </Match>\n        <Match when={local.kind === \"quill\"}>\n          <i class=\"i-ri-quill-pen-line\" />\n        </Match>\n        {/* There's like a million more of these */}\n      </Switch>\n    </span>\n  );",
              "syntaxHighlightingTheme": "kanagawa-dragon"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 79,
                    "byteStart": 62
                  },
                  "features": [
                    {
                      "$type": "pub.leaflet.richtext.facet#code"
                    }
                  ]
                }
              ],
              "plaintext": "The most import QoL part of this is that it wraps the icon in flex items-center to make sure the icon alignment is where I want it to be."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "It's a pattern that seems like its \"slop\" but the funny thing is, any time an agent works on UI, it never uses available Icon variants. It just uses the iconClass override."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "facets": [
                {
                  "index": {
                    "byteEnd": 35,
                    "byteStart": 23
                  },
                  "features": [
                    {
                      "did": "did:plc:rnqol7ddqwydvhnxhe6xhlml",
                      "$type": "pub.leaflet.richtext.facet#didMention"
                    }
                  ]
                }
              ],
              "plaintext": "I like the affordances @solidjs.com provides quite a bit. Reactivity seems to work the way you expect it to and I don't find myself hitting many of the footguns that React has. Whether or not that has anything to do with my abilities as an engineer remains to be seen."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.horizontalRule"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Speaking of React, I dove back into the Commonplace codebase today mostly to figure out where I want to go with the next release. So far it looks like:"
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.unorderedList",
              "children": [
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "facets": [
                      {
                        "index": {
                          "byteEnd": 13,
                          "byteStart": 0
                        },
                        "features": [
                          {
                            "uri": "https://standard.site",
                            "$type": "pub.leaflet.richtext.facet#link"
                          }
                        ]
                      }
                    ],
                    "plaintext": "standard.site publishing (leaflet, pckt, & greengale)"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "Find & replace in document"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "Wikilinks"
                  }
                },
                {
                  "$type": "pub.leaflet.blocks.unorderedList#listItem",
                  "content": {
                    "$type": "pub.leaflet.blocks.text",
                    "plaintext": "Toggleable document outlines"
                  }
                }
              ]
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "Deferred for v0.5.0 is private Github gists & publishing gists (I've already got ATmosphere/BlueSky OAuth setup in the application so we don't need to add any plumbing there)."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": "There are lots of markdown note taking apps out there. If you want to check out the one I built, you can download it for your operating system of choice (Mac, Windows, or Linux) on Github."
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "src": "https://github.com/stormlightlabs/writer/releases/tag/v0.3.1",
              "$type": "pub.leaflet.blocks.website",
              "title": "Release Commonplace v0.3.1-pre ยท stormlightlabs/writer",
              "description": "You&#39;ll find a brand-new face for Writer Commonplace! We&#39;ve given it a cleaner, darker design and a brand new welcome screen. Here are some more details: Added  Image support PDF exports now...",
              "previewImage": {
                "$type": "blob",
                "ref": {
                  "$link": "bafkreif7oh3pttn4ay4elad325tlnk2xhgdkhh36tzgimqblqufe5mohdi"
                },
                "mimeType": "image/png",
                "size": 22409
              }
            }
          },
          {
            "$type": "pub.leaflet.pages.linearDocument#block",
            "block": {
              "$type": "pub.leaflet.blocks.text",
              "plaintext": ""
            }
          }
        ]
      }
    ]
  },
  "bskyPostRef": {
    "cid": "bafyreigkuyhlf4ya4jvif6rvc6z7s4hsgstsun3qemhzxzjojryfkajbei",
    "uri": "at://did:plc:xg2vq45muivyy3xwatcehspu/app.bsky.feed.post/3mjlkkh5chc2o",
    "commit": {
      "cid": "bafyreif42qs3d7o5ukyrm4sd2caajduogpoznjqv4hdyulsob5g7lc5xci",
      "rev": "3mjlkkhaoun2p"
    },
    "validationStatus": "valid"
  },
  "description": "Dev Log 50: 2026-04-15",
  "publishedAt": "2026-04-16T04:18:37.145Z"
}