@nadicodeai/ui 0.10.1 → 0.11.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.
Files changed (146) hide show
  1. package/AGENTS.md +23 -135
  2. package/README.md +39 -110
  3. package/dist/components/action-band.d.ts +5 -3
  4. package/dist/components/action-band.d.ts.map +1 -1
  5. package/dist/components/action-band.js +35 -21
  6. package/dist/components/agent-chat.d.ts.map +1 -1
  7. package/dist/components/agent-chat.js +1 -1
  8. package/dist/components/agent-composer.d.ts.map +1 -1
  9. package/dist/components/agent-composer.js +1 -1
  10. package/dist/components/ai-elements/code-block.d.ts.map +1 -1
  11. package/dist/components/ai-elements/code-block.js +9 -23
  12. package/dist/components/ai-elements/commit.d.ts.map +1 -1
  13. package/dist/components/ai-elements/commit.js +9 -23
  14. package/dist/components/ai-elements/environment-variables.d.ts.map +1 -1
  15. package/dist/components/ai-elements/environment-variables.js +4 -29
  16. package/dist/components/ai-elements/snippet.d.ts.map +1 -1
  17. package/dist/components/ai-elements/snippet.js +9 -23
  18. package/dist/components/ai-elements/stack-trace.d.ts.map +1 -1
  19. package/dist/components/ai-elements/stack-trace.js +8 -21
  20. package/dist/components/ai-elements/terminal.d.ts.map +1 -1
  21. package/dist/components/ai-elements/terminal.js +16 -29
  22. package/dist/components/alert-dialog.d.ts.map +1 -1
  23. package/dist/components/alert-dialog.js +3 -2
  24. package/dist/components/artifact-panel.d.ts.map +1 -1
  25. package/dist/components/artifact-panel.js +5 -5
  26. package/dist/components/badge.js +1 -1
  27. package/dist/components/bento.d.ts +14 -3
  28. package/dist/components/bento.d.ts.map +1 -1
  29. package/dist/components/bento.js +26 -5
  30. package/dist/components/brand.d.ts.map +1 -1
  31. package/dist/components/brand.js +29 -3
  32. package/dist/components/button.js +1 -1
  33. package/dist/components/chart-time-series.d.ts.map +1 -1
  34. package/dist/components/chart-time-series.js +2 -2
  35. package/dist/components/chart.js +1 -1
  36. package/dist/components/contact.d.ts +22 -10
  37. package/dist/components/contact.d.ts.map +1 -1
  38. package/dist/components/contact.js +34 -12
  39. package/dist/components/dialog.d.ts.map +1 -1
  40. package/dist/components/dialog.js +3 -2
  41. package/dist/components/diff-count.js +1 -1
  42. package/dist/components/dropdown-menu.d.ts.map +1 -1
  43. package/dist/components/dropdown-menu.js +2 -1
  44. package/dist/components/faq-item.js +2 -2
  45. package/dist/components/faq.d.ts +4 -1
  46. package/dist/components/faq.d.ts.map +1 -1
  47. package/dist/components/faq.js +5 -2
  48. package/dist/components/feature-grid.d.ts +23 -0
  49. package/dist/components/feature-grid.d.ts.map +1 -0
  50. package/dist/components/feature-grid.js +33 -0
  51. package/dist/components/feature-rows.d.ts +23 -0
  52. package/dist/components/feature-rows.d.ts.map +1 -0
  53. package/dist/components/feature-rows.js +27 -0
  54. package/dist/components/footer.d.ts +18 -12
  55. package/dist/components/footer.d.ts.map +1 -1
  56. package/dist/components/footer.js +32 -20
  57. package/dist/components/hero.d.ts +28 -0
  58. package/dist/components/hero.d.ts.map +1 -0
  59. package/dist/components/hero.js +45 -0
  60. package/dist/components/input-otp.js +1 -1
  61. package/dist/components/integration-flow.d.ts +36 -0
  62. package/dist/components/integration-flow.d.ts.map +1 -0
  63. package/dist/components/integration-flow.js +36 -0
  64. package/dist/components/live-demo.d.ts +31 -0
  65. package/dist/components/live-demo.d.ts.map +1 -0
  66. package/dist/components/live-demo.js +30 -0
  67. package/dist/components/logo-band.d.ts +12 -2
  68. package/dist/components/logo-band.d.ts.map +1 -1
  69. package/dist/components/logo-band.js +16 -1
  70. package/dist/components/logo-tile.d.ts.map +1 -1
  71. package/dist/components/logo-tile.js +5 -2
  72. package/dist/components/nav-bar.d.ts +14 -8
  73. package/dist/components/nav-bar.d.ts.map +1 -1
  74. package/dist/components/nav-bar.js +19 -13
  75. package/dist/components/popover.d.ts.map +1 -1
  76. package/dist/components/popover.js +2 -1
  77. package/dist/components/pricing-card.d.ts +10 -15
  78. package/dist/components/pricing-card.d.ts.map +1 -1
  79. package/dist/components/pricing-card.js +18 -29
  80. package/dist/components/pricing.d.ts +11 -14
  81. package/dist/components/pricing.d.ts.map +1 -1
  82. package/dist/components/pricing.js +5 -15
  83. package/dist/components/quote-card.d.ts +10 -2
  84. package/dist/components/quote-card.d.ts.map +1 -1
  85. package/dist/components/quote-card.js +15 -3
  86. package/dist/components/security-grid.d.ts +25 -0
  87. package/dist/components/security-grid.d.ts.map +1 -0
  88. package/dist/components/security-grid.js +31 -0
  89. package/dist/components/select.d.ts.map +1 -1
  90. package/dist/components/select.js +2 -1
  91. package/dist/components/sheet.d.ts.map +1 -1
  92. package/dist/components/sheet.js +3 -2
  93. package/dist/components/sidebar.js +1 -1
  94. package/dist/components/stat-block.d.ts +9 -5
  95. package/dist/components/stat-block.d.ts.map +1 -1
  96. package/dist/components/stat-block.js +12 -6
  97. package/dist/components/statement.d.ts +32 -0
  98. package/dist/components/statement.d.ts.map +1 -0
  99. package/dist/components/statement.js +40 -0
  100. package/dist/components/stats-band.d.ts +6 -2
  101. package/dist/components/stats-band.d.ts.map +1 -1
  102. package/dist/components/stats-band.js +10 -3
  103. package/dist/components/status-dot.js +4 -4
  104. package/dist/components/steps.d.ts +34 -0
  105. package/dist/components/steps.d.ts.map +1 -0
  106. package/dist/components/steps.js +40 -0
  107. package/dist/components/team-grid.d.ts +27 -0
  108. package/dist/components/team-grid.d.ts.map +1 -0
  109. package/dist/components/team-grid.js +30 -0
  110. package/dist/components/testimonials.d.ts +39 -12
  111. package/dist/components/testimonials.d.ts.map +1 -1
  112. package/dist/components/testimonials.js +46 -13
  113. package/dist/components/texture-strip.d.ts +22 -0
  114. package/dist/components/texture-strip.d.ts.map +1 -0
  115. package/dist/components/texture-strip.js +29 -0
  116. package/dist/components/toggle.js +1 -1
  117. package/dist/components/tooltip.d.ts.map +1 -1
  118. package/dist/components/tooltip.js +2 -1
  119. package/dist/index.d.ts +10 -0
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +10 -0
  122. package/dist/lib/message-scroller-primitive/geometry.d.ts +1 -5
  123. package/dist/lib/message-scroller-primitive/geometry.d.ts.map +1 -1
  124. package/dist/lib/message-scroller-primitive/geometry.js +1 -1
  125. package/dist/lib/message-scroller-primitive/stores.d.ts +2 -3
  126. package/dist/lib/message-scroller-primitive/stores.d.ts.map +1 -1
  127. package/dist/lib/message-scroller-primitive/stores.js +1 -1
  128. package/dist/lib/message-scroller-primitive/types.d.ts +1 -2
  129. package/dist/lib/message-scroller-primitive/types.d.ts.map +1 -1
  130. package/dist/lib/message-scroller-primitive/types.js +1 -1
  131. package/dist/lib/motion.d.ts +12 -0
  132. package/dist/lib/motion.d.ts.map +1 -0
  133. package/dist/lib/motion.js +11 -0
  134. package/dist/lib/use-copy-to-clipboard.d.ts +11 -0
  135. package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -0
  136. package/dist/lib/use-copy-to-clipboard.js +27 -0
  137. package/dist/styles/globals.css +175 -300
  138. package/docs/agent-work-surfaces.md +6 -5
  139. package/docs/agents/nadicodeai-ui.md +42 -273
  140. package/docs/consuming-cross-repo.md +26 -33
  141. package/docs/contract.md +43 -0
  142. package/docs/migration/nadia-consumer-readiness.md +5 -10
  143. package/docs/terminal-tui-semantics.md +142 -181
  144. package/llms.txt +49 -84
  145. package/package.json +2 -3
  146. package/skills/nadicodeai-ui/SKILL.md +6 -30
