@tollerud/ui 3.1.0 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/AGENTS.md +20 -4
  2. package/CHANGELOG.md +122 -0
  3. package/COMPONENTS.md +13 -1
  4. package/GETTING_STARTED.md +0 -58
  5. package/README.md +31 -59
  6. package/SKILL.md +6 -4
  7. package/components.json +1 -1
  8. package/dist/bento-dashboard.js +1 -1
  9. package/dist/button.d.ts +2 -2
  10. package/dist/button.js +1 -1
  11. package/dist/checkbox.js +1 -1
  12. package/dist/{chunk-ADE22JSR.js → chunk-BQWF5MP7.js} +7 -7
  13. package/dist/chunk-BQWF5MP7.js.map +1 -0
  14. package/dist/{chunk-IUPVQWO5.js → chunk-FPFLOYIJ.js} +5 -5
  15. package/dist/chunk-FPFLOYIJ.js.map +1 -0
  16. package/dist/{chunk-6SKTH45H.js → chunk-J2Z4ZFVX.js} +29 -18
  17. package/dist/chunk-J2Z4ZFVX.js.map +1 -0
  18. package/dist/{chunk-YPP7QHYT.js → chunk-K4ALNUZI.js} +4 -4
  19. package/dist/{chunk-YPP7QHYT.js.map → chunk-K4ALNUZI.js.map} +1 -1
  20. package/dist/{chunk-ONMTHBZ4.js → chunk-LGVXEWNB.js} +10 -10
  21. package/dist/chunk-LGVXEWNB.js.map +1 -0
  22. package/dist/{chunk-OVSIOZHJ.js → chunk-SNNMZ444.js} +3 -3
  23. package/dist/{chunk-OVSIOZHJ.js.map → chunk-SNNMZ444.js.map} +1 -1
  24. package/dist/{chunk-T3TQPOVM.js → chunk-TLEKK53J.js} +5 -8
  25. package/dist/chunk-TLEKK53J.js.map +1 -0
  26. package/dist/cta-band.js +1 -1
  27. package/dist/data-table.js +3 -3
  28. package/dist/index.js +7 -7
  29. package/dist/pricing-card.js +2 -2
  30. package/dist/radio-group.d.ts +6 -0
  31. package/dist/radio-group.js +1 -1
  32. package/globals-layers.css +27 -1
  33. package/package.json +16 -20
  34. package/registry.json +14 -9
  35. package/tokens.css +29 -5
  36. package/dist/chunk-6SKTH45H.js.map +0 -1
  37. package/dist/chunk-ADE22JSR.js.map +0 -1
  38. package/dist/chunk-IUPVQWO5.js.map +0 -1
  39. package/dist/chunk-ONMTHBZ4.js.map +0 -1
  40. package/dist/chunk-T3TQPOVM.js.map +0 -1
  41. package/globals-v4.css +0 -2
  42. /package/{tollerud-avatar-full.png → brand/tollerud-avatar-full.png} +0 -0
  43. /package/{tollerud-avatar-full.svg → brand/tollerud-avatar-full.svg} +0 -0
  44. /package/{tollerud-avatar.png → brand/tollerud-avatar.png} +0 -0
  45. /package/{tollerud-avatar.svg → brand/tollerud-avatar.svg} +0 -0
  46. /package/{tollerud-logo.svg → brand/tollerud-logo.svg} +0 -0
package/AGENTS.md CHANGED
@@ -293,7 +293,7 @@ Severity scale: `critical` · `high` · `medium` · `low` · `info`
293
293
  The monogram must always appear left of the project name with `gap-2`. Never show the name without the monogram or the monogram alone in a nav context.
294
294
 
295
295
  ```tsx
296
- import logo from '@tollerud/ui/tollerud-logo.svg'
296
+ import logo from '@tollerud/ui/brand/tollerud-logo.svg'
297
297
 
298
298
  // Top bar
299
299
  <nav className="tollerud-glass fixed top-0 inset-x-0 z-50 h-14 flex items-center px-6 gap-6">
@@ -330,7 +330,9 @@ Monogram sizing: top bar/sidebar expanded → `h-5`, sidebar collapsed → `h-6`
330
330
 
331
331
  ```html
332
332
  <h1 class="tollerud-display text-[70px]">Dark. Monochrome.</h1>
333
- <h2 class="tollerud-display--secondary text-[40px]">Yellow where it counts</h2>
333
+ <h2 class="tollerud-display--secondary text-[40px]">
334
+ <span class="tollerud-display-shimmer">Yellow where it counts</span>
335
+ </h2>
334
336
  ```
335
337
 
336
338
  ### Container
@@ -397,6 +399,19 @@ When asked to add components, fix bugs, or cut a release:
397
399
  npm run validate # typecheck + lint + test + build
398
400
  ```
399
401
 
402
+ ### 1b. `package-lock.json` must match CI npm
403
+
404
+ GitHub Actions uses **Node 24 + npm 11** (`packageManager` in `package.json` pins `npm@11.16.0`). Regenerating the lockfile with a different npm major can produce entries that **`npm ci` rejects on CI**.
405
+
406
+ When you change dependencies or bump the package version:
407
+
408
+ ```bash
409
+ npx npm@11.16.0 install # refresh lockfile — use the pinned npm, not an arbitrary local version
410
+ rm -rf node_modules && npx npm@11.16.0 ci # verify before push
411
+ ```
412
+
413
+ Never use `npm install --package-lock-only` alone for version bumps — it can desync optional peer entries. Commit `package-lock.json` in the same commit as `package.json` changes.
414
+
400
415
  ### 2. Every new component needs all four of these
