@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.
- package/AGENTS.md +20 -4
- package/CHANGELOG.md +122 -0
- package/COMPONENTS.md +13 -1
- package/GETTING_STARTED.md +0 -58
- package/README.md +31 -59
- package/SKILL.md +6 -4
- package/components.json +1 -1
- package/dist/bento-dashboard.js +1 -1
- package/dist/button.d.ts +2 -2
- package/dist/button.js +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/{chunk-ADE22JSR.js → chunk-BQWF5MP7.js} +7 -7
- package/dist/chunk-BQWF5MP7.js.map +1 -0
- package/dist/{chunk-IUPVQWO5.js → chunk-FPFLOYIJ.js} +5 -5
- package/dist/chunk-FPFLOYIJ.js.map +1 -0
- package/dist/{chunk-6SKTH45H.js → chunk-J2Z4ZFVX.js} +29 -18
- package/dist/chunk-J2Z4ZFVX.js.map +1 -0
- package/dist/{chunk-YPP7QHYT.js → chunk-K4ALNUZI.js} +4 -4
- package/dist/{chunk-YPP7QHYT.js.map → chunk-K4ALNUZI.js.map} +1 -1
- package/dist/{chunk-ONMTHBZ4.js → chunk-LGVXEWNB.js} +10 -10
- package/dist/chunk-LGVXEWNB.js.map +1 -0
- package/dist/{chunk-OVSIOZHJ.js → chunk-SNNMZ444.js} +3 -3
- package/dist/{chunk-OVSIOZHJ.js.map → chunk-SNNMZ444.js.map} +1 -1
- package/dist/{chunk-T3TQPOVM.js → chunk-TLEKK53J.js} +5 -8
- package/dist/chunk-TLEKK53J.js.map +1 -0
- package/dist/cta-band.js +1 -1
- package/dist/data-table.js +3 -3
- package/dist/index.js +7 -7
- package/dist/pricing-card.js +2 -2
- package/dist/radio-group.d.ts +6 -0
- package/dist/radio-group.js +1 -1
- package/globals-layers.css +27 -1
- package/package.json +16 -20
- package/registry.json +14 -9
- package/tokens.css +29 -5
- package/dist/chunk-6SKTH45H.js.map +0 -1
- package/dist/chunk-ADE22JSR.js.map +0 -1
- package/dist/chunk-IUPVQWO5.js.map +0 -1
- package/dist/chunk-ONMTHBZ4.js.map +0 -1
- package/dist/chunk-T3TQPOVM.js.map +0 -1
- package/globals-v4.css +0 -2
- /package/{tollerud-avatar-full.png → brand/tollerud-avatar-full.png} +0 -0
- /package/{tollerud-avatar-full.svg → brand/tollerud-avatar-full.svg} +0 -0
- /package/{tollerud-avatar.png → brand/tollerud-avatar.png} +0 -0
- /package/{tollerud-avatar.svg → brand/tollerud-avatar.svg} +0 -0
- /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]">
|
|
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
|
-
|
|
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]">
|
|
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
|
package/GETTING_STARTED.md
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
##
|
|
207
|
+
## Install
|
|
208
208
|
|
|
209
209
|
```bash
|
|
210
|
-
|
|
211
|
-
|
|
210
|
+
npm install @tollerud/ui clsx tailwind-merge tailwindcss
|
|
211
|
+
```
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
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
|
|
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
|
-
├──
|
|
226
|
-
├──
|
|
227
|
-
├──
|
|
228
|
-
├──
|
|
229
|
-
├──
|
|
230
|
-
├── COMPONENTS.md #
|
|
231
|
-
├──
|
|
232
|
-
├──
|
|
233
|
-
├──
|
|
234
|
-
├──
|
|
235
|
-
├──
|
|
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
|
-
├──
|
|
241
|
-
├──
|
|
242
|
-
├──
|
|
243
|
-
├──
|
|
244
|
-
├──
|
|
245
|
-
│ ├──
|
|
246
|
-
│
|
|
247
|
-
|
|
248
|
-
|
|
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]">
|
|
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 |
|
|
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
package/dist/bento-dashboard.js
CHANGED
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: "
|
|
7
|
-
readonly ghost: "
|
|
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
package/dist/checkbox.js
CHANGED
|
@@ -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: "
|
|
10
|
-
ghost: "
|
|
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-
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
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-
|
|
31
|
-
//# sourceMappingURL=chunk-
|
|
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"]}
|