@nadicodeai/ui 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) 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/stat-block.d.ts +9 -5
  66. package/dist/components/stat-block.d.ts.map +1 -1
  67. package/dist/components/stat-block.js +12 -6
  68. package/dist/components/statement.d.ts +32 -0
  69. package/dist/components/statement.d.ts.map +1 -0
  70. package/dist/components/statement.js +40 -0
  71. package/dist/components/stats-band.d.ts +6 -2
  72. package/dist/components/stats-band.d.ts.map +1 -1
  73. package/dist/components/stats-band.js +10 -3
  74. package/dist/components/status-dot.js +4 -4
  75. package/dist/components/steps.d.ts +34 -0
  76. package/dist/components/steps.d.ts.map +1 -0
  77. package/dist/components/steps.js +40 -0
  78. package/dist/components/team-grid.d.ts +27 -0
  79. package/dist/components/team-grid.d.ts.map +1 -0
  80. package/dist/components/team-grid.js +30 -0
  81. package/dist/components/testimonials.d.ts +39 -12
  82. package/dist/components/testimonials.d.ts.map +1 -1
  83. package/dist/components/testimonials.js +46 -13
  84. package/dist/components/texture-strip.d.ts +22 -0
  85. package/dist/components/texture-strip.d.ts.map +1 -0
  86. package/dist/components/texture-strip.js +29 -0
  87. package/dist/index.d.ts +10 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +10 -0
  90. package/dist/styles/globals.css +174 -300
  91. package/docs/agent-work-surfaces.md +6 -5
  92. package/docs/agents/nadicodeai-ui.md +42 -273
  93. package/docs/consuming-cross-repo.md +26 -33
  94. package/docs/contract.md +43 -0
  95. package/docs/migration/nadia-consumer-readiness.md +5 -10
  96. package/docs/terminal-tui-semantics.md +142 -181
  97. package/llms.txt +49 -84
  98. package/package.json +2 -3
  99. package/skills/nadicodeai-ui/SKILL.md +6 -34
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-panel.d.ts","sourceRoot":"","sources":["../../src/components/artifact-panel.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact-panel.d.ts","sourceRoot":"","sources":["../../src/components/artifact-panel.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { CodeBlock } from "./ai-elements/code-block.js";
4
4
  import { StackTrace, StackTraceContent, StackTraceError, StackTraceErrorMessage, StackTraceErrorType, StackTraceExpandButton, StackTraceFrames, StackTraceHeader, } from "./ai-elements/stack-trace.js";
5
- import { Terminal, TerminalActions, TerminalContent, TerminalHeader, TerminalTitle, } from "./ai-elements/terminal.js";
5
+ import { Terminal, TerminalActions, TerminalContent, TerminalHeader, TerminalStatus, TerminalTitle, } from "./ai-elements/terminal.js";
6
6
  import { Test, TestResults, TestResultsContent, TestResultsDuration, TestResultsHeader, TestResultsProgress, TestResultsSummary, TestSuite, TestSuiteContent, TestSuiteName, TestSuiteStats, } from "./ai-elements/test-results.js";
7
7
  import { WebPreview, WebPreviewBody, WebPreviewNavigation, WebPreviewUrl, } from "./ai-elements/web-preview.js";
8
8
  import { Badge } from "./badge.js";
@@ -103,20 +103,20 @@ function TerminalPanel({ transcript, status, renderLimits, className, ...props }
103
103
  transcript.status ??
104
104
  (transcript.redaction ? "redacted" : transcript.isStreaming ? "running" : "idle");
105
105
  const isRunning = terminalStatus === "running";
106
- return (_jsxs("div", { "data-slot": "terminal-panel", className: cn("grid gap-2", className), ...props, children: [output.omitted > 0 && (_jsxs(OverflowSummary, { children: [output.omitted, " earlier terminal characters not shown."] })), _jsxs(Terminal, { output: output.value, isStreaming: isRunning, className: "bg-[var(--nc-terminal-bg)] text-[var(--nc-terminal-fg)]", children: [_jsxs(TerminalHeader, { children: [_jsx(TerminalTitle, { children: transcript.title ?? "Terminal" }), _jsx(TerminalActions, { children: _jsx("div", { "data-slot": "terminal-panel-status", "data-terminal-status": terminalStatus, className: "flex items-center gap-2 text-primary-foreground/70 text-xs", children: artifactStatusLabels[terminalStatus] }) })] }), _jsx(TerminalContent, {})] })] }));
106
+ return (_jsxs("div", { "data-slot": "terminal-panel", className: cn("grid gap-2", className), ...props, children: [output.omitted > 0 && (_jsxs(OverflowSummary, { children: [output.omitted, " earlier terminal characters not shown."] })), _jsxs(Terminal, { output: output.value, isStreaming: isRunning, children: [_jsxs(TerminalHeader, { children: [_jsx(TerminalTitle, { children: transcript.title ?? "Terminal" }), _jsx(TerminalActions, { children: _jsx(TerminalStatus, { "data-slot": "terminal-panel-status", "data-terminal-status": terminalStatus, children: artifactStatusLabels[terminalStatus] }) })] }), _jsx(TerminalContent, {})] })] }));
107
107
  }
