@nadicodeai/ui 9.2.0 → 10.0.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 +1 -0
- package/README.md +5 -5
- package/dist/agent-orb.d.ts +3 -0
- package/dist/agent-orb.d.ts.map +1 -0
- package/dist/agent-orb.js +2 -0
- package/dist/assets/brand/aionlabs.svg +2 -0
- package/dist/assets/brand/airtable.svg +2 -0
- package/dist/assets/brand/apple.svg +2 -0
- package/dist/assets/brand/arcee.svg +2 -0
- package/dist/assets/brand/asana.svg +2 -0
- package/dist/assets/brand/atlassian.svg +2 -0
- package/dist/assets/brand/baidu.svg +2 -0
- package/dist/assets/brand/bytedance.svg +2 -0
- package/dist/assets/brand/claude.svg +2 -0
- package/dist/assets/brand/cohere.svg +2 -0
- package/dist/assets/brand/datadog.svg +2 -0
- package/dist/assets/brand/deepseek.svg +2 -0
- package/dist/assets/brand/discord.svg +2 -0
- package/dist/assets/brand/dolphin.svg +2 -0
- package/dist/assets/brand/dotsstudio.svg +2 -0
- package/dist/assets/brand/figma.svg +2 -0
- package/dist/assets/brand/gemini.svg +2 -0
- package/dist/assets/brand/github.svg +2 -0
- package/dist/assets/brand/gitlab.svg +2 -0
- package/dist/assets/brand/gmail.svg +2 -0
- package/dist/assets/brand/google-calendar.svg +2 -0
- package/dist/assets/brand/google-drive.svg +2 -0
- package/dist/assets/brand/grok.svg +2 -0
- package/dist/assets/brand/huggingface.svg +2 -0
- package/dist/assets/brand/ibm.svg +2 -0
- package/dist/assets/brand/inception.svg +2 -0
- package/dist/assets/brand/inclusionai.svg +2 -0
- package/dist/assets/brand/index.json +778 -0
- package/dist/assets/brand/inference.svg +2 -0
- package/dist/assets/brand/intercom.svg +2 -0
- package/dist/assets/brand/jira.svg +2 -0
- package/dist/assets/brand/kwaipilot.svg +2 -0
- package/dist/assets/brand/linear.svg +2 -0
- package/dist/assets/brand/linux.svg +2 -0
- package/dist/assets/brand/liquid.svg +2 -0
- package/dist/assets/brand/longcat.svg +2 -0
- package/dist/assets/brand/mattermost.svg +2 -0
- package/dist/assets/brand/meta.svg +2 -0
- package/dist/assets/brand/microsoft.svg +2 -0
- package/dist/assets/brand/minimax.svg +2 -0
- package/dist/assets/brand/mistral.svg +2 -0
- package/dist/assets/brand/moonshot.svg +2 -0
- package/dist/assets/brand/morph.svg +2 -0
- package/dist/assets/brand/n8n.svg +2 -0
- package/dist/assets/brand/netlify.svg +2 -0
- package/dist/assets/brand/nexagi.svg +2 -0
- package/dist/assets/brand/notion.svg +2 -0
- package/dist/assets/brand/nousresearch.svg +2 -0
- package/dist/assets/brand/nova.svg +2 -0
- package/dist/assets/brand/nvidia.svg +2 -0
- package/dist/assets/brand/openai.svg +2 -0
- package/dist/assets/brand/openrouter.svg +2 -0
- package/dist/assets/brand/paypal.svg +2 -0
- package/dist/assets/brand/perceptron.svg +2 -0
- package/dist/assets/brand/perplexity.svg +2 -0
- package/dist/assets/brand/poolside.svg +2 -0
- package/dist/assets/brand/postgresql.svg +2 -0
- package/dist/assets/brand/qwen.svg +2 -0
- package/dist/assets/brand/reka.svg +2 -0
- package/dist/assets/brand/relace.svg +2 -0
- package/dist/assets/brand/sakana.svg +2 -0
- package/dist/assets/brand/sentry.svg +2 -0
- package/dist/assets/brand/signal.svg +2 -0
- package/dist/assets/brand/slack.svg +2 -0
- package/dist/assets/brand/spotify.svg +2 -0
- package/dist/assets/brand/square.svg +2 -0
- package/dist/assets/brand/stepfun.svg +2 -0
- package/dist/assets/brand/stripe.svg +2 -0
- package/dist/assets/brand/supabase.svg +2 -0
- package/dist/assets/brand/telegram.svg +2 -0
- package/dist/assets/brand/tencent.svg +2 -0
- package/dist/assets/brand/the-drummer.svg +2 -0
- package/dist/assets/brand/thinkingmachines.svg +2 -0
- package/dist/assets/brand/todoist.svg +2 -0
- package/dist/assets/brand/unbiased.svg +2 -0
- package/dist/assets/brand/unreal-engine.svg +2 -0
- package/dist/assets/brand/upstage.svg +2 -0
- package/dist/assets/brand/vercel.svg +2 -0
- package/dist/assets/brand/webflow.svg +2 -0
- package/dist/assets/brand/whatsapp.svg +2 -0
- package/dist/assets/brand/windows.svg +2 -0
- package/dist/assets/brand/writer.svg +2 -0
- package/dist/assets/brand/xiaomimimo.svg +2 -0
- package/dist/assets/brand/youtube.svg +2 -0
- package/dist/assets/brand/yuanbao.svg +2 -0
- package/dist/assets/brand/zai.svg +2 -0
- package/dist/assets/brand/zapier.svg +2 -0
- package/dist/components/action-band.js +1 -1
- package/dist/components/action-status.d.ts +5 -0
- package/dist/components/action-status.d.ts.map +1 -1
- package/dist/components/action-status.js +6 -2
- package/dist/components/agent-orb-appearance.d.ts +16 -2
- package/dist/components/agent-orb-appearance.d.ts.map +1 -1
- package/dist/components/agent-orb-appearance.js +28 -5
- package/dist/components/agent-orb.d.ts +6 -3
- package/dist/components/agent-orb.d.ts.map +1 -1
- package/dist/components/agent-orb.js +20 -7
- package/dist/components/app-mark-aliases.d.ts +16 -0
- package/dist/components/app-mark-aliases.d.ts.map +1 -0
- package/dist/components/app-mark-aliases.js +84 -0
- package/dist/components/app-mark.d.ts +4 -0
- package/dist/components/app-mark.d.ts.map +1 -1
- package/dist/components/app-mark.js +14 -31
- package/dist/components/automation-section.d.ts.map +1 -1
- package/dist/components/automation-section.js +2 -2
- package/dist/components/badge.js +1 -1
- package/dist/components/brand.d.ts +3 -2
- package/dist/components/brand.d.ts.map +1 -1
- package/dist/components/brand.js +18 -28
- package/dist/components/button.js +1 -1
- package/dist/components/code-editor-mockup.d.ts +1 -1
- package/dist/components/code-editor-mockup.js +1 -1
- package/dist/components/collection-filters.js +2 -2
- package/dist/components/confirm-dialog.d.ts +3 -1
- package/dist/components/confirm-dialog.d.ts.map +1 -1
- package/dist/components/confirm-dialog.js +3 -3
- package/dist/components/drawer.js +5 -5
- package/dist/components/feature-grid.js +2 -2
- package/dist/components/feedback-state.d.ts.map +1 -1
- package/dist/components/feedback-state.js +6 -9
- package/dist/components/footer.js +2 -2
- package/dist/components/hero.js +1 -1
- package/dist/components/house-icons.d.ts.map +1 -1
- package/dist/components/house-icons.js +9 -1
- package/dist/components/input-otp.js +1 -1
- package/dist/components/installer-shell.d.ts.map +1 -1
- package/dist/components/installer-shell.js +5 -6
- package/dist/components/logo-band.js +1 -1
- package/dist/components/navigation-menu.js +2 -2
- package/dist/components/pending-label.d.ts +15 -0
- package/dist/components/pending-label.d.ts.map +1 -0
- package/dist/components/pending-label.js +14 -0
- package/dist/components/proof-slot.js +1 -1
- package/dist/components/section-intro.js +2 -2
- package/dist/components/security-grid.js +1 -1
- package/dist/components/sheet.js +1 -1
- package/dist/components/shift-band.js +1 -1
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -1
- package/dist/components/skeleton.js +5 -1
- package/dist/components/sonner.d.ts.map +1 -1
- package/dist/components/sonner.js +5 -2
- package/dist/components/statement.js +2 -2
- package/dist/components/steps.js +2 -2
- package/dist/components/table.js +1 -1
- package/dist/components/tabs.js +1 -1
- package/dist/components/texture-strip.js +1 -1
- package/dist/components/toggle.js +1 -1
- package/dist/components/waiting-line.d.ts +30 -0
- package/dist/components/waiting-line.d.ts.map +1 -0
- package/dist/components/waiting-line.js +33 -0
- package/dist/eslint/rules/no-invalid-token-utility.js +1 -1
- package/dist/index.d.ts +2 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -8
- package/dist/internal/agent-orb-motion.d.ts +9 -1
- package/dist/internal/agent-orb-motion.d.ts.map +1 -1
- package/dist/internal/agent-orb-motion.js +23 -11
- package/dist/internal/agent-orb.d.ts +14 -1
- package/dist/internal/agent-orb.d.ts.map +1 -1
- package/dist/internal/agent-orb.js +78 -22
- package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
- package/dist/internal/assistant-ui/attachment.js +3 -2
- package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
- package/dist/internal/assistant-ui/reasoning.js +4 -4
- package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-fallback.js +5 -4
- package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
- package/dist/internal/assistant-ui/tool-group.js +4 -3
- package/dist/lib/motion.d.ts +18 -4
- package/dist/lib/motion.d.ts.map +1 -1
- package/dist/lib/motion.js +18 -4
- package/dist/styles/globals.css +0 -1
- package/docs/activity.md +99 -117
- package/docs/agent-orb.md +72 -19
- package/docs/component-classification.md +4 -4
- package/docs/consuming-cross-repo.md +8 -10
- package/docs/contract.md +10 -9
- package/docs/icon-assets.md +106 -0
- package/docs/migration/10.0.0.md +144 -0
- package/package.json +8 -7
- package/dist/activity.d.ts +0 -2
- package/dist/activity.d.ts.map +0 -1
- package/dist/activity.js +0 -2
- package/dist/components/activity-orb.d.ts +0 -21
- package/dist/components/activity-orb.d.ts.map +0 -1
- package/dist/components/activity-orb.js +0 -26
- package/dist/components/benefits-bento.d.ts +0 -15
- package/dist/components/benefits-bento.d.ts.map +0 -1
- package/dist/components/benefits-bento.js +0 -6
- package/dist/components/bento.d.ts +0 -39
- package/dist/components/bento.d.ts.map +0 -1
- package/dist/components/bento.js +0 -70
- package/dist/components/glyph-spinner.d.ts +0 -10
- package/dist/components/glyph-spinner.d.ts.map +0 -1
- package/dist/components/glyph-spinner.js +0 -101
- package/dist/components/nav-bar.d.ts +0 -24
- package/dist/components/nav-bar.d.ts.map +0 -1
- package/dist/components/nav-bar.js +0 -35
- package/dist/components/page-frame.d.ts +0 -30
- package/dist/components/page-frame.d.ts.map +0 -1
- package/dist/components/page-frame.js +0 -30
- package/dist/components/spinner.d.ts +0 -3
- package/dist/components/spinner.d.ts.map +0 -1
- package/dist/components/spinner.js +0 -7
- package/dist/components/use-case-bento.d.ts +0 -13
- package/dist/components/use-case-bento.d.ts.map +0 -1
- package/dist/components/use-case-bento.js +0 -8
- package/dist/internal/activity-orb.d.ts +0 -27
- package/dist/internal/activity-orb.d.ts.map +0 -1
- package/dist/internal/activity-orb.js +0 -150
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { AlertTriangleIcon, CheckCircleIcon,
|
|
3
|
+
import { AlertTriangleIcon, CheckCircleIcon, CircleDotIcon, PauseCircleIcon } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/utils.js";
|
|
5
5
|
import { Badge } from "./badge.js";
|
|
6
6
|
import { FeedbackState } from "./feedback-state.js";
|
|
@@ -17,7 +17,7 @@ const automationStatusMeta = {
|
|
|
17
17
|
running: {
|
|
18
18
|
label: "Running",
|
|
19
19
|
variant: "default",
|
|
20
|
-
icon:
|
|
20
|
+
icon: _jsx(CircleDotIcon, { className: "size-4" }),
|
|
21
21
|
},
|
|
22
22
|
paused: {
|
|
23
23
|
label: "Paused",
|
package/dist/components/badge.js
CHANGED
|
@@ -2,7 +2,7 @@ import { mergeProps } from "@base-ui/react/merge-props";
|
|
|
2
2
|
import { useRender } from "@base-ui/react/use-render";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
4
|
import { cn } from "../lib/utils.js";
|
|
5
|
-
const badgeVariants = cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[background-color,border-color,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)]
|
|
5
|
+
const badgeVariants = cva("group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[background-color,border-color,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive [&>svg]:pointer-events-none [&>svg]:size-3!", {
|
|
6
6
|
variants: {
|
|
7
7
|
variant: {
|
|
8
8
|
default: "bg-primary text-primary-foreground [a]:hover:bg-primary-hover",
|
|
@@ -3,8 +3,9 @@ type BrandLogoProps = Omit<React.ComponentProps<"svg">, "aria-hidden" | "aria-la
|
|
|
3
3
|
alt?: string;
|
|
4
4
|
decoding?: React.ComponentProps<"img">["decoding"];
|
|
5
5
|
};
|
|
6
|
+
/** The plain n. Use it where the name does not fit. */
|
|
6
7
|
declare function BrandMark({ alt, className, width, height, decoding, ...props }: BrandLogoProps): React.JSX.Element;
|
|
7
|
-
|
|
8
|
+
/** The company logo: nadicode in full. Use it wherever the company is named. */
|
|
8
9
|
declare function BrandWordmark({ alt, className, width, height, decoding, ...props }: BrandLogoProps): React.JSX.Element;
|
|
9
|
-
export {
|
|
10
|
+
export { BrandMark, BrandWordmark };
|
|
10
11
|
//# sourceMappingURL=brand.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/components/brand.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,cAAc,GAAG,IAAI,CACxB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAC3B,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CACnD,GAAG;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;CACpD,CAAC;
|
|
1
|
+
{"version":3,"file":"brand.d.ts","sourceRoot":"","sources":["../../src/components/brand.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,cAAc,GAAG,IAAI,CACxB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,EAC3B,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CACnD,GAAG;IACF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;CACpD,CAAC;AAwCF,uDAAuD;AACvD,iBAAS,SAAS,CAAC,EACjB,GAAgB,EAChB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAkBhB;AAED,gFAAgF;AAChF,iBAAS,aAAa,CAAC,EACrB,GAAgB,EAChB,SAAS,EACT,KAAW,EACX,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAkBhB;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/components/brand.js
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { logoMarkGeometry, logoWordmarkGeometry, resolveLogoGeometry, } from "@nadicodeai/design-system/assets/logo-geometry";
|
|
4
4
|
import * as React from "react";
|
|
5
5
|
import { cn } from "../lib/utils.js";
|
|
6
6
|
function accessibilityProps(alt) {
|
|
7
7
|
return alt ? { role: "img", "aria-label": alt } : { "aria-hidden": true };
|
|
8
8
|
}
|
|
9
9
|
const reactSvgAttributeNames = {
|
|
10
|
-
"clip-path": "clipPath",
|
|
11
10
|
"stroke-width": "strokeWidth",
|
|
12
11
|
};
|
|
13
12
|
function renderGeometryNodes(nodes) {
|
|
@@ -19,35 +18,26 @@ function renderGeometryNodes(nodes) {
|
|
|
19
18
|
return React.createElement(node.element, { ...attributes, key: `${node.element}-${index}` }, node.children ? renderGeometryNodes(node.children) : undefined);
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const geometry = resolveLogoGeometry(logoMarkGeometry, {
|
|
32
|
-
idPrefix,
|
|
33
|
-
paints: { ink: "currentColor", primary: "var(--nc-primary)" },
|
|
34
|
-
});
|
|
35
|
-
return (_jsx("svg", { "data-slot": "brand-mark", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block size-6", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
|
|
21
|
+
/**
|
|
22
|
+
* The letters take the text colour of whatever they sit in, so one form serves
|
|
23
|
+
* every ground. The dot is the logo's own colour, `--nc-logo-dot`, which the
|
|
24
|
+
* generated mode layer flips to the brighter cobalt under any dark ancestor —
|
|
25
|
+
* never the shadcn `--primary` role, which is the neutral action family.
|
|
26
|
+
*/
|
|
27
|
+
const BRAND_PAINTS = { ink: "currentColor", dot: "var(--nc-logo-dot)" };
|
|
28
|
+
function resolved(geometry) {
|
|
29
|
+
return resolveLogoGeometry(geometry, { paints: BRAND_PAINTS });
|
|
36
30
|
}
|
|
37
|
-
|
|
31
|
+
/** The plain n. Use it where the name does not fit. */
|
|
32
|
+
function BrandMark({ alt = "nadicode", className, width = 32, height = 32, decoding, ...props }) {
|
|
38
33
|
void decoding;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
idPrefix,
|
|
42
|
-
paints: { ink: "currentColor", primary: "var(--nc-primary)" },
|
|
43
|
-
});
|
|
44
|
-
return (_jsx("svg", { "data-slot": "brand-lockup", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block h-8 w-auto", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
|
|
34
|
+
const geometry = resolved(logoMarkGeometry);
|
|
35
|
+
return (_jsx("svg", { "data-slot": "brand-mark", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block size-6", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
|
|
45
36
|
}
|
|
46
|
-
|
|
37
|
+
/** The company logo: nadicode in full. Use it wherever the company is named. */
|
|
38
|
+
function BrandWordmark({ alt = "nadicode", className, width = 137, height = 24, decoding, ...props }) {
|
|
47
39
|
void decoding;
|
|
48
|
-
const geometry =
|
|
49
|
-
paints: { ink: "currentColor", primary: "var(--nc-primary)" },
|
|
50
|
-
});
|
|
40
|
+
const geometry = resolved(logoWordmarkGeometry);
|
|
51
41
|
return (_jsx("svg", { "data-slot": "brand-wordmark", xmlns: "http://www.w3.org/2000/svg", viewBox: geometry.viewBox, width: width, height: height, className: cn("block h-6 w-auto", className), ...accessibilityProps(alt), ...props, children: renderGeometryNodes(geometry.nodes) }));
|
|
52
42
|
}
|
|
53
|
-
export {
|
|
43
|
+
export { BrandMark, BrandWordmark };
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { Button as ButtonPrimitive } from "@base-ui/react/button";
|
|
3
3
|
import { cva } from "class-variance-authority";
|
|
4
4
|
import { cn } from "../lib/utils.js";
|
|
5
|
-
const buttonVariants = cva("group/button inline-flex min-h-touch-target min-w-touch-target shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-[background-color,border-color,color,scale] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] select-none motion-safe:active:not-aria-[haspopup]:scale-[0.97]
|
|
5
|
+
const buttonVariants = cva("group/button inline-flex min-h-touch-target min-w-touch-target shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-[background-color,border-color,color,scale] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] select-none motion-safe:active:not-aria-[haspopup]:scale-[0.97] disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [@media(hover:hover)_and_(pointer:fine)]:min-w-0 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", {
|
|
6
6
|
variants: {
|
|
7
7
|
variant: {
|
|
8
8
|
default: "bg-primary text-primary-foreground hover:bg-primary-hover active:bg-primary-active",
|
|
@@ -11,7 +11,7 @@ import * as React from "react";
|
|
|
11
11
|
* corners to it. The on-dark hairline + dots + muted-on-dark tints are all DERIVED
|
|
12
12
|
* from the brand `line` / `canvas` / `ink` tokens via `color-mix` (the same family
|
|
13
13
|
* the retired dark sections use), so no raw literal is introduced. The dots are
|
|
14
|
-
*
|
|
14
|
+
* nadicode-monochrome, never the macOS traffic-light colours. Token-only;
|
|
15
15
|
* no `dark:` styling.
|
|
16
16
|
*/
|
|
17
17
|
declare function CodeEditorMockup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
@@ -12,7 +12,7 @@ import { cn } from "../lib/utils.js";
|
|
|
12
12
|
* corners to it. The on-dark hairline + dots + muted-on-dark tints are all DERIVED
|
|
13
13
|
* from the brand `line` / `canvas` / `ink` tokens via `color-mix` (the same family
|
|
14
14
|
* the retired dark sections use), so no raw literal is introduced. The dots are
|
|
15
|
-
*
|
|
15
|
+
* nadicode-monochrome, never the macOS traffic-light colours. Token-only;
|
|
16
16
|
* no `dark:` styling.
|
|
17
17
|
*/
|
|
18
18
|
/*
|
|
@@ -36,7 +36,7 @@ function FilterPicker({ facets, copy, initialField, returnFocus, children, }) {
|
|
|
36
36
|
event.preventDefault();
|
|
37
37
|
changeField(undefined);
|
|
38
38
|
}
|
|
39
|
-
}, children: [_jsx(CommandInput, { ref: input, "aria-label": facet ? `${copy.searchValues}: ${facet.label}` : copy.searchFields, placeholder: facet ? copy.searchValues : copy.searchFields, value: search, onValueChange: setSearch }), _jsxs(CommandList, { label: facet?.label ?? copy.searchFields, children: [_jsx(CommandEmpty, { children: copy.empty }), _jsx(CommandGroup, { heading: facet?.label, children: facet ? (_jsxs(_Fragment, { children: [facet.value ? (_jsx(CommandItem, { value: facet.allLabel, onSelect: () => commit(""), children: facet.allLabel })) : null, facet.options.map((option) => (_jsxs(CommandItem, { value: option.value, keywords: [option.label], "data-checked": option.value === facet.value, onSelect: () => commit(option.value), children: [option.icon, _jsx("span", { className: option.mono ? "truncate nc-type-
|
|
39
|
+
}, children: [_jsx(CommandInput, { ref: input, "aria-label": facet ? `${copy.searchValues}: ${facet.label}` : copy.searchFields, placeholder: facet ? copy.searchValues : copy.searchFields, value: search, onValueChange: setSearch }), _jsxs(CommandList, { label: facet?.label ?? copy.searchFields, children: [_jsx(CommandEmpty, { children: copy.empty }), _jsx(CommandGroup, { heading: facet?.label, children: facet ? (_jsxs(_Fragment, { children: [facet.value ? (_jsx(CommandItem, { value: facet.allLabel, onSelect: () => commit(""), children: facet.allLabel })) : null, facet.options.map((option) => (_jsxs(CommandItem, { value: option.value, keywords: [option.label], "data-checked": option.value === facet.value, onSelect: () => commit(option.value), children: [option.icon, _jsx("span", { className: option.mono ? "truncate nc-type-label-mono" : "truncate", children: option.label })] }, option.value)))] })) : (facets.map((item) => (_jsx(CommandItem, { value: item.label, onSelect: () => changeField(item.label), children: item.label }, item.label)))) })] })] }, field ?? "fields")] })] }));
|
|
40
40
|
}
|
|
41
41
|
export function CollectionFilters({ facets, copy, }) {
|
|
42
42
|
const addTrigger = React.useRef(null);
|
|
@@ -46,7 +46,7 @@ export function CollectionFilters({ facets, copy, }) {
|
|
|
46
46
|
.filter((facet) => facet.value)
|
|
47
47
|
.map((facet) => {
|
|
48
48
|
const selected = facet.options.find((option) => option.value === facet.value);
|
|
49
|
-
return (_jsxs(ButtonGroup, { "aria-label": facet.label, className: "min-w-0 max-w-full", children: [_jsx(FilterPicker, { facets: facets, copy: copy, initialField: facet.label, returnFocus: addTrigger, children: _jsxs(Button, { variant: "outline", className: "min-w-0 max-w-64", children: [facet.selectedIcon ?? selected?.icon, _jsxs("span", { className: "truncate", children: [facet.label, ":", " ", _jsx("span", { className: selected?.mono ? "nc-type-
|
|
49
|
+
return (_jsxs(ButtonGroup, { "aria-label": facet.label, className: "min-w-0 max-w-full", children: [_jsx(FilterPicker, { facets: facets, copy: copy, initialField: facet.label, returnFocus: addTrigger, children: _jsxs(Button, { variant: "outline", className: "min-w-0 max-w-64", children: [facet.selectedIcon ?? selected?.icon, _jsxs("span", { className: "truncate", children: [facet.label, ":", " ", _jsx("span", { className: selected?.mono ? "nc-type-label-mono" : undefined, children: selected?.label ?? facet.value })] })] }) }), _jsx(Button, { variant: "outline", size: "icon", "aria-label": `${copy.remove}: ${facet.label}`, onClick: () => {
|
|
50
50
|
facet.onValueChange("");
|
|
51
51
|
addTrigger.current?.focus();
|
|
52
52
|
}, children: _jsx(X, { "aria-hidden": "true" }) })] }, facet.label));
|
|
@@ -6,11 +6,13 @@ interface ConfirmDialogProps {
|
|
|
6
6
|
title: React.ReactNode;
|
|
7
7
|
description?: React.ReactNode;
|
|
8
8
|
confirmLabel?: React.ReactNode;
|
|
9
|
+
/** The confirm button's own word while the action runs. */
|
|
10
|
+
confirmPendingLabel?: React.ReactNode;
|
|
9
11
|
cancelLabel?: React.ReactNode;
|
|
10
12
|
destructive?: boolean;
|
|
11
13
|
loading?: boolean;
|
|
12
14
|
}
|
|
13
|
-
declare function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel, cancelLabel, destructive, loading, }: ConfirmDialogProps): React.JSX.Element;
|
|
15
|
+
declare function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel, confirmPendingLabel, cancelLabel, destructive, loading, }: ConfirmDialogProps): React.JSX.Element;
|
|
14
16
|
export { ConfirmDialog };
|
|
15
17
|
export type { ConfirmDialogProps };
|
|
16
18
|
//# sourceMappingURL=confirm-dialog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAapC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAOD,iBAAS,aAAa,CAAC,EACrB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,WAAsB,EACtB,WAAmB,EACnB,OAAe,GAChB,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"confirm-dialog.d.ts","sourceRoot":"","sources":["../../src/components/confirm-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAapC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAOD,iBAAS,aAAa,CAAC,EACrB,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,EACL,WAAW,EACX,YAAwB,EACxB,mBAAmB,EACnB,WAAsB,EACtB,WAAmB,EACnB,OAAe,GAChB,EAAE,kBAAkB,qBAiCpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { AlertDialog, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "./alert-dialog.js";
|
|
4
4
|
import { Button } from "./button.js";
|
|
5
|
-
import {
|
|
5
|
+
import { PendingLabel } from "./pending-label.js";
|
|
6
6
|
// Fully controlled confirm dialog over the registry AlertDialog parts. The
|
|
7
7
|
// confirm action is a plain Button (not AlertDialogAction) so a failed confirm
|
|
8
8
|
// can keep the dialog open; the only closing gesture is Escape (alert dialogs
|
|
9
9
|
// take no backdrop dismissal), which routes through onCancel, and loading
|
|
10
10
|
// disables both buttons while the action runs.
|
|
11
|
-
function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel = "Confirm", cancelLabel = "Cancel", destructive = false, loading = false, }) {
|
|
11
|
+
function ConfirmDialog({ open, onConfirm, onCancel, title, description, confirmLabel = "Confirm", confirmPendingLabel, cancelLabel = "Cancel", destructive = false, loading = false, }) {
|
|
12
12
|
return (_jsx(AlertDialog, { open: open, onOpenChange: (nextOpen) => {
|
|
13
13
|
if (!nextOpen) {
|
|
14
14
|
onCancel();
|
|
15
15
|
}
|
|
16
|
-
}, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), description ? _jsx(AlertDialogDescription, { children: description }) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: onCancel, disabled: loading, children: cancelLabel }),
|
|
16
|
+
}, children: _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: title }), description ? _jsx(AlertDialogDescription, { children: description }) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: onCancel, disabled: loading, children: cancelLabel }), _jsx(Button, { "aria-busy": loading || undefined, variant: destructive ? "destructive" : "default", onClick: onConfirm, disabled: loading, children: _jsx(PendingLabel, { pending: loading, pendingLabel: confirmPendingLabel ?? confirmLabel, children: confirmLabel }) })] })] }) }));
|
|
17
17
|
}
|
|
18
18
|
export { ConfirmDialog };
|
|
@@ -26,17 +26,17 @@ function DrawerClose({ ...props }) {
|
|
|
26
26
|
return _jsx(DrawerPrimitive.Close, { "data-slot": "drawer-close", ...props });
|
|
27
27
|
}
|
|
28
28
|
function DrawerOverlay({ className, ...props }) {
|
|
29
|
-
return (_jsx(DrawerPrimitive.Backdrop, { "data-slot": "drawer-overlay", className: cn("fixed inset-0 z-50 min-h-dvh bg-scrim/scrim opacity-[max(var(--drawer-overlay-min-opacity,0),calc(1-var(--drawer-swipe-progress)))] transition-opacity duration-[var(--nc-duration-drawer)] ease-[var(--nc-ease-drawer)] select-none data-ending-style:pointer-events-none data-ending-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-snap-points:[--drawer-overlay-min-opacity:0.5] data-starting-style:opacity-0 data-swiping:duration-0
|
|
29
|
+
return (_jsx(DrawerPrimitive.Backdrop, { "data-slot": "drawer-overlay", className: cn("fixed inset-0 z-50 min-h-dvh bg-scrim/scrim opacity-[max(var(--drawer-overlay-min-opacity,0),calc(1-var(--drawer-swipe-progress)))] transition-opacity duration-[var(--nc-duration-drawer)] ease-[var(--nc-ease-drawer)] select-none data-ending-style:pointer-events-none data-ending-style:opacity-0 data-ending-style:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-snap-points:[--drawer-overlay-min-opacity:0.5] data-starting-style:opacity-0 data-swiping:duration-0 supports-[-webkit-touch-callout:none]:absolute", className), ...props }));
|
|
30
30
|
}
|
|
31
31
|
function DrawerSwipeHandle({ className, ...props }) {
|
|
32
|
-
return (_jsx("div", { "data-slot": "drawer-swipe-handle", "aria-hidden": "true", className: cn("relative z-10 flex shrink-0 cursor-grab transition-opacity duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-[swipe-axis=x]/drawer-popup:h-full group-data-[swipe-axis=x]/drawer-popup:w-3 group-data-[swipe-axis=x]/drawer-popup:items-center group-data-[swipe-axis=y]/drawer-popup:h-3 group-data-[swipe-axis=y]/drawer-popup:w-full group-data-[swipe-axis=y]/drawer-popup:justify-center group-data-[swipe-direction=down]/drawer-popup:items-end group-data-[swipe-direction=left]/drawer-popup:order-last group-data-[swipe-direction=left]/drawer-popup:justify-start group-data-[swipe-direction=right]/drawer-popup:justify-end group-data-[swipe-direction=up]/drawer-popup:order-last group-data-[swipe-direction=up]/drawer-popup:items-start after:block after:shrink-0 after:rounded-full after:bg-muted
|
|
32
|
+
return (_jsx("div", { "data-slot": "drawer-swipe-handle", "aria-hidden": "true", className: cn("relative z-10 flex shrink-0 cursor-grab transition-opacity duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-[swipe-axis=x]/drawer-popup:h-full group-data-[swipe-axis=x]/drawer-popup:w-3 group-data-[swipe-axis=x]/drawer-popup:items-center group-data-[swipe-axis=y]/drawer-popup:h-3 group-data-[swipe-axis=y]/drawer-popup:w-full group-data-[swipe-axis=y]/drawer-popup:justify-center group-data-[swipe-direction=down]/drawer-popup:items-end group-data-[swipe-direction=left]/drawer-popup:order-last group-data-[swipe-direction=left]/drawer-popup:justify-start group-data-[swipe-direction=right]/drawer-popup:justify-end group-data-[swipe-direction=up]/drawer-popup:order-last group-data-[swipe-direction=up]/drawer-popup:items-start after:block after:shrink-0 after:rounded-full after:bg-muted group-data-[swipe-axis=x]/drawer-popup:after:h-24 group-data-[swipe-axis=x]/drawer-popup:after:w-1 group-data-[swipe-axis=y]/drawer-popup:after:h-1 group-data-[swipe-axis=y]/drawer-popup:after:w-24 active:cursor-grabbing", className), ...props }));
|
|
33
33
|
}
|
|
34
34
|
function DrawerContent({ className, children, ...props }) {
|
|
35
35
|
const { hasSnapPoints, modal, showSwipeHandle, swipeDirection } = useDrawer();
|
|
36
36
|
const swipeAxis = swipeDirection === "down" || swipeDirection === "up" ? "y" : "x";
|
|
37
37
|
return (_jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [modal === true && _jsx(DrawerOverlay, { "data-snap-points": hasSnapPoints ? "" : undefined }), _jsx(DrawerPrimitive.Viewport, { "data-slot": "drawer-viewport", "data-modal": modal, className: "pointer-events-none fixed inset-0 z-50 select-none data-[modal=true]:pointer-events-auto", children: _jsxs(DrawerPrimitive.Popup, { "data-slot": "drawer-popup", "data-swipe-axis": swipeAxis, "data-snap-points": hasSnapPoints ? "" : undefined, className: cn(
|
|
38
38
|
// Base.
|
|
39
|
-
"group/drawer-popup pointer-events-auto fixed z-50 m-(--drawer-inset,0px) flex h-(--drawer-content-height) max-h-(--drawer-content-max-height,none) min-h-0 w-(--drawer-content-width,auto) transform-[translate3d(var(--translate-x,0px),var(--translate-y,0px),0)_scale(var(--stack-scale))] flex-col border-0 bg-popover text-sm text-popover-foreground nc-elevation-modal transition-[transform,opacity] duration-[var(--nc-duration-drawer)] ease-[var(--nc-ease-drawer)] outline-none select-none data-[swipe-direction=down]:rounded-t-md data-[swipe-direction=left]:rounded-r-md data-[swipe-direction=right]:rounded-l-md data-[swipe-direction=up]:rounded-b-md motion-reduce:transition-
|
|
39
|
+
"group/drawer-popup pointer-events-auto fixed z-50 m-(--drawer-inset,0px) flex h-(--drawer-content-height) max-h-(--drawer-content-max-height,none) min-h-0 w-(--drawer-content-width,auto) transform-[translate3d(var(--translate-x,0px),var(--translate-y,0px),0)_scale(var(--stack-scale))] flex-col border-0 bg-popover text-sm text-popover-foreground nc-elevation-modal transition-[transform,opacity] duration-[var(--nc-duration-drawer)] ease-[var(--nc-ease-drawer)] outline-none select-none data-[swipe-direction=down]:rounded-t-md data-[swipe-direction=left]:rounded-r-md data-[swipe-direction=right]:rounded-l-md data-[swipe-direction=up]:rounded-b-md motion-reduce:transition-opacity",
|
|
40
40
|
// Nested.
|
|
41
41
|
"data-nested-drawer-open:overflow-hidden data-nested-drawer-open:brightness-95",
|
|
42
42
|
// Bleed.
|
|
@@ -46,7 +46,7 @@ function DrawerContent({ className, children, ...props }) {
|
|
|
46
46
|
// Stack.
|
|
47
47
|
"[--bleed:3rem] [--peek:1rem] [--stack-height:var(--drawer-frontmost-height,var(--drawer-height,0px))] [--stack-peek-offset:max(0px,calc((var(--nested-drawers)-var(--stack-progress))*var(--peek)))] [--stack-progress:clamp(0,var(--drawer-swipe-progress),1)] [--stack-scale-base:max(0,calc(1-(var(--nested-drawers)*var(--stack-step))))] [--stack-scale:clamp(0,calc(var(--stack-scale-base)+(var(--stack-step)*var(--stack-progress))),1)] [--stack-shrink:calc(1-var(--stack-scale))] [--stack-step:0.05]",
|
|
48
48
|
// Transitions.
|
|
49
|
-
"data-ending-style:transform-(--closed-transform) data-ending-style:opacity-[0.9999] data-ending-style:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-nested-drawer-swiping:duration-0 data-ending-style:data-nested-drawer-swiping:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-starting-style:transform-(--closed-transform) data-swiping:duration-0 data-ending-style:data-swiping:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] motion-reduce:data-ending-style:transform-none motion-reduce:data-
|
|
49
|
+
"data-ending-style:transform-(--closed-transform) data-ending-style:opacity-[0.9999] data-ending-style:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-nested-drawer-swiping:duration-0 data-ending-style:data-nested-drawer-swiping:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] data-starting-style:transform-(--closed-transform) data-swiping:duration-0 data-ending-style:data-swiping:duration-[calc(var(--drawer-swipe-strength)*var(--nc-duration-drawer-swipe))] motion-reduce:data-ending-style:transform-none motion-reduce:data-starting-style:transform-none",
|
|
50
50
|
// Axis: y.
|
|
51
51
|
"data-[swipe-axis=y]:inset-x-0 data-[swipe-axis=y]:data-nested-drawer-open:h-(--stack-height)",
|
|
52
52
|
// Axis: x.
|
|
@@ -58,7 +58,7 @@ function DrawerContent({ className, children, ...props }) {
|
|
|
58
58
|
// Direction: left.
|
|
59
59
|
"data-[swipe-direction=left]:left-0 data-[swipe-direction=left]:origin-left data-[swipe-direction=left]:[--closed-transform:translate3d(calc(-100%-var(--drawer-inset,0px)-2px),0,0)] data-[swipe-direction=left]:[--translate-x:calc(var(--drawer-swipe-movement-x)+var(--stack-peek-offset)+(var(--stack-shrink)*100%))]",
|
|
60
60
|
// Direction: right.
|
|
61
|
-
"data-[swipe-direction=right]:right-0 data-[swipe-direction=right]:origin-right data-[swipe-direction=right]:[--closed-transform:translate3d(calc(100%+var(--drawer-inset,0px)+2px),0,0)] data-[swipe-direction=right]:[--translate-x:calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)-(var(--stack-shrink)*100%))]", className), ...props, children: [showSwipeHandle && _jsx(DrawerSwipeHandle, {}), _jsx(DrawerPrimitive.Content, { "data-slot": "drawer-content", className: cn("flex min-h-0 flex-1 flex-col overflow-hidden overscroll-contain rounded-[inherit] transition-opacity duration-[var(--nc-duration-open)] ease-[var(--nc-ease-out-strong)] select-text group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-swiping/drawer-popup:select-none
|
|
61
|
+
"data-[swipe-direction=right]:right-0 data-[swipe-direction=right]:origin-right data-[swipe-direction=right]:[--closed-transform:translate3d(calc(100%+var(--drawer-inset,0px)+2px),0,0)] data-[swipe-direction=right]:[--translate-x:calc(var(--drawer-swipe-movement-x)-var(--stack-peek-offset)-(var(--stack-shrink)*100%))]", className), ...props, children: [showSwipeHandle && _jsx(DrawerSwipeHandle, {}), _jsx(DrawerPrimitive.Content, { "data-slot": "drawer-content", className: cn("flex min-h-0 flex-1 flex-col overflow-hidden overscroll-contain rounded-[inherit] transition-opacity duration-[var(--nc-duration-open)] ease-[var(--nc-ease-out-strong)] select-text group-data-nested-drawer-open/drawer-popup:opacity-0 group-data-nested-drawer-swiping/drawer-popup:opacity-100 group-data-swiping/drawer-popup:select-none"), children: children })] }) })] }));
|
|
62
62
|
}
|
|
63
63
|
function DrawerHeader({ className, ...props }) {
|
|
64
64
|
return (_jsx("div", { "data-slot": "drawer-header", className: cn("flex shrink-0 flex-col gap-0.5 p-nadicode-lg pb-0 group-data-[swipe-axis=y]/drawer-popup:text-center md:gap-0.5 md:text-left", className), ...props }));
|
|
@@ -17,7 +17,7 @@ const columnClasses = {
|
|
|
17
17
|
4: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-4",
|
|
18
18
|
};
|
|
19
19
|
function FeatureGrid({ eyebrow, intro, closing, link, columns = 3, children, className, ...props }) {
|
|
20
|
-
return (_jsxs("div", { "data-slot": "feature-grid", className: cn("grid gap-8", className), ...props, children: [eyebrow != null || intro != null ? (_jsxs("div", { "data-slot": "feature-grid-head", className: "grid gap-3", children: [eyebrow != null ? (_jsx("p", { className: "nc-type-
|
|
20
|
+
return (_jsxs("div", { "data-slot": "feature-grid", className: cn("grid gap-8", className), ...props, children: [eyebrow != null || intro != null ? (_jsxs("div", { "data-slot": "feature-grid-head", className: "grid gap-3", children: [eyebrow != null ? (_jsx("p", { className: "nc-type-label-mono uppercase text-muted-foreground", children: eyebrow })) : null, intro != null ? (_jsx("p", { className: "nc-type-body-md max-w-[64ch] text-muted-foreground", children: intro })) : null] })) : null, _jsx(SeamGrid, { "data-slot": "feature-grid-cards", className: columnClasses[columns], children: children }), closing != null || link != null ? (_jsxs("div", { "data-slot": "feature-grid-close", className: "flex flex-wrap items-baseline gap-x-3 gap-y-2", children: [closing != null ? (_jsx("span", { className: "nc-type-body-md text-muted-foreground", children: closing })) : null, link] })) : null] }));
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
23
|
* FeatureCard — one peer card: a verde-accent index chip using the canonical
|
|
@@ -28,6 +28,6 @@ function FeatureGrid({ eyebrow, intro, closing, link, columns = 3, children, cla
|
|
|
28
28
|
* (no cavernous empty foot).
|
|
29
29
|
*/
|
|
30
30
|
function FeatureCard({ index, title, visual, children, className, ...props }) {
|
|
31
|
-
return (_jsxs("div", { "data-slot": "feature-card", className: cn("flex min-h-[200px] flex-col gap-4 bg-card p-[clamp(20px,2.4vw,32px)]", className), ...props, children: [index != null ? (_jsx("span", { "data-slot": "feature-card-index", className: "nc-type-
|
|
31
|
+
return (_jsxs("div", { "data-slot": "feature-card", className: cn("flex min-h-[200px] flex-col gap-4 bg-card p-[clamp(20px,2.4vw,32px)]", className), ...props, children: [index != null ? (_jsx("span", { "data-slot": "feature-card-index", className: "nc-type-label-mono text-[var(--nc-link-deep)]", children: index })) : null, title != null ? (_jsx("h3", { "data-slot": "feature-card-title", className: "nc-type-heading-md text-foreground", children: title })) : null, children != null ? (_jsx("p", { "data-slot": "feature-card-body", className: "nc-type-body-sm text-muted-foreground", children: children })) : null, visual != null ? (_jsx("div", { "data-slot": "feature-card-visual", className: "mt-auto", children: visual })) : null] }));
|
|
32
32
|
}
|
|
33
33
|
export { FeatureGrid, FeatureCard };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-state.d.ts","sourceRoot":"","sources":["../../src/components/feedback-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,OAAO,EACL,KAAK,EAMN,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,SAAS,GACT,QAAQ,GACR,OAAO,GACP,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"feedback-state.d.ts","sourceRoot":"","sources":["../../src/components/feedback-state.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAY/B,OAAO,EACL,KAAK,EAMN,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,SAAS,GACT,QAAQ,GACR,OAAO,GACP,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,OAAO,CAAC;AA8DZ,iBAAS,aAAa,CAAC,EACrB,MAAM,EACN,KAAK,EACL,WAAW,EACX,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,OAAe,EACf,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IAClE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,qBA0CA;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import { AlertTriangleIcon, BanIcon, CloudOffIcon, InboxIcon,
|
|
3
|
+
import { AlertTriangleIcon, BanIcon, CloudOffIcon, InboxIcon, LockKeyholeIcon, SearchXIcon, } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { WaitingLine } from "./waiting-line.js";
|
|
5
6
|
import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, } from "./empty.js";
|
|
6
7
|
const feedbackStateDefaults = {
|
|
7
8
|
empty: {
|
|
@@ -12,12 +13,10 @@ const feedbackStateDefaults = {
|
|
|
12
13
|
loading: {
|
|
13
14
|
title: "Loading",
|
|
14
15
|
description: "Content is being prepared.",
|
|
15
|
-
icon: LoaderCircleIcon,
|
|
16
16
|
},
|
|
17
17
|
saving: {
|
|
18
18
|
title: "Saving",
|
|
19
19
|
description: "Changes are being applied.",
|
|
20
|
-
icon: LoaderCircleIcon,
|
|
21
20
|
},
|
|
22
21
|
error: {
|
|
23
22
|
title: "Something went wrong",
|
|
@@ -58,11 +57,9 @@ function FeedbackState({ status, title, description, icon, actions, children, co
|
|
|
58
57
|
const fallback = feedbackStateDefaults[status];
|
|
59
58
|
const Icon = fallback.icon;
|
|
60
59
|
const stateRole = getFeedbackRole(status);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
66
|
-
return (_jsxs(Empty, { "data-slot": "feedback-state", "data-status": status, role: stateRole, "aria-live": stateRole === "alert" ? "assertive" : "polite", className: cn(compact && "gap-4 p-4 md:p-6", className), ...props, children: [_jsxs(EmptyHeader, { children: [_jsx(EmptyMedia, { variant: "icon", children: stateIcon }), _jsx(EmptyTitle, { children: title ?? fallback.title }), (description ?? fallback.description) && (_jsx(EmptyDescription, { children: description ?? fallback.description }))] }), (actions || children) && (_jsxs(EmptyContent, { "data-slot": "feedback-state-content", children: [children, actions && (_jsx("div", { "data-slot": "feedback-state-actions", className: "flex flex-wrap items-center justify-center gap-2", children: actions }))] }))] }));
|
|
60
|
+
// Waiting is the system's own work: the title says what is happening and the
|
|
61
|
+
// one waiting line appears if it runs past a second. Nothing spins.
|
|
62
|
+
const stateIcon = icon ?? (Icon ? React.createElement(Icon, { className: "size-5" }) : null);
|
|
63
|
+
return (_jsxs(Empty, { "data-slot": "feedback-state", "data-status": status, role: stateRole, "aria-live": stateRole === "alert" ? "assertive" : "polite", className: cn(compact && "gap-4 p-4 md:p-6", className), ...props, children: [_jsxs(EmptyHeader, { children: [stateIcon ? _jsx(EmptyMedia, { variant: "icon", children: stateIcon }) : null, _jsx(EmptyTitle, { children: title ?? fallback.title }), (description ?? fallback.description) && (_jsx(EmptyDescription, { children: description ?? fallback.description }))] }), (status === "loading" || status === "saving") && !icon ? (_jsx(WaitingLine, { className: "w-24", decorative: true })) : null, (actions || children) && (_jsxs(EmptyContent, { "data-slot": "feedback-state-content", children: [children, actions && (_jsx("div", { "data-slot": "feedback-state-actions", className: "flex flex-wrap items-center justify-center gap-2", children: actions }))] }))] }));
|
|
67
64
|
}
|
|
68
65
|
export { FeedbackState };
|
|
@@ -37,7 +37,7 @@ function FooterMeta({ className, ...props }) {
|
|
|
37
37
|
return (_jsx("p", { "data-slot": "footer-meta", className: cn("m-0 text-sm text-muted-foreground", className), ...props }));
|
|
38
38
|
}
|
|
39
39
|
function FooterClock({ className, ...props }) {
|
|
40
|
-
return (_jsx("span", { "data-slot": "footer-clock", className: cn("nc-type-
|
|
40
|
+
return (_jsx("span", { "data-slot": "footer-clock", className: cn("nc-type-label-mono text-primary", className), ...props }));
|
|
41
41
|
}
|
|
42
42
|
function FooterGhost({ className, ...props }) {
|
|
43
43
|
return (_jsx("span", { "data-slot": "footer-ghost", "aria-hidden": "true", className: cn("pointer-events-none absolute inset-x-0 bottom-0 z-0 select-none overflow-hidden whitespace-nowrap text-[clamp(90px,14vw,210px)] font-semibold leading-[0.8] tracking-tight text-foreground/5", className), ...props }));
|
|
@@ -53,7 +53,7 @@ function FooterMegaCol({ className, ...props }) {
|
|
|
53
53
|
return (_jsx("div", { "data-slot": "footer-mega-col", className: cn("grid content-start gap-2 [&_a]:text-sm [&_a]:text-muted-foreground [&_a:hover]:text-foreground", className), ...props }));
|
|
54
54
|
}
|
|
55
55
|
function FooterMegaColTitle({ className, ...props }) {
|
|
56
|
-
return (_jsx("p", { "data-slot": "footer-mega-col-title", className: cn("nc-type-
|
|
56
|
+
return (_jsx("p", { "data-slot": "footer-mega-col-title", className: cn("nc-type-label-mono m-0 uppercase text-muted-foreground", className), ...props }));
|
|
57
57
|
}
|
|
58
58
|
function FooterMegaMeta({ className, ...props }) {
|
|
59
59
|
return (_jsx("div", { "data-slot": "footer-mega-meta", className: cn(
|
package/dist/components/hero.js
CHANGED
|
@@ -31,7 +31,7 @@ function HeroBody({ className, ...props }) {
|
|
|
31
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
32
|
}
|
|
33
33
|
function HeroKicker({ className, children, ...props }) {
|
|
34
|
-
return (_jsxs("p", { "data-slot": "hero-kicker", className: cn("nc-type-
|
|
34
|
+
return (_jsxs("p", { "data-slot": "hero-kicker", className: cn("nc-type-label-mono flex items-center gap-3 uppercase text-muted-foreground", className), ...props, children: [_jsx("span", { "data-slot": "hero-kicker-bar", "aria-hidden": "true", className: "h-0.5 w-8 bg-primary" }), children] }));
|
|
35
35
|
}
|
|
36
36
|
function HeroTitle({ className, ...props }) {
|
|
37
37
|
return (_jsx("h1", { "data-slot": "hero-title", className: cn("nc-type-display-lg max-w-[16ch] text-balance text-foreground", className), ...props }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"house-icons.d.ts","sourceRoot":"","sources":["../../src/components/house-icons.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"house-icons.d.ts","sourceRoot":"","sources":["../../src/components/house-icons.tsx"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAsBjE,iCAAiC;AACjC,eAAO,MAAM,QAAQ,EAAE,UAA8D,CAAC;AAEtF,uDAAuD;AACvD,eAAO,MAAM,aAAa,EAAE,UAG3B,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,SAAS,EAAE,UAAgE,CAAC"}
|
|
@@ -5,8 +5,16 @@ import { createLucideIcon } from "lucide-react";
|
|
|
5
5
|
* rendered by the same `svg.lucide` house rule, and interchangeable with any
|
|
6
6
|
* Lucide icon wherever a `LucideIcon` is expected. The geometry lives once, in
|
|
7
7
|
* `@nadicodeai/design-system/assets/house-icons`, which the static set reads too.
|
|
8
|
+
*
|
|
9
|
+
* Lucide's `Icon` maps an icon's nodes straight into `createElement(tag,
|
|
10
|
+
* attributes)`, so the attributes are where React reads the child's key, and
|
|
11
|
+
* every icon Lucide generates carries one. Ours are the geometry both this
|
|
12
|
+
* package and the static SVG set are built from, and a `key` there would be
|
|
13
|
+
* written into the shipped SVG markup, so the key is added on the way into
|
|
14
|
+
* React and nowhere else. Without it every house icon logs a missing-key
|
|
15
|
+
* warning the first time it renders.
|
|
8
16
|
*/
|
|
9
|
-
const toNode = (node) => node.map(([element, attributes]) => [element, { ...attributes }]);
|
|
17
|
+
const toNode = (node) => node.map(([element, attributes], index) => [element, { ...attributes, key: `${element}-${index}` }]);
|
|
10
18
|
/** The company and its doors. */
|
|
11
19
|
export const ArchIcon = createLucideIcon("arch", toNode(houseIcons.arch));
|
|
12
20
|
/** The arch with a check: work waiting on a person. */
|
|
@@ -21,7 +21,7 @@ function InputOTPGroup({ className, ...props }) {
|
|
|
21
21
|
function InputOTPSlot({ index, className, ...props }) {
|
|
22
22
|
const inputOTPContext = React.useContext(OTPInputContext);
|
|
23
23
|
const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
|
|
24
|
-
return (_jsxs("div", { "data-slot": "input-otp-slot", "data-active": isActive, className: cn("relative flex size-control-height min-h-touch-target min-w-touch-target items-center justify-center border-y border-r border-input bg-background text-sm transition-[border-color,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)]
|
|
24
|
+
return (_jsxs("div", { "data-slot": "input-otp-slot", "data-active": isActive, className: cn("relative flex size-control-height min-h-touch-target min-w-touch-target items-center justify-center border-y border-r border-input bg-background text-sm transition-[border-color,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] 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]:nc-focus-outline data-[active=true]:outline-ring data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:outline-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 bg-foreground" }) }))] }));
|
|
25
25
|
}
|
|
26
26
|
function InputOTPSeparator({ ...props }) {
|
|
27
27
|
return (_jsx("div", { "data-slot": "input-otp-separator", className: "flex items-center [&_svg:not([class*='size-'])]:size-4", role: "separator", ...props, children: _jsx(MinusIcon, {}) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer-shell.d.ts","sourceRoot":"","sources":["../../src/components/installer-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,KAAK,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAC1E,KAAK,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAExE,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,KAAK,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC1E,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"installer-shell.d.ts","sourceRoot":"","sources":["../../src/components/installer-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,KAAK,mBAAmB,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAC1E,KAAK,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAExE,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B,CAAC;AAEF,KAAK,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,GAAG;IAC1E,KAAK,EAAE,mBAAmB,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAgEF,iBAAS,cAAc,CAAC,EACtB,KAAK,EACL,KAAK,EACL,WAAW,EACX,aAAa,EACb,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,aAAoC,EACpC,SAAS,EACT,gBAAgB,EAChB,GAAG,KAAK,EACT,EAAE,mBAAmB,qBAyDrB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC;AAC1B,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { CheckCircleIcon,
|
|
3
|
+
import { CheckCircleIcon, CircleDotIcon, CircleIcon, SparklesIcon, XCircleIcon, } from "lucide-react";
|
|
4
4
|
import { cn } from "../lib/utils.js";
|
|
5
5
|
import { Card, CardContent, CardHeader } from "./card.js";
|
|
6
6
|
import { FeedbackState } from "./feedback-state.js";
|
|
7
7
|
import { Progress } from "./progress.js";
|
|
8
8
|
const installerStateMeta = {
|
|
9
9
|
welcome: { status: "empty", icon: _jsx(SparklesIcon, { className: "size-5" }) },
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
},
|
|
10
|
+
// An install in flight takes the loading state's own treatment: its words
|
|
11
|
+
// and, past a second, the one waiting line. No mark of its own.
|
|
12
|
+
progress: { status: "loading", icon: null },
|
|
14
13
|
success: { status: "empty", icon: _jsx(CheckCircleIcon, { className: "size-5" }) },
|
|
15
14
|
failure: { status: "error", icon: _jsx(XCircleIcon, { className: "size-5" }) },
|
|
16
15
|
};
|
|
17
16
|
const installerStepIcons = {
|
|
18
17
|
pending: _jsx(CircleIcon, { className: "size-4" }),
|
|
19
|
-
running:
|
|
18
|
+
running: _jsx(CircleDotIcon, { className: "size-4" }),
|
|
20
19
|
complete: _jsx(CheckCircleIcon, { className: "size-4" }),
|
|
21
20
|
error: _jsx(XCircleIcon, { className: "size-4" }),
|
|
22
21
|
};
|
|
@@ -44,6 +44,6 @@ function IntegrationsGrid({ ...props }) {
|
|
|
44
44
|
* Small uppercase mono in the muted role; the caller supplies the words.
|
|
45
45
|
*/
|
|
46
46
|
function LogoBandLabel({ className, ...props }) {
|
|
47
|
-
return (_jsx("p", { "data-slot": "logo-band-label", className: cn("nc-type-
|
|
47
|
+
return (_jsx("p", { "data-slot": "logo-band-label", className: cn("nc-type-label-mono uppercase text-muted-foreground", className), ...props }));
|
|
48
48
|
}
|
|
49
49
|
export { LogoBand, IntegrationsGrid, LogoBandLabel };
|
|
@@ -17,10 +17,10 @@ function NavigationMenuTrigger({ className, children, ...props }) {
|
|
|
17
17
|
return (_jsxs(NavigationMenuPrimitive.Trigger, { "data-slot": "navigation-menu-trigger", className: cn(navigationMenuTriggerStyle(), "group", className), ...props, children: [children, " ", _jsx(ChevronDownIcon, { className: "nc-transition-transform relative top-px ml-1 size-3 group-data-popup-open/navigation-menu-trigger:rotate-180 group-data-open/navigation-menu-trigger:rotate-180", "aria-hidden": "true" })] }));
|
|
18
18
|
}
|
|
19
19
|
function NavigationMenuContent({ className, ...props }) {
|
|
20
|
-
return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", className: cn("h-full w-auto p-nadicode-xxs group-data-[viewport=false]/navigation-menu:origin-(--transform-origin) group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border-0 group-data-[viewport=false]/navigation-menu:nc-glass group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:nc-elevation-floating group-data-[viewport=false]/navigation-menu:transition-[opacity,scale] group-data-[viewport=false]/navigation-menu:duration-[var(--nc-duration-close)] group-data-[viewport=false]/navigation-menu:ease-[var(--nc-ease-out-strong)] group-data-[viewport=false]/navigation-menu:data-open:duration-[var(--nc-duration-open)] group-data-[viewport=false]/navigation-menu:data-ending-style:opacity-0 group-data-[viewport=false]/navigation-menu:data-ending-style:scale-[0.98] group-data-[viewport=false]/navigation-menu:data-starting-style:opacity-0 group-data-[viewport=false]/navigation-menu:data-starting-style:scale-[0.98] motion-reduce:transition-
|
|
20
|
+
return (_jsx(NavigationMenuPrimitive.Content, { "data-slot": "navigation-menu-content", className: cn("h-full w-auto p-nadicode-xxs group-data-[viewport=false]/navigation-menu:origin-(--transform-origin) group-data-[viewport=false]/navigation-menu:rounded-md group-data-[viewport=false]/navigation-menu:border-0 group-data-[viewport=false]/navigation-menu:nc-glass group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:nc-elevation-floating group-data-[viewport=false]/navigation-menu:transition-[opacity,scale] group-data-[viewport=false]/navigation-menu:duration-[var(--nc-duration-close)] group-data-[viewport=false]/navigation-menu:ease-[var(--nc-ease-out-strong)] group-data-[viewport=false]/navigation-menu:data-open:duration-[var(--nc-duration-open)] group-data-[viewport=false]/navigation-menu:data-ending-style:opacity-0 group-data-[viewport=false]/navigation-menu:data-ending-style:scale-[0.98] group-data-[viewport=false]/navigation-menu:data-starting-style:opacity-0 group-data-[viewport=false]/navigation-menu:data-starting-style:scale-[0.98] motion-reduce:transition-opacity motion-reduce:data-ending-style:scale-100 motion-reduce:data-starting-style:scale-100 **:data-[slot=navigation-menu-link]:focus:outline-none", className), ...props }));
|
|
21
21
|
}
|
|
22
22
|
function NavigationMenuPositioner({ className, side = "bottom", sideOffset = 8, align = "start", alignOffset = 0, ...props }) {
|
|
23
|
-
return (_jsx(NavigationMenuPrimitive.Portal, { children: _jsx(NavigationMenuPrimitive.Positioner, { side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, className: cn("group/navigation-menu-positioner isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0", className), ...props, children: _jsx(NavigationMenuPrimitive.Popup, { className: "relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-md border-0 nc-glass text-popover-foreground nc-elevation-floating transition-[opacity,scale] duration-[var(--nc-duration-close)] ease-[var(--nc-ease-out-strong)] outline-none data-open:duration-[var(--nc-duration-open)] group-data-instant/navigation-menu-positioner:transition-none data-ending-style:scale-[0.98] data-ending-style:opacity-0 data-starting-style:scale-[0.98] data-starting-style:opacity-0 motion-reduce:transition-
|
|
23
|
+
return (_jsx(NavigationMenuPrimitive.Portal, { children: _jsx(NavigationMenuPrimitive.Positioner, { side: side, sideOffset: sideOffset, align: align, alignOffset: alignOffset, className: cn("group/navigation-menu-positioner isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0", className), ...props, children: _jsx(NavigationMenuPrimitive.Popup, { className: "relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-md border-0 nc-glass text-popover-foreground nc-elevation-floating transition-[opacity,scale] duration-[var(--nc-duration-close)] ease-[var(--nc-ease-out-strong)] outline-none data-open:duration-[var(--nc-duration-open)] group-data-instant/navigation-menu-positioner:transition-none data-ending-style:scale-[0.98] data-ending-style:opacity-0 data-starting-style:scale-[0.98] data-starting-style:opacity-0 motion-reduce:transition-opacity motion-reduce:data-ending-style:scale-100 motion-reduce:data-starting-style:scale-100", children: _jsx(NavigationMenuPrimitive.Viewport, { className: "relative size-full overflow-hidden" }) }) }) }));
|
|
24
24
|
}
|
|
25
25
|
function NavigationMenuLink({ className, ...props }) {
|
|
26
26
|
return (_jsx(NavigationMenuPrimitive.Link, { "data-slot": "navigation-menu-link", className: cn("nc-transition-paint flex min-h-touch-target min-w-touch-target items-center gap-2 rounded-md p-2 text-sm hover:bg-muted focus:bg-muted data-active:bg-muted/50 data-active:hover:bg-muted data-active:focus:bg-muted [@media(hover:hover)_and_(pointer:fine)]:min-h-0 [@media(hover:hover)_and_(pointer:fine)]:min-w-0 [&_svg:not([class*='size-'])]:size-4", className), ...props }));
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type * as React from "react";
|
|
2
|
+
/**
|
|
3
|
+
* A control's own label while the system works on what it was asked to do.
|
|
4
|
+
* The word changes and nothing moves; the control keeps its place, its icon
|
|
5
|
+
* and its size. The caller owns `disabled` and `aria-busy` on the control
|
|
6
|
+
* itself, because only the caller knows which element the wait belongs to.
|
|
7
|
+
*
|
|
8
|
+
* Work that runs past a second adds one `WaitingLine` beside the control.
|
|
9
|
+
*/
|
|
10
|
+
declare function PendingLabel({ children, className, pending, pendingLabel, ...props }: React.ComponentProps<"span"> & {
|
|
11
|
+
pending: boolean;
|
|
12
|
+
pendingLabel: React.ReactNode;
|
|
13
|
+
}): React.JSX.Element;
|
|
14
|
+
export { PendingLabel };
|
|
15
|
+
//# sourceMappingURL=pending-label.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-label.d.ts","sourceRoot":"","sources":["../../src/components/pending-label.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC;;;;;;;GAOG;AACH,iBAAS,YAAY,CAAC,EACpB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,YAAY,EACZ,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC;CAC/B,qBAWA;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../lib/utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* A control's own label while the system works on what it was asked to do.
|
|
5
|
+
* The word changes and nothing moves; the control keeps its place, its icon
|
|
6
|
+
* and its size. The caller owns `disabled` and `aria-busy` on the control
|
|
7
|
+
* itself, because only the caller knows which element the wait belongs to.
|
|
8
|
+
*
|
|
9
|
+
* Work that runs past a second adds one `WaitingLine` beside the control.
|
|
10
|
+
*/
|
|
11
|
+
function PendingLabel({ children, className, pending, pendingLabel, ...props }) {
|
|
12
|
+
return (_jsx("span", { ...props, className: cn(className), "data-pending": pending || undefined, "data-slot": "pending-label", children: pending ? pendingLabel : children }));
|
|
13
|
+
}
|
|
14
|
+
export { PendingLabel };
|
|
@@ -3,6 +3,6 @@ import { cn } from "../lib/utils.js";
|
|
|
3
3
|
function ProofSlot({ quote, attribution, className, ...props }) {
|
|
4
4
|
if (!quote)
|
|
5
5
|
return null;
|
|
6
|
-
return (_jsxs("figure", { "data-slot": "proof-slot", className: cn("nc-panel-cell place-items-center text-center", className), ...props, children: [_jsx("blockquote", { className: "nc-type-
|
|
6
|
+
return (_jsxs("figure", { "data-slot": "proof-slot", className: cn("nc-panel-cell place-items-center text-center", className), ...props, children: [_jsx("blockquote", { className: "nc-type-heading-lg max-w-[26ch] text-foreground", children: quote }), attribution ? (_jsx("figcaption", { className: "nc-type-label-mono text-muted-foreground uppercase", children: attribution })) : null] }));
|
|
7
7
|
}
|
|
8
8
|
export { ProofSlot };
|
|
@@ -11,10 +11,10 @@ function SectionIntro({ className, align = "center", ...props }) {
|
|
|
11
11
|
return (_jsx("div", { "data-slot": "section-intro", "data-align": align, className: cn("nc-panel-cell", align === "center" && "place-items-center text-center", align === "start" && "place-items-start text-left", className), ...props }));
|
|
12
12
|
}
|
|
13
13
|
function SectionIntroKicker({ className, ...props }) {
|
|
14
|
-
return (_jsx("p", { "data-slot": "section-intro-kicker", className: cn("nc-type-
|
|
14
|
+
return (_jsx("p", { "data-slot": "section-intro-kicker", className: cn("nc-type-label-mono text-muted-foreground uppercase", className), ...props }));
|
|
15
15
|
}
|
|
16
16
|
function SectionIntroTitle({ className, size = "lg", ...props }) {
|
|
17
|
-
return (_jsx("h2", { "data-slot": "section-intro-title", className: cn(size === "lg" ? "nc-type-
|
|
17
|
+
return (_jsx("h2", { "data-slot": "section-intro-title", className: cn(size === "lg" ? "nc-type-display-md" : "nc-type-heading-lg", "mx-auto text-foreground", className), ...props }));
|
|
18
18
|
}
|
|
19
19
|
function SectionIntroLead({ className, ...props }) {
|
|
20
20
|
return (_jsx("p", { "data-slot": "section-intro-lead", className: cn("nc-type-body-md mx-auto max-w-[64ch] text-[var(--nc-body)]", className), ...props }));
|
|
@@ -23,6 +23,6 @@ function SecurityGrid({ className, columns = 4, ...props }) {
|
|
|
23
23
|
return (_jsx(SeamGrid, { "data-slot": "security-grid", className: cn("dark", columnClasses[columns], className), ...props }));
|
|
24
24
|
}
|
|
25
25
|
function SecurityCell({ className, icon, title, body, ...props }) {
|
|
26
|
-
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-
|
|
26
|
+
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 font-medium text-foreground", children: title }), _jsx("p", { "data-slot": "security-cell-body", className: "nc-type-body-sm text-muted-foreground", children: body })] }));
|
|
27
27
|
}
|
|
28
28
|
export { SecurityGrid, SecurityCell };
|