@nadicodeai/ui 9.2.1 → 10.0.1

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 (293) hide show
  1. package/AGENTS.md +1 -0
  2. package/README.md +4 -29
  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-status.d.ts +5 -0
  94. package/dist/components/action-status.d.ts.map +1 -1
  95. package/dist/components/action-status.js +6 -2
  96. package/dist/components/agent-orb-appearance.d.ts +16 -2
  97. package/dist/components/agent-orb-appearance.d.ts.map +1 -1
  98. package/dist/components/agent-orb-appearance.js +28 -5
  99. package/dist/components/agent-orb.d.ts +6 -3
  100. package/dist/components/agent-orb.d.ts.map +1 -1
  101. package/dist/components/agent-orb.js +20 -7
  102. package/dist/components/app-mark-aliases.d.ts +16 -0
  103. package/dist/components/app-mark-aliases.d.ts.map +1 -0
  104. package/dist/components/app-mark-aliases.js +84 -0
  105. package/dist/components/app-mark.d.ts +4 -0
  106. package/dist/components/app-mark.d.ts.map +1 -1
  107. package/dist/components/app-mark.js +14 -31
  108. package/dist/components/automation-section.d.ts.map +1 -1
  109. package/dist/components/automation-section.js +2 -2
  110. package/dist/components/badge.js +1 -1
  111. package/dist/components/brand.d.ts +3 -2
  112. package/dist/components/brand.d.ts.map +1 -1
  113. package/dist/components/brand.js +18 -28
  114. package/dist/components/button.js +1 -1
  115. package/dist/components/collection-filters.js +2 -2
  116. package/dist/components/confirm-dialog.d.ts +3 -1
  117. package/dist/components/confirm-dialog.d.ts.map +1 -1
  118. package/dist/components/confirm-dialog.js +3 -3
  119. package/dist/components/drawer.js +5 -5
  120. package/dist/components/feedback-state.d.ts.map +1 -1
  121. package/dist/components/feedback-state.js +6 -9
  122. package/dist/components/footer.js +2 -2
  123. package/dist/components/house-icons.d.ts.map +1 -1
  124. package/dist/components/house-icons.js +9 -1
  125. package/dist/components/input-otp.js +1 -1
  126. package/dist/components/installer-shell.d.ts.map +1 -1
  127. package/dist/components/installer-shell.js +5 -6
  128. package/dist/components/navigation-menu.js +2 -2
  129. package/dist/components/pending-label.d.ts +15 -0
  130. package/dist/components/pending-label.d.ts.map +1 -0
  131. package/dist/components/pending-label.js +14 -0
  132. package/dist/components/sheet.js +1 -1
  133. package/dist/components/skeleton.d.ts +4 -0
  134. package/dist/components/skeleton.d.ts.map +1 -1
  135. package/dist/components/skeleton.js +5 -1
  136. package/dist/components/sonner.d.ts.map +1 -1
  137. package/dist/components/sonner.js +5 -2
  138. package/dist/components/table.js +1 -1
  139. package/dist/components/tabs.js +1 -1
  140. package/dist/components/toggle.js +1 -1
  141. package/dist/components/waiting-line.d.ts +30 -0
  142. package/dist/components/waiting-line.d.ts.map +1 -0
  143. package/dist/components/waiting-line.js +33 -0
  144. package/dist/eslint/rules/no-invalid-token-utility.js +1 -1
  145. package/dist/index.d.ts +3 -38
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +3 -38
  148. package/dist/internal/agent-orb-motion.d.ts +9 -1
  149. package/dist/internal/agent-orb-motion.d.ts.map +1 -1
  150. package/dist/internal/agent-orb-motion.js +23 -11
  151. package/dist/internal/agent-orb.d.ts +14 -1
  152. package/dist/internal/agent-orb.d.ts.map +1 -1
  153. package/dist/internal/agent-orb.js +78 -22
  154. package/dist/internal/assistant-ui/attachment.d.ts.map +1 -1
  155. package/dist/internal/assistant-ui/attachment.js +3 -2
  156. package/dist/internal/assistant-ui/reasoning.d.ts.map +1 -1
  157. package/dist/internal/assistant-ui/reasoning.js +4 -4
  158. package/dist/internal/assistant-ui/tool-fallback.d.ts.map +1 -1
  159. package/dist/internal/assistant-ui/tool-fallback.js +5 -4
  160. package/dist/internal/assistant-ui/tool-group.d.ts.map +1 -1
  161. package/dist/internal/assistant-ui/tool-group.js +4 -3
  162. package/dist/lib/motion.d.ts +18 -4
  163. package/dist/lib/motion.d.ts.map +1 -1
  164. package/dist/lib/motion.js +18 -4
  165. package/dist/styles/globals.css +0 -1
  166. package/docs/activity.md +99 -119
  167. package/docs/agent-orb.md +71 -20
  168. package/docs/component-classification.md +4 -4
  169. package/docs/consuming-cross-repo.md +8 -10
  170. package/docs/contract.md +10 -9
  171. package/docs/icon-assets.md +106 -0
  172. package/docs/migration/10.0.0.md +144 -0
  173. package/package.json +8 -7
  174. package/dist/activity.d.ts +0 -2
  175. package/dist/activity.d.ts.map +0 -1
  176. package/dist/activity.js +0 -2
  177. package/dist/components/action-band.d.ts +0 -12
  178. package/dist/components/action-band.d.ts.map +0 -1
  179. package/dist/components/action-band.js +0 -48
  180. package/dist/components/activity-orb.d.ts +0 -21
  181. package/dist/components/activity-orb.d.ts.map +0 -1
  182. package/dist/components/activity-orb.js +0 -26
  183. package/dist/components/benefits-bento.d.ts +0 -15
  184. package/dist/components/benefits-bento.d.ts.map +0 -1
  185. package/dist/components/benefits-bento.js +0 -6
  186. package/dist/components/bento.d.ts +0 -39
  187. package/dist/components/bento.d.ts.map +0 -1
  188. package/dist/components/bento.js +0 -70
  189. package/dist/components/card-marketing.d.ts +0 -30
  190. package/dist/components/card-marketing.d.ts.map +0 -1
  191. package/dist/components/card-marketing.js +0 -48
  192. package/dist/components/code-editor-mockup.d.ts +0 -25
  193. package/dist/components/code-editor-mockup.d.ts.map +0 -1
  194. package/dist/components/code-editor-mockup.js +0 -47
  195. package/dist/components/contact.d.ts +0 -32
  196. package/dist/components/contact.d.ts.map +0 -1
  197. package/dist/components/contact.js +0 -46
  198. package/dist/components/faq-item.d.ts +0 -25
  199. package/dist/components/faq-item.d.ts.map +0 -1
  200. package/dist/components/faq-item.js +0 -25
  201. package/dist/components/faq.d.ts +0 -20
  202. package/dist/components/faq.d.ts.map +0 -1
  203. package/dist/components/faq.js +0 -23
  204. package/dist/components/feature-grid.d.ts +0 -23
  205. package/dist/components/feature-grid.d.ts.map +0 -1
  206. package/dist/components/feature-grid.js +0 -33
  207. package/dist/components/feature-rows.d.ts +0 -23
  208. package/dist/components/feature-rows.d.ts.map +0 -1
  209. package/dist/components/feature-rows.js +0 -27
  210. package/dist/components/glyph-spinner.d.ts +0 -10
  211. package/dist/components/glyph-spinner.d.ts.map +0 -1
  212. package/dist/components/glyph-spinner.js +0 -101
  213. package/dist/components/hero-split.d.ts +0 -23
  214. package/dist/components/hero-split.d.ts.map +0 -1
  215. package/dist/components/hero-split.js +0 -35
  216. package/dist/components/hero.d.ts +0 -28
  217. package/dist/components/hero.d.ts.map +0 -1
  218. package/dist/components/hero.js +0 -45
  219. package/dist/components/integration-flow.d.ts +0 -36
  220. package/dist/components/integration-flow.d.ts.map +0 -1
  221. package/dist/components/integration-flow.js +0 -36
  222. package/dist/components/live-demo.d.ts +0 -31
  223. package/dist/components/live-demo.d.ts.map +0 -1
  224. package/dist/components/live-demo.js +0 -30
  225. package/dist/components/logo-band.d.ts +0 -33
  226. package/dist/components/logo-band.d.ts.map +0 -1
  227. package/dist/components/logo-band.js +0 -49
  228. package/dist/components/logo-tile.d.ts +0 -21
  229. package/dist/components/logo-tile.d.ts.map +0 -1
  230. package/dist/components/logo-tile.js +0 -28
  231. package/dist/components/media-mount.d.ts +0 -13
  232. package/dist/components/media-mount.d.ts.map +0 -1
  233. package/dist/components/media-mount.js +0 -15
  234. package/dist/components/nav-bar.d.ts +0 -24
  235. package/dist/components/nav-bar.d.ts.map +0 -1
  236. package/dist/components/nav-bar.js +0 -35
  237. package/dist/components/newsletter.d.ts +0 -24
  238. package/dist/components/newsletter.d.ts.map +0 -1
  239. package/dist/components/newsletter.js +0 -31
  240. package/dist/components/page-frame.d.ts +0 -30
  241. package/dist/components/page-frame.d.ts.map +0 -1
  242. package/dist/components/page-frame.js +0 -30
  243. package/dist/components/pricing-card.d.ts +0 -30
  244. package/dist/components/pricing-card.d.ts.map +0 -1
  245. package/dist/components/pricing-card.js +0 -44
  246. package/dist/components/pricing.d.ts +0 -25
  247. package/dist/components/pricing.d.ts.map +0 -1
  248. package/dist/components/pricing.js +0 -11
  249. package/dist/components/proof-slot.d.ts +0 -8
  250. package/dist/components/proof-slot.d.ts.map +0 -1
  251. package/dist/components/proof-slot.js +0 -8
  252. package/dist/components/quote-card.d.ts +0 -31
  253. package/dist/components/quote-card.d.ts.map +0 -1
  254. package/dist/components/quote-card.js +0 -48
  255. package/dist/components/seam-grid.d.ts +0 -30
  256. package/dist/components/seam-grid.d.ts.map +0 -1
  257. package/dist/components/seam-grid.js +0 -30
  258. package/dist/components/section-intro.d.ts +0 -18
  259. package/dist/components/section-intro.d.ts.map +0 -1
  260. package/dist/components/section-intro.js +0 -22
  261. package/dist/components/security-grid.d.ts +0 -25
  262. package/dist/components/security-grid.d.ts.map +0 -1
  263. package/dist/components/security-grid.js +0 -28
  264. package/dist/components/shift-band.d.ts +0 -14
  265. package/dist/components/shift-band.d.ts.map +0 -1
  266. package/dist/components/shift-band.js +0 -11
  267. package/dist/components/spinner.d.ts +0 -3
  268. package/dist/components/spinner.d.ts.map +0 -1
  269. package/dist/components/spinner.js +0 -7
  270. package/dist/components/statement.d.ts +0 -32
  271. package/dist/components/statement.d.ts.map +0 -1
  272. package/dist/components/statement.js +0 -40
  273. package/dist/components/steps.d.ts +0 -34
  274. package/dist/components/steps.d.ts.map +0 -1
  275. package/dist/components/steps.js +0 -40
  276. package/dist/components/team-grid.d.ts +0 -27
  277. package/dist/components/team-grid.d.ts.map +0 -1
  278. package/dist/components/team-grid.js +0 -30
  279. package/dist/components/testimonials.d.ts +0 -48
  280. package/dist/components/testimonials.d.ts.map +0 -1
  281. package/dist/components/testimonials.js +0 -58
  282. package/dist/components/texture-strip.d.ts +0 -22
  283. package/dist/components/texture-strip.d.ts.map +0 -1
  284. package/dist/components/texture-strip.js +0 -32
  285. package/dist/components/use-case-bento.d.ts +0 -13
  286. package/dist/components/use-case-bento.d.ts.map +0 -1
  287. package/dist/components/use-case-bento.js +0 -8
  288. package/dist/internal/activity-orb.d.ts +0 -27
  289. package/dist/internal/activity-orb.d.ts.map +0 -1
  290. package/dist/internal/activity-orb.js +0 -150
  291. package/dist/lib/seam.d.ts +0 -29
  292. package/dist/lib/seam.d.ts.map +0 -1
  293. package/dist/lib/seam.js +0 -30
