@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.
@@ -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)).
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  cn
4
- } from "./chunk-OHGNXG5G.js";
4
+ } from "./chunk-6CWBD6NJ.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-OHGNXG5G.js";
3
+ } from "../chunk-6CWBD6NJ.js";
4
4
 
5
5
  // src/icons/icon.tsx
6
6
  import "react";
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
@@ -5,7 +5,7 @@ import {
5
5
  mergeRefs,
6
6
  prose,
7
7
  proseClassName
8
- } from "./chunk-OHGNXG5G.js";
8
+ } from "./chunk-6CWBD6NJ.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.7.31",
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.18",
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}`. Use Tabs for scope/views, `ViewToggle` for
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; `TranscriptSpeakers` + `onSpeakerRename` for speaker chips) with a `docked`
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 except Tabs: `base.css` paints a subtle
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. Use Tabs for scope/views (My tasks | Team tasks); use an icon ToggleGroup for List/Board layout switches. The one component that keeps a focus ring.
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 lossless per-card Move menu, optimistic moves with rollback and a toast, and one lane at a time on a phone.
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.