@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,174 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { ChevronDown, ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useLabels } from "../lib/labels.js";
7
+ import { useFormat } from "../lib/locale.js";
8
+ import { useLink } from "../lib/provider.js";
9
+ import { controlVariants } from "../lib/variants.js";
10
+ import { buttonVariants } from "./button.js";
11
+ import { Spinner } from "./spinner.js";
12
+ const paginationLabels = {
13
+ label: "Pagination",
14
+ previous: "Previous",
15
+ next: "Next",
16
+ previousPage: "Previous page",
17
+ nextPage: "Next page",
18
+ goTo: "Page {page}",
19
+ page: "Page {page} of {total}",
20
+ range: "{from}–{to} of {total}",
21
+ empty: "No results",
22
+ pageSize: "Rows per page",
23
+ morePages: "More pages",
24
+ };
25
+ /**
26
+ * The page numbers to render, with ellipsis markers. The length stays constant while paging
27
+ * (no jumping buttons): `paginationRange({ page: 6, pageCount: 20 })` → `[1, "ellipsis-start", 5, 6, 7, "ellipsis-end", 20]`.
28
+ * A gap of exactly one page shows the page instead of "…".
29
+ */
30
+ export function paginationRange({ page, pageCount, siblingCount = 1, boundaryCount = 1 }) {
31
+ const count = Math.max(0, Math.floor(pageCount));
32
+ if (count === 0)
33
+ return [];
34
+ const current = Math.min(Math.max(1, Math.floor(page)), count);
35
+ const range = (a, b) => Array.from({ length: Math.max(0, b - a + 1) }, (_, i) => a + i);
36
+ // boundaries + siblings + current + 2 ellipses
37
+ const total = boundaryCount * 2 + siblingCount * 2 + 3;
38
+ if (count <= total)
39
+ return range(1, count);
40
+ const startPages = range(1, Math.min(boundaryCount, count));
41
+ const endPages = range(Math.max(count - boundaryCount + 1, boundaryCount + 1), count);
42
+ const siblingsStart = Math.max(Math.min(current - siblingCount, count - boundaryCount - siblingCount * 2 - 1), boundaryCount + 2);
43
+ const siblingsEnd = Math.min(Math.max(current + siblingCount, boundaryCount + siblingCount * 2 + 2), count - boundaryCount - 1);
44
+ const out = [...startPages];
45
+ if (siblingsStart > boundaryCount + 2)
46
+ out.push("ellipsis-start");
47
+ else if (boundaryCount + 1 < count - boundaryCount)
48
+ out.push(boundaryCount + 1);
49
+ out.push(...range(siblingsStart, siblingsEnd));
50
+ if (siblingsEnd < count - boundaryCount - 1)
51
+ out.push("ellipsis-end");
52
+ else if (count - boundaryCount > boundaryCount)
53
+ out.push(count - boundaryCount);
54
+ out.push(...endPages);
55
+ return out;
56
+ }
57
+ /** Memoised `paginationRange` for components. */
58
+ export function usePaginationRange(options) {
59
+ const { page, pageCount, siblingCount, boundaryCount } = options;
60
+ return React.useMemo(() => paginationRange({ page, pageCount, siblingCount, boundaryCount }), [page, pageCount, siblingCount, boundaryCount]);
61
+ }
62
+ const SizeContext = React.createContext("md");
63
+ const itemSize = {
64
+ sm: "h-8 min-w-8 px-2 text-[13px] rounded-ui-sm [&_svg]:size-3.5",
65
+ md: "h-(--control-h) min-w-(--control-h) px-2.5 text-sm rounded-ui [&_svg]:size-4",
66
+ };
67
+ /** The `<ul>` of page items. */
68
+ export const PaginationList = React.forwardRef(function PaginationList({ className, ...props }, ref) {
69
+ return _jsx("ul", { ref: ref, "data-slot": "pagination-list", className: cn("flex items-center gap-1", className), ...props });
70
+ });
71
+ /** One `<li>`. */
72
+ export const PaginationItem = React.forwardRef(function PaginationItem({ className, ...props }, ref) {
73
+ return _jsx("li", { ref: ref, "data-slot": "pagination-item", className: cn("inline-flex", className), ...props });
74
+ });
75
+ /** A page number, or the shell for Previous / Next. Router `Link` when `href` is set, else a button. */
76
+ export const PaginationLink = React.forwardRef(function PaginationLink({ href, isActive, disabled, loading, className, children, onClick, ...props }, ref) {
77
+ const Link = useLink();
78
+ const size = React.useContext(SizeContext);
79
+ const classes = cn(buttonVariants({ variant: "ghost" }), itemSize[size], "tabular font-normal text-fg-muted hover:text-fg", isActive && "bg-selected font-semibold text-fg hover:bg-selected", className);
80
+ const content = loading ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "invisible", children: children }), _jsx(Spinner, { size: "xs", className: "absolute" })] })) : (children);
81
+ if (href !== undefined && !disabled) {
82
+ return (_jsx(Link, { ref: ref, href: href, "aria-current": isActive ? "page" : undefined, "aria-busy": loading || undefined, className: classes, "data-slot": "pagination-link", onClick: onClick, ...props, children: content }));
83
+ }
84
+ if (href !== undefined && disabled) {
85
+ // A disabled link: no href, so it isn't focusable or followable.
86
+ return (_jsx("a", { ref: ref, role: "link", "aria-disabled": "true", className: classes, "data-slot": "pagination-link", ...props, children: content }));
87
+ }
88
+ return (_jsx("button", { ref: ref, type: "button", "aria-current": isActive ? "page" : undefined, "aria-busy": loading || undefined, disabled: disabled, className: classes, "data-slot": "pagination-link", onClick: onClick, ...props, children: content }));
89
+ });
90
+ /** Previous-page control. The arrow flips in RTL. */
91
+ export const PaginationPrevious = React.forwardRef(function PaginationPrevious({ showLabel, labels, className, ...props }, ref) {
92
+ const t = useLabels("pagination", paginationLabels, labels);
93
+ return (_jsxs(PaginationLink, { ref: ref, "aria-label": t("previousPage"), className: cn(showLabel && "gap-1 ps-2 pe-3", className), "data-slot": "pagination-previous", ...props, children: [_jsx(ChevronLeft, { "aria-hidden": true, className: "rtl:-scale-x-100" }), showLabel ? _jsx("span", { children: t("previous") }) : null] }));
94
+ });
95
+ /** Next-page control. The arrow flips in RTL. */
96
+ export const PaginationNext = React.forwardRef(function PaginationNext({ showLabel, labels, className, ...props }, ref) {
97
+ const t = useLabels("pagination", paginationLabels, labels);
98
+ return (_jsxs(PaginationLink, { ref: ref, "aria-label": t("nextPage"), className: cn(showLabel && "gap-1 ps-3 pe-2", className), "data-slot": "pagination-next", ...props, children: [showLabel ? _jsx("span", { children: t("next") }) : null, _jsx(ChevronRight, { "aria-hidden": true, className: "rtl:-scale-x-100" })] }));
99
+ });
100
+ /** "…" between page numbers. */
101
+ export function PaginationEllipsis({ className, labels, ...props }) {
102
+ const t = useLabels("pagination", paginationLabels, labels);
103
+ const size = React.useContext(SizeContext);
104
+ return (_jsxs("span", { "data-slot": "pagination-ellipsis", className: cn("inline-flex items-center justify-center text-fg-subtle", size === "sm" ? "h-8 w-6 [&_svg]:size-3.5" : "h-(--control-h) w-7 [&_svg]:size-4", className), ...props, children: [_jsx(MoreHorizontal, { "aria-hidden": true }), _jsx("span", { className: "sr-only", children: t("morePages") })] }));
105
+ }
106
+ /**
107
+ * Page through a long list. 1-based `page`, props line up with TanStack Table state.
108
+ *
109
+ * ```tsx
110
+ * <Pagination page={page} pageCount={52} onPageChange={setPage} />
111
+ * <Pagination page={3} pageCount={12} getHref={(p) => `/blog?page=${p}`} /> // SEO links
112
+ * ```
113
+ *
114
+ * Moving focus to the top of the list after a page change is the consumer's job.
115
+ */
116
+ export const Pagination = React.forwardRef(function Pagination({ page, pageCount, onPageChange, getHref, siblingCount, boundaryCount, variant = "numbers", size = "md", hideOnSinglePage = true, loading, labels, className, ...props }, ref) {
117
+ const t = useLabels("pagination", paginationLabels, labels);
118
+ const range = usePaginationRange({ page, pageCount, siblingCount, boundaryCount });
119
+ if (pageCount < 1 || (hideOnSinglePage && pageCount <= 1))
120
+ return null;
121
+ const current = Math.min(Math.max(1, page), pageCount);
122
+ const go = (p) => (e) => {
123
+ if (loading) {
124
+ e.preventDefault();
125
+ return;
126
+ }
127
+ if (p !== current)
128
+ onPageChange?.(p);
129
+ };
130
+ const linkProps = (p) => (getHref ? { href: getHref(p) } : {});
131
+ const compact = (_jsxs("span", { className: "tabular px-2 text-[13px] text-fg-muted", "aria-live": "polite", children: [_jsx("span", { className: "sr-only", children: t("page", { page: current, total: pageCount }) }), _jsxs("span", { "aria-hidden": true, children: [_jsx("span", { className: "font-medium text-fg", children: current }), " / ", pageCount] })] }));
132
+ return (_jsx(SizeContext.Provider, { value: size, children: _jsx("nav", { ref: ref, "aria-label": t("label"), "data-slot": "pagination", "data-variant": variant, className: cn("flex", className), ...props, children: _jsxs(PaginationList, { children: [_jsx(PaginationItem, { children: _jsx(PaginationPrevious, { disabled: current <= 1 || loading, onClick: go(current - 1), showLabel: variant === "simple", labels: labels, ...linkProps(current - 1) }) }), variant === "numbers"
133
+ ? range.map((item) => typeof item === "number" ? (_jsx(PaginationItem, { className: "max-sm:hidden", children: _jsx(PaginationLink, { isActive: item === current, loading: loading && item === current, "aria-label": t("goTo", { page: item }), onClick: go(item), ...linkProps(item), children: item }) }, item)) : (_jsx(PaginationItem, { className: "max-sm:hidden", children: _jsx(PaginationEllipsis, { labels: labels }) }, item)))
134
+ : null, variant === "numbers" ? _jsx(PaginationItem, { className: "sm:hidden", children: compact }) : null, variant === "compact" ? _jsx(PaginationItem, { children: compact }) : null, _jsx(PaginationItem, { children: _jsx(PaginationNext, { disabled: current >= pageCount || loading, onClick: go(current + 1), showLabel: variant === "simple", labels: labels, ...linkProps(current + 1) }) })] }) }) }));
135
+ });
136
+ /**
137
+ * The table footer: "1–20 of 312" + rows per page + page numbers. Changing the page size keeps the
138
+ * first visible row on screen (the page is recomputed) — the consumer receives both callbacks.
139
+ */
140
+ export const PaginationBar = React.forwardRef(function PaginationBar({ total, pageSize, pageSizeOptions = [10, 20, 50, 100], onPageSizeChange, page, onPageChange, labels, size = "md", className, style, id, ...props }, ref) {
141
+ const t = useLabels("pagination", paginationLabels, labels);
142
+ const f = useFormat();
143
+ const selectId = React.useId();
144
+ const pageCount = Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
145
+ const current = Math.min(Math.max(1, page), pageCount);
146
+ const from = total === 0 ? 0 : (current - 1) * pageSize + 1;
147
+ const to = Math.min(total, current * pageSize);
148
+ const options = pageSizeOptions.includes(pageSize) || pageSizeOptions.length === 0 ? pageSizeOptions : [...pageSizeOptions, pageSize].sort((a, b) => a - b);
149
+ return (_jsxs("div", { ref: ref, id: id, style: style, "data-slot": "pagination-bar", className: cn("flex flex-wrap items-center gap-x-6 gap-y-2 text-[13px] text-fg-muted", className), children: [_jsx("p", { className: "tabular me-auto", "aria-live": "polite", children: total === 0 ? t("empty") : t("range", { from: f.number(from), to: f.number(to), total: f.number(total) }) }), options.length > 0 && onPageSizeChange ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("label", { htmlFor: selectId, className: "whitespace-nowrap", children: t("pageSize") }), _jsxs("div", { className: "relative", children: [_jsx("select", { id: selectId, value: pageSize, onChange: (e) => {
150
+ const next = Number(e.target.value);
151
+ onPageSizeChange(next);
152
+ // keep the first visible row on screen
153
+ const nextPage = Math.floor((from > 0 ? from - 1 : 0) / next) + 1;
154
+ if (nextPage !== current)
155
+ onPageChange?.(nextPage);
156
+ }, className: cn(controlVariants({ size: "sm" }), "tabular w-auto appearance-none pe-7 text-fg"), children: options.map((o) => (_jsx("option", { value: o, children: f.number(o) }, o))) }), _jsx(ChevronDown, { "aria-hidden": true, className: "pointer-events-none absolute end-2 top-1/2 size-3.5 -translate-y-1/2 text-fg-subtle" })] })] })) : null, _jsx(Pagination, { page: current, pageCount: pageCount, onPageChange: onPageChange, labels: labels, size: size, hideOnSinglePage: false, ...props })] }));
157
+ });
158
+ /** Previous / Next for cursor APIs where the total is unknown. */
159
+ export const CursorPagination = React.forwardRef(function CursorPagination({ hasPrev, hasNext, onPrev, onNext, loading, status, size = "md", labels, className, ...props }, ref) {
160
+ const t = useLabels("pagination", paginationLabels, labels);
161
+ const [pressed, setPressed] = React.useState(null);
162
+ React.useEffect(() => {
163
+ if (!loading)
164
+ setPressed(null);
165
+ }, [loading]);
166
+ const btn = cn(buttonVariants({ variant: "secondary", size: size === "sm" ? "sm" : "md" }), "gap-1");
167
+ return (_jsxs("nav", { ref: ref, "aria-label": t("label"), "data-slot": "cursor-pagination", className: cn("flex items-center gap-3", className), ...props, children: [_jsxs("button", { type: "button", className: cn(btn, "ps-2.5"), disabled: !hasPrev || loading, "aria-busy": (loading && pressed === "prev") || undefined, onClick: () => {
168
+ setPressed("prev");
169
+ onPrev?.();
170
+ }, children: [loading && pressed === "prev" ? _jsx(Spinner, { size: "xs" }) : _jsx(ChevronLeft, { "aria-hidden": true, className: "rtl:-scale-x-100" }), t("previous")] }), status ? _jsx("span", { className: "tabular text-[13px] text-fg-muted", children: status }) : null, _jsxs("button", { type: "button", className: cn(btn, "pe-2.5"), disabled: !hasNext || loading, "aria-busy": (loading && pressed === "next") || undefined, onClick: () => {
171
+ setPressed("next");
172
+ onNext?.();
173
+ }, children: [t("next"), loading && pressed === "next" ? _jsx(Spinner, { size: "xs" }) : _jsx(ChevronRight, { "aria-hidden": true, className: "rtl:-scale-x-100" })] })] }));
174
+ });
@@ -0,0 +1,49 @@
1
+ import * as React from "react";
2
+ import { type BaseFormattedProps } from "./formatted-input.js";
3
+ type PhoneLib = typeof import("libphonenumber-js/min");
4
+ /**
5
+ * Loads the phone metadata (`libphonenumber-js/min`, ~80 kB) once. PhoneInput calls it on mount;
6
+ * call it earlier (e.g. on hover of "Add contact") to have formatting ready on first keystroke.
7
+ */
8
+ export declare function preloadPhoneInput(): Promise<PhoneLib>;
9
+ declare const phoneInputLabels: {
10
+ country: string;
11
+ suggested: string;
12
+ allCountries: string;
13
+ invalid: string;
14
+ invalidFor: string;
15
+ tooShort: string;
16
+ tooLong: string;
17
+ };
18
+ export type PhoneInputLabels = typeof phoneInputLabels;
19
+ export interface PhoneInputProps extends BaseFormattedProps<string | null> {
20
+ /** Selected country (ISO 3166-1 alpha-2), controlled. */
21
+ country?: string;
22
+ /** Initial country. Default `"TR"` for Turkish locales, else the locale's region, else `"US"`. */
23
+ defaultCountry?: string;
24
+ onCountryChange?: (country: string) => void;
25
+ /** Limit the country list. */
26
+ countries?: string[];
27
+ /** Shown first, under "Suggested". */
28
+ preferredCountries?: string[];
29
+ /**
30
+ * How a complete number is shown after blur: `"national"` ("0532 123 45 67") when it belongs to
31
+ * the selected country, or `"international"` ("+90 532 123 45 67"). Default `"national"`.
32
+ */
33
+ display?: "national" | "international";
34
+ /** Hide the country picker (single-country forms). */
35
+ hideCountry?: boolean;
36
+ labels?: Partial<PhoneInputLabels>;
37
+ }
38
+ /**
39
+ * Phone number entry with a country picker. Formats as you type for the selected country,
40
+ * accepts what people actually type ("0532…", "532…", "90532…", "+90 (532)…", "0090…") and
41
+ * emits **E.164** (`"+905321234567"`). Typing `+` and a calling code switches the country.
42
+ * Parsing uses `libphonenumber-js` (min metadata), loaded lazily.
43
+ *
44
+ * ```tsx
45
+ * <Field label="Mobile"><PhoneInput defaultCountry="TR" onValueChange={(e164) => save(e164)} /></Field>
46
+ * ```
47
+ */
48
+ export declare const PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps & React.RefAttributes<HTMLInputElement>>;
49
+ export {};
@@ -0,0 +1,266 @@
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 { ChevronDown } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useComposedRefs } from "../lib/compose-refs.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { useLocale } from "../lib/locale.js";
9
+ import { compareText } from "../lib/text.js";
10
+ import { useControllableState } from "../lib/use-controllable-state.js";
11
+ import { useFormattedInput } from "../lib/use-formatted-input.js";
12
+ import { Input } from "./input.js";
13
+ import { WithoutFieldName, useFormattedValidity, useSubmitName } from "./formatted-input.js";
14
+ let libPromise;
15
+ let libLoaded = null;
16
+ /**
17
+ * Loads the phone metadata (`libphonenumber-js/min`, ~80 kB) once. PhoneInput calls it on mount;
18
+ * call it earlier (e.g. on hover of "Add contact") to have formatting ready on first keystroke.
19
+ */
20
+ export function preloadPhoneInput() {
21
+ libPromise ??= import("libphonenumber-js/min").then((m) => {
22
+ const lib = (m.default?.AsYouType ? m.default : m);
23
+ libLoaded = lib;
24
+ return lib;
25
+ });
26
+ return libPromise;
27
+ }
28
+ const phoneInputLabels = {
29
+ country: "Country",
30
+ suggested: "Suggested",
31
+ allCountries: "All countries",
32
+ invalid: "Enter a valid phone number",
33
+ invalidFor: "Enter a valid phone number for {country}",
34
+ tooShort: "This number is too short",
35
+ tooLong: "This number is too long",
36
+ };
37
+ function regionOfLocale(locale) {
38
+ try {
39
+ return new Intl.Locale(locale).maximize().region;
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ }
45
+ const accept = (ch) => (ch >= "0" && ch <= "9") || ch === "+";
46
+ /**
47
+ * Phone number entry with a country picker. Formats as you type for the selected country,
48
+ * accepts what people actually type ("0532…", "532…", "90532…", "+90 (532)…", "0090…") and
49
+ * emits **E.164** (`"+905321234567"`). Typing `+` and a calling code switches the country.
50
+ * Parsing uses `libphonenumber-js` (min metadata), loaded lazily.
51
+ *
52
+ * ```tsx
53
+ * <Field label="Mobile"><PhoneInput defaultCountry="TR" onValueChange={(e164) => save(e164)} /></Field>
54
+ * ```
55
+ */
56
+ export const PhoneInput = React.forwardRef(function PhoneInput(props, forwardedRef) {
57
+ const { country: countryProp, defaultCountry, onCountryChange, countries, preferredCountries, display: displayMode = "national", hideCountry, value, defaultValue, onValueChange, validateOn = "blur", onValidate, mono, labels, name, invalid, inputClassName, onBlur, onKeyDown, disabled, readOnly, size, ...rest } = props;
58
+ const { locale } = useLocale();
59
+ const t = useLabels("phoneInput", phoneInputLabels, labels);
60
+ const [lib, setLib] = React.useState(libLoaded);
61
+ const libRef = React.useRef(lib);
62
+ libRef.current = lib;
63
+ const fallbackCountry = (defaultCountry ?? (locale.toLowerCase().startsWith("tr") ? "TR" : regionOfLocale(locale)) ?? "US").toUpperCase();
64
+ const [country, setCountry] = useControllableState({ value: countryProp?.toUpperCase(), defaultValue: fallbackCountry, onChange: onCountryChange, name: "PhoneInput" });
65
+ const countryRef = React.useRef(country);
66
+ countryRef.current = country;
67
+ const v = useFormattedValidity(validateOn, onValidate);
68
+ const regionNames = React.useMemo(() => {
69
+ try {
70
+ return new Intl.DisplayNames([locale], { type: "region" });
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }, [locale]);
76
+ const countryName = (c) => regionNames?.of(c) ?? c;
77
+ /* ---------------- parsing (pure helpers over the loaded lib) ---------------- */
78
+ const digitsOf = (s) => {
79
+ let plus = /^\s*\+/.test(s);
80
+ let d = s.replace(/\D/g, "");
81
+ if (!plus && d.startsWith("00")) {
82
+ plus = true;
83
+ d = d.slice(2);
84
+ }
85
+ return { plus, d };
86
+ };
87
+ const parseNumber = (text) => {
88
+ const l = libRef.current;
89
+ if (!l)
90
+ return undefined;
91
+ const { plus, d } = digitsOf(text);
92
+ if (!d)
93
+ return undefined;
94
+ const c = countryRef.current;
95
+ const primary = plus ? l.parsePhoneNumberFromString(`+${d}`) : l.parsePhoneNumberFromString(d, c);
96
+ if (primary?.isValid())
97
+ return primary;
98
+ if (!plus) {
99
+ // "90532…" with the calling code but without "+"
100
+ const alt = l.parsePhoneNumberFromString(`+${d}`);
101
+ if (alt?.isValid())
102
+ return alt;
103
+ }
104
+ return primary;
105
+ };
106
+ const format = (typed) => {
107
+ const { plus, d } = digitsOf(typed);
108
+ const l = libRef.current;
109
+ if (!d)
110
+ return plus ? "+" : "";
111
+ if (!l)
112
+ return (plus ? "+" : "") + d.slice(0, 15);
113
+ if (plus)
114
+ return new l.AsYouType().input(`+${d.slice(0, 15)}`);
115
+ return new l.AsYouType(countryRef.current).input(d.slice(0, 17));
116
+ };
117
+ const parse = (display) => {
118
+ const l = libRef.current;
119
+ const { plus, d } = digitsOf(display);
120
+ if (!d)
121
+ return null;
122
+ if (!l)
123
+ return plus && d.length >= 7 ? `+${d}` : null;
124
+ const p = parseNumber(display);
125
+ return p && p.isPossible() ? p.number : null;
126
+ };
127
+ const pretty = (display) => {
128
+ const p = parseNumber(display);
129
+ if (!p || !p.isValid())
130
+ return display;
131
+ return displayMode === "national" && p.country === countryRef.current ? p.formatNational() : p.formatInternational();
132
+ };
133
+ const toDisplay = (raw) => {
134
+ if (!raw)
135
+ return "";
136
+ if (!libRef.current)
137
+ return raw;
138
+ return pretty(raw.startsWith("+") ? raw : `+${raw}`);
139
+ };
140
+ const check = (display) => {
141
+ const l = libRef.current;
142
+ const { d } = digitsOf(display);
143
+ if (!d)
144
+ return { valid: true };
145
+ if (!l)
146
+ return d.length >= 7 ? { valid: true } : { valid: false, reason: "tooShort", message: t("tooShort") };
147
+ const p = parseNumber(display);
148
+ if (p?.isValid())
149
+ return { valid: true };
150
+ const { plus } = digitsOf(display);
151
+ const len = plus ? l.validatePhoneNumberLength(`+${d}`) : l.validatePhoneNumberLength(d, countryRef.current);
152
+ if (len === "TOO_SHORT")
153
+ return { valid: false, reason: "tooShort", message: t("tooShort") };
154
+ if (len === "TOO_LONG")
155
+ return { valid: false, reason: "tooLong", message: t("tooLong") };
156
+ return { valid: false, reason: "invalid", message: plus ? t("invalid") : t("invalidFor", { country: countryName(countryRef.current) }) };
157
+ };
158
+ const engine = useFormattedInput({
159
+ value,
160
+ defaultValue,
161
+ accept,
162
+ format,
163
+ parse,
164
+ toDisplay,
165
+ formatOnBlur: pretty,
166
+ onValueChange: (raw, formatted) => {
167
+ const c = check(formatted);
168
+ v.report(c, "change");
169
+ // "+44 20…" typed into a TR field: follow the number's country.
170
+ const l = libRef.current;
171
+ if (l && formatted.trim().startsWith("+")) {
172
+ const detected = parseNumber(formatted)?.country;
173
+ if (detected && detected !== countryRef.current && (!countries || countries.includes(detected)))
174
+ setCountry(detected);
175
+ }
176
+ onValueChange?.(raw, { valid: c.valid, reason: c.reason, formatted, kind: raw ? parseNumber(formatted)?.country : undefined });
177
+ },
178
+ });
179
+ const ref = useComposedRefs(forwardedRef, engine.ref);
180
+ const submitName = useSubmitName(name);
181
+ const engineRef = React.useRef(engine);
182
+ engineRef.current = engine;
183
+ // Load metadata, then re-format whatever is there.
184
+ React.useEffect(() => {
185
+ if (libRef.current)
186
+ return;
187
+ let alive = true;
188
+ preloadPhoneInput().then((l) => {
189
+ if (!alive)
190
+ return;
191
+ libRef.current = l;
192
+ setLib(l);
193
+ const e = engineRef.current;
194
+ const raw = e.raw;
195
+ if (raw)
196
+ e.setDisplay(toDisplay(raw));
197
+ else if (e.display)
198
+ e.setDisplay(e.display);
199
+ });
200
+ return () => {
201
+ alive = false;
202
+ };
203
+ // eslint-disable-next-line react-hooks/exhaustive-deps
204
+ }, []);
205
+ const changeCountry = (next) => {
206
+ const prev = countryRef.current;
207
+ setCountry(next);
208
+ countryRef.current = next;
209
+ const e = engineRef.current;
210
+ const l = libRef.current;
211
+ if (!e.display)
212
+ return;
213
+ const { plus } = digitsOf(e.display);
214
+ // Keep the local part when switching country ("0532…" stays, "+90 532…" → national under the new country).
215
+ let national = e.display.replace(/\D/g, "");
216
+ if (l && plus) {
217
+ const p = parseNumber(e.display);
218
+ national = p?.nationalNumber ?? national;
219
+ }
220
+ else if (l && prev !== next) {
221
+ const p = l.parsePhoneNumberFromString(national, prev);
222
+ if (p)
223
+ national = p.nationalNumber;
224
+ }
225
+ e.setDisplay(national);
226
+ };
227
+ /* ---------------- country list ---------------- */
228
+ const list = React.useMemo(() => {
229
+ const all = (countries ?? lib?.getCountries() ?? [country]).map((c) => c.toUpperCase());
230
+ if (!all.includes(country))
231
+ all.unshift(country);
232
+ const cmp = compareText(locale);
233
+ return all.map((c) => ({ code: c, name: countryName(c) })).sort((a, b) => cmp(a.name, b.name));
234
+ // eslint-disable-next-line react-hooks/exhaustive-deps
235
+ }, [countries, lib, locale, country, regionNames]);
236
+ const preferred = preferredCountries?.map((c) => c.toUpperCase()).filter((c) => list.some((x) => x.code === c));
237
+ const callingCode = (c) => {
238
+ try {
239
+ return lib ? `+${lib.getCountryCallingCode(c)}` : "";
240
+ }
241
+ catch {
242
+ return "";
243
+ }
244
+ };
245
+ const optionText = (c) => `${c.name} ${callingCode(c.code)}`.trim();
246
+ const picker = hideCountry ? null : (_jsxs("span", { "data-slot": "phone-input-country", className: "relative -mx-3 flex h-full items-center gap-1.5 px-3 font-mono text-[12px] tabular text-fg-muted has-[select:focus-visible]:bg-hover has-[select:focus-visible]:text-fg", children: [_jsx("span", { "aria-hidden": true, className: "font-semibold tracking-[0.04em] text-fg", children: country }), _jsx("span", { "aria-hidden": true, className: "text-fg-subtle", children: callingCode(country) }), !readOnly ? _jsx(ChevronDown, { "aria-hidden": true, className: "size-3 text-fg-subtle" }) : null, !readOnly ? (_jsxs("select", { "aria-label": t("country"), value: country, disabled: disabled, onChange: (e) => changeCountry(e.currentTarget.value), className: "absolute inset-0 cursor-pointer appearance-none bg-transparent opacity-0 outline-none disabled:cursor-not-allowed", children: [preferred?.length ? (_jsx("optgroup", { label: t("suggested"), children: preferred.map((c) => (_jsx("option", { value: c, children: optionText({ code: c, name: countryName(c) }) }, `p-${c}`))) })) : null, preferred?.length ? (_jsx("optgroup", { label: t("allCountries"), children: list.map((c) => (_jsx("option", { value: c.code, children: optionText(c) }, c.code))) })) : (list.map((c) => (_jsx("option", { value: c.code, children: optionText(c) }, c.code))))] })) : null] }));
247
+ return (_jsxs(_Fragment, { children: [_jsx(WithoutFieldName, { children: _jsx(Input, { ref: ref, ...rest, ...engine.inputProps, size: size, type: "tel", inputMode: "tel", autoComplete: "tel", dir: "ltr", disabled: disabled, readOnly: readOnly, invalid: invalid || v.invalid, addonStart: picker ?? undefined, inputClassName: cn("tabular", mono && "font-mono", inputClassName), "data-slot": "phone-input", "data-country": country, placeholder: rest.placeholder ?? (lib ? exampleFor(lib, country, displayMode) : undefined), onKeyDown: (e) => {
248
+ onKeyDown?.(e);
249
+ engine.inputProps.onKeyDown(e);
250
+ }, onBlur: (e) => {
251
+ engine.inputProps.onBlur(e);
252
+ v.report(check(e.currentTarget.value), "blur");
253
+ onBlur?.(e);
254
+ } }) }), submitName ? _jsx("input", { type: "hidden", name: submitName, value: engine.raw ?? "", disabled: disabled }) : null] }));
255
+ });
256
+ /** A typed-looking placeholder per country, derived from the metadata (no example numbers in /min). */
257
+ function exampleFor(lib, country, mode) {
258
+ const samples = { TR: "5321234567", US: "2015550123", GB: "7400123456", DE: "15123456789", NL: "612345678", FR: "612345678" };
259
+ const n = samples[country];
260
+ if (!n)
261
+ return undefined;
262
+ const p = lib.parsePhoneNumberFromString(n, country);
263
+ if (!p)
264
+ return undefined;
265
+ return mode === "national" ? p.formatNational() : p.formatInternational();
266
+ }
@@ -0,0 +1,38 @@
1
+ import * as React from "react";
2
+ import { Popover as PopoverPrimitive } from "radix-ui";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ /** Root. Controlled (`open` / `onOpenChange`) or uncontrolled (`defaultOpen`). */
5
+ export declare const Popover: React.FC<PopoverPrimitive.PopoverProps>;
6
+ export declare const PopoverTrigger: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>>;
7
+ /** Position the content against something other than the trigger. */
8
+ export declare const PopoverAnchor: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>>;
9
+ /** Closes the popover; use `asChild` with a Button. */
10
+ export declare const PopoverClose: React.ForwardRefExoticComponent<PopoverPrimitive.PopoverCloseProps & React.RefAttributes<HTMLButtonElement>>;
11
+ export declare const popoverContentVariants: (props?: ({
12
+ size?: "auto" | "trigger" | "sm" | "md" | "lg" | null | undefined;
13
+ padded?: boolean | null | undefined;
14
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
15
+ export interface PopoverContentProps extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>, VariantProps<typeof popoverContentVariants> {
16
+ /** Show the pointer arrow. Default `false`. */
17
+ arrow?: boolean;
18
+ }
19
+ /**
20
+ * The floating panel. Portals into the nearest `ThemeScope`, sets the layer depth
21
+ * (only the first layer blurs in glass mode; a popover inside a dialog turns opaque),
22
+ * and is labelled by its `PopoverTitle` when one is rendered.
23
+ */
24
+ export declare const PopoverContent: React.ForwardRefExoticComponent<PopoverContentProps & React.RefAttributes<HTMLDivElement>>;
25
+ export interface PopoverHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
26
+ /** Heading; becomes the popover's accessible name. */
27
+ title?: React.ReactNode;
28
+ description?: React.ReactNode;
29
+ /** Trailing element (a close button, a badge). */
30
+ action?: React.ReactNode;
31
+ }
32
+ /** Title + optional description at the top of the content. */
33
+ export declare const PopoverHeader: React.ForwardRefExoticComponent<PopoverHeaderProps & React.RefAttributes<HTMLDivElement>>;
34
+ /** Heading inside the content; wired to `aria-labelledby`. */
35
+ export declare const PopoverTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & React.RefAttributes<HTMLHeadingElement>>;
36
+ export declare function PopoverDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
37
+ /** Bottom row for actions. Bleeds to the panel edge with a hairline on top. */
38
+ export declare const PopoverFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,69 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Popover as PopoverPrimitive } from "radix-ui";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "../lib/cn.js";
7
+ import { usePortalContainer } from "../lib/theme-scope.js";
8
+ import { Layer } from "../lib/layer.js";
9
+ import { FloatingArrow } from "../lib/floating-arrow.js";
10
+ /** Root. Controlled (`open` / `onOpenChange`) or uncontrolled (`defaultOpen`). */
11
+ export const Popover = PopoverPrimitive.Root;
12
+ export const PopoverTrigger = PopoverPrimitive.Trigger;
13
+ /** Position the content against something other than the trigger. */
14
+ export const PopoverAnchor = PopoverPrimitive.Anchor;
15
+ /** Closes the popover; use `asChild` with a Button. */
16
+ export const PopoverClose = PopoverPrimitive.Close;
17
+ export const popoverContentVariants = cva(["surface-popover ui-pop z-(--z-popover) rounded-ui-lg outline-none", "max-h-(--radix-popover-content-available-height) overflow-y-auto overscroll-contain"], {
18
+ variants: {
19
+ size: {
20
+ auto: "w-auto max-w-[calc(100vw-1.5rem)]",
21
+ sm: "w-64 max-w-[calc(100vw-1.5rem)]",
22
+ md: "w-80 max-w-[calc(100vw-1.5rem)]",
23
+ lg: "w-[26rem] max-w-[calc(100vw-1.5rem)]",
24
+ /** Same width as the trigger (lists, comboboxes). */
25
+ trigger: "w-(--radix-popover-trigger-width) min-w-40",
26
+ },
27
+ padded: {
28
+ true: "p-(--popover-p) [--popover-p:calc(var(--gap)*0.85)]",
29
+ false: "p-0 [--popover-p:0px]",
30
+ },
31
+ },
32
+ defaultVariants: { size: "md", padded: true },
33
+ });
34
+ const PopoverTitleContext = React.createContext(null);
35
+ /**
36
+ * The floating panel. Portals into the nearest `ThemeScope`, sets the layer depth
37
+ * (only the first layer blurs in glass mode; a popover inside a dialog turns opaque),
38
+ * and is labelled by its `PopoverTitle` when one is rendered.
39
+ */
40
+ export const PopoverContent = React.forwardRef(function PopoverContent({ className, size, padded, arrow = false, sideOffset = 6, collisionPadding = 12, align = "center", children, ...props }, ref) {
41
+ const container = usePortalContainer();
42
+ const titleId = React.useId();
43
+ const [hasTitle, setHasTitle] = React.useState(false);
44
+ const titleCtx = React.useMemo(() => ({ id: titleId, register: setHasTitle }), [titleId]);
45
+ return (_jsx(PopoverPrimitive.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsxs(PopoverPrimitive.Content, { ref: ref, "data-slot": "popover-content", sideOffset: sideOffset, collisionPadding: collisionPadding, align: align, "aria-labelledby": hasTitle ? titleId : undefined, className: cn(popoverContentVariants({ size, padded }), className), ...props, children: [_jsx(PopoverTitleContext.Provider, { value: titleCtx, children: children }), arrow ? (_jsx(PopoverPrimitive.Arrow, { asChild: true, width: 14, height: 7, children: _jsx(FloatingArrow, {}) })) : null] }) }) }));
46
+ });
47
+ /** Title + optional description at the top of the content. */
48
+ export const PopoverHeader = React.forwardRef(function PopoverHeader({ title, description, action, className, children, ...props }, ref) {
49
+ return (_jsxs("div", { ref: ref, "data-slot": "popover-header", className: cn("mb-3 flex items-start gap-3", className), ...props, children: [_jsxs("div", { className: "grid min-w-0 flex-1 gap-0.5", children: [title != null ? _jsx(PopoverTitle, { children: title }) : null, description != null ? _jsx(PopoverDescription, { children: description }) : null, children] }), action ? _jsx("div", { className: "-me-1 -mt-1 shrink-0", children: action }) : null] }));
50
+ });
51
+ /** Heading inside the content; wired to `aria-labelledby`. */
52
+ export const PopoverTitle = React.forwardRef(function PopoverTitle({ className, id, ...props }, ref) {
53
+ const ctx = React.useContext(PopoverTitleContext);
54
+ const register = ctx?.register;
55
+ React.useEffect(() => {
56
+ if (!register || id)
57
+ return;
58
+ register(true);
59
+ return () => register(false);
60
+ }, [register, id]);
61
+ return _jsx("h3", { ref: ref, id: id ?? ctx?.id, "data-slot": "popover-title", className: cn("text-sm font-semibold leading-tight tracking-[-0.005em] text-fg", className), ...props });
62
+ });
63
+ export function PopoverDescription({ className, ...props }) {
64
+ return _jsx("p", { "data-slot": "popover-description", className: cn("text-[13px] leading-snug text-fg-muted", className), ...props });
65
+ }
66
+ /** Bottom row for actions. Bleeds to the panel edge with a hairline on top. */
67
+ export const PopoverFooter = React.forwardRef(function PopoverFooter({ className, ...props }, ref) {
68
+ return (_jsx("div", { ref: ref, "data-slot": "popover-footer", className: cn("-mx-(--popover-p) -mb-(--popover-p) mt-4 flex items-center justify-end gap-2 border-t border-line px-(--popover-p) py-[calc(var(--popover-p)*0.7)]", className), ...props }));
69
+ });