401
416
 
402
417
  | What | Where |
@@ -416,8 +431,9 @@ npm run validate # typecheck + lint + test + build
416
431
 
417
432
  Edit `package.json` version, then update these to match:
418
433
  - `COMPLETENESS_ROADMAP.md` — header line `### npm package (components/*.tsx) — vX.X.X`
419
- - `registry.json` — top-level `"version"` field
420
- - `docs/app.jsx` — sidebar brand line `user interface · vX.X.X`
434
+ - `registry.json` — top-level `"version"` field (or run `npm run sync:registry`)
435
+
436
+ The docs sidebar version reads live from `package.json` via `PACKAGE_VERSION` in `docs-app/lib/docs-stats.js` — no manual edit.
421
437
 
422
438
  ### 4. Always update these files in the same commit
423
439
 
package/CHANGELOG.md CHANGED
@@ -7,6 +7,128 @@
7
7
  • Never write bold mid-paragraph as a heading substitute — it merges into surrounding text
8
8
  -->
9
9
 
10
+ ## 4.0.1 — 2026-06-10 — npm-only install path
11
+
12
+ Patch release: drops copy-via-shadcn registry tooling. Install from the package — barrel or subpath imports.
13
+
14
+ ### Removed
15
+
16
+ - `npm run test:registry-cli`, `npm run build:registry`, and `examples/registry-consumer/`
17
+ - `registry-dist/` build output (never shipped to npm in v4.0.0)
18
+ - Public shadcn `npx shadcn add` install docs — no consumers use copy-into-repo flow
19
+
20
+ ### Docs
21
+
22
+ - Getting started leads with `npm install @tollerud/ui` and subpath imports (`@tollerud/ui/button`)
23
+ - `registry.json` remains for internal drift checks (`npm run test:drift`) only
24
+
25
+ ### Migration
26
+
27
+ Use the package directly:
28
+
29
+ ```tsx
30
+ import { Button } from '@tollerud/ui'
31
+ // or tree-shake:
32
+ import { Button } from '@tollerud/ui/button'
33
+ ```
34
+
35
+ Do not copy component source via shadcn CLI — that path is unsupported.
36
+
37
+ ---
38
+
39
+ ## 4.0.0 — 2026-06-10 — Ecosystem hardening and globals-v4 removal
40
+
41
+ Major release: completes the post-v3 roadmap (light gallery, registry CLI, footer lockstep), reorganizes brand assets, and drops deprecated CSS entrypoints.
42
+
43
+ ### Breaking changes
44
+
45
+ - Removed `@tollerud/ui/globals-v4.css` — it was an alias for `globals.css`. Tailwind v4 projects should import `@tollerud/ui/globals.css` only.
46
+ - Brand assets moved under `@tollerud/ui/brand/*` — e.g. `@tollerud/ui/brand/tollerud-logo.svg` (not package-root paths).
47
+
48
+ ### Ecosystem
49
+
50
+ - `@tollerud/footer` — `packages/footer/` synced from `components/Footer.tsx` via `npm run sync:footer`; `npm run verify:footer-sync` in `validate`
51
+ - Changesets linked `@tollerud/ui` and `@tollerud/footer` for joint version bumps
52
+ - Registry drift checks via `registry.json` (`npm run test:drift`) — internal manifest, not a public shadcn install path
53
+
54
+ ### Docs site
55
+
56
+ - Light-mode gallery parity — docs-only Tailwind preset maps `tollerud-*` utilities to CSS variables so npm previews flip in `data-theme="light"`
57
+ - Docs icons migrated to `lucide-react` (custom GitHub mark retained)
58
+ - Playwright coverage — forms page, command palette, theme toggle, light-mode card surfaces
59
+ - Brand assets canonical in `brand/`; synced to docs via `scripts/sync-brand-assets.mjs`
60
+ - Homepage and live docs URL → `https://design.tollerud.dev/`
61
+
62
+ ### Tooling
63
+
64
+ - CI and dev tooling on Node 24 + npm 11.16.0 (`.nvmrc`, lockfile guardrails)
65
+ - Dependabot for `docs-app/` and `examples/consumer/`
66
+ - Removed legacy `preview.html`, completed planning docs, and stale docs artifacts
67
+ - Consumer smoke test auto-syncs tarball version in `examples/consumer/package.json`
68
+
69
+ ### Migration
70
+
71
+ **globals-v4.css** — replace:
72
+
73
+ ```css
74
+ @import "@tollerud/ui/globals-v4.css";
75
+ ```
76
+
77
+ with:
78
+
79
+ ```css
80
+ @import "@tollerud/ui/globals.css";
81
+ @source "../node_modules/@tollerud/ui/dist";
82
+ ```
83
+
84
+ **Brand assets** — replace root imports:
85
+
86
+ ```ts
87
+ import logo from '@tollerud/ui/tollerud-logo.svg'
88
+ ```
89
+
90
+ with:
91
+
92
+ ```ts
93
+ import logo from '@tollerud/ui/brand/tollerud-logo.svg'
94
+ ```
95
+
96
+ No component API changes. `@tollerud/ui` barrel and subpath imports unchanged.
97
+
98
+ ---
99
+
100
+ ## 3.1.1 — 2026-06-09 — Display shimmer, form indicators, and button fixes
101
+
102
+ Patch release: ships hero text shimmer for consumer apps, fixes secondary/checkbox/radio styling, and polishes docs layout components.
103
+
104
+ ### New utilities
105
+
106
+ - `.tollerud-display-shimmer` — animated yellow gradient clipped to text; respects `prefers-reduced-motion` (static `var(--primary)` fallback)
107
+
108
+ ### Fixes
109
+
110
+ - `Button` — secondary variant restores raised surface and border (theme-aware CSS vars); all variants apply layer classes again
111
+ - `Checkbox` — checkmark visible on `defaultChecked` and click via `peer-checked` on the custom indicator
112
+ - `RadioGroup` — wires `value`, `onChange`, and `name` to children; inner dot shows when selected
113
+ - `CTABand` — title and description centered in the band
114
+ - `BentoDashboard` — section spacing and label alignment
115
+ - Docs `PageTOC` — restores `jumpToSection` import for in-page scroll
116
+
117
+ ### Registry
118
+
119
+ - Top-level `name` → `Tollerud User Interface`; updated description and component metadata for blocks
120
+
121
+ ### Docs
122
+
123
+ - Overview, Backgrounds, and Foundations Typography use `.tollerud-display-shimmer` (replaces docs-only `.ds-shimmer`)
124
+ - Light theme shimmer and secondary-button token overrides
125
+
126
+ ### Migration
127
+
128
+ Drop-in. Replace any copied `.ds-shimmer` with `.tollerud-display-shimmer` from `@tollerud/ui/globals.css`.
129
+
130
+ ---
131
+
10
132
  ## 3.1.0 — 2026-06-09 — Monogram component and docs fixes
