@vamos-ui/react 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/dist/blocks/block-heading.d.ts +29 -0
  4. package/dist/blocks/block-heading.js +39 -0
  5. package/dist/blocks/block-image.d.ts +52 -0
  6. package/dist/blocks/block-image.js +48 -0
  7. package/dist/blocks/block-link.d.ts +30 -0
  8. package/dist/blocks/block-link.js +36 -0
  9. package/dist/blocks/create-blocks.d.ts +54 -0
  10. package/dist/blocks/create-blocks.js +52 -0
  11. package/dist/blocks/index.d.ts +55 -0
  12. package/dist/blocks/index.js +59 -0
  13. package/dist/blocks/json-ld.d.ts +18 -0
  14. package/dist/blocks/json-ld.js +44 -0
  15. package/dist/blocks/labels.d.ts +20 -0
  16. package/dist/blocks/labels.js +43 -0
  17. package/dist/blocks/rich-text.d.ts +36 -0
  18. package/dist/blocks/rich-text.js +106 -0
  19. package/dist/blocks/schema/define-block.d.ts +151 -0
  20. package/dist/blocks/schema/define-block.js +120 -0
  21. package/dist/blocks/schema/emphasis.d.ts +17 -0
  22. package/dist/blocks/schema/emphasis.js +69 -0
  23. package/dist/blocks/schema/fields.d.ts +497 -0
  24. package/dist/blocks/schema/fields.js +240 -0
  25. package/dist/blocks/schema/icons.d.ts +2 -0
  26. package/dist/blocks/schema/icons.js +26 -0
  27. package/dist/blocks/schema/index.d.ts +18 -0
  28. package/dist/blocks/schema/index.js +21 -0
  29. package/dist/blocks/schema/lint-types.d.ts +16 -0
  30. package/dist/blocks/schema/lint-types.js +2 -0
  31. package/dist/blocks/schema/lint.d.ts +32 -0
  32. package/dist/blocks/schema/lint.js +164 -0
  33. package/dist/blocks/schema/localize.d.ts +20 -0
  34. package/dist/blocks/schema/localize.js +29 -0
  35. package/dist/blocks/schema/localized.d.ts +25 -0
  36. package/dist/blocks/schema/localized.js +53 -0
  37. package/dist/blocks/schema/migrate.d.ts +24 -0
  38. package/dist/blocks/schema/migrate.js +75 -0
  39. package/dist/blocks/schema/nodes.d.ts +196 -0
  40. package/dist/blocks/schema/nodes.js +78 -0
  41. package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
  42. package/dist/blocks/schema/rich-doc-schema.js +66 -0
  43. package/dist/blocks/schema/rich-doc.d.ts +90 -0
  44. package/dist/blocks/schema/rich-doc.js +62 -0
  45. package/dist/blocks/schema/safety.d.ts +20 -0
  46. package/dist/blocks/schema/safety.js +49 -0
  47. package/dist/blocks/schema/types.d.ts +172 -0
  48. package/dist/blocks/schema/types.js +3 -0
  49. package/dist/blocks/schema/validate.d.ts +17 -0
  50. package/dist/blocks/schema/validate.js +32 -0
  51. package/dist/blocks/schema/walk.d.ts +22 -0
  52. package/dist/blocks/schema/walk.js +60 -0
  53. package/dist/blocks/section-header.d.ts +38 -0
  54. package/dist/blocks/section-header.js +22 -0
  55. package/dist/blocks/section.d.ts +59 -0
  56. package/dist/blocks/section.js +66 -0
  57. package/dist/blocks/site/_kit-1.d.ts +101 -0
  58. package/dist/blocks/site/_kit-1.js +137 -0
  59. package/dist/blocks/site/_site-icon-1.d.ts +6 -0
  60. package/dist/blocks/site/_site-icon-1.js +15 -0
  61. package/dist/blocks/site/announcement-bar.d.ts +42 -0
  62. package/dist/blocks/site/announcement-bar.js +38 -0
  63. package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
  64. package/dist/blocks/site/announcement-dismiss.js +28 -0
  65. package/dist/blocks/site/article-layout.d.ts +65 -0
  66. package/dist/blocks/site/article-layout.js +88 -0
  67. package/dist/blocks/site/blog-list.d.ts +79 -0
  68. package/dist/blocks/site/blog-list.js +78 -0
  69. package/dist/blocks/site/comparison-table.d.ts +54 -0
  70. package/dist/blocks/site/comparison-table.js +38 -0
  71. package/dist/blocks/site/consent-banner.d.ts +52 -0
  72. package/dist/blocks/site/consent-banner.js +33 -0
  73. package/dist/blocks/site/contact-dock.d.ts +52 -0
  74. package/dist/blocks/site/contact-dock.js +55 -0
  75. package/dist/blocks/site/contact-form.d.ts +60 -0
  76. package/dist/blocks/site/contact-form.js +45 -0
  77. package/dist/blocks/site/cta-booking.d.ts +43 -0
  78. package/dist/blocks/site/cta-booking.js +69 -0
  79. package/dist/blocks/site/cta.d.ts +74 -0
  80. package/dist/blocks/site/cta.js +113 -0
  81. package/dist/blocks/site/embed-facade.d.ts +20 -0
  82. package/dist/blocks/site/embed-facade.js +21 -0
  83. package/dist/blocks/site/faq.d.ts +48 -0
  84. package/dist/blocks/site/faq.js +52 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +50 -0
  87. package/dist/blocks/site/feature-tabs.d.ts +22 -0
  88. package/dist/blocks/site/feature-tabs.js +11 -0
  89. package/dist/blocks/site/footer.d.ts +68 -0
  90. package/dist/blocks/site/footer.js +61 -0
  91. package/dist/blocks/site/gallery-section.d.ts +42 -0
  92. package/dist/blocks/site/gallery-section.js +48 -0
  93. package/dist/blocks/site/hero-video.d.ts +15 -0
  94. package/dist/blocks/site/hero-video.js +31 -0
  95. package/dist/blocks/site/hero.d.ts +64 -0
  96. package/dist/blocks/site/hero.js +73 -0
  97. package/dist/blocks/site/logo-strip.d.ts +44 -0
  98. package/dist/blocks/site/logo-strip.js +27 -0
  99. package/dist/blocks/site/map-hours.d.ts +83 -0
  100. package/dist/blocks/site/map-hours.js +125 -0
  101. package/dist/blocks/site/media-text.d.ts +45 -0
  102. package/dist/blocks/site/media-text.js +56 -0
  103. package/dist/blocks/site/menu-list.d.ts +74 -0
  104. package/dist/blocks/site/menu-list.js +84 -0
  105. package/dist/blocks/site/navbar-submenu.d.ts +18 -0
  106. package/dist/blocks/site/navbar-submenu.js +51 -0
  107. package/dist/blocks/site/navbar.d.ts +67 -0
  108. package/dist/blocks/site/navbar.js +64 -0
  109. package/dist/blocks/site/not-found.d.ts +40 -0
  110. package/dist/blocks/site/not-found.js +38 -0
  111. package/dist/blocks/site/page-intro.d.ts +46 -0
  112. package/dist/blocks/site/page-intro.js +44 -0
  113. package/dist/blocks/site/pricing-table.d.ts +67 -0
  114. package/dist/blocks/site/pricing-table.js +83 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +42 -0
  117. package/dist/blocks/site/registry-1.d.ts +720 -0
  118. package/dist/blocks/site/registry-1.js +783 -0
  119. package/dist/blocks/site/registry-2.d.ts +914 -0
  120. package/dist/blocks/site/registry-2.js +563 -0
  121. package/dist/blocks/site/rich-text-section.d.ts +34 -0
  122. package/dist/blocks/site/rich-text-section.js +32 -0
  123. package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
  124. package/dist/blocks/site/shared/brand-icons.js +56 -0
  125. package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
  126. package/dist/blocks/site/shared/consent-gate.js +43 -0
  127. package/dist/blocks/site/shared/consent-island.d.ts +38 -0
  128. package/dist/blocks/site/shared/consent-island.js +63 -0
  129. package/dist/blocks/site/shared/consent.d.ts +49 -0
  130. package/dist/blocks/site/shared/consent.js +130 -0
  131. package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
  132. package/dist/blocks/site/shared/contact-form-island.js +100 -0
  133. package/dist/blocks/site/shared/copy-link.d.ts +10 -0
  134. package/dist/blocks/site/shared/copy-link.js +25 -0
  135. package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
  136. package/dist/blocks/site/shared/dock-avoid.js +107 -0
  137. package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
  138. package/dist/blocks/site/shared/dock-hours.js +25 -0
  139. package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
  140. package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
  141. package/dist/blocks/site/shared/island-keys.d.ts +10 -0
  142. package/dist/blocks/site/shared/island-keys.js +44 -0
  143. package/dist/blocks/site/shared/kit-2.d.ts +55 -0
  144. package/dist/blocks/site/shared/kit-2.js +84 -0
  145. package/dist/blocks/site/shared/labels-2.d.ts +209 -0
  146. package/dist/blocks/site/shared/labels-2.js +427 -0
  147. package/dist/blocks/site/shared/open-now.d.ts +22 -0
  148. package/dist/blocks/site/shared/open-now.js +27 -0
  149. package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
  150. package/dist/blocks/site/shared/opening-hours.js +245 -0
  151. package/dist/blocks/site/shared/site-accent.d.ts +48 -0
  152. package/dist/blocks/site/shared/site-accent.js +249 -0
  153. package/dist/blocks/site/shared/site-form.d.ts +79 -0
  154. package/dist/blocks/site/shared/site-form.js +111 -0
  155. package/dist/blocks/site/shared/site-routing.d.ts +54 -0
  156. package/dist/blocks/site/shared/site-routing.js +86 -0
  157. package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
  158. package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
  159. package/dist/blocks/site/site-shell.d.ts +108 -0
  160. package/dist/blocks/site/site-shell.js +254 -0
  161. package/dist/blocks/site/stats-band.d.ts +42 -0
  162. package/dist/blocks/site/stats-band.js +45 -0
  163. package/dist/blocks/site/team.d.ts +44 -0
  164. package/dist/blocks/site/team.js +48 -0
  165. package/dist/blocks/site/testimonials.d.ts +68 -0
  166. package/dist/blocks/site/testimonials.js +66 -0
  167. package/dist/blocks/types.d.ts +63 -0
  168. package/dist/blocks/types.js +2 -0
  169. package/dist/business/approval-flow.d.ts +152 -0
  170. package/dist/business/approval-flow.js +221 -0
  171. package/dist/business/export-core.d.ts +55 -0
  172. package/dist/business/export-core.js +101 -0
  173. package/dist/business/export.d.ts +148 -0
  174. package/dist/business/export.js +264 -0
  175. package/dist/business/import-core.d.ts +104 -0
  176. package/dist/business/import-core.js +281 -0
  177. package/dist/business/import-wizard.d.ts +186 -0
  178. package/dist/business/import-wizard.js +401 -0
  179. package/dist/business/index.d.ts +12 -0
  180. package/dist/business/index.js +22 -0
  181. package/dist/business/line-items-core.d.ts +129 -0
  182. package/dist/business/line-items-core.js +183 -0
  183. package/dist/business/line-items.d.ts +119 -0
  184. package/dist/business/line-items.js +299 -0
  185. package/dist/business/multi-step-form.d.ts +131 -0
  186. package/dist/business/multi-step-form.js +337 -0
  187. package/dist/business/permission-core.d.ts +59 -0
  188. package/dist/business/permission-core.js +99 -0
  189. package/dist/business/permission-matrix.d.ts +158 -0
  190. package/dist/business/permission-matrix.js +341 -0
  191. package/dist/business/setup-checklist.d.ts +80 -0
  192. package/dist/business/setup-checklist.js +92 -0
  193. package/dist/business/signer-status.d.ts +53 -0
  194. package/dist/business/signer-status.js +76 -0
  195. package/dist/charts/area-chart.d.ts +35 -0
  196. package/dist/charts/area-chart.js +33 -0
  197. package/dist/charts/bar-chart.d.ts +27 -0
  198. package/dist/charts/bar-chart.js +46 -0
  199. package/dist/charts/bar-list.d.ts +47 -0
  200. package/dist/charts/bar-list.js +60 -0
  201. package/dist/charts/chart-shell.d.ts +173 -0
  202. package/dist/charts/chart-shell.js +205 -0
  203. package/dist/charts/chart.d.ts +73 -0
  204. package/dist/charts/chart.js +106 -0
  205. package/dist/charts/combo-chart.d.ts +29 -0
  206. package/dist/charts/combo-chart.js +47 -0
  207. package/dist/charts/donut-chart.d.ts +33 -0
  208. package/dist/charts/donut-chart.js +113 -0
  209. package/dist/charts/funnel.d.ts +51 -0
  210. package/dist/charts/funnel.js +69 -0
  211. package/dist/charts/gauge.d.ts +62 -0
  212. package/dist/charts/gauge.js +104 -0
  213. package/dist/charts/heatmap.d.ts +81 -0
  214. package/dist/charts/heatmap.js +338 -0
  215. package/dist/charts/index.d.ts +12 -0
  216. package/dist/charts/index.js +14 -0
  217. package/dist/charts/line-chart.d.ts +21 -0
  218. package/dist/charts/line-chart.js +36 -0
  219. package/dist/charts/test-utils.d.ts +2 -0
  220. package/dist/charts/test-utils.js +38 -0
  221. package/dist/charts/utils.d.ts +130 -0
  222. package/dist/charts/utils.js +262 -0
  223. package/dist/components/_qr-core.d.ts +26 -0
  224. package/dist/components/_qr-core.js +376 -0
  225. package/dist/components/accordion.d.ts +47 -0
  226. package/dist/components/accordion.js +70 -0
  227. package/dist/components/activity-timeline.d.ts +149 -0
  228. package/dist/components/activity-timeline.js +122 -0
  229. package/dist/components/address-field.d.ts +116 -0
  230. package/dist/components/address-field.js +219 -0
  231. package/dist/components/alert-dialog.d.ts +99 -0
  232. package/dist/components/alert-dialog.js +192 -0
  233. package/dist/components/alert.d.ts +42 -0
  234. package/dist/components/alert.js +82 -0
  235. package/dist/components/app-shell.d.ts +159 -0
  236. package/dist/components/app-shell.js +289 -0
  237. package/dist/components/attachment-list.d.ts +96 -0
  238. package/dist/components/attachment-list.js +196 -0
  239. package/dist/components/audit-log.d.ts +150 -0
  240. package/dist/components/audit-log.js +205 -0
  241. package/dist/components/avatar.d.ts +87 -0
  242. package/dist/components/avatar.js +126 -0
  243. package/dist/components/backup-codes.d.ts +42 -0
  244. package/dist/components/backup-codes.js +67 -0
  245. package/dist/components/badge.d.ts +41 -0
  246. package/dist/components/badge.js +68 -0
  247. package/dist/components/breadcrumb.d.ts +78 -0
  248. package/dist/components/breadcrumb.js +106 -0
  249. package/dist/components/button-group.d.ts +52 -0
  250. package/dist/components/button-group.js +77 -0
  251. package/dist/components/button.d.ts +58 -0
  252. package/dist/components/button.js +107 -0
  253. package/dist/components/calendar.d.ts +240 -0
  254. package/dist/components/calendar.js +483 -0
  255. package/dist/components/card.d.ts +66 -0
  256. package/dist/components/card.js +76 -0
  257. package/dist/components/carousel.d.ts +170 -0
  258. package/dist/components/carousel.js +348 -0
  259. package/dist/components/checkbox.d.ts +78 -0
  260. package/dist/components/checkbox.js +138 -0
  261. package/dist/components/color-picker.d.ts +112 -0
  262. package/dist/components/color-picker.js +235 -0
  263. package/dist/components/combobox.d.ts +136 -0
  264. package/dist/components/combobox.js +294 -0
  265. package/dist/components/command.d.ts +281 -0
  266. package/dist/components/command.js +498 -0
  267. package/dist/components/comment-thread.d.ts +252 -0
  268. package/dist/components/comment-thread.js +449 -0
  269. package/dist/components/context-menu.d.ts +77 -0
  270. package/dist/components/context-menu.js +82 -0
  271. package/dist/components/currency-input.d.ts +43 -0
  272. package/dist/components/currency-input.js +85 -0
  273. package/dist/components/date-picker.d.ts +141 -0
  274. package/dist/components/date-picker.js +241 -0
  275. package/dist/components/date-range-picker.d.ts +91 -0
  276. package/dist/components/date-range-picker.js +251 -0
  277. package/dist/components/description-list.d.ts +92 -0
  278. package/dist/components/description-list.js +42 -0
  279. package/dist/components/dialog.d.ts +139 -0
  280. package/dist/components/dialog.js +185 -0
  281. package/dist/components/dropdown-menu.d.ts +100 -0
  282. package/dist/components/dropdown-menu.js +102 -0
  283. package/dist/components/editor-layout.d.ts +166 -0
  284. package/dist/components/editor-layout.js +237 -0
  285. package/dist/components/empty-state.d.ts +49 -0
  286. package/dist/components/empty-state.js +68 -0
  287. package/dist/components/entity-card.d.ts +83 -0
  288. package/dist/components/entity-card.js +92 -0
  289. package/dist/components/file-upload.d.ts +256 -0
  290. package/dist/components/file-upload.js +490 -0
  291. package/dist/components/formatted-input.d.ts +177 -0
  292. package/dist/components/formatted-input.js +399 -0
  293. package/dist/components/hierarchy-chart.d.ts +190 -0
  294. package/dist/components/hierarchy-chart.js +890 -0
  295. package/dist/components/hover-card.d.ts +21 -0
  296. package/dist/components/hover-card.js +32 -0
  297. package/dist/components/iban-input.d.ts +38 -0
  298. package/dist/components/iban-input.js +112 -0
  299. package/dist/components/id-input.d.ts +65 -0
  300. package/dist/components/id-input.js +130 -0
  301. package/dist/components/image.d.ts +130 -0
  302. package/dist/components/image.js +168 -0
  303. package/dist/components/input-otp.d.ts +62 -0
  304. package/dist/components/input-otp.js +73 -0
  305. package/dist/components/input.d.ts +141 -0
  306. package/dist/components/input.js +187 -0
  307. package/dist/components/item.d.ts +96 -0
  308. package/dist/components/item.js +113 -0
  309. package/dist/components/kbd.d.ts +64 -0
  310. package/dist/components/kbd.js +119 -0
  311. package/dist/components/list-layout.d.ts +144 -0
  312. package/dist/components/list-layout.js +210 -0
  313. package/dist/components/native-select.d.ts +33 -0
  314. package/dist/components/native-select.js +48 -0
  315. package/dist/components/navigation-menu.d.ts +127 -0
  316. package/dist/components/navigation-menu.js +129 -0
  317. package/dist/components/notification-center.d.ts +164 -0
  318. package/dist/components/notification-center.js +399 -0
  319. package/dist/components/page-header.d.ts +60 -0
  320. package/dist/components/page-header.js +60 -0
  321. package/dist/components/pagination.d.ts +121 -0
  322. package/dist/components/pagination.js +174 -0
  323. package/dist/components/phone-input.d.ts +49 -0
  324. package/dist/components/phone-input.js +266 -0
  325. package/dist/components/pin-map.d.ts +58 -0
  326. package/dist/components/pin-map.js +167 -0
  327. package/dist/components/popover.d.ts +38 -0
  328. package/dist/components/popover.js +69 -0
  329. package/dist/components/progress.d.ts +79 -0
  330. package/dist/components/progress.js +97 -0
  331. package/dist/components/qr-code.d.ts +36 -0
  332. package/dist/components/qr-code.js +27 -0
  333. package/dist/components/radio-group.d.ts +43 -0
  334. package/dist/components/radio-group.js +81 -0
  335. package/dist/components/record-detail-layout.d.ts +167 -0
  336. package/dist/components/record-detail-layout.js +233 -0
  337. package/dist/components/record-picker.d.ts +199 -0
  338. package/dist/components/record-picker.js +650 -0
  339. package/dist/components/resizable.d.ts +50 -0
  340. package/dist/components/resizable.js +88 -0
  341. package/dist/components/scroll-area.d.ts +40 -0
  342. package/dist/components/scroll-area.js +56 -0
  343. package/dist/components/select.d.ts +126 -0
  344. package/dist/components/select.js +137 -0
  345. package/dist/components/separator.d.ts +31 -0
  346. package/dist/components/separator.js +41 -0
  347. package/dist/components/settings-layout.d.ts +134 -0
  348. package/dist/components/settings-layout.js +180 -0
  349. package/dist/components/sheet.d.ts +103 -0
  350. package/dist/components/sheet.js +165 -0
  351. package/dist/components/sidebar.d.ts +171 -0
  352. package/dist/components/sidebar.js +421 -0
  353. package/dist/components/signature-pad.d.ts +85 -0
  354. package/dist/components/signature-pad.js +283 -0
  355. package/dist/components/skeleton.d.ts +64 -0
  356. package/dist/components/skeleton.js +53 -0
  357. package/dist/components/sla-timer.d.ts +75 -0
  358. package/dist/components/sla-timer.js +142 -0
  359. package/dist/components/slider.d.ts +57 -0
  360. package/dist/components/slider.js +133 -0
  361. package/dist/components/slug-input.d.ts +69 -0
  362. package/dist/components/slug-input.js +201 -0
  363. package/dist/components/sparkline.d.ts +54 -0
  364. package/dist/components/sparkline.js +122 -0
  365. package/dist/components/spinner.d.ts +34 -0
  366. package/dist/components/spinner.js +34 -0
  367. package/dist/components/stat.d.ts +135 -0
  368. package/dist/components/stat.js +130 -0
  369. package/dist/components/status-picker.d.ts +107 -0
  370. package/dist/components/status-picker.js +175 -0
  371. package/dist/components/stepper.d.ts +86 -0
  372. package/dist/components/stepper.js +103 -0
  373. package/dist/components/switch.d.ts +34 -0
  374. package/dist/components/switch.js +70 -0
  375. package/dist/components/table.d.ts +101 -0
  376. package/dist/components/table.js +72 -0
  377. package/dist/components/tabs.d.ts +103 -0
  378. package/dist/components/tabs.js +173 -0
  379. package/dist/components/tag-input.d.ts +77 -0
  380. package/dist/components/tag-input.js +305 -0
  381. package/dist/components/task-list.d.ts +89 -0
  382. package/dist/components/task-list.js +238 -0
  383. package/dist/components/time-picker.d.ts +119 -0
  384. package/dist/components/time-picker.js +399 -0
  385. package/dist/components/toast.d.ts +87 -0
  386. package/dist/components/toast.js +142 -0
  387. package/dist/components/toggle.d.ts +77 -0
  388. package/dist/components/toggle.js +109 -0
  389. package/dist/components/tooltip.d.ts +69 -0
  390. package/dist/components/tooltip.js +105 -0
  391. package/dist/components/top-bar.d.ts +87 -0
  392. package/dist/components/top-bar.js +99 -0
  393. package/dist/components/tour.d.ts +60 -0
  394. package/dist/components/tour.js +139 -0
  395. package/dist/components/tree-select.d.ts +89 -0
  396. package/dist/components/tree-select.js +243 -0
  397. package/dist/components/tree-view.d.ts +109 -0
  398. package/dist/components/tree-view.js +170 -0
  399. package/dist/components/typography.d.ts +107 -0
  400. package/dist/components/typography.js +128 -0
  401. package/dist/components/user-picker.d.ts +89 -0
  402. package/dist/components/user-picker.js +162 -0
  403. package/dist/components/version-history.d.ts +191 -0
  404. package/dist/components/version-history.js +431 -0
  405. package/dist/data-table/csv.d.ts +27 -0
  406. package/dist/data-table/csv.js +68 -0
  407. package/dist/data-table/data-table.d.ts +423 -0
  408. package/dist/data-table/data-table.js +1259 -0
  409. package/dist/data-table/filter-bar.d.ts +146 -0
  410. package/dist/data-table/filter-bar.js +569 -0
  411. package/dist/data-table/filter-fns.d.ts +65 -0
  412. package/dist/data-table/filter-fns.js +382 -0
  413. package/dist/data-table/index.d.ts +8 -0
  414. package/dist/data-table/index.js +9 -0
  415. package/dist/data-table/saved-views.d.ts +100 -0
  416. package/dist/data-table/saved-views.js +251 -0
  417. package/dist/data-table/types.d.ts +168 -0
  418. package/dist/data-table/types.js +87 -0
  419. package/dist/data-table/url-state.d.ts +94 -0
  420. package/dist/data-table/url-state.js +303 -0
  421. package/dist/data-table/view-state.d.ts +16 -0
  422. package/dist/data-table/view-state.js +81 -0
  423. package/dist/editor/_test-setup.d.ts +1 -0
  424. package/dist/editor/_test-setup.js +33 -0
  425. package/dist/editor/block-editor.d.ts +137 -0
  426. package/dist/editor/block-editor.js +280 -0
  427. package/dist/editor/commands.d.ts +31 -0
  428. package/dist/editor/commands.js +150 -0
  429. package/dist/editor/context.d.ts +108 -0
  430. package/dist/editor/context.js +30 -0
  431. package/dist/editor/convert.d.ts +66 -0
  432. package/dist/editor/convert.js +567 -0
  433. package/dist/editor/drag-handle.d.ts +10 -0
  434. package/dist/editor/drag-handle.js +69 -0
  435. package/dist/editor/extensions.d.ts +34 -0
  436. package/dist/editor/extensions.js +239 -0
  437. package/dist/editor/index.d.ts +14 -0
  438. package/dist/editor/index.js +17 -0
  439. package/dist/editor/inserter.d.ts +12 -0
  440. package/dist/editor/inserter.js +88 -0
  441. package/dist/editor/inspector.d.ts +17 -0
  442. package/dist/editor/inspector.js +65 -0
  443. package/dist/editor/items.d.ts +62 -0
  444. package/dist/editor/items.js +195 -0
  445. package/dist/editor/labels.d.ts +119 -0
  446. package/dist/editor/labels.js +130 -0
  447. package/dist/editor/markdown.d.ts +14 -0
  448. package/dist/editor/markdown.js +209 -0
  449. package/dist/editor/menus.d.ts +20 -0
  450. package/dist/editor/menus.js +236 -0
  451. package/dist/editor/nodes.d.ts +14 -0
  452. package/dist/editor/nodes.js +201 -0
  453. package/dist/editor/outline.d.ts +11 -0
  454. package/dist/editor/outline.js +52 -0
  455. package/dist/editor/schema-form.d.ts +64 -0
  456. package/dist/editor/schema-form.js +290 -0
  457. package/dist/editor/slash-menu.d.ts +15 -0
  458. package/dist/editor/slash-menu.js +119 -0
  459. package/dist/fonts/catalog.d.ts +53 -0
  460. package/dist/fonts/catalog.js +121 -0
  461. package/dist/fonts/font-picker.d.ts +70 -0
  462. package/dist/fonts/font-picker.js +225 -0
  463. package/dist/fonts/index.d.ts +6 -0
  464. package/dist/fonts/index.js +7 -0
  465. package/dist/fonts/loader.d.ts +66 -0
  466. package/dist/fonts/loader.js +161 -0
  467. package/dist/fonts/pairing-picker.d.ts +31 -0
  468. package/dist/fonts/pairing-picker.js +81 -0
  469. package/dist/fonts/pairings.d.ts +84 -0
  470. package/dist/fonts/pairings.js +149 -0
  471. package/dist/fonts/provider.d.ts +34 -0
  472. package/dist/fonts/provider.js +51 -0
  473. package/dist/form/index.d.ts +1 -0
  474. package/dist/form/index.js +1 -0
  475. package/dist/format/core.d.ts +149 -0
  476. package/dist/format/core.js +357 -0
  477. package/dist/format/index.d.ts +4 -0
  478. package/dist/format/index.js +5 -0
  479. package/dist/format/use-format.d.ts +1 -0
  480. package/dist/format/use-format.js +3 -0
  481. package/dist/index.d.ts +91 -0
  482. package/dist/index.js +92 -0
  483. package/dist/lib/cn.d.ts +3 -0
  484. package/dist/lib/cn.js +16 -0
  485. package/dist/lib/color.d.ts +64 -0
  486. package/dist/lib/color.js +177 -0
  487. package/dist/lib/compose-refs.d.ts +24 -0
  488. package/dist/lib/compose-refs.js +45 -0
  489. package/dist/lib/data-islands.d.ts +194 -0
  490. package/dist/lib/data-islands.js +368 -0
  491. package/dist/lib/date.d.ts +129 -0
  492. package/dist/lib/date.js +386 -0
  493. package/dist/lib/field-context.d.ts +64 -0
  494. package/dist/lib/field-context.js +62 -0
  495. package/dist/lib/floating-arrow.d.ts +18 -0
  496. package/dist/lib/floating-arrow.js +15 -0
  497. package/dist/lib/islands.d.ts +38 -0
  498. package/dist/lib/islands.js +40 -0
  499. package/dist/lib/labels.d.ts +51 -0
  500. package/dist/lib/labels.js +56 -0
  501. package/dist/lib/layer.d.ts +36 -0
  502. package/dist/lib/layer.js +42 -0
  503. package/dist/lib/locale.d.ts +85 -0
  504. package/dist/lib/locale.js +105 -0
  505. package/dist/lib/menu.d.ts +58 -0
  506. package/dist/lib/menu.js +99 -0
  507. package/dist/lib/message-format.d.ts +20 -0
  508. package/dist/lib/message-format.js +116 -0
  509. package/dist/lib/nav.d.ts +132 -0
  510. package/dist/lib/nav.js +178 -0
  511. package/dist/lib/provider.d.ts +100 -0
  512. package/dist/lib/provider.js +105 -0
  513. package/dist/lib/public.d.ts +23 -0
  514. package/dist/lib/public.js +34 -0
  515. package/dist/lib/sr-name.d.ts +18 -0
  516. package/dist/lib/sr-name.js +17 -0
  517. package/dist/lib/text.d.ts +100 -0
  518. package/dist/lib/text.js +233 -0
  519. package/dist/lib/theme-scope.d.ts +58 -0
  520. package/dist/lib/theme-scope.js +59 -0
  521. package/dist/lib/use-async-list.d.ts +60 -0
  522. package/dist/lib/use-async-list.js +119 -0
  523. package/dist/lib/use-container-width.d.ts +19 -0
  524. package/dist/lib/use-container-width.js +39 -0
  525. package/dist/lib/use-controllable-state.d.ts +33 -0
  526. package/dist/lib/use-controllable-state.js +56 -0
  527. package/dist/lib/use-edge-fade.d.ts +13 -0
  528. package/dist/lib/use-edge-fade.js +43 -0
  529. package/dist/lib/use-formatted-input.d.ts +69 -0
  530. package/dist/lib/use-formatted-input.js +152 -0
  531. package/dist/lib/use-hotkeys.d.ts +80 -0
  532. package/dist/lib/use-hotkeys.js +221 -0
  533. package/dist/lib/use-hover-intent.d.ts +44 -0
  534. package/dist/lib/use-hover-intent.js +119 -0
  535. package/dist/lib/use-media-query.d.ts +21 -0
  536. package/dist/lib/use-media-query.js +28 -0
  537. package/dist/lib/use-reduced-motion.d.ts +8 -0
  538. package/dist/lib/use-reduced-motion.js +13 -0
  539. package/dist/lib/use-tree.d.ts +153 -0
  540. package/dist/lib/use-tree.js +534 -0
  541. package/dist/lib/value-format.d.ts +25 -0
  542. package/dist/lib/value-format.js +56 -0
  543. package/dist/lib/variants.d.ts +131 -0
  544. package/dist/lib/variants.js +109 -0
  545. package/dist/locale-data/core/date.d.ts +24 -0
  546. package/dist/locale-data/core/date.js +68 -0
  547. package/dist/locale-data/core/decimal.d.ts +19 -0
  548. package/dist/locale-data/core/decimal.js +79 -0
  549. package/dist/locale-data/core/holidays.d.ts +30 -0
  550. package/dist/locale-data/core/holidays.js +79 -0
  551. package/dist/locale-data/core/iban.d.ts +29 -0
  552. package/dist/locale-data/core/iban.js +74 -0
  553. package/dist/locale-data/core/index.d.ts +7 -0
  554. package/dist/locale-data/core/index.js +6 -0
  555. package/dist/locale-data/core/types.d.ts +173 -0
  556. package/dist/locale-data/core/types.js +6 -0
  557. package/dist/locale-data/core/week-info.d.ts +23 -0
  558. package/dist/locale-data/core/week-info.js +85 -0
  559. package/dist/locale-data/core/working-days.d.ts +27 -0
  560. package/dist/locale-data/core/working-days.js +133 -0
  561. package/dist/locale-data/index.d.ts +2 -0
  562. package/dist/locale-data/index.js +4 -0
  563. package/dist/locale-data/tr/address-tr.json +1 -0
  564. package/dist/locale-data/tr/address.d.ts +23 -0
  565. package/dist/locale-data/tr/address.js +52 -0
  566. package/dist/locale-data/tr/holidays.d.ts +31 -0
  567. package/dist/locale-data/tr/holidays.js +81 -0
  568. package/dist/locale-data/tr/iban.d.ts +21 -0
  569. package/dist/locale-data/tr/iban.js +45 -0
  570. package/dist/locale-data/tr/id.d.ts +36 -0
  571. package/dist/locale-data/tr/id.js +120 -0
  572. package/dist/locale-data/tr/index.d.ts +12 -0
  573. package/dist/locale-data/tr/index.js +33 -0
  574. package/dist/locale-data/tr/kdv.d.ts +91 -0
  575. package/dist/locale-data/tr/kdv.js +222 -0
  576. package/dist/locales/en.d.ts +2102 -0
  577. package/dist/locales/en.js +2088 -0
  578. package/dist/locales/tr.d.ts +2086 -0
  579. package/dist/locales/tr.js +2087 -0
  580. package/dist/media/focal-point.d.ts +42 -0
  581. package/dist/media/focal-point.js +96 -0
  582. package/dist/media/gallery-layout.d.ts +19 -0
  583. package/dist/media/gallery-layout.js +61 -0
  584. package/dist/media/gallery.d.ts +64 -0
  585. package/dist/media/gallery.js +140 -0
  586. package/dist/media/image-cropper.d.ts +86 -0
  587. package/dist/media/image-cropper.js +170 -0
  588. package/dist/media/image-field.d.ts +115 -0
  589. package/dist/media/image-field.js +212 -0
  590. package/dist/media/index.d.ts +19 -0
  591. package/dist/media/index.js +23 -0
  592. package/dist/media/lightbox.d.ts +82 -0
  593. package/dist/media/lightbox.js +171 -0
  594. package/dist/media/link-preview.d.ts +97 -0
  595. package/dist/media/link-preview.js +177 -0
  596. package/dist/media/media-library.d.ts +244 -0
  597. package/dist/media/media-library.js +776 -0
  598. package/dist/media/media-picker.d.ts +96 -0
  599. package/dist/media/media-picker.js +209 -0
  600. package/dist/media/media-provider.d.ts +23 -0
  601. package/dist/media/media-provider.js +44 -0
  602. package/dist/media/media-utils.d.ts +39 -0
  603. package/dist/media/media-utils.js +145 -0
  604. package/dist/media/memory-adapter.d.ts +22 -0
  605. package/dist/media/memory-adapter.js +162 -0
  606. package/dist/media/rest-adapter.d.ts +90 -0
  607. package/dist/media/rest-adapter.js +208 -0
  608. package/dist/media/serp.d.ts +62 -0
  609. package/dist/media/serp.js +108 -0
  610. package/dist/media/test-fixtures.d.ts +3 -0
  611. package/dist/media/test-fixtures.js +37 -0
  612. package/dist/media/types.d.ts +183 -0
  613. package/dist/media/types.js +3 -0
  614. package/dist/media/use-pan-zoom.d.ts +51 -0
  615. package/dist/media/use-pan-zoom.js +156 -0
  616. package/dist/media/use-upload-queue.d.ts +64 -0
  617. package/dist/media/use-upload-queue.js +115 -0
  618. package/dist/media/video-player.d.ts +135 -0
  619. package/dist/media/video-player.js +319 -0
  620. package/dist/motion/core.d.ts +32 -0
  621. package/dist/motion/core.js +77 -0
  622. package/dist/motion/count-up.d.ts +29 -0
  623. package/dist/motion/count-up.js +92 -0
  624. package/dist/motion/index.d.ts +11 -0
  625. package/dist/motion/index.js +13 -0
  626. package/dist/motion/motion-scope.d.ts +17 -0
  627. package/dist/motion/motion-scope.js +16 -0
  628. package/dist/motion/page-transition.d.ts +33 -0
  629. package/dist/motion/page-transition.js +61 -0
  630. package/dist/motion/parallax.d.ts +37 -0
  631. package/dist/motion/parallax.js +90 -0
  632. package/dist/motion/pointer.d.ts +38 -0
  633. package/dist/motion/pointer.js +117 -0
  634. package/dist/motion/reveal.d.ts +72 -0
  635. package/dist/motion/reveal.js +133 -0
  636. package/dist/motion/scroll-shrink.d.ts +18 -0
  637. package/dist/motion/scroll-shrink.js +47 -0
  638. package/dist/motion/skeleton-swap.d.ts +17 -0
  639. package/dist/motion/skeleton-swap.js +43 -0
  640. package/dist/motion/text-reveal.d.ts +30 -0
  641. package/dist/motion/text-reveal.js +29 -0
  642. package/dist/motion/ticker.d.ts +35 -0
  643. package/dist/motion/ticker.js +16 -0
  644. package/dist/next/index.d.ts +42 -0
  645. package/dist/next/index.js +36 -0
  646. package/dist/render/block-renderer.d.ts +56 -0
  647. package/dist/render/block-renderer.js +137 -0
  648. package/dist/render/index.d.ts +6 -0
  649. package/dist/render/index.js +7 -0
  650. package/dist/render/prepare.d.ts +61 -0
  651. package/dist/render/prepare.js +119 -0
  652. package/dist/scheduler/core/duration.d.ts +83 -0
  653. package/dist/scheduler/core/duration.js +174 -0
  654. package/dist/scheduler/core/gantt.d.ts +63 -0
  655. package/dist/scheduler/core/gantt.js +226 -0
  656. package/dist/scheduler/core/index.d.ts +6 -0
  657. package/dist/scheduler/core/index.js +7 -0
  658. package/dist/scheduler/core/layout.d.ts +97 -0
  659. package/dist/scheduler/core/layout.js +249 -0
  660. package/dist/scheduler/core/time-scale.d.ts +89 -0
  661. package/dist/scheduler/core/time-scale.js +173 -0
  662. package/dist/scheduler/gantt.d.ts +125 -0
  663. package/dist/scheduler/gantt.js +532 -0
  664. package/dist/scheduler/index.d.ts +6 -0
  665. package/dist/scheduler/index.js +7 -0
  666. package/dist/scheduler/resource-calendar.d.ts +218 -0
  667. package/dist/scheduler/resource-calendar.js +661 -0
  668. package/dist/scheduler/scheduler.d.ts +168 -0
  669. package/dist/scheduler/scheduler.js +768 -0
  670. package/dist/scheduler/shared.d.ts +63 -0
  671. package/dist/scheduler/shared.js +145 -0
  672. package/dist/scheduler/time-tracker.d.ts +138 -0
  673. package/dist/scheduler/time-tracker.js +403 -0
  674. package/dist/sortable/core.d.ts +67 -0
  675. package/dist/sortable/core.js +167 -0
  676. package/dist/sortable/index.d.ts +8 -0
  677. package/dist/sortable/index.js +10 -0
  678. package/dist/sortable/kanban-core.d.ts +70 -0
  679. package/dist/sortable/kanban-core.js +67 -0
  680. package/dist/sortable/kanban.d.ts +147 -0
  681. package/dist/sortable/kanban.js +472 -0
  682. package/dist/sortable/sortable-list.d.ts +71 -0
  683. package/dist/sortable/sortable-list.js +76 -0
  684. package/dist/sortable/sortable-tree.d.ts +105 -0
  685. package/dist/sortable/sortable-tree.js +462 -0
  686. package/dist/sortable/sortable.d.ts +188 -0
  687. package/dist/sortable/sortable.js +485 -0
  688. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  689. package/dist/sortable/use-pointer-drag.js +173 -0
  690. package/dist/sortable/use-time-scale.d.ts +11 -0
  691. package/dist/sortable/use-time-scale.js +19 -0
  692. package/dist/styles/base.css +51 -0
  693. package/dist/styles/blocks.css +949 -0
  694. package/dist/styles/calendar.css +642 -0
  695. package/dist/styles/charts.css +264 -0
  696. package/dist/styles/data.css +474 -0
  697. package/dist/styles/editors.css +1022 -0
  698. package/dist/styles/forms.css +406 -0
  699. package/dist/styles/media.css +515 -0
  700. package/dist/styles/motion.css +389 -0
  701. package/dist/styles/navigation.css +293 -0
  702. package/dist/styles/overlays.css +244 -0
  703. package/dist/styles.css +743 -0
  704. package/package.json +160 -4
