@nadicodeai/ui 0.10.1 → 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.
- 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/code-block.d.ts.map +1 -1
- package/dist/components/ai-elements/code-block.js +9 -23
- package/dist/components/ai-elements/commit.d.ts.map +1 -1
- package/dist/components/ai-elements/commit.js +9 -23
- package/dist/components/ai-elements/environment-variables.d.ts.map +1 -1
- package/dist/components/ai-elements/environment-variables.js +4 -29
- package/dist/components/ai-elements/snippet.d.ts.map +1 -1
- package/dist/components/ai-elements/snippet.js +9 -23
- package/dist/components/ai-elements/stack-trace.d.ts.map +1 -1
- package/dist/components/ai-elements/stack-trace.js +8 -21
- package/dist/components/ai-elements/terminal.d.ts.map +1 -1
- package/dist/components/ai-elements/terminal.js +16 -29
- package/dist/components/alert-dialog.d.ts.map +1 -1
- package/dist/components/alert-dialog.js +3 -2
- package/dist/components/artifact-panel.d.ts.map +1 -1
- package/dist/components/artifact-panel.js +5 -5
- package/dist/components/badge.js +1 -1
- 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/button.js +1 -1
- package/dist/components/chart-time-series.d.ts.map +1 -1
- package/dist/components/chart-time-series.js +2 -2
- package/dist/components/chart.js +1 -1
- 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/dialog.d.ts.map +1 -1
- package/dist/components/dialog.js +3 -2
- package/dist/components/diff-count.js +1 -1
- package/dist/components/dropdown-menu.d.ts.map +1 -1
- package/dist/components/dropdown-menu.js +2 -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/input-otp.js +1 -1
- 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/popover.d.ts.map +1 -1
- package/dist/components/popover.js +2 -1
- 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/select.d.ts.map +1 -1
- package/dist/components/select.js +2 -1
- package/dist/components/sheet.d.ts.map +1 -1
- package/dist/components/sheet.js +3 -2
- package/dist/components/sidebar.js +1 -1
- 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/components/toggle.js +1 -1
- package/dist/components/tooltip.d.ts.map +1 -1
- package/dist/components/tooltip.js +2 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/lib/message-scroller-primitive/geometry.d.ts +1 -5
- package/dist/lib/message-scroller-primitive/geometry.d.ts.map +1 -1
- package/dist/lib/message-scroller-primitive/geometry.js +1 -1
- package/dist/lib/message-scroller-primitive/stores.d.ts +2 -3
- package/dist/lib/message-scroller-primitive/stores.d.ts.map +1 -1
- package/dist/lib/message-scroller-primitive/stores.js +1 -1
- package/dist/lib/message-scroller-primitive/types.d.ts +1 -2
- package/dist/lib/message-scroller-primitive/types.d.ts.map +1 -1
- package/dist/lib/message-scroller-primitive/types.js +1 -1
- package/dist/lib/motion.d.ts +12 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +11 -0
- package/dist/lib/use-copy-to-clipboard.d.ts +11 -0
- package/dist/lib/use-copy-to-clipboard.d.ts.map +1 -0
- package/dist/lib/use-copy-to-clipboard.js +27 -0
- package/dist/styles/globals.css +175 -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 +2 -3
- package/skills/nadicodeai-ui/SKILL.md +6 -30
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* hero — the full-viewport, always-dark page-opening hero (V5 · B02).
|
|
4
|
+
*
|
|
5
|
+
* A left-pinned copy column (kicker with an accent bar, poster headline, lead, and a
|
|
6
|
+
* two-CTA row) over a right-anchored visual slot. The hero is ALWAYS dark, so the
|
|
7
|
+
* root carries its own `dark` ancestor class and resolves every colour from the
|
|
8
|
+
* semantic roles that state each element's purpose (`bg-background`,
|
|
9
|
+
* `text-foreground`, `text-muted-foreground`, `bg-primary`, `border-border`).
|
|
10
|
+
*
|
|
11
|
+
* STUBBED VISUAL: `HeroVisual` is a clean static slot the consumer fills with an
|
|
12
|
+
* image or inline SVG (the founder-approved WebGL Duomo particle field is out of
|
|
13
|
+
* scope for this pass). Absent content, it renders only the dark surface behind the
|
|
14
|
+
* copy — no canvas, no WebGL, no motion.
|
|
15
|
+
*
|
|
16
|
+
* The copy parts are typed presentational wrappers; the consumer supplies the words
|
|
17
|
+
* and drops `Button`s into `HeroActions`. Token-only; the root sets its own `dark`
|
|
18
|
+
* class (an accepted ancestor-class remap), never `dark:` utilities.
|
|
19
|
+
*/
|
|
20
|
+
declare function Hero({ className, ...props }: React.ComponentProps<"section">): React.JSX.Element;
|
|
21
|
+
declare function HeroVisual({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
22
|
+
declare function HeroBody({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
23
|
+
declare function HeroKicker({ className, children, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
24
|
+
declare function HeroTitle({ className, ...props }: React.ComponentProps<"h1">): React.JSX.Element;
|
|
25
|
+
declare function HeroLead({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
26
|
+
declare function HeroActions({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
27
|
+
export { Hero, HeroVisual, HeroBody, HeroKicker, HeroTitle, HeroLead, HeroActions };
|
|
28
|
+
//# sourceMappingURL=hero.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hero.d.ts","sourceRoot":"","sources":["../../src/components/hero.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;GAiBG;AAEH,iBAAS,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,qBAWrE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAevE;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAWrE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAc/E;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQrE;AAED,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQnE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQxE;AAED,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* hero — the full-viewport, always-dark page-opening hero (V5 · B02).
|
|
5
|
+
*
|
|
6
|
+
* A left-pinned copy column (kicker with an accent bar, poster headline, lead, and a
|
|
7
|
+
* two-CTA row) over a right-anchored visual slot. The hero is ALWAYS dark, so the
|
|
8
|
+
* root carries its own `dark` ancestor class and resolves every colour from the
|
|
9
|
+
* semantic roles that state each element's purpose (`bg-background`,
|
|
10
|
+
* `text-foreground`, `text-muted-foreground`, `bg-primary`, `border-border`).
|
|
11
|
+
*
|
|
12
|
+
* STUBBED VISUAL: `HeroVisual` is a clean static slot the consumer fills with an
|
|
13
|
+
* image or inline SVG (the founder-approved WebGL Duomo particle field is out of
|
|
14
|
+
* scope for this pass). Absent content, it renders only the dark surface behind the
|
|
15
|
+
* copy — no canvas, no WebGL, no motion.
|
|
16
|
+
*
|
|
17
|
+
* The copy parts are typed presentational wrappers; the consumer supplies the words
|
|
18
|
+
* and drops `Button`s into `HeroActions`. Token-only; the root sets its own `dark`
|
|
19
|
+
* class (an accepted ancestor-class remap), never `dark:` utilities.
|
|
20
|
+
*/
|
|
21
|
+
function Hero({ className, ...props }) {
|
|
22
|
+
return (_jsx("section", { "data-slot": "hero", className: cn("dark relative isolate min-h-[max(640px,100svh)] overflow-hidden bg-background text-foreground", className), ...props }));
|
|
23
|
+
}
|
|
24
|
+
function HeroVisual({ className, ...props }) {
|
|
25
|
+
return (_jsx("div", { "data-slot": "hero-visual", "aria-hidden": "true", className: cn(
|
|
26
|
+
// Right-anchored static plate. Flush mount: consumer media fills it; empty,
|
|
27
|
+
// it is just the dark surface. This is the stub slot for the WebGL field.
|
|
28
|
+
"pointer-events-none absolute inset-y-0 right-0 z-0 hidden w-[62%] overflow-hidden border-l border-border/60 sm:block", "[&_img]:h-full [&_img]:w-full [&_img]:object-cover [&_svg]:h-full [&_svg]:w-full", className), ...props }));
|
|
29
|
+
}
|
|
30
|
+
function HeroBody({ className, ...props }) {
|
|
31
|
+
return (_jsx("div", { "data-slot": "hero-body", className: cn("relative z-10 mx-auto flex min-h-[inherit] w-full max-w-[1200px] flex-col items-start justify-center gap-6 px-[clamp(24px,5vw,64px)] py-[clamp(96px,12vw,120px)]", className), ...props }));
|
|
32
|
+
}
|
|
33
|
+
function HeroKicker({ className, children, ...props }) {
|
|
34
|
+
return (_jsxs("p", { "data-slot": "hero-kicker", className: cn("nc-type-caption-mono flex items-center gap-3 uppercase text-muted-foreground", className), ...props, children: [_jsx("span", { "data-slot": "hero-kicker-bar", "aria-hidden": "true", className: "h-0.5 w-8 bg-primary" }), children] }));
|
|
35
|
+
}
|
|
36
|
+
function HeroTitle({ className, ...props }) {
|
|
37
|
+
return (_jsx("h1", { "data-slot": "hero-title", className: cn("nc-type-display-lg max-w-[16ch] text-balance text-foreground", className), ...props }));
|
|
38
|
+
}
|
|
39
|
+
function HeroLead({ className, ...props }) {
|
|
40
|
+
return (_jsx("p", { "data-slot": "hero-lead", className: cn("nc-type-body-lg max-w-[40ch] text-muted-foreground", className), ...props }));
|
|
41
|
+
}
|
|
42
|
+
function HeroActions({ className, ...props }) {
|
|
43
|
+
return (_jsx("div", { "data-slot": "hero-actions", className: cn("mt-2 flex flex-wrap items-center gap-3", className), ...props }));
|
|
44
|
+
}
|
|
45
|
+
export { Hero, HeroVisual, HeroBody, HeroKicker, HeroTitle, HeroLead, HeroActions };
|
|
@@ -18,7 +18,7 @@ function InputOTPGroup({ className, ...props }) {
|
|
|
18
18
|
function InputOTPSlot({ index, className, ...props }) {
|
|
19
19
|
const inputOTPContext = React.useContext(OTPInputContext);
|
|
20
20
|
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
|
|
21
|
-
return (_jsxs("div", { "data-slot": "input-otp-slot", "data-active": isActive, className: cn("relative flex h-control-height min-h-touch-target w-control-height min-w-touch-target items-center justify-center border-y border-r border-input bg-background text-sm transition-
|
|
21
|
+
return (_jsxs("div", { "data-slot": "input-otp-slot", "data-active": isActive, className: cn("relative flex h-control-height min-h-touch-target w-control-height min-w-touch-target items-center justify-center border-y border-r border-input bg-background text-sm transition-[border-color,box-shadow,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] motion-reduce:transition-none outline-none first:rounded-l-md first:border-l last:rounded-r-md aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-focus data-[active=true]:ring-ring data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [@media(hover:hover)_and_(pointer:fine)]:min-w-0", className), ...props, children: [char, hasFakeCaret && (_jsx("div", { className: "pointer-events-none absolute inset-0 flex items-center justify-center", children: _jsx("div", { className: "h-4 w-px animate-caret-blink bg-foreground duration-1000" }) }))] }));
|
|
22
22
|
}
|
|
23
23
|
function InputOTPSeparator({ ...props }) {
|
|
24
24
|
return (_jsx("div", { "data-slot": "input-otp-separator", className: "flex items-center [&_svg:not([class*='size-'])]:size-4", role: "separator", ...props, children: _jsx(MinusIcon, {}) }));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* integration-flow — the "how it runs" flow diagram (V5 B10).
|
|
4
|
+
*
|
|
5
|
+
* A four-node flow: three main-row nodes (source → agent → output) plus one
|
|
6
|
+
* branch node (a named person) below the centre. Wide layouts use one inline
|
|
7
|
+
* SVG connector layer. Compact layouts reflow to source → agent → a two-column
|
|
8
|
+
* output/person fork and use CSS borders in the real gaps, so connectors never
|
|
9
|
+
* disappear behind stacked cards. This pass is STATIC: no `animateMotion`, no
|
|
10
|
+
* draw-on stroke animation.
|
|
11
|
+
*
|
|
12
|
+
* All SVG colours resolve through `var(--nc-*)` / semantic role tokens, never a
|
|
13
|
+
* raw literal. `IntegrationFlowLegend` / `IntegrationFlowLegendPill` render the
|
|
14
|
+
* tint key. Copy is props-driven: only the nodes you pass are rendered.
|
|
15
|
+
*
|
|
16
|
+
* Light-surface composition; inherits the page theme and sets no dark root.
|
|
17
|
+
* Token-only; no `dark:` styling.
|
|
18
|
+
*/
|
|
19
|
+
type FlowTone = "neutral" | "primary" | "warning";
|
|
20
|
+
type FlowNode = {
|
|
21
|
+
label: string;
|
|
22
|
+
sublabel?: string;
|
|
23
|
+
tone?: FlowTone;
|
|
24
|
+
icon?: React.ReactNode;
|
|
25
|
+
};
|
|
26
|
+
declare function IntegrationFlow({ nodes, className, ...props }: React.ComponentProps<"div"> & {
|
|
27
|
+
nodes?: FlowNode[];
|
|
28
|
+
}): React.JSX.Element;
|
|
29
|
+
type LegendTone = "primary" | "warning" | "info";
|
|
30
|
+
declare function IntegrationFlowLegend({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
31
|
+
declare function IntegrationFlowLegendPill({ tone, className, ...props }: React.ComponentProps<"span"> & {
|
|
32
|
+
tone?: LegendTone;
|
|
33
|
+
}): React.JSX.Element;
|
|
34
|
+
export { IntegrationFlow, IntegrationFlowLegend, IntegrationFlowLegendPill };
|
|
35
|
+
export type { FlowNode, FlowTone, LegendTone };
|
|
36
|
+
//# sourceMappingURL=integration-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration-flow.d.ts","sourceRoot":"","sources":["../../src/components/integration-flow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;GAgBG;AAEH,KAAK,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAElD,KAAK,QAAQ,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,CAAC;AAsDF,iBAAS,eAAe,CAAC,EACvB,KAAU,EACV,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB,qBA2HA;AAED,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAQjD,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQlF;AAED,iBAAS,yBAAyB,CAAC,EACjC,IAAgB,EAChB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,UAAU,CAAA;CAAE,qBAatD;AAED,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,CAAC;AAC7E,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
const NODE_BORDER = {
|
|
4
|
+
neutral: "border-border",
|
|
5
|
+
primary: "border-primary",
|
|
6
|
+
warning: "border-warning",
|
|
7
|
+
};
|
|
8
|
+
const NODE_CHIP = {
|
|
9
|
+
neutral: "bg-muted",
|
|
10
|
+
primary: "bg-[var(--nc-link-bg-soft)]",
|
|
11
|
+
warning: "bg-[var(--nc-warning-soft)]",
|
|
12
|
+
};
|
|
13
|
+
// Default role tones for the canonical four-node arrangement.
|
|
14
|
+
const DEFAULT_TONES = ["neutral", "primary", "neutral", "warning"];
|
|
15
|
+
function FlowNodeBox({ node, tone }) {
|
|
16
|
+
return (_jsxs("div", { "data-slot": "integration-flow-node", "data-tone": tone, className: cn("relative z-10 flex flex-col gap-2 border bg-card p-4", NODE_BORDER[tone]), children: [node.icon ? (_jsx("span", { "data-slot": "integration-flow-node-icon", "aria-hidden": "true", className: cn("grid size-8 place-items-center text-foreground [&_svg]:size-4", NODE_CHIP[tone]), children: node.icon })) : null, _jsx("span", { "data-slot": "integration-flow-node-label", className: "font-mono text-[11px] tracking-[0.08em] text-foreground uppercase", children: node.label }), node.sublabel ? (_jsx("span", { "data-slot": "integration-flow-node-sublabel", className: "font-mono text-[10px] text-muted-foreground", children: node.sublabel })) : null] }));
|
|
17
|
+
}
|
|
18
|
+
function IntegrationFlow({ nodes = [], className, ...props }) {
|
|
19
|
+
const main = nodes.slice(0, 3);
|
|
20
|
+
const branch = nodes[3];
|
|
21
|
+
const toneOf = (node, i) => node.tone ?? DEFAULT_TONES[i] ?? "neutral";
|
|
22
|
+
return (_jsxs("div", { "data-slot": "integration-flow", className: cn("nc-dotted-field relative grid gap-y-8 bg-card p-6 sm:p-10", className), ...props, children: [_jsxs("svg", { "data-slot": "integration-flow-connectors", className: "pointer-events-none absolute inset-0 hidden size-full sm:block", viewBox: "0 0 300 200", preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", children: [main.length > 1 ? (_jsx("line", { "data-slot": "integration-flow-link", x1: "60", y1: "46", x2: "140", y2: "46", stroke: "var(--primary)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" })) : null, main.length > 2 ? (_jsx("line", { "data-slot": "integration-flow-link", x1: "160", y1: "46", x2: "240", y2: "46", stroke: "var(--primary)", strokeWidth: "1.5", vectorEffect: "non-scaling-stroke" })) : null, branch ? (_jsx("line", { "data-slot": "integration-flow-branch-link", x1: "150", y1: "62", x2: "150", y2: "150", stroke: "var(--border)", strokeWidth: "1.5", strokeDasharray: "4 4", vectorEffect: "non-scaling-stroke" })) : null] }), _jsxs("div", { "data-slot": "integration-flow-main", className: "grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-6 sm:gap-y-8", children: [main[0] ? _jsx(FlowNodeBox, { node: main[0], tone: toneOf(main[0], 0) }) : null, main[1] ? (_jsxs("div", { className: "relative", children: [_jsx("span", { "data-slot": "integration-flow-mobile-link", className: "pointer-events-none absolute -top-6 left-1/2 h-6 border-l border-primary sm:hidden", "aria-hidden": "true" }), _jsx(FlowNodeBox, { node: main[1], tone: toneOf(main[1], 1) })] })) : null, main[2] ? (_jsxs("div", { className: cn("relative grid pt-6 sm:contents", branch ? "grid-cols-2 gap-4" : "grid-cols-1"), children: [_jsx("span", { "data-slot": "integration-flow-mobile-fork-entry", className: "pointer-events-none absolute -top-6 left-1/2 h-6 border-l border-primary sm:hidden", "aria-hidden": "true" }), _jsxs("span", { "data-slot": "integration-flow-mobile-fork", className: cn("pointer-events-none absolute inset-x-0 top-0 h-6 sm:hidden", branch &&
|
|
23
|
+
"before:absolute before:top-3 before:right-1/4 before:left-1/4 before:border-t before:border-primary after:absolute after:top-0 after:left-1/2 after:h-3 after:border-l after:border-primary"), "aria-hidden": "true", children: [_jsx("span", { className: cn("absolute bottom-0 h-3 border-l border-primary", branch ? "left-1/4" : "left-1/2") }), branch ? (_jsx("span", { className: "absolute right-1/4 bottom-0 h-3 border-l border-dashed border-border" })) : null] }), _jsx("div", { className: "sm:col-start-3 sm:row-start-1", children: _jsx(FlowNodeBox, { node: main[2], tone: toneOf(main[2], 2) }) }), branch ? (_jsx("div", { "data-slot": "integration-flow-branch", className: "sm:col-start-2 sm:row-start-2", children: _jsx(FlowNodeBox, { node: branch, tone: toneOf(branch, 3) }) })) : null] })) : null] })] }));
|
|
24
|
+
}
|
|
25
|
+
const LEGEND_TINT = {
|
|
26
|
+
primary: "bg-[var(--nc-link-bg-soft)] text-[var(--nc-link-deep)]",
|
|
27
|
+
warning: "bg-[var(--nc-warning-soft)] text-[var(--nc-warning-deep)]",
|
|
28
|
+
info: "bg-[var(--nc-info-soft)] text-[var(--nc-info-deep)]",
|
|
29
|
+
};
|
|
30
|
+
function IntegrationFlowLegend({ className, ...props }) {
|
|
31
|
+
return (_jsx("div", { "data-slot": "integration-flow-legend", className: cn("flex flex-wrap gap-2", className), ...props }));
|
|
32
|
+
}
|
|
33
|
+
function IntegrationFlowLegendPill({ tone = "primary", className, ...props }) {
|
|
34
|
+
return (_jsx("span", { "data-slot": "integration-flow-legend-pill", "data-tone": tone, className: cn("inline-flex items-center gap-1.5 px-2.5 py-1 font-mono text-[10px] tracking-[0.1em] uppercase", LEGEND_TINT[tone], className), ...props }));
|
|
35
|
+
}
|
|
36
|
+
export { IntegrationFlow, IntegrationFlowLegend, IntegrationFlowLegendPill };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* live-demo — the faux application window standing in for the agent-at-work
|
|
4
|
+
* recording (V5 B11).
|
|
5
|
+
*
|
|
6
|
+
* `LiveDemoWindow` is a bordered card with a mono title bar, three NEUTRAL chrome
|
|
7
|
+
* dots (muted brand-token fills — deliberately not the literal macOS traffic
|
|
8
|
+
* colours), an optional "live" chip whose dot pulses (a CSS keyframe gated by
|
|
9
|
+
* `motion-reduce:animate-none` so it holds still under reduced-motion), and a
|
|
10
|
+
* stack of status rows. `LiveDemoRow` renders one status line with a soft tint
|
|
11
|
+
* pill: `done` (success tint) or `waiting` (warning tint).
|
|
12
|
+
*
|
|
13
|
+
* Replay interactivity is out of scope this pass — the rows are static. Copy is
|
|
14
|
+
* props-driven: an absent title, chip, or tag renders nothing.
|
|
15
|
+
*
|
|
16
|
+
* Light-surface composition; inherits the page theme and sets no dark root.
|
|
17
|
+
* Token-only; no `dark:` styling.
|
|
18
|
+
*/
|
|
19
|
+
declare function LiveDemoWindow({ title, live, children, className, ...props }: React.ComponentProps<"div"> & {
|
|
20
|
+
title?: React.ReactNode;
|
|
21
|
+
live?: React.ReactNode;
|
|
22
|
+
}): React.JSX.Element;
|
|
23
|
+
type LiveDemoStatus = "done" | "waiting";
|
|
24
|
+
declare function LiveDemoRow({ status, label, tag, className, children, ...props }: React.ComponentProps<"div"> & {
|
|
25
|
+
status?: LiveDemoStatus;
|
|
26
|
+
label?: React.ReactNode;
|
|
27
|
+
tag?: React.ReactNode;
|
|
28
|
+
}): React.JSX.Element;
|
|
29
|
+
export { LiveDemoWindow, LiveDemoRow };
|
|
30
|
+
export type { LiveDemoStatus };
|
|
31
|
+
//# sourceMappingURL=live-demo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-demo.d.ts","sourceRoot":"","sources":["../../src/components/live-demo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;GAgBG;AAEH,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBA+CA;AAED,KAAK,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAOzC,iBAAS,WAAW,CAAC,EACnB,MAAe,EACf,KAAK,EACL,GAAG,EACH,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACvB,qBA8BA;AAED,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* live-demo — the faux application window standing in for the agent-at-work
|
|
5
|
+
* recording (V5 B11).
|
|
6
|
+
*
|
|
7
|
+
* `LiveDemoWindow` is a bordered card with a mono title bar, three NEUTRAL chrome
|
|
8
|
+
* dots (muted brand-token fills — deliberately not the literal macOS traffic
|
|
9
|
+
* colours), an optional "live" chip whose dot pulses (a CSS keyframe gated by
|
|
10
|
+
* `motion-reduce:animate-none` so it holds still under reduced-motion), and a
|
|
11
|
+
* stack of status rows. `LiveDemoRow` renders one status line with a soft tint
|
|
12
|
+
* pill: `done` (success tint) or `waiting` (warning tint).
|
|
13
|
+
*
|
|
14
|
+
* Replay interactivity is out of scope this pass — the rows are static. Copy is
|
|
15
|
+
* props-driven: an absent title, chip, or tag renders nothing.
|
|
16
|
+
*
|
|
17
|
+
* Light-surface composition; inherits the page theme and sets no dark root.
|
|
18
|
+
* Token-only; no `dark:` styling.
|
|
19
|
+
*/
|
|
20
|
+
function LiveDemoWindow({ title, live, children, className, ...props }) {
|
|
21
|
+
return (_jsxs("div", { "data-slot": "live-demo-window", className: cn("flex flex-col overflow-hidden rounded-lg border border-border bg-card shadow-sm", className), ...props, children: [_jsxs("div", { "data-slot": "live-demo-bar", className: "flex items-center gap-3 border-b border-border px-4 py-2.5", children: [_jsx("span", { "data-slot": "live-demo-chrome", "aria-hidden": "true", className: "flex gap-1.5", children: [0, 1, 2].map((i) => (_jsx("span", { className: "size-2.5 rounded-full bg-muted-foreground/40" }, i))) }), title ? (_jsx("span", { "data-slot": "live-demo-title", className: "font-mono text-[10px] tracking-[0.08em] text-muted-foreground uppercase", children: title })) : null] }), live ? (_jsxs("div", { "data-slot": "live-demo-chip", className: "flex items-center gap-2 border-b border-border px-4 py-2.5 font-mono text-[9.5px] tracking-[0.08em] text-[var(--nc-link-deep)] uppercase", children: [_jsx("span", { "aria-hidden": "true", className: "size-1.5 rounded-full bg-primary motion-safe:animate-pulse" }), live] })) : null, _jsx("div", { "data-slot": "live-demo-rows", className: "flex flex-col", children: children })] }));
|
|
22
|
+
}
|
|
23
|
+
const ROW_TINT = {
|
|
24
|
+
done: "bg-[var(--nc-link-bg-soft)] text-[var(--nc-link-deep)]",
|
|
25
|
+
waiting: "bg-[var(--nc-warning-soft)] text-[var(--nc-warning-deep)]",
|
|
26
|
+
};
|
|
27
|
+
function LiveDemoRow({ status = "done", label, tag, className, children, ...props }) {
|
|
28
|
+
return (_jsxs("div", { "data-slot": "live-demo-row", "data-status": status, className: cn("flex items-center justify-between gap-3 border-t border-border px-4 py-3 first:border-t-0", className), ...props, children: [label ? (_jsx("span", { "data-slot": "live-demo-row-label", className: "font-mono text-[11px] text-foreground", children: label })) : null, tag ? (_jsx("span", { "data-slot": "live-demo-row-tag", className: cn("shrink-0 px-2 py-0.5 font-mono text-[10px] tracking-[0.06em] uppercase", ROW_TINT[status]), children: tag })) : null, children] }));
|
|
29
|
+
}
|
|
30
|
+
export { LiveDemoWindow, LiveDemoRow };
|
|
@@ -9,15 +9,25 @@ import * as React from "react";
|
|
|
9
9
|
* both and the two names below keep the section vocabulary distinct (matching the
|
|
10
10
|
* retired CSS, which kept two section files over identical primitives).
|
|
11
11
|
*
|
|
12
|
+
* V5 logo-cloud usage: a caller stacks a mono `LogoBandLabel` caption above each
|
|
13
|
+
* auto-fit tile row (`columns="auto"`), e.g. "the tools you already use" over one
|
|
14
|
+
* row and "many models, no lock-in" over the next — the two-row composition is the
|
|
15
|
+
* caller's, this component only owns one labelled tile wall.
|
|
16
|
+
*
|
|
12
17
|
* SINGLE-OWNER SEAM: the grid owns every divider once (`gap-px bg-border`). Each
|
|
13
18
|
* `LogoTile` is borderless and square-cornered. `surface="ink"` flips only the
|
|
14
19
|
* seam colour, never its weight. Token-only; no `dark:` styling.
|
|
15
20
|
*/
|
|
16
21
|
declare function LogoGrid({ className, columns, surface, ...props }: React.ComponentProps<"div"> & {
|
|
17
|
-
columns?: 2 | 3 | 4 | 5 | 6;
|
|
22
|
+
columns?: 2 | 3 | 4 | 5 | 6 | "auto";
|
|
18
23
|
surface?: "canvas" | "ink";
|
|
19
24
|
}): React.JSX.Element;
|
|
20
25
|
declare function LogoBand({ ...props }: React.ComponentProps<typeof LogoGrid>): React.JSX.Element;
|
|
21
26
|
declare function IntegrationsGrid({ ...props }: React.ComponentProps<typeof LogoGrid>): React.JSX.Element;
|
|
22
|
-
|
|
27
|
+
/**
|
|
28
|
+
* LogoBandLabel — the mono caption row that sits above a tile wall (V5 `.lab`).
|
|
29
|
+
* Small uppercase mono in the muted role; the caller supplies the words.
|
|
30
|
+
*/
|
|
31
|
+
declare function LogoBandLabel({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
32
|
+
export { LogoBand, IntegrationsGrid, LogoBandLabel };
|
|
23
33
|
//# sourceMappingURL=logo-band.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logo-band.d.ts","sourceRoot":"","sources":["../../src/components/logo-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"logo-band.d.ts","sourceRoot":"","sources":["../../src/components/logo-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAgB/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAW,EACX,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CAC5B,qBAYA;AAED,iBAAS,QAAQ,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAEpE;AAED,iBAAS,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,qBAE5E;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQxE;AAED,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -7,6 +7,9 @@ const LOGO_GRID_COLUMNS = {
|
|
|
7
7
|
4: "grid-cols-2 sm:grid-cols-4",
|
|
8
8
|
5: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
|
|
9
9
|
6: "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",
|
|
10
|
+
// V5 auto-fit tile row: cells flow at a minimum comfortable width and share the
|
|
11
|
+
// free space, so a 7-mark row and a 6-mark row both stay optically even.
|
|
12
|
+
auto: "grid-cols-[repeat(auto-fit,minmax(130px,1fr))]",
|
|
10
13
|
};
|
|
11
14
|
/**
|
|
12
15
|
* logo-band / integrations-grid — wall of monochrome marks (replaces the retired
|
|
@@ -18,6 +21,11 @@ const LOGO_GRID_COLUMNS = {
|
|
|
18
21
|
* both and the two names below keep the section vocabulary distinct (matching the
|
|
19
22
|
* retired CSS, which kept two section files over identical primitives).
|
|
20
23
|
*
|
|
24
|
+
* V5 logo-cloud usage: a caller stacks a mono `LogoBandLabel` caption above each
|
|
25
|
+
* auto-fit tile row (`columns="auto"`), e.g. "the tools you already use" over one
|
|
26
|
+
* row and "many models, no lock-in" over the next — the two-row composition is the
|
|
27
|
+
* caller's, this component only owns one labelled tile wall.
|
|
28
|
+
*
|
|
21
29
|
* SINGLE-OWNER SEAM: the grid owns every divider once (`gap-px bg-border`). Each
|
|
22
30
|
* `LogoTile` is borderless and square-cornered. `surface="ink"` flips only the
|
|
23
31
|
* seam colour, never its weight. Token-only; no `dark:` styling.
|
|
@@ -31,4 +39,11 @@ function LogoBand({ ...props }) {
|
|
|
31
39
|
function IntegrationsGrid({ ...props }) {
|
|
32
40
|
return _jsx(LogoGrid, { "data-slot": "integrations-grid", ...props });
|
|
33
41
|
}
|
|
34
|
-
|
|
42
|
+
/**
|
|
43
|
+
* LogoBandLabel — the mono caption row that sits above a tile wall (V5 `.lab`).
|
|
44
|
+
* Small uppercase mono in the muted role; the caller supplies the words.
|
|
45
|
+
*/
|
|
46
|
+
function LogoBandLabel({ className, ...props }) {
|
|
47
|
+
return (_jsx("p", { "data-slot": "logo-band-label", className: cn("nc-type-caption-mono uppercase text-muted-foreground", className), ...props }));
|
|
48
|
+
}
|
|
49
|
+
export { LogoBand, IntegrationsGrid, LogoBandLabel };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logo-tile.d.ts","sourceRoot":"","sources":["../../src/components/logo-tile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;GASG;AAEH,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAa9D;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"logo-tile.d.ts","sourceRoot":"","sources":["../../src/components/logo-tile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;GASG;AAEH,iBAAS,QAAQ,CAAC,EAChB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAa9D;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAc/D;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ5E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ1E;AAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -14,12 +14,15 @@ function LogoTile({ className, surface = "canvas", ...props }) {
|
|
|
14
14
|
return (_jsx("div", { "data-slot": "logo-tile", "data-surface": surface, className: cn("grid min-h-24 place-content-center justify-items-center gap-2 p-[18px]", surface === "ink" ? "bg-primary" : "bg-card", className), ...props }));
|
|
15
15
|
}
|
|
16
16
|
function LogoTileMark({ className, surface = "canvas", ...props }) {
|
|
17
|
-
return (_jsx("span", { "data-slot": "logo-tile-mark", className: cn("block h-7 w-auto [&_svg]:h-full [&_svg]:w-auto [&_img]:h-full [&_img]:w-auto",
|
|
17
|
+
return (_jsx("span", { "data-slot": "logo-tile-mark", className: cn("block h-7 w-auto [&_svg]:h-full [&_svg]:w-auto [&_img]:h-full [&_img]:w-auto",
|
|
18
|
+
// Semantic roles keep the mark's purpose explicit: on ink (verde) it
|
|
19
|
+
// reads as on-primary; on canvas it reads as muted body.
|
|
20
|
+
surface === "ink" ? "text-primary-foreground" : "text-muted-foreground", className), ...props }));
|
|
18
21
|
}
|
|
19
22
|
function LogoTileMetric({ className, ...props }) {
|
|
20
23
|
return (_jsx("span", { "data-slot": "logo-tile-metric", className: cn("font-mono text-xs uppercase text-muted-foreground", className), ...props }));
|
|
21
24
|
}
|
|
22
25
|
function LogoTileName({ className, ...props }) {
|
|
23
|
-
return (_jsx("span", { "data-slot": "logo-tile-name", className: cn("text-[13px] leading-4 text-
|
|
26
|
+
return (_jsx("span", { "data-slot": "logo-tile-name", className: cn("text-[13px] leading-4 text-muted-foreground", className), ...props }));
|
|
24
27
|
}
|
|
25
28
|
export { LogoTile, LogoTileMark, LogoTileMetric, LogoTileName };
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
/**
|
|
3
|
-
* nav-bar —
|
|
3
|
+
* nav-bar — the fixed, always-dark glass navigation bar (V5).
|
|
4
4
|
*
|
|
5
5
|
* A three-track grid (`1fr auto 1fr`): logo lockup leading, route links centered,
|
|
6
|
-
* CTA cluster trailing.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* the
|
|
6
|
+
* CTA cluster trailing. It is a PERMANENT dark glass bar regardless of the page
|
|
7
|
+
* section it floats over, so the root carries its own `dark` ancestor class and
|
|
8
|
+
* resolves every surface from semantic roles (`bg-background`, `text-foreground`,
|
|
9
|
+
* `border-border`). The glass is the dark canvas at 70% plus a backdrop blur, so
|
|
10
|
+
* the chrome reads as one continuous translucent bar.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* SINGLE-OWNER SEAM: the only edge it owns is its bottom border
|
|
13
|
+
* (`border-b border-border`). `position: fixed` pins it to the viewport top; the
|
|
14
|
+
* consuming page owns the top padding that clears it. Below ~960px the centered
|
|
15
|
+
* links slot hides and the grid collapses to logo + CTA.
|
|
16
|
+
*
|
|
17
|
+
* A11y: links/triggers expose a `--ring` focus outline; the consumer wraps this in
|
|
18
|
+
* a `<nav aria-label>`. Token-only; the root sets its own `dark` class (an accepted
|
|
19
|
+
* ancestor-class remap), never `dark:` utilities.
|
|
14
20
|
*/
|
|
15
21
|
declare function NavBar({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
16
22
|
declare function NavBarLogo({ className, ...props }: React.ComponentProps<"a">): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B
|
|
1
|
+
{"version":3,"file":"nav-bar.d.ts","sourceRoot":"","sources":["../../src/components/nav-bar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;;;;;;GAkBG;AAEH,iBAAS,MAAM,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAYnE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAWrE;AAED,iBAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAgBxE;AAED,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1,30 +1,36 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../lib/utils.js";
|
|
3
3
|
/**
|
|
4
|
-
* nav-bar —
|
|
4
|
+
* nav-bar — the fixed, always-dark glass navigation bar (V5).
|
|
5
5
|
*
|
|
6
6
|
* A three-track grid (`1fr auto 1fr`): logo lockup leading, route links centered,
|
|
7
|
-
* CTA cluster trailing.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the
|
|
7
|
+
* CTA cluster trailing. It is a PERMANENT dark glass bar regardless of the page
|
|
8
|
+
* section it floats over, so the root carries its own `dark` ancestor class and
|
|
9
|
+
* resolves every surface from semantic roles (`bg-background`, `text-foreground`,
|
|
10
|
+
* `border-border`). The glass is the dark canvas at 70% plus a backdrop blur, so
|
|
11
|
+
* the chrome reads as one continuous translucent bar.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* SINGLE-OWNER SEAM: the only edge it owns is its bottom border
|
|
14
|
+
* (`border-b border-border`). `position: fixed` pins it to the viewport top; the
|
|
15
|
+
* consuming page owns the top padding that clears it. Below ~960px the centered
|
|
16
|
+
* links slot hides and the grid collapses to logo + CTA.
|
|
17
|
+
*
|
|
18
|
+
* A11y: links/triggers expose a `--ring` focus outline; the consumer wraps this in
|
|
19
|
+
* a `<nav aria-label>`. Token-only; the root sets its own `dark` class (an accepted
|
|
20
|
+
* ancestor-class remap), never `dark:` utilities.
|
|
15
21
|
*/
|
|
16
22
|
function NavBar({ className, ...props }) {
|
|
17
|
-
return (_jsx("div", { "data-slot": "nav-bar", className: cn("
|
|
23
|
+
return (_jsx("div", { "data-slot": "nav-bar", className: cn("dark fixed inset-x-0 top-0 z-30 grid min-h-16 grid-cols-[1fr_auto] items-center gap-4 px-4 py-3 text-foreground sm:px-8 lg:grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)]", "border-b border-border bg-background/70 backdrop-blur-[14px]", className), ...props }));
|
|
18
24
|
}
|
|
19
25
|
function NavBarLogo({ className, ...props }) {
|
|
20
26
|
return (_jsx("a", { "data-slot": "nav-bar-logo", className: cn("inline-flex w-fit items-center gap-2.5 text-sm font-semibold text-foreground no-underline [&_img]:block [&_img]:h-7 [&_img]:w-auto [&_svg]:block [&_svg]:h-7 [&_svg]:w-auto", className), ...props }));
|
|
21
27
|
}
|
|
22
28
|
function NavBarLinks({ className, ...props }) {
|
|
23
|
-
return (_jsx("div", { "data-slot": "nav-bar-links", className: cn("hidden items-center justify-center gap-1 text-sm text-
|
|
24
|
-
// each link reads as a flat
|
|
25
|
-
"[&_a]:rounded-[var(--nc-rounded-sm)] [&_a]:px-3 [&_a]:py-2 [&_a]:text-inherit [&_a]:no-underline", "[&_a:hover]:bg-
|
|
29
|
+
return (_jsx("div", { "data-slot": "nav-bar-links", className: cn("hidden items-center justify-center gap-1 text-sm text-muted-foreground lg:inline-flex",
|
|
30
|
+
// each link reads as a flat pill with hover/focus affordance against the glass.
|
|
31
|
+
"[&_a]:rounded-[var(--nc-rounded-sm)] [&_a]:px-3 [&_a]:py-2 [&_a]:text-inherit [&_a]:no-underline [&_a]:transition-colors", "[&_a:hover]:bg-accent [&_a:hover]:text-foreground", "[&_a[data-active]]:text-foreground", "[&_a:focus-visible]:outline [&_a:focus-visible]:outline-1 [&_a:focus-visible]:[outline-color:var(--ring)] [&_a:focus-visible]:outline-offset-2", className), ...props }));
|
|
26
32
|
}
|
|
27
33
|
function NavBarCta({ className, ...props }) {
|
|
28
|
-
return (_jsx("div", { "data-slot": "nav-bar-cta", className: cn("inline-flex items-center justify-self-end", className), ...props }));
|
|
34
|
+
return (_jsx("div", { "data-slot": "nav-bar-cta", className: cn("inline-flex items-center gap-3 justify-self-end", className), ...props }));
|
|
29
35
|
}
|
|
30
36
|
export { NavBar, NavBarLogo, NavBarLinks, NavBarCta };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"popover.d.ts","sourceRoot":"","sources":["../../src/components/popover.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAKrE,iBAAS,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,qBAEzD;AAED,iBAAS,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,qBAEnE;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,KAAgB,EAChB,WAAe,EACf,IAAe,EACf,UAAc,EACd,GAAG,KAAK,EACT,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,GAC7B,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC,qBAsBzF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,iBAAS,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,qBAQ1E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,WAAW,CAAC,KAAK,qBAQtF;AAED,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
|
|
3
3
|
import { cn } from "../lib/utils.js";
|
|
4
|
+
import { anchoredOverlayMotion } from "../lib/motion.js";
|
|
4
5
|
function Popover({ ...props }) {
|
|
5
6
|
return _jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
|
|
6
7
|
}
|
|
@@ -8,7 +9,7 @@ function PopoverTrigger({ ...props }) {
|
|
|
8
9
|
return _jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
|
|
9
10
|
}
|
|
10
11
|
function PopoverContent({ className, align = "center", alignOffset = 0, side = "bottom", sideOffset = 4, ...props }) {
|
|
11
|
-
return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Positioner, { align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, className: "isolate z-50", children: _jsx(PopoverPrimitive.Popup, { "data-slot": "popover-content", className: cn("z-50 flex w-72
|
|
12
|
+
return (_jsx(PopoverPrimitive.Portal, { children: _jsx(PopoverPrimitive.Positioner, { align: align, alignOffset: alignOffset, side: side, sideOffset: sideOffset, className: "isolate z-50", children: _jsx(PopoverPrimitive.Popup, { "data-slot": "popover-content", className: cn("z-50 flex w-72 flex-col gap-control-padding-inline rounded-2xl border border-border bg-popover p-control-padding-inline text-sm text-popover-foreground shadow-menu outline-hidden", anchoredOverlayMotion, className), ...props }) }) }));
|
|
12
13
|
}
|
|
13
14
|
function PopoverHeader({ className, ...props }) {
|
|
14
15
|
return (_jsx("div", { "data-slot": "popover-header", className: cn("flex flex-col gap-0.5 text-sm", className), ...props }));
|
|
@@ -1,22 +1,17 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
/**
|
|
3
|
-
* pricing-card — the brand pricing/package tier molecule (
|
|
4
|
-
* `.nc-pricing-card` / `.nc-pricing-card-featured` CSS).
|
|
3
|
+
* pricing-card — the brand pricing/package tier molecule (V5 rework).
|
|
5
4
|
*
|
|
6
|
-
* A seam-free
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* red featured RAIL is NOT drawn here — it is a single-owner inset rail owned by the
|
|
12
|
-
* `Pricing` section (`emphasis="featured"`), so this molecule only carries the
|
|
13
|
-
* surface inversion and never double-draws a seam.
|
|
5
|
+
* A seam-free fill: it drops into the holding `Pricing` grid, which owns every
|
|
6
|
+
* hairline divider through its gap-as-seam (`gap-px bg-border`). The card draws NO
|
|
7
|
+
* border and has square corners so the grid line never shows through a rounded
|
|
8
|
+
* edge. It is a full-height flex column so `PricingCardCta` (`mt-auto`) pins to the
|
|
9
|
+
* bottom and aligns across tiers.
|
|
14
10
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* when featured. Token-only; no `dark:` styling.
|
|
11
|
+
* `variant="featured"` (V5) reads as featured through a SOFT canvas surface — a
|
|
12
|
+
* quiet fill change, not an ink/primary polarity flip and not an inset rail. The
|
|
13
|
+
* body/eyebrow/feature tones are identical to the default card; only the surface
|
|
14
|
+
* differs. Server-renderable; token-only; no `dark:` styling.
|
|
20
15
|
*/
|
|
21
16
|
declare function PricingCard({ className, variant, ...props }: React.ComponentProps<"div"> & {
|
|
22
17
|
variant?: "default" | "featured";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-card.d.ts","sourceRoot":"","sources":["../../src/components/pricing-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B
|
|
1
|
+
{"version":3,"file":"pricing-card.d.ts","sourceRoot":"","sources":["../../src/components/pricing-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;;GAaG;AAEH,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,OAAmB,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,CAAA;CAAE,qBAgBpE;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ7E;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ5E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAmBrF;AAED,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQ1E;AAED,iBAAS,mBAAmB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ/E;AAED,iBAAS,kBAAkB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAkBxF;AAED,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ3E;AAED,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,GACf,CAAC"}
|
|
@@ -1,35 +1,24 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../lib/utils.js";
|
|
3
3
|
/**
|
|
4
|
-
* pricing-card — the brand pricing/package tier molecule (
|
|
5
|
-
* `.nc-pricing-card` / `.nc-pricing-card-featured` CSS).
|
|
4
|
+
* pricing-card — the brand pricing/package tier molecule (V5 rework).
|
|
6
5
|
*
|
|
7
|
-
* A seam-free
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* red featured RAIL is NOT drawn here — it is a single-owner inset rail owned by the
|
|
13
|
-
* `Pricing` section (`emphasis="featured"`), so this molecule only carries the
|
|
14
|
-
* surface inversion and never double-draws a seam.
|
|
6
|
+
* A seam-free fill: it drops into the holding `Pricing` grid, which owns every
|
|
7
|
+
* hairline divider through its gap-as-seam (`gap-px bg-border`). The card draws NO
|
|
8
|
+
* border and has square corners so the grid line never shows through a rounded
|
|
9
|
+
* edge. It is a full-height flex column so `PricingCardCta` (`mt-auto`) pins to the
|
|
10
|
+
* bottom and aligns across tiers.
|
|
15
11
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* when featured. Token-only; no `dark:` styling.
|
|
12
|
+
* `variant="featured"` (V5) reads as featured through a SOFT canvas surface — a
|
|
13
|
+
* quiet fill change, not an ink/primary polarity flip and not an inset rail. The
|
|
14
|
+
* body/eyebrow/feature tones are identical to the default card; only the surface
|
|
15
|
+
* differs. Server-renderable; token-only; no `dark:` styling.
|
|
21
16
|
*/
|
|
22
17
|
function PricingCard({ className, variant = "default", ...props }) {
|
|
23
|
-
return (_jsx("div", { "data-slot": "pricing-card", "data-variant": variant, className: cn("
|
|
24
|
-
// featured:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"[&_[data-slot=pricing-card-eyebrow]]:text-primary-foreground/65",
|
|
28
|
-
"[&_[data-slot=pricing-card-period]]:text-primary-foreground/65",
|
|
29
|
-
"[&_[data-slot=pricing-card-note]]:text-primary-foreground/80",
|
|
30
|
-
"[&_[data-slot=pricing-card-feature]]:text-primary-foreground/80",
|
|
31
|
-
"[&_[data-slot=pricing-card-feature-mark]]:text-primary-foreground",
|
|
32
|
-
], className), ...props }));
|
|
18
|
+
return (_jsx("div", { "data-slot": "pricing-card", "data-variant": variant, className: cn("flex h-full flex-col gap-[18px] p-8 text-card-foreground", variant === "default" && "bg-card",
|
|
19
|
+
// featured (V5): soft canvas surface — a quiet fill change only. The
|
|
20
|
+
// `muted` role (== canvas-soft) flips with any `.dark` ancestor.
|
|
21
|
+
variant === "featured" && "bg-muted", className), ...props }));
|
|
33
22
|
}
|
|
34
23
|
function PricingCardEyebrow({ className, ...props }) {
|
|
35
24
|
return (_jsx("p", { "data-slot": "pricing-card-eyebrow", className: cn("font-mono text-xs font-medium uppercase text-muted-foreground", className), ...props }));
|
|
@@ -38,18 +27,18 @@ function PricingCardName({ className, ...props }) {
|
|
|
38
27
|
return (_jsx("div", { "data-slot": "pricing-card-name", className: cn("text-2xl font-semibold", className), ...props }));
|
|
39
28
|
}
|
|
40
29
|
function PricingCardPrice({ className, children, amount, period, ...props }) {
|
|
41
|
-
return (_jsxs("div", { "data-slot": "pricing-card-price", className: cn("flex items-baseline gap-1.5", className), ...props, children: [_jsx("span", { className: "text-[40px] leading-none font-semibold", children: amount }), period ? (_jsx("span", { "data-slot": "pricing-card-period", className: "font-mono text-xs uppercase text-muted-foreground", children: period })) : null, children] }));
|
|
30
|
+
return (_jsxs("div", { "data-slot": "pricing-card-price", className: cn("flex items-baseline gap-1.5", className), ...props, children: [_jsx("span", { className: "text-[40px] leading-none font-semibold tabular-nums", children: amount }), period ? (_jsx("span", { "data-slot": "pricing-card-period", className: "font-mono text-xs uppercase text-muted-foreground", children: period })) : null, children] }));
|
|
42
31
|
}
|
|
43
32
|
function PricingCardNote({ className, ...props }) {
|
|
44
|
-
return (_jsx("p", { "data-slot": "pricing-card-note", className: cn("m-0 text-sm text-
|
|
33
|
+
return (_jsx("p", { "data-slot": "pricing-card-note", className: cn("m-0 text-sm text-muted-foreground", className), ...props }));
|
|
45
34
|
}
|
|
46
35
|
function PricingCardFeatures({ className, ...props }) {
|
|
47
36
|
return (_jsx("ul", { "data-slot": "pricing-card-features", className: cn("m-0 grid list-none gap-2.5 p-0", className), ...props }));
|
|
48
37
|
}
|
|
49
38
|
function PricingCardFeature({ className, children, ...props }) {
|
|
50
|
-
return (_jsxs("li", { "data-slot": "pricing-card-feature", className: cn("grid grid-cols-[auto_minmax(0,1fr)] items-start gap-2.5 text-sm text-
|
|
39
|
+
return (_jsxs("li", { "data-slot": "pricing-card-feature", className: cn("grid grid-cols-[auto_minmax(0,1fr)] items-start gap-2.5 text-sm text-muted-foreground", className), ...props, children: [_jsx("span", { "data-slot": "pricing-card-feature-mark", "aria-hidden": "true", className: "mt-[3px] size-2.5 rounded-[1px] border border-primary bg-[var(--nc-link-bg-soft)]" }), _jsx("span", { children: children })] }));
|
|
51
40
|
}
|
|
52
41
|
function PricingCardCta({ className, ...props }) {
|
|
53
|
-
return (_jsx("div", { "data-slot": "pricing-card-cta", className: cn("mt-1.5 [&>*]:w-full", className), ...props }));
|
|
42
|
+
return (_jsx("div", { "data-slot": "pricing-card-cta", className: cn("mt-auto pt-1.5 [&>*]:w-full", className), ...props }));
|
|
54
43
|
}
|
|
55
44
|
export { PricingCard, PricingCardEyebrow, PricingCardName, PricingCardPrice, PricingCardNote, PricingCardFeatures, PricingCardFeature, PricingCardCta, };
|