11
133
 
12
134
  Restores component styling in the docs site, ships the monogram as an npm component, and renames brand avatar assets.
package/COMPONENTS.md CHANGED
@@ -786,10 +786,22 @@ The config-driven table. Pass `rows` + a `columns` spec and opt into search, a f
786
786
 
787
787
  ```html
788
788
  <h1 class="tollerud-display text-[70px]">Dark. Monochrome.</h1>
789
- <h2 class="tollerud-display--secondary text-[40px]">Yellow where it counts</h2>
789
+ <h2 class="tollerud-display--secondary text-[40px]">
790
+ <span class="tollerud-display-shimmer">Yellow where it counts</span>
791
+ </h2>
790
792
  <h3 class="tollerud-display--tertiary text-[28px]">Subtle hierarchy</h3>
791
793
  ```
792
794
 
795
+ ## Display shimmer
796
+
797
+ Animated yellow gradient clipped to text — for hero accent lines and key metrics on **dark surfaces**. Respects `prefers-reduced-motion` (falls back to static `var(--primary)` / `var(--tollerud-yellow)`).
798
+
799
+ ```html
800
+ <span class="tollerud-display-shimmer">Yellow where it counts.</span>
801
+ ```
802
+
803
+ Pair with `.tollerud-display` on the parent heading. Not for body copy or light backgrounds (yellow fails contrast on white).
804
+
793
805
  ## Container
794
806
 
795
807
  ```jsx
@@ -79,71 +79,13 @@ Import individual components without pulling the full barrel:
79
79
 
80
80
  ```tsx
81
81
  import { Button } from '@tollerud/ui/button'
82
- import { Dialog, DialogContent } from '@tollerud/ui/dialog'
83
82
  import { cn } from '@tollerud/ui/utils'
84
83
  ```
85
84
 
86
- Every component in the catalog has a matching subpath (kebab-case filename). The main `@tollerud/ui` entry still works for convenience.
87
-
88
- ---
89
-
90
- ## Toaster (optional)
91
-
92
- Mount the `Toaster` once near your app root to enable `sonner` toast notifications:
93
-
94
- ```tsx
95
- // app/layout.tsx
96
- import { Toaster } from '@tollerud/ui'
97
-
98
- export default function RootLayout({ children }) {
99
- return (
100
- <html>
101
- <body>
102
- {children}
103
- <Toaster />
104
- </body>
105
- </html>
106
- )
107
- }
108
- ```
109
-
110
- ---
111
-
112
- ## Import Components
113
-
114
- All 61 components are named exports from `@tollerud/ui`:
115
-
116
- ```tsx
117
- // Basics
118
- import { Button, Card, Badge, StatusDot, Kbd, Input, Textarea } from '@tollerud/ui'
119
-
120
- // Overlays
121
- import { Dialog, DialogContent, Tooltip, TooltipProvider, Sheet } from '@tollerud/ui'
122
-
123
- // Data & infra
124
- import { DataTable, HostCard, LogViewer, CommandMenu } from '@tollerud/ui'
125
- ```
126
-
127
85
  See [COMPONENTS.md](COMPONENTS.md) for the full prop reference.
128
86
 
129
87
  ---
130
88
 
131
- ## shadcn / registry
132
-
133
- Install individual components via the registry:
134
-
135
- ```bash
136
- npx shadcn@latest add https://unpkg.com/@tollerud/ui@latest/registry.json
137
- ```
138
-
139
- Or add a single component:
140
-
141
- ```bash
142
- npx shadcn@latest add button --registry https://unpkg.com/@tollerud/ui@latest/registry.json
143
- ```
144
-
145
- ---
146
-
147
89
  ## Server Components
148
90
 
149
91
  `@tollerud/ui` ships client bundles with `'use client'`. Importing components (or `cn`, `buttonVariants`) from a Server Component file is safe — the import does not force your file to become a Client Component.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  A complete, browsable UI library built around **monochrome + yellow accent**. Noir aesthetic meets modern utility.
4
4
 
5
- **[Live docs →](https://tollerud.github.io/design-system/)** — browse every token, component, and pattern live with copy-paste code.
5
+ **[Live docs →](https://design.tollerud.dev/)** — browse every token, component, and pattern live with copy-paste code.
6
6
 
7
7
  **Requirements:** React ≥ 18 · TypeScript supported (types included) · Tailwind CSS v4 (v3 supported via `globals-v3.css`)
8
8
 
@@ -141,7 +141,7 @@ Include `tokens.css` or `globals.css` for CSS custom properties and utility clas
141
141
 
142
142
  ### Brand Mascot
143
143
 
144
- The design system includes `tollerud-avatar.svg` a full cel-shaded monochrome illustration of Tia in her black gakuran, available in `design-system/` for use in headers, landing pages, branding, or anywhere the Tia identity appears.
144
+ The design system ships brand assets under `brand/` — import via `@tollerud/ui/brand/tollerud-avatar.svg` (and `.png` / full-figure variants) for headers, landing pages, and agent identity moments. Prefer `<Monogram />` for nav lockups.
145
145
 
146
146
  ## Palette Summary
147
147
 
@@ -204,74 +204,45 @@ The design system includes `tollerud-avatar.svg` — a full cel-shaded monochrom
204
204
  4. **Sharp when it counts** — Radius is subtle. Full round only for pills. Sharp corners for the noir feel.
205
205
  5. **Glow with purpose** — Yellow glow only on hover/active states. Never decorative.
206
206
 
207
- ## shadcn Registry
207
+ ## Install
208
208
 
209
209
  ```bash
