Mercurial
view design_system/README.md @ 256:30c2196d03d4
[site] Integrate Zenbu themes and components
Co-authored-by: Copilot <[email protected]>
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Tue, 04 Aug 2026 16:49:01 -0700 |
| parents | 2b6e732087ff |
| children | 60a876c4587a |
line wrap: on
line source
# Zenbu UI design system Zenbu UI is a dependency-free set of light-DOM Web Components and CSS tokens. It stays close to ordinary HTML: components wrap native controls and sectioning elements instead of replacing their semantics. The catalog includes native Zenbu implementations of all 65 concepts currently listed by shadcn/ui. These are original Web Components using Zenbu tokens, not ports of shadcn's React, Radix, or third-party runtime. See [`COMPONENTS.md`](COMPONENTS.md) for the complete mapping and HTML contracts. ## Catalog Run the Seobeo-backed component catalog: ```bash bazel run //design_system:dev ``` Open `http://127.0.0.1:6980`. Override the port with `DESIGN_SYSTEM_PORT`. The catalog is intentionally Storybook-like without depending on Storybook. Its stories are declared as HTML templates: ```html <zen-story name="Primary button"> <template> <zen-button> <button type="button">Save</button> </zen-button> </template> </zen-story> ``` The story component renders the example and its source side by side. ## Reuse Reusable assets are public Bazel targets: ```text //design_system:components //design_system:styles //design_system:web_assets ``` Applications should copy the assets while preserving `components/` and `styles/`, then load: ```html <link rel="stylesheet" href="/design-system/styles/tokens.css"> <link rel="stylesheet" href="/design-system/styles/components.css"> <script type="module" src="/design-system/components/index.js"></script> ``` Every visual token is a `--zen-*` custom property and can be overridden by the application. See [`COLORS.md`](COLORS.md) for the complete warm color ramps, material aliases, semantic roles, dark-theme behavior, and data palette. Named [`themes`](THEMES.md) compose those tokens as Paper, Ink, and Playful experiences in addition to automatic system light/dark behavior. Use [`zen-icon`](ICONS.md) for all interface iconography. Design-system source does not use emoji, ad hoc SVG, icon fonts, or third-party icon packages. All exported JavaScript APIs use Google-style JSDoc. The policy target checks the documentation contract along with token-only colors and first-party icons. The catalog navigation is searchable with `/`, and every route is exercised at desktop and mobile widths. Form controls reset browser chrome; date selection uses Zenbu's first-party keyboard calendar. ## Native HTML contract | Component family | Native content | Attributes | Events | | --- | --- | --- | --- | | `zen-button` | direct `button` or `a` | `variant`, `loading`, `disabled` | native click/form events | | `zen-card` | direct `article` or `section` | `interactive` | native descendant events | | `zen-alert` | message HTML | `tone`, `dismissible` | `zen-dismiss` | | `zen-field` | direct `label`, form control, help text | native control attributes | native input/change/invalid | | `zen-notifications` | descendant event producers | `aria-label`, `dismiss-label` | `zen-notification-action`, `zen-notification-removed` | | `zen-stack` | any HTML | `direction`, `gap` | native descendant events | | Disclosure and tabs | `details`, `summary`, buttons, sections | `multiple`, `activation` | `zen-change` | | Dialogs and menus | native `dialog`, buttons, links | `placement`, native attributes | native click/close | | Form controls | native input, select, textarea, fieldset | native control attributes | native form events | | Collections | table, article, section, scroll containers | component-specific data hooks | `zen-change`, `zen-sort`, `zen-resize` | Do not put business state into the design-system components. They provide presentation, small accessibility wiring, and interaction affordances while applications retain data and workflow ownership. ### Notifications See [`NOTIFICATIONS.md`](NOTIFICATIONS.md) for the complete event contract, queue semantics, actions, timing, and accessibility behavior. Place one scope around the part of the application that owns notifications: ```html <zen-notifications aria-label="Notifications"> <main id="application"></main> </zen-notifications> ``` Any descendant can dispatch a non-composed bubbling event: ```js source.dispatchEvent(new CustomEvent("zen-notify", { bubbles: true, composed: false, detail: { version: 1, id: "deployment-complete", tone: "success", message: "Deployment complete", announcement: "polite", durationMs: 5000, }, })); ``` Use `zen-dismiss-notification` with `{ version: 1, id }` to dismiss by ID. Actions contain only an opaque token and label; clicking dispatches `zen-notification-action`. Tokens are held in private component state and never written to DOM attributes. The component renders three records and retains up to 20 additional queued records. ## Tests ```bash bazel test //design_system/test:storybook_test bazel build //design_system:design_system_server_bundle ```