@vegastack/design 0.6.1 → 0.7.0

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.
@@ -4,8 +4,22 @@ import { twMerge as tailwindMerge } from "tailwind-merge";
4
4
 
5
5
  // src/prose.ts
6
6
  var prose = {
7
- /** The root's own ink and size — every rule below is relative to this. */
8
- root: "text-sm text-foreground",
7
+ /**
8
+ * The root's own FAMILY, ink and size — every rule below is relative to this.
9
+ *
10
+ * `font-sans` is load-bearing and was missing. A prose root has to be self-describing, because
11
+ * neither of its two consumers sets a family of its own: `MarkdownView` and `TextEdit` both wear
12
+ * nothing but `proseClassName`. With no family declared here, prose inherited whatever surrounded
13
+ * it — drop either surface inside a mono container (`terminal-body` is one in this very
14
+ * registry, and a chat or log panel is the obvious consumer case) and the WHOLE tree went mono:
15
+ * headings, paragraphs, table cells, and the `1.` / `2.` markers of an ordered list, because
16
+ * `::marker` inherits font properties from its originating element.
17
+ *
18
+ * Geist Mono is now the exception the recipe names explicitly — `code`, `pre` and `pre code` —
19
+ * rather than something prose falls into by accident. A consumer who genuinely wants mono prose
20
+ * still says so on the root, where it reads as a decision.
21
+ */
22
+ root: "font-sans text-sm text-foreground",
9
23
  // Headings. `scroll-m-20` keeps an anchored heading clear of a sticky header; the weight is
10
24
  // `font-semibold`, the ordinary Tailwind weight upstream uses — Batch 1 of the shadcn reset
11
25
  // deleted both the 400/500 ladder and the `text-h*` roles this comment used to name.
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  cn
4
- } from "./chunk-42HJ4OYZ.js";
4
+ } from "./chunk-MSOIZXDR.js";
5
5
 
6
6
  // src/icons/create-animated-icon.tsx
7
7
  import * as React from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "../chunk-42HJ4OYZ.js";
3
+ } from "../chunk-MSOIZXDR.js";
4
4
 
5
5
  // src/icons/icon.tsx
6
6
  import "react";
package/dist/index.cjs CHANGED
@@ -33,8 +33,22 @@ var import_tailwind_merge = require("tailwind-merge");
33
33
 
34
34
  // src/prose.ts