210
- # Add via shadcn CLI — registry ships with the npm package
211
- npx shadcn@latest add button --registry https://unpkg.com/@tollerud/ui/registry.json
210
+ npm install @tollerud/ui clsx tailwind-merge tailwindcss
211
+ ```
212
212
 
213
- # Or copy source manually
214
- cp -r components/ src/components/ui
215
- cp globals.css src/app/
216
- cp tollerud-preset.js .
213
+ ```tsx
214
+ import { Button, Card } from '@tollerud/ui'
215
+ // or tree-shake:
216
+ import { Button } from '@tollerud/ui/button'
217
217
  ```
218
218
 
219
- See [GETTING_STARTED.md](GETTING_STARTED.md) for the full setup guide.
219
+ See [GETTING_STARTED.md](GETTING_STARTED.md) for Tailwind setup and peer dependencies.
220
220
 
221
221
  ## File Structure
222
222
 
223
223
  ```
224
224
  design-system/
225
- ├── package.json # NPM package metadata
226
- ├── README.md # This file
227
- ├── CHANGELOG.md # Version history
228
- ├── ACCESSIBILITY.md # Contrast, focus, reduced motion
229
- ├── BACKGROUNDS.md # NoirGlowBackground usage + fallback docs
230
- ├── COMPONENTS.md # Full component reference + state matrix
231
- ├── KEYBOARD.md # Keyboard contract and shortcut reference
232
- ├── VOICE.md # Copy guidelines and tone
233
- ├── COMPLETENESS_ROADMAP.md # Research and future plans
234
- ├── SKILL.md # Verified component catalog & gotchas for AI agents
235
- ├── tollerud-preset.js # 🏆 Drop-in Tailwind preset
236
- ├── tailwind.config.js # (backward compat standalone config)
237
- ├── globals.css # 🏆 Tailwind v4 entry (tokens + component layers)
238
- ├── globals-v3.css # Tailwind v3 legacy (@tailwind + layers)
225
+ ├── .nvmrc # Node 24 for local dev / CI parity
226
+ ├── package.json # @tollerud/ui — version, exports, scripts
227
+ ├── registry.json # Internal drift manifest (not a public install path)
228
+ ├── CHANGELOG.md # Version history (synced to docs on build)
229
+ ├── SKILL.md # AI agent catalog source of truth for exports
230
+ ├── COMPONENTS.md # Human prop reference
231
+ ├── AGENTS.md # Contributor / release guide
232
+ ├── brand/ # Logo + Tia avatars (npm: @tollerud/ui/brand/*)
233
+ ├── components/ # React components (*.tsx) + index.ts barrel
234
+ ├── globals.css # Tailwind v4 entry (tokens + component layers)
235
+ ├── globals-v3.css # Tailwind v3 legacy
239
236
  ├── globals-layers.css # Shared component CSS layers
