@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,240 @@
1
+ // Field builders (`f.*`): each returns a zod schema that carries editor metadata via `.meta()`.
2
+ // The stored type decides validation; the metadata decides the editor widget, localization
3
+ // and lint rules. Server/admin only — components import types, never this file.
4
+ import { z } from "zod";
5
+ import { LOCALE_KEY_RE } from "./localized.js";
6
+ import { countEmphasis } from "./emphasis.js";
7
+ import { EMOJI_RE, sanitizeHref } from "./safety.js";
8
+ import { RichDocSchema, richDocAllows } from "./rich-doc-schema.js";
9
+ import { BLOCK_ICONS } from "./icons.js";
10
+ const META = "vamos";
11
+ function withMeta(schema, meta) {
12
+ const out = { [META]: stripUndefined(meta) };
13
+ if (meta.label)
14
+ out.title = meta.label;
15
+ if (meta.help)
16
+ out.description = meta.help;
17
+ return schema.meta(out);
18
+ }
19
+ function stripUndefined(o) {
20
+ const r = {};
21
+ for (const [k, v] of Object.entries(o))
22
+ if (v !== undefined)
23
+ r[k] = v;
24
+ return r;
25
+ }
26
+ const WRAPPERS = new Set(["optional", "nullable", "default", "prefault", "readonly", "catch", "nonoptional"]);
27
+ /** Removes optional/default/nullable/readonly wrappers. */
28
+ export function unwrapSchema(schema) {
29
+ let s = schema;
30
+ for (let i = 0; i < 10; i++) {
31
+ const def = s._zod.def;
32
+ if (WRAPPERS.has(def.type) && def.innerType)
33
+ s = def.innerType;
34
+ else
35
+ break;
36
+ }
37
+ return s;
38
+ }
39
+ /** Reads `f.*` metadata from a schema (looks through optional/default wrappers). */
40
+ export function getFieldMeta(schema) {
41
+ let s = schema;
42
+ for (let i = 0; i < 10 && s; i++) {
43
+ const m = z.globalRegistry.get(s);
44
+ if (m?.[META])
45
+ return m[META];
46
+ const def = s._zod.def;
47
+ s = WRAPPERS.has(def.type) ? def.innerType : undefined;
48
+ }
49
+ return undefined;
50
+ }
51
+ /** The zod type name ("object", "array", "string", "union"…) after unwrapping. */
52
+ export const schemaKind = (schema) => unwrapSchema(schema)._zod.def.type;
53
+ const LOCALIZED_RECORDS = new WeakSet();
54
+ /** `T` or `{ [locale]: T }`. `localize()` recognises it anywhere in a schema, with or without `f.*`. */
55
+ export function localizedSchema(inner) {
56
+ const map = z.record(z.string().regex(LOCALE_KEY_RE), inner);
57
+ LOCALIZED_RECORDS.add(map);
58
+ return z.union([inner, map]);
59
+ }
60
+ /** True for a schema built by `localizedSchema` (also after `.meta()` / `.optional()`). */
61
+ export function isLocalizedSchema(schema) {
62
+ const def = unwrapSchema(schema)._zod.def;
63
+ return def.type === "union" && !!def.options?.some((o) => LOCALIZED_RECORDS.has(o));
64
+ }
65
+ const noEmoji = (s) => !EMOJI_RE.test(s);
66
+ const plainString = (opts) => {
67
+ let s = z.string();
68
+ if (opts.min !== undefined)
69
+ s = s.min(opts.min);
70
+ if (opts.max !== undefined)
71
+ s = s.max(opts.max);
72
+ return s.refine(noEmoji, { message: "Emoji are not allowed in block copy." });
73
+ };
74
+ const safeHref = z.string().min(1).refine((h) => sanitizeHref(h) !== null, { message: "Unsafe or unsupported link (javascript:, data: and unknown schemes are rejected)." });
75
+ // ---------------------------------------------------------------- shared value schemas
76
+ export const ImageRefSchema = z
77
+ .object({
78
+ src: z.string().min(1).refine((h) => sanitizeHref(h) !== null, { message: "Unsupported image URL." }),
79
+ alt: localizedSchema(z.string()).optional(),
80
+ width: z.number().int().positive(),
81
+ height: z.number().int().positive(),
82
+ blurDataURL: z.string().startsWith("data:image/").optional(),
83
+ focal: z.object({ x: z.number().min(0).max(1), y: z.number().min(0).max(1) }).optional(),
84
+ decorative: z.boolean().optional(),
85
+ assetId: z.string().optional(),
86
+ })
87
+ .refine((v) => v.decorative === true || hasText(v.alt), { message: "Describe the image (alt) or mark it decorative.", path: ["alt"] });
88
+ function hasText(v) {
89
+ if (typeof v === "string")
90
+ return v.trim().length > 0;
91
+ if (v && typeof v === "object")
92
+ return Object.values(v).some((x) => typeof x === "string" && x.trim().length > 0);
93
+ return false;
94
+ }
95
+ export const LinkRefSchema = z.object({
96
+ href: localizedSchema(safeHref),
97
+ label: localizedSchema(plainString({ max: 80 })),
98
+ kind: z.enum(["url", "anchor", "tel", "mailto", "whatsapp", "file"]).optional(),
99
+ newTab: z.boolean().optional(),
100
+ });
101
+ export const TimeRangeSchema = z.object({
102
+ open: z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/),
103
+ close: z.string().regex(/^([01]\d|2[0-4]):[0-5]\d$/),
104
+ });
105
+ const dateOnly = z.string().regex(/^\d{4}-\d{2}-\d{2}$/, { message: "Use a date-only YYYY-MM-DD value." });
106
+ export const OpeningHoursSchema = z.object({
107
+ timeZone: z.string().min(1),
108
+ weekly: z.object({
109
+ mon: z.array(TimeRangeSchema).optional(),
110
+ tue: z.array(TimeRangeSchema).optional(),
111
+ wed: z.array(TimeRangeSchema).optional(),
112
+ thu: z.array(TimeRangeSchema).optional(),
113
+ fri: z.array(TimeRangeSchema).optional(),
114
+ sat: z.array(TimeRangeSchema).optional(),
115
+ sun: z.array(TimeRangeSchema).optional(),
116
+ }),
117
+ special: z
118
+ .array(z.object({ date: dateOnly, closed: z.boolean().optional(), ranges: z.array(TimeRangeSchema).optional(), note: localizedSchema(z.string()).optional() }))
119
+ .optional(),
120
+ });
121
+ export const EMBED_PROVIDERS = ["youtube", "vimeo", "google-maps", "openstreetmap", "calendly"];
122
+ const EMBED_HOSTS = {
123
+ youtube: /^https:\/\/(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.be)\//i,
124
+ vimeo: /^https:\/\/(player\.)?vimeo\.com\//i,
125
+ "google-maps": /^https:\/\/(www\.)?google\.[a-z.]+\/maps|^https:\/\/maps\.app\.goo\.gl\//i,
126
+ openstreetmap: /^https:\/\/(www\.)?openstreetmap\.org\//i,
127
+ calendly: /^https:\/\/calendly\.com\//i,
128
+ };
129
+ export const SOCIAL_NETWORKS = ["instagram", "facebook", "linkedin", "x", "youtube", "tiktok", "whatsapp", "telegram", "google-maps", "apple-maps", "yandex-maps"];
130
+ function heading(opts = {}) {
131
+ const max = opts.max ?? 140;
132
+ const inner = plainString({ max }).refine((s) => countEmphasis(s) <= 1, { message: "Use at most one *emphasis* per heading." });
133
+ const localized = opts.localized ?? true;
134
+ return withMeta(localized ? localizedSchema(inner) : inner, { field: "heading", localized, max, ...opts });
135
+ }
136
+ function text(opts = {}) {
137
+ const inner = plainString(opts);
138
+ const localized = opts.localized ?? true;
139
+ return withMeta(localized ? localizedSchema(inner) : inner, { field: "text", localized, ...opts });
140
+ }
141
+ function rich(opts = {}) {
142
+ const inner = RichDocSchema.superRefine((doc, ctx) => {
143
+ for (const problem of richDocAllows(doc, opts.nodes, opts.marks))
144
+ ctx.addIssue({ code: "custom", message: problem });
145
+ });
146
+ const localized = opts.localized ?? true;
147
+ return withMeta(localized ? localizedSchema(inner) : inner, { field: "rich", localized, ...opts });
148
+ }
149
+ function image(opts = {}) {
150
+ return withMeta(ImageRefSchema, { field: "image", ...opts });
151
+ }
152
+ function link(opts = {}) {
153
+ return withMeta(LinkRefSchema, { field: "link", ...opts });
154
+ }
155
+ function cta(opts = {}) {
156
+ return withMeta(z.object({ link: LinkRefSchema, style: z.enum(["primary", "secondary", "link"]) }), { field: "cta", ...opts });
157
+ }
158
+ function list(item, opts = {}) {
159
+ let s = z.array(item);
160
+ if (opts.min !== undefined)
161
+ s = s.min(opts.min);
162
+ if (opts.max !== undefined)
163
+ s = s.max(opts.max);
164
+ return withMeta(s, { field: "list", ...opts });
165
+ }
166
+ /** A nested object of fields (an FAQ item, a pricing plan). */
167
+ function group(shape, opts = {}) {
168
+ return withMeta(z.object(shape), { field: "group", ...opts });
169
+ }
170
+ function select(options, opts = {}) {
171
+ return withMeta(z.enum(options), { field: "select", ...opts });
172
+ }
173
+ function toggle(opts = {}) {
174
+ return withMeta(z.boolean(), { field: "toggle", ...opts });
175
+ }
176
+ function number(opts = {}) {
177
+ let s = opts.int ? z.number().int() : z.number();
178
+ if (opts.min !== undefined)
179
+ s = s.min(opts.min);
180
+ if (opts.max !== undefined)
181
+ s = s.max(opts.max);
182
+ return withMeta(s, { field: "number", ...opts });
183
+ }
184
+ function icon(opts = {}) {
185
+ return withMeta(z.enum(BLOCK_ICONS), { field: "icon", ...opts });
186
+ }
187
+ function money(opts = {}) {
188
+ return withMeta(z.object({
189
+ amount: z.string().regex(/^-?\d+(\.\d+)?$/, { message: "Money is a decimal string, e.g. \"1250.00\"." }),
190
+ currency: z.string().regex(/^[A-Z]{3}$/, { message: "Use an ISO 4217 code, e.g. \"TRY\"." }),
191
+ }), { field: "money", ...opts });
192
+ }
193
+ function phone(opts = {}) {
194
+ return withMeta(z.string().regex(/^\+[1-9]\d{6,14}$/, { message: "Use E.164, e.g. +902160000000." }), { field: "phone", ...opts });
195
+ }
196
+ function address(opts = {}) {
197
+ return withMeta(z.object({
198
+ line: z.string().min(1),
199
+ district: z.string().optional(),
200
+ city: z.string().min(1),
201
+ region: z.string().optional(),
202
+ postalCode: z.string().optional(),
203
+ country: z.string().regex(/^[A-Z]{2}$/),
204
+ geo: z.object({ lat: z.number().min(-90).max(90), lng: z.number().min(-180).max(180) }).optional(),
205
+ }), { field: "address", ...opts });
206
+ }
207
+ function hours(opts = {}) {
208
+ return withMeta(OpeningHoursSchema, { field: "hours", ...opts });
209
+ }
210
+ /** A data query resolved by the renderer (`resolvers[resource]`) into the plain prop `into`. */
211
+ function query(resource, opts = {}) {
212
+ const kinds = (opts.kinds ?? ["latest", "category", "manual"]);
213
+ return withMeta(z.object({ kind: z.enum(kinds), limit: z.number().int().min(1).max(48).optional(), category: z.string().optional(), ids: z.array(z.string()).optional() }), { field: "query", query: { resource, into: opts.into ?? resource }, ...opts });
214
+ }
215
+ function embed(opts = {}) {
216
+ const allow = opts.allow ?? EMBED_PROVIDERS;
217
+ return withMeta(z
218
+ .object({ provider: z.enum(EMBED_PROVIDERS), url: z.url() })
219
+ .refine((v) => allow.includes(v.provider), { message: "This embed provider is not allowed here.", path: ["provider"] })
220
+ .refine((v) => EMBED_HOSTS[v.provider].test(v.url), { message: "The URL does not belong to the selected provider.", path: ["url"] }), { field: "embed", allow, ...opts });
221
+ }
222
+ function social(opts = {}) {
223
+ return withMeta(z.array(z.object({ network: z.enum(SOCIAL_NETWORKS), href: safeHref })).max(opts.max ?? 12), { field: "social", ...opts });
224
+ }
225
+ function date(opts = {}) {
226
+ return withMeta(dateOnly, { field: "date", ...opts });
227
+ }
228
+ /**
229
+ * Field builders. Each returns a zod schema; metadata drives editors, `localize()` and `lintPage()`.
230
+ *
231
+ * ```ts
232
+ * const schema = z.object({
233
+ * title: f.heading({ max: 80 }),
234
+ * lead: f.text({ multiline: true }).optional(),
235
+ * image: f.image({ aspect: "4:5" }),
236
+ * actions: f.list(f.cta(), { max: 2 }),
237
+ * });
238
+ * ```
239
+ */
240
+ export const f = { heading, text, rich, image, link, cta, list, group, select, toggle, number, icon, money, phone, address, hours, query, embed, social, date };
@@ -0,0 +1,2 @@
1
+ export declare const BLOCK_ICONS: readonly ["map-pin", "map", "navigation", "compass", "phone", "phone-call", "mail", "message-circle", "message-square", "send", "globe", "building", "building-2", "store", "home", "hotel", "landmark", "warehouse", "parking-circle", "car", "bike", "bus", "train-front", "plane", "ship", "accessibility", "baby", "dog", "wifi", "plug", "clock", "calendar", "calendar-check", "calendar-days", "alarm-clock", "timer", "hourglass", "history", "repeat", "bell", "utensils", "utensils-crossed", "chef-hat", "coffee", "cup-soda", "wine", "beer", "cake", "croissant", "pizza", "salad", "soup", "fish", "beef", "egg", "leaf", "wheat", "flame", "ice-cream-cone", "sandwich", "heart", "heart-pulse", "sparkles", "flower", "flower-2", "bath", "droplets", "sun", "moon", "waves", "scissors", "hand", "stethoscope", "pill", "smile", "dumbbell", "palette", "brush", "glasses", "briefcase", "chart-line", "chart-bar", "chart-pie", "trending-up", "target", "gauge", "layers", "layout-grid", "puzzle", "settings", "sliders-horizontal", "wrench", "hammer", "package", "truck", "box", "tag", "receipt", "wallet", "credit-card", "banknote", "piggy-bank", "percent", "shopping-bag", "shopping-cart", "gift", "award", "badge-check", "medal", "user", "users", "user-check", "handshake", "shield", "shield-check", "lock", "key", "eye", "fingerprint", "book-open", "file-text", "newspaper", "pen-line", "image", "camera", "video", "music", "mic", "headphones", "monitor", "smartphone", "tablet", "laptop", "code", "terminal", "database", "cloud", "server", "cpu", "zap", "rocket", "lightbulb", "star", "check", "circle-check", "info", "help-circle", "arrow-right", "external-link"];
2
+ export type BlockIconName = (typeof BLOCK_ICONS)[number];
@@ -0,0 +1,26 @@
1
+ // Allow-list for `f.icon()` (150 lucide names) (kebab-case) that read well at 20px / stroke 1.5.
2
+ // Brand marks are not icons — use `f.social()`.
3
+ export const BLOCK_ICONS = [
4
+ // places & contact
5
+ "map-pin", "map", "navigation", "compass", "phone", "phone-call", "mail", "message-circle", "message-square", "send",
6
+ "globe", "building", "building-2", "store", "home", "hotel", "landmark", "warehouse", "parking-circle", "car",
7
+ "bike", "bus", "train-front", "plane", "ship", "accessibility", "baby", "dog", "wifi", "plug",
8
+ // time & booking
9
+ "clock", "calendar", "calendar-check", "calendar-days", "alarm-clock", "timer", "hourglass", "history", "repeat", "bell",
10
+ // food & venue
11
+ "utensils", "utensils-crossed", "chef-hat", "coffee", "cup-soda", "wine", "beer", "cake", "croissant", "pizza",
12
+ "salad", "soup", "fish", "beef", "egg", "leaf", "wheat", "flame", "ice-cream-cone", "sandwich",
13
+ // wellness & care
14
+ "heart", "heart-pulse", "sparkles", "flower", "flower-2", "bath", "droplets", "sun", "moon", "waves",
15
+ "scissors", "hand", "stethoscope", "pill", "smile", "dumbbell", "palette", "brush", "glasses",
16
+ // business & product
17
+ "briefcase", "chart-line", "chart-bar", "chart-pie", "trending-up", "target", "gauge", "layers", "layout-grid", "puzzle",
18
+ "settings", "sliders-horizontal", "wrench", "hammer", "package", "truck", "box", "tag", "receipt", "wallet",
19
+ "credit-card", "banknote", "piggy-bank", "percent", "shopping-bag", "shopping-cart", "gift", "award", "badge-check", "medal",
20
+ // people & trust
21
+ "user", "users", "user-check", "handshake", "shield", "shield-check", "lock", "key", "eye", "fingerprint",
22
+ // content & tech
23
+ "book-open", "file-text", "newspaper", "pen-line", "image", "camera", "video", "music", "mic", "headphones",
24
+ "monitor", "smartphone", "tablet", "laptop", "code", "terminal", "database", "cloud", "server", "cpu",
25
+ "zap", "rocket", "lightbulb", "star", "check", "circle-check", "info", "help-circle", "arrow-right", "external-link",
26
+ ];
@@ -0,0 +1,18 @@
1
+ export { z } from "zod";
2
+ export type { BlockNode, VamosDoc, PageDoc, BlockTheme, BuiltInAccent, ImageRef, LinkRef, CtaRef, CtaStyle, MoneyValue, AddressValue, OpeningHours, TimeRange, Weekday, QueryValue, EmbedValue, SocialLink, SocialNetwork, SeoMeta, DocMeta, BlockSchedule, } from "./types.js";
3
+ export type { RichDoc, RichBlock, RichInline, RichTextRun, RichBreak, RichMark, RichMarkType, RichNodeType, RichParagraph, RichHeading, RichList, RichListItem, RichBlockquote, RichCode, RichRule, } from "./rich-doc.js";
4
+ export { RICH_NODE_TYPES, RICH_MARK_TYPES, richFromText, richToText, inlineToText, countWords, forEachRun, isBreak } from "./rich-doc.js";
5
+ export { RichDocSchema, RichBlockSchema, RichInlineSchema, RichMarkSchema, richDocAllows } from "./rich-doc-schema.js";
6
+ export { BlockNodeSchema, VamosDocSchema, PageDocSchema, BlockThemeSchema, BlockIdSchema, BlockTypeSchema, AnchorSchema, ScheduleSchema, SeoMetaSchema, docSchemaOf, CORE_TEXT_TYPES, isCoreTextType, ACCENTS, VAMOS_DOC_SCHEMA_URL, type CoreTextType, } from "./nodes.js";
7
+ export { pickLocale, isLocaleMap, localeChain, localesOf, LOCALE_KEY_RE, type Localized, type LocaleCode, type PickLocaleOptions } from "./localized.js";
8
+ export { localize, localizeProps, type LocalizeOptions } from "./localize.js";
9
+ export { f, getFieldMeta, unwrapSchema, schemaKind, localizedSchema, isLocalizedSchema, ImageRefSchema, LinkRefSchema, OpeningHoursSchema, TimeRangeSchema, EMBED_PROVIDERS, SOCIAL_NETWORKS, type FieldKind, type FieldMeta, type FieldOptions, } from "./fields.js";
10
+ export { BLOCK_ICONS, type BlockIconName } from "./icons.js";
11
+ export { mapFields, walkFields, type FieldVisit, type FieldVisitor } from "./walk.js";
12
+ export { defineBlock, createRegistry, BlockDefinitionError, type BlockDefinition, type BlockDefinitionInput, type AnyBlockDefinition, type BlockRegistry, type BlockCategory, type BlockRegion, type BlockSupports, type SlotSpec, type FieldHints, type BlockPropsOf, type Delocalized, type JsonLdContext, } from "./define-block.js";
13
+ export { migrateNode, migrateDoc, docMigrations, CURRENT_DOC_VERSION, type MigrationResult } from "./migrate.js";
14
+ export { validateNode, type ValidationResult } from "./validate.js";
15
+ export { lintPage, CLICHE_PHRASES, oklchHue, type LintOptions, type LintReport } from "./lint.js";
16
+ export type { LintIssue, LintIssueInput, LintCode, LintSeverity } from "./lint-types.js";
17
+ export { parseEmphasis, countEmphasis, stripEmphasis, type EmphasisPart } from "./emphasis.js";
18
+ export { sanitizeHref, isExternalUrl, linkKindOf, hasEmoji, EMOJI_RE, type LinkKind } from "./safety.js";
@@ -0,0 +1,21 @@
1
+ // Public API of @vamos-ui/react/blocks/schema — layer 2 (zod, no React). Server, edge and admin only:
2
+ // a site's client bundle never imports this entry (components use `import type`).
3
+ export { z } from "zod";
4
+ export { RICH_NODE_TYPES, RICH_MARK_TYPES, richFromText, richToText, inlineToText, countWords, forEachRun, isBreak } from "./rich-doc.js";
5
+ export { RichDocSchema, RichBlockSchema, RichInlineSchema, RichMarkSchema, richDocAllows } from "./rich-doc-schema.js";
6
+ export { BlockNodeSchema, VamosDocSchema, PageDocSchema, BlockThemeSchema, BlockIdSchema, BlockTypeSchema, AnchorSchema, ScheduleSchema, SeoMetaSchema, docSchemaOf, CORE_TEXT_TYPES, isCoreTextType, ACCENTS, VAMOS_DOC_SCHEMA_URL, } from "./nodes.js";
7
+ // Localization
8
+ export { pickLocale, isLocaleMap, localeChain, localesOf, LOCALE_KEY_RE } from "./localized.js";
9
+ export { localize, localizeProps } from "./localize.js";
10
+ // Fields
11
+ export { f, getFieldMeta, unwrapSchema, schemaKind, localizedSchema, isLocalizedSchema, ImageRefSchema, LinkRefSchema, OpeningHoursSchema, TimeRangeSchema, EMBED_PROVIDERS, SOCIAL_NETWORKS, } from "./fields.js";
12
+ export { BLOCK_ICONS } from "./icons.js";
13
+ export { mapFields, walkFields } from "./walk.js";
14
+ // Definitions, registry, migrations, validation, lint
15
+ export { defineBlock, createRegistry, BlockDefinitionError, } from "./define-block.js";
16
+ export { migrateNode, migrateDoc, docMigrations, CURRENT_DOC_VERSION } from "./migrate.js";
17
+ export { validateNode } from "./validate.js";
18
+ export { lintPage, CLICHE_PHRASES, oklchHue } from "./lint.js";
19
+ // Pure helpers shared with layer 1
20
+ export { parseEmphasis, countEmphasis, stripEmphasis } from "./emphasis.js";
21
+ export { sanitizeHref, isExternalUrl, linkKindOf, hasEmoji, EMOJI_RE } from "./safety.js";
@@ -0,0 +1,16 @@
1
+ export type LintSeverity = "error" | "warning" | "info";
2
+ export type LintCode = "unknown-block" | "invalid-props" | "duplicate-id" | "duplicate-anchor" | "multiple-h1" | "missing-h1" | "heading-too-long" | "cliche-copy" | "multiple-primary-cta" | "missing-translation" | "too-many-cards" | "monotone-page" | "violet-accent" | "newer-version" | "missing-migration" | (string & {});
3
+ export interface LintIssueInput {
4
+ code: LintCode;
5
+ severity?: LintSeverity;
6
+ message: string;
7
+ /** Prop path inside the block, e.g. "props.items.2.title". */
8
+ path?: string;
9
+ }
10
+ export interface LintIssue extends Required<Pick<LintIssueInput, "code" | "message">> {
11
+ severity: LintSeverity;
12
+ blockId?: string;
13
+ blockType?: string;
14
+ path?: string;
15
+ locale?: string;
16
+ }
@@ -0,0 +1,2 @@
1
+ // Lint issue shapes (lintPage + per-block `lint`). Types only.
2
+ export {};
@@ -0,0 +1,32 @@
1
+ import { type LocaleCode } from "./localized.js";
2
+ import type { BlockRegistry } from "./define-block.js";
3
+ import type { VamosDoc } from "./types.js";
4
+ import type { LintIssue } from "./lint-types.js";
5
+ /** Stock phrases that make copy read machine-written (D6-6). Matched case-insensitively. */
6
+ export declare const CLICHE_PHRASES: Record<string, readonly string[]>;
7
+ export interface LintOptions {
8
+ /** Locales to check translations for. Default: `doc.locales`. */
9
+ locales?: readonly LocaleCode[];
10
+ /** Max words in a heading before a warning. Default 9. */
11
+ maxHeadingWords?: number;
12
+ /** Max card-like (`surface`) sections per page. Default 2. */
13
+ maxCardSections?: number;
14
+ }
15
+ export interface LintReport {
16
+ issues: LintIssue[];
17
+ /** Per-locale translation completeness, 0–100 (only when more than one locale). */
18
+ completeness: Record<LocaleCode, number>;
19
+ errorCount: number;
20
+ warningCount: number;
21
+ }
22
+ /** Hue of an `oklch(L C H)` string, or null. */
23
+ export declare function oklchHue(color: string): number | null;
24
+ /**
25
+ * Checks a document against the registry and the kit's editorial rules.
26
+ *
27
+ * ```ts
28
+ * const { issues, completeness } = lintPage(doc, siteBlocks);
29
+ * // completeness → { en: 100, tr: 82 }
30
+ * ```
31
+ */
32
+ export declare function lintPage(doc: VamosDoc, registry: BlockRegistry, opts?: LintOptions): LintReport;
@@ -0,0 +1,164 @@
1
+ // lintPage(): the D6 "doesn't look AI-generated" rules + structure + translation completeness.
2
+ // Warnings, not locks — builders surface them next to the block.
3
+ import { walkFields } from "./walk.js";
4
+ import { isLocaleMap } from "./localized.js";
5
+ import { stripEmphasis } from "./emphasis.js";
6
+ import { countWords, richToText } from "./rich-doc.js";
7
+ import { isCoreTextType } from "./nodes.js";
8
+ import { localizeProps } from "./localize.js";
9
+ /** Stock phrases that make copy read machine-written (D6-6). Matched case-insensitively. */
10
+ export const CLICHE_PHRASES = {
11
+ en: ["unlock", "seamless", "elevate", "supercharge", "revolutionize", "revolutionise", "next-gen", "next generation", "ai-powered", "empower", "take it to the next level", "lorem ipsum", "game-changer", "cutting-edge", "world-class", "best-in-class"],
12
+ tr: ["yeni nesil", "dijital dönüşüm", "bir üst seviyeye taşı", "işinizi büyütün", "sınırları zorlayın", "fark yaratın"],
13
+ };
14
+ const lower = (s) => s.toLocaleLowerCase("tr").replace(/\s+/g, " ");
15
+ function textOf(value) {
16
+ if (typeof value === "string")
17
+ return value;
18
+ if (value && typeof value === "object" && value.type === "doc")
19
+ return richToText(value);
20
+ return "";
21
+ }
22
+ /** Hue of an `oklch(L C H)` string, or null. */
23
+ export function oklchHue(color) {
24
+ const m = /^oklch\(\s*[\d.]+%?\s+([\d.]+)\s+([\d.]+)/.exec(color);
25
+ if (!m)
26
+ return null;
27
+ return Number(m[1]) < 0.03 ? null : Number(m[2]);
28
+ }
29
+ /**
30
+ * Checks a document against the registry and the kit's editorial rules.
31
+ *
32
+ * ```ts
33
+ * const { issues, completeness } = lintPage(doc, siteBlocks);
34
+ * // completeness → { en: 100, tr: 82 }
35
+ * ```
36
+ */
37
+ export function lintPage(doc, registry, opts = {}) {
38
+ const issues = [];
39
+ const locales = opts.locales ?? doc.locales ?? (doc.lang ? [doc.lang] : ["en"]);
40
+ const maxWords = opts.maxHeadingWords ?? 9;
41
+ const ids = new Map();
42
+ const anchors = new Map();
43
+ const filled = Object.fromEntries(locales.map((l) => [l, 0]));
44
+ let localizedTotal = 0;
45
+ let coreH1 = 0;
46
+ let pageTitleBlocks = 0;
47
+ let cardSections = 0;
48
+ let hasImagery = false;
49
+ const surfaces = new Set();
50
+ let bodyCount = 0;
51
+ const add = (node, i) => issues.push({ severity: i.severity ?? "warning", code: i.code, message: i.message, path: i.path, locale: i.locale, blockId: node?.id, blockType: node?.type });
52
+ const visit = (node, region) => {
53
+ ids.set(node.id, (ids.get(node.id) ?? 0) + 1);
54
+ if (node.anchor)
55
+ anchors.set(node.anchor, (anchors.get(node.anchor) ?? 0) + 1);
56
+ if (region === "body") {
57
+ bodyCount++;
58
+ surfaces.add(`${node.theme?.surface ?? "scene"}/${node.theme?.mode ?? "inherit"}`);
59
+ }
60
+ if (node.theme?.surface === "surface")
61
+ cardSections++;
62
+ if (node.theme?.surface === "media")
63
+ hasImagery = true;
64
+ if (typeof node.theme?.accent === "string") {
65
+ const hue = oklchHue(node.theme.accent);
66
+ if (hue !== null && hue >= 265 && hue <= 320)
67
+ add(node, { code: "violet-accent", message: "Purple/violet custom accents read as generic; prefer a hue outside 265–320°." });
68
+ }
69
+ if (isCoreTextType(node.type) && !registry.has(node.type)) {
70
+ if (node.type === "heading" && node.props?.level === 1)
71
+ coreH1++;
72
+ }
73
+ else {
74
+ const def = registry.get(node.type);
75
+ if (!def) {
76
+ add(node, { code: "unknown-block", message: `Unknown block type "${node.type}". It is kept but not rendered.` });
77
+ }
78
+ else {
79
+ if ((node.v ?? 1) > def.version)
80
+ add(node, { code: "newer-version", message: `Saved with v${node.v}; this site knows v${def.version}.` });
81
+ if (def.supports.pageTitle)
82
+ pageTitleBlocks++;
83
+ const parsed = def.schema.safeParse(node.props ?? {});
84
+ if (!parsed.success) {
85
+ for (const iss of parsed.error.issues)
86
+ add(node, { severity: "error", code: "invalid-props", message: iss.message, path: ["props", ...iss.path.map(String)].join(".") });
87
+ }
88
+ let primaries = 0;
89
+ walkFields(def.schema, node.props, (f) => {
90
+ const kind = f.meta?.field;
91
+ if (kind === "image" && f.value)
92
+ hasImagery = true;
93
+ if (kind === "cta" && f.value?.style === "primary")
94
+ primaries++;
95
+ if (!f.localized)
96
+ return;
97
+ // translation completeness
98
+ if (locales.length > 1) {
99
+ localizedTotal++;
100
+ for (const l of locales) {
101
+ const has = !isLocaleMap(f.value) ? textOf(f.value) !== "" || typeof f.value !== "string" : textOf(f.value[l]) !== "";
102
+ if (has)
103
+ filled[l] = (filled[l] ?? 0) + 1;
104
+ else
105
+ add(node, { severity: "info", code: "missing-translation", message: `Missing ${l} translation.`, path: `props.${f.path}`, locale: l });
106
+ }
107
+ }
108
+ // copy rules, per locale value
109
+ const values = isLocaleMap(f.value) ? Object.entries(f.value) : [[undefined, f.value]];
110
+ for (const [loc, raw] of values) {
111
+ const t = textOf(raw);
112
+ if (!t)
113
+ continue;
114
+ if (kind === "heading" && countWords(stripEmphasis(t)) > maxWords)
115
+ add(node, { code: "heading-too-long", message: `Headings read best under ${maxWords + 1} words.`, path: `props.${f.path}`, locale: loc });
116
+ const lt = lower(t);
117
+ const lists = loc ? [CLICHE_PHRASES[loc.split("-")[0]] ?? [], CLICHE_PHRASES.en] : Object.values(CLICHE_PHRASES);
118
+ const hit = lists.flat().find((p) => lt.includes(p));
119
+ if (hit)
120
+ add(node, { code: "cliche-copy", message: `“${hit}” is stock copy; say what the business actually does.`, path: `props.${f.path}`, locale: loc });
121
+ }
122
+ });
123
+ if (primaries > 1)
124
+ add(node, { code: "multiple-primary-cta", message: "Use one primary action per block; make the others secondary." });
125
+ if (def.lint && parsed.success) {
126
+ const plain = localizeProps(def.schema, parsed.data, { locale: locales[0] ?? "en", fallback: locales.slice(1) });
127
+ for (const i of def.lint(plain, node))
128
+ add(node, i);
129
+ }
130
+ }
131
+ }
132
+ for (const list of Object.values(node.slots ?? {}))
133
+ for (const c of list)
134
+ visit(c, "slot");
135
+ };
136
+ for (const n of doc.layout?.header ?? [])
137
+ visit(n, "header");
138
+ for (const n of doc.blocks)
139
+ visit(n, "body");
140
+ for (const n of doc.layout?.footer ?? [])
141
+ visit(n, "footer");
142
+ for (const n of doc.layout?.overlay ?? [])
143
+ visit(n, "overlay");
144
+ for (const [id, n] of ids)
145
+ if (n > 1)
146
+ add(undefined, { severity: "error", code: "duplicate-id", message: `Block id "${id}" is used ${n} times; ids must be unique.` });
147
+ for (const [a, n] of anchors)
148
+ if (n > 1)
149
+ add(undefined, { severity: "error", code: "duplicate-anchor", message: `Anchor "#${a}" is used ${n} times.` });
150
+ const h1s = coreH1 + (pageTitleBlocks > 0 ? 1 : 0);
151
+ if (h1s > 1)
152
+ add(undefined, { severity: "error", code: "multiple-h1", message: "A page has one h1. Demote the extra level-1 headings." });
153
+ if (h1s === 0 && bodyCount > 0)
154
+ add(undefined, { severity: "info", code: "missing-h1", message: "No page title: start with a hero or page intro, or add a level-1 heading." });
155
+ if (cardSections > (opts.maxCardSections ?? 2))
156
+ add(undefined, { code: "too-many-cards", message: `${cardSections} card sections; keep at most ${opts.maxCardSections ?? 2} and let the rest breathe on the page.` });
157
+ if (bodyCount >= 4 && surfaces.size === 1 && !hasImagery)
158
+ add(undefined, { severity: "info", code: "monotone-page", message: "Every section has the same background and there is no imagery; vary one surface or add a photo." });
159
+ const completeness = {};
160
+ if (locales.length > 1)
161
+ for (const l of locales)
162
+ completeness[l] = localizedTotal ? Math.round(((filled[l] ?? 0) / localizedTotal) * 100) : 100;
163
+ return { issues, completeness, errorCount: issues.filter((i) => i.severity === "error").length, warningCount: issues.filter((i) => i.severity === "warning").length };
164
+ }
@@ -0,0 +1,20 @@
1
+ import type { z } from "zod";
2
+ import { type LocaleCode } from "./localized.js";
3
+ import type { BlockNode } from "./types.js";
4
+ import type { BlockRegistry } from "./define-block.js";
5
+ export interface LocalizeOptions {
6
+ locale: LocaleCode;
7
+ /** Tried after `locale`. Default `["en"]`. */
8
+ fallback?: readonly LocaleCode[];
9
+ }
10
+ /** Localizes a props object with its schema. */
11
+ export declare function localizeProps<T = unknown>(schema: z.ZodType, props: unknown, opts: LocalizeOptions): T;
12
+ /**
13
+ * Localizes one node (props, theme background alt, child slots). Unknown types are returned
14
+ * unchanged. `schema` may be the block's props schema or a registry.
15
+ *
16
+ * ```ts
17
+ * localize(node, siteBlocks, { locale: "tr", fallback: ["en"] });
18
+ * ```
19
+ */
20
+ export declare function localize(node: BlockNode, source: BlockRegistry | z.ZodType | undefined, opts: LocalizeOptions): BlockNode;
@@ -0,0 +1,29 @@
1
+ // localize(): turns Localized<T> props into plain values for one locale (D2a). Components never
2
+ // see locale maps. Deterministic fallback chain: locale → base language → fallbacks → first.
3
+ import { pickLocale } from "./localized.js";
4
+ import { mapFields } from "./walk.js";
5
+ import { BlockThemeSchema } from "./nodes.js";
6
+ /** Localizes a props object with its schema. */
7
+ export function localizeProps(schema, props, opts) {
8
+ return mapFields(schema, props, (v) => (v.localized ? { replace: pickLocale(v.value, opts.locale, { fallback: opts.fallback }) } : undefined));
9
+ }
10
+ /**
11
+ * Localizes one node (props, theme background alt, child slots). Unknown types are returned
12
+ * unchanged. `schema` may be the block's props schema or a registry.
13
+ *
14
+ * ```ts
15
+ * localize(node, siteBlocks, { locale: "tr", fallback: ["en"] });
16
+ * ```
17
+ */
18
+ export function localize(node, source, opts) {
19
+ const schema = !source ? undefined : "definitions" in source ? source.get(node.type)?.schema : source;
20
+ const out = { ...node };
21
+ if (schema && node.props !== undefined)
22
+ out.props = localizeProps(schema, node.props, opts);
23
+ if (node.theme)
24
+ out.theme = localizeProps(BlockThemeSchema, node.theme, opts);
25
+ if (node.slots && source && "definitions" in source) {
26
+ out.slots = Object.fromEntries(Object.entries(node.slots).map(([k, list]) => [k, list.map((c) => localize(c, source, opts))]));
27
+ }
28
+ return out;
29
+ }
@@ -0,0 +1,25 @@
1
+ /** BCP 47-ish locale key: `en`, `tr`, `en-GB`, `pt-BR`, `zh-Hant`. */
2
+ export type LocaleCode = string;
3
+ /** `"Book a table"` or `{ en: "Book a table", tr: "Masa ayırtın" }`. */
4
+ export type Localized<T> = T | Partial<Record<LocaleCode, T>>;
5
+ export declare const LOCALE_KEY_RE: RegExp;
6
+ /** True when `value` is a locale map (`{ en: …, tr: … }`) rather than a value of T. */
7
+ export declare function isLocaleMap(value: unknown): value is Record<LocaleCode, unknown>;
8
+ export interface PickLocaleOptions {
9
+ /** Tried in order after `locale`. Default `["en"]`. */
10
+ fallback?: readonly LocaleCode[];
11
+ }
12
+ /** The locale chain used by `pickLocale`: exact → base language → each fallback (exact → base). */
13
+ export declare function localeChain(locale: LocaleCode, fallback?: readonly LocaleCode[]): LocaleCode[];
14
+ /**
15
+ * Picks one locale from a `Localized<T>` value. Deterministic: exact locale → its base language →
16
+ * each fallback → the first non-empty value in insertion order. Empty strings count as missing.
17
+ *
18
+ * ```ts
19
+ * pickLocale({ en: "Book a table", tr: "Masa ayırtın" }, "tr-TR"); // "Masa ayırtın"
20
+ * pickLocale("Book a table", "tr"); // "Book a table"
21
+ * ```
22
+ */
23
+ export declare function pickLocale<T>(value: Localized<T> | undefined, locale: LocaleCode, opts?: PickLocaleOptions): T | undefined;
24
+ /** Locales present (non-empty) in a localized value. A plain value counts as every locale. */
25
+ export declare function localesOf(value: unknown): LocaleCode[] | "all";