Skip to content

dowel

One theme, one token vocabulary, one set of primitives - so every product in the line looks made by one hand, and nobody sees the joint.

The stand is where the components are. Every one of them, live, in either theme and in the accent of any product of the line — change the accent and watch what follows from it: the hover shade, the soft fill, the focus ring, the colour of text on an accent fill. None of which a component states for itself.

The demo is where they are used: kilna-lite, a small product made of nothing but the blocks - whole screens built from the components - on an invented world.

These pages are where the reasons are. What a token means, why a scale has the steps it has, what a component will and will not do for you.

v0.41.0. The theme and its scales, an accent for each of the nineteen products of the line, every colour of each resolved for a product that does not draw with a browser - as JSON and as a Rust module, from one generator - the line’s marks at the level their size calls for, and a hundred and eighteen primitives, each with a page of its own on the stand, which remembers the theme, the accent and the density you left it in, and measures the contrast of whichever you chose; each page ends with what axe found on it, in both themes, and the history of its file, release by release - the whole of the first is the accessibility report. A form can be drawn from the JSON Schema its data already has, by SchemaFields. Four blocks - a list beside the open thing, settings, a sign-in, a dashboard’s first day - are drawn together in kilna-lite. Dates and numbers are written in the application’s language, never the browser’s, and a month of days holds the screen it is given. A key is written once, in one list of commands the keyboard, the palette and the sheet of shortcuts all read, and it works on any keyboard layout. Size now comes from the scale and is held there by a gate; a pointer target has a floor the set cannot fall under; and density is an attribute on a container rather than a prop, so one word on a form reaches every control inside it, buttons included. A dialog scrolls in its body and keeps its actions in the window, and a popup opened inside any overlay opens above it. Everything that opens over the page fits the window on both axes and is driven by the keyboard in a real browser, and a weekly mutation run holds every file’s tests to a floor of their own. Every props table is read from the component’s types, the catalogue finds an item down to a prop it takes, and recipes compose screens from files the tests render. The lint rules hold a product to the same scale and to Button rather than a raw <button>, and rewrite a size written the long way on their own. Components install from the registry with npx shadcn add, singly or as a set; the theme is the dowel-ui package, which also carries the migration tools a project crossing from stock shadcn runs on itself, and the upgrading guide lists every change that has broken a product, with the way through, read out of the changelog. Every class the set writes is compiled before it ships, and every heading a primitive draws stands at the level the page gives it. Every ink is held to its contrast floor on every ground it may stand on, for every product, in both themes and under more contrast, and a screen prints as dark ink on white whatever theme it is in. Two products of the line run on it: kilna and kasl-server.

Development goes in versions, each one a single coherent theme; the roadmap says what is next.