240
- ├── globals-v4.css # Alias → globals.css
241
- ├── tokens.css # (backward compat CSS vars only)
242
- ├── preview.html # Visual reference
243
- ├── tollerud-avatar.svg # Brand mascot
244
- ├── components/
245
- │ ├── index.ts # Barrel exports
246
- ├── Button.tsx # 5 variants, 3 sizes
247
- ├── Card.tsx # Surface cards with optional accent
248
- │ ├── Badge.tsx # 6 variants
249
- │ ├── StatusDot.tsx # Online/offline/warning/idle
250
- │ ├── Input.tsx # With label + error state
251
- │ ├── CodeBlock.tsx # Terminal/code display
252
- │ ├── StatCard.tsx # Dashboard stat card
253
- │ ├── NoirGlowBackground.tsx # Tollerud.no shader background primitive
254
- │ ├── Kbd.tsx # Keyboard shortcut chip (⌘K style)
255
- │ ├── ActionRow.tsx # Command/action item row
256
- │ ├── CommandMenu.tsx # Raycast-style command palette
257
- │ ├── ServiceHealthCard.tsx # Service status card
258
- │ ├── HostCard.tsx # Server/VM card
259
- │ ├── DockerStackCard.tsx # Docker Compose stack card
260
- │ ├── IncidentCard.tsx # Severity-graded incident card
261
- │ ├── ApprovalCard.tsx # Approve/reject card
262
- │ ├── ActionDiff.tsx # Unified diff viewer
263
- │ ├── RollbackPlan.tsx # Rollback step list
264
- │ ├── LogViewer.tsx # Terminal-style log viewer
265
- │ ├── AlertInbox.tsx # Alert feed with acknowledge
266
- │ ├── Timeline.tsx # Vertical activity timeline
267
- │ ├── BackupStatusPanel.tsx # Backup job overview
268
- │ └── Container.tsx # Layout width constraint
269
- ├── docs-app/ # Next.js docs site (static export → _site/ for GitHub Pages)
270
- │ ├── app/ # App Router entry
271
- │ ├── components/ # Page demos (primitives, charts, marketing)
272
- │ └── lib/ # ui-merged.js + docs-adapters.jsx (npm-backed)
273
- └── docs/
274
- └── docs.css # Shared docs chrome styles (imported by docs-app)
237
+ ├── tokens.css # Design tokens
238
+ ├── tollerud-preset.js # Tailwind preset
239
+ ├── scripts/ # Build, validate, docs, and release helpers
240
+ ├── docs-app/ # Next.js docs (static export → _site/)
241
+ ├── app/ # App Router
242
+ │ ├── components/ # Page demos + docs shell
243
+ └── public/CNAME # design.tollerud.dev
244
+ ├── examples/consumer/ # npm tarball smoke test
245
+ └── docs/docs.css # Docs chrome (imported by docs-app)
275
246
  ```
276
247
 
277
248
  ## Graphify-inspired Components
@@ -288,4 +259,5 @@ New additions inspired by [Graphify Labs](https://graphifylabs.ai/):
288
259
  | Accent Bar | `.tollerud-accent-bar` | `bg-tollerud-gradient-bar h-[1px]` | Gradient divider bar |
289
260
  | Gradient Text | `.tollerud-gradient-text` | `bg-tollerud-gradient-soft bg-clip-text text-transparent` | Yellow → amber gradient text |
290
261
  | Display Heading | `.tollerud-display` | `tracking-tightest leading-[0.95] font-semibold text-white` | Tight, impactful display heads |
262
+ | Display Shimmer | `.tollerud-display-shimmer` | — | Animated yellow gradient sweep clipped to hero accent text (dark surfaces) |
291
263
  | Section Container | `.tollerud-section` | `max-w-[1100px] mx-auto px-6` | Content width constraint |
package/SKILL.md CHANGED
@@ -20,7 +20,7 @@ npm install @tollerud/ui clsx tailwind-merge tailwindcss@4 \
20
20
  npm install @paper-design/shaders-react
21
21
  ```
22
22
 
23
- As of **v3.1.0**, `Monogram` ships as an inline SVG component (`color`: `yellow` | `black` | `white`). As of **v3.0.0**, the package is **ESM-only** (no CJS `require` entry). As of **v2.0.0**, Radix, Lucide, Framer Motion, and Sonner are **required peers** (not bundled).
23
+ As of **v4.0.1**, install is **npm-only** — `import { Button } from '@tollerud/ui'` or subpaths like `@tollerud/ui/button`. Copy-via-shadcn registry CLI is unsupported. As of **v4.0.0**, `@tollerud/ui/globals-v4.css` is removed — use `globals.css` only. Brand assets live at `@tollerud/ui/brand/*`. As of **v3.1.1**, `.tollerud-display-shimmer` ships in `globals.css` for animated hero accent text. As of **v3.1.0**, `Monogram` ships as an inline SVG component (`color`: `yellow` | `black` | `white`). As of **v3.0.0**, the package is **ESM-only** (no CJS `require` entry). As of **v2.0.0**, Radix, Lucide, Framer Motion, and Sonner are **required peers** (not bundled).
24
24
 
25
25
  Apply the Tailwind preset when you need extra utilities from `tollerud-preset.js` — `globals.css` already includes tokens and component layers for v4:
26
26
 
@@ -458,7 +458,7 @@ The monogram must always sit left of the project name with `gap-2`. Never show t
458
458
  </div>
