@nadicodeai/ui 10.0.0 → 10.0.2

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/README.md +0 -25
  2. package/dist/components/model-mark.js +1 -1
  3. package/dist/components/table.js +1 -1
  4. package/dist/index.d.ts +1 -30
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -30
  7. package/docs/component-classification.md +2 -2
  8. package/docs/contract.md +4 -1
  9. package/docs/product-compositions.md +16 -0
  10. package/package.json +2 -2
  11. package/dist/components/action-band.d.ts +0 -12
  12. package/dist/components/action-band.d.ts.map +0 -1
  13. package/dist/components/action-band.js +0 -48
  14. package/dist/components/card-marketing.d.ts +0 -30
  15. package/dist/components/card-marketing.d.ts.map +0 -1
  16. package/dist/components/card-marketing.js +0 -48
  17. package/dist/components/code-editor-mockup.d.ts +0 -25
  18. package/dist/components/code-editor-mockup.d.ts.map +0 -1
  19. package/dist/components/code-editor-mockup.js +0 -47
  20. package/dist/components/contact.d.ts +0 -32
  21. package/dist/components/contact.d.ts.map +0 -1
  22. package/dist/components/contact.js +0 -46
  23. package/dist/components/faq-item.d.ts +0 -25
  24. package/dist/components/faq-item.d.ts.map +0 -1
  25. package/dist/components/faq-item.js +0 -25
  26. package/dist/components/faq.d.ts +0 -20
  27. package/dist/components/faq.d.ts.map +0 -1
  28. package/dist/components/faq.js +0 -23
  29. package/dist/components/feature-grid.d.ts +0 -23
  30. package/dist/components/feature-grid.d.ts.map +0 -1
  31. package/dist/components/feature-grid.js +0 -33
  32. package/dist/components/feature-rows.d.ts +0 -23
  33. package/dist/components/feature-rows.d.ts.map +0 -1
  34. package/dist/components/feature-rows.js +0 -27
  35. package/dist/components/hero-split.d.ts +0 -23
  36. package/dist/components/hero-split.d.ts.map +0 -1
  37. package/dist/components/hero-split.js +0 -35
  38. package/dist/components/hero.d.ts +0 -28
  39. package/dist/components/hero.d.ts.map +0 -1
  40. package/dist/components/hero.js +0 -45
  41. package/dist/components/integration-flow.d.ts +0 -36
  42. package/dist/components/integration-flow.d.ts.map +0 -1
  43. package/dist/components/integration-flow.js +0 -36
  44. package/dist/components/live-demo.d.ts +0 -31
  45. package/dist/components/live-demo.d.ts.map +0 -1
  46. package/dist/components/live-demo.js +0 -30
  47. package/dist/components/logo-band.d.ts +0 -33
  48. package/dist/components/logo-band.d.ts.map +0 -1
  49. package/dist/components/logo-band.js +0 -49
  50. package/dist/components/logo-tile.d.ts +0 -21
  51. package/dist/components/logo-tile.d.ts.map +0 -1
  52. package/dist/components/logo-tile.js +0 -28
  53. package/dist/components/media-mount.d.ts +0 -13
  54. package/dist/components/media-mount.d.ts.map +0 -1
  55. package/dist/components/media-mount.js +0 -15
  56. package/dist/components/newsletter.d.ts +0 -24
  57. package/dist/components/newsletter.d.ts.map +0 -1
  58. package/dist/components/newsletter.js +0 -31
  59. package/dist/components/pricing-card.d.ts +0 -30
  60. package/dist/components/pricing-card.d.ts.map +0 -1
  61. package/dist/components/pricing-card.js +0 -44
  62. package/dist/components/pricing.d.ts +0 -25
  63. package/dist/components/pricing.d.ts.map +0 -1
  64. package/dist/components/pricing.js +0 -11
  65. package/dist/components/proof-slot.d.ts +0 -8
  66. package/dist/components/proof-slot.d.ts.map +0 -1
  67. package/dist/components/proof-slot.js +0 -8
  68. package/dist/components/quote-card.d.ts +0 -31
  69. package/dist/components/quote-card.d.ts.map +0 -1
  70. package/dist/components/quote-card.js +0 -48
  71. package/dist/components/seam-grid.d.ts +0 -30
  72. package/dist/components/seam-grid.d.ts.map +0 -1
  73. package/dist/components/seam-grid.js +0 -30
  74. package/dist/components/section-intro.d.ts +0 -18
  75. package/dist/components/section-intro.d.ts.map +0 -1
  76. package/dist/components/section-intro.js +0 -22
  77. package/dist/components/security-grid.d.ts +0 -25
  78. package/dist/components/security-grid.d.ts.map +0 -1
  79. package/dist/components/security-grid.js +0 -28
  80. package/dist/components/shift-band.d.ts +0 -14
  81. package/dist/components/shift-band.d.ts.map +0 -1
  82. package/dist/components/shift-band.js +0 -11
  83. package/dist/components/statement.d.ts +0 -32
  84. package/dist/components/statement.d.ts.map +0 -1
  85. package/dist/components/statement.js +0 -40
  86. package/dist/components/steps.d.ts +0 -34
  87. package/dist/components/steps.d.ts.map +0 -1
  88. package/dist/components/steps.js +0 -40
  89. package/dist/components/team-grid.d.ts +0 -27
  90. package/dist/components/team-grid.d.ts.map +0 -1
  91. package/dist/components/team-grid.js +0 -30
  92. package/dist/components/testimonials.d.ts +0 -48
  93. package/dist/components/testimonials.d.ts.map +0 -1
  94. package/dist/components/testimonials.js +0 -58
  95. package/dist/components/texture-strip.d.ts +0 -22
  96. package/dist/components/texture-strip.d.ts.map +0 -1
  97. package/dist/components/texture-strip.js +0 -32
  98. package/dist/lib/seam.d.ts +0 -29
  99. package/dist/lib/seam.d.ts.map +0 -1
  100. package/dist/lib/seam.js +0 -30
