@nadicodeai/ui 0.2.0 → 0.3.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 (72) hide show
  1. package/AGENTS.md +2 -0
  2. package/README.md +29 -0
  3. package/dist/components/action-band.d.ts.map +1 -1
  4. package/dist/components/action-band.js +2 -1
  5. package/dist/components/agent-message.d.ts +2 -1
  6. package/dist/components/agent-message.d.ts.map +1 -1
  7. package/dist/components/agent-message.js +14 -21
  8. package/dist/components/agent-thread.d.ts.map +1 -1
  9. package/dist/components/agent-thread.js +3 -10
  10. package/dist/components/ai-elements/open-in-chat.d.ts.map +1 -1
  11. package/dist/components/ai-elements/open-in-chat.js +7 -18
  12. package/dist/components/alert-dialog.js +1 -1
  13. package/dist/components/alert.js +1 -1
  14. package/dist/components/automation-section.d.ts.map +1 -1
  15. package/dist/components/automation-section.js +38 -43
  16. package/dist/components/benefits-bento.js +1 -1
  17. package/dist/components/bento.d.ts +2 -2
  18. package/dist/components/bento.d.ts.map +1 -1
  19. package/dist/components/bento.js +4 -3
  20. package/dist/components/button.js +5 -5
  21. package/dist/components/card.js +1 -1
  22. package/dist/components/demo-surface.d.ts +10 -2
  23. package/dist/components/demo-surface.d.ts.map +1 -1
  24. package/dist/components/demo-surface.js +9 -2
  25. package/dist/components/dialog.js +1 -1
  26. package/dist/components/faq.d.ts +6 -5
  27. package/dist/components/faq.d.ts.map +1 -1
  28. package/dist/components/faq.js +8 -6
  29. package/dist/components/files-preview.d.ts.map +1 -1
  30. package/dist/components/files-preview.js +8 -17
  31. package/dist/components/hero-split.d.ts.map +1 -1
  32. package/dist/components/hero-split.js +3 -2
  33. package/dist/components/input.js +1 -1
  34. package/dist/components/installer-shell.d.ts.map +1 -1
  35. package/dist/components/installer-shell.js +9 -12
  36. package/dist/components/logo-band.d.ts.map +1 -1
  37. package/dist/components/logo-band.js +2 -3
  38. package/dist/components/pricing.d.ts.map +1 -1
  39. package/dist/components/pricing.js +5 -3
  40. package/dist/components/seam-grid.d.ts +30 -0
  41. package/dist/components/seam-grid.d.ts.map +1 -0
  42. package/dist/components/seam-grid.js +30 -0
  43. package/dist/components/section-intro.js +1 -1
  44. package/dist/components/select.js +1 -1
  45. package/dist/components/shift-band.d.ts.map +1 -1
  46. package/dist/components/shift-band.js +2 -1
  47. package/dist/components/state-notice.d.ts +13 -0
  48. package/dist/components/state-notice.d.ts.map +1 -0
  49. package/dist/components/state-notice.js +8 -0
  50. package/dist/components/stats-band.d.ts.map +1 -1
  51. package/dist/components/stats-band.js +4 -5
  52. package/dist/components/testimonials.d.ts.map +1 -1
  53. package/dist/components/testimonials.js +3 -4
  54. package/dist/components/textarea.js +1 -1
  55. package/dist/components/use-case-bento.d.ts +4 -2
  56. package/dist/components/use-case-bento.d.ts.map +1 -1
  57. package/dist/components/use-case-bento.js +3 -3
  58. package/dist/components/watch-it-work-band.d.ts +3 -2
  59. package/dist/components/watch-it-work-band.d.ts.map +1 -1
  60. package/dist/components/watch-it-work-band.js +4 -4
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +2 -0
  64. package/dist/lib/agent-work-state.d.ts +36 -0
  65. package/dist/lib/agent-work-state.d.ts.map +1 -0
  66. package/dist/lib/agent-work-state.js +36 -0
  67. package/dist/lib/seam.d.ts +29 -0
  68. package/dist/lib/seam.d.ts.map +1 -0
  69. package/dist/lib/seam.js +30 -0
  70. package/dist/styles/globals.css +46 -36
  71. package/docs/agents/nadicodeai-ui.md +22 -0
  72. package/package.json +3 -1
@@ -1,14 +1,21 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ const defaultDemoSurfaceLabels = {
4
+ approvalLabel: "Human approval",
5
+ approveAction: "Approve",
6
+ editAction: "Edit",
7
+ liveDemoLabel: "live demo",
8
+ };
3
9
  function delayStep(index) {
4
10
  return {
5
11
  "--nc-anim-delay": `calc(var(--nc-duration-stagger) * ${index})`,
6
12
  };
7
13
  }
