@nadicodeai/ui 0.10.2 → 0.12.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 (100) 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/terminal.d.ts.map +1 -1
  11. package/dist/components/ai-elements/terminal.js +8 -8
  12. package/dist/components/artifact-panel.d.ts.map +1 -1
  13. package/dist/components/artifact-panel.js +5 -5
  14. package/dist/components/bento.d.ts +14 -3
  15. package/dist/components/bento.d.ts.map +1 -1
  16. package/dist/components/bento.js +26 -5
  17. package/dist/components/brand.d.ts.map +1 -1
  18. package/dist/components/brand.js +29 -3
  19. package/dist/components/contact.d.ts +22 -10
  20. package/dist/components/contact.d.ts.map +1 -1
  21. package/dist/components/contact.js +34 -12
  22. package/dist/components/diff-count.js +1 -1
  23. package/dist/components/faq-item.js +2 -2
  24. package/dist/components/faq.d.ts +4 -1
  25. package/dist/components/faq.d.ts.map +1 -1
  26. package/dist/components/faq.js +5 -2
  27. package/dist/components/feature-grid.d.ts +23 -0
  28. package/dist/components/feature-grid.d.ts.map +1 -0
  29. package/dist/components/feature-grid.js +33 -0
  30. package/dist/components/feature-rows.d.ts +23 -0
  31. package/dist/components/feature-rows.d.ts.map +1 -0
  32. package/dist/components/feature-rows.js +27 -0
  33. package/dist/components/footer.d.ts +18 -12
  34. package/dist/components/footer.d.ts.map +1 -1
  35. package/dist/components/footer.js +32 -20
  36. package/dist/components/hero.d.ts +28 -0
  37. package/dist/components/hero.d.ts.map +1 -0
  38. package/dist/components/hero.js +45 -0
  39. package/dist/components/integration-flow.d.ts +36 -0
  40. package/dist/components/integration-flow.d.ts.map +1 -0
  41. package/dist/components/integration-flow.js +36 -0
  42. package/dist/components/live-demo.d.ts +31 -0
  43. package/dist/components/live-demo.d.ts.map +1 -0
  44. package/dist/components/live-demo.js +30 -0
  45. package/dist/components/logo-band.d.ts +12 -2
  46. package/dist/components/logo-band.d.ts.map +1 -1
  47. package/dist/components/logo-band.js +16 -1
  48. package/dist/components/logo-tile.d.ts.map +1 -1
  49. package/dist/components/logo-tile.js +5 -2
  50. package/dist/components/nav-bar.d.ts +14 -8
  51. package/dist/components/nav-bar.d.ts.map +1 -1
  52. package/dist/components/nav-bar.js +19 -13
  53. package/dist/components/pricing-card.d.ts +10 -15
  54. package/dist/components/pricing-card.d.ts.map +1 -1
  55. package/dist/components/pricing-card.js +18 -29
  56. package/dist/components/pricing.d.ts +11 -14
  57. package/dist/components/pricing.d.ts.map +1 -1
  58. package/dist/components/pricing.js +5 -15
  59. package/dist/components/quote-card.d.ts +10 -2
  60. package/dist/components/quote-card.d.ts.map +1 -1
  61. package/dist/components/quote-card.js +15 -3
  62. package/dist/components/security-grid.d.ts +25 -0
  63. package/dist/components/security-grid.d.ts.map +1 -0
  64. package/dist/components/security-grid.js +31 -0
  65. package/dist/components/sidebar.js +5 -5
  66. package/dist/components/stat-block.d.ts +9 -5
  67. package/dist/components/stat-block.d.ts.map +1 -1
  68. package/dist/components/stat-block.js +12 -6
  69. package/dist/components/statement.d.ts +32 -0
  70. package/dist/components/statement.d.ts.map +1 -0
  71. package/dist/components/statement.js +40 -0
  72. package/dist/components/stats-band.d.ts +6 -2
  73. package/dist/components/stats-band.d.ts.map +1 -1
  74. package/dist/components/stats-band.js +10 -3
  75. package/dist/components/status-dot.js +4 -4
  76. package/dist/components/steps.d.ts +34 -0
  77. package/dist/components/steps.d.ts.map +1 -0
  78. package/dist/components/steps.js +40 -0
  79. package/dist/components/team-grid.d.ts +27 -0
  80. package/dist/components/team-grid.d.ts.map +1 -0
  81. package/dist/components/team-grid.js +30 -0
  82. package/dist/components/testimonials.d.ts +39 -12
  83. package/dist/components/testimonials.d.ts.map +1 -1
  84. package/dist/components/testimonials.js +46 -13
  85. package/dist/components/texture-strip.d.ts +22 -0
  86. package/dist/components/texture-strip.d.ts.map +1 -0
  87. package/dist/components/texture-strip.js +29 -0
  88. package/dist/index.d.ts +10 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +10 -0
  91. package/dist/styles/globals.css +185 -300
  92. package/docs/agent-work-surfaces.md +6 -5
  93. package/docs/agents/nadicodeai-ui.md +42 -273
  94. package/docs/consuming-cross-repo.md +26 -33
  95. package/docs/contract.md +43 -0
  96. package/docs/migration/nadia-consumer-readiness.md +5 -10
  97. package/docs/terminal-tui-semantics.md +142 -181
  98. package/llms.txt +49 -84
  99. package/package.json +3 -4
  100. package/skills/nadicodeai-ui/SKILL.md +6 -34
