@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.
Files changed (216) hide show
  1. package/AGENTS.md +1 -0
  2. package/README.md +5 -5
  3. package/dist/agent-orb.d.ts +3 -0
  4. package/dist/agent-orb.d.ts.map +1 -0
  5. package/dist/agent-orb.js +2 -0
  6. package/dist/assets/brand/aionlabs.svg +2 -0
  7. package/dist/assets/brand/airtable.svg +2 -0
  8. package/dist/assets/brand/apple.svg +2 -0
  9. package/dist/assets/brand/arcee.svg +2 -0
  10. package/dist/assets/brand/asana.svg +2 -0
  11. package/dist/assets/brand/atlassian.svg +2 -0
  12. package/dist/assets/brand/baidu.svg +2 -0
  13. package/dist/assets/brand/bytedance.svg +2 -0
  14. package/dist/assets/brand/claude.svg +2 -0
  15. package/dist/assets/brand/cohere.svg +2 -0
  16. package/dist/assets/brand/datadog.svg +2 -0
  17. package/dist/assets/brand/deepseek.svg +2 -0
  18. package/dist/assets/brand/discord.svg +2 -0
  19. package/dist/assets/brand/dolphin.svg +2 -0
  20. package/dist/assets/brand/dotsstudio.svg +2 -0
  21. package/dist/assets/brand/figma.svg +2 -0
  22. package/dist/assets/brand/gemini.svg +2 -0
  23. package/dist/assets/brand/github.svg +2 -0
  24. package/dist/assets/brand/gitlab.svg +2 -0
  25. package/dist/assets/brand/gmail.svg +2 -0
  26. package/dist/assets/brand/google-calendar.svg +2 -0
  27. package/dist/assets/brand/google-drive.svg +2 -0
  28. package/dist/assets/brand/grok.svg +2 -0
  29. package/dist/assets/brand/huggingface.svg +2 -0
  30. package/dist/assets/brand/ibm.svg +2 -0
  31. package/dist/assets/brand/inception.svg +2 -0
  32. package/dist/assets/brand/inclusionai.svg +2 -0
  33. package/dist/assets/brand/index.json +778 -0
  34. package/dist/assets/brand/inference.svg +2 -0
  35. package/dist/assets/brand/intercom.svg +2 -0
  36. package/dist/assets/brand/jira.svg +2 -0
  37. package/dist/assets/brand/kwaipilot.svg +2 -0
  38. package/dist/assets/brand/linear.svg +2 -0
  39. package/dist/assets/brand/linux.svg +2 -0
  40. package/dist/assets/brand/liquid.svg +2 -0
  41. package/dist/assets/brand/longcat.svg +2 -0
  42. package/dist/assets/brand/mattermost.svg +2 -0
  43. package/dist/assets/brand/meta.svg +2 -0
  44. package/dist/assets/brand/microsoft.svg +2 -0
  45. package/dist/assets/brand/minimax.svg +2 -0
  46. package/dist/assets/brand/mistral.svg +2 -0
  47. package/dist/assets/brand/moonshot.svg +2 -0
  48. package/dist/assets/brand/morph.svg +2 -0
  49. package/dist/assets/brand/n8n.svg +2 -0
  50. package/dist/assets/brand/netlify.svg +2 -0
  51. package/dist/assets/brand/nexagi.svg +2 -0
  52. package/dist/assets/brand/notion.svg +2 -0
  53. package/dist/assets/brand/nousresearch.svg +2 -0
  54. package/dist/assets/brand/nova.svg +2 -0
  55. package/dist/assets/brand/nvidia.svg +2 -0
  56. package/dist/assets/brand/openai.svg +2 -0
  57. package/dist/assets/brand/openrouter.svg +2 -0
  58. package/dist/assets/brand/paypal.svg +2 -0
  59. package/dist/assets/brand/perceptron.svg +2 -0
  60. package/dist/assets/brand/perplexity.svg +2 -0
  61. package/dist/assets/brand/poolside.svg +2 -0
  62. package/dist/assets/brand/postgresql.svg +2 -0
  63. package/dist/assets/brand/qwen.svg +2 -0
  64. package/dist/assets/brand/reka.svg +2 -0
  65. package/dist/assets/brand/relace.svg +2 -0
  66. package/dist/assets/brand/sakana.svg +2 -0
  67. package/dist/assets/brand/sentry.svg +2 -0
  68. package/dist/assets/brand/signal.svg +2 -0
  69. package/dist/assets/brand/slack.svg +2 -0
  70. package/dist/assets/brand/spotify.svg +2 -0
  71. package/dist/assets/brand/square.svg +2 -0
  72. package/dist/assets/brand/stepfun.svg +2 -0
  73. package/dist/assets/brand/stripe.svg +2 -0
  74. package/dist/assets/brand/supabase.svg +2 -0
  75. package/dist/assets/brand/telegram.svg +2 -0
  76. package/dist/assets/brand/tencent.svg +2 -0
  77. package/dist/assets/brand/the-drummer.svg +2 -0
  78. package/dist/assets/brand/thinkingmachines.svg +2 -0
  79. package/dist/assets/brand/todoist.svg +2 -0
  80. package/dist/assets/brand/unbiased.svg +2 -0
  81. package/dist/assets/brand/unreal-engine.svg +2 -0
  82. package/dist/assets/brand/upstage.svg +2 -0
  83. package/dist/assets/brand/vercel.svg +2 -0
  84. package/dist/assets/brand/webflow.svg +2 -0
  85. package/dist/assets/brand/whatsapp.svg +2 -0
  86. package/dist/assets/brand/windows.svg +2 -0
  87. package/dist/assets/brand/writer.svg +2 -0
  88. package/dist/assets/brand/xiaomimimo.svg +2 -0
  89. package/dist/assets/brand/youtube.svg +2 -0
  90. package/dist/assets/brand/yuanbao.svg +2 -0
  91. package/dist/assets/brand/zai.svg +2 -0
  92. package/dist/assets/brand/zapier.svg +2 -0
  93. package/dist/components/action-band.js +1 -1
  94. package/dist/components/action-status.d.ts +5 -0
  95. package/dist/components/action-status.d.ts.map +1 -1
  96. package/dist/components/action-status.js +6 -2
  97. package/dist/components/agent-orb-appearance.d.ts +16 -2
  98. package/dist/components/agent-orb-appearance.d.ts.map +1 -1
  99. package/dist/components/agent-orb-appearance.js +28 -5
  100. package/dist/components/agent-orb.d.ts +6 -3
  101. package/dist/components/agent-orb.d.ts.map +1 -1
  102. package/dist/components/agent-orb.js +20 -7
  103. package/dist/components/app-mark-aliases.d.ts +16 -0
  104. package/dist/components/app-mark-aliases.d.ts.map +1 -0
  105. package/dist/components/app-mark-aliases.js +84 -0
  106. package/dist/components/app-mark.d.ts +4 -0
  107. package/dist/components/app-mark.d.ts.map +1 -1
  108. package/dist/components/app-mark.js +14 -31
  109. package/dist/components/automation-section.d.ts.map +1 -1
  110. package/dist/components/automation-section.js +2 -2
  111. package/dist/components/badge.js +1 -1
  112. package/dist/components/brand.d.ts +3 -2
  113. package/dist/components/brand.d.ts.map +1 -1
  114. package/dist/components/brand.js +18 -28
  115. package/dist/components/button.js +1 -1
  116. package/dist/components/code-editor-mockup.d.ts +1 -1
  117. package/dist/components/code-editor-mockup.js +1 -1
  118. package/dist/components/collection-filters.js +2 -2
  119. package/dist/components/confirm-dialog.d.ts +3 -1
  120. package/dist/components/confirm-dialog.d.ts.map +1 -1
  121. package/dist/components/confirm-dialog.js +3 -3
  122. package/dist/components/drawer.js +5 -5
  123. package/dist/components/feature-grid.js +2 -2
  124. package/dist/components/feedback-state.d.ts.map +1 -1
  125. package/dist/components/feedback-state.js +6 -9
  126. package/dist/components/footer.js +2 -2
  127. package/dist/components/hero.js +1 -1
  128. package/dist/components/house-icons.d.ts.map +1 -1
  129. package/dist/components/house-icons.js +9 -1
  130. package/dist/components/input-otp.js +1 -1
  131. package/dist/components/installer-shell.d.ts.map +1 -1
  132. package/dist/components/installer-shell.js +5 -6
  133. package/dist/components/logo-band.js +1 -1
  134. package/dist/components/navigation-menu.js +2 -2
  135. package/dist/components/pending-label.d.ts +15 -0
  136. package/dist/components/pending-label.d.ts.map +1 -0
  137. package/dist/components/pending-label.js +14 -0
  138. package/dist/components/proof-slot.js +1 -1
  139. package/dist/components/section-intro.js +2 -2
  140. package/dist/components/security-grid.js +1 -1
  141. package/dist/components/sheet.js +1 -1
  142. package/dist/components/shift-band.js +1 -1
  143. package/dist/components/skeleton.d.ts +4 -0
  144. package/dist/components/skeleton.d.ts.map +1 -1
  145. package/dist/components/skeleton.js +5 -1
  146. package/dist/components/sonner.d.ts.map +1 -1
  147. package/dist/components/sonner.js +5 -2
  148. package/dist/components/statement.js +2 -2
  149. package/dist/components/steps.js +2 -2
  150. package/dist/components/table.js +1 -1
  151. package/dist/components/tabs.js +1 -1
  152. package/dist/components/texture-strip.js +1 -1
  153. package/dist/components/toggle.js +1 -1
  154. package/dist/components/waiting-line.d.ts +30 -0
  155. package/dist/components/waiting-line.d.ts.map +1 -0
  156. package/dist/components/waiting-line.js +33 -0
  157. package/dist/eslint/rules/no-invalid-token-utility.js +1 -1
  158. package/dist/index.d.ts +2 -8
  159. package/dist/index.d.ts.map +1 -1
  160. package/dist/index.js +2 -8
  161. package/dist/internal/agent-orb-motion.d.ts +9 -1
  162. package/dist/internal/agent-orb-motion.d.ts.map +1 -1
  163. package/dist/internal/agent-orb-motion.js +23 -11
  164. package/dist/internal/agent-orb.d.ts +14 -1
  165. package/dist/internal/agent-orb.d.ts.map +1 -1
  166. package/dist/internal/agent-orb.js +78 -22
  167. package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
  168. package/dist/internal/assistant-ui/attachment.js +3 -2
  169. package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
  170. package/dist/internal/assistant-ui/reasoning.js +4 -4
  171. package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
  172. package/dist/internal/assistant-ui/tool-fallback.js +5 -4
  173. package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
  174. package/dist/internal/assistant-ui/tool-group.js +4 -3
  175. package/dist/lib/motion.d.ts +18 -4
  176. package/dist/lib/motion.d.ts.map +1 -1
  177. package/dist/lib/motion.js +18 -4
  178. package/dist/styles/globals.css +0 -1
  179. package/docs/activity.md +99 -117
  180. package/docs/agent-orb.md +72 -19
  181. package/docs/component-classification.md +4 -4
  182. package/docs/consuming-cross-repo.md +8 -10
  183. package/docs/contract.md +10 -9
  184. package/docs/icon-assets.md +106 -0
  185. package/docs/migration/10.0.0.md +144 -0
  186. package/package.json +8 -7
  187. package/dist/activity.d.ts +0 -2
  188. package/dist/activity.d.ts.map +0 -1
  189. package/dist/activity.js +0 -2
  190. package/dist/components/activity-orb.d.ts +0 -21
  191. package/dist/components/activity-orb.d.ts.map +0 -1
  192. package/dist/components/activity-orb.js +0 -26
  193. package/dist/components/benefits-bento.d.ts +0 -15
  194. package/dist/components/benefits-bento.d.ts.map +0 -1
  195. package/dist/components/benefits-bento.js +0 -6
  196. package/dist/components/bento.d.ts +0 -39
  197. package/dist/components/bento.d.ts.map +0 -1
  198. package/dist/components/bento.js +0 -70
  199. package/dist/components/glyph-spinner.d.ts +0 -10
  200. package/dist/components/glyph-spinner.d.ts.map +0 -1
  201. package/dist/components/glyph-spinner.js +0 -101
  202. package/dist/components/nav-bar.d.ts +0 -24
  203. package/dist/components/nav-bar.d.ts.map +0 -1
  204. package/dist/components/nav-bar.js +0 -35
  205. package/dist/components/page-frame.d.ts +0 -30
  206. package/dist/components/page-frame.d.ts.map +0 -1
  207. package/dist/components/page-frame.js +0 -30
  208. package/dist/components/spinner.d.ts +0 -3
  209. package/dist/components/spinner.d.ts.map +0 -1
  210. package/dist/components/spinner.js +0 -7
  211. package/dist/components/use-case-bento.d.ts +0 -13
  212. package/dist/components/use-case-bento.d.ts.map +0 -1
  213. package/dist/components/use-case-bento.js +0 -8
  214. package/dist/internal/activity-orb.d.ts +0 -27
  215. package/dist/internal/activity-orb.d.ts.map +0 -1
  216. 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, LoaderCircleIcon, PauseCircleIcon, } from "lucide-react";
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: (_jsx(LoaderCircleIcon, { className: "size-4 motion-safe:animate-spin motion-reduce:animate-pulse" })),
20
+ icon: _jsx(CircleDotIcon, { className: "size-4" }),
21
21
  },
