@nadicodeai/ui 0.10.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +23 -135
- package/README.md +39 -110
- package/dist/components/action-band.d.ts +5 -3
- package/dist/components/action-band.d.ts.map +1 -1
- package/dist/components/action-band.js +35 -21
- package/dist/components/agent-chat.d.ts.map +1 -1
- package/dist/components/agent-chat.js +1 -1
- package/dist/components/agent-composer.d.ts.map +1 -1
- package/dist/components/agent-composer.js +1 -1
- package/dist/components/ai-elements/terminal.d.ts.map +1 -1
- package/dist/components/ai-elements/terminal.js +8 -8
- package/dist/components/artifact-panel.d.ts.map +1 -1
- package/dist/components/artifact-panel.js +5 -5
- package/dist/components/bento.d.ts +14 -3
- package/dist/components/bento.d.ts.map +1 -1
- package/dist/components/bento.js +26 -5
- package/dist/components/brand.d.ts.map +1 -1
- package/dist/components/brand.js +29 -3
- package/dist/components/contact.d.ts +22 -10
- package/dist/components/contact.d.ts.map +1 -1
- package/dist/components/contact.js +34 -12
- package/dist/components/diff-count.js +1 -1
- package/dist/components/faq-item.js +2 -2
- package/dist/components/faq.d.ts +4 -1
- package/dist/components/faq.d.ts.map +1 -1
- package/dist/components/faq.js +5 -2
- package/dist/components/feature-grid.d.ts +23 -0
- package/dist/components/feature-grid.d.ts.map +1 -0
- package/dist/components/feature-grid.js +33 -0
- package/dist/components/feature-rows.d.ts +23 -0
- package/dist/components/feature-rows.d.ts.map +1 -0
- package/dist/components/feature-rows.js +27 -0
- package/dist/components/footer.d.ts +18 -12
- package/dist/components/footer.d.ts.map +1 -1
- package/dist/components/footer.js +32 -20
- package/dist/components/hero.d.ts +28 -0
- package/dist/components/hero.d.ts.map +1 -0
- package/dist/components/hero.js +45 -0
- package/dist/components/integration-flow.d.ts +36 -0
- package/dist/components/integration-flow.d.ts.map +1 -0
- package/dist/components/integration-flow.js +36 -0
- package/dist/components/live-demo.d.ts +31 -0
- package/dist/components/live-demo.d.ts.map +1 -0
- package/dist/components/live-demo.js +30 -0
- package/dist/components/logo-band.d.ts +12 -2
- package/dist/components/logo-band.d.ts.map +1 -1
- package/dist/components/logo-band.js +16 -1
- package/dist/components/logo-tile.d.ts.map +1 -1
- package/dist/components/logo-tile.js +5 -2
- package/dist/components/nav-bar.d.ts +14 -8
- package/dist/components/nav-bar.d.ts.map +1 -1
- package/dist/components/nav-bar.js +19 -13
- package/dist/components/pricing-card.d.ts +10 -15
- package/dist/components/pricing-card.d.ts.map +1 -1
- package/dist/components/pricing-card.js +18 -29
- package/dist/components/pricing.d.ts +11 -14
- package/dist/components/pricing.d.ts.map +1 -1
- package/dist/components/pricing.js +5 -15
- package/dist/components/quote-card.d.ts +10 -2
- package/dist/components/quote-card.d.ts.map +1 -1
- package/dist/components/quote-card.js +15 -3
- package/dist/components/security-grid.d.ts +25 -0
- package/dist/components/security-grid.d.ts.map +1 -0
- package/dist/components/security-grid.js +31 -0
- package/dist/components/sidebar.js +5 -5
- package/dist/components/stat-block.d.ts +9 -5
- package/dist/components/stat-block.d.ts.map +1 -1
- package/dist/components/stat-block.js +12 -6
- package/dist/components/statement.d.ts +32 -0
- package/dist/components/statement.d.ts.map +1 -0
- package/dist/components/statement.js +40 -0
- package/dist/components/stats-band.d.ts +6 -2
- package/dist/components/stats-band.d.ts.map +1 -1
- package/dist/components/stats-band.js +10 -3
- package/dist/components/status-dot.js +4 -4
- package/dist/components/steps.d.ts +34 -0
- package/dist/components/steps.d.ts.map +1 -0
- package/dist/components/steps.js +40 -0
- package/dist/components/team-grid.d.ts +27 -0
- package/dist/components/team-grid.d.ts.map +1 -0
- package/dist/components/team-grid.js +30 -0
- package/dist/components/testimonials.d.ts +39 -12
- package/dist/components/testimonials.d.ts.map +1 -1
- package/dist/components/testimonials.js +46 -13
- package/dist/components/texture-strip.d.ts +22 -0
- package/dist/components/texture-strip.d.ts.map +1 -0
- package/dist/components/texture-strip.js +29 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/styles/globals.css +185 -300
- package/docs/agent-work-surfaces.md +6 -5
- package/docs/agents/nadicodeai-ui.md +42 -273
- package/docs/consuming-cross-repo.md +26 -33
- package/docs/contract.md +43 -0
- package/docs/migration/nadia-consumer-readiness.md +5 -10
- package/docs/terminal-tui-semantics.md +142 -181
- package/llms.txt +49 -84
- package/package.json +3 -4
- 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":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;
|
|
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,
|
|
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-
|
|
113
|
+
return "bg-[var(--nc-link-bg-soft)]";
|
|
114
114
|
}
|
|
115
115
|
if (kind === "removed") {
|
|
116
|
-
return "bg-[var(--nc-
|
|
116
|
+
return "bg-[var(--nc-error-soft)]";
|
|
117
117
|
}
|
|
118
118
|
if (kind === "hunk") {
|
|
119
|
-
return "bg-
|
|
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
|
|
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"}
|
package/dist/components/bento.js
CHANGED
|
@@ -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,
|
|
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
|
|
35
|
-
return (_jsx("
|
|
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":"
|
|
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"}
|
package/dist/components/brand.js
CHANGED
|
@@ -1,14 +1,40 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
4
|
-
* coupled form controls).
|
|
3
|
+
* contact — the closing contact section (V5 B18).
|
|
5
4
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* is
|
|
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
|
|
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
|
|
5
|
-
* coupled form controls).
|
|
4
|
+
* contact — the closing contact section (V5 B18).
|
|
6
5
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* is
|
|
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-
|
|
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("
|
|
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-
|
|
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-
|
|
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(--
|
|
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 };
|
package/dist/components/faq.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
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
|
|
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"}
|
package/dist/components/faq.js
CHANGED
|
@@ -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
|
-
*
|
|
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 —
|
|
4
|
-
* + its `data-variant="mega"`).
|
|
3
|
+
* footer — the always-dark site footer (V5 · B20).
|
|
5
4
|
*
|
|
6
|
-
*
|
|
7
|
-
* (
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
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
|
|
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"}
|