35
35
  var prose = {
36
- /** The root's own ink and size — every rule below is relative to this. */
37
- root: "text-sm text-foreground",
36
+ /**
37
+ * The root's own FAMILY, ink and size — every rule below is relative to this.
38
+ *
39
+ * `font-sans` is load-bearing and was missing. A prose root has to be self-describing, because
40
+ * neither of its two consumers sets a family of its own: `MarkdownView` and `TextEdit` both wear
41
+ * nothing but `proseClassName`. With no family declared here, prose inherited whatever surrounded
42
+ * it — drop either surface inside a mono container (`terminal-body` is one in this very
43
+ * registry, and a chat or log panel is the obvious consumer case) and the WHOLE tree went mono:
44
+ * headings, paragraphs, table cells, and the `1.` / `2.` markers of an ordered list, because
45
+ * `::marker` inherits font properties from its originating element.
46
+ *
47
+ * Geist Mono is now the exception the recipe names explicitly — `code`, `pre` and `pre code` —
48
+ * rather than something prose falls into by accident. A consumer who genuinely wants mono prose
49
+ * still says so on the root, where it reads as a decision.
50
+ */
51
+ root: "font-sans text-sm text-foreground",
38
52
  // Headings. `scroll-m-20` keeps an anchored heading clear of a sticky header; the weight is
39
53
  // `font-semibold`, the ordinary Tailwind weight upstream uses — Batch 1 of the shadcn reset
40
54
  // deleted both the 400/500 ladder and the `text-h*` roles this comment used to name.
package/dist/index.d.cts CHANGED
@@ -40,8 +40,22 @@ import * as React from 'react';
40
40
  * <div className={cn(prose.root, prose.p, prose.code)} />
41
41
  */
42
42
  declare const prose: {
43
- /** The root's own ink and size — every rule below is relative to this. */
44
- readonly root: "text-sm text-foreground";
43
+ /**
44
+ * The root's own FAMILY, ink and size — every rule below is relative to this.
45
+ *
46
+ * `font-sans` is load-bearing and was missing. A prose root has to be self-describing, because
47
+ * neither of its two consumers sets a family of its own: `MarkdownView` and `TextEdit` both wear
48
+ * nothing but `proseClassName`. With no family declared here, prose inherited whatever surrounded
49
+ * it — drop either surface inside a mono container (`terminal-body` is one in this very
50
+ * registry, and a chat or log panel is the obvious consumer case) and the WHOLE tree went mono:
51
+ * headings, paragraphs, table cells, and the `1.` / `2.` markers of an ordered list, because
52
+ * `::marker` inherits font properties from its originating element.
53
+ *
54
+ * Geist Mono is now the exception the recipe names explicitly — `code`, `pre` and `pre code` —
55
+ * rather than something prose falls into by accident. A consumer who genuinely wants mono prose
56
+ * still says so on the root, where it reads as a decision.
57
+ */
58
+ readonly root: "font-sans text-sm text-foreground";
45
59
  readonly h1: "[&_h1]:mt-6 [&_h1]:mb-3 [&_h1]:scroll-m-20 [&_h1]:text-3xl [&_h1]:font-semibold [&_h1]:text-foreground [&_h1]:first:mt-0";
46
60
  readonly h2: "[&_h2]:mt-6 [&_h2]:mb-3 [&_h2]:scroll-m-20 [&_h2]:text-2xl [&_h2]:font-semibold [&_h2]:text-foreground [&_h2]:first:mt-0";
47
61
  readonly h3: "[&_h3]:mt-5 [&_h3]:mb-2 [&_h3]:scroll-m-20 [&_h3]:text-xl [&_h3]:font-semibold [&_h3]:text-foreground [&_h3]:first:mt-0";
package/dist/index.d.ts CHANGED
@@ -40,8 +40,22 @@ import * as React from 'react';
40
40
  * <div className={cn(prose.root, prose.p, prose.code)} />
41
41
  */
42
42
  declare const prose: {
43
- /** The root's own ink and size — every rule below is relative to this. */
44
- readonly root: "text-sm text-foreground";
43
+ /**
44
+ * The root's own FAMILY, ink and size — every rule below is relative to this.
45
+ *
46
+ * `font-sans` is load-bearing and was missing. A prose root has to be self-describing, because
47
+ * neither of its two consumers sets a family of its own: `MarkdownView` and `TextEdit` both wear
48
+ * nothing but `proseClassName`. With no family declared here, prose inherited whatever surrounded
49
+ * it — drop either surface inside a mono container (`terminal-body` is one in this very
50
+ * registry, and a chat or log panel is the obvious consumer case) and the WHOLE tree went mono:
51
+ * headings, paragraphs, table cells, and the `1.` / `2.` markers of an ordered list, because
52
+ * `::marker` inherits font properties from its originating element.
53
+ *
54
+ * Geist Mono is now the exception the recipe names explicitly — `code`, `pre` and `pre code` —
55
+ * rather than something prose falls into by accident. A consumer who genuinely wants mono prose
56
+ * still says so on the root, where it reads as a decision.
57
+ */
58
+ readonly root: "font-sans text-sm text-foreground";
45
59
  readonly h1: "[&_h1]:mt-6 [&_h1]:mb-3 [&_h1]:scroll-m-20 [&_h1]:text-3xl [&_h1]:font-semibold [&_h1]:text-foreground [&_h1]:first:mt-0";
46
60
  readonly h2: "[&_h2]:mt-6 [&_h2]:mb-3 [&_h2]:scroll-m-20 [&_h2]:text-2xl [&_h2]:font-semibold [&_h2]:text-foreground [&_h2]:first:mt-0";
47
61
  readonly h3: "[&_h3]:mt-5 [&_h3]:mb-2 [&_h3]:scroll-m-20 [&_h3]:text-xl [&_h3]:font-semibold [&_h3]:text-foreground [&_h3]:first:mt-0";
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  mergeRefs,
6
6
  prose,
7
7
  proseClassName
8
- } from "./chunk-42HJ4OYZ.js";
8
+ } from "./chunk-MSOIZXDR.js";
9
9
  export {
10
10
  FLOATING,
11
11
  TIMINGS,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vegastack/design",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "VegaStack design system — cn utility, icon runtime, Tailwind v4 preset, and the vegastack-design CLI (tokens ship separately as @vegastack/design-tokens)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -70,7 +70,7 @@
70
70
  "test": "node test/compare.test.mjs && node test/check-updates.test.mjs && node test/skills-install.test.mjs"
71
71
  },
72
72
  "dependencies": {
73
- "@vegastack/design-tokens": "^0.5.0",
73
+ "@vegastack/design-tokens": "^0.7.0",
74
74
  "clsx": "^2.1.1",
75
75
  "tailwind-merge": "^3.6.0",
76
76
  "tsconfig-paths": "^4.2.0",
@@ -79,10 +79,22 @@ rg -n 'ring-3\b|ring-\[3px\]|ring-ring/[0-9]+|focus-visible:ring-|shadow-\[0_0_0
79
79
  - `React.forwardRef` — React 19 takes `ref` as a normal prop. **error**
80
80
 
81
81
  **Things that are NOT findings any more**, and reporting them is noise: `rounded-xl`, `shadow-md`,
82
- `text-4xl`, `font-semibold`, `tracking-tight`, `transition-all`, `transition-colors`,
83
- `duration-100`, `ease-in-out`, `z-50`, `opacity-50`, a raw `/NN` alpha, `h-8`/`size-4`,
84
- `cursor-default` on a menu row, an arbitrary `h-[18.4px]`, and a `hover:` with no `active:` beside
85
- it. Every one of those is upstream's own vocabulary, which this system now adopts.
82
+ `text-4xl`, `font-semibold`, `transition-all`, `transition-colors`, `duration-100`, `ease-in-out`,
83
+ `z-50`, `opacity-50`, a raw `/NN` alpha, `h-8`/`size-4`, `cursor-default` on a menu row, an
84
+ arbitrary `h-[18.4px]`, and a `hover:` with no `active:` beside it. Every one of those is upstream's
85
+ own vocabulary, which this system now adopts.
86
+
87
+ **`tracking-tight` left that list on 2026-09-22 and IS a finding again.** The `@theme` bridge now
88
+ declares the heading tier's letter-spacing per size, and Tailwind compiles it as
89
+ `letter-spacing: var(--tw-tracking, …)` — so a local `tracking-*` silently beats the ramp and that
90
+ element stops matching the system. Only `tracking-widest` (a keyboard-shortcut hint) is allowed.
91
+ Two more in the same family:
92
+
93
+ - an arbitrary font size (`text-[13px]`, `text-[0.8rem]`) — it bypasses the `--text-*` namespace and
94
+ receives neither the ramp's line-height nor its letter-spacing. **error**
95
+ - the `uppercase` utility or a `textTransform: "uppercase"` — this system is sentence case
96
+ everywhere, and the transform rewrites whatever it is handed (it once turned the token name
97
+ `--text-lg` into `--TEXT-LG`). If a string is uppercase, write it uppercase. **error**
86
98
 
87
99
  ## 3b. Names and tokens the shadcn reset removed
88
100
 
@@ -83,20 +83,20 @@ info`, each an ink on the `card` surface with a required icon; **`announcement-b
83
83
  Semantic CSS custom properties from `@vegastack/design-tokens/theme.css` (OKLCH, `:root` + `.dark`),
84
84
  on shadcn's `neutral` base. Always use the utility, never a raw value.
85
85
 
86
- | Role | Utilities |
87
- | -------- | ------------------------------------------------------------------------------------------------------------------------------------- |
88
- | Surface | `bg-background` (page) · `bg-card` · `bg-popover` · `bg-sidebar` |
89
- | Fill | `bg-primary` (solid action, every checked control) · `bg-secondary` (soft) · `bg-muted` (well, track, skeleton) · `bg-accent` (hover) |
90
- | Text | `text-foreground` · `text-muted-foreground` · `text-{primary,secondary,accent,card,popover}-foreground` |
91
- | Status | `bg-{destructive,success,warning,info}` · `-foreground` (ink ON the fill) · `-text` (ink on the page or on the family's own tint) |
92
- | Border | `border-border` · `border-input` — there are no rings; focus is one global outline |
93
- | Radius | `rounded-{sm,md,lg,xl,2xl}` — all derived from the single `--radius` |
94
- | Type | Tailwind's own `text-{xs…7xl}`. `text-sm` is 14px, `text-base` is 16px |
95
- | Font | `font-sans` `font-mono` `font-serif` `font-heading` |
96
- | Motion | `duration-{fast,base,slow}` · `ease-{standard,emphasized,exit,spring}` — or Tailwind's own steps |
97
- | Entrance | `motion-pop-in` `motion-enter-up` `motion-shake` `motion-flash` |
98
- | Docked | `motion-dock-in` / `motion-dock-out` — a control parked at a viewport edge, 150ms in / 100ms out |
99
- | Prose | `proseClassName` from `@vegastack/design` — the whole rendered-rich-text recipe, one class |
86
+ | Role | Utilities |
87
+ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
88
+ | Surface | `bg-background` (page) · `bg-card` · `bg-popover` · `bg-sidebar` |
89
+ | Fill | `bg-primary` (solid action, every checked control) · `bg-secondary` (soft) · `bg-muted` (well, track, skeleton) · `bg-accent` (hover) |
90
+ | Text | `text-foreground` · `text-muted-foreground` · `text-{primary,secondary,accent,card,popover}-foreground` |
91
+ | Status | `bg-{destructive,success,warning,info}` · `-foreground` (ink ON the fill) · `-text` (ink on the page or on the family's own tint) |
92
+ | Border | `border-border` · `border-input` — there are no rings; focus is one global outline |
93
+ | Radius | `rounded-{sm,md,lg,xl,2xl}` — all derived from the single `--radius` |
94
+ | Type | Tailwind's own `text-{xs…7xl}`. `text-sm` is 14px, `text-base` is 16px. Line-height and letter-spacing above `text-base` come from the theme — never write `tracking-*`, an arbitrary `text-[13px]`, or `uppercase` |
95
+ | Font | `font-sans` `font-mono` `font-serif` `font-heading` |
96
+ | Motion | `duration-{fast,base,slow}` · `ease-{standard,emphasized,exit,spring}` — or Tailwind's own steps |
97
+ | Entrance | `motion-pop-in` `motion-enter-up` `motion-shake` `motion-flash` |
98
+ | Docked | `motion-dock-in` / `motion-dock-out` — a control parked at a viewport edge, 150ms in / 100ms out |
99
+ | Prose | `proseClassName` from `@vegastack/design` — the whole rendered-rich-text recipe, one class |
100
100
 
101
101
  **Hover and pressed are written, not imported.** A component owns its own interaction chrome, the
102
102
  way shadcn writes it:
@@ -102,11 +102,12 @@ starts with `icon-` is a component and never an icon.
102
102
  - **`breadcrumb`** — A hierarchical navigation trail — links, separators, the current page, and ellipsis collapse for long paths.
103
103
  - **`command`** — A searchable command palette — filtered, grouped items with keyboard navigation, optionally inside a ⌘K dialog.
104
104
  - **`menubar`** — A persistent horizontal bar of menus — application-style File / Edit / View navigation.
105
+ - **`multi-step-form`** — A guarded, branching flow around a Stepper — conditional steps, sync and async advance guards, locking, reachability-derived deep links and resume, and a phone layout chosen from the same predicate. Owns no fields and no validator.
105
106
  - **`navigation-menu`** — A collection of links for navigating websites — triggers that open one shared panel, and plain links styled to match.
106
107
  - **`page-header`** — The standardized header at the top of a page — back button, breadcrumb trail, title, description, actions, secondary menu, and a favorite star.
107
108
  - **`pagination`** — Page navigation — previous/next, numbered page links, an ellipsis for long ranges, and the active page.
108
109
  - **`sidebar`** — A composable, themeable and customizable sidebar — a provider, a collapsible panel with header, content and footer, labelled groups, menu rows with actions, badges and submenus, a rail and a trigger.
109
- - **`stepper`** — A bounded linear process as an ordered list — complete/current/upcoming/error states on StatusIcon's vocabulary, aria-current=step, advance-gating message, focus follows the process.
110
+ - **`stepper`** — A bounded linear process as an ordered list — seven step states on a numbered rail that fills in behind you, aria-current=step, orientation chosen from the step count, and a compact summary below a container width.
110
111
  - **`tabs`** — A set of layered sections of content — known as tab panels — that are displayed one at a time.
111
112
 
112
113
  ## Feedback
@@ -116,7 +117,6 @@ starts with `icon-` is a component and never an icon.
116
117
  - **`progress`** — Displays an indicator showing the completion progress of a task, typically displayed as a progress bar.
117
118
  - **`provider`** — The single app-root wrapper — theme (next-themes), Base UI toasts, tooltip delays, and text direction in one mount-once component.
118
119
  - **`skeleton`** — A pulsing placeholder that reserves layout space while content loads.
119
- - **`sonner`** — The sonner toaster, themed onto the token contract — an alternative notification engine with its own imperative API.
120
120
  - **`spinner`** — An indeterminate loading indicator that inherits its host's ink.
121
121
  - **`toast`** — Brief, non-blocking notifications — a stacking Base UI Toast surface with typed icons, actions and promise toasts.
122
122