459
459
  ```
460
460
 
461
- **Monogram** — `color?: 'yellow' | 'black' | 'white'` (default `yellow`), `size?: number`, `title?: string` (default `'Tollerud'`). Brand avatars: `@tollerud/ui/tollerud-avatar.svg`, `tollerud-avatar-full.svg` (+ `.png` variants).
461
+ **Monogram** — `color?: 'yellow' | 'black' | 'white'` (default `yellow`), `size?: number`, `title?: string` (default `'Tollerud'`). Brand avatars: `@tollerud/ui/brand/tollerud-avatar.svg`, `brand/tollerud-avatar-full.svg` (+ `.png` variants).
462
462
  Monogram sizing: top bar/sidebar expanded → `h-5`, collapsed → `h-6`, footer → `h-4` (handled automatically by `<Footer />`).
463
463
 
464
464
  ---
@@ -469,7 +469,9 @@ Monogram sizing: top bar/sidebar expanded → `h-5`, collapsed → `h-6`, footer
469
469
  <nav class="tollerud-glass fixed top-0 inset-x-0 z-50 h-14 flex items-center px-6">…</nav>
470
470
  <section class="tollerud-grid-bg">…</section>
471
471
  <h1 class="tollerud-display text-[70px]">Dark. Monochrome.</h1>
472
- <h2 class="tollerud-display--secondary text-[40px]">Yellow where it counts</h2>
472
+ <h2 class="tollerud-display--secondary text-[40px]">
473
+ <span class="tollerud-display-shimmer">Yellow where it counts</span>
474
+ </h2>
473
475
  <div data-density="compact">…dense tables / forms…</div>
474
476
  ```
475
477
 
