@vamos-ui/react 0.0.0-stage → 0.3.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 (704) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/dist/blocks/block-heading.d.ts +29 -0
  4. package/dist/blocks/block-heading.js +39 -0
  5. package/dist/blocks/block-image.d.ts +52 -0
  6. package/dist/blocks/block-image.js +48 -0
  7. package/dist/blocks/block-link.d.ts +30 -0
  8. package/dist/blocks/block-link.js +36 -0
  9. package/dist/blocks/create-blocks.d.ts +54 -0
  10. package/dist/blocks/create-blocks.js +52 -0
  11. package/dist/blocks/index.d.ts +55 -0
  12. package/dist/blocks/index.js +59 -0
  13. package/dist/blocks/json-ld.d.ts +18 -0
  14. package/dist/blocks/json-ld.js +44 -0
  15. package/dist/blocks/labels.d.ts +20 -0
  16. package/dist/blocks/labels.js +43 -0
  17. package/dist/blocks/rich-text.d.ts +36 -0
  18. package/dist/blocks/rich-text.js +106 -0
  19. package/dist/blocks/schema/define-block.d.ts +151 -0
  20. package/dist/blocks/schema/define-block.js +120 -0
  21. package/dist/blocks/schema/emphasis.d.ts +17 -0
  22. package/dist/blocks/schema/emphasis.js +69 -0
  23. package/dist/blocks/schema/fields.d.ts +497 -0
  24. package/dist/blocks/schema/fields.js +240 -0
  25. package/dist/blocks/schema/icons.d.ts +2 -0
  26. package/dist/blocks/schema/icons.js +26 -0
  27. package/dist/blocks/schema/index.d.ts +18 -0
  28. package/dist/blocks/schema/index.js +21 -0
  29. package/dist/blocks/schema/lint-types.d.ts +16 -0
  30. package/dist/blocks/schema/lint-types.js +2 -0
  31. package/dist/blocks/schema/lint.d.ts +32 -0
  32. package/dist/blocks/schema/lint.js +164 -0
  33. package/dist/blocks/schema/localize.d.ts +20 -0
  34. package/dist/blocks/schema/localize.js +29 -0
  35. package/dist/blocks/schema/localized.d.ts +25 -0
  36. package/dist/blocks/schema/localized.js +53 -0
  37. package/dist/blocks/schema/migrate.d.ts +24 -0
  38. package/dist/blocks/schema/migrate.js +75 -0
  39. package/dist/blocks/schema/nodes.d.ts +196 -0
  40. package/dist/blocks/schema/nodes.js +78 -0
  41. package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
  42. package/dist/blocks/schema/rich-doc-schema.js +66 -0
  43. package/dist/blocks/schema/rich-doc.d.ts +90 -0
  44. package/dist/blocks/schema/rich-doc.js +62 -0
  45. package/dist/blocks/schema/safety.d.ts +20 -0
  46. package/dist/blocks/schema/safety.js +49 -0
  47. package/dist/blocks/schema/types.d.ts +172 -0
  48. package/dist/blocks/schema/types.js +3 -0
  49. package/dist/blocks/schema/validate.d.ts +17 -0
  50. package/dist/blocks/schema/validate.js +32 -0
  51. package/dist/blocks/schema/walk.d.ts +22 -0
  52. package/dist/blocks/schema/walk.js +60 -0
  53. package/dist/blocks/section-header.d.ts +38 -0
  54. package/dist/blocks/section-header.js +22 -0
  55. package/dist/blocks/section.d.ts +59 -0
  56. package/dist/blocks/section.js +66 -0
  57. package/dist/blocks/site/_kit-1.d.ts +101 -0
  58. package/dist/blocks/site/_kit-1.js +137 -0
  59. package/dist/blocks/site/_site-icon-1.d.ts +6 -0
  60. package/dist/blocks/site/_site-icon-1.js +15 -0
  61. package/dist/blocks/site/announcement-bar.d.ts +42 -0
  62. package/dist/blocks/site/announcement-bar.js +38 -0
  63. package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
  64. package/dist/blocks/site/announcement-dismiss.js +28 -0
  65. package/dist/blocks/site/article-layout.d.ts +65 -0
  66. package/dist/blocks/site/article-layout.js +88 -0
  67. package/dist/blocks/site/blog-list.d.ts +79 -0
  68. package/dist/blocks/site/blog-list.js +78 -0
  69. package/dist/blocks/site/comparison-table.d.ts +54 -0
  70. package/dist/blocks/site/comparison-table.js +38 -0
  71. package/dist/blocks/site/consent-banner.d.ts +52 -0
  72. package/dist/blocks/site/consent-banner.js +33 -0
  73. package/dist/blocks/site/contact-dock.d.ts +52 -0
  74. package/dist/blocks/site/contact-dock.js +55 -0
  75. package/dist/blocks/site/contact-form.d.ts +60 -0
  76. package/dist/blocks/site/contact-form.js +45 -0
  77. package/dist/blocks/site/cta-booking.d.ts +43 -0
  78. package/dist/blocks/site/cta-booking.js +69 -0
  79. package/dist/blocks/site/cta.d.ts +74 -0
  80. package/dist/blocks/site/cta.js +113 -0
  81. package/dist/blocks/site/embed-facade.d.ts +20 -0
  82. package/dist/blocks/site/embed-facade.js +21 -0
  83. package/dist/blocks/site/faq.d.ts +48 -0
  84. package/dist/blocks/site/faq.js +52 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +50 -0
  87. package/dist/blocks/site/feature-tabs.d.ts +22 -0
  88. package/dist/blocks/site/feature-tabs.js +11 -0
  89. package/dist/blocks/site/footer.d.ts +68 -0
  90. package/dist/blocks/site/footer.js +61 -0
  91. package/dist/blocks/site/gallery-section.d.ts +42 -0
  92. package/dist/blocks/site/gallery-section.js +48 -0
  93. package/dist/blocks/site/hero-video.d.ts +15 -0
  94. package/dist/blocks/site/hero-video.js +31 -0
  95. package/dist/blocks/site/hero.d.ts +64 -0
  96. package/dist/blocks/site/hero.js +73 -0
  97. package/dist/blocks/site/logo-strip.d.ts +44 -0
  98. package/dist/blocks/site/logo-strip.js +27 -0
  99. package/dist/blocks/site/map-hours.d.ts +83 -0
  100. package/dist/blocks/site/map-hours.js +125 -0
  101. package/dist/blocks/site/media-text.d.ts +45 -0
  102. package/dist/blocks/site/media-text.js +56 -0
  103. package/dist/blocks/site/menu-list.d.ts +74 -0
  104. package/dist/blocks/site/menu-list.js +84 -0
  105. package/dist/blocks/site/navbar-submenu.d.ts +18 -0
  106. package/dist/blocks/site/navbar-submenu.js +51 -0
  107. package/dist/blocks/site/navbar.d.ts +67 -0
  108. package/dist/blocks/site/navbar.js +64 -0
  109. package/dist/blocks/site/not-found.d.ts +40 -0
  110. package/dist/blocks/site/not-found.js +38 -0
  111. package/dist/blocks/site/page-intro.d.ts +46 -0
  112. package/dist/blocks/site/page-intro.js +44 -0
  113. package/dist/blocks/site/pricing-table.d.ts +67 -0
  114. package/dist/blocks/site/pricing-table.js +83 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +42 -0
  117. package/dist/blocks/site/registry-1.d.ts +720 -0
  118. package/dist/blocks/site/registry-1.js +783 -0
  119. package/dist/blocks/site/registry-2.d.ts +914 -0
  120. package/dist/blocks/site/registry-2.js +563 -0
  121. package/dist/blocks/site/rich-text-section.d.ts +34 -0
  122. package/dist/blocks/site/rich-text-section.js +32 -0
  123. package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
  124. package/dist/blocks/site/shared/brand-icons.js +56 -0
  125. package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
  126. package/dist/blocks/site/shared/consent-gate.js +43 -0
  127. package/dist/blocks/site/shared/consent-island.d.ts +38 -0
  128. package/dist/blocks/site/shared/consent-island.js +63 -0
  129. package/dist/blocks/site/shared/consent.d.ts +49 -0
  130. package/dist/blocks/site/shared/consent.js +130 -0
  131. package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
  132. package/dist/blocks/site/shared/contact-form-island.js +100 -0
  133. package/dist/blocks/site/shared/copy-link.d.ts +10 -0
  134. package/dist/blocks/site/shared/copy-link.js +25 -0
  135. package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
  136. package/dist/blocks/site/shared/dock-avoid.js +107 -0
  137. package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
  138. package/dist/blocks/site/shared/dock-hours.js +25 -0
  139. package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
  140. package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
  141. package/dist/blocks/site/shared/island-keys.d.ts +10 -0
  142. package/dist/blocks/site/shared/island-keys.js +44 -0
  143. package/dist/blocks/site/shared/kit-2.d.ts +55 -0
  144. package/dist/blocks/site/shared/kit-2.js +84 -0
  145. package/dist/blocks/site/shared/labels-2.d.ts +209 -0
  146. package/dist/blocks/site/shared/labels-2.js +427 -0
  147. package/dist/blocks/site/shared/open-now.d.ts +22 -0
  148. package/dist/blocks/site/shared/open-now.js +27 -0
  149. package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
  150. package/dist/blocks/site/shared/opening-hours.js +245 -0
  151. package/dist/blocks/site/shared/site-accent.d.ts +48 -0
  152. package/dist/blocks/site/shared/site-accent.js +249 -0
  153. package/dist/blocks/site/shared/site-form.d.ts +79 -0
  154. package/dist/blocks/site/shared/site-form.js +111 -0
  155. package/dist/blocks/site/shared/site-routing.d.ts +54 -0
  156. package/dist/blocks/site/shared/site-routing.js +86 -0
  157. package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
  158. package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
  159. package/dist/blocks/site/site-shell.d.ts +108 -0
  160. package/dist/blocks/site/site-shell.js +254 -0
  161. package/dist/blocks/site/stats-band.d.ts +42 -0
  162. package/dist/blocks/site/stats-band.js +45 -0
  163. package/dist/blocks/site/team.d.ts +44 -0
  164. package/dist/blocks/site/team.js +48 -0
  165. package/dist/blocks/site/testimonials.d.ts +68 -0
  166. package/dist/blocks/site/testimonials.js +66 -0
  167. package/dist/blocks/types.d.ts +63 -0
  168. package/dist/blocks/types.js +2 -0
  169. package/dist/business/approval-flow.d.ts +152 -0
  170. package/dist/business/approval-flow.js +221 -0
  171. package/dist/business/export-core.d.ts +55 -0
  172. package/dist/business/export-core.js +101 -0
  173. package/dist/business/export.d.ts +148 -0
  174. package/dist/business/export.js +264 -0
  175. package/dist/business/import-core.d.ts +104 -0
  176. package/dist/business/import-core.js +281 -0
  177. package/dist/business/import-wizard.d.ts +186 -0
  178. package/dist/business/import-wizard.js +401 -0
  179. package/dist/business/index.d.ts +12 -0
  180. package/dist/business/index.js +22 -0
  181. package/dist/business/line-items-core.d.ts +129 -0
  182. package/dist/business/line-items-core.js +183 -0
  183. package/dist/business/line-items.d.ts +119 -0
  184. package/dist/business/line-items.js +299 -0
  185. package/dist/business/multi-step-form.d.ts +131 -0
  186. package/dist/business/multi-step-form.js +337 -0
  187. package/dist/business/permission-core.d.ts +59 -0
  188. package/dist/business/permission-core.js +99 -0
  189. package/dist/business/permission-matrix.d.ts +158 -0
  190. package/dist/business/permission-matrix.js +341 -0
  191. package/dist/business/setup-checklist.d.ts +80 -0
  192. package/dist/business/setup-checklist.js +92 -0
  193. package/dist/business/signer-status.d.ts +53 -0
  194. package/dist/business/signer-status.js +76 -0
  195. package/dist/charts/area-chart.d.ts +35 -0
  196. package/dist/charts/area-chart.js +33 -0
  197. package/dist/charts/bar-chart.d.ts +27 -0
  198. package/dist/charts/bar-chart.js +46 -0
  199. package/dist/charts/bar-list.d.ts +47 -0
  200. package/dist/charts/bar-list.js +60 -0
  201. package/dist/charts/chart-shell.d.ts +173 -0
  202. package/dist/charts/chart-shell.js +205 -0
  203. package/dist/charts/chart.d.ts +73 -0
  204. package/dist/charts/chart.js +106 -0
  205. package/dist/charts/combo-chart.d.ts +29 -0
  206. package/dist/charts/combo-chart.js +47 -0
  207. package/dist/charts/donut-chart.d.ts +33 -0
  208. package/dist/charts/donut-chart.js +113 -0
  209. package/dist/charts/funnel.d.ts +51 -0
  210. package/dist/charts/funnel.js +69 -0
  211. package/dist/charts/gauge.d.ts +62 -0
  212. package/dist/charts/gauge.js +104 -0
  213. package/dist/charts/heatmap.d.ts +81 -0
  214. package/dist/charts/heatmap.js +338 -0
  215. package/dist/charts/index.d.ts +12 -0
  216. package/dist/charts/index.js +14 -0
  217. package/dist/charts/line-chart.d.ts +21 -0
  218. package/dist/charts/line-chart.js +36 -0
  219. package/dist/charts/test-utils.d.ts +2 -0
  220. package/dist/charts/test-utils.js +38 -0
  221. package/dist/charts/utils.d.ts +130 -0
  222. package/dist/charts/utils.js +262 -0
  223. package/dist/components/_qr-core.d.ts +26 -0
  224. package/dist/components/_qr-core.js +376 -0
  225. package/dist/components/accordion.d.ts +47 -0
  226. package/dist/components/accordion.js +70 -0
  227. package/dist/components/activity-timeline.d.ts +149 -0
  228. package/dist/components/activity-timeline.js +122 -0
  229. package/dist/components/address-field.d.ts +116 -0
  230. package/dist/components/address-field.js +219 -0
  231. package/dist/components/alert-dialog.d.ts +99 -0
  232. package/dist/components/alert-dialog.js +192 -0
  233. package/dist/components/alert.d.ts +42 -0
  234. package/dist/components/alert.js +82 -0
  235. package/dist/components/app-shell.d.ts +159 -0
  236. package/dist/components/app-shell.js +289 -0
  237. package/dist/components/attachment-list.d.ts +96 -0
  238. package/dist/components/attachment-list.js +196 -0
  239. package/dist/components/audit-log.d.ts +150 -0
  240. package/dist/components/audit-log.js +205 -0
  241. package/dist/components/avatar.d.ts +87 -0
  242. package/dist/components/avatar.js +126 -0
  243. package/dist/components/backup-codes.d.ts +42 -0
  244. package/dist/components/backup-codes.js +67 -0
  245. package/dist/components/badge.d.ts +41 -0
  246. package/dist/components/badge.js +68 -0
  247. package/dist/components/breadcrumb.d.ts +78 -0
  248. package/dist/components/breadcrumb.js +106 -0
  249. package/dist/components/button-group.d.ts +52 -0
  250. package/dist/components/button-group.js +77 -0
  251. package/dist/components/button.d.ts +58 -0
  252. package/dist/components/button.js +107 -0
  253. package/dist/components/calendar.d.ts +240 -0
  254. package/dist/components/calendar.js +483 -0
  255. package/dist/components/card.d.ts +66 -0
  256. package/dist/components/card.js +76 -0
  257. package/dist/components/carousel.d.ts +170 -0
  258. package/dist/components/carousel.js +348 -0
  259. package/dist/components/checkbox.d.ts +78 -0
  260. package/dist/components/checkbox.js +138 -0
  261. package/dist/components/color-picker.d.ts +112 -0
  262. package/dist/components/color-picker.js +235 -0
  263. package/dist/components/combobox.d.ts +136 -0
  264. package/dist/components/combobox.js +294 -0
  265. package/dist/components/command.d.ts +281 -0
  266. package/dist/components/command.js +498 -0
  267. package/dist/components/comment-thread.d.ts +252 -0
  268. package/dist/components/comment-thread.js +449 -0
  269. package/dist/components/context-menu.d.ts +77 -0
  270. package/dist/components/context-menu.js +82 -0
  271. package/dist/components/currency-input.d.ts +43 -0
  272. package/dist/components/currency-input.js +85 -0
  273. package/dist/components/date-picker.d.ts +141 -0
  274. package/dist/components/date-picker.js +241 -0
  275. package/dist/components/date-range-picker.d.ts +91 -0
  276. package/dist/components/date-range-picker.js +251 -0
  277. package/dist/components/description-list.d.ts +92 -0
  278. package/dist/components/description-list.js +42 -0
  279. package/dist/components/dialog.d.ts +139 -0
  280. package/dist/components/dialog.js +185 -0
  281. package/dist/components/dropdown-menu.d.ts +100 -0
  282. package/dist/components/dropdown-menu.js +102 -0
  283. package/dist/components/editor-layout.d.ts +166 -0
  284. package/dist/components/editor-layout.js +237 -0
  285. package/dist/components/empty-state.d.ts +49 -0
  286. package/dist/components/empty-state.js +68 -0
  287. package/dist/components/entity-card.d.ts +83 -0
  288. package/dist/components/entity-card.js +92 -0
  289. package/dist/components/file-upload.d.ts +256 -0
  290. package/dist/components/file-upload.js +490 -0
  291. package/dist/components/formatted-input.d.ts +177 -0
  292. package/dist/components/formatted-input.js +399 -0
  293. package/dist/components/hierarchy-chart.d.ts +190 -0
  294. package/dist/components/hierarchy-chart.js +890 -0
  295. package/dist/components/hover-card.d.ts +21 -0
  296. package/dist/components/hover-card.js +32 -0
  297. package/dist/components/iban-input.d.ts +38 -0
  298. package/dist/components/iban-input.js +112 -0
  299. package/dist/components/id-input.d.ts +65 -0
  300. package/dist/components/id-input.js +130 -0
  301. package/dist/components/image.d.ts +130 -0
  302. package/dist/components/image.js +168 -0
  303. package/dist/components/input-otp.d.ts +62 -0
  304. package/dist/components/input-otp.js +73 -0
  305. package/dist/components/input.d.ts +141 -0
  306. package/dist/components/input.js +187 -0
  307. package/dist/components/item.d.ts +96 -0
  308. package/dist/components/item.js +113 -0
  309. package/dist/components/kbd.d.ts +64 -0
  310. package/dist/components/kbd.js +119 -0
  311. package/dist/components/list-layout.d.ts +144 -0
  312. package/dist/components/list-layout.js +210 -0
  313. package/dist/components/native-select.d.ts +33 -0
  314. package/dist/components/native-select.js +48 -0
  315. package/dist/components/navigation-menu.d.ts +127 -0
  316. package/dist/components/navigation-menu.js +129 -0
  317. package/dist/components/notification-center.d.ts +164 -0
  318. package/dist/components/notification-center.js +399 -0
  319. package/dist/components/page-header.d.ts +60 -0
  320. package/dist/components/page-header.js +60 -0
  321. package/dist/components/pagination.d.ts +121 -0
  322. package/dist/components/pagination.js +174 -0
  323. package/dist/components/phone-input.d.ts +49 -0
  324. package/dist/components/phone-input.js +266 -0
  325. package/dist/components/pin-map.d.ts +58 -0
  326. package/dist/components/pin-map.js +167 -0
  327. package/dist/components/popover.d.ts +38 -0
  328. package/dist/components/popover.js +69 -0
  329. package/dist/components/progress.d.ts +79 -0
  330. package/dist/components/progress.js +97 -0
  331. package/dist/components/qr-code.d.ts +36 -0
  332. package/dist/components/qr-code.js +27 -0
  333. package/dist/components/radio-group.d.ts +43 -0
  334. package/dist/components/radio-group.js +81 -0
  335. package/dist/components/record-detail-layout.d.ts +167 -0
  336. package/dist/components/record-detail-layout.js +233 -0
  337. package/dist/components/record-picker.d.ts +199 -0
  338. package/dist/components/record-picker.js +650 -0
  339. package/dist/components/resizable.d.ts +50 -0
  340. package/dist/components/resizable.js +88 -0
  341. package/dist/components/scroll-area.d.ts +40 -0
  342. package/dist/components/scroll-area.js +56 -0
  343. package/dist/components/select.d.ts +126 -0
  344. package/dist/components/select.js +137 -0
  345. package/dist/components/separator.d.ts +31 -0
  346. package/dist/components/separator.js +41 -0
  347. package/dist/components/settings-layout.d.ts +134 -0
  348. package/dist/components/settings-layout.js +180 -0
  349. package/dist/components/sheet.d.ts +103 -0
  350. package/dist/components/sheet.js +165 -0
  351. package/dist/components/sidebar.d.ts +171 -0
  352. package/dist/components/sidebar.js +421 -0
  353. package/dist/components/signature-pad.d.ts +85 -0
  354. package/dist/components/signature-pad.js +283 -0
  355. package/dist/components/skeleton.d.ts +64 -0
  356. package/dist/components/skeleton.js +53 -0
  357. package/dist/components/sla-timer.d.ts +75 -0
  358. package/dist/components/sla-timer.js +142 -0
  359. package/dist/components/slider.d.ts +57 -0
  360. package/dist/components/slider.js +133 -0
  361. package/dist/components/slug-input.d.ts +69 -0
  362. package/dist/components/slug-input.js +201 -0
  363. package/dist/components/sparkline.d.ts +54 -0
  364. package/dist/components/sparkline.js +122 -0
  365. package/dist/components/spinner.d.ts +34 -0
  366. package/dist/components/spinner.js +34 -0
  367. package/dist/components/stat.d.ts +135 -0
  368. package/dist/components/stat.js +130 -0
  369. package/dist/components/status-picker.d.ts +107 -0
  370. package/dist/components/status-picker.js +175 -0
  371. package/dist/components/stepper.d.ts +86 -0
  372. package/dist/components/stepper.js +103 -0
  373. package/dist/components/switch.d.ts +34 -0
  374. package/dist/components/switch.js +70 -0
  375. package/dist/components/table.d.ts +101 -0
  376. package/dist/components/table.js +72 -0
  377. package/dist/components/tabs.d.ts +103 -0
  378. package/dist/components/tabs.js +173 -0
  379. package/dist/components/tag-input.d.ts +77 -0
  380. package/dist/components/tag-input.js +305 -0
  381. package/dist/components/task-list.d.ts +89 -0
  382. package/dist/components/task-list.js +238 -0
  383. package/dist/components/time-picker.d.ts +119 -0
  384. package/dist/components/time-picker.js +399 -0
  385. package/dist/components/toast.d.ts +87 -0
  386. package/dist/components/toast.js +142 -0
  387. package/dist/components/toggle.d.ts +77 -0
  388. package/dist/components/toggle.js +109 -0
  389. package/dist/components/tooltip.d.ts +69 -0
  390. package/dist/components/tooltip.js +105 -0
  391. package/dist/components/top-bar.d.ts +87 -0
  392. package/dist/components/top-bar.js +99 -0
  393. package/dist/components/tour.d.ts +60 -0
  394. package/dist/components/tour.js +139 -0
  395. package/dist/components/tree-select.d.ts +89 -0
  396. package/dist/components/tree-select.js +243 -0
  397. package/dist/components/tree-view.d.ts +109 -0
  398. package/dist/components/tree-view.js +170 -0
  399. package/dist/components/typography.d.ts +107 -0
  400. package/dist/components/typography.js +128 -0
  401. package/dist/components/user-picker.d.ts +89 -0
  402. package/dist/components/user-picker.js +162 -0
  403. package/dist/components/version-history.d.ts +191 -0
  404. package/dist/components/version-history.js +431 -0
  405. package/dist/data-table/csv.d.ts +27 -0
  406. package/dist/data-table/csv.js +68 -0
  407. package/dist/data-table/data-table.d.ts +423 -0
  408. package/dist/data-table/data-table.js +1259 -0
  409. package/dist/data-table/filter-bar.d.ts +146 -0
  410. package/dist/data-table/filter-bar.js +569 -0
  411. package/dist/data-table/filter-fns.d.ts +65 -0
  412. package/dist/data-table/filter-fns.js +382 -0
  413. package/dist/data-table/index.d.ts +8 -0
  414. package/dist/data-table/index.js +9 -0
  415. package/dist/data-table/saved-views.d.ts +100 -0
  416. package/dist/data-table/saved-views.js +251 -0
  417. package/dist/data-table/types.d.ts +168 -0
  418. package/dist/data-table/types.js +87 -0
  419. package/dist/data-table/url-state.d.ts +94 -0
  420. package/dist/data-table/url-state.js +303 -0
  421. package/dist/data-table/view-state.d.ts +16 -0
  422. package/dist/data-table/view-state.js +81 -0
  423. package/dist/editor/_test-setup.d.ts +1 -0
  424. package/dist/editor/_test-setup.js +33 -0
  425. package/dist/editor/block-editor.d.ts +137 -0
  426. package/dist/editor/block-editor.js +280 -0
  427. package/dist/editor/commands.d.ts +31 -0
  428. package/dist/editor/commands.js +150 -0
  429. package/dist/editor/context.d.ts +108 -0
  430. package/dist/editor/context.js +30 -0
  431. package/dist/editor/convert.d.ts +66 -0
  432. package/dist/editor/convert.js +567 -0
  433. package/dist/editor/drag-handle.d.ts +10 -0
  434. package/dist/editor/drag-handle.js +69 -0
  435. package/dist/editor/extensions.d.ts +34 -0
  436. package/dist/editor/extensions.js +239 -0
  437. package/dist/editor/index.d.ts +14 -0
  438. package/dist/editor/index.js +17 -0
  439. package/dist/editor/inserter.d.ts +12 -0
  440. package/dist/editor/inserter.js +88 -0
  441. package/dist/editor/inspector.d.ts +17 -0
  442. package/dist/editor/inspector.js +65 -0
  443. package/dist/editor/items.d.ts +62 -0
  444. package/dist/editor/items.js +195 -0
  445. package/dist/editor/labels.d.ts +119 -0
  446. package/dist/editor/labels.js +130 -0
  447. package/dist/editor/markdown.d.ts +14 -0
  448. package/dist/editor/markdown.js +209 -0
  449. package/dist/editor/menus.d.ts +20 -0
  450. package/dist/editor/menus.js +236 -0
  451. package/dist/editor/nodes.d.ts +14 -0
  452. package/dist/editor/nodes.js +201 -0
  453. package/dist/editor/outline.d.ts +11 -0
  454. package/dist/editor/outline.js +52 -0
  455. package/dist/editor/schema-form.d.ts +64 -0
  456. package/dist/editor/schema-form.js +290 -0
  457. package/dist/editor/slash-menu.d.ts +15 -0
  458. package/dist/editor/slash-menu.js +119 -0
  459. package/dist/fonts/catalog.d.ts +53 -0
  460. package/dist/fonts/catalog.js +121 -0
  461. package/dist/fonts/font-picker.d.ts +70 -0
  462. package/dist/fonts/font-picker.js +225 -0
  463. package/dist/fonts/index.d.ts +6 -0
  464. package/dist/fonts/index.js +7 -0
  465. package/dist/fonts/loader.d.ts +66 -0
  466. package/dist/fonts/loader.js +161 -0
  467. package/dist/fonts/pairing-picker.d.ts +31 -0
  468. package/dist/fonts/pairing-picker.js +81 -0
  469. package/dist/fonts/pairings.d.ts +84 -0
  470. package/dist/fonts/pairings.js +149 -0
  471. package/dist/fonts/provider.d.ts +34 -0
  472. package/dist/fonts/provider.js +51 -0
  473. package/dist/form/index.d.ts +1 -0
  474. package/dist/form/index.js +1 -0
  475. package/dist/format/core.d.ts +149 -0
  476. package/dist/format/core.js +357 -0
  477. package/dist/format/index.d.ts +4 -0
  478. package/dist/format/index.js +5 -0
  479. package/dist/format/use-format.d.ts +1 -0
  480. package/dist/format/use-format.js +3 -0
  481. package/dist/index.d.ts +91 -0
  482. package/dist/index.js +92 -0
  483. package/dist/lib/cn.d.ts +3 -0
  484. package/dist/lib/cn.js +16 -0
  485. package/dist/lib/color.d.ts +64 -0
  486. package/dist/lib/color.js +177 -0
  487. package/dist/lib/compose-refs.d.ts +24 -0
  488. package/dist/lib/compose-refs.js +45 -0
  489. package/dist/lib/data-islands.d.ts +194 -0
  490. package/dist/lib/data-islands.js +368 -0
  491. package/dist/lib/date.d.ts +129 -0
  492. package/dist/lib/date.js +386 -0
  493. package/dist/lib/field-context.d.ts +64 -0
  494. package/dist/lib/field-context.js +62 -0
  495. package/dist/lib/floating-arrow.d.ts +18 -0
  496. package/dist/lib/floating-arrow.js +15 -0
  497. package/dist/lib/islands.d.ts +38 -0
  498. package/dist/lib/islands.js +40 -0
  499. package/dist/lib/labels.d.ts +51 -0
  500. package/dist/lib/labels.js +56 -0
  501. package/dist/lib/layer.d.ts +36 -0
  502. package/dist/lib/layer.js +42 -0
  503. package/dist/lib/locale.d.ts +85 -0
  504. package/dist/lib/locale.js +105 -0
  505. package/dist/lib/menu.d.ts +58 -0
  506. package/dist/lib/menu.js +99 -0
  507. package/dist/lib/message-format.d.ts +20 -0
  508. package/dist/lib/message-format.js +116 -0
  509. package/dist/lib/nav.d.ts +132 -0
  510. package/dist/lib/nav.js +178 -0
  511. package/dist/lib/provider.d.ts +100 -0
  512. package/dist/lib/provider.js +105 -0
  513. package/dist/lib/public.d.ts +23 -0
  514. package/dist/lib/public.js +34 -0
  515. package/dist/lib/sr-name.d.ts +18 -0
  516. package/dist/lib/sr-name.js +17 -0
  517. package/dist/lib/text.d.ts +100 -0
  518. package/dist/lib/text.js +233 -0
  519. package/dist/lib/theme-scope.d.ts +58 -0
  520. package/dist/lib/theme-scope.js +59 -0
  521. package/dist/lib/use-async-list.d.ts +60 -0
  522. package/dist/lib/use-async-list.js +119 -0
  523. package/dist/lib/use-container-width.d.ts +19 -0
  524. package/dist/lib/use-container-width.js +39 -0
  525. package/dist/lib/use-controllable-state.d.ts +33 -0
  526. package/dist/lib/use-controllable-state.js +56 -0
  527. package/dist/lib/use-edge-fade.d.ts +13 -0
  528. package/dist/lib/use-edge-fade.js +43 -0
  529. package/dist/lib/use-formatted-input.d.ts +69 -0
  530. package/dist/lib/use-formatted-input.js +152 -0
  531. package/dist/lib/use-hotkeys.d.ts +80 -0
  532. package/dist/lib/use-hotkeys.js +221 -0
  533. package/dist/lib/use-hover-intent.d.ts +44 -0
  534. package/dist/lib/use-hover-intent.js +119 -0
  535. package/dist/lib/use-media-query.d.ts +21 -0
  536. package/dist/lib/use-media-query.js +28 -0
  537. package/dist/lib/use-reduced-motion.d.ts +8 -0
  538. package/dist/lib/use-reduced-motion.js +13 -0
  539. package/dist/lib/use-tree.d.ts +153 -0
  540. package/dist/lib/use-tree.js +534 -0
  541. package/dist/lib/value-format.d.ts +25 -0
  542. package/dist/lib/value-format.js +56 -0
  543. package/dist/lib/variants.d.ts +131 -0
  544. package/dist/lib/variants.js +109 -0
  545. package/dist/locale-data/core/date.d.ts +24 -0
  546. package/dist/locale-data/core/date.js +68 -0
  547. package/dist/locale-data/core/decimal.d.ts +19 -0
  548. package/dist/locale-data/core/decimal.js +79 -0
  549. package/dist/locale-data/core/holidays.d.ts +30 -0
  550. package/dist/locale-data/core/holidays.js +79 -0
  551. package/dist/locale-data/core/iban.d.ts +29 -0
  552. package/dist/locale-data/core/iban.js +74 -0
  553. package/dist/locale-data/core/index.d.ts +7 -0
  554. package/dist/locale-data/core/index.js +6 -0
  555. package/dist/locale-data/core/types.d.ts +173 -0
  556. package/dist/locale-data/core/types.js +6 -0
  557. package/dist/locale-data/core/week-info.d.ts +23 -0
  558. package/dist/locale-data/core/week-info.js +85 -0
  559. package/dist/locale-data/core/working-days.d.ts +27 -0
  560. package/dist/locale-data/core/working-days.js +133 -0
  561. package/dist/locale-data/index.d.ts +2 -0
  562. package/dist/locale-data/index.js +4 -0
  563. package/dist/locale-data/tr/address-tr.json +1 -0
  564. package/dist/locale-data/tr/address.d.ts +23 -0
  565. package/dist/locale-data/tr/address.js +52 -0
  566. package/dist/locale-data/tr/holidays.d.ts +31 -0
  567. package/dist/locale-data/tr/holidays.js +81 -0
  568. package/dist/locale-data/tr/iban.d.ts +21 -0
  569. package/dist/locale-data/tr/iban.js +45 -0
  570. package/dist/locale-data/tr/id.d.ts +36 -0
  571. package/dist/locale-data/tr/id.js +120 -0
  572. package/dist/locale-data/tr/index.d.ts +12 -0
  573. package/dist/locale-data/tr/index.js +33 -0
  574. package/dist/locale-data/tr/kdv.d.ts +91 -0
  575. package/dist/locale-data/tr/kdv.js +222 -0
  576. package/dist/locales/en.d.ts +2102 -0
  577. package/dist/locales/en.js +2088 -0
  578. package/dist/locales/tr.d.ts +2086 -0
  579. package/dist/locales/tr.js +2087 -0
  580. package/dist/media/focal-point.d.ts +42 -0
  581. package/dist/media/focal-point.js +96 -0
  582. package/dist/media/gallery-layout.d.ts +19 -0
  583. package/dist/media/gallery-layout.js +61 -0
  584. package/dist/media/gallery.d.ts +64 -0
  585. package/dist/media/gallery.js +140 -0
  586. package/dist/media/image-cropper.d.ts +86 -0
  587. package/dist/media/image-cropper.js +170 -0
  588. package/dist/media/image-field.d.ts +115 -0
  589. package/dist/media/image-field.js +212 -0
  590. package/dist/media/index.d.ts +19 -0
  591. package/dist/media/index.js +23 -0
  592. package/dist/media/lightbox.d.ts +82 -0
  593. package/dist/media/lightbox.js +171 -0
  594. package/dist/media/link-preview.d.ts +97 -0
  595. package/dist/media/link-preview.js +177 -0
  596. package/dist/media/media-library.d.ts +244 -0
  597. package/dist/media/media-library.js +776 -0
  598. package/dist/media/media-picker.d.ts +96 -0
  599. package/dist/media/media-picker.js +209 -0
  600. package/dist/media/media-provider.d.ts +23 -0
  601. package/dist/media/media-provider.js +44 -0
  602. package/dist/media/media-utils.d.ts +39 -0
  603. package/dist/media/media-utils.js +145 -0
  604. package/dist/media/memory-adapter.d.ts +22 -0
  605. package/dist/media/memory-adapter.js +162 -0
  606. package/dist/media/rest-adapter.d.ts +90 -0
  607. package/dist/media/rest-adapter.js +208 -0
  608. package/dist/media/serp.d.ts +62 -0
  609. package/dist/media/serp.js +108 -0
  610. package/dist/media/test-fixtures.d.ts +3 -0
  611. package/dist/media/test-fixtures.js +37 -0
  612. package/dist/media/types.d.ts +183 -0
  613. package/dist/media/types.js +3 -0
  614. package/dist/media/use-pan-zoom.d.ts +51 -0
  615. package/dist/media/use-pan-zoom.js +156 -0
  616. package/dist/media/use-upload-queue.d.ts +64 -0
  617. package/dist/media/use-upload-queue.js +115 -0
  618. package/dist/media/video-player.d.ts +135 -0
  619. package/dist/media/video-player.js +319 -0
  620. package/dist/motion/core.d.ts +32 -0
  621. package/dist/motion/core.js +77 -0
  622. package/dist/motion/count-up.d.ts +29 -0
  623. package/dist/motion/count-up.js +92 -0
  624. package/dist/motion/index.d.ts +11 -0
  625. package/dist/motion/index.js +13 -0
  626. package/dist/motion/motion-scope.d.ts +17 -0
  627. package/dist/motion/motion-scope.js +16 -0
  628. package/dist/motion/page-transition.d.ts +33 -0
  629. package/dist/motion/page-transition.js +61 -0
  630. package/dist/motion/parallax.d.ts +37 -0
  631. package/dist/motion/parallax.js +90 -0
  632. package/dist/motion/pointer.d.ts +38 -0
  633. package/dist/motion/pointer.js +117 -0
  634. package/dist/motion/reveal.d.ts +72 -0
  635. package/dist/motion/reveal.js +133 -0
  636. package/dist/motion/scroll-shrink.d.ts +18 -0
  637. package/dist/motion/scroll-shrink.js +47 -0
  638. package/dist/motion/skeleton-swap.d.ts +17 -0
  639. package/dist/motion/skeleton-swap.js +43 -0
  640. package/dist/motion/text-reveal.d.ts +30 -0
  641. package/dist/motion/text-reveal.js +29 -0
  642. package/dist/motion/ticker.d.ts +35 -0
  643. package/dist/motion/ticker.js +16 -0
  644. package/dist/next/index.d.ts +42 -0
  645. package/dist/next/index.js +36 -0
  646. package/dist/render/block-renderer.d.ts +56 -0
  647. package/dist/render/block-renderer.js +137 -0
  648. package/dist/render/index.d.ts +6 -0
  649. package/dist/render/index.js +7 -0
  650. package/dist/render/prepare.d.ts +61 -0
  651. package/dist/render/prepare.js +119 -0
  652. package/dist/scheduler/core/duration.d.ts +83 -0
  653. package/dist/scheduler/core/duration.js +174 -0
  654. package/dist/scheduler/core/gantt.d.ts +63 -0
  655. package/dist/scheduler/core/gantt.js +226 -0
  656. package/dist/scheduler/core/index.d.ts +6 -0
  657. package/dist/scheduler/core/index.js +7 -0
  658. package/dist/scheduler/core/layout.d.ts +97 -0
  659. package/dist/scheduler/core/layout.js +249 -0
  660. package/dist/scheduler/core/time-scale.d.ts +89 -0
  661. package/dist/scheduler/core/time-scale.js +173 -0
  662. package/dist/scheduler/gantt.d.ts +125 -0
  663. package/dist/scheduler/gantt.js +532 -0
  664. package/dist/scheduler/index.d.ts +6 -0
  665. package/dist/scheduler/index.js +7 -0
  666. package/dist/scheduler/resource-calendar.d.ts +218 -0
  667. package/dist/scheduler/resource-calendar.js +661 -0
  668. package/dist/scheduler/scheduler.d.ts +168 -0
  669. package/dist/scheduler/scheduler.js +768 -0
  670. package/dist/scheduler/shared.d.ts +63 -0
  671. package/dist/scheduler/shared.js +145 -0
  672. package/dist/scheduler/time-tracker.d.ts +138 -0
  673. package/dist/scheduler/time-tracker.js +403 -0
  674. package/dist/sortable/core.d.ts +67 -0
  675. package/dist/sortable/core.js +167 -0
  676. package/dist/sortable/index.d.ts +8 -0
  677. package/dist/sortable/index.js +10 -0
  678. package/dist/sortable/kanban-core.d.ts +70 -0
  679. package/dist/sortable/kanban-core.js +67 -0
  680. package/dist/sortable/kanban.d.ts +147 -0
  681. package/dist/sortable/kanban.js +472 -0
  682. package/dist/sortable/sortable-list.d.ts +71 -0
  683. package/dist/sortable/sortable-list.js +76 -0
  684. package/dist/sortable/sortable-tree.d.ts +105 -0
  685. package/dist/sortable/sortable-tree.js +462 -0
  686. package/dist/sortable/sortable.d.ts +188 -0
  687. package/dist/sortable/sortable.js +485 -0
  688. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  689. package/dist/sortable/use-pointer-drag.js +173 -0
  690. package/dist/sortable/use-time-scale.d.ts +11 -0
  691. package/dist/sortable/use-time-scale.js +19 -0
  692. package/dist/styles/base.css +51 -0
  693. package/dist/styles/blocks.css +949 -0
  694. package/dist/styles/calendar.css +642 -0
  695. package/dist/styles/charts.css +264 -0
  696. package/dist/styles/data.css +474 -0
  697. package/dist/styles/editors.css +1022 -0
  698. package/dist/styles/forms.css +406 -0
  699. package/dist/styles/media.css +515 -0
  700. package/dist/styles/motion.css +389 -0
  701. package/dist/styles/navigation.css +293 -0
  702. package/dist/styles/overlays.css +244 -0
  703. package/dist/styles.css +743 -0
  704. package/package.json +160 -4
