@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,68 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "radix-ui";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn.js";
6
+ import { ChipRemoveButton, LocaleCount } from "../lib/islands.js";
7
+ export const badgeVariants = cva("inline-flex shrink-0 items-center gap-1 whitespace-nowrap font-medium leading-none [&_svg]:size-3 [&_svg]:shrink-0", {
8
+ variants: {
9
+ tone: {
10
+ neutral: "bg-selected text-fg-muted",
11
+ accent: "bg-accent-soft text-accent-ink",
12
+ success: "tone-success tone-soft",
13
+ warning: "tone-warning tone-soft",
14
+ danger: "tone-danger tone-soft",
15
+ info: "tone-info tone-soft",
16
+ outline: "border border-field-border text-fg-muted",
17
+ /** Driven by the `color` prop (user-defined label colours). */
18
+ custom: "tone-soft",
19
+ },
20
+ size: {
21
+ sm: "h-5 px-2 text-[11px]",
22
+ md: "h-6 px-2.5 text-xs",
23
+ lg: "h-7 gap-1.5 px-3 text-[13px] [&_svg]:size-3.5",
24
+ },
25
+ shape: {
26
+ pill: "rounded-full",
27
+ /** Version / code tags. */
28
+ square: "rounded-ui-sm",
29
+ },
30
+ interactive: {
31
+ true: "cursor-pointer transition-[filter,background-color] hover:brightness-95 focus-ring",
32
+ },
33
+ },
34
+ defaultVariants: { tone: "neutral", size: "sm", shape: "pill" },
35
+ });
36
+ /**
37
+ * Status, count and label pill — and the kit's chip (`onRemove`), reused by Tag input,
38
+ * Combobox multi-select and Filter bar. Server-compatible (the remove button and count
39
+ * formatting are tiny client islands).
40
+ *
41
+ * ```tsx
42
+ * <Badge tone="success" dot>Published</Badge>
43
+ * <Badge count={128} tone="accent" /> // "99+"
44
+ * <Badge onRemove={() => drop("design")}>Design</Badge>
45
+ * <Badge asChild interactive><Link href="/posts?status=draft">Draft</Link></Badge>
46
+ * ```
47
+ *
48
+ * No CSS `uppercase` — it breaks Turkish (i → I) without the right `lang`; use `upperText()`.
49
+ */
50
+ export const Badge = React.forwardRef(function Badge({ className, tone, size, shape, dot, color, count, max = 99, onRemove, removeLabel, disabled, asChild, children, style, ...props }, ref) {
51
+ const removable = Boolean(onRemove);
52
+ const Comp = asChild && !removable ? Slot.Root : "span";
53
+ const classes = cn(badgeVariants({ tone: color ? "custom" : tone, size, shape, interactive: asChild && !removable ? true : undefined }), count !== undefined && "tabular justify-center", count !== undefined && (size === "lg" ? "min-w-7 px-2" : size === "md" ? "min-w-6 px-2" : "min-w-5 px-1.5"), removable && "pe-1.5", disabled && "pointer-events-none opacity-50", className);
54
+ const content = count !== undefined ? _jsx(LocaleCount, { value: count, max: max }) : children;
55
+ if (Comp === Slot.Root) {
56
+ const slotProps = {
57
+ ref,
58
+ "data-slot": "badge",
59
+ className: classes,
60
+ style: color ? { ...style, ["--tone"]: color } : style,
61
+ "aria-disabled": disabled || undefined,
62
+ ...props,
63
+ };
64
+ // Slot needs the dot and the Slottable as direct children (no fragment).
65
+ return dot ? (_jsxs(Slot.Root, { ...slotProps, children: [_jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-current" }), _jsx(Slot.Slottable, { children: children })] })) : (_jsx(Slot.Root, { ...slotProps, children: children }));
66
+ }
67
+ return (_jsxs("span", { ref: ref, "data-slot": "badge", "data-tone": color ? "custom" : (tone ?? "neutral"), className: classes, style: color ? { ...style, ["--tone"]: color } : style, "aria-disabled": disabled || undefined, ...props, children: [dot ? _jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-current" }) : null, content, onRemove ? (_jsx(ChipRemoveButton, { onRemove: onRemove, disabled: disabled, removeLabel: removeLabel, itemLabel: typeof children === "string" || typeof children === "number" ? String(children) : undefined })) : null] }));
68
+ });
@@ -0,0 +1,78 @@
1
+ import * as React from "react";
2
+ declare const breadcrumbLabels: {
3
+ label: string;
4
+ showHidden: string;
5
+ siblings: string;
6
+ };
7
+ type BreadcrumbSize = "sm" | "md";
8
+ export interface BreadcrumbMenuLink {
9
+ label: React.ReactNode;
10
+ href: string;
11
+ /** Marks the sibling that is the current item. */
12
+ current?: boolean;
13
+ }
14
+ export interface BreadcrumbItemData {
15
+ label: React.ReactNode;
16
+ href?: string;
17
+ icon?: React.ReactNode;
18
+ /** Jump to siblings ("Companies › Acme ▾" → other companies). */
19
+ menu?: BreadcrumbMenuLink[];
20
+ }
21
+ export interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {
22
+ /** Data-driven trail. The last item is the current page. Omit for the compound API. */
23
+ items?: BreadcrumbItemData[];
24
+ /** Collapse the middle into a "…" menu when there are more items (first + last `maxItems − 2` stay). */
25
+ maxItems?: number;
26
+ /** Separator between items. Default a chevron that flips in RTL. */
27
+ separator?: React.ReactNode;
28
+ size?: BreadcrumbSize;
29
+ /** Websites: also output a schema.org `BreadcrumbList` JSON-LD script (items with `href`). */
30
+ jsonLd?: boolean;
31
+ /** Origin used to make JSON-LD URLs absolute, e.g. `"https://vamos.ist"`. */
32
+ baseUrl?: string;
33
+ labels?: Partial<typeof breadcrumbLabels>;
34
+ }
35
+ /**
36
+ * Shows where a page sits in a hierarchy and offers a way up (WAI-ARIA Breadcrumb: `nav` + `ol`,
37
+ * `aria-current="page"` on the last item). Links go through the app's router `Link`.
38
+ *
39
+ * ```tsx
40
+ * <Breadcrumb items={[{ label: "Companies", href: "/companies" }, { label: "Acme", href: "/companies/acme" }, { label: "Contacts" }]} />
41
+ * ```
42
+ *
43
+ * Compound: `<Breadcrumb><BreadcrumbList><BreadcrumbItem><BreadcrumbLink href/></BreadcrumbItem><BreadcrumbSeparator/>…<BreadcrumbPage/></BreadcrumbList></Breadcrumb>`.
44
+ */
45
+ export declare const Breadcrumb: React.ForwardRefExoticComponent<BreadcrumbProps & React.RefAttributes<HTMLElement>>;
46
+ /** The ordered list of crumbs. */
47
+ export declare const BreadcrumbList: React.ForwardRefExoticComponent<React.OlHTMLAttributes<HTMLOListElement> & React.RefAttributes<HTMLOListElement>>;
48
+ /** One crumb (`li`). */
49
+ export declare const BreadcrumbItem: React.ForwardRefExoticComponent<React.LiHTMLAttributes<HTMLLIElement> & React.RefAttributes<HTMLLIElement>>;
50
+ export interface BreadcrumbLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement>, "href"> {
51
+ href?: string;
52
+ icon?: React.ReactNode;
53
+ /** Render your own link element instead (keeps the styles). */
54
+ asChild?: boolean;
55
+ }
56
+ /** A crumb that links up the hierarchy. Uses the app's router `Link` (external URLs open in a new tab). */
57
+ export declare const BreadcrumbLink: React.ForwardRefExoticComponent<BreadcrumbLinkProps & React.RefAttributes<HTMLAnchorElement>>;
58
+ export interface BreadcrumbPageProps extends React.HTMLAttributes<HTMLSpanElement> {
59
+ icon?: React.ReactNode;
60
+ }
61
+ /** The current page: plain text, `aria-current="page"` (override for a non-link middle crumb). */
62
+ export declare const BreadcrumbPage: React.ForwardRefExoticComponent<BreadcrumbPageProps & React.RefAttributes<HTMLSpanElement>>;
63
+ /** The separator between crumbs. Hidden from assistive tech. */
64
+ export declare function BreadcrumbSeparator({ className, children, ...props }: React.LiHTMLAttributes<HTMLLIElement>): React.JSX.Element;
65
+ export interface BreadcrumbEllipsisProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
66
+ /** The hidden crumbs, offered in a menu. Without items it renders a static "…". */
67
+ items?: BreadcrumbMenuLink[];
68
+ labels?: Partial<typeof breadcrumbLabels>;
69
+ }
70
+ /** "…" for collapsed crumbs; opens a menu with the hidden pages. */
71
+ export declare const BreadcrumbEllipsis: React.ForwardRefExoticComponent<BreadcrumbEllipsisProps & React.RefAttributes<HTMLButtonElement>>;
72
+ /** A small ▾ after a crumb that jumps to its siblings. */
73
+ export declare function BreadcrumbSiblings({ label, items, labels }: {
74
+ label: React.ReactNode;
75
+ items: BreadcrumbMenuLink[];
76
+ labels?: Partial<typeof breadcrumbLabels>;
77
+ }): React.JSX.Element;
78
+ export {};
@@ -0,0 +1,106 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { DropdownMenu, Slot } from "radix-ui";
5
+ import { ChevronRight, ChevronsUpDown, MoreHorizontal } from "lucide-react";
6
+ import { cva } from "class-variance-authority";
7
+ import { cn } from "../lib/cn.js";
8
+ import { useLabels } from "../lib/labels.js";
9
+ import { SmartLink } from "../lib/provider.js";
10
+ import { usePortalContainer } from "../lib/theme-scope.js";
11
+ import { Layer } from "../lib/layer.js";
12
+ import { itemVariants } from "../lib/variants.js";
13
+ const breadcrumbLabels = {
14
+ label: "Breadcrumb",
15
+ showHidden: "Show hidden pages",
16
+ siblings: "Pages next to {label}",
17
+ };
18
+ const SizeContext = React.createContext("md");
19
+ /**
20
+ * Shows where a page sits in a hierarchy and offers a way up (WAI-ARIA Breadcrumb: `nav` + `ol`,
21
+ * `aria-current="page"` on the last item). Links go through the app's router `Link`.
22
+ *
23
+ * ```tsx
24
+ * <Breadcrumb items={[{ label: "Companies", href: "/companies" }, { label: "Acme", href: "/companies/acme" }, { label: "Contacts" }]} />
25
+ * ```
26
+ *
27
+ * Compound: `<Breadcrumb><BreadcrumbList><BreadcrumbItem><BreadcrumbLink href/></BreadcrumbItem><BreadcrumbSeparator/>…<BreadcrumbPage/></BreadcrumbList></Breadcrumb>`.
28
+ */
29
+ export const Breadcrumb = React.forwardRef(function Breadcrumb({ items, maxItems, separator, size = "md", jsonLd, baseUrl, labels, className, children, ...props }, ref) {
30
+ const t = useLabels("breadcrumb", breadcrumbLabels, labels);
31
+ return (_jsx(SizeContext.Provider, { value: size, children: _jsxs("nav", { ref: ref, "aria-label": t("label"), "data-slot": "breadcrumb", className: cn("min-w-0", className), ...props, children: [items ? _jsx(BreadcrumbTrail, { items: items, maxItems: maxItems, separator: separator, labels: labels }) : children, items && jsonLd ? _jsx(BreadcrumbJsonLd, { items: items, baseUrl: baseUrl }) : null] }) }));
32
+ });
33
+ function BreadcrumbTrail({ items, maxItems, separator, labels }) {
34
+ const tail = maxItems ? Math.max(1, maxItems - 2) : items.length;
35
+ const collapse = maxItems !== undefined && items.length > maxItems && items.length > tail + 1;
36
+ const hidden = collapse ? items.slice(1, items.length - tail) : [];
37
+ const visible = collapse
38
+ ? [{ item: items[0], index: 0 }, "ellipsis", ...items.slice(items.length - tail).map((item, i) => ({ item, index: items.length - tail + i }))]
39
+ : items.map((item, index) => ({ item, index }));
40
+ return (_jsx(BreadcrumbList, { children: visible.map((entry, i) => {
41
+ const sep = i > 0 ? _jsx(BreadcrumbSeparator, { children: separator }, `s${i}`) : null;
42
+ if (entry === "ellipsis") {
43
+ return (_jsxs(React.Fragment, { children: [sep, _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbEllipsis, { items: hidden.map((h) => ({ label: h.label, href: h.href ?? "" })).filter((h) => h.href), labels: labels }) })] }, "ellipsis"));
44
+ }
45
+ const { item, index } = entry;
46
+ const last = index === items.length - 1;
47
+ return (_jsxs(React.Fragment, { children: [sep, _jsxs(BreadcrumbItem, { children: [last || !item.href ? (_jsx(BreadcrumbPage, { icon: item.icon, "aria-current": last ? "page" : undefined, children: item.label })) : (_jsx(BreadcrumbLink, { href: item.href, icon: item.icon, children: item.label })), item.menu?.length ? _jsx(BreadcrumbSiblings, { label: item.label, items: item.menu, labels: labels }) : null] })] }, index));
48
+ }) }));
49
+ }
50
+ const listVariants = cva("flex min-w-0 flex-wrap items-center text-fg-muted", {
51
+ variants: { size: { sm: "gap-1 text-[13px] [&_svg]:size-3.5", md: "gap-1.5 text-sm [&_svg]:size-4" } },
52
+ defaultVariants: { size: "md" },
53
+ });
54
+ /** The ordered list of crumbs. */
55
+ export const BreadcrumbList = React.forwardRef(function BreadcrumbList({ className, ...props }, ref) {
56
+ const size = React.useContext(SizeContext);
57
+ return _jsx("ol", { ref: ref, "data-slot": "breadcrumb-list", className: cn(listVariants({ size }), className), ...props });
58
+ });
59
+ /** One crumb (`li`). */
60
+ export const BreadcrumbItem = React.forwardRef(function BreadcrumbItem({ className, ...props }, ref) {
61
+ return _jsx("li", { ref: ref, "data-slot": "breadcrumb-item", className: cn("inline-flex min-w-0 items-center gap-0.5", className), ...props });
62
+ });
63
+ const crumbClass = "inline-flex min-w-0 max-w-[16rem] items-center gap-1.5 rounded-ui-sm [&_svg]:shrink-0";
64
+ /** A crumb that links up the hierarchy. Uses the app's router `Link` (external URLs open in a new tab). */
65
+ export const BreadcrumbLink = React.forwardRef(function BreadcrumbLink({ href, icon, asChild, className, children, title, ...props }, ref) {
66
+ const classes = cn(crumbClass, "transition-colors hover:text-fg focus-ring", className);
67
+ if (asChild)
68
+ return _jsx(Slot.Root, { ref: ref, "data-slot": "breadcrumb-link", className: classes, ...props, children: children });
69
+ return (_jsxs(SmartLink, { ref: ref, href: href ?? "#", "data-slot": "breadcrumb-link", className: classes, title: title ?? (typeof children === "string" ? children : undefined), ...props, children: [icon ? _jsx("span", { "aria-hidden": true, className: "inline-flex", children: icon }) : null, _jsx("span", { className: "truncate", children: children })] }));
70
+ });
71
+ /** The current page: plain text, `aria-current="page"` (override for a non-link middle crumb). */
72
+ export const BreadcrumbPage = React.forwardRef(function BreadcrumbPage({ icon, className, children, title, ...props }, ref) {
73
+ const current = !("aria-current" in props) || props["aria-current"] !== undefined;
74
+ return (_jsxs("span", { ref: ref, "data-slot": "breadcrumb-page", "aria-current": "page", title: title ?? (typeof children === "string" ? children : undefined), className: cn(crumbClass, current ? "font-medium text-fg" : "text-fg-muted", className), ...props, children: [icon ? _jsx("span", { "aria-hidden": true, className: "inline-flex", children: icon }) : null, _jsx("span", { className: "truncate", children: children })] }));
75
+ });
76
+ /** The separator between crumbs. Hidden from assistive tech. */
77
+ export function BreadcrumbSeparator({ className, children, ...props }) {
78
+ return (_jsx("li", { role: "presentation", "aria-hidden": true, "data-slot": "breadcrumb-separator", className: cn("inline-flex text-fg-subtle [&>svg]:rtl:-scale-x-100", className), ...props, children: children ?? _jsx(ChevronRight, { strokeWidth: 1.75 }) }));
79
+ }
80
+ const menuContentClass = "surface-popover ui-pop z-(--z-popover) min-w-48 max-w-72 rounded-ui p-1";
81
+ function CrumbMenu({ trigger, items }) {
82
+ const container = usePortalContainer();
83
+ return (_jsxs(DropdownMenu.Root, { children: [_jsx(DropdownMenu.Trigger, { asChild: true, children: trigger }), _jsx(DropdownMenu.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsx(DropdownMenu.Content, { align: "start", sideOffset: 6, className: menuContentClass, children: items.map((it, i) => (_jsx(DropdownMenu.Item, { asChild: true, className: cn(itemVariants({ size: "sm" }), it.current && "font-medium"), children: _jsx(SmartLink, { href: it.href, "aria-current": it.current ? "page" : undefined, children: _jsx("span", { className: "min-w-0 flex-1 truncate", children: it.label }) }) }, i))) }) }) })] }));
84
+ }
85
+ const iconTrigger = "inline-flex size-6 items-center justify-center rounded-ui-sm text-fg-subtle transition-colors hover:bg-hover hover:text-fg focus-ring data-[state=open]:bg-hover data-[state=open]:text-fg";
86
+ /** "…" for collapsed crumbs; opens a menu with the hidden pages. */
87
+ export const BreadcrumbEllipsis = React.forwardRef(function BreadcrumbEllipsis({ items, labels, className, ...props }, ref) {
88
+ const t = useLabels("breadcrumb", breadcrumbLabels, labels);
89
+ if (!items?.length) {
90
+ return (_jsxs("span", { "data-slot": "breadcrumb-ellipsis", className: "inline-flex size-6 items-center justify-center text-fg-subtle", children: [_jsx(MoreHorizontal, { "aria-hidden": true }), _jsx("span", { className: "sr-only", children: t("showHidden") })] }));
91
+ }
92
+ return (_jsx(CrumbMenu, { items: items, trigger: _jsx("button", { ref: ref, type: "button", "data-slot": "breadcrumb-ellipsis", "aria-label": t("showHidden"), className: cn(iconTrigger, className), ...props, children: _jsx(MoreHorizontal, { "aria-hidden": true }) }) }));
93
+ });
94
+ /** A small ▾ after a crumb that jumps to its siblings. */
95
+ export function BreadcrumbSiblings({ label, items, labels }) {
96
+ const t = useLabels("breadcrumb", breadcrumbLabels, labels);
97
+ const name = t("siblings", { label: typeof label === "string" ? label : "" }).trim();
98
+ return (_jsx(CrumbMenu, { items: items, trigger: _jsx("button", { type: "button", "data-slot": "breadcrumb-siblings", "aria-label": name, className: cn(iconTrigger, "size-5 [&_svg]:size-3!"), children: _jsx(ChevronsUpDown, { "aria-hidden": true }) }) }));
99
+ }
100
+ function BreadcrumbJsonLd({ items, baseUrl = "" }) {
101
+ const list = items
102
+ .filter((i) => i.href && typeof i.label === "string")
103
+ .map((i, n) => ({ "@type": "ListItem", position: n + 1, name: i.label, item: /^https?:/.test(i.href) ? i.href : `${baseUrl.replace(/\/$/, "")}${i.href}` }));
104
+ const json = JSON.stringify({ "@context": "https://schema.org", "@type": "BreadcrumbList", itemListElement: list }).replace(/</g, "\\u003c");
105
+ return _jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: json } });
106
+ }
@@ -0,0 +1,52 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ import { type ButtonProps } from "./button.js";
4
+ /**
5
+ * Merged-edge styling for any row of controls. Corner rounding is done with logical
6
+ * properties (`rounded-s` / `rounded-e`), so the group is RTL-safe.
7
+ */
8
+ export declare const buttonGroupVariants: (props?: ({
9
+ orientation?: "vertical" | "horizontal" | null | undefined;
10
+ attached?: boolean | null | undefined;
11
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
+ type GroupSize = "xs" | "sm" | "md" | "lg";
13
+ export interface ButtonGroupProps extends React.HTMLAttributes<HTMLDivElement>, Omit<VariantProps<typeof buttonGroupVariants>, "attached" | "orientation"> {
14
+ /** Merged borders (default). `false` keeps a small gap between the buttons. */
15
+ attached?: boolean;
16
+ orientation?: "horizontal" | "vertical";
17
+ /** Default variant for direct Button / IconButton children that don't set one. */
18
+ variant?: ButtonProps["variant"];
19
+ /** Default size for direct Button / IconButton children that don't set one. */
20
+ size?: GroupSize;
21
+ }
22
+ /**
23
+ * Related buttons merged into one control: split "Save ▾", pager arrows, an editor toolbar,
24
+ * a search field + "Go". `role="group"` — give it an `aria-label`. Every button stays its own
25
+ * tab stop. Server-compatible.
26
+ *
27
+ * ```tsx
28
+ * <ButtonGroup aria-label="Pagination" size="sm">
29
+ * <IconButton label="Previous page"><ChevronLeft /></IconButton>
30
+ * <ButtonGroupText>21–40 of 340</ButtonGroupText>
31
+ * <IconButton label="Next page"><ChevronRight /></IconButton>
32
+ * </ButtonGroup>
33
+ * ```
34
+ *
35
+ * For a selected state (view switch, text alignment) use `ToggleGroup`; for a form value use
36
+ * `RadioGroup variant="segmented"`.
37
+ */
38
+ export declare const ButtonGroup: React.ForwardRefExoticComponent<ButtonGroupProps & React.RefAttributes<HTMLDivElement>>;
39
+ export interface ButtonGroupSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
40
+ orientation?: "horizontal" | "vertical";
41
+ }
42
+ /**
43
+ * Hairline between two attached buttons that share a fill (a primary split button), where
44
+ * the merged border would otherwise disappear.
45
+ */
46
+ export declare const ButtonGroupSeparator: React.ForwardRefExoticComponent<ButtonGroupSeparatorProps & React.RefAttributes<HTMLDivElement>>;
47
+ export interface ButtonGroupTextProps extends React.HTMLAttributes<HTMLSpanElement> {
48
+ size?: GroupSize;
49
+ }
50
+ /** A static segment inside a group: "21–40 of 340", a unit, a prefix. */
51
+ export declare const ButtonGroupText: React.ForwardRefExoticComponent<ButtonGroupTextProps & React.RefAttributes<HTMLSpanElement>>;
52
+ export {};
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../lib/cn.js";
5
+ import { Button, IconButton } from "./button.js";
6
+ /**
7
+ * Merged-edge styling for any row of controls. Corner rounding is done with logical
8
+ * properties (`rounded-s` / `rounded-e`), so the group is RTL-safe.
9
+ */
10
+ export const buttonGroupVariants = cva("relative isolate inline-flex w-fit max-w-full", {
11
+ variants: {
12
+ orientation: {
13
+ horizontal: "flex-row items-stretch",
14
+ vertical: "flex-col items-stretch",
15
+ },
16
+ attached: {
17
+ true: "[&>*:focus-visible]:z-10 [&>*:focus-within]:z-10 [&>*:hover]:z-[1] [&>[data-slot=button]]:shadow-none!",
18
+ false: "gap-2",
19
+ },
20
+ },
21
+ compoundVariants: [
22
+ {
23
+ orientation: "horizontal",
24
+ attached: true,
25
+ className: "[&>*:not(:first-child)]:rounded-s-none [&>*:not(:last-child)]:rounded-e-none [&>*:not(:first-child)]:-ms-px [&>[data-slot=button-group-separator]+*]:ms-0",
26
+ },
27
+ {
28
+ orientation: "vertical",
29
+ attached: true,
30
+ className: "[&>*:not(:first-child)]:rounded-t-none [&>*:not(:last-child)]:rounded-b-none [&>*:not(:first-child)]:-mt-px [&>[data-slot=button-group-separator]+*]:mt-0",
31
+ },
32
+ ],
33
+ defaultVariants: { orientation: "horizontal", attached: true },
34
+ });
35
+ /**
36
+ * Related buttons merged into one control: split "Save ▾", pager arrows, an editor toolbar,
37
+ * a search field + "Go". `role="group"` — give it an `aria-label`. Every button stays its own
38
+ * tab stop. Server-compatible.
39
+ *
40
+ * ```tsx
41
+ * <ButtonGroup aria-label="Pagination" size="sm">
42
+ * <IconButton label="Previous page"><ChevronLeft /></IconButton>
43
+ * <ButtonGroupText>21–40 of 340</ButtonGroupText>
44
+ * <IconButton label="Next page"><ChevronRight /></IconButton>
45
+ * </ButtonGroup>
46
+ * ```
47
+ *
48
+ * For a selected state (view switch, text alignment) use `ToggleGroup`; for a form value use
49
+ * `RadioGroup variant="segmented"`.
50
+ */
51
+ export const ButtonGroup = React.forwardRef(function ButtonGroup({ attached = true, orientation = "horizontal", variant, size, className, children, ...props }, ref) {
52
+ const content = variant || size
53
+ ? React.Children.map(children, (child) => {
54
+ if (!React.isValidElement(child))
55
+ return child;
56
+ if (child.type !== Button && child.type !== IconButton)
57
+ return child;
58
+ const p = child.props;
59
+ return React.cloneElement(child, {
60
+ variant: p.variant ?? variant,
61
+ size: p.size ?? size,
62
+ });
63
+ })
64
+ : children;
65
+ return (_jsx("div", { ref: ref, role: "group", "data-slot": "button-group", "data-orientation": orientation, "data-attached": attached ? "" : undefined, "data-variant": variant, className: cn(buttonGroupVariants({ orientation, attached }), variant === "primary" && "[--group-sep:color-mix(in_srgb,var(--accent-fg)_22%,transparent)]", className), ...props, children: content }));
66
+ });
67
+ /**
68
+ * Hairline between two attached buttons that share a fill (a primary split button), where
69
+ * the merged border would otherwise disappear.
70
+ */
71
+ export const ButtonGroupSeparator = React.forwardRef(function ButtonGroupSeparator({ orientation = "vertical", className, ...props }, ref) {
72
+ return (_jsx("div", { ref: ref, "aria-hidden": true, "data-slot": "button-group-separator", className: cn("relative z-20 shrink-0 self-stretch bg-(--group-sep,var(--field-border))", orientation === "vertical" ? "w-px" : "h-px", className), ...props }));
73
+ });
74
+ /** A static segment inside a group: "21–40 of 340", a unit, a prefix. */
75
+ export const ButtonGroupText = React.forwardRef(function ButtonGroupText({ size = "md", className, ...props }, ref) {
76
+ return (_jsx("span", { ref: ref, "data-slot": "button-group-text", className: cn("inline-flex shrink-0 items-center whitespace-nowrap border border-field-border bg-surface-2 font-medium tabular text-fg-muted [&_svg]:size-4", size === "xs" ? "h-7 rounded-ui-sm px-2.5 text-xs" : size === "sm" ? "h-8 rounded-ui-sm px-3 text-[13px]" : size === "lg" ? "h-12 rounded-ui px-5 text-[15px]" : "h-(--control-h) rounded-ui px-3.5 text-sm", className), ...props }));
77
+ });
@@ -0,0 +1,58 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ import { type TooltipContentProps } from "./tooltip.js";
4
+ export declare const buttonVariants: (props?: ({
5
+ variant?: "link" | "danger" | "ghost" | "solid" | "primary" | "secondary" | "soft" | "danger-ghost" | null | undefined;
6
+ size?: "sm" | "md" | "lg" | "xl" | "icon" | "xs" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
7
+ block?: boolean | null | undefined;
8
+ pill?: boolean | null | undefined;
9
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
10
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
11
+ /** Render as the child element (e.g. Next <Link>), keeping the styles. */
12
+ asChild?: boolean;
13
+ /** Spinner, `aria-busy` and click lock. */
14
+ loading?: boolean;
15
+ /** Text shown (and announced) while loading, e.g. "Saving…". Replaces the label. */
16
+ loadingText?: string;
17
+ /**
18
+ * `"inline"` (default): the spinner sits before the label (replacing a leading icon).
19
+ * `"replace"`: the label is hidden and the spinner centred — the width never changes.
20
+ */
21
+ loadingMode?: "inline" | "replace";
22
+ }
23
+ /**
24
+ * Starts an action. One `primary` per screen; the rest `secondary` or `ghost`.
25
+ *
26
+ * ```tsx
27
+ * <Button variant="primary" loading={saving} loadingText="Publishing…">Publish</Button>
28
+ * <Button asChild><Link href="/posts/new">New post</Link></Button>
29
+ * ```
30
+ *
31
+ * Defaults to `type="button"` (no accidental form submits). With `asChild` + `disabled`/`loading`
32
+ * the element gets `aria-disabled`, leaves the tab order and ignores clicks.
33
+ */
34
+ export declare const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;
35
+ export interface IconButtonProps extends Omit<ButtonProps, "size" | "aria-label" | "loadingText" | "loadingMode"> {
36
+ /** Accessible name — required for icon-only controls. Also shown as the tooltip. */
37
+ label: string;
38
+ size?: "xs" | "sm" | "md" | "lg";
39
+ /**
40
+ * Tooltip text. Default: `label`. A string shows different text (the accessible name stays `label`);
41
+ * `false` turns the tooltip off and uses the native `title` instead.
42
+ * Inside a `TooltipProvider` (App shell ships one) the label is a Tooltip; without one it falls back to `title`.
43
+ */
44
+ tooltip?: boolean | string;
45
+ /** Side the tooltip opens on. Default `"top"`. */
46
+ tooltipSide?: TooltipContentProps["side"];
47
+ /** Shortcut hint in the tooltip, e.g. `"mod+e"`. */
48
+ shortcut?: string | string[];
49
+ }
50
+ /**
51
+ * Icon-only button. `label` is required: it becomes the accessible name and the tooltip.
52
+ *
53
+ * ```tsx
54
+ * <IconButton label="Delete post" variant="danger-ghost"><Trash2 /></IconButton>
55
+ * <IconButton label="Edit" shortcut="mod+e"><Pencil /></IconButton>
56
+ * ```
57
+ */
58
+ export declare const IconButton: React.ForwardRefExoticComponent<IconButtonProps & React.RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,107 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { Slot } from "radix-ui";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../lib/cn.js";
6
+ import { Spinner } from "./spinner.js";
7
+ import { IconButtonTooltip } from "./tooltip.js";
8
+ export const buttonVariants = cva([
9
+ "relative inline-flex shrink-0 select-none items-center justify-center whitespace-nowrap font-medium",
10
+ "transition-[background-color,border-color,box-shadow,color,filter,opacity] duration-150 focus-ring",
11
+ "disabled:pointer-events-none disabled:opacity-45 aria-disabled:pointer-events-none aria-disabled:opacity-45",
12
+ "motion-safe:active:translate-y-px [&_svg]:shrink-0",
13
+ // loading: the spinner replaces a leading icon instead of adding a second one
14
+ "[&[data-loading]>[data-slot=spinner]+svg]:hidden",
15
+ ], {
16
+ variants: {
17
+ variant: {
18
+ /** The one loud action on a screen. */
19
+ primary: "bg-accent text-accent-fg font-semibold shadow-[inset_0_1px_0_rgb(255_255_255/0.35),0_1px_2px_rgb(0_0_0/0.12)] ring-1 ring-[color-mix(in_srgb,var(--fg)_10%,transparent)] hover:brightness-[1.04]",
20
+ /** Default: a calm action on a surface. */
21
+ secondary: "border border-field-border bg-field text-fg shadow-[0_1px_1px_rgb(0_0_0/0.04)] hover:border-field-border-hover hover:bg-hover glass:border-field-border-hover",
22
+ ghost: "text-fg hover:bg-hover",
23
+ soft: "bg-accent-soft text-accent-ink hover:brightness-95",
24
+ /** Dark, typographic action for decisive steps ("Publish"). */
25
+ solid: "bg-fg text-scene hover:opacity-90",
26
+ danger: "bg-danger-solid text-white shadow-sm hover:brightness-110",
27
+ "danger-ghost": "text-danger hover:bg-[color-mix(in_srgb,var(--danger)_10%,transparent)]",
28
+ link: "h-auto! p-0! text-accent-ink underline-offset-4 hover:underline",
29
+ },
30
+ size: {
31
+ xs: "h-7 gap-1 rounded-ui-sm px-2.5 text-xs [&_svg]:size-3.5",
32
+ sm: "h-8 gap-1.5 rounded-ui-sm px-3 text-[13px] [&_svg]:size-3.5",
33
+ md: "h-(--control-h) gap-2 rounded-ui px-4 text-sm [&_svg]:size-4",
34
+ lg: "h-12 gap-2.5 rounded-ui px-6 text-[15px] [&_svg]:size-[18px]",
35
+ /** Hero / website CTA. */
36
+ xl: "h-14 gap-3 rounded-ui px-8 text-base [&_svg]:size-5",
37
+ "icon-xs": "size-7 rounded-ui-sm [&_svg]:size-3.5",
38
+ "icon-sm": "size-8 rounded-ui-sm [&_svg]:size-4",
39
+ icon: "size-(--control-h) rounded-ui [&_svg]:size-[18px]",
40
+ "icon-lg": "size-12 rounded-ui [&_svg]:size-5",
41
+ },
42
+ block: { true: "w-full" },
43
+ pill: { true: "rounded-full!" },
44
+ },
45
+ defaultVariants: { variant: "secondary", size: "md" },
46
+ });
47
+ const spinnerSize = (size) => (size === "xs" || size === "sm" || size === "icon-xs" ? "xs" : size === "lg" || size === "xl" || size === "icon-lg" ? "md" : "sm");
48
+ /**
49
+ * Starts an action. One `primary` per screen; the rest `secondary` or `ghost`.
50
+ *
51
+ * ```tsx
52
+ * <Button variant="primary" loading={saving} loadingText="Publishing…">Publish</Button>
53
+ * <Button asChild><Link href="/posts/new">New post</Link></Button>
54
+ * ```
55
+ *
56
+ * Defaults to `type="button"` (no accidental form submits). With `asChild` + `disabled`/`loading`
57
+ * the element gets `aria-disabled`, leaves the tab order and ignores clicks.
58
+ */
59
+ export const Button = React.forwardRef(function Button({ className, variant, size, block, pill, asChild, loading, loadingText, loadingMode = "inline", disabled, children, type, onClick, ...props }, ref) {
60
+ const classes = cn(buttonVariants({ variant, size, block, pill }), className);
61
+ const state = {
62
+ "data-slot": "button",
63
+ "data-variant": variant ?? "secondary",
64
+ "data-size": size ?? "md",
65
+ "data-loading": loading ? "" : undefined,
66
+ "aria-busy": loading || undefined,
67
+ };
68
+ const spinner = _jsx(Spinner, { size: spinnerSize(size), className: loadingMode === "replace" ? "absolute" : undefined });
69
+ if (asChild) {
70
+ const inert = disabled || loading;
71
+ const slotProps = {
72
+ ref,
73
+ className: classes,
74
+ ...state,
75
+ "aria-disabled": inert || undefined,
76
+ tabIndex: inert ? -1 : undefined,
77
+ // No wrapper function here, so Button stays usable from server components. While inert the
78
+ // element leaves the tab order and `aria-disabled:pointer-events-none` blocks pointer clicks.
79
+ onClick: inert ? undefined : onClick,
80
+ ...props,
81
+ };
82
+ // Slot needs the spinner and the Slottable as direct children (no fragment).
83
+ return loading ? (_jsxs(Slot.Root, { ...slotProps, children: [spinner, _jsx(Slot.Slottable, { children: children })] })) : (_jsx(Slot.Root, { ...slotProps, children: children }));
84
+ }
85
+ let content = children;
86
+ if (loading && loadingText)
87
+ content = loadingMode === "replace" ? _jsxs(_Fragment, { children: [_jsx("span", { className: "invisible", children: children }), _jsx("span", { className: "sr-only", children: loadingText })] }) : loadingText;
88
+ // opacity-0 (not visibility:hidden) keeps the label in the accessibility tree, so the busy button keeps its name.
89
+ else if (loading && loadingMode === "replace")
90
+ content = _jsx("span", { className: "inline-flex items-center gap-[inherit] opacity-0", children: children });
91
+ return (_jsxs("button", { ref: ref, type: type ?? "button", className: classes, disabled: disabled || loading, onClick: onClick, ...state, ...props, children: [loading ? spinner : null, content] }));
92
+ });
93
+ const iconSize = { xs: "icon-xs", sm: "icon-sm", md: "icon", lg: "icon-lg" };
94
+ /**
95
+ * Icon-only button. `label` is required: it becomes the accessible name and the tooltip.
96
+ *
97
+ * ```tsx
98
+ * <IconButton label="Delete post" variant="danger-ghost"><Trash2 /></IconButton>
99
+ * <IconButton label="Edit" shortcut="mod+e"><Pencil /></IconButton>
100
+ * ```
101
+ */
102
+ export const IconButton = React.forwardRef(function IconButton({ label, size = "md", variant = "ghost", title, loading, tooltip = true, tooltipSide, shortcut, children, ...props }, ref) {
103
+ if (tooltip === false) {
104
+ return (_jsx(Button, { ref: ref, "aria-label": label, title: title ?? label, variant: variant, size: iconSize[size], loading: loading, loadingMode: "replace", ...props, children: children }));
105
+ }
106
+ return (_jsx(IconButtonTooltip, { label: typeof tooltip === "string" ? tooltip : label, side: tooltipSide, shortcut: shortcut, children: _jsx(Button, { ref: ref, "aria-label": label, ...(title !== undefined ? { title } : null), variant: variant, size: iconSize[size], loading: loading, loadingMode: "replace", ...props, children: children }) }));
107
+ });