@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,280 @@
1
+ "use client";
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { EditorContent, useEditor } from "@tiptap/react";
5
+ import { NodeSelection, TextSelection } from "@tiptap/pm/state";
6
+ import { cn } from "../lib/cn.js";
7
+ import { useLabels } from "../lib/labels.js";
8
+ import { useLocale } from "../lib/locale.js";
9
+ import { useMediaAdapter } from "../lib/provider.js";
10
+ import { useFieldContext, useFieldControl } from "../lib/field-context.js";
11
+ import { useLatest } from "../lib/use-controllable-state.js";
12
+ import { createRegistry } from "../blocks/schema/define-block.js";
13
+ import { blockEditorLabels } from "./labels.js";
14
+ import { BlockEditorContext, createSlashStore, useBlockEditor, } from "./context.js";
15
+ import { buildExtensions } from "./extensions.js";
16
+ import { changedBlockIds, stableStringify, fromProseMirror, proseMirrorToRichDoc, richDocToProseMirror, toProseMirror } from "./convert.js";
17
+ import { blockTitle, registryItems, runInsert, textItems, filterAllowed } from "./items.js";
18
+ import { BlockEditorBubbleMenu, BlockEditorToolbar } from "./menus.js";
19
+ import { BlockEditorSlashMenu } from "./slash-menu.js";
20
+ import { BlockEditorDragHandle } from "./drag-handle.js";
21
+ import { BlockInserter } from "./inserter.js";
22
+ const EMPTY_REGISTRY = createRegistry([]);
23
+ /**
24
+ * The block editor: text blocks edited inline, page blocks rendered by the very component the
25
+ * site uses (via the registry), a "/" inserter, a bubble menu on selection, a drag handle with a
26
+ * keyboard-equivalent block menu, and a schema-generated inspector. Reads and writes `VamosDoc`.
27
+ *
28
+ * ```tsx
29
+ * <BlockEditor value={doc} onChange={setDoc} registry={siteBlocks} variant="document" />
30
+ *
31
+ * <BlockEditor value={doc} onChange={setDoc} registry={siteBlocks}>
32
+ * <BlockEditorContent />
33
+ * <BlockEditorBubbleMenu />
34
+ * <BlockEditorSlashMenu />
35
+ * <BlockEditorDragHandle />
36
+ * <aside><BlockInspector /></aside>
37
+ * </BlockEditor>
38
+ * ```
39
+ */
40
+ export function BlockEditor(props) {
41
+ const { value, defaultValue, onChange, registry = EMPTY_REGISTRY, variant = "document", size = "md", allowedBlocks, patterns = [], placeholder, readOnly = false, media: mediaProp, uploadImage: uploadProp, linkSearch, lang: langProp, editorRef, autoFocus, labels, format = "doc", richValue, defaultRichValue, onRichChange, a11y, children, } = props;
42
+ const t = useLabels("blockEditor", blockEditorLabels, labels);
43
+ const { locale } = useLocale();
44
+ const providerMedia = useMediaAdapter();
45
+ const media = mediaProp ?? providerMedia ?? undefined;
46
+ const initialDoc = value ?? defaultValue;
47
+ const lang = langProp ?? initialDoc?.lang ?? locale.split("-")[0] ?? "en";
48
+ const richText = variant === "rich-text";
49
+ const uploadImage = React.useMemo(() => {
50
+ if (uploadProp)
51
+ return uploadProp;
52
+ if (!media?.upload)
53
+ return undefined;
54
+ return async (file, opts) => {
55
+ const asset = await media.upload(file, { signal: opts.signal, onProgress: opts.onProgress ?? (() => { }) });
56
+ return { src: asset.url, alt: asset.alt, width: asset.width, height: asset.height, assetId: asset.id };
57
+ };
58
+ }, [uploadProp, media]);
59
+ // ---------------------------------------------------------------- announcements
60
+ const [message, setMessage] = React.useState("");
61
+ const announce = React.useCallback((m) => {
62
+ setMessage("");
63
+ requestAnimationFrame?.(() => setMessage(m));
64
+ }, []);
65
+ const slash = React.useMemo(() => createSlashStore(), []);
66
+ const toolbarRef = React.useRef(null);
67
+ const editorHolder = React.useRef(null);
68
+ const bridge = React.useRef(null);
69
+ bridge.current = {
70
+ t,
71
+ announce,
72
+ title: (node) => blockTitle(node, registry, t),
73
+ focusToolbar: () => {
74
+ const el = toolbarRef.current?.querySelector("button:not([disabled])");
75
+ if (!el)
76
+ return false;
77
+ el.focus();
78
+ return true;
79
+ },
80
+ uploader: readOnly ? undefined : uploadImage,
81
+ };
82
+ const baseDoc = React.useRef(initialDoc);
83
+ const lastDoc = React.useRef(initialDoc);
84
+ const lastRich = React.useRef(richValue ?? defaultRichValue);
85
+ const onChangeRef = useLatest(onChange);
86
+ const onRichRef = useLatest(onRichChange);
87
+ const timer = React.useRef(null);
88
+ const emit = React.useCallback(() => {
89
+ timer.current = null;
90
+ const ed = editorHolder.current;
91
+ if (!ed || ed.isDestroyed)
92
+ return;
93
+ const json = ed.getJSON();
94
+ if (format === "rich") {
95
+ const rich = proseMirrorToRichDoc(json);
96
+ if (stableStringify(rich) === stableStringify(lastRich.current ?? { type: "doc", content: [] }))
97
+ return;
98
+ lastRich.current = rich;
99
+ onRichRef.current?.(rich);
100
+ return;
101
+ }
102
+ const doc = fromProseMirror(json, { base: baseDoc.current, lang });
103
+ if (lastDoc.current && stableStringify(doc.blocks) === stableStringify(lastDoc.current.blocks))
104
+ return;
105
+ const changed = changedBlockIds(lastDoc.current, doc);
106
+ lastDoc.current = doc;
107
+ onChangeRef.current?.(doc, { wordCount: doc.meta?.wordCount ?? 0, changedBlockIds: changed });
108
+ }, [format, lang, onChangeRef, onRichRef]);
109
+ const initialContent = React.useMemo(() => (format === "rich" ? richDocToProseMirror(richValue ?? defaultRichValue) : toProseMirror(initialDoc ?? { version: 1, blocks: [] }, registry)),
110
+ // eslint-disable-next-line react-hooks/exhaustive-deps
111
+ []);
112
+ const editor = useEditor({
113
+ extensions: buildExtensions({ variant, t, placeholder, slash: readOnly ? null : slash, bridge, getEditor: () => editorHolder.current, blocks: !richText }),
114
+ content: initialContent,
115
+ editable: !readOnly,
116
+ immediatelyRender: false,
117
+ shouldRerenderOnTransaction: false,
118
+ autofocus: autoFocus ? "end" : false,
119
+ editorProps: {
120
+ attributes: {
121
+ role: "textbox",
122
+ "aria-multiline": "true",
123
+ spellcheck: "true",
124
+ class: cn("vui-editor-prose prose-ui vb-prose", richText && size === "sm" && "prose-ui-sm"),
125
+ },
126
+ },
127
+ onCreate: ({ editor: ed }) => {
128
+ editorHolder.current = ed;
129
+ // Start with a caret in the first text block, not a selected page block.
130
+ if (ed.state.selection instanceof NodeSelection) {
131
+ const sel = TextSelection.findFrom(ed.state.doc.resolve(0), 1, true);
132
+ if (sel)
133
+ ed.view.dispatch(ed.state.tr.setSelection(sel).setMeta("addToHistory", false));
134
+ }
135
+ },
136
+ onUpdate: () => {
137
+ if (timer.current)
138
+ clearTimeout(timer.current);
139
+ timer.current = setTimeout(emit, 300);
140
+ },
141
+ onBlur: () => {
142
+ if (timer.current) {
143
+ clearTimeout(timer.current);
144
+ emit();
145
+ }
146
+ },
147
+ }, [variant, richText]);
148
+ editorHolder.current = editor;
149
+ // Flush pending changes on unmount.
150
+ React.useEffect(() => () => {
151
+ if (timer.current) {
152
+ clearTimeout(timer.current);
153
+ emit();
154
+ }
155
+ }, [emit]);
156
+ React.useEffect(() => {
157
+ editor?.setEditable(!readOnly);
158
+ }, [editor, readOnly]);
159
+ // Controlled value: replace content only when the value differs from what we last emitted.
160
+ React.useEffect(() => {
161
+ if (!editor || format !== "doc" || !value || value === lastDoc.current)
162
+ return;
163
+ if (lastDoc.current && stableStringify(value.blocks) === stableStringify(lastDoc.current.blocks)) {
164
+ lastDoc.current = value;
165
+ baseDoc.current = value;
166
+ return;
167
+ }
168
+ baseDoc.current = value;
169
+ lastDoc.current = value;
170
+ editor.commands.setContent(toProseMirror(value, registry), { emitUpdate: false });
171
+ }, [editor, value, registry, format]);
172
+ React.useEffect(() => {
173
+ if (!editor || format !== "rich" || !richValue || richValue === lastRich.current)
174
+ return;
175
+ if (stableStringify(richValue) === stableStringify(lastRich.current))
176
+ return;
177
+ lastRich.current = richValue;
178
+ editor.commands.setContent(richDocToProseMirror(richValue), { emitUpdate: false });
179
+ }, [editor, richValue, format]);
180
+ // ---------------------------------------------------------------- allowed blocks, inserter
181
+ const allowedRef = useLatest(allowedBlocks);
182
+ const allowedTypes = React.useCallback((parentType) => {
183
+ const a = allowedRef.current;
184
+ if (!a)
185
+ return null;
186
+ return typeof a === "function" ? a({ parentType }) : a;
187
+ }, [allowedRef]);
188
+ const [inserter, setInserter] = React.useState({ open: false });
189
+ const openInserter = React.useCallback((req) => setInserter({ open: true, at: req?.at, anchor: req?.anchor }), []);
190
+ React.useImperativeHandle(editorRef, () => ({
191
+ focus: () => editor?.commands.focus(),
192
+ insertBlock: (type, props) => {
193
+ if (!editor)
194
+ return;
195
+ const items = filterAllowed([...textItems(t, { richText }), ...registryItems(registry)], null);
196
+ const item = items.find((i) => i.id === type || i.id === `block:${type}` || i.blockType === type);
197
+ if (!item)
198
+ return;
199
+ const patched = props && item.def ? { ...item, build: (l) => {
200
+ const c = item.build(l);
201
+ return { ...c, attrs: { ...c.attrs, props: { ...c.attrs?.props, ...props } } };
202
+ } } : item;
203
+ runInsert(editor, patched, { lang });
204
+ },
205
+ getDoc: () => (editor ? fromProseMirror(editor.getJSON(), { base: baseDoc.current, lang }) : (lastDoc.current ?? { version: 1, blocks: [] })),
206
+ undo: () => editor?.commands.undo(),
207
+ redo: () => editor?.commands.redo(),
208
+ editor,
209
+ }), [editor, registry, t, lang, richText]);
210
+ const ctx = {
211
+ editor,
212
+ registry,
213
+ variant,
214
+ size,
215
+ readOnly,
216
+ lang,
217
+ t,
218
+ allowedTypes,
219
+ patterns,
220
+ media,
221
+ uploadImage: readOnly ? undefined : uploadImage,
222
+ linkSearch,
223
+ slash,
224
+ announce,
225
+ openInserter,
226
+ inserter: { open: inserter.open, at: inserter.at, anchor: inserter.anchor, setOpen: (open) => setInserter((s) => ({ ...s, open })) },
227
+ toolbarRef,
228
+ editorLabel: props["aria-label"] ?? t("editorLabel"),
229
+ canvasTheme: props.canvasTheme,
230
+ placeholder,
231
+ a11y: { ...a11y, labelledBy: props["aria-labelledby"] ?? a11y?.labelledBy },
232
+ };
233
+ const content = children ??
234
+ (richText ? (_jsxs(_Fragment, { children: [props.toolbar === false || readOnly ? null : _jsx(BlockEditorToolbar, {}), _jsx(BlockEditorContent, {}), readOnly ? null : _jsx(BlockEditorBubbleMenu, {}), readOnly ? null : _jsx(BlockEditorSlashMenu, {})] })) : (_jsxs(_Fragment, { children: [_jsx(BlockEditorContent, {}), readOnly ? null : (_jsxs(_Fragment, { children: [_jsx(BlockEditorBubbleMenu, {}), _jsx(BlockEditorSlashMenu, {}), _jsx(BlockEditorDragHandle, {}), _jsx(BlockInserter, {})] }))] })));
235
+ return (_jsx(BlockEditorContext.Provider, { value: ctx, children: _jsxs("div", { "data-slot": "block-editor", "data-variant": variant, "data-size": richText ? size : undefined, "data-readonly": readOnly ? "" : undefined, "data-invalid": a11y?.invalid ? "" : undefined, className: cn("vui-editor", props.className), style: richText ? { "--editor-min-h": props.minHeight, "--editor-max-h": props.maxHeight } : undefined, children: [content, _jsx("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: "sr-only", children: message })] }) }));
236
+ }
237
+ /**
238
+ * The editable canvas. Wears the site theme (`canvasTheme`) and is always `solid`, even inside a
239
+ * glass admin, for long-text readability and scroll performance.
240
+ */
241
+ export const BlockEditorContent = React.forwardRef(function BlockEditorContent({ className, ...props }, ref) {
242
+ const { editor, variant, lang, editorLabel, a11y, readOnly, size, canvasTheme = {} } = useBlockEditor();
243
+ // ARIA on the contenteditable element (Tiptap owns the node).
244
+ React.useEffect(() => {
245
+ const dom = editor?.view.dom;
246
+ if (!dom)
247
+ return;
248
+ const set = (k, v) => (v ? dom.setAttribute(k, v) : dom.removeAttribute(k));
249
+ set("aria-label", a11y?.labelledBy ? null : editorLabel);
250
+ set("aria-labelledby", a11y?.labelledBy);
251
+ set("aria-describedby", a11y?.describedBy);
252
+ set("aria-invalid", a11y?.invalid ? "true" : null);
253
+ set("aria-required", a11y?.required ? "true" : null);
254
+ set("aria-readonly", readOnly ? "true" : null);
255
+ set("id", a11y?.id);
256
+ set("lang", lang);
257
+ }, [editor, editorLabel, a11y?.labelledBy, a11y?.describedBy, a11y?.invalid, a11y?.required, a11y?.id, readOnly, lang]);
258
+ return (_jsx("div", { ref: ref, "data-slot": "block-editor-content", "data-material": variant === "rich-text" ? undefined : "solid", "data-accent": canvasTheme.accent, "data-font": canvasTheme.font, "data-density": canvasTheme.density, className: cn("vui-editor-canvas", variant !== "rich-text" && canvasTheme.theme, className), lang: lang, ...props, children: editor ? (_jsx(EditorContent, { editor: editor, className: "vui-editor-root" })) : (_jsx("div", { className: "vui-editor-root", "aria-hidden": true, children: _jsx("div", { className: cn("vui-editor-prose prose-ui vb-prose", variant === "rich-text" && size === "sm" && "prose-ui-sm") }) })) }));
259
+ });
260
+ /**
261
+ * Compact rich-text field for notes, comments, CRM activities and HR announcements. Same engine
262
+ * as BlockEditor (`variant="rich-text"`), RichDoc in and out, Field-aware like Textarea.
263
+ *
264
+ * ```tsx
265
+ * <Field label="Note" hint="Visible to your team only.">
266
+ * <RichTextEditor value={note} onChange={setNote} size="sm" minHeight="6rem" />
267
+ * </Field>
268
+ * ```
269
+ */
270
+ export function RichTextEditor({ value, defaultValue, onChange, id, invalid, required, "aria-describedby": describedBy, "aria-labelledby": labelledBy, ...rest }) {
271
+ const field = useFieldContext();
272
+ const control = useFieldControl({ id, "aria-describedby": describedBy, "aria-invalid": invalid || undefined, required });
273
+ return (_jsx(BlockEditor, { ...rest, variant: "rich-text", format: "rich", richValue: value, defaultRichValue: defaultValue, onRichChange: onChange, a11y: {
274
+ id: control.id,
275
+ describedBy: control["aria-describedby"],
276
+ invalid: !!control["aria-invalid"],
277
+ required: !!control.required,
278
+ labelledBy: labelledBy ?? field?.labelId,
279
+ } }));
280
+ }
@@ -0,0 +1,31 @@
1
+ import type { Editor, JSONContent } from "@tiptap/react";
2
+ import type { Node as PMNode } from "@tiptap/pm/model";
3
+ export interface TopBlock {
4
+ /** Position before the node. */
5
+ pos: number;
6
+ node: PMNode;
7
+ index: number;
8
+ }
9
+ /** The top-level block containing the selection (or the selected top-level node). */
10
+ export declare function getTopBlock(editor: Editor): TopBlock | null;
11
+ /** The top-level block at a document position. */
12
+ export declare function topBlockAt(editor: Editor, pos: number): TopBlock | null;
13
+ export declare const isBlockSelection: (editor: Editor) => boolean;
14
+ /** Selects a whole top-level block (block-selection mode). */
15
+ export declare function selectBlock(editor: Editor, pos: number): boolean;
16
+ /** Moves the block selection to the previous / next top-level block. */
17
+ export declare function selectSibling(editor: Editor, dir: -1 | 1): TopBlock | null;
18
+ /** Leaves block-selection mode: cursor at the end of a text block. */
19
+ export declare function editBlock(editor: Editor): boolean;
20
+ /** Moves the current top-level block one step up or down. Keeps it selected. */
21
+ export declare function moveBlock(editor: Editor, dir: -1 | 1, at?: number): TopBlock | null;
22
+ /** JSON of a node with every `id` attribute cleared (the unique-id plugin assigns new ones). */
23
+ export declare function withoutIds(json: JSONContent): JSONContent;
24
+ /** Duplicates the current top-level block below itself and selects the copy. */
25
+ export declare function duplicateBlock(editor: Editor, at?: number): TopBlock | null;
26
+ /** Deletes the current top-level block. Selection lands on the neighbour. */
27
+ export declare function deleteBlock(editor: Editor, at?: number): TopBlock | null;
28
+ /** Sets attributes of the node at `pos` without losing a node selection on it. */
29
+ export declare function setNodeAttrs(editor: Editor, pos: number, patch: Record<string, unknown>): boolean;
30
+ /** Inserts content after the top-level block at `pos` (or after the current one). */
31
+ export declare function insertAfterBlock(editor: Editor, content: JSONContent | JSONContent[], at?: number): number;
@@ -0,0 +1,150 @@
1
+ // Block-level commands on the Tiptap editor: find / select / move / duplicate / delete the
2
+ // top-level block around the selection. Every drag action has a keyboard + menu twin here (WCAG 2.5.7).
3
+ import { NodeSelection, TextSelection } from "@tiptap/pm/state";
4
+ import { COMPONENT_BLOCK } from "./convert.js";
5
+ /** The top-level block containing the selection (or the selected top-level node). */
6
+ export function getTopBlock(editor) {
7
+ const { state } = editor;
8
+ const sel = state.selection;
9
+ if (sel instanceof NodeSelection && sel.$from.depth === 0) {
10
+ return { pos: sel.from, node: sel.node, index: sel.$from.index(0) };
11
+ }
12
+ const $from = sel.$from;
13
+ if ($from.depth < 1) {
14
+ const node = state.doc.nodeAt(sel.from);
15
+ return node ? { pos: sel.from, node, index: $from.index(0) } : null;
16
+ }
17
+ const index = $from.index(0);
18
+ const pos = $from.before(1);
19
+ return { pos, node: state.doc.child(index), index };
20
+ }
21
+ /** The top-level block at a document position. */
22
+ export function topBlockAt(editor, pos) {
23
+ const doc = editor.state.doc;
24
+ if (pos < 0 || pos > doc.content.size)
25
+ return null;
26
+ const $pos = doc.resolve(pos);
27
+ if ($pos.depth === 0) {
28
+ const node = doc.nodeAt(pos);
29
+ return node ? { pos, node, index: $pos.index(0) } : null;
30
+ }
31
+ return { pos: $pos.before(1), node: doc.child($pos.index(0)), index: $pos.index(0) };
32
+ }
33
+ export const isBlockSelection = (editor) => editor.state.selection instanceof NodeSelection && editor.state.selection.$from.depth === 0;
34
+ /** Selects a whole top-level block (block-selection mode). */
35
+ export function selectBlock(editor, pos) {
36
+ const node = editor.state.doc.nodeAt(pos);
37
+ if (!node)
38
+ return false;
39
+ const tr = editor.state.tr.setSelection(NodeSelection.create(editor.state.doc, pos)).scrollIntoView();
40
+ editor.view.dispatch(tr);
41
+ return true;
42
+ }
43
+ /** Moves the block selection to the previous / next top-level block. */
44
+ export function selectSibling(editor, dir) {
45
+ const cur = getTopBlock(editor);
46
+ if (!cur)
47
+ return null;
48
+ const doc = editor.state.doc;
49
+ const index = cur.index + dir;
50
+ if (index < 0 || index >= doc.childCount)
51
+ return null;
52
+ let pos = 0;
53
+ for (let i = 0; i < index; i++)
54
+ pos += doc.child(i).nodeSize;
55
+ selectBlock(editor, pos);
56
+ return { pos, node: doc.child(index), index };
57
+ }
58
+ /** Leaves block-selection mode: cursor at the end of a text block. */
59
+ export function editBlock(editor) {
60
+ const sel = editor.state.selection;
61
+ if (!(sel instanceof NodeSelection) || sel.node.isAtom || sel.node.isLeaf || sel.node.type.name === COMPONENT_BLOCK)
62
+ return false;
63
+ const end = sel.from + sel.node.nodeSize - 1;
64
+ const tr = editor.state.tr.setSelection(TextSelection.near(editor.state.doc.resolve(end), -1));
65
+ editor.view.dispatch(tr);
66
+ return true;
67
+ }
68
+ /** Moves the current top-level block one step up or down. Keeps it selected. */
69
+ export function moveBlock(editor, dir, at) {
70
+ const cur = at === undefined ? getTopBlock(editor) : topBlockAt(editor, at);
71
+ if (!cur)
72
+ return null;
73
+ const doc = editor.state.doc;
74
+ const targetIndex = cur.index + dir;
75
+ if (targetIndex < 0 || targetIndex >= doc.childCount)
76
+ return null;
77
+ const sibling = doc.child(targetIndex);
78
+ const wasBlockSel = isBlockSelection(editor) || at !== undefined;
79
+ const sel = editor.state.selection;
80
+ const offset = sel.from - cur.pos;
81
+ const tr = editor.state.tr;
82
+ tr.delete(cur.pos, cur.pos + cur.node.nodeSize);
83
+ const insertAt = dir === -1 ? cur.pos - sibling.nodeSize : cur.pos + sibling.nodeSize;
84
+ tr.insert(insertAt, cur.node);
85
+ if (wasBlockSel)
86
+ tr.setSelection(NodeSelection.create(tr.doc, insertAt));
87
+ else
88
+ tr.setSelection(TextSelection.near(tr.doc.resolve(Math.min(insertAt + offset, tr.doc.content.size))));
89
+ editor.view.dispatch(tr.scrollIntoView());
90
+ return { pos: insertAt, node: cur.node, index: targetIndex };
91
+ }
92
+ /** JSON of a node with every `id` attribute cleared (the unique-id plugin assigns new ones). */
93
+ export function withoutIds(json) {
94
+ const out = { ...json };
95
+ if (out.attrs && "id" in out.attrs)
96
+ out.attrs = { ...out.attrs, id: null };
97
+ if (out.content)
98
+ out.content = out.content.map(withoutIds);
99
+ return out;
100
+ }
101
+ /** Duplicates the current top-level block below itself and selects the copy. */
102
+ export function duplicateBlock(editor, at) {
103
+ const cur = at === undefined ? getTopBlock(editor) : topBlockAt(editor, at);
104
+ if (!cur)
105
+ return null;
106
+ const copy = editor.schema.nodeFromJSON(withoutIds(cur.node.toJSON()));
107
+ const insertAt = cur.pos + cur.node.nodeSize;
108
+ const tr = editor.state.tr.insert(insertAt, copy);
109
+ tr.setSelection(NodeSelection.create(tr.doc, insertAt));
110
+ editor.view.dispatch(tr.scrollIntoView());
111
+ return { pos: insertAt, node: copy, index: cur.index + 1 };
112
+ }
113
+ /** Deletes the current top-level block. Selection lands on the neighbour. */
114
+ export function deleteBlock(editor, at) {
115
+ const cur = at === undefined ? getTopBlock(editor) : topBlockAt(editor, at);
116
+ if (!cur)
117
+ return null;
118
+ const tr = editor.state.tr.delete(cur.pos, cur.pos + cur.node.nodeSize);
119
+ if (tr.doc.childCount === 0)
120
+ tr.insert(0, editor.schema.nodes.paragraph.create());
121
+ const pos = Math.min(cur.pos, tr.doc.content.size);
122
+ tr.setSelection(TextSelection.near(tr.doc.resolve(pos)));
123
+ editor.view.dispatch(tr.scrollIntoView());
124
+ return cur;
125
+ }
126
+ /** Sets attributes of the node at `pos` without losing a node selection on it. */
127
+ export function setNodeAttrs(editor, pos, patch) {
128
+ const node = editor.state.doc.nodeAt(pos);
129
+ if (!node)
130
+ return false;
131
+ const keepSelection = editor.state.selection instanceof NodeSelection && editor.state.selection.from === pos;
132
+ const tr = editor.state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...patch });
133
+ if (keepSelection)
134
+ tr.setSelection(NodeSelection.create(tr.doc, pos));
135
+ editor.view.dispatch(tr);
136
+ return true;
137
+ }
138
+ /** Inserts content after the top-level block at `pos` (or after the current one). */
139
+ export function insertAfterBlock(editor, content, at) {
140
+ const cur = at === undefined ? getTopBlock(editor) : topBlockAt(editor, at);
141
+ const doc = editor.state.doc;
142
+ // Replace an empty paragraph instead of leaving it behind.
143
+ if (cur && cur.node.type.name === "paragraph" && cur.node.content.size === 0) {
144
+ editor.chain().insertContentAt({ from: cur.pos, to: cur.pos + cur.node.nodeSize }, content).run();
145
+ return cur.pos;
146
+ }
147
+ const pos = cur ? cur.pos + cur.node.nodeSize : doc.content.size;
148
+ editor.chain().insertContentAt(pos, content).run();
149
+ return pos;
150
+ }
@@ -0,0 +1,108 @@
1
+ import * as React from "react";
2
+ import type { Editor } from "@tiptap/react";
3
+ import type { BlockRegistry } from "../blocks/schema/define-block.js";
4
+ import type { VamosDoc } from "../blocks/schema/types.js";
5
+ import type { MediaAdapter } from "../media/types.js";
6
+ import type { LabelFn } from "../lib/labels.js";
7
+ import type { BlockEditorLabels } from "./labels.js";
8
+ export type BlockEditorVariant = "document" | "canvas" | "rich-text";
9
+ export interface BlockPattern {
10
+ id: string;
11
+ title: string;
12
+ category: string;
13
+ description?: string;
14
+ doc: VamosDoc;
15
+ }
16
+ export interface LinkSuggestion {
17
+ title: string;
18
+ href: string;
19
+ type: string;
20
+ }
21
+ /** Uploads a dropped / pasted image and returns what the image node stores. */
22
+ export type ImageUploader = (file: File, opts: {
23
+ signal: AbortSignal;
24
+ onProgress?: (p: {
25
+ loaded: number;
26
+ total: number;
27
+ }) => void;
28
+ }) => Promise<{
29
+ src: string;
30
+ alt?: string;
31
+ width?: number;
32
+ height?: number;
33
+ assetId?: string;
34
+ }>;
35
+ /** State of the "/" menu, written by the suggestion plugin and read by `BlockEditorSlashMenu`. */
36
+ export interface SlashState {
37
+ query: string;
38
+ range: {
39
+ from: number;
40
+ to: number;
41
+ };
42
+ rect: DOMRect | null;
43
+ }
44
+ export interface SlashStore {
45
+ get(): SlashState | null;
46
+ set(s: SlashState | null): void;
47
+ subscribe(cb: () => void): () => void;
48
+ /** Keydown forwarded from the editor while the menu is open. Returns true when handled. */
49
+ keydown: {
50
+ current: ((e: KeyboardEvent) => boolean) | null;
51
+ };
52
+ close: {
53
+ current: (() => void) | null;
54
+ };
55
+ }
56
+ export declare function createSlashStore(): SlashStore;
57
+ export interface InserterRequest {
58
+ /** Insert after the top-level block at this position. Default: after the current block. */
59
+ at?: number;
60
+ /** Element the popover anchors to (the "+" that opened it). Default: the block at `at`. */
61
+ anchor?: HTMLElement | null;
62
+ }
63
+ export interface BlockEditorContextValue {
64
+ editor: Editor | null;
65
+ registry: BlockRegistry;
66
+ variant: BlockEditorVariant;
67
+ size: "sm" | "md";
68
+ readOnly: boolean;
69
+ lang: string;
70
+ t: LabelFn<BlockEditorLabels>;
71
+ allowedTypes: (parentType?: string) => string[] | null;
72
+ patterns: BlockPattern[];
73
+ media?: MediaAdapter;
74
+ uploadImage?: ImageUploader;
75
+ linkSearch?: (q: string) => Promise<LinkSuggestion[]>;
76
+ slash: SlashStore;
77
+ announce: (message: string) => void;
78
+ /** Opens the inserter (drag handle "+", empty-state hint). */
79
+ openInserter: (req?: InserterRequest) => void;
80
+ inserter: {
81
+ open: boolean;
82
+ at?: number;
83
+ anchor?: HTMLElement | null;
84
+ setOpen: (open: boolean) => void;
85
+ };
86
+ /** Bubble/fixed toolbar registers itself so Alt+F10 can focus it. */
87
+ toolbarRef: React.MutableRefObject<HTMLElement | null>;
88
+ editorLabel: string;
89
+ canvasTheme?: {
90
+ accent?: string;
91
+ font?: string;
92
+ density?: string;
93
+ theme?: "light" | "dark";
94
+ };
95
+ placeholder?: string;
96
+ /** Field wiring for the rich-text variant (id, aria-describedby, invalid). */
97
+ a11y?: {
98
+ id?: string;
99
+ describedBy?: string;
100
+ invalid?: boolean;
101
+ required?: boolean;
102
+ labelledBy?: string;
103
+ };
104
+ }
105
+ export declare const BlockEditorContext: React.Context<BlockEditorContextValue | null>;
106
+ /** The surrounding `BlockEditor` (editor instance, registry, labels…). */
107
+ export declare function useBlockEditor(): BlockEditorContextValue;
108
+ export declare function useSlashState(store: SlashStore): SlashState | null;
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ export function createSlashStore() {
4
+ let state = null;
5
+ const subs = new Set();
6
+ return {
7
+ get: () => state,
8
+ set(s) {
9
+ state = s;
10
+ subs.forEach((cb) => cb());
11
+ },
12
+ subscribe(cb) {
13
+ subs.add(cb);
14
+ return () => subs.delete(cb);
15
+ },
16
+ keydown: { current: null },
17
+ close: { current: null },
18
+ };
19
+ }
20
+ export const BlockEditorContext = React.createContext(null);
21
+ /** The surrounding `BlockEditor` (editor instance, registry, labels…). */
22
+ export function useBlockEditor() {
23
+ const ctx = React.useContext(BlockEditorContext);
24
+ if (!ctx)
25
+ throw new Error("Block editor parts must be rendered inside <BlockEditor>.");
26
+ return ctx;
27
+ }
28
+ export function useSlashState(store) {
29
+ return React.useSyncExternalStore(store.subscribe, store.get, () => null);
30
+ }
@@ -0,0 +1,66 @@
1
+ import type { JSONContent } from "@tiptap/react";
2
+ import type { RichDoc, RichInline } from "../blocks/schema/rich-doc.js";
3
+ import type { BlockRegistry } from "../blocks/schema/define-block.js";
4
+ import type { DocMeta, ImageRef, VamosDoc } from "../blocks/schema/types.js";
5
+ /** ProseMirror node name of component blocks (hero, pricing, FAQ…). */
6
+ export declare const COMPONENT_BLOCK = "vamosBlock";
7
+ /** Block types the editor edits as native text (everything else is a component block). */
8
+ export declare const EDITOR_TEXT_TYPES: readonly ["paragraph", "heading", "list", "list-item", "quote", "code", "divider", "image", "table", "table-row", "table-cell"];
9
+ export type EditorTextType = (typeof EDITOR_TEXT_TYPES)[number];
10
+ export declare const isEditorTextType: (t: string) => t is EditorTextType;
11
+ /** Props of an `image` node (flat, see BLOCK-FORMAT §2 "Media in content"). */
12
+ export interface ImageBlockProps {
13
+ src: string;
14
+ alt?: string;
15
+ width?: number;
16
+ height?: number;
17
+ caption?: string;
18
+ focal?: ImageRef["focal"];
19
+ assetId?: string;
20
+ decorative?: boolean;
21
+ }
22
+ /** Props of a `table-cell` node. */
23
+ export interface TableCellProps {
24
+ header?: boolean;
25
+ colspan?: number;
26
+ rowspan?: number;
27
+ }
28
+ /** A new stable block id (`b_` + 8 random characters). */
29
+ export declare function createBlockId(): string;
30
+ export declare const isValidBlockId: (id: unknown) => id is string;
31
+ /** Inline runs → ProseMirror inline nodes (`br` → hardBreak, stray `\n` tolerated). */
32
+ export declare function inlineToPM(content: readonly RichInline[] | undefined): JSONContent[];
33
+ /** ProseMirror inline nodes → inline runs (adjacent runs with equal marks merged). */
34
+ export declare function inlineFromPM(nodes: readonly JSONContent[] | undefined): RichInline[];
35
+ /**
36
+ * A VamosDoc as a ProseMirror document. With a `registry`, the doc and every component block are
37
+ * first migrated to their current version, so the editor always works on current props.
38
+ * Unknown block types become component blocks too: their data is carried untouched.
39
+ */
40
+ export declare function toProseMirror(doc: VamosDoc | unknown, registry?: BlockRegistry): JSONContent;
41
+ export interface FromProseMirrorOptions {
42
+ /** Doc-level fields (lang, seo, layout, locales…) to keep. `blocks` and `meta` are replaced. */
43
+ base?: Partial<VamosDoc>;
44
+ /** Content language for word counts. Default `base.lang ?? "en"`. */
45
+ lang?: string;
46
+ /** Write `meta` (word count, reading time, toc). Default true. */
47
+ meta?: boolean;
48
+ }
49
+ /** A ProseMirror document (JSON) as a VamosDoc. Missing or duplicate ids are replaced. */
50
+ export declare function fromProseMirror(json: JSONContent, opts?: FromProseMirrorOptions): VamosDoc;
51
+ /** Word count with `Intl.Segmenter(lang, { granularity: "word" })` (regex fallback). */
52
+ export declare function countWords(text: string, lang?: string): number;
53
+ /** Plain text of the editable text in a doc (component block props are not included). */
54
+ export declare function docToPlainText(doc: VamosDoc): string;
55
+ /** Derived doc meta: word count, reading time (230 wpm, min 1) and the heading outline. */
56
+ export declare function computeDocMeta(doc: VamosDoc, lang?: string): DocMeta;
57
+ /** JSON with sorted object keys: equal content compares equal regardless of key order. */
58
+ export declare function stableStringify(v: unknown): string;
59
+ /** Ids of top-level blocks that were added, removed or changed between two docs. */
60
+ export declare function changedBlockIds(prev: VamosDoc | undefined, next: VamosDoc): string[];
61
+ /** A RichDoc (the value of an `f.rich()` field) as a ProseMirror document. */
62
+ export declare function richDocToProseMirror(doc: RichDoc | undefined | null): JSONContent;
63
+ /** A ProseMirror document as a RichDoc. Headings are clamped to h2–h4 (rich fields never hold h1). */
64
+ export declare function proseMirrorToRichDoc(json: JSONContent): RichDoc;
65
+ /** True when a RichDoc has no text at all. */
66
+ export declare function isRichDocEmpty(doc: RichDoc | undefined | null): boolean;