@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,150 @@
1
+ import * as React from "react";
2
+ import { type LabelFn } from "../lib/labels.js";
3
+ import { type FieldDiffField } from "./version-history.js";
4
+ export type AuditSeverity = "info" | "warning" | "critical";
5
+ export interface AuditEvent {
6
+ id: string;
7
+ /** ISO instant. */
8
+ at: string;
9
+ actor: {
10
+ id: string;
11
+ name: string;
12
+ type: "user" | "api-key" | "system";
13
+ avatar?: string;
14
+ };
15
+ /** Dotted action code: `"user.role.updated"`. Label it with `actionLabels`. */
16
+ action: string;
17
+ target?: {
18
+ type: string;
19
+ id: string;
20
+ label?: string;
21
+ };
22
+ ip?: string;
23
+ /** "Istanbul, TR". */
24
+ location?: string;
25
+ userAgent?: string;
26
+ changes?: {
27
+ before: Record<string, unknown>;
28
+ after: Record<string, unknown>;
29
+ };
30
+ /** Request id, reason, export size… `requestId` gets its own copy row. */
31
+ metadata?: Record<string, unknown>;
32
+ /** Default `"info"`. */
33
+ severity?: AuditSeverity;
34
+ }
35
+ export interface AuditFilters {
36
+ /** Free text over actor, action, target, IP. */
37
+ q?: string;
38
+ actorId?: string;
39
+ /** Action prefix (`"user"`, `"user.role"`) or full code. */
40
+ action?: string;
41
+ severity?: AuditSeverity;
42
+ }
43
+ export declare const auditLogLabels: {
44
+ log: string;
45
+ search: string;
46
+ searchPlaceholder: string;
47
+ allActors: string;
48
+ allActions: string;
49
+ allSeverities: string;
50
+ actor: string;
51
+ action: string;
52
+ severity: string;
53
+ time: string;
54
+ target: string;
55
+ source: string;
56
+ info: string;
57
+ warning: string;
58
+ critical: string;
59
+ user: string;
60
+ apiKey: string;
61
+ system: string;
62
+ expand: string;
63
+ changes: string;
64
+ fields: string;
65
+ json: string;
66
+ changesView: string;
67
+ noChanges: string;
68
+ details: string;
69
+ eventId: string;
70
+ requestId: string;
71
+ ip: string;
72
+ userAgent: string;
73
+ metadata: string;
74
+ raw: string;
75
+ showRaw: string;
76
+ hideRaw: string;
77
+ copyJson: string;
78
+ results: string;
79
+ resultsOf: string;
80
+ empty: string;
81
+ clear: string;
82
+ loadMore: string;
83
+ loading: string;
84
+ export: string;
85
+ };
86
+ export type AuditLogLabels = Partial<typeof auditLogLabels>;
87
+ type T = LabelFn<typeof auditLogLabels>;
88
+ /** Local filtering (used unless `manualFiltering`). Locale-aware text match. */
89
+ export declare function filterAuditEvents(events: AuditEvent[], filters: AuditFilters, locale?: string, actionLabels?: Record<string, string>): AuditEvent[];
90
+ export interface AuditLogProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "children"> {
91
+ events: AuditEvent[];
92
+ /** Total on the server (server mode) — "50 of 12,408 events". */
93
+ rowCount?: number;
94
+ /** `"user.role.updated"` → "Changed role". Missing codes are humanized. */
95
+ actionLabels?: Record<string, string>;
96
+ /** Labels / formats for the change diff ("price" → currency). */
97
+ changeFields?: FieldDiffField[];
98
+ filters?: AuditFilters;
99
+ defaultFilters?: AuditFilters;
100
+ onFiltersChange?: (filters: AuditFilters) => void;
101
+ /** Server mode: `events` are already filtered; the component only reports filter changes. */
102
+ manualFiltering?: boolean;
103
+ /** Show the built-in filter row. Default `true`. */
104
+ showFilters?: boolean;
105
+ /** Extra filter controls (a Date range picker) at the end of the filter row. */
106
+ toolbar?: React.ReactNode;
107
+ /** Retention / scope notice ("Showing the last 90 days"). */
108
+ notice?: React.ReactNode;
109
+ onExport?: (events: AuditEvent[]) => void;
110
+ hasMore?: boolean;
111
+ /** Called near the end of the scroll and by the "Load older events" button. */
112
+ onLoadMore?: () => void | Promise<void>;
113
+ loading?: boolean;
114
+ /** Scroll viewport height. Default `"32rem"`. */
115
+ height?: string;
116
+ /** Virtualize above this many events. Default 80. */
117
+ virtualizeAfter?: number;
118
+ /** `table` (default) or `timeline` — a compact feed for one record's history. */
119
+ variant?: "table" | "timeline";
120
+ /** Pin the clock for relative times (timeline variant; docs, tests). */
121
+ now?: Date | string | number;
122
+ labels?: AuditLogLabels;
123
+ }
124
+ /**
125
+ * The full ledger of who did what, when and from where: logins, permission changes, exports,
126
+ * deletes. Filter by actor, action and severity, expand an event to see its field diff and raw
127
+ * JSON, and scroll thousands of rows (virtualized, native table semantics kept).
128
+ * Timestamps show seconds and the time zone; IPs and ids are mono and left-to-right.
129
+ *
130
+ * ```tsx
131
+ * <AuditLog
132
+ * events={events}
133
+ * actionLabels={{ "user.role.updated": "Changed role", "export.created": "Exported data" }}
134
+ * hasMore={hasMore}
135
+ * onLoadMore={fetchOlder}
136
+ * notice="Showing the last 90 days"
137
+ * />
138
+ * ```
139
+ */
140
+ export declare const AuditLog: React.ForwardRefExoticComponent<AuditLogProps & React.RefAttributes<HTMLDivElement>>;
141
+ export interface AuditEventDetailProps {
142
+ event: AuditEvent;
143
+ changeFields?: FieldDiffField[];
144
+ labels?: AuditLogLabels;
145
+ /** @internal */
146
+ t?: T;
147
+ }
148
+ /** Expanded row content: field diff (or JSON diff) of the change, ids with copy, client and raw JSON. */
149
+ export declare function AuditEventDetail({ event: e, changeFields, labels, t: tProp }: AuditEventDetailProps): React.JSX.Element;
150
+ export {};
@@ -0,0 +1,205 @@
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 { useVirtualizer } from "@tanstack/react-virtual";
5
+ import { ChevronRight, Cpu, Download, KeyRound, Search, ShieldAlert } from "lucide-react";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { useFormat, useLocale } from "../lib/locale.js";
9
+ import { matchText } from "../lib/text.js";
10
+ import { CopyValueButton } from "../lib/data-islands.js";
11
+ import { ActivityTimeline } from "./activity-timeline.js";
12
+ import { Avatar } from "./avatar.js";
13
+ import { Badge } from "./badge.js";
14
+ import { Button } from "./button.js";
15
+ import { NativeSelect } from "./native-select.js";
16
+ import { Spinner } from "./spinner.js";
17
+ import { ToggleGroup, ToggleGroupItem } from "./toggle.js";
18
+ import { DiffView, FieldDiff } from "./version-history.js";
19
+ export const auditLogLabels = {
20
+ log: "Audit log",
21
+ search: "Search events",
22
+ searchPlaceholder: "Search actor, action, target or IP…",
23
+ allActors: "All actors",
24
+ allActions: "All actions",
25
+ allSeverities: "Any severity",
26
+ actor: "Actor",
27
+ action: "Action",
28
+ severity: "Severity",
29
+ time: "Time",
30
+ target: "Target",
31
+ source: "Source",
32
+ info: "Info",
33
+ warning: "Warning",
34
+ critical: "Critical",
35
+ user: "User",
36
+ apiKey: "API key",
37
+ system: "System",
38
+ expand: "Show details for {action} by {actor}",
39
+ changes: "Changes",
40
+ fields: "Fields",
41
+ json: "JSON",
42
+ changesView: "Changes view",
43
+ noChanges: "No field changes recorded.",
44
+ details: "Details",
45
+ eventId: "Event ID",
46
+ requestId: "Request ID",
47
+ ip: "IP address",
48
+ userAgent: "Client",
49
+ metadata: "Metadata",
50
+ raw: "Raw event",
51
+ showRaw: "View raw JSON",
52
+ hideRaw: "Hide raw JSON",
53
+ copyJson: "event JSON",
54
+ results: "{count, plural, one {# event} other {# events}}",
55
+ resultsOf: "{shown} of {total} events",
56
+ empty: "No events match these filters",
57
+ clear: "Clear filters",
58
+ loadMore: "Load older events",
59
+ loading: "Loading…",
60
+ export: "Export",
61
+ };
62
+ function humanizeAction(code) {
63
+ const s = code.replace(/[._-]+/g, " ").trim();
64
+ return s.charAt(0).toUpperCase() + s.slice(1);
65
+ }
66
+ /** Local filtering (used unless `manualFiltering`). Locale-aware text match. */
67
+ export function filterAuditEvents(events, filters, locale, actionLabels) {
68
+ return events.filter((e) => {
69
+ if (filters.actorId && e.actor.id !== filters.actorId)
70
+ return false;
71
+ if (filters.severity && (e.severity ?? "info") !== filters.severity)
72
+ return false;
73
+ if (filters.action && !(e.action === filters.action || e.action.startsWith(`${filters.action}.`)))
74
+ return false;
75
+ if (filters.q) {
76
+ const hay = [e.actor.name, e.action, actionLabels?.[e.action], e.target?.label, e.target?.id, e.target?.type, e.ip, e.location].filter(Boolean).join(" ");
77
+ if (!matchText(hay, filters.q, locale))
78
+ return false;
79
+ }
80
+ return true;
81
+ });
82
+ }
83
+ /**
84
+ * The full ledger of who did what, when and from where: logins, permission changes, exports,
85
+ * deletes. Filter by actor, action and severity, expand an event to see its field diff and raw
86
+ * JSON, and scroll thousands of rows (virtualized, native table semantics kept).
87
+ * Timestamps show seconds and the time zone; IPs and ids are mono and left-to-right.
88
+ *
89
+ * ```tsx
90
+ * <AuditLog
91
+ * events={events}
92
+ * actionLabels={{ "user.role.updated": "Changed role", "export.created": "Exported data" }}
93
+ * hasMore={hasMore}
94
+ * onLoadMore={fetchOlder}
95
+ * notice="Showing the last 90 days"
96
+ * />
97
+ * ```
98
+ */
99
+ export const AuditLog = React.forwardRef(function AuditLog({ events, rowCount, actionLabels, changeFields, filters: filtersProp, defaultFilters, onFiltersChange, manualFiltering, showFilters = true, toolbar, notice, onExport, hasMore, onLoadMore, loading, height = "32rem", virtualizeAfter = 80, variant = "table", now, labels, className, ...props }, ref) {
100
+ const t = useLabels("auditLog", auditLogLabels, labels);
101
+ const f = useFormat();
102
+ const { locale } = useLocale();
103
+ const [filterState, setFilterState] = React.useState(defaultFilters ?? {});
104
+ const filters = filtersProp ?? filterState;
105
+ const setFilters = (next) => {
106
+ setFilterState(next);
107
+ onFiltersChange?.(next);
108
+ };
109
+ const [expanded, setExpanded] = React.useState(() => new Set());
110
+ const [loadingMore, setLoadingMore] = React.useState(false);
111
+ const scrollRef = React.useRef(null);
112
+ const baseId = React.useId();
113
+ const actionLabel = (code) => actionLabels?.[code] ?? humanizeAction(code);
114
+ const shown = React.useMemo(() => (manualFiltering ? events : filterAuditEvents(events, filters, locale, actionLabels)), [events, filters, manualFiltering, locale, actionLabels]);
115
+ const actors = React.useMemo(() => {
116
+ const m = new Map();
117
+ events.forEach((e) => m.set(e.actor.id, e.actor.name));
118
+ return Array.from(m, ([value, label]) => ({ value, label })).sort((a, b) => a.label.localeCompare(b.label, locale));
119
+ }, [events, locale]);
120
+ const actionGroups = React.useMemo(() => {
121
+ const m = new Set();
122
+ events.forEach((e) => m.add(e.action.split(".")[0]));
123
+ return Array.from(m).sort();
124
+ }, [events]);
125
+ const more = async () => {
126
+ if (!onLoadMore || loadingMore)
127
+ return;
128
+ setLoadingMore(true);
129
+ try {
130
+ await onLoadMore();
131
+ }
132
+ finally {
133
+ setLoadingMore(false);
134
+ }
135
+ };
136
+ const virtual = variant === "table" && shown.length > virtualizeAfter;
137
+ const virtualizer = useVirtualizer({
138
+ count: virtual ? shown.length : 0,
139
+ getScrollElement: () => scrollRef.current,
140
+ estimateSize: () => 52,
141
+ overscan: 8,
142
+ getItemKey: (i) => shown[i]?.id ?? i,
143
+ });
144
+ const toggle = (id) => setExpanded((s) => {
145
+ const n = new Set(s);
146
+ if (n.has(id))
147
+ n.delete(id);
148
+ else
149
+ n.add(id);
150
+ return n;
151
+ });
152
+ const filterRow = showFilters ? (_jsxs("div", { "data-slot": "audit-filters", className: "flex flex-wrap items-center gap-2", children: [_jsxs("label", { className: "relative min-w-48 flex-1", children: [_jsx("span", { className: "sr-only", children: t("search") }), _jsx(Search, { "aria-hidden": true, className: "pointer-events-none absolute start-2.5 top-1/2 size-4 -translate-y-1/2 text-fg-subtle" }), _jsx("input", { type: "search", value: filters.q ?? "", placeholder: t("searchPlaceholder"), onChange: (e) => setFilters({ ...filters, q: e.target.value || undefined }), className: "h-8 w-full rounded-ui-sm border border-field-border bg-field ps-8 pe-2.5 text-[13px] text-fg outline-none placeholder:text-fg-subtle hover:border-field-border-hover focus-visible:border-field-border-hover focus-visible:shadow-[0_0_0_3px_color-mix(in_srgb,var(--ring)_18%,transparent)]" })] }), _jsx(NativeSelect, { size: "sm", "aria-label": t("actor"), value: filters.actorId ?? "", onChange: (e) => setFilters({ ...filters, actorId: e.target.value || undefined }), items: [{ value: "", label: t("allActors") }, ...actors], className: "w-auto" }), _jsx(NativeSelect, { size: "sm", "aria-label": t("action"), value: filters.action ?? "", onChange: (e) => setFilters({ ...filters, action: e.target.value || undefined }), items: [{ value: "", label: t("allActions") }, ...actionGroups.map((g) => ({ value: g, label: humanizeAction(g) }))], className: "w-auto" }), _jsx(NativeSelect, { size: "sm", "aria-label": t("severity"), value: filters.severity ?? "", onChange: (e) => setFilters({ ...filters, severity: (e.target.value || undefined) }), items: [
153
+ { value: "", label: t("allSeverities") },
154
+ { value: "info", label: t("info") },
155
+ { value: "warning", label: t("warning") },
156
+ { value: "critical", label: t("critical") },
157
+ ], className: "w-auto" }), toolbar, onExport ? (_jsxs(Button, { size: "sm", variant: "ghost", onClick: () => onExport(shown), className: "ms-auto", children: [_jsx(Download, { "aria-hidden": true }), t("export")] })) : null] })) : null;
158
+ const summary = (_jsxs("div", { className: "flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-fg-muted", children: [_jsx("span", { className: "tabular", "aria-live": "polite", children: rowCount !== undefined && rowCount > shown.length ? t("resultsOf", { shown: f.number(shown.length), total: f.number(rowCount) }) : t("results", { count: shown.length }) }), notice ? _jsx("span", { className: "text-fg-subtle", children: notice }) : null, loading ? (_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(Spinner, { size: "xs" }), t("loading")] })) : null] }));
159
+ const empty = (_jsxs("div", { className: "flex flex-col items-center gap-2 px-4 py-10 text-center", children: [_jsx("p", { className: "text-sm text-fg-muted", children: t("empty") }), Object.values(filters).some(Boolean) && !filtersProp ? (_jsx(Button, { size: "xs", variant: "secondary", onClick: () => setFilters({}), children: t("clear") })) : null] }));
160
+ if (variant === "timeline") {
161
+ const items = shown.map((e) => ({
162
+ id: e.id,
163
+ at: e.at,
164
+ avatar: e.actor.type === "user" ? { name: e.actor.name, src: e.actor.avatar } : undefined,
165
+ icon: e.actor.type === "api-key" ? KeyRound : e.actor.type === "system" ? Cpu : undefined,
166
+ tone: e.severity === "critical" ? "danger" : e.severity === "warning" ? "warning" : "neutral",
167
+ actor: e.actor.name,
168
+ title: (_jsxs(_Fragment, { children: [actionLabel(e.action).toLocaleLowerCase(locale), e.target?.label ? _jsxs(_Fragment, { children: [" \u00B7 ", e.target.label] }) : null] })),
169
+ body: e.changes ? _jsx(FieldDiff, { before: e.changes.before, after: e.changes.after, fields: changeFields, className: "mt-1.5 max-w-xl" }) : undefined,
170
+ }));
171
+ return (_jsxs("div", { ref: ref, "data-slot": "audit-log", "data-variant": "timeline", className: cn("ui-audit grid gap-3", className), ...props, children: [filterRow, _jsx(ActivityTimeline, { items: items, now: now, hasMore: hasMore, onLoadMore: onLoadMore, empty: t("empty") })] }));
172
+ }
173
+ const renderEvent = (e, index, measure) => {
174
+ const open = expanded.has(e.id);
175
+ const detailId = `${baseId}-${e.id}`;
176
+ const sev = e.severity ?? "info";
177
+ return (_jsxs("tbody", { ref: measure, "data-index": index, "data-expanded": open ? "" : undefined, "data-severity": sev, children: [_jsxs("tr", { "data-slot": "audit-row", className: "cursor-pointer", onClick: (ev) => !ev.target.closest("button,a,input") && toggle(e.id), children: [_jsx("td", { className: "w-9 py-2 ps-2 align-top", children: _jsx("button", { type: "button", "aria-expanded": open, "aria-controls": open ? detailId : undefined, "aria-label": t("expand", { action: actionLabel(e.action), actor: e.actor.name }), onClick: () => toggle(e.id), className: "inline-flex size-6 cursor-pointer items-center justify-center rounded-ui-sm text-fg-subtle hover:bg-hover hover:text-fg focus-ring", children: _jsx(ChevronRight, { "aria-hidden": true, className: cn("size-4 transition-transform motion-reduce:transition-none rtl:rotate-180", open && "rotate-90 rtl:rotate-90") }) }) }), _jsx("td", { className: "py-2 pe-3 align-top whitespace-nowrap", children: _jsxs("time", { dateTime: e.at, className: "grid text-[13px] leading-tight tabular", title: f.date(e.at, "full"), children: [_jsx("span", { className: "text-fg", children: f.date(e.at, { month: "short", day: "numeric", year: "numeric" }) }), _jsx("span", { className: "font-mono text-[11.5px] text-fg-muted", children: f.time(e.at, { hour: "2-digit", minute: "2-digit", second: "2-digit", timeZoneName: "short" }) })] }) }), _jsx("td", { className: "py-2 pe-3 align-top", children: _jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [e.actor.type === "user" ? (_jsx(Avatar, { name: e.actor.name, src: e.actor.avatar, size: "sm", "aria-hidden": true })) : (_jsx("span", { "aria-hidden": true, className: "inline-flex size-6 shrink-0 items-center justify-center rounded-ui-sm bg-selected text-fg-muted [&_svg]:size-3.5", children: e.actor.type === "api-key" ? _jsx(KeyRound, {}) : _jsx(Cpu, {}) })), _jsxs("span", { className: "grid min-w-0 leading-tight", children: [_jsx("span", { className: "truncate text-[13px] font-medium text-fg", children: e.actor.name }), _jsx("span", { className: "text-[11.5px] text-fg-subtle", children: e.actor.type === "api-key" ? t("apiKey") : e.actor.type === "system" ? t("system") : t("user") })] })] }) }), _jsx("td", { className: "py-2 pe-3 align-top", children: _jsxs("span", { className: "grid leading-tight", children: [_jsxs("span", { className: "flex items-center gap-1.5 text-[13px] text-fg", children: [sev === "critical" ? _jsx(ShieldAlert, { "aria-hidden": true, className: "size-3.5 shrink-0 text-danger" }) : null, actionLabel(e.action), sev !== "info" ? (_jsx(Badge, { size: "sm", tone: sev === "critical" ? "danger" : "warning", children: t(sev) })) : null] }), _jsx("code", { dir: "ltr", className: "font-mono text-[11px] text-fg-subtle", children: e.action })] }) }), _jsx("td", { className: "py-2 pe-3 align-top", children: e.target ? (_jsxs("span", { className: "grid min-w-0 leading-tight", children: [_jsx("span", { className: "truncate text-[13px] text-fg", children: e.target.label ?? e.target.id }), _jsxs("span", { className: "truncate text-[11.5px] text-fg-subtle", children: [humanizeAction(e.target.type), " \u00B7 ", _jsx("span", { dir: "ltr", className: "font-mono", children: e.target.id })] })] })) : (_jsx("span", { className: "text-fg-subtle", children: "\u2014" })) }), _jsx("td", { className: "py-2 pe-3 align-top", children: _jsxs("span", { className: "grid leading-tight", children: [_jsx("span", { dir: "ltr", className: "text-start font-mono text-[12px] text-fg-muted", children: e.ip ?? "—" }), e.location ? _jsx("span", { className: "text-[11.5px] text-fg-subtle", children: e.location }) : null] }) })] }), open ? (_jsx("tr", { "data-slot": "audit-detail", children: _jsx("td", { colSpan: 6, id: detailId, className: "px-3 pt-1 pb-4 ps-11", children: _jsx(AuditEventDetail, { event: e, changeFields: changeFields, t: t }) }) })) : null] }, e.id));
178
+ };
179
+ const items = virtual ? virtualizer.getVirtualItems() : [];
180
+ const padTop = virtual && items.length ? items[0].start : 0;
181
+ const padBottom = virtual && items.length ? virtualizer.getTotalSize() - items[items.length - 1].end : 0;
182
+ return (_jsxs("div", { ref: ref, "data-slot": "audit-log", "data-variant": "table", className: cn("ui-audit grid gap-3", className), ...props, children: [filterRow, summary, _jsxs("div", { ref: scrollRef, "data-slot": "audit-scroll", className: "overflow-auto rounded-ui border border-line", style: { maxHeight: height }, onScroll: (e) => {
183
+ const el = e.currentTarget;
184
+ if (hasMore && !loadingMore && el.scrollTop + el.clientHeight > el.scrollHeight - 240)
185
+ void more();
186
+ }, children: [_jsxs("table", { className: "ui-audit-table w-full min-w-[46rem] text-start", "aria-label": t("log"), "aria-rowcount": rowCount, children: [_jsx("thead", { children: _jsxs("tr", { className: "text-[11.5px] font-medium text-fg-muted", children: [_jsx("th", { scope: "col", className: "w-9 py-2 ps-2", children: _jsx("span", { className: "sr-only", children: t("details") }) }), _jsx("th", { scope: "col", className: "py-2 pe-3 text-start font-medium", children: t("time") }), _jsx("th", { scope: "col", className: "py-2 pe-3 text-start font-medium", children: t("actor") }), _jsx("th", { scope: "col", className: "py-2 pe-3 text-start font-medium", children: t("action") }), _jsx("th", { scope: "col", className: "py-2 pe-3 text-start font-medium", children: t("target") }), _jsx("th", { scope: "col", className: "py-2 pe-3 text-start font-medium", children: t("source") })] }) }), shown.length === 0 && !loading ? (_jsx("tbody", { children: _jsx("tr", { children: _jsx("td", { colSpan: 6, children: empty }) }) })) : virtual ? (_jsxs(_Fragment, { children: [padTop > 0 ? (_jsx("tbody", { "aria-hidden": true, children: _jsx("tr", { style: { height: padTop } }) })) : null, items.map((vi) => renderEvent(shown[vi.index], vi.index, virtualizer.measureElement)), padBottom > 0 ? (_jsx("tbody", { "aria-hidden": true, children: _jsx("tr", { style: { height: padBottom } }) })) : null] })) : (shown.map((e, i) => renderEvent(e, i)))] }), hasMore && onLoadMore ? (_jsx("div", { className: "flex justify-center border-t border-line p-2", children: _jsx(Button, { size: "xs", variant: "ghost", loading: loadingMore, onClick: () => void more(), children: t("loadMore") }) })) : null] })] }));
187
+ });
188
+ /** Expanded row content: field diff (or JSON diff) of the change, ids with copy, client and raw JSON. */
189
+ export function AuditEventDetail({ event: e, changeFields, labels, t: tProp }) {
190
+ const tOwn = useLabels("auditLog", auditLogLabels, labels);
191
+ const t = tProp ?? tOwn;
192
+ const [view, setView] = React.useState("fields");
193
+ const [raw, setRaw] = React.useState(false);
194
+ const requestId = typeof e.metadata?.requestId === "string" ? e.metadata.requestId : undefined;
195
+ const meta = Object.entries(e.metadata ?? {}).filter(([k]) => k !== "requestId");
196
+ const json = JSON.stringify(e, null, 2);
197
+ const rows = [
198
+ [t("eventId"), e.id, e.id],
199
+ ...(requestId ? [[t("requestId"), requestId, requestId]] : []),
200
+ ...(e.ip ? [[t("ip"), e.ip, e.ip]] : []),
201
+ ...(e.userAgent ? [[t("userAgent"), e.userAgent]] : []),
202
+ ...meta.map(([k, v]) => [humanizeAction(k), typeof v === "object" ? JSON.stringify(v) : String(v)]),
203
+ ];
204
+ return (_jsxs("div", { "data-slot": "audit-event-detail", className: "grid gap-4 lg:grid-cols-[minmax(0,1.4fr)_minmax(0,1fr)]", children: [_jsxs("section", { className: "grid min-w-0 content-start gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("h4", { className: "text-xs font-semibold text-fg", children: t("changes") }), e.changes ? (_jsxs(ToggleGroup, { "aria-label": t("changesView"), size: "xs", value: view, onValueChange: (v) => v && setView(v), className: "ms-auto", children: [_jsx(ToggleGroupItem, { value: "fields", children: t("fields") }), _jsx(ToggleGroupItem, { value: "json", children: t("json") })] })) : null] }), !e.changes ? (_jsx("p", { className: "text-[13px] text-fg-subtle", children: t("noChanges") })) : view === "fields" ? (_jsx(FieldDiff, { before: e.changes.before, after: e.changes.after, fields: changeFields })) : (_jsx(DiffView, { before: JSON.stringify(e.changes.before, null, 2), after: JSON.stringify(e.changes.after, null, 2), granularity: "word", context: Infinity, wrap: false, toolbar: false }))] }), _jsxs("section", { className: "grid min-w-0 content-start gap-2", children: [_jsx("h4", { className: "text-xs font-semibold text-fg", children: t("details") }), _jsx("dl", { className: "grid gap-1.5 text-[13px]", children: rows.map(([label, value, copy]) => (_jsxs("div", { className: "grid grid-cols-[7.5rem_minmax(0,1fr)] items-start gap-2", children: [_jsx("dt", { className: "text-fg-muted", children: label }), _jsxs("dd", { className: "flex min-w-0 items-start gap-1", children: [_jsx("span", { dir: "ltr", className: cn("min-w-0 text-start", copy ? "break-all font-mono text-[12px] text-fg" : "text-fg [overflow-wrap:anywhere]"), children: value }), copy ? _jsx(CopyValueButton, { text: copy, label: label, className: "-my-1" }) : null] })] }, label))) }), _jsxs("div", { className: "mt-1 grid gap-2", children: [_jsx("button", { type: "button", "aria-expanded": raw, onClick: () => setRaw((r) => !r), className: "w-fit cursor-pointer text-xs font-medium text-fg-muted underline-offset-2 hover:text-fg hover:underline focus-ring", children: raw ? t("hideRaw") : t("showRaw") }), raw ? (_jsxs("div", { className: "relative", children: [_jsx("pre", { "aria-label": t("raw"), tabIndex: 0, dir: "ltr", className: "max-h-64 overflow-auto rounded-ui-sm border border-line bg-surface-2 p-3 pe-10 font-mono text-[11.5px] leading-relaxed text-fg-muted focus-ring", children: json }), _jsx(CopyValueButton, { text: json, label: t("copyJson"), className: "absolute end-1.5 top-1.5" })] })) : null] })] })] }));
205
+ }
@@ -0,0 +1,87 @@
1
+ import * as React from "react";
2
+ import { Avatar as AvatarPrimitive } from "radix-ui";
3
+ declare const avatarLabels: {
4
+ online: string;
5
+ away: string;
6
+ busy: string;
7
+ offline: string;
8
+ withStatus: string;
9
+ overflow: string;
10
+ more: string;
11
+ };
12
+ export type AvatarLabels = typeof avatarLabels;
13
+ export type AvatarSize = "xs" | "sm" | "md" | "lg" | "xl";
14
+ export type AvatarStatus = "online" | "away" | "busy" | "offline";
15
+ export declare const avatarVariants: (props?: ({
16
+ size?: "sm" | "md" | "lg" | "xl" | "xs" | null | undefined;
17
+ shape?: "square" | "circle" | null | undefined;
18
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
19
+ /** Soft background + ink text for an initials avatar, from the chart palette. */
20
+ export declare function avatarColor(seed: string): React.CSSProperties;
21
+ export interface AvatarRootProps extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {
22
+ size?: AvatarSize;
23
+ shape?: "circle" | "square";
24
+ }
25
+ /** Root of the composite API: `<AvatarRoot><AvatarImage/><AvatarFallback/></AvatarRoot>`. */
26
+ export declare const AvatarRoot: React.ForwardRefExoticComponent<AvatarRootProps & React.RefAttributes<HTMLSpanElement>>;
27
+ /** The photo. Pass `asChild` to render a framework image (Next `<Image>`). */
28
+ export declare const AvatarImage: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & React.RefAttributes<HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
29
+ /** Shown while the image loads (after `delayMs`), when it fails, or when there is none. */
30
+ export declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
31
+ export interface AvatarProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> {
32
+ /** Photo URL. Missing, `null` or failing → initials. */
33
+ src?: string | null;
34
+ /** Person or organisation name: initials, fallback colour and the accessible name. */
35
+ name: string;
36
+ /** 20 / 24 / 32 / 40 / 56 px. Default `"md"`. */
37
+ size?: AvatarSize;
38
+ /** `"square"` for organisation logos. */
39
+ shape?: "circle" | "square";
40
+ /** Presence dot (announced with the name). */
41
+ status?: AvatarStatus;
42
+ /** Override the announced status text ("In a meeting"). */
43
+ statusLabel?: string;
44
+ /** Override the computed initials (1–2 letters) or pass an icon. */
45
+ fallback?: React.ReactNode;
46
+ /** ms before the fallback shows while an image loads (avoids flashing). Default 300. */
47
+ delayMs?: number;
48
+ /** Use the same neutral colour for every fallback instead of the per-name hue. */
49
+ neutral?: boolean;
50
+ labels?: Partial<AvatarLabels>;
51
+ }
52
+ /**
53
+ * A person or organisation: contact lists, assignees, comment threads, the top-bar user menu.
54
+ * Image with an initials fallback (locale-correct: "ilker şahin" → "İŞ" in Turkish), a colour
55
+ * picked from the name, and an optional status dot.
56
+ *
57
+ * ```tsx
58
+ * <Avatar name="Ada Lovelace" src="/people/ada.jpg" status="online" />
59
+ * <Avatar name="Northwind Traders" shape="square" size="lg" />
60
+ * ```
61
+ */
62
+ export declare const Avatar: React.ForwardRefExoticComponent<AvatarProps & React.RefAttributes<HTMLSpanElement>>;
63
+ export interface AvatarGroupProps extends React.HTMLAttributes<HTMLDivElement> {
64
+ /** Avatars shown before the "+N" chip. Default 4. */
65
+ max?: number;
66
+ /** Total number of people when the list you pass is already truncated (server-side). */
67
+ total?: number;
68
+ size?: AvatarSize;
69
+ shape?: "circle" | "square";
70
+ /** Makes "+N" a button (open the full list in a popover or dialog). */
71
+ onOverflowClick?: () => void;
72
+ /** Overlap between avatars. Default `"md"`. */
73
+ spacing?: "sm" | "md" | "lg";
74
+ labels?: Partial<AvatarLabels>;
75
+ }
76
+ /**
77
+ * Stacked avatars with a "+N" overflow ("3 more people" for screen readers): assignees,
78
+ * attendees, a team on a deal.
79
+ *
80
+ * ```tsx
81
+ * <AvatarGroup max={3} aria-label="Assignees">
82
+ * {team.map((p) => <Avatar key={p.id} name={p.name} src={p.photo} />)}
83
+ * </AvatarGroup>
84
+ * ```
85
+ */
86
+ export declare const AvatarGroup: React.ForwardRefExoticComponent<AvatarGroupProps & React.RefAttributes<HTMLDivElement>>;
87
+ export {};
@@ -0,0 +1,126 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Avatar as AvatarPrimitive } from "radix-ui";
5
+ import { cva } from "class-variance-authority";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { useLocale } from "../lib/locale.js";
9
+ import { initials as toInitials } from "../lib/text.js";
10
+ const avatarLabels = {
11
+ online: "Online",
12
+ away: "Away",
13
+ busy: "Busy",
14
+ offline: "Offline",
15
+ withStatus: "{name} ({status})",
16
+ overflow: "+{count}",
17
+ more: "{count, plural, one {# more person} other {# more people}}",
18
+ };
19
+ export const avatarVariants = cva("relative inline-flex shrink-0 select-none items-center justify-center align-middle font-medium leading-none tracking-[0.01em]", {
20
+ variants: {
21
+ size: {
22
+ xs: "size-5 text-[8.5px]",
23
+ sm: "size-6 text-[10px]",
24
+ md: "size-8 text-xs",
25
+ lg: "size-10 text-sm",
26
+ xl: "size-14 text-[19px]",
27
+ },
28
+ shape: {
29
+ circle: "rounded-full",
30
+ /** Organisation / workspace logos. */
31
+ square: "rounded-[28%]",
32
+ },
33
+ },
34
+ defaultVariants: { size: "md", shape: "circle" },
35
+ });
36
+ const dotSize = {
37
+ xs: "size-1.5 ring-1",
38
+ sm: "size-[7px] ring-[1.5px]",
39
+ md: "size-2 ring-2",
40
+ lg: "size-2.5 ring-2",
41
+ xl: "size-3.5 ring-[3px]",
42
+ };
43
+ const statusColor = {
44
+ online: "bg-success",
45
+ away: "bg-warning",
46
+ busy: "bg-danger",
47
+ offline: "bg-fg-subtle",
48
+ };
49
+ /** Deterministic 1–6 from a string (stable across renders and servers). */
50
+ function hueIndex(seed) {
51
+ let h = 2166136261;
52
+ for (let i = 0; i < seed.length; i++)
53
+ h = Math.imul(h ^ seed.charCodeAt(i), 16777619);
54
+ return ((h >>> 0) % 6) + 1;
55
+ }
56
+ /** Soft background + ink text for an initials avatar, from the chart palette. */
57
+ export function avatarColor(seed) {
58
+ const c = `var(--chart-${hueIndex(seed)})`;
59
+ return {
60
+ backgroundColor: `color-mix(in oklch, ${c} 20%, var(--surface-solid))`,
61
+ color: `color-mix(in oklch, ${c} 60%, var(--fg))`,
62
+ };
63
+ }
64
+ const AvatarGroupContext = React.createContext(null);
65
+ /** Root of the composite API: `<AvatarRoot><AvatarImage/><AvatarFallback/></AvatarRoot>`. */
66
+ export const AvatarRoot = React.forwardRef(function AvatarRoot({ size, shape, className, ...props }, ref) {
67
+ const group = React.useContext(AvatarGroupContext);
68
+ const s = size ?? group?.size ?? "md";
69
+ const sh = shape ?? group?.shape ?? "circle";
70
+ return (_jsx(AvatarPrimitive.Root, { ref: ref, "data-slot": "avatar", "data-size": s, "data-shape": sh, className: cn(avatarVariants({ size: s, shape: sh }), group && "ring-2 ring-(--avatar-ring)", className), ...props }));
71
+ });
72
+ /** The photo. Pass `asChild` to render a framework image (Next `<Image>`). */
73
+ export const AvatarImage = React.forwardRef(function AvatarImage({ className, ...props }, ref) {
74
+ return _jsx(AvatarPrimitive.Image, { ref: ref, "data-slot": "avatar-image", className: cn("size-full rounded-[inherit] object-cover", className), ...props });
75
+ });
76
+ /** Shown while the image loads (after `delayMs`), when it fails, or when there is none. */
77
+ export const AvatarFallback = React.forwardRef(function AvatarFallback({ className, ...props }, ref) {
78
+ return (_jsx(AvatarPrimitive.Fallback, { ref: ref, "data-slot": "avatar-fallback", className: cn("flex size-full items-center justify-center rounded-[inherit] bg-selected text-fg-muted [&_svg]:size-[55%]", className), ...props }));
79
+ });
80
+ /**
81
+ * A person or organisation: contact lists, assignees, comment threads, the top-bar user menu.
82
+ * Image with an initials fallback (locale-correct: "ilker şahin" → "İŞ" in Turkish), a colour
83
+ * picked from the name, and an optional status dot.
84
+ *
85
+ * ```tsx
86
+ * <Avatar name="Ada Lovelace" src="/people/ada.jpg" status="online" />
87
+ * <Avatar name="Northwind Traders" shape="square" size="lg" />
88
+ * ```
89
+ */
90
+ export const Avatar = React.forwardRef(function Avatar({ src, name, size, shape, status, statusLabel, fallback, delayMs = 300, neutral, labels, className, style, ...props }, ref) {
91
+ const t = useLabels("avatar", avatarLabels, labels);
92
+ const { locale } = useLocale();
93
+ const group = React.useContext(AvatarGroupContext);
94
+ const s = size ?? group?.size ?? "md";
95
+ const statusText = status ? (statusLabel ?? t(status)) : undefined;
96
+ const accessible = statusText ? t("withStatus", { name, status: statusText }) : name;
97
+ const letters = fallback ?? (toInitials(name, locale, s === "xs" ? 1 : 2) || "?");
98
+ return (_jsxs(AvatarRoot, { ref: ref, size: s, shape: shape, className: className, style: style, ...props, children: [src ? _jsx(AvatarImage, { src: src, alt: accessible }) : null, _jsx(AvatarFallback, { delayMs: src ? delayMs : undefined, role: "img", "aria-label": accessible, style: neutral ? undefined : avatarColor(name), children: _jsx("span", { "aria-hidden": true, children: letters }) }), status ? (_jsx("span", { "aria-hidden": true, "data-slot": "avatar-status", "data-status": status, className: cn("absolute end-0 bottom-0 rounded-full ring-(--avatar-ring)", shape === "square" && "-end-0.5 -bottom-0.5", dotSize[s], statusColor[status]) })) : null] }));
99
+ });
100
+ const overlap = {
101
+ xs: { sm: "-ms-0.5", md: "-ms-1", lg: "-ms-1.5" },
102
+ sm: { sm: "-ms-1", md: "-ms-1.5", lg: "-ms-2" },
103
+ md: { sm: "-ms-1", md: "-ms-2", lg: "-ms-3" },
104
+ lg: { sm: "-ms-1.5", md: "-ms-2.5", lg: "-ms-4" },
105
+ xl: { sm: "-ms-2", md: "-ms-3.5", lg: "-ms-5" },
106
+ };
107
+ /**
108
+ * Stacked avatars with a "+N" overflow ("3 more people" for screen readers): assignees,
109
+ * attendees, a team on a deal.
110
+ *
111
+ * ```tsx
112
+ * <AvatarGroup max={3} aria-label="Assignees">
113
+ * {team.map((p) => <Avatar key={p.id} name={p.name} src={p.photo} />)}
114
+ * </AvatarGroup>
115
+ * ```
116
+ */
117
+ export const AvatarGroup = React.forwardRef(function AvatarGroup({ max = 4, total, size = "md", shape = "circle", onOverflowClick, spacing = "md", labels, className, children, ...props }, ref) {
118
+ const t = useLabels("avatar", avatarLabels, labels);
119
+ const items = React.Children.toArray(children).filter(React.isValidElement);
120
+ const shown = items.slice(0, Math.max(0, max));
121
+ const extra = Math.max(0, (total ?? items.length) - shown.length);
122
+ const ctx = React.useMemo(() => ({ size, shape }), [size, shape]);
123
+ const step = overlap[size][spacing];
124
+ const chipClass = cn(avatarVariants({ size, shape }), "relative ring-2 ring-(--avatar-ring) bg-surface-2 font-mono tabular text-fg-muted", step);
125
+ return (_jsxs("div", { ref: ref, role: "group", "data-slot": "avatar-group", className: cn("flex items-center", className), ...props, children: [_jsx(AvatarGroupContext.Provider, { value: ctx, children: shown.map((child, i) => (_jsx("span", { className: cn("relative inline-flex rounded-full", i > 0 && step), children: child }, child.key ?? i))) }), extra > 0 ? (onOverflowClick ? (_jsx("button", { type: "button", "data-slot": "avatar-overflow", onClick: onOverflowClick, "aria-label": t("more", { count: extra }), className: cn(chipClass, "cursor-pointer transition-colors hover:bg-hover hover:text-fg focus-ring"), children: _jsx("span", { "aria-hidden": true, children: t("overflow", { count: extra }) }) })) : (_jsx("span", { "data-slot": "avatar-overflow", role: "img", "aria-label": t("more", { count: extra }), className: chipClass, children: _jsx("span", { "aria-hidden": true, children: t("overflow", { count: extra }) }) }))) : null] }));
126
+ });
@@ -0,0 +1,41 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ export declare const badgeVariants: (props?: ({
4
+ tone?: "accent" | "info" | "custom" | "warning" | "outline" | "danger" | "neutral" | "success" | null | undefined;
5
+ size?: "sm" | "md" | "lg" | null | undefined;
6
+ shape?: "square" | "pill" | null | undefined;
7
+ interactive?: boolean | null | undefined;
8
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
9
+ export interface BadgeProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "color">, Omit<VariantProps<typeof badgeVariants>, "interactive"> {
10
+ /** Render as the child element (e.g. a `<Link>` to a filtered list). Ignored when `onRemove` is set. */
11
+ asChild?: boolean;
12
+ /** Small status dot before the label. */
13
+ dot?: boolean;
14
+ /** Any CSS colour (hex, oklch, var()) — user-defined label colours. Overrides `tone`. */
15
+ color?: string;
16
+ /** Show a number instead of children, with tabular figures and a cap (`max`). */
17
+ count?: number;
18
+ /** Cap for `count`: 120 → "99+". Default 99. */
19
+ max?: number;
20
+ /** Makes the badge a removable chip with a × button. */
21
+ onRemove?: () => void;
22
+ /** Accessible name of the × button. Default "Remove {label}" (dictionary `badge.remove`). */
23
+ removeLabel?: string;
24
+ /** Dims the badge and disables the remove button. */
25
+ disabled?: boolean;
26
+ }
27
+ /**
28
+ * Status, count and label pill — and the kit's chip (`onRemove`), reused by Tag input,
29
+ * Combobox multi-select and Filter bar. Server-compatible (the remove button and count
30
+ * formatting are tiny client islands).
31
+ *
32
+ * ```tsx
33
+ * <Badge tone="success" dot>Published</Badge>
34
+ * <Badge count={128} tone="accent" /> // "99+"
35
+ * <Badge onRemove={() => drop("design")}>Design</Badge>
36
+ * <Badge asChild interactive><Link href="/posts?status=draft">Draft</Link></Badge>
37
+ * ```
38
+ *
39
+ * No CSS `uppercase` — it breaks Turkish (i → I) without the right `lang`; use `upperText()`.
40
+ */
41
+ export declare const Badge: React.ForwardRefExoticComponent<BadgeProps & React.RefAttributes<HTMLSpanElement>>;