@vamos-ui/react 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (704) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +27 -2
  3. package/dist/blocks/block-heading.d.ts +29 -0
  4. package/dist/blocks/block-heading.js +39 -0
  5. package/dist/blocks/block-image.d.ts +52 -0
  6. package/dist/blocks/block-image.js +48 -0
  7. package/dist/blocks/block-link.d.ts +30 -0
  8. package/dist/blocks/block-link.js +36 -0
  9. package/dist/blocks/create-blocks.d.ts +54 -0
  10. package/dist/blocks/create-blocks.js +52 -0
  11. package/dist/blocks/index.d.ts +55 -0
  12. package/dist/blocks/index.js +59 -0
  13. package/dist/blocks/json-ld.d.ts +18 -0
  14. package/dist/blocks/json-ld.js +44 -0
  15. package/dist/blocks/labels.d.ts +20 -0
  16. package/dist/blocks/labels.js +43 -0
  17. package/dist/blocks/rich-text.d.ts +36 -0
  18. package/dist/blocks/rich-text.js +106 -0
  19. package/dist/blocks/schema/define-block.d.ts +151 -0
  20. package/dist/blocks/schema/define-block.js +120 -0
  21. package/dist/blocks/schema/emphasis.d.ts +17 -0
  22. package/dist/blocks/schema/emphasis.js +69 -0
  23. package/dist/blocks/schema/fields.d.ts +497 -0
  24. package/dist/blocks/schema/fields.js +240 -0
  25. package/dist/blocks/schema/icons.d.ts +2 -0
  26. package/dist/blocks/schema/icons.js +26 -0
  27. package/dist/blocks/schema/index.d.ts +18 -0
  28. package/dist/blocks/schema/index.js +21 -0
  29. package/dist/blocks/schema/lint-types.d.ts +16 -0
  30. package/dist/blocks/schema/lint-types.js +2 -0
  31. package/dist/blocks/schema/lint.d.ts +32 -0
  32. package/dist/blocks/schema/lint.js +164 -0
  33. package/dist/blocks/schema/localize.d.ts +20 -0
  34. package/dist/blocks/schema/localize.js +29 -0
  35. package/dist/blocks/schema/localized.d.ts +25 -0
  36. package/dist/blocks/schema/localized.js +53 -0
  37. package/dist/blocks/schema/migrate.d.ts +24 -0
  38. package/dist/blocks/schema/migrate.js +75 -0
  39. package/dist/blocks/schema/nodes.d.ts +196 -0
  40. package/dist/blocks/schema/nodes.js +78 -0
  41. package/dist/blocks/schema/rich-doc-schema.d.ts +32 -0
  42. package/dist/blocks/schema/rich-doc-schema.js +66 -0
  43. package/dist/blocks/schema/rich-doc.d.ts +90 -0
  44. package/dist/blocks/schema/rich-doc.js +62 -0
  45. package/dist/blocks/schema/safety.d.ts +20 -0
  46. package/dist/blocks/schema/safety.js +49 -0
  47. package/dist/blocks/schema/types.d.ts +172 -0
  48. package/dist/blocks/schema/types.js +3 -0
  49. package/dist/blocks/schema/validate.d.ts +17 -0
  50. package/dist/blocks/schema/validate.js +32 -0
  51. package/dist/blocks/schema/walk.d.ts +22 -0
  52. package/dist/blocks/schema/walk.js +60 -0
  53. package/dist/blocks/section-header.d.ts +38 -0
  54. package/dist/blocks/section-header.js +22 -0
  55. package/dist/blocks/section.d.ts +59 -0
  56. package/dist/blocks/section.js +66 -0
  57. package/dist/blocks/site/_kit-1.d.ts +101 -0
  58. package/dist/blocks/site/_kit-1.js +137 -0
  59. package/dist/blocks/site/_site-icon-1.d.ts +6 -0
  60. package/dist/blocks/site/_site-icon-1.js +15 -0
  61. package/dist/blocks/site/announcement-bar.d.ts +42 -0
  62. package/dist/blocks/site/announcement-bar.js +38 -0
  63. package/dist/blocks/site/announcement-dismiss.d.ts +18 -0
  64. package/dist/blocks/site/announcement-dismiss.js +28 -0
  65. package/dist/blocks/site/article-layout.d.ts +65 -0
  66. package/dist/blocks/site/article-layout.js +88 -0
  67. package/dist/blocks/site/blog-list.d.ts +79 -0
  68. package/dist/blocks/site/blog-list.js +78 -0
  69. package/dist/blocks/site/comparison-table.d.ts +54 -0
  70. package/dist/blocks/site/comparison-table.js +38 -0
  71. package/dist/blocks/site/consent-banner.d.ts +52 -0
  72. package/dist/blocks/site/consent-banner.js +33 -0
  73. package/dist/blocks/site/contact-dock.d.ts +52 -0
  74. package/dist/blocks/site/contact-dock.js +55 -0
  75. package/dist/blocks/site/contact-form.d.ts +60 -0
  76. package/dist/blocks/site/contact-form.js +45 -0
  77. package/dist/blocks/site/cta-booking.d.ts +43 -0
  78. package/dist/blocks/site/cta-booking.js +69 -0
  79. package/dist/blocks/site/cta.d.ts +74 -0
  80. package/dist/blocks/site/cta.js +113 -0
  81. package/dist/blocks/site/embed-facade.d.ts +20 -0
  82. package/dist/blocks/site/embed-facade.js +21 -0
  83. package/dist/blocks/site/faq.d.ts +48 -0
  84. package/dist/blocks/site/faq.js +52 -0
  85. package/dist/blocks/site/feature-grid.d.ts +46 -0
  86. package/dist/blocks/site/feature-grid.js +50 -0
  87. package/dist/blocks/site/feature-tabs.d.ts +22 -0
  88. package/dist/blocks/site/feature-tabs.js +11 -0
  89. package/dist/blocks/site/footer.d.ts +68 -0
  90. package/dist/blocks/site/footer.js +61 -0
  91. package/dist/blocks/site/gallery-section.d.ts +42 -0
  92. package/dist/blocks/site/gallery-section.js +48 -0
  93. package/dist/blocks/site/hero-video.d.ts +15 -0
  94. package/dist/blocks/site/hero-video.js +31 -0
  95. package/dist/blocks/site/hero.d.ts +64 -0
  96. package/dist/blocks/site/hero.js +73 -0
  97. package/dist/blocks/site/logo-strip.d.ts +44 -0
  98. package/dist/blocks/site/logo-strip.js +27 -0
  99. package/dist/blocks/site/map-hours.d.ts +83 -0
  100. package/dist/blocks/site/map-hours.js +125 -0
  101. package/dist/blocks/site/media-text.d.ts +45 -0
  102. package/dist/blocks/site/media-text.js +56 -0
  103. package/dist/blocks/site/menu-list.d.ts +74 -0
  104. package/dist/blocks/site/menu-list.js +84 -0
  105. package/dist/blocks/site/navbar-submenu.d.ts +18 -0
  106. package/dist/blocks/site/navbar-submenu.js +51 -0
  107. package/dist/blocks/site/navbar.d.ts +67 -0
  108. package/dist/blocks/site/navbar.js +64 -0
  109. package/dist/blocks/site/not-found.d.ts +40 -0
  110. package/dist/blocks/site/not-found.js +38 -0
  111. package/dist/blocks/site/page-intro.d.ts +46 -0
  112. package/dist/blocks/site/page-intro.js +44 -0
  113. package/dist/blocks/site/pricing-table.d.ts +67 -0
  114. package/dist/blocks/site/pricing-table.js +83 -0
  115. package/dist/blocks/site/process.d.ts +36 -0
  116. package/dist/blocks/site/process.js +42 -0
  117. package/dist/blocks/site/registry-1.d.ts +720 -0
  118. package/dist/blocks/site/registry-1.js +783 -0
  119. package/dist/blocks/site/registry-2.d.ts +914 -0
  120. package/dist/blocks/site/registry-2.js +563 -0
  121. package/dist/blocks/site/rich-text-section.d.ts +34 -0
  122. package/dist/blocks/site/rich-text-section.js +32 -0
  123. package/dist/blocks/site/shared/brand-icons.d.ts +21 -0
  124. package/dist/blocks/site/shared/brand-icons.js +56 -0
  125. package/dist/blocks/site/shared/consent-gate.d.ts +41 -0
  126. package/dist/blocks/site/shared/consent-gate.js +43 -0
  127. package/dist/blocks/site/shared/consent-island.d.ts +38 -0
  128. package/dist/blocks/site/shared/consent-island.js +63 -0
  129. package/dist/blocks/site/shared/consent.d.ts +49 -0
  130. package/dist/blocks/site/shared/consent.js +130 -0
  131. package/dist/blocks/site/shared/contact-form-island.d.ts +41 -0
  132. package/dist/blocks/site/shared/contact-form-island.js +100 -0
  133. package/dist/blocks/site/shared/copy-link.d.ts +10 -0
  134. package/dist/blocks/site/shared/copy-link.js +25 -0
  135. package/dist/blocks/site/shared/dock-avoid.d.ts +15 -0
  136. package/dist/blocks/site/shared/dock-avoid.js +107 -0
  137. package/dist/blocks/site/shared/dock-hours.d.ts +13 -0
  138. package/dist/blocks/site/shared/dock-hours.js +25 -0
  139. package/dist/blocks/site/shared/gallery-lightbox.d.ts +12 -0
  140. package/dist/blocks/site/shared/gallery-lightbox.js +10 -0
  141. package/dist/blocks/site/shared/island-keys.d.ts +10 -0
  142. package/dist/blocks/site/shared/island-keys.js +44 -0
  143. package/dist/blocks/site/shared/kit-2.d.ts +55 -0
  144. package/dist/blocks/site/shared/kit-2.js +84 -0
  145. package/dist/blocks/site/shared/labels-2.d.ts +209 -0
  146. package/dist/blocks/site/shared/labels-2.js +427 -0
  147. package/dist/blocks/site/shared/open-now.d.ts +22 -0
  148. package/dist/blocks/site/shared/open-now.js +27 -0
  149. package/dist/blocks/site/shared/opening-hours.d.ts +117 -0
  150. package/dist/blocks/site/shared/opening-hours.js +245 -0
  151. package/dist/blocks/site/shared/site-accent.d.ts +48 -0
  152. package/dist/blocks/site/shared/site-accent.js +249 -0
  153. package/dist/blocks/site/shared/site-form.d.ts +79 -0
  154. package/dist/blocks/site/shared/site-form.js +111 -0
  155. package/dist/blocks/site/shared/site-routing.d.ts +54 -0
  156. package/dist/blocks/site/shared/site-routing.js +86 -0
  157. package/dist/blocks/site/shared/testimonials-carousel.d.ts +17 -0
  158. package/dist/blocks/site/shared/testimonials-carousel.js +64 -0
  159. package/dist/blocks/site/site-shell.d.ts +108 -0
  160. package/dist/blocks/site/site-shell.js +254 -0
  161. package/dist/blocks/site/stats-band.d.ts +42 -0
  162. package/dist/blocks/site/stats-band.js +45 -0
  163. package/dist/blocks/site/team.d.ts +44 -0
  164. package/dist/blocks/site/team.js +48 -0
  165. package/dist/blocks/site/testimonials.d.ts +68 -0
  166. package/dist/blocks/site/testimonials.js +66 -0
  167. package/dist/blocks/types.d.ts +63 -0
  168. package/dist/blocks/types.js +2 -0
  169. package/dist/business/approval-flow.d.ts +152 -0
  170. package/dist/business/approval-flow.js +221 -0
  171. package/dist/business/export-core.d.ts +55 -0
  172. package/dist/business/export-core.js +101 -0
  173. package/dist/business/export.d.ts +148 -0
  174. package/dist/business/export.js +264 -0
  175. package/dist/business/import-core.d.ts +104 -0
  176. package/dist/business/import-core.js +281 -0
  177. package/dist/business/import-wizard.d.ts +186 -0
  178. package/dist/business/import-wizard.js +401 -0
  179. package/dist/business/index.d.ts +12 -0
  180. package/dist/business/index.js +22 -0
  181. package/dist/business/line-items-core.d.ts +129 -0
  182. package/dist/business/line-items-core.js +183 -0
  183. package/dist/business/line-items.d.ts +119 -0
  184. package/dist/business/line-items.js +299 -0
  185. package/dist/business/multi-step-form.d.ts +131 -0
  186. package/dist/business/multi-step-form.js +337 -0
  187. package/dist/business/permission-core.d.ts +59 -0
  188. package/dist/business/permission-core.js +99 -0
  189. package/dist/business/permission-matrix.d.ts +158 -0
  190. package/dist/business/permission-matrix.js +341 -0
  191. package/dist/business/setup-checklist.d.ts +80 -0
  192. package/dist/business/setup-checklist.js +92 -0
  193. package/dist/business/signer-status.d.ts +53 -0
  194. package/dist/business/signer-status.js +76 -0
  195. package/dist/charts/area-chart.d.ts +35 -0
  196. package/dist/charts/area-chart.js +33 -0
  197. package/dist/charts/bar-chart.d.ts +27 -0
  198. package/dist/charts/bar-chart.js +46 -0
  199. package/dist/charts/bar-list.d.ts +47 -0
  200. package/dist/charts/bar-list.js +60 -0
  201. package/dist/charts/chart-shell.d.ts +173 -0
  202. package/dist/charts/chart-shell.js +205 -0
  203. package/dist/charts/chart.d.ts +73 -0
  204. package/dist/charts/chart.js +106 -0
  205. package/dist/charts/combo-chart.d.ts +29 -0
  206. package/dist/charts/combo-chart.js +47 -0
  207. package/dist/charts/donut-chart.d.ts +33 -0
  208. package/dist/charts/donut-chart.js +113 -0
  209. package/dist/charts/funnel.d.ts +51 -0
  210. package/dist/charts/funnel.js +69 -0
  211. package/dist/charts/gauge.d.ts +62 -0
  212. package/dist/charts/gauge.js +104 -0
  213. package/dist/charts/heatmap.d.ts +81 -0
  214. package/dist/charts/heatmap.js +338 -0
  215. package/dist/charts/index.d.ts +12 -0
  216. package/dist/charts/index.js +14 -0
  217. package/dist/charts/line-chart.d.ts +21 -0
  218. package/dist/charts/line-chart.js +36 -0
  219. package/dist/charts/test-utils.d.ts +2 -0
  220. package/dist/charts/test-utils.js +38 -0
  221. package/dist/charts/utils.d.ts +130 -0
  222. package/dist/charts/utils.js +262 -0
  223. package/dist/components/_qr-core.d.ts +26 -0
  224. package/dist/components/_qr-core.js +376 -0
  225. package/dist/components/accordion.d.ts +47 -0
  226. package/dist/components/accordion.js +70 -0
  227. package/dist/components/activity-timeline.d.ts +149 -0
  228. package/dist/components/activity-timeline.js +122 -0
  229. package/dist/components/address-field.d.ts +116 -0
  230. package/dist/components/address-field.js +219 -0
  231. package/dist/components/alert-dialog.d.ts +99 -0
  232. package/dist/components/alert-dialog.js +192 -0
  233. package/dist/components/alert.d.ts +42 -0
  234. package/dist/components/alert.js +82 -0
  235. package/dist/components/app-shell.d.ts +159 -0
  236. package/dist/components/app-shell.js +289 -0
  237. package/dist/components/attachment-list.d.ts +96 -0
  238. package/dist/components/attachment-list.js +196 -0
  239. package/dist/components/audit-log.d.ts +150 -0
  240. package/dist/components/audit-log.js +205 -0
  241. package/dist/components/avatar.d.ts +87 -0
  242. package/dist/components/avatar.js +126 -0
  243. package/dist/components/backup-codes.d.ts +42 -0
  244. package/dist/components/backup-codes.js +67 -0
  245. package/dist/components/badge.d.ts +41 -0
  246. package/dist/components/badge.js +68 -0
  247. package/dist/components/breadcrumb.d.ts +78 -0
  248. package/dist/components/breadcrumb.js +106 -0
  249. package/dist/components/button-group.d.ts +52 -0
  250. package/dist/components/button-group.js +77 -0
  251. package/dist/components/button.d.ts +58 -0
  252. package/dist/components/button.js +107 -0
  253. package/dist/components/calendar.d.ts +240 -0
  254. package/dist/components/calendar.js +483 -0
  255. package/dist/components/card.d.ts +66 -0
  256. package/dist/components/card.js +76 -0
  257. package/dist/components/carousel.d.ts +170 -0
  258. package/dist/components/carousel.js +348 -0
  259. package/dist/components/checkbox.d.ts +78 -0
  260. package/dist/components/checkbox.js +138 -0
  261. package/dist/components/color-picker.d.ts +112 -0
  262. package/dist/components/color-picker.js +235 -0
  263. package/dist/components/combobox.d.ts +136 -0
  264. package/dist/components/combobox.js +294 -0
  265. package/dist/components/command.d.ts +281 -0
  266. package/dist/components/command.js +498 -0
  267. package/dist/components/comment-thread.d.ts +252 -0
  268. package/dist/components/comment-thread.js +449 -0
  269. package/dist/components/context-menu.d.ts +77 -0
  270. package/dist/components/context-menu.js +82 -0
  271. package/dist/components/currency-input.d.ts +43 -0
  272. package/dist/components/currency-input.js +85 -0
  273. package/dist/components/date-picker.d.ts +141 -0
  274. package/dist/components/date-picker.js +241 -0
  275. package/dist/components/date-range-picker.d.ts +91 -0
  276. package/dist/components/date-range-picker.js +251 -0
  277. package/dist/components/description-list.d.ts +92 -0
  278. package/dist/components/description-list.js +42 -0
  279. package/dist/components/dialog.d.ts +139 -0
  280. package/dist/components/dialog.js +185 -0
  281. package/dist/components/dropdown-menu.d.ts +100 -0
  282. package/dist/components/dropdown-menu.js +102 -0
  283. package/dist/components/editor-layout.d.ts +166 -0
  284. package/dist/components/editor-layout.js +237 -0
  285. package/dist/components/empty-state.d.ts +49 -0
  286. package/dist/components/empty-state.js +68 -0
  287. package/dist/components/entity-card.d.ts +83 -0
  288. package/dist/components/entity-card.js +92 -0
  289. package/dist/components/file-upload.d.ts +256 -0
  290. package/dist/components/file-upload.js +490 -0
  291. package/dist/components/formatted-input.d.ts +177 -0
  292. package/dist/components/formatted-input.js +399 -0
  293. package/dist/components/hierarchy-chart.d.ts +190 -0
  294. package/dist/components/hierarchy-chart.js +890 -0
  295. package/dist/components/hover-card.d.ts +21 -0
  296. package/dist/components/hover-card.js +32 -0
  297. package/dist/components/iban-input.d.ts +38 -0
  298. package/dist/components/iban-input.js +112 -0
  299. package/dist/components/id-input.d.ts +65 -0
  300. package/dist/components/id-input.js +130 -0
  301. package/dist/components/image.d.ts +130 -0
  302. package/dist/components/image.js +168 -0
  303. package/dist/components/input-otp.d.ts +62 -0
  304. package/dist/components/input-otp.js +73 -0
  305. package/dist/components/input.d.ts +141 -0
  306. package/dist/components/input.js +187 -0
  307. package/dist/components/item.d.ts +96 -0
  308. package/dist/components/item.js +113 -0
  309. package/dist/components/kbd.d.ts +64 -0
  310. package/dist/components/kbd.js +119 -0
  311. package/dist/components/list-layout.d.ts +144 -0
  312. package/dist/components/list-layout.js +210 -0
  313. package/dist/components/native-select.d.ts +33 -0
  314. package/dist/components/native-select.js +48 -0
  315. package/dist/components/navigation-menu.d.ts +127 -0
  316. package/dist/components/navigation-menu.js +129 -0
  317. package/dist/components/notification-center.d.ts +164 -0
  318. package/dist/components/notification-center.js +399 -0
  319. package/dist/components/page-header.d.ts +60 -0
  320. package/dist/components/page-header.js +60 -0
  321. package/dist/components/pagination.d.ts +121 -0
  322. package/dist/components/pagination.js +174 -0
  323. package/dist/components/phone-input.d.ts +49 -0
  324. package/dist/components/phone-input.js +266 -0
  325. package/dist/components/pin-map.d.ts +58 -0
  326. package/dist/components/pin-map.js +167 -0
  327. package/dist/components/popover.d.ts +38 -0
  328. package/dist/components/popover.js +69 -0
  329. package/dist/components/progress.d.ts +79 -0
  330. package/dist/components/progress.js +97 -0
  331. package/dist/components/qr-code.d.ts +36 -0
  332. package/dist/components/qr-code.js +27 -0
  333. package/dist/components/radio-group.d.ts +43 -0
  334. package/dist/components/radio-group.js +81 -0
  335. package/dist/components/record-detail-layout.d.ts +167 -0
  336. package/dist/components/record-detail-layout.js +233 -0
  337. package/dist/components/record-picker.d.ts +199 -0
  338. package/dist/components/record-picker.js +650 -0
  339. package/dist/components/resizable.d.ts +50 -0
  340. package/dist/components/resizable.js +88 -0
  341. package/dist/components/scroll-area.d.ts +40 -0
  342. package/dist/components/scroll-area.js +56 -0
  343. package/dist/components/select.d.ts +126 -0
  344. package/dist/components/select.js +137 -0
  345. package/dist/components/separator.d.ts +31 -0
  346. package/dist/components/separator.js +41 -0
  347. package/dist/components/settings-layout.d.ts +134 -0
  348. package/dist/components/settings-layout.js +180 -0
  349. package/dist/components/sheet.d.ts +103 -0
  350. package/dist/components/sheet.js +165 -0
  351. package/dist/components/sidebar.d.ts +171 -0
  352. package/dist/components/sidebar.js +421 -0
  353. package/dist/components/signature-pad.d.ts +85 -0
  354. package/dist/components/signature-pad.js +283 -0
  355. package/dist/components/skeleton.d.ts +64 -0
  356. package/dist/components/skeleton.js +53 -0
  357. package/dist/components/sla-timer.d.ts +75 -0
  358. package/dist/components/sla-timer.js +142 -0
  359. package/dist/components/slider.d.ts +57 -0
  360. package/dist/components/slider.js +133 -0
  361. package/dist/components/slug-input.d.ts +69 -0
  362. package/dist/components/slug-input.js +201 -0
  363. package/dist/components/sparkline.d.ts +54 -0
  364. package/dist/components/sparkline.js +122 -0
  365. package/dist/components/spinner.d.ts +34 -0
  366. package/dist/components/spinner.js +34 -0
  367. package/dist/components/stat.d.ts +135 -0
  368. package/dist/components/stat.js +130 -0
  369. package/dist/components/status-picker.d.ts +107 -0
  370. package/dist/components/status-picker.js +175 -0
  371. package/dist/components/stepper.d.ts +86 -0
  372. package/dist/components/stepper.js +103 -0
  373. package/dist/components/switch.d.ts +34 -0
  374. package/dist/components/switch.js +70 -0
  375. package/dist/components/table.d.ts +101 -0
  376. package/dist/components/table.js +72 -0
  377. package/dist/components/tabs.d.ts +103 -0
  378. package/dist/components/tabs.js +173 -0
  379. package/dist/components/tag-input.d.ts +77 -0
  380. package/dist/components/tag-input.js +305 -0
  381. package/dist/components/task-list.d.ts +89 -0
  382. package/dist/components/task-list.js +238 -0
  383. package/dist/components/time-picker.d.ts +119 -0
  384. package/dist/components/time-picker.js +399 -0
  385. package/dist/components/toast.d.ts +87 -0
  386. package/dist/components/toast.js +142 -0
  387. package/dist/components/toggle.d.ts +77 -0
  388. package/dist/components/toggle.js +109 -0
  389. package/dist/components/tooltip.d.ts +69 -0
  390. package/dist/components/tooltip.js +105 -0
  391. package/dist/components/top-bar.d.ts +87 -0
  392. package/dist/components/top-bar.js +99 -0
  393. package/dist/components/tour.d.ts +60 -0
  394. package/dist/components/tour.js +139 -0
  395. package/dist/components/tree-select.d.ts +89 -0
  396. package/dist/components/tree-select.js +243 -0
  397. package/dist/components/tree-view.d.ts +109 -0
  398. package/dist/components/tree-view.js +170 -0
  399. package/dist/components/typography.d.ts +107 -0
  400. package/dist/components/typography.js +128 -0
  401. package/dist/components/user-picker.d.ts +89 -0
  402. package/dist/components/user-picker.js +162 -0
  403. package/dist/components/version-history.d.ts +191 -0
  404. package/dist/components/version-history.js +431 -0
  405. package/dist/data-table/csv.d.ts +27 -0
  406. package/dist/data-table/csv.js +68 -0
  407. package/dist/data-table/data-table.d.ts +423 -0
  408. package/dist/data-table/data-table.js +1259 -0
  409. package/dist/data-table/filter-bar.d.ts +146 -0
  410. package/dist/data-table/filter-bar.js +569 -0
  411. package/dist/data-table/filter-fns.d.ts +65 -0
  412. package/dist/data-table/filter-fns.js +382 -0
  413. package/dist/data-table/index.d.ts +8 -0
  414. package/dist/data-table/index.js +9 -0
  415. package/dist/data-table/saved-views.d.ts +100 -0
  416. package/dist/data-table/saved-views.js +251 -0
  417. package/dist/data-table/types.d.ts +168 -0
  418. package/dist/data-table/types.js +87 -0
  419. package/dist/data-table/url-state.d.ts +94 -0
  420. package/dist/data-table/url-state.js +303 -0
  421. package/dist/data-table/view-state.d.ts +16 -0
  422. package/dist/data-table/view-state.js +81 -0
  423. package/dist/editor/_test-setup.d.ts +1 -0
  424. package/dist/editor/_test-setup.js +33 -0
  425. package/dist/editor/block-editor.d.ts +137 -0
  426. package/dist/editor/block-editor.js +280 -0
  427. package/dist/editor/commands.d.ts +31 -0
  428. package/dist/editor/commands.js +150 -0
  429. package/dist/editor/context.d.ts +108 -0
  430. package/dist/editor/context.js +30 -0
  431. package/dist/editor/convert.d.ts +66 -0
  432. package/dist/editor/convert.js +567 -0
  433. package/dist/editor/drag-handle.d.ts +10 -0
  434. package/dist/editor/drag-handle.js +69 -0
  435. package/dist/editor/extensions.d.ts +34 -0
  436. package/dist/editor/extensions.js +239 -0
  437. package/dist/editor/index.d.ts +14 -0
  438. package/dist/editor/index.js +17 -0
  439. package/dist/editor/inserter.d.ts +12 -0
  440. package/dist/editor/inserter.js +88 -0
  441. package/dist/editor/inspector.d.ts +17 -0
  442. package/dist/editor/inspector.js +65 -0
  443. package/dist/editor/items.d.ts +62 -0
  444. package/dist/editor/items.js +195 -0
  445. package/dist/editor/labels.d.ts +119 -0
  446. package/dist/editor/labels.js +130 -0
  447. package/dist/editor/markdown.d.ts +14 -0
  448. package/dist/editor/markdown.js +209 -0
  449. package/dist/editor/menus.d.ts +20 -0
  450. package/dist/editor/menus.js +236 -0
  451. package/dist/editor/nodes.d.ts +14 -0
  452. package/dist/editor/nodes.js +201 -0
  453. package/dist/editor/outline.d.ts +11 -0
  454. package/dist/editor/outline.js +52 -0
  455. package/dist/editor/schema-form.d.ts +64 -0
  456. package/dist/editor/schema-form.js +290 -0
  457. package/dist/editor/slash-menu.d.ts +15 -0
  458. package/dist/editor/slash-menu.js +119 -0
  459. package/dist/fonts/catalog.d.ts +53 -0
  460. package/dist/fonts/catalog.js +121 -0
  461. package/dist/fonts/font-picker.d.ts +70 -0
  462. package/dist/fonts/font-picker.js +225 -0
  463. package/dist/fonts/index.d.ts +6 -0
  464. package/dist/fonts/index.js +7 -0
  465. package/dist/fonts/loader.d.ts +66 -0
  466. package/dist/fonts/loader.js +161 -0
  467. package/dist/fonts/pairing-picker.d.ts +31 -0
  468. package/dist/fonts/pairing-picker.js +81 -0
  469. package/dist/fonts/pairings.d.ts +84 -0
  470. package/dist/fonts/pairings.js +149 -0
  471. package/dist/fonts/provider.d.ts +34 -0
  472. package/dist/fonts/provider.js +51 -0
  473. package/dist/form/index.d.ts +1 -0
  474. package/dist/form/index.js +1 -0
  475. package/dist/format/core.d.ts +149 -0
  476. package/dist/format/core.js +357 -0
  477. package/dist/format/index.d.ts +4 -0
  478. package/dist/format/index.js +5 -0
  479. package/dist/format/use-format.d.ts +1 -0
  480. package/dist/format/use-format.js +3 -0
  481. package/dist/index.d.ts +91 -0
  482. package/dist/index.js +92 -0
  483. package/dist/lib/cn.d.ts +3 -0
  484. package/dist/lib/cn.js +16 -0
  485. package/dist/lib/color.d.ts +64 -0
  486. package/dist/lib/color.js +177 -0
  487. package/dist/lib/compose-refs.d.ts +24 -0
  488. package/dist/lib/compose-refs.js +45 -0
  489. package/dist/lib/data-islands.d.ts +194 -0
  490. package/dist/lib/data-islands.js +368 -0
  491. package/dist/lib/date.d.ts +129 -0
  492. package/dist/lib/date.js +386 -0
  493. package/dist/lib/field-context.d.ts +64 -0
  494. package/dist/lib/field-context.js +62 -0
  495. package/dist/lib/floating-arrow.d.ts +18 -0
  496. package/dist/lib/floating-arrow.js +15 -0
  497. package/dist/lib/islands.d.ts +38 -0
  498. package/dist/lib/islands.js +40 -0
  499. package/dist/lib/labels.d.ts +51 -0
  500. package/dist/lib/labels.js +56 -0
  501. package/dist/lib/layer.d.ts +36 -0
  502. package/dist/lib/layer.js +42 -0
  503. package/dist/lib/locale.d.ts +85 -0
  504. package/dist/lib/locale.js +105 -0
  505. package/dist/lib/menu.d.ts +58 -0
  506. package/dist/lib/menu.js +99 -0
  507. package/dist/lib/message-format.d.ts +20 -0
  508. package/dist/lib/message-format.js +116 -0
  509. package/dist/lib/nav.d.ts +132 -0
  510. package/dist/lib/nav.js +178 -0
  511. package/dist/lib/provider.d.ts +100 -0
  512. package/dist/lib/provider.js +105 -0
  513. package/dist/lib/public.d.ts +23 -0
  514. package/dist/lib/public.js +34 -0
  515. package/dist/lib/sr-name.d.ts +18 -0
  516. package/dist/lib/sr-name.js +17 -0
  517. package/dist/lib/text.d.ts +100 -0
  518. package/dist/lib/text.js +233 -0
  519. package/dist/lib/theme-scope.d.ts +58 -0
  520. package/dist/lib/theme-scope.js +59 -0
  521. package/dist/lib/use-async-list.d.ts +60 -0
  522. package/dist/lib/use-async-list.js +119 -0
  523. package/dist/lib/use-container-width.d.ts +19 -0
  524. package/dist/lib/use-container-width.js +39 -0
  525. package/dist/lib/use-controllable-state.d.ts +33 -0
  526. package/dist/lib/use-controllable-state.js +56 -0
  527. package/dist/lib/use-edge-fade.d.ts +13 -0
  528. package/dist/lib/use-edge-fade.js +43 -0
  529. package/dist/lib/use-formatted-input.d.ts +69 -0
  530. package/dist/lib/use-formatted-input.js +152 -0
  531. package/dist/lib/use-hotkeys.d.ts +80 -0
  532. package/dist/lib/use-hotkeys.js +221 -0
  533. package/dist/lib/use-hover-intent.d.ts +44 -0
  534. package/dist/lib/use-hover-intent.js +119 -0
  535. package/dist/lib/use-media-query.d.ts +21 -0
  536. package/dist/lib/use-media-query.js +28 -0
  537. package/dist/lib/use-reduced-motion.d.ts +8 -0
  538. package/dist/lib/use-reduced-motion.js +13 -0
  539. package/dist/lib/use-tree.d.ts +153 -0
  540. package/dist/lib/use-tree.js +534 -0
  541. package/dist/lib/value-format.d.ts +25 -0
  542. package/dist/lib/value-format.js +56 -0
  543. package/dist/lib/variants.d.ts +131 -0
  544. package/dist/lib/variants.js +109 -0
  545. package/dist/locale-data/core/date.d.ts +24 -0
  546. package/dist/locale-data/core/date.js +68 -0
  547. package/dist/locale-data/core/decimal.d.ts +19 -0
  548. package/dist/locale-data/core/decimal.js +79 -0
  549. package/dist/locale-data/core/holidays.d.ts +30 -0
  550. package/dist/locale-data/core/holidays.js +79 -0
  551. package/dist/locale-data/core/iban.d.ts +29 -0
  552. package/dist/locale-data/core/iban.js +74 -0
  553. package/dist/locale-data/core/index.d.ts +7 -0
  554. package/dist/locale-data/core/index.js +6 -0
  555. package/dist/locale-data/core/types.d.ts +173 -0
  556. package/dist/locale-data/core/types.js +6 -0
  557. package/dist/locale-data/core/week-info.d.ts +23 -0
  558. package/dist/locale-data/core/week-info.js +85 -0
  559. package/dist/locale-data/core/working-days.d.ts +27 -0
  560. package/dist/locale-data/core/working-days.js +133 -0
  561. package/dist/locale-data/index.d.ts +2 -0
  562. package/dist/locale-data/index.js +4 -0
  563. package/dist/locale-data/tr/address-tr.json +1 -0
  564. package/dist/locale-data/tr/address.d.ts +23 -0
  565. package/dist/locale-data/tr/address.js +52 -0
  566. package/dist/locale-data/tr/holidays.d.ts +31 -0
  567. package/dist/locale-data/tr/holidays.js +81 -0
  568. package/dist/locale-data/tr/iban.d.ts +21 -0
  569. package/dist/locale-data/tr/iban.js +45 -0
  570. package/dist/locale-data/tr/id.d.ts +36 -0
  571. package/dist/locale-data/tr/id.js +120 -0
  572. package/dist/locale-data/tr/index.d.ts +12 -0
  573. package/dist/locale-data/tr/index.js +33 -0
  574. package/dist/locale-data/tr/kdv.d.ts +91 -0
  575. package/dist/locale-data/tr/kdv.js +222 -0
  576. package/dist/locales/en.d.ts +2102 -0
  577. package/dist/locales/en.js +2088 -0
  578. package/dist/locales/tr.d.ts +2086 -0
  579. package/dist/locales/tr.js +2087 -0
  580. package/dist/media/focal-point.d.ts +42 -0
  581. package/dist/media/focal-point.js +96 -0
  582. package/dist/media/gallery-layout.d.ts +19 -0
  583. package/dist/media/gallery-layout.js +61 -0
  584. package/dist/media/gallery.d.ts +64 -0
  585. package/dist/media/gallery.js +140 -0
  586. package/dist/media/image-cropper.d.ts +86 -0
  587. package/dist/media/image-cropper.js +170 -0
  588. package/dist/media/image-field.d.ts +115 -0
  589. package/dist/media/image-field.js +212 -0
  590. package/dist/media/index.d.ts +19 -0
  591. package/dist/media/index.js +23 -0
  592. package/dist/media/lightbox.d.ts +82 -0
  593. package/dist/media/lightbox.js +171 -0
  594. package/dist/media/link-preview.d.ts +97 -0
  595. package/dist/media/link-preview.js +177 -0
  596. package/dist/media/media-library.d.ts +244 -0
  597. package/dist/media/media-library.js +776 -0
  598. package/dist/media/media-picker.d.ts +96 -0
  599. package/dist/media/media-picker.js +209 -0
  600. package/dist/media/media-provider.d.ts +23 -0
  601. package/dist/media/media-provider.js +44 -0
  602. package/dist/media/media-utils.d.ts +39 -0
  603. package/dist/media/media-utils.js +145 -0
  604. package/dist/media/memory-adapter.d.ts +22 -0
  605. package/dist/media/memory-adapter.js +162 -0
  606. package/dist/media/rest-adapter.d.ts +90 -0
  607. package/dist/media/rest-adapter.js +208 -0
  608. package/dist/media/serp.d.ts +62 -0
  609. package/dist/media/serp.js +108 -0
  610. package/dist/media/test-fixtures.d.ts +3 -0
  611. package/dist/media/test-fixtures.js +37 -0
  612. package/dist/media/types.d.ts +183 -0
  613. package/dist/media/types.js +3 -0
  614. package/dist/media/use-pan-zoom.d.ts +51 -0
  615. package/dist/media/use-pan-zoom.js +156 -0
  616. package/dist/media/use-upload-queue.d.ts +64 -0
  617. package/dist/media/use-upload-queue.js +115 -0
  618. package/dist/media/video-player.d.ts +135 -0
  619. package/dist/media/video-player.js +319 -0
  620. package/dist/motion/core.d.ts +32 -0
  621. package/dist/motion/core.js +77 -0
  622. package/dist/motion/count-up.d.ts +29 -0
  623. package/dist/motion/count-up.js +92 -0
  624. package/dist/motion/index.d.ts +11 -0
  625. package/dist/motion/index.js +13 -0
  626. package/dist/motion/motion-scope.d.ts +17 -0
  627. package/dist/motion/motion-scope.js +16 -0
  628. package/dist/motion/page-transition.d.ts +33 -0
  629. package/dist/motion/page-transition.js +61 -0
  630. package/dist/motion/parallax.d.ts +37 -0
  631. package/dist/motion/parallax.js +90 -0
  632. package/dist/motion/pointer.d.ts +38 -0
  633. package/dist/motion/pointer.js +117 -0
  634. package/dist/motion/reveal.d.ts +72 -0
  635. package/dist/motion/reveal.js +133 -0
  636. package/dist/motion/scroll-shrink.d.ts +18 -0
  637. package/dist/motion/scroll-shrink.js +47 -0
  638. package/dist/motion/skeleton-swap.d.ts +17 -0
  639. package/dist/motion/skeleton-swap.js +43 -0
  640. package/dist/motion/text-reveal.d.ts +30 -0
  641. package/dist/motion/text-reveal.js +29 -0
  642. package/dist/motion/ticker.d.ts +35 -0
  643. package/dist/motion/ticker.js +16 -0
  644. package/dist/next/index.d.ts +42 -0
  645. package/dist/next/index.js +36 -0
  646. package/dist/render/block-renderer.d.ts +56 -0
  647. package/dist/render/block-renderer.js +137 -0
  648. package/dist/render/index.d.ts +6 -0
  649. package/dist/render/index.js +7 -0
  650. package/dist/render/prepare.d.ts +61 -0
  651. package/dist/render/prepare.js +119 -0
  652. package/dist/scheduler/core/duration.d.ts +83 -0
  653. package/dist/scheduler/core/duration.js +174 -0
  654. package/dist/scheduler/core/gantt.d.ts +63 -0
  655. package/dist/scheduler/core/gantt.js +226 -0
  656. package/dist/scheduler/core/index.d.ts +6 -0
  657. package/dist/scheduler/core/index.js +7 -0
  658. package/dist/scheduler/core/layout.d.ts +97 -0
  659. package/dist/scheduler/core/layout.js +249 -0
  660. package/dist/scheduler/core/time-scale.d.ts +89 -0
  661. package/dist/scheduler/core/time-scale.js +173 -0
  662. package/dist/scheduler/gantt.d.ts +125 -0
  663. package/dist/scheduler/gantt.js +532 -0
  664. package/dist/scheduler/index.d.ts +6 -0
  665. package/dist/scheduler/index.js +7 -0
  666. package/dist/scheduler/resource-calendar.d.ts +218 -0
  667. package/dist/scheduler/resource-calendar.js +661 -0
  668. package/dist/scheduler/scheduler.d.ts +168 -0
  669. package/dist/scheduler/scheduler.js +768 -0
  670. package/dist/scheduler/shared.d.ts +63 -0
  671. package/dist/scheduler/shared.js +145 -0
  672. package/dist/scheduler/time-tracker.d.ts +138 -0
  673. package/dist/scheduler/time-tracker.js +403 -0
  674. package/dist/sortable/core.d.ts +67 -0
  675. package/dist/sortable/core.js +167 -0
  676. package/dist/sortable/index.d.ts +8 -0
  677. package/dist/sortable/index.js +10 -0
  678. package/dist/sortable/kanban-core.d.ts +70 -0
  679. package/dist/sortable/kanban-core.js +67 -0
  680. package/dist/sortable/kanban.d.ts +147 -0
  681. package/dist/sortable/kanban.js +472 -0
  682. package/dist/sortable/sortable-list.d.ts +71 -0
  683. package/dist/sortable/sortable-list.js +76 -0
  684. package/dist/sortable/sortable-tree.d.ts +105 -0
  685. package/dist/sortable/sortable-tree.js +462 -0
  686. package/dist/sortable/sortable.d.ts +188 -0
  687. package/dist/sortable/sortable.js +485 -0
  688. package/dist/sortable/use-pointer-drag.d.ts +75 -0
  689. package/dist/sortable/use-pointer-drag.js +173 -0
  690. package/dist/sortable/use-time-scale.d.ts +11 -0
  691. package/dist/sortable/use-time-scale.js +19 -0
  692. package/dist/styles/base.css +51 -0
  693. package/dist/styles/blocks.css +949 -0
  694. package/dist/styles/calendar.css +642 -0
  695. package/dist/styles/charts.css +264 -0
  696. package/dist/styles/data.css +474 -0
  697. package/dist/styles/editors.css +1022 -0
  698. package/dist/styles/forms.css +406 -0
  699. package/dist/styles/media.css +515 -0
  700. package/dist/styles/motion.css +389 -0
  701. package/dist/styles/navigation.css +293 -0
  702. package/dist/styles/overlays.css +244 -0
  703. package/dist/styles.css +743 -0
  704. package/package.json +160 -4