8
- function DemoSurface({ script, title = "Nadia", className, children, autoplay = true, ...props }) {
14
+ function DemoSurface({ script, title = "Nadia", className, children, autoplay = true, labels, ...props }) {
9
15
  if (!script) {
10
16
  return (_jsx("div", { "data-slot": "demo-surface", className: cn("grid min-h-0 bg-card", className), ...props, children: children }));
11
17
  }
12
- return (_jsxs("div", { "data-slot": "demo-surface", className: cn("nc-chat-thread h-[var(--nc-h-bento-mobile-main)] min-h-0 lg:h-full", className), "data-nc-autoplay": autoplay ? "" : undefined, "data-nc-autoplay-name": title, ...props, children: [_jsxs("div", { className: "nc-chat-thread-header", children: [_jsx("span", { className: "nc-agent-avatar", "data-accent": script.accent, "aria-hidden": "true", children: "NA" }), _jsxs("div", { className: "nc-chat-thread-identity", children: [_jsx("div", { className: "nc-chat-thread-domain", children: script.domain }), _jsxs("div", { className: "nc-chat-thread-name", children: [_jsx("span", { children: title }), _jsxs("span", { className: "nc-chat-thread-role", children: ["/ ", script.role] })] })] }), _jsx("span", { className: "nc-chat-thread-workflow", children: script.workflow })] }), _jsxs("div", { className: "nc-chat-thread-body", children: [_jsx("div", { className: "nc-chat-bubble-user nc-anim-msg-in", style: delayStep(0), children: script.user }), _jsx("div", { className: "nc-chat-bubble-agent nc-anim-msg-in", "data-accent": script.accent, style: delayStep(1), children: script.agent }), script.traces.map((trace, index) => (_jsx("div", { className: "nc-tool-call-trace nc-anim-msg-in", style: delayStep(index + 2), children: trace }, trace))), _jsxs("div", { className: "nc-artifact-preview nc-anim-msg-in", "data-kind": script.artifactKind, style: delayStep(5), children: [_jsxs("div", { className: "nc-artifact-preview-header", children: [_jsx("span", { className: "nc-artifact-preview-title", children: script.artifactTitle }), _jsx("span", { className: "nc-artifact-preview-kind", children: script.artifactKind })] }), _jsx("div", { className: "nc-artifact-preview-body", children: script.artifactBody })] }), _jsxs("div", { className: "nc-approval-gate nc-anim-msg-in", style: delayStep(6), children: [_jsx("span", { className: "nc-approval-gate-label", children: "Human approval" }), _jsx("span", { className: "nc-approval-gate-title", children: script.approvalTitle }), _jsx("span", { className: "nc-approval-gate-copy", children: script.approvalCopy }), _jsxs("span", { className: "nc-approval-gate-actions", children: [_jsx("button", { type: "button", children: "Approve" }), _jsx("button", { type: "button", "data-variant": "secondary", children: "Edit" })] })] })] }), _jsx("div", { className: "nc-chat-thread-footer", children: _jsxs("div", { className: "nc-usage-meter", children: [_jsxs("div", { className: "nc-usage-meter-meta", children: [_jsx("span", { children: script.role }), _jsx("span", { className: "nc-usage-meter-sep", children: "/" }), _jsx("span", { children: script.steps }), _jsx("span", { className: "nc-usage-meter-spacer" }), _jsx("span", { children: "live demo" })] }), _jsx("div", { className: "nc-usage-meter-track", children: _jsx("div", { className: "nc-usage-meter-fill", style: { "--nc-usage": script.usage } }) })] }) })] }));
18
+ const demoLabels = { ...defaultDemoSurfaceLabels, ...labels };
19
+ return (_jsxs("div", { "data-slot": "demo-surface", className: cn("nc-chat-thread h-[var(--nc-h-bento-mobile-main)] min-h-0 lg:h-full", className), "data-nc-autoplay": autoplay ? "" : undefined, "data-nc-autoplay-name": title, ...props, children: [_jsxs("div", { className: "nc-chat-thread-header", children: [_jsx("span", { className: "nc-agent-avatar", "data-accent": script.accent, "aria-hidden": "true", children: "NA" }), _jsxs("div", { className: "nc-chat-thread-identity", children: [_jsx("div", { className: "nc-chat-thread-domain", children: script.domain }), _jsxs("div", { className: "nc-chat-thread-name", children: [_jsx("span", { children: title }), _jsxs("span", { className: "nc-chat-thread-role", children: ["/ ", script.role] })] })] }), _jsx("span", { className: "nc-chat-thread-workflow", children: script.workflow })] }), _jsxs("div", { className: "nc-chat-thread-body", children: [_jsx("div", { className: "nc-chat-bubble-user nc-anim-msg-in", style: delayStep(0), children: script.user }), _jsx("div", { className: "nc-chat-bubble-agent nc-anim-msg-in", "data-accent": script.accent, style: delayStep(1), children: script.agent }), script.traces.map((trace, index) => (_jsx("div", { className: "nc-tool-call-trace nc-anim-msg-in", style: delayStep(index + 2), children: trace }, trace))), _jsxs("div", { className: "nc-artifact-preview nc-anim-msg-in", "data-kind": script.artifactKind, style: delayStep(5), children: [_jsxs("div", { className: "nc-artifact-preview-header", children: [_jsx("span", { className: "nc-artifact-preview-title", children: script.artifactTitle }), _jsx("span", { className: "nc-artifact-preview-kind", children: script.artifactKindLabel ?? script.artifactKind })] }), _jsx("div", { className: "nc-artifact-preview-body", children: script.artifactBody })] }), _jsxs("div", { className: "nc-approval-gate nc-anim-msg-in", style: delayStep(6), children: [_jsx("span", { className: "nc-approval-gate-label", children: demoLabels.approvalLabel }), _jsx("span", { className: "nc-approval-gate-title", children: script.approvalTitle }), _jsx("span", { className: "nc-approval-gate-copy", children: script.approvalCopy }), _jsxs("span", { className: "nc-approval-gate-actions", children: [_jsx("button", { type: "button", children: demoLabels.approveAction }), _jsx("button", { type: "button", "data-variant": "secondary", children: demoLabels.editAction })] })] })] }), _jsx("div", { className: "nc-chat-thread-footer", children: _jsxs("div", { className: "nc-usage-meter", children: [_jsxs("div", { className: "nc-usage-meter-meta", children: [_jsx("span", { children: script.role }), _jsx("span", { className: "nc-usage-meter-sep", children: "/" }), _jsx("span", { children: script.steps }), _jsx("span", { className: "nc-usage-meter-spacer" }), _jsx("span", { children: demoLabels.liveDemoLabel })] }), _jsx("div", { className: "nc-usage-meter-track", children: _jsx("div", { className: "nc-usage-meter-fill", style: { "--nc-usage": script.usage } }) })] }) })] }));
13
20
  }
14
21
  export { DemoSurface };
@@ -20,7 +20,7 @@ function DialogOverlay({ className, ...props }) {
20
20
  return (_jsx(DialogPrimitive.Overlay, { "data-slot": "dialog-overlay", className: cn("fixed inset-0 z-50 bg-foreground/50 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0", className), ...props }));
21
21
  }
22
22
  function DialogContent({ className, children, showCloseButton = true, ...props }) {
23
- return (_jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { "data-slot": "dialog-content", className: cn("fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg", className), ...props, children: [children, showCloseButton && (_jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: "Close" })] }))] })] }));
23
+ return (_jsxs(DialogPortal, { "data-slot": "dialog-portal", children: [_jsx(DialogOverlay, {}), _jsxs(DialogPrimitive.Content, { "data-slot": "dialog-content", className: cn("fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-md border bg-background p-6 shadow-lg duration-200 outline-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 sm:max-w-lg", className), ...props, children: [children, showCloseButton && (_jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", className: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: "Close" })] }))] })] }));
24
24
  }
25
25
  function DialogHeader({ className, ...props }) {
26
26
  return (_jsx("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2 text-center sm:text-left", className), ...props }));
@@ -3,11 +3,12 @@ import * as React from "react";
3
3
  * faq — single-column question/answer accordion (replaces the retired
4
4
  * `sections/faq.css` + its coupled `faq-item` rows).
5
5
  *
6
- * SINGLE-OWNER SEAM: a single-track gap-as-seam grid (`gap-px bg-border`) owns
7
- * every divider BETWEEN items. Each `FaqItem` is a borderless fill that repairs no
8
- * inter-item seam; the only hairline an item owns is its internal summary/answer
9
- * rule (drawn by `FaqItem`, not here). A faq is one column at every breakpoint —
10
- * no column count, no dark inversion (matching the retired section's variants:none).
6
+ * SINGLE-OWNER SEAM: a single-track gap-as-seam grid (`gap-px bg-border`, owned
7
+ * by `SeamGrid` with no `surface`) owns every divider BETWEEN items. Each
8
+ * `FaqItem` is a borderless fill that repairs no inter-item seam; the only
9
+ * hairline an item owns is its internal summary/answer rule (drawn by `FaqItem`,
10
+ * not here). A faq is one column at every breakpoint no column count, no dark
11
+ * inversion (matching the retired section's variants:none).
11
12
  *
12
13
  * Token-only; no `dark:` styling.
13
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../src/components/faq.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;GAWG;AAEH,iBAAS,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQhE;AAED,OAAO,EAAE,GAAG,EAAE,CAAA"}
1
+ {"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../src/components/faq.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;;;GAYG;AAEH,iBAAS,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQhE;AAED,OAAO,EAAE,GAAG,EAAE,CAAA"}
@@ -1,18 +1,20 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
3
4
  /**
4
5
  * faq — single-column question/answer accordion (replaces the retired
5
6
  * `sections/faq.css` + its coupled `faq-item` rows).
6
7
  *
7
- * SINGLE-OWNER SEAM: a single-track gap-as-seam grid (`gap-px bg-border`) owns
8
- * every divider BETWEEN items. Each `FaqItem` is a borderless fill that repairs no
9
- * inter-item seam; the only hairline an item owns is its internal summary/answer
10
- * rule (drawn by `FaqItem`, not here). A faq is one column at every breakpoint —
11
- * no column count, no dark inversion (matching the retired section's variants:none).
8
+ * SINGLE-OWNER SEAM: a single-track gap-as-seam grid (`gap-px bg-border`, owned
9
+ * by `SeamGrid` with no `surface`) owns every divider BETWEEN items. Each
10
+ * `FaqItem` is a borderless fill that repairs no inter-item seam; the only
11
+ * hairline an item owns is its internal summary/answer rule (drawn by `FaqItem`,
12
+ * not here). A faq is one column at every breakpoint no column count, no dark
13
+ * inversion (matching the retired section's variants:none).
12
14
  *
13
15
  * Token-only; no `dark:` styling.
14
16
  */
15
17
  function Faq({ className, ...props }) {
16
- return (_jsx("div", { "data-slot": "faq", className: cn("grid h-full grid-cols-1 gap-px bg-border", className), ...props }));
18
+ return (_jsx(SeamGrid, { "data-slot": "faq", className: cn("h-full grid-cols-1", className), ...props }));
17
19
  }
18
20
  export { Faq };
@@ -1 +1 @@
1
- {"version":3,"file":"files-preview.d.ts","sourceRoot":"","sources":["../../src/components/files-preview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAE5C,OAAO,EACL,QAAQ,EAGT,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAA;AAKpC,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,CAAA;AAEb,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAA;AAqFD,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,YAAY,EACZ,oBAAyB,EACzB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC,GAAG;IACjH,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACjD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;CAC7C,qBAuCA;AA8CD,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,qBAgDA;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"files-preview.d.ts","sourceRoot":"","sources":["../../src/components/files-preview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAA;AAE5C,OAAO,EACL,QAAQ,EAGT,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,6BAA6B,CAAA;AAKpC,MAAM,MAAM,eAAe,GACvB,WAAW,GACX,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,SAAS,CAAA;AAEb,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,MAAM,CAAC,EAAE,eAAe,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,kBAAkB,CAAA;IAC9B,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAA;CAC3B,CAAA;AA2ED,iBAAS,eAAe,CAAC,EACvB,KAAK,EACL,YAAY,EACZ,oBAAyB,EACzB,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,EAAE,iBAAiB,GAAG,UAAU,GAAG,kBAAkB,GAAG,UAAU,CAAC,GAAG;IACjH,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IACjD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;CAC7C,qBAuCA;AA8CD,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,SAAS,EACT,aAAa,EACb,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IAC5C,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAChC,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,qBAgDA;AAED,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,CAAA"}
@@ -9,21 +9,12 @@ import { Badge } from "./badge.js";
9
9
  import { FeedbackState } from "./feedback-state.js";
10
10
  import { cn } from "../lib/utils.js";
11
11
  const defaultCodeLanguage = "plaintext";
12
- const fileStatusLabels = {
13
- added: "Added",
14
- blocked: "Blocked",
15
- deleted: "Deleted",
16
- modified: "Modified",
17
- running: "Running",
18
- unchanged: "Unchanged",
19
- };
20
- const fileStatusIcons = {
21
- added: CircleCheckIcon,
22
- blocked: CircleAlertIcon,
23
- deleted: CircleDashedIcon,
24
- modified: CircleDotIcon,
25
- running: CircleDotIcon,
26
- unchanged: CircleDashedIcon,
12
+ const fileStatusMeta = {
13
+ added: { label: "Added", icon: _jsx(CircleCheckIcon, { className: "size-3" }) },
14
+ blocked: { label: "Blocked", icon: _jsx(CircleAlertIcon, { className: "size-3" }) },
15
+ deleted: { label: "Deleted", icon: _jsx(CircleDashedIcon, { className: "size-3" }) },
16
+ modified: { label: "Modified", icon: _jsx(CircleDotIcon, { className: "size-3" }) },
17
+ running: { label: "Running", icon: _jsx(CircleDotIcon, { className: "size-3" }) },
27
18
  };
28
19
  function collectNodes(nodes, map = new Map()) {
29
20
  for (const node of nodes) {
@@ -50,8 +41,8 @@ function FileStatusBadge({ status }) {
50
41
  if (!status || status === "unchanged") {
51
42
  return null;
52
43
  }
53
- const Icon = fileStatusIcons[status];
54
- return (_jsxs(Badge, { "data-slot": "file-status-badge", variant: "outline", className: "gap-1", children: [_jsx(Icon, { className: "size-3" }), fileStatusLabels[status]] }));
44
+ const { icon, label } = fileStatusMeta[status];
45
+ return (_jsxs(Badge, { "data-slot": "file-status-badge", variant: "outline", className: "gap-1", children: [icon, label] }));
55
46
  }
56
47
  function renderFileNode(node) {
57
48
  if (node.type === "directory") {
@@ -1 +1 @@
1
- {"version":3,"file":"hero-split.d.ts","sourceRoot":"","sources":["../../src/components/hero-split.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYtE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAa5E;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"hero-split.d.ts","sourceRoot":"","sources":["../../src/components/hero-split.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYtE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAa5E;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
3
4
  /**
4
5
  * hero-split — the page-opening hero (replaces the retired `sections/hero-split.css`).
5
6
  *
@@ -18,9 +19,9 @@ import { cn } from "../lib/utils.js";
18
19
  * is the hero's surface, not a padded stamp. Token-only; no `dark:` styling.
19
20
  */
20
21
  function HeroSplit({ className, ...props }) {
21
- return (_jsx("div", { "data-slot": "hero-split", className: cn(
22
+ return (_jsx(SeamGrid, { "data-slot": "hero-split", className: cn(
22
23
  // The panel owns internal seams only; the page/frame/hatch rail owns the perimeter.
23
- "grid min-h-[inherit] min-w-0 grid-cols-1 gap-px bg-border sm:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]", className), ...props }));
24
+ "min-h-[inherit] min-w-0 grid-cols-1 sm:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]", className), ...props }));
24
25
  }
25
26
  function HeroSplitCopy({ className, ...props }) {
26
27
  return (_jsx("div", { "data-slot": "hero-split-copy", className: cn("grid min-w-0 content-center gap-4 overflow-hidden bg-card p-[clamp(24px,4vw,56px)]", className), ...props }));
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  function Input({ className, type, ...props }) {
4
- return (_jsx("input", { type: type, "data-slot": "input", className: cn("h-9 w-full min-w-0 rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20", className), ...props }));
4
+ return (_jsx("input", { type: type, "data-slot": "input", className: cn("h-9 w-full min-w-0 rounded-sm border border-input bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-primary selection:text-primary-foreground file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm", "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50", "aria-invalid:border-destructive aria-invalid:ring-destructive/20", className), ...props }));
5
5
  }
6
6
  export { Input };
@@ -1 +1 @@
1
- {"version":3,"file":"installer-shell.d.ts","sourceRoot":"","sources":["../../src/components/installer-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAkB9B,KAAK,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;AACzE,KAAK,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAEvE,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC7B,CAAA;AAED,KAAK,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC1E,KAAK,EAAE,mBAAmB,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAyED,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,aAAoC,EACpC,SAAS,EACT,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,mBAAmB,qBA2DrB;AAED,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"installer-shell.d.ts","sourceRoot":"","sources":["../../src/components/installer-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAkB9B,KAAK,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAA;AACzE,KAAK,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAEvE,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,MAAM,CAAC,EAAE,mBAAmB,CAAA;CAC7B,CAAA;AAED,KAAK,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC1E,KAAK,EAAE,mBAAmB,CAAA;IAC1B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B,CAAA;AAwED,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,aAAoC,EACpC,SAAS,EACT,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,mBAAmB,qBA2DrB;AAED,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAA"}
@@ -5,17 +5,14 @@ import { cn } from "../lib/utils.js";
5
5
  import { Card, CardContent, CardHeader, } from "./card.js";
6
6
  import { FeedbackState } from "./feedback-state.js";
7
7
  import { Progress } from "./progress.js";
8
- const installerFeedbackStatus = {
9
- welcome: "empty",
10
- progress: "loading",
11
- success: "empty",
12
- failure: "error",
13
- };
14
- const installerIcons = {
15
- welcome: _jsx(SparklesIcon, { className: "size-5" }),
16
- progress: _jsx(LoaderCircleIcon, { className: "size-5 animate-spin" }),
17
- success: _jsx(CheckCircleIcon, { className: "size-5" }),
18
- failure: _jsx(XCircleIcon, { className: "size-5" }),
8
+ const installerStateMeta = {
9
+ welcome: { status: "empty", icon: _jsx(SparklesIcon, { className: "size-5" }) },
10
+ progress: {
11
+ status: "loading",
12
+ icon: _jsx(LoaderCircleIcon, { className: "size-5 animate-spin" }),
13
+ },
14
+ success: { status: "empty", icon: _jsx(CheckCircleIcon, { className: "size-5" }) },
15
+ failure: { status: "error", icon: _jsx(XCircleIcon, { className: "size-5" }) },
19
16
  };
20
17
  const installerStepIcons = {
21
18
  pending: _jsx(CircleIcon, { className: "size-4" }),
@@ -31,6 +28,6 @@ function InstallerShellStepList({ steps, }) {
31
28
  }
32
29
  function InstallerShell({ state, title, description, progressValue, steps, actions, aside, children, progressLabel = "Installer progress", className, contentClassName, ...props }) {
33
30
  const showProgress = state === "progress" && typeof progressValue === "number";
34
- return (_jsx("section", { "data-slot": "installer-shell", "data-state": state, className: cn("grid min-h-svh place-items-center bg-background p-4 text-foreground md:p-6", className), ...props, children: _jsxs(Card, { className: "w-full max-w-3xl overflow-hidden", children: [_jsx(CardHeader, { children: _jsx(FeedbackState, { "data-slot": "installer-shell-feedback", status: installerFeedbackStatus[state], title: title, description: description, icon: installerIcons[state], actions: actions, compact: true, className: "rounded-none border-0 bg-transparent p-0 md:p-0" }) }), _jsxs(CardContent, { "data-slot": "installer-shell-content", className: cn("grid gap-5", contentClassName), children: [showProgress && (_jsxs("div", { "data-slot": "installer-shell-progress", className: "grid gap-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { className: "font-medium", children: progressLabel }), _jsxs("span", { className: "text-muted-foreground", children: [Math.round(progressValue), "%"] })] }), _jsx(Progress, { value: progressValue, "aria-label": progressLabel })] })), steps?.length ? _jsx(InstallerShellStepList, { steps: steps }) : null, children && (_jsx("div", { "data-slot": "installer-shell-primary", className: "min-w-0", children: children })), aside && (_jsx("div", { "data-slot": "installer-shell-aside", className: "rounded-md border bg-muted/30 p-4 text-sm text-muted-foreground", children: aside }))] })] }) }));
31
+ return (_jsx("section", { "data-slot": "installer-shell", "data-state": state, className: cn("grid min-h-svh place-items-center bg-background p-4 text-foreground md:p-6", className), ...props, children: _jsxs(Card, { className: "w-full max-w-3xl overflow-hidden", children: [_jsx(CardHeader, { children: _jsx(FeedbackState, { "data-slot": "installer-shell-feedback", status: installerStateMeta[state].status, title: title, description: description, icon: installerStateMeta[state].icon, actions: actions, compact: true, className: "rounded-none border-0 bg-transparent p-0 md:p-0" }) }), _jsxs(CardContent, { "data-slot": "installer-shell-content", className: cn("grid gap-5", contentClassName), children: [showProgress && (_jsxs("div", { "data-slot": "installer-shell-progress", className: "grid gap-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 text-sm", children: [_jsx("span", { className: "font-medium", children: progressLabel }), _jsxs("span", { className: "text-muted-foreground", children: [Math.round(progressValue), "%"] })] }), _jsx(Progress, { value: progressValue, "aria-label": progressLabel })] })), steps?.length ? _jsx(InstallerShellStepList, { steps: steps }) : null, children && (_jsx("div", { "data-slot": "installer-shell-primary", className: "min-w-0", children: children })), aside && (_jsx("div", { "data-slot": "installer-shell-aside", className: "rounded-md border bg-muted/30 p-4 text-sm text-muted-foreground", children: aside }))] })] }) }));
35
32
  }
36
33
  export { InstallerShell };
@@ -1 +1 @@
1
- {"version":3,"file":"logo-band.d.ts","sourceRoot":"","sources":["../../src/components/logo-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,QAAQ,CAAC,EAChB,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,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBAqBA;AAED,iBAAS,QAAQ,CAAC,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvC;AAED,iBAAS,gBAAgB,CAAC,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvC;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"logo-band.d.ts","sourceRoot":"","sources":["../../src/components/logo-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,QAAQ,CAAC,EAChB,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,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBAmBA;AAED,iBAAS,QAAQ,CAAC,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvC;AAED,iBAAS,gBAAgB,CAAC,EACxB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEvC;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { seamSurfaceClass } from "../lib/seam.js";
3
4
  /**
4
5
  * logo-band / integrations-grid — wall of monochrome marks (replaces the retired
5
6
  * `sections/logo-band.css` + `sections/integrations-grid.css` + their coupled
@@ -22,9 +23,7 @@ function LogoGrid({ className, columns = 4, surface = "canvas", ...props }) {
22
23
  5: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
23
24
  6: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",
24
25
  };
25
- return (_jsx("div", { className: cn("grid h-full gap-px", cols[columns], surface === "ink"
26
- ? "bg-[color-mix(in_srgb,var(--nc-line)_40%,var(--nc-ink))]"
27
- : "bg-border", className), ...props }));
26
+ return (_jsx("div", { className: cn("grid h-full gap-px", cols[columns], seamSurfaceClass(surface), className), ...props }));
28
27
  }
29
28
  function LogoBand({ ...props }) {
30
29
  return _jsx(LogoGrid, { "data-slot": "logo-band", ...props });
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,KAAK,eAAe,GAAG,MAAM,GAAG,UAAU,CAAA;AAE1C,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,CAAA;IACf,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,qBA0CA;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,KAAK,eAAe,GAAG,MAAM,GAAG,UAAU,CAAA;AAE1C,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,CAAA;IACf,QAAQ,CAAC,EAAE,eAAe,CAAA;CAC3B,qBA2CA;AAED,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -1,10 +1,12 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { cn } from "../lib/utils.js";
4
+ import { SeamGrid } from "./seam-grid.js";
4
5
  function Pricing({ className, columns = 3, emphasis = "none", children, ...props }) {
5
- return (_jsx("div", { "data-slot": "pricing", "data-emphasis": emphasis, className: cn(
6
- // gap-as-seam: the grid is the single owner of every divider between tiers.
7
- "grid h-full gap-px bg-border", columns === 2
6
+ return (_jsx(SeamGrid, { "data-slot": "pricing", "data-emphasis": emphasis, className: cn(
7
+ // 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
8
10
  ? "grid-cols-1 sm:grid-cols-2"
9
11
  : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
10
12
  // the featured card is the rail's positioning context and gets the rail span.
@@ -0,0 +1,30 @@
1
+ import * as React from "react";
2
+ import { type SeamSurface } from "../lib/seam";
3
+ /**
4
+ * SeamGrid is the single owner of the "gap-as-seam" grid mechanics shared by the
5
+ * bordered section grids (stats-band, testimonials, logo-band, and their siblings).
6
+ *
7
+ * SINGLE-OWNER SEAM: a `grid` with `gap-px` lets the panel paint one hairline at
8
+ * every cell boundary while borderless, square-cornered cells fill on top, so no
9
+ * coordinate ever carries two lines. The seam COLOUR is the only thing that flips
10
+ * with `surface`, and that colour comes from `seamSurfaceClass` in the internal
11
+ * `lib/seam` module, the one place the ink `color-mix(...)` string lives.
12
+ *
13
+ * `surface` is OPTIONAL. Pass `"canvas"` or `"ink"` (as the bordered proof bands
14
+ * do) to mark the grid with `data-surface` and pick the seam colour. Omit it for
15
+ * the plain canvas seam (`bg-border`) with NO `data-surface` marker, exactly the
16
+ * single-owner `gap-px bg-border` grid the canvas-only section grids render
17
+ * (faq, pricing, hero-split, bento, shift-band, action-band content, watch-it-work).
18
+ * Token-only; no `dark:` styling. Callers keep their own column maps, heights,
19
+ * `data-slot`, and extra classes by passing `className` and spreading props.
20
+ *
21
+ * This is a supported low-level layout primitive. The seam class helper stays
22
+ * module-private (`lib/seam`, no public subpath export); consumers reach for
23
+ * `SeamGrid` and its `surface` prop rather than the raw arbitrary Tailwind class
24
+ * string.
25
+ */
26
+ declare function SeamGrid({ surface, className, ...props }: React.ComponentProps<"div"> & {
27
+ surface?: SeamSurface;
28
+ }): React.JSX.Element;
29
+ export { SeamGrid };
30
+ //# sourceMappingURL=seam-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seam-grid.d.ts","sourceRoot":"","sources":["../../src/components/seam-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAA;AAE/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,iBAAS,QAAQ,CAAC,EAChB,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,WAAW,CAAA;CAAE,qBAUzD;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ import { seamSurfaceClass } from "../lib/seam.js";
4
+ /**
5
+ * SeamGrid is the single owner of the "gap-as-seam" grid mechanics shared by the
6
+ * bordered section grids (stats-band, testimonials, logo-band, and their siblings).
7
+ *
8
+ * SINGLE-OWNER SEAM: a `grid` with `gap-px` lets the panel paint one hairline at
9
+ * every cell boundary while borderless, square-cornered cells fill on top, so no
10
+ * coordinate ever carries two lines. The seam COLOUR is the only thing that flips
11
+ * with `surface`, and that colour comes from `seamSurfaceClass` in the internal
12
+ * `lib/seam` module, the one place the ink `color-mix(...)` string lives.
13
+ *
14
+ * `surface` is OPTIONAL. Pass `"canvas"` or `"ink"` (as the bordered proof bands
15
+ * do) to mark the grid with `data-surface` and pick the seam colour. Omit it for
16
+ * the plain canvas seam (`bg-border`) with NO `data-surface` marker, exactly the
17
+ * single-owner `gap-px bg-border` grid the canvas-only section grids render
18
+ * (faq, pricing, hero-split, bento, shift-band, action-band content, watch-it-work).
19
+ * Token-only; no `dark:` styling. Callers keep their own column maps, heights,
20
+ * `data-slot`, and extra classes by passing `className` and spreading props.
21
+ *
22
+ * This is a supported low-level layout primitive. The seam class helper stays
23
+ * module-private (`lib/seam`, no public subpath export); consumers reach for
24
+ * `SeamGrid` and its `surface` prop rather than the raw arbitrary Tailwind class
25
+ * string.
26
+ */
27
+ function SeamGrid({ surface, className, ...props }) {
28
+ return (_jsx("div", { "data-surface": surface, className: cn("grid gap-px", seamSurfaceClass(surface ?? "canvas"), className), ...props }));
29
+ }
30
+ export { SeamGrid };
@@ -17,6 +17,6 @@ function SectionIntroTitle({ className, size = "lg", ...props }) {
17
17
  return (_jsx("h2", { "data-slot": "section-intro-title", className: cn(size === "lg" ? "nc-type-title-lg" : "nc-type-title-md", "mx-auto text-foreground", className), ...props }));
18
18
  }
19
19
  function SectionIntroLead({ className, ...props }) {
20
- return (_jsx("p", { "data-slot": "section-intro-lead", className: cn("nc-type-body-md mx-auto max-w-[64ch] text-muted-foreground", className), ...props }));
20
+ return (_jsx("p", { "data-slot": "section-intro-lead", className: cn("nc-type-body-md mx-auto max-w-[64ch] text-[var(--nc-body)]", className), ...props }));
21
21
  }
22
22
  export { SectionIntro, SectionIntroKicker, SectionIntroTitle, SectionIntroLead };
@@ -13,7 +13,7 @@ function SelectValue({ ...props }) {
13
13
  return _jsx(SelectPrimitive.Value, { "data-slot": "select-value", ...props });
14
14
  }
15
15
  function SelectTrigger({ className, size = "default", children, ...props }) {
16
- return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("flex w-fit items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
16
+ return (_jsxs(SelectPrimitive.Trigger, { "data-slot": "select-trigger", "data-size": size, className: cn("flex w-fit items-center justify-between gap-2 rounded-sm border border-input bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground", className), ...props, children: [children, _jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDownIcon, { className: "size-4 opacity-50" }) })] }));
17
17
  }
18
18
  function SelectContent({ className, children, position = "item-aligned", align = "center", ...props }) {
19
19
  return (_jsx(SelectPrimitive.Portal, { children: _jsxs(SelectPrimitive.Content, { "data-slot": "select-content", className: cn("relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-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-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", position === "popper" &&
@@ -1 +1 @@
1
- {"version":3,"file":"shift-band.d.ts","sourceRoot":"","sources":["../../src/components/shift-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,iBAAS,SAAS,CAAC,EACjB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,qBAsBA;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAOxE;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AACnC,YAAY,EAAE,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"shift-band.d.ts","sourceRoot":"","sources":["../../src/components/shift-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAY9B,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,iBAAS,SAAS,CAAC,EACjB,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB,qBAsBA;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAOxE;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAA;AACnC,YAAY,EAAE,cAAc,EAAE,CAAA"}
@@ -1,8 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
3
4
  import { SectionIntro, SectionIntroKicker, SectionIntroLead, SectionIntroTitle, } from "./section-intro.js";
4
5
  function ShiftBand({ kicker, title, children, proofs, className, ...props }) {
5
- return (_jsxs("div", { "data-slot": "shift-band", className: cn("grid gap-px bg-border", className), ...props, children: [_jsxs(SectionIntro, { className: "justify-items-center text-center", children: [_jsx(SectionIntroKicker, { children: kicker }), _jsx(SectionIntroTitle, { className: "max-w-[18ch] text-balance text-center", children: title }), children] }), _jsx("div", { className: "grid gap-px bg-border md:grid-cols-4", children: proofs.map((proof) => (_jsxs("div", { className: "nc-panel-cell bg-card", children: [_jsx("h3", { className: "nc-type-body-md-strong text-foreground", children: proof.title }), _jsx("p", { className: "nc-type-body-sm text-muted-foreground", children: proof.body })] }, proof.title))) })] }));
6
+ return (_jsxs(SeamGrid, { "data-slot": "shift-band", className: className, ...props, children: [_jsxs(SectionIntro, { className: "justify-items-center text-center", children: [_jsx(SectionIntroKicker, { children: kicker }), _jsx(SectionIntroTitle, { className: "max-w-[18ch] text-balance text-center", children: title }), children] }), _jsx(SeamGrid, { className: "md:grid-cols-4", children: proofs.map((proof) => (_jsxs("div", { className: "nc-panel-cell bg-card", children: [_jsx("h3", { className: "nc-type-body-md-strong text-foreground", children: proof.title }), _jsx("p", { className: "nc-type-body-sm text-[var(--nc-body)]", children: proof.body })] }, proof.title))) })] }));
6
7
  }
7
8
  function ShiftBandLead({ className, ...props }) {
8
9
  return (_jsx(SectionIntroLead, { className: cn("text-balance text-center", className), ...props }));
@@ -0,0 +1,13 @@
1
+ import * as React from "react";
2
+ import type { AgentWorkState } from "./agent-message";
3
+ declare function StateNotice({ state, icon: Icon, title, description, actions, className, ...props }: {
4
+ state: Exclude<AgentWorkState, "empty" | "idle">;
5
+ icon: React.ComponentType<{
6
+ className?: string;
7
+ }>;
8
+ title: React.ReactNode;
9
+ description?: React.ReactNode;
10
+ actions?: React.ReactNode;
11
+ } & Omit<React.ComponentProps<"div">, "title">): React.JSX.Element;
12
+ export { StateNotice };
13
+ //# sourceMappingURL=state-notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-notice.d.ts","sourceRoot":"","sources":["../../src/components/state-notice.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAIhE,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,IAAI,EAAE,IAAI,EACV,KAAK,EACL,WAAW,EACX,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE;IACD,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,GAAG,MAAM,CAAC,CAAA;IAChD,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,qBA2B7C;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { statePresentation } from "../lib/agent-work-state.js";
3
+ import { cn } from "../lib/utils.js";
4
+ function StateNotice({ state, icon: Icon, title, description, actions, className, ...props }) {
5
+ const { role, busy } = statePresentation(state);
6
+ return (_jsxs("div", { "data-agent-state": state, role: role, className: cn("flex flex-wrap items-center gap-3 border bg-muted/30 text-sm", className), ...props, children: [_jsx(Icon, { className: cn("size-4 text-muted-foreground", busy && "animate-spin") }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium", children: title }), description && (_jsx("div", { className: "text-muted-foreground", children: description }))] }), actions] }));
7
+ }
8
+ export { StateNotice };
@@ -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,CAAA;AAI9B;;;;;;;;;;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,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBAwBA;AAED,OAAO,EAAE,SAAS,EAAE,CAAA"}
1
+ {"version":3,"file":"stats-band.d.ts","sourceRoot":"","sources":["../../src/components/stats-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;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,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBAiBA;AAED,OAAO,EAAE,SAAS,EAAE,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
3
4
  /**
4
5
  * stats-band — proof row of headline statistics (replaces the retired
5
6
  * `sections/stats-band.css` + its coupled `stat-block` cells).
@@ -19,10 +20,8 @@ function StatsBand({ className, columns = 4, surface = "canvas", ...props }) {
19
20
  5: "grid-cols-2 lg:grid-cols-5",
20
21
  6: "grid-cols-2 lg:grid-cols-6",
21
22
  };
22
- return (_jsx("div", { "data-slot": "stats-band", "data-surface": surface, className: cn("grid h-full gap-px", cols[columns],
23
- // single-owner seam: the grid owns every divider; ink flips only its colour.
24
- surface === "ink"
25
- ? "bg-[color-mix(in_srgb,var(--nc-line)_40%,var(--nc-ink))]"
26
- : "bg-border", className), ...props }));
23
+ 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", cols[columns], className), ...props }));
27
26
  }
28
27
  export { StatsBand };
@@ -1 +1 @@
1
- {"version":3,"file":"testimonials.d.ts","sourceRoot":"","sources":["../../src/components/testimonials.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAO,EACP,OAAkB,EAClB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBAkCA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"testimonials.d.ts","sourceRoot":"","sources":["../../src/components/testimonials.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAO,EACP,OAAkB,EAClB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAC3B,qBA+BA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ import { SeamGrid } from "./seam-grid.js";
3
4
  /**
4
5
  * testimonials — credibility row of customer quotes (replaces the retired
5
6
  * `sections/testimonials.css` + its coupled `quote-card` cells).
@@ -19,10 +20,8 @@ function Testimonials({ className, columns, surface = "canvas", children, ...pro
19
20
  // single featured mode — the lone card is centered; no grid, no seam.
20
21
  return (_jsx("div", { "data-slot": "testimonials", "data-surface": surface, className: cn("flex h-full items-center justify-center", className), ...props, children: _jsx("div", { className: "w-full max-w-[760px]", children: children }) }));
21
22
  }
22
- return (_jsx("div", { "data-slot": "testimonials", "data-surface": surface, className: cn("grid h-full gap-px", columns === 2
23
+ return (_jsx(SeamGrid, { "data-slot": "testimonials", surface: surface, className: cn("h-full", columns === 2
23
24
  ? "grid-cols-1 sm:grid-cols-2"
24
- : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", surface === "ink"
25
- ? "bg-[color-mix(in_srgb,var(--nc-line)_40%,var(--nc-ink))]"
26
- : "bg-border", className), ...props, children: children }));
25
+ : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", className), ...props, children: children }));
27
26
  }
28
27
  export { Testimonials };
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  function Textarea({ className, ...props }) {
4
- return (_jsx("textarea", { "data-slot": "textarea", className: cn("flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm", className), ...props }));
4
+ return (_jsx("textarea", { "data-slot": "textarea", className: cn("flex field-sizing-content min-h-16 w-full rounded-sm border border-input bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm", className), ...props }));
5
5
  }
6
6
  export { Textarea };
@@ -1,13 +1,15 @@
1
1
  import * as React from "react";
2
- import { type DemoSurfaceScript } from "./demo-surface";
3
- declare function UseCaseBento({ kicker, title, body, proof, media, mediaClassName, demo, className, ...props }: React.ComponentProps<"article"> & {
2
+ import { type DemoSurfaceLabels, type DemoSurfaceScript } from "./demo-surface";
3
+ declare function UseCaseBento({ kicker, title, body, proof, proofLabel, media, mediaClassName, demo, demoLabels, className, ...props }: React.ComponentProps<"article"> & {
4
4
  kicker: string;
5
5
  title: string;
6
6
  body: string;
7
7
  proof: string;
8
+ proofLabel?: string;
8
9
  media: React.ReactNode;
9
10
  mediaClassName?: string;
10
11
  demo: DemoSurfaceScript;
12
+ demoLabels?: Partial<DemoSurfaceLabels>;
11
13
  }): React.JSX.Element;
12
14
  export { UseCaseBento };
13
15
  //# sourceMappingURL=use-case-bento.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-case-bento.d.ts","sourceRoot":"","sources":["../../src/components/use-case-bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGpE,iBAAS,YAAY,CAAC,EACpB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,cAAc,EACd,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,iBAAiB,CAAA;CACxB,qBAmDA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"use-case-bento.d.ts","sourceRoot":"","sources":["../../src/components/use-case-bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AAGvB,iBAAS,YAAY,CAAC,EACpB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAmC,EACnC,KAAK,EACL,cAAc,EACd,IAAI,EACJ,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,iBAAiB,CAAA;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACxC,qBAmDA;AAED,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  import { Bento, BentoCopy, BentoDemo, BentoItem, BentoMedia } from "./bento.js";
4
- import { DemoSurface } from "./demo-surface.js";
4
+ import { DemoSurface, } from "./demo-surface.js";
5
5
  import { MediaMount } from "./media-mount.js";
6
- function UseCaseBento({ kicker, title, body, proof, media, mediaClassName, demo, className, ...props }) {
7
- return (_jsx("article", { "data-slot": "use-case-bento", className: className, ...props, children: _jsxs(Bento, { height: "primary", children: [_jsxs(BentoItem, { span: 3, children: [_jsx("div", { className: "nc-artifact-surface pointer-events-none absolute inset-0 border-0 p-0 opacity-60", "aria-hidden": "true" }), _jsxs(BentoCopy, { children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: kicker }), _jsx("h3", { className: "nc-type-title-md text-foreground", children: title }), _jsx("p", { className: "nc-type-body-sm text-muted-foreground", children: body }), _jsxs("div", { className: "grid gap-2 border-t border-border pt-4", children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: "What the agent shows" }), _jsx("p", { className: "nc-type-body-sm text-foreground", children: proof })] })] })] }), _jsx(BentoItem, { span: 5, flush: true, stretch: true, className: "min-h-[var(--nc-h-bento-primary)]", children: _jsx(BentoMedia, { children: _jsx(MediaMount, { ratio: "auto", className: cn("!h-full min-h-[var(--nc-h-bento-primary)]", mediaClassName), children: media }) }) }), _jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "min-h-0 p-[var(--nc-sm)]", children: _jsx(BentoDemo, { children: _jsx(DemoSurface, { script: demo, title: title }) }) })] }) }));
6
+ function UseCaseBento({ kicker, title, body, proof, proofLabel = "What the agent shows", media, mediaClassName, demo, demoLabels, className, ...props }) {
7
+ return (_jsx("article", { "data-slot": "use-case-bento", className: className, ...props, children: _jsxs(Bento, { height: "primary", children: [_jsxs(BentoItem, { span: 3, children: [_jsx("div", { className: "nc-artifact-surface pointer-events-none absolute inset-0 border-0 p-0 opacity-60", "aria-hidden": "true" }), _jsxs(BentoCopy, { children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: kicker }), _jsx("h3", { className: "nc-type-title-md text-foreground", children: title }), _jsx("p", { className: "nc-type-body-sm text-[var(--nc-body)]", children: body }), _jsxs("div", { className: "grid gap-2 border-t border-border pt-4", children: [_jsx("p", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: proofLabel }), _jsx("p", { className: "nc-type-body-sm text-foreground", children: proof })] })] })] }), _jsx(BentoItem, { span: 5, flush: true, stretch: true, className: "min-h-[var(--nc-h-bento-primary)]", children: _jsx(BentoMedia, { children: _jsx(MediaMount, { ratio: "auto", className: cn("!h-full min-h-[var(--nc-h-bento-primary)]", mediaClassName), children: media }) }) }), _jsx(BentoItem, { span: 4, surface: "soft", stretch: true, className: "min-h-0 p-[var(--nc-sm)]", children: _jsx(BentoDemo, { children: _jsx(DemoSurface, { labels: demoLabels, script: demo, title: title }) }) })] }) }));
8
8
  }
9
9
  export { UseCaseBento };
@@ -1,11 +1,12 @@
1
1
  import * as React from "react";
2
- import { type DemoSurfaceScript } from "./demo-surface";
3
- declare function WatchItWorkBand({ kicker, title, lead, primaryDemo, secondaryDemo, className, ...props }: React.ComponentProps<"div"> & {
2
+ import { type DemoSurfaceLabels, type DemoSurfaceScript } from "./demo-surface";
3
+ declare function WatchItWorkBand({ kicker, title, lead, primaryDemo, secondaryDemo, demoLabels, className, ...props }: React.ComponentProps<"div"> & {
4
4
  kicker?: string;
5
5
  title?: string;
6
6
  lead?: string;
7
7
  primaryDemo?: DemoSurfaceScript;
8
8
  secondaryDemo?: DemoSurfaceScript;
9
+ demoLabels?: Partial<DemoSurfaceLabels>;
9
10
  }): React.JSX.Element;
10
11
  export { WatchItWorkBand };
11
12
  //# sourceMappingURL=watch-it-work-band.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch-it-work-band.d.ts","sourceRoot":"","sources":["../../src/components/watch-it-work-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAAe,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEpE,iBAAS,eAAe,CAAC,EACvB,MAAgC,EAChC,KAAuB,EACvB,IAAI,EACJ,WAAW,EACX,aAAa,EACb,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,aAAa,CAAC,EAAE,iBAAiB,CAAA;CAClC,qBA8BA;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"watch-it-work-band.d.ts","sourceRoot":"","sources":["../../src/components/watch-it-work-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAA;AAEvB,iBAAS,eAAe,CAAC,EACvB,MAAgC,EAChC,KAAuB,EACvB,IAAI,EACJ,WAAW,EACX,aAAa,EACb,UAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,aAAa,CAAC,EAAE,iBAAiB,CAAA;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACxC,qBA8BA;AAED,OAAO,EAAE,eAAe,EAAE,CAAA"}