@@ -0,0 +1,175 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Select as SelectPrimitive } from "radix-ui";
5
+ import { Check, ChevronDown } from "lucide-react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useFieldControl } from "../lib/field-context.js";
8
+ import { useLabels } from "../lib/labels.js";
9
+ import { Layer } from "../lib/layer.js";
10
+ import { usePortalContainer } from "../lib/theme-scope.js";
11
+ import { useControllableState, useLatest } from "../lib/use-controllable-state.js";
12
+ import { controlVariants, itemSlots, itemVariants } from "../lib/variants.js";
13
+ import { badgeVariants } from "./badge.js";
14
+ import { Spinner } from "./spinner.js";
15
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogFooter, AlertDialogHeader, AlertDialogBody } from "./alert-dialog.js";
16
+ import { Textarea } from "./input.js";
17
+ const statusPickerLabels = {
18
+ change: "{label}: {status}. Change",
19
+ status: "Status",
20
+ notAllowed: "Not allowed from {status}",
21
+ note: "Note",
22
+ notePlaceholder: "Add a short reason the requester will see",
23
+ saving: "Saving…",
24
+ saved: "Status changed to {status}",
25
+ failed: "Couldn't change the status. It's back to {status}.",
26
+ placeholder: "Set status",
27
+ todo: "To do",
28
+ active: "In progress",
29
+ done: "Done",
30
+ cancelled: "Cancelled",
31
+ confirm: "Confirm",
32
+ };
33
+ const CATEGORY_TONE = { todo: "neutral", active: "info", done: "success", cancelled: "neutral" };
34
+ const CATEGORY_ORDER = ["todo", "active", "done", "cancelled"];
35
+ /** Default category icons — shape, not only colour, carries the meaning. */
36
+ export function StatusIcon({ category, className }) {
37
+ const cls = cn("size-3.5 shrink-0", className);
38
+ switch (category) {
39
+ case "todo":
40
+ return (_jsx("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, focusable: "false", className: cls, "data-category": "todo", children: _jsx("circle", { cx: "8", cy: "8", r: "5.75", stroke: "currentColor", strokeWidth: "1.6", strokeDasharray: "2.6 2.1" }) }));
41
+ case "active":
42
+ return (_jsxs("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, focusable: "false", className: cls, "data-category": "active", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75", stroke: "currentColor", strokeWidth: "1.6" }), _jsx("path", { d: "M8 4.25a3.75 3.75 0 0 1 0 7.5z", fill: "currentColor" })] }));
43
+ case "done":
44
+ return (_jsxs("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, focusable: "false", className: cls, "data-category": "done", children: [_jsx("circle", { cx: "8", cy: "8", r: "6.5", fill: "currentColor" }), _jsx("path", { d: "M5.2 8.2 7.1 10l3.7-4", stroke: "var(--surface-solid, #fff)", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round" })] }));
45
+ default:
46
+ return (_jsxs("svg", { viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, focusable: "false", className: cls, "data-category": "cancelled", children: [_jsx("circle", { cx: "8", cy: "8", r: "5.75", stroke: "currentColor", strokeWidth: "1.6" }), _jsx("path", { d: "m5.6 10.4 4.8-4.8", stroke: "currentColor", strokeWidth: "1.6", strokeLinecap: "round" })] }));
47
+ }
48
+ }
49
+ /** Badge tone of a status. Passed into the single `badgeVariants` call so the neutral default never overrides it. */
50
+ function toneStyle(s) {
51
+ if (!s)
52
+ return { tone: "outline" };
53
+ if (s.color)
54
+ return { tone: "custom", style: { ["--tone"]: s.color } };
55
+ return { tone: s.tone ?? CATEGORY_TONE[s.category] };
56
+ }
57
+ const TONE_COLOR = {
58
+ neutral: "var(--fg-muted)",
59
+ accent: "var(--accent-ink)",
60
+ success: "var(--success)",
61
+ warning: "var(--warning)",
62
+ danger: "var(--danger)",
63
+ info: "var(--info)",
64
+ };
65
+ /** The ink colour of a status (icon in field triggers and menus). */
66
+ function toneColor(s) {
67
+ return s.color ?? TONE_COLOR[s.tone ?? CATEGORY_TONE[s.category]];
68
+ }
69
+ /** A status rendered as a badge (no picker) — table cells, read-only views, activity entries. */
70
+ export function StatusBadge({ status, size = "md", className }) {
71
+ const tone = toneStyle(status);
72
+ return (_jsxs("span", { "data-slot": "status-badge", "data-category": status.category, className: cn(badgeVariants({ size: size === "sm" ? "sm" : "md", tone: tone.tone }), "gap-1.5", status.category === "cancelled" && "text-fg-muted", className), style: tone.style, children: [status.icon ?? _jsx(StatusIcon, { category: status.category }), status.label] }));
73
+ }
74
+ /**
75
+ * Change a record's status inside a workflow: task To do → In progress → Done, deal stages,
76
+ * content Draft → Review → Published, leave Pending → Approved / Rejected. The trigger is the
77
+ * status badge itself; transitions not allowed from the current status stay visible with the
78
+ * reason; a transition can ask for confirmation (and a note); async saves are optimistic and revert.
79
+ *
80
+ * ```tsx
81
+ * <StatusPicker statuses={taskStatuses} value={task.status} onValueChange={(v) => save({ status: v })} />
82
+ * <StatusPicker statuses={leave} transitions={{ pending: ["approved", "rejected"] }}
83
+ * confirm={(s) => s.value === "rejected" && { title: "Reject request?", requireNote: true, tone: "danger" }} />
84
+ * ```
85
+ */
86
+ export const StatusPicker = React.forwardRef(function StatusPicker({ statuses, value: valueProp, defaultValue, onValueChange, transitions, confirm, onError, trigger = "badge", groupByCategory, name, size = "md", disabled: disabledProp, readOnly: readOnlyProp, loading, fieldLabel, labels, className, ...rest }, ref) {
87
+ const t = useLabels("statusPicker", statusPickerLabels, labels);
88
+ const control = useFieldControl({
89
+ id: rest.id,
90
+ name,
91
+ disabled: disabledProp,
92
+ readOnly: readOnlyProp,
93
+ "aria-describedby": rest["aria-describedby"],
94
+ "aria-labelledby": rest["aria-labelledby"],
95
+ "aria-invalid": rest["aria-invalid"],
96
+ });
97
+ const container = usePortalContainer();
98
+ const [committed, setCommitted] = useControllableState({ value: valueProp, defaultValue: defaultValue ?? null, name: "StatusPicker" });
99
+ const [optimistic, setOptimistic] = React.useState(null);
100
+ const [saving, setSaving] = React.useState(false);
101
+ const [announce, setAnnounce] = React.useState("");
102
+ const [pendingConfirm, setPendingConfirm] = React.useState(null);
103
+ const [note, setNote] = React.useState("");
104
+ const onChangeRef = useLatest(onValueChange);
105
+ const noteId = React.useId();
106
+ const shown = optimistic ?? committed;
107
+ const byValue = React.useMemo(() => new Map(statuses.map((s) => [s.value, s])), [statuses]);
108
+ const current = shown ? byValue.get(shown) : undefined;
109
+ const committedDef = committed ? byValue.get(committed) : undefined;
110
+ const allowed = committed && transitions ? new Set([committed, ...(transitions[committed] ?? [])]) : null;
111
+ const disabled = Boolean(control.disabled);
112
+ const readOnly = Boolean(control.readOnly);
113
+ const busy = saving || Boolean(loading);
114
+ const grouped = groupByCategory ?? statuses.length > 5;
115
+ const commit = async (next, meta) => {
116
+ const prev = committed;
117
+ const result = onChangeRef.current?.(next.value, prev, meta);
118
+ if (result && typeof result.then === "function") {
119
+ setOptimistic(next.value);
120
+ setSaving(true);
121
+ try {
122
+ await result;
123
+ setCommitted(next.value);
124
+ setAnnounce(t("saved", { status: next.label }));
125
+ }
126
+ catch (err) {
127
+ setAnnounce(t("failed", { status: committedDef?.label ?? t("placeholder") }));
128
+ onError?.(err, next);
129
+ }
130
+ finally {
131
+ setOptimistic(null);
132
+ setSaving(false);
133
+ }
134
+ }
135
+ else {
136
+ setCommitted(next.value);
137
+ setAnnounce(t("saved", { status: next.label }));
138
+ }
139
+ };
140
+ const handleChange = (v) => {
141
+ const next = byValue.get(v);
142
+ if (!next || v === committed)
143
+ return;
144
+ const config = confirm?.(next, committedDef ?? null);
145
+ if (config) {
146
+ setNote("");
147
+ setPendingConfirm({ next, config });
148
+ return;
149
+ }
150
+ void commit(next, {});
151
+ };
152
+ const label = fieldLabel ?? t("status");
153
+ const accessibleName = rest["aria-label"] ?? (control["aria-labelledby"] ? undefined : t("change", { label, status: current?.label ?? t("placeholder") }));
154
+ const tone = toneStyle(current);
155
+ const triggerClass = trigger === "field"
156
+ ? cn(controlVariants({ size: size === "sm" ? "sm" : "md" }), "justify-start text-start", className)
157
+ : cn(badgeVariants({ size: size === "sm" ? "sm" : "md", tone: tone.tone }), "gap-1.5 pe-1.5 outline-none transition-[filter,box-shadow] focus-ring", !readOnly && !disabled && "cursor-pointer hover:brightness-95", current?.category === "cancelled" && "text-fg-muted", disabled && "opacity-50", className);
158
+ const triggerInner = (_jsxs(_Fragment, { children: [busy ? (_jsx(Spinner, { size: "xs", className: trigger === "field" ? "text-fg-muted" : undefined })) : current ? (_jsx("span", { className: "inline-flex", style: trigger === "field" ? { color: toneColor(current) } : undefined, children: current.icon ?? _jsx(StatusIcon, { category: current.category }) })) : null, _jsx("span", { className: cn("truncate", trigger === "field" && "flex-1", !current && "text-fg-subtle"), children: current?.label ?? t("placeholder") }), busy ? _jsx("span", { className: "sr-only", children: t("saving") }) : null, !readOnly ? _jsx(ChevronDown, { "aria-hidden": true, className: cn("shrink-0 opacity-60", trigger === "field" ? "ms-auto size-4" : "size-3") }) : null] }));
159
+ if (readOnly) {
160
+ return current ? (_jsx(StatusBadge, { status: current, size: size, className: className })) : (_jsx("span", { className: cn(badgeVariants({ tone: "outline", size: size === "sm" ? "sm" : "md" }), className), children: t("placeholder") }));
161
+ }
162
+ const groups = grouped
163
+ ? CATEGORY_ORDER.map((c) => ({ category: c, items: statuses.filter((s) => s.category === c) })).filter((g) => g.items.length)
164
+ : [{ category: null, items: statuses }];
165
+ const renderItem = (s) => {
166
+ const notAllowed = allowed ? !allowed.has(s.value) : false;
167
+ const reasonId = `${noteId}-${s.value}`;
168
+ return (_jsxs(SelectPrimitive.Item, { value: s.value, disabled: notAllowed, "aria-describedby": notAllowed ? reasonId : undefined, className: cn(itemVariants({ size: "md", inset: true }), "items-start py-2"), children: [_jsx("span", { className: cn(itemSlots.indicator, "top-2.5"), children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { className: "size-3.5", strokeWidth: 2.5 }) }) }), _jsx("span", { "aria-hidden": true, className: "mt-0.5 inline-flex [&_svg]:size-4", style: { color: toneColor(s) }, children: s.icon ?? _jsx(StatusIcon, { category: s.category, className: "size-4" }) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx(SelectPrimitive.ItemText, { children: s.label }), notAllowed ? (_jsx("span", { id: reasonId, className: itemSlots.description, children: t("notAllowed", { status: committedDef?.label ?? "" }) })) : s.description ? (_jsx("span", { className: itemSlots.description, children: s.description })) : null] })] }, s.value));
169
+ };
170
+ return (_jsxs(_Fragment, { children: [_jsxs(SelectPrimitive.Root, { value: shown ?? "", onValueChange: handleChange, disabled: disabled || busy, name: control.name, children: [_jsx(SelectPrimitive.Trigger, { ref: ref, id: control.id, "data-slot": "status-picker", "data-trigger": trigger, "data-category": current?.category, "aria-label": accessibleName, "aria-labelledby": control["aria-labelledby"], "aria-describedby": control["aria-describedby"], "aria-invalid": control["aria-invalid"], "aria-busy": busy || undefined, className: triggerClass, style: trigger === "badge" ? tone.style : undefined, children: triggerInner }), _jsx(SelectPrimitive.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsx(SelectPrimitive.Content, { position: "popper", sideOffset: 6, collisionPadding: 12, align: "start", "data-slot": "status-picker-content", className: "surface-popover ui-pop z-(--z-popover) max-h-(--radix-select-content-available-height) min-w-56 overflow-hidden rounded-ui-lg", children: _jsx(SelectPrimitive.Viewport, { className: "p-1", children: groups.map((g, i) => g.category ? (_jsxs(SelectPrimitive.Group, { children: [i > 0 ? _jsx(SelectPrimitive.Separator, { className: itemSlots.separator }) : null, _jsx(SelectPrimitive.Label, { className: itemSlots.groupLabel, children: t(g.category) }), g.items.map(renderItem)] }, g.category)) : (_jsx(React.Fragment, { children: g.items.map(renderItem) }, "all"))) }) }) }) })] }), _jsx("span", { role: "status", "aria-live": "polite", className: "sr-only", children: announce }), _jsx(AlertDialog, { open: pendingConfirm !== null, onOpenChange: (o) => !o && setPendingConfirm(null), children: pendingConfirm ? (_jsxs(AlertDialogContent, { tone: pendingConfirm.config.tone ?? "default", children: [_jsx(AlertDialogHeader, { title: pendingConfirm.config.title, description: pendingConfirm.config.description }), pendingConfirm.config.requireNote ? (_jsxs(AlertDialogBody, { className: "grid gap-1.5", children: [_jsx("label", { htmlFor: `${noteId}-note`, className: "text-[13px] font-medium text-fg", children: pendingConfirm.config.noteLabel ?? t("note") }), _jsx(Textarea, { id: `${noteId}-note`, rows: 3, value: note, onChange: (e) => setNote(e.target.value), placeholder: t("notePlaceholder"), required: true, "aria-required": true })] })) : null, _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, {}), _jsx(AlertDialogAction, { disabled: Boolean(pendingConfirm.config.requireNote) && note.trim() === "", onClick: () => {
171
+ const p = pendingConfirm;
172
+ setPendingConfirm(null);
173
+ void commit(p.next, { note: p.config.requireNote ? note.trim() : undefined });
174
+ }, children: pendingConfirm.config.confirmLabel ?? t("confirm") })] })] })) : null })] }));
175
+ });
@@ -0,0 +1,86 @@
1
+ import * as React from "react";
2
+ declare const stepperLabels: {
3
+ label: string;
4
+ step: string;
5
+ optional: string;
6
+ complete: string;
7
+ current: string;
8
+ error: string;
9
+ skipped: string;
10
+ };
11
+ type StepperLabels = Partial<typeof stepperLabels>;
12
+ export type StepStatus = "upcoming" | "current" | "complete" | "error" | "skipped";
13
+ export interface StepItem {
14
+ /** Stable key. Defaults to the index. */
15
+ id?: string;
16
+ title: React.ReactNode;
17
+ description?: React.ReactNode;
18
+ /** Overrides the status derived from `value` (e.g. `"error"` from validation, `"skipped"`). */
19
+ status?: StepStatus;
20
+ /** Shows an "Optional" note under the title. */
21
+ optional?: boolean;
22
+ /** Replaces the number in the indicator (upcoming / current steps). */
23
+ icon?: React.ReactNode;
24
+ /** Never clickable. */
25
+ disabled?: boolean;
26
+ /** Vertical only: content shown under the current step. */
27
+ content?: React.ReactNode;
28
+ }
29
+ export interface StepProps extends Omit<StepItem, "content"> {
30
+ /** Vertical only: content shown under this step while it is current. */
31
+ children?: React.ReactNode;
32
+ }
33
+ /**
34
+ * One step, for the compound API: `<Stepper value={1}><Step title="Upload" /><Step title="Map columns" /></Stepper>`.
35
+ * It only describes the step; `Stepper` renders it.
36
+ */
37
+ export declare function Step(_props: StepProps): React.ReactElement | null;
38
+ type Variant = "numbered" | "dots" | "bar" | "compact";
39
+ type Size = "sm" | "md";
40
+ export interface StepperProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
41
+ /** Current step, 0-based. */
42
+ value: number;
43
+ /** Makes navigable steps clickable. Moving between steps doesn't move focus; focus your step heading. */
44
+ onValueChange?: (index: number) => void;
45
+ /** Which steps may be clicked: `"completed"` (default, steps before the current one) · `"all"` · a predicate. */
46
+ navigable?: "completed" | "all" | ((index: number) => boolean);
47
+ orientation?: "horizontal" | "vertical";
48
+ /** `numbered` (default) · `dots` · `bar` (segments) · `compact` ("Step 2 of 4 · Map columns" + thin bar). */
49
+ variant?: Variant;
50
+ size?: Size;
51
+ /** Data-driven steps. Or pass `<Step>` children. */
52
+ steps?: StepItem[];
53
+ /** Spinner in the current step's indicator (e.g. while validating). */
54
+ loading?: boolean;
55
+ /** Horizontal steppers switch to `compact` below 640px. Default `true`. */
56
+ responsive?: boolean;
57
+ labels?: StepperLabels;
58
+ children?: React.ReactNode;
59
+ }
60
+ export interface StepIndicatorProps extends React.HTMLAttributes<HTMLSpanElement> {
61
+ status: StepStatus;
62
+ /** 1-based number shown for upcoming / current steps. */
63
+ number?: number;
64
+ icon?: React.ReactNode;
65
+ loading?: boolean;
66
+ size?: Size;
67
+ }
68
+ /** The circle: number, check, warning or spinner. Decorative (`aria-hidden`) — status is in the step's text. */
69
+ export declare function StepIndicator({ status, number, icon, loading, size, className, ...props }: StepIndicatorProps): React.JSX.Element;
70
+ /**
71
+ * Shows position and status in an ordered process (wizards, import flows, approvals, checkout).
72
+ * Display and navigation only — form state belongs to the consumer.
73
+ *
74
+ * ```tsx
75
+ * <Stepper value={1} steps={[{ title: "Upload" }, { title: "Map columns" }, { title: "Review" }, { title: "Import" }]} />
76
+ * <Stepper value={step} onValueChange={setStep} orientation="vertical">
77
+ * <Step title="Company details">…form…</Step>
78
+ * <Step title="Billing" optional />
79
+ * </Stepper>
80
+ * ```
81
+ *
82
+ * An ordered list; the current step has `aria-current="step"` and every step's name includes its
83
+ * position and status ("Step 2 of 4, Map columns, current").
84
+ */
85
+ export declare const Stepper: React.ForwardRefExoticComponent<StepperProps & React.RefAttributes<HTMLDivElement>>;
86
+ export {};
@@ -0,0 +1,103 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { AlertTriangle, Check, Minus } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useLabels } from "../lib/labels.js";
7
+ import { Spinner } from "./spinner.js";
8
+ const stepperLabels = {
9
+ label: "Progress",
10
+ step: "Step {current} of {total}",
11
+ optional: "Optional",
12
+ complete: "Completed",
13
+ current: "Current",
14
+ error: "Needs attention",
15
+ skipped: "Skipped",
16
+ };
17
+ /**
18
+ * One step, for the compound API: `<Stepper value={1}><Step title="Upload" /><Step title="Map columns" /></Stepper>`.
19
+ * It only describes the step; `Stepper` renders it.
20
+ */
21
+ export function Step(_props) {
22
+ return null;
23
+ }
24
+ const indicatorSize = { sm: "size-6 text-[11px] [&_svg]:size-3", md: "size-7 text-xs [&_svg]:size-3.5" };
25
+ /** The circle: number, check, warning or spinner. Decorative (`aria-hidden`) — status is in the step's text. */
26
+ export function StepIndicator({ status, number, icon, loading, size = "md", className, ...props }) {
27
+ return (_jsx("span", { "aria-hidden": true, "data-slot": "step-indicator", "data-status": status, className: cn("relative inline-flex shrink-0 items-center justify-center rounded-full font-semibold tabular transition-[background-color,box-shadow,color] duration-200", indicatorSize[size], status === "complete" && "bg-accent text-accent-fg", status === "current" && "bg-surface text-fg shadow-[0_0_0_1.5px_var(--accent-ink),0_0_0_5px_var(--accent-soft)]", status === "upcoming" && "text-fg-subtle shadow-[inset_0_0_0_1.5px_var(--track)]", status === "error" && "tone-danger tone-soft shadow-[inset_0_0_0_1.5px_var(--danger)]", status === "skipped" && "border-[1.5px] border-dashed border-field-border text-fg-subtle", className), ...props, children: loading ? (_jsx(Spinner, { size: "xs" })) : status === "complete" ? (_jsx(Check, { strokeWidth: 3 })) : status === "error" ? (_jsx(AlertTriangle, { strokeWidth: 2.5 })) : status === "skipped" ? (_jsx(Minus, { strokeWidth: 2.5 })) : ((icon ?? number)) }));
28
+ }
29
+ /**
30
+ * Shows position and status in an ordered process (wizards, import flows, approvals, checkout).
31
+ * Display and navigation only — form state belongs to the consumer.
32
+ *
33
+ * ```tsx
34
+ * <Stepper value={1} steps={[{ title: "Upload" }, { title: "Map columns" }, { title: "Review" }, { title: "Import" }]} />
35
+ * <Stepper value={step} onValueChange={setStep} orientation="vertical">
36
+ * <Step title="Company details">…form…</Step>
37
+ * <Step title="Billing" optional />
38
+ * </Stepper>
39
+ * ```
40
+ *
41
+ * An ordered list; the current step has `aria-current="step"` and every step's name includes its
42
+ * position and status ("Step 2 of 4, Map columns, current").
43
+ */
44
+ export const Stepper = React.forwardRef(function Stepper({ value, onValueChange, navigable = "completed", orientation = "horizontal", variant = "numbered", size = "md", steps: stepsProp, loading, responsive = true, labels, className, children, "aria-label": ariaLabel, ...props }, ref) {
45
+ const t = useLabels("stepper", stepperLabels, labels);
46
+ const raw = stepsProp ??
47
+ React.Children.toArray(children)
48
+ .filter((c) => React.isValidElement(c) && c.type === Step)
49
+ .map(({ props: { children: content, ...rest } }) => ({ ...rest, content }));
50
+ const total = raw.length;
51
+ const canNavigate = (i, status) => typeof navigable === "function" ? navigable(i) : navigable === "all" ? true : i < value || status === "complete";
52
+ const steps = raw.map((s, i) => {
53
+ const status = s.status ?? (i < value ? "complete" : i === value ? "current" : "upcoming");
54
+ return { ...s, index: i, status, key: s.id ?? String(i), clickable: Boolean(onValueChange) && !s.disabled && i !== value && canNavigate(i, status) };
55
+ });
56
+ const statusWord = (s) => (s === "upcoming" ? "" : t(s === "complete" ? "complete" : s));
57
+ const name = (s) => ({
58
+ before: `${t("step", { current: s.index + 1, total })}, `,
59
+ after: statusWord(s.status) ? `, ${statusWord(s.status)}` : "",
60
+ });
61
+ const effective = orientation === "vertical" && variant === "bar" ? "numbered" : variant;
62
+ const showCompactOnMobile = responsive && orientation === "horizontal" && effective !== "compact";
63
+ const current = steps[Math.min(Math.max(value, 0), Math.max(total - 1, 0))];
64
+ const compact = current ? (_jsxs("div", { "data-slot": "stepper-compact", className: cn("flex flex-col gap-2", showCompactOnMobile && "sm:hidden"), children: [_jsxs("p", { className: "flex min-w-0 items-baseline gap-1.5 text-[13px]", children: [_jsx("span", { className: "tabular shrink-0 text-fg-muted", children: t("step", { current: current.index + 1, total }) }), _jsx("span", { "aria-hidden": true, className: "text-fg-subtle", children: "\u00B7" }), _jsx("span", { className: "truncate font-medium text-fg", children: current.title }), current.status === "error" ? _jsx("span", { className: "shrink-0 text-danger", children: t("error") }) : null] }), _jsx("span", { "aria-hidden": true, className: "block h-1 overflow-hidden rounded-full bg-track", children: _jsx("span", { className: "block h-full rounded-full bg-accent transition-[width] duration-300 motion-reduce:transition-none", style: { width: `${((current.index + 1) / total) * 100}%` } }) })] })) : null;
65
+ const renderTrigger = (s, inner, extra) => {
66
+ const n = name(s);
67
+ const body = (_jsxs(_Fragment, { children: [_jsx("span", { className: "sr-only", children: n.before }), inner, n.after ? _jsx("span", { className: "sr-only", children: n.after }) : null] }));
68
+ return s.clickable ? (_jsx("button", { type: "button", "data-slot": "step-trigger", onClick: () => onValueChange?.(s.index), className: cn("group/step -m-1 flex min-w-0 items-start gap-3 rounded-ui-sm p-1 text-start outline-none focus-ring", extra), children: body })) : (_jsx("div", { "data-slot": "step-trigger", className: cn("flex min-w-0 items-start gap-3", extra), children: body }));
69
+ };
70
+ const text = (s, opts = {}) => (_jsxs("span", { className: cn("flex min-w-0 flex-col", size === "sm" ? "gap-0 pt-0.5" : "gap-0.5 pt-1", opts.hideTitle && "sr-only"), children: [_jsx("span", { "data-slot": "step-title", className: cn("font-medium leading-tight", size === "sm" ? "text-[13px]" : "text-sm", s.status === "upcoming" || s.status === "skipped" ? "text-fg-muted" : "text-fg", s.status === "error" && "text-danger", s.clickable && "group-hover/step:underline group-hover/step:decoration-line group-hover/step:underline-offset-4"), children: s.title }), s.optional ? _jsx("span", { className: "text-xs text-fg-subtle", children: t("optional") }) : null, s.description ? _jsx("span", { className: cn("text-fg-subtle", size === "sm" ? "text-xs" : "text-[13px]"), children: s.description }) : null] }));
71
+ const listLabel = ariaLabel ?? t("label");
72
+ const passed = (s) => s.index < value && s.status !== "error";
73
+ const connectorTop = size === "sm" ? "mt-3" : "mt-3.5";
74
+ let list = null;
75
+ if (effective === "numbered" && orientation === "horizontal") {
76
+ list = (_jsx("ol", { "aria-label": listLabel, className: cn("flex items-start gap-3", showCompactOnMobile && "max-sm:hidden"), children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": s.status === "current" || i === value ? "step" : undefined, className: "flex min-w-0 flex-auto items-start gap-3 last:flex-none", children: [renderTrigger(s, _jsxs(_Fragment, { children: [_jsx(StepIndicator, { status: s.status, number: i + 1, icon: s.icon, loading: loading && i === value, size: size }), text(s)] }), "min-w-min"), i < total - 1 ? (_jsx("span", { "aria-hidden": true, className: cn("h-px min-w-6 flex-1 transition-colors duration-300", connectorTop, passed(s) ? "bg-accent-ink" : "bg-line") })) : null] }, s.key))) }));
77
+ }
78
+ else if (effective === "numbered" || (effective === "dots" && orientation === "vertical")) {
79
+ const dots = effective === "dots";
80
+ list = (_jsx("ol", { "aria-label": listLabel, className: "flex flex-col", children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "grid grid-cols-[auto_minmax(0,1fr)] gap-x-3", children: [_jsxs("span", { className: "flex flex-col items-center", children: [dots ? (_jsx("span", { "aria-hidden": true, className: cn("mt-1.5 size-2.5 shrink-0 rounded-full", dotClass(s.status)) })) : (_jsx(StepIndicator, { status: s.status, number: i + 1, icon: s.icon, loading: loading && i === value, size: size, onClick: s.clickable ? () => onValueChange?.(s.index) : undefined, className: s.clickable ? "cursor-pointer" : undefined })), i < total - 1 ? _jsx("span", { "aria-hidden": true, className: cn("my-1.5 w-px min-h-5 flex-1 transition-colors duration-300", passed(s) ? "bg-accent-ink" : "bg-line") }) : null] }), _jsxs("div", { className: cn("min-w-0", i < total - 1 && (size === "sm" ? "pb-4" : "pb-6")), children: [renderTrigger(s, text(s), dots ? "-mt-0.5" : undefined), i === value && s.content ? (_jsx("div", { "data-slot": "step-content", className: cn("pt-3", size === "sm" ? "text-[13px]" : "text-sm"), children: s.content })) : null] })] }, s.key))) }));
81
+ }
82
+ else if (effective === "dots") {
83
+ list = (_jsx("ol", { "aria-label": listLabel, className: cn("flex items-center gap-2", showCompactOnMobile && "max-sm:hidden"), children: steps.map((s, i) => (_jsxs("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "flex flex-1 items-center gap-2 last:flex-none", children: [renderTrigger(s, _jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, title: typeof s.title === "string" ? s.title : undefined, className: cn("block h-2.5 rounded-full transition-[width,background-color] duration-300 motion-reduce:transition-none", i === value ? "w-6" : "w-2.5", dotClass(s.status)) }), text(s, { hideTitle: true })] }), "items-center p-1.5 -m-1.5"), i < total - 1 ? _jsx("span", { "aria-hidden": true, className: cn("h-px min-w-3 flex-1", passed(s) ? "bg-accent-ink" : "bg-line") }) : null] }, s.key))) }));
84
+ }
85
+ else if (effective === "bar") {
86
+ list = (_jsx("ol", { "aria-label": listLabel, className: cn("grid gap-1.5", showCompactOnMobile && "max-sm:hidden"), style: { gridTemplateColumns: `repeat(${total}, minmax(0, 1fr))` }, children: steps.map((s, i) => (_jsx("li", { "data-status": s.status, "aria-current": i === value ? "step" : undefined, className: "min-w-0", children: renderTrigger(s, _jsxs("span", { className: "flex w-full min-w-0 flex-col gap-2", children: [_jsx("span", { "aria-hidden": true, className: cn("block h-1 rounded-full transition-colors duration-300", barClass(s.status)) }), text(s)] }), "w-full") }, s.key))) }));
87
+ }
88
+ return (_jsxs("div", { ref: ref, "data-slot": "stepper", "data-orientation": orientation, "data-variant": effective, className: cn("min-w-0", className), ...props, children: [effective === "compact" ? (_jsx("ol", { "aria-label": listLabel, className: "sr-only", children: steps.map((s, i) => (_jsxs("li", { "aria-current": i === value ? "step" : undefined, children: [name(s).before, s.title, name(s).after] }, s.key))) })) : (list), effective === "compact" || showCompactOnMobile ? _jsx("div", { "aria-hidden": effective === "compact" || undefined, children: compact }) : null] }));
89
+ });
90
+ function dotClass(status) {
91
+ return status === "complete" ? "bg-accent-ink" : status === "current" ? "bg-accent shadow-[0_0_0_1.5px_var(--accent-ink)]" : status === "error" ? "bg-danger" : "bg-track";
92
+ }
93
+ function barClass(status) {
94
+ return status === "complete"
95
+ ? "bg-accent-ink"
96
+ : status === "current"
97
+ ? "bg-accent"
98
+ : status === "error"
99
+ ? "bg-danger"
100
+ : status === "skipped"
101
+ ? "bg-[repeating-linear-gradient(90deg,var(--track)_0_4px,transparent_4px_7px)]"
102
+ : "bg-track";
103
+ }
@@ -0,0 +1,34 @@
1
+ import * as React from "react";
2
+ import { Switch as SwitchPrimitive } from "radix-ui";
3
+ export declare const switchVariants: (props?: ({
4
+ size?: "sm" | "md" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ export interface SwitchProps extends Omit<React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, "checked" | "defaultChecked" | "onCheckedChange" | "children"> {
7
+ checked?: boolean;
8
+ defaultChecked?: boolean;
9
+ onCheckedChange?: (checked: boolean) => void;
10
+ /** Text beside the switch; clicking it toggles. */
11
+ label?: React.ReactNode;
12
+ /** Secondary line under the label. */
13
+ description?: React.ReactNode;
14
+ /** `"end"` (default): switch, then label. `"start"`: label first, switch at the far end (settings rows). */
15
+ labelPosition?: "start" | "end";
16
+ size?: "sm" | "md";
17
+ /** A save is in flight: spinner in the thumb, `aria-busy`, changes locked. */
18
+ loading?: boolean;
19
+ invalid?: boolean;
20
+ /** Focusable, but can't be flipped (`aria-readonly`). */
21
+ readOnly?: boolean;
22
+ /** Classes for the track when `label` is used (`className` goes on the row). */
23
+ controlClassName?: string;
24
+ }
25
+ /**
26
+ * Instant on/off setting: "Maintenance mode", "Accept online bookings", active/inactive in a table.
27
+ * Radix Switch (`role="switch"`), Field-aware, with an optimistic-save `loading` state.
28
+ *
29
+ * ```tsx
30
+ * <Switch label="Email digests" description="A summary every Monday at 9:00." defaultChecked />
31
+ * <Switch size="sm" checked={active} onCheckedChange={save} loading={saving} aria-label="Active" />
32
+ * ```
33
+ */
34
+ export declare const Switch: React.ForwardRefExoticComponent<SwitchProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,70 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Switch as SwitchPrimitive } from "radix-ui";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "../lib/cn.js";
7
+ import { mergeIds } from "../lib/compose-refs.js";
8
+ import { useFieldControl } from "../lib/field-context.js";
9
+ import { useControllableState } from "../lib/use-controllable-state.js";
10
+ import { Spinner } from "./spinner.js";
11
+ export const switchVariants = cva([
12
+ "group/switch relative inline-flex shrink-0 cursor-pointer items-center rounded-full border border-transparent p-[2px] outline-none",
13
+ "bg-track transition-[background-color,box-shadow] duration-200",
14
+ "data-[state=unchecked]:hover:bg-[color-mix(in_srgb,var(--track),var(--fg)_9%)]",
15
+ "data-[state=checked]:bg-accent data-[state=checked]:shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--fg)_10%,transparent)]",
16
+ "focus-visible:shadow-[0_0_0_2px_var(--scene),0_0_0_4px_var(--ring)]",
17
+ "aria-invalid:shadow-[inset_0_0_0_1.5px_var(--danger)]",
18
+ "disabled:cursor-not-allowed disabled:opacity-45 aria-busy:cursor-progress",
19
+ ], {
20
+ variants: {
21
+ size: {
22
+ /** 28 × 16 — table rows, dense lists. */
23
+ sm: "h-4 w-7 [--switch-thumb-size:12px] [--switch-travel:12px]",
24
+ /** 36 × 20. */
25
+ md: "h-5 w-9 [--switch-thumb-size:16px] [--switch-travel:16px]",
26
+ },
27
+ },
28
+ defaultVariants: { size: "md" },
29
+ });
30
+ /**
31
+ * Instant on/off setting: "Maintenance mode", "Accept online bookings", active/inactive in a table.
32
+ * Radix Switch (`role="switch"`), Field-aware, with an optimistic-save `loading` state.
33
+ *
34
+ * ```tsx
35
+ * <Switch label="Email digests" description="A summary every Monday at 9:00." defaultChecked />
36
+ * <Switch size="sm" checked={active} onCheckedChange={save} loading={saving} aria-label="Active" />
37
+ * ```
38
+ */
39
+ export const Switch = React.forwardRef(function Switch(rawProps, ref) {
40
+ const { checked: checkedProp, defaultChecked, onCheckedChange, label, description, labelPosition = "end", size = "md", loading, invalid, className, controlClassName, style, ...rest } = rawProps;
41
+ const control = useFieldControl({ ...rest, "aria-invalid": invalid ? true : rest["aria-invalid"] });
42
+ const { readOnly, required, ...controlProps } = control;
43
+ const [checked, setChecked] = useControllableState({
44
+ value: checkedProp,
45
+ defaultValue: defaultChecked ?? false,
46
+ onChange: onCheckedChange,
47
+ name: "Switch",
48
+ });
49
+ const autoId = React.useId();
50
+ const id = controlProps.id ?? (label ? `sw${autoId.replace(/:/g, "")}` : undefined);
51
+ const descId = description ? `${id ?? autoId}-desc` : undefined;
52
+ const labelId = label ? `${id ?? autoId}-label` : undefined;
53
+ const labelledBy = controlProps["aria-labelledby"] ?? (label && !controlProps["aria-label"] ? labelId : undefined);
54
+ const locked = readOnly || loading;
55
+ const track = (_jsx(SwitchPrimitive.Root, { ref: ref, "data-slot": "switch", "data-size": size, ...controlProps, id: id, required: required, "aria-required": required || undefined, "aria-readonly": readOnly || undefined, "aria-busy": loading || undefined, "aria-labelledby": labelledBy, "aria-describedby": mergeIds(controlProps["aria-describedby"], descId), checked: checked, onCheckedChange: (next) => {
56
+ if (locked)
57
+ return;
58
+ setChecked(next);
59
+ }, onKeyDown: (e) => {
60
+ if (locked && (e.key === " " || e.key === "Enter"))
61
+ e.preventDefault();
62
+ controlProps.onKeyDown?.(e);
63
+ }, className: cn(switchVariants({ size }), label ? controlClassName : cn(controlClassName, className)), style: label ? undefined : style, children: _jsx(SwitchPrimitive.Thumb, { "data-slot": "switch-thumb", className: cn("pointer-events-none flex size-(--switch-thumb-size) items-center justify-center rounded-full bg-(--switch-thumb) text-fg-muted", "shadow-[0_1px_2px_rgb(0_0_0/0.18),0_0_0_0.5px_rgb(0_0_0/0.06)]", "transition-[transform,width,background-color] duration-200 ease-[cubic-bezier(0.3,1.3,0.5,1)]", "data-[state=checked]:translate-x-[calc(var(--switch-travel)*var(--dir))] data-[state=checked]:bg-accent-fg data-[state=checked]:text-accent",
64
+ // a little stretch while pressed
65
+ "group-active/switch:w-[calc(var(--switch-thumb-size)+3px)] group-active/switch:data-[state=checked]:translate-x-[calc((var(--switch-travel)-3px)*var(--dir))]"), children: loading ? _jsx(Spinner, { size: size === "sm" ? 9 : 11 }) : null }) }));
66
+ if (!label)
67
+ return track;
68
+ const text = (_jsxs("label", { htmlFor: id, className: cn("grid min-w-0 select-none gap-0.5", controlProps.disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer"), children: [_jsx("span", { id: labelId, className: cn("text-fg", size === "sm" ? "text-[13px] leading-4" : "text-sm leading-5"), children: label }), description ? (_jsx("span", { id: descId, className: cn("text-pretty leading-[1.45] text-fg-subtle", size === "sm" ? "text-[11.5px]" : "text-xs"), children: description })) : null] }));
69
+ return (_jsxs("div", { "data-slot": "switch-row", "data-label-position": labelPosition, className: cn("flex items-start gap-3", labelPosition === "start" && "justify-between gap-6", className), style: style, children: [labelPosition === "start" ? text : null, _jsx("span", { className: cn("flex shrink-0 items-center", size === "sm" ? "h-4" : "h-5"), children: track }), labelPosition === "end" ? text : null] }));
70
+ });
@@ -0,0 +1,101 @@
1
+ import * as React from "react";
2
+ type Align = "start" | "center" | "end";
3
+ export interface TableContainerProps extends React.HTMLAttributes<HTMLDivElement> {
4
+ /** Accessible name of the scroll region (required when the table can scroll). */
5
+ "aria-label"?: string;
6
+ /** Max height; the header stays visible with `<Table stickyHeader>`. E.g. `"24rem"`. */
7
+ maxHeight?: string;
8
+ }
9
+ /**
10
+ * Scroll wrapper for a Table: horizontal (and optional vertical) scrolling with soft edge fades
11
+ * that show there is more content. It is a focusable, named region so keyboard users can scroll.
12
+ */
13
+ export declare const TableContainer: React.ForwardRefExoticComponent<TableContainerProps & React.RefAttributes<HTMLDivElement>>;
14
+ export interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {
15
+ /** Row height + cell padding (`--row-h`, `--cell-px`). `"inherit"` follows the page `data-density`. Default `"inherit"`. */
16
+ density?: "inherit" | "compact" | "comfortable" | "spacious";
17
+ /** Zebra rows. */
18
+ striped?: boolean;
19
+ /** Row hover tint. Default `true`. */
20
+ hover?: boolean;
21
+ /** `"rows"` (default) hairlines between rows · `"grid"` every cell · `"none"`. */
22
+ bordered?: "rows" | "grid" | "none";
23
+ /** Keep the header visible while the TableContainer scrolls. Opaque (never blurred). */
24
+ stickyHeader?: boolean;
25
+ /** Pin the first column while scrolling sideways. */
26
+ stickyFirstColumn?: boolean;
27
+ /** `"fixed"` uses the column widths you set (`<TableHead style={{ width }}>`). Default `"auto"`. */
28
+ layout?: "auto" | "fixed";
29
+ }
30
+ /**
31
+ * Styled semantic table for small and static data: line items, settings lists, chart data.
32
+ * Server-component compatible. Give it a `<TableCaption>` or `aria-label`.
33
+ *
34
+ * ```tsx
35
+ * <TableContainer aria-label="Invoice lines">
36
+ * <Table>
37
+ * <TableCaption>Invoice INV-2041</TableCaption>
38
+ * <TableHeader><TableRow><TableHead>Item</TableHead><TableHead numeric>Amount</TableHead></TableRow></TableHeader>
39
+ * <TableBody><TableRow><TableCell>Design retainer</TableCell><TableCell numeric>$4,500.00</TableCell></TableRow></TableBody>
40
+ * </Table>
41
+ * </TableContainer>
42
+ * ```
43
+ */
44
+ export declare const Table: React.ForwardRefExoticComponent<TableProps & React.RefAttributes<HTMLTableElement>>;
45
+ export interface TableCaptionProps extends React.HTMLAttributes<HTMLTableCaptionElement> {
46
+ /** Keep the caption for screen readers only. */
47
+ visuallyHidden?: boolean;
48
+ /** Default `"bottom"`. */
49
+ side?: "top" | "bottom";
50
+ }
51
+ /** Names the table. Visible under the table by default; `visuallyHidden` keeps it for screen readers. */
52
+ export declare const TableCaption: React.ForwardRefExoticComponent<TableCaptionProps & React.RefAttributes<HTMLTableCaptionElement>>;
53
+ export declare const TableHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
54
+ export declare const TableBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
55
+ export declare const TableFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLTableSectionElement> & React.RefAttributes<HTMLTableSectionElement>>;
56
+ export interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {
57
+ /** Selected row (`data-state="selected"`, `aria-selected`). */
58
+ selected?: boolean;
59
+ /** Dimmed, non-interactive row. */
60
+ disabled?: boolean;
61
+ /** Accent bar at the start edge — e.g. the row you just created. */
62
+ highlighted?: boolean;
63
+ }
64
+ export declare const TableRow: React.ForwardRefExoticComponent<TableRowProps & React.RefAttributes<HTMLTableRowElement>>;
65
+ export interface TableHeadProps extends Omit<React.ThHTMLAttributes<HTMLTableCellElement>, "align"> {
66
+ align?: Align;
67
+ /** Numbers: end-aligned, tabular, mono. */
68
+ numeric?: boolean;
69
+ /** Current sort of this column. Set `false` for a sortable column that is not sorted. */
70
+ sort?: "asc" | "desc" | false;
71
+ /** Makes the header a sort button (`aria-sort` on the `th`). */
72
+ onSort?: () => void;
73
+ }
74
+ /**
75
+ * Column header (`<th scope="col">`). With `onSort` the label becomes a button and the cell
76
+ * gets `aria-sort`.
77
+ */
78
+ export declare const TableHead: React.ForwardRefExoticComponent<TableHeadProps & React.RefAttributes<HTMLTableCellElement>>;
79
+ export interface TableCellProps extends Omit<React.TdHTMLAttributes<HTMLTableCellElement>, "align"> {
80
+ align?: Align;
81
+ /** Numbers and money: end-aligned, tabular, mono — also in RTL. */
82
+ numeric?: boolean;
83
+ /** `true` cuts to one line with an ellipsis; a number clamps to that many lines. */
84
+ truncate?: boolean | number;
85
+ /** Render as a row header (`<th scope="row">`) — e.g. the name column. */
86
+ rowHeader?: boolean;
87
+ }
88
+ export declare const TableCell: React.ForwardRefExoticComponent<TableCellProps & React.RefAttributes<HTMLTableCellElement>>;
89
+ export interface TableEmptyProps extends Omit<React.HTMLAttributes<HTMLTableRowElement>, "title"> {
90
+ /** Number of columns to span. */
91
+ colSpan: number;
92
+ /** Replace the icon (`false` for none). */
93
+ icon?: React.ReactNode | false;
94
+ /** Main line. Default "No results". */
95
+ title?: React.ReactNode;
96
+ /** Secondary line. Children render as actions (e.g. "Clear filters"). */
97
+ description?: React.ReactNode;
98
+ }
99
+ /** A single full-width row for an empty table body. */
100
+ export declare const TableEmpty: React.ForwardRefExoticComponent<TableEmptyProps & React.RefAttributes<HTMLTableRowElement>>;
101
+ export {};