@@ -1,47 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- /**
4
- * code-editor-mockup — dark code/terminal preview surface (replaces the retired
5
- * `.nc-code-editor-mockup`). The brand's technical marketing visual: a dark window
6
- * (the ink/primary role) with a chrome/title bar over a mono code body. For
7
- * technical examples, not generic decoration.
8
- *
9
- * SINGLE-OWNER SEAMS: the chrome row owns exactly ONE inner hairline — its own
10
- * bottom border — between itself and the code body. The outer `rounded-md` radius
11
- * is owned once by the root, and `overflow-hidden` clips the chrome's square top
12
- * corners to it. The on-dark hairline + dots + muted-on-dark tints are all DERIVED
13
- * from the brand `line` / `canvas` / `ink` tokens via `color-mix` (the same family
14
- * the retired dark sections use), so no raw literal is introduced. The dots are
15
- * nadicode-monochrome, never the macOS traffic-light colours. Token-only;
16
- * no `dark:` styling.
17
- */
18
- /*
19
- * The on-dark hairline is derived once from the brand line + canvas tokens (mirrors
20
- * the retired local var). It must be written as LITERAL arbitrary-value class
21
- * strings, not interpolated, so Tailwind v4's source scanner detects and generates
22
- * the utilities:
23
- * border -> border-b-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)]
24
- * dots -> bg-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)]
25
- */
26
- function CodeEditorMockup({ className, ...props }) {
27
- return (_jsx("div", { "data-slot": "code-editor-mockup", className: cn("grid content-start overflow-hidden rounded-md bg-primary text-primary-foreground", className), ...props }));
28
- }
29
- function CodeEditorMockupChrome({ className, children, ...props }) {
30
- return (_jsxs("div", { "data-slot": "code-editor-mockup-chrome", className: cn("flex items-center gap-2 border-b border-b-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)] px-6 py-3", className), ...props, children: [_jsxs("span", { "data-slot": "code-editor-mockup-dots", "aria-hidden": "true", className: "flex flex-none gap-2", children: [_jsx("span", { className: "size-[11px] rounded-full bg-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)]" }), _jsx("span", { className: "size-[11px] rounded-full bg-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)]" }), _jsx("span", { className: "size-[11px] rounded-full bg-[color-mix(in_srgb,var(--nc-line)_24%,var(--nc-canvas)_22%)]" })] }), children] }));
31
- }
32
- function CodeEditorMockupTitle({ className, ...props }) {
33
- return (_jsx("span", { "data-slot": "code-editor-mockup-title", className: cn("ml-1 font-mono text-xs text-[color-mix(in_srgb,var(--nc-canvas)_60%,var(--nc-ink))]", className), ...props }));
34
- }
35
- function CodeEditorMockupBody({ className, ...props }) {
36
- return (_jsx("pre", { "data-slot": "code-editor-mockup-body", className: cn("m-0 overflow-x-auto whitespace-pre p-6 font-mono text-sm text-primary-foreground [tab-size:2]", className), ...props }));
37
- }
38
- function CodeEditorMockupLine({ className, ...props }) {
39
- return _jsx("span", { "data-slot": "code-editor-mockup-line", className: cn("block", className), ...props });
40
- }
41
- function CodeEditorMockupGutter({ className, ...props }) {
42
- return (_jsx("span", { "data-slot": "code-editor-mockup-gutter", "aria-hidden": "true", className: cn("mr-4 inline-block w-[2ch] select-none text-right text-[color-mix(in_srgb,var(--nc-canvas)_40%,var(--nc-ink))]", className), ...props }));
43
- }
44
- function CodeEditorMockupComment({ className, ...props }) {
45
- return (_jsx("span", { "data-slot": "code-editor-mockup-comment", className: cn("text-[color-mix(in_srgb,var(--nc-canvas)_50%,var(--nc-ink))]", className), ...props }));
46
- }
47
- export { CodeEditorMockup, CodeEditorMockupChrome, CodeEditorMockupTitle, CodeEditorMockupBody, CodeEditorMockupLine, CodeEditorMockupGutter, CodeEditorMockupComment, };
@@ -1,32 +0,0 @@
1
- import * as React from "react";
2
- /**
3
- * contact — the closing contact section (V5 B18).
4
- *
5
- * A 5fr / 7fr split: a text column (`ContactIntro` — eyebrow/title/body/location)
6
- * beside a form column (`ContactForm`) that sits on its own soft, bordered panel.
7
- * The split is a whitespace gap, never a hairline, so `Contact` owns NO structural
8
- * seam — the frame/lane/row perimeter is owned by the kept geometry layer this
9
- * composes inside, and every visible border is a control/panel perimeter.
10
- *
11
- * The form is presentational only (no submit wiring): consumers own the action and
12
- * state. Fields use the package `Input`/`Textarea` primitives; labels use the mono
13
- * uppercase `ContactLabel`. `ContactFieldRow` is the 2-up Name/Company row.
14
- * Token-only; no `dark:` styling.
15
- */
16
- declare function Contact({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
17
- /** ContactIntro — the text column: eyebrow/title/body/location, centered vertically. */
18
- declare function ContactIntro({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
19
- /** ContactLocation — the mono location line under the intro body. */
20
- declare function ContactLocation({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
21
- declare function ContactForm({ className, columns, ...props }: React.ComponentProps<"form"> & {
22
- columns?: 1 | 2;
23
- }): React.JSX.Element;
24
- /** ContactFieldRow — the 2-up Name/Company row inside a single-column form. */
25
- declare function ContactFieldRow({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
26
- /** ContactField — one label-over-control field cell. */
27
- declare function ContactField({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
28
- /** ContactLabel — mono uppercase form label (server-safe plain `<label>`). */
29
- declare function ContactLabel({ className, ...props }: React.ComponentProps<"label">): React.JSX.Element;
30
- declare function ContactActions({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
31
- export { Contact, ContactIntro, ContactLocation, ContactForm, ContactFieldRow, ContactField, ContactLabel, ContactActions, };
32
- //# sourceMappingURL=contact.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../src/components/contact.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWpE;AAED,wFAAwF;AACxF,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQzE;AAED,qEAAqE;AACrE,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAW1E;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,qBAapD;AAED,+EAA+E;AAC/E,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ5E;AAED,wDAAwD;AACxD,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAIzE;AAED,8EAA8E;AAC9E,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,qBAW3E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ3E;AAED,OAAO,EACL,OAAO,EACP,YAAY,EACZ,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,CAAC"}
@@ -1,46 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- /**
4
- * contact — the closing contact section (V5 B18).
5
- *
6
- * A 5fr / 7fr split: a text column (`ContactIntro` — eyebrow/title/body/location)
7
- * beside a form column (`ContactForm`) that sits on its own soft, bordered panel.
8
- * The split is a whitespace gap, never a hairline, so `Contact` owns NO structural
9
- * seam — the frame/lane/row perimeter is owned by the kept geometry layer this
10
- * composes inside, and every visible border is a control/panel perimeter.
11
- *
12
- * The form is presentational only (no submit wiring): consumers own the action and
13
- * state. Fields use the package `Input`/`Textarea` primitives; labels use the mono
14
- * uppercase `ContactLabel`. `ContactFieldRow` is the 2-up Name/Company row.
15
- * Token-only; no `dark:` styling.
16
- */
17
- function Contact({ className, ...props }) {
18
- return (_jsx("div", { "data-slot": "contact", className: cn("grid min-w-0 grid-cols-1 items-stretch gap-x-[clamp(32px,5vw,72px)] gap-y-10 lg:grid-cols-[5fr_7fr]", className), ...props }));
19
- }
20
- /** ContactIntro — the text column: eyebrow/title/body/location, centered vertically. */
21
- function ContactIntro({ className, ...props }) {
22
- return (_jsx("div", { "data-slot": "contact-intro", className: cn("grid min-w-0 content-center gap-4", className), ...props }));
23
- }
24
- /** ContactLocation — the mono location line under the intro body. */
25
- function ContactLocation({ className, ...props }) {
26
- return (_jsx("p", { "data-slot": "contact-location", className: cn("m-0 font-mono text-xs uppercase tracking-[0.1em] text-muted-foreground", className), ...props }));
27
- }
28
- function ContactForm({ className, columns = 1, ...props }) {
29
- return (_jsx("form", { "data-slot": "contact-form", "data-columns": columns, className: cn("grid min-w-0 gap-4 rounded-md border border-border bg-muted p-[clamp(20px,3vw,32px)] text-left", columns === 2 && "sm:grid-cols-2", className), ...props }));
30
- }
31
- /** ContactFieldRow — the 2-up Name/Company row inside a single-column form. */
32
- function ContactFieldRow({ className, ...props }) {
33
- return (_jsx("div", { "data-slot": "contact-field-row", className: cn("grid grid-cols-1 gap-4 sm:grid-cols-2", className), ...props }));
34
- }
35
- /** ContactField — one label-over-control field cell. */
36
- function ContactField({ className, ...props }) {
37
- return (_jsx("div", { "data-slot": "contact-field", className: cn("grid min-w-0 gap-1.5", className), ...props }));
38
- }
39
- /** ContactLabel — mono uppercase form label (server-safe plain `<label>`). */
40
- function ContactLabel({ className, ...props }) {
41
- return (_jsx("label", { "data-slot": "contact-label", className: cn("font-mono text-[9.5px] font-medium uppercase tracking-[0.12em] text-muted-foreground", className), ...props }));
42
- }
43
- function ContactActions({ className, ...props }) {
44
- return (_jsx("div", { "data-slot": "contact-actions", className: cn("mt-1 grid sm:col-span-2 [&>button]:w-full", className), ...props }));
45
- }
46
- export { Contact, ContactIntro, ContactLocation, ContactForm, ContactFieldRow, ContactField, ContactLabel, ContactActions, };
@@ -1,25 +0,0 @@
1
- import * as React from "react";
2
- /**
3
- * faq-item — native-<details> accordion entry (replaces the retired `.nc-faq-item`).
4
- *
5
- * Uses native `<details>`/`<summary>` semantics: exclusive-open is the browser's
6
- * native `<details name="…">` group behaviour (no JS toggle), and the disclosure
7
- * carries its own ARIA — `<summary>` exposes the expanded/collapsed state to AT, so
8
- * an explicit `aria-expanded` is redundant (and we set it as well off the `open`
9
- * prop for callers that inspect it). A11y: keyboard-operable by default (Enter /
10
- * Space on the summary); focus-visible takes the global base-layer outline.
11
- *
12
- * Seam ownership: the holding `Faq` grid owns the hairline BETWEEN items
13
- * (gap-as-seam), so this draws no inter-item border. The only seam the item owns is
14
- * the internal hairline between its summary and answer (the answer's `border-t`),
15
- * bounded inside the item and revealed only when open. The native disclosure
16
- * triangle is hidden; a `+`/`−` bar marker carries the affordance. Token-only;
17
- * no `dark:` styling.
18
- */
19
- declare function FaqItem({ className, question, name, open, children, ...props }: Omit<React.ComponentProps<"details">, "name"> & {
20
- question: React.ReactNode;
21
- /** native exclusive-accordion group name; all items in one Faq share it */
22
- name?: string;
23
- }): React.JSX.Element;
24
- export { FaqItem };
25
- //# sourceMappingURL=faq-item.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"faq-item.d.ts","sourceRoot":"","sources":["../../src/components/faq-item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,GAAG;IACjD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,qBA6BA;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -1,25 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- /**
4
- * faq-item — native-<details> accordion entry (replaces the retired `.nc-faq-item`).
5
- *
6
- * Uses native `<details>`/`<summary>` semantics: exclusive-open is the browser's
7
- * native `<details name="…">` group behaviour (no JS toggle), and the disclosure
8
- * carries its own ARIA — `<summary>` exposes the expanded/collapsed state to AT, so
9
- * an explicit `aria-expanded` is redundant (and we set it as well off the `open`
10
- * prop for callers that inspect it). A11y: keyboard-operable by default (Enter /
11
- * Space on the summary); focus-visible takes the global base-layer outline.
12
- *
13
- * Seam ownership: the holding `Faq` grid owns the hairline BETWEEN items
14
- * (gap-as-seam), so this draws no inter-item border. The only seam the item owns is
15
- * the internal hairline between its summary and answer (the answer's `border-t`),
16
- * bounded inside the item and revealed only when open. The native disclosure
17
- * triangle is hidden; a `+`/`−` bar marker carries the affordance. Token-only;
18
- * no `dark:` styling.
19
- */
20
- function FaqItem({ className, question, name, open, children, ...props }) {
21
- return (_jsxs("details", { "data-slot": "faq-item", name: name, open: open, className: cn("group bg-muted [&_summary::-webkit-details-marker]:hidden", className), ...props, children: [_jsx("summary", { className: cn("flex min-h-16 cursor-pointer list-none items-center justify-between gap-4 px-5 py-4", "text-base font-medium text-foreground transition-colors hover:text-[var(--nc-link)]",
22
- // +/- marker: two crossed bars; the vertical bar hides when open (+ -> -)
23
- "after:size-3 after:flex-none after:bg-[length:12px_1px,1px_12px] after:bg-center after:bg-no-repeat", "after:[background-image:linear-gradient(var(--muted-foreground),var(--muted-foreground)),linear-gradient(var(--muted-foreground),var(--muted-foreground))]", "group-open:after:bg-[length:12px_1px] group-open:after:[background-image:linear-gradient(var(--muted-foreground),var(--muted-foreground))]"), children: question }), _jsx("div", { "data-slot": "faq-item-answer", className: "border-t border-border px-5 pt-4 pb-5 text-sm text-muted-foreground", children: children })] }));
24
- }
25
- export { FaqItem };
@@ -1,20 +0,0 @@
1
- import * as React from "react";
2
- /**
3
- * faq — single-column question/answer accordion (replaces the retired
4
- * `sections/faq.css` + its coupled `faq-item` rows).
5
- *
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).
12
- *
13
- * READING COLUMN (V5 B16): the faq is centered in a narrow 760px reading column
14
- * (`max-w-[760px] mx-auto`) rather than spanning the full lane. The soft surface is
15
- * carried by the `FaqItem` fills (`bg-muted`), so the column reads as a soft stack of
16
- * hairline-separated questions. Token-only; no `dark:` styling.
17
- */
18
- declare function Faq({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
19
- export { Faq };
20
- //# sourceMappingURL=faq.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../src/components/faq.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;GAeG;AAEH,iBAAS,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQhE;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -1,23 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- import { SeamGrid } from "./seam-grid.js";
4
- /**
5
- * faq — single-column question/answer accordion (replaces the retired
6
- * `sections/faq.css` + its coupled `faq-item` rows).
7
- *
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).
14
- *
15
- * READING COLUMN (V5 B16): the faq is centered in a narrow 760px reading column
16
- * (`max-w-[760px] mx-auto`) rather than spanning the full lane. The soft surface is
17
- * carried by the `FaqItem` fills (`bg-muted`), so the column reads as a soft stack of
18
- * hairline-separated questions. Token-only; no `dark:` styling.
19
- */
20
- function Faq({ className, ...props }) {
21
- return (_jsx(SeamGrid, { "data-slot": "faq", className: cn("mx-auto h-full max-w-[760px] grid-cols-1", className), ...props }));
22
- }
23
- export { Faq };
@@ -1,23 +0,0 @@
1
- import * as React from "react";
2
- declare function FeatureGrid({ eyebrow, intro, closing, link, columns, children, className, ...props }: React.ComponentProps<"div"> & {
3
- eyebrow?: React.ReactNode;
4
- intro?: React.ReactNode;
5
- closing?: React.ReactNode;
6
- link?: React.ReactNode;
7
- columns?: 2 | 3 | 4;
8
- }): React.JSX.Element;
9
- /**
10
- * FeatureCard — one peer card: a verde-accent index chip using the canonical
11
- * `--nc-link-deep` pair (deep verde on light, bright verde on dark), a title, a body
12
- * paragraph, and an optional bottom visual slot pinned to the card's foot
13
- * (`mt-auto`). Every part renders only when its content is present; with no visual
14
- * the card sizes to its copy over a modest min-height so a peer row stays balanced
15
- * (no cavernous empty foot).
16
- */
17
- declare function FeatureCard({ index, title, visual, children, className, ...props }: React.ComponentProps<"div"> & {
18
- index?: React.ReactNode;
19
- title?: React.ReactNode;
20
- visual?: React.ReactNode;
21
- }): React.JSX.Element;
22
- export { FeatureGrid, FeatureCard };
23
- //# sourceMappingURL=feature-grid.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-grid.d.ts","sourceRoot":"","sources":["../../src/components/feature-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAsB/B,iBAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,OAAO,EACP,IAAI,EACJ,OAAW,EACX,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CACrB,qBA+BA;AAED;;;;;;;GAOG;AACH,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,KAAK,EACL,MAAM,EACN,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,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B,qBAmCA;AAED,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC"}
@@ -1,33 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- import { SeamGrid } from "./seam-grid.js";
4
- /**
5
- * feature-grid — an indexed head row over a wall of seamed peer cards, closed by
6
- * a line of copy and an arrow-link slot (V5 B06).
7
- *
8
- * The head (mono eyebrow + intro paragraph) and the close (a trailing line plus a
9
- * caller-supplied link) are optional slots; absent, they render nothing. The cards
10
- * are `FeatureCard` peers laid in a SINGLE-OWNER SEAM grid (`SeamGrid`, `gap-px
11
- * bg-border`), so every divider is owned once and the cards stay borderless fills.
12
- * Token-only; no `dark:` styling.
13
- */
14
- const columnClasses = {
15
- 2: "grid-cols-1 md:grid-cols-2",
16
- 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
17
- 4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",
18
- };
19
- function FeatureGrid({ eyebrow, intro, closing, link, columns = 3, children, className, ...props }) {
20
- return (_jsxs("div", { "data-slot": "feature-grid", className: cn("grid gap-8", className), ...props, children: [eyebrow != null || intro != null ? (_jsxs("div", { "data-slot": "feature-grid-head", className: "grid gap-3", children: [eyebrow != null ? (_jsx("p", { className: "nc-type-label-mono uppercase text-muted-foreground", children: eyebrow })) : null, intro != null ? (_jsx("p", { className: "nc-type-body-md max-w-[64ch] text-muted-foreground", children: intro })) : null] })) : null, _jsx(SeamGrid, { "data-slot": "feature-grid-cards", className: columnClasses[columns], children: children }), closing != null || link != null ? (_jsxs("div", { "data-slot": "feature-grid-close", className: "flex flex-wrap items-baseline gap-x-3 gap-y-2", children: [closing != null ? (_jsx("span", { className: "nc-type-body-md text-muted-foreground", children: closing })) : null, link] })) : null] }));
21
- }
22
- /**
23
- * FeatureCard — one peer card: a verde-accent index chip using the canonical
24
- * `--nc-link-deep` pair (deep verde on light, bright verde on dark), a title, a body
25
- * paragraph, and an optional bottom visual slot pinned to the card's foot
26
- * (`mt-auto`). Every part renders only when its content is present; with no visual
27
- * the card sizes to its copy over a modest min-height so a peer row stays balanced
28
- * (no cavernous empty foot).
29
- */
30
- function FeatureCard({ index, title, visual, children, className, ...props }) {
31
- return (_jsxs("div", { "data-slot": "feature-card", className: cn("flex min-h-[200px] flex-col gap-4 bg-card p-[clamp(20px,2.4vw,32px)]", className), ...props, children: [index != null ? (_jsx("span", { "data-slot": "feature-card-index", className: "nc-type-label-mono text-[var(--nc-link-deep)]", children: index })) : null, title != null ? (_jsx("h3", { "data-slot": "feature-card-title", className: "nc-type-heading-md text-foreground", children: title })) : null, children != null ? (_jsx("p", { "data-slot": "feature-card-body", className: "nc-type-body-sm text-muted-foreground", children: children })) : null, visual != null ? (_jsx("div", { "data-slot": "feature-card-visual", className: "mt-auto", children: visual })) : null] }));
32
- }
33
- export { FeatureGrid, FeatureCard };
@@ -1,23 +0,0 @@
1
- import * as React from "react";
2
- /**
3
- * feature-rows — alternating text↔art rows (V5 B07).
4
- *
5
- * Each `FeatureRow` is a two-cell split: a copy cell and a dotted-texture art
6
- * panel. The default row runs text (narrow, 5fr) beside art (wide, 7fr); `flip`
7
- * swaps the visual order so the art sits on the wide left track and the text on
8
- * the narrow right — while text always leads in the DOM so it reads first when the
9
- * row stacks to one column.
10
- *
11
- * SINGLE-OWNER SEAM: the split divider is the `SeamGrid` gap-as-seam. The art panel
12
- * is a container-only slot — the chat/export specimens are caller content, never
13
- * baked in; an empty panel is just the dotted texture. Token-only; no `dark:`
14
- * styling.
15
- */
16
- declare function FeatureRows({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
17
- declare function FeatureRow({ flip, text, art, className, ...props }: React.ComponentProps<"div"> & {
18
- flip?: boolean;
19
- text?: React.ReactNode;
20
- art?: React.ReactNode;
21
- }): React.JSX.Element;
22
- export { FeatureRows, FeatureRow };
23
- //# sourceMappingURL=feature-rows.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feature-rows.d.ts","sourceRoot":"","sources":["../../src/components/feature-rows.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAExE;AAED,iBAAS,UAAU,CAAC,EAClB,IAAY,EACZ,IAAI,EACJ,GAAG,EACH,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB,qBA+BA;AAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC"}
@@ -1,27 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- import { SeamGrid } from "./seam-grid.js";
4
- /**
5
- * feature-rows — alternating text↔art rows (V5 B07).
6
- *
7
- * Each `FeatureRow` is a two-cell split: a copy cell and a dotted-texture art
8
- * panel. The default row runs text (narrow, 5fr) beside art (wide, 7fr); `flip`
9
- * swaps the visual order so the art sits on the wide left track and the text on
10
- * the narrow right — while text always leads in the DOM so it reads first when the
11
- * row stacks to one column.
12
- *
13
- * SINGLE-OWNER SEAM: the split divider is the `SeamGrid` gap-as-seam. The art panel
14
- * is a container-only slot — the chat/export specimens are caller content, never
15
- * baked in; an empty panel is just the dotted texture. Token-only; no `dark:`
16
- * styling.
17
- */
18
- function FeatureRows({ className, ...props }) {
19
- return _jsx("div", { "data-slot": "feature-rows", className: cn("grid", className), ...props });
20
- }
21
- function FeatureRow({ flip = false, text, art, className, ...props }) {
22
- return (_jsxs(SeamGrid, { "data-slot": "feature-row", "data-flip": flip || undefined, className: cn("min-h-[520px] grid-cols-1", flip ? "lg:grid-cols-[7fr_5fr]" : "lg:grid-cols-[5fr_7fr]", className), ...props, children: [_jsx("div", { "data-slot": "feature-row-text", className: cn("nc-panel-cell bg-card", flip && "lg:order-2"), children: text }), _jsx("div", { "data-slot": "feature-row-art", className: cn(
23
- // The semantic card fill and the raw `--nc-*` tokens used by
24
- // `nc-dotted-field` both flip under any `.dark` ancestor.
25
- "nc-dotted-field grid place-items-center overflow-hidden bg-card p-[clamp(24px,4vw,56px)]", flip && "lg:order-1"), children: art })] }));
26
- }
27
- export { FeatureRows, FeatureRow };
@@ -1,23 +0,0 @@
1
- import * as React from "react";
2
- /**
3
- * hero-split — the page-opening hero (replaces the retired `sections/hero-split.css`).
4
- *
5
- * A two-cell split: a copy cell (kicker, headline, lead, CTA row) beside an
6
- * image-dominant visual cell. SINGLE-OWNER SEAM: the single divider between the two
7
- * cells is the cell-grid gap-as-seam — the panel paints the brand `line` behind the
8
- * cells (`bg-border`) and leaves a 1px guide gap (`gap-px`), so the only visible
9
- * line at that coordinate is the one the grid draws.
10
- * The frame/lane/row perimeter is owned by the kept geometry layer; the hero adds no
11
- * competing border.
12
- *
13
- * Image-dominant by intent: on desktop the copy cell takes the narrower track and
14
- * the visual cell the wider one (`1fr / 1.5fr`). The visual cell is a FLUSH mount —
15
- * no padding, no inset — so the image (the kept design-system `image`/`.nc-image`
16
- * CSS atom the caller drops into `HeroSplitVisual`) fills the cell edge to edge and
17
- * is the hero's surface, not a padded stamp. Token-only; no `dark:` styling.
18
- */
19
- declare function HeroSplit({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
20
- declare function HeroSplitCopy({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
21
- declare function HeroSplitVisual({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
22
- export { HeroSplit, HeroSplitCopy, HeroSplitVisual };
23
- //# sourceMappingURL=hero-split.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hero-split.d.ts","sourceRoot":"","sources":["../../src/components/hero-split.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;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,CAAC"}
@@ -1,35 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- import { SeamGrid } from "./seam-grid.js";
4
- /**
5
- * hero-split — the page-opening hero (replaces the retired `sections/hero-split.css`).
6
- *
7
- * A two-cell split: a copy cell (kicker, headline, lead, CTA row) beside an
8
- * image-dominant visual cell. SINGLE-OWNER SEAM: the single divider between the two
9
- * cells is the cell-grid gap-as-seam — the panel paints the brand `line` behind the
10
- * cells (`bg-border`) and leaves a 1px guide gap (`gap-px`), so the only visible
11
- * line at that coordinate is the one the grid draws.
12
- * The frame/lane/row perimeter is owned by the kept geometry layer; the hero adds no
13
- * competing border.
14
- *
15
- * Image-dominant by intent: on desktop the copy cell takes the narrower track and
16
- * the visual cell the wider one (`1fr / 1.5fr`). The visual cell is a FLUSH mount —
17
- * no padding, no inset — so the image (the kept design-system `image`/`.nc-image`
18
- * CSS atom the caller drops into `HeroSplitVisual`) fills the cell edge to edge and
19
- * is the hero's surface, not a padded stamp. Token-only; no `dark:` styling.
20
- */
21
- function HeroSplit({ className, ...props }) {
22
- return (_jsx(SeamGrid, { "data-slot": "hero-split", className: cn(
23
- // The panel owns internal seams only; the page/frame/hatch rail owns the perimeter.
24
- "min-h-[inherit] min-w-0 grid-cols-1 sm:grid-cols-[minmax(0,1fr)_minmax(0,1.5fr)]", className), ...props }));
25
- }
26
- function HeroSplitCopy({ className, ...props }) {
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 }));
28
- }
29
- function HeroSplitVisual({ className, ...props }) {
30
- return (_jsx("div", { "data-slot": "hero-split-visual", className: cn(
31
- // flush mount: no padding/inset; the image fills the cell. canvas shows only
32
- // until the image covers it. the kept `.nc-image` atom self-sizes here.
33
- "grid min-w-0 overflow-hidden bg-card [&_.nc-image]:h-full", className), ...props }));
34
- }
35
- export { HeroSplit, HeroSplitCopy, HeroSplitVisual };
@@ -1,28 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,45 +0,0 @@
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]:size-full [&_img]:object-cover [&_svg]:size-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-label-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 };
@@ -1,36 +0,0 @@
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
@@ -1 +0,0 @@
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;AAyDF,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"}
@@ -1,36 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { cn } from "../lib/utils.js";
3
- const NODE_BORDER_CLASS = {
4
- neutral: "border-border",
5
- primary: "border-primary",
6
- warning: "border-warning",
7
- };
8
- const NODE_CHIP_CLASS = {
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_CLASS[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_CLASS[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_CLASS = {
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_CLASS[tone], className), ...props }));
35
- }
36
- export { IntegrationFlow, IntegrationFlowLegend, IntegrationFlowLegendPill };