@@ -502,7 +504,7 @@ Shadow scale: `--shadow-sm` `--shadow-md` `--shadow-lg` `--shadow-xl` `--shadow-
502
504
  | Recolor or add glow to the monogram | Yellow-on-dark branding is non-negotiable; glow is for interactive UI only |
503
505
  | Introduce non-system chromatic colors (blue, green, purple) for decoration | Only the yellow accent + monochrome grays (status semantics are the lone exception) |
504
506
  | Nest `<a>`/`<Link>` inside `<Button>` (or vice versa) | Invalid HTML — use `asChild` or `buttonVariants()` instead |
505
- | Import a component name you saw in older docs without checking it exists | Some legacy docs list aspirational or since-shipped components. As of **1.0.9** all 19 previously "missing" components (`Divider`, `Pill`, `Avatar`, `AvatarGroup`, `Breadcrumb`, `Pagination`, `Segmented`, `Stepper`, `Panel`, `Meter`, `FormRow`, `Accordion`, `Slider`, `PasswordInput`, `Combobox`, `DatePicker`, `FileUpload`, `TagInput`, `PricingCard`) are exported. Components still **not** in the package: charts, marketing blocks (`HeroBlock`, `FeatureCard`, `CTABand`), `Drawer`, `EmptyState` (use `Empty`), `Toast` (use `Toaster` + `sonner`'s `toast()`) |
507
+ | Import a component name you saw in older docs without checking it exists | Verify against this catalog or `components/index.ts`. Common renames: `EmptyState` `Empty`, `Toast` `Toaster` + `sonner`'s `toast()`, `Drawer` `Sheet`. Charts (`BarChart`, `AreaChart`, `Donut`, `Sparkline`) and marketing blocks (`HeroBlock`, `FeatureCard`, `CTABand`) ship since **v1.4.0**. Brand assets: `@tollerud/ui/brand/*` (not repo root). |
506
508
 
507
509
  ---
508
510
 
package/components.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://ui.shadcn.com/schema.json",
3
- "name": "tollerud-noir",
3
+ "name": "Tollerud User Interface",
4
4
  "style": "default",
5
5
  "rsc": true,
6
6
  "tsx": true,
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { BentoDashboard } from './chunk-ONMTHBZ4.js';
2
+ export { BentoDashboard } from './chunk-LGVXEWNB.js';
3
3
  import './chunk-LUM2YJBH.js';
4
4
  import './chunk-7EP2T3OW.js';
5
5
  import './chunk-DOUDJU4P.js';
package/dist/button.d.ts CHANGED
@@ -3,8 +3,8 @@ import { ButtonHTMLAttributes } from 'react';
3
3
 
4
4
  declare const variants: {
5
5
  readonly primary: "bg-tollerud-yellow text-tollerud-black border-tollerud-yellow hover:bg-tollerud-yellow hover:shadow-tollerud-glow";
6
- readonly secondary: "bg-transparent text-tollerud-text-primary border-tollerud-border hover:border-tollerud-text-secondary hover:bg-tollerud-surface-hover";
7
- readonly ghost: "bg-transparent text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover";
6
+ readonly secondary: "text-tollerud-text-primary [background:var(--surface-raised,var(--tollerud-surface-raised))] [border-color:var(--border,var(--tollerud-border))] hover:[border-color:var(--text-secondary,var(--tollerud-text-secondary))] hover:[background:var(--surface-hover,var(--tollerud-surface-hover))]";
7
+ readonly ghost: "text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover";
8
8
  readonly destructive: "bg-tollerud-error text-white border-tollerud-error hover:shadow-[0_0_12px_rgba(239,68,68,0.3)]";
9
9
  readonly terminal: "font-mono text-tollerud-yellow border-[rgba(255,255,0,0.25)] bg-transparent hover:border-tollerud-yellow hover:shadow-tollerud-glow hover:bg-[rgba(255,255,0,0.05)]";
10
10
  };
package/dist/button.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { Button, buttonVariants } from './chunk-ADE22JSR.js';
2
+ export { Button, buttonVariants } from './chunk-BQWF5MP7.js';
3
3
  import './chunk-WSQNPRGN.js';
4
4
  //# sourceMappingURL=button.js.map
5
5
  //# sourceMappingURL=button.js.map
package/dist/checkbox.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client';
2
- export { Checkbox } from './chunk-T3TQPOVM.js';
2
+ export { Checkbox } from './chunk-TLEKK53J.js';
3
3
  import './chunk-WSQNPRGN.js';
4
4
  //# sourceMappingURL=checkbox.js.map
5
5
  //# sourceMappingURL=checkbox.js.map
@@ -6,16 +6,16 @@ import { jsx } from 'react/jsx-runtime';
6
6
 
7
7
  var variants = {
8
8
  primary: "bg-tollerud-yellow text-tollerud-black border-tollerud-yellow hover:bg-tollerud-yellow hover:shadow-tollerud-glow",
9
- secondary: "bg-transparent text-tollerud-text-primary border-tollerud-border hover:border-tollerud-text-secondary hover:bg-tollerud-surface-hover",
10
- ghost: "bg-transparent text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover",
9
+ secondary: "text-tollerud-text-primary [background:var(--surface-raised,var(--tollerud-surface-raised))] [border-color:var(--border,var(--tollerud-border))] hover:[border-color:var(--text-secondary,var(--tollerud-text-secondary))] hover:[background:var(--surface-hover,var(--tollerud-surface-hover))]",
10
+ ghost: "text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover",
11
11
  destructive: "bg-tollerud-error text-white border-tollerud-error hover:shadow-[0_0_12px_rgba(239,68,68,0.3)]",
12
12
  terminal: "font-mono text-tollerud-yellow border-[rgba(255,255,0,0.25)] bg-transparent hover:border-tollerud-yellow hover:shadow-tollerud-glow hover:bg-[rgba(255,255,0,0.05)]"
13
13
  };
14
14
  var variantLayers = {
15
15
  primary: "tollerud-btn--primary",
16
- secondary: "",
17
- ghost: "",
18
- destructive: "",
16
+ secondary: "tollerud-btn--secondary",
17
+ ghost: "tollerud-btn--ghost",
18
+ destructive: "tollerud-btn--destructive",
19
19
  terminal: "tollerud-btn--terminal"
20
20
  };
21
21
  var sizes = {
@@ -50,5 +50,5 @@ var Button = forwardRef(
50
50
  Button.displayName = "Button";
51
51
 
52
52
  export { Button, buttonVariants };
53
- //# sourceMappingURL=chunk-ADE22JSR.js.map
54
- //# sourceMappingURL=chunk-ADE22JSR.js.map
53
+ //# sourceMappingURL=chunk-BQWF5MP7.js.map
54
+ //# sourceMappingURL=chunk-BQWF5MP7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/Button.tsx"],"names":[],"mappings":";;;;;AAIA,IAAM,QAAA,GAAW;AAAA,EACf,OAAA,EAAS,mHAAA;AAAA,EACT,SAAA,EACE,kSAAA;AAAA,EACF,KAAA,EAAO,kHAAA;AAAA,EACP,WAAA,EAAa,gGAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAGA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAAS,uBAAA;AAAA,EACT,SAAA,EAAW,yBAAA;AAAA,EACX,KAAA,EAAO,qBAAA;AAAA,EACP,WAAA,EAAa,2BAAA;AAAA,EACb,QAAA,EAAU;AACZ,CAAA;AAEA,IAAM,KAAA,GAAQ;AAAA,EACZ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAOO,SAAS,cAAA,CAAe,EAAE,OAAA,GAAU,WAAA,EAAa,OAAO,IAAA,EAAM,SAAA,EAAU,GAAiD,EAAC,EAAG;AAClI,EAAA,OAAO,EAAA;AAAA,IACL,+MAAA;AAAA,IACA,uBAAA;AAAA,IACA,kDAAA;AAAA,IACA,SAAS,OAAO,CAAA;AAAA,IAChB,cAAc,OAAO,CAAA;AAAA,IACrB,MAAM,IAAI,CAAA;AAAA,IACV;AAAA,GACF;AACF;AAOA,IAAM,MAAA,GAAS,UAAA;AAAA,EACb,CAAC,EAAE,SAAA,EAAW,OAAA,GAAU,WAAA,EAAa,IAAA,GAAO,IAAA,EAAM,OAAA,GAAU,KAAA,EAAO,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACrF,IAAA,MAAM,IAAA,GAAO,UAAU,IAAA,GAAO,QAAA;AAC9B,IAAA,uBACE,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAW,cAAA,CAAe,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,QACrD,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"chunk-BQWF5MP7.js","sourcesContent":["import { type ButtonHTMLAttributes, forwardRef } from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cn } from '@/lib/utils'\n\nconst variants = {\n primary: 'bg-tollerud-yellow text-tollerud-black border-tollerud-yellow hover:bg-tollerud-yellow hover:shadow-tollerud-glow',\n secondary:\n 'text-tollerud-text-primary [background:var(--surface-raised,var(--tollerud-surface-raised))] [border-color:var(--border,var(--tollerud-border))] hover:[border-color:var(--text-secondary,var(--tollerud-text-secondary))] hover:[background:var(--surface-hover,var(--tollerud-surface-hover))]',\n ghost: 'text-tollerud-text-secondary border-transparent hover:text-tollerud-text-primary hover:bg-tollerud-surface-hover',\n destructive: 'bg-tollerud-error text-white border-tollerud-error hover:shadow-[0_0_12px_rgba(239,68,68,0.3)]',\n terminal: 'font-mono text-tollerud-yellow border-[rgba(255,255,0,0.25)] bg-transparent hover:border-tollerud-yellow hover:shadow-tollerud-glow hover:bg-[rgba(255,255,0,0.05)]',\n} as const\n\n/** Layer classes from globals-layers.css — ❯ prefix, hover glow, magnetic glow in docs */\nconst variantLayers = {\n primary: 'tollerud-btn--primary',\n secondary: 'tollerud-btn--secondary',\n ghost: 'tollerud-btn--ghost',\n destructive: 'tollerud-btn--destructive',\n terminal: 'tollerud-btn--terminal',\n} as const\n\nconst sizes = {\n sm: 'px-3 py-1 text-sm',\n md: 'px-4 py-2 text-base',\n lg: 'px-6 py-3 text-lg',\n} as const\n\nexport interface ButtonVariantProps {\n variant?: keyof typeof variants\n size?: keyof typeof sizes\n}\n\nexport function buttonVariants({ variant = 'secondary', size = 'md', className }: ButtonVariantProps & { className?: string } = {}) {\n return cn(\n 'tollerud-btn inline-flex items-center justify-center gap-2 font-semibold rounded transition-all duration-[150ms] focus-visible:outline-2 focus-visible:outline-tollerud-yellow focus-visible:outline-offset-2',\n 'border cursor-pointer',\n 'disabled:opacity-50 disabled:pointer-events-none',\n variants[variant],\n variantLayers[variant],\n sizes[size],\n className\n )\n}\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonVariantProps {\n /** Render as the single child element (e.g. a `<Link>`) instead of a `<button>`, merging props and styles onto it. */\n asChild?: boolean\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'secondary', size = 'md', asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n ref={ref}\n className={buttonVariants({ variant, size, className })}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button }\n"]}
@@ -10,13 +10,13 @@ var CTABand = forwardRef(
10
10
  {
11
11
  ref,
12
12
  className: cn(
13
- "tollerud-card rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center",
13
+ "tollerud-card w-full rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center",
14
14
  className
15
15
  ),
16
16
  ...props,
17
17
  children: [
18
- /* @__PURE__ */ jsx("h2", { className: "tollerud-display text-[30px] text-tollerud-text-primary", children: title }),
19
- description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-3 max-w-[440px] text-[15px] text-tollerud-text-secondary", children: description }),
18
+ /* @__PURE__ */ jsx("h2", { className: "tollerud-display mx-auto max-w-[640px] text-center text-[30px] text-tollerud-text-primary", children: title }),
19
+ description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-3 max-w-[440px] text-center text-[15px] text-tollerud-text-secondary", children: description }),
20
20
  actions && /* @__PURE__ */ jsx("div", { className: "mt-[22px] flex flex-wrap items-center justify-center gap-3", children: actions }),
21
21
  accentBar && /* @__PURE__ */ jsx("hr", { className: "tollerud-accent-bar tollerud-accent-bar--inline mx-auto mt-8 max-w-[320px] border-0" })
22
22
  ]
@@ -27,5 +27,5 @@ var CTABand = forwardRef(
27
27
  CTABand.displayName = "CTABand";
28
28
 
29
29
  export { CTABand };
30
- //# sourceMappingURL=chunk-IUPVQWO5.js.map
31
- //# sourceMappingURL=chunk-IUPVQWO5.js.map
30
+ //# sourceMappingURL=chunk-FPFLOYIJ.js.map
31
+ //# sourceMappingURL=chunk-FPFLOYIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../components/CTABand.tsx"],"names":[],"mappings":";;;;AAUA,IAAM,OAAA,GAAU,UAAA;AAAA,EACd,CAAC,EAAE,SAAA,EAAW,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,SAAA,GAAY,IAAA,EAAM,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAC/E,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA,EAAW,EAAA;AAAA,UACT,0GAAA;AAAA,UACA;AAAA,SACF;AAAA,QACC,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,2FAAA,EACX,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,UACC,WAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mFACV,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,UAED,OAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8DAA8D,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,UAEtF,SAAA,oBACC,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qFAAA,EAAsF;AAAA;AAAA;AAAA,KAExG;AAAA,EAEJ;AACF;AACA,OAAA,CAAQ,WAAA,GAAc,SAAA","file":"chunk-FPFLOYIJ.js","sourcesContent":["import { type HTMLAttributes, forwardRef } from 'react'\nimport { cn } from '@/lib/utils'\n\nexport interface CTABandProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title: React.ReactNode\n description?: React.ReactNode\n actions?: React.ReactNode\n accentBar?: boolean\n}\n\nconst CTABand = forwardRef<HTMLDivElement, CTABandProps>(\n ({ className, title, description, actions, accentBar = true, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'tollerud-card w-full rounded-xl border border-tollerud-border bg-tollerud-surface px-8 py-11 text-center',\n className\n )}\n {...props}\n >\n <h2 className=\"tollerud-display mx-auto max-w-[640px] text-center text-[30px] text-tollerud-text-primary\">\n {title}\n </h2>\n {description && (\n <p className=\"mx-auto mt-3 max-w-[440px] text-center text-[15px] text-tollerud-text-secondary\">\n {description}\n </p>\n )}\n {actions && (\n <div className=\"mt-[22px] flex flex-wrap items-center justify-center gap-3\">{actions}</div>\n )}\n {accentBar && (\n <hr className=\"tollerud-accent-bar tollerud-accent-bar--inline mx-auto mt-8 max-w-[320px] border-0\" />\n )}\n </div>\n )\n }\n)\nCTABand.displayName = 'CTABand'\n\nexport { CTABand }\n"]}