@@ -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",
@@ -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 }));
@@ -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(
@@ -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
  };
@@ -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 };
@@ -21,7 +21,7 @@ function SheetOverlay({ className, ...props }) {
21
21
  return (_jsx(SheetPrimitive.Backdrop, { "data-slot": "sheet-overlay", className: cn("fixed inset-0 z-50 bg-scrim/scrim", overlayBackdropMotion, className), ...props }));
22
22
  }
23
23
  function SheetContent({ className, children, side = "right", showCloseButton = true, closeLabel = "Close", ...props }) {
24
- return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, {}), _jsxs(SheetPrimitive.Popup, { "data-slot": "sheet-content", "data-side": side, className: cn("fixed z-50 flex max-h-[calc(100%-var(--nc-lg))] flex-col gap-nadicode-md rounded-md border-0 bg-popover bg-clip-padding text-sm text-popover-foreground nc-elevation-modal transition-[opacity,translate] duration-[var(--nc-duration-close)] ease-[var(--nc-ease-out-strong)] data-open:duration-[var(--nc-duration-open)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-none motion-reduce:data-ending-style:opacity-100 motion-reduce:data-starting-style:opacity-100 data-[side=bottom]:inset-x-nadicode-sm data-[side=bottom]:bottom-nadicode-sm data-[side=bottom]:h-auto data-[side=bottom]:data-ending-style:translate-y-nadicode-md data-[side=bottom]:data-starting-style:translate-y-nadicode-md motion-reduce:data-[side=bottom]:data-ending-style:translate-none motion-reduce:data-[side=bottom]:data-starting-style:translate-none data-[side=left]:inset-y-nadicode-sm data-[side=left]:left-nadicode-sm data-[side=left]:w-3/4 data-[side=left]:data-ending-style:-translate-x-nadicode-md data-[side=left]:data-starting-style:-translate-x-nadicode-md motion-reduce:data-[side=left]:data-ending-style:translate-none motion-reduce:data-[side=left]:data-starting-style:translate-none data-[side=right]:inset-y-nadicode-sm data-[side=right]:right-nadicode-sm data-[side=right]:w-3/4 data-[side=right]:data-ending-style:translate-x-nadicode-md data-[side=right]:data-starting-style:translate-x-nadicode-md motion-reduce:data-[side=right]:data-ending-style:translate-none motion-reduce:data-[side=right]:data-starting-style:translate-none data-[side=top]:inset-x-nadicode-sm data-[side=top]:top-nadicode-sm data-[side=top]:h-auto data-[side=top]:data-ending-style:-translate-y-nadicode-md data-[side=top]:data-starting-style:-translate-y-nadicode-md motion-reduce:data-[side=top]:data-ending-style:translate-none motion-reduce:data-[side=top]:data-starting-style:translate-none data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className), ...props, children: [children, showCloseButton && (_jsxs(SheetPrimitive.Close, { "data-slot": "sheet-close", render: _jsx(Button, { variant: "ghost", className: "absolute top-nadicode-md right-nadicode-md", size: "icon-sm" }), children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: closeLabel })] }))] })] }));
24
+ return (_jsxs(SheetPortal, { children: [_jsx(SheetOverlay, {}), _jsxs(SheetPrimitive.Popup, { "data-slot": "sheet-content", "data-side": side, className: cn("fixed z-50 flex max-h-[calc(100%-var(--nc-lg))] flex-col gap-nadicode-md rounded-md border-0 bg-popover bg-clip-padding text-sm text-popover-foreground nc-elevation-modal transition-[opacity,translate] duration-[var(--nc-duration-close)] ease-[var(--nc-ease-out-strong)] data-open:duration-[var(--nc-duration-open)] data-ending-style:opacity-0 data-starting-style:opacity-0 motion-reduce:transition-opacity data-[side=bottom]:inset-x-nadicode-sm data-[side=bottom]:bottom-nadicode-sm data-[side=bottom]:h-auto data-[side=bottom]:data-ending-style:translate-y-nadicode-md data-[side=bottom]:data-starting-style:translate-y-nadicode-md motion-reduce:data-[side=bottom]:data-ending-style:translate-none motion-reduce:data-[side=bottom]:data-starting-style:translate-none data-[side=left]:inset-y-nadicode-sm data-[side=left]:left-nadicode-sm data-[side=left]:w-3/4 data-[side=left]:data-ending-style:-translate-x-nadicode-md data-[side=left]:data-starting-style:-translate-x-nadicode-md motion-reduce:data-[side=left]:data-ending-style:translate-none motion-reduce:data-[side=left]:data-starting-style:translate-none data-[side=right]:inset-y-nadicode-sm data-[side=right]:right-nadicode-sm data-[side=right]:w-3/4 data-[side=right]:data-ending-style:translate-x-nadicode-md data-[side=right]:data-starting-style:translate-x-nadicode-md motion-reduce:data-[side=right]:data-ending-style:translate-none motion-reduce:data-[side=right]:data-starting-style:translate-none data-[side=top]:inset-x-nadicode-sm data-[side=top]:top-nadicode-sm data-[side=top]:h-auto data-[side=top]:data-ending-style:-translate-y-nadicode-md data-[side=top]:data-starting-style:-translate-y-nadicode-md motion-reduce:data-[side=top]:data-ending-style:translate-none motion-reduce:data-[side=top]:data-starting-style:translate-none data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm", className), ...props, children: [children, showCloseButton && (_jsxs(SheetPrimitive.Close, { "data-slot": "sheet-close", render: _jsx(Button, { variant: "ghost", className: "absolute top-nadicode-md right-nadicode-md", size: "icon-sm" }), children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: closeLabel })] }))] })] }));
25
25
  }
