@vamos-ui/react 0.0.0-stage → 0.2.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 (665) 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 +100 -0
  58. package/dist/blocks/site/_kit-1.js +135 -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 +112 -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 +51 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +49 -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 +47 -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 +67 -0
  97. package/dist/blocks/site/logo-strip.d.ts +42 -0
  98. package/dist/blocks/site/logo-strip.js +26 -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 +55 -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 +82 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +41 -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 +97 -0
  160. package/dist/blocks/site/site-shell.js +227 -0
  161. package/dist/blocks/site/stats-band.d.ts +40 -0
  162. package/dist/blocks/site/stats-band.js +41 -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 +65 -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 +11 -0
  180. package/dist/business/index.js +20 -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/charts/area-chart.d.ts +35 -0
  194. package/dist/charts/area-chart.js +33 -0
  195. package/dist/charts/bar-chart.d.ts +27 -0
  196. package/dist/charts/bar-chart.js +42 -0
  197. package/dist/charts/bar-list.d.ts +47 -0
  198. package/dist/charts/bar-list.js +60 -0
  199. package/dist/charts/chart-shell.d.ts +173 -0
  200. package/dist/charts/chart-shell.js +205 -0
  201. package/dist/charts/chart.d.ts +73 -0
  202. package/dist/charts/chart.js +106 -0
  203. package/dist/charts/combo-chart.d.ts +29 -0
  204. package/dist/charts/combo-chart.js +47 -0
  205. package/dist/charts/donut-chart.d.ts +33 -0
  206. package/dist/charts/donut-chart.js +113 -0
  207. package/dist/charts/funnel.d.ts +51 -0
  208. package/dist/charts/funnel.js +69 -0
  209. package/dist/charts/gauge.d.ts +62 -0
  210. package/dist/charts/gauge.js +104 -0
  211. package/dist/charts/heatmap.d.ts +81 -0
  212. package/dist/charts/heatmap.js +338 -0
  213. package/dist/charts/index.d.ts +12 -0
  214. package/dist/charts/index.js +14 -0
  215. package/dist/charts/line-chart.d.ts +21 -0
  216. package/dist/charts/line-chart.js +36 -0
  217. package/dist/charts/test-utils.d.ts +2 -0
  218. package/dist/charts/test-utils.js +38 -0
  219. package/dist/charts/utils.d.ts +130 -0
  220. package/dist/charts/utils.js +262 -0
  221. package/dist/components/accordion.d.ts +47 -0
  222. package/dist/components/accordion.js +70 -0
  223. package/dist/components/activity-timeline.d.ts +149 -0
  224. package/dist/components/activity-timeline.js +122 -0
  225. package/dist/components/address-field.d.ts +116 -0
  226. package/dist/components/address-field.js +219 -0
  227. package/dist/components/alert-dialog.d.ts +99 -0
  228. package/dist/components/alert-dialog.js +192 -0
  229. package/dist/components/alert.d.ts +42 -0
  230. package/dist/components/alert.js +82 -0
  231. package/dist/components/app-shell.d.ts +159 -0
  232. package/dist/components/app-shell.js +289 -0
  233. package/dist/components/attachment-list.d.ts +96 -0
  234. package/dist/components/attachment-list.js +196 -0
  235. package/dist/components/audit-log.d.ts +150 -0
  236. package/dist/components/audit-log.js +205 -0
  237. package/dist/components/avatar.d.ts +87 -0
  238. package/dist/components/avatar.js +126 -0
  239. package/dist/components/badge.d.ts +41 -0
  240. package/dist/components/badge.js +68 -0
  241. package/dist/components/breadcrumb.d.ts +78 -0
  242. package/dist/components/breadcrumb.js +106 -0
  243. package/dist/components/button-group.d.ts +52 -0
  244. package/dist/components/button-group.js +77 -0
  245. package/dist/components/button.d.ts +58 -0
  246. package/dist/components/button.js +107 -0
  247. package/dist/components/calendar.d.ts +240 -0
  248. package/dist/components/calendar.js +483 -0
  249. package/dist/components/card.d.ts +66 -0
  250. package/dist/components/card.js +76 -0
  251. package/dist/components/carousel.d.ts +170 -0
  252. package/dist/components/carousel.js +348 -0
  253. package/dist/components/checkbox.d.ts +78 -0
  254. package/dist/components/checkbox.js +138 -0
  255. package/dist/components/color-picker.d.ts +112 -0
  256. package/dist/components/color-picker.js +235 -0
  257. package/dist/components/combobox.d.ts +136 -0
  258. package/dist/components/combobox.js +294 -0
  259. package/dist/components/command.d.ts +275 -0
  260. package/dist/components/command.js +493 -0
  261. package/dist/components/comment-thread.d.ts +252 -0
  262. package/dist/components/comment-thread.js +449 -0
  263. package/dist/components/context-menu.d.ts +77 -0
  264. package/dist/components/context-menu.js +82 -0
  265. package/dist/components/currency-input.d.ts +43 -0
  266. package/dist/components/currency-input.js +85 -0
  267. package/dist/components/date-picker.d.ts +141 -0
  268. package/dist/components/date-picker.js +241 -0
  269. package/dist/components/date-range-picker.d.ts +91 -0
  270. package/dist/components/date-range-picker.js +251 -0
  271. package/dist/components/description-list.d.ts +92 -0
  272. package/dist/components/description-list.js +42 -0
  273. package/dist/components/dialog.d.ts +139 -0
  274. package/dist/components/dialog.js +185 -0
  275. package/dist/components/dropdown-menu.d.ts +100 -0
  276. package/dist/components/dropdown-menu.js +102 -0
  277. package/dist/components/editor-layout.d.ts +166 -0
  278. package/dist/components/editor-layout.js +237 -0
  279. package/dist/components/empty-state.d.ts +49 -0
  280. package/dist/components/empty-state.js +68 -0
  281. package/dist/components/entity-card.d.ts +83 -0
  282. package/dist/components/entity-card.js +92 -0
  283. package/dist/components/file-upload.d.ts +256 -0
  284. package/dist/components/file-upload.js +490 -0
  285. package/dist/components/formatted-input.d.ts +177 -0
  286. package/dist/components/formatted-input.js +399 -0
  287. package/dist/components/hierarchy-chart.d.ts +190 -0
  288. package/dist/components/hierarchy-chart.js +890 -0
  289. package/dist/components/hover-card.d.ts +21 -0
  290. package/dist/components/hover-card.js +32 -0
  291. package/dist/components/iban-input.d.ts +38 -0
  292. package/dist/components/iban-input.js +112 -0
  293. package/dist/components/id-input.d.ts +65 -0
  294. package/dist/components/id-input.js +130 -0
  295. package/dist/components/image.d.ts +130 -0
  296. package/dist/components/image.js +168 -0
  297. package/dist/components/input-otp.d.ts +62 -0
  298. package/dist/components/input-otp.js +73 -0
  299. package/dist/components/input.d.ts +141 -0
  300. package/dist/components/input.js +187 -0
  301. package/dist/components/item.d.ts +96 -0
  302. package/dist/components/item.js +113 -0
  303. package/dist/components/kbd.d.ts +64 -0
  304. package/dist/components/kbd.js +119 -0
  305. package/dist/components/list-layout.d.ts +144 -0
  306. package/dist/components/list-layout.js +210 -0
  307. package/dist/components/native-select.d.ts +33 -0
  308. package/dist/components/native-select.js +48 -0
  309. package/dist/components/navigation-menu.d.ts +127 -0
  310. package/dist/components/navigation-menu.js +129 -0
  311. package/dist/components/notification-center.d.ts +164 -0
  312. package/dist/components/notification-center.js +399 -0
  313. package/dist/components/page-header.d.ts +60 -0
  314. package/dist/components/page-header.js +60 -0
  315. package/dist/components/pagination.d.ts +121 -0
  316. package/dist/components/pagination.js +174 -0
  317. package/dist/components/phone-input.d.ts +49 -0
  318. package/dist/components/phone-input.js +266 -0
  319. package/dist/components/popover.d.ts +38 -0
  320. package/dist/components/popover.js +69 -0
  321. package/dist/components/progress.d.ts +79 -0
  322. package/dist/components/progress.js +97 -0
  323. package/dist/components/radio-group.d.ts +43 -0
  324. package/dist/components/radio-group.js +81 -0
  325. package/dist/components/record-detail-layout.d.ts +167 -0
  326. package/dist/components/record-detail-layout.js +233 -0
  327. package/dist/components/record-picker.d.ts +199 -0
  328. package/dist/components/record-picker.js +650 -0
  329. package/dist/components/resizable.d.ts +50 -0
  330. package/dist/components/resizable.js +88 -0
  331. package/dist/components/scroll-area.d.ts +40 -0
  332. package/dist/components/scroll-area.js +56 -0
  333. package/dist/components/select.d.ts +126 -0
  334. package/dist/components/select.js +137 -0
  335. package/dist/components/separator.d.ts +31 -0
  336. package/dist/components/separator.js +41 -0
  337. package/dist/components/settings-layout.d.ts +134 -0
  338. package/dist/components/settings-layout.js +180 -0
  339. package/dist/components/sheet.d.ts +103 -0
  340. package/dist/components/sheet.js +165 -0
  341. package/dist/components/sidebar.d.ts +171 -0
  342. package/dist/components/sidebar.js +421 -0
  343. package/dist/components/signature-pad.d.ts +85 -0
  344. package/dist/components/signature-pad.js +283 -0
  345. package/dist/components/skeleton.d.ts +64 -0
  346. package/dist/components/skeleton.js +53 -0
  347. package/dist/components/slider.d.ts +57 -0
  348. package/dist/components/slider.js +133 -0
  349. package/dist/components/slug-input.d.ts +69 -0
  350. package/dist/components/slug-input.js +201 -0
  351. package/dist/components/sparkline.d.ts +54 -0
  352. package/dist/components/sparkline.js +122 -0
  353. package/dist/components/spinner.d.ts +34 -0
  354. package/dist/components/spinner.js +34 -0
  355. package/dist/components/stat.d.ts +135 -0
  356. package/dist/components/stat.js +130 -0
  357. package/dist/components/status-picker.d.ts +107 -0
  358. package/dist/components/status-picker.js +175 -0
  359. package/dist/components/stepper.d.ts +86 -0
  360. package/dist/components/stepper.js +103 -0
  361. package/dist/components/switch.d.ts +34 -0
  362. package/dist/components/switch.js +70 -0
  363. package/dist/components/table.d.ts +101 -0
  364. package/dist/components/table.js +72 -0
  365. package/dist/components/tabs.d.ts +103 -0
  366. package/dist/components/tabs.js +173 -0
  367. package/dist/components/tag-input.d.ts +77 -0
  368. package/dist/components/tag-input.js +305 -0
  369. package/dist/components/task-list.d.ts +89 -0
  370. package/dist/components/task-list.js +238 -0
  371. package/dist/components/time-picker.d.ts +119 -0
  372. package/dist/components/time-picker.js +399 -0
  373. package/dist/components/toast.d.ts +87 -0
  374. package/dist/components/toast.js +142 -0
  375. package/dist/components/toggle.d.ts +77 -0
  376. package/dist/components/toggle.js +109 -0
  377. package/dist/components/tooltip.d.ts +69 -0
  378. package/dist/components/tooltip.js +105 -0
  379. package/dist/components/top-bar.d.ts +87 -0
  380. package/dist/components/top-bar.js +99 -0
  381. package/dist/components/tree-select.d.ts +89 -0
  382. package/dist/components/tree-select.js +243 -0
  383. package/dist/components/tree-view.d.ts +109 -0
  384. package/dist/components/tree-view.js +170 -0
  385. package/dist/components/typography.d.ts +107 -0
  386. package/dist/components/typography.js +128 -0
  387. package/dist/components/user-picker.d.ts +89 -0
  388. package/dist/components/user-picker.js +162 -0
  389. package/dist/components/version-history.d.ts +191 -0
  390. package/dist/components/version-history.js +431 -0
  391. package/dist/data-table/csv.d.ts +27 -0
  392. package/dist/data-table/csv.js +68 -0
  393. package/dist/data-table/data-table.d.ts +423 -0
  394. package/dist/data-table/data-table.js +1259 -0
  395. package/dist/data-table/filter-bar.d.ts +146 -0
  396. package/dist/data-table/filter-bar.js +569 -0
  397. package/dist/data-table/filter-fns.d.ts +65 -0
  398. package/dist/data-table/filter-fns.js +382 -0
  399. package/dist/data-table/index.d.ts +8 -0
  400. package/dist/data-table/index.js +9 -0
  401. package/dist/data-table/saved-views.d.ts +100 -0
  402. package/dist/data-table/saved-views.js +251 -0
  403. package/dist/data-table/types.d.ts +168 -0
  404. package/dist/data-table/types.js +87 -0
  405. package/dist/data-table/url-state.d.ts +94 -0
  406. package/dist/data-table/url-state.js +303 -0
  407. package/dist/data-table/view-state.d.ts +16 -0
  408. package/dist/data-table/view-state.js +81 -0
  409. package/dist/editor/_test-setup.d.ts +1 -0
  410. package/dist/editor/_test-setup.js +33 -0
  411. package/dist/editor/block-editor.d.ts +137 -0
  412. package/dist/editor/block-editor.js +280 -0
  413. package/dist/editor/commands.d.ts +31 -0
  414. package/dist/editor/commands.js +150 -0
  415. package/dist/editor/context.d.ts +108 -0
  416. package/dist/editor/context.js +30 -0
  417. package/dist/editor/convert.d.ts +66 -0
  418. package/dist/editor/convert.js +567 -0
  419. package/dist/editor/drag-handle.d.ts +10 -0
  420. package/dist/editor/drag-handle.js +69 -0
  421. package/dist/editor/extensions.d.ts +34 -0
  422. package/dist/editor/extensions.js +239 -0
  423. package/dist/editor/index.d.ts +14 -0
  424. package/dist/editor/index.js +17 -0
  425. package/dist/editor/inserter.d.ts +12 -0
  426. package/dist/editor/inserter.js +88 -0
  427. package/dist/editor/inspector.d.ts +17 -0
  428. package/dist/editor/inspector.js +65 -0
  429. package/dist/editor/items.d.ts +62 -0
  430. package/dist/editor/items.js +195 -0
  431. package/dist/editor/labels.d.ts +119 -0
  432. package/dist/editor/labels.js +130 -0
  433. package/dist/editor/markdown.d.ts +14 -0
  434. package/dist/editor/markdown.js +209 -0
  435. package/dist/editor/menus.d.ts +20 -0
  436. package/dist/editor/menus.js +236 -0
  437. package/dist/editor/nodes.d.ts +14 -0
  438. package/dist/editor/nodes.js +201 -0
  439. package/dist/editor/outline.d.ts +11 -0
  440. package/dist/editor/outline.js +52 -0
  441. package/dist/editor/schema-form.d.ts +64 -0
  442. package/dist/editor/schema-form.js +290 -0
  443. package/dist/editor/slash-menu.d.ts +15 -0
  444. package/dist/editor/slash-menu.js +119 -0
  445. package/dist/fonts/catalog.d.ts +53 -0
  446. package/dist/fonts/catalog.js +121 -0
  447. package/dist/fonts/font-picker.d.ts +70 -0
  448. package/dist/fonts/font-picker.js +225 -0
  449. package/dist/fonts/index.d.ts +6 -0
  450. package/dist/fonts/index.js +7 -0
  451. package/dist/fonts/loader.d.ts +66 -0
  452. package/dist/fonts/loader.js +161 -0
  453. package/dist/fonts/pairing-picker.d.ts +31 -0
  454. package/dist/fonts/pairing-picker.js +81 -0
  455. package/dist/fonts/pairings.d.ts +84 -0
  456. package/dist/fonts/pairings.js +149 -0
  457. package/dist/fonts/provider.d.ts +34 -0
  458. package/dist/fonts/provider.js +51 -0
  459. package/dist/form/index.d.ts +1 -0
  460. package/dist/form/index.js +1 -0
  461. package/dist/format/core.d.ts +149 -0
  462. package/dist/format/core.js +357 -0
  463. package/dist/format/index.d.ts +4 -0
  464. package/dist/format/index.js +5 -0
  465. package/dist/format/use-format.d.ts +1 -0
  466. package/dist/format/use-format.js +3 -0
  467. package/dist/index.d.ts +86 -0
  468. package/dist/index.js +87 -0
  469. package/dist/lib/cn.d.ts +3 -0
  470. package/dist/lib/cn.js +16 -0
  471. package/dist/lib/color.d.ts +64 -0
  472. package/dist/lib/color.js +177 -0
  473. package/dist/lib/compose-refs.d.ts +24 -0
  474. package/dist/lib/compose-refs.js +45 -0
  475. package/dist/lib/data-islands.d.ts +194 -0
  476. package/dist/lib/data-islands.js +368 -0
  477. package/dist/lib/date.d.ts +129 -0
  478. package/dist/lib/date.js +386 -0
  479. package/dist/lib/field-context.d.ts +64 -0
  480. package/dist/lib/field-context.js +62 -0
  481. package/dist/lib/floating-arrow.d.ts +18 -0
  482. package/dist/lib/floating-arrow.js +15 -0
  483. package/dist/lib/islands.d.ts +38 -0
  484. package/dist/lib/islands.js +40 -0
  485. package/dist/lib/labels.d.ts +51 -0
  486. package/dist/lib/labels.js +56 -0
  487. package/dist/lib/layer.d.ts +36 -0
  488. package/dist/lib/layer.js +42 -0
  489. package/dist/lib/locale.d.ts +85 -0
  490. package/dist/lib/locale.js +105 -0
  491. package/dist/lib/menu.d.ts +58 -0
  492. package/dist/lib/menu.js +99 -0
  493. package/dist/lib/message-format.d.ts +20 -0
  494. package/dist/lib/message-format.js +116 -0
  495. package/dist/lib/nav.d.ts +132 -0
  496. package/dist/lib/nav.js +178 -0
  497. package/dist/lib/provider.d.ts +100 -0
  498. package/dist/lib/provider.js +105 -0
  499. package/dist/lib/public.d.ts +22 -0
  500. package/dist/lib/public.js +33 -0
  501. package/dist/lib/sr-name.d.ts +18 -0
  502. package/dist/lib/sr-name.js +17 -0
  503. package/dist/lib/text.d.ts +100 -0
  504. package/dist/lib/text.js +233 -0
  505. package/dist/lib/theme-scope.d.ts +58 -0
  506. package/dist/lib/theme-scope.js +59 -0
  507. package/dist/lib/use-async-list.d.ts +60 -0
  508. package/dist/lib/use-async-list.js +119 -0
  509. package/dist/lib/use-container-width.d.ts +19 -0
  510. package/dist/lib/use-container-width.js +39 -0
  511. package/dist/lib/use-controllable-state.d.ts +33 -0
  512. package/dist/lib/use-controllable-state.js +56 -0
  513. package/dist/lib/use-edge-fade.d.ts +13 -0
  514. package/dist/lib/use-edge-fade.js +43 -0
  515. package/dist/lib/use-formatted-input.d.ts +69 -0
  516. package/dist/lib/use-formatted-input.js +152 -0
  517. package/dist/lib/use-hotkeys.d.ts +80 -0
  518. package/dist/lib/use-hotkeys.js +221 -0
  519. package/dist/lib/use-hover-intent.d.ts +44 -0
  520. package/dist/lib/use-hover-intent.js +119 -0
  521. package/dist/lib/use-media-query.d.ts +21 -0
  522. package/dist/lib/use-media-query.js +28 -0
  523. package/dist/lib/use-reduced-motion.d.ts +8 -0
  524. package/dist/lib/use-reduced-motion.js +13 -0
  525. package/dist/lib/use-tree.d.ts +153 -0
  526. package/dist/lib/use-tree.js +534 -0
  527. package/dist/lib/value-format.d.ts +25 -0
  528. package/dist/lib/value-format.js +56 -0
  529. package/dist/lib/variants.d.ts +131 -0
  530. package/dist/lib/variants.js +109 -0
  531. package/dist/locale-data/core/date.d.ts +24 -0
  532. package/dist/locale-data/core/date.js +68 -0
  533. package/dist/locale-data/core/decimal.d.ts +19 -0
  534. package/dist/locale-data/core/decimal.js +79 -0
  535. package/dist/locale-data/core/holidays.d.ts +30 -0
  536. package/dist/locale-data/core/holidays.js +79 -0
  537. package/dist/locale-data/core/iban.d.ts +29 -0
  538. package/dist/locale-data/core/iban.js +74 -0
  539. package/dist/locale-data/core/index.d.ts +7 -0
  540. package/dist/locale-data/core/index.js +6 -0
  541. package/dist/locale-data/core/types.d.ts +173 -0
  542. package/dist/locale-data/core/types.js +6 -0
  543. package/dist/locale-data/core/week-info.d.ts +23 -0
  544. package/dist/locale-data/core/week-info.js +85 -0
  545. package/dist/locale-data/core/working-days.d.ts +27 -0
  546. package/dist/locale-data/core/working-days.js +133 -0
  547. package/dist/locale-data/index.d.ts +2 -0
  548. package/dist/locale-data/index.js +4 -0
  549. package/dist/locale-data/tr/address-tr.json +1 -0
  550. package/dist/locale-data/tr/address.d.ts +23 -0
  551. package/dist/locale-data/tr/address.js +52 -0
  552. package/dist/locale-data/tr/holidays.d.ts +31 -0
  553. package/dist/locale-data/tr/holidays.js +81 -0
  554. package/dist/locale-data/tr/iban.d.ts +21 -0
  555. package/dist/locale-data/tr/iban.js +45 -0
  556. package/dist/locale-data/tr/id.d.ts +36 -0
  557. package/dist/locale-data/tr/id.js +120 -0
  558. package/dist/locale-data/tr/index.d.ts +12 -0
  559. package/dist/locale-data/tr/index.js +33 -0
  560. package/dist/locale-data/tr/kdv.d.ts +91 -0
  561. package/dist/locale-data/tr/kdv.js +222 -0
  562. package/dist/locales/en.d.ts +2102 -0
  563. package/dist/locales/en.js +2088 -0
  564. package/dist/locales/tr.d.ts +2086 -0
  565. package/dist/locales/tr.js +2087 -0
  566. package/dist/media/focal-point.d.ts +42 -0
  567. package/dist/media/focal-point.js +96 -0
  568. package/dist/media/gallery-layout.d.ts +19 -0
  569. package/dist/media/gallery-layout.js +61 -0
  570. package/dist/media/gallery.d.ts +64 -0
  571. package/dist/media/gallery.js +138 -0
  572. package/dist/media/image-cropper.d.ts +86 -0
  573. package/dist/media/image-cropper.js +170 -0
  574. package/dist/media/image-field.d.ts +115 -0
  575. package/dist/media/image-field.js +212 -0
  576. package/dist/media/index.d.ts +19 -0
  577. package/dist/media/index.js +23 -0
  578. package/dist/media/lightbox.d.ts +82 -0
  579. package/dist/media/lightbox.js +171 -0
  580. package/dist/media/link-preview.d.ts +97 -0
  581. package/dist/media/link-preview.js +177 -0
  582. package/dist/media/media-library.d.ts +244 -0
  583. package/dist/media/media-library.js +776 -0
  584. package/dist/media/media-picker.d.ts +96 -0
  585. package/dist/media/media-picker.js +209 -0
  586. package/dist/media/media-provider.d.ts +23 -0
  587. package/dist/media/media-provider.js +44 -0
  588. package/dist/media/media-utils.d.ts +39 -0
  589. package/dist/media/media-utils.js +145 -0
  590. package/dist/media/memory-adapter.d.ts +22 -0
  591. package/dist/media/memory-adapter.js +162 -0
  592. package/dist/media/rest-adapter.d.ts +90 -0
  593. package/dist/media/rest-adapter.js +208 -0
  594. package/dist/media/serp.d.ts +62 -0
  595. package/dist/media/serp.js +108 -0
  596. package/dist/media/test-fixtures.d.ts +3 -0
  597. package/dist/media/test-fixtures.js +37 -0
  598. package/dist/media/types.d.ts +183 -0
  599. package/dist/media/types.js +3 -0
  600. package/dist/media/use-pan-zoom.d.ts +51 -0
  601. package/dist/media/use-pan-zoom.js +156 -0
  602. package/dist/media/use-upload-queue.d.ts +64 -0
  603. package/dist/media/use-upload-queue.js +115 -0
  604. package/dist/media/video-player.d.ts +135 -0
  605. package/dist/media/video-player.js +319 -0
  606. package/dist/next/index.d.ts +42 -0
  607. package/dist/next/index.js +36 -0
  608. package/dist/render/block-renderer.d.ts +56 -0
  609. package/dist/render/block-renderer.js +137 -0
  610. package/dist/render/index.d.ts +6 -0
  611. package/dist/render/index.js +7 -0
  612. package/dist/render/prepare.d.ts +61 -0
  613. package/dist/render/prepare.js +119 -0
  614. package/dist/scheduler/core/duration.d.ts +83 -0
  615. package/dist/scheduler/core/duration.js +174 -0
  616. package/dist/scheduler/core/gantt.d.ts +63 -0
  617. package/dist/scheduler/core/gantt.js +226 -0
  618. package/dist/scheduler/core/index.d.ts +6 -0
  619. package/dist/scheduler/core/index.js +7 -0
  620. package/dist/scheduler/core/layout.d.ts +97 -0
  621. package/dist/scheduler/core/layout.js +249 -0
  622. package/dist/scheduler/core/time-scale.d.ts +89 -0
  623. package/dist/scheduler/core/time-scale.js +173 -0
  624. package/dist/scheduler/gantt.d.ts +125 -0
  625. package/dist/scheduler/gantt.js +532 -0
  626. package/dist/scheduler/index.d.ts +6 -0
  627. package/dist/scheduler/index.js +7 -0
  628. package/dist/scheduler/resource-calendar.d.ts +218 -0
  629. package/dist/scheduler/resource-calendar.js +661 -0
  630. package/dist/scheduler/scheduler.d.ts +168 -0
  631. package/dist/scheduler/scheduler.js +768 -0
  632. package/dist/scheduler/shared.d.ts +63 -0
  633. package/dist/scheduler/shared.js +145 -0
  634. package/dist/scheduler/time-tracker.d.ts +138 -0
  635. package/dist/scheduler/time-tracker.js +403 -0
  636. package/dist/sortable/core.d.ts +67 -0
  637. package/dist/sortable/core.js +167 -0
  638. package/dist/sortable/index.d.ts +8 -0
  639. package/dist/sortable/index.js +10 -0
  640. package/dist/sortable/kanban-core.d.ts +70 -0
  641. package/dist/sortable/kanban-core.js +67 -0
  642. package/dist/sortable/kanban.d.ts +147 -0
  643. package/dist/sortable/kanban.js +472 -0
  644. package/dist/sortable/sortable-list.d.ts +71 -0
  645. package/dist/sortable/sortable-list.js +76 -0
  646. package/dist/sortable/sortable-tree.d.ts +101 -0
  647. package/dist/sortable/sortable-tree.js +450 -0
  648. package/dist/sortable/sortable.d.ts +188 -0
  649. package/dist/sortable/sortable.js +485 -0
  650. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  651. package/dist/sortable/use-pointer-drag.js +173 -0
  652. package/dist/sortable/use-time-scale.d.ts +11 -0
  653. package/dist/sortable/use-time-scale.js +19 -0
  654. package/dist/styles/base.css +51 -0
  655. package/dist/styles/blocks.css +949 -0
  656. package/dist/styles/calendar.css +642 -0
  657. package/dist/styles/charts.css +264 -0
  658. package/dist/styles/data.css +474 -0
  659. package/dist/styles/editors.css +1022 -0
  660. package/dist/styles/forms.css +406 -0
  661. package/dist/styles/media.css +515 -0
  662. package/dist/styles/navigation.css +293 -0
  663. package/dist/styles/overlays.css +244 -0
  664. package/dist/styles.css +742 -0
  665. package/package.json +156 -4