108
108
  function PreviewPane({ preview, className, ...props }) {
109
109
  return (_jsxs("div", { "data-slot": "preview-pane", className: cn("min-h-64", className), ...props, children: [_jsxs(WebPreview, { defaultUrl: preview.url ?? "", className: "min-h-64", children: [_jsx(WebPreviewNavigation, { children: _jsx(WebPreviewUrl, { "aria-label": preview.title ?? "Preview URL", readOnly: true, value: preview.url ?? "" }) }), _jsx(WebPreviewBody, {}), preview.loadingLabel && _jsx("span", { className: "sr-only", children: preview.loadingLabel })] }), preview.description && (_jsx("p", { className: "mt-2 text-sm text-muted-foreground", children: preview.description }))] }));
110
110
  }
111
111
  function getDiffLineClass(kind) {
112
112
  if (kind === "added") {
113
- return "bg-[var(--nc-diff-added-line)]";
113
+ return "bg-[var(--nc-link-bg-soft)]";
114
114
  }
115
115
  if (kind === "removed") {
116
- return "bg-[var(--nc-diff-removed-line)]";
116
+ return "bg-[var(--nc-error-soft)]";
117
117
  }
118
118
  if (kind === "hunk") {
119
- return "bg-[var(--nc-diff-hunk)] text-muted-foreground";
119
+ return "bg-accent text-muted-foreground";
120
120
  }
121
121
  return "bg-background";
122
122
  }
@@ -5,24 +5,35 @@ import * as React from "react";
5
5
  * This is the reusable shadcn-style source component for bento sections. The
6
6
  * grid owns seams once (`gap-px bg-border`, via `SeamGrid` with no `surface`);
7
7
  * cells are borderless fills. Pages choose content and spans, not border math.
8
+ *
9
+ * `tone="night"` renders the always-dark V5 bento: rather than a `dark:` utility
10
+ * (forbidden) it sets the `dark` ancestor class on the grid root, so the seam
11
+ * (`bg-border`), the `bg-card` cell fills, and the `BentoIndex`/`BentoTitle`/
12
+ * `BentoBody` roles all resolve to their dark values. Only standard shadcn role
13
+ * utilities are composed. Token-only.
8
14
  */
9
15
  declare const spanClasses: Record<number, string>;
10
16
  declare const columnClasses: Record<number, string>;