26
26
  function SheetHeader({ className, ...props }) {
27
27
  return (_jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-0.5 p-nadicode-lg", className), ...props }));
@@ -1,3 +1,7 @@
1
+ /**
2
+ * A still placeholder in the shape of the content that is coming. It does not
3
+ * pulse: a page load is the system's work, and only an Agent moves on its own.
4
+ */
1
5
  declare function Skeleton({ className, ...props }: React.ComponentProps<"div">): import("react").JSX.Element;
2
6
  export { Skeleton };
3
7
  //# sourceMappingURL=skeleton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAEA,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAQrE;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../src/components/skeleton.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AACH,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,+BAErE;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -1,6 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from "../lib/utils.js";
3
+ /**
4
+ * A still placeholder in the shape of the content that is coming. It does not
5
+ * pulse: a page load is the system's work, and only an Agent moves on its own.
6
+ */
3
7
  function Skeleton({ className, ...props }) {
4
- return (_jsx("div", { "data-slot": "skeleton", className: cn("rounded-md bg-muted motion-safe:animate-pulse", className), ...props }));
8
+ return _jsx("div", { "data-slot": "skeleton", className: cn("rounded-md bg-muted", className), ...props });
5
9
  }
6
10
  export { Skeleton };
@@ -1 +1 @@
1
- {"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../src/components/sonner.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAS9D,QAAA,MAAM,OAAO,GAAI,cAAc,YAAY,gCAgC1C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"sonner.d.ts","sourceRoot":"","sources":["../../src/components/sonner.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAK9D,QAAA,MAAM,OAAO,GAAI,cAAc,YAAY,gCAgC1C,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -2,7 +2,8 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useTheme } from "next-themes";
4
4
  import { Toaster as Sonner } from "sonner";
5
- import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon, } from "lucide-react";
5
+ import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon } from "lucide-react";
6
+ import { WaitingLine } from "./waiting-line.js";
6
7
  const Toaster = ({ ...props }) => {
7
8
  const { theme = "system" } = useTheme();
8
9
  return (_jsx(Sonner, { theme: theme, className: "toaster group", icons: {
@@ -10,7 +11,9 @@ const Toaster = ({ ...props }) => {
10
11
  info: _jsx(InfoIcon, { className: "size-4" }),
11
12
  warning: _jsx(TriangleAlertIcon, { className: "size-4" }),
12
13
  error: _jsx(OctagonXIcon, { className: "size-4" }),
13
- loading: (_jsx(Loader2Icon, { className: "size-4 motion-safe:animate-spin motion-reduce:animate-pulse" })),
14
+ // A toast that stays up is already past a second, so its mark is the
15
+ // one waiting line rather than a spinning glyph.
16
+ loading: _jsx(WaitingLine, { className: "w-8", decorative: true }),
14
17
  }, style: {
15
18
  "--normal-bg": "var(--popover)",
16
19
  "--normal-text": "var(--popover-foreground)",
@@ -18,7 +18,7 @@ function TableFooter({ className, ...props }) {
18
18
  return (_jsx("tfoot", { "data-slot": "table-footer", className: cn("border-t border-border bg-muted/50 font-medium [&>tr]:last:border-b-0", className), ...props }));
19
19
  }
20
20
  function TableRow({ className, ...props }) {
21
- return (_jsx("tr", { "data-slot": "table-row", className: cn("border-b border-border transition-colors motion-reduce:transition-none in-[tbody]:hover:bg-accent in-[tbody]:has-[:focus-visible]:bg-accent in-[tbody]:has-aria-expanded:bg-accent data-[state=selected]:bg-muted", className), ...props }));
21
+ return (_jsx("tr", { "data-slot": "table-row", className: cn("border-b border-border transition-colors in-[tbody]:hover:bg-accent in-[tbody]:has-[:focus-visible]:bg-accent in-[tbody]:has-aria-expanded:bg-accent data-[state=selected]:bg-muted", className), ...props }));
22
22
  }
23
23
  function TableHead({ className, ...props }) {
24
24
  return (_jsx("th", { "data-slot": "table-head", className: cn("h-9 px-2 text-left align-middle font-medium whitespace-nowrap text-foreground [&:has([role=checkbox])]:pr-0", className), ...props }));
@@ -20,7 +20,7 @@ function TabsList({ className, variant = "default", ...props }) {
20
20
  return (_jsx(TabsPrimitive.List, { "data-slot": "tabs-list", "data-variant": variant, className: cn(tabsListVariants({ variant }), className), ...props }));
21
21
  }
22
22
  function TabsTrigger({ className, ...props }) {
23
- return (_jsx(TabsPrimitive.Tab, { "data-slot": "tabs-trigger", className: cn("nc-transition-paint relative inline-flex h-[calc(100%-1px)] min-h-touch-target min-w-touch-target flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-none group-data-[variant=line]/tabs-list:data-active:shadow-none [@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", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity after:duration-[var(--nc-duration-confirm)] after:ease-[var(--nc-ease-out-strong)] group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:-bottom-1 group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100 motion-reduce:after:transition-none", className), ...props }));
23
+ return (_jsx(TabsPrimitive.Tab, { "data-slot": "tabs-trigger", className: cn("nc-transition-paint relative inline-flex h-[calc(100%-1px)] min-h-touch-target min-w-touch-target flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium whitespace-nowrap text-foreground/60 group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start hover:text-foreground disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 group-data-[variant=default]/tabs-list:data-active:shadow-none group-data-[variant=line]/tabs-list:data-active:shadow-none [@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", "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent", "data-active:bg-background data-active:text-foreground", "after:absolute after:bg-foreground after:opacity-0 after:transition-opacity after:duration-[var(--nc-duration-confirm)] after:ease-[var(--nc-ease-out-strong)] group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:-bottom-1 group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100", className), ...props }));
24
24
  }
25
25
  function TabsContent({ className, ...props }) {
26
26
  return (_jsx(TabsPrimitive.Panel, { "data-slot": "tabs-content", className: cn("flex-1 text-sm outline-none", className), ...props }));
@@ -3,7 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
4
4
  import { cva } from "class-variance-authority";
5
5
  import { cn } from "../lib/utils.js";
6
- const toggleVariants = cva("group/toggle inline-flex min-h-touch-target min-w-touch-target items-center justify-center gap-1 rounded-md border border-transparent text-sm 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 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-pressed:bg-accent aria-pressed:font-semibold aria-pressed:text-accent-foreground data-pressed:bg-accent data-pressed:font-semibold data-pressed:text-accent-foreground [@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
+ const toggleVariants = cva("group/toggle inline-flex min-h-touch-target min-w-touch-target items-center justify-center gap-1 rounded-md border border-transparent text-sm font-medium whitespace-nowrap transition-[background-color,border-color,color,opacity] duration-[var(--nc-duration-confirm)] ease-[var(--nc-ease-out-strong)] hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-pressed:bg-accent aria-pressed:font-semibold aria-pressed:text-accent-foreground data-pressed:bg-accent data-pressed:font-semibold data-pressed:text-accent-foreground [@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", {
7
7
  variants: {
8
8
  variant: {
9
9
  default: "bg-transparent",