@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,251 @@
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 { Check, ChevronDown, Copy, Link2, MoreHorizontal, Pencil, Plus, Star, Trash2, Users } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { useLabels } from "../lib/labels.js";
7
+ import { useLocale } from "../lib/locale.js";
8
+ import { getCollator } from "../lib/text.js";
9
+ import { useContainerWidth } from "../lib/use-container-width.js";
10
+ import { ConfirmDialog } from "../components/alert-dialog.js";
11
+ import { Button } from "../components/button.js";
12
+ import { Checkbox } from "../components/checkbox.js";
13
+ import { Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader } from "../components/dialog.js";
14
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger } from "../components/dropdown-menu.js";
15
+ import { Field, Input } from "../components/input.js";
16
+ import { RadioGroup } from "../components/radio-group.js";
17
+ import { Tooltip } from "../components/tooltip.js";
18
+ import { toast } from "../components/toast.js";
19
+ import { viewStateEqual } from "./view-state.js";
20
+ export const savedViewsLabels = {
21
+ label: "Views",
22
+ all: "All",
23
+ more: "More",
24
+ moreAria: "More views",
25
+ create: "View",
26
+ createAria: "Save current view",
27
+ modified: "Modified",
28
+ modifiedAnnounce: "View modified.",
29
+ save: "Save",
30
+ saveAs: "Save as new",
31
+ reset: "Reset",
32
+ readOnlyReason: "Only the owner can change this team view. Save a copy instead.",
33
+ actions: "View actions for {name}",
34
+ rename: "Rename",
35
+ duplicate: "Duplicate",
36
+ setDefault: "Set as default",
37
+ isDefault: "Default view",
38
+ copyLink: "Copy link",
39
+ linkCopied: "Link copied",
40
+ delete: "Delete view",
41
+ deleteTitle: "Delete “{name}”?",
42
+ deleteDescription: "The view is removed for everyone who can see it. The records stay as they are.",
43
+ deleteConfirm: "Delete view",
44
+ dialogCreate: "Save view",
45
+ dialogCreateDescription: "Saves the current filters, sort and columns.",
46
+ dialogRename: "Rename view",
47
+ name: "Name",
48
+ namePlaceholder: "e.g. Hot leads this month",
49
+ nameRequired: "Give the view a name.",
50
+ scope: "Visible to",
51
+ personal: "Only me",
52
+ team: "Everyone on the team",
53
+ makeDefault: "Open this view by default",
54
+ cancel: "Cancel",
55
+ confirmSave: "Save view",
56
+ confirmRename: "Rename",
57
+ saving: "Saving…",
58
+ saveError: "Couldn’t save the view. Try again.",
59
+ copyOf: "{name} copy",
60
+ teamView: "Team view",
61
+ selectAria: "Current view: {name}",
62
+ };
63
+ function defaultShareUrl(id) {
64
+ if (typeof window === "undefined")
65
+ return "";
66
+ const url = new URL(window.location.href);
67
+ url.searchParams.set("sv", id);
68
+ return url.toString();
69
+ }
70
+ /**
71
+ * Named list configurations — "My open deals", "Hot leads", "Probation ending" — as tabs above a
72
+ * list. Switching applies filters, sort and columns; changes show a "Modified" strip with Save,
73
+ * Save as new and Reset. Persistence is the app's job; the kit provides shape, dirty state and links.
74
+ *
75
+ * ```tsx
76
+ * <SavedViews views={views} {...table.savedViewsBinding(views)} onSave={create} onUpdate={update} />
77
+ * ```
78
+ */
79
+ export const SavedViews = React.forwardRef(function SavedViews({ views, activeId, current, isDirty: dirtyProp, onSelect, onSave, onUpdate, onRename, onDelete, onSetDefault, onReset, getShareUrl = defaultShareUrl, permissions, variant = "auto", showAll = true, maxVisible = 4, sortByName, panelId, size = "md", labels, className, ...props }, ref) {
80
+ const t = useLabels("savedViews", savedViewsLabels, labels);
81
+ const { locale } = useLocale();
82
+ const { ref: measureRef, width } = useContainerWidth();
83
+ const asSelect = variant === "select" || (variant === "auto" && width !== undefined && width < 420);
84
+ const [dialog, setDialog] = React.useState(null);
85
+ const [confirmDelete, setConfirmDelete] = React.useState(null);
86
+ const [saving, setSaving] = React.useState(false);
87
+ const [announce, setAnnounce] = React.useState("");
88
+ const tabRefs = React.useRef(new Map());
89
+ const [focusKey, setFocusKey] = React.useState(null);
90
+ const ordered = React.useMemo(() => {
91
+ const list = [...views];
92
+ if (sortByName) {
93
+ const c = getCollator(locale);
94
+ list.sort((a, b) => Number(Boolean(b.system)) - Number(Boolean(a.system)) || c.compare(a.name, b.name));
95
+ }
96
+ return list;
97
+ }, [views, sortByName, locale]);
98
+ const active = activeId ? (views.find((v) => v.id === activeId) ?? null) : null;
99
+ const dirty = dirtyProp ?? (active ? !viewStateEqual(current, active.state) : false);
100
+ const canEdit = (v) => !v.system && (permissions?.canEdit ? permissions.canEdit(v) : true);
101
+ React.useEffect(() => {
102
+ if (dirty)
103
+ setAnnounce(t("modifiedAnnounce"));
104
+ else
105
+ setAnnounce("");
106
+ }, [dirty, t]);
107
+ const visible = ordered.slice(0, maxVisible);
108
+ if (active && !visible.includes(active))
109
+ visible.push(active);
110
+ const overflow = ordered.filter((v) => !visible.includes(v));
111
+ const keyOf = (id) => id ?? "__all";
112
+ const tabKeys = [...(showAll ? [null] : []), ...visible.map((v) => v.id)];
113
+ const activeKey = keyOf(activeId);
114
+ const rovingKey = focusKey && tabKeys.some((k) => keyOf(k) === focusKey) ? focusKey : activeKey;
115
+ const onTabKeyDown = (e, index) => {
116
+ const rtl = getComputedStyle(e.currentTarget).direction === "rtl";
117
+ let to = -1;
118
+ if (e.key === (rtl ? "ArrowLeft" : "ArrowRight"))
119
+ to = (index + 1) % tabKeys.length;
120
+ else if (e.key === (rtl ? "ArrowRight" : "ArrowLeft"))
121
+ to = (index - 1 + tabKeys.length) % tabKeys.length;
122
+ else if (e.key === "Home")
123
+ to = 0;
124
+ else if (e.key === "End")
125
+ to = tabKeys.length - 1;
126
+ if (to === -1)
127
+ return;
128
+ e.preventDefault();
129
+ const key = keyOf(tabKeys[to]);
130
+ setFocusKey(key);
131
+ tabRefs.current.get(key)?.focus();
132
+ };
133
+ const copyLink = async (id) => {
134
+ const url = getShareUrl(id);
135
+ try {
136
+ await navigator.clipboard.writeText(url);
137
+ toast.success(t("linkCopied"));
138
+ }
139
+ catch {
140
+ /* clipboard blocked: nothing to do */
141
+ }
142
+ };
143
+ const update = async () => {
144
+ if (!active || !onUpdate || !canEdit(active))
145
+ return;
146
+ setSaving(true);
147
+ try {
148
+ await onUpdate(active.id, current);
149
+ }
150
+ catch {
151
+ toast.danger(t("saveError"));
152
+ }
153
+ finally {
154
+ setSaving(false);
155
+ }
156
+ };
157
+ const duplicate = async (v) => {
158
+ if (!onSave)
159
+ return;
160
+ try {
161
+ const created = await onSave({ name: t("copyOf", { name: v.name }), scope: "personal", state: v.state });
162
+ if (created)
163
+ onSelect(created.id);
164
+ }
165
+ catch {
166
+ toast.danger(t("saveError"));
167
+ }
168
+ };
169
+ const tabClass = cn("group/tab relative inline-flex shrink-0 items-center gap-1.5 rounded-ui-sm px-2.5 font-medium whitespace-nowrap transition-colors focus-ring", size === "sm" ? "h-7 text-xs" : "h-8 text-[13px]", "text-fg-muted hover:bg-hover hover:text-fg aria-selected:bg-selected aria-selected:text-fg");
170
+ const tab = (v, index) => {
171
+ const key = keyOf(v?.id ?? null);
172
+ const selected = key === activeKey;
173
+ const Icon = v?.icon;
174
+ return (_jsxs("button", { ref: (el) => {
175
+ if (el)
176
+ tabRefs.current.set(key, el);
177
+ else
178
+ tabRefs.current.delete(key);
179
+ }, type: "button", role: "tab", id: `${key}-tab`, "aria-selected": selected, "aria-controls": panelId, tabIndex: key === rovingKey ? 0 : -1, onFocus: () => setFocusKey(key), onKeyDown: (e) => onTabKeyDown(e, index), onClick: () => !selected && onSelect(v?.id ?? null), className: tabClass, "data-slot": "saved-view-tab", children: [Icon ? _jsx(Icon, { className: "size-3.5 shrink-0 text-fg-subtle group-aria-selected/tab:text-fg-muted" }) : null, _jsx("span", { className: "max-w-[12rem] truncate", children: v ? v.name : t("all") }), v?.scope === "team" ? _jsx(Users, { "aria-label": t("teamView"), className: "size-3 shrink-0 text-fg-subtle" }) : null, selected && dirty ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-accent-ink" }), _jsxs("span", { className: "sr-only", children: [", ", t("modified")] })] })) : null] }, key));
180
+ };
181
+ const actionsMenu = active ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": t("actions", { name: active.name }), className: cn("inline-flex shrink-0 items-center justify-center rounded-ui-sm text-fg-subtle transition-colors hover:bg-hover hover:text-fg focus-ring", size === "sm" ? "size-7" : "size-8"), children: _jsx(MoreHorizontal, { "aria-hidden": true, className: "size-4" }) }) }), _jsxs(DropdownMenuContent, { align: "start", size: "sm", children: [onRename ? (_jsx(DropdownMenuItem, { icon: _jsx(Pencil, {}), disabled: !canEdit(active), onSelect: () => setDialog({ kind: "rename", view: active }), children: t("rename") })) : null, onSave ? (_jsx(DropdownMenuItem, { icon: _jsx(Copy, {}), onSelect: () => duplicate(active), children: t("duplicate") })) : null, onSetDefault ? (_jsx(DropdownMenuItem, { icon: active.isDefault ? _jsx(Check, {}) : _jsx(Star, {}), disabled: active.isDefault, onSelect: () => onSetDefault(active.id), children: active.isDefault ? t("isDefault") : t("setDefault") })) : null, _jsx(DropdownMenuItem, { icon: _jsx(Link2, {}), onSelect: () => copyLink(active.id), children: t("copyLink") }), onDelete && canEdit(active) ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { icon: _jsx(Trash2, {}), tone: "danger", onSelect: () => setConfirmDelete(active), children: t("delete") })] })) : null] })] })) : null;
182
+ const createButton = onSave ? (_jsxs("button", { type: "button", onClick: () => setDialog({ kind: "create" }), "aria-label": t("createAria"), className: cn("inline-flex shrink-0 items-center gap-1 rounded-ui-sm px-2 font-medium text-fg-subtle transition-colors hover:bg-hover hover:text-fg focus-ring", size === "sm" ? "h-7 text-xs" : "h-8 text-[13px]"), children: [_jsx(Plus, { "aria-hidden": true, className: "size-3.5", strokeWidth: 2.25 }), t("create")] })) : null;
183
+ const readOnlyActive = active ? !canEdit(active) : true;
184
+ const saveButton = (_jsx(Button, { size: "xs", variant: "ghost", className: "text-accent-ink", "aria-disabled": readOnlyActive || !onUpdate || undefined, loading: saving, onClick: () => (readOnlyActive ? undefined : update()), children: t("save") }));
185
+ const dirtyStrip = dirty && active ? (_jsxs("div", { "data-slot": "saved-views-dirty", className: "ui-fade flex shrink-0 items-center gap-0.5 ps-1 text-xs", children: [_jsxs("span", { className: "me-1 hidden items-center gap-1.5 text-fg-muted sm:inline-flex", children: [_jsx("span", { "aria-hidden": true, className: "size-1.5 rounded-full bg-accent-ink" }), t("modified")] }), onUpdate ? readOnlyActive ? _jsx(Tooltip, { content: t("readOnlyReason"), children: saveButton }) : saveButton : null, onSave ? (_jsx(Button, { size: "xs", variant: "ghost", onClick: () => setDialog({ kind: "create" }), children: t("saveAs") })) : null, _jsx(Button, { size: "xs", variant: "ghost", className: "text-fg-muted", onClick: onReset, children: t("reset") })] })) : null;
186
+ const body = asSelect ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": t("selectAria", { name: active?.name ?? t("all") }), className: cn("inline-flex min-w-0 items-center gap-1.5 rounded-ui-sm px-2.5 font-medium text-fg transition-colors hover:bg-hover focus-ring", size === "sm" ? "h-7 text-xs" : "h-8 text-[13px]"), children: [_jsx("span", { className: "truncate", children: active?.name ?? t("all") }), dirty ? _jsx("span", { "aria-hidden": true, className: "size-1.5 shrink-0 rounded-full bg-accent-ink" }) : null, _jsx(ChevronDown, { "aria-hidden": true, className: "size-3.5 shrink-0 text-fg-subtle" })] }) }), _jsxs(DropdownMenuContent, { align: "start", size: "md", children: [_jsx(DropdownMenuLabel, { children: t("label") }), _jsxs(DropdownMenuRadioGroup, { value: activeKey, onValueChange: (k) => onSelect(k === "__all" ? null : k), children: [showAll ? _jsx(DropdownMenuRadioItem, { value: "__all", children: t("all") }) : null, ordered.map((v) => (_jsx(DropdownMenuRadioItem, { value: v.id, children: v.name }, v.id)))] }), onSave ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsx(DropdownMenuItem, { icon: _jsx(Plus, {}), onSelect: () => setDialog({ kind: "create" }), children: t("createAria") })] })) : null] })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { role: "tablist", "aria-label": t("label"), className: "flex min-w-0 items-center gap-0.5 overflow-x-auto scrollbar-none", children: tabKeys.map((k, i) => tab(k === null ? null : views.find((v) => v.id === k), i)) }), overflow.length ? (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": t("moreAria"), className: cn("inline-flex shrink-0 items-center gap-1 rounded-ui-sm px-2 font-medium text-fg-muted transition-colors hover:bg-hover hover:text-fg focus-ring", size === "sm" ? "h-7 text-xs" : "h-8 text-[13px]"), children: [t("more"), _jsx(ChevronDown, { "aria-hidden": true, className: "size-3.5 text-fg-subtle" })] }) }), _jsx(DropdownMenuContent, { align: "start", size: "md", children: overflow.map((v) => (_jsx(DropdownMenuItem, { onSelect: () => onSelect(v.id), children: v.name }, v.id))) })] })) : null] }));
187
+ return (_jsxs("div", { ref: (node) => {
188
+ measureRef(node);
189
+ if (typeof ref === "function")
190
+ ref(node);
191
+ else if (ref)
192
+ ref.current = node;
193
+ }, "data-slot": "saved-views", "data-variant": asSelect ? "select" : "tabs", className: cn("flex min-w-0 items-center gap-1", className), ...props, children: [body, actionsMenu, createButton, dirtyStrip, _jsx("span", { "aria-live": "polite", className: "sr-only", children: announce }), _jsx(SavedViewDialog, { state: dialog, t: t, canCreateTeam: permissions?.canCreateTeam, saving: saving, onClose: () => setDialog(null), onSubmit: async ({ name, scope, isDefault }) => {
194
+ setSaving(true);
195
+ try {
196
+ if (dialog?.kind === "rename") {
197
+ await onRename?.(dialog.view.id, name);
198
+ }
199
+ else {
200
+ const created = await onSave?.({ name, scope, isDefault });
201
+ if (created)
202
+ onSelect(created.id);
203
+ }
204
+ setDialog(null);
205
+ return null;
206
+ }
207
+ catch {
208
+ return t("saveError");
209
+ }
210
+ finally {
211
+ setSaving(false);
212
+ }
213
+ } }), _jsx(ConfirmDialog, { open: confirmDelete !== null, tone: "danger", title: t("deleteTitle", { name: confirmDelete?.name ?? "" }), description: t("deleteDescription"), confirmLabel: t("deleteConfirm"), onConfirm: async () => {
214
+ if (confirmDelete)
215
+ await onDelete?.(confirmDelete.id);
216
+ }, onResult: (ok) => {
217
+ if (ok && confirmDelete && confirmDelete.id === activeId)
218
+ onSelect(views.find((v) => v.isDefault && v.id !== confirmDelete.id)?.id ?? null);
219
+ setConfirmDelete(null);
220
+ } })] }));
221
+ });
222
+ function SavedViewDialog({ state, t, canCreateTeam, saving, onClose, onSubmit, }) {
223
+ const [name, setName] = React.useState("");
224
+ const [scope, setScope] = React.useState("personal");
225
+ const [isDefault, setIsDefault] = React.useState(false);
226
+ const [error, setError] = React.useState(null);
227
+ const open = state !== null;
228
+ React.useEffect(() => {
229
+ if (!state)
230
+ return;
231
+ setName(state.kind === "rename" ? state.view.name : "");
232
+ setScope("personal");
233
+ setIsDefault(false);
234
+ setError(null);
235
+ }, [state]);
236
+ const rename = state?.kind === "rename";
237
+ const submit = async (e) => {
238
+ e.preventDefault();
239
+ if (!name.trim()) {
240
+ setError(t("nameRequired"));
241
+ return;
242
+ }
243
+ const err = await onSubmit({ name: name.trim(), scope, isDefault });
244
+ if (err)
245
+ setError(err);
246
+ };
247
+ return (_jsx(Dialog, { open: open, onOpenChange: (o) => !o && onClose(), children: _jsx(DialogContent, { size: "sm", children: _jsxs("form", { onSubmit: submit, noValidate: true, className: "contents", children: [_jsx(DialogHeader, { title: rename ? t("dialogRename") : t("dialogCreate"), description: rename ? undefined : t("dialogCreateDescription") }), _jsxs(DialogBody, { className: "grid gap-4", children: [_jsx(Field, { label: t("name"), error: error ?? undefined, required: true, children: _jsx(Input, { "data-autofocus": true, value: name, placeholder: t("namePlaceholder"), maxLength: 60, onChange: (e) => setName(e.target.value) }) }), !rename && canCreateTeam ? (_jsx(Field, { label: t("scope"), children: _jsx(RadioGroup, { value: scope, onValueChange: (v) => setScope(v), items: [
248
+ { value: "personal", label: t("personal") },
249
+ { value: "team", label: t("team") },
250
+ ] }) })) : null, !rename ? _jsx(Checkbox, { label: t("makeDefault"), checked: isDefault, onCheckedChange: (c) => setIsDefault(c === true) }) : null] }), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "ghost", onClick: onClose, children: t("cancel") }), _jsx(Button, { type: "submit", variant: "primary", loading: saving, loadingText: t("saving"), children: rename ? t("confirmRename") : t("confirmSave") })] })] }) }) }));
251
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Shared list-state contract for Data Table, Filter bar, Saved views, Kanban, Calendar and any
3
+ * other collection view. React-free at runtime (type-only React import), so it can be imported
4
+ * in server components and API routes: the same `ListState` drives the UI, the URL and the
5
+ * server query.
6
+ */
7
+ import type { ComponentType, ReactNode } from "react";
8
+ /** Value type of a field. Decides operators, value editor, formatting and sorting. */
9
+ export type FieldType = "text" | "number" | "currency" | "percent" | "date" | "datetime" | "enum" | "boolean" | "user" | "tags";
10
+ /** Filter operator. Semantics are documented in `filter-fns.ts` and are the same on the server. */
11
+ export type FilterOp = "contains" | "notContains" | "eq" | "neq" | "startsWith" | "isEmpty" | "isNotEmpty" | "gt" | "gte" | "lt" | "lte" | "between" | "in" | "notIn" | "before" | "after" | "on" | "relative";
12
+ export type RelativeDatePreset = "today" | "yesterday" | "this_week" | "last_7_days" | "last_30_days" | "last_90_days" | "this_month" | "last_month" | "this_quarter" | "this_year";
13
+ /** A date range relative to "now", resolved at query time (so saved views stay current). */
14
+ export type RelativeDate = RelativeDatePreset | {
15
+ last: number;
16
+ unit: "day" | "week" | "month";
17
+ };
18
+ /** One condition: `{ field: "stage", op: "in", value: ["proposal", "won"] }`. */
19
+ export interface FilterClause {
20
+ /** Stable id (chip key, focus management). */
21
+ id: string;
22
+ field: string;
23
+ op: FilterOp;
24
+ /**
25
+ * `in`/`notIn` → `string[]`; `between` → `[min, max]` (numbers or `YYYY-MM-DD`);
26
+ * `relative` → `RelativeDate`; `isEmpty`/`isNotEmpty` → none; otherwise a scalar.
27
+ * Dates are `YYYY-MM-DD` strings, money a decimal string or number. `"$me"` = the current user.
28
+ */
29
+ value?: unknown;
30
+ }
31
+ /** A group of clauses. The root is always a group; nested groups are the advanced mode. */
32
+ export interface FilterGroup {
33
+ logic: "and" | "or";
34
+ clauses: Array<FilterClause | FilterGroup>;
35
+ }
36
+ /** Symbolic "current user" value for user fields. Resolved at query time so team views work for everyone. */
37
+ export declare const ME = "$me";
38
+ /** Option of an enum / user / tags field. */
39
+ export interface FilterOption {
40
+ value: string;
41
+ label: string;
42
+ /** Leading visual (avatar, status dot). */
43
+ icon?: ReactNode;
44
+ /** Badge tone used by the Data Table's default enum cell. */
45
+ tone?: "neutral" | "accent" | "success" | "warning" | "danger" | "info";
46
+ /** Extra search terms. */
47
+ keywords?: string[];
48
+ }
49
+ /** A filterable field. Data Table generates these from its columns (`filterFieldsFromColumns`). */
50
+ export interface FilterFieldDef {
51
+ field: string;
52
+ label: string;
53
+ type: FieldType;
54
+ /** Icon component (e.g. a lucide icon) shown in the field picker. */
55
+ icon?: ComponentType<{
56
+ className?: string;
57
+ }>;
58
+ /** Allowed operators, in menu order. Default: `defaultOps(type)`. */
59
+ ops?: FilterOp[];
60
+ /** Enum / user / tags options. A function = async server search (`q` is the typed text). */
61
+ options?: FilterOption[] | ((q: string) => Promise<FilterOption[]>);
62
+ /** Pinned in the bar as an empty chip ("Status ▾") even without a value. */
63
+ quick?: boolean;
64
+ /** Enum: `false` → single value (`eq`) instead of `in`. Default `true`. */
65
+ multiple?: boolean;
66
+ /** Section in the field picker ("Contact", "Company"). */
67
+ group?: string;
68
+ /** ISO 4217 code for `currency` fields. Default: the locale provider's currency. */
69
+ currency?: string;
70
+ /** Client filtering: read the value from a row. Default `row[field]`. */
71
+ accessor?: (row: any) => unknown;
72
+ /** Input placeholder in the value editor. */
73
+ placeholder?: string;
74
+ }
75
+ export interface SortClause {
76
+ id: string;
77
+ desc: boolean;
78
+ }
79
+ export type OffsetPage = {
80
+ index: number;
81
+ size: number;
82
+ };
83
+ export type CursorPage = {
84
+ cursor: string | null;
85
+ size: number;
86
+ };
87
+ export type PageState = OffsetPage | CursorPage;
88
+ export interface ColumnsState {
89
+ /** Missing key = visible. */
90
+ visible: Record<string, boolean>;
91
+ /** Column ids in display order. Missing ids keep their definition order after the listed ones. */
92
+ order: string[];
93
+ /** Widths in px. */
94
+ sizing: Record<string, number>;
95
+ /** Pinned to the inline start / end (RTL-aware). */
96
+ pinned: {
97
+ start: string[];
98
+ end: string[];
99
+ };
100
+ }
101
+ export type ListDensity = "compact" | "comfortable" | "spacious";
102
+ /** Everything a list screen needs to reproduce what the user sees. Serializable. */
103
+ export interface ListState {
104
+ q: string;
105
+ filters: FilterGroup;
106
+ sort: SortClause[];
107
+ page: PageState;
108
+ columns: ColumnsState;
109
+ density?: ListDensity;
110
+ /** Active saved view id. */
111
+ view?: string | null;
112
+ groupBy?: string | null;
113
+ }
114
+ export type ListStateChangeReason = "search" | "filters" | "sort" | "page" | "pageSize" | "columns" | "density" | "view" | "reset";
115
+ /**
116
+ * Row selection. `ids` survives paging. `all` spans every page of a server-mode list: it carries
117
+ * a snapshot of the query it was made for (and resets when the query changes).
118
+ */
119
+ export type DataTableSelection = {
120
+ mode: "ids";
121
+ ids: string[];
122
+ } | {
123
+ mode: "all";
124
+ except: string[];
125
+ filters: FilterGroup;
126
+ q: string;
127
+ total: number;
128
+ };
129
+ export declare const emptySelection: () => DataTableSelection;
130
+ export declare function selectionCount(s: DataTableSelection): number;
131
+ export declare function isRowSelected(s: DataTableSelection, id: string): boolean;
132
+ /** What a saved view stores: the list state without the position (page, cursor). */
133
+ export type ViewState = Omit<ListState, "page" | "q" | "view"> & {
134
+ q?: string;
135
+ pageSize?: number;
136
+ };
137
+ export interface SavedView {
138
+ id: string;
139
+ name: string;
140
+ state: ViewState;
141
+ scope: "personal" | "team";
142
+ isDefault?: boolean;
143
+ /** Icon component shown before the name. */
144
+ icon?: ComponentType<{
145
+ className?: string;
146
+ }>;
147
+ ownerId?: string;
148
+ /** Built in (e.g. "All open deals"): cannot be renamed or deleted. */
149
+ system?: boolean;
150
+ }
151
+ export declare const emptyFilterGroup: () => FilterGroup;
152
+ export declare const emptyColumnsState: () => ColumnsState;
153
+ export declare const isFilterGroup: (c: FilterClause | FilterGroup) => c is FilterGroup;
154
+ export declare const isCursorPage: (p: PageState) => p is CursorPage;
155
+ /** A complete `ListState` from a partial one (missing parts get defaults). */
156
+ export declare function createListState(partial?: Partial<ListState>, pageSize?: number): ListState;
157
+ /** Root-level clauses (nested groups flattened depth-first). */
158
+ export declare function flattenClauses(g: FilterGroup): FilterClause[];
159
+ /** Operators per field type, in menu order. */
160
+ export declare function defaultOps(type: FieldType): FilterOp[];
161
+ /** Operators of a field, honouring `multiple: false` (single-valued enum → `eq`/`neq`). */
162
+ export declare function fieldOps(field: FilterFieldDef): FilterOp[];
163
+ /** Operators that take no value. */
164
+ export declare const opTakesNoValue: (op: FilterOp) => boolean;
165
+ /** `true` when a clause has what its operator needs (an incomplete clause is never applied). */
166
+ export declare function isClauseComplete(c: FilterClause): boolean;
167
+ /** A short unique clause id. */
168
+ export declare const clauseId: () => string;
@@ -0,0 +1,87 @@
1
+ /** Symbolic "current user" value for user fields. Resolved at query time so team views work for everyone. */
2
+ export const ME = "$me";
3
+ export const emptySelection = () => ({ mode: "ids", ids: [] });
4
+ export function selectionCount(s) {
5
+ return s.mode === "ids" ? s.ids.length : Math.max(0, s.total - s.except.length);
6
+ }
7
+ export function isRowSelected(s, id) {
8
+ return s.mode === "ids" ? s.ids.includes(id) : !s.except.includes(id);
9
+ }
10
+ /* ------------------------------------------------------------------ */
11
+ /* Helpers */
12
+ /* ------------------------------------------------------------------ */
13
+ export const emptyFilterGroup = () => ({ logic: "and", clauses: [] });
14
+ export const emptyColumnsState = () => ({ visible: {}, order: [], sizing: {}, pinned: { start: [], end: [] } });
15
+ export const isFilterGroup = (c) => "clauses" in c;
16
+ export const isCursorPage = (p) => "cursor" in p;
17
+ /** A complete `ListState` from a partial one (missing parts get defaults). */
18
+ export function createListState(partial = {}, pageSize = 25) {
19
+ return {
20
+ q: partial.q ?? "",
21
+ filters: partial.filters ?? emptyFilterGroup(),
22
+ sort: partial.sort ?? [],
23
+ page: partial.page ?? { index: 0, size: pageSize },
24
+ columns: { ...emptyColumnsState(), ...partial.columns, pinned: { start: [], end: [], ...partial.columns?.pinned } },
25
+ density: partial.density,
26
+ view: partial.view ?? null,
27
+ groupBy: partial.groupBy ?? null,
28
+ };
29
+ }
30
+ /** Root-level clauses (nested groups flattened depth-first). */
31
+ export function flattenClauses(g) {
32
+ const out = [];
33
+ for (const c of g.clauses) {
34
+ if (isFilterGroup(c))
35
+ out.push(...flattenClauses(c));
36
+ else
37
+ out.push(c);
38
+ }
39
+ return out;
40
+ }
41
+ /** Operators per field type, in menu order. */
42
+ export function defaultOps(type) {
43
+ switch (type) {
44
+ case "text":
45
+ return ["contains", "notContains", "eq", "startsWith", "isEmpty", "isNotEmpty"];
46
+ case "number":
47
+ case "currency":
48
+ case "percent":
49
+ return ["eq", "neq", "gt", "gte", "lt", "lte", "between", "isEmpty"];
50
+ case "date":
51
+ case "datetime":
52
+ return ["on", "before", "after", "between", "relative", "isEmpty"];
53
+ case "enum":
54
+ case "tags":
55
+ return ["in", "notIn", "isEmpty"];
56
+ case "boolean":
57
+ return ["eq"];
58
+ case "user":
59
+ return ["in", "notIn", "isEmpty"];
60
+ }
61
+ }
62
+ /** Operators of a field, honouring `multiple: false` (single-valued enum → `eq`/`neq`). */
63
+ export function fieldOps(field) {
64
+ if (field.ops)
65
+ return field.ops;
66
+ if (field.type === "enum" && field.multiple === false)
67
+ return ["eq", "neq", "isEmpty"];
68
+ return defaultOps(field.type);
69
+ }
70
+ /** Operators that take no value. */
71
+ export const opTakesNoValue = (op) => op === "isEmpty" || op === "isNotEmpty";
72
+ /** `true` when a clause has what its operator needs (an incomplete clause is never applied). */
73
+ export function isClauseComplete(c) {
74
+ if (opTakesNoValue(c.op))
75
+ return true;
76
+ const v = c.value;
77
+ if (v === undefined || v === null || v === "")
78
+ return false;
79
+ if (c.op === "in" || c.op === "notIn")
80
+ return Array.isArray(v) && v.length > 0;
81
+ if (c.op === "between")
82
+ return Array.isArray(v) && v.length === 2 && v[0] !== "" && v[1] !== "" && v[0] != null && v[1] != null;
83
+ return true;
84
+ }
85
+ let clauseSeq = 0;
86
+ /** A short unique clause id. */
87
+ export const clauseId = () => `c${Date.now().toString(36)}${(++clauseSeq).toString(36)}`;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * `ListState` ⇄ URL search params. React-free: `parseListState()` runs in a server component so
3
+ * the first HTML already has the right rows.
4
+ *
5
+ * `?q=jane&f=stage.in:proposal|won;value.gte:5000;created.relative:last_30_days&sort=-createdAt,name&page=2&size=50&sv=v_8k2`
6
+ *
7
+ * - values are URI-encoded; `|` separates multiple values (`in`, `between`)
8
+ * - unknown fields / operators and malformed values are dropped silently
9
+ * - `page` is 1-based in the URL, 0-based in `ListState`
10
+ * - column widths / visibility are not written (they are preferences, not position)
11
+ */
12
+ import { type FilterFieldDef, type FilterGroup, type ListState } from "./types.js";
13
+ export interface UrlStateKeys {
14
+ q: string;
15
+ filters: string;
16
+ sort: string;
17
+ page: string;
18
+ size: string;
19
+ cursor: string;
20
+ view: string;
21
+ density: string;
22
+ }
23
+ export interface UrlStateOptions {
24
+ /** Prefix every key (two lists on one page): `prefix: "c_"` → `c_q`, `c_f`… */
25
+ prefix?: string;
26
+ /** Rename individual keys. */
27
+ keys?: Partial<UrlStateKeys>;
28
+ /** Where to read and write. Default: `createHistoryAdapter()`. */
29
+ adapter?: UrlStateAdapter;
30
+ /** `"replace"` (default) keeps the back button for real navigation; `"push"` adds an entry per change. */
31
+ history?: "replace" | "push";
32
+ /** Also write the table-local density. Default `false`. */
33
+ density?: boolean;
34
+ }
35
+ /** Reads and writes the query string. Swap it for a router (`router.replace`) or a hash adapter. */
36
+ export interface UrlStateAdapter {
37
+ /** The current search string, with or without the leading `?`. */
38
+ read(): string;
39
+ write(search: string, mode: "replace" | "push"): void;
40
+ /** Called on back / forward. Returns an unsubscribe function. */
41
+ subscribe(cb: () => void): () => void;
42
+ }
43
+ export declare function resolveUrlKeys(o?: Pick<UrlStateOptions, "prefix" | "keys">): UrlStateKeys;
44
+ /** `stage.in:proposal|won;value.gte:5000` — the `f` parameter. Nested groups are flattened (simple mode). */
45
+ export declare function encodeFilters(g: FilterGroup): string;
46
+ /**
47
+ * Parses the `f` parameter. With `fields`, unknown fields, operators a field does not allow and
48
+ * malformed values are dropped; without it every syntactically valid clause is kept as text.
49
+ */
50
+ export declare function decodeFilters(raw: string, fields?: FilterFieldDef[]): FilterGroup;
51
+ export interface SerializeOptions extends Pick<UrlStateOptions, "prefix" | "keys" | "density"> {
52
+ /** Values equal to these defaults are left out of the URL (clean links). */
53
+ defaults?: Partial<ListState>;
54
+ }
55
+ /** The owned parameters of a list state, in a stable order. Values are already encoded. */
56
+ export declare function listStateToParams(state: ListState, o?: SerializeOptions): Array<[string, string]>;
57
+ /**
58
+ * `ListState` → search string (no leading `?`). Defaults are omitted, so the canonical list has a clean URL.
59
+ *
60
+ * ```ts
61
+ * serializeListState(state, { defaults: { sort: [{ id: "createdAt", desc: true }] } });
62
+ * // "q=jane&f=stage.in:proposal|won&page=2"
63
+ * ```
64
+ */
65
+ export declare function serializeListState(state: ListState, o?: SerializeOptions): string;
66
+ /**
67
+ * Replaces the list's own parameters in an existing search string and keeps every other
68
+ * parameter (`?tab=deals&q=…`) in place.
69
+ */
70
+ export declare function mergeListStateIntoSearch(search: string, state: ListState, o?: SerializeOptions): string;
71
+ export interface ParseOptions extends Pick<UrlStateOptions, "prefix" | "keys"> {
72
+ /** Field definitions: unknown fields / operators are dropped, values typed. */
73
+ fields?: FilterFieldDef[];
74
+ /** Base state for anything the URL does not say. */
75
+ defaults?: Partial<ListState>;
76
+ /** Allowed sort column ids (others are dropped). */
77
+ sortable?: string[];
78
+ /** Allowed page sizes. A different `size` falls back to the default. */
79
+ pageSizes?: number[];
80
+ }
81
+ /**
82
+ * Search string (or `URLSearchParams`, or a Next.js `searchParams` object) → `ListState`.
83
+ * Safe on untrusted input: bad values fall back to the defaults.
84
+ */
85
+ export declare function parseListState(input: string | URLSearchParams | Record<string, string | string[] | undefined>, o?: ParseOptions): ListState;
86
+ /**
87
+ * The built-in adapter: `history.replaceState` / `pushState` on the current URL. Works with the
88
+ * Next.js App Router (`useSearchParams` observes `history` updates). SSR-safe.
89
+ */
90
+ export declare function createHistoryAdapter(): UrlStateAdapter;
91
+ /** An in-memory adapter for tests, previews and embedded lists. */
92
+ export declare function createMemoryAdapter(initial?: string): UrlStateAdapter & {
93
+ readonly search: string;
94
+ };