@@ -0,0 +1,134 @@
1
+ import * as React from "react";
2
+ declare const settingsLabels: {
3
+ nav: string;
4
+ saveBar: string;
5
+ unsaved: string;
6
+ save: string;
7
+ saving: string;
8
+ reset: string;
9
+ error: string;
10
+ loading: string;
11
+ };
12
+ export type SettingsLayoutLabels = Partial<typeof settingsLabels>;
13
+ export interface SettingsLayoutProps extends React.HTMLAttributes<HTMLDivElement> {
14
+ /** `SettingsNav` — a column at the inline start; a scrolling strip on top below 42rem (672px). */
15
+ nav?: React.ReactNode;
16
+ /** `md` 64rem (default) · `lg` 80rem overall. */
17
+ width?: "md" | "lg";
18
+ /** Disables every control in the sections (pair with an Alert in `notice`). */
19
+ readOnly?: boolean;
20
+ /** Banner above the first section (read-only notice, plan limits). */
21
+ notice?: React.ReactNode;
22
+ /** Where the nav sticks. Default `"var(--topbar-h)"`. Use `0` in your own scroll box. */
23
+ stickyTop?: number | string;
24
+ labels?: SettingsLayoutLabels;
25
+ }
26
+ /**
27
+ * A shared skeleton for settings pages: section nav, titled sections of label | control rows,
28
+ * a sticky save bar that rises when there are unsaved changes, and a danger zone. Not bound to
29
+ * a form library — pass `dirty` from react-hook-form's `formState.isDirty` or your own state.
30
+ *
31
+ * ```tsx
32
+ * <SettingsLayout nav={<SettingsNav items={[{ id: "general", label: "General" }, { id: "danger", label: "Danger zone" }]} />}>
33
+ * <SettingsSection id="general" title="General" description="Basic information about the site.">
34
+ * <SettingsRow label="Site name" description="Shown in the title bar."><Input defaultValue="Northwind Journal" /></SettingsRow>
35
+ * <SettingsRow label="Maintenance mode" layout="inline"><Switch /></SettingsRow>
36
+ * </SettingsSection>
37
+ * <SettingsSaveBar dirty={dirty} saving={saving} onSave={save} onReset={reset} />
38
+ * </SettingsLayout>
39
+ * ```
40
+ */
41
+ export declare const SettingsLayout: React.ForwardRefExoticComponent<SettingsLayoutProps & React.RefAttributes<HTMLDivElement>>;
42
+ export interface SettingsNavItem {
43
+ /** Section id (`#general`) — or a key when `href` is set. */
44
+ id: string;
45
+ label: string;
46
+ /** Route link (a separate settings page). Without it the item jumps to `#id` with scroll-spy. */
47
+ href?: string;
48
+ icon?: React.ReactNode;
49
+ badge?: React.ReactNode;
50
+ /** Hidden when `can(permission)` from `VamosProvider` is false. */
51
+ permission?: string;
52
+ /** Danger tone (the "Danger zone" item). */
53
+ tone?: "default" | "danger";
54
+ }
55
+ export interface SettingsNavProps extends Omit<React.HTMLAttributes<HTMLElement>, "defaultValue"> {
56
+ items: SettingsNavItem[];
57
+ /** Active item id (controlled). Default: derived from scroll position (anchors) or `currentPath` (links). */
58
+ value?: string;
59
+ defaultValue?: string;
60
+ onValueChange?: (id: string) => void;
61
+ /** Track the section in view. Default `true` for anchor items. */
62
+ scrollSpy?: boolean;
63
+ "aria-label"?: string;
64
+ labels?: SettingsLayoutLabels;
65
+ }
66
+ /**
67
+ * Section navigation: a `nav` with `aria-current`. Anchor items scroll to their section, move focus
68
+ * to its heading, and follow the scroll (scroll-spy). Link items use the app's router.
69
+ */
70
+ export declare const SettingsNav: React.ForwardRefExoticComponent<SettingsNavProps & React.RefAttributes<HTMLElement>>;
71
+ export interface SettingsSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
72
+ /** Anchor for `SettingsNav` (`#general`). */
73
+ id?: string;
74
+ title: React.ReactNode;
75
+ description?: React.ReactNode;
76
+ /** `stacked` (default): title above the card. `split`: title in a start column, card beside it (stacks when narrow). */
77
+ layout?: "stacked" | "split";
78
+ /** `danger` for irreversible actions: red hairline and title. */
79
+ tone?: "default" | "danger";
80
+ /** Card footer: a section-level button, a hint ("Changes apply to new invoices only"). */
81
+ footer?: React.ReactNode;
82
+ /** Skeleton rows instead of the content. */
83
+ loading?: boolean | number;
84
+ /** Heading level. Default 2. */
85
+ headingLevel?: 2 | 3;
86
+ labels?: SettingsLayoutLabels;
87
+ }
88
+ /** A titled group of setting rows. `<section aria-labelledby>`. */
89
+ export declare const SettingsSection: React.ForwardRefExoticComponent<SettingsSectionProps & React.RefAttributes<HTMLElement>>;
90
+ export interface SettingsRowProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
91
+ label: React.ReactNode;
92
+ description?: React.ReactNode;
93
+ /** Id of the control. Default: generated and passed to kit controls through the field context. */
94
+ htmlFor?: string;
95
+ /**
96
+ * `split` (default): label | control side by side, stacked when narrow. `inline`: control at the
97
+ * end on every width (switches). `stacked`: label, description, full-width control.
98
+ */
99
+ layout?: "stacked" | "inline" | "split";
100
+ /** "Beta", "Pro" — next to the label. */
101
+ badge?: React.ReactNode;
102
+ /** Error text under the control (marks kit controls invalid). */
103
+ error?: React.ReactNode;
104
+ disabled?: boolean;
105
+ }
106
+ /**
107
+ * One setting: label + description | control. Acts like a `Field` for kit controls (Input,
108
+ * Switch, Select…): the id, `aria-describedby` and disabled/invalid state are wired for you.
109
+ */
110
+ export declare const SettingsRow: React.ForwardRefExoticComponent<SettingsRowProps & React.RefAttributes<HTMLDivElement>>;
111
+ export interface SettingsSaveBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "onReset"> {
112
+ /** The form differs from what's saved. The bar shows while `dirty`, `saving` or `error`. */
113
+ dirty: boolean;
114
+ saving?: boolean;
115
+ onSave: () => void;
116
+ onReset: () => void;
117
+ /** Replace "You have unsaved changes" ("3 changes to notification rules"). */
118
+ message?: React.ReactNode;
119
+ /** Save failed: danger tone and this text (or the default). `true` for the default text. */
120
+ error?: React.ReactNode;
121
+ /** Warn before leaving the page while dirty (`beforeunload`). Default `true`. */
122
+ blockNavigation?: boolean;
123
+ /** `mod+s` saves while dirty. Default `true`. */
124
+ shortcuts?: boolean;
125
+ /** Label of the save button. Default "Save changes". */
126
+ saveLabel?: string;
127
+ labels?: SettingsLayoutLabels;
128
+ }
129
+ /**
130
+ * The sticky "Unsaved changes · Discard · Save" bar. It rises from the bottom of the content when
131
+ * the form is dirty, announces itself politely, and `mod+s` saves.
132
+ */
133
+ export declare const SettingsSaveBar: React.ForwardRefExoticComponent<SettingsSaveBarProps & React.RefAttributes<HTMLDivElement>>;
134
+ export {};
@@ -0,0 +1,180 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { TriangleAlert } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useLabels } from "../lib/labels.js";
7
+ import { useCan, useNavigation, SmartLink } from "../lib/provider.js";
8
+ import { useHotkeys } from "../lib/use-hotkeys.js";
9
+ import { useReducedMotion } from "../lib/use-reduced-motion.js";
10
+ import { useControllableState } from "../lib/use-controllable-state.js";
11
+ import { useEdgeFade } from "../lib/use-edge-fade.js";
12
+ import { FieldContext } from "../lib/field-context.js";
13
+ import { Button } from "./button.js";
14
+ import { SkeletonText } from "./skeleton.js";
15
+ /* ------------------------------------------------------------------ */
16
+ /* Labels & context */
17
+ /* ------------------------------------------------------------------ */
18
+ const settingsLabels = {
19
+ nav: "Settings sections",
20
+ saveBar: "Unsaved changes",
21
+ unsaved: "You have unsaved changes",
22
+ save: "Save changes",
23
+ saving: "Saving…",
24
+ reset: "Discard",
25
+ error: "Couldn't save your changes",
26
+ loading: "Loading settings",
27
+ };
28
+ const SettingsLayoutContext = React.createContext({ readOnly: false });
29
+ /**
30
+ * A shared skeleton for settings pages: section nav, titled sections of label | control rows,
31
+ * a sticky save bar that rises when there are unsaved changes, and a danger zone. Not bound to
32
+ * a form library — pass `dirty` from react-hook-form's `formState.isDirty` or your own state.
33
+ *
34
+ * ```tsx
35
+ * <SettingsLayout nav={<SettingsNav items={[{ id: "general", label: "General" }, { id: "danger", label: "Danger zone" }]} />}>
36
+ * <SettingsSection id="general" title="General" description="Basic information about the site.">
37
+ * <SettingsRow label="Site name" description="Shown in the title bar."><Input defaultValue="Northwind Journal" /></SettingsRow>
38
+ * <SettingsRow label="Maintenance mode" layout="inline"><Switch /></SettingsRow>
39
+ * </SettingsSection>
40
+ * <SettingsSaveBar dirty={dirty} saving={saving} onSave={save} onReset={reset} />
41
+ * </SettingsLayout>
42
+ * ```
43
+ */
44
+ export const SettingsLayout = React.forwardRef(function SettingsLayout({ nav, width = "md", readOnly = false, notice, stickyTop, labels, className, style, children, ...props }, ref) {
45
+ const ctx = React.useMemo(() => ({ readOnly, labels }), [readOnly, labels]);
46
+ const top = stickyTop === undefined ? undefined : typeof stickyTop === "number" ? `${stickyTop}px` : stickyTop;
47
+ return (_jsx(SettingsLayoutContext.Provider, { value: ctx, children: _jsx("div", { ref: ref, "data-slot": "settings-layout", "data-read-only": readOnly ? "" : undefined, className: cn("@container/settings mx-auto w-full min-w-0", width === "md" ? "max-w-[64rem]" : "max-w-[80rem]", className), style: top !== undefined ? { "--settings-sticky-top": top, ...style } : style, ...props, children: _jsxs("div", { className: cn("grid min-w-0 gap-x-10 gap-y-5", nav && "@2xl/settings:grid-cols-[11.5rem_minmax(0,1fr)]"), children: [nav ? (_jsx("div", { "data-slot": "settings-layout-nav", className: "min-w-0 @2xl/settings:sticky @2xl/settings:top-[calc(var(--settings-sticky-top,var(--topbar-h))+1.5rem)] @2xl/settings:self-start", children: nav })) : null, _jsxs("div", { "data-slot": "settings-layout-content", className: "flex min-w-0 flex-col gap-[calc(var(--gap)*1.6)]", children: [notice, children] })] }) }) }));
48
+ });
49
+ /**
50
+ * Section navigation: a `nav` with `aria-current`. Anchor items scroll to their section, move focus
51
+ * to its heading, and follow the scroll (scroll-spy). Link items use the app's router.
52
+ */
53
+ export const SettingsNav = React.forwardRef(function SettingsNav({ items: itemsProp, value: valueProp, defaultValue, onValueChange, scrollSpy = true, labels, className, ...props }, ref) {
54
+ const ctx = React.useContext(SettingsLayoutContext);
55
+ const t = useLabels("settings", settingsLabels, labels ?? ctx.labels);
56
+ const can = useCan();
57
+ const { isActive } = useNavigation();
58
+ const reduced = useReducedMotion();
59
+ const items = React.useMemo(() => itemsProp.filter((i) => !i.permission || can(i.permission)), [itemsProp, can]);
60
+ const [value, setValue] = useControllableState({ value: valueProp, defaultValue: defaultValue ?? items[0]?.id ?? "", onChange: onValueChange, name: "SettingsNav" });
61
+ const listRef = React.useRef(null);
62
+ useEdgeFade(listRef, "x", true);
63
+ const lockUntil = React.useRef(0);
64
+ // Scroll-spy over anchor items.
65
+ const anchorIds = items.filter((i) => !i.href).map((i) => i.id).join("|");
66
+ React.useEffect(() => {
67
+ if (!scrollSpy || !anchorIds || typeof IntersectionObserver === "undefined")
68
+ return;
69
+ const ids = anchorIds.split("|");
70
+ const visible = new Set();
71
+ const io = new IntersectionObserver((entries) => {
72
+ for (const e of entries) {
73
+ if (e.isIntersecting)
74
+ visible.add(e.target.id);
75
+ else
76
+ visible.delete(e.target.id);
77
+ }
78
+ if (Date.now() < lockUntil.current)
79
+ return; // a click-scroll is in flight
80
+ const first = ids.find((id) => visible.has(id));
81
+ if (first)
82
+ setValue(first);
83
+ }, { rootMargin: "-10% 0px -55% 0px" });
84
+ for (const id of ids) {
85
+ const el = document.getElementById(id);
86
+ if (el)
87
+ io.observe(el);
88
+ }
89
+ return () => io.disconnect();
90
+ // eslint-disable-next-line react-hooks/exhaustive-deps
91
+ }, [scrollSpy, anchorIds]);
92
+ // Keep the active item visible in the horizontal strip.
93
+ React.useEffect(() => {
94
+ const el = listRef.current?.querySelector("[aria-current]");
95
+ el?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
96
+ }, [value]);
97
+ const jump = (id) => {
98
+ const target = document.getElementById(id);
99
+ setValue(id);
100
+ if (!target)
101
+ return;
102
+ lockUntil.current = Date.now() + 800;
103
+ target.scrollIntoView?.({ behavior: reduced ? "auto" : "smooth", block: "start" });
104
+ const heading = target.querySelector("[data-settings-heading]") ?? target;
105
+ if (!heading.hasAttribute("tabindex"))
106
+ heading.setAttribute("tabindex", "-1");
107
+ heading.focus({ preventScroll: true });
108
+ };
109
+ const itemClass = (active, danger) => cn("group/settings-nav relative flex h-9 shrink-0 items-center gap-2.5 whitespace-nowrap rounded-ui-sm px-3 text-[13.5px] transition-colors focus-ring", "@2xl/settings:h-8.5 @2xl/settings:w-full", active ? "bg-selected font-medium text-fg" : "text-fg-muted hover:bg-hover hover:text-fg", danger && !active && "text-danger hover:text-danger",
110
+ // accent tick on the start edge of the active item (wide layout)
111
+ "before:absolute before:inset-y-2 before:-start-px before:w-0.5 before:rounded-full before:bg-accent-ink before:opacity-0 before:transition-opacity @2xl/settings:before:opacity-0", active && "@2xl/settings:before:opacity-100", "[&_svg]:size-4 [&_svg]:shrink-0");
112
+ return (_jsx("nav", { ref: ref, "aria-label": props["aria-label"] ?? t("nav"), "data-slot": "settings-nav", className: cn("min-w-0", className), ...props, children: _jsx("ul", { ref: listRef, "data-edge-fade": "x", className: "-mx-1 flex min-w-0 gap-0.5 overflow-x-auto scrollbar-none px-1 pb-1 @2xl/settings:mx-0 @2xl/settings:flex-col @2xl/settings:overflow-visible @2xl/settings:px-0 @2xl/settings:pb-0 @2xl/settings:[mask-image:none]", children: items.map((item) => {
113
+ const active = item.href ? (valueProp !== undefined ? valueProp === item.id : isActive(item.href)) : value === item.id;
114
+ const inner = (_jsxs(_Fragment, { children: [item.icon ? _jsx("span", { "aria-hidden": true, className: cn("inline-flex", active ? "text-fg" : "text-fg-subtle"), children: item.icon }) : null, _jsx("span", { className: "truncate", children: item.label }), item.badge ? _jsx("span", { className: "ms-auto", children: item.badge }) : null] }));
115
+ return (_jsx("li", { className: "shrink-0", children: item.href ? (_jsx(SmartLink, { href: item.href, "aria-current": active ? "page" : undefined, className: itemClass(active, item.tone === "danger"), onClick: () => setValue(item.id), children: inner })) : (_jsx("a", { href: `#${item.id}`, "aria-current": active ? "true" : undefined, className: itemClass(active, item.tone === "danger"), onClick: (e) => {
116
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.button !== 0)
117
+ return;
118
+ e.preventDefault();
119
+ jump(item.id);
120
+ }, children: inner })) }, item.id));
121
+ }) }) }));
122
+ });
123
+ /** A titled group of setting rows. `<section aria-labelledby>`. */
124
+ export const SettingsSection = React.forwardRef(function SettingsSection({ id, title, description, layout = "stacked", tone = "default", footer, loading, headingLevel = 2, labels, className, children, ...props }, ref) {
125
+ const ctx = React.useContext(SettingsLayoutContext);
126
+ const t = useLabels("settings", settingsLabels, labels ?? ctx.labels);
127
+ const autoId = React.useId();
128
+ const titleId = `${id ?? `settings${autoId.replace(/:/g, "")}`}-title`;
129
+ const H = `h${headingLevel}`;
130
+ const danger = tone === "danger";
131
+ const rows = loading ? Math.max(1, typeof loading === "number" ? loading : 3) : 0;
132
+ return (_jsxs("section", { ref: ref, id: id, "aria-labelledby": titleId, "data-slot": "settings-section", "data-layout": layout, "data-tone": tone, className: cn("scroll-mt-[calc(var(--settings-sticky-top,var(--topbar-h))+1.5rem)] min-w-0", layout === "split" && "grid gap-x-8 gap-y-3 @4xl/settings:grid-cols-[minmax(0,15rem)_minmax(0,1fr)]", className), ...props, children: [_jsxs("div", { className: cn("min-w-0", layout === "stacked" ? "mb-3 px-0.5" : "px-0.5 @4xl/settings:pt-3"), children: [_jsxs(H, { id: titleId, "data-settings-heading": true, className: cn("rounded-ui-sm text-[15px] font-semibold tracking-[-0.005em] outline-none focus-visible:outline-2 focus-visible:outline-ring", danger ? "text-danger" : "text-fg"), children: [danger ? _jsx(TriangleAlert, { "aria-hidden": true, className: "-mt-0.5 me-1.5 inline size-4" }) : null, title] }), description ? _jsx("p", { className: "mt-1 max-w-[60ch] text-[13.5px] leading-relaxed text-fg-muted", children: description }) : null] }), _jsxs("div", { "data-slot": "settings-section-card", "aria-busy": loading ? true : undefined, className: cn("@container/setting-rows surface min-w-0 overflow-hidden rounded-ui-lg", danger && "border-[color-mix(in_srgb,var(--danger)_40%,transparent)]!"), children: [loading ? (_jsx("div", { role: "status", "aria-label": t("loading"), className: "divide-y divide-line", children: Array.from({ length: rows }, (_, i) => (_jsxs("div", { className: "grid gap-4 px-(--gap) py-4 @lg/setting-rows:grid-cols-2", children: [_jsx(SkeletonText, { lines: 2, lastLineWidth: "70%" }), _jsx(SkeletonText, { lines: 1, lineClassName: "h-(--control-h)" })] }, i))) })) : (_jsx("div", { className: "divide-y divide-line", children: children })), footer ? _jsx("div", { className: "flex flex-wrap items-center justify-end gap-2 border-t border-line bg-surface-2 px-(--gap) py-3 text-[13px] text-fg-muted", children: footer }) : null] })] }));
133
+ });
134
+ /**
135
+ * One setting: label + description | control. Acts like a `Field` for kit controls (Input,
136
+ * Switch, Select…): the id, `aria-describedby` and disabled/invalid state are wired for you.
137
+ */
138
+ export const SettingsRow = React.forwardRef(function SettingsRow({ label, description, htmlFor, layout = "split", badge, error, disabled, className, children, ...props }, ref) {
139
+ const { readOnly } = React.useContext(SettingsLayoutContext);
140
+ const autoId = React.useId().replace(/:/g, "");
141
+ const controlId = htmlFor ?? `setting-${autoId}`;
142
+ const labelId = `${controlId}-label`;
143
+ const descId = description ? `${controlId}-desc` : undefined;
144
+ const errorId = error ? `${controlId}-error` : undefined;
145
+ const field = React.useMemo(() => ({
146
+ id: controlId,
147
+ labelId,
148
+ describedBy: [descId, errorId].filter(Boolean).join(" ") || undefined,
149
+ errorId,
150
+ invalid: Boolean(error),
151
+ required: false,
152
+ disabled: Boolean(disabled || readOnly),
153
+ readOnly: false,
154
+ }), [controlId, labelId, descId, errorId, error, disabled, readOnly]);
155
+ const text = (_jsxs("div", { className: "min-w-0", children: [_jsxs("label", { id: labelId, htmlFor: controlId, className: cn("inline-flex items-center gap-2 text-[14px] font-medium text-fg", (disabled || readOnly) && "text-fg-muted"), children: [label, badge] }), description ? (_jsx("p", { id: descId, className: "mt-0.5 max-w-[56ch] text-[13px] leading-relaxed text-fg-muted", children: description })) : null] }));
156
+ const control = (_jsxs("div", { "data-slot": "settings-row-control", className: cn("min-w-0", layout === "inline" && "shrink-0"), children: [_jsx(FieldContext.Provider, { value: field, children: children }), error ? (_jsx("p", { id: errorId, className: "mt-1.5 text-[12.5px] text-danger", children: error })) : null] }));
157
+ return (_jsxs("div", { ref: ref, "data-slot": "settings-row", "data-layout": layout, className: cn("px-(--gap) py-[calc(var(--gap)*0.8)]", layout === "split" && "grid items-start gap-x-8 gap-y-2.5 @lg/setting-rows:grid-cols-[minmax(0,1fr)_minmax(0,1.15fr)]", layout === "inline" && "flex items-center justify-between gap-6", layout === "stacked" && "grid gap-2.5", className), ...props, children: [text, control] }));
158
+ });
159
+ /**
160
+ * The sticky "Unsaved changes · Discard · Save" bar. It rises from the bottom of the content when
161
+ * the form is dirty, announces itself politely, and `mod+s` saves.
162
+ */
163
+ export const SettingsSaveBar = React.forwardRef(function SettingsSaveBar({ dirty, saving = false, onSave, onReset, message, error, blockNavigation = true, shortcuts = true, saveLabel, labels, className, ...props }, ref) {
164
+ const ctx = React.useContext(SettingsLayoutContext);
165
+ const t = useLabels("settings", settingsLabels, labels ?? ctx.labels);
166
+ const visible = dirty || saving || Boolean(error);
167
+ useHotkeys("mod+s", () => onSave(), { enabled: shortcuts && dirty && !saving && !ctx.readOnly });
168
+ React.useEffect(() => {
169
+ if (!blockNavigation || !(dirty || saving))
170
+ return;
171
+ const handler = (e) => {
172
+ e.preventDefault();
173
+ e.returnValue = "";
174
+ };
175
+ window.addEventListener("beforeunload", handler);
176
+ return () => window.removeEventListener("beforeunload", handler);
177
+ }, [blockNavigation, dirty, saving]);
178
+ const errorText = error === true ? t("error") : error;
179
+ return (_jsxs(_Fragment, { children: [_jsx("div", { "aria-live": "polite", className: "sr-only", children: visible && !error ? t("unsaved") : "" }), visible ? (_jsxs("div", { ref: ref, role: "region", "aria-label": t("saveBar"), "data-slot": "settings-save-bar", "data-state": error ? "error" : saving ? "saving" : "dirty", className: cn("ui-rise surface-popover sticky bottom-4 z-(--z-sticky) flex flex-wrap items-center gap-x-4 gap-y-2 rounded-ui-lg py-2 ps-4 pe-2", error && "border-[color-mix(in_srgb,var(--danger)_45%,transparent)]!", className), ...props, children: [error ? (_jsxs("p", { role: "alert", className: "flex min-w-0 flex-1 items-center gap-2 text-[13.5px] font-medium text-danger", children: [_jsx(TriangleAlert, { "aria-hidden": true, className: "size-4 shrink-0" }), errorText] })) : (_jsxs("p", { className: "flex min-w-0 flex-1 items-center gap-2.5 text-[13.5px] text-fg", children: [_jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-warning" }), _jsx("span", { className: "truncate", children: message ?? t("unsaved") })] })), _jsxs("div", { className: "ms-auto flex items-center gap-1.5", children: [_jsx(Button, { variant: "ghost", size: "sm", onClick: onReset, disabled: saving, children: t("reset") }), _jsx(Button, { variant: "primary", size: "sm", onClick: onSave, loading: saving, loadingText: t("saving"), disabled: ctx.readOnly, "aria-keyshortcuts": "Control+S Meta+S", children: saveLabel ?? t("save") })] })] })) : null] }));
180
+ });
@@ -0,0 +1,103 @@
1
+ import * as React from "react";
2
+ import { DialogClose, DialogTrigger, type DialogProps, type LayerBodyProps, type LayerContentShellProps } from "./dialog.js";
3
+ export interface SheetProps extends DialogProps {
4
+ }
5
+ /**
6
+ * An edge panel that keeps the page behind it in view: quick edit, record preview, mobile
7
+ * filters, mobile navigation. A positioned Dialog — same focus, Esc and close-guard behaviour.
8
+ *
9
+ * ```tsx
10
+ * <Sheet>
11
+ * <SheetTrigger asChild><Button>Quick edit</Button></SheetTrigger>
12
+ * <SheetContent side="end" size="md">
13
+ * <SheetHeader title="Edit contact" />
14
+ * <SheetBody>…</SheetBody>
15
+ * <SheetFooter>…</SheetFooter>
16
+ * </SheetContent>
17
+ * </Sheet>
18
+ * ```
19
+ *
20
+ * `modal={false}` keeps the page interactive (no overlay, no focus trap; Esc still closes).
21
+ */
22
+ export declare function Sheet(props: SheetProps): React.JSX.Element;
23
+ export declare const SheetTrigger: typeof DialogTrigger;
24
+ export declare const SheetClose: typeof DialogClose;
25
+ /** `LayerHeader` for sheets. */
26
+ export declare const SheetHeader: React.ForwardRefExoticComponent<import("./dialog.js").LayerHeaderProps & React.RefAttributes<HTMLDivElement>>;
27
+ /** `LayerBody` for sheets — the only part that scrolls. */
28
+ export declare const SheetBody: React.ForwardRefExoticComponent<LayerBodyProps & React.RefAttributes<HTMLDivElement>>;
29
+ /** `LayerFooter` for sheets. */
30
+ export declare const SheetFooter: React.ForwardRefExoticComponent<import("./dialog.js").LayerFooterProps & React.RefAttributes<HTMLDivElement>>;
31
+ export type SheetSide = "start" | "end" | "top" | "bottom";
32
+ export interface SheetContentProps extends LayerContentShellProps {
33
+ /** Logical edge — `start`/`end` flip in RTL. `left`/`right` are accepted as aliases of `start`/`end`. Default `"end"`. */
34
+ side?: SheetSide | "left" | "right";
35
+ /**
36
+ * Width for `start`/`end`: 360 / 440 / 560 / 720 px or full. For `top`/`bottom` it caps the
37
+ * height (40 / 60 / 75 / 85 % of the viewport, or full); the panel otherwise fits its content.
38
+ * Default `"md"`.
39
+ */
40
+ size?: "sm" | "md" | "lg" | "xl" | "full";
41
+ /** 8px gutter and full radius — a floating panel. */
42
+ inset?: boolean;
43
+ }
44
+ export declare const SheetContent: React.ForwardRefExoticComponent<SheetContentProps & React.RefAttributes<HTMLDivElement>>;
45
+ export interface UseDragDismissOptions {
46
+ /** Called when the drag passes the threshold or is flicked. */
47
+ onDismiss: () => void;
48
+ enabled?: boolean;
49
+ /** Fraction of the panel height to drag before it dismisses. Default 0.3. */
50
+ threshold?: number;
51
+ /** Flick speed in px/ms that dismisses regardless of distance. Default 0.5. */
52
+ velocity?: number;
53
+ }
54
+ /**
55
+ * Pointer-driven vertical drag for a bottom panel. Moves the element through the CSS
56
+ * `translate` property (so the close keyframes compose with it), sets `data-dragging` (which also
57
+ * turns blur off) and springs back below the threshold. Drags never start on interactive
58
+ * elements or inside a scrolled body.
59
+ */
60
+ export declare function useDragDismiss<T extends HTMLElement>({ onDismiss, enabled, threshold, velocity }: UseDragDismissOptions): {
61
+ ref: React.RefObject<T | null>;
62
+ handlers: {
63
+ onPointerDown: (e: React.PointerEvent<T>) => void;
64
+ onPointerMove: (e: React.PointerEvent<T>) => void;
65
+ onPointerUp: (e: React.PointerEvent<T>) => void;
66
+ onPointerCancel: (e: React.PointerEvent<T>) => void;
67
+ };
68
+ };
69
+ export interface DrawerProps extends SheetProps {
70
+ }
71
+ /**
72
+ * A bottom sheet that closes by dragging down — mobile actions, filters, pickers. Dragging is an
73
+ * extra way to close: Esc and the close button always work.
74
+ *
75
+ * ```tsx
76
+ * <Drawer>
77
+ * <DrawerTrigger asChild><Button>Filters</Button></DrawerTrigger>
78
+ * <DrawerContent>
79
+ * <DrawerHeader title="Filter orders" />
80
+ * <DrawerBody>…</DrawerBody>
81
+ * <DrawerFooter>…</DrawerFooter>
82
+ * </DrawerContent>
83
+ * </Drawer>
84
+ * ```
85
+ */
86
+ export declare function Drawer(props: DrawerProps): React.JSX.Element;
87
+ export declare const DrawerTrigger: typeof DialogTrigger;
88
+ export declare const DrawerClose: typeof DialogClose;
89
+ export declare const DrawerHeader: React.ForwardRefExoticComponent<import("./dialog.js").LayerHeaderProps & React.RefAttributes<HTMLDivElement>>;
90
+ export declare const DrawerFooter: React.ForwardRefExoticComponent<import("./dialog.js").LayerFooterProps & React.RefAttributes<HTMLDivElement>>;
91
+ /** The scrolling body of a drawer; dragging starts from it only while it is scrolled to the top. */
92
+ export declare const DrawerBody: React.ForwardRefExoticComponent<LayerBodyProps & React.RefAttributes<HTMLDivElement>>;
93
+ /** The grab line at the top of a drawer. Decorative (`aria-hidden`). */
94
+ export declare function DrawerHandle({ className }: {
95
+ className?: string;
96
+ }): React.JSX.Element;
97
+ export interface DrawerContentProps extends Omit<SheetContentProps, "side"> {
98
+ /** Close by dragging down. Default `true`. */
99
+ dragToDismiss?: boolean;
100
+ /** Show the grab handle. Default `true`. */
101
+ handle?: boolean;
102
+ }
103
+ export declare const DrawerContent: React.ForwardRefExoticComponent<DrawerContentProps & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,165 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../lib/cn.js";
5
+ import { useComposedRefs } from "../lib/compose-refs.js";
6
+ import { useLatest } from "../lib/use-controllable-state.js";
7
+ import { Dialog, DialogClose, DialogTrigger, LayerBody, LayerContentShell, LayerFooter, LayerHeader, useDialogRoot, } from "./dialog.js";
8
+ /**
9
+ * An edge panel that keeps the page behind it in view: quick edit, record preview, mobile
10
+ * filters, mobile navigation. A positioned Dialog — same focus, Esc and close-guard behaviour.
11
+ *
12
+ * ```tsx
13
+ * <Sheet>
14
+ * <SheetTrigger asChild><Button>Quick edit</Button></SheetTrigger>
15
+ * <SheetContent side="end" size="md">
16
+ * <SheetHeader title="Edit contact" />
17
+ * <SheetBody>…</SheetBody>
18
+ * <SheetFooter>…</SheetFooter>
19
+ * </SheetContent>
20
+ * </Sheet>
21
+ * ```
22
+ *
23
+ * `modal={false}` keeps the page interactive (no overlay, no focus trap; Esc still closes).
24
+ */
25
+ export function Sheet(props) {
26
+ return _jsx(Dialog, { ...props });
27
+ }
28
+ export const SheetTrigger = DialogTrigger;
29
+ export const SheetClose = DialogClose;
30
+ /** `LayerHeader` for sheets. */
31
+ export const SheetHeader = LayerHeader;
32
+ /** `LayerBody` for sheets — the only part that scrolls. */
33
+ export const SheetBody = LayerBody;
34
+ /** `LayerFooter` for sheets. */
35
+ export const SheetFooter = LayerFooter;
36
+ const sideAlias = { left: "start", right: "end" };
37
+ export const SheetContent = React.forwardRef(function SheetContent({ side: sideProp = "end", size = "md", inset, className, ...props }, ref) {
38
+ const side = sideProp === "left" || sideProp === "right" ? sideAlias[sideProp] : sideProp;
39
+ return (_jsx(LayerContentShell, { ref: ref, "data-slot": "sheet-content", "data-side": side, "data-size": size, "data-inset": inset ? "" : undefined, className: cn("vui-sheet", `ui-sheet-${side}`, className), ...props }));
40
+ });
41
+ const INTERACTIVE = "button, a[href], input, select, textarea, label, [role=button], [role=slider], [contenteditable=true], [data-no-drag]";
42
+ /**
43
+ * Pointer-driven vertical drag for a bottom panel. Moves the element through the CSS
44
+ * `translate` property (so the close keyframes compose with it), sets `data-dragging` (which also
45
+ * turns blur off) and springs back below the threshold. Drags never start on interactive
46
+ * elements or inside a scrolled body.
47
+ */
48
+ export function useDragDismiss({ onDismiss, enabled = true, threshold = 0.3, velocity = 0.5 }) {
49
+ const ref = React.useRef(null);
50
+ const drag = React.useRef(null);
51
+ const dismiss = useLatest(onDismiss);
52
+ const settle = React.useCallback(() => {
53
+ const el = ref.current;
54
+ if (!el)
55
+ return;
56
+ el.setAttribute("data-settling", "");
57
+ el.style.translate = "";
58
+ const done = () => el.removeAttribute("data-settling");
59
+ el.addEventListener("transitionend", done, { once: true });
60
+ window.setTimeout(done, 260);
61
+ }, []);
62
+ const onPointerDown = React.useCallback((e) => {
63
+ const el = ref.current;
64
+ if (!enabled || !el || (e.pointerType === "mouse" && e.button !== 0))
65
+ return;
66
+ const target = e.target;
67
+ if (target.closest(INTERACTIVE))
68
+ return;
69
+ const body = target.closest(".vui-layer-body");
70
+ if (body && body.scrollTop > 0)
71
+ return;
72
+ drag.current = { y: e.clientY, t: performance.now(), id: e.pointerId, dy: 0 };
73
+ }, [enabled]);
74
+ const onPointerMove = React.useCallback((e) => {
75
+ const d = drag.current;
76
+ const el = ref.current;
77
+ if (!d || !el || e.pointerId !== d.id)
78
+ return;
79
+ const raw = e.clientY - d.y;
80
+ if (!el.hasAttribute("data-dragging")) {
81
+ if (Math.abs(raw) < 4)
82
+ return;
83
+ el.setAttribute("data-dragging", "");
84
+ el.setPointerCapture?.(e.pointerId);
85
+ }
86
+ // Upward drags resist (rubber band); downward follows the finger.
87
+ d.dy = raw < 0 ? -Math.sqrt(-raw) * 2 : raw;
88
+ el.style.translate = `0 ${d.dy}px`;
89
+ }, []);
90
+ const end = React.useCallback((e, cancelled) => {
91
+ const d = drag.current;
92
+ const el = ref.current;
93
+ drag.current = null;
94
+ if (!d || !el || !el.hasAttribute("data-dragging"))
95
+ return;
96
+ el.removeAttribute("data-dragging");
97
+ el.releasePointerCapture?.(e.pointerId);
98
+ const speed = d.dy / Math.max(1, performance.now() - d.t);
99
+ const height = el.getBoundingClientRect().height || 1;
100
+ if (!cancelled && d.dy > 0 && (d.dy > height * threshold || (speed > velocity && d.dy > 24))) {
101
+ dismiss.current();
102
+ // If a close guard keeps the panel open, spring back.
103
+ window.setTimeout(() => el.isConnected && el.getAttribute("data-state") === "open" && settle(), 320);
104
+ }
105
+ else
106
+ settle();
107
+ }, [threshold, velocity, dismiss, settle]);
108
+ return {
109
+ ref,
110
+ handlers: {
111
+ onPointerDown,
112
+ onPointerMove,
113
+ onPointerUp: (e) => end(e, false),
114
+ onPointerCancel: (e) => end(e, true),
115
+ },
116
+ };
117
+ }
118
+ /**
119
+ * A bottom sheet that closes by dragging down — mobile actions, filters, pickers. Dragging is an
120
+ * extra way to close: Esc and the close button always work.
121
+ *
122
+ * ```tsx
123
+ * <Drawer>
124
+ * <DrawerTrigger asChild><Button>Filters</Button></DrawerTrigger>
125
+ * <DrawerContent>
126
+ * <DrawerHeader title="Filter orders" />
127
+ * <DrawerBody>…</DrawerBody>
128
+ * <DrawerFooter>…</DrawerFooter>
129
+ * </DrawerContent>
130
+ * </Drawer>
131
+ * ```
132
+ */
133
+ export function Drawer(props) {
134
+ return _jsx(Dialog, { ...props });
135
+ }
136
+ export const DrawerTrigger = DialogTrigger;
137
+ export const DrawerClose = DialogClose;
138
+ export const DrawerHeader = LayerHeader;
139
+ export const DrawerFooter = LayerFooter;
140
+ /** The scrolling body of a drawer; dragging starts from it only while it is scrolled to the top. */
141
+ export const DrawerBody = React.forwardRef(function DrawerBody(props, ref) {
142
+ return _jsx(LayerBody, { ref: ref, "data-slot": "drawer-body", ...props });
143
+ });
144
+ /** The grab line at the top of a drawer. Decorative (`aria-hidden`). */
145
+ export function DrawerHandle({ className }) {
146
+ return _jsx("div", { "aria-hidden": true, "data-slot": "drawer-handle", className: cn("vui-drawer-handle", className) });
147
+ }
148
+ export const DrawerContent = React.forwardRef(function DrawerContent({ dragToDismiss = true, handle = true, size = "lg", className, children, onPointerDown, onPointerMove, onPointerUp, onPointerCancel, ...props }, ref) {
149
+ const root = useDialogRoot();
150
+ const { ref: dragRef, handlers } = useDragDismiss({ onDismiss: () => root.requestOpenChange(false), enabled: dragToDismiss });
151
+ const composed = useComposedRefs(ref, dragRef);
152
+ return (_jsxs(SheetContent, { ref: composed, side: "bottom", size: size, "data-slot": "drawer-content", className: cn("vui-drawer", className), onPointerDown: (e) => {
153
+ onPointerDown?.(e);
154
+ handlers.onPointerDown(e);
155
+ }, onPointerMove: (e) => {
156
+ onPointerMove?.(e);
157
+ handlers.onPointerMove(e);
158
+ }, onPointerUp: (e) => {
159
+ onPointerUp?.(e);
160
+ handlers.onPointerUp(e);
161
+ }, onPointerCancel: (e) => {
162
+ onPointerCancel?.(e);
163
+ handlers.onPointerCancel(e);
164
+ }, ...props, children: [handle ? _jsx(DrawerHandle, {}) : null, children] }));
165
+ });