@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,162 @@
1
+ import { foldText } from "../lib/text.js";
2
+ const kindOf = (mime) => mime.startsWith("image/") ? "image" : mime.startsWith("video/") ? "video" : mime.startsWith("audio/") ? "audio" : /pdf|word|sheet|presentation|text/.test(mime) ? "document" : /zip|tar|rar|7z/.test(mime) ? "archive" : "other";
3
+ const wait = (ms, signal) => new Promise((resolve, reject) => {
4
+ if (signal?.aborted)
5
+ return reject(new DOMException("Aborted", "AbortError"));
6
+ const id = setTimeout(resolve, ms);
7
+ signal?.addEventListener("abort", () => {
8
+ clearTimeout(id);
9
+ reject(new DOMException("Aborted", "AbortError"));
10
+ });
11
+ });
12
+ function acceptMatches(accept, a) {
13
+ if (!accept)
14
+ return true;
15
+ return accept.split(",").some((raw) => {
16
+ const rule = raw.trim().toLowerCase();
17
+ if (!rule)
18
+ return false;
19
+ if (rule.startsWith("."))
20
+ return a.filename.toLowerCase().endsWith(rule);
21
+ if (rule.endsWith("/*"))
22
+ return a.mime.startsWith(rule.slice(0, -1));
23
+ return a.mime === rule;
24
+ });
25
+ }
26
+ /**
27
+ * An in-memory adapter for docs, demos, prototypes and tests: object URLs for uploads,
28
+ * simulated progress, locale-aware search. Nothing persists.
29
+ *
30
+ * ```ts
31
+ * const adapter = createMemoryAdapter({ seed: assets, locale: "tr-TR" });
32
+ * ```
33
+ */
34
+ export function createMemoryAdapter(options = {}) {
35
+ const { latency = 120, uploadDuration = 900, locale = "en-US" } = options;
36
+ let assets = [...(options.seed ?? [])];
37
+ let folders = [...(options.folders ?? [])];
38
+ const listeners = new Set();
39
+ const emit = (e) => listeners.forEach((l) => l(e));
40
+ let seq = 0;
41
+ const nextId = (p) => `${p}_${Date.now().toString(36)}${(seq++).toString(36)}`;
42
+ const find = (id) => {
43
+ const a = assets.find((x) => x.id === id);
44
+ if (!a)
45
+ throw new Error(`Media ${id} not found`);
46
+ return a;
47
+ };
48
+ async function fromFile(file, opts, id) {
49
+ const steps = 10;
50
+ for (let i = 1; i <= steps; i++) {
51
+ await wait(uploadDuration / steps, opts.signal);
52
+ opts.onProgress({ loaded: Math.round((file.size * i) / steps), total: file.size });
53
+ }
54
+ const url = typeof URL !== "undefined" && URL.createObjectURL ? URL.createObjectURL(file) : "";
55
+ const dims = file.type.startsWith("image/") ? await imageSize(url) : {};
56
+ const now = new Date().toISOString();
57
+ return {
58
+ id: id ?? nextId("m"),
59
+ kind: kindOf(file.type),
60
+ mime: file.type || "application/octet-stream",
61
+ filename: file.name,
62
+ size: file.size,
63
+ url,
64
+ ...dims,
65
+ alt: opts.alt ?? "",
66
+ folderId: opts.folderId ?? null,
67
+ createdAt: now,
68
+ updatedAt: now,
69
+ status: "ready",
70
+ };
71
+ }
72
+ return {
73
+ capabilities: { folders: true, replace: true, edit: true, trash: false, bulk: true, ...options.capabilities },
74
+ async list(q, o) {
75
+ await wait(latency, o?.signal);
76
+ const kinds = q.kind ? (Array.isArray(q.kind) ? q.kind : [q.kind]) : null;
77
+ const needle = q.search ? foldText(q.search, locale) : "";
78
+ let items = assets.filter((a) => (!kinds || kinds.includes(a.kind)) &&
79
+ acceptMatches(q.accept, a) &&
80
+ (q.folderId === undefined || (a.folderId ?? null) === q.folderId) &&
81
+ (!q.month || a.createdAt.startsWith(q.month)) &&
82
+ (!q.uploadedBy || a.uploadedBy?.id === q.uploadedBy) &&
83
+ (!q.unattached || !a.usage?.count) &&
84
+ (!needle || foldText(`${a.filename} ${a.alt} ${a.title ?? ""} ${a.caption ?? ""} ${(a.tags ?? []).join(" ")}`, locale).includes(needle)));
85
+ const sort = q.sort ?? "newest";
86
+ items = [...items].sort((a, b) => sort === "name" ? a.filename.localeCompare(b.filename, locale) : sort === "size" ? b.size - a.size : sort === "oldest" ? a.createdAt.localeCompare(b.createdAt) : b.createdAt.localeCompare(a.createdAt));
87
+ const start = q.cursor ? Number(q.cursor) : 0;
88
+ const limit = q.limit ?? 60;
89
+ const page = items.slice(start, start + limit);
90
+ return { items: page, total: items.length, nextCursor: start + limit < items.length ? String(start + limit) : undefined };
91
+ },
92
+ async get(id) {
93
+ await wait(latency);
94
+ return find(id);
95
+ },
96
+ async getMany(ids) {
97
+ await wait(latency);
98
+ return ids.map(find);
99
+ },
100
+ async upload(file, opts) {
101
+ const asset = await fromFile(file, opts);
102
+ assets = [asset, ...assets];
103
+ emit({ type: "ready", asset });
104
+ return asset;
105
+ },
106
+ async replace(id, file, opts) {
107
+ const prev = find(id);
108
+ const next = { ...(await fromFile(file, opts, id)), alt: prev.alt, title: prev.title, caption: prev.caption, folderId: prev.folderId, createdAt: prev.createdAt };
109
+ assets = assets.map((a) => (a.id === id ? next : a));
110
+ emit({ type: "updated", asset: next });
111
+ return next;
112
+ },
113
+ async update(id, patch) {
114
+ await wait(latency);
115
+ const next = { ...find(id), ...patch, updatedAt: new Date().toISOString() };
116
+ assets = assets.map((a) => (a.id === id ? next : a));
117
+ emit({ type: "updated", asset: next });
118
+ return next;
119
+ },
120
+ async remove(ids) {
121
+ await wait(latency);
122
+ assets = assets.filter((a) => !ids.includes(a.id));
123
+ ids.forEach((id) => emit({ type: "removed", id }));
124
+ },
125
+ folders: {
126
+ async list() {
127
+ await wait(latency);
128
+ return folders.map((f) => ({ ...f, count: assets.filter((a) => a.folderId === f.id).length }));
129
+ },
130
+ async create(name, parentId = null) {
131
+ await wait(latency);
132
+ const f = { id: nextId("f"), name, parentId };
133
+ folders = [...folders, f];
134
+ return f;
135
+ },
136
+ async rename(id, name) {
137
+ await wait(latency);
138
+ folders = folders.map((f) => (f.id === id ? { ...f, name } : f));
139
+ return folders.find((f) => f.id === id);
140
+ },
141
+ async remove(id) {
142
+ await wait(latency);
143
+ folders = folders.filter((f) => f.id !== id);
144
+ assets = assets.map((a) => (a.folderId === id ? { ...a, folderId: null } : a));
145
+ },
146
+ },
147
+ subscribe(cb) {
148
+ listeners.add(cb);
149
+ return () => listeners.delete(cb);
150
+ },
151
+ };
152
+ }
153
+ function imageSize(url) {
154
+ if (typeof window === "undefined" || !url)
155
+ return Promise.resolve({});
156
+ return new Promise((resolve) => {
157
+ const img = new window.Image();
158
+ img.onload = () => resolve({ width: img.naturalWidth, height: img.naturalHeight });
159
+ img.onerror = () => resolve({});
160
+ img.src = url;
161
+ });
162
+ }
@@ -0,0 +1,90 @@
1
+ import type { MediaAdapter, MediaAsset, MediaCapabilities, MediaQuery, UploadOptions, ImageLoader } from "./types.js";
2
+ type HeadersSource = HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
3
+ export interface XhrUploadOptions {
4
+ method?: "POST" | "PUT";
5
+ headers?: Record<string, string>;
6
+ /** Sent as-is (a `File`/`Blob` for a presigned PUT, `FormData` for multipart). */
7
+ body: XMLHttpRequestBodyInit;
8
+ signal?: AbortSignal;
9
+ onProgress?: (p: {
10
+ loaded: number;
11
+ total: number;
12
+ }) => void;
13
+ withCredentials?: boolean;
14
+ }
15
+ /** XHR request with upload progress and abort. Resolves with the parsed JSON body (or `null`). */
16
+ export declare function xhrUpload<T = unknown>(url: string, { method, headers, body, signal, onProgress, withCredentials }: XhrUploadOptions): Promise<T>;
17
+ /** What `sign` returns for one presigned upload. */
18
+ export interface PresignedTarget {
19
+ /** Upload id the server uses to complete the upload. */
20
+ id: string;
21
+ /** Where to `PUT` (or `POST` with `fields`) the file. */
22
+ url: string;
23
+ method?: "PUT" | "POST";
24
+ headers?: Record<string, string>;
25
+ /** S3 POST policy fields; when set the file is sent as multipart with these fields first. */
26
+ fields?: Record<string, string>;
27
+ }
28
+ export interface PresignedUploadOptions {
29
+ sign: (file: File, o: {
30
+ folderId?: string | null;
31
+ alt?: string;
32
+ }) => Promise<PresignedTarget>;
33
+ complete: (target: PresignedTarget, file: File) => Promise<MediaAsset>;
34
+ }
35
+ /**
36
+ * S3 / R2 upload: sign → XHR `PUT` with real progress → complete. Use it as `createRestAdapter({ upload })`
37
+ * or inside your own adapter's `upload`.
38
+ *
39
+ * ```ts
40
+ * const upload = createPresignedUpload({
41
+ * sign: (file) => api.post("/uploads", { name: file.name, type: file.type, size: file.size }),
42
+ * complete: (t) => api.post(`/uploads/${t.id}/complete`),
43
+ * });
44
+ * ```
45
+ */
46
+ export declare function createPresignedUpload({ sign, complete }: PresignedUploadOptions): (file: File, opts: UploadOptions) => Promise<MediaAsset>;
47
+ export interface RestAdapterOptions {
48
+ /** API root, e.g. `"https://cms.example.com/api"`. Endpoints live under `{baseUrl}/media`. */
49
+ baseUrl: string;
50
+ /** Static headers or a function (fresh auth token per request). */
51
+ headers?: HeadersSource;
52
+ /** Send cookies (`credentials: "include"`). */
53
+ credentials?: RequestCredentials;
54
+ /** Custom fetch (tests, SSR). */
55
+ fetch?: typeof fetch;
56
+ /**
57
+ * `"presigned"` (default): `POST /media/uploads` → PUT to the returned URL → `POST /media/uploads/:id/complete`.
58
+ * `"multipart"`: one `POST /media` with `FormData`. A function replaces both (e.g. `createPresignedUpload`).
59
+ */
60
+ upload?: "presigned" | "multipart" | ((file: File, opts: UploadOptions) => Promise<MediaAsset>);
61
+ capabilities?: Partial<MediaCapabilities>;
62
+ loader?: ImageLoader;
63
+ /** Server offers `POST /media/:id/suggest-alt`. */
64
+ suggestAlt?: boolean;
65
+ /** Live updates: `"sse"` opens `GET /media/events` (EventSource). Default off. */
66
+ events?: "sse" | false;
67
+ }
68
+ /**
69
+ * Adapter for the default vamos-ui media API:
70
+ *
71
+ * | Method | Endpoint |
72
+ * |---|---|
73
+ * | list | `GET /media?search&kind&accept&folderId&month&uploadedBy&unattached&sort&cursor&limit` → `MediaPage` |
74
+ * | get / getMany | `GET /media/:id` · `GET /media?ids=a,b` |
75
+ * | upload | `POST /media/uploads` → `PUT` → `POST /media/uploads/:id/complete` (or multipart `POST /media`) |
76
+ * | update | `PATCH /media/:id` |
77
+ * | remove | `DELETE /media?ids=a,b&permanent=1` |
78
+ * | replace | `POST /media/:id/replace` (multipart) |
79
+ * | sideload | `POST /media/sideload` `{ url, folderId, alt }` |
80
+ * | folders | `GET · POST /media/folders`, `PATCH · DELETE /media/folders/:id` |
81
+ * | events | `GET /media/events` (SSE, `data: MediaEvent`) |
82
+ *
83
+ * ```ts
84
+ * const media = createRestAdapter({ baseUrl: "/api", headers: () => ({ Authorization: `Bearer ${token()}` }) });
85
+ * ```
86
+ */
87
+ export declare function createRestAdapter(options: RestAdapterOptions): MediaAdapter;
88
+ /** `MediaQuery` → URL search params (arrays joined with commas, `undefined` dropped). */
89
+ export declare function toSearchParams(q: MediaQuery): string;
90
+ export {};
@@ -0,0 +1,208 @@
1
+ /** XHR request with upload progress and abort. Resolves with the parsed JSON body (or `null`). */
2
+ export function xhrUpload(url, { method = "POST", headers = {}, body, signal, onProgress, withCredentials }) {
3
+ return new Promise((resolve, reject) => {
4
+ if (signal?.aborted)
5
+ return reject(new DOMException("Aborted", "AbortError"));
6
+ const xhr = new XMLHttpRequest();
7
+ xhr.open(method, url);
8
+ if (withCredentials)
9
+ xhr.withCredentials = true;
10
+ for (const [k, v] of Object.entries(headers))
11
+ xhr.setRequestHeader(k, v);
12
+ xhr.upload.onprogress = (e) => {
13
+ if (e.lengthComputable)
14
+ onProgress?.({ loaded: e.loaded, total: e.total });
15
+ };
16
+ xhr.onload = () => {
17
+ if (xhr.status >= 200 && xhr.status < 300) {
18
+ try {
19
+ resolve((xhr.responseText ? JSON.parse(xhr.responseText) : null));
20
+ }
21
+ catch {
22
+ resolve(null);
23
+ }
24
+ }
25
+ else
26
+ reject(new Error(errorMessage(xhr.responseText, xhr.status)));
27
+ };
28
+ xhr.onerror = () => reject(new Error("Network error"));
29
+ xhr.onabort = () => reject(new DOMException("Aborted", "AbortError"));
30
+ signal?.addEventListener("abort", () => xhr.abort());
31
+ xhr.send(body);
32
+ });
33
+ }
34
+ function errorMessage(text, status) {
35
+ try {
36
+ const j = JSON.parse(text);
37
+ if (j.message || j.error)
38
+ return String(j.message ?? j.error);
39
+ }
40
+ catch {
41
+ /* not JSON */
42
+ }
43
+ return `Request failed (${status})`;
44
+ }
45
+ /**
46
+ * S3 / R2 upload: sign → XHR `PUT` with real progress → complete. Use it as `createRestAdapter({ upload })`
47
+ * or inside your own adapter's `upload`.
48
+ *
49
+ * ```ts
50
+ * const upload = createPresignedUpload({
51
+ * sign: (file) => api.post("/uploads", { name: file.name, type: file.type, size: file.size }),
52
+ * complete: (t) => api.post(`/uploads/${t.id}/complete`),
53
+ * });
54
+ * ```
55
+ */
56
+ export function createPresignedUpload({ sign, complete }) {
57
+ return async (file, opts) => {
58
+ const target = await sign(file, { folderId: opts.folderId, alt: opts.alt });
59
+ if (opts.signal.aborted)
60
+ throw new DOMException("Aborted", "AbortError");
61
+ let body = file;
62
+ if (target.fields) {
63
+ const form = new FormData();
64
+ for (const [k, v] of Object.entries(target.fields))
65
+ form.append(k, v);
66
+ form.append("file", file);
67
+ body = form;
68
+ }
69
+ await xhrUpload(target.url, {
70
+ method: target.method ?? (target.fields ? "POST" : "PUT"),
71
+ headers: target.fields ? target.headers : { "Content-Type": file.type || "application/octet-stream", ...target.headers },
72
+ body,
73
+ signal: opts.signal,
74
+ onProgress: opts.onProgress,
75
+ });
76
+ return complete(target, file);
77
+ };
78
+ }
79
+ /**
80
+ * Adapter for the default vamos-ui media API:
81
+ *
82
+ * | Method | Endpoint |
83
+ * |---|---|
84
+ * | list | `GET /media?search&kind&accept&folderId&month&uploadedBy&unattached&sort&cursor&limit` → `MediaPage` |
85
+ * | get / getMany | `GET /media/:id` · `GET /media?ids=a,b` |
86
+ * | upload | `POST /media/uploads` → `PUT` → `POST /media/uploads/:id/complete` (or multipart `POST /media`) |
87
+ * | update | `PATCH /media/:id` |
88
+ * | remove | `DELETE /media?ids=a,b&permanent=1` |
89
+ * | replace | `POST /media/:id/replace` (multipart) |
90
+ * | sideload | `POST /media/sideload` `{ url, folderId, alt }` |
91
+ * | folders | `GET · POST /media/folders`, `PATCH · DELETE /media/folders/:id` |
92
+ * | events | `GET /media/events` (SSE, `data: MediaEvent`) |
93
+ *
94
+ * ```ts
95
+ * const media = createRestAdapter({ baseUrl: "/api", headers: () => ({ Authorization: `Bearer ${token()}` }) });
96
+ * ```
97
+ */
98
+ export function createRestAdapter(options) {
99
+ const base = options.baseUrl.replace(/\/+$/, "") + "/media";
100
+ const doFetch = options.fetch ?? ((...a) => fetch(...a));
101
+ const resolveHeaders = async () => {
102
+ const h = typeof options.headers === "function" ? await options.headers() : options.headers;
103
+ return Object.fromEntries(new Headers(h ?? {}).entries());
104
+ };
105
+ async function request(path, init = {}) {
106
+ const headers = await resolveHeaders();
107
+ if (init.body && typeof init.body === "string")
108
+ headers["content-type"] ??= "application/json";
109
+ const res = await doFetch(base + path, { credentials: options.credentials, ...init, headers: { accept: "application/json", ...headers, ...init.headers } });
110
+ const text = await res.text();
111
+ if (!res.ok)
112
+ throw new Error(errorMessage(text, res.status));
113
+ return (text ? JSON.parse(text) : undefined);
114
+ }
115
+ const json = (body) => JSON.stringify(body);
116
+ async function multipart(path, file, opts) {
117
+ const form = new FormData();
118
+ form.append("file", file);
119
+ if (opts.folderId !== undefined)
120
+ form.append("folderId", opts.folderId ?? "");
121
+ if (opts.alt !== undefined)
122
+ form.append("alt", opts.alt);
123
+ return xhrUpload(base + path, {
124
+ method: "POST",
125
+ headers: await resolveHeaders(),
126
+ body: form,
127
+ signal: opts.signal,
128
+ onProgress: opts.onProgress,
129
+ withCredentials: options.credentials === "include",
130
+ });
131
+ }
132
+ const presigned = createPresignedUpload({
133
+ sign: (file, o) => request("/uploads", { method: "POST", body: json({ filename: file.name, mime: file.type, size: file.size, folderId: o.folderId ?? null, alt: o.alt }) }),
134
+ complete: (t) => request(`/uploads/${encodeURIComponent(t.id)}/complete`, { method: "POST" }),
135
+ });
136
+ const upload = typeof options.upload === "function" ? options.upload : options.upload === "multipart" ? (f, o) => multipart("", f, o) : presigned;
137
+ const adapter = {
138
+ capabilities: { folders: true, replace: true, edit: true, trash: false, bulk: true, ...options.capabilities },
139
+ loader: options.loader,
140
+ list(q, o) {
141
+ return request(`?${toSearchParams(q)}`, { signal: o?.signal });
142
+ },
143
+ get(id) {
144
+ return request(`/${encodeURIComponent(id)}`);
145
+ },
146
+ async getMany(ids) {
147
+ if (!ids.length)
148
+ return [];
149
+ const page = await request(`?ids=${ids.map(encodeURIComponent).join(",")}`);
150
+ const list = Array.isArray(page) ? page : page.items;
151
+ return ids.map((id) => list.find((a) => a.id === id)).filter((a) => Boolean(a));
152
+ },
153
+ upload,
154
+ update(id, patch) {
155
+ return request(`/${encodeURIComponent(id)}`, { method: "PATCH", body: json(patch) });
156
+ },
157
+ async remove(ids, o) {
158
+ await request(`?ids=${ids.map(encodeURIComponent).join(",")}${o?.permanent ? "&permanent=1" : ""}`, { method: "DELETE" });
159
+ },
160
+ replace(id, file, o) {
161
+ return multipart(`/${encodeURIComponent(id)}/replace`, file, o);
162
+ },
163
+ async sideload(url, o) {
164
+ o.onProgress({ loaded: 0, total: 1 });
165
+ const asset = await request("/sideload", { method: "POST", body: json({ url, folderId: o.folderId ?? null, alt: o.alt }), signal: o.signal });
166
+ o.onProgress({ loaded: 1, total: 1 });
167
+ return asset;
168
+ },
169
+ folders: {
170
+ list: () => request("/folders"),
171
+ create: (name, parentId = null) => request("/folders", { method: "POST", body: json({ name, parentId }) }),
172
+ rename: (id, name) => request(`/folders/${encodeURIComponent(id)}`, { method: "PATCH", body: json({ name }) }),
173
+ remove: (id) => request(`/folders/${encodeURIComponent(id)}`, { method: "DELETE" }),
174
+ },
175
+ };
176
+ if (options.suggestAlt)
177
+ adapter.suggestAlt = async (id) => (await request(`/${encodeURIComponent(id)}/suggest-alt`, { method: "POST" })).alt;
178
+ if (options.events === "sse") {
179
+ adapter.subscribe = (cb) => {
180
+ if (typeof EventSource === "undefined")
181
+ return () => { };
182
+ const es = new EventSource(`${base}/events`, { withCredentials: options.credentials === "include" });
183
+ es.onmessage = (m) => {
184
+ try {
185
+ cb(JSON.parse(m.data));
186
+ }
187
+ catch {
188
+ /* ignore malformed events */
189
+ }
190
+ };
191
+ return () => es.close();
192
+ };
193
+ }
194
+ return adapter;
195
+ }
196
+ /** `MediaQuery` → URL search params (arrays joined with commas, `undefined` dropped). */
197
+ export function toSearchParams(q) {
198
+ const p = new URLSearchParams();
199
+ for (const [k, v] of Object.entries(q)) {
200
+ if (v === undefined || v === "" || v === false)
201
+ continue;
202
+ if (v === null)
203
+ p.set(k, "null");
204
+ else
205
+ p.set(k, Array.isArray(v) ? v.join(",") : String(v));
206
+ }
207
+ return p.toString();
208
+ }
@@ -0,0 +1,62 @@
1
+ export declare const SERP_LIMITS: {
2
+ readonly version: "2026-11";
3
+ readonly desktop: {
4
+ readonly title: {
5
+ readonly font: "400 20px Arial, sans-serif";
6
+ readonly fontSize: 20;
7
+ readonly maxPx: 600;
8
+ readonly idealChars: readonly [30, 60];
9
+ };
10
+ readonly description: {
11
+ readonly font: "400 14px Arial, sans-serif";
12
+ readonly fontSize: 14;
13
+ readonly maxPx: 920;
14
+ readonly idealChars: readonly [70, 160];
15
+ };
16
+ };
17
+ readonly mobile: {
18
+ readonly title: {
19
+ readonly font: "400 16px Arial, sans-serif";
20
+ readonly fontSize: 16;
21
+ readonly maxPx: 640;
22
+ readonly idealChars: readonly [30, 60];
23
+ };
24
+ readonly description: {
25
+ readonly font: "400 14px Arial, sans-serif";
26
+ readonly fontSize: 14;
27
+ readonly maxPx: 680;
28
+ readonly idealChars: readonly [70, 120];
29
+ };
30
+ };
31
+ };
32
+ export type SerpField = "title" | "description";
33
+ export type SerpDevice = "desktop" | "mobile";
34
+ /** Splits into user-perceived characters (emoji, combining marks). */
35
+ export declare function graphemes(text: string, locale?: string): string[];
36
+ /** Character count as people see it (`"👩‍💻"` is 1). */
37
+ export declare function countGraphemes(text: string, locale?: string): number;
38
+ /** Pixel width of `text` in a CSS `font`. Canvas in the browser, an Arial estimate elsewhere. */
39
+ export declare function measureText(text: string, font: string, fontSize: number, estimate?: boolean): number;
40
+ export interface SerpMeasure {
41
+ /** Rendered width in px. */
42
+ px: number;
43
+ /** Limit in px for this field/device. */
44
+ maxPx: number;
45
+ truncated: boolean;
46
+ /** Grapheme index where the visible text ends (before the ellipsis). `length` when not truncated. */
47
+ cutAt: number;
48
+ /** The text as shown, with "…" when cut. */
49
+ display: string;
50
+ }
51
+ /**
52
+ * How a title or description renders in a search result: width in px and where it gets cut.
53
+ *
54
+ * ```ts
55
+ * Pass `{ estimate: true }` for a canvas-free, deterministic result (server rendering, first paint).
56
+ *
57
+ * measureSerp("Spa packages in Kadıköy — Defne Spa", "title"); // { px: 334, truncated: false, … }
58
+ * ```
59
+ */
60
+ export declare function measureSerp(text: string, field: SerpField, device?: SerpDevice, locale?: string, options?: {
61
+ estimate?: boolean;
62
+ }): SerpMeasure;
@@ -0,0 +1,108 @@
1
+ // Search-result truncation constants and measurement. Static and versioned: update the numbers
2
+ // here when search engines change their layout. Google truncates by pixel width, not characters.
3
+ export const SERP_LIMITS = {
4
+ version: "2026-11",
5
+ desktop: {
6
+ title: { font: "400 20px Arial, sans-serif", fontSize: 20, maxPx: 600, idealChars: [30, 60] },
7
+ description: { font: "400 14px Arial, sans-serif", fontSize: 14, maxPx: 920, idealChars: [70, 160] },
8
+ },
9
+ mobile: {
10
+ title: { font: "400 16px Arial, sans-serif", fontSize: 16, maxPx: 640, idealChars: [30, 60] },
11
+ description: { font: "400 14px Arial, sans-serif", fontSize: 14, maxPx: 680, idealChars: [70, 120] },
12
+ },
13
+ };
14
+ /** Splits into user-perceived characters (emoji, combining marks). */
15
+ export function graphemes(text, locale) {
16
+ if (typeof Intl !== "undefined" && "Segmenter" in Intl) {
17
+ const seg = new Intl.Segmenter(locale, { granularity: "grapheme" });
18
+ return Array.from(seg.segment(text), (s) => s.segment);
19
+ }
20
+ return Array.from(text);
21
+ }
22
+ /** Character count as people see it (`"👩‍💻"` is 1). */
23
+ export function countGraphemes(text, locale) {
24
+ return graphemes(text, locale).length;
25
+ }
26
+ // Arial advance widths in em, used when canvas is unavailable (server, tests).
27
+ const NARROW = new Set("iljtf.,;:'!|()[]{} ".split(""));
28
+ const SEMI = new Set("rI-\"`*".split(""));
29
+ const WIDE = new Set("mwMW@%".split(""));
30
+ function estimateWidth(text, fontSize) {
31
+ let em = 0;
32
+ for (const ch of text) {
33
+ if (NARROW.has(ch))
34
+ em += 0.278;
35
+ else if (SEMI.has(ch))
36
+ em += 0.333;
37
+ else if (WIDE.has(ch))
38
+ em += 0.86;
39
+ else if (/[A-ZÇĞİÖŞÜ0-9]/.test(ch))
40
+ em += 0.667;
41
+ else if (/\p{Extended_Pictographic}/u.test(ch))
42
+ em += 1.1;
43
+ else
44
+ em += 0.556;
45
+ }
46
+ return em * fontSize;
47
+ }
48
+ let ctx;
49
+ function canvasContext() {
50
+ if (ctx !== undefined)
51
+ return ctx;
52
+ try {
53
+ const jsdom = typeof navigator !== "undefined" && /jsdom/i.test(navigator.userAgent);
54
+ ctx = typeof document !== "undefined" && !jsdom ? document.createElement("canvas").getContext("2d") : null;
55
+ }
56
+ catch {
57
+ ctx = null;
58
+ }
59
+ return ctx;
60
+ }
61
+ /** Pixel width of `text` in a CSS `font`. Canvas in the browser, an Arial estimate elsewhere. */
62
+ export function measureText(text, font, fontSize, estimate = false) {
63
+ const c = estimate ? null : canvasContext();
64
+ if (c) {
65
+ c.font = font;
66
+ const w = c.measureText(text).width;
67
+ if (w > 0 || text === "")
68
+ return w;
69
+ }
70
+ return estimateWidth(text, fontSize);
71
+ }
72
+ /**
73
+ * How a title or description renders in a search result: width in px and where it gets cut.
74
+ *
75
+ * ```ts
76
+ * Pass `{ estimate: true }` for a canvas-free, deterministic result (server rendering, first paint).
77
+ *
78
+ * measureSerp("Spa packages in Kadıköy — Defne Spa", "title"); // { px: 334, truncated: false, … }
79
+ * ```
80
+ */
81
+ export function measureSerp(text, field, device = "desktop", locale, options = {}) {
82
+ const spec = SERP_LIMITS[device][field];
83
+ const clean = text.replace(/\s+/g, " ").trim();
84
+ const est = options.estimate ?? false;
85
+ const measure = (t) => measureText(t, spec.font, spec.fontSize, est);
86
+ const px = measure(clean);
87
+ const chars = graphemes(clean, locale);
88
+ if (px <= spec.maxPx)
89
+ return { px, maxPx: spec.maxPx, truncated: false, cutAt: chars.length, display: clean };
90
+ const ellipsis = measure(" …");
91
+ // Binary search the longest prefix that fits with the ellipsis.
92
+ let lo = 0;
93
+ let hi = chars.length;
94
+ while (lo < hi) {
95
+ const mid = Math.ceil((lo + hi) / 2);
96
+ if (measure(chars.slice(0, mid).join("")) + ellipsis <= spec.maxPx)
97
+ lo = mid;
98
+ else
99
+ hi = mid - 1;
100
+ }
101
+ // Prefer a word boundary when it is close.
102
+ let cut = lo;
103
+ const lastSpace = chars.slice(0, lo).lastIndexOf(" ");
104
+ if (lastSpace > 0 && lo - lastSpace < 16)
105
+ cut = lastSpace;
106
+ const shown = chars.slice(0, cut).join("").replace(/[\s,;:—–-]+$/, "");
107
+ return { px, maxPx: spec.maxPx, truncated: true, cutAt: cut, display: `${shown} …` };
108
+ }
@@ -0,0 +1,3 @@
1
+ import type { MediaAsset, MediaFolder } from "./types.js";
2
+ export declare const mediaFolders: MediaFolder[];
3
+ export declare const mediaSeed: MediaAsset[];
@@ -0,0 +1,37 @@
1
+ const img = (id, filename, alt, extra = {}) => ({
2
+ id,
3
+ kind: "image",
4
+ mime: "image/jpeg",
5
+ filename,
6
+ size: 482_000,
7
+ url: `https://cdn.example.com/${filename}`,
8
+ width: 2400,
9
+ height: 1600,
10
+ alt,
11
+ createdAt: "2026-11-04T09:12:00Z",
12
+ folderId: null,
13
+ uploadedBy: { id: "u1", name: "Elif Demir" },
14
+ ...extra,
15
+ });
16
+ export const mediaFolders = [
17
+ { id: "f_blog", name: "Blog" },
18
+ { id: "f_team", name: "Team" },
19
+ ];
20
+ export const mediaSeed = [
21
+ img("m1", "harbour-sunrise.jpg", "Fishing boats in Kadıköy harbour at sunrise", { folderId: "f_blog" }),
22
+ img("m2", "team-offsite.jpg", "", { folderId: "f_team", createdAt: "2026-10-21T14:00:00Z" }),
23
+ img("m3", "office-lobby.jpg", "Reception desk with oak panels and a green wall", { createdAt: "2026-10-02T08:30:00Z" }),
24
+ img("m4", "small-logo.png", "Vamos logo", { mime: "image/png", width: 400, height: 210, size: 18_400 }),
25
+ {
26
+ id: "m5",
27
+ kind: "document",
28
+ mime: "application/pdf",
29
+ filename: "q3-board-report.pdf",
30
+ size: 2_400_000,
31
+ url: "https://cdn.example.com/q3-board-report.pdf",
32
+ alt: "",
33
+ createdAt: "2026-09-18T16:45:00Z",
34
+ folderId: null,
35
+ uploadedBy: { id: "u2", name: "Mert Aksoy" },
36
+ },
37
+ ];