@@ -0,0 +1,50 @@
1
+ import * as React from "react";
2
+ import { usePanelRef, useGroupRef, type GroupProps, type PanelProps, type SeparatorProps, type LayoutStorage, type PanelImperativeHandle, type GroupImperativeHandle } from "react-resizable-panels";
3
+ export type { PanelImperativeHandle as ResizablePanelHandle, GroupImperativeHandle as ResizableGroupHandle, LayoutStorage as ResizableLayoutStorage };
4
+ /** Typed ref for a `ResizablePanel`'s `panelRef` (`collapse()`, `expand()`, `resize()`, `isCollapsed()`). */
5
+ export declare const useResizablePanelRef: typeof usePanelRef;
6
+ /** Typed ref for a `ResizableGroup`'s `groupRef` (`getLayout()`, `setLayout()`). */
7
+ export declare const useResizableGroupRef: typeof useGroupRef;
8
+ export interface ResizableGroupProps extends Omit<GroupProps, "orientation"> {
9
+ /** Default `"horizontal"` (panes side by side). */
10
+ orientation?: "horizontal" | "vertical";
11
+ /** Alias of `orientation`. */
12
+ direction?: "horizontal" | "vertical";
13
+ /** Persist the layout under this key (localStorage by default). Panels need stable `id`s. */
14
+ autoSaveId?: string;
15
+ /** Storage for `autoSaveId` — e.g. a cookie adapter so the server can render the saved layout. */
16
+ storage?: LayoutStorage;
17
+ }
18
+ /**
19
+ * User-sized panes: list + detail, editor + preview, media grid + details. Built on
20
+ * react-resizable-panels (WAI-ARIA Window Splitter: arrow keys resize, Home/End, Enter collapses a
21
+ * collapsible pane, double-click resets).
22
+ *
23
+ * ```tsx
24
+ * <ResizableGroup autoSaveId="inbox" className="h-[560px]">
25
+ * <ResizablePanel id="list" defaultSize="35%" minSize="25%">…</ResizablePanel>
26
+ * <ResizableHandle withGrip />
27
+ * <ResizablePanel id="detail">…</ResizablePanel>
28
+ * </ResizableGroup>
29
+ * ```
30
+ *
31
+ * Sizes: numbers are **pixels**, strings without a unit are percentages (`"35"`), or use explicit
32
+ * units (`"35%"`, `"280px"`, `"20rem"`). In glass mode surfaces inside stop blurring while a
33
+ * handle is dragged. On phones, show one pane and open the other in a Sheet (not automatic).
34
+ */
35
+ export declare const ResizableGroup: React.ForwardRefExoticComponent<ResizableGroupProps & React.RefAttributes<HTMLDivElement>>;
36
+ export interface ResizablePanelProps extends PanelProps {
37
+ }
38
+ /** One pane. Give it a stable `id` when the group persists its layout. */
39
+ export declare function ResizablePanel({ className, ...props }: ResizablePanelProps): React.JSX.Element;
40
+ export interface ResizableHandleProps extends SeparatorProps {
41
+ /** A visible grip in the middle of the line (for discoverability on touch and in dense UIs). */
42
+ withGrip?: boolean;
43
+ /** Accessible name, e.g. "Resize contact list". Recommended when there are several handles. */
44
+ "aria-label"?: string;
45
+ }
46
+ /**
47
+ * The divider between panes: a 1px line with a wider invisible hit area. Hover and focus tint it,
48
+ * dragging paints it in the accent ink. Keyboard: focus it, then arrows / Home / End.
49
+ */
50
+ export declare function ResizableHandle({ withGrip, className, children, ...props }: ResizableHandleProps): React.JSX.Element;
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Group, Panel, Separator, useDefaultLayout, usePanelRef, useGroupRef, } from "react-resizable-panels";
5
+ import { cn } from "../lib/cn.js";
6
+ /** Typed ref for a `ResizablePanel`'s `panelRef` (`collapse()`, `expand()`, `resize()`, `isCollapsed()`). */
7
+ export const useResizablePanelRef = usePanelRef;
8
+ /** Typed ref for a `ResizableGroup`'s `groupRef` (`getLayout()`, `setLayout()`). */
9
+ export const useResizableGroupRef = useGroupRef;
10
+ const OrientationContext = React.createContext("horizontal");
11
+ /** localStorage that never throws (private mode, SSR, blocked storage). */
12
+ const safeLocalStorage = {
13
+ getItem(key) {
14
+ try {
15
+ return typeof window === "undefined" ? null : window.localStorage.getItem(key);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ },
21
+ setItem(key, value) {
22
+ try {
23
+ if (typeof window !== "undefined")
24
+ window.localStorage.setItem(key, value);
25
+ }
26
+ catch {
27
+ /* ignore */
28
+ }
29
+ },
30
+ };
31
+ /**
32
+ * User-sized panes: list + detail, editor + preview, media grid + details. Built on
33
+ * react-resizable-panels (WAI-ARIA Window Splitter: arrow keys resize, Home/End, Enter collapses a
34
+ * collapsible pane, double-click resets).
35
+ *
36
+ * ```tsx
37
+ * <ResizableGroup autoSaveId="inbox" className="h-[560px]">
38
+ * <ResizablePanel id="list" defaultSize="35%" minSize="25%">…</ResizablePanel>
39
+ * <ResizableHandle withGrip />
40
+ * <ResizablePanel id="detail">…</ResizablePanel>
41
+ * </ResizableGroup>
42
+ * ```
43
+ *
44
+ * Sizes: numbers are **pixels**, strings without a unit are percentages (`"35"`), or use explicit
45
+ * units (`"35%"`, `"280px"`, `"20rem"`). In glass mode surfaces inside stop blurring while a
46
+ * handle is dragged. On phones, show one pane and open the other in a Sheet (not automatic).
47
+ */
48
+ export const ResizableGroup = React.forwardRef(function ResizableGroup(props, ref) {
49
+ return props.autoSaveId ? _jsx(PersistedGroup, { ...props, forwardedRef: ref }) : _jsx(BaseGroup, { ...props, forwardedRef: ref });
50
+ });
51
+ function PersistedGroup({ autoSaveId, storage, onLayoutChanged, defaultLayout, ...props }) {
52
+ const saved = useDefaultLayout({ id: autoSaveId, storage: storage ?? safeLocalStorage });
53
+ return (_jsx(BaseGroup, { ...props, defaultLayout: saved.defaultLayout ?? defaultLayout, onLayoutChanged: (layout, meta) => {
54
+ saved.onLayoutChanged(layout, meta);
55
+ onLayoutChanged?.(layout, meta);
56
+ } }));
57
+ }
58
+ function BaseGroup({ orientation, direction, autoSaveId: _a, storage: _s, forwardedRef, className, style, elementRef, ...props }) {
59
+ const o = orientation ?? direction ?? "horizontal";
60
+ const refs = React.useCallback((node) => {
61
+ for (const r of [forwardedRef, elementRef]) {
62
+ if (typeof r === "function")
63
+ r(node);
64
+ else if (r)
65
+ r.current = node;
66
+ }
67
+ }, [forwardedRef, elementRef]);
68
+ return (_jsx(OrientationContext.Provider, { value: o, children: _jsx(Group, { elementRef: refs, orientation: o, "data-slot": "resizable-group", "data-orientation": o,
69
+ // The engine inlines height/width 100%, which would beat a height class (`h-64`); fill the
70
+ // parent through classes instead so `className` can size the group.
71
+ className: cn("h-full w-full min-h-0 min-w-0", className), style: { height: undefined, width: undefined, ...style }, ...props }) }));
72
+ }
73
+ /** One pane. Give it a stable `id` when the group persists its layout. */
74
+ export function ResizablePanel({ className, ...props }) {
75
+ return _jsx(Panel, { "data-slot": "resizable-panel", className: cn("min-h-0 min-w-0", className), ...props });
76
+ }
77
+ /**
78
+ * The divider between panes: a 1px line with a wider invisible hit area. Hover and focus tint it,
79
+ * dragging paints it in the accent ink. Keyboard: focus it, then arrows / Home / End.
80
+ */
81
+ export function ResizableHandle({ withGrip, className, children, ...props }) {
82
+ const groupOrientation = React.useContext(OrientationContext);
83
+ const vertical = groupOrientation === "horizontal"; // the line itself is vertical
84
+ return (_jsx(Separator, { "data-slot": "resizable-handle", className: cn("group/handle relative flex shrink-0 items-center justify-center bg-line outline-none transition-colors duration-150", vertical ? "w-px" : "h-px",
85
+ // invisible 8px hit area
86
+ "before:absolute before:content-['']", vertical ? "before:inset-y-0 before:-inset-x-1" : "before:inset-x-0 before:-inset-y-1", "data-[separator=hover]:bg-field-border-hover data-[separator=focus]:bg-accent-ink data-[separator=active]:bg-accent-ink", "focus-visible:bg-accent-ink focus-visible:shadow-[0_0_0_3px_var(--accent-soft)]", "data-[separator=disabled]:cursor-default data-[separator=disabled]:opacity-60", className), ...props, children: children ??
87
+ (withGrip ? (_jsxs("span", { "aria-hidden": true, className: cn("z-[1] flex items-center justify-center gap-[3px] rounded-full border border-field-border bg-[var(--surface-solid,var(--surface))] shadow-[0_1px_2px_rgb(0_0_0/0.08)] transition-colors", "group-data-[separator=active]/handle:border-accent-ink group-data-[separator=focus]/handle:border-accent-ink", vertical ? "h-7 w-3 flex-col" : "h-3 w-7 flex-row"), children: [_jsx("i", { className: "block size-[3px] rounded-full bg-fg-subtle" }), _jsx("i", { className: "block size-[3px] rounded-full bg-fg-subtle" }), _jsx("i", { className: "block size-[3px] rounded-full bg-fg-subtle" })] })) : null) }));
88
+ }
@@ -0,0 +1,40 @@
1
+ import * as React from "react";
2
+ import { ScrollArea as RadixScrollArea } from "radix-ui";
3
+ type BarSize = "sm" | "md";
4
+ export interface ScrollAreaProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixScrollArea.Root>, "dir"> {
5
+ /** Which scrollbars to render. Default `"vertical"`. */
6
+ orientation?: "vertical" | "horizontal" | "both";
7
+ /** Max height of the viewport (number = px). The area grows with content up to this. */
8
+ maxHeight?: number | string;
9
+ /** Edge fade mask on the scrolling axis; removed at the edges. */
10
+ fade?: boolean;
11
+ /** Scrollbar thickness. Default `"sm"`. */
12
+ size?: BarSize;
13
+ /** Ref to the scrolling viewport (for scroll position, virtualisation, scroll-to-top). */
14
+ viewportRef?: React.Ref<HTMLDivElement>;
15
+ /** Class names for the viewport element. */
16
+ viewportClassName?: string;
17
+ /** Names the scroll region for screen readers (adds `role="region"`). Recommended when the region is focusable. */
18
+ "aria-label"?: string;
19
+ dir?: "ltr" | "rtl";
20
+ }
21
+ /**
22
+ * A consistent thin scrollbar for bounded, embedded regions: popover and command lists, the
23
+ * notification panel, kanban columns, horizontal chip strips, code blocks.
24
+ *
25
+ * ```tsx
26
+ * <ScrollArea maxHeight={320} fade aria-label="Recent activity">…</ScrollArea>
27
+ * <ScrollArea orientation="horizontal" fade><div className="flex gap-2 w-max">…</div></ScrollArea>
28
+ * ```
29
+ *
30
+ * Native scrolling is preserved. Keep the page body and Sidebar on native scrolling — ScrollArea is
31
+ * only for embedded regions (performance and iOS momentum). The viewport is keyboard-focusable only
32
+ * when its content has nothing focusable of its own.
33
+ */
34
+ export declare const ScrollArea: React.ForwardRefExoticComponent<ScrollAreaProps & React.RefAttributes<HTMLDivElement>>;
35
+ export interface ScrollBarProps extends React.ComponentPropsWithoutRef<typeof RadixScrollArea.Scrollbar> {
36
+ size?: BarSize;
37
+ }
38
+ /** A scrollbar for `ScrollArea`. Rendered automatically from `orientation`; use it directly for custom layouts. */
39
+ export declare const ScrollBar: React.ForwardRefExoticComponent<ScrollBarProps & React.RefAttributes<HTMLDivElement>>;
40
+ export {};
@@ -0,0 +1,56 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { ScrollArea as RadixScrollArea } from "radix-ui";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useComposedRefs } from "../lib/compose-refs.js";
7
+ import { useEdgeFade } from "../lib/use-edge-fade.js";
8
+ import { useIsomorphicLayoutEffect } from "../lib/use-controllable-state.js";
9
+ const BarSizeContext = React.createContext("sm");
10
+ const FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"]),[contenteditable="true"]';
11
+ /**
12
+ * A consistent thin scrollbar for bounded, embedded regions: popover and command lists, the
13
+ * notification panel, kanban columns, horizontal chip strips, code blocks.
14
+ *
15
+ * ```tsx
16
+ * <ScrollArea maxHeight={320} fade aria-label="Recent activity">…</ScrollArea>
17
+ * <ScrollArea orientation="horizontal" fade><div className="flex gap-2 w-max">…</div></ScrollArea>
18
+ * ```
19
+ *
20
+ * Native scrolling is preserved. Keep the page body and Sidebar on native scrolling — ScrollArea is
21
+ * only for embedded regions (performance and iOS momentum). The viewport is keyboard-focusable only
22
+ * when its content has nothing focusable of its own.
23
+ */
24
+ export const ScrollArea = React.forwardRef(function ScrollArea({ orientation = "vertical", maxHeight, fade, size = "sm", type = "hover", viewportRef, viewportClassName, className, children, style, "aria-label": ariaLabel, ...props }, ref) {
25
+ const innerRef = React.useRef(null);
26
+ const composed = useComposedRefs(viewportRef, innerRef);
27
+ const axis = orientation === "horizontal" ? "x" : "y";
28
+ useEdgeFade(innerRef, axis, Boolean(fade) && orientation !== "both");
29
+ // Focusable only when nothing inside can take focus (keyboard users can still scroll).
30
+ const [focusable, setFocusable] = React.useState(false);
31
+ useIsomorphicLayoutEffect(() => {
32
+ const el = innerRef.current;
33
+ if (!el)
34
+ return;
35
+ const check = () => {
36
+ const scrolls = el.scrollHeight > el.clientHeight + 1 || el.scrollWidth > el.clientWidth + 1;
37
+ setFocusable(scrolls && !el.querySelector(FOCUSABLE));
38
+ };
39
+ check();
40
+ const mo = typeof MutationObserver !== "undefined" ? new MutationObserver(check) : undefined;
41
+ mo?.observe(el, { childList: true, subtree: true });
42
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(check) : undefined;
43
+ ro?.observe(el);
44
+ return () => {
45
+ mo?.disconnect();
46
+ ro?.disconnect();
47
+ };
48
+ }, []);
49
+ return (_jsx(BarSizeContext.Provider, { value: size, children: _jsxs(RadixScrollArea.Root, { ref: ref, type: type, "data-slot": "scroll-area", className: cn("relative overflow-hidden", className), style: style, ...props, children: [_jsx(RadixScrollArea.Viewport, { ref: composed, "data-slot": "scroll-area-viewport", "data-orientation": orientation, "data-edge-fade": fade && orientation !== "both" ? axis : undefined, tabIndex: focusable ? 0 : undefined, role: ariaLabel ? "region" : undefined, "aria-label": ariaLabel, className: cn("size-full rounded-[inherit] outline-none focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring", viewportClassName), style: maxHeight !== undefined ? { maxHeight } : undefined, children: children }), orientation !== "horizontal" ? _jsx(ScrollBar, { orientation: "vertical" }) : null, orientation !== "vertical" ? _jsx(ScrollBar, { orientation: "horizontal" }) : null, _jsx(RadixScrollArea.Corner, {})] }) }));
50
+ });
51
+ /** A scrollbar for `ScrollArea`. Rendered automatically from `orientation`; use it directly for custom layouts. */
52
+ export const ScrollBar = React.forwardRef(function ScrollBar({ orientation = "vertical", size, className, ...props }, ref) {
53
+ const ctxSize = React.useContext(BarSizeContext);
54
+ const s = size ?? ctxSize;
55
+ return (_jsx(RadixScrollArea.Scrollbar, { ref: ref, orientation: orientation, "data-slot": "scroll-area-bar", className: cn("z-(--z-sticky) flex touch-none select-none p-px transition-[opacity,background-color] duration-150", "data-[state=hidden]:opacity-0 data-[state=visible]:opacity-100", orientation === "vertical" ? (s === "sm" ? "w-2" : "w-2.5") : s === "sm" ? "h-2 flex-col" : "h-2.5 flex-col", orientation === "vertical" ? "h-full border-s border-s-transparent" : "border-t border-t-transparent", "hover:bg-[color-mix(in_srgb,var(--track)_50%,transparent)]", className), ...props, children: _jsx(RadixScrollArea.Thumb, { "data-slot": "scroll-area-thumb", className: "relative flex-1 rounded-full before:absolute before:top-1/2 before:left-1/2 before:size-full before:min-h-8 before:min-w-8 before:-translate-x-1/2 before:-translate-y-1/2" }) }));
56
+ });
@@ -0,0 +1,126 @@
1
+ import * as React from "react";
2
+ import { Select as SelectPrimitive } from "radix-ui";
3
+ declare const selectLabels: {
4
+ placeholder: string;
5
+ clear: string;
6
+ loading: string;
7
+ empty: string;
8
+ };
9
+ export type SelectLabels = typeof selectLabels;
10
+ /** One option of the `items` shorthand. */
11
+ export interface SelectOption<V extends string = string> {
12
+ value: V;
13
+ label: string;
14
+ icon?: React.ReactNode;
15
+ /** Second line under the label (also shown in the open list only). */
16
+ description?: string;
17
+ disabled?: boolean;
18
+ /** Options with the same `group` are rendered under one heading, in first-seen order. */
19
+ group?: string;
20
+ }
21
+ /** Radix root. Use the parts below to compose; or use the `Select` shorthand. */
22
+ export declare const SelectRoot: React.FC<SelectPrimitive.SelectProps>;
23
+ export interface SelectTriggerProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger> {
24
+ size?: "sm" | "md" | "lg";
25
+ /** `"default"` field look · `"ghost"` borderless (table cells, toolbars) · `"pill"` rounded (filter bars). */
26
+ variant?: "default" | "ghost" | "pill";
27
+ invalid?: boolean;
28
+ /** Read-only look: dashed border, no chevron, does not open. */
29
+ readOnly?: boolean;
30
+ /** Spinner in place of the chevron. */
31
+ loading?: boolean;
32
+ /** Announced as `aria-required` (set `required` on the root for form validation). */
33
+ required?: boolean;
34
+ }
35
+ /**
36
+ * The button that shows the value. Uses `controlVariants`, so it lines up with Input.
37
+ * Reads the surrounding Field (id, description, invalid, disabled).
38
+ */
39
+ export declare const SelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<HTMLButtonElement>>;
40
+ /** Shows the selected item's text, or the placeholder. Children override the rendering. */
41
+ export declare const SelectValue: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectValueProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
42
+ export interface SelectContentProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content> {
43
+ /** Item density inside the list. Default follows the trigger size. */
44
+ itemSize?: "sm" | "md";
45
+ }
46
+ /**
47
+ * The floating list. Popper-positioned under the trigger, at least as wide as it, portalled into
48
+ * the nearest ThemeScope, and one layer deep (glass blur only at depth 1).
49
+ */
50
+ export declare const SelectContent: React.ForwardRefExoticComponent<SelectContentProps & React.RefAttributes<HTMLDivElement>>;
51
+ export interface SelectItemProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item> {
52
+ icon?: React.ReactNode;
53
+ /** Second line, shown in the list only (the trigger shows the label). */
54
+ description?: React.ReactNode;
55
+ }
56
+ /**
57
+ * One option. Typeahead uses a locale-folded copy of the text, so typing "i" finds "İstanbul"
58
+ * and "c" finds "Çanakkale". Pass `textValue` when children aren't plain text.
59
+ */
60
+ export declare const SelectItem: React.ForwardRefExoticComponent<SelectItemProps & React.RefAttributes<HTMLDivElement>>;
61
+ export interface SelectGroupProps extends React.ComponentPropsWithoutRef<typeof SelectPrimitive.Group> {
62
+ /** Heading for the group (or put a `SelectLabel` first). */
63
+ label?: React.ReactNode;
64
+ }
65
+ /** Groups items under a heading; announced as a group. */
66
+ export declare const SelectGroup: React.ForwardRefExoticComponent<SelectGroupProps & React.RefAttributes<HTMLDivElement>>;
67
+ export declare const SelectLabel: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectLabelProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
68
+ export declare const SelectSeparator: React.ForwardRefExoticComponent<Omit<SelectPrimitive.SelectSeparatorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
69
+ export interface SelectProps<V extends string = string> {
70
+ /** Selected value; `null` = nothing selected (controlled). */
71
+ value?: V | null;
72
+ defaultValue?: V | null;
73
+ /** Called with the new value, or `null` after clearing. */
74
+ onValueChange?: (value: V | null) => void;
75
+ /** Options shorthand. Or compose `SelectItem` / `SelectGroup` / `SelectSeparator` as children. */
76
+ items?: SelectOption<V>[];
77
+ children?: React.ReactNode;
78
+ /** Text shown while nothing is selected. Default "Select…". */
79
+ placeholder?: string;
80
+ size?: "sm" | "md" | "lg";
81
+ variant?: "default" | "ghost" | "pill";
82
+ /** Show a clear (×) button while there is a value. Clearing yields `null`. */
83
+ clearable?: boolean;
84
+ /** Form field name — Radix renders a native `<select>` for FormData. */
85
+ name?: string;
86
+ required?: boolean;
87
+ disabled?: boolean;
88
+ invalid?: boolean;
89
+ /** Read-only: focusable and announced, but doesn't open. */
90
+ readOnly?: boolean;
91
+ /** Options are still loading: spinner in the trigger and a status row in the list. */
92
+ loading?: boolean;
93
+ /** Custom trigger content for the selected option (`items` shorthand only). */
94
+ renderValue?: (item: SelectOption<V>) => React.ReactNode;
95
+ open?: boolean;
96
+ defaultOpen?: boolean;
97
+ onOpenChange?: (open: boolean) => void;
98
+ id?: string;
99
+ "aria-label"?: string;
100
+ "aria-labelledby"?: string;
101
+ "aria-describedby"?: string;
102
+ /** Classes for the trigger (alias of `triggerClassName`). */
103
+ className?: string;
104
+ triggerClassName?: string;
105
+ contentClassName?: string;
106
+ /** Built-in string overrides (`select` namespace). */
107
+ labels?: Partial<SelectLabels>;
108
+ }
109
+ /**
110
+ * Pick one of a small, fixed set (≤ ~15): content status, currency, department, sort order.
111
+ * For longer or searchable lists use Combobox. WAI-ARIA select-only combobox on Radix:
112
+ * arrow keys, Home/End, typeahead (locale-folded), Esc.
113
+ *
114
+ * ```tsx
115
+ * <Field label="Status">
116
+ * <Select name="status" defaultValue="draft" items={[
117
+ * { value: "draft", label: "Draft", description: "Only editors can see it" },
118
+ * { value: "published", label: "Published" },
119
+ * ]} />
120
+ * </Field>
121
+ * ```
122
+ */
123
+ export declare const Select: <V extends string = string>(props: SelectProps<V> & {
124
+ ref?: React.Ref<HTMLButtonElement>;
125
+ }) => React.ReactElement;
126
+ export {};
@@ -0,0 +1,137 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Select as SelectPrimitive } from "radix-ui";
5
+ import { Check, ChevronDown, ChevronUp, X } from "lucide-react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useFieldContext, useFieldControl } from "../lib/field-context.js";
8
+ import { useLabels } from "../lib/labels.js";
9
+ import { Layer } from "../lib/layer.js";
10
+ import { useLocale } from "../lib/locale.js";
11
+ import { foldText } from "../lib/text.js";
12
+ import { usePortalContainer } from "../lib/theme-scope.js";
13
+ import { useControllableState } from "../lib/use-controllable-state.js";
14
+ import { controlVariants, itemSlots, itemVariants } from "../lib/variants.js";
15
+ import { Spinner } from "./spinner.js";
16
+ const selectLabels = {
17
+ placeholder: "Select…",
18
+ clear: "Clear selection",
19
+ loading: "Loading options…",
20
+ empty: "No options",
21
+ };
22
+ const SelectContext = React.createContext({ size: "md", itemSize: "md" });
23
+ /* ------------------------------------------------------------------ */
24
+ /* Composite parts */
25
+ /* ------------------------------------------------------------------ */
26
+ /** Radix root. Use the parts below to compose; or use the `Select` shorthand. */
27
+ export const SelectRoot = SelectPrimitive.Root;
28
+ /**
29
+ * The button that shows the value. Uses `controlVariants`, so it lines up with Input.
30
+ * Reads the surrounding Field (id, description, invalid, disabled).
31
+ */
32
+ export const SelectTrigger = React.forwardRef(function SelectTrigger({ className, size = "md", variant = "default", invalid, readOnly, loading, children, ...rest }, ref) {
33
+ const props = useFieldControl({ ...rest, readOnly, "aria-invalid": invalid ? true : rest["aria-invalid"] });
34
+ const { readOnly: ro, required, name: _name, ...triggerProps } = props;
35
+ void _name;
36
+ return (_jsxs(SelectPrimitive.Trigger, { ref: ref, "data-slot": "select-trigger", "data-size": size, "data-readonly": ro ? "" : undefined, "aria-readonly": ro || undefined, "aria-required": required || undefined, "aria-busy": loading || undefined, className: cn(controlVariants({ size, variant: variant === "pill" ? "default" : variant, pill: variant === "pill" }), "justify-between text-start whitespace-nowrap cursor-default", "data-placeholder:text-fg-subtle [&>span]:min-w-0 [&>span]:truncate", ro && "cursor-default", className), ...triggerProps, children: [children, loading ? (_jsx(Spinner, { size: size === "lg" ? "md" : "sm", tone: "muted" })) : ro ? null : (_jsx(SelectPrimitive.Icon, { asChild: true, children: _jsx(ChevronDown, { "aria-hidden": true, className: "shrink-0 text-fg-subtle transition-transform duration-150 [[data-state=open]>&]:rotate-180" }) }))] }));
37
+ });
38
+ /** Shows the selected item's text, or the placeholder. Children override the rendering. */
39
+ export const SelectValue = React.forwardRef(function SelectValue({ className, ...props }, ref) {
40
+ return _jsx(SelectPrimitive.Value, { ref: ref, "data-slot": "select-value", className: cn("min-w-0 truncate", className), ...props });
41
+ });
42
+ /**
43
+ * The floating list. Popper-positioned under the trigger, at least as wide as it, portalled into
44
+ * the nearest ThemeScope, and one layer deep (glass blur only at depth 1).
45
+ */
46
+ export const SelectContent = React.forwardRef(function SelectContent({ className, children, position = "popper", sideOffset = 6, collisionPadding = 12, itemSize, ...props }, ref) {
47
+ const container = usePortalContainer();
48
+ const parent = React.useContext(SelectContext);
49
+ const ctx = React.useMemo(() => ({ ...parent, itemSize: itemSize ?? parent.itemSize }), [parent, itemSize]);
50
+ return (_jsx(SelectPrimitive.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsxs(SelectPrimitive.Content, { ref: ref, "data-slot": "select-content", position: position, sideOffset: position === "popper" ? sideOffset : undefined, collisionPadding: collisionPadding, className: cn("surface-popover ui-pop relative z-(--z-popover) overflow-hidden rounded-ui-lg", position === "popper" &&
51
+ "max-h-(--radix-select-content-available-height) min-w-(--radix-select-trigger-width) max-w-[min(28rem,calc(100vw-1.5rem))]", className), ...props, children: [_jsx(SelectPrimitive.ScrollUpButton, { className: "flex h-6 items-center justify-center text-fg-subtle", children: _jsx(ChevronUp, { "aria-hidden": true, className: "size-4" }) }), _jsx(SelectPrimitive.Viewport, { className: cn("p-1", position === "popper" && "max-h-[min(22rem,var(--radix-select-content-available-height))]"), children: _jsx(SelectContext.Provider, { value: ctx, children: children }) }), _jsx(SelectPrimitive.ScrollDownButton, { className: "flex h-6 items-center justify-center text-fg-subtle", children: _jsx(ChevronDown, { "aria-hidden": true, className: "size-4" }) })] }) }) }));
52
+ });
53
+ /**
54
+ * One option. Typeahead uses a locale-folded copy of the text, so typing "i" finds "İstanbul"
55
+ * and "c" finds "Çanakkale". Pass `textValue` when children aren't plain text.
56
+ */
57
+ export const SelectItem = React.forwardRef(function SelectItem({ className, children, icon, description, textValue, ...props }, ref) {
58
+ const { itemSize } = React.useContext(SelectContext);
59
+ const { locale } = useLocale();
60
+ const plain = textValue ?? (typeof children === "string" ? children : undefined);
61
+ return (_jsxs(SelectPrimitive.Item, { ref: ref, "data-slot": "select-item", textValue: plain !== undefined ? foldText(plain, locale) : undefined, className: cn(itemVariants({ size: itemSize }), "pe-8", description ? "items-start" : undefined, className), ...props, children: [icon ? _jsx("span", { className: cn(itemSlots.icon, "flex items-center justify-center", description && "mt-0.5"), children: icon }) : null, _jsxs("span", { className: "grid min-w-0 flex-1", children: [_jsx(SelectPrimitive.ItemText, { children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [icon ? _jsx("span", { "aria-hidden": true, className: "hidden items-center text-fg-muted [[data-slot=select-trigger]_&]:flex", children: icon }) : null, _jsx("span", { className: "truncate", children: children })] }) }), description ? _jsx("span", { className: itemSlots.description, children: description }) : null] }), _jsx("span", { className: cn("absolute end-2 flex size-4 items-center justify-center text-accent-ink", description && "top-2"), children: _jsx(SelectPrimitive.ItemIndicator, { children: _jsx(Check, { "aria-hidden": true, strokeWidth: 2.5, className: "size-4" }) }) })] }));
62
+ });
63
+ /** Groups items under a heading; announced as a group. */
64
+ export const SelectGroup = React.forwardRef(function SelectGroup({ label, children, ...props }, ref) {
65
+ return (_jsxs(SelectPrimitive.Group, { ref: ref, "data-slot": "select-group", ...props, children: [label != null ? _jsx(SelectLabel, { children: label }) : null, children] }));
66
+ });
67
+ export const SelectLabel = React.forwardRef(function SelectLabel({ className, ...props }, ref) {
68
+ return _jsx(SelectPrimitive.Label, { ref: ref, "data-slot": "select-label", className: cn(itemSlots.groupLabel, className), ...props });
69
+ });
70
+ export const SelectSeparator = React.forwardRef(function SelectSeparator({ className, ...props }, ref) {
71
+ return _jsx(SelectPrimitive.Separator, { ref: ref, "data-slot": "select-separator", className: cn(itemSlots.separator, className), ...props });
72
+ });
73
+ function groupItems(items) {
74
+ const groups = [];
75
+ const byName = new Map();
76
+ for (const item of items) {
77
+ const key = item.group ?? "";
78
+ let g = byName.get(key);
79
+ if (!g) {
80
+ g = { label: item.group, items: [] };
81
+ byName.set(key, g);
82
+ groups.push(g);
83
+ }
84
+ g.items.push(item);
85
+ }
86
+ return groups;
87
+ }
88
+ function SelectInner({ value: valueProp, defaultValue, onValueChange, items, children, placeholder, size = "md", variant = "default", clearable, name, required, disabled, invalid, readOnly, loading, renderValue, open: openProp, defaultOpen, onOpenChange, className, triggerClassName, contentClassName, labels, ...aria }, ref) {
89
+ const t = useLabels("select", selectLabels, labels);
90
+ const field = useFieldContext();
91
+ const isDisabled = disabled ?? (field?.disabled || undefined);
92
+ const isReadOnly = readOnly ?? (field?.readOnly || undefined);
93
+ const isRequired = required ?? (field?.required || undefined);
94
+ const [value, setValue] = useControllableState({ value: valueProp, defaultValue: defaultValue ?? null, onChange: onValueChange, name: "Select" });
95
+ const [open, setOpen] = useControllableState({ value: openProp, defaultValue: defaultOpen ?? false, onChange: onOpenChange, name: "Select" });
96
+ const triggerRef = React.useRef(null);
97
+ const ctx = React.useMemo(() => ({ size, itemSize: size === "sm" ? "sm" : "md" }), [size]);
98
+ const selected = items?.find((i) => i.value === value);
99
+ const showClear = clearable && value !== null && !isDisabled && !isReadOnly;
100
+ return (_jsx(SelectContext.Provider, { value: ctx, children: _jsxs(SelectPrimitive.Root
101
+ // Radix treats "" as "no selection" and shows the placeholder.
102
+ , {
103
+ // Radix treats "" as "no selection" and shows the placeholder.
104
+ value: value ?? "", onValueChange: (v) => setValue(v === "" ? null : v), open: isReadOnly ? false : open, onOpenChange: (o) => {
105
+ if (!isReadOnly)
106
+ setOpen(o);
107
+ }, name: name ?? field?.name, required: isRequired, disabled: isDisabled, children: [_jsxs("div", { "data-slot": "select", className: "relative w-full min-w-0", children: [_jsx(SelectTrigger, { ref: (node) => {
108
+ triggerRef.current = node;
109
+ if (typeof ref === "function")
110
+ ref(node);
111
+ else if (ref)
112
+ ref.current = node;
113
+ }, size: size, variant: variant, invalid: invalid, readOnly: isReadOnly, loading: loading, disabled: isDisabled, required: isRequired, className: cn(showClear && (size === "sm" ? "pe-12" : "pe-14"), className, triggerClassName), ...aria, children: _jsx(SelectValue, { placeholder: placeholder ?? t("placeholder"), children: selected ? (renderValue ? (renderValue(selected)) : (_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [selected.icon ? _jsx("span", { "aria-hidden": true, className: "flex items-center text-fg-muted", children: selected.icon }) : null, _jsx("span", { className: "truncate", children: selected.label })] }))) : undefined }) }), showClear ? (_jsx("button", { type: "button", "data-slot": "select-clear", "aria-label": t("clear"), onClick: () => {
114
+ setValue(null);
115
+ triggerRef.current?.focus();
116
+ }, className: cn("absolute top-1/2 inline-flex -translate-y-1/2 items-center justify-center rounded-full text-fg-subtle transition-colors hover:bg-hover hover:text-fg focus-ring", size === "sm" ? "end-7 size-5 [&_svg]:size-3" : "end-8 size-6 [&_svg]:size-3.5"), children: _jsx(X, { "aria-hidden": true }) })) : null] }), _jsxs(SelectContent, { className: contentClassName, children: [items
117
+ ? groupItems(items).map((g, gi) => {
118
+ const rendered = g.items.map((item) => (_jsx(SelectItem, { value: item.value, icon: item.icon, description: item.description, disabled: item.disabled, textValue: item.label, children: item.label }, item.value)));
119
+ return g.label ? (_jsxs(React.Fragment, { children: [gi > 0 ? _jsx(SelectSeparator, {}) : null, _jsx(SelectGroup, { label: g.label, children: rendered })] }, g.label)) : (_jsx(React.Fragment, { children: rendered }, `_${gi}`));
120
+ })
121
+ : children, loading ? (_jsxs("div", { role: "status", className: "flex items-center gap-2 px-2 py-2 text-[13px] text-fg-muted", children: [_jsx(Spinner, { size: "xs", tone: "muted" }), t("loading")] })) : items && items.length === 0 ? (_jsx("div", { className: "px-2 py-2 text-[13px] text-fg-subtle", children: t("empty") })) : null] })] }) }));
122
+ }
123
+ /**
124
+ * Pick one of a small, fixed set (≤ ~15): content status, currency, department, sort order.
125
+ * For longer or searchable lists use Combobox. WAI-ARIA select-only combobox on Radix:
126
+ * arrow keys, Home/End, typeahead (locale-folded), Esc.
127
+ *
128
+ * ```tsx
129
+ * <Field label="Status">
130
+ * <Select name="status" defaultValue="draft" items={[
131
+ * { value: "draft", label: "Draft", description: "Only editors can see it" },
132
+ * { value: "published", label: "Published" },
133
+ * ]} />
134
+ * </Field>
135
+ * ```
136
+ */
137
+ export const Select = React.forwardRef(SelectInner);
@@ -0,0 +1,31 @@
1
+ import * as React from "react";
2
+ import { Separator as SeparatorPrimitive } from "radix-ui";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ export declare const separatorVariants: (props?: ({
5
+ tone?: "nav" | "strong" | "line" | null | undefined;
6
+ orientation?: "vertical" | "horizontal" | null | undefined;
7
+ inset?: boolean | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export interface SeparatorProps extends Omit<React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>, "orientation">, Omit<VariantProps<typeof separatorVariants>, "orientation"> {
10
+ orientation?: "horizontal" | "vertical";
11
+ /**
12
+ * Purely visual (default `true`): hidden from assistive tech. Set `false` when the separator
13
+ * divides meaningful groups (toolbars, menus) so it is announced as `role="separator"`.
14
+ */
15
+ decorative?: boolean;
16
+ /** Text in the middle of a horizontal line ("or"). The label is read as normal text. */
17
+ label?: React.ReactNode;
18
+ /** Label alignment. Default `"center"`. */
19
+ labelAlign?: "start" | "center" | "end";
20
+ }
21
+ /**
22
+ * A hairline divider between content: card sections, menu groups, the "or" on a sign-in form,
23
+ * toolbar groups. Built on Radix Separator.
24
+ *
25
+ * ```tsx
26
+ * <Separator />
27
+ * <Separator orientation="vertical" className="h-5" />
28
+ * <Separator label="or continue with" />
29
+ * ```
30
+ */
31
+ export declare const Separator: React.ForwardRefExoticComponent<SeparatorProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Separator as SeparatorPrimitive } from "radix-ui";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn.js";
6
+ export const separatorVariants = cva("shrink-0 border-0", {
7
+ variants: {
8
+ tone: {
9
+ line: "bg-line",
10
+ strong: "bg-field-border",
11
+ nav: "bg-nav-line",
12
+ },
13
+ orientation: {
14
+ horizontal: "h-px w-full",
15
+ vertical: "w-px self-stretch",
16
+ },
17
+ inset: { true: "" },
18
+ },
19
+ compoundVariants: [
20
+ { orientation: "horizontal", inset: true, className: "mx-auto w-[calc(100%-2*var(--gap))]" },
21
+ { orientation: "vertical", inset: true, className: "my-1.5" },
22
+ ],
23
+ defaultVariants: { tone: "line", orientation: "horizontal" },
24
+ });
25
+ /**
26
+ * A hairline divider between content: card sections, menu groups, the "or" on a sign-in form,
27
+ * toolbar groups. Built on Radix Separator.
28
+ *
29
+ * ```tsx
30
+ * <Separator />
31
+ * <Separator orientation="vertical" className="h-5" />
32
+ * <Separator label="or continue with" />
33
+ * ```
34
+ */
35
+ export const Separator = React.forwardRef(function Separator({ className, orientation = "horizontal", decorative = true, tone, inset, label, labelAlign = "center", ...props }, ref) {
36
+ if (label != null && orientation === "horizontal") {
37
+ const line = _jsx(SeparatorPrimitive.Root, { decorative: true, className: cn(separatorVariants({ tone, orientation: "horizontal" }), "w-auto flex-1") });
38
+ return (_jsxs("div", { ref: ref, "data-slot": "separator", "data-orientation": "horizontal", className: cn("flex w-full items-center gap-3 text-xs text-fg-subtle", inset && "px-(--gap)", className), ...props, children: [labelAlign !== "start" ? line : null, _jsx("span", { className: "shrink-0 tracking-[0.01em]", children: label }), labelAlign !== "end" ? line : null] }));
39
+ }
40
+ return (_jsx(SeparatorPrimitive.Root, { ref: ref, "data-slot": "separator", decorative: decorative, orientation: orientation, className: cn(separatorVariants({ tone, orientation, inset }), className), ...props }));
41
+ });