@@ -1,51 +1,63 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  /**
4
- * footer — bottom footer/navigation row chrome (replaces the retired `.nc-footer`
5
- * + its `data-variant="mega"`).
4
+ * footer — the always-dark site footer (V5 · B20).
6
5
  *
7
- * SINGLE-OWNER SEAM: the only edge the footer owns is its top border
8
- * (`border-t border-border`) on a canvas surface it draws no other line. The flat
9
- * inner row is a wrapping flex line capped to the frame measure with
10
- * `justify-between`: brand leading, meta trailing, nav between. The `variant="mega"`
11
- * adds exactly ONE extra inner seam — a hairline above the meta strip
12
- * (`FooterMegaMeta`'s top border) — owned once there; the link columns separate by
13
- * whitespace gaps, never rails, so no coordinate carries two borders.
6
+ * A brandline + identity paragraph beside two link columns, a meta row
7
+ * (copyright · clock slot · locations), and a giant faint ghost wordmark behind it
8
+ * all. The footer is ALWAYS dark, so the root carries its own `dark` ancestor class
9
+ * and resolves every colour from semantic roles (`bg-card`, `text-foreground`,
10
+ * `text-muted-foreground`, `border-border`, `text-primary`).
14
11
  *
15
- * A11y: nav links expose a `--ring` (link-green) focus outline; the consumer wraps
16
- * link groups in `<nav aria-label>`. Token-only; no `dark:` styling.
12
+ * SINGLE-OWNER SEAM: the footer owns its top border (`border-t border-border`); the
13
+ * `mega` variant adds exactly ONE inner seam, the hairline above the meta strip
14
+ * (`FooterMegaMeta`). Link columns separate by whitespace, never rails.
15
+ *
16
+ * The ghost wordmark and clock are CONTENT slots: `FooterGhost` takes the wordmark
17
+ * text/renderer, `FooterClock` takes a pre-formatted time string (a value, not a
18
+ * live timer — no client JS in this pass). Token-only; the root sets its own `dark`
19
+ * class (an accepted ancestor-class remap), never `dark:` utilities.
17
20
  */
