Extraction moved the components out but left the site looking exactly the same, which is the interesting part. A reader sees no seam where the UI kit became a package. That only works because the visual system was split along a clean line. The app kept the parts that are its own identity, and the package took the parts that are generically reusable. This section covers what the reader sees and how the browser helps, and this page draws the line the rest of it depends on.
Who owns what
The look of the site now has two owners, and the split is consistent. The app owns identity. The package owns mechanism.
- The app owns the design tokens, the brand, the page layouts, and the icon data. The OKLCH theme values, the hero and layout CSS, and the glyphs in
src/data/icons.tsare all this site specifically. bloomwright-uiowns the component CSS and the primitives. The callout, mockup, list, and code-block styles, and the button and panel primitives, are the same anywhere the kit is used.
That division is why a second project could adopt bloomwright-ui and look nothing like this one. It would bring its own tokens, brand, and icons, and get the same components underneath. The bloomwright/ui_components page argues this from the package side. Here it sets up the sections that follow.
What this section covers
The interface pages move from the static look to the browser’s role in it.
css_architecturewalks the ordered stylesheet manifest, the DaisyUI include list, and a duplication the extraction left behind.themingcovers the OKLCH themes and the three separate moments a theme has to be correct.progressive_enhancementcovers the runtime boundary, now split across repositories.build_time_datacovers consuming an external source at build time and letting the browser localize the result.reading_navigationcovers the app-owned reading experience, from heading tracking to the vault explorer.portfolio_surfacescovers the project pages and the recruiter profile, the surfaces outside the journal.
Motion is part of the system
One piece of the visual system is easy to forget because it is subtle. The site uses parallax and small transitions, and it treats reduced-motion as a first-class case rather than an afterthought. The layout CSS carries the parallax rules, and the transition rules respect a reader’s motion preference, so a reader who asks for less motion gets a calmer page rather than a broken one.
Motion belongs to the app, not the package, because it is part of this site’s feel. A component from bloomwright-ui renders the same whether the page around it animates or not, and the app decides how much movement wraps it. That keeps the kit neutral and the personality local, which is the same split the rest of this section describes.
The line holds under maintenance
The payoff of a clean visual split is that a change has an obvious home. A new brand color is a token change in the app. A callout that needs a new style is a package change. A page layout tweak is app CSS, and a primitive’s appearance is package CSS. The reader sees one coherent surface, and a maintainer sees two clearly separated sets of responsibilities behind it.
The line is not perfectly clean, and the next page is honest about where it blurs. The app keeps local copies of some component CSS the package also ships, which is a real cost of the extraction. Naming it is more useful than pretending the split is flawless, and the css_architecture page does exactly that.