@@ -1,26 +1,23 @@
1
1
  import * as React from "react";
2
2
  /**
3
- * pricing — package/tier comparison row (replaces the retired `sections/pricing.css`
4
- * + its coupled `pricing-card` / `pricing-card-featured` molecules).
3
+ * pricing — package/tier comparison row (V5 rework).
5
4
  *
6
- * SINGLE-OWNER SEAM (preserved from the retired CSS, do not double-draw):
7
- * - The DIVIDERS between tiers are owned once by the grid: `gap-px bg-border`
8
- * paints the brand `line` behind the cards and leaves a 1px guide gap, exactly
9
- * the retired `nc-row-grid[data-edges="inner"]` gap-as-seam. Each `PricingCard`
10
- * is borderless and square-cornered, so it never repeats that coordinate.
11
- * - The FEATURED RAIL (`emphasis="featured"`) is a 3px `flag-red` bar pinned to
12
- * the leading inside edge of the featured card via an absolutely-positioned
13
- * span the retired inset-rail model (painted INSIDE the card padding, NOT a
14
- * border), so it never stacks onto the grid gap-seam. The card establishes the
15
- * positioning context (`relative`). The featured card's polarity flip lives in
16
- * the `PricingCard variant="featured"` molecule, not here.
5
+ * SINGLE-OWNER SEAM: the DIVIDERS between tiers are owned once by the grid —
6
+ * `SeamGrid` (no surface) paints the brand `line` behind the cards and leaves a
7
+ * 1px guide gap (`gap-px bg-border`). Each `PricingCard` is borderless and
8
+ * square-cornered, so it never repeats that coordinate.
9
+ *
10
+ * FEATURED TIER (V5): the featured (middle) column reads as featured through a
11
+ * SOFT canvas surface, owned by `PricingCard variant="featured"` there is no
12
+ * inset rail or polarity flip in this rework. `emphasis` is kept for API
13
+ * compatibility and surfaces as `data-emphasis`; it draws nothing here.
17
14
  *
18
15
  * The frame/lane/row geometry (perimeter + top/bottom seams) is owned by the kept
19
16
  * structural-geometry layer the page composes this inside; `Pricing` owns no frame
20
17
  * math, no marker, and no perimeter line. Token-only; no `dark:` styling.
21
18
  */
22
19
  type PricingEmphasis = "none" | "featured";
