@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,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, };
|
|
@@ -1,26 +1,23 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
/**
|
|
3
|
-
* pricing — package/tier comparison row (
|
|
4
|
-
* + its coupled `pricing-card` / `pricing-card-featured` molecules).
|
|
3
|
+
* pricing — package/tier comparison row (V5 rework).
|
|
5
4
|
*
|
|
6
|
-
* SINGLE-OWNER SEAM
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* positioning context (`relative`). The featured card's polarity flip lives in
|
|
16
|
-
* the `PricingCard variant="featured"` molecule, not here.
|
|
5
|
+
* SINGLE-OWNER SEAM: the DIVIDERS between tiers are owned once by the grid —
|
|
6
|
+
* `SeamGrid` (no surface) paints the brand `line` behind the cards and leaves a
|
|
7
|
+
* 1px guide gap (`gap-px bg-border`). Each `PricingCard` is borderless and
|
|
8
|
+
* square-cornered, so it never repeats that coordinate.
|
|
9
|
+
*
|
|
10
|
+
* FEATURED TIER (V5): the featured (middle) column reads as featured through a
|
|
11
|
+
* SOFT canvas surface, owned by `PricingCard variant="featured"` — there is no
|
|
12
|
+
* inset rail or polarity flip in this rework. `emphasis` is kept for API
|
|
13
|
+
* compatibility and surfaces as `data-emphasis`; it draws nothing here.
|
|
17
14
|
*
|
|
18
15
|
* The frame/lane/row geometry (perimeter + top/bottom seams) is owned by the kept
|
|
19
16
|
* structural-geometry layer the page composes this inside; `Pricing` owns no frame
|
|
20
17
|
* math, no marker, and no perimeter line. Token-only; no `dark:` styling.
|
|
21
18
|
*/
|
|
22
19
|
type PricingEmphasis = "none" | "featured";
|
|
23
|
-
declare function Pricing({ className, columns, emphasis,
|
|
20
|
+
declare function Pricing({ className, columns, emphasis, ...props }: React.ComponentProps<"div"> & {
|
|
24
21
|
columns?: 2 | 3;
|
|
25
22
|
emphasis?: PricingEmphasis;
|
|
26
23
|
}): React.JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/components/pricing.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;;GAgBG;AAEH,KAAK,eAAe,GAAG,MAAM,GAAG,UAAU,CAAC;AAE3C,iBAAS,OAAO,CAAC,EACf,SAAS,EACT,OAAW,EACX,QAAiB,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC5B,qBAgBA;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
import { jsx as _jsx
|
|
2
|
-
import * as React from "react";
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
2
|
import { cn } from "../lib/utils.js";
|
|
4
3
|
import { SeamGrid } from "./seam-grid.js";
|
|
5
|
-
function Pricing({ className, columns = 3, emphasis = "none",
|
|
4
|
+
function Pricing({ className, columns = 3, emphasis = "none", ...props }) {
|
|
6
5
|
return (_jsx(SeamGrid, { "data-slot": "pricing", "data-emphasis": emphasis, className: cn(
|
|
7
6
|
// gap-as-seam: SeamGrid (no surface) is the single owner of every divider
|
|
8
|
-
// between tiers (`gap-px bg-border`).
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
emphasis === "featured" && "[&_[data-variant=featured]]:relative", className), ...props, children: emphasis === "featured"
|
|
12
|
-
? React.Children.map(children, (child) => {
|
|
13
|
-
if (React.isValidElement(child) &&
|
|
14
|
-
child.props.variant === "featured") {
|
|
15
|
-
return React.cloneElement(child, undefined, _jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 start-0 w-[3px] bg-[var(--nc-flag-red)]" }), child.props.children] }));
|
|
16
|
-
}
|
|
17
|
-
return child;
|
|
18
|
-
})
|
|
19
|
-
: children }));
|
|
7
|
+
// between tiers (`gap-px bg-border`). Cards stretch to equal height so the
|
|
8
|
+
// bottom-pinned CTA aligns across columns.
|
|
9
|
+
"h-full items-stretch", columns === 2 ? "grid-cols-1 sm:grid-cols-2" : "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3", className), ...props }));
|
|
20
10
|
}
|
|
21
11
|
export { Pricing };
|
|
@@ -15,9 +15,17 @@ import * as React from "react";
|
|
|
15
15
|
declare function QuoteCard({ className, surface, ...props }: React.ComponentProps<"figure"> & {
|
|
16
16
|
surface?: "canvas" | "ink";
|
|
17
17
|
}): React.JSX.Element;
|
|
18
|
-
declare function QuoteCardBody({ className, ...props }: React.ComponentProps<"blockquote">
|
|
18
|
+
declare function QuoteCardBody({ className, size, ...props }: React.ComponentProps<"blockquote"> & {
|
|
19
|
+
size?: "md" | "lg";
|
|
20
|
+
}): React.JSX.Element;
|
|
21
|
+
/**
|
|
22
|
+
* QuoteCardAvatar — the tint circle (an initial) that opens the attribution row.
|
|
23
|
+
* A verde-tint chip: soft `success` field, `--nc-link` (verde) glyph. Decorative
|
|
24
|
+
* (`aria-hidden`), so the attribution name/role carry the accessible identity.
|
|
25
|
+
*/
|
|
26
|
+
declare function QuoteCardAvatar({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
19
27
|
declare function QuoteCardAttribution({ className, ...props }: React.ComponentProps<"figcaption">): React.JSX.Element;
|
|
20
28
|
declare function QuoteCardName({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
21
29
|
declare function QuoteCardRole({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
22
|
-
export { QuoteCard, QuoteCardBody, QuoteCardAttribution, QuoteCardName, QuoteCardRole };
|
|
30
|
+
export { QuoteCard, QuoteCardBody, QuoteCardAvatar, QuoteCardAttribution, QuoteCardName, QuoteCardRole, };
|
|
23
31
|
//# sourceMappingURL=quote-card.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote-card.d.ts","sourceRoot":"","sources":["../../src/components/quote-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAmBjE;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"quote-card.d.ts","sourceRoot":"","sources":["../../src/components/quote-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;;;GAYG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAmBjE;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,IAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,qBAiB7D;AAED;;;;GAIG;AACH,iBAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAY7E;AAED,iBAAS,oBAAoB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,qBAQxF;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQ1E;AAED,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,CAAC"}
|
|
@@ -21,8 +21,20 @@ function QuoteCard({ className, surface = "canvas", ...props }) {
|
|
|
21
21
|
"[&_[data-slot=quote-card-role]]:text-[color-mix(in_srgb,var(--nc-canvas)_60%,var(--nc-muted))]",
|
|
22
22
|
], className), ...props }));
|
|
23
23
|
}
|
|
24
|
-
function QuoteCardBody({ className, ...props }) {
|
|
25
|
-
return (_jsx("blockquote", { "data-slot": "quote-card-body", className: cn("m-0
|
|
24
|
+
function QuoteCardBody({ className, size = "md", ...props }) {
|
|
25
|
+
return (_jsx("blockquote", { "data-slot": "quote-card-body", "data-size": size, className: cn("m-0 font-normal text-foreground",
|
|
26
|
+
// md: the default measure. lg: the featured "big quote" (V5 B13) — a tighter
|
|
27
|
+
// measure and a display-scale clamp for the single testimonial slot.
|
|
28
|
+
size === "md" && "text-lg leading-[1.5]", size === "lg" &&
|
|
29
|
+
"max-w-[26ch] text-[clamp(24px,2.4vw,34px)] leading-[1.2] font-semibold tracking-[-0.02em]", className), ...props }));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* QuoteCardAvatar — the tint circle (an initial) that opens the attribution row.
|
|
33
|
+
* A verde-tint chip: soft `success` field, `--nc-link` (verde) glyph. Decorative
|
|
34
|
+
* (`aria-hidden`), so the attribution name/role carry the accessible identity.
|
|
35
|
+
*/
|
|
36
|
+
function QuoteCardAvatar({ className, ...props }) {
|
|
37
|
+
return (_jsx("span", { "data-slot": "quote-card-avatar", "aria-hidden": "true", className: cn("flex size-11 shrink-0 items-center justify-center rounded-full bg-success/15 text-base font-semibold text-[var(--nc-link)]", className), ...props }));
|
|
26
38
|
}
|
|
27
39
|
function QuoteCardAttribution({ className, ...props }) {
|
|
28
40
|
return (_jsx("figcaption", { "data-slot": "quote-card-attribution", className: cn("flex items-center gap-3", className), ...props }));
|
|
@@ -33,4 +45,4 @@ function QuoteCardName({ className, ...props }) {
|
|
|
33
45
|
function QuoteCardRole({ className, ...props }) {
|
|
34
46
|
return (_jsx("div", { "data-slot": "quote-card-role", className: cn("font-mono text-xs uppercase text-muted-foreground", className), ...props }));
|
|
35
47
|
}
|
|
36
|
-
export { QuoteCard, QuoteCardBody, QuoteCardAttribution, QuoteCardName, QuoteCardRole };
|
|
48
|
+
export { QuoteCard, QuoteCardBody, QuoteCardAvatar, QuoteCardAttribution, QuoteCardName, QuoteCardRole, };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* security-grid — the always-dark control/data grid (V5 B14).
|
|
4
|
+
*
|
|
5
|
+
* A bordered 4-cell grid on the night surface: each cell carries a bordered
|
|
6
|
+
* glyph box (icon slot), a title, and a body line. The dividers are owned once
|
|
7
|
+
* by `SeamGrid` (gap-as-seam, `bg-border`); cells are borderless fills.
|
|
8
|
+
*
|
|
9
|
+
* ALWAYS-DARK: this section renders dark regardless of the page theme. Rather
|
|
10
|
+
* than a `dark:` utility (forbidden) it sets the `dark` ancestor class on its
|
|
11
|
+
* own root, so every semantic role it composes (`bg-border` seam, `bg-card`
|
|
12
|
+
* fill, `text-foreground`, `text-muted-foreground`, `text-primary`) resolves to
|
|
13
|
+
* its dark value. Only the standard shadcn role vars are used. Token-only.
|
|
14
|
+
*/
|
|
15
|
+
declare const columnClasses: Record<number, string>;
|
|
16
|
+
declare function SecurityGrid({ className, columns, ...props }: React.ComponentProps<"div"> & {
|
|
17
|
+
columns?: keyof typeof columnClasses;
|
|
18
|
+
}): React.JSX.Element;
|
|
19
|
+
declare function SecurityCell({ className, icon, title, body, ...props }: React.ComponentProps<"div"> & {
|
|
20
|
+
icon?: React.ReactNode;
|
|
21
|
+
title: string;
|
|
22
|
+
body: string;
|
|
23
|
+
}): React.JSX.Element;
|
|
24
|
+
export { SecurityGrid, SecurityCell };
|
|
25
|
+
//# sourceMappingURL=security-grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-grid.d.ts","sourceRoot":"","sources":["../../src/components/security-grid.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIzC,CAAC;AAEF,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,OAAW,EACX,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,OAAO,aAAa,CAAA;CAAE,qBAUxE;AAED,iBAAS,YAAY,CAAC,EACpB,SAAS,EACT,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,qBAsBA;AAED,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
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
|
+
* security-grid — the always-dark control/data grid (V5 B14).
|
|
6
|
+
*
|
|
7
|
+
* A bordered 4-cell grid on the night surface: each cell carries a bordered
|
|
8
|
+
* glyph box (icon slot), a title, and a body line. The dividers are owned once
|
|
9
|
+
* by `SeamGrid` (gap-as-seam, `bg-border`); cells are borderless fills.
|
|
10
|
+
*
|
|
11
|
+
* ALWAYS-DARK: this section renders dark regardless of the page theme. Rather
|
|
12
|
+
* than a `dark:` utility (forbidden) it sets the `dark` ancestor class on its
|
|
13
|
+
* own root, so every semantic role it composes (`bg-border` seam, `bg-card`
|
|
14
|
+
* fill, `text-foreground`, `text-muted-foreground`, `text-primary`) resolves to
|
|
15
|
+
* its dark value. Only the standard shadcn role vars are used. Token-only.
|
|
16
|
+
*/
|
|
17
|
+
const columnClasses = {
|
|
18
|
+
2: "grid-cols-1 sm:grid-cols-2",
|
|
19
|
+
3: "grid-cols-1 sm:grid-cols-3",
|
|
20
|
+
4: "grid-cols-2 lg:grid-cols-4",
|
|
21
|
+
};
|
|
22
|
+
function SecurityGrid({ className, columns = 4, ...props }) {
|
|
23
|
+
return (
|
|
24
|
+
// `dark` on the root flips every role below to its night value; SeamGrid
|
|
25
|
+
// keeps sole ownership of the seams (its `bg-border` resolves dark here).
|
|
26
|
+
_jsx(SeamGrid, { "data-slot": "security-grid", className: cn("dark", columnClasses[columns], className), ...props }));
|
|
27
|
+
}
|
|
28
|
+
function SecurityCell({ className, icon, title, body, ...props }) {
|
|
29
|
+
return (_jsxs("div", { "data-slot": "security-cell", className: cn("nc-panel-cell content-start bg-card", className), ...props, children: [_jsx("span", { "data-slot": "security-cell-glyph", className: "grid size-[34px] place-items-center border border-border text-primary", "aria-hidden": icon ? undefined : true, children: icon }), _jsx("h3", { "data-slot": "security-cell-title", className: "nc-type-body-md-strong text-foreground", children: title }), _jsx("p", { "data-slot": "security-cell-body", className: "nc-type-body-sm text-muted-foreground", children: body })] }));
|
|
30
|
+
}
|
|
31
|
+
export { SecurityGrid, SecurityCell };
|
|
@@ -163,7 +163,7 @@ function SidebarMenu({ className, ...props }) {
|
|
|
163
163
|
function SidebarMenuItem({ className, ...props }) {
|
|
164
164
|
return (_jsx("li", { "data-slot": "sidebar-menu-item", "data-sidebar": "menu-item", className: cn("group/menu-item relative", className), ...props }));
|
|
165
165
|
}
|
|
166
|
-
const sidebarMenuButtonVariants = cva("peer/menu-button group/menu-button flex min-h-touch-target min-w-touch-target w-full items-center gap-2 overflow-hidden rounded-md border border-transparent p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-control-height! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:border-sidebar-ring focus-visible:ring-focus active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-
|
|
166
|
+
const sidebarMenuButtonVariants = cva("peer/menu-button group/menu-button flex min-h-touch-target min-w-touch-target w-full items-center gap-2 overflow-hidden rounded-md border border-transparent p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding,background-color,color] group-has-data-[sidebar=menu-action]/menu-item:pr-8 group-data-[collapsible=icon]:size-control-height! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:border-sidebar-ring focus-visible:ring-focus active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-open:hover:bg-sidebar-accent data-open:hover:text-sidebar-accent-foreground data-active:bg-sidebar-primary data-active:font-medium data-active:text-sidebar-primary-foreground data-active:hover:bg-sidebar-primary-hover data-active:hover:text-sidebar-primary-foreground data-active:focus-visible:border-sidebar-primary-foreground [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [@media(hover:hover)_and_(pointer:fine)]:min-w-0 [&_svg]:size-4 [&_svg]:shrink-0 [&>span:last-child]:truncate", {
|
|
167
167
|
variants: {
|
|
168
168
|
variant: {
|
|
169
169
|
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
@@ -209,8 +209,8 @@ function SidebarMenuAction({ className, render, showOnHover = false, ...props })
|
|
|
209
209
|
return useRender({
|
|
210
210
|
defaultTagName: "button",
|
|
211
211
|
props: mergeProps({
|
|
212
|
-
className: cn("absolute top-3 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground after:absolute after:top-1/2 after:left-1/2 after:size-touch-target after:-translate-x-1/2 after:-translate-y-1/2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-focus [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=default]/menu-button:top-1.5 [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=lg]/menu-button:top-2.5 [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=sm]/menu-button:top-1 [@media(hover:hover)_and_(pointer:fine)]:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", showOnHover &&
|
|
213
|
-
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100
|
|
212
|
+
className: cn("absolute top-3 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-active/menu-button:text-sidebar-primary-foreground peer-data-active/menu-button:focus-visible:ring-sidebar-primary-foreground after:absolute after:top-1/2 after:left-1/2 after:size-touch-target after:-translate-x-1/2 after:-translate-y-1/2 hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-focus [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=default]/menu-button:top-1.5 [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=lg]/menu-button:top-2.5 [@media(hover:hover)_and_(pointer:fine)]:peer-data-[size=sm]/menu-button:top-1 [@media(hover:hover)_and_(pointer:fine)]:after:hidden [&>svg]:size-4 [&>svg]:shrink-0", showOnHover &&
|
|
213
|
+
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 aria-expanded:opacity-100 md:opacity-0", className),
|
|
214
214
|
}, props),
|
|
215
215
|
render,
|
|
216
216
|
state: {
|
|
@@ -220,7 +220,7 @@ function SidebarMenuAction({ className, render, showOnHover = false, ...props })
|
|
|
220
220
|
});
|
|
221
221
|
}
|
|
222
222
|
function SidebarMenuBadge({ className, ...props }) {
|
|
223
|
-
return (_jsx("div", { "data-slot": "sidebar-menu-badge", "data-sidebar": "menu-badge", className: cn("pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-
|
|
223
|
+
return (_jsx("div", { "data-slot": "sidebar-menu-badge", "data-sidebar": "menu-badge", className: cn("pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none group-data-[collapsible=icon]:hidden peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[size=default]/menu-button:top-1.5 peer-data-[size=lg]/menu-button:top-2.5 peer-data-[size=sm]/menu-button:top-1 peer-data-active/menu-button:text-sidebar-primary-foreground", className), ...props }));
|
|
224
224
|
}
|
|
225
225
|
function SidebarMenuSkeleton({ className, showIcon = false, ...props }) {
|
|
226
226
|
// Random width between 50 to 90%.
|
|
@@ -241,7 +241,7 @@ function SidebarMenuSubButton({ render, size = "md", isActive = false, className
|
|
|
241
241
|
return useRender({
|
|
242
242
|
defaultTagName: "a",
|
|
243
243
|
props: mergeProps({
|
|
244
|
-
className: cn("flex h-7 min-h-touch-target min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-focus active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-
|
|
244
|
+
className: cn("flex h-7 min-h-touch-target min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md border border-transparent px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-colors group-data-[collapsible=icon]:hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-focus active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[size=md]:text-sm data-[size=sm]:text-xs data-active:bg-sidebar-primary data-active:text-sidebar-primary-foreground data-active:hover:bg-sidebar-primary-hover data-active:hover:text-sidebar-primary-foreground data-active:focus-visible:border-sidebar-primary-foreground [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0", className),
|
|
245
245
|
}, props),
|
|
246
246
|
render,
|
|
247
247
|
state: {
|
|
@@ -2,10 +2,13 @@ import * as React from "react";
|
|
|
2
2
|
/**
|
|
3
3
|
* stat-block — single statistic fill (replaces the retired `.nc-stat-block`).
|
|
4
4
|
*
|
|
5
|
-
* A large numeral over a mono label. Seam-free canvas fill: it drops into
|
|
6
|
-
* `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
|
|
7
|
-
* border and is square-cornered. `surface="ink"` inverts onto the ink role for
|
|
8
|
-
* dark band
|
|
5
|
+
* A large tabular numeral over a mono label. Seam-free canvas fill: it drops into
|
|
6
|
+
* the `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
|
|
7
|
+
* NO border and is square-cornered. `surface="ink"` inverts onto the ink role for
|
|
8
|
+
* a dark band; inside a `StatsBand surface="night"` the ancestor `.dark` class
|
|
9
|
+
* flips the default canvas roles, so a plain `StatBlock` reads dark there.
|
|
10
|
+
* `StatBlockFigureAccent` marks the verde substring of a figure (`text-primary`).
|
|
11
|
+
* Token-only; no `dark:` styling.
|
|
9
12
|
*/
|
|
10
13
|
declare function StatBlock({ className, surface, ...props }: React.ComponentProps<"div"> & {
|
|
11
14
|
surface?: "canvas" | "ink";
|
|
@@ -13,8 +16,9 @@ declare function StatBlock({ className, surface, ...props }: React.ComponentProp
|
|
|
13
16
|
declare function StatBlockFigure({ className, surface, ...props }: React.ComponentProps<"div"> & {
|
|
14
17
|
surface?: "canvas" | "ink";
|
|
15
18
|
}): React.JSX.Element;
|
|
19
|
+
declare function StatBlockFigureAccent({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
16
20
|
declare function StatBlockLabel({ className, surface, ...props }: React.ComponentProps<"div"> & {
|
|
17
21
|
surface?: "canvas" | "ink";
|
|
18
22
|
}): React.JSX.Element;
|
|
19
|
-
export { StatBlock, StatBlockFigure, StatBlockLabel };
|
|
23
|
+
export { StatBlock, StatBlockFigure, StatBlockFigureAccent, StatBlockLabel };
|
|
20
24
|
//# sourceMappingURL=stat-block.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stat-block.d.ts","sourceRoot":"","sources":["../../src/components/stat-block.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B
|
|
1
|
+
{"version":3,"file":"stat-block.d.ts","sourceRoot":"","sources":["../../src/components/stat-block.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;AAEH,iBAAS,SAAS,CAAC,EACjB,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,eAAe,CAAC,EACvB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,iBAAS,qBAAqB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQnF;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CAAE,qBAY9D;AAED,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -3,18 +3,24 @@ import { cn } from "../lib/utils.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* stat-block — single statistic fill (replaces the retired `.nc-stat-block`).
|
|
5
5
|
*
|
|
6
|
-
* A large numeral over a mono label. Seam-free canvas fill: it drops into
|
|
7
|
-
* `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
|
|
8
|
-
* border and is square-cornered. `surface="ink"` inverts onto the ink role for
|
|
9
|
-
* dark band
|
|
6
|
+
* A large tabular numeral over a mono label. Seam-free canvas fill: it drops into
|
|
7
|
+
* the `StatsBand` grid which owns the hairline dividers (gap-as-seam), so it draws
|
|
8
|
+
* NO border and is square-cornered. `surface="ink"` inverts onto the ink role for
|
|
9
|
+
* a dark band; inside a `StatsBand surface="night"` the ancestor `.dark` class
|
|
10
|
+
* flips the default canvas roles, so a plain `StatBlock` reads dark there.
|
|
11
|
+
* `StatBlockFigureAccent` marks the verde substring of a figure (`text-primary`).
|
|
12
|
+
* Token-only; no `dark:` styling.
|
|
10
13
|
*/
|
|
11
14
|
function StatBlock({ className, surface = "canvas", ...props }) {
|
|
12
15
|
return (_jsx("div", { "data-slot": "stat-block", "data-surface": surface, className: cn("grid min-h-24 content-center gap-1.5 p-[18px]", surface === "ink" ? "bg-primary" : "bg-card", className), ...props }));
|
|
13
16
|
}
|
|
14
17
|
function StatBlockFigure({ className, surface = "canvas", ...props }) {
|
|
15
|
-
return (_jsx("div", { "data-slot": "stat-block-figure", className: cn("text-[
|
|
18
|
+
return (_jsx("div", { "data-slot": "stat-block-figure", className: cn("text-[clamp(2rem,3.2vw,2.875rem)] leading-none font-bold tabular-nums", surface === "ink" ? "text-primary-foreground" : "text-foreground", className), ...props }));
|
|
19
|
+
}
|
|
20
|
+
function StatBlockFigureAccent({ className, ...props }) {
|
|
21
|
+
return (_jsx("span", { "data-slot": "stat-block-figure-accent", className: cn("text-primary", className), ...props }));
|
|
16
22
|
}
|
|
17
23
|
function StatBlockLabel({ className, surface = "canvas", ...props }) {
|
|
18
24
|
return (_jsx("div", { "data-slot": "stat-block-label", className: cn("font-mono text-xs uppercase", surface === "ink" ? "text-primary-foreground" : "text-muted-foreground", className), ...props }));
|
|
19
25
|
}
|
|
20
|
-
export { StatBlock, StatBlockFigure, StatBlockLabel };
|
|
26
|
+
export { StatBlock, StatBlockFigure, StatBlockFigureAccent, StatBlockLabel };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* statement — a single left-aligned editorial statement block (V5 B04).
|
|
4
|
+
*
|
|
5
|
+
* An indexed mono eyebrow, one large two-tone headline (a lead clause in the
|
|
6
|
+
* foreground role and a continuation clause dropped to the muted role through the
|
|
7
|
+
* `StatementTail` sub-slot), and a body paragraph. No word-split reveal in this
|
|
8
|
+
* pass — the headline is static structure.
|
|
9
|
+
*
|
|
10
|
+
* Compound, slot-driven: the caller supplies every string, this owns measure,
|
|
11
|
+
* alignment, and the two-tone role split. Token-only; no `dark:` styling.
|
|
12
|
+
*/
|
|
13
|
+
declare function Statement({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
14
|
+
/**
|
|
15
|
+
* StatementEyebrow — mono eyebrow with an optional `[NN]` index chip in the
|
|
16
|
+
* canonical link-deep role (deep verde on light / bright verde on dark). The chip
|
|
17
|
+
* renders only when `index` is set.
|
|
18
|
+
*/
|
|
19
|
+
declare function StatementEyebrow({ index, children, className, ...props }: React.ComponentProps<"p"> & {
|
|
20
|
+
index?: React.ReactNode;
|
|
21
|
+
}): React.JSX.Element;
|
|
22
|
+
/**
|
|
23
|
+
* StatementTitle — the large headline. Its lead clause reads in the foreground
|
|
24
|
+
* role; wrap the continuation clause in `StatementTail` to drop it to muted.
|
|
25
|
+
*/
|
|
26
|
+
declare function StatementTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
|
|
27
|
+
/** StatementTail — the muted continuation clause inside `StatementTitle` (V5 `.t2`). */
|
|
28
|
+
declare function StatementTail({ className, ...props }: React.ComponentProps<"span">): React.JSX.Element;
|
|
29
|
+
/** StatementBody — the supporting paragraph under the headline. */
|
|
30
|
+
declare function StatementBody({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
31
|
+
export { Statement, StatementEyebrow, StatementTitle, StatementTail, StatementBody };
|
|
32
|
+
//# sourceMappingURL=statement.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement.d.ts","sourceRoot":"","sources":["../../src/components/statement.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;;;;;;;GAUG;AAEH,iBAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,qBAQtE;AAED;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAkBzD;AAED;;;GAGG;AACH,iBAAS,cAAc,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,qBAQ1E;AAED,wFAAwF;AACxF,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,qBAQ3E;AAED,mEAAmE;AACnE,iBAAS,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,qBAQxE;AAED,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* statement — a single left-aligned editorial statement block (V5 B04).
|
|
5
|
+
*
|
|
6
|
+
* An indexed mono eyebrow, one large two-tone headline (a lead clause in the
|
|
7
|
+
* foreground role and a continuation clause dropped to the muted role through the
|
|
8
|
+
* `StatementTail` sub-slot), and a body paragraph. No word-split reveal in this
|
|
9
|
+
* pass — the headline is static structure.
|
|
10
|
+
*
|
|
11
|
+
* Compound, slot-driven: the caller supplies every string, this owns measure,
|
|
12
|
+
* alignment, and the two-tone role split. Token-only; no `dark:` styling.
|
|
13
|
+
*/
|
|
14
|
+
function Statement({ className, ...props }) {
|
|
15
|
+
return (_jsx("div", { "data-slot": "statement", className: cn("grid justify-items-start gap-6 text-left", className), ...props }));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* StatementEyebrow — mono eyebrow with an optional `[NN]` index chip in the
|
|
19
|
+
* canonical link-deep role (deep verde on light / bright verde on dark). The chip
|
|
20
|
+
* renders only when `index` is set.
|
|
21
|
+
*/
|
|
22
|
+
function StatementEyebrow({ index, children, className, ...props }) {
|
|
23
|
+
return (_jsxs("p", { "data-slot": "statement-eyebrow", className: cn("nc-type-caption-mono flex items-center gap-2 uppercase text-muted-foreground", className), ...props, children: [index != null ? (_jsxs("span", { "data-slot": "statement-eyebrow-index", className: "text-[var(--nc-link-deep)]", children: ["[", index, "]"] })) : null, children] }));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* StatementTitle — the large headline. Its lead clause reads in the foreground
|
|
27
|
+
* role; wrap the continuation clause in `StatementTail` to drop it to muted.
|
|
28
|
+
*/
|
|
29
|
+
function StatementTitle({ className, ...props }) {
|
|
30
|
+
return (_jsx("h2", { "data-slot": "statement-title", className: cn("nc-type-title-lg max-w-[24ch] text-foreground", className), ...props }));
|
|
31
|
+
}
|
|
32
|
+
/** StatementTail — the muted continuation clause inside `StatementTitle` (V5 `.t2`). */
|
|
33
|
+
function StatementTail({ className, ...props }) {
|
|
34
|
+
return (_jsx("span", { "data-slot": "statement-tail", className: cn("text-muted-foreground", className), ...props }));
|
|
35
|
+
}
|
|
36
|
+
/** StatementBody — the supporting paragraph under the headline. */
|
|
37
|
+
function StatementBody({ className, ...props }) {
|
|
38
|
+
return (_jsx("p", { "data-slot": "statement-body", className: cn("nc-type-body-md max-w-[52ch] text-muted-foreground", className), ...props }));
|
|
39
|
+
}
|
|
40
|
+
export { Statement, StatementEyebrow, StatementTitle, StatementTail, StatementBody };
|
|
@@ -8,11 +8,15 @@ import * as React from "react";
|
|
|
8
8
|
* square-cornered fill, so no coordinate carries two lines. `surface="ink"` flips
|
|
9
9
|
* the band onto the ink role; only the seam COLOUR changes (the grid background
|
|
10
10
|
* mixes toward the surface), never its weight, so the grid keeps sole ownership.
|
|
11
|
-
*
|
|
11
|
+
*
|
|
12
|
+
* `surface="night"` is the always-dark V5 stats band (B12): rather than a `dark:`
|
|
13
|
+
* utility (forbidden) it sets the `dark` ancestor class on the grid root, so the
|
|
14
|
+
* seam (`bg-border`) and every `StatBlock` role resolve to their dark value while
|
|
15
|
+
* the grid keeps its plain canvas seam. Token-only; no `dark:` styling.
|
|
12
16
|
*/
|
|
13
17
|
declare function StatsBand({ className, columns, surface, ...props }: React.ComponentProps<"div"> & {
|
|
14
18
|
columns?: 2 | 3 | 4 | 5 | 6;
|
|
15
|
-
surface?: "canvas" | "ink";
|
|
19
|
+
surface?: "canvas" | "ink" | "night";
|
|
16
20
|
}): React.JSX.Element;
|
|
17
21
|
export { StatsBand };
|
|
18
22
|
//# sourceMappingURL=stats-band.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stats-band.d.ts","sourceRoot":"","sources":["../../src/components/stats-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B
|
|
1
|
+
{"version":3,"file":"stats-band.d.ts","sourceRoot":"","sources":["../../src/components/stats-band.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B;;;;;;;;;;;;;;GAcG;AAEH,iBAAS,SAAS,CAAC,EACjB,SAAS,EACT,OAAW,EACX,OAAkB,EAClB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;CACtC,qBAmBA;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -17,11 +17,18 @@ const STATS_BAND_COLUMNS = {
|
|
|
17
17
|
* square-cornered fill, so no coordinate carries two lines. `surface="ink"` flips
|
|
18
18
|
* the band onto the ink role; only the seam COLOUR changes (the grid background
|
|
19
19
|
* mixes toward the surface), never its weight, so the grid keeps sole ownership.
|
|
20
|
-
*
|
|
20
|
+
*
|
|
21
|
+
* `surface="night"` is the always-dark V5 stats band (B12): rather than a `dark:`
|
|
22
|
+
* utility (forbidden) it sets the `dark` ancestor class on the grid root, so the
|
|
23
|
+
* seam (`bg-border`) and every `StatBlock` role resolve to their dark value while
|
|
24
|
+
* the grid keeps its plain canvas seam. Token-only; no `dark:` styling.
|
|
21
25
|
*/
|
|
22
26
|
function StatsBand({ className, columns = 4, surface = "canvas", ...props }) {
|
|
27
|
+
// night carries the plain canvas seam and lets the `dark` root flip its colour;
|
|
28
|
+
// ink/canvas pass straight through to the surface-driven seam colour.
|
|
29
|
+
const seamSurface = surface === "night" ? "canvas" : surface;
|
|
23
30
|
return (
|
|
24
|
-
// single-owner seam: SeamGrid owns every divider; ink
|
|
25
|
-
_jsx(SeamGrid, { "data-slot": "stats-band", surface: surface, className: cn("h-full", STATS_BAND_COLUMNS[columns], className), ...props }));
|
|
31
|
+
// single-owner seam: SeamGrid owns every divider; ink/night flip only colour.
|
|
32
|
+
_jsx(SeamGrid, { "data-slot": "stats-band", "data-surface": surface, surface: seamSurface, className: cn("h-full", surface === "night" && "dark", STATS_BAND_COLUMNS[columns], className), ...props }));
|
|
26
33
|
}
|
|
27
34
|
export { StatsBand };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { cn } from "../lib/utils.js";
|
|
3
3
|
const TONE_BG = {
|
|
4
|
-
good: "bg-
|
|
5
|
-
muted: "bg-(--nc-
|
|
6
|
-
warn: "bg-
|
|
7
|
-
bad: "bg-
|
|
4
|
+
good: "bg-success",
|
|
5
|
+
muted: "bg-[var(--nc-muted)]",
|
|
6
|
+
warn: "bg-warning",
|
|
7
|
+
bad: "bg-destructive",
|
|
8
8
|
};
|
|
9
9
|
function StatusDot({ className, tone, ...props }) {
|
|
10
10
|
return (_jsx("span", { "aria-hidden": "true", className: cn("inline-block size-1.5 rounded-full", TONE_BG[tone], className), "data-slot": "status-dot", "data-tone": tone, ...props }));
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* steps — the "how it works" station rail (V5 B09).
|
|
4
|
+
*
|
|
5
|
+
* An eyebrow + statement head sits above a STATIC horizontal rail (a single
|
|
6
|
+
* filled foreground rule — the walking-dot progress animation is intentionally
|
|
7
|
+
* out of scope this pass) and a row of numbered stations. Each `Step` carries a
|
|
8
|
+
* square brand marker, a mono index, a title, an optional mono price line, and a
|
|
9
|
+
* body. `StepsBranch` is a dashed-left callout rendered below the station row.
|
|
10
|
+
*
|
|
11
|
+
* This is one of only two surfaces where prices may appear (the pricing section
|
|
12
|
+
* is the other), so the `price` line is a first-class, opt-in slot rather than a
|
|
13
|
+
* generic field. Copy is props-driven: absent parts render nothing.
|
|
14
|
+
*
|
|
15
|
+
* Light-surface composition; it inherits the page theme and sets no dark root.
|
|
16
|
+
* Token-only; no `dark:` styling.
|
|
17
|
+
*/
|
|
18
|
+
declare function Steps({ kicker, title, children, className, ...props }: React.ComponentProps<"section"> & {
|
|
19
|
+
kicker?: string;
|
|
20
|
+
title?: string;
|
|
21
|
+
}): React.JSX.Element;
|
|
22
|
+
declare function Step({ index, title, price, body, className, children, ...props }: React.ComponentProps<"div"> & {
|
|
23
|
+
index?: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
price?: string;
|
|
26
|
+
body?: React.ReactNode;
|
|
27
|
+
}): React.JSX.Element;
|
|
28
|
+
declare function StepsBranch({ label, title, body, className, children, ...props }: React.ComponentProps<"aside"> & {
|
|
29
|
+
label?: string;
|
|
30
|
+
title?: string;
|
|
31
|
+
body?: React.ReactNode;
|
|
32
|
+
}): React.JSX.Element;
|
|
33
|
+
export { Steps, Step, StepsBranch };
|
|
34
|
+
//# sourceMappingURL=steps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../../src/components/steps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;;;;GAeG;AAEH,iBAAS,KAAK,CAAC,EACb,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAAG;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,qBAsCA;AAED,iBAAS,IAAI,CAAC,EACZ,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBAqCA;AAED,iBAAS,WAAW,CAAC,EACnB,KAAK,EACL,KAAK,EACL,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB,qBA+BA;AAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC"}
|