22
22
  paused: {
23
23
  label: "Paused",
@@ -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)] motion-reduce:transition-none 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!", {
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
- declare function BrandLockup({ alt, className, width, height, decoding, ...props }: BrandLogoProps): React.JSX.Element;
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 { BrandLockup, BrandMark, BrandWordmark };
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;AA6BF,iBAAS,SAAS,CAAC,EACjB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBA6BhB;AAED,iBAAS,WAAW,CAAC,EACnB,GAAkB,EAClB,SAAS,EACT,KAAW,EACX,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAuBhB;AAED,iBAAS,aAAa,CAAC,EACrB,GAAkB,EAClB,SAAS,EACT,KAAU,EACV,MAAW,EACX,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,cAAc,qBAoBhB;AAED,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,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"}
@@ -1,13 +1,12 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { logoLockupGeometry, logoMarkGeometry, logoWordmarkGeometry, resolveLogoGeometry, } from "@nadicodeai/design-system/assets/logo-geometry";
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
- function BrandMark({ alt = "NadicodeAI", className, width = 32, height = 32, decoding, ...props }) {
23
- void decoding;
24
- // The canonical geometry contains a named clip reference. Scope it per
25
- // instance so nav + footer marks never emit duplicate DOM ids; useId is SSR-safe.
26
- const idPrefix = `mklip-${React.useId().replace(/[^a-zA-Z0-9]/g, "")}-`;
27
- // The verde link is the brand anchor, `{colors.primary}`, never the shadcn
28
- // `--primary` role: that role is the neutral action family, so painting the
29
- // link with it turns the logo monochrome. The `.dark` remap flips
30
- // `--nc-primary` under any dark ancestor, the always-dark nav included.
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
- function BrandLockup({ alt = "NadicodeAI", className, width = 154, height = 32, decoding, ...props }) {
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 idPrefix = `lklip-${React.useId().replace(/[^a-zA-Z0-9]/g, "")}-`;
40
- const geometry = resolveLogoGeometry(logoLockupGeometry, {
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
- function BrandWordmark({ alt = "NadicodeAI", className, width = 96, height = 30, decoding, ...props }) {
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 = resolveLogoGeometry(logoWordmarkGeometry, {
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 { BrandLockup, BrandMark, BrandWordmark };
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] motion-reduce:transition-none 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", {
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
- * NadicodeAI-monochrome, never the macOS traffic-light colours. Token-only;
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
- * NadicodeAI-monochrome, never the macOS traffic-light colours. Token-only;
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-caption-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")] })] }));
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-caption-mono" : undefined, children: selected?.label ?? facet.value })] })] }) }), _jsx(Button, { variant: "outline", size: "icon", "aria-label": `${copy.remove}: ${facet.label}`, onClick: () => {
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,qBA+BpB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
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 { Spinner } from "./spinner.js";
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 }), _jsxs(Button, { variant: destructive ? "destructive" : "default", onClick: onConfirm, disabled: loading, children: [loading ? _jsx(Spinner, {}) : null, confirmLabel] })] })] }) }));
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 motion-reduce:transition-none motion-reduce:data-ending-style:opacity-100 motion-reduce:data-starting-style:opacity-100 supports-[-webkit-touch-callout:none]:absolute", 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 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 motion-reduce:transition-none 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 }));
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-none",
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-ending-style:opacity-100 motion-reduce:data-starting-style:transform-none",
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 motion-reduce:transition-none"), children: children })] }) })] }));
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-caption-mono uppercase text-muted-foreground", children: eyebrow })) : null, intro != null ? (_jsx("p", { className: "nc-type-body-md max-w-[64ch] text-muted-foreground", children: intro })) : null] })) : null, _jsx(SeamGrid, { "data-slot": "feature-grid-cards", className: columnClasses[columns], children: children }), closing != null || link != null ? (_jsxs("div", { "data-slot": "feature-grid-close", className: "flex flex-wrap items-baseline gap-x-3 gap-y-2", children: [closing != null ? (_jsx("span", { className: "nc-type-body-md text-muted-foreground", children: closing })) : null, link] })) : null] }));
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-caption-mono text-[var(--nc-link-deep)]", children: index })) : null, title != null ? (_jsx("h3", { "data-slot": "feature-card-title", className: "nc-type-title-sm text-foreground", children: title })) : null, children != null ? (_jsx("p", { "data-slot": "feature-card-body", className: "nc-type-body-sm text-muted-foreground", children: children })) : null, visual != null ? (_jsx("div", { "data-slot": "feature-card-visual", className: "mt-auto", children: visual })) : null] }));
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;AA+DZ,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,qBA6CA;AAED,OAAO,EAAE,aAAa,EAAE,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, LoaderCircleIcon, LockKeyholeIcon, SearchXIcon, } from "lucide-react";
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
- const stateIcon = icon ??
62
- React.createElement(Icon, {
63
- className: cn("size-5", (status === "loading" || status === "saving") &&
64
- "motion-safe:animate-spin motion-reduce:animate-pulse"),
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-caption-mono text-primary", className), ...props }));
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-caption-mono m-0 uppercase text-muted-foreground", className), ...props }));
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(
@@ -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-caption-mono flex items-center gap-3 uppercase text-muted-foreground", className), ...props, children: [_jsx("span", { "data-slot": "hero-kicker-bar", "aria-hidden": "true", className: "h-0.5 w-8 bg-primary" }), children] }));
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;AAajE,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"}
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)] motion-reduce:transition-none outline-none first:rounded-l-md first:border-l last:rounded-r-md aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]: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 motion-safe:animate-caret-blink motion-safe:duration-[var(--nc-duration-typing)]" }) }))] }));
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;AAqEF,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
+ {"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, CircleIcon, LoaderCircleIcon, SparklesIcon, XCircleIcon, } from "lucide-react";
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
- progress: {
11
- status: "loading",
12
- icon: (_jsx(LoaderCircleIcon, { className: "size-5 motion-safe:animate-spin motion-reduce:animate-pulse" })),
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: (_jsx(LoaderCircleIcon, { className: "size-4 motion-safe:animate-spin motion-reduce:animate-pulse" })),
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-caption-mono uppercase text-muted-foreground", className), ...props }));
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-none motion-reduce:data-ending-style:opacity-100 motion-reduce:data-ending-style:scale-100 motion-reduce:data-starting-style:opacity-100 motion-reduce:data-starting-style:scale-100 **:data-[slot=navigation-menu-link]:focus:outline-none", 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-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-none motion-reduce:data-ending-style:scale-100 motion-reduce:data-ending-style:opacity-100 motion-reduce:data-starting-style:scale-100 motion-reduce:data-starting-style:opacity-100", children: _jsx(NavigationMenuPrimitive.Viewport, { className: "relative size-full overflow-hidden" }) }) }) }));
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-title-md max-w-[26ch] text-foreground", children: quote }), attribution ? (_jsx("figcaption", { className: "nc-type-caption-mono text-muted-foreground uppercase", children: attribution })) : 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-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-caption-mono text-muted-foreground uppercase", className), ...props }));
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-title-lg" : "nc-type-title-md", "mx-auto text-foreground", className), ...props }));
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-strong text-foreground", children: title }), _jsx("p", { "data-slot": "security-cell-body", className: "nc-type-body-sm text-muted-foreground", children: body })] }));
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 };