23
- declare function Pricing({ className, columns, emphasis, children, ...props }: React.ComponentProps<"div"> & {
20
+ declare function Pricing({ className, columns, emphasis, ...props }: React.ComponentProps<"div"> & {
24
21
  columns?: 2 | 3;
25
22
  emphasis?: PricingEmphasis;
26
23
  }): React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,KAAK,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3C,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,OAAW,EACX,QAAiB,EACjB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,qBAwCA;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;GAgBG;AAEH,KAAK,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3C,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,OAAW,EACX,QAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,qBAgBA;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -1,21 +1,11 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import * as React from "react";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
3
2
  import { cn } from "../lib/utils.js";
4
3
  import { SeamGrid } from "./seam-grid.js";
5
- function Pricing({ className, columns = 3, emphasis = "none", children, ...props }) {
4
+ function Pricing({ className, columns = 3, emphasis = "none", ...props }) {
6
5
  return (_jsx(SeamGrid, { "data-slot": "pricing", "data-emphasis": emphasis, className: cn(
7
6
  // gap-as-seam: SeamGrid (no surface) is the single owner of every divider
8
- // between tiers (`gap-px bg-border`).
9
- "h-full", columns === 2 ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
10
- // the featured card is the rail's positioning context and gets the rail span.
11
- emphasis === "featured" && "[&_[data-variant=featured]]:relative", className), ...props, children: emphasis === "featured"
12
- ? React.Children.map(children, (child) => {
13
- if (React.isValidElement(child) &&
14
- child.props.variant === "featured") {
15
- return React.cloneElement(child, undefined, _jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 start-0 w-[3px] bg-[var(--nc-flag-red)]" }), child.props.children] }));
16
- }
17
- return child;
18
- })
19
- : children }));
7
+ // between tiers (`gap-px bg-border`). Cards stretch to equal height so the
8
+ // bottom-pinned CTA aligns across columns.
9
+ "h-full items-stretch", columns === 2 ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", className), ...props }));
20
10
  }
21
11
  export { Pricing };
@@ -15,9 +15,17 @@ import * as React from "react";
15
15
  declare function QuoteCard({ className, surface, ...props }: React.ComponentProps<"figure"> & {
16
16
  surface?: "canvas" | "ink";
17
17
  }): React.JSX.Element;
18
- declare function QuoteCardBody({ className, ...props }: React.ComponentProps<"blockquote">): React.JSX.Element;
18
+ declare function QuoteCardBody({ className, size, ...props }: React.ComponentProps<"blockquote"> & {
19
+ size?: "md" | "lg";
20
+ }): React.JSX.Element;
21
+ /**
22
+ * QuoteCardAvatar — the tint circle (an initial) that opens the attribution row.
23
+ * A verde-tint chip: soft `success` field, `--nc-link` (verde) glyph. Decorative
24
+ * (`aria-hidden`), so the attribution name/role carry the accessible identity.
25
+ */
26
+ declare function QuoteCardAvatar({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
19
27
  declare function QuoteCardAttribution({ className, ...props }: React.ComponentProps<"figcaption">): React.JSX.Element;
20
28
  declare function QuoteCardName({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
21
29
  declare function QuoteCardRole({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
22
- export { QuoteCard, QuoteCardBody, QuoteCardAttribution, QuoteCardName, QuoteCardRole };
30
+ export { QuoteCard, QuoteCardBody, QuoteCardAvatar, QuoteCardAttribution, QuoteCardName, QuoteCardRole, };
23
31
  //# sourceMappingURL=quote-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"quote-card.d.ts","sourceRoot":"","sources":["../../src/components/quote-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAmBjE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,qBAQjF;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,qBAQxF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"quote-card.d.ts","sourceRoot":"","sources":["../../src/components/quote-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAmBjE;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,qBAiB7D;AAED;;;;GAIG;AACH,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAY7E;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,qBAQxF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,CAAC"}
@@ -21,8 +21,20 @@ function QuoteCard({ className, surface = "canvas", ...props }) {
21
21
  "[&_[data-slot=quote-card-role]]:text-[color-mix(in_srgb,var(--nc-canvas)_60%,var(--nc-muted))]",
22
22
  ], className), ...props }));
23
23
  }
24
- function QuoteCardBody({ className, ...props }) {
25
- return (_jsx("blockquote", { "data-slot": "quote-card-body", className: cn("m-0 text-lg leading-[1.5] font-normal text-foreground", className), ...props }));
24
+ function QuoteCardBody({ className, size = "md", ...props }) {
25
+ return (_jsx("blockquote", { "data-slot": "quote-card-body", "data-size": size, className: cn("m-0 font-normal text-foreground",
26
+ // md: the default measure. lg: the featured "big quote" (V5 B13) — a tighter
27
+ // measure and a display-scale clamp for the single testimonial slot.
28
+ size === "md" && "text-lg leading-[1.5]", size === "lg" &&
29
+ "max-w-[26ch] text-[clamp(24px,2.4vw,34px)] leading-[1.2] font-semibold tracking-[-0.02em]", className), ...props }));
30
+ }
31
+ /**
32
+ * QuoteCardAvatar — the tint circle (an initial) that opens the attribution row.
33
+ * A verde-tint chip: soft `success` field, `--nc-link` (verde) glyph. Decorative
34
+ * (`aria-hidden`), so the attribution name/role carry the accessible identity.
35
+ */
36
+ function QuoteCardAvatar({ className, ...props }) {
37
+ return (_jsx("span", { "data-slot": "quote-card-avatar", "aria-hidden": "true", className: cn("flex size-11 shrink-0 items-center justify-center rounded-full bg-success/15 text-base font-semibold text-[var(--nc-link)]", className), ...props }));
26
38
  }
27
39
  function QuoteCardAttribution({ className, ...props }) {
28
40
  return (_jsx("figcaption", { "data-slot": "quote-card-attribution", className: cn("flex items-center gap-3", className), ...props }));
@@ -33,4 +45,4 @@ function QuoteCardName({ className, ...props }) {
33
45
  function QuoteCardRole({ className, ...props }) {
34
46
  return (_jsx("div", { "data-slot": "quote-card-role", className: cn("font-mono text-xs uppercase text-muted-foreground", className), ...props }));
35
47
  }
36
- export { QuoteCard, QuoteCardBody, QuoteCardAttribution, QuoteCardName, QuoteCardRole };
48
+ export { QuoteCard, QuoteCardBody, QuoteCardAvatar, QuoteCardAttribution, QuoteCardName, QuoteCardRole, };
@@ -0,0 +1,25 @@
1
+ import * as React from "react";
2
+ /**
3
+ * security-grid — the always-dark control/data grid (V5 B14).
4
+ *
5
+ * A bordered 4-cell grid on the night surface: each cell carries a bordered
6
+ * glyph box (icon slot), a title, and a body line. The dividers are owned once
7
+ * by `SeamGrid` (gap-as-seam, `bg-border`); cells are borderless fills.
8
+ *
9
+ * ALWAYS-DARK: this section renders dark regardless of the page theme. Rather
10
+ * than a `dark:` utility (forbidden) it sets the `dark` ancestor class on its
11
+ * own root, so every semantic role it composes (`bg-border` seam, `bg-card`
12
+ * fill, `text-foreground`, `text-muted-foreground`, `text-primary`) resolves to
13
+ * its dark value. Only the standard shadcn role vars are used. Token-only.
14
+ */
15
+ declare const columnClasses: Record<number, string>;
16
+ declare function SecurityGrid({ className, columns, ...props }: React.ComponentProps<"div"> & {
17
+ columns?: keyof typeof columnClasses;
18
+ }): React.JSX.Element;
19
+ declare function SecurityCell({ className, icon, title, body, ...props }: React.ComponentProps<"div"> & {
20
+ icon?: React.ReactNode;
21
+ title: string;
22
+ body: string;
23
+ }): React.JSX.Element;
24
+ export { SecurityGrid, SecurityCell };
25
+ //# sourceMappingURL=security-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-grid.d.ts","sourceRoot":"","sources":["../../src/components/security-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIzC,CAAC;AAEF,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,OAAO,aAAa,CAAA;CAAE,qBAUxE;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,qBAsBA;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
4
+ /**
5
+ * security-grid — the always-dark control/data grid (V5 B14).
6
+ *
7
+ * A bordered 4-cell grid on the night surface: each cell carries a bordered
8
+ * glyph box (icon slot), a title, and a body line. The dividers are owned once
9
+ * by `SeamGrid` (gap-as-seam, `bg-border`); cells are borderless fills.
10
+ *
11
+ * ALWAYS-DARK: this section renders dark regardless of the page theme. Rather
12
+ * than a `dark:` utility (forbidden) it sets the `dark` ancestor class on its
13
+ * own root, so every semantic role it composes (`bg-border` seam, `bg-card`
14
+ * fill, `text-foreground`, `text-muted-foreground`, `text-primary`) resolves to
15
+ * its dark value. Only the standard shadcn role vars are used. Token-only.
16
+ */
17
+ const columnClasses = {
18
+ 2: "grid-cols-1 sm:grid-cols-2",
19
+ 3: "grid-cols-1 sm:grid-cols-3",
20
+ 4: "grid-cols-2 lg:grid-cols-4",
21
+ };
22
+ function SecurityGrid({ className, columns = 4, ...props }) {
23
+ return (
24
+ // `dark` on the root flips every role below to its night value; SeamGrid
25
+ // keeps sole ownership of the seams (its `bg-border` resolves dark here).
26
+ _jsx(SeamGrid, { "data-slot": "security-grid", className: cn("dark", columnClasses[columns], className), ...props }));
27
+ }
28
+ function SecurityCell({ className, icon, title, body, ...props }) {
29
+ return (_jsxs("div", { "data-slot": "security-cell", className: cn("nc-panel-cell content-start bg-card", className), ...props, children: [_jsx("span", { "data-slot": "security-cell-glyph", className: "grid size-[34px] place-items-center border border-border text-primary", "aria-hidden": icon ? undefined : true, children: icon }), _jsx("h3", { "data-slot": "security-cell-title", className: "nc-type-body-md-strong text-foreground", children: title }), _jsx("p", { "data-slot": "security-cell-body", className: "nc-type-body-sm text-muted-foreground", children: body })] }));
30
+ }
31
+ export { SecurityGrid, SecurityCell };
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKlE,QAAA,MAAM,MAAM,6BAAuB,CAAC;AAEpC,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,qBAQxE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,qBAQxE;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,GAAG;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACzB,qBAiBA;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,IAAe,EACf,UAAc,EACd,KAAgB,EAChB,WAAe,EACf,oBAA2B,EAC3B,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAC5B,IAAI,CACF,eAAe,CAAC,UAAU,CAAC,KAAK,EAChC,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,sBAAsB,CACzE,qBA2BF;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,qBAQ7E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,qBAsBhF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,qBAQhF;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,aAAa,CAAC,qBAa5D;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,eAAe,CAAC,qBAa9D;AAED,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAC"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/components/select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAMlE,QAAA,MAAM,MAAM,6BAAuB,CAAC;AAEpC,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,qBAQxE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,qBAQxE;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,OAAO,CAAC,KAAK,GAAG;IACjC,IAAI,CAAC,EAAE,IAAI,GAAG,SAAS,CAAC;CACzB,qBAiBA;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,QAAQ,EACR,IAAe,EACf,UAAc,EACd,KAAgB,EAChB,WAAe,EACf,oBAA2B,EAC3B,GAAG,KAAK,EACT,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,GAC5B,IAAI,CACF,eAAe,CAAC,UAAU,CAAC,KAAK,EAChC,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,sBAAsB,CACzE,qBA4BF;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC,KAAK,qBAQ7E;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,IAAI,CAAC,KAAK,qBAsBhF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC,KAAK,qBAQhF;AAED,iBAAS,oBAAoB,CAAC,EAC5B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,aAAa,CAAC,qBAa5D;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,eAAe,CAAC,qBAa9D;AAED,OAAO,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Select as SelectPrimitive } from "@base-ui/react/select";
4
4
  import { cn } from "../lib/utils.js";
5
+ import { anchoredOverlayMotion } from "../lib/motion.js";
5
6
  import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react";
6
7
  const Select = SelectPrimitive.Root;
7
8
  function SelectGroup({ className, ...props }) {
@@ -14,7 +15,7 @@ function SelectTrigger({ className, size = "default", children, ...props }) {
14
15
  return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("flex h-control-height min-h-touch-target w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-background py-2 pr-2 pl-control-padding-inline text-sm whitespace-nowrap transition-colors outline-none select-none focus-visible:border-ring focus-visible:ring-focus focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-focus aria-invalid:ring-destructive data-placeholder:text-placeholder data-[size=sm]:h-7 [@media(hover:hover)_and_(pointer:fine)]:min-h-0 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { render: _jsx(ChevronDownIcon, { className: "pointer-events-none size-4 text-muted-foreground" }) })] }));
15
16
  }
16
17
  function SelectContent({ className, children, side = "bottom", sideOffset = 4, align = "center", alignOffset = 0, alignItemWithTrigger = true, ...props }) {
17
- return (_jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Positioner, { side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, alignItemWithTrigger: alignItemWithTrigger, className: "isolate z-50", children: _jsxs(SelectPrimitive.Popup, { "data-slot": "select-content", "data-align-trigger": alignItemWithTrigger, className: cn("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-2xl border border-border bg-popover text-popover-foreground shadow-menu duration-100 data-[align-trigger=true]:animate-none data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.List, { children: children }), _jsx(SelectScrollDownButton, {})] }) }) }));
18
+ return (_jsx(SelectPrimitive.Portal, { children: _jsx(SelectPrimitive.Positioner, { side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, alignItemWithTrigger: alignItemWithTrigger, className: "isolate z-50", children: _jsxs(SelectPrimitive.Popup, { "data-slot": "select-content", "data-align-trigger": alignItemWithTrigger, className: cn("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 overflow-x-hidden overflow-y-auto rounded-2xl border border-border bg-popover text-popover-foreground shadow-menu data-[align-trigger=true]:transition-none", anchoredOverlayMotion, className), ...props, children: [_jsx(SelectScrollUpButton, {}), _jsx(SelectPrimitive.List, { children: children }), _jsx(SelectScrollDownButton, {})] }) }) }));
18
19
  }
19
20
  function SelectLabel({ className, ...props }) {
20
21
  return (_jsx(SelectPrimitive.GroupLabel, { "data-slot": "select-label", className: cn("px-1.5 py-1 text-xs text-muted-foreground", className), ...props }));
@@ -1 +1 @@
1
- {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/components/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAMjE,iBAAS,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,qBAErD;AAED,iBAAS,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,qBAE/D;AAED,iBAAS,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,qBAE3D;AAmBD,KAAK,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG;IACpD,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B,CAAC;AAEF,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,IAAc,EACd,eAAsB,EACtB,UAAoB,EACpB,GAAG,KAAK,EACT,EAAE,iBAAiB,qBAgCnB;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,qBAQtE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,qBAQlF;AAED,OAAO,EACL,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAC"}
1
+ {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/components/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAOjE,iBAAS,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,qBAErD;AAED,iBAAS,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,qBAE/D;AAED,iBAAS,UAAU,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,qBAE3D;AAgBD,KAAK,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG;IACpD,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC9B,CAAC;AAEF,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,QAAQ,EACR,IAAc,EACd,eAAsB,EACtB,UAAoB,EACpB,GAAG,KAAK,EACT,EAAE,iBAAiB,qBAgCnB;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,qBAQtE;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,CAAC,WAAW,CAAC,KAAK,qBAQlF;AAED,OAAO,EACL,KAAK,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAC"}
@@ -2,6 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Dialog as SheetPrimitive } from "@base-ui/react/dialog";
4
4
  import { cn } from "../lib/utils.js";
5
+ import { overlayBackdropMotion } from "../lib/motion.js";
5
6
  import { Button } from "./button.js";
6
7
  import { XIcon } from "lucide-react";
7
8
  function Sheet({ ...props }) {
@@ -17,10 +18,10 @@ function SheetPortal({ ...props }) {
17
18
  return _jsx(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
18
19
  }
19
20
  function SheetOverlay({ className, ...props }) {
20
- return (_jsx(SheetPrimitive.Backdrop, { "data-slot": "sheet-overlay", className: cn("fixed inset-0 z-50 bg-scrim/scrim transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0", className), ...props }));
21
+ return (_jsx(SheetPrimitive.Backdrop, { "data-slot": "sheet-overlay", className: cn("fixed inset-0 z-50 bg-scrim/scrim", overlayBackdropMotion, className), ...props }));
21
22
  }
22
23
  function SheetContent({ className, children, side = "right", showCloseButton = true, closeLabel = "Close", ...props }) {
23
- return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, {}), _jsxs(SheetPrimitive.Popup, { "data-slot": "sheet-content", "data-side": side, className: cn("fixed z-50 flex max-h-[calc(100%-var(--nc-lg))] flex-col gap-nadicode-md rounded-3xl border border-border bg-popover bg-clip-padding text-sm text-popover-foreground shadow-sheet transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-nadicode-sm data-[side=bottom]:bottom-nadicode-sm data-[side=bottom]:h-auto data-[side=bottom]:data-ending-style:translate-y-10 data-[side=bottom]:data-starting-style:translate-y-10 data-[side=left]:inset-y-nadicode-sm data-[side=left]:left-nadicode-sm data-[side=left]:w-3/4 data-[side=left]:data-ending-style:-translate-x-10 data-[side=left]:data-starting-style:-translate-x-10 data-[side=right]:inset-y-nadicode-sm data-[side=right]:right-nadicode-sm data-[side=right]:w-3/4 data-[side=right]:data-ending-style:translate-x-10 data-[side=right]:data-starting-style:translate-x-10 data-[side=top]:inset-x-nadicode-sm data-[side=top]:top-nadicode-sm data-[side=top]:h-auto data-[side=top]:data-ending-style:-translate-y-10 data-[side=top]:data-starting-style:-translate-y-10 data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className), ...props, children: [children, showCloseButton && (_jsxs(SheetPrimitive.Close, { "data-slot": "sheet-close", render: _jsx(Button, { variant: "ghost", className: "absolute top-nadicode-md right-nadicode-md", size: "icon-sm" }), children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: closeLabel })] }))] })] }));
24
+ return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, {}), _jsxs(SheetPrimitive.Popup, { "data-slot": "sheet-content", "data-side": side, className: cn("fixed z-50 flex max-h-[calc(100%-var(--nc-lg))] flex-col gap-nadicode-md rounded-3xl border border-border bg-popover bg-clip-padding text-sm text-popover-foreground shadow-sheet transition-[opacity,translate] duration-[var(--nc-duration-close)] ease-[var(--nc-ease-out-strong)] data-open:duration-[var(--nc-duration-open)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none motion-reduce:data-ending-style:opacity-100 motion-reduce:data-starting-style:opacity-100 data-[side=bottom]:inset-x-nadicode-sm data-[side=bottom]:bottom-nadicode-sm data-[side=bottom]:h-auto data-[side=bottom]:data-ending-style:translate-y-nadicode-md data-[side=bottom]:data-starting-style:translate-y-nadicode-md motion-reduce:data-[side=bottom]:data-ending-style:translate-none motion-reduce:data-[side=bottom]:data-starting-style:translate-none data-[side=left]:inset-y-nadicode-sm data-[side=left]:left-nadicode-sm data-[side=left]:w-3/4 data-[side=left]:data-ending-style:-translate-x-nadicode-md data-[side=left]:data-starting-style:-translate-x-nadicode-md motion-reduce:data-[side=left]:data-ending-style:translate-none motion-reduce:data-[side=left]:data-starting-style:translate-none data-[side=right]:inset-y-nadicode-sm data-[side=right]:right-nadicode-sm data-[side=right]:w-3/4 data-[side=right]:data-ending-style:translate-x-nadicode-md data-[side=right]:data-starting-style:translate-x-nadicode-md motion-reduce:data-[side=right]:data-ending-style:translate-none motion-reduce:data-[side=right]:data-starting-style:translate-none data-[side=top]:inset-x-nadicode-sm data-[side=top]:top-nadicode-sm data-[side=top]:h-auto data-[side=top]:data-ending-style:-translate-y-nadicode-md data-[side=top]:data-starting-style:-translate-y-nadicode-md motion-reduce:data-[side=top]:data-ending-style:translate-none motion-reduce:data-[side=top]:data-starting-style:translate-none data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className), ...props, children: [children, showCloseButton && (_jsxs(SheetPrimitive.Close, { "data-slot": "sheet-close", render: _jsx(Button, { variant: "ghost", className: "absolute top-nadicode-md right-nadicode-md", size: "icon-sm" }), children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: closeLabel })] }))] })] }));
24
25
  }
25
26
  function SheetHeader({ className, ...props }) {
26
27
  return (_jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-0.5 p-nadicode-lg", className), ...props }));
@@ -105,7 +105,7 @@ function SidebarTrigger({ className, onClick, ...props }) {
105
105
  }
106
106
  function SidebarRail({ className, "aria-label": ariaLabel = "Toggle Sidebar", title, ...props }) {
107
107
  const { toggleSidebar } = useSidebar();
108
- return (_jsx("button", { "data-sidebar": "rail", "data-slot": "sidebar-rail", "aria-label": ariaLabel, title: title ?? ariaLabel, tabIndex: -1, onClick: toggleSidebar, className: cn("absolute inset-y-0 z-20 hidden w-11 transition-all ease-linear group-data-[side=left]:-right-11 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-0.5 hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 [@media(hover:hover)_and_(pointer:fine)]:w-4 [@media(hover:hover)_and_(pointer:fine)]:group-data-[side=left]:-right-4", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className), ...props }));
108
+ return (_jsx("button", { "data-sidebar": "rail", "data-slot": "sidebar-rail", "aria-label": ariaLabel, title: title ?? ariaLabel, tabIndex: -1, onClick: toggleSidebar, className: cn("absolute inset-y-0 z-20 hidden w-11 group-data-[side=left]:-right-11 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:start-1/2 after:w-0.5 hover:after:bg-sidebar-border sm:flex ltr:-translate-x-1/2 rtl:-translate-x-1/2 [@media(hover:hover)_and_(pointer:fine)]:w-4 [@media(hover:hover)_and_(pointer:fine)]:group-data-[side=left]:-right-4", "in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize", "[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize", "group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar", "[[data-side=left][data-collapsible=offcanvas]_&]:-right-2", "[[data-side=right][data-collapsible=offcanvas]_&]:-left-2", className), ...props }));
109
109
  }
110
110
  function SidebarInset({ className, ...props }) {
111
111
  return (_jsx("main", { "data-slot": "sidebar-inset", className: cn("relative flex w-full flex-1 flex-col bg-background md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-md md:peer-data-[variant=inset]:border md:peer-data-[variant=inset]:border-border md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2", className), ...props }));
@@ -2,10 +2,13 @@ import * as React from "react";
2
2
  /**
3
3
  * stat-block — single statistic fill (replaces the retired `.nc-stat-block`).
4
4
  *
5
- * A large numeral over a mono label. Seam-free canvas fill: it drops into the
6
- * `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws NO
7
- * border and is square-cornered. `surface="ink"` inverts onto the ink role for a
8
- * dark band. Token-only; no `dark:` styling.
5
+ * A large tabular numeral over a mono label. Seam-free canvas fill: it drops into
6
+ * the `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
7
+ * NO border and is square-cornered. `surface="ink"` inverts onto the ink role for
8
+ * a dark band; inside a `StatsBand surface="night"` the ancestor `.dark` class
9
+ * flips the default canvas roles, so a plain `StatBlock` reads dark there.
10
+ * `StatBlockFigureAccent` marks the verde substring of a figure (`text-primary`).
11
+ * Token-only; no `dark:` styling.
9
12
  */
10
13
  declare function StatBlock({ className, surface, ...props }: React.ComponentProps<"div"> & {
11
14
  surface?: "canvas" | "ink";
@@ -13,8 +16,9 @@ declare function StatBlock({ className, surface, ...props }: React.ComponentProp
13
16
  declare function StatBlockFigure({ className, surface, ...props }: React.ComponentProps<"div"> & {
14
17
  surface?: "canvas" | "ink";
15
18
  }): React.JSX.Element;
19
+ declare function StatBlockFigureAccent({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
16
20
  declare function StatBlockLabel({ className, surface, ...props }: React.ComponentProps<"div"> & {
17
21
  surface?: "canvas" | "ink";
18
22
  }): React.JSX.Element;
19
- export { StatBlock, StatBlockFigure, StatBlockLabel };
23
+ export { StatBlock, StatBlockFigure, StatBlockFigureAccent, StatBlockLabel };
20
24
  //# sourceMappingURL=stat-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stat-block.d.ts","sourceRoot":"","sources":["../../src/components/stat-block.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;GAOG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAa9D;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"stat-block.d.ts","sourceRoot":"","sources":["../../src/components/stat-block.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAa9D;AAED,iBAAS,eAAe,CAAC,EACvB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQnF;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC"}
@@ -3,18 +3,24 @@ import { cn } from "../lib/utils.js";
3
3
  /**
4
4
  * stat-block — single statistic fill (replaces the retired `.nc-stat-block`).
5
5
  *
6
- * A large numeral over a mono label. Seam-free canvas fill: it drops into the
7
- * `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws NO
8
- * border and is square-cornered. `surface="ink"` inverts onto the ink role for a
9
- * dark band. Token-only; no `dark:` styling.
6
+ * A large tabular numeral over a mono label. Seam-free canvas fill: it drops into
7
+ * the `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
8
+ * NO border and is square-cornered. `surface="ink"` inverts onto the ink role for
9
+ * a dark band; inside a `StatsBand surface="night"` the ancestor `.dark` class
10
+ * flips the default canvas roles, so a plain `StatBlock` reads dark there.
11
+ * `StatBlockFigureAccent` marks the verde substring of a figure (`text-primary`).
12
+ * Token-only; no `dark:` styling.
10
13
  */
11
14
  function StatBlock({ className, surface = "canvas", ...props }) {
12
15
  return (_jsx("div", { "data-slot": "stat-block", "data-surface": surface, className: cn("grid min-h-24 content-center gap-1.5 p-[18px]", surface === "ink" ? "bg-primary" : "bg-card", className), ...props }));
13
16
  }
14
17
  function StatBlockFigure({ className, surface = "canvas", ...props }) {
15
- return (_jsx("div", { "data-slot": "stat-block-figure", className: cn("text-[40px] leading-none font-semibold", surface === "ink" ? "text-primary-foreground" : "text-foreground", className), ...props }));
18
+ return (_jsx("div", { "data-slot": "stat-block-figure", className: cn("text-[clamp(2rem,3.2vw,2.875rem)] leading-none font-bold tabular-nums", surface === "ink" ? "text-primary-foreground" : "text-foreground", className), ...props }));
19
+ }
20
+ function StatBlockFigureAccent({ className, ...props }) {
21
+ return (_jsx("span", { "data-slot": "stat-block-figure-accent", className: cn("text-primary", className), ...props }));
16
22
  }
17
23
  function StatBlockLabel({ className, surface = "canvas", ...props }) {
18
24
  return (_jsx("div", { "data-slot": "stat-block-label", className: cn("font-mono text-xs uppercase", surface === "ink" ? "text-primary-foreground" : "text-muted-foreground", className), ...props }));
19
25
  }
20
- export { StatBlock, StatBlockFigure, StatBlockLabel };
26
+ export { StatBlock, StatBlockFigure, StatBlockFigureAccent, StatBlockLabel };
@@ -0,0 +1,32 @@
1
+ import * as React from "react";
2
+ /**
3
+ * statement — a single left-aligned editorial statement block (V5 B04).
4
+ *
5
+ * An indexed mono eyebrow, one large two-tone headline (a lead clause in the
6
+ * foreground role and a continuation clause dropped to the muted role through the
7
+ * `StatementTail` sub-slot), and a body paragraph. No word-split reveal in this
8
+ * pass — the headline is static structure.
9
+ *
10
+ * Compound, slot-driven: the caller supplies every string, this owns measure,
11
+ * alignment, and the two-tone role split. Token-only; no `dark:` styling.
12
+ */
13
+ declare function Statement({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
14
+ /**
15
+ * StatementEyebrow — mono eyebrow with an optional `[NN]` index chip in the
16
+ * canonical link-deep role (deep verde on light / bright verde on dark). The chip
17
+ * renders only when `index` is set.
18
+ */
19
+ declare function StatementEyebrow({ index, children, className, ...props }: React.ComponentProps<"p"> & {
20
+ index?: React.ReactNode;
21
+ }): React.JSX.Element;
22
+ /**
23
+ * StatementTitle — the large headline. Its lead clause reads in the foreground
24
+ * role; wrap the continuation clause in `StatementTail` to drop it to muted.
25
+ */
26
+ declare function StatementTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
27
+ /** StatementTail — the muted continuation clause inside `StatementTitle` (V5 `.t2`). */
28
+ declare function StatementTail({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
29
+ /** StatementBody — the supporting paragraph under the headline. */
30
+ declare function StatementBody({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
31
+ export { Statement, StatementEyebrow, StatementTitle, StatementTail, StatementBody };
32
+ //# sourceMappingURL=statement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statement.d.ts","sourceRoot":"","sources":["../../src/components/statement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;AAEH,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAkBzD;AAED;;;GAGG;AACH,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ1E;AAED,wFAAwF;AACxF,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ3E;AAED,mEAAmE;AACnE,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQxE;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ /**
4
+ * statement — a single left-aligned editorial statement block (V5 B04).
5
+ *
6
+ * An indexed mono eyebrow, one large two-tone headline (a lead clause in the
7
+ * foreground role and a continuation clause dropped to the muted role through the
8
+ * `StatementTail` sub-slot), and a body paragraph. No word-split reveal in this
9
+ * pass — the headline is static structure.
10
+ *
11
+ * Compound, slot-driven: the caller supplies every string, this owns measure,
12
+ * alignment, and the two-tone role split. Token-only; no `dark:` styling.
13
+ */
14
+ function Statement({ className, ...props }) {
15
+ return (_jsx("div", { "data-slot": "statement", className: cn("grid justify-items-start gap-6 text-left", className), ...props }));
16
+ }
17
+ /**
18
+ * StatementEyebrow — mono eyebrow with an optional `[NN]` index chip in the
19
+ * canonical link-deep role (deep verde on light / bright verde on dark). The chip
20
+ * renders only when `index` is set.
21
+ */
22
+ function StatementEyebrow({ index, children, className, ...props }) {
23
+ return (_jsxs("p", { "data-slot": "statement-eyebrow", className: cn("nc-type-caption-mono flex items-center gap-2 uppercase text-muted-foreground", className), ...props, children: [index != null ? (_jsxs("span", { "data-slot": "statement-eyebrow-index", className: "text-[var(--nc-link-deep)]", children: ["[", index, "]"] })) : null, children] }));
24
+ }
25
+ /**
26
+ * StatementTitle — the large headline. Its lead clause reads in the foreground
27
+ * role; wrap the continuation clause in `StatementTail` to drop it to muted.
28
+ */
29
+ function StatementTitle({ className, ...props }) {
30
+ return (_jsx("h2", { "data-slot": "statement-title", className: cn("nc-type-title-lg max-w-[24ch] text-foreground", className), ...props }));
31
+ }
32
+ /** StatementTail — the muted continuation clause inside `StatementTitle` (V5 `.t2`). */
33
+ function StatementTail({ className, ...props }) {
34
+ return (_jsx("span", { "data-slot": "statement-tail", className: cn("text-muted-foreground", className), ...props }));
35
+ }
36
+ /** StatementBody — the supporting paragraph under the headline. */
37
+ function StatementBody({ className, ...props }) {
38
+ return (_jsx("p", { "data-slot": "statement-body", className: cn("nc-type-body-md max-w-[52ch] text-muted-foreground", className), ...props }));
39
+ }
40
+ export { Statement, StatementEyebrow, StatementTitle, StatementTail, StatementBody };
@@ -8,11 +8,15 @@ import * as React from "react";
8
8
  * square-cornered fill, so no coordinate carries two lines. `surface="ink"` flips
9
9
  * the band onto the ink role; only the seam COLOUR changes (the grid background
10
10
  * mixes toward the surface), never its weight, so the grid keeps sole ownership.
11
- * Token-only; no `dark:` styling.
11
+ *
12
+ * `surface="night"` is the always-dark V5 stats band (B12): rather than a `dark:`
13
+ * utility (forbidden) it sets the `dark` ancestor class on the grid root, so the
14
+ * seam (`bg-border`) and every `StatBlock` role resolve to their dark value while
15
+ * the grid keeps its plain canvas seam. Token-only; no `dark:` styling.
12
16
  */
13
17
  declare function StatsBand({ className, columns, surface, ...props }: React.ComponentProps<"div"> & {
14
18
  columns?: 2 | 3 | 4 | 5 | 6;
15
- surface?: "canvas" | "ink";
19
+ surface?: "canvas" | "ink" | "night";
16
20
  }): React.JSX.Element;
17
21
  export { StatsBand };
18
22
  //# sourceMappingURL=stats-band.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats-band.d.ts","sourceRoot":"","sources":["../../src/components/stats-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B;;;;;;;;;;GAUG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAW,EACX,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC5B,qBAUA;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"stats-band.d.ts","sourceRoot":"","sources":["../../src/components/stats-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B;;;;;;;;;;;;;;GAcG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAW,EACX,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;CACtC,qBAmBA;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -17,11 +17,18 @@ const STATS_BAND_COLUMNS = {
17
17
  * square-cornered fill, so no coordinate carries two lines. `surface="ink"` flips
18
18
  * the band onto the ink role; only the seam COLOUR changes (the grid background
19
19
  * mixes toward the surface), never its weight, so the grid keeps sole ownership.
20
- * Token-only; no `dark:` styling.
20
+ *
21
+ * `surface="night"` is the always-dark V5 stats band (B12): rather than a `dark:`
22
+ * utility (forbidden) it sets the `dark` ancestor class on the grid root, so the
23
+ * seam (`bg-border`) and every `StatBlock` role resolve to their dark value while
24
+ * the grid keeps its plain canvas seam. Token-only; no `dark:` styling.
21
25
  */
22
26
  function StatsBand({ className, columns = 4, surface = "canvas", ...props }) {
27
+ // night carries the plain canvas seam and lets the `dark` root flip its colour;
28
+ // ink/canvas pass straight through to the surface-driven seam colour.
29
+ const seamSurface = surface === "night" ? "canvas" : surface;
23
30
  return (
24
- // single-owner seam: SeamGrid owns every divider; ink flips only its colour.
25
- _jsx(SeamGrid, { "data-slot": "stats-band", surface: surface, className: cn("h-full", STATS_BAND_COLUMNS[columns], className), ...props }));
31
+ // single-owner seam: SeamGrid owns every divider; ink/night flip only colour.
32
+ _jsx(SeamGrid, { "data-slot": "stats-band", "data-surface": surface, surface: seamSurface, className: cn("h-full", surface === "night" && "dark", STATS_BAND_COLUMNS[columns], className), ...props }));
26
33
  }
27
34
  export { StatsBand };
@@ -1,10 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  const TONE_BG = {
4
- good: "bg-(--nc-status-success)",
5
- muted: "bg-(--nc-status-paused)",
6
- warn: "bg-(--nc-status-warning)",
7
- bad: "bg-(--nc-status-error)",
4
+ good: "bg-success",
5
+ muted: "bg-[var(--nc-muted)]",
6
+ warn: "bg-warning",
7
+ bad: "bg-destructive",
8
8
  };
9
9
  function StatusDot({ className, tone, ...props }) {
10
10
  return (_jsx("span", { "aria-hidden": "true", className: cn("inline-block size-1.5 rounded-full", TONE_BG[tone], className), "data-slot": "status-dot", "data-tone": tone, ...props }));
@@ -0,0 +1,34 @@
1
+ import * as React from "react";
2
+ /**
3
+ * steps — the "how it works" station rail (V5 B09).
4
+ *
5
+ * An eyebrow + statement head sits above a STATIC horizontal rail (a single
6
+ * filled foreground rule — the walking-dot progress animation is intentionally
7
+ * out of scope this pass) and a row of numbered stations. Each `Step` carries a
8
+ * square brand marker, a mono index, a title, an optional mono price line, and a
9
+ * body. `StepsBranch` is a dashed-left callout rendered below the station row.
10
+ *
11
+ * This is one of only two surfaces where prices may appear (the pricing section
12
+ * is the other), so the `price` line is a first-class, opt-in slot rather than a
13
+ * generic field. Copy is props-driven: absent parts render nothing.
14
+ *
15
+ * Light-surface composition; it inherits the page theme and sets no dark root.
16
+ * Token-only; no `dark:` styling.
17
+ */
18
+ declare function Steps({ kicker, title, children, className, ...props }: React.ComponentProps<"section"> & {
19
+ kicker?: string;
20
+ title?: string;
21
+ }): React.JSX.Element;
22
+ declare function Step({ index, title, price, body, className, children, ...props }: React.ComponentProps<"div"> & {
23
+ index?: string;
24
+ title?: string;
25
+ price?: string;
26
+ body?: React.ReactNode;
27
+ }): React.JSX.Element;
28
+ declare function StepsBranch({ label, title, body, className, children, ...props }: React.ComponentProps<"aside"> & {
29
+ label?: string;
30
+ title?: string;
31
+ body?: React.ReactNode;
32
+ }): React.JSX.Element;
33
+ export { Steps, Step, StepsBranch };
34
+ //# sourceMappingURL=steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/components/steps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;GAeG;AAEH,iBAAS,KAAK,CAAC,EACb,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,qBAsCA;AAED,iBAAS,IAAI,CAAC,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBAqCA;AAED,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBA+BA;AAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../lib/utils.js";
4
+ import { SectionIntro, SectionIntroKicker, SectionIntroTitle } from "./section-intro.js";
5
+ /**
6
+ * steps — the "how it works" station rail (V5 B09).
7
+ *
8
+ * An eyebrow + statement head sits above a STATIC horizontal rail (a single
9
+ * filled foreground rule — the walking-dot progress animation is intentionally
10
+ * out of scope this pass) and a row of numbered stations. Each `Step` carries a
11
+ * square brand marker, a mono index, a title, an optional mono price line, and a
12
+ * body. `StepsBranch` is a dashed-left callout rendered below the station row.
13
+ *
14
+ * This is one of only two surfaces where prices may appear (the pricing section
15
+ * is the other), so the `price` line is a first-class, opt-in slot rather than a
16
+ * generic field. Copy is props-driven: absent parts render nothing.
17
+ *
18
+ * Light-surface composition; it inherits the page theme and sets no dark root.
19
+ * Token-only; no `dark:` styling.
20
+ */
21
+ function Steps({ kicker, title, children, className, ...props }) {
22
+ const stations = [];
23
+ const branches = [];
24
+ React.Children.forEach(children, (child) => {
25
+ if (React.isValidElement(child) && child.type === StepsBranch) {
26
+ branches.push(child);
27
+ }
28
+ else {
29
+ stations.push(child);
30
+ }
31
+ });
32
+ return (_jsxs("section", { "data-slot": "steps", className: cn("grid gap-8", className), ...props, children: [kicker || title ? (_jsxs(SectionIntro, { align: "start", className: "min-h-0 bg-transparent p-0", children: [kicker ? _jsx(SectionIntroKicker, { children: kicker }) : null, title ? (_jsx(SectionIntroTitle, { className: "mx-0 max-w-[28ch] text-balance text-left", children: title })) : null] })) : null, _jsx("div", { "data-slot": "steps-rail", "aria-hidden": "true", className: "h-px w-full bg-foreground" }), _jsx("div", { "data-slot": "steps-stations", className: "grid grid-cols-1 gap-10 sm:grid-cols-2 md:grid-cols-4", children: stations }), branches.length > 0 ? branches : null] }));
33
+ }
34
+ function Step({ index, title, price, body, className, children, ...props }) {
35
+ return (_jsxs("div", { "data-slot": "step", className: cn("flex flex-col gap-3", className), ...props, children: [_jsx("span", { "data-slot": "step-marker", "aria-hidden": "true", className: "size-2 rounded-[1px] bg-primary" }), index ? (_jsx("span", { "data-slot": "step-index", className: "font-mono text-[10px] tracking-[0.14em] text-muted-foreground uppercase", children: index })) : null, title ? (_jsx("h3", { "data-slot": "step-title", className: "nc-type-body-md-strong text-foreground", children: title })) : null, price ? (_jsx("span", { "data-slot": "step-price", className: "font-mono text-xs font-semibold tracking-[0.04em] text-[var(--nc-link-deep)] uppercase", children: price })) : null, body ? (_jsx("p", { "data-slot": "step-body", className: "nc-type-body-sm max-w-[30ch] text-muted-foreground", children: body })) : null, children] }));
36
+ }
37
+ function StepsBranch({ label, title, body, className, children, ...props }) {
38
+ return (_jsxs("aside", { "data-slot": "steps-branch", className: cn("flex flex-col gap-3 border-l border-dashed border-border pl-6", className), ...props, children: [label ? (_jsx("span", { "data-slot": "steps-branch-label", className: "font-mono text-[10px] tracking-[0.14em] text-[var(--nc-link-deep)] uppercase", children: label })) : null, title ? (_jsx("h3", { "data-slot": "steps-branch-title", className: "nc-type-body-md-strong text-foreground", children: title })) : null, body ? (_jsx("p", { "data-slot": "steps-branch-body", className: "nc-type-body-sm max-w-[52ch] text-muted-foreground", children: body })) : null, children] }));
39
+ }
40
+ export { Steps, Step, StepsBranch };