18
21
  function Footer({ className, variant = "flat", ...props }) {
19
- return (_jsx("footer", { "data-slot": "footer", "data-variant": variant, className: cn("border-t border-border bg-card px-6 py-8 [&_a]:no-underline", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
22
+ return (_jsx("footer", { "data-slot": "footer", "data-variant": variant, className: cn("dark relative isolate overflow-hidden border-t border-border bg-card px-6 py-12 text-foreground [&_a]:no-underline", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
20
23
  }
21
24
  function FooterInner({ className, variant = "flat", ...props }) {
22
- return (_jsx("div", { "data-slot": "footer-inner", className: cn("mx-auto w-full max-w-[1200px]", variant === "mega" ? "grid gap-8" : "flex flex-wrap items-center justify-between gap-4", className), ...props }));
25
+ return (_jsx("div", { "data-slot": "footer-inner", className: cn("relative z-10 mx-auto w-full max-w-[1200px]", variant === "mega" ? "grid gap-8" : "flex flex-wrap items-center justify-between gap-4", className), ...props }));
23
26
  }
24
27
  function FooterBrand({ className, ...props }) {
25
28
  return (_jsx("a", { "data-slot": "footer-brand", className: cn("inline-flex items-center gap-2.5 text-sm font-semibold text-foreground [&_img]:block [&_img]:h-6 [&_img]:w-auto [&_svg]:block [&_svg]:h-6 [&_svg]:w-auto", className), ...props }));
26
29
  }
30
+ function FooterIdentity({ className, ...props }) {
31
+ return (_jsx("p", { "data-slot": "footer-identity", className: cn("nc-type-body-md m-0 max-w-[52ch] text-muted-foreground", className), ...props }));
32
+ }
27
33
  function FooterNav({ className, ...props }) {
28
- return (_jsx("nav", { "data-slot": "footer-nav", className: cn("flex flex-wrap gap-3 text-sm text-[var(--nc-body)] [&_a]:text-inherit [&_a:hover]:text-foreground", className), ...props }));
34
+ return (_jsx("nav", { "data-slot": "footer-nav", className: cn("flex flex-wrap gap-3 text-sm text-muted-foreground [&_a]:text-inherit [&_a:hover]:text-foreground", className), ...props }));
29
35
  }
30
36
  function FooterMeta({ className, ...props }) {
31
37
  return (_jsx("p", { "data-slot": "footer-meta", className: cn("m-0 text-sm text-muted-foreground", className), ...props }));
32
38
  }
39
+ function FooterClock({ className, ...props }) {
40
+ return (_jsx("span", { "data-slot": "footer-clock", className: cn("nc-type-caption-mono text-primary", className), ...props }));
41
+ }
42
+ function FooterGhost({ className, ...props }) {
43
+ return (_jsx("span", { "data-slot": "footer-ghost", "aria-hidden": "true", className: cn("pointer-events-none absolute inset-x-0 bottom-0 z-0 select-none overflow-hidden whitespace-nowrap text-[clamp(90px,14vw,210px)] font-semibold leading-[0.8] tracking-tight text-foreground/5", className), ...props }));
44
+ }
33
45
  /* ── mega variant slots ────────────────────────────────────────────────── */
34
46
  function FooterMegaTop({ className, ...props }) {
35
- return (_jsx("div", { "data-slot": "footer-mega-top", className: cn("grid grid-cols-1 items-start gap-8 sm:grid-cols-[minmax(0,220px)_minmax(0,1fr)] sm:gap-x-12", className), ...props }));
47
+ return (_jsx("div", { "data-slot": "footer-mega-top", className: cn("grid grid-cols-1 items-start gap-8 sm:grid-cols-[minmax(0,7fr)_minmax(0,5fr)] sm:gap-x-12", className), ...props }));
36
48
  }
37
49
  function FooterMegaCols({ className, ...props }) {
38
- return (_jsx("div", { "data-slot": "footer-mega-cols", className: cn("grid grid-cols-1 gap-6 sm:grid-cols-[repeat(auto-fit,minmax(140px,1fr))] sm:gap-x-8", className), ...props }));
50
+ return (_jsx("div", { "data-slot": "footer-mega-cols", className: cn("grid grid-cols-1 gap-6 sm:grid-cols-[repeat(auto-fit,minmax(140px,1fr))] sm:justify-end sm:gap-x-8", className), ...props }));
39
51
  }
40
52
  function FooterMegaCol({ className, ...props }) {
41
- return (_jsx("div", { "data-slot": "footer-mega-col", className: cn("grid content-start gap-2 [&_a]:text-sm [&_a]:text-[var(--nc-body)] [&_a:hover]:text-foreground", className), ...props }));
53
+ return (_jsx("div", { "data-slot": "footer-mega-col", className: cn("grid content-start gap-2 [&_a]:text-sm [&_a]:text-muted-foreground [&_a:hover]:text-foreground", className), ...props }));
42
54
  }
43
55
  function FooterMegaColTitle({ className, ...props }) {
44
- return (_jsx("p", { "data-slot": "footer-mega-col-title", className: cn("m-0 font-mono text-xs uppercase text-muted-foreground", className), ...props }));
56
+ return (_jsx("p", { "data-slot": "footer-mega-col-title", className: cn("nc-type-caption-mono m-0 uppercase text-muted-foreground", className), ...props }));
45
57
  }
46
58
  function FooterMegaMeta({ className, ...props }) {
47
59
  return (_jsx("div", { "data-slot": "footer-mega-meta", className: cn(
48
60
  // the single inner seam the mega variant adds: a top hairline, owned once.
49
- "flex flex-wrap items-center justify-between gap-x-6 gap-y-3 border-t border-border pt-6", className), ...props }));
61
+ "flex flex-wrap items-center justify-between gap-x-6 gap-y-3 border-t border-border pt-6 text-muted-foreground", className), ...props }));
50
62
  }
51
- export { Footer, FooterInner, FooterBrand, FooterNav, FooterMeta, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
63
+ export { Footer, FooterInner, FooterBrand, FooterIdentity, FooterNav, FooterMeta, FooterClock, FooterGhost, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ /**
3
+ * hero — the full-viewport, always-dark page-opening hero (V5 · B02).
4
+ *
5
+ * A left-pinned copy column (kicker with an accent bar, poster headline, lead, and a
6
+ * two-CTA row) over a right-anchored visual slot. The hero is ALWAYS dark, so the
7
+ * root carries its own `dark` ancestor class and resolves every colour from the
8
+ * semantic roles that state each element's purpose (`bg-background`,
9
+ * `text-foreground`, `text-muted-foreground`, `bg-primary`, `border-border`).
10
+ *
11
+ * STUBBED VISUAL: `HeroVisual` is a clean static slot the consumer fills with an
12
+ * image or inline SVG (the founder-approved WebGL Duomo particle field is out of
13
+ * scope for this pass). Absent content, it renders only the dark surface behind the
14
+ * copy — no canvas, no WebGL, no motion.
15
+ *
16
+ * The copy parts are typed presentational wrappers; the consumer supplies the words
17
+ * and drops `Button`s into `HeroActions`. Token-only; the root sets its own `dark`
18
+ * class (an accepted ancestor-class remap), never `dark:` utilities.
19
+ */
20
+ declare function Hero({ className, ...props }: React.ComponentProps<"section">): React.JSX.Element;
21
+ declare function HeroVisual({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
22
+ declare function HeroBody({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
23
+ declare function HeroKicker({ className, children, ...props }: React.ComponentProps<"p">): React.JSX.Element;
24
+ declare function HeroTitle({ className, ...props }: React.ComponentProps<"h1">): React.JSX.Element;
25
+ declare function HeroLead({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
26
+ declare function HeroActions({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
27
+ export { Hero, HeroVisual, HeroBody, HeroKicker, HeroTitle, HeroLead, HeroActions };
28
+ //# sourceMappingURL=hero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../src/components/hero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;GAiBG;AAEH,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,qBAWrE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAevE;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWrE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAc/E;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQrE;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQnE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ /**
4
+ * hero — the full-viewport, always-dark page-opening hero (V5 · B02).
5
+ *
6
+ * A left-pinned copy column (kicker with an accent bar, poster headline, lead, and a
7
+ * two-CTA row) over a right-anchored visual slot. The hero is ALWAYS dark, so the
8
+ * root carries its own `dark` ancestor class and resolves every colour from the
9
+ * semantic roles that state each element's purpose (`bg-background`,
10
+ * `text-foreground`, `text-muted-foreground`, `bg-primary`, `border-border`).
11
+ *
12
+ * STUBBED VISUAL: `HeroVisual` is a clean static slot the consumer fills with an
13
+ * image or inline SVG (the founder-approved WebGL Duomo particle field is out of
14
+ * scope for this pass). Absent content, it renders only the dark surface behind the
15
+ * copy — no canvas, no WebGL, no motion.
16
+ *
17
+ * The copy parts are typed presentational wrappers; the consumer supplies the words
18
+ * and drops `Button`s into `HeroActions`. Token-only; the root sets its own `dark`
19
+ * class (an accepted ancestor-class remap), never `dark:` utilities.
20
+ */
21
+ function Hero({ className, ...props }) {
22
+ return (_jsx("section", { "data-slot": "hero", className: cn("dark relative isolate min-h-[max(640px,100svh)] overflow-hidden bg-background text-foreground", className), ...props }));
23
+ }
24
+ function HeroVisual({ className, ...props }) {
25
+ return (_jsx("div", { "data-slot": "hero-visual", "aria-hidden": "true", className: cn(
26
+ // Right-anchored static plate. Flush mount: consumer media fills it; empty,
27
+ // it is just the dark surface. This is the stub slot for the WebGL field.
28
+ "pointer-events-none absolute inset-y-0 right-0 z-0 hidden w-[62%] overflow-hidden border-l border-border/60 sm:block", "[&_img]:h-full [&_img]:w-full [&_img]:object-cover [&_svg]:h-full [&_svg]:w-full", className), ...props }));
29
+ }
30
+ function HeroBody({ className, ...props }) {
31
+ return (_jsx("div", { "data-slot": "hero-body", className: cn("relative z-10 mx-auto flex min-h-[inherit] w-full max-w-[1200px] flex-col items-start justify-center gap-6 px-[clamp(24px,5vw,64px)] py-[clamp(96px,12vw,120px)]", className), ...props }));
32
+ }
33
+ function HeroKicker({ className, children, ...props }) {
34
+ return (_jsxs("p", { "data-slot": "hero-kicker", className: cn("nc-type-caption-mono flex items-center gap-3 uppercase text-muted-foreground", className), ...props, children: [_jsx("span", { "data-slot": "hero-kicker-bar", "aria-hidden": "true", className: "h-0.5 w-8 bg-primary" }), children] }));
35
+ }
36
+ function HeroTitle({ className, ...props }) {
37
+ return (_jsx("h1", { "data-slot": "hero-title", className: cn("nc-type-display-lg max-w-[16ch] text-balance text-foreground", className), ...props }));
38
+ }
39
+ function HeroLead({ className, ...props }) {
40
+ return (_jsx("p", { "data-slot": "hero-lead", className: cn("nc-type-body-lg max-w-[40ch] text-muted-foreground", className), ...props }));
41
+ }
42
+ function HeroActions({ className, ...props }) {
43
+ return (_jsx("div", { "data-slot": "hero-actions", className: cn("mt-2 flex flex-wrap items-center gap-3", className), ...props }));
44
+ }
45
+ export { Hero, HeroVisual, HeroBody, HeroKicker, HeroTitle, HeroLead, HeroActions };
@@ -0,0 +1,36 @@
1
+ import * as React from "react";
2
+ /**
3
+ * integration-flow — the "how it runs" flow diagram (V5 B10).
4
+ *
5
+ * A four-node flow: three main-row nodes (source → agent → output) plus one
6
+ * branch node (a named person) below the centre. Wide layouts use one inline
7
+ * SVG connector layer. Compact layouts reflow to source → agent → a two-column
8
+ * output/person fork and use CSS borders in the real gaps, so connectors never
9
+ * disappear behind stacked cards. This pass is STATIC: no `animateMotion`, no
10
+ * draw-on stroke animation.
11
+ *
12
+ * All SVG colours resolve through `var(--nc-*)` / semantic role tokens, never a
13
+ * raw literal. `IntegrationFlowLegend` / `IntegrationFlowLegendPill` render the
14
+ * tint key. Copy is props-driven: only the nodes you pass are rendered.
15
+ *
16
+ * Light-surface composition; inherits the page theme and sets no dark root.
17
+ * Token-only; no `dark:` styling.
18
+ */
19
+ type FlowTone = "neutral" | "primary" | "warning";
20
+ type FlowNode = {
21
+ label: string;
22
+ sublabel?: string;
23
+ tone?: FlowTone;
24
+ icon?: React.ReactNode;
25
+ };
26
+ declare function IntegrationFlow({ nodes, className, ...props }: React.ComponentProps<"div"> & {
27
+ nodes?: FlowNode[];
28
+ }): React.JSX.Element;
29
+ type LegendTone = "primary" | "warning" | "info";
30
+ declare function IntegrationFlowLegend({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
31
+ declare function IntegrationFlowLegendPill({ tone, className, ...props }: React.ComponentProps<"span"> & {
32
+ tone?: LegendTone;
33
+ }): React.JSX.Element;
34
+ export { IntegrationFlow, IntegrationFlowLegend, IntegrationFlowLegendPill };
35
+ export type { FlowNode, FlowTone, LegendTone };
36
+ //# sourceMappingURL=integration-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-flow.d.ts","sourceRoot":"","sources":["../../src/components/integration-flow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;GAgBG;AAEH,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAElD,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,CAAC;AAsDF,iBAAS,eAAe,CAAC,EACvB,KAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB,qBA2HA;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAQjD,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQlF;AAED,iBAAS,yBAAyB,CAAC,EACjC,IAAgB,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,qBAatD;AAED,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,CAAC;AAC7E,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ const NODE_BORDER = {
4
+ neutral: "border-border",
5
+ primary: "border-primary",
6
+ warning: "border-warning",
7
+ };
8
+ const NODE_CHIP = {
9
+ neutral: "bg-muted",
10
+ primary: "bg-[var(--nc-link-bg-soft)]",
11
+ warning: "bg-[var(--nc-warning-soft)]",
12
+ };
13
+ // Default role tones for the canonical four-node arrangement.
14
+ const DEFAULT_TONES = ["neutral", "primary", "neutral", "warning"];
15
+ function FlowNodeBox({ node, tone }) {
16
+ return (_jsxs("div", { "data-slot": "integration-flow-node", "data-tone": tone, className: cn("relative z-10 flex flex-col gap-2 border bg-card p-4", NODE_BORDER[tone]), children: [node.icon ? (_jsx("span", { "data-slot": "integration-flow-node-icon", "aria-hidden": "true", className: cn("grid size-8 place-items-center text-foreground [&_svg]:size-4", NODE_CHIP[tone]), children: node.icon })) : null, _jsx("span", { "data-slot": "integration-flow-node-label", className: "font-mono text-[11px] tracking-[0.08em] text-foreground uppercase", children: node.label }), node.sublabel ? (_jsx("span", { "data-slot": "integration-flow-node-sublabel", className: "font-mono text-[10px] text-muted-foreground", children: node.sublabel })) : null] }));
17
+ }
18
+ function IntegrationFlow({ nodes = [], className, ...props }) {
19
+ const main = nodes.slice(0, 3);
20
+ const branch = nodes[3];
21
+ const toneOf = (node, i) => node.tone ?? DEFAULT_TONES[i] ?? "neutral";
22
+ return (_jsxs("div", { "data-slot": "integration-flow", className: cn("nc-dotted-field relative grid gap-y-8 bg-card p-6 sm:p-10", className), ...props, children: [_jsxs("svg", { "data-slot": "integration-flow-connectors", className: "pointer-events-none absolute inset-0 hidden size-full sm:block", viewBox: "0 0 300 200", preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", children: [main.length > 1 ? (_jsx("line", { "data-slot": "integration-flow-link", x1: "60", y1: "46", x2: "140", y2: "46", stroke: "var(--primary)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" })) : null, main.length > 2 ? (_jsx("line", { "data-slot": "integration-flow-link", x1: "160", y1: "46", x2: "240", y2: "46", stroke: "var(--primary)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" })) : null, branch ? (_jsx("line", { "data-slot": "integration-flow-branch-link", x1: "150", y1: "62", x2: "150", y2: "150", stroke: "var(--border)", strokeWidth: "1.5", strokeDasharray: "4 4", vectorEffect: "non-scaling-stroke" })) : null] }), _jsxs("div", { "data-slot": "integration-flow-main", className: "grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-6 sm:gap-y-8", children: [main[0] ? _jsx(FlowNodeBox, { node: main[0], tone: toneOf(main[0], 0) }) : null, main[1] ? (_jsxs("div", { className: "relative", children: [_jsx("span", { "data-slot": "integration-flow-mobile-link", className: "pointer-events-none absolute -top-6 left-1/2 h-6 border-l border-primary sm:hidden", "aria-hidden": "true" }), _jsx(FlowNodeBox, { node: main[1], tone: toneOf(main[1], 1) })] })) : null, main[2] ? (_jsxs("div", { className: cn("relative grid pt-6 sm:contents", branch ? "grid-cols-2 gap-4" : "grid-cols-1"), children: [_jsx("span", { "data-slot": "integration-flow-mobile-fork-entry", className: "pointer-events-none absolute -top-6 left-1/2 h-6 border-l border-primary sm:hidden", "aria-hidden": "true" }), _jsxs("span", { "data-slot": "integration-flow-mobile-fork", className: cn("pointer-events-none absolute inset-x-0 top-0 h-6 sm:hidden", branch &&
23
+ "before:absolute before:top-3 before:right-1/4 before:left-1/4 before:border-t before:border-primary after:absolute after:top-0 after:left-1/2 after:h-3 after:border-l after:border-primary"), "aria-hidden": "true", children: [_jsx("span", { className: cn("absolute bottom-0 h-3 border-l border-primary", branch ? "left-1/4" : "left-1/2") }), branch ? (_jsx("span", { className: "absolute right-1/4 bottom-0 h-3 border-l border-dashed border-border" })) : null] }), _jsx("div", { className: "sm:col-start-3 sm:row-start-1", children: _jsx(FlowNodeBox, { node: main[2], tone: toneOf(main[2], 2) }) }), branch ? (_jsx("div", { "data-slot": "integration-flow-branch", className: "sm:col-start-2 sm:row-start-2", children: _jsx(FlowNodeBox, { node: branch, tone: toneOf(branch, 3) }) })) : null] })) : null] })] }));
24
+ }
25
+ const LEGEND_TINT = {
26
+ primary: "bg-[var(--nc-link-bg-soft)] text-[var(--nc-link-deep)]",
27
+ warning: "bg-[var(--nc-warning-soft)] text-[var(--nc-warning-deep)]",
28
+ info: "bg-[var(--nc-info-soft)] text-[var(--nc-info-deep)]",
29
+ };
30
+ function IntegrationFlowLegend({ className, ...props }) {
31
+ return (_jsx("div", { "data-slot": "integration-flow-legend", className: cn("flex flex-wrap gap-2", className), ...props }));
32
+ }
33
+ function IntegrationFlowLegendPill({ tone = "primary", className, ...props }) {
34
+ return (_jsx("span", { "data-slot": "integration-flow-legend-pill", "data-tone": tone, className: cn("inline-flex items-center gap-1.5 px-2.5 py-1 font-mono text-[10px] tracking-[0.1em] uppercase", LEGEND_TINT[tone], className), ...props }));
35
+ }
36
+ export { IntegrationFlow, IntegrationFlowLegend, IntegrationFlowLegendPill };
@@ -0,0 +1,31 @@
1
+ import * as React from "react";
2
+ /**
3
+ * live-demo — the faux application window standing in for the agent-at-work
4
+ * recording (V5 B11).
5
+ *
6
+ * `LiveDemoWindow` is a bordered card with a mono title bar, three NEUTRAL chrome
7
+ * dots (muted brand-token fills — deliberately not the literal macOS traffic
8
+ * colours), an optional "live" chip whose dot pulses (a CSS keyframe gated by
9
+ * `motion-reduce:animate-none` so it holds still under reduced-motion), and a
10
+ * stack of status rows. `LiveDemoRow` renders one status line with a soft tint
11
+ * pill: `done` (success tint) or `waiting` (warning tint).
12
+ *
13
+ * Replay interactivity is out of scope this pass — the rows are static. Copy is
14
+ * props-driven: an absent title, chip, or tag renders nothing.
15
+ *
16
+ * Light-surface composition; inherits the page theme and sets no dark root.
17
+ * Token-only; no `dark:` styling.
18
+ */
19
+ declare function LiveDemoWindow({ title, live, children, className, ...props }: React.ComponentProps<"div"> & {
20
+ title?: React.ReactNode;
21
+ live?: React.ReactNode;
22
+ }): React.JSX.Element;
23
+ type LiveDemoStatus = "done" | "waiting";
24
+ declare function LiveDemoRow({ status, label, tag, className, children, ...props }: React.ComponentProps<"div"> & {
25
+ status?: LiveDemoStatus;
26
+ label?: React.ReactNode;
27
+ tag?: React.ReactNode;
28
+ }): React.JSX.Element;
29
+ export { LiveDemoWindow, LiveDemoRow };
30
+ export type { LiveDemoStatus };
31
+ //# sourceMappingURL=live-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-demo.d.ts","sourceRoot":"","sources":["../../src/components/live-demo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBA+CA;AAED,KAAK,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAOzC,iBAAS,WAAW,CAAC,EACnB,MAAe,EACf,KAAK,EACL,GAAG,EACH,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB,qBA8BA;AAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ /**
4
+ * live-demo — the faux application window standing in for the agent-at-work
5
+ * recording (V5 B11).
6
+ *
7
+ * `LiveDemoWindow` is a bordered card with a mono title bar, three NEUTRAL chrome
8
+ * dots (muted brand-token fills — deliberately not the literal macOS traffic
9
+ * colours), an optional "live" chip whose dot pulses (a CSS keyframe gated by
10
+ * `motion-reduce:animate-none` so it holds still under reduced-motion), and a
11
+ * stack of status rows. `LiveDemoRow` renders one status line with a soft tint
12
+ * pill: `done` (success tint) or `waiting` (warning tint).
13
+ *
14
+ * Replay interactivity is out of scope this pass — the rows are static. Copy is
15
+ * props-driven: an absent title, chip, or tag renders nothing.
16
+ *
17
+ * Light-surface composition; inherits the page theme and sets no dark root.
18
+ * Token-only; no `dark:` styling.
19
+ */
20
+ function LiveDemoWindow({ title, live, children, className, ...props }) {
21
+ return (_jsxs("div", { "data-slot": "live-demo-window", className: cn("flex flex-col overflow-hidden rounded-lg border border-border bg-card shadow-sm", className), ...props, children: [_jsxs("div", { "data-slot": "live-demo-bar", className: "flex items-center gap-3 border-b border-border px-4 py-2.5", children: [_jsx("span", { "data-slot": "live-demo-chrome", "aria-hidden": "true", className: "flex gap-1.5", children: [0, 1, 2].map((i) => (_jsx("span", { className: "size-2.5 rounded-full bg-muted-foreground/40" }, i))) }), title ? (_jsx("span", { "data-slot": "live-demo-title", className: "font-mono text-[10px] tracking-[0.08em] text-muted-foreground uppercase", children: title })) : null] }), live ? (_jsxs("div", { "data-slot": "live-demo-chip", className: "flex items-center gap-2 border-b border-border px-4 py-2.5 font-mono text-[9.5px] tracking-[0.08em] text-[var(--nc-link-deep)] uppercase", children: [_jsx("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-primary motion-safe:animate-pulse" }), live] })) : null, _jsx("div", { "data-slot": "live-demo-rows", className: "flex flex-col", children: children })] }));
22
+ }
23
+ const ROW_TINT = {
24
+ done: "bg-[var(--nc-link-bg-soft)] text-[var(--nc-link-deep)]",
25
+ waiting: "bg-[var(--nc-warning-soft)] text-[var(--nc-warning-deep)]",
26
+ };
27
+ function LiveDemoRow({ status = "done", label, tag, className, children, ...props }) {
28
+ return (_jsxs("div", { "data-slot": "live-demo-row", "data-status": status, className: cn("flex items-center justify-between gap-3 border-t border-border px-4 py-3 first:border-t-0", className), ...props, children: [label ? (_jsx("span", { "data-slot": "live-demo-row-label", className: "font-mono text-[11px] text-foreground", children: label })) : null, tag ? (_jsx("span", { "data-slot": "live-demo-row-tag", className: cn("shrink-0 px-2 py-0.5 font-mono text-[10px] tracking-[0.06em] uppercase", ROW_TINT[status]), children: tag })) : null, children] }));
29
+ }
30
+ export { LiveDemoWindow, LiveDemoRow };
@@ -9,15 +9,25 @@ import * as React from "react";
9
9
  * both and the two names below keep the section vocabulary distinct (matching the
10
10
  * retired CSS, which kept two section files over identical primitives).
11
11
  *
12
+ * V5 logo-cloud usage: a caller stacks a mono `LogoBandLabel` caption above each
13
+ * auto-fit tile row (`columns="auto"`), e.g. "the tools you already use" over one
14
+ * row and "many models, no lock-in" over the next — the two-row composition is the
15
+ * caller's, this component only owns one labelled tile wall.
16
+ *
12
17
  * SINGLE-OWNER SEAM: the grid owns every divider once (`gap-px bg-border`). Each
13
18
  * `LogoTile` is borderless and square-cornered. `surface="ink"` flips only the
14
19
  * seam colour, never its weight. Token-only; no `dark:` styling.
15
20
  */
16
21
  declare function LogoGrid({ className, columns, surface, ...props }: React.ComponentProps<"div"> & {
17
- columns?: 2 | 3 | 4 | 5 | 6;
22
+ columns?: 2 | 3 | 4 | 5 | 6 | "auto";
18
23
  surface?: "canvas" | "ink";
19
24
  }): React.JSX.Element;
20
25
  declare function LogoBand({ ...props }: React.ComponentProps<typeof LogoGrid>): React.JSX.Element;
21
26
  declare function IntegrationsGrid({ ...props }: React.ComponentProps<typeof LogoGrid>): React.JSX.Element;
22
- export { LogoBand, IntegrationsGrid };
27
+ /**
28
+ * LogoBandLabel — the mono caption row that sits above a tile wall (V5 `.lab`).
29
+ * Small uppercase mono in the muted role; the caller supplies the words.
30
+ */
31
+ declare function LogoBandLabel({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
32
+ export { LogoBand, IntegrationsGrid, LogoBandLabel };
23
33
  //# sourceMappingURL=logo-band.d.ts.map
@@ -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,CAAC;AAa/B;;;;;;;;;;;;;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,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC5B,qBAYA;AAED,iBAAS,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEpE;AAED,iBAAS,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAE5E;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"logo-band.d.ts","sourceRoot":"","sources":["../../src/components/logo-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B;;;;;;;;;;;;;;;;;;GAkBG;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,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC5B,qBAYA;AAED,iBAAS,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEpE;AAED,iBAAS,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAE5E;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQxE;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
@@ -7,6 +7,9 @@ const LOGO_GRID_COLUMNS = {
7
7
  4: "grid-cols-2 sm:grid-cols-4",
8
8
  5: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
9
9
  6: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",
10
+ // V5 auto-fit tile row: cells flow at a minimum comfortable width and share the
11
+ // free space, so a 7-mark row and a 6-mark row both stay optically even.
12
+ auto: "grid-cols-[repeat(auto-fit,minmax(130px,1fr))]",
10
13
  };
11
14
  /**
12
15
  * logo-band / integrations-grid — wall of monochrome marks (replaces the retired
@@ -18,6 +21,11 @@ const LOGO_GRID_COLUMNS = {
18
21
  * both and the two names below keep the section vocabulary distinct (matching the
19
22
  * retired CSS, which kept two section files over identical primitives).
20
23
  *
24
+ * V5 logo-cloud usage: a caller stacks a mono `LogoBandLabel` caption above each
25
+ * auto-fit tile row (`columns="auto"`), e.g. "the tools you already use" over one
26
+ * row and "many models, no lock-in" over the next — the two-row composition is the
27
+ * caller's, this component only owns one labelled tile wall.
28
+ *
21
29
  * SINGLE-OWNER SEAM: the grid owns every divider once (`gap-px bg-border`). Each
22
30
  * `LogoTile` is borderless and square-cornered. `surface="ink"` flips only the
23
31
  * seam colour, never its weight. Token-only; no `dark:` styling.
@@ -31,4 +39,11 @@ function LogoBand({ ...props }) {
31
39
  function IntegrationsGrid({ ...props }) {
32
40
  return _jsx(LogoGrid, { "data-slot": "integrations-grid", ...props });
33
41
  }
34
- export { LogoBand, IntegrationsGrid };
42
+ /**
43
+ * LogoBandLabel — the mono caption row that sits above a tile wall (V5 `.lab`).
44
+ * Small uppercase mono in the muted role; the caller supplies the words.
45
+ */
46
+ function LogoBandLabel({ className, ...props }) {
47
+ return (_jsx("p", { "data-slot": "logo-band-label", className: cn("nc-type-caption-mono uppercase text-muted-foreground", className), ...props }));
48
+ }
49
+ export { LogoBand, IntegrationsGrid, LogoBandLabel };
@@ -1 +1 @@
1
- {"version":3,"file":"logo-tile.d.ts","sourceRoot":"","sources":["../../src/components/logo-tile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;GASG;AAEH,iBAAS,QAAQ,CAAC,EAChB,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,YAAY,CAAC,EACpB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY/D;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ5E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ1E;AAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"logo-tile.d.ts","sourceRoot":"","sources":["../../src/components/logo-tile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;GASG;AAEH,iBAAS,QAAQ,CAAC,EAChB,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,YAAY,CAAC,EACpB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAc/D;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ5E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ1E;AAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
@@ -14,12 +14,15 @@ function LogoTile({ className, surface = "canvas", ...props }) {
14
14
  return (_jsx("div", { "data-slot": "logo-tile", "data-surface": surface, className: cn("grid min-h-24 place-content-center justify-items-center gap-2 p-[18px]", surface === "ink" ? "bg-primary" : "bg-card", className), ...props }));
15
15
  }
16
16
  function LogoTileMark({ className, surface = "canvas", ...props }) {
17
- return (_jsx("span", { "data-slot": "logo-tile-mark", className: cn("block h-7 w-auto [&_svg]:h-full [&_svg]:w-auto [&_img]:h-full [&_img]:w-auto", surface === "ink" ? "text-[var(--nc-canvas)]" : "text-[var(--nc-body)]", className), ...props }));
17
+ return (_jsx("span", { "data-slot": "logo-tile-mark", className: cn("block h-7 w-auto [&_svg]:h-full [&_svg]:w-auto [&_img]:h-full [&_img]:w-auto",
18
+ // Semantic roles keep the mark's purpose explicit: on ink (verde) it
19
+ // reads as on-primary; on canvas it reads as muted body.
20
+ surface === "ink" ? "text-primary-foreground" : "text-muted-foreground", className), ...props }));
18
21
  }
19
22
  function LogoTileMetric({ className, ...props }) {
20
23
  return (_jsx("span", { "data-slot": "logo-tile-metric", className: cn("font-mono text-xs uppercase text-muted-foreground", className), ...props }));
21
24
  }
22
25
  function LogoTileName({ className, ...props }) {
23
- return (_jsx("span", { "data-slot": "logo-tile-name", className: cn("text-[13px] leading-4 text-[var(--nc-body)]", className), ...props }));
26
+ return (_jsx("span", { "data-slot": "logo-tile-name", className: cn("text-[13px] leading-4 text-muted-foreground", className), ...props }));
24
27
  }
25
28
  export { LogoTile, LogoTileMark, LogoTileMetric, LogoTileName };
@@ -1,16 +1,22 @@
1
1
  import * as React from "react";
2
2
  /**
3
- * nav-bar — sticky top navigation chrome (replaces the retired `.nc-nav-bar`).
3
+ * nav-bar — the fixed, always-dark glass navigation bar (V5).
4
4
  *
5
5
  * A three-track grid (`1fr auto 1fr`): logo lockup leading, route links centered,
6
- * CTA cluster trailing. SINGLE-OWNER SEAM: the only edge it owns is its bottom
7
- * border (`border-b border-border`) it draws no other line. The surface is the
8
- * translucent canvas + blur (an 8% transparency mix of the brand canvas), so the
9
- * chrome reads as one continuous bar. Below ~960px the centered links slot hides and
10
- * the grid collapses to logo + CTA.
6
+ * CTA cluster trailing. It is a PERMANENT dark glass bar regardless of the page
7
+ * section it floats over, so the root carries its own `dark` ancestor class and
8
+ * resolves every surface from semantic roles (`bg-background`, `text-foreground`,
9
+ * `border-border`). The glass is the dark canvas at 70% plus a backdrop blur, so
10
+ * the chrome reads as one continuous translucent bar.
11
11
  *
12
- * A11y: links/triggers expose a `--ring` (link-green) focus outline; the consumer
13
- * wraps this in a `<nav aria-label>`. Token-only; no `dark:` styling.
12
+ * SINGLE-OWNER SEAM: the only edge it owns is its bottom border
13
+ * (`border-b border-border`). `position: fixed` pins it to the viewport top; the
14
+ * consuming page owns the top padding that clears it. Below ~960px the centered
15
+ * links slot hides and the grid collapses to logo + CTA.
16
+ *
17
+ * A11y: links/triggers expose a `--ring` focus outline; the consumer wraps this in
18
+ * a `<nav aria-label>`. Token-only; the root sets its own `dark` class (an accepted
19
+ * ancestor-class remap), never `dark:` utilities.
14
20
  */
15
21
  declare function NavBar({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
16
22
  declare function NavBarLogo({ className, ...props }: React.ComponentProps<"a">): React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWrE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAexE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iBAAS,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWrE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAgBxE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
@@ -1,30 +1,36 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  /**
4
- * nav-bar — sticky top navigation chrome (replaces the retired `.nc-nav-bar`).
4
+ * nav-bar — the fixed, always-dark glass navigation bar (V5).
5
5
  *
6
6
  * A three-track grid (`1fr auto 1fr`): logo lockup leading, route links centered,
7
- * CTA cluster trailing. SINGLE-OWNER SEAM: the only edge it owns is its bottom
8
- * border (`border-b border-border`) it draws no other line. The surface is the
9
- * translucent canvas + blur (an 8% transparency mix of the brand canvas), so the
10
- * chrome reads as one continuous bar. Below ~960px the centered links slot hides and
11
- * the grid collapses to logo + CTA.
7
+ * CTA cluster trailing. It is a PERMANENT dark glass bar regardless of the page
8
+ * section it floats over, so the root carries its own `dark` ancestor class and
9
+ * resolves every surface from semantic roles (`bg-background`, `text-foreground`,
10
+ * `border-border`). The glass is the dark canvas at 70% plus a backdrop blur, so
11
+ * the chrome reads as one continuous translucent bar.
12
12
  *
13
- * A11y: links/triggers expose a `--ring` (link-green) focus outline; the consumer
14
- * wraps this in a `<nav aria-label>`. Token-only; no `dark:` styling.
13
+ * SINGLE-OWNER SEAM: the only edge it owns is its bottom border
14
+ * (`border-b border-border`). `position: fixed` pins it to the viewport top; the
15
+ * consuming page owns the top padding that clears it. Below ~960px the centered
16
+ * links slot hides and the grid collapses to logo + CTA.
17
+ *
18
+ * A11y: links/triggers expose a `--ring` focus outline; the consumer wraps this in
19
+ * a `<nav aria-label>`. Token-only; the root sets its own `dark` class (an accepted
20
+ * ancestor-class remap), never `dark:` utilities.
15
21
  */
16
22
  function NavBar({ className, ...props }) {
17
- return (_jsx("div", { "data-slot": "nav-bar", className: cn("sticky top-0 z-20 grid min-h-16 grid-cols-[1fr_auto] items-center gap-4 px-4 py-3 sm:px-6 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]", "border-b border-border bg-[color-mix(in_srgb,var(--nc-canvas)_92%,transparent)] backdrop-blur-[18px]", className), ...props }));
23
+ return (_jsx("div", { "data-slot": "nav-bar", className: cn("dark fixed inset-x-0 top-0 z-30 grid min-h-16 grid-cols-[1fr_auto] items-center gap-4 px-4 py-3 text-foreground sm:px-8 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]", "border-b border-border bg-background/70 backdrop-blur-[14px]", className), ...props }));
18
24
  }
19
25
  function NavBarLogo({ className, ...props }) {
20
26
  return (_jsx("a", { "data-slot": "nav-bar-logo", className: cn("inline-flex w-fit items-center gap-2.5 text-sm font-semibold text-foreground no-underline [&_img]:block [&_img]:h-7 [&_img]:w-auto [&_svg]:block [&_svg]:h-7 [&_svg]:w-auto", className), ...props }));
21
27
  }
22
28
  function NavBarLinks({ className, ...props }) {
23
- return (_jsx("div", { "data-slot": "nav-bar-links", className: cn("hidden items-center justify-center gap-1 text-sm text-[var(--nc-body)] lg:inline-flex",
24
- // each link reads as a flat, neutral pill with hover/focus affordance.
25
- "[&_a]:rounded-[var(--nc-rounded-sm)] [&_a]:px-3 [&_a]:py-2 [&_a]:text-inherit [&_a]:no-underline", "[&_a:hover]:bg-[var(--nc-canvas-soft-2)] [&_a:hover]:text-foreground", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
29
+ return (_jsx("div", { "data-slot": "nav-bar-links", className: cn("hidden items-center justify-center gap-1 text-sm text-muted-foreground lg:inline-flex",
30
+ // each link reads as a flat pill with hover/focus affordance against the glass.
31
+ "[&_a]:rounded-[var(--nc-rounded-sm)] [&_a]:px-3 [&_a]:py-2 [&_a]:text-inherit [&_a]:no-underline [&_a]:transition-colors", "[&_a:hover]:bg-accent [&_a:hover]:text-foreground", "[&_a[data-active]]:text-foreground", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
26
32
  }
27
33
  function NavBarCta({ className, ...props }) {
28
- return (_jsx("div", { "data-slot": "nav-bar-cta", className: cn("inline-flex items-center justify-self-end", className), ...props }));
34
+ return (_jsx("div", { "data-slot": "nav-bar-cta", className: cn("inline-flex items-center gap-3 justify-self-end", className), ...props }));
29
35
  }
30
36
  export { NavBar, NavBarLogo, NavBarLinks, NavBarCta };
@@ -1,22 +1,17 @@
1
1
  import * as React from "react";
2
2
  /**
3
- * pricing-card — the brand pricing/package tier molecule (replaces the retired
4
- * `.nc-pricing-card` / `.nc-pricing-card-featured` CSS).
3
+ * pricing-card — the brand pricing/package tier molecule (V5 rework).
5
4
  *
6
- * A seam-free canvas fill: it drops into the holding `Pricing` grid, which owns
7
- * every hairline divider through its gap-as-seam (`gap-px bg-border`). The card
8
- * therefore draws NO border and has square corners so the grid line never shows
9
- * through a rounded edge matching the retired stat-block / quote-card / logo-tile
10
- * convention. `variant="featured"` flips the surface onto the ink/primary role; the
11
- * red featured RAIL is NOT drawn here — it is a single-owner inset rail owned by the
12
- * `Pricing` section (`emphasis="featured"`), so this molecule only carries the
13
- * surface inversion and never double-draws a seam.
5
+ * A seam-free fill: it drops into the holding `Pricing` grid, which owns every
6
+ * hairline divider through its gap-as-seam (`gap-px bg-border`). The card draws NO
7
+ * border and has square corners so the grid line never shows through a rounded
8
+ * edge. It is a full-height flex column so `PricingCardCta` (`mt-auto`) pins to the
9
+ * bottom and aligns across tiers.
14
10
  *
15
- * Server-renderable (no client boundary): the featured polarity flip is applied by
16
- * the parent card to its descendants via `data-slot` descendant selectors the
17
- * same cascade model the retired CSS used (`.nc-pricing-card-featured .nc-…`), so
18
- * sub-components carry only their default (canvas) tone and the parent re-tints them
19
- * when featured. Token-only; no `dark:` styling.
11
+ * `variant="featured"` (V5) reads as featured through a SOFT canvas surface — a
12
+ * quiet fill change, not an ink/primary polarity flip and not an inset rail. The
13
+ * body/eyebrow/feature tones are identical to the default card; only the surface
14
+ * differs. Server-renderable; token-only; no `dark:` styling.
20
15
  */
21
16
  declare function PricingCard({ className, variant, ...props }: React.ComponentProps<"div"> & {
22
17
  variant?: "default" | "featured";
@@ -1 +1 @@
1
- {"version":3,"file":"pricing-card.d.ts","sourceRoot":"","sources":["../../src/components/pricing-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CAAE,qBAsBpE;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ7E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ5E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAmBrF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ1E;AAED,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ/E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAoBxF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAI3E;AAED,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"pricing-card.d.ts","sourceRoot":"","sources":["../../src/components/pricing-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CAAE,qBAgBpE;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ7E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ5E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAmBrF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ1E;AAED,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ/E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAkBxF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ3E;AAED,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,CAAC"}