@@ -0,0 +1,399 @@
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 { Popover as PopoverPrimitive } from "radix-ui";
5
+ import { Bell, Check, CheckCheck, Settings } from "lucide-react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { useLocale } from "../lib/locale.js";
9
+ import { SmartLink } from "../lib/provider.js";
10
+ import { usePortalContainer } from "../lib/theme-scope.js";
11
+ import { Layer } from "../lib/layer.js";
12
+ import { useLatest } from "../lib/use-controllable-state.js";
13
+ import { useMediaQuery } from "../lib/use-media-query.js";
14
+ import { Button, IconButton } from "./button.js";
15
+ import { Avatar } from "./avatar.js";
16
+ import { Badge } from "./badge.js";
17
+ import { Skeleton } from "./skeleton.js";
18
+ import { Alert } from "./alert.js";
19
+ import { EmptyState } from "./empty-state.js";
20
+ import { Spinner } from "./spinner.js";
21
+ import { Sheet, SheetContent } from "./sheet.js";
22
+ import { DialogTitle } from "./dialog.js";
23
+ import { toast } from "./toast.js";
24
+ const notificationLabels = {
25
+ label: "Notifications",
26
+ trigger: "Notifications",
27
+ triggerUnread: "Notifications, {count, plural, one {# unread} other {# unread}}",
28
+ unreadCount: "{count, plural, one {# unread} other {# unread}}",
29
+ markAllRead: "Mark all as read",
30
+ markRead: "Mark as read",
31
+ empty: "You're all caught up",
32
+ emptyDescription: "New mentions, approvals and updates will show up here.",
33
+ error: "Couldn't load notifications.",
34
+ retry: "Try again",
35
+ loadMore: "Load more",
36
+ settings: "Notification settings",
37
+ today: "Today",
38
+ yesterday: "Yesterday",
39
+ earlier: "Earlier",
40
+ all: "All",
41
+ unread: "Unread",
42
+ mentions: "Mentions",
43
+ filter: "Filter notifications",
44
+ newItem: "New notification: {title}",
45
+ unreadDot: "Unread",
46
+ };
47
+ /**
48
+ * An in-memory adapter: `filter` "unread" keeps unread items, any other value matches `category`
49
+ * or `app`. Pages of `pageSize` (default 20), with optional `latency` in ms.
50
+ */
51
+ export function createMemoryNotificationAdapter(initial, options = {}) {
52
+ let items = [...initial].sort((a, b) => +new Date(b.createdAt) - +new Date(a.createdAt));
53
+ const subs = new Set();
54
+ const pageSize = options.pageSize ?? 20;
55
+ const wait = (signal) => new Promise((resolve, reject) => {
56
+ if (!options.latency)
57
+ return resolve();
58
+ const t = setTimeout(resolve, options.latency);
59
+ signal?.addEventListener("abort", () => {
60
+ clearTimeout(t);
61
+ reject(new DOMException("Aborted", "AbortError"));
62
+ });
63
+ });
64
+ return {
65
+ async list({ cursor, filter, signal }) {
66
+ await wait(signal);
67
+ const pool = items.filter((n) => (!filter ? true : filter === "unread" ? !n.readAt : n.category === filter || n.app === filter));
68
+ const start = cursor ? Number(cursor) : 0;
69
+ const page = pool.slice(start, start + pageSize);
70
+ return { items: page, nextCursor: start + pageSize < pool.length ? String(start + pageSize) : undefined };
71
+ },
72
+ async unreadCount() {
73
+ return items.filter((n) => !n.readAt).length;
74
+ },
75
+ async markRead(ids) {
76
+ const now = new Date().toISOString();
77
+ items = items.map((n) => (ids === "all" || ids.includes(n.id) ? { ...n, readAt: n.readAt ?? now } : n));
78
+ },
79
+ async onAction(id, actionId) {
80
+ await wait();
81
+ await options.onAction?.(id, actionId);
82
+ items = items.map((n) => (n.id === id ? { ...n, actions: undefined, readAt: n.readAt ?? new Date().toISOString() } : n));
83
+ },
84
+ subscribe(cb) {
85
+ subs.add(cb);
86
+ return () => subs.delete(cb);
87
+ },
88
+ push(n) {
89
+ items = [n, ...items];
90
+ subs.forEach((cb) => cb(n));
91
+ },
92
+ };
93
+ }
94
+ const emptyList = { items: [], status: "idle", loadingMore: false };
95
+ const NotificationContext = React.createContext(null);
96
+ const useNC = () => {
97
+ const ctx = React.useContext(NotificationContext);
98
+ if (!ctx)
99
+ throw new Error("Notification parts must be used inside <NotificationCenter>.");
100
+ return ctx;
101
+ };
102
+ const isUnread = (n) => !n.readAt;
103
+ /**
104
+ * An in-app inbox: the bell in the top bar, a panel (popover ≥768px, sheet below) with filter tabs,
105
+ * a grouped feed (Today / Yesterday / Earlier), read/unread, inline actions and "Mark all as read".
106
+ * Data comes through an adapter, so the app chooses REST, SSE or websockets.
107
+ *
108
+ * ```tsx
109
+ * <NotificationCenter adapter={inbox} settingsHref="/settings/notifications" toastOnNew />
110
+ * ```
111
+ */
112
+ export function NotificationCenter({ adapter, tabs: tabsProp, toastOnNew, pollInterval, size = "md", settingsHref, open: openProp, defaultOpen = false, onOpenChange, children, labels, }) {
113
+ const t = useLabels("notifications", notificationLabels, labels);
114
+ const tabs = React.useMemo(() => tabsProp ?? [{ id: "all", label: t("all") }, { id: "unread", label: t("unread"), filter: "unread" }, { id: "mentions", label: t("mentions"), filter: "mention" }], [tabsProp, t]);
115
+ const [openState, setOpenState] = React.useState(defaultOpen);
116
+ const open = openProp ?? openState;
117
+ const onOpenChangeRef = useLatest(onOpenChange);
118
+ const setOpen = React.useCallback((o) => {
119
+ if (openProp === undefined)
120
+ setOpenState(o);
121
+ onOpenChangeRef.current?.(o);
122
+ }, [openProp, onOpenChangeRef]);
123
+ const [tab, setTab] = React.useState(tabs[0]?.id ?? "all");
124
+ const [lists, setLists] = React.useState({});
125
+ const [unread, setUnread] = React.useState(0);
126
+ const [pending, setPending] = React.useState({});
127
+ const triggerRef = React.useRef(null);
128
+ const adapterRef = useLatest(adapter);
129
+ const filterOf = React.useCallback((id) => tabs.find((x) => x.id === id)?.filter, [tabs]);
130
+ const refreshCount = React.useCallback(() => {
131
+ adapterRef.current.unreadCount().then(setUnread, () => { });
132
+ }, [adapterRef]);
133
+ React.useEffect(refreshCount, [refreshCount, adapter]);
134
+ const load = React.useCallback((tabId, signal, cursor) => {
135
+ setLists((prev) => {
136
+ const cur = prev[tabId] ?? emptyList;
137
+ return { ...prev, [tabId]: cursor ? { ...cur, loadingMore: true } : { ...cur, status: "loading" } };
138
+ });
139
+ adapterRef.current.list({ cursor, filter: filterOf(tabId), signal }).then((res) => {
140
+ if (signal.aborted)
141
+ return;
142
+ setLists((prev) => {
143
+ const cur = prev[tabId] ?? emptyList;
144
+ const items = cursor ? [...cur.items, ...res.items.filter((n) => !cur.items.some((c) => c.id === n.id))] : res.items;
145
+ return { ...prev, [tabId]: { items, nextCursor: res.nextCursor, status: "ready", loadingMore: false } };
146
+ });
147
+ }, () => {
148
+ if (signal.aborted)
149
+ return;
150
+ setLists((prev) => ({ ...prev, [tabId]: { ...(prev[tabId] ?? emptyList), status: cursor ? "ready" : "error", loadingMore: false } }));
151
+ });
152
+ }, [adapterRef, filterOf]);
153
+ // Load the active tab when the panel opens or the tab changes.
154
+ const [reloadKey, setReloadKey] = React.useState(0);
155
+ React.useEffect(() => {
156
+ if (!open)
157
+ return;
158
+ const ac = new AbortController();
159
+ load(tab, ac.signal);
160
+ refreshCount();
161
+ return () => ac.abort();
162
+ }, [open, tab, load, reloadKey, refreshCount]);
163
+ const loadMore = React.useCallback(() => {
164
+ const cur = lists[tab];
165
+ if (!cur?.nextCursor || cur.loadingMore)
166
+ return;
167
+ load(tab, new AbortController().signal, cur.nextCursor);
168
+ }, [lists, tab, load]);
169
+ // Live items + toasts + a throttled polite announcement.
170
+ const [announcement, setAnnouncement] = React.useState("");
171
+ const lastAnnounce = React.useRef(0);
172
+ const toastRef = useLatest(toastOnNew);
173
+ React.useEffect(() => {
174
+ if (!adapter.subscribe)
175
+ return;
176
+ return adapter.subscribe((n) => {
177
+ setLists((prev) => {
178
+ const next = {};
179
+ for (const [id, l] of Object.entries(prev)) {
180
+ const f = filterOf(id);
181
+ const fits = !f || (f === "unread" && isUnread(n)) || n.category === f || n.app === f;
182
+ next[id] = fits ? { ...l, items: [n, ...l.items.filter((x) => x.id !== n.id)] } : l;
183
+ }
184
+ return next;
185
+ });
186
+ if (isUnread(n))
187
+ setUnread((u) => u + 1);
188
+ const shouldToast = typeof toastRef.current === "function" ? toastRef.current(n) : toastRef.current;
189
+ if (shouldToast)
190
+ toast(n.title, { description: n.body });
191
+ const now = Date.now();
192
+ if (now - lastAnnounce.current > 10_000) {
193
+ lastAnnounce.current = now;
194
+ setAnnouncement(t("newItem", { title: typeof n.title === "string" ? n.title : "" }));
195
+ }
196
+ });
197
+ }, [adapter, filterOf, toastRef, t]);
198
+ React.useEffect(() => {
199
+ if (adapter.subscribe || !pollInterval)
200
+ return;
201
+ const id = setInterval(refreshCount, pollInterval);
202
+ return () => clearInterval(id);
203
+ }, [adapter, pollInterval, refreshCount]);
204
+ const markRead = React.useCallback((ids) => {
205
+ const now = new Date().toISOString();
206
+ let changed = 0;
207
+ const seen = new Set();
208
+ setLists((prev) => {
209
+ const next = {};
210
+ for (const [id, l] of Object.entries(prev)) {
211
+ next[id] = {
212
+ ...l,
213
+ items: l.items.map((n) => {
214
+ if (isUnread(n) && (ids === "all" || ids.includes(n.id))) {
215
+ if (!seen.has(n.id)) {
216
+ seen.add(n.id);
217
+ changed++;
218
+ }
219
+ return { ...n, readAt: now };
220
+ }
221
+ return n;
222
+ }),
223
+ };
224
+ }
225
+ return next;
226
+ });
227
+ setUnread((u) => (ids === "all" ? 0 : Math.max(0, u - (changed || ids.length))));
228
+ adapterRef.current.markRead(ids).then(refreshCount, refreshCount);
229
+ }, [adapterRef, refreshCount]);
230
+ const runAction = React.useCallback(async (id, actionId) => {
231
+ setPending((p) => ({ ...p, [id]: actionId }));
232
+ try {
233
+ await adapterRef.current.onAction?.(id, actionId);
234
+ setLists((prev) => {
235
+ const next = {};
236
+ for (const [k, l] of Object.entries(prev))
237
+ next[k] = { ...l, items: l.items.map((n) => (n.id === id ? { ...n, actions: undefined, readAt: n.readAt ?? new Date().toISOString() } : n)) };
238
+ return next;
239
+ });
240
+ refreshCount();
241
+ }
242
+ finally {
243
+ setPending((p) => ({ ...p, [id]: undefined }));
244
+ }
245
+ }, [adapterRef, refreshCount]);
246
+ const list = lists[tab] ?? emptyList;
247
+ const important = Object.values(lists).some((l) => l.items.some((n) => n.important && isUnread(n)));
248
+ const value = {
249
+ open,
250
+ setOpen,
251
+ unread,
252
+ important,
253
+ tabs,
254
+ tab,
255
+ setTab,
256
+ list,
257
+ reload: () => setReloadKey((k) => k + 1),
258
+ loadMore,
259
+ markRead,
260
+ runAction,
261
+ pending,
262
+ triggerRef,
263
+ settingsHref,
264
+ size,
265
+ t,
266
+ };
267
+ return (_jsxs(NotificationContext.Provider, { value: value, children: [children ?? (_jsxs(_Fragment, { children: [_jsx(NotificationTrigger, {}), _jsxs(NotificationPanel, { children: [_jsx(NotificationTabs, {}), _jsx(NotificationList, {}), _jsx(NotificationFooter, {})] })] })), _jsx("div", { "aria-live": "polite", className: "sr-only", children: announcement })] }));
268
+ }
269
+ /* ------------------------------------------------------------------ */
270
+ /* Trigger */
271
+ /* ------------------------------------------------------------------ */
272
+ /** The bell with the unread badge (99+). `aria-label` includes the count. */
273
+ export const NotificationTrigger = React.forwardRef(function NotificationTrigger({ className, size = "sm", onClick, ...props }, ref) {
274
+ const { open, setOpen, unread, important, triggerRef, t } = useNC();
275
+ const { format } = useLocale();
276
+ const label = unread > 0 ? t("triggerUnread", { count: unread }) : t("trigger");
277
+ return (_jsxs("span", { className: "relative inline-flex", children: [_jsx(IconButton, { ref: (node) => {
278
+ triggerRef.current = node;
279
+ if (typeof ref === "function")
280
+ ref(node);
281
+ else if (ref)
282
+ ref.current = node;
283
+ }, label: label, tooltip: false, size: size, "aria-haspopup": "dialog", "aria-expanded": open, "data-state": open ? "open" : "closed", onClick: (e) => {
284
+ onClick?.(e);
285
+ if (!e.defaultPrevented)
286
+ setOpen(!open);
287
+ }, className: cn(open && "bg-hover", className), ...props, children: _jsx(Bell, {}) }), unread > 0 ? (_jsx("span", { "aria-hidden": true, "data-slot": "notification-badge", className: cn("pointer-events-none absolute -end-0.5 -top-0.5 min-w-4 rounded-full px-1 text-center text-[10px] font-semibold leading-4 tabular ring-2 ring-(--scene)", important ? "bg-danger-solid text-white" : "bg-accent text-accent-fg"), children: unread > 99 ? `${format.number(99)}+` : format.number(unread) })) : null] }));
288
+ });
289
+ /* ------------------------------------------------------------------ */
290
+ /* Panel */
291
+ /* ------------------------------------------------------------------ */
292
+ /** Popover anchored to the bell on ≥768px, an end Sheet below. Titled "Notifications". */
293
+ export function NotificationPanel({ className, children }) {
294
+ const { open, setOpen, triggerRef, size, t } = useNC();
295
+ const container = usePortalContainer();
296
+ const desktop = useMediaQuery("(min-width: 768px)") ?? true;
297
+ const titleId = React.useId();
298
+ const closedByPointer = React.useRef(false);
299
+ const header = (_jsxs("div", { className: "flex items-center gap-2 px-4 pt-3.5 pb-2", children: [_jsx("h2", { id: titleId, className: "text-[15px] font-semibold tracking-[-0.01em] text-fg", children: t("label") }), _jsx(NotificationUnreadBadge, {})] }));
300
+ if (!desktop) {
301
+ return (_jsx(Sheet, { open: open, onOpenChange: setOpen, children: _jsxs(SheetContent, { side: "end", size: "sm", className: cn("p-0", className), children: [_jsx(DialogTitle, { className: "sr-only", children: t("label") }), header, _jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: children })] }) }));
302
+ }
303
+ return (_jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverPrimitive.Anchor, { virtualRef: triggerRef }), _jsx(PopoverPrimitive.Portal, { container: container, children: _jsx(Layer, { asChild: true, children: _jsxs(PopoverPrimitive.Content, { align: "end", sideOffset: 8, collisionPadding: 12, "aria-labelledby": titleId, "data-slot": "notification-panel", "data-size": size, onInteractOutside: (e) => {
304
+ // The bell toggles itself.
305
+ if (triggerRef.current?.contains(e.target))
306
+ e.preventDefault();
307
+ else if (e.type === "dismissableLayer.pointerDownOutside")
308
+ closedByPointer.current = true;
309
+ }, onOpenAutoFocus: () => {
310
+ closedByPointer.current = false;
311
+ }, onCloseAutoFocus: (e) => {
312
+ e.preventDefault();
313
+ // Return focus to the bell — unless the user clicked elsewhere (don't steal that focus).
314
+ if (!closedByPointer.current)
315
+ triggerRef.current?.focus();
316
+ closedByPointer.current = false;
317
+ }, className: cn("surface-popover ui-pop z-(--z-popover) flex max-h-[min(36rem,calc(var(--radix-popover-content-available-height)-8px))] flex-col overflow-hidden rounded-ui-lg outline-none", size === "lg" ? "w-[27.5rem]" : "w-[23.75rem]", "max-w-[calc(100vw-1.5rem)]", className), children: [header, children] }) }) })] }));
318
+ }
319
+ function NotificationUnreadBadge() {
320
+ const { unread, t } = useNC();
321
+ if (!unread)
322
+ return null;
323
+ return (_jsx(Badge, { tone: "accent", size: "sm", children: t("unreadCount", { count: unread }) }));
324
+ }
325
+ /** Filter tabs (All · Unread · Mentions by default). Toggle buttons with `aria-pressed`. */
326
+ export function NotificationTabs({ className }) {
327
+ const { tabs, tab, setTab, t } = useNC();
328
+ if (tabs.length < 2)
329
+ return null;
330
+ return (_jsx("div", { role: "group", "aria-label": t("filter"), className: cn("flex items-center gap-1 border-b border-line px-3 pb-2", className), children: tabs.map((x) => (_jsx("button", { type: "button", "aria-pressed": x.id === tab, onClick: () => setTab(x.id), className: cn("h-7 rounded-full px-3 text-[12.5px] font-medium transition-colors focus-ring", x.id === tab ? "bg-fg text-scene" : "text-fg-muted hover:bg-hover hover:text-fg"), children: x.label }, x.id))) }));
331
+ }
332
+ /* ------------------------------------------------------------------ */
333
+ /* List + item */
334
+ /* ------------------------------------------------------------------ */
335
+ function dayKey(d, timeZone) {
336
+ return new Intl.DateTimeFormat("en-CA", { timeZone, year: "numeric", month: "2-digit", day: "2-digit" }).format(d);
337
+ }
338
+ /** Splits notifications into Today / Yesterday / Earlier in the provider's time zone. */
339
+ export function groupNotifications(items, timeZone = "UTC", now = new Date()) {
340
+ const today = dayKey(now, timeZone);
341
+ const yesterday = dayKey(new Date(now.getTime() - 86_400_000), timeZone);
342
+ const groups = { today: [], yesterday: [], earlier: [] };
343
+ for (const n of items) {
344
+ const k = dayKey(new Date(n.createdAt), timeZone);
345
+ (k === today ? groups.today : k === yesterday ? groups.yesterday : groups.earlier).push(n);
346
+ }
347
+ return ["today", "yesterday", "earlier"].filter((g) => groups[g].length).map((g) => ({ id: g, items: groups[g] }));
348
+ }
349
+ /** The grouped feed with loading, empty, error and "Load more" states. */
350
+ export function NotificationList({ className, grouped = true }) {
351
+ const { list, reload, loadMore, markRead, runAction, pending, setOpen, t } = useNC();
352
+ const { timeZone } = useLocale();
353
+ const groupIds = React.useId();
354
+ let body;
355
+ if (list.status === "loading" || list.status === "idle") {
356
+ body = (_jsx("div", { role: "status", "aria-label": t("label"), className: "grid gap-1 p-2", children: [0, 1, 2].map((i) => (_jsxs("div", { className: "flex gap-3 rounded-ui p-2.5", children: [_jsx(Skeleton, { shape: "circle", className: "size-9 shrink-0" }), _jsxs("div", { className: "grid flex-1 gap-2 pt-1", children: [_jsx(Skeleton, { className: "h-3 w-4/5 rounded-full" }), _jsx(Skeleton, { className: "h-2.5 w-1/2 rounded-full" })] })] }, i))) }));
357
+ }
358
+ else if (list.status === "error") {
359
+ body = (_jsx("div", { className: "p-3", children: _jsx(Alert, { tone: "danger", title: t("error"), actions: _jsx(Button, { size: "sm", onClick: reload, children: t("retry") }) }) }));
360
+ }
361
+ else if (!list.items.length) {
362
+ body = _jsx(EmptyState, { kind: "done", size: "sm", title: t("empty"), description: t("emptyDescription"), className: "py-10" });
363
+ }
364
+ else {
365
+ const groups = grouped ? groupNotifications(list.items, timeZone) : [{ id: "earlier", items: list.items }];
366
+ body = (_jsxs("div", { className: "grid gap-1 px-1.5 py-1.5", children: [groups.map((g) => (_jsxs("section", { "aria-labelledby": grouped ? `${groupIds}-${g.id}` : undefined, children: [grouped ? (_jsx("h3", { id: `${groupIds}-${g.id}`, className: "px-2.5 pt-2 pb-1 text-[11px] font-medium tracking-[0.06em] text-fg-subtle", children: t(g.id) })) : null, _jsx("div", { role: "feed", "aria-busy": list.loadingMore, "aria-labelledby": grouped ? `${groupIds}-${g.id}` : undefined, "aria-label": grouped ? undefined : t("label"), className: "grid gap-px", children: g.items.map((n, i) => (_jsx(NotificationItem, { notification: n, posinset: i + 1, setsize: g.items.length, pendingAction: pending[n.id], onOpen: () => {
367
+ if (isUnread(n))
368
+ markRead([n.id]);
369
+ setOpen(false);
370
+ }, onMarkRead: () => markRead([n.id]), onAction: (actionId) => runAction(n.id, actionId) }, n.id))) })] }, g.id))), list.nextCursor ? (_jsx("div", { className: "flex justify-center py-2", children: _jsx(Button, { size: "sm", variant: "ghost", loading: list.loadingMore, onClick: loadMore, children: t("loadMore") }) })) : null] }));
371
+ }
372
+ return _jsx("div", { className: cn("min-h-0 flex-1 overflow-y-auto overscroll-contain", className), children: body });
373
+ }
374
+ const toneWell = {
375
+ neutral: "tone-neutral",
376
+ info: "tone-info",
377
+ success: "tone-success",
378
+ warning: "tone-warning",
379
+ danger: "tone-danger",
380
+ };
381
+ /** One notification. Usable on its own — e.g. a full "/notifications" page. */
382
+ export const NotificationItem = React.forwardRef(function NotificationItem({ notification: n, onOpen, onMarkRead, onAction, pendingAction, posinset, setsize, labels, className, ...props }, ref) {
383
+ const t = useLabels("notifications", notificationLabels, labels);
384
+ const { format } = useLocale();
385
+ const titleId = React.useId();
386
+ const bodyId = React.useId();
387
+ const unread = isUnread(n);
388
+ const created = new Date(n.createdAt);
389
+ return (_jsxs("article", { ref: ref, "aria-labelledby": titleId, "aria-describedby": n.body ? bodyId : undefined, "aria-posinset": posinset, "aria-setsize": setsize, "data-slot": "notification-item", "data-unread": unread ? "" : undefined, className: cn("group/n relative flex gap-3 rounded-ui p-2.5 transition-colors focus-within:bg-hover hover:bg-hover", unread && "bg-[color-mix(in_srgb,var(--accent-soft)_45%,transparent)]", className), ...props, children: [_jsx("div", { className: "relative shrink-0", children: n.actor ? (_jsx(Avatar, { name: n.actor.name, src: n.actor.avatar, size: "md", "aria-hidden": true })) : (_jsx("span", { "aria-hidden": true, className: cn("tone-soft grid size-9 place-items-center rounded-full [&_svg]:size-4", toneWell[n.tone ?? "neutral"]), children: n.icon ?? _jsx(Bell, {}) })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { id: titleId, className: cn("text-[13.5px] leading-snug text-fg", unread ? "font-medium" : "text-fg-muted"), children: n.href ? (_jsx(SmartLink, { href: n.href, onClick: onOpen, className: "rounded-[3px] outline-none after:absolute after:inset-0 after:rounded-ui after:content-[''] focus-visible:after:outline-2 focus-visible:after:outline-ring", children: n.title })) : (n.title) }), n.body ? (_jsx("p", { id: bodyId, className: "mt-0.5 line-clamp-2 text-[13px] leading-snug text-fg-muted", children: n.body })) : null, _jsxs("p", { className: "mt-1 flex flex-wrap items-center gap-1.5 text-[12px] text-fg-subtle", children: [_jsx("time", { dateTime: created.toISOString(), suppressHydrationWarning: true, children: format.relative(created, { style: "short" }) }), n.app ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, children: "\u00B7" }), _jsx(Badge, { size: "sm", tone: "outline", shape: "square", children: n.app })] })) : null] }), n.actions?.length ? (_jsx("div", { className: "relative z-10 mt-2 flex flex-wrap gap-1.5", children: n.actions.map((a) => (_jsx(Button, { size: "xs", variant: a.variant === "primary" ? "primary" : "secondary", loading: pendingAction === a.id, disabled: Boolean(pendingAction) && pendingAction !== a.id, onClick: () => void onAction?.(a.id), children: a.label }, a.id))) })) : null] }), unread ? (_jsxs("div", { className: "relative z-10 flex shrink-0 flex-col items-center gap-1", children: [_jsx("span", { className: "mt-1.5 size-2 rounded-full bg-accent ring-2 ring-[color-mix(in_srgb,var(--accent)_25%,transparent)]", children: _jsx("span", { className: "sr-only", children: t("unreadDot") }) }), onMarkRead ? (_jsx(IconButton, { label: t("markRead"), size: "xs", tooltip: false, className: "opacity-0 transition-opacity group-hover/n:opacity-100 group-focus-within/n:opacity-100 focus-visible:opacity-100", onClick: onMarkRead, children: _jsx(Check, {}) })) : null] })) : null] }));
390
+ });
391
+ /** Footer: "Mark all as read" and a settings link. */
392
+ export function NotificationFooter({ className }) {
393
+ const { unread, markRead, settingsHref, setOpen, t } = useNC();
394
+ return (_jsxs("div", { className: cn("flex items-center justify-between gap-2 border-t border-line px-2 py-1.5", className), children: [_jsxs(Button, { size: "sm", variant: "ghost", disabled: !unread, onClick: () => markRead("all"), children: [_jsx(CheckCheck, { "aria-hidden": true }), " ", t("markAllRead")] }), settingsHref ? (_jsx(Button, { size: "sm", variant: "ghost", asChild: true, children: _jsxs(SmartLink, { href: settingsHref, onClick: () => setOpen(false), children: [_jsx(Settings, { "aria-hidden": true }), " ", t("settings")] }) })) : null] }));
395
+ }
396
+ /** Spinner row while paginating (for custom lists). */
397
+ export function NotificationLoadingRow() {
398
+ return (_jsx("div", { className: "flex justify-center py-3 text-fg-subtle", children: _jsx(Spinner, { size: "sm" }) }));
399
+ }
@@ -0,0 +1,60 @@
1
+ import * as React from "react";
2
+ import type { MenuEntry } from "../lib/variants.js";
3
+ export { filterNav, resolveActive, flattenNav, matchPath, navItems, findNavItem, navTrailItems, normaliseBadge, isNavGroup, isNavItem, isNavSeparator, SIDEBAR_COOKIE, parseSidebarCookie, } from "../lib/nav.js";
4
+ export declare const pageHeaderTitleVariants: (props?: ({
5
+ size?: "sm" | "md" | "lg" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
8
+ /** The page's one `<h1>`. `<em>` inside follows the font preset (italic in serif headings). */
9
+ title: React.ReactNode;
10
+ /** Small line above the title ("Monday, November 10", "Content"). */
11
+ eyebrow?: React.ReactNode;
12
+ /** A Breadcrumb, or `"auto"` to build it from the App shell's active nav trail. */
13
+ breadcrumb?: React.ReactNode | "auto";
14
+ /** "← Contacts" link above the title. */
15
+ back?: {
16
+ href: string;
17
+ label: string;
18
+ };
19
+ description?: React.ReactNode;
20
+ /** Status badges, "Updated 2h ago" — next to the title. */
21
+ meta?: React.ReactNode;
22
+ /** Buttons at the end; they wrap under the title on narrow screens. */
23
+ actions?: React.ReactNode;
24
+ /** Secondary actions in a "⋯" menu after `actions`. */
25
+ menu?: MenuEntry[];
26
+ /** Sub-navigation (`TabsLinkList` / `TabsList`) attached to the bottom edge. */
27
+ tabs?: React.ReactNode;
28
+ /** `lg` 40px (dashboards), `md` 30px (lists, default), `sm` 22px (records) — scaled by the font preset. */
29
+ size?: "sm" | "md" | "lg";
30
+ /** Sticks under the top bar on the bar surface. */
31
+ sticky?: boolean;
32
+ align?: "start" | "center";
33
+ /** Title still loading: a skeleton line in the `<h1>`. */
34
+ loading?: boolean;
35
+ }
36
+ /**
37
+ * The title block of a page: breadcrumb or eyebrow, title in the display font, description, meta,
38
+ * actions and sub-tabs. Server-compatible; `breadcrumb="auto"` is a small client island that reads
39
+ * the App shell's active trail.
40
+ *
41
+ * ```tsx
42
+ * <PageHeader
43
+ * eyebrow="Content"
44
+ * title="Posts"
45
+ * description="128 posts · 6 scheduled"
46
+ * actions={<Button variant="primary">New post</Button>}
47
+ * />
48
+ * ```
49
+ */
50
+ export declare const PageHeader: React.ForwardRefExoticComponent<PageHeaderProps & React.RefAttributes<HTMLElement>>;
51
+ /** The `<h1>`. */
52
+ export declare const PageHeaderTitle: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLHeadingElement> & {
53
+ size?: "sm" | "md" | "lg";
54
+ } & React.RefAttributes<HTMLHeadingElement>>;
55
+ /** The small line above the title. Not uppercased with CSS: `text-transform` breaks Turkish i/İ without the right `lang`. */
56
+ export declare function PageHeaderEyebrow({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
57
+ export declare function PageHeaderDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
58
+ export declare function PageHeaderActions({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
59
+ /** Tabs row; pulls itself onto the header's bottom hairline. */
60
+ export declare function PageHeaderTabs({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { ArrowLeft } from "lucide-react";
5
+ import { cn } from "../lib/cn.js";
6
+ import { SmartLink } from "../lib/provider.js";
7
+ import { Skeleton } from "./skeleton.js";
8
+ import { ActionMenu } from "./dropdown-menu.js";
9
+ import { AppShellBreadcrumb } from "./app-shell.js";
10
+ // Server-safe nav helpers (this module has no "use client"), so server layouts can call them.
11
+ export { filterNav, resolveActive, flattenNav, matchPath, navItems, findNavItem, navTrailItems, normaliseBadge, isNavGroup, isNavItem, isNavSeparator, SIDEBAR_COOKIE, parseSidebarCookie, } from "../lib/nav.js";
12
+ export const pageHeaderTitleVariants = cva("font-display min-w-0 text-fg [text-wrap:balance]", {
13
+ variants: {
14
+ size: {
15
+ /** Record pages. */
16
+ sm: "text-[length:calc(22px*var(--display-scale))] leading-[1.15]",
17
+ /** Lists and settings. */
18
+ md: "text-[length:calc(30px*var(--display-scale))] leading-[1.1]",
19
+ /** Dashboards. */
20
+ lg: "text-[length:calc(40px*var(--display-scale))] leading-[1.05]",
21
+ },
22
+ },
23
+ defaultVariants: { size: "md" },
24
+ });
25
+ /**
26
+ * The title block of a page: breadcrumb or eyebrow, title in the display font, description, meta,
27
+ * actions and sub-tabs. Server-compatible; `breadcrumb="auto"` is a small client island that reads
28
+ * the App shell's active trail.
29
+ *
30
+ * ```tsx
31
+ * <PageHeader
32
+ * eyebrow="Content"
33
+ * title="Posts"
34
+ * description="128 posts · 6 scheduled"
35
+ * actions={<Button variant="primary">New post</Button>}
36
+ * />
37
+ * ```
38
+ */
39
+ export const PageHeader = React.forwardRef(function PageHeader({ title, eyebrow, breadcrumb, back, description, meta, actions, menu, tabs, size = "md", sticky, align = "start", loading, className, children, ...props }, ref) {
40
+ const centered = align === "center";
41
+ return (_jsxs("header", { ref: ref, "data-slot": "page-header", "data-size": size, className: cn("grid gap-3", tabs ? "mb-6" : size === "lg" ? "mb-8" : "mb-6", sticky && "surface-bar sticky top-(--topbar-h) z-(--z-sticky) -mx-[var(--page-px,1.5rem)] px-[var(--page-px,1.5rem)] pt-3", sticky && !tabs && "pb-3", centered && "justify-items-center text-center", className), ...props, children: [breadcrumb === "auto" ? _jsx(AppShellBreadcrumb, {}) : breadcrumb ? breadcrumb : null, back ? (_jsxs(SmartLink, { href: back.href, className: "-ms-0.5 inline-flex w-fit items-center gap-1.5 rounded-ui-sm text-[13px] text-fg-muted transition-colors hover:text-fg focus-ring", children: [_jsx(ArrowLeft, { "aria-hidden": true, className: "size-3.5 rtl:-scale-x-100" }), back.label] })) : null, _jsxs("div", { className: cn("flex flex-wrap items-end gap-x-6 gap-y-4", centered ? "justify-center" : "justify-between"), children: [_jsxs("div", { className: cn("min-w-0", centered ? "max-w-2xl" : "max-w-3xl flex-[1_1_22rem]"), children: [eyebrow ? _jsx(PageHeaderEyebrow, { className: "mb-1.5", children: eyebrow }) : null, _jsxs("div", { className: cn("flex flex-wrap items-center gap-x-3 gap-y-1.5", centered && "justify-center"), children: [_jsx(PageHeaderTitle, { size: size, "aria-busy": loading || undefined, children: loading ? _jsx(Skeleton, { className: "inline-block h-[0.8em] w-[min(18rem,60vw)] rounded-ui-sm align-middle" }) : title }), meta ? _jsx("div", { className: "flex flex-wrap items-center gap-2 text-[13px] text-fg-subtle", children: meta }) : null] }), description ? _jsx(PageHeaderDescription, { className: cn(size === "lg" ? "mt-2.5" : "mt-1.5", centered && "mx-auto"), children: description }) : null] }), actions || menu?.length ? (_jsxs(PageHeaderActions, { children: [actions, menu?.length ? _jsx(ActionMenu, { items: menu, triggerSize: "md" }) : null] })) : null] }), children, tabs ? _jsx(PageHeaderTabs, { children: tabs }) : null] }));
42
+ });
43
+ /** The `<h1>`. */
44
+ export const PageHeaderTitle = React.forwardRef(function PageHeaderTitle({ size, className, ...props }, ref) {
45
+ return _jsx("h1", { ref: ref, "data-slot": "page-header-title", className: cn(pageHeaderTitleVariants({ size }), className), ...props });
46
+ });
47
+ /** The small line above the title. Not uppercased with CSS: `text-transform` breaks Turkish i/İ without the right `lang`. */
48
+ export function PageHeaderEyebrow({ className, ...props }) {
49
+ return _jsx("p", { "data-slot": "page-header-eyebrow", className: cn("text-[12px] font-medium tracking-[0.08em] text-fg-subtle", className), ...props });
50
+ }
51
+ export function PageHeaderDescription({ className, ...props }) {
52
+ return _jsx("p", { "data-slot": "page-header-description", className: cn("max-w-[62ch] text-[14.5px] leading-relaxed text-fg-muted", className), ...props });
53
+ }
54
+ export function PageHeaderActions({ className, ...props }) {
55
+ return _jsx("div", { "data-slot": "page-header-actions", className: cn("flex flex-wrap items-center gap-2", className), ...props });
56
+ }
57
+ /** Tabs row; pulls itself onto the header's bottom hairline. */
58
+ export function PageHeaderTabs({ className, ...props }) {
59
+ return _jsx("div", { "data-slot": "page-header-tabs", className: cn("-mb-px mt-1 border-b border-line", className), ...props });
60
+ }
@@ -0,0 +1,121 @@
1
+ import * as React from "react";
2
+ declare const paginationLabels: {
3
+ label: string;
4
+ previous: string;
5
+ next: string;
6
+ previousPage: string;
7
+ nextPage: string;
8
+ goTo: string;
9
+ page: string;
10
+ range: string;
11
+ empty: string;
12
+ pageSize: string;
13
+ morePages: string;
14
+ };
15
+ type PaginationLabels = Partial<typeof paginationLabels>;
16
+ export type PaginationRangeItem = number | "ellipsis-start" | "ellipsis-end";
17
+ export interface PaginationRangeOptions {
18
+ /** Current page, 1-based. */
19
+ page: number;
20
+ pageCount: number;
21
+ /** Pages shown on each side of the current one. Default 1. */
22
+ siblingCount?: number;
23
+ /** Pages always shown at the start and end. Default 1. */
24
+ boundaryCount?: number;
25
+ }
26
+ /**
27
+ * The page numbers to render, with ellipsis markers. The length stays constant while paging
28
+ * (no jumping buttons): `paginationRange({ page: 6, pageCount: 20 })` → `[1, "ellipsis-start", 5, 6, 7, "ellipsis-end", 20]`.
29
+ * A gap of exactly one page shows the page instead of "…".
30
+ */
31
+ export declare function paginationRange({ page, pageCount, siblingCount, boundaryCount }: PaginationRangeOptions): PaginationRangeItem[];
32
+ /** Memoised `paginationRange` for components. */
33
+ export declare function usePaginationRange(options: PaginationRangeOptions): PaginationRangeItem[];
34
+ type PaginationSize = "sm" | "md";
35
+ /** The `<ul>` of page items. */
36
+ export declare const PaginationList: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLUListElement> & React.RefAttributes<HTMLUListElement>>;
37
+ /** One `<li>`. */
38
+ export declare const PaginationItem: React.ForwardRefExoticComponent<React.LiHTMLAttributes<HTMLLIElement> & React.RefAttributes<HTMLLIElement>>;
39
+ export interface PaginationLinkProps extends Omit<React.AnchorHTMLAttributes<HTMLAnchorElement> & React.ButtonHTMLAttributes<HTMLButtonElement>, "href" | "type"> {
40
+ /** Real link (SEO, blog archives). Without it the item is a `<button>`. */
41
+ href?: string;
42
+ /** The current page (`aria-current="page"`). */
43
+ isActive?: boolean;
44
+ disabled?: boolean;
45
+ /** Spinner in place of the label (current page while the next page loads). */
46
+ loading?: boolean;
47
+ }
48
+ /** A page number, or the shell for Previous / Next. Router `Link` when `href` is set, else a button. */
49
+ export declare const PaginationLink: React.ForwardRefExoticComponent<PaginationLinkProps & React.RefAttributes<HTMLElement>>;
50
+ export interface PaginationStepProps extends PaginationLinkProps {
51
+ /** Show the word next to the arrow ("Previous"). Default: only the arrow; the name is always "Previous page". */
52
+ showLabel?: boolean;
53
+ labels?: PaginationLabels;
54
+ }
55
+ /** Previous-page control. The arrow flips in RTL. */
56
+ export declare const PaginationPrevious: React.ForwardRefExoticComponent<PaginationStepProps & React.RefAttributes<HTMLElement>>;
57
+ /** Next-page control. The arrow flips in RTL. */
58
+ export declare const PaginationNext: React.ForwardRefExoticComponent<PaginationStepProps & React.RefAttributes<HTMLElement>>;
59
+ /** "…" between page numbers. */
60
+ export declare function PaginationEllipsis({ className, labels, ...props }: React.HTMLAttributes<HTMLSpanElement> & {
61
+ labels?: PaginationLabels;
62
+ }): React.JSX.Element;
63
+ export interface PaginationProps extends Omit<React.HTMLAttributes<HTMLElement>, "onChange"> {
64
+ /** Current page, 1-based. */
65
+ page: number;
66
+ pageCount: number;
67
+ onPageChange?: (page: number) => void;
68
+ /** Web / SEO: real `<a href>` links through the app's router `Link`. */
69
+ getHref?: (page: number) => string;
70
+ /** Default 1. */
71
+ siblingCount?: number;
72
+ /** Default 1. */
73
+ boundaryCount?: number;
74
+ /** `numbers` (default), `compact` ("3 / 52" + arrows) or `simple` (Previous / Next). Below 640px `numbers` shows as `compact`. */
75
+ variant?: "numbers" | "compact" | "simple";
76
+ size?: PaginationSize;
77
+ /** Render nothing when there is only one page. Default `true`. */
78
+ hideOnSinglePage?: boolean;
79
+ /** Spinner on the current page and arrows locked while the next page loads. */
80
+ loading?: boolean;
81
+ labels?: PaginationLabels;
82
+ }
83
+ /**
84
+ * Page through a long list. 1-based `page`, props line up with TanStack Table state.
85
+ *
86
+ * ```tsx
87
+ * <Pagination page={page} pageCount={52} onPageChange={setPage} />
88
+ * <Pagination page={3} pageCount={12} getHref={(p) => `/blog?page=${p}`} /> // SEO links
89
+ * ```
90
+ *
91
+ * Moving focus to the top of the list after a page change is the consumer's job.
92
+ */
93
+ export declare const Pagination: React.ForwardRefExoticComponent<PaginationProps & React.RefAttributes<HTMLElement>>;
94
+ export interface PaginationBarProps extends Omit<PaginationProps, "pageCount"> {
95
+ /** Total number of rows. */
96
+ total: number;
97
+ pageSize: number;
98
+ /** Default `[10, 20, 50, 100]`. Pass `[]` to hide the page-size picker. */
99
+ pageSizeOptions?: number[];
100
+ onPageSizeChange?: (pageSize: number) => void;
101
+ }
102
+ /**
103
+ * The table footer: "1–20 of 312" + rows per page + page numbers. Changing the page size keeps the
104
+ * first visible row on screen (the page is recomputed) — the consumer receives both callbacks.
105
+ */
106
+ export declare const PaginationBar: React.ForwardRefExoticComponent<PaginationBarProps & React.RefAttributes<HTMLDivElement>>;
107
+ export interface CursorPaginationProps extends React.HTMLAttributes<HTMLElement> {
108
+ hasPrev: boolean;
109
+ hasNext: boolean;
110
+ onPrev?: () => void;
111
+ onNext?: () => void;
112
+ /** Locks both buttons and shows a spinner on the one that was pressed. */
113
+ loading?: boolean;
114
+ /** Optional status in the middle, e.g. "Showing 50 contacts". */
115
+ status?: React.ReactNode;
116
+ size?: PaginationSize;
117
+ labels?: PaginationLabels;
118
+ }
119
+ /** Previous / Next for cursor APIs where the total is unknown. */
120
+ export declare const CursorPagination: React.ForwardRefExoticComponent<CursorPaginationProps & React.RefAttributes<HTMLElement>>;
121
+ export {};