@bettercms-ai/kit 1.0.0 → 2.0.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 (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","names":[],"sources":["../../src/kit/adapters/schema.ts"],"sourcesContent":["/**\n * SCHEMA ADAPTERS — the production schema language ↔ the V2 schema language (TypeSchema).\n *\n * toTypeSchema(model) prod content model {fields, fieldsets} → TypeSchema\n * propsToTypeSchema(component) prod component props (ComponentPropDef[]) → TypeSchema\n * fromTypeSchema(v2, \"fields\") TypeSchema → prod content model, plus every V2 feature prod cannot hold\n * fromTypeSchema(v2, \"props\") TypeSchema → prod component props, likewise\n * planFromProd / planToProd one field's stored prod value ↔ its V2 value, by the plan a read hands back\n * (ToTypeSchemaOptions.plans) or `leafValuePlan` builds for a leaf field\n *\n * The read side takes BOTH prod dialects: the old shapes (group / repeater, array zones, showIf eq / neq / in / isSet)\n * and the F1 keys (object, openMode, advanced, helpMore, recommendedMax, config.scale, ui.layout rows / chips /\n * gallery, ui.preview.fallback, fieldset collapsible / columns / layout, notEmpty / empty), and the F1.x keys landed on\n * origin/dev 81f385ff3 (validation parity, option meta, the V2 chrome keys and types, reference / video / array / longtext\n * props, prop group keys and nesting, the V2 icon vocabulary, localized). What V2 cannot show is reported through\n * `onLoss`, never dropped silently.\n *\n * The write side returns `{ schema, lossy, catalog }`: `toTypeSchema(fromTypeSchema(v2, t).schema)` equals `v2` minus\n * exactly the `lossy` and `catalog` paths. `lossy` is what prod drops; `catalog` is metadata the dock never stores, set\n * by the host at seeding time (block icon, category, kind, variants…). Storage stays prod's; value shapes go through\n * ./values.\n */\nimport type { Condition, FieldGroup, FieldSchema, Fieldset as V2Fieldset, Option, PreviewConfig, ScaleSchema, ScaleValue, TypeSchema } from \"../schema/types\";\nimport { CATALOG, FEATURES, type CatalogFeature, type CatalogItem, type LossyFeature, type LossyItem } from \"./lossy\";\nimport { dockIconOf, tablerIconOf } from \"./icons\";\nimport { isDataTableProp, tableConfigFromOptions, tableOptionsFromConfig } from \"../controls/table/prod\";\nimport {\n CONTROL_TYPES,\n FIELD_HELP_MAX,\n FIELDSET_DESCRIPTION_MAX,\n FIELDSET_NAME_MAX,\n FIELDSETS_MAX,\n HELP_MORE_MAX,\n ITEM_LABEL_MAX,\n ITEM_NAME_RE,\n ITEM_TITLE_MAX,\n LOCK_REASON_MAX,\n MAX_FIELD_DEPTH,\n NUMBER_UNIT_MAX,\n OPTION_DESCRIPTION_MAX,\n PATTERN_MAX,\n PATTERN_MESSAGE_MAX,\n PREVIEW_FALLBACK_MAX,\n PROP_GROUP_DESCRIPTION_MAX,\n PROP_GROUP_LABEL_MAX,\n PROP_GROUP_ORDER_MAX,\n PROP_HELP_MAX,\n PROP_PLACEHOLDER_MAX,\n RATING_MAX,\n RATING_MAX_STOPS,\n SCALE_CSS_MAX,\n SCALE_LABEL_MAX,\n SCALE_PRESETS_MAX,\n SCALE_STEPS_MAX,\n SCALE_TITLE_MAX,\n SCALE_TOKEN_VALUE_MAX,\n SYNCED_FROM_MAX,\n TAB_MAX,\n TAB_NAME_MAX,\n TAGS_ITEMS_MAX,\n UI_CONTROLS,\n UI_PLACEHOLDER_MAX,\n UI_ROWS_MAX,\n type ChoiceOption,\n type ComponentCategory,\n type DockIconName,\n type ComponentPropDef,\n type ComponentSubField,\n type ContentModelField,\n type FieldConfig,\n type Fieldset,\n type FieldUi,\n type NumberScale,\n type OpenMode,\n type ProdComponent,\n type ProdContentModel,\n type PropGroup,\n type PropUi,\n type SelectOption,\n type ShowIf,\n type ShowIfRule,\n type UiControl,\n type UiPreview,\n} from \"./prod-types\";\nimport {\n buttonFromProd,\n buttonToProd,\n datetimeFromProd,\n datetimeToProd,\n imageFromProd,\n imageToProd,\n linkFromProd,\n linkToProd,\n listFromProd,\n listToProd,\n ratingFromProd,\n ratingToProd,\n referenceFromProd,\n referenceToProd,\n scaleFromProd,\n scaleToProd,\n videoFromProd,\n videoToProd,\n zoneListFromProd,\n zoneListToProd,\n type ListItemType,\n type RatingScale,\n type V2ButtonValue,\n type V2ImageValue,\n type V2LinkValue,\n type V2VideoValue,\n} from \"./values\";\n\nexport type { CatalogItem, LossyItem } from \"./lossy\";\nexport type AdapterTarget = \"fields\" | \"props\";\nexport interface FromTypeSchemaResult<S> {\n schema: S;\n /**\n * fields lane: the kind:'block' models a modular field's config.blockSlugs names, one per item type (created before\n * the model that uses them). Empty in the props lane.\n */\n blockModels: ProdContentModel[];\n lossy: LossyItem[];\n catalog: CatalogItem[];\n}\nexport interface ToTypeSchemaOptions {\n /** Prod features V2 cannot show (a neq condition, a table layout, a component slot…), reported as they are dropped. */\n onLoss?: (item: { path: string; feature: string; reason: string }) => void;\n /** The block models a modular field's blockSlugs name: each item type's fields are read from its model. */\n blockModels?: ProdContentModel[];\n /**\n * Filled with each top-level field's value plan (field name → plan): how its stored prod value crosses to the V2 value\n * and back, through `planFromProd` / `planToProd`. The same plan this read used for the field's initialValue.\n */\n plans?: Map<string, ValuePlan>;\n}\n\ntype Obj = Record<string, unknown>;\nconst isObj = (v: unknown): v is Obj => !!v && typeof v === \"object\" && !Array.isArray(v);\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (Array.isArray(a) || Array.isArray(b)) return Array.isArray(a) && Array.isArray(b) && a.length === b.length && a.every((x, i) => deepEqual(x, b[i]));\n if (!isObj(a) || !isObj(b)) return false;\n const keys = new Set([...Object.keys(a), ...Object.keys(b)].filter((k) => a[k] !== undefined || b[k] !== undefined));\n return [...keys].every((k) => deepEqual(a[k], b[k]));\n}\n\n/* ── naming conventions shared by both directions ────────────────────── */\nconst singular = (t: string) => (t.endsWith(\"ies\") ? `${t.slice(0, -3)}y` : t.endsWith(\"s\") && !t.endsWith(\"ss\") ? t.slice(0, -1) : t);\nconst kebab = (s: string) =>\n s\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"schema\";\nconst camel = (s: string) => s.replace(/-([a-z0-9])/g, (_, c: string) => c.toUpperCase());\nconst capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);\nconst ZONE_NAMES: ReadonlySet<string> = new Set(typeof Intl.supportedValuesOf === \"function\" ? [...Intl.supportedValuesOf(\"timeZone\"), \"UTC\"] : [\"UTC\"]);\n/** An IANA zone name (isTimeZoneName): ICU's canonical list, or a current name Intl itself accepts (Asia/Kolkata). */\nconst isZone = (z: string) => {\n if (ZONE_NAMES.has(z)) return true;\n if (!/^[A-Za-z]+(?:\\/[A-Za-z0-9_+-]+)+$/.test(z)) return false;\n try {\n new Intl.DateTimeFormat(\"en\", { timeZone: z });\n return true;\n } catch {\n return false;\n }\n};\n\n/** The item type of a single-type array, as both directions name it when prod has no name for it. */\nconst conventionItem = (fieldName: string, fieldTitle: string, itemLabel?: string) => ({\n name: singular(fieldName),\n title: itemLabel ?? singular(fieldTitle),\n});\n\n/** A condition's value as the sibling's type reads it (prod stores rule values as strings). */\nfunction coerceRuleValue(siblingType: string | undefined, s: string): unknown {\n if (siblingType === \"boolean\") return s === \"true\" ? true : s === \"false\" ? false : s;\n if ((siblingType === \"number\" || siblingType === \"rating\") && s.trim() !== \"\" && Number.isFinite(Number(s))) return Number(s);\n return s;\n}\n\n/* ── type tables ─────────────────────────────────────────────────────── */\n/** V2 primitive types → the same-valued prod field type (fields lane). */\nconst FIELD_TYPE: Partial<Record<FieldSchema[\"type\"], ContentModelField[\"type\"]>> = {\n string: \"text\", text: \"longtext\", richtext: \"richtext\", number: \"number\", rating: \"rating\", boolean: \"boolean\", slug: \"slug\",\n email: \"email\", date: \"date\", datetime: \"datetime\", color: \"color\", select: \"select\", multiselect: \"multiselect\", tags: \"tags\",\n image: \"image\", file: \"file\", icon: \"icon\", link: \"link\", button: \"button\", reference: \"reference\", json: \"json\", geopoint: \"location\",\n // DESIGN §8.3 prefers a link, but only a text field enforces a URL's pattern and length: text + config.inputType \"url\"\n url: \"text\", code: \"code\", video: \"video\",\n};\n/** V2 primitive types → prop types. */\nconst PROP_TYPE: Partial<Record<FieldSchema[\"type\"], ComponentPropDef[\"type\"]>> = {\n string: \"text\", text: \"longtext\", video: \"video\", richtext: \"richtext\", number: \"number\", rating: \"rating\", boolean: \"boolean\", slug: \"slug\",\n email: \"email\", date: \"date\", datetime: \"datetime\", color: \"color\", select: \"select\", multiselect: \"multiselect\", tags: \"tags\",\n image: \"image\", file: \"file\", icon: \"icon\", link: \"link\", button: \"button\", json: \"json\", geopoint: \"location\", url: \"url\", code: \"code\",\n};\n/** Field types whose `config` the backend parses strictly (unknown keys stripped or refused). */\nconst STRICT_CONFIG: ReadonlySet<string> = new Set([\n \"array\", \"reference\", \"multi-reference\", \"multiReference\", \"date\", \"datetime\", \"component-ref\", \"modular\", \"sections\", \"tags\", \"rating\", \"code\", \"video\",\n]);\n/** V2 list item types → prod `config.itemType` (ARRAY_ITEM_TYPES); a V2 `text` item reads back as `string`. */\nconst PRIM_ITEM: Partial<Record<FieldSchema[\"type\"], ListItemType>> = {\n string: \"text\", text: \"text\", number: \"number\", date: \"date\", image: \"image\", link: \"link\", richtext: \"richtext\",\n};\nconst ENTRY_TARGET = (t: string) => ![\"page\", \"form\", \"shopify\", \"collection\"].includes(t);\n/** The old rating: a number with ui.control \"rating\" and these bounds read back as no `numeric` (read side only). */\nconst RATING_CONFIG = { min: 0, max: 5, step: 0.5 } as const;\n/**\n * V2 block-picker category (KitCategory, and the core examples' own) → the nearest prod ComponentCategory. A category\n * with no row has no prod twin; the server defaults the component to \"custom\".\n */\nexport const CATEGORY_TO_PROD: Readonly<Record<string, ComponentCategory>> = {\n \"Navigation & chrome\": \"navbar\",\n Heroes: \"hero\",\n \"Features & storytelling\": \"content\",\n \"Social proof\": \"social-proof\",\n \"Media & galleries\": \"content\",\n Commerce: \"conversion\",\n \"Pricing & plans\": \"conversion\",\n \"Conversion & forms\": \"conversion\",\n \"Listings & feeds\": \"content\",\n \"Long-form & docs\": \"content\",\n \"Company & people\": \"content\",\n \"Events & places\": \"content\",\n \"Data & interactive\": \"section\",\n Navigation: \"navbar\",\n Hero: \"hero\",\n Content: \"content\",\n Layout: \"section\",\n};\n/** The field types a kind:'block' model may hold (backend block-model-mapping.ts FIELD_PRIMITIVE). */\nconst BLOCK_FIELD_TYPES: ReadonlySet<string> = new Set([\n \"text\", \"longtext\", \"richtext\", \"image\", \"link\", \"slug\", \"email\", \"phone\", \"color\", \"select\", \"number\", \"rating\", \"date\", \"datetime\", \"boolean\",\n]);\n/** A prop's config.minItems / maxItems cap (SLOT_ITEMS_CAP, componentPropDefSchema). */\nconst SLOT_ITEMS_CAP = 50;\n/** Backend dock-vocabulary.ts SLIDER_MAX_STOPS: a slider's (max − min) / step. */\nconst SLIDER_MAX_STOPS = 1000;\n/**\n * The field types prod's unique flag accepts (uniqueFlagRules): a comparable scalar (UNIQUE_FIELD_TYPES, no two entries\n * share it; a reference only to one model) or a list (UNIQUE_ITEMS_FIELD_TYPES, no item repeats).\n */\nconst UNIQUE_TYPES: ReadonlySet<string> = new Set([\n \"text\", \"longtext\", \"slug\", \"email\", \"phone\", \"link\", \"number\", \"select\", \"reference\", \"date\",\n \"array\", \"multiselect\", \"tags\", \"multi-reference\",\n]);\n/** Prop types whose value is a list (UNIQUE_LIST_PROP_TYPES), and the sub-field types a table row compares (UNIQUE_ROW_PROP_TYPES). */\nconst UNIQUE_LIST_PROPS: ReadonlySet<string> = new Set([\"multiselect\", \"tags\", \"multi-reference\", \"table\", \"array\"]);\nconst UNIQUE_ROW_PROPS: ReadonlySet<string> = new Set([\"text\", \"url\", \"slug\", \"email\", \"phone\", \"number\", \"select\", \"date\"]);\n/** Types measured by minLength / maxLength (fields: LENGTH_FIELD_TYPES; props: LENGTH_TWIN), and those that take a pattern. */\nconst LENGTH_FIELDS: ReadonlySet<string> = new Set([\"text\", \"longtext\", \"richtext\", \"document\"]);\nconst LENGTH_PROPS: ReadonlySet<string> = new Set([\"text\", \"url\", \"longtext\", \"richtext\"]);\nconst PATTERN_TYPES: ReadonlySet<string> = new Set([\"text\", \"longtext\", \"url\"]);\n/**\n * Leaf types whose value is an object a dotted preview path may read into (previewPathProblem OBJECT_VALUE_TYPES), and the\n * keys an image or video value holds (LEAF_VALUE_KEYS). V2 reads `image.alt`; prod stores the key as `altText`.\n */\nconst OBJECT_VALUE_TYPES: ReadonlySet<string> = new Set([\"image\", \"link\", \"button\", \"file\", \"video\", \"location\", \"json\", \"code\", \"reference\", \"multi-reference\"]);\nconst LEAF_VALUE_KEYS: Readonly<Record<string, readonly string[]>> = {\n image: [\"id\", \"url\", \"name\", \"altText\", \"width\", \"height\", \"focal\", \"crop\"],\n video: [\"url\", \"poster\", \"autoplay\", \"loop\", \"transcript\"],\n};\nconst IMAGE_PATH_KEY: Readonly<Record<string, string>> = { alt: \"altText\" };\n\n/* ══════════════════════════════════════════════════════════════════════\n * V2 → prod\n * ══════════════════════════════════════════════════════════════════════ */\n\ninterface Ctx {\n lane: AdapterTarget;\n lossy: LossyItem[];\n catalog: CatalogItem[];\n /** fields lane: kept tab ids, kept fieldset ids → their tab, dropped tab ids → why. */\n tabs: Set<string>;\n droppedTabs: Map<string, LossyFeature>;\n sets: Map<string, string | undefined>;\n /** props lane: fieldsets usable as prop groups, and per sibling list the ones already defined on a prop there. */\n propSets: Map<string, V2Fieldset>;\n definedGroups: WeakMap<FieldSchema[], Set<string>>;\n /** props lane: each V2 fieldset's index (the prop group's `order` when groupOrder). */\n propOrder: Map<string, number>;\n /** props lane: the V2 fieldsets order differs from where each is first used, so every group carries its `order`. */\n groupOrder: boolean;\n /** fields lane: block slug → the block model a modular item type is stored as. */\n blockModels: Map<string, ProdContentModel>;\n}\nconst lose = (ctx: Ctx, path: string, feature: LossyFeature) => ctx.lossy.push({ path, feature, reason: FEATURES[feature].reason });\nconst cat = (ctx: Ctx, path: string, feature: CatalogFeature) => ctx.catalog.push({ path, feature, reason: CATALOG[feature] });\n\n/** One converted field, lane-neutral; `emit*` places each key where its lane keeps it. */\ninterface Node {\n key: string;\n label: string;\n type: string;\n helpText?: string;\n required?: boolean;\n unique?: boolean;\n defaultValue?: unknown;\n options?: SelectOption[];\n config: FieldConfig;\n children?: Node[];\n /** fields lane array: children are the repeatable zone. */\n zoned?: boolean;\n ui: PropUi;\n openMode?: OpenMode;\n showIf?: ShowIf;\n readOnly?: true | \"developer\";\n lockReason?: string;\n localized?: boolean;\n helpMore?: string;\n advanced?: boolean;\n recommendedMax?: number;\n placeholder?: string;\n fieldsetId?: string;\n}\n\n/** Keys every type keeps, including a field degraded to json. */\nconst COMMON_KEYS: ReadonlySet<string> = new Set([\n \"name\", \"title\", \"type\", \"description\", \"helpMore\", \"initialValue\", \"validation\", \"fieldset\", \"group\", \"hidden\", \"readOnly\",\n \"access\", \"lockReason\", \"advanced\", \"localized\", \"ai\", \"placeholder\",\n]);\n\ntype Shape =\n | { kind: \"leaf\"; type: string }\n | { kind: \"object\"; type: string }\n | { kind: \"zones\"; type: string; item: FieldSchema }\n | { kind: \"itemType\"; type: \"array\"; item: FieldSchema; itemType: ListItemType }\n | { kind: \"refs\"; type: \"multi-reference\"; item: FieldSchema }\n /** fields lane: several object item types, each its own block model */\n | { kind: \"modular\"; type: \"modular\"; items: FieldSchema[] }\n | { kind: \"json\"; type: \"json\"; feature: LossyFeature };\n\nfunction shapeOf(f: FieldSchema, lv: number, ctx: Ctx, top: boolean): Shape {\n const props = ctx.lane === \"props\";\n const deep = lv >= MAX_FIELD_DEPTH;\n const of = Array.isArray(f.of) ? f.of : undefined;\n /** a prop reference needs a content model to point at (refTargetNamed): with none it is stored as json */\n const noEntry = (r: FieldSchema[\"reference\"]) => props && !(r?.to ?? []).some(ENTRY_TARGET);\n switch (f.type) {\n case \"object\":\n return deep ? { kind: \"json\", type: \"json\", feature: \"depth>10\" } : { kind: \"object\", type: \"object\" };\n case \"array\": {\n if (of && of.length > 1 && !props && of.every((i) => i.type === \"object\")) return { kind: \"modular\", type: \"modular\", items: of };\n if (!of || of.length !== 1) return { kind: \"json\", type: \"json\", feature: of ? \"type:polymorphic-array\" : \"type:slot\" };\n const item = of[0];\n if (item.type === \"object\") return deep ? { kind: \"json\", type: \"json\", feature: \"depth>10\" } : { kind: \"zones\", type: props ? \"table\" : \"array\", item };\n if (item.type === \"reference\")\n return noEntry(item.reference) ? { kind: \"json\", type: \"json\", feature: \"reference target\" } : { kind: \"refs\", type: \"multi-reference\", item };\n const prim = PRIM_ITEM[item.type];\n if (prim) return { kind: \"itemType\", type: \"array\", item, itemType: prim };\n return { kind: \"json\", type: \"json\", feature: \"type:primitive-array\" };\n }\n case \"slot\":\n return { kind: \"json\", type: \"json\", feature: \"type:slot\" };\n case \"table\":\n // a component prop holds ONE TableValue as a `table` prop with config.mode \"data\" (BE prop-fields isDataTable);\n // a content-model field has no such type yet, so there it stays json\n return props ? { kind: \"leaf\", type: \"table\" } : { kind: \"json\", type: \"json\", feature: \"type:table\" };\n case \"reference\":\n if (props && top && f.reference?.to?.length === 1 && f.reference.to[0] === \"form\" && !f.reference.filter) return { kind: \"leaf\", type: \"form\" };\n return noEntry(f.reference) ? { kind: \"json\", type: \"json\", feature: \"reference target\" } : { kind: \"leaf\", type: \"reference\" };\n default: {\n const t = props ? PROP_TYPE[f.type] : FIELD_TYPE[f.type];\n return t ? { kind: \"leaf\", type: t } : { kind: \"json\", type: \"json\", feature: \"unsupported key\" };\n }\n }\n}\n\nconst trunc = (ctx: Ctx, at: string, s: string, max: number, feature: LossyFeature) => {\n if (s.length <= max) return s;\n lose(ctx, at, feature);\n return s.slice(0, max);\n};\n\nfunction convertField(f: FieldSchema, at: string, lv: number, ctx: Ctx, siblings: FieldSchema[], top: boolean, inTable = false): Node {\n const props = ctx.lane === \"props\";\n const shape = shapeOf(f, lv, ctx, top);\n const node: Node = { key: f.name, label: f.title, type: shape.type, config: {}, ui: {} };\n // a key is the value's address: a second sibling of the same name gets its own\n const twins = siblings.slice(0, Math.max(0, siblings.indexOf(f))).filter((s) => s.name === f.name).length;\n if (twins) {\n node.key = `${f.name}_${twins + 1}`;\n lose(ctx, `${at}/name`, \"duplicate name\");\n }\n const nesting = shape.kind === \"object\" || shape.kind === \"zones\";\n /** a list of items (objects, block models, scalars or entries): ui.itemLabel names one item */\n const listy = shape.kind === \"zones\" || shape.kind === \"modular\" || shape.kind === \"itemType\" || shape.kind === \"refs\";\n const looseConfig = props || !STRICT_CONFIG.has(shape.type);\n if (shape.kind === \"json\") lose(ctx, `${at}/type`, shape.feature);\n if (!props && f.type === \"url\") node.config.inputType = \"url\";\n if (shape.type === \"datetime\" && !props) node.config.includeTime = true;\n if (shape.kind === \"leaf\" && shape.type === \"table\") node.config.mode = \"data\";\n if (listy) {\n // the noun wins (it is what the dock's add button and crumbs say); with none, the item title, when the convention\n // (the field title's singular) would not read it back\n const label =\n f.itemNoun !== undefined\n ? capitalize(f.itemNoun)\n : shape.kind === \"zones\" && shape.item.title !== conventionItem(f.name, f.title).title\n ? shape.item.title\n : undefined;\n if (label !== undefined && label.length <= ITEM_LABEL_MAX) node.ui.itemLabel = label;\n }\n // the enforced developer lock: only schema managers change it, and the lock says why\n const devLock = f.access?.edit === \"schema.manage\" && !!f.lockReason;\n\n for (const k of Object.keys(f) as (keyof FieldSchema)[]) {\n const v = f[k];\n if (v === undefined) continue;\n const p = `${at}/${k}`;\n if (shape.kind === \"json\" && !COMMON_KEYS.has(k)) {\n lose(ctx, p, shape.feature);\n continue;\n }\n switch (k) {\n case \"name\":\n case \"title\":\n case \"type\":\n break;\n case \"description\":\n node.helpText = trunc(ctx, p, f.description!, props ? PROP_HELP_MAX : FIELD_HELP_MAX, \"help>limit\");\n break;\n case \"helpMore\":\n node.helpMore = trunc(ctx, p, f.helpMore!, HELP_MORE_MAX, \"help>limit\");\n break;\n case \"placeholder\":\n if (props) node.placeholder = trunc(ctx, p, f.placeholder!, PROP_PLACEHOLDER_MAX, \"help>limit\");\n else if (looseConfig) node.placeholder = f.placeholder;\n // a strict config has no room for one: the field's ui.placeholder holds it\n else node.ui.placeholder = trunc(ctx, p, f.placeholder!, UI_PLACEHOLDER_MAX, \"help>limit\");\n break;\n case \"initialValue\":\n // a definition holds no reference default (reference_in_definition): the host seeds it into the placement\n if (props && (shape.type === \"reference\" || shape.type === \"multi-reference\")) cat(ctx, p, \"seeded instance\");\n else node.defaultValue = defaultToProd(f, shape, f.initialValue, p, ctx, lv, top);\n break;\n case \"validation\":\n validationToProd(f, shape, node, p, ctx, inTable, top);\n break;\n case \"options\":\n optionsToProd(f, shape, node, p, ctx);\n break;\n case \"layout\":\n layoutToProd(f, shape, node, p, ctx);\n break;\n case \"fields\":\n if (shape.kind === \"object\") node.children = f.fields!.map((c, i) => convertField(c, `${p}/${i}`, lv + 1, ctx, f.fields!, false));\n else lose(ctx, p, \"unsupported key\");\n break;\n case \"of\":\n ofToProd(f, shape, node, p, lv, ctx);\n break;\n case \"openMode\":\n if (nesting) node.openMode = f.openMode;\n else lose(ctx, p, \"openMode\");\n break;\n case \"preview\":\n if (shape.kind === \"object\") node.ui.preview = previewToProd(f.preview!, f.fields ?? [], p, ctx);\n else lose(ctx, p, \"unsupported key\");\n break;\n case \"fieldset\":\n case \"group\":\n break; // placement is decided below, with both keys in view\n case \"hidden\":\n if (typeof f.hidden === \"boolean\") node.ui.hidden = f.hidden;\n else {\n const showIf = conditionToShowIf(f.hidden!, p, siblings, ctx, props && top);\n if (showIf) node.showIf = showIf;\n }\n break;\n case \"readOnly\":\n // a developer lock already holds readOnly (\"developer\"); a plain flag cannot sit beside it\n if (f.readOnly === true && !devLock) node.readOnly = true;\n else lose(ctx, p, \"access\");\n break;\n case \"access\": {\n const access: NonNullable<FieldUi[\"access\"]> = {};\n for (const [ak, av] of Object.entries(f.access!)) {\n if (av === undefined) continue;\n if (ak === \"view\" && av === \"schema.view\") access.view = av;\n else if (ak === \"edit\" && av === \"schema.manage\") access.edit = av;\n else lose(ctx, `${p}/${ak}`, \"access\");\n }\n if (Object.keys(access).length) node.ui.access = access;\n if (devLock) node.readOnly = \"developer\";\n break;\n }\n case \"lockReason\":\n node.lockReason = trunc(ctx, p, f.lockReason!, LOCK_REASON_MAX, \"help>limit\");\n break;\n case \"localized\":\n node.localized = f.localized;\n break;\n case \"advanced\":\n node.advanced = f.advanced;\n break;\n case \"ai\":\n cat(ctx, p, \"ai\");\n break;\n case \"reference\":\n if (shape.kind === \"leaf\" && shape.type === \"reference\") referenceToConfig(f.reference!, node, p, ctx);\n else if (shape.type !== \"form\") lose(ctx, p, \"unsupported key\");\n break;\n case \"numeric\":\n numericToProd(f, node, p, ctx);\n break;\n case \"scale\":\n if (shape.type === \"number\") scaleToConfig(f.scale!, node, p, ctx);\n else lose(ctx, p, \"unsupported key\");\n break;\n case \"icon\": {\n const dock = shape.kind === \"object\" || shape.kind === \"modular\" ? dockIconOf(f.icon) : undefined;\n if (dock) node.ui.icon = dock;\n else lose(ctx, p, \"icon\");\n break;\n }\n case \"rows\":\n if ((shape.type === \"text\" || shape.type === \"longtext\") && isWhole(f.rows, 1, UI_ROWS_MAX)) node.ui.rows = f.rows;\n else lose(ctx, p, \"rows\");\n break;\n case \"synced\": {\n const from = f.synced!.from;\n const ok = typeof from === \"string\" && from === from.trim() && from.length >= 1 && from.length <= SYNCED_FROM_MAX && Object.keys(f.synced!).every((x) => x === \"from\");\n if (ok) node.ui.synced = { from };\n else lose(ctx, p, \"synced\");\n break;\n }\n case \"slotSettings\":\n lose(ctx, p, \"slotSettings\");\n break;\n case \"itemNoun\":\n // what the read side derives: the item label in lower case\n if (!listy || node.ui.itemLabel?.toLowerCase() !== f.itemNoun) lose(ctx, p, \"itemNoun\");\n break;\n case \"arrayLayout\":\n if (shape.kind === \"zones\" || shape.kind === \"modular\") node.ui.layout = f.arrayLayout;\n // a list of scalars or entries has no grid: its tiles are a gallery (V2 arrayLayout \"grid\" on a multi-reference)\n else if ((shape.kind === \"itemType\" || shape.kind === \"refs\") && f.arrayLayout === \"grid\") node.ui.layout = \"gallery\";\n else lose(ctx, p, \"layout\");\n break;\n case \"valueShape\":\n if (shape.type === \"link\" || shape.type === \"image\" || shape.type === \"button\") node.ui.valueShape = f.valueShape;\n else lose(ctx, p, \"valueShape\");\n break;\n case \"timezone\":\n if (shape.type === \"date\" || shape.type === \"datetime\") {\n const tz = f.timezone;\n const zone = typeof tz === \"boolean\" || tz === \"site\" ? tz : typeof tz === \"string\" && tz.startsWith(\"fixed:\") && isZone(tz.slice(6)) ? tz.slice(6) : undefined;\n if (zone !== undefined) node.config.timezone = zone;\n else lose(ctx, p, \"timezone\");\n } else lose(ctx, p, \"unsupported key\");\n break;\n case \"language\":\n if (shape.type === \"code\" && typeof f.language === \"string\") node.config.language = f.language;\n else lose(ctx, p, \"unsupported key\");\n break;\n case \"languages\":\n if (shape.type === \"code\" && Array.isArray(f.languages) && f.languages.every((l) => typeof l === \"string\")) node.config.languages = [...f.languages];\n else lose(ctx, p, \"unsupported key\");\n break;\n case \"table\":\n if (shape.kind === \"leaf\" && shape.type === \"table\") Object.assign(node.config, tableConfigFromOptions(f.table));\n else lose(ctx, p, \"type:table\");\n break;\n default:\n lose(ctx, p, \"unsupported key\");\n }\n }\n // the item title kept as ui.itemLabel reads back as the noun too: the one the engine falls back to with none\n if (f.itemNoun === undefined && shape.kind === \"zones\" && node.ui.itemLabel !== undefined) cat(ctx, `${at}/itemNoun`, \"itemNoun (derived)\");\n placeInSet(f, node, at, ctx, top, siblings);\n if (node.ui.control === \"slider\" && !sliderOk(node.config)) {\n delete node.ui.control;\n lose(ctx, `${at}/layout`, \"layout\");\n }\n return node;\n}\n\nconst isWhole = (n: unknown, lo = 0, hi = Infinity): n is number => typeof n === \"number\" && Number.isInteger(n) && n >= lo && n <= hi;\nconst compiles = (re: string) => {\n try {\n new RegExp(re);\n return true;\n } catch {\n return false;\n }\n};\n\nconst ratingIsDefault = (c: FieldConfig) => c.min === RATING_CONFIG.min && c.max === RATING_CONFIG.max && c.step === RATING_CONFIG.step;\n\n/** Backend controlHardening: a slider spans min < max; a set step is > 0 with at most SLIDER_MAX_STOPS stops. */\nfunction sliderOk({ min, max, step }: FieldConfig) {\n if (!(typeof min === \"number\" && typeof max === \"number\" && min < max)) return false;\n return step === undefined || (typeof step === \"number\" && step > 0 && (max - min) / step <= SLIDER_MAX_STOPS);\n}\n\n/** Where a field sits: its tab (fields lane) or prop group (props lane). */\nfunction placeInSet(f: FieldSchema, node: Node, at: string, ctx: Ctx, top: boolean, siblings: FieldSchema[]) {\n if (ctx.lane === \"props\") {\n if (f.group !== undefined) lose(ctx, `${at}/group`, \"group (props)\");\n if (f.fieldset === undefined) return;\n const set = ctx.propSets.get(f.fieldset);\n if (!set) return lose(ctx, `${at}/fieldset`, \"fieldset collision\");\n // prop groups are defined among siblings (propGroupIssues runs per level): the first member at each level defines it\n let defined = ctx.definedGroups.get(siblings);\n if (!defined) ctx.definedGroups.set(siblings, (defined = new Set()));\n if (defined.has(set.name)) node.ui.group = { id: set.name };\n else {\n defined.add(set.name);\n node.ui.group = propGroupOf(set, ctx);\n }\n return;\n }\n const set = f.fieldset !== undefined && ctx.sets.has(f.fieldset) ? f.fieldset : undefined;\n if (f.fieldset !== undefined && !set) lose(ctx, `${at}/fieldset`, \"fieldset collision\");\n if (!top) {\n if (f.group !== undefined) lose(ctx, `${at}/group`, \"group (nested)\");\n if (set) node.fieldsetId = set;\n return;\n }\n const tab = set ? ctx.sets.get(set) : undefined;\n if (f.group !== undefined && !ctx.tabs.has(f.group)) lose(ctx, `${at}/group`, ctx.droppedTabs.get(f.group) ?? \"unsupported key\");\n else if (set && tab !== f.group) lose(ctx, `${at}/group`, \"fieldset spans groups\");\n node.fieldsetId = set ?? (f.group !== undefined && ctx.tabs.has(f.group) ? f.group : undefined);\n}\n\n/** A V2 fieldset as the inline prop group its first member defines (what propSetsFor found unstorable is named there). */\nfunction propGroupOf(s: V2Fieldset, ctx: Ctx): PropGroup {\n const g: PropGroup = { id: s.name, label: s.title.slice(0, PROP_GROUP_LABEL_MAX), kind: \"group\" };\n if (s.collapsed !== undefined) g.collapsed = s.collapsed;\n if (groupDescriptionOk(s.description)) g.description = s.description;\n if (s.columns !== undefined) g.columns = s.columns;\n if (s.collapsible !== undefined) g.collapsible = s.collapsible;\n if (s.layout !== undefined) g.layout = s.layout;\n if (ctx.groupOrder) g.order = Math.min(PROP_GROUP_ORDER_MAX, (ctx.propOrder.get(s.name) ?? 0));\n return g;\n}\nconst groupDescriptionOk = (d: string | undefined): d is string => typeof d === \"string\" && d === d.trim() && d.length >= 1 && d.length <= PROP_GROUP_DESCRIPTION_MAX;\n\n/** The zone a datetime field fixes, if any (what lets a stored instant read back with its [Zone]). */\nconst fixedZone = (f: FieldSchema) => (typeof f.timezone === \"string\" && f.timezone.startsWith(\"fixed:\") ? f.timezone.slice(6) : undefined);\n\n/**\n * A field default: forward through the value adapters, then read back the way toTypeSchema will; every leaf that does\n * not come back is named (so the lossy list matches what the read side really returns). Objects and list rows go\n * through their child fields' adapters too.\n */\nfunction defaultToProd(f: FieldSchema, shape: Shape, v: unknown, at: string, ctx: Ctx, lv: number, top: boolean): unknown {\n const plan = writePlan(f, shape, lv, ctx, top);\n const out = planToProd(plan, v);\n for (const d of diffPaths(v, planFromProd(plan, out))) lose(ctx, `${at}${d}`, \"default value\");\n return out;\n}\n\n/** How a value of one field crosses to prod and back: per-type adapters, recursing through objects and list rows. */\nexport type ValuePlan = VPlan;\ntype VPlan =\n | { k: \"link\" | \"button\" | \"image\" | \"form\" | \"ref\" | \"refs\" | \"number\" | \"video\" | \"as-is\" }\n | { k: \"datetime\"; zone?: string }\n /** a date: passes as stored; only an unreadable stored shape is named */\n | { k: \"date\" }\n /** a list of one primitive (config.itemType): each item through its type's adapter */\n | { k: \"list\"; item: ListItemType }\n /** a number with a V2 scale: a number, a token string or a custom { value, unit } */\n | { k: \"scale\"; scale: ScaleSchema }\n | { k: \"rating\"; scale: RatingScale }\n | { k: \"object\"; fields: Map<string, VPlan> }\n | { k: \"rows\"; zoned: boolean; fields: Map<string, VPlan> }\n /** modular rows: V2 {_key, _type, ...fields} ↔ prod {__id, __type (block slug), data}; item type name → its fields' plans */\n | { k: \"modular\"; types: Map<string, Map<string, VPlan>> };\nconst AS_IS: VPlan = { k: \"as-is\" };\n\n/** The write side's plan, from the V2 field and the shape it is stored as. */\nfunction writePlan(f: FieldSchema, shape: Shape, lv: number, ctx: Ctx, top: boolean): VPlan {\n const kids = (fields: FieldSchema[]) => new Map(fields.map((c) => [c.name, writePlan(c, shapeOf(c, lv + 1, ctx, false), lv + 1, ctx, false)] as const));\n switch (shape.kind) {\n case \"json\":\n return AS_IS;\n case \"itemType\":\n return shape.itemType === \"image\" || shape.itemType === \"link\" ? { k: \"list\", item: shape.itemType } : AS_IS;\n case \"object\":\n return { k: \"object\", fields: kids(f.fields ?? []) };\n case \"zones\":\n return { k: \"rows\", zoned: ctx.lane === \"fields\", fields: kids(shape.item.fields ?? []) };\n case \"modular\": {\n // an item type's fields are top-level fields of its own block model\n const top1 = (fields: FieldSchema[]) => new Map(fields.map((c) => [c.name, writePlan(c, shapeOf(c, 1, ctx, false), 1, ctx, false)] as const));\n return { k: \"modular\", types: new Map(shape.items.map((i) => [i.name, top1(i.fields ?? [])] as const)) };\n }\n case \"refs\":\n return { k: \"refs\" };\n case \"leaf\":\n if (f.type === \"link\" || f.type === \"url\") return { k: \"link\" };\n if (f.type === \"button\" || f.type === \"image\") return { k: f.type };\n if (f.type === \"datetime\") return { k: \"datetime\", zone: fixedZone(f) };\n if (f.type === \"reference\") return { k: top && shape.type === \"form\" ? \"form\" : \"ref\" };\n return leafPlan(f, shape.type);\n }\n}\n\n/** The plan of a leaf whose value needs its own adapter but no link / reference handling (both directions agree). */\nfunction leafPlan(f: FieldSchema, prodType: string): VPlan {\n if (f.type === \"video\") return { k: \"video\" };\n if (f.type === \"rating\") return { k: \"rating\", scale: { min: f.numeric?.min, max: f.numeric?.max, step: f.numeric?.step } };\n if (f.type === \"number\" && f.scale) return { k: \"scale\", scale: f.scale };\n return prodType === \"number\" ? { k: \"number\" } : AS_IS;\n}\n\n/**\n * The read side's plan, from the V2 field read back (`zoned`: lists read from an array's repeatable zone; `modular`:\n * lists read from a modular field, whose item fields live in their block models and pass as stored).\n */\nfunction readPlan(f: FieldSchema, prodType: string, zoned: WeakSet<FieldSchema>, modular: WeakSet<FieldSchema>): VPlan {\n const kids = (fields: FieldSchema[]) => new Map(fields.map((c) => [c.name, readPlan(c, \"\", zoned, modular)] as const));\n switch (f.type) {\n case \"link\":\n case \"url\":\n return { k: \"link\" };\n case \"button\":\n case \"image\":\n return { k: f.type };\n case \"datetime\":\n return { k: \"datetime\", zone: fixedZone(f) };\n case \"date\":\n return { k: \"date\" };\n case \"reference\":\n return { k: prodType === \"form\" ? \"form\" : \"ref\" };\n case \"object\":\n return { k: \"object\", fields: kids(f.fields ?? []) };\n case \"array\": {\n if (modular.has(f)) return { k: \"modular\", types: new Map((Array.isArray(f.of) ? f.of : []).map((i) => [i.name, kids(i.fields ?? [])] as const)) };\n const item = Array.isArray(f.of) && f.of.length === 1 ? f.of[0] : undefined;\n if (item?.type === \"object\") return { k: \"rows\", zoned: zoned.has(f), fields: kids(item.fields ?? []) };\n if (item?.type === \"image\" || item?.type === \"link\") return { k: \"list\", item: item.type };\n return item?.type === \"reference\" ? { k: \"refs\" } : AS_IS;\n }\n default:\n return leafPlan(f, prodType);\n }\n}\n\n/**\n * The plan for ONE leaf field read from prod type `prodType` (a link, an image, a reference…), for a host that edits a\n * single field's value outside a whole read (the dock's legacy controls). Objects and lists need the read's own plan\n * (`ToTypeSchemaOptions.plans`), which knows which lists are zoned or modular.\n */\nexport function leafValuePlan(f: FieldSchema, prodType: string): ValuePlan {\n return readPlan(f, prodType, new WeakSet(), new WeakSet());\n}\n\n/**\n * A V2 value → what prod stores. `lost` (optional) collects every V2 key prod cannot keep, as a path under the value\n * (\"cta/style\", \"(value)\" for the value itself): a caller that finds any must refuse the write and name them.\n */\nexport function planToProd(plan: ValuePlan, v: unknown, lost?: string[], at = \"\"): unknown {\n if (v === undefined) return undefined;\n const take = <T,>(r: { value: T; lost: string[] }) => {\n if (lost) for (const l of r.lost) lost.push(at ? `${at}/${l}` : l);\n return r.value;\n };\n const under = (k: string | number) => (at ? `${at}/${k}` : String(k));\n switch (plan.k) {\n case \"link\":\n return take(linkToProd(v as V2LinkValue));\n case \"button\":\n return take(buttonToProd(v as V2ButtonValue));\n case \"image\":\n return take(imageToProd(v as V2ImageValue));\n case \"datetime\":\n return take(datetimeToProd(v as string, { zone: plan.zone }));\n case \"form\":\n return take(referenceToProd(v as string, { to: \"form\" }));\n case \"ref\":\n case \"refs\":\n return take(referenceToProd(v as string | string[]));\n case \"number\":\n if (typeof v === \"number\" || v === null) return v;\n lost?.push(at || \"(value)\");\n return undefined;\n case \"video\":\n return take(videoToProd(v as V2VideoValue));\n case \"list\":\n return take(listToProd(v as unknown[], plan.item));\n case \"scale\":\n return take(scaleToProd(v as ScaleValue, plan.scale));\n case \"rating\":\n return take(ratingToProd(v as number, plan.scale));\n case \"object\":\n return mapKeys(v, plan.fields, (p, x, k) => planToProd(p, x, lost, under(k)));\n case \"rows\": {\n if (!Array.isArray(v)) return v;\n const rows = v.map((row, i) => mapKeys(row, plan.fields, (p, x, k) => planToProd(p, x, lost, `${under(i)}/${k}`)));\n return plan.zoned ? zoneListToProd(rows) : rows;\n }\n case \"modular\":\n if (!Array.isArray(v)) return v;\n return v.map((row, i) => {\n if (!isObj(row) || typeof row._type !== \"string\") return row;\n const { _key, _type, ...rest } = row;\n const fields = plan.types.get(_type);\n // __id is required (the reorder identity): a row with no _key gets one, which reads back as a new _key\n return {\n __id: typeof _key === \"string\" && _key ? _key : `${kebab(_type)}-${i + 1}`,\n __type: kebab(_type),\n data: fields ? mapKeys(rest, fields, (p, x, k) => planToProd(p, x, lost, `${under(i)}/${k}`)) : rest,\n };\n });\n default:\n return v;\n }\n}\n\n/** The keys the kit reads back from a stored image object (imageFromProd) and writes again (imageToProd). */\nconst IMAGE_KIT_KEYS: ReadonlySet<string> = new Set([\"url\", \"id\", \"name\", \"altText\", \"focal\"]);\n\n/** Every key of a stored image the kit cannot hand back: a crop (read back only with the asset's pixel size) or a key it does not model. */\nfunction imageStoredLoss(v: unknown, rel: string, loss: (rel: string, reason: string) => void) {\n if (!isObj(v)) return;\n for (const [k, x] of Object.entries(v)) {\n if (IMAGE_KIT_KEYS.has(k) || x === undefined) continue;\n if (k === \"crop\") {\n if (x != null) loss(`${rel}/crop`, \"A saved crop is not read back by the kit; editing the image would drop it.\");\n } else loss(`${rel}/${k}`, `The image's saved \"${k}\" is not kept by the kit; editing the image would drop it.`);\n }\n}\n\nconst datedLossReason = (v: unknown) =>\n isObj(v) && (\"date\" in v || \"time\" in v || \"timezone\" in v)\n ? \"A stored date-time in the older {date,time,timezone} form; the kit can't read it, so editing it would replace it.\"\n : \"A stored date/time that is not an ISO string can't be read by the kit; editing it would replace it.\";\n\n/** A stored prod value → the V2 value. `loss(rel, reason)`: what the prod value carries that the V2 value cannot (rel is\n * under the value, \"/0/modelSlug\"); a caller that hears any must not write the value back through V2. */\nexport function planFromProd(plan: ValuePlan, v: unknown, loss?: (rel: string, reason: string) => void, rel = \"\"): unknown {\n if (v === undefined) return undefined;\n switch (plan.k) {\n case \"link\":\n return linkFromProd(v);\n case \"button\":\n return buttonFromProd(v);\n case \"image\":\n if (loss) imageStoredLoss(v, rel, loss);\n return imageFromProd(v);\n case \"datetime\":\n case \"date\":\n // an older stored shape ({date, time, timezone}) reads as empty: the next pick would silently replace it\n if (loss && v !== null && typeof v !== \"string\") loss(rel || \"(value)\", datedLossReason(v));\n return plan.k === \"date\" ? v : datetimeFromProd(v, { zone: plan.zone });\n case \"video\":\n return videoFromProd(v);\n case \"list\":\n if (loss && plan.item === \"image\" && Array.isArray(v)) v.forEach((x, i) => imageStoredLoss(x, `${rel}/${i}`, loss));\n return listFromProd(v, plan.item);\n case \"scale\":\n return scaleFromProd(v);\n case \"rating\":\n return ratingFromProd(v, plan.scale);\n case \"form\":\n return referenceFromProd(v);\n case \"ref\":\n case \"refs\":\n if (loss) for (const [i, x] of (Array.isArray(v) ? v : [v]).entries())\n if (isObj(x) && x.modelSlug !== undefined) loss(`${rel}${Array.isArray(v) ? `/${i}` : \"\"}/modelSlug`, \"A V2 reference stores the target id; the polymorphic modelSlug is dropped.\");\n // a stored target the kit cannot read (a { kind, id } page / collection ref) would read as empty and drop on save\n else if (isObj(x) && referenceFromProd(x) === null) loss(`${rel}${Array.isArray(v) ? `/${i}` : \"\"}` || \"(value)\", \"A stored reference the kit can't read; editing it would drop it.\");\n return referenceFromProd(v);\n case \"object\":\n return mapKeys(v, plan.fields, (p, x, k) => planFromProd(p, x, loss, `${rel}/${k}`));\n case \"rows\": {\n const rows = plan.zoned ? zoneListFromProd(v) : v;\n return Array.isArray(rows) ? rows.map((row, i) => mapKeys(row, plan.fields, (p, x, k) => planFromProd(p, x, loss, `${rel}/${i}/${k}`))) : rows;\n }\n case \"modular\":\n return Array.isArray(v)\n ? v.map((row, i) => {\n if (!isObj(row) || typeof row.__type !== \"string\") return row;\n const data = isObj(row.data) ? row.data : {};\n const fields = plan.types.get(camel(row.__type));\n const back = fields ? (mapKeys(data, fields, (p, x, k) => planFromProd(p, x, loss, `${rel}/${i}/${k}`)) as Obj) : data;\n return { _key: row.__id, _type: camel(row.__type), ...back };\n })\n : v;\n default:\n return v;\n }\n}\n\n/** Each key of an object value through its child field's plan; keys with no field ride along as they are. */\nfunction mapKeys(v: unknown, fields: Map<string, VPlan>, fn: (plan: VPlan, x: unknown, key: string) => unknown): unknown {\n if (!isObj(v)) return v;\n const out: Obj = {};\n for (const [k, x] of Object.entries(v)) {\n const plan = fields.get(k);\n const y = plan ? fn(plan, x, k) : x;\n if (y !== undefined) out[k] = y;\n }\n return out;\n}\n\n/** Every leaf (a JSON pointer under the value, \"\" for the value itself) where `a` and `b` differ; undefined = absent. */\nfunction diffPaths(a: unknown, b: unknown, path = \"\", out: string[] = []): string[] {\n if (deepEqual(a, b)) return out;\n if ((isObj(a) || a === undefined) && (isObj(b) || b === undefined) && (a !== undefined || b !== undefined)) {\n const A = (a ?? {}) as Obj;\n const B = (b ?? {}) as Obj;\n for (const k of new Set([...Object.keys(A), ...Object.keys(B)])) diffPaths(A[k], B[k], `${path}/${k}`, out);\n } else if (Array.isArray(a) && Array.isArray(b)) {\n for (let i = 0; i < Math.max(a.length, b.length); i++) diffPaths(a[i], b[i], `${path}/${i}`, out);\n } else out.push(path);\n return out;\n}\n\nfunction validationToProd(f: FieldSchema, shape: Shape, node: Node, at: string, ctx: Ctx, inTable: boolean, top: boolean) {\n const props = ctx.lane === \"props\";\n const val = f.validation!;\n const t = shape.type;\n const leaf = shape.kind === \"leaf\";\n const lengthy = leaf && (props ? LENGTH_PROPS : LENGTH_FIELDS).has(t);\n const patterned = leaf && (props ? PATTERN_TYPES : LENGTH_FIELDS).has(t) && t !== \"richtext\" && t !== \"document\";\n const patternOk = patterned && typeof val.pattern === \"string\" && val.pattern.length <= PATTERN_MAX && compiles(val.pattern);\n /** the pair each key bounds, so a min over its max is named rather than refused at save */\n const pairs: [string, string, string, string, LossyFeature][] = [];\n const set = (key: string, n: number, feature: LossyFeature, lo: string, hi: string) => {\n node.config[key] = n;\n if (!pairs.some((x) => x[0] === lo)) pairs.push([lo, hi, `${at}/min`, `${at}/max`, feature]);\n };\n for (const k of Object.keys(val) as (keyof typeof val)[]) {\n const v = val[k];\n if (v === undefined) continue;\n const p = `${at}/${k}`;\n if (shape.kind === \"json\" && k !== \"required\" && k !== \"recommendedMax\") {\n lose(ctx, p, shape.feature);\n continue;\n }\n switch (k) {\n case \"required\":\n node.required = val.required;\n break;\n case \"min\":\n case \"max\": {\n const n = v as number;\n const lo = k === \"min\";\n if (lengthy) {\n if (isWhole(n)) set(lo ? \"minLength\" : \"maxLength\", n, \"validation.length\", \"minLength\", \"maxLength\");\n else lose(ctx, p, \"validation.length\");\n } else if (t === \"number\") {\n // V2 validation.min / max are the error bounds; config.min / max stay the input's range (numeric)\n const b = ((node.config.validation as { min?: number; max?: number } | undefined) ??= {});\n b[k] = n;\n } else if (t === \"rating\") lose(ctx, p, \"rating bounds\");\n else if (shape.kind === \"zones\" || shape.kind === \"modular\" || shape.kind === \"itemType\") {\n // a prop's own config.minItems / maxItems are capped like a multiple slot's (SLOT_ITEMS_CAP)\n const ok = props && top ? isWhole(n, lo ? 0 : 1, SLOT_ITEMS_CAP) : isWhole(n);\n if (ok) set(lo ? \"minItems\" : \"maxItems\", n, \"validation.items\", \"minItems\", \"maxItems\");\n else lose(ctx, p, \"validation.items\");\n } else if (shape.kind === \"refs\" || t === \"multiselect\" || t === \"tags\") {\n const ok = t === \"tags\" ? isWhole(n, lo ? 0 : 1, TAGS_ITEMS_MAX) : isWhole(n);\n if (ok) set(k, n, \"validation.items\", \"min\", \"max\");\n else lose(ctx, p, \"validation.items\");\n } else lose(ctx, p, \"validation.length\");\n break;\n }\n case \"recommendedMax\":\n if (isWhole(v, 1)) node.recommendedMax = v as number;\n else lose(ctx, p, \"validation.recommendedMax\");\n break;\n case \"pattern\":\n if (patternOk) node.config.pattern = v as string;\n else lose(ctx, p, \"validation.pattern\");\n break;\n case \"patternMessage\":\n if (patternOk && typeof v === \"string\" && v.trim() !== \"\" && v.length <= PATTERN_MESSAGE_MAX) node.config.patternMessage = v;\n else lose(ctx, p, \"validation.patternMessage\");\n break;\n case \"unique\": {\n if (val.unique === false) node.unique = false;\n else if (props) {\n // a placement holds its own value: only a list's items, or a table's rows, have a set to be unique in\n if (UNIQUE_LIST_PROPS.has(t) || (inTable && UNIQUE_ROW_PROPS.has(t))) node.unique = true;\n else cat(ctx, p, \"not applicable (props)\");\n } else {\n const polymorphic = t === \"reference\" && (f.reference?.to ?? []).filter(ENTRY_TARGET).length > 1;\n if (UNIQUE_TYPES.has(t) && !polymorphic) node.unique = true;\n else lose(ctx, p, \"validation.unique\");\n }\n break;\n }\n default:\n lose(ctx, p, \"unsupported key\");\n }\n }\n const b = node.config.validation as { min?: number; max?: number } | undefined;\n if (b && b.min !== undefined && b.max !== undefined && b.min > b.max) {\n delete node.config.validation;\n lose(ctx, `${at}/min`, \"validation.items\");\n lose(ctx, `${at}/max`, \"validation.items\");\n }\n for (const [lo, hi, pLo, pHi, feature] of pairs) {\n const a = node.config[lo];\n const z = node.config[hi];\n if (typeof a === \"number\" && typeof z === \"number\" && a > z) {\n delete node.config[lo];\n delete node.config[hi];\n lose(ctx, pLo, feature);\n lose(ctx, pHi, feature);\n }\n }\n}\n\nfunction optionsToProd(f: FieldSchema, shape: Shape, node: Node, at: string, ctx: Ctx) {\n if (shape.type !== \"select\" && shape.type !== \"multiselect\" && shape.type !== \"tags\") return lose(ctx, at, \"unsupported key\");\n const opts = f.options!;\n // option icons are all or none per list: one that is not a dock name drops the list's icons\n const icons = opts.map((o) => (o.icon === undefined ? undefined : dockIconOf(o.icon)));\n const allIcons = opts.every((o, i) => o.icon === undefined || icons[i] !== undefined);\n node.options = opts.map((o: Option, i) => {\n const out: ChoiceOption = { label: o.label, value: o.value };\n if (o.icon !== undefined) {\n if (allIcons) out.icon = icons[i];\n else lose(ctx, `${at}/${i}/icon`, \"option icon\");\n }\n const d = o.description;\n if (d !== undefined) {\n if (typeof d === \"string\" && d.trim() !== \"\" && !/[\\r\\n]/.test(d) && d.length <= OPTION_DESCRIPTION_MAX) out.description = d;\n else lose(ctx, `${at}/${i}/description`, \"option description\");\n }\n for (const k of Object.keys(o)) if (![\"value\", \"label\", \"icon\", \"description\"].includes(k)) lose(ctx, `${at}/${i}/${k}`, \"unsupported key\");\n return out;\n });\n}\n\n/** V2 layouts → prod ui.control (a leaf's control) or ui.layout (a list's rows); dock-vocabulary.ts controlHardening rules. */\nfunction layoutToProd(f: FieldSchema, shape: Shape, node: Node, at: string, ctx: Ctx) {\n const l = f.layout!;\n const t = shape.type;\n const n = f.options?.length ?? 0;\n if (l === \"segmented\" && t === \"select\") {\n if (n >= 2 && n <= 4) node.ui.control = \"segmented\";\n else if (n >= 5) {\n // the closest control prod keeps: every option at once while they fit a column, a dropdown past that\n node.ui.control = n <= 6 ? \"radio\" : \"dropdown\";\n lose(ctx, at, \"segmented>4\");\n } else lose(ctx, at, \"layout\");\n } else if (l === \"slider\" && t === \"number\" && f.type === \"number\") node.ui.control = \"slider\";\n else if ((UI_CONTROLS as readonly string[]).includes(l) && l !== \"segmented\" && l !== \"slider\" && CONTROL_TYPES[l as UiControl]?.includes(t)) node.ui.control = l as UiControl;\n else if (l === \"list\" && (shape.kind === \"zones\" || shape.kind === \"itemType\" || shape.kind === \"modular\" || shape.kind === \"refs\") && f.arrayLayout === undefined) node.ui.layout = \"rows\";\n else lose(ctx, at, \"layout\");\n}\n\n/** The prod type a V2 field is stored as, for a preview path reading into it (no loss is reported). */\nfunction storedType(f: FieldSchema, ctx: Ctx): string {\n const quiet: Ctx = { ...ctx, lossy: [], catalog: [] };\n return shapeOf(f, 1, quiet, false).type;\n}\n/** The V2 fields a preview path segment may name below `f` (an object's fields, a list's item fields), or null for a leaf. */\nfunction previewKids(f: FieldSchema): FieldSchema[] | null {\n if (f.type === \"object\") return f.fields ?? [];\n if (f.type === \"array\" && Array.isArray(f.of) && f.of.length === 1 && f.of[0].type === \"object\") return f.of[0].fields ?? [];\n return null;\n}\n\n/**\n * A V2 preview path → the path prod stores (previewPathProblem): the first segment a child, each later one a child of the\n * node before it, or a key of an object-valued leaf (`image.alt` is stored `image.altText`). undefined: no prod form.\n */\nfunction previewPathToProd(path: string, children: FieldSchema[], ctx: Ctx): string | undefined {\n const segs = path.split(\".\");\n let node = children.find((c) => c.name === segs[0]);\n if (!node) return undefined;\n const out = [segs[0]];\n for (let i = 1; i < segs.length; i++) {\n const kids = previewKids(node);\n if (kids) {\n const next = kids.find((c) => c.name === segs[i]);\n if (!next) return undefined;\n out.push(segs[i]);\n node = next;\n continue;\n }\n const type = storedType(node, ctx);\n if (!OBJECT_VALUE_TYPES.has(type)) return undefined;\n const key = type === \"image\" ? (IMAGE_PATH_KEY[segs[i]] ?? segs[i]) : segs[i];\n if (LEAF_VALUE_KEYS[type] && !LEAF_VALUE_KEYS[type].includes(key)) return undefined;\n return [...out, key, ...segs.slice(i + 1)].join(\".\");\n }\n return out.join(\".\");\n}\n\nfunction previewToProd(pv: PreviewConfig, children: FieldSchema[], at: string, ctx: Ctx): UiPreview {\n const out: UiPreview = {};\n for (const k of Object.keys(pv) as (keyof PreviewConfig)[]) {\n const v = pv[k];\n if (v === undefined) continue;\n if (k === \"title\" || k === \"subtitle\" || k === \"media\") {\n const stored = previewPathToProd(v, children, ctx);\n if (stored !== undefined) out[k] = stored;\n else lose(ctx, `${at}/${k}`, \"preview path\");\n } else if (k === \"fallback\") {\n const t = v.trim();\n if (t && t === v && t.length <= PREVIEW_FALLBACK_MAX) out.fallback = v;\n else lose(ctx, `${at}/${k}`, \"help>limit\");\n } else if (k === \"icon\") {\n const dock = dockIconOf(v);\n if (dock) out.icon = dock;\n else lose(ctx, `${at}/${k}`, \"preview icon\");\n } else lose(ctx, `${at}/${k}`, \"unsupported key\");\n }\n return out;\n}\n\n/** A list item's name and title: the convention, else ui.itemName / ui.itemTitle (chromeUiProblems). */\nfunction itemIdentity(item: FieldSchema, conv: { name: string; title: string }, node: Node, ip: string, ctx: Ctx) {\n if (item.name !== conv.name) {\n if (ITEM_NAME_RE.test(item.name)) node.ui.itemName = item.name;\n else lose(ctx, `${ip}/name`, \"item identity\");\n }\n if (item.title !== conv.title) {\n const t = item.title;\n if (t === t.trim() && t.length >= 1 && t.length <= ITEM_TITLE_MAX) node.ui.itemTitle = t;\n else lose(ctx, `${ip}/title`, \"item identity\");\n }\n}\n\nfunction ofToProd(f: FieldSchema, shape: Shape, node: Node, at: string, lv: number, ctx: Ctx) {\n if (shape.kind === \"json\" || shape.kind === \"leaf\" || shape.kind === \"object\") return lose(ctx, at, \"unsupported key\");\n if (shape.kind === \"modular\") {\n // each item type is a kind:'block' model (returned in blockModels); the modular field stores its slug\n node.config.blockSlugs = shape.items.map((i) => kebab(i.name));\n shape.items.forEach((item, i) => blockModelFor(item, `${at}/${i}`, ctx, node));\n return;\n }\n const item = shape.item;\n const ip = `${at}/0`;\n if (shape.kind === \"zones\") {\n const fields = item.fields ?? [];\n node.zoned = true;\n // a prop table's sub-fields compare per row (unique), so they know they sit in one\n node.children = fields.map((c, i) => convertField(c, `${ip}/fields/${i}`, lv + 1, ctx, fields, false, ctx.lane === \"props\"));\n itemIdentity(item, conventionItem(f.name, f.title, node.ui.itemLabel), node, ip, ctx);\n for (const k of Object.keys(item) as (keyof FieldSchema)[]) {\n const v = item[k];\n if (v === undefined) continue;\n const p = `${ip}/${k}`;\n if (k === \"type\" || k === \"fields\" || k === \"name\" || k === \"title\") continue;\n if (k === \"preview\") node.ui.preview = previewToProd(item.preview!, fields, p, ctx);\n else if (k === \"icon\") {\n const dock = f.icon === undefined ? dockIconOf(item.icon) : undefined;\n if (dock) node.ui.icon = dock;\n else lose(ctx, p, \"item icon\");\n } else if (k === \"openMode\") cat(ctx, p, \"item openMode\");\n else lose(ctx, p, \"item identity\");\n }\n return;\n }\n // a primitive or reference item: prod keeps its type (and a reference's targets), its name and title, nothing else\n if (shape.kind === \"itemType\") node.config.itemType = shape.itemType;\n itemIdentity(item, conventionItem(f.name, f.title), node, ip, ctx);\n for (const k of Object.keys(item) as (keyof FieldSchema)[]) {\n const v = item[k];\n if (v === undefined) continue;\n const p = `${ip}/${k}`;\n if (k === \"name\" || k === \"title\") continue;\n if (k === \"type\") {\n if (shape.kind === \"itemType\" && item.type === \"text\") lose(ctx, p, \"item settings\");\n } else if (k === \"reference\" && shape.kind === \"refs\") referenceToConfig(item.reference!, node, p, ctx);\n else lose(ctx, p, \"item settings\");\n }\n}\n\n/**\n * A modular item type → the kind:'block' model its rows are stored against: the item title is the model name, its fields\n * the model's top-level fields. A block model holds only fields a block primitive renders; any other is not stored. The\n * item's icon and preview are how its rows read in THIS field: the field's ui.blocks, by slug.\n */\nfunction blockModelFor(item: FieldSchema, at: string, ctx: Ctx, list: Node) {\n const start = ctx.lossy.length;\n const startCat = ctx.catalog.length;\n const slug = kebab(item.name);\n // its own model: no tabs or sections of the model that uses it\n const sub: Ctx = { ...ctx, tabs: new Set(), droppedTabs: new Map(), sets: new Map() };\n const fields = item.fields ?? [];\n const kept: ContentModelField[] = [];\n const chrome: { icon?: DockIconName; preview?: UiPreview } = {};\n for (const k of Object.keys(item) as (keyof FieldSchema)[]) {\n const p = `${at}/${k}`;\n if (item[k] === undefined || k === \"type\" || k === \"title\") continue;\n if (k === \"name\") {\n if (camel(slug) !== item.name) lose(ctx, p, \"item identity\");\n } else if (k === \"fields\") {\n let dropped = false;\n let shifted = false;\n fields.forEach((c, j) => {\n const fp = `${p}/${j}`;\n const mark = ctx.lossy.length;\n const markCat = ctx.catalog.length;\n const node = convertField(c, fp, 1, sub, fields, false);\n if (BLOCK_FIELD_TYPES.has(node.type)) {\n kept.push(emitField(node));\n // a field left out before this one shifts it up a place: the list is not kept in its positions\n if (dropped && !shifted) {\n shifted = true;\n lose(ctx, p, \"block model field\");\n }\n return;\n }\n // the whole field is gone: one item names it\n ctx.lossy.length = mark;\n ctx.catalog.length = markCat;\n dropped = true;\n lose(ctx, fp, \"block model field\");\n });\n } else if (k === \"openMode\") cat(ctx, p, \"item openMode\");\n else if (k === \"icon\") {\n const dock = dockIconOf(item.icon);\n if (dock) chrome.icon = dock;\n else lose(ctx, p, \"item icon\");\n } else if (k === \"preview\") chrome.preview = previewToProd(item.preview!, fields, p, ctx);\n else lose(ctx, p, \"item identity\");\n }\n const model: ProdContentModel = { name: item.title, slug, kind: \"block\", fields: kept };\n const prev = ctx.blockModels.get(slug);\n const keep = () => {\n if (!nonEmpty(chrome) || list.ui.blocks?.[slug]) return;\n list.ui.blocks = { ...list.ui.blocks, [slug]: chrome };\n };\n if (!prev) {\n ctx.blockModels.set(slug, model);\n return keep();\n }\n if (deepEqual(prev, model)) return keep();\n // a second item type with this slug and other fields: the slug names the first one's model\n ctx.lossy.length = start;\n ctx.catalog.length = startCat;\n lose(ctx, at, \"duplicate name\");\n}\n\nfunction referenceToConfig(ref: NonNullable<FieldSchema[\"reference\"]>, node: Node, at: string, ctx: Ctx) {\n const to = ref.to ?? [];\n const entries = to.filter(ENTRY_TARGET);\n // the kept targets shift position, so a partial loss is reported on the whole list\n if (entries.length < to.length) lose(ctx, entries.length || !to.length ? `${at}/to` : at, \"reference target\");\n if (entries.length === 1) node.config.contentModelId = entries[0];\n else if (entries.length > 1) Object.assign(node.config, { polymorphic: true, allowedModelSlugs: entries });\n if (ref.filter !== undefined) lose(ctx, `${at}/filter`, \"reference filter\");\n for (const k of Object.keys(ref)) if (k !== \"to\" && k !== \"filter\") lose(ctx, `${at}/${k}`, \"unsupported key\");\n}\n\nfunction numericToProd(f: FieldSchema, node: Node, at: string, ctx: Ctx) {\n if (f.type !== \"number\" && f.type !== \"rating\") return lose(ctx, at, \"unsupported key\");\n const n = f.numeric!;\n // ratingConfigSchema: min ≥ 0, max a whole 1–10, step > 0, min < max, at most RATING_MAX_STOPS whole steps\n const lo = n.min ?? 0;\n const hi = n.max ?? 5;\n const st = n.step ?? 1;\n const stops = (hi - lo) / st;\n const ratingOk =\n (n.min === undefined || (Number.isFinite(n.min) && n.min >= 0)) &&\n (n.max === undefined || isWhole(n.max, 1, RATING_MAX)) &&\n (n.step === undefined || (Number.isFinite(n.step) && n.step > 0)) &&\n lo < hi &&\n Math.abs(stops - Math.round(stops)) < 1e-9 &&\n Math.round(stops) <= RATING_MAX_STOPS;\n for (const k of Object.keys(n) as (keyof typeof n)[]) {\n const v = n[k];\n if (v === undefined) continue;\n const p = `${at}/${k}`;\n if (k === \"unit\") {\n const u = v as string;\n if (f.type === \"number\" && typeof u === \"string\" && u.trim() !== \"\" && u.length <= NUMBER_UNIT_MAX) node.config.unit = u;\n else lose(ctx, p, \"numeric unit\");\n } else if (k === \"min\" || k === \"max\" || k === \"step\") {\n if (f.type === \"number\") node.config[k] = v as number;\n else if (ratingOk) node.config[k] = v as number;\n else lose(ctx, p, \"rating bounds\");\n } else lose(ctx, p, \"unsupported key\");\n }\n}\n\nconst SCALE_UNIT_SET: ReadonlySet<string> = new Set([\"px\", \"%\", \"rem\", \"em\", \"vw\", \"vh\"]);\nconst unitsOk = (u: unknown) => Array.isArray(u) && u.length >= 1 && u.every((x) => SCALE_UNIT_SET.has(x));\nconst boundOk = (b: unknown) => b === undefined || (typeof b === \"number\" && Number.isFinite(b)) || (isObj(b) && Object.entries(b).every(([k, x]) => SCALE_UNIT_SET.has(k) && typeof x === \"number\"));\nconst textOk = (s: unknown, max: number) => typeof s === \"string\" && s.length >= 1 && s.length <= max;\n\n/** A V2 scale → config.scale (numberScaleSchema): steps, units, presets and the custom escape hatch, each held to its rules. */\nfunction scaleToConfig(s: ScaleSchema, node: Node, at: string, ctx: Ctx) {\n const steps = s.steps;\n let outSteps: NumberScale[\"steps\"];\n if (Array.isArray(steps)) {\n const ok =\n steps.length >= 1 &&\n steps.length <= SCALE_STEPS_MAX &&\n new Set(steps.map((x) => x.value)).size === steps.length &&\n steps.every(\n (x) =>\n typeof x.value === \"string\" && x.value === x.value.trim() && textOk(x.value, SCALE_TOKEN_VALUE_MAX) && textOk(x.label, SCALE_LABEL_MAX) &&\n (x.title === undefined || textOk(x.title, SCALE_TITLE_MAX)) && (x.css === undefined || textOk(x.css, SCALE_CSS_MAX)) &&\n (x.px === undefined || (typeof x.px === \"number\" && Number.isFinite(x.px))) &&\n Object.keys(x).every((k) => [\"value\", \"label\", \"title\", \"px\", \"css\"].includes(k)),\n );\n if (!ok) return lose(ctx, at, \"scale rules\");\n outSteps = steps.map((x) => ({ ...x }));\n } else {\n if (!(steps.min < steps.max) || (steps.step !== undefined && !(steps.step > 0))) return lose(ctx, at, \"scale rules\");\n outSteps = { min: steps.min, max: steps.max, ...(steps.step !== undefined ? { step: steps.step } : {}) };\n }\n const out: NumberScale = { steps: outSteps };\n const tokens = Array.isArray(steps) ? new Set(steps.map((x) => x.value)) : undefined;\n const c = s.allowCustom;\n const customOk =\n c === undefined ||\n typeof c === \"boolean\" ||\n (typeof c === \"object\" && c !== null && boundOk(c.min) && boundOk(c.max) && (c.units === undefined || unitsOk(c.units)) && (c.step === undefined || c.step > 0) &&\n Object.keys(c).every((x) => [\"min\", \"max\", \"units\", \"step\"].includes(x)));\n for (const k of Object.keys(s) as (keyof ScaleSchema)[]) {\n const v = s[k];\n if (v === undefined || k === \"steps\") continue;\n const p = `${at}/${k}`;\n if (k === \"units\") {\n if (unitsOk(v)) out.units = [...(v as NonNullable<ScaleSchema[\"units\"]>)];\n else lose(ctx, p, \"scale rules\");\n } else if (k === \"defaultUnit\") {\n if (SCALE_UNIT_SET.has(v as string)) out.defaultUnit = s.defaultUnit;\n else lose(ctx, p, \"scale rules\");\n } else if (k === \"allowCustom\") {\n if (customOk) out.allowCustom = typeof c === \"boolean\" ? c : JSON.parse(JSON.stringify(c));\n else lose(ctx, p, \"scale rules\");\n } else if (k === \"presets\") {\n const presets = s.presets!;\n const ok =\n presets.length <= SCALE_PRESETS_MAX &&\n presets.every((x) => {\n if (x.label !== undefined && !textOk(x.label, SCALE_LABEL_MAX)) return false;\n if (Object.keys(x).some((y) => y !== \"label\" && y !== \"value\")) return false;\n const pv = x.value;\n if (typeof pv === \"number\") return Number.isFinite(pv);\n if (typeof pv === \"string\") return textOk(pv, SCALE_TOKEN_VALUE_MAX) && !!tokens?.has(pv);\n return isObj(pv) && typeof pv.value === \"number\" && SCALE_UNIT_SET.has(pv.unit) && Object.keys(pv).length === 2 && customOk && !!s.allowCustom;\n });\n if (ok) out.presets = presets.map((x) => ({ ...(x.label !== undefined ? { label: x.label } : {}), value: typeof x.value === \"object\" ? { ...x.value } : x.value }));\n else lose(ctx, p, \"scale rules\");\n } else lose(ctx, p, \"unsupported key\");\n }\n node.config.scale = out;\n}\n\nfunction conditionToShowIf(h: Condition, at: string, siblings: FieldSchema[], ctx: Ctx, variantOk: boolean): ShowIf | undefined {\n // a condition names a sibling; the block's `_variant` is one only for a top-level prop (BLOCK_VARIANT_FIELD)\n const variant = variantOk && h.field === \"_variant\";\n if (!h.field || (!variant && !siblings.some((s) => s.name === h.field))) return void lose(ctx, at, \"condition\");\n const extra = Object.keys(h).filter((k) => ![\"field\", \"equals\", \"notEmpty\"].includes(k) && (h as unknown as Obj)[k] !== undefined);\n if (extra.length || (h.equals !== undefined) === (h.notEmpty !== undefined)) return void lose(ctx, at, \"condition\");\n if (h.notEmpty !== undefined) return h.notEmpty === true ? { match: \"all\", rules: [{ field: h.field, op: \"notEmpty\" }] } : void lose(ctx, at, \"condition\");\n const sibType = variant ? undefined : siblings.find((s) => s.name === h.field)?.type;\n const list = Array.isArray(h.equals) ? h.equals : [h.equals];\n const strs: string[] = [];\n for (const v of list) {\n if (![\"string\", \"number\", \"boolean\"].includes(typeof v)) return void lose(ctx, at, \"condition\");\n const s = String(v);\n if (coerceRuleValue(sibType, s) !== v) return void lose(ctx, at, \"condition\");\n strs.push(s);\n }\n const rule: ShowIfRule = Array.isArray(h.equals) ? { field: h.field, op: \"in\", value: strs } : { field: h.field, op: \"eq\", value: strs[0] };\n return { match: \"all\", rules: [rule] };\n}\n\n/* ── emit per lane ───────────────────────────────────────────────────── */\nconst nonEmpty = <T extends object>(o: T) => (Object.keys(o).length ? o : undefined);\nfunction common(n: Node): Obj {\n const out: Obj = { key: n.key, label: n.label, type: n.type };\n const keys: (keyof Node)[] = [\"helpText\", \"required\", \"defaultValue\", \"showIf\", \"helpMore\", \"advanced\", \"recommendedMax\", \"openMode\", \"localized\"];\n for (const k of keys) if (n[k] !== undefined) out[k] = n[k];\n return out;\n}\n\nfunction emitField(n: Node): ContentModelField {\n const out = common(n) as unknown as ContentModelField;\n if (n.unique !== undefined) out.unique = n.unique;\n if (n.readOnly !== undefined) out.readOnly = n.readOnly;\n if (n.lockReason !== undefined) out.lockReason = n.lockReason;\n if (n.fieldsetId !== undefined) out.fieldsetId = n.fieldsetId;\n const config: FieldConfig = { ...n.config };\n if (n.placeholder !== undefined) config.placeholder = n.placeholder;\n if (n.type === \"select\" && n.options) out.options = n.options;\n if ((n.type === \"multiselect\" || n.type === \"tags\") && n.options) config.options = n.options;\n if (n.type === \"object\") out.fields = (n.children ?? []).map(emitField);\n if (n.zoned) {\n const { minItems, maxItems, ...rest } = config;\n out.config = {\n ...rest,\n zones: { repeatable: { fields: (n.children ?? []).map(emitField), ...(minItems !== undefined ? { minItems } : {}), ...(maxItems !== undefined ? { maxItems } : {}) } },\n };\n } else if (nonEmpty(config)) out.config = config;\n const ui = nonEmpty(n.ui);\n if (ui) out.ui = ui as FieldUi;\n return out;\n}\n\nfunction emitProp(n: Node): ComponentPropDef {\n const out = common(n) as unknown as ComponentPropDef;\n if (n.unique !== undefined) out.unique = n.unique;\n if (n.readOnly !== undefined) out.readOnly = n.readOnly;\n if (n.lockReason !== undefined) out.lockReason = n.lockReason;\n if (n.placeholder !== undefined) out.placeholder = n.placeholder;\n const config: Obj = { ...n.config };\n if (n.options) config.options = n.options;\n if (n.children) config.fields = n.children.map(emitSubField);\n if (nonEmpty(config)) out.config = config as ComponentPropDef[\"config\"];\n const ui = nonEmpty(n.ui);\n if (ui) out.ui = ui;\n return out;\n}\n\nfunction emitSubField(n: Node): ComponentSubField {\n const out = common(n) as unknown as ComponentSubField;\n if (n.unique !== undefined) out.unique = n.unique;\n if (n.readOnly !== undefined) out.readOnly = n.readOnly;\n if (n.lockReason !== undefined) out.lockReason = n.lockReason;\n if (n.placeholder !== undefined) out.placeholder = n.placeholder;\n if (n.options) out.options = n.options;\n if (n.children) out.fields = n.children.map(emitSubField);\n if (nonEmpty(n.config)) out.config = { ...n.config } as ComponentSubField[\"config\"];\n const ui = nonEmpty(n.ui);\n if (ui) out.ui = ui;\n return out;\n}\n\n/* ── document level ──────────────────────────────────────────────────── */\nexport function fromTypeSchema(v2: TypeSchema, target: \"fields\"): FromTypeSchemaResult<ProdContentModel>;\nexport function fromTypeSchema(v2: TypeSchema, target: \"props\"): FromTypeSchemaResult<ProdComponent>;\nexport function fromTypeSchema(v2: TypeSchema, target: AdapterTarget): FromTypeSchemaResult<ProdContentModel | ProdComponent> {\n const ctx: Ctx = {\n lane: target, lossy: [], catalog: [], tabs: new Set(), droppedTabs: new Map(), sets: new Map(), propSets: new Map(), definedGroups: new WeakMap(),\n propOrder: new Map(), groupOrder: false, blockModels: new Map(),\n };\n const props = target === \"props\";\n const slug = kebab(v2.name);\n const category = v2.category !== undefined ? CATEGORY_TO_PROD[v2.category] : undefined;\n const fieldsets: Fieldset[] = [];\n\n for (const k of Object.keys(v2) as (keyof TypeSchema)[]) {\n if (v2[k] === undefined) continue;\n const p = `/${k}`;\n switch (k) {\n case \"name\":\n if (camel(slug) !== v2.name) lose(ctx, p, \"type name\");\n break;\n case \"title\":\n case \"description\":\n case \"fields\":\n case \"fieldsets\":\n case \"groups\":\n break;\n case \"kind\":\n if (props && v2.kind !== \"block\") cat(ctx, p, v2.kind === \"global\" ? \"kind:global\" : \"kind:entry (props)\");\n else if (!props && v2.kind !== \"entry\") cat(ctx, p, v2.kind === \"global\" ? \"kind:global\" : v2.kind === \"page\" ? \"kind:page\" : v2.kind === \"block\" ? \"kind:block (fields)\" : \"kind:object\");\n break;\n case \"icon\":\n cat(ctx, p, \"block icon\");\n break;\n case \"preview\":\n cat(ctx, p, \"document preview\");\n break;\n case \"variants\":\n cat(ctx, p, \"variants\");\n break;\n case \"category\":\n // the read side names a prod category back as itself, capitalised\n if (!props || !category || capitalize(category) !== v2.category) cat(ctx, p, \"category\");\n break;\n case \"placement\":\n cat(ctx, p, \"block placement\");\n break;\n case \"initialValue\":\n cat(ctx, p, \"seeded instance\");\n break;\n default:\n lose(ctx, p, \"unsupported key\");\n }\n }\n\n if (props) {\n if (v2.groups?.length) lose(ctx, \"/groups\", \"group (props)\");\n propSetsFor(v2, ctx);\n } else fieldsetsFor(v2, ctx, fieldsets);\n\n const nodes = v2.fields.map((f, i) => convertField(f, `/fields/${i}`, 1, ctx, v2.fields, true));\n if (props) {\n const component: ProdComponent = { name: v2.title, slug, props: nodes.map(emitProp) };\n if (v2.description !== undefined) component.description = v2.description;\n if (category) component.category = category;\n return { schema: component, blockModels: [], lossy: ctx.lossy, catalog: ctx.catalog };\n }\n const model: ProdContentModel = { name: v2.title, slug, fields: nodes.map(emitField) };\n if (v2.description !== undefined) model.description = v2.description;\n // a prod block model may hold only fields a block primitive renders: a V2 section's fields are a model\n model.kind = \"model\";\n if (fieldsets.length) model.fieldsets = fieldsets;\n return { schema: model, blockModels: [...ctx.blockModels.values()], lossy: ctx.lossy, catalog: ctx.catalog };\n}\n\n/** Fields lane: V2 groups → `kind: \"tab\"` fieldsets, V2 fieldsets → `kind: \"group\"` fieldsets in the tab their members share. */\nfunction fieldsetsFor(v2: TypeSchema, ctx: Ctx, out: Fieldset[]) {\n // the backend's tab_name rule compares the STORED name (cut to TAB_NAME_MAX), trimmed, in any case\n const names = new Set<string>();\n let firstDrop: LossyFeature | undefined;\n let shifted = false;\n (v2.groups ?? []).forEach((g: FieldGroup, i) => {\n const p = `/groups/${i}`;\n const stored = g.title.slice(0, TAB_NAME_MAX);\n const folded = stored.trim().toLowerCase();\n const drop = (why: LossyFeature) => {\n if (!ctx.tabs.has(g.name) && !ctx.droppedTabs.has(g.name)) ctx.droppedTabs.set(g.name, why);\n firstDrop ??= why;\n lose(ctx, p, why);\n };\n if (ctx.tabs.has(g.name) || names.has(folded)) return drop(\"group name collision\");\n if (out.length >= TAB_MAX) return drop(\"groups>3\");\n names.add(folded);\n const tab: Fieldset = { id: g.name, name: stored, kind: \"tab\" };\n if (g.title.length > TAB_NAME_MAX) lose(ctx, `${p}/title`, \"group name>20\");\n if (g.icon !== undefined) {\n const dock = dockIconOf(g.icon);\n if (dock) tab.icon = dock;\n else lose(ctx, `${p}/icon`, \"group icon\");\n }\n if (i === 0 ? g.default !== true : g.default !== undefined) lose(ctx, `${p}/default`, \"group default\");\n for (const k of Object.keys(g)) if (![\"name\", \"title\", \"icon\", \"default\"].includes(k) && (g as unknown as Obj)[k] !== undefined) lose(ctx, `${p}/${k}`, \"unsupported key\");\n ctx.tabs.add(g.name);\n out.push(tab);\n // a dropped group before this one shifts it up a place: the list as a whole is not kept in its positions\n if (firstDrop && !shifted) {\n shifted = true;\n lose(ctx, \"/groups\", firstDrop);\n }\n });\n (v2.fieldsets ?? []).forEach((fs: V2Fieldset, i) => {\n const p = `/fieldsets/${i}`;\n if (ctx.tabs.has(fs.name) || ctx.droppedTabs.has(fs.name) || ctx.sets.has(fs.name) || out.length >= FIELDSETS_MAX) return lose(ctx, p, \"fieldset collision\");\n // the tab most top-level members sit in (\"no tab\" counts as one)\n const tally = new Map<string | undefined, number>();\n for (const f of v2.fields) if (f.fieldset === fs.name) tally.set(f.group, (tally.get(f.group) ?? 0) + 1);\n const best = [...tally.entries()].sort((a, b) => b[1] - a[1])[0]?.[0];\n const tab = best !== undefined && ctx.tabs.has(best) ? best : undefined;\n const set: Fieldset = { id: fs.name, name: fs.title.slice(0, FIELDSET_NAME_MAX), kind: \"group\" };\n if (fs.title.length > FIELDSET_NAME_MAX) lose(ctx, `${p}/title`, \"fieldset name>limit\");\n if (tab) set.tab = tab;\n for (const k of Object.keys(fs) as (keyof V2Fieldset)[]) {\n const v = fs[k];\n if (v === undefined || k === \"name\" || k === \"title\") continue;\n if (k === \"description\") {\n if ((v as string).length <= FIELDSET_DESCRIPTION_MAX) set.description = v as string;\n else lose(ctx, `${p}/${k}`, \"help>limit\");\n } else if (k === \"collapsed\" || k === \"collapsible\" || k === \"columns\" || k === \"layout\") (set as unknown as Obj)[k] = v;\n else lose(ctx, `${p}/${k}`, \"unsupported key\");\n }\n ctx.sets.set(fs.name, tab);\n out.push(set);\n });\n}\n\n/**\n * Props lane: a V2 fieldset is an inline ui.group, defined on the first prop (at each level, sub-fields too) that uses\n * it. A fieldset no prop uses has nothing to be defined on; when the V2 order differs from where each group is first\n * met (depth first, a prop before its sub-fields: how propsToTypeSchema meets them), every group carries its `order`.\n */\nfunction propSetsFor(v2: TypeSchema, ctx: Ctx) {\n const sets = v2.fieldsets ?? [];\n if (!sets.length) return;\n const named = new Set(sets.map((s) => s.name));\n const firstSeen: string[] = [];\n const visit = (fields: FieldSchema[], lv: number) => {\n for (const f of fields) {\n if (f.fieldset !== undefined && named.has(f.fieldset) && !firstSeen.includes(f.fieldset)) firstSeen.push(f.fieldset);\n if (lv >= MAX_FIELD_DEPTH) continue;\n const kids = previewKids(f);\n if (kids) visit(kids, lv + 1);\n }\n };\n visit(v2.fields, 1);\n const used = sets.filter((s) => firstSeen.includes(s.name));\n ctx.groupOrder = used.some((s, i) => s.name !== firstSeen[i]);\n let gap = false;\n sets.forEach((s, i) => {\n ctx.propSets.set(s.name, s);\n ctx.propOrder.set(s.name, i);\n if (!firstSeen.includes(s.name)) {\n gap = true;\n return lose(ctx, `/fieldsets/${i}`, \"fieldset (props)\");\n }\n // a fieldset left out before this one moves it up a place\n if (gap) {\n gap = false;\n lose(ctx, \"/fieldsets\", \"fieldset (props)\");\n }\n for (const k of Object.keys(s) as (keyof V2Fieldset)[]) {\n const v = s[k];\n if (v === undefined || k === \"name\" || k === \"collapsed\" || k === \"columns\" || k === \"collapsible\" || k === \"layout\") continue;\n if (k === \"title\") {\n if (s.title.length > PROP_GROUP_LABEL_MAX) lose(ctx, `/fieldsets/${i}/title`, \"fieldset name>limit\");\n } else if (k === \"description\") {\n if (!groupDescriptionOk(s.description)) lose(ctx, `/fieldsets/${i}/description`, \"help>limit\");\n } else lose(ctx, `/fieldsets/${i}/${k}`, \"unsupported key\");\n }\n });\n}\n\n/* ══════════════════════════════════════════════════════════════════════\n * prod → V2\n * ══════════════════════════════════════════════════════════════════════ */\n\ninterface ReadCtx {\n onLoss: (path: string, feature: string, reason: string) => void;\n /** fields lane: fieldset id → its fieldset. */\n sets: Map<string, Fieldset>;\n /** V2 lists read from an array's repeatable zone: their values are stored as `{ repeatable: [...] }`. */\n zoned: WeakSet<FieldSchema>;\n /** V2 lists read from a modular field: their rows are stored as `{ __id, __type, data }`. */\n modular: WeakSet<FieldSchema>;\n /** block slug → the block model a modular field's item type is read from. */\n blockModels: Map<string, ProdContentModel>;\n /** ToTypeSchemaOptions.plans */\n plans?: Map<string, ValuePlan>;\n}\n\n/** A prod field, prop or sub-field read into one lane-neutral shape. */\ninterface ProdNode {\n key: string;\n label: string;\n type: string;\n helpText?: string;\n required?: boolean;\n unique?: boolean;\n defaultValue?: unknown;\n options?: SelectOption[];\n config: FieldConfig;\n fields?: ProdNode[];\n /** array zones (fields lane) */\n zones?: { nonRepeatable?: ProdNode[]; repeatable?: { fields: ProdNode[]; minItems?: number; maxItems?: number } };\n ui: PropUi;\n openMode?: OpenMode;\n showIf?: ShowIf;\n readOnly?: true | \"developer\";\n lockReason?: string;\n helpMore?: string;\n advanced?: boolean;\n recommendedMax?: number;\n placeholder?: string;\n fieldsetId?: string;\n placement?: string;\n searchable?: boolean;\n localized?: boolean;\n}\n\nfunction readField(f: ContentModelField): ProdNode {\n const cfg: FieldConfig = { ...(f.config ?? {}) };\n const n: ProdNode = { ...(f as Obj), config: cfg, ui: { ...(f.ui ?? {}) } } as ProdNode;\n if (typeof cfg.placeholder === \"string\") {\n n.placeholder = cfg.placeholder;\n delete cfg.placeholder;\n }\n // a strict config's field keeps its placeholder in ui\n if (n.placeholder === undefined && typeof n.ui.placeholder === \"string\") n.placeholder = n.ui.placeholder;\n delete n.ui.placeholder;\n if ((f.type === \"multiselect\" || f.type === \"tags\") && cfg.options) {\n n.options = cfg.options;\n delete cfg.options;\n }\n n.fields = f.fields?.map(readField);\n if (cfg.zones) {\n const z = cfg.zones;\n n.zones = {\n ...(z.nonRepeatable ? { nonRepeatable: z.nonRepeatable.map(readField) } : {}),\n ...(z.repeatable ? { repeatable: { ...z.repeatable, fields: z.repeatable.fields.map(readField) } } : {}),\n };\n delete cfg.zones;\n }\n return n;\n}\n\nfunction readProp(p: ComponentPropDef | ComponentSubField): ProdNode {\n const { config, fields, options, ...rest } = p as ComponentSubField & { config?: Obj };\n const cfg: FieldConfig = { ...(config ?? {}) };\n const n: ProdNode = { ...(rest as Obj), config: cfg, ui: { ...((p.ui as PropUi | undefined) ?? {}) } } as ProdNode;\n const opts = (cfg.options as SelectOption[] | undefined) ?? options;\n if (opts) n.options = opts;\n delete cfg.options;\n const kids = (cfg.fields as ComponentSubField[] | undefined) ?? fields;\n if (kids) n.fields = kids.map(readProp);\n delete cfg.fields;\n return n;\n}\n\n/** A stored choice → the V2 option: a dock icon reads back as the kit's Tabler name, the description as itself. */\nconst optionsFromProd = (opts: SelectOption[]): Option[] =>\n opts.map((o) => {\n if (typeof o === \"string\") return { value: o, label: o };\n const out: Option = { value: o.value, label: o.label };\n if (typeof o.icon === \"string\") out.icon = tablerIconOf(o.icon);\n if (typeof o.description === \"string\") out.description = o.description;\n return out;\n });\n\nfunction scaleFromConfig(s: NumberScale, at: string, ctx: ReadCtx): ScaleSchema {\n const steps = s.steps;\n const out: ScaleSchema = !Array.isArray(steps)\n ? { steps: { min: steps.min, max: steps.max, ...(steps.step !== undefined ? { step: steps.step } : {}) } }\n : steps.some((x) => typeof x.value === \"string\")\n ? { steps: (steps as Array<{ value: string; label: string }>).map((x) => ({ ...x })) }\n : (ctx.onLoss(`${at}/steps`, \"scale steps\", \"Numeric step lists read back as token steps named by their number.\"),\n { steps: (steps as Array<{ value: number; label?: string }>).map((x) => ({ value: String(x.value), label: x.label ?? String(x.value), px: x.value })) });\n if (s.units) out.units = s.units;\n if (s.defaultUnit) out.defaultUnit = s.defaultUnit;\n if (s.allowCustom !== undefined) out.allowCustom = isObj(s.allowCustom) ? JSON.parse(JSON.stringify(s.allowCustom)) : s.allowCustom;\n if (s.presets) out.presets = s.presets.map((p) => ({ ...(p.label !== undefined ? { label: p.label } : {}), value: typeof p.value === \"object\" ? { ...p.value } : p.value }));\n return out;\n}\n\n/** The prod children a preview path segment may name below a node (an object's, a list's rows'), or null for a leaf. */\nconst readKids = (n: ProdNode): ProdNode[] | null =>\n n.zones ? [...(n.zones.nonRepeatable ?? []), ...(n.zones.repeatable?.fields ?? [])] : n.fields && [\"object\", \"group\", \"repeater\", \"table\"].includes(n.type) ? n.fields : null;\n\n/** A stored preview path → the V2 path: `image.altText` reads as `image.alt`, the rest as it is. */\nfunction previewPathFromProd(path: string, children: ProdNode[]): string {\n const segs = path.split(\".\");\n let node = children.find((c) => c.key === segs[0]);\n for (let i = 1; node && i < segs.length; i++) {\n const kids = readKids(node);\n if (kids) {\n node = kids.find((c) => c.key === segs[i]);\n continue;\n }\n if (node.type === \"image\") {\n const back = Object.entries(IMAGE_PATH_KEY).find(([, stored]) => stored === segs[i])?.[0];\n if (back) segs[i] = back;\n }\n break;\n }\n return segs.join(\".\");\n}\n\nfunction previewFromProd(pv: UiPreview, children: ProdNode[]): PreviewConfig {\n const out: PreviewConfig = { ...pv };\n for (const k of [\"title\", \"subtitle\", \"media\"] as const) if (typeof pv[k] === \"string\") out[k] = previewPathFromProd(pv[k], children);\n if (typeof pv.icon === \"string\") out.icon = tablerIconOf(pv.icon);\n return out;\n}\n\nfunction showIfToCondition(s: ShowIf, siblings: ProdNode[], at: string, ctx: ReadCtx): Condition | undefined {\n const drop = (why: string) => void ctx.onLoss(at, \"condition\", why);\n if (s.rules.length !== 1) return drop(\"V2 conditions test one sibling; a multi-rule showIf is dropped (the field always shows).\");\n const r = s.rules[0];\n const sib = siblings.find((x) => x.key === r.field);\n const t = sib?.type === \"number\" ? \"number\" : sib?.type;\n const read = (v: string) => coerceRuleValue(t, v);\n switch (r.op) {\n case \"eq\":\n return Array.isArray(r.value) ? { field: r.field, equals: r.value.map(read) } : { field: r.field, equals: read(r.value ?? \"\") };\n case \"in\":\n return { field: r.field, equals: (Array.isArray(r.value) ? r.value : [r.value ?? \"\"]).map(read) };\n case \"isSet\":\n case \"notEmpty\":\n return { field: r.field, notEmpty: true };\n default:\n return drop(`V2 conditions have no \"${r.op}\"; the field always shows.`);\n }\n}\n\nfunction v2Type(n: ProdNode, at: string, ctx: ReadCtx): FieldSchema[\"type\"] {\n switch (n.type) {\n case \"text\":\n return n.config.inputType === \"url\" ? \"url\" : \"string\";\n case \"longtext\":\n return \"text\";\n case \"document\":\n ctx.onLoss(`${at}/type`, \"document\", \"A document (article body) reads as rich text.\");\n return \"richtext\";\n case \"phone\":\n ctx.onLoss(`${at}/type`, \"phone\", \"V2 has no phone type; it reads as a string.\");\n return \"string\";\n case \"location\":\n return \"geopoint\";\n case \"number\":\n return n.ui.control === \"rating\" ? \"rating\" : \"number\";\n case \"select\":\n // the old schema editor's multi-choice select (config.multiSelect) stores a string[] like a multiselect\n return n.config.multiSelect === true ? \"multiselect\" : \"select\";\n case \"multiselect\":\n // V2 multiselect never writes allowCustom; free entry is tags, whose options are its suggestions\n return n.config.allowCustom === true ? \"tags\" : \"multiselect\";\n case \"group\":\n case \"object\":\n return \"object\";\n case \"repeater\":\n case \"table\":\n case \"array\":\n case \"multi-reference\":\n case \"multiReference\":\n case \"modular\":\n return \"array\";\n case \"form\":\n return \"reference\";\n case \"component-ref\":\n case \"sections\":\n case \"slot\":\n ctx.onLoss(`${at}/type`, n.type, \"This prod type stores component or block instances V2 cannot edit; it reads as json.\");\n return \"json\";\n default:\n return n.type as FieldSchema[\"type\"];\n }\n}\n\nfunction readToV2(n: ProdNode, at: string, siblings: ProdNode[], ctx: ReadCtx, top: boolean, lane: AdapterTarget): FieldSchema {\n /** a data-table prop (config.mode \"data\") holds one TableValue: the V2 `table` field, not a list of rows */\n const dataTable = lane === \"props\" && isDataTableProp(n);\n const type = dataTable ? \"table\" : v2Type(n, at, ctx);\n const f: FieldSchema = { name: n.key, title: n.label, type };\n const cfg = n.config;\n const val: NonNullable<FieldSchema[\"validation\"]> = {};\n const loss = (k: string, feature: string, reason: string) => ctx.onLoss(`${at}/${k}`, feature, reason);\n\n if (n.helpText !== undefined) f.description = n.helpText;\n if (n.helpMore !== undefined) f.helpMore = n.helpMore;\n if (n.placeholder !== undefined) f.placeholder = n.placeholder;\n if (n.required !== undefined) val.required = n.required;\n if (n.unique !== undefined) val.unique = n.unique;\n if (n.recommendedMax !== undefined) val.recommendedMax = n.recommendedMax;\n if (n.advanced !== undefined) f.advanced = n.advanced;\n if (n.openMode !== undefined) f.openMode = n.openMode;\n if (n.readOnly === true) f.readOnly = true;\n // ui.access is the V2 access as stored; a developer lock with none (older rows) reads as edit: schema.manage\n if (n.ui.access) f.access = { ...n.ui.access };\n else if (n.readOnly === \"developer\") f.access = { edit: \"schema.manage\" };\n if (n.lockReason !== undefined) f.lockReason = n.lockReason;\n if (n.localized !== undefined) f.localized = n.localized;\n if (n.ui.hidden !== undefined) f.hidden = n.ui.hidden;\n if (n.ui.rows !== undefined) f.rows = n.ui.rows;\n if (n.ui.synced !== undefined) f.synced = { ...n.ui.synced };\n if (n.ui.valueShape !== undefined) f.valueShape = n.ui.valueShape;\n if (n.showIf) {\n const c = showIfToCondition(n.showIf, siblings, `${at}/showIf`, ctx);\n if (c) f.hidden = c;\n }\n if (n.placement !== undefined) loss(\"placement\", \"placement\", \"V2 has no editor placement; the field renders in the form.\");\n if (n.searchable === false) loss(\"searchable\", \"searchable\", \"V2 has no search-index flag.\");\n if (n.ui.collapsed !== undefined) loss(\"ui/collapsed\", \"ui.collapsed\", \"V2 fields have no start-collapsed flag.\");\n if (n.ui.reorderable !== undefined) loss(\"ui/reorderable\", \"ui.reorderable\", \"V2 lists are always reorderable.\");\n if (n.ui.input !== undefined) loss(\"ui/input\", \"ui.input\", \"Custom dock inputs are a dock feature V2 has no key for.\");\n\n // the tab and the section\n if (n.fieldsetId !== undefined) {\n const set = ctx.sets.get(n.fieldsetId);\n if (set?.kind === \"tab\") {\n if (top) f.group = set.id;\n else loss(\"fieldsetId\", \"fieldset\", \"Only top-level V2 fields sit in a tab; this nested field's tab is dropped.\");\n } else if (set) {\n f.fieldset = set.id;\n if (top && set.tab !== undefined) f.group = set.tab;\n } else loss(\"fieldsetId\", \"fieldset\", `No fieldset \"${n.fieldsetId}\" exists on this model; the membership is dropped.`);\n }\n if (lane === \"props\" && n.ui.group) f.fieldset = n.ui.group.id;\n for (const k of [\"target\", \"stale\", \"origin\"] as const)\n if ((n as unknown as Obj)[k] !== undefined)\n loss(k, k, k === \"target\" ? \"A prop's target (where it writes in the component) is binding, not schema: V2 has no key for it, so the host keeps it.\" : `V2 has no \"${k}\" key.`);\n\n // per type; what a branch reads is marked used, and every prod config / ui key left unread is reported\n const used = new Set<string>([\"placeholder\", \"zones\", \"options\", \"fields\"]);\n const usedUi = new Set<string>([\"collapsed\", \"reorderable\", \"input\", \"access\", \"hidden\", \"rows\", \"synced\", \"valueShape\"]);\n const use = (...k: string[]) => k.forEach((x) => used.add(x));\n const useUi = (...k: string[]) => k.forEach((x) => usedUi.add(x));\n if (lane === \"props\") useUi(\"group\");\n if ([\"text\", \"longtext\", \"url\", \"richtext\", \"document\"].includes(n.type)) {\n use(\"minLength\", \"maxLength\", \"pattern\", \"patternMessage\", \"inputType\");\n if (typeof cfg.minLength === \"number\") val.min = cfg.minLength;\n if (typeof cfg.maxLength === \"number\") val.max = cfg.maxLength;\n if (typeof cfg.pattern === \"string\") val.pattern = cfg.pattern;\n if (typeof cfg.patternMessage === \"string\") val.patternMessage = cfg.patternMessage;\n }\n if (type === \"number\" || type === \"rating\") {\n const numeric: NonNullable<FieldSchema[\"numeric\"]> = {};\n for (const k of [\"min\", \"max\", \"step\"] as const) if (typeof cfg[k] === \"number\") numeric[k] = cfg[k] as number;\n // the old rating (a number with ui.control \"rating\") drops bounds equal to its default\n const ratingDefault = type === \"rating\" && n.type === \"number\" && ratingIsDefault(numeric);\n if (typeof cfg.unit === \"string\") numeric.unit = cfg.unit;\n if (Object.keys(numeric).length && !ratingDefault) f.numeric = numeric;\n // the error bounds (V2 validation.min / max)\n const bounds = cfg.validation;\n if (isObj(bounds)) for (const k of [\"min\", \"max\"] as const) if (typeof bounds[k] === \"number\") val[k] = bounds[k];\n if (cfg.scale) f.scale = scaleFromConfig(cfg.scale, `${at}/config/scale`, ctx);\n if (n.ui.control === \"slider\") f.layout = \"slider\";\n use(\"min\", \"max\", \"step\", \"scale\", \"unit\", \"validation\");\n if (n.ui.control === \"slider\" || n.ui.control === \"rating\") useUi(\"control\");\n }\n // the V2 control layouts: segmented on a select, the rest on the types CONTROL_TYPES lists\n const control = n.ui.control;\n if (control !== undefined && control !== \"slider\" && control !== \"rating\" && (control === \"segmented\" ? type === \"select\" : CONTROL_TYPES[control]?.includes(type))) {\n f.layout = control;\n useUi(\"control\");\n }\n if (n.type === \"select\") use(\"multiSelect\");\n if ((type === \"select\" || type === \"multiselect\" || type === \"tags\") && n.options) f.options = optionsFromProd(n.options);\n if (type === \"multiselect\" || type === \"tags\") {\n if (typeof cfg.min === \"number\") val.min = cfg.min;\n if (typeof cfg.max === \"number\") val.max = cfg.max;\n use(\"min\", \"max\", \"allowCustom\");\n }\n if (n.type === \"code\") {\n if (typeof cfg.language === \"string\") f.language = cfg.language;\n else if (cfg.language !== undefined) loss(\"config/language\", \"code language\", \"The field's language is not a string; it is dropped.\");\n if (Array.isArray(cfg.languages) && cfg.languages.every((l) => typeof l === \"string\")) f.languages = [...cfg.languages];\n else if (cfg.languages !== undefined) loss(\"config/languages\", \"code language\", \"The field's languages are not a list of names; they are dropped.\");\n use(\"language\", \"languages\");\n }\n if (n.type === \"tags\" && cfg.allowCustom === false) loss(\"config/allowCustom\", \"tags closed\", \"V2 tags always take free entry; a closed tags list reads as open tags.\");\n if (type === \"date\" || type === \"datetime\") use(\"timezone\", \"includeTime\");\n if ((type === \"date\" || type === \"datetime\") && typeof cfg.timezone === \"string\") f.timezone = cfg.timezone === \"site\" ? \"site\" : `fixed:${cfg.timezone}`;\n if ((type === \"date\" || type === \"datetime\") && typeof cfg.timezone === \"boolean\") f.timezone = cfg.timezone;\n if (n.type === \"reference\" || n.type === \"multi-reference\" || n.type === \"multiReference\") use(\"contentModelId\", \"polymorphic\", \"allowedModelSlugs\");\n if (n.type === \"reference\") {\n const to = cfg.polymorphic ? (cfg.allowedModelSlugs ?? []) : cfg.contentModelId ? [cfg.contentModelId] : [];\n if (to.length) f.reference = { to };\n }\n if (n.type === \"form\") f.reference = { to: [\"form\"] };\n if (n.type === \"object\" || n.type === \"group\") {\n f.fields = (n.fields ?? []).map((c, i) => readToV2(c, `${at}/fields/${i}`, n.fields ?? [], ctx, false, lane));\n if (n.ui.preview) f.preview = previewFromProd(n.ui.preview, n.fields ?? []);\n if (n.ui.icon) f.icon = tablerIconOf(n.ui.icon);\n useUi(\"preview\", \"icon\");\n }\n if (n.type === \"array\" && n.zones?.nonRepeatable) {\n // a legacy group (or a zone pair) stores {nonRepeatable, repeatable?}: V2 edits it as an object of that shape\n const nr = n.zones.nonRepeatable;\n const kids: FieldSchema[] = [{ name: \"nonRepeatable\", title: n.label, type: \"object\", fields: nr.map((c, i) => readToV2(c, `${at}/config/zones/nonRepeatable/${i}`, nr, ctx, false, lane)) }];\n if (n.zones.repeatable) kids.push(listOf(n, n.zones.repeatable.fields, \"repeatable\", `${at}/config/zones/repeatable`, ctx, lane));\n ctx.onLoss(`${at}/config/zones`, \"zone envelope\", \"A non-repeatable zone reads as an object with nonRepeatable (and repeatable) children, matching its stored {nonRepeatable, repeatable} value.\");\n Object.assign(f, { type: \"object\", fields: kids });\n } else if (dataTable) {\n f.table = tableOptionsFromConfig(cfg);\n use(\"mode\", \"columnTypes\", \"lockColumns\", \"requireCaption\", \"allowGroups\", \"allowFootnotes\", \"allowNote\", \"minRows\", \"maxRows\", \"maxColumns\", \"settings\", \"jsonLd\");\n } else if ((n.type === \"array\" && n.zones?.repeatable) || n.type === \"repeater\" || n.type === \"table\") {\n const kids = n.zones?.repeatable?.fields ?? n.fields ?? [];\n const list = listOf(n, kids, n.key, at, ctx, lane);\n useUi(\"preview\", \"icon\", \"itemLabel\", \"layout\", \"itemName\", \"itemTitle\");\n if (n.zones?.repeatable) ctx.zoned.add(f);\n f.of = list.of;\n if (list.itemNoun !== undefined) f.itemNoun = list.itemNoun;\n if (list.arrayLayout) f.arrayLayout = list.arrayLayout;\n if (list.layout) f.layout = list.layout;\n const r = n.zones?.repeatable ?? (n.type === \"table\" ? { minItems: cfg.minItems, maxItems: cfg.maxItems } : undefined);\n if (typeof r?.minItems === \"number\") val.min = r.minItems;\n if (typeof r?.maxItems === \"number\") val.max = r.maxItems;\n if (n.type === \"table\") use(\"minItems\", \"maxItems\");\n } else if (n.type === \"array\" && cfg.itemType) {\n f.of = [{ ...itemOf(n), type: cfg.itemType === \"text\" ? \"string\" : cfg.itemType }];\n leafListChrome(n, f, loss, \"a list of scalars\");\n if (typeof cfg.minItems === \"number\") val.min = cfg.minItems;\n if (typeof cfg.maxItems === \"number\") val.max = cfg.maxItems;\n use(\"itemType\", \"minItems\", \"maxItems\");\n useUi(\"layout\", \"itemLabel\", \"itemName\", \"itemTitle\");\n } else if (n.type === \"modular\") {\n // each item type is a block model: its title and fields are read from that model (a stub when it was not passed)\n const slugs = (cfg.blockSlugs as string[] | undefined) ?? [];\n f.of = slugs.map((s, j) => {\n const bm = ctx.blockModels.get(s);\n // how a row of this block type reads in this field (ui.blocks, by slug)\n const chrome = n.ui.blocks?.[s];\n const kids = bm ? bm.fields.map(readField) : [];\n const item: FieldSchema = bm\n ? { name: camel(s), title: bm.name, type: \"object\" as const, fields: kids.map((c, k) => readToV2(c, `${at}/of/${j}/fields/${k}`, kids, ctx, false, lane)) }\n : { name: camel(s), title: camel(s), type: \"object\" as const, fields: [] };\n if (chrome?.icon) item.icon = tablerIconOf(chrome.icon);\n if (chrome?.preview) item.preview = previewFromProd(chrome.preview, kids);\n return item;\n });\n const missing = slugs.filter((s) => !ctx.blockModels.has(s));\n if (missing.length)\n ctx.onLoss(`${at}/config/blockSlugs`, \"block models\", `Each item type is its own block model; ${missing.join(\", \")} was not passed, so its fields read as none.`);\n ctx.modular.add(f);\n if (n.ui.itemLabel) f.itemNoun = n.ui.itemLabel.toLowerCase();\n if (n.ui.icon) f.icon = tablerIconOf(n.ui.icon);\n const l = n.ui.layout;\n if (l === \"grid\" || l === \"list\") f.arrayLayout = l;\n else if (l === \"rows\") f.layout = \"list\";\n else if (l) loss(\"ui/layout\", \"ui.layout\", `V2 has no \"${l}\" layout for a list of blocks.`);\n if (typeof cfg.minItems === \"number\") val.min = cfg.minItems;\n if (typeof cfg.maxItems === \"number\") val.max = cfg.maxItems;\n use(\"blockSlugs\", \"minItems\", \"maxItems\");\n useUi(\"itemLabel\", \"icon\", \"layout\", \"blocks\");\n } else if (n.type === \"multi-reference\" || n.type === \"multiReference\") {\n const to = cfg.polymorphic ? (cfg.allowedModelSlugs ?? []) : cfg.contentModelId ? [cfg.contentModelId] : [];\n f.of = [{ ...itemOf(n), type: \"reference\", ...(to.length ? { reference: { to } } : {}) }];\n leafListChrome(n, f, loss, \"a list of entries\");\n if (typeof cfg.min === \"number\") val.min = cfg.min;\n if (typeof cfg.max === \"number\") val.max = cfg.max;\n use(\"min\", \"max\");\n useUi(\"layout\", \"itemLabel\", \"itemName\", \"itemTitle\");\n }\n if (n.type === \"array\" && n.zones?.nonRepeatable && n.zones.repeatable) useUi(\"preview\", \"icon\", \"itemLabel\", \"layout\"); // read by listOf\n for (const [k, x] of Object.entries(cfg)) if (x !== undefined && !used.has(k)) loss(`config/${k}`, \"config\", `V2 has no \"${k}\" setting on a ${type} field.`);\n for (const [k, x] of Object.entries(n.ui)) if (x !== undefined && !usedUi.has(k)) loss(`ui/${k}`, `ui.${k}`, `V2 has no ui.${k} on a ${type} field.`);\n if (n.defaultValue !== undefined || (top && ctx.plans)) {\n const plan = readPlan(f, n.type, ctx.zoned, ctx.modular);\n if (top) ctx.plans?.set(f.name, plan);\n if (n.defaultValue !== undefined) f.initialValue = planFromProd(plan, n.defaultValue, (rel, reason) => loss(`defaultValue${rel}`, \"stored value\", reason));\n }\n if (Object.keys(val).length) f.validation = val;\n return f;\n}\n\n/** A list of scalars or entries: its item's name and title (ui.itemName / ui.itemTitle, else the convention). */\nconst itemOf = (n: ProdNode) => {\n const conv = conventionItem(n.key, n.label);\n return { name: n.ui.itemName ?? conv.name, title: n.ui.itemTitle ?? conv.title };\n};\n\n/** A list of scalars or entries: the noun (ui.itemLabel) and its layout (rows → list, gallery → grid tiles). */\nfunction leafListChrome(n: ProdNode, f: FieldSchema, loss: (k: string, feature: string, reason: string) => void, what: string) {\n if (n.ui.itemLabel !== undefined) f.itemNoun = n.ui.itemLabel.toLowerCase();\n const l = n.ui.layout;\n if (l === \"rows\") f.layout = \"list\";\n else if (l === \"gallery\") f.arrayLayout = \"grid\";\n else if (l) loss(\"ui/layout\", \"ui.layout\", `V2 has no \"${l}\" layout for ${what}.`);\n}\n\n/** A list of object rows (zones.repeatable, legacy repeater, prop table) → the V2 array's single item type. */\nfunction listOf(n: ProdNode, kids: ProdNode[], name: string, at: string, ctx: ReadCtx, lane: AdapterTarget) {\n const conv = conventionItem(name, n.label, n.ui.itemLabel);\n const item: FieldSchema = {\n name: n.ui.itemName ?? conv.name,\n title: n.ui.itemTitle ?? conv.title,\n type: \"object\",\n fields: kids.map((c, i) => readToV2(c, `${at}/fields/${i}`, kids, ctx, false, lane)),\n };\n if (n.ui.preview) item.preview = previewFromProd(n.ui.preview, kids);\n if (n.ui.icon) item.icon = tablerIconOf(n.ui.icon);\n const out: { name: string; title: string; type: \"array\"; of: FieldSchema[]; itemNoun?: string; arrayLayout?: \"list\" | \"grid\"; layout?: FieldSchema[\"layout\"] } = {\n name,\n title: n.label,\n type: \"array\",\n of: [item],\n };\n // the noun is stored as ui.itemLabel; with none, the engine already falls back to the item title\n if (n.ui.itemLabel !== undefined) out.itemNoun = n.ui.itemLabel.toLowerCase();\n const l = n.ui.layout;\n if (l === \"grid\" || l === \"list\") out.arrayLayout = l;\n else if (l === \"rows\") out.layout = \"list\";\n else if (l) ctx.onLoss(`${at}/ui/layout`, \"ui.layout\", `V2 has no \"${l}\" layout for rows.`);\n return out;\n}\n\n/** A prod content model (both dialects) → TypeSchema. */\nexport function toTypeSchema(model: ProdContentModel, opts: ToTypeSchemaOptions = {}): TypeSchema {\n const ctx: ReadCtx = {\n onLoss: (path, feature, reason) => opts.onLoss?.({ path, feature, reason }),\n sets: new Map(),\n zoned: new WeakSet(),\n modular: new WeakSet(),\n blockModels: new Map((opts.blockModels ?? []).map((m) => [m.slug, m] as const)),\n plans: opts.plans,\n };\n const sets = model.fieldsets ?? [];\n const groups: FieldGroup[] = [];\n const fieldsets: V2Fieldset[] = [];\n sets.forEach((s, i) => {\n ctx.sets.set(s.id, s);\n if (s.kind === \"tab\") {\n const g: FieldGroup = { name: s.id, title: s.name };\n if (s.icon) g.icon = tablerIconOf(s.icon);\n if (groups.length === 0) g.default = true;\n groups.push(g);\n return;\n }\n const fs: V2Fieldset = { name: s.id, title: s.name };\n if (s.description !== undefined) fs.description = s.description;\n for (const k of [\"collapsed\", \"collapsible\", \"columns\", \"layout\"] as const) if (s[k] !== undefined) (fs as unknown as Obj)[k] = s[k];\n if (s.kind === \"row\") ctx.onLoss(`/fieldsets/${i}/kind`, \"fieldset row\", \"V2 has no row fieldset; it reads as a section.\");\n if (s.icon !== undefined) ctx.onLoss(`/fieldsets/${i}/icon`, \"fieldset icon\", \"V2 sections have no icon.\");\n fieldsets.push(fs);\n });\n const nodes = model.fields.map(readField);\n const out: TypeSchema = {\n name: camel(model.slug),\n title: model.name,\n kind: model.kind === \"block\" ? \"block\" : \"entry\",\n fields: nodes.map((n, i) => readToV2(n, `/fields/${i}`, nodes, ctx, true, \"fields\")),\n };\n if (model.description !== undefined) out.description = model.description;\n if (fieldsets.length) out.fieldsets = fieldsets;\n if (groups.length) out.groups = groups;\n return out;\n}\n\n/** A prod component's props → TypeSchema (kind \"block\"); prop groups read back as fieldsets. */\nexport function propsToTypeSchema(component: ProdComponent, opts: ToTypeSchemaOptions = {}): TypeSchema {\n const ctx: ReadCtx = {\n onLoss: (path, feature, reason) => opts.onLoss?.({ path, feature, reason }),\n sets: new Map(),\n zoned: new WeakSet(),\n modular: new WeakSet(),\n blockModels: new Map((opts.blockModels ?? []).map((m) => [m.slug, m] as const)),\n plans: opts.plans,\n };\n const nodes = component.props.map(readProp);\n // prop groups as V2 fieldsets, met depth first (a prop, then its sub-fields: groups nest), sorted by `order` when set\n const fieldsets: V2Fieldset[] = [];\n const order = new Map<string, number>();\n const visit = (list: ProdNode[], at: string) =>\n list.forEach((n, i) => {\n const g = n.ui.group;\n if (g && !fieldsets.some((s) => s.name === g.id)) {\n const fs: V2Fieldset = { name: g.id, title: g.label ?? g.id };\n if (g.description !== undefined) fs.description = g.description;\n if (g.collapsed !== undefined) fs.collapsed = g.collapsed;\n if (g.columns !== undefined) fs.columns = g.columns;\n if (g.collapsible !== undefined) fs.collapsible = g.collapsible;\n if (g.layout !== undefined) fs.layout = g.layout;\n if (typeof g.order === \"number\") order.set(g.id, g.order);\n if (g.kind === \"row\") ctx.onLoss(`${at}/${i}/ui/group/kind`, \"fieldset row\", \"V2 has no row fieldset; it reads as a section.\");\n if (g.icon !== undefined) ctx.onLoss(`${at}/${i}/ui/group/icon`, \"fieldset icon\", \"V2 sections have no icon.\");\n fieldsets.push(fs);\n }\n if (n.fields) visit(n.fields, `${at}/${i}/fields`);\n });\n visit(nodes, \"/fields\");\n if (order.size) {\n const at = new Map(fieldsets.map((s, i) => [s.name, i] as const));\n fieldsets.sort((a, b) => (order.get(a.name) ?? at.get(a.name)!) - (order.get(b.name) ?? at.get(b.name)!));\n }\n const out: TypeSchema = {\n name: camel(component.slug),\n title: component.name,\n kind: \"block\",\n fields: nodes.map((n, i) => readToV2(n, `/fields/${i}`, nodes, ctx, true, \"props\")),\n };\n if (component.description !== undefined && component.description !== null) out.description = component.description;\n if (component.category !== undefined && component.category !== \"custom\") out.category = capitalize(component.category);\n if (fieldsets.length) out.fieldsets = fieldsets;\n return out;\n}\n\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"values.js","names":[],"sources":["../../src/kit/adapters/values.ts"],"sourcesContent":["/**\n * VALUE ADAPTERS — a V2 stored value ↔ the value production stores for the same field (Lane C map,\n * docs/design-system/v2-map/C-controls.md §2, updated for F1). Storage stays prod's: `*ToProd` returns what the\n * backend accepts, `*FromProd` the V2 shape the kit controls edit.\n *\n * Every `*ToProd` returns `{ value, lost }`. `lost` names the V2 keys prod cannot keep (relative to the value), so\n * `*FromProd(*ToProd(v).value)` equals `v` minus exactly those keys. Nothing is dropped without being named.\n */\nimport type { ScaleSchema, ScaleValue } from \"../schema/types\";\nimport type { TableValue } from \"../schema/table\";\nimport {\n BUTTON_SIZES,\n BUTTON_VARIANTS,\n CODE_MAX_LENGTH,\n DOCK_ICON_NAME_SET,\n LINK_RELS,\n LINK_VALUE_TYPES,\n RATING_DEFAULT_MAX,\n TAG_VALUE_MAX_LENGTH,\n VIDEO_TRANSCRIPT_MAX,\n VIDEO_VALUE_KEYS,\n type DockIconName,\n type ProdButtonValue,\n type ProdFormRef,\n type ProdImageCrop,\n type ProdImageValue,\n type ProdLinkValue,\n type ProdPolymorphicRef,\n type ProdVideoValue,\n type ScaleUnit,\n} from \"./prod-types\";\n\nexport interface ValueResult<T> {\n value: T;\n /** V2 keys (dotted, relative to the value) production cannot keep. */\n lost: string[];\n}\n\ntype Obj = Record<string, unknown>;\nconst isObj = (v: unknown): v is Obj => !!v && typeof v === \"object\" && !Array.isArray(v);\n\n/* ── V2 value shapes (DESIGN §6.7, §6.9; V2 HEAD controls/link.tsx, controls/media.tsx) ── */\nexport type V2LinkType = \"page\" | \"entry\" | \"url\" | \"section\" | \"email\" | \"phone\" | \"file\";\nexport type V2ButtonStyle = \"primary\" | \"secondary\" | \"outline\" | \"link\";\nexport interface V2LinkValue {\n type?: V2LinkType;\n href: string;\n label?: string;\n title?: string;\n pageId?: string;\n entryId?: string;\n anchor?: string;\n assetId?: string;\n email?: string;\n subject?: string;\n phone?: string;\n target?: \"_self\" | \"_blank\";\n newTab?: boolean;\n rel?: \"follow\" | \"nofollow\" | \"ugc\" | \"sponsored\";\n}\nexport interface V2ButtonValue extends V2LinkValue {\n style?: V2ButtonStyle;\n variant?: V2ButtonStyle;\n size?: \"sm\" | \"md\" | \"lg\";\n arrow?: boolean;\n icon?: string;\n fullWidth?: boolean;\n}\nexport type V2ImageCrop = \"original\" | \"16:9\" | \"4:3\" | \"1:1\" | \"4:5\";\nexport interface V2ImageValue {\n url: string;\n alt?: string;\n /** percent */\n focal?: { x: number; y: number };\n crop?: V2ImageCrop;\n caption?: string;\n name?: string;\n width?: number;\n height?: number;\n size?: number;\n id?: string;\n}\n\n/** The keys only a button carries; a link field never stores them. */\nconst BUTTON_ONLY = [\"style\", \"variant\", \"size\", \"arrow\", \"icon\", \"fullWidth\"] as const;\nconst isScriptHref = (href: string) => /^(javascript|data|vbscript):/i.test(href.replace(/[\\u0000- \\u007F]/g, \"\"));\n\n/* ── link ─────────────────────────────────────────────────────────────── */\n/**\n * F1 stores the V2 link object as sent (link-value.ts: the kit's pageId, entryId, anchor, email, phone, label… are\n * kept), plus `ref` for a page / entry link so delivery resolves it. A bare href string stays a string.\n */\nexport function linkToProd(v: V2LinkValue | string | null | undefined): ValueResult<ProdLinkValue | string | null> {\n if (v == null) return { value: null, lost: [] };\n if (typeof v === \"string\") return isScriptHref(v) ? { value: null, lost: [\"\"] } : { value: v, lost: [] };\n if (isScriptHref(v.href)) return { value: null, lost: [\"\"] };\n const lost: string[] = [];\n const out: Obj = {};\n for (const [k, x] of Object.entries(v)) {\n if ((BUTTON_ONLY as readonly string[]).includes(k)) lost.push(k);\n else out[k] = x;\n }\n if (v.type !== undefined && !(LINK_VALUE_TYPES as readonly string[]).includes(v.type)) {\n lost.push(\"type\");\n delete out.type;\n }\n // The backend refuses a target that disagrees with newTab; newTab is the one the kit reads.\n if (typeof v.newTab === \"boolean\" && v.target !== undefined && v.newTab !== (v.target === \"_blank\")) {\n lost.push(\"target\");\n delete out.target;\n }\n const ref = v.type === \"page\" ? v.pageId : v.type === \"entry\" ? v.entryId : undefined;\n if (ref) out.ref = ref;\n return { value: out as unknown as ProdLinkValue, lost };\n}\n\nexport function linkFromProd(v: unknown): V2LinkValue | string | null {\n if (typeof v === \"string\") return v;\n if (!isObj(v) || typeof v.href !== \"string\") return null;\n const { ref, ...rest } = v;\n const out = rest as unknown as V2LinkValue;\n // `ref` mirrors the kit's own id key; a ref with no twin (written by another client) becomes that key.\n if (typeof ref === \"string\") {\n if (out.type === \"page\" && out.pageId === undefined) out.pageId = ref;\n if (out.type === \"entry\" && out.entryId === undefined) out.entryId = ref;\n }\n return out;\n}\n\n/* ── button ───────────────────────────────────────────────────────────── */\n/**\n * A V2 button is a link with a label and a look, flattened. Prod's ButtonValue reads `label`, `href` (string or link\n * object), `variant`, `size`, `arrow`, `icon` (a dock icon name), `newTab`, `rel`; other keys are kept and ignored,\n * so the link half (type, pageId, anchor…) rides along as sent. The look is written as `variant` (what renderers read).\n */\nexport function buttonToProd(v: V2ButtonValue | null | undefined): ValueResult<ProdButtonValue | null> {\n if (v == null) return { value: null, lost: [] };\n if (typeof v.href === \"string\" && isScriptHref(v.href)) return { value: null, lost: [\"\"] };\n const lost: string[] = [];\n const out: Obj = { ...v };\n const valid = (x: unknown) => typeof x === \"string\" && (BUTTON_VARIANTS as readonly string[]).includes(x);\n // the first valid of variant, style is the look prod renders; an invalid variant never shadows a valid style\n const look = [v.variant, v.style].find(valid);\n if (look !== undefined) out.variant = look;\n else delete out.variant;\n if (v.variant !== undefined && !valid(v.variant)) lost.push(\"variant\");\n // Both set: the kit writes them in sync, prod keeps one look.\n if (v.style !== undefined && v.variant !== undefined && v.style === v.variant) lost.push(\"variant\");\n if (v.size !== undefined && !(BUTTON_SIZES as readonly string[]).includes(v.size)) {\n lost.push(\"size\");\n delete out.size;\n }\n if (v.icon !== undefined && !DOCK_ICON_NAME_SET.has(v.icon)) {\n lost.push(\"icon\");\n delete out.icon;\n }\n // A button's rel is one of nofollow / sponsored / ugc; \"follow\" is no rel at all.\n if (v.rel !== undefined && !(LINK_RELS as readonly string[]).includes(v.rel)) {\n lost.push(\"rel\");\n delete out.rel;\n }\n if (typeof v.newTab === \"boolean\" && v.target !== undefined && v.newTab !== (v.target === \"_blank\")) {\n lost.push(\"target\");\n delete out.target;\n }\n // fullWidth is true or false (the backend refuses anything else a write brings: button_full_width_invalid)\n if (v.fullWidth !== undefined && typeof v.fullWidth !== \"boolean\") {\n lost.push(\"fullWidth\");\n delete out.fullWidth;\n }\n // prod's ButtonValue requires both; a filled-in \"\" reads back where the kit had nothing, so it is named\n if (typeof out.label !== \"string\") {\n out.label = \"\";\n lost.push(\"label\");\n }\n if (typeof out.href !== \"string\") {\n out.href = \"\";\n lost.push(\"href\");\n }\n return { value: out as unknown as ProdButtonValue, lost: [...new Set(lost)] };\n}\n\nexport function buttonFromProd(v: unknown): V2ButtonValue | null {\n if (!isObj(v)) return null;\n const out: Obj = { ...v };\n if (isObj(v.href)) {\n // A link object in `href` (written by another client): flatten it the way the kit stores a button.\n const link = linkFromProd(v.href);\n if (isObj(link)) Object.assign(out, link);\n }\n if (out.style !== undefined && out.variant === out.style) delete out.variant;\n if (out.icon === null) delete out.icon;\n return out as unknown as V2ButtonValue;\n}\n\n/* ── date / datetime ──────────────────────────────────────────────────── */\nconst ZONED = /^(.*)\\[([^\\]]+)\\]$/;\nconst NO_SECONDS = /^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2})(Z|[+-]\\d{2}:?\\d{2})?$/;\nconst OFFSET = /(?:Z|[+-]\\d{2}:?\\d{2})$/;\n\n/** A date is the same \"YYYY-MM-DD\" string on both sides. */\nexport const dateToProd = (v: string | null | undefined): ValueResult<string | null> => ({ value: v ?? null, lost: [] });\nexport const dateFromProd = (v: unknown): string | null => (typeof v === \"string\" ? v : null);\n\n/**\n * V2 stores RFC 9557 (`2026-10-14T09:00:00+05:30[Asia/Kolkata]`). Prod keeps the ISO instant with seconds and its\n * offset; a `[Zone]` suffix is checked and dropped on write. So the zone survives only as the field's own\n * `config.timezone` when that names it (pass it as `zone`); otherwise it is lost.\n */\nexport function datetimeToProd(v: string | null | undefined, opts: { zone?: string } = {}): ValueResult<string | null> {\n if (v == null || v === \"\") return { value: v ?? null, lost: [] };\n const lost: string[] = [];\n const m = ZONED.exec(v);\n let bare = m ? m[1] : v;\n // the zone reads back only from config.timezone, and only onto a value with an offset\n if (m && (m[2] !== opts.zone || !OFFSET.test(bare))) lost.push(\"zone\");\n const short = NO_SECONDS.exec(bare);\n if (short) {\n bare = `${short[1]}:00${short[2] ?? \"\"}`;\n lost.push(\"format\");\n }\n return { value: bare, lost };\n}\n\nexport function datetimeFromProd(v: unknown, opts: { zone?: string } = {}): string | null {\n if (typeof v !== \"string\") return null;\n const zone = opts.zone && opts.zone !== \"site\" ? opts.zone : undefined;\n return zone && OFFSET.test(v) && !ZONED.test(v) ? `${v}[${zone}]` : v;\n}\n\n/* ── image ────────────────────────────────────────────────────────────── */\nconst CROPS: Record<Exclude<V2ImageCrop, \"original\">, number> = { \"16:9\": 16 / 9, \"4:3\": 4 / 3, \"1:1\": 1, \"4:5\": 4 / 5 };\nconst round = (n: number) => Math.round(n * 1e6) / 1e6;\nconst clamp01 = (n: number) => Math.min(1, Math.max(0, n));\n\n/** A crop preset → the centred-on-focal rect prod stores. Needs the image's pixel size. */\nexport function cropRect(crop: V2ImageCrop, width: number, height: number, focal = { x: 50, y: 50 }): ProdImageCrop | undefined {\n if (crop === \"original\" || !(width > 0 && height > 0)) return undefined;\n const want = CROPS[crop];\n const have = width / height;\n const w = want < have ? want / have : 1;\n const h = want < have ? 1 : have / want;\n const left = clamp01(Math.min(1 - w, Math.max(0, focal.x / 100 - w / 2)));\n const top = clamp01(Math.min(1 - h, Math.max(0, focal.y / 100 - h / 2)));\n return { top: round(top), right: round(1 - left - w), bottom: round(1 - top - h), left: round(left) };\n}\n\n/** A stored rect → the preset whose aspect it cuts (within 1%), when the image's pixel size is known. */\nexport function cropPreset(rect: ProdImageCrop, width: number, height: number): V2ImageCrop | undefined {\n const w = (1 - rect.left - rect.right) * width;\n const h = (1 - rect.top - rect.bottom) * height;\n if (!(w > 0 && h > 0)) return undefined;\n const ratio = w / h;\n const hit = (Object.entries(CROPS) as [V2ImageCrop, number][]).find(([, r]) => Math.abs(ratio - r) / r < 0.01);\n return hit?.[0];\n}\n\n/** The asset facts an image value refers to but prod does not store in the value (width, height, size). */\nexport interface ImageAsset {\n width?: number;\n height?: number;\n size?: number;\n}\n\n/**\n * The contract holds against `imageFromProd(value)` with no asset (how stored defaults are read): a crop rect needs the\n * image's pixel size to read back as its preset, and width / height / size live on the asset, so all four are named in\n * `lost`. Passing the asset to imageFromProd restores them.\n */\nexport function imageToProd(v: V2ImageValue | string | null | undefined): ValueResult<ProdImageValue | string | null> {\n if (v == null) return { value: null, lost: [] };\n if (typeof v === \"string\") return { value: v, lost: [] };\n const lost: string[] = [];\n const out: ProdImageValue = { url: v.url };\n if (v.id !== undefined) out.id = v.id;\n if (v.name !== undefined) out.name = v.name;\n if (v.alt !== undefined) out.altText = v.alt;\n if (v.focal) out.focal = { x: round(v.focal.x / 100), y: round(v.focal.y / 100) };\n if (v.crop !== undefined && v.crop !== \"original\") {\n const rect = v.width && v.height ? cropRect(v.crop, v.width, v.height, v.focal) : undefined;\n if (rect) out.crop = rect;\n lost.push(\"crop\"); // written as a rect, it reads back as the preset only with the asset's size\n } else if (v.crop === \"original\") lost.push(\"crop\");\n // The normaliser rebuilds the value from these keys; the rest is the asset's (width, height, size) or has no home.\n for (const k of [\"caption\", \"width\", \"height\", \"size\"] as const) if (v[k] !== undefined) lost.push(k);\n for (const k of Object.keys(v)) if (![\"url\", \"id\", \"name\", \"alt\", \"focal\", \"crop\", \"caption\", \"width\", \"height\", \"size\"].includes(k)) lost.push(k);\n return { value: out, lost };\n}\n\n/** Pass the asset's pixel size to read a stored crop rect back as its preset and to restore width / height / size. */\nexport function imageFromProd(v: unknown, asset: ImageAsset = {}): V2ImageValue | string | null {\n if (typeof v === \"string\") return v;\n if (!isObj(v) || typeof v.url !== \"string\") return null;\n const p = v as unknown as ProdImageValue;\n const out: V2ImageValue = { url: p.url };\n if (p.id !== undefined) out.id = p.id;\n if (p.name !== undefined) out.name = p.name;\n if (p.altText !== undefined) out.alt = p.altText;\n if (p.focal) out.focal = { x: round(p.focal.x * 100), y: round(p.focal.y * 100) };\n if (p.crop && asset.width && asset.height) {\n const preset = cropPreset(p.crop, asset.width, asset.height);\n if (preset) out.crop = preset;\n }\n if (asset.width !== undefined) out.width = asset.width;\n if (asset.height !== undefined) out.height = asset.height;\n if (asset.size !== undefined) out.size = asset.size;\n return out;\n}\n\n/* ── reference ────────────────────────────────────────────────────────── */\n/**\n * V2 stores the target id (`\"en_12\"`; a list for many). Prod stores the same id, or `{ entryId, modelSlug }` on a\n * polymorphic field (pass `modelSlug`), or `{ formId }` on a component `form` prop (`to: \"form\"`).\n */\nexport function referenceToProd(\n v: string | string[] | null | undefined,\n opts: { to?: \"form\"; modelSlug?: string } = {},\n): ValueResult<string | string[] | ProdPolymorphicRef | ProdFormRef | null> {\n if (v == null || v === \"\") return { value: null, lost: [] };\n if (Array.isArray(v)) return { value: [...v], lost: [] };\n if (opts.to === \"form\") return { value: { formId: v }, lost: [] };\n if (opts.modelSlug) return { value: { entryId: v, modelSlug: opts.modelSlug }, lost: [] };\n return { value: v, lost: [] };\n}\n\nconst refId = (v: unknown): string | null =>\n typeof v === \"string\" ? v || null : isObj(v) ? ((typeof v.entryId === \"string\" && v.entryId) || (typeof v.formId === \"string\" && v.formId) || null) : null;\n\nexport function referenceFromProd(v: unknown): string | string[] | null {\n if (Array.isArray(v)) return v.map(refId).filter((x): x is string => !!x);\n return refId(v);\n}\n\n/* ── table ────────────────────────────────────────────────────────────── */\n/**\n * Prod has no table type: the schema adapter stores a V2 table as a `json` field (named in the lossy ledger), and\n * `json` keeps any JSON value, so the TableValue itself is stored verbatim (typed columns, groups, footer,\n * footnotes, caption, design, jsonLd).\n */\nexport function tableToProd(v: TableValue | null | undefined): ValueResult<TableValue | null> {\n return { value: v == null ? null : (JSON.parse(JSON.stringify(v)) as TableValue), lost: [] };\n}\nexport const tableFromProd = (v: unknown): TableValue | null => (isObj(v) ? (v as unknown as TableValue) : null);\n\n/* ── scale ────────────────────────────────────────────────────────────── */\nconst SCALE_UNITS: readonly ScaleUnit[] = [\"px\", \"%\", \"rem\", \"em\", \"vw\", \"vh\"];\n/**\n * Prod stores the three V2 scale shapes as they are (CPO D41, reference-validation.ts scaleValueProblem): a bare number,\n * a token step's string, a custom `{ value, unit }`. Pass the field's scale: a token it does not list, or a custom value\n * it does not allow (allowCustom off, a unit outside its units, past its bounds), is refused by the backend, so it is\n * not written (`lost: [\"\"]`). With no scale only a number is known to fit.\n */\nexport function scaleToProd(v: ScaleValue | null | undefined, scale?: ScaleSchema): ValueResult<ScaleValue | null> {\n if (v == null) return { value: null, lost: [] };\n if (typeof v === \"number\") return Number.isFinite(v) ? { value: v, lost: [] } : { value: null, lost: [\"\"] };\n const refused = { value: null, lost: [\"\"] };\n if (!scale) return refused;\n if (typeof v === \"string\") return Array.isArray(scale.steps) && scale.steps.some((x) => x.value === v) ? { value: v, lost: [] } : refused;\n if (!isObj(v) || !scale.allowCustom || typeof v.value !== \"number\" || !Number.isFinite(v.value) || Object.keys(v).some((k) => k !== \"value\" && k !== \"unit\")) return refused;\n const custom = typeof scale.allowCustom === \"object\" ? scale.allowCustom : {};\n const units = custom.units ?? scale.units ?? SCALE_UNITS;\n if (!units.includes(v.unit)) return refused;\n const bound = (b: number | Partial<Record<ScaleUnit, number>> | undefined) => (typeof b === \"number\" ? b : b?.[v.unit]);\n const min = bound(custom.min);\n const max = bound(custom.max);\n if ((min !== undefined && v.value < min) || (max !== undefined && v.value > max)) return refused;\n return { value: { value: v.value, unit: v.unit }, lost: [] };\n}\nexport function scaleFromProd(v: unknown): ScaleValue | null {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v === \"string\") return v;\n if (isObj(v) && typeof v.value === \"number\" && typeof v.unit === \"string\" && (SCALE_UNITS as readonly string[]).includes(v.unit)) return { value: v.value, unit: v.unit as ScaleUnit };\n return null;\n}\n\n/* ── video ────────────────────────────────────────────────────────────── */\nexport type V2VideoValue = string | { url: string; poster?: string; autoplay?: boolean; loop?: boolean; transcript?: string };\n/** An http(s) URL or a site path; \"\" is an unset one (video-value.ts isVideoUrl). */\nconst isVideoUrl = (s: string) => s === \"\" || /^https?:\\/\\/[^\\s]+$/i.test(s.trim()) || /^\\/(?!\\/)\\S*$/.test(s.trim());\n/**\n * The V2 video value and prod's are the same shape: a URL string, or `{ url, poster?, autoplay?, loop?, transcript? }`\n * (the video block's props). The backend refuses any other key, and a url or poster that is not an http(s) URL or a\n * site path (video_value_invalid): another key is left out and named, a bad url refuses the value whole.\n */\nexport function videoToProd(v: V2VideoValue | null | undefined): ValueResult<ProdVideoValue | string | null> {\n if (v == null) return { value: null, lost: [] };\n if (typeof v === \"string\") return isVideoUrl(v) ? { value: v, lost: [] } : { value: null, lost: [\"\"] };\n if (!isObj(v) || typeof v.url !== \"string\" || !isVideoUrl(v.url)) return { value: null, lost: [\"\"] };\n const lost: string[] = [];\n const out: Obj = {};\n for (const [k, x] of Object.entries(v)) {\n const ok =\n !(VIDEO_VALUE_KEYS as readonly string[]).includes(k) ? false\n : k === \"url\" ? true\n : k === \"poster\" ? typeof x === \"string\" && isVideoUrl(x)\n : k === \"transcript\" ? typeof x === \"string\" && x.length <= VIDEO_TRANSCRIPT_MAX\n : typeof x === \"boolean\";\n if (ok) out[k] = x;\n else if (x !== undefined) lost.push(k);\n }\n return { value: out as unknown as ProdVideoValue, lost };\n}\nexport function videoFromProd(v: unknown): V2VideoValue | null {\n if (typeof v === \"string\") return v;\n if (!isObj(v) || typeof v.url !== \"string\") return null;\n return { ...v } as V2VideoValue;\n}\n\n/* ── primitive lists ──────────────────────────────────────────────────── */\nexport type ListItemType = \"text\" | \"number\" | \"date\" | \"image\" | \"link\" | \"richtext\";\n/**\n * A V2 list of one primitive (`of: [{ type }]`) is a prod `array` with `config.itemType`, each item judged and normalized\n * as a field of its type: an image item stores prod's image keys (altText, 0–1 focal), a link item its stored link. Scalar\n * and rich text items pass as they are. `lost` names `<index>/<key>` (or `<index>` for a whole item) per item.\n */\nexport function listToProd(v: unknown, itemType: ListItemType): ValueResult<unknown[] | null> {\n if (v == null) return { value: null, lost: [] };\n if (!Array.isArray(v)) return { value: null, lost: [\"\"] };\n const lost: string[] = [];\n const out: unknown[] = [];\n v.forEach((x, i) => {\n const r = itemType === \"image\" ? imageToProd(x as V2ImageValue) : itemType === \"link\" ? linkToProd(x as V2LinkValue) : { value: x, lost: [] };\n for (const l of r.lost) lost.push(l ? `${i}/${l}` : String(i));\n out.push(r.value);\n });\n return { value: out, lost };\n}\nexport function listFromProd(v: unknown, itemType: ListItemType): unknown[] {\n if (!Array.isArray(v)) return [];\n return itemType === \"image\" ? v.map((x) => imageFromProd(x)) : itemType === \"link\" ? v.map((x) => linkFromProd(x)) : [...v];\n}\n\n/* ── tags ─────────────────────────────────────────────────────────────── */\n/**\n * The backend judges tags trimmed and case-insensitively (reference-validation.ts tagsValueProblem): a field write\n * trims and de-dupes, a prop value is refused (tags_value_invalid). So the value is written clean for both: trimmed,\n * first spelling of a case-repeat kept, and an empty, over-long, off-list (`allowCustom: false`) or over-`max` tag left\n * out. `lost` names each changed or dropped tag by its index in `v`.\n */\nexport function tagsToProd(\n v: string[] | null | undefined,\n opts: { max?: number; allowCustom?: boolean; options?: (string | { value: string })[] } = {},\n): ValueResult<string[] | null> {\n if (v == null) return { value: null, lost: [] };\n const allowed = opts.allowCustom === false ? new Set((opts.options ?? []).map((o) => (typeof o === \"string\" ? o : o.value).trim().toLowerCase())) : undefined;\n const out: string[] = [];\n const seen = new Set<string>();\n const lost: string[] = [];\n v.forEach((x, i) => {\n const t = typeof x === \"string\" ? x.trim() : \"\";\n const folded = t.toLowerCase();\n const keep =\n t !== \"\" && Array.from(t).length <= TAG_VALUE_MAX_LENGTH && !seen.has(folded) && (!allowed || allowed.has(folded)) && (opts.max === undefined || out.length < opts.max);\n if (keep) {\n seen.add(folded);\n out.push(t);\n }\n if (!keep || t !== x) lost.push(String(i));\n });\n return { value: out, lost };\n}\nexport const tagsFromProd = (v: unknown): string[] => (Array.isArray(v) ? v.filter((x): x is string => typeof x === \"string\") : []);\n\n/* ── rating ───────────────────────────────────────────────────────────── */\nexport interface RatingScale {\n min?: number;\n max?: number;\n step?: number;\n}\n/**\n * A prod rating runs from config.min (0 unset) to config.max (5 unset) in steps of config.step (1 unset), and 0 is \"not\n * rated\" on every scale (validation-parity.ts ratingScale / onRatingScale). V2's empty rating is null: it is written as\n * null, and any other number off the scale is refused by the backend (rating_value_invalid), so it is not written either.\n */\nexport function ratingToProd(v: number | null | undefined, opts: RatingScale = {}): ValueResult<number | null> {\n if (v == null) return { value: null, lost: [] };\n const min = opts.min ?? 0;\n const max = opts.max ?? RATING_DEFAULT_MAX;\n const step = opts.step ?? 1;\n const steps = (v - min) / step;\n const ok = Number.isFinite(v) && v >= min && v <= max && Math.abs(steps - Math.round(steps)) < 1e-9;\n return ok ? { value: v, lost: [] } : { value: null, lost: [\"\"] };\n}\n/** A stored number back; 0 on a scale that starts above it is prod's \"not rated\", which V2 holds as null. */\nexport function ratingFromProd(v: unknown, opts: RatingScale = {}): number | null {\n if (typeof v !== \"number\" || !Number.isFinite(v)) return null;\n return v === 0 && (opts.min ?? 0) > 0 ? null : v;\n}\n\n/* ── code ─────────────────────────────────────────────────────────────── */\nexport type V2CodeValue = string | { language?: string; code: string };\n/**\n * Prod stores a code value as a string, or `{ language?, code }` (no other key). A language outside the field's\n * `config.languages` is refused by the backend (code_value_invalid), so it is left out and named; a value over\n * CODE_MAX_LENGTH characters is refused whole.\n */\nexport function codeToProd(v: V2CodeValue | null | undefined, opts: { languages?: string[] } = {}): ValueResult<V2CodeValue | null> {\n if (v == null) return { value: null, lost: [] };\n const code = typeof v === \"string\" ? v : v.code;\n if (typeof code !== \"string\" || code.length > CODE_MAX_LENGTH) return { value: null, lost: [\"\"] };\n if (typeof v === \"string\") return { value: v, lost: [] };\n const lost = Object.keys(v).filter((k) => k !== \"code\" && k !== \"language\");\n const out: { language?: string; code: string } = { code };\n if (v.language !== undefined) {\n if (typeof v.language === \"string\" && (!opts.languages || opts.languages.includes(v.language))) out.language = v.language;\n else lost.push(\"language\");\n }\n return { value: out, lost };\n}\nexport function codeFromProd(v: unknown): V2CodeValue | null {\n if (typeof v === \"string\") return v;\n if (!isObj(v) || typeof v.code !== \"string\") return null;\n return typeof v.language === \"string\" ? { language: v.language, code: v.code } : { code: v.code };\n}\n\n/* ── zoned arrays ─────────────────────────────────────────────────────── */\n/** A V2 list of object items is stored by prod as the repeatable zone of its array: `{ repeatable: [...] }`. */\nexport const zoneListToProd = (v: unknown[] | null | undefined): { repeatable: unknown[] } => ({ repeatable: v ? [...v] : [] });\nexport const zoneListFromProd = (v: unknown): unknown[] => (isObj(v) && Array.isArray(v.repeatable) ? [...v.repeatable] : Array.isArray(v) ? [...v] : []);\n\n/** A dock icon name passes through; anything else is not a prod icon. */\nexport const isDockIcon = (v: unknown): v is DockIconName => typeof v === \"string\" && DOCK_ICON_NAME_SET.has(v);\n"],"mappings":"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"}
package/brand/logo.js DELETED
@@ -1,9 +0,0 @@
1
- import "react";
2
- import "react/jsx-runtime";
3
- //#region src/kit/brand/logo.tsx
4
- /** boxicons:sparkle-circle-filled — path from public/brand/ai-sparkle-glyph.svg (viewBox 2 2 16 16). */
5
- var SPARKLE_PATH = "M9.4668 2.37243C9.64848 1.87586 10.351 1.87586 10.5326 2.37243L11.0754 3.85459C11.501 5.01732 12.1751 6.07325 13.0506 6.94879C13.9262 7.82432 14.9821 8.4984 16.1448 8.92405L17.627 9.4668C18.1243 9.64848 18.1243 10.351 17.627 10.5326L16.1448 11.0754C14.9821 11.501 13.9262 12.1751 13.0506 13.0506C12.1751 13.9262 11.501 14.9821 11.0754 16.1448L10.5326 17.627C10.351 18.1243 9.64848 18.1243 9.4668 17.627L8.92405 16.1448C8.4984 14.9821 7.82432 13.9262 6.94879 13.0506C6.07325 12.1751 5.01732 11.501 3.85459 11.0754L2.37243 10.5326C1.87586 10.351 1.87586 9.64848 2.37243 9.4668L3.85459 8.92405C5.01732 8.4984 6.07325 7.82432 6.94879 6.94879C7.82432 6.07325 8.4984 5.01732 8.92405 3.85459L9.4668 2.37243Z";
6
- //#endregion
7
- export { SPARKLE_PATH };
8
-
9
- //# sourceMappingURL=logo.js.map
package/brand/logo.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"logo.js","names":[],"sources":["../../src/kit/brand/logo.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/* OFFICIAL BetterCMS logo — exported from the V2 Figma (node 60995:8678 \"Link - BetterCMS home\").\n Mark: three facets with the brand gradient (#A878D2 → #ED6262 → #D13A3A).\n Wordmark: --wordmark (#291018 on light, = --fg on dark; kit.css has no wordmark token yet, so the V2 values are the fallbacks). Never redraw or recolor the mark. */\n\nconst ICON = [\"M12.7575 27.0001L1.51134 20.0938C0.572213 19.5171 0.000244141 18.4961 0.000244141 17.3965V8.59934C0.000244141 7.45142 0.623145 6.3933 1.62844 5.83354L9.5867 1.4023C10.4896 0.899541 11.5815 0.866267 12.5135 1.3131L23.8336 6.74014L14.354 12.1618C13.3665 12.7265 12.7575 13.7747 12.7575 14.9096V27.0001Z\", \"M14.3398 16.0219V18.8735L22.2169 13.8627C23.1316 13.2808 23.6853 12.2739 23.6853 11.1921V8.29945L15.7983 13.3576C14.8893 13.9406 14.3398 14.9443 14.3398 16.0219Z\", \"M14.3398 22.2591V25.1107L22.2169 20.0999C23.1316 19.518 23.6853 18.5111 23.6853 17.4293V14.5367L15.7983 19.5948C14.8893 20.1779 14.3398 21.1815 14.3398 22.2591Z\"];\nconst WORD = [\"M70.5658 20.3613V10.9967H72.1245V12.1933C72.8865 11.2048 73.8044 10.8407 75.2418 10.9274V12.7136C73.2675 12.6095 72.1245 13.598 72.1245 15.4362V20.3613H70.5658Z\", \"M65.4408 20.5694C62.8083 20.5694 61.1977 18.4537 61.1977 15.679C61.1977 12.8696 62.8603 10.8406 65.3888 10.8406C67.8134 10.8406 69.4067 12.7309 69.4067 15.4015V16.0779H62.8083C62.9123 17.76 63.8994 19.0433 65.4408 19.0433C66.5319 19.0433 67.4497 18.4363 67.9866 17.2744L69.2682 17.9161C68.4889 19.7023 67.138 20.5694 65.4408 20.5694ZM62.8776 14.6212H67.7615C67.5883 13.2858 66.705 12.3494 65.3888 12.3494C64.0207 12.3494 63.1028 13.3379 62.8776 14.6212Z\", \"M59.2561 20.5693C57.5935 20.5693 56.918 19.9276 56.918 18.2975V12.5053H55.394V10.9966H56.918V8.37799H58.4767V10.9966H60.3298V12.5053H58.4767V18.072C58.4767 18.8524 58.8231 19.0085 59.3253 19.0085H60.4164V20.4999C60.07 20.5346 59.6371 20.5693 59.2561 20.5693Z\", \"M53.3658 20.5693C51.7033 20.5693 51.0278 19.9276 51.0278 18.2975V12.5053H49.5038V10.9966H51.0278V8.37799H52.5865V10.9966H54.4396V12.5053H52.5865V18.072C52.5865 18.8524 52.9329 19.0085 53.4351 19.0085H54.5262V20.4999C54.1798 20.5346 53.7469 20.5693 53.3658 20.5693Z\", \"M44.9815 20.5695C42.3491 20.5695 40.7384 18.4538 40.7384 15.6791C40.7384 12.8697 42.401 10.8408 44.9296 10.8408C47.3542 10.8408 48.9475 12.731 48.9475 15.4016V16.078H42.3491C42.453 17.7601 43.4402 19.0434 44.9815 19.0434C46.0726 19.0434 46.9905 18.4365 47.5274 17.2746L48.8089 17.9162C48.0296 19.7024 46.6787 20.5695 44.9815 20.5695ZM42.4184 14.6213H47.3022C47.129 13.286 46.2458 12.3495 44.9296 12.3495C43.5614 12.3495 42.6435 13.338 42.4184 14.6213Z\", \"M29.834 20.3613V7.32031H35.1162C37.6447 7.32031 39.0995 8.5169 39.0995 10.5806C39.0995 11.8639 38.5279 12.8697 37.4542 13.4593C38.8743 13.9449 39.6537 15.0894 39.6537 16.5808C39.6537 18.8353 37.8352 20.3613 35.1854 20.3613H29.834ZM31.3927 12.7483H34.6486C36.4151 12.7483 37.5581 11.9506 37.5581 10.6673C37.5581 9.52272 36.6229 8.86373 35.0469 8.86373H31.3927V12.7483ZM31.3927 18.8006H35.0642C36.9346 18.8006 38.0603 17.9682 38.043 16.5808C38.0603 15.1415 36.848 14.257 34.891 14.257H31.3927V18.8006Z\", \"M107.608 20.6788C104.835 20.6788 103.115 19.3074 102.697 16.7653L104.2 16.4643C104.501 18.2538 105.637 19.1736 107.524 19.1736C109.345 19.1736 110.614 18.3039 110.614 17.0663C110.614 15.9793 109.629 15.2267 107.224 14.5242C104.301 13.688 103.048 12.4504 103.048 10.7111C103.048 8.72086 104.685 7.48326 107.307 7.48326C109.862 7.48326 111.399 8.65396 111.917 10.895L110.364 11.2295C110.03 9.72433 109.027 8.97173 107.274 8.97173C105.637 8.97173 104.618 9.60726 104.618 10.6943C104.618 11.6978 105.47 12.3835 107.858 13.1194C110.998 14.0727 112.167 15.3103 112.167 17.0663C112.167 19.2572 110.38 20.6788 107.608 20.6788Z\", \"M89.8249 20.3612V7.78442H91.7289L95.871 18.2204L99.9463 7.78442H101.85V20.3612H100.347V10.6945L96.5725 20.3612H95.1695L91.328 10.6945V20.3612H89.8249Z\", \"M83.2802 20.6788C79.6558 20.6788 77.0837 18.0364 77.0837 14.24C77.0837 10.3766 79.8061 7.4833 83.4639 7.4833C85.9692 7.4833 87.9902 8.82125 88.9756 11.079L87.3889 11.4303C86.6206 9.90833 85.2009 9.02194 83.4305 9.02194C80.6579 9.02194 78.7038 11.1961 78.7038 14.1731C78.7038 17.0998 80.5911 19.1569 83.2635 19.1569C85.2343 19.1569 86.8043 18.0364 87.5392 16.1967L89.0424 16.5312C88.0737 19.1569 86.036 20.6788 83.2802 20.6788Z\"];\n/** boxicons:sparkle-circle-filled — path from public/brand/ai-sparkle-glyph.svg (viewBox 2 2 16 16). */\nexport const SPARKLE_PATH = \"M9.4668 2.37243C9.64848 1.87586 10.351 1.87586 10.5326 2.37243L11.0754 3.85459C11.501 5.01732 12.1751 6.07325 13.0506 6.94879C13.9262 7.82432 14.9821 8.4984 16.1448 8.92405L17.627 9.4668C18.1243 9.64848 18.1243 10.351 17.627 10.5326L16.1448 11.0754C14.9821 11.501 13.9262 12.1751 13.0506 13.0506C12.1751 13.9262 11.501 14.9821 11.0754 16.1448L10.5326 17.627C10.351 18.1243 9.64848 18.1243 9.4668 17.627L8.92405 16.1448C8.4984 14.9821 7.82432 13.9262 6.94879 13.0506C6.07325 12.1751 5.01732 11.501 3.85459 11.0754L2.37243 10.5326C1.87586 10.351 1.87586 9.64848 2.37243 9.4668L3.85459 8.92405C5.01732 8.4984 6.07325 7.82432 6.94879 6.94879C7.82432 6.07325 8.4984 5.01732 8.92405 3.85459L9.4668 2.37243Z\";\nexport const BRAND_STOPS = [\n { offset: 0.0817, color: \"#A878D2\" },\n { offset: 0.4808, color: \"#ED6262\" },\n { offset: 0.9231, color: \"#D13A3A\" },\n];\n\nfunction MarkGradient({ id }: { id: string }) {\n return (\n <linearGradient id={id} x1=\"8.81595\" y1=\"-2.84571\" x2=\"18.8801\" y2=\"29.1204\" gradientUnits=\"userSpaceOnUse\">\n {BRAND_STOPS.map((s) => <stop key={s.offset} offset={s.offset} stopColor={s.color} />)}\n </linearGradient>\n );\n}\n\n/** The mark alone (square). */\nexport function LogoMark({ size = 24, className }: { size?: number; className?: string }) {\n const id = React.useId().replace(/:/g, \"\");\n return (\n <svg width={size} height={size} viewBox=\"-1 0 26 28\" className={cn(\"shrink-0\", className)} aria-hidden>\n <defs><MarkGradient id={`bm${id}`} /></defs>\n {ICON.map((d) => <path key={d.slice(0, 12)} d={d} fill={`url(#bm${id})`} />)}\n </svg>\n );\n}\n\n/** Full lockup: mark + \"BetterCMS\" wordmark. Height-driven (default 24px → 106px wide). */\nexport function Logo({ className, compact, height = 24 }: { className?: string; compact?: boolean; height?: number }) {\n const id = React.useId().replace(/:/g, \"\");\n if (compact) return <LogoMark size={height} className={className} />;\n return (\n <svg height={height} width={(height * 113) / 28} viewBox=\"0 0 113 28\" className={cn(\"shrink-0 text-[var(--kit-wordmark,#291018)] [.dark_&]:text-[var(--kit-fg,#e1e1e4)]\", className)} role=\"img\" aria-label=\"BetterCMS\">\n <defs><MarkGradient id={`bl${id}`} /></defs>\n {ICON.map((d) => <path key={d.slice(0, 12)} d={d} fill={`url(#bl${id})`} />)}\n {WORD.map((d) => <path key={d.slice(0, 12)} d={d} fill=\"currentColor\" />)}\n </svg>\n );\n}\n"],"mappings":";;;;AAUA,IAAa,eAAe"}