11
- declare function Bento({ className, height, columns, ...props }: React.ComponentProps<"div"> & {
17
+ declare function Bento({ className, height, columns, tone, ...props }: React.ComponentProps<"div"> & {
12
18
  height?: "auto" | "primary" | "secondary";
13
19
  columns?: keyof typeof columnClasses;
20
+ tone?: "canvas" | "night";
14
21
  }): React.JSX.Element;
15
- declare function BentoItem({ className, span, surface, flush, stretch, ...props }: React.ComponentProps<"div"> & {
22
+ declare function BentoItem({ className, span, surface, flush, stretch, hover, ...props }: React.ComponentProps<"div"> & {
16
23
  span?: keyof typeof spanClasses;
17
24
  surface?: "card" | "soft" | "transparent";
18
25
  flush?: boolean;
19
26
  stretch?: boolean;
27
+ hover?: boolean;
20
28
  }): React.JSX.Element;
29
+ declare function BentoIndex({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
30
+ declare function BentoTitle({ className, ...props }: React.ComponentProps<"h3">): React.JSX.Element;
31
+ declare function BentoBody({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
21
32
  declare function BentoCopy({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
22
33
  declare function BentoMedia({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
23
34
  declare function BentoDemo({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
24
35
  declare function BentoDivider({ label, className, ...props }: React.ComponentProps<"div"> & {
25
36
  label?: string;
26
37
  }): React.JSX.Element;
27
- export { Bento, BentoItem, BentoCopy, BentoMedia, BentoDemo, BentoDivider };
38
+ export { Bento, BentoItem, BentoIndex, BentoTitle, BentoBody, BentoCopy, BentoMedia, BentoDemo, BentoDivider, };
28
39
  //# sourceMappingURL=bento.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bento.d.ts","sourceRoot":"","sources":["../../src/components/bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;GAMG;AAEH,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAavC,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKzC,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,MAAe,EACf,OAAY,EACZ,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,OAAO,aAAa,CAAC;CACtC,qBAeA;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,IAAI,EACJ,OAAgB,EAChB,KAAa,EACb,OAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,OAAO,WAAW,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,qBAiBA;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAItE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQvE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAUlD;AAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"bento.d.ts","sourceRoot":"","sources":["../../src/components/bento.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAavC,CAAC;AAEF,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKzC,CAAC;AAEF,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,MAAe,EACf,OAAY,EACZ,IAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC;IAC1C,OAAO,CAAC,EAAE,MAAM,OAAO,aAAa,CAAC;IACrC,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC3B,qBAkBA;AAED,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,IAAI,EACJ,OAAgB,EAChB,KAAa,EACb,OAAe,EACf,KAAa,EACb,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,OAAO,WAAW,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,qBAoBA;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQxE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQtE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQpE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAItE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQvE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,iBAAS,YAAY,CAAC,EACpB,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAUlD;AAED,OAAO,EACL,KAAK,EACL,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,GACb,CAAC"}
@@ -7,6 +7,12 @@ import { SeamGrid } from "./seam-grid.js";
7
7
  * This is the reusable shadcn-style source component for bento sections. The
8
8
  * grid owns seams once (`gap-px bg-border`, via `SeamGrid` with no `surface`);
9
9
  * cells are borderless fills. Pages choose content and spans, not border math.
10
+ *
11
+ * `tone="night"` renders the always-dark V5 bento: rather than a `dark:` utility
12
+ * (forbidden) it sets the `dark` ancestor class on the grid root, so the seam
13
+ * (`bg-border`), the `bg-card` cell fills, and the `BentoIndex`/`BentoTitle`/
14
+ * `BentoBody` roles all resolve to their dark values. Only standard shadcn role
15
+ * utilities are composed. Token-only.
10
16
  */
11
17
  const spanClasses = {
12
18
  1: "lg:col-span-1",
@@ -28,11 +34,26 @@ const columnClasses = {
28
34
  4: "grid-cols-1 md:grid-cols-4",
29
35
  12: "grid-cols-1 lg:grid-cols-12",
30
36
  };
31
- function Bento({ className, height = "auto", columns = 12, ...props }) {
32
- return (_jsx(SeamGrid, { "data-slot": "bento", "data-height": height, className: cn("items-stretch", columnClasses[columns], height === "primary" && "lg:h-[var(--nc-h-bento-primary)]", height === "secondary" && "lg:h-[var(--nc-h-bento-secondary)]", className), ...props }));
37
+ function Bento({ className, height = "auto", columns = 12, tone = "canvas", ...props }) {
38
+ return (_jsx(SeamGrid, { "data-slot": "bento", "data-height": height, "data-tone": tone, className: cn("items-stretch",
39
+ // always-dark V5 bento: flip roles via the ancestor class, not `dark:`.
40
+ tone === "night" && "dark", columnClasses[columns], height === "primary" && "lg:h-[var(--nc-h-bento-primary)]", height === "secondary" && "lg:h-[var(--nc-h-bento-secondary)]", className), ...props }));
41
+ }
42
+ function BentoItem({ className, span, surface = "card", flush = false, stretch = false, hover = false, ...props }) {
43
+ return (_jsx("div", { "data-slot": "bento-item", "data-surface": surface, className: cn("nc-panel-cell relative min-w-0 overflow-hidden", span ? spanClasses[span] : null, surface === "card" && "bg-card",
44
+ // `muted` (== canvas-soft) flips with any `.dark` ancestor.
45
+ surface === "soft" && "bg-muted",
46
+ // V5 hover surface shift: card fill lifts toward the muted role.
47
+ hover && "transition-colors hover:bg-muted", flush && "!p-0", stretch && "items-stretch ![align-content:stretch] ![grid-template-rows:minmax(0,1fr)]", className), ...props }));
48
+ }
49
+ function BentoIndex({ className, ...props }) {
50
+ return (_jsx("span", { "data-slot": "bento-index", className: cn("nc-type-caption-mono text-primary", className), ...props }));
51
+ }
52
+ function BentoTitle({ className, ...props }) {
53
+ return (_jsx("h3", { "data-slot": "bento-title", className: cn("nc-type-body-md-strong text-foreground", className), ...props }));
33
54
  }
34
- function BentoItem({ className, span, surface = "card", flush = false, stretch = false, ...props }) {
35
- return (_jsx("div", { "data-slot": "bento-item", "data-surface": surface, className: cn("nc-panel-cell relative min-w-0 overflow-hidden", span ? spanClasses[span] : null, surface === "card" && "bg-card", surface === "soft" && "bg-[var(--nc-canvas-soft)]", flush && "!p-0", stretch && "items-stretch ![align-content:stretch] ![grid-template-rows:minmax(0,1fr)]", className), ...props }));
55
+ function BentoBody({ className, ...props }) {
56
+ return (_jsx("p", { "data-slot": "bento-body", className: cn("nc-type-body-sm text-muted-foreground", className), ...props }));
36
57
  }
37
58
  function BentoCopy({ className, ...props }) {
38
59
  return (_jsx("div", { "data-slot": "bento-copy", className: cn("relative z-10 grid gap-4", className), ...props }));
@@ -46,4 +67,4 @@ function BentoDemo({ className, ...props }) {
46
67
  function BentoDivider({ label, className, ...props }) {
47
68
  return (_jsx("div", { "data-slot": "bento-divider", className: cn("grid bg-card", className), ...props, children: _jsx("div", { className: "nc-dotted-field grid min-h-[calc(var(--nc-h-bento-strip)*2)] place-items-center bg-card", children: label ? (_jsx("span", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: label })) : null }) }));
48
69
  }
49
- export { Bento, BentoItem, BentoCopy, BentoMedia, BentoDemo, BentoDivider };
70
+ export { Bento, BentoItem, BentoIndex, BentoTitle, BentoBody, BentoCopy, BentoMedia, BentoDemo, BentoDivider, };
@@ -1 +1 @@
1
- {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/components/brand.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,cAAc,GAAG,IAAI,CACxB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAC3B,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CACnD,GAAG;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;CACpD,CAAC;AAQF,iBAAS,SAAS,CAAC,EACjB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAyBhB;AAED,iBAAS,aAAa,CAAC,EACrB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAgEhB;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/components/brand.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,cAAc,GAAG,IAAI,CACxB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAC3B,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CACnD,GAAG;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;CACpD,CAAC;AA6BF,iBAAS,SAAS,CAAC,EACjB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAyBhB;AAED,iBAAS,aAAa,CAAC,EACrB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAoBhB;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC"}
@@ -1,14 +1,40 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { logoMarkGeometry, logoWordmarkGeometry, resolveLogoGeometry, } from "@nadicodeai/design-system/assets/logo-geometry";
4
+ import * as React from "react";
2
5
  import { cn } from "../lib/utils.js";
3
6
  function accessibilityProps(alt) {
4
7
  return alt ? { role: "img", "aria-label": alt } : { "aria-hidden": true };
5
8
  }
9
+ const reactSvgAttributeNames = {
10
+ "clip-path": "clipPath",
11
+ "stroke-width": "strokeWidth",
12
+ };
13
+ function renderGeometryNodes(nodes) {
14
+ return nodes.map((node, index) => {
15
+ const attributes = Object.fromEntries(Object.entries(node.attributes).map(([name, value]) => [
16
+ reactSvgAttributeNames[name] ?? name,
17
+ value,
18
+ ]));
19
+ return React.createElement(node.element, { ...attributes, key: `${node.element}-${index}` }, node.children ? renderGeometryNodes(node.children) : undefined);
20
+ });
21
+ }
6
22
  function BrandMark({ alt = "NadicodeAI", className, width = 32, height = 32, decoding, ...props }) {
7
23
  void decoding;
8
- return (_jsxs("svg", { "data-slot": "brand-mark", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 160 160", width: width, height: height, className: cn("block size-6", className), ...accessibilityProps(alt), ...props, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "nc-agent", x1: "0", y1: "0", x2: "1", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "var(--nc-link-deep)" }), _jsx("stop", { offset: "0.55", stopColor: "var(--nc-link)" }), _jsx("stop", { offset: "1", stopColor: "var(--nc-success)" })] }) }), _jsx("path", { d: "M 65.8 46 H 100 V 104.3 Z", fill: "currentColor" }), _jsx("path", { d: "M 60 55.9 V 114 H 94.2 Z", fill: "url(#nc-agent)" })] }));
24
+ // The canonical geometry contains a named clip reference. Scope it per
25
+ // instance so nav + footer marks never emit duplicate DOM ids; useId is SSR-safe.
26
+ const idPrefix = `mklip-${React.useId().replace(/[^a-zA-Z0-9]/g, "")}-`;
27
+ const geometry = resolveLogoGeometry(logoMarkGeometry, {
28
+ idPrefix,
29
+ paints: { ink: "currentColor", primary: "var(--primary)" },
30
+ });
31
+ return (_jsx("svg", { "data-slot": "brand-mark", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block size-6", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
9
32
  }
10
33
  function BrandWordmark({ alt = "NadicodeAI", className, width = 96, height = 30, decoding, ...props }) {
11
34
  void decoding;
12
- return (_jsxs("svg", { "data-slot": "brand-wordmark", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 320 100", width: width, height: height, className: cn("block h-6 w-auto", className), ...accessibilityProps(alt), ...props, children: [_jsx("defs", { children: _jsxs("linearGradient", { id: "nc-agent-w", x1: "0", y1: "0", x2: "1", y2: "1", children: [_jsx("stop", { offset: "0", stopColor: "var(--nc-link-deep)" }), _jsx("stop", { offset: "0.55", stopColor: "var(--nc-link)" }), _jsx("stop", { offset: "1", stopColor: "var(--nc-success)" })] }) }), _jsxs("g", { fill: "currentColor", transform: "translate(0 76) scale(0.06 -0.06)", children: [_jsx("path", { transform: "translate(0 0)", d: "M74 0L74 710L242 710L524 220L524 710L676 710L676 0L506 0L226 473L226 0Z" }), _jsx("path", { transform: "translate(706.867 0)", d: "M225 -12Q142 -12 89.5 26.5Q37 65 37 134Q37 205 81.5 243.5Q126 282 213 300L386 334Q386 386 362.5 412.5Q339 439 295 439Q252 439 228 419.5Q204 400 197 362L46 369Q61 457 125.5 502.5Q190 548 295 548Q415 548 475.5 491Q536 434 536 324L536 141Q536 118 543.5 110.5Q551 103 566 103L581 103L581 0Q574 -2 558.5 -4Q543 -6 528 -6Q496 -6 468.5 5Q441 16 424 42.5Q407 69 407 118L420 108Q410 72 384.5 45Q359 18 318.5 3Q278 -12 225 -12ZM261 91Q298 91 326 105.5Q354 120 370 148Q386 176 386 214L386 240L264 214Q228 207 209.5 190.5Q191 174 191 148Q191 121 209 106Q227 91 261 91Z" }), _jsx("path", { transform: "translate(1258.133 0)", d: "M257 -12Q189 -12 139.5 22.5Q90 57 63.5 119.5Q37 182 37 268Q37 354 64 416.5Q91 479 140.5 513.5Q190 548 257 548Q314 548 355.5 524.5Q397 501 418 460L418 710L568 710L568 0L425 0L422 79Q400 36 356.5 12Q313 -12 257 -12ZM306 103Q342 103 367 122Q392 141 405 177.5Q418 214 418 268Q418 323 405 359.5Q392 396 367 414.5Q342 433 306 433Q253 433 222 388.5Q191 344 191 268Q191 193 222.5 148Q254 103 306 103Z" }), _jsx("path", { transform: "translate(1844.8 0)", d: "M66 0L66 536L216 536L216 0ZM63 602L63 722L218 722L218 602Z" }), _jsx("path", { transform: "translate(2082.667 0)", d: "M309 -12Q227 -12 166 22.5Q105 57 71 120Q37 183 37 268Q37 353 71 415.5Q105 478 166 513Q227 548 309 548Q380 548 436.5 523Q493 498 528 451Q563 404 571 338L416 331Q409 381 380.5 406.5Q352 432 309 432Q253 432 222 389Q191 346 191 268Q191 190 222 146.5Q253 103 309 103Q352 103 381 129.5Q410 156 416 210L571 204Q564 138 529.5 89.5Q495 41 438.5 14.5Q382 -12 309 -12Z" }), _jsx("path", { transform: "translate(2636.933 0)", d: "M309 -12Q227 -12 166 22.5Q105 57 71 120Q37 183 37 268Q37 353 71 415.5Q105 478 166 513Q227 548 309 548Q391 548 452 513Q513 478 547 415.5Q581 353 581 268Q581 183 547 120Q513 57 452 22.5Q391 -12 309 -12ZM309 103Q365 103 396 146.5Q427 190 427 268Q427 346 396 389.5Q365 433 309 433Q253 433 222 389.5Q191 346 191 268Q191 190 222 146.5Q253 103 309 103Z" }), _jsx("path", { transform: "translate(3211.6 0)", d: "M257 -12Q189 -12 139.5 22.5Q90 57 63.5 119.5Q37 182 37 268Q37 354 64 416.5Q91 479 140.5 513.5Q190 548 257 548Q314 548 355.5 524.5Q397 501 418 460L418 710L568 710L568 0L425 0L422 79Q400 36 356.5 12Q313 -12 257 -12ZM306 103Q342 103 367 122Q392 141 405 177.5Q418 214 418 268Q418 323 405 359.5Q392 396 367 414.5Q342 433 306 433Q253 433 222 388.5Q191 344 191 268Q191 193 222.5 148Q254 103 306 103Z" }), _jsx("path", { transform: "translate(3802.267 0)", d: "M307 -12Q225 -12 164.5 22.5Q104 57 70.5 120Q37 183 37 268Q37 353 70.5 415.5Q104 478 164 513Q224 548 306 548Q386 548 445 513Q504 478 536.5 413Q569 348 569 258L569 228L192 228Q195 164 226.5 133Q258 102 310 102Q348 102 373.5 118Q399 134 410 167L561 158Q540 78 472 33Q404 -12 307 -12ZM192 320L415 320Q412 379 382.5 408Q353 437 306 437Q259 437 228.5 406.5Q198 376 192 320Z" })] }), _jsxs("g", { fill: "url(#nc-agent-w)", transform: "translate(259 76) scale(0.06 -0.06)", children: [_jsx("path", { transform: "translate(0 0)", d: "M19 0L275 710L455 710L711 0L553 0L501 151L228 151L176 0ZM271 276L459 276L365 550Z" }), _jsx("path", { transform: "translate(670.467 0)", d: "M74 0L74 710L226 710L226 0Z" })] })] }));
35
+ const geometry = resolveLogoGeometry(logoWordmarkGeometry, {
36
+ paints: { ink: "currentColor", primary: "var(--primary)" },
37
+ });
38
+ return (_jsx("svg", { "data-slot": "brand-wordmark", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block h-6 w-auto", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
13
39
  }
14
40
  export { BrandMark, BrandWordmark };
@@ -1,20 +1,32 @@
1
1
  import * as React from "react";
2
2
  /**
3
- * contact — contact-form section (replaces the retired `sections/contact.css` + its
4
- * coupled form controls).
3
+ * contact — the closing contact section (V5 B18).
5
4
  *
6
- * Composition pattern: a centered intro over a field stack ending in a submit
7
- * button. It owns NO structural seam every visible border is the caller's
8
- * control perimeter. The frame/lane/row perimeter is owned by the kept geometry
9
- * layer this composes inside. `<ContactForm columns={2}>` splits the field stack
10
- * into two whitespace-gapped columns on desktop (a `Field` can span both via
11
- * `className="sm:col-span-2"`); the gap is whitespace, never a hairline, so no seam
12
- * is introduced. Token-only; no `dark:` styling.
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.
13
15
  */
14
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;
15
21
  declare function ContactForm({ className, columns, ...props }: React.ComponentProps<"form"> & {
16
22
  columns?: 1 | 2;
17
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;
18
30
  declare function ContactActions({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
19
- export { Contact, ContactForm, ContactActions };
31
+ export { Contact, ContactIntro, ContactLocation, ContactForm, ContactFieldRow, ContactField, ContactLabel, ContactActions, };
20
32
  //# sourceMappingURL=contact.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../src/components/contact.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;GAWG;AAEH,iBAAS,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWpE;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,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ3E;AAED,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
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,24 +1,46 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
3
  /**
4
- * contact — contact-form section (replaces the retired `sections/contact.css` + its
5
- * coupled form controls).
4
+ * contact — the closing contact section (V5 B18).
6
5
  *
7
- * Composition pattern: a centered intro over a field stack ending in a submit
8
- * button. It owns NO structural seam every visible border is the caller's
9
- * control perimeter. The frame/lane/row perimeter is owned by the kept geometry
10
- * layer this composes inside. `<ContactForm columns={2}>` splits the field stack
11
- * into two whitespace-gapped columns on desktop (a `Field` can span both via
12
- * `className="sm:col-span-2"`); the gap is whitespace, never a hairline, so no seam
13
- * is introduced. Token-only; no `dark:` styling.
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.
14
16
  */
15
17
  function Contact({ className, ...props }) {
16
- return (_jsx("div", { "data-slot": "contact", className: cn("grid min-h-full min-w-0 content-center justify-items-center bg-card py-[clamp(40px,6vw,96px)]", 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 }));
17
27
  }
18
28
  function ContactForm({ className, columns = 1, ...props }) {
19
- return (_jsx("form", { "data-slot": "contact-form", "data-columns": columns, className: cn("mt-2 grid w-full max-w-[560px] gap-4 text-left", columns === 2 && "sm:grid-cols-2", className), ...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 }));
20
42
  }
21
43
  function ContactActions({ className, ...props }) {
22
44
  return (_jsx("div", { "data-slot": "contact-actions", className: cn("mt-1 grid sm:col-span-2 [&>button]:w-full", className), ...props }));
23
45
  }
24
- export { Contact, ContactForm, ContactActions };
46
+ export { Contact, ContactIntro, ContactLocation, ContactForm, ContactFieldRow, ContactField, ContactLabel, ContactActions, };
@@ -21,6 +21,6 @@ function AnimatedInt({ value }) {
21
21
  function DiffCount({ added, removed, className, ...props }) {
22
22
  if (!added && !removed)
23
23
  return null;
24
- return (_jsxs("span", { className: cn("flex shrink-0 items-center gap-1 tabular-nums", className), "data-slot": "diff-count", ...props, children: [added > 0 ? (_jsxs("span", { className: "text-(--nc-diff-added-word)", children: ["+", _jsx(AnimatedInt, { value: added })] })) : null, removed > 0 ? (_jsxs("span", { className: "text-(--nc-diff-removed-word)", children: ["\u2212", _jsx(AnimatedInt, { value: removed })] })) : null] }));
24
+ return (_jsxs("span", { className: cn("flex shrink-0 items-center gap-1 tabular-nums", className), "data-slot": "diff-count", ...props, children: [added > 0 ? (_jsxs("span", { className: "text-[var(--nc-link-deep)]", children: ["+", _jsx(AnimatedInt, { value: added })] })) : null, removed > 0 ? (_jsxs("span", { className: "text-[var(--nc-error-deep)]", children: ["\u2212", _jsx(AnimatedInt, { value: removed })] })) : null] }));
25
25
  }
26
26
  export { DiffCount };
@@ -18,8 +18,8 @@ import { cn } from "../lib/utils.js";
18
18
  * no `dark:` styling.
19
19
  */
20
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-card [&_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-[18px]", "text-base font-medium text-foreground", "outline-none focus-visible:outline-2 focus-visible:[outline-color:var(--ring)] focus-visible:-outline-offset-2",
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-[18px]", "text-base font-medium text-foreground transition-colors hover:text-[var(--nc-link)]", "outline-none focus-visible:outline-2 focus-visible:[outline-color:var(--ring)] focus-visible:-outline-offset-2",
22
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(--nc-body),var(--nc-body)),linear-gradient(var(--nc-body),var(--nc-body))]", "group-open:after:bg-[length:12px_1px] group-open:after:[background-image:linear-gradient(var(--nc-body),var(--nc-body))]"), children: question }), _jsx("div", { "data-slot": "faq-item-answer", className: "border-t border-border px-5 pt-4 pb-5 text-sm text-[var(--nc-body)]", children: children })] }));
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
24
  }
25
25
  export { FaqItem };
@@ -10,7 +10,10 @@ import * as React from "react";
10
10
  * not here). A faq is one column at every breakpoint — no column count, no dark
11
11
  * inversion (matching the retired section's variants:none).
12
12
  *
13
- * Token-only; no `dark:` styling.
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.
14
17
  */
15
18
  declare function Faq({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
16
19
  export { Faq };
@@ -1 +1 @@
1
- {"version":3,"file":"faq.d.ts","sourceRoot":"","sources":["../../src/components/faq.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAEhE;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
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"}
@@ -12,9 +12,12 @@ import { SeamGrid } from "./seam-grid.js";
12
12
  * not here). A faq is one column at every breakpoint — no column count, no dark
13
13
  * inversion (matching the retired section's variants:none).
14
14
  *
15
- * Token-only; no `dark:` styling.
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.
16
19
  */
17
20
  function Faq({ className, ...props }) {
18
- return _jsx(SeamGrid, { "data-slot": "faq", className: cn("h-full grid-cols-1", className), ...props });
21
+ return (_jsx(SeamGrid, { "data-slot": "faq", className: cn("mx-auto h-full max-w-[760px] grid-cols-1", className), ...props }));
19
22
  }
20
23
  export { Faq };
@@ -0,0 +1,23 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,33 @@
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-caption-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-caption-mono text-[var(--nc-link-deep)]", children: index })) : null, title != null ? (_jsx("h3", { "data-slot": "feature-card-title", className: "nc-type-title-sm 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 };
@@ -0,0 +1,23 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,27 @@
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,18 +1,21 @@
1
1
  import * as React from "react";
2
2
  /**
3
- * footer — bottom footer/navigation row chrome (replaces the retired `.nc-footer`
4
- * + its `data-variant="mega"`).
3
+ * footer — the always-dark site footer (V5 · B20).
5
4
  *
6
- * SINGLE-OWNER SEAM: the only edge the footer owns is its top border
7
- * (`border-t border-border`) on a canvas surface it draws no other line. The flat
8
- * inner row is a wrapping flex line capped to the frame measure with
9
- * `justify-between`: brand leading, meta trailing, nav between. The `variant="mega"`
10
- * adds exactly ONE extra inner seam — a hairline above the meta strip
11
- * (`FooterMegaMeta`'s top border) — owned once there; the link columns separate by
12
- * whitespace gaps, never rails, so no coordinate carries two borders.
5
+ * A brandline + identity paragraph beside two link columns, a meta row
6
+ * (copyright · clock slot · locations), and a giant faint ghost wordmark behind it
7
+ * all. The footer is ALWAYS dark, so the root carries its own `dark` ancestor class
8
+ * and resolves every colour from semantic roles (`bg-card`, `text-foreground`,
9
+ * `text-muted-foreground`, `border-border`, `text-primary`).
13
10
  *
14
- * A11y: nav links expose a `--ring` (link-green) focus outline; the consumer wraps
15
- * link groups in `<nav aria-label>`. Token-only; no `dark:` styling.
11
+ * SINGLE-OWNER SEAM: the footer owns its top border (`border-t border-border`); the
12
+ * `mega` variant adds exactly ONE inner seam, the hairline above the meta strip
13
+ * (`FooterMegaMeta`). Link columns separate by whitespace, never rails.
14
+ *
15
+ * The ghost wordmark and clock are CONTENT slots: `FooterGhost` takes the wordmark
16
+ * text/renderer, `FooterClock` takes a pre-formatted time string (a value, not a
17
+ * live timer — no client JS in this pass). Token-only; the root sets its own `dark`
18
+ * class (an accepted ancestor-class remap), never `dark:` utilities.
16
19
  */
17
20
  declare function Footer({ className, variant, ...props }: React.ComponentProps<"footer"> & {
18
21
  variant?: "flat" | "mega";
@@ -21,12 +24,15 @@ declare function FooterInner({ className, variant, ...props }: React.ComponentPr
21
24
  variant?: "flat" | "mega";
22
25
  }): React.JSX.Element;
23
26
  declare function FooterBrand({ className, ...props }: React.ComponentProps<"a">): React.JSX.Element;
27
+ declare function FooterIdentity({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
24
28
  declare function FooterNav({ className, ...props }: React.ComponentProps<"nav">): React.JSX.Element;
25
29
  declare function FooterMeta({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
30
+ declare function FooterClock({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
31
+ declare function FooterGhost({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
26
32
  declare function FooterMegaTop({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
27
33
  declare function FooterMegaCols({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
28
34
  declare function FooterMegaCol({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
29
35
  declare function FooterMegaColTitle({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
30
36
  declare function FooterMegaMeta({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
31
- export { Footer, FooterInner, FooterBrand, FooterNav, FooterMeta, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
37
+ export { Footer, FooterInner, FooterBrand, FooterIdentity, FooterNav, FooterMeta, FooterClock, FooterGhost, FooterMegaTop, FooterMegaCols, FooterMegaCol, FooterMegaColTitle, FooterMegaMeta, };
32
38
  //# sourceMappingURL=footer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/components/footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;GAcG;AAEH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAahE;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAY7D;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWtE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWtE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQrE;AAID,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW3E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ7E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAY3E;AAED,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,CAAC"}
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../src/components/footer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;GAiBG;AAEH,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAahE;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,qBAY7D;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWtE;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQzE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWtE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQrE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQzE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAYzE;AAID,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW3E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAW1E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ7E;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAY3E;AAED,OAAO,EACL,MAAM,EACN,WAAW,EACX,WAAW,EACX,cAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,cAAc,GACf,CAAC"}