@vegastack/design 0.7.31 → 0.7.33
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/dist/{chunk-OHGNXG5G.js → chunk-6CWBD6NJ.js} +7 -0
- package/dist/create-animated-icon.js +1 -1
- package/dist/icons/index.js +1 -1
- package/dist/index.cjs +7 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/skills/vegastack-design-system/SKILL.md +11 -4
- package/skills/vegastack-design-system/references/components.md +2 -2
|
@@ -43,6 +43,13 @@ var prose = {
|
|
|
43
43
|
ul: "[&_ul]:my-3 [&_ul]:ms-6 [&_ul]:list-disc [&_ul]:text-foreground [&_ul]:marker:text-muted-foreground [&_ul.contains-task-list]:list-none",
|
|
44
44
|
ol: "[&_ol]:my-3 [&_ol]:ms-6 [&_ol]:list-decimal [&_ol]:text-foreground [&_ol]:marker:text-muted-foreground",
|
|
45
45
|
li: "[&_li]:mt-1.5 [&_li]:leading-relaxed",
|
|
46
|
+
// Task lists, one shape for both producers: `MarkdownView` tags the GFM list
|
|
47
|
+
// `data-type="taskList"` and each item `data-type="taskItem"` with its body in a
|
|
48
|
+
// `data-slot="task-item-content"` box, which is exactly the DOM Tiptap's `TaskItem` node view
|
|
49
|
+
// renders — so the checkbox IS the marker, the body wraps beside it, and a nested list indents
|
|
50
|
+
// under the body in view and edit alike. A cell's or item's paragraph inherits its ink so a
|
|
51
|
+
// Tiptap `<td><p>` reads the same as GFM's bare `<td>`.
|
|
52
|
+
taskList: "[&_ul[data-type=taskList]]:ms-0 [&_ul[data-type=taskList]]:list-none [&_li[data-type=taskItem]]:flex [&_li[data-type=taskItem]]:items-start [&_li[data-type=taskItem]]:gap-2 [&_li[data-type=taskItem]_[data-slot=checkbox]]:mt-1 [&_li[data-type=taskItem]_[data-slot=checkbox]]:me-0 [&_[data-slot=task-item-content]]:min-w-0 [&_[data-slot=task-item-content]]:flex-1 [&_td_p]:text-inherit [&_th_p]:text-inherit",
|
|
46
53
|
blockquote: "[&_blockquote]:my-3 [&_blockquote]:border-s-2 [&_blockquote]:border-border [&_blockquote]:ps-4 [&_blockquote]:text-muted-foreground [&_blockquote]:italic",
|
|
47
54
|
// Inline code is a chip. Code inside a `pre` is not: it inherits the panel's ground, so the chip
|
|
48
55
|
// is undone at higher specificity (`[&_pre_code]` is (0,1,2) against the chip's (0,1,1)).
|
package/dist/icons/index.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -72,6 +72,13 @@ var prose = {
|
|
|
72
72
|
ul: "[&_ul]:my-3 [&_ul]:ms-6 [&_ul]:list-disc [&_ul]:text-foreground [&_ul]:marker:text-muted-foreground [&_ul.contains-task-list]:list-none",
|
|
73
73
|
ol: "[&_ol]:my-3 [&_ol]:ms-6 [&_ol]:list-decimal [&_ol]:text-foreground [&_ol]:marker:text-muted-foreground",
|
|
74
74
|
li: "[&_li]:mt-1.5 [&_li]:leading-relaxed",
|
|
75
|
+
// Task lists, one shape for both producers: `MarkdownView` tags the GFM list
|
|
76
|
+
// `data-type="taskList"` and each item `data-type="taskItem"` with its body in a
|
|
77
|
+
// `data-slot="task-item-content"` box, which is exactly the DOM Tiptap's `TaskItem` node view
|
|
78
|
+
// renders — so the checkbox IS the marker, the body wraps beside it, and a nested list indents
|
|
79
|
+
// under the body in view and edit alike. A cell's or item's paragraph inherits its ink so a
|
|
80
|
+
// Tiptap `<td><p>` reads the same as GFM's bare `<td>`.
|
|
81
|
+
taskList: "[&_ul[data-type=taskList]]:ms-0 [&_ul[data-type=taskList]]:list-none [&_li[data-type=taskItem]]:flex [&_li[data-type=taskItem]]:items-start [&_li[data-type=taskItem]]:gap-2 [&_li[data-type=taskItem]_[data-slot=checkbox]]:mt-1 [&_li[data-type=taskItem]_[data-slot=checkbox]]:me-0 [&_[data-slot=task-item-content]]:min-w-0 [&_[data-slot=task-item-content]]:flex-1 [&_td_p]:text-inherit [&_th_p]:text-inherit",
|
|
75
82
|
blockquote: "[&_blockquote]:my-3 [&_blockquote]:border-s-2 [&_blockquote]:border-border [&_blockquote]:ps-4 [&_blockquote]:text-muted-foreground [&_blockquote]:italic",
|
|
76
83
|
// Inline code is a chip. Code inside a `pre` is not: it inherits the panel's ground, so the chip
|
|
77
84
|
// is undone at higher specificity (`[&_pre_code]` is (0,1,2) against the chip's (0,1,1)).
|
package/dist/index.d.cts
CHANGED
|
@@ -70,6 +70,7 @@ declare const prose: {
|
|
|
70
70
|
readonly ul: "[&_ul]:my-3 [&_ul]:ms-6 [&_ul]:list-disc [&_ul]:text-foreground [&_ul]:marker:text-muted-foreground [&_ul.contains-task-list]:list-none";
|
|
71
71
|
readonly ol: "[&_ol]:my-3 [&_ol]:ms-6 [&_ol]:list-decimal [&_ol]:text-foreground [&_ol]:marker:text-muted-foreground";
|
|
72
72
|
readonly li: "[&_li]:mt-1.5 [&_li]:leading-relaxed";
|
|
73
|
+
readonly taskList: "[&_ul[data-type=taskList]]:ms-0 [&_ul[data-type=taskList]]:list-none [&_li[data-type=taskItem]]:flex [&_li[data-type=taskItem]]:items-start [&_li[data-type=taskItem]]:gap-2 [&_li[data-type=taskItem]_[data-slot=checkbox]]:mt-1 [&_li[data-type=taskItem]_[data-slot=checkbox]]:me-0 [&_[data-slot=task-item-content]]:min-w-0 [&_[data-slot=task-item-content]]:flex-1 [&_td_p]:text-inherit [&_th_p]:text-inherit";
|
|
73
74
|
readonly blockquote: "[&_blockquote]:my-3 [&_blockquote]:border-s-2 [&_blockquote]:border-border [&_blockquote]:ps-4 [&_blockquote]:text-muted-foreground [&_blockquote]:italic";
|
|
74
75
|
readonly code: "[&_code]:rounded-sm [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-sm [&_code]:text-foreground";
|
|
75
76
|
readonly pre: "[&_pre:not([data-slot='code-block-pre'])]:my-3 [&_pre:not([data-slot='code-block-pre'])]:overflow-x-auto [&_pre:not([data-slot='code-block-pre'])]:rounded-lg [&_pre:not([data-slot='code-block-pre'])]:border [&_pre:not([data-slot='code-block-pre'])]:border-border [&_pre:not([data-slot='code-block-pre'])]:bg-muted [&_pre:not([data-slot='code-block-pre'])]:p-4 [&_pre:not([data-slot='code-block-pre'])]:text-foreground";
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ declare const prose: {
|
|
|
70
70
|
readonly ul: "[&_ul]:my-3 [&_ul]:ms-6 [&_ul]:list-disc [&_ul]:text-foreground [&_ul]:marker:text-muted-foreground [&_ul.contains-task-list]:list-none";
|
|
71
71
|
readonly ol: "[&_ol]:my-3 [&_ol]:ms-6 [&_ol]:list-decimal [&_ol]:text-foreground [&_ol]:marker:text-muted-foreground";
|
|
72
72
|
readonly li: "[&_li]:mt-1.5 [&_li]:leading-relaxed";
|
|
73
|
+
readonly taskList: "[&_ul[data-type=taskList]]:ms-0 [&_ul[data-type=taskList]]:list-none [&_li[data-type=taskItem]]:flex [&_li[data-type=taskItem]]:items-start [&_li[data-type=taskItem]]:gap-2 [&_li[data-type=taskItem]_[data-slot=checkbox]]:mt-1 [&_li[data-type=taskItem]_[data-slot=checkbox]]:me-0 [&_[data-slot=task-item-content]]:min-w-0 [&_[data-slot=task-item-content]]:flex-1 [&_td_p]:text-inherit [&_th_p]:text-inherit";
|
|
73
74
|
readonly blockquote: "[&_blockquote]:my-3 [&_blockquote]:border-s-2 [&_blockquote]:border-border [&_blockquote]:ps-4 [&_blockquote]:text-muted-foreground [&_blockquote]:italic";
|
|
74
75
|
readonly code: "[&_code]:rounded-sm [&_code]:bg-muted [&_code]:px-1.5 [&_code]:py-0.5 [&_code]:font-mono [&_code]:text-sm [&_code]:text-foreground";
|
|
75
76
|
readonly pre: "[&_pre:not([data-slot='code-block-pre'])]:my-3 [&_pre:not([data-slot='code-block-pre'])]:overflow-x-auto [&_pre:not([data-slot='code-block-pre'])]:rounded-lg [&_pre:not([data-slot='code-block-pre'])]:border [&_pre:not([data-slot='code-block-pre'])]:border-border [&_pre:not([data-slot='code-block-pre'])]:bg-muted [&_pre:not([data-slot='code-block-pre'])]:p-4 [&_pre:not([data-slot='code-block-pre'])]:text-foreground";
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vegastack/design",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.33",
|
|
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 && node test/doctor.test.mjs"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@vegastack/design-tokens": "^0.7.
|
|
73
|
+
"@vegastack/design-tokens": "^0.7.33",
|
|
74
74
|
"clsx": "^2.1.1",
|
|
75
75
|
"tailwind-merge": "^3.6.0",
|
|
76
76
|
"tsconfig-paths": "^4.2.0",
|
|
@@ -90,8 +90,8 @@ link` (upstream's set, verbatim). `destructive` is a soft tint, not a solid red
|
|
|
90
90
|
toggle, then views as `Tabs` (default variant, `TabsList size="sm"`, optional leading icons), then
|
|
91
91
|
the layout switch (`ViewToggle`), furthest right. Filters are `FilterBarFacet` /
|
|
92
92
|
`DateRangeFilter` chips (compact, rounded-md, tinted when set) on the toggled row; people facets
|
|
93
|
-
take `itemToSecondaryLabel={(p) => p.email}`.
|
|
94
|
-
Grid | List | Board. Tables are `DataList` with `sortable` columns (`compare`, `sortFirst`,
|
|
93
|
+
take `itemToSecondaryLabel={(p) => p.email}`. Toolbar switches use default Tabs — never a ToggleGroup or line
|
|
94
|
+
Tabs: `Tabs` for scope, `ViewToggle` (default Tabs, icons) for Grid | List | Board. Tables are `DataList` with `sortable` columns (`compare`, `sortFirst`,
|
|
95
95
|
`sortMode="client"`) and `rowActions` (the ⋯ column, always last); row links are never underlined.
|
|
96
96
|
- **`alert`** for an in-content notice — `variant` is `default · destructive · success · warning ·
|
|
97
97
|
info`, each an ink on the `card` surface with a required icon; **`announcement-banner`** only for
|
|
@@ -167,7 +167,7 @@ A component's name undersells it. Before composing something by hand, check this
|
|
|
167
167
|
edge: give it `data-slot="sheet-cancel"` and `SheetFooter` pushes it left with `me-auto`.
|
|
168
168
|
- **Feedback after an action** → `toast.add({ title })`.
|
|
169
169
|
- **A recording's text beside its player** → `Transcript` (follows `currentTime`, seeks through
|
|
170
|
-
`onSeek`, searches; `
|
|
170
|
+
`onSeek`, searches; `onSpeakerRename` makes each turn's speaker name inline-editable) with a `docked`
|
|
171
171
|
`AudioPlayer` at the bottom of the column — or, when playback must survive navigation, one
|
|
172
172
|
`AudioPlayerProvider` in the app shell, `GlobalAudioPlayer` at the end of the main column and
|
|
173
173
|
`useGlobalPlayer().open(track, { at })` / `useGlobalPlayerTime()` on the page.
|
|
@@ -281,6 +281,13 @@ descendant rules (`[&_h1]:…`), which means an element-level class on a child *
|
|
|
281
281
|
by setting a class on the rendered element. Under the page's own headings, `MarkdownView headingOffset={n}` moves every
|
|
282
282
|
heading down `n` levels (capped at h6) so the outline never skips back up.
|
|
283
283
|
|
|
284
|
+
**Markdown is read with `MarkdownView` and edited with `TextEdit format="markdown"`** — never a
|
|
285
|
+
textarea, a local prose class, or a hand-rolled editor. For in-place editing, swap the view for
|
|
286
|
+
`<TextEdit format="markdown" variant="ghost" onSave onCancel />`: ghost is borderless with no inset,
|
|
287
|
+
so the text does not move, and Save/Cancel sit at the toolbar's end (⌘/Ctrl+Enter saves, Esc
|
|
288
|
+
cancels). Pick `toolbar="minimal"` for comments, `"standard"` (default) for notes and summaries,
|
|
289
|
+
`"full"` for documents; the schema follows the toolbar. Keep `variant="outline"` inside forms.
|
|
290
|
+
|
|
284
291
|
`muted`, `accent` and `secondary` share one value in this base, and all three are kept: name the one
|
|
285
292
|
whose ROLE you mean, so a consumer can retune one without moving the others.
|
|
286
293
|
|
|
@@ -367,7 +374,7 @@ contract.
|
|
|
367
374
|
**Don't**
|
|
368
375
|
|
|
369
376
|
- Hardcode a hex, a px value, or a raw Tailwind palette class (`bg-neutral-900`, `text-red-500`).
|
|
370
|
-
- Add a focus ring, outline or glow. No focus rings anywhere
|
|
377
|
+
- Add a focus ring, outline or glow. No focus rings anywhere, Tabs included: `base.css` paints a subtle
|
|
371
378
|
background tint on `:focus-visible` and text entry tints its border instead; `ring-3`,
|
|
372
379
|
`ring-ring/50`, `focus-visible:ring-*` and `focus-visible:outline-*` are rejected by lint.
|
|
373
380
|
- Leave a neutral hover on a button inside a tinted container — a status `Alert` already gives its
|
|
@@ -120,7 +120,7 @@ starts with `icon-` is a component and never an icon.
|
|
|
120
120
|
- **`pagination`** — Page navigation — previous/next, numbered page links, an ellipsis for long ranges, and the active page.
|
|
121
121
|
- **`sidebar`** — A collapsible app navigation rail — header/content/footer, labelled groups, menu items with active and open (menu-trigger) states, and an expand/collapse trigger.
|
|
122
122
|
- **`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.
|
|
123
|
-
- **`tabs`** — Layered content sections — default (segmented) or line variants, compact size, optional leading icons and counts, horizontal or vertical, full keyboard navigation.
|
|
123
|
+
- **`tabs`** — Layered content sections — default (segmented) or line variants, compact size, optional leading icons and counts, horizontal or vertical, full keyboard navigation. Toolbar switches use default Tabs: scope (My tasks | Team tasks) and views, whose List/Board/Grid switch is ViewToggle (default Tabs with icons). The one component that keeps a focus ring.
|
|
124
124
|
|
|
125
125
|
## Feedback
|
|
126
126
|
|
|
@@ -137,7 +137,7 @@ starts with `icon-` is a component and never an icon.
|
|
|
137
137
|
|
|
138
138
|
- **`app-shell`** — The shared dashboard layout — a skip-linked sidebar + header + scrollable main region, composing Sidebar/SidebarTrigger into one reusable, hash-tracked shell.
|
|
139
139
|
- **`aspect-ratio`** — Constrains its children to a given width-to-height ratio.
|
|
140
|
-
- **`board`** — Kanban lanes — full-height lanes that scroll their cards inside, sticky headers with a collapse menu, + Add at each lane's foot, Nothing here / Drop here empty zones, per-lane skeletons and load-on-scroll paging; live pointer and touch drag (lift, make room, settle, edge auto-scroll), a keyboard pick-up/move/drop model, a
|
|
140
|
+
- **`board`** — Kanban lanes — full-height lanes that scroll their cards inside, sticky headers with a collapse menu, + Add at each lane's foot, Nothing here / Drop here empty zones, per-lane skeletons and load-on-scroll paging; live pointer and touch drag (lift, make room, settle, edge auto-scroll), a keyboard pick-up/move/drop model, a per-card ⋯ menu of the card's own actions, optimistic moves with rollback and a toast, and one lane at a time on a phone.
|
|
141
141
|
- **`direction`** — Base UI's DirectionProvider and useDirection — the text-direction context components read.
|
|
142
142
|
- **`record-layout`** — A record page's main column beside a sticky right rail of cards, with an ⓘ Details sheet in its place on small screens.
|
|
143
143
|
- **`resizable`** — Accessible resizable panel groups and layouts with keyboard support — horizontal or vertical, nestable, with an optional visible grip.
|