@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
@@ -3,9 +3,10 @@ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
3
3
  export declare const MODAL_LAYER = "data-kit-modal-layer";
4
4
  /** Drop-in for Tooltip.Root (controlled or not) that closes itself when a modal layer opens. */
5
5
  export declare function TooltipRoot({ open: openProp, defaultOpen, onOpenChange, ...props }: TooltipPrimitive.Root.Props): import("react/jsx-runtime").JSX.Element;
6
- /** The ink tooltip surface (V2 .glass-ink, radius 6, 8×4 padding, 12/500, 1.45 leading, wraps, fades in 160ms). */
7
- export declare const TOOLTIP_POPUP_CLASS: string;
8
- /** Portal → positioner (6px offset, 8px collision padding, z-90, its own kit scope) → ink popup. */
6
+ /** The ink tooltip surface (V2 overlay.tsx:42: .glass-ink, radius 6, 8×4 padding, 12/500, 1.45 leading, wraps, fades in
7
+ * 160ms on a delayed open). The --kit-z-tooltip layer sits on the positioner, the element Base UI places. */
8
+ export declare const TOOLTIP_POPUP_CLASS = "flex max-w-[min(280px,calc(100vw-16px))] items-start gap-2 rounded-kit-md glass-ink px-2 py-1 text-kit-xs font-medium leading-[1.45] data-[open]:not-data-[instant]:animate-kit-fade-in";
9
+ /** Portal → positioner (6px offset, 8px collision padding, --kit-z-tooltip, its own kit scope) → ink popup (role="tooltip", as V2's). */
9
10
  export declare function TooltipLayer({ side, children, }: {
10
11
  side?: "top" | "bottom" | "left" | "right";
11
12
  children: React.ReactNode;
@@ -1,9 +1,8 @@
1
- import { cn } from "../lib/cn.js";
2
- import { INK, KIT_SCOPE } from "./surfaces.js";
1
+ import { KIT_SCOPE } from "./surfaces.js";
3
2
  import * as React from "react";
4
3
  import { jsx } from "react/jsx-runtime";
5
4
  import { Tooltip } from "@base-ui/react/tooltip";
6
- //#region src/kit/ui/tooltip-root.tsx
5
+ //#region src/ui/tooltip-root.tsx
7
6
  var MODAL_LAYER = "data-kit-modal-layer";
8
7
  var LAYER_SELECTOR = `[${MODAL_LAYER}]`;
9
8
  var listeners = /* @__PURE__ */ new Set();
@@ -53,17 +52,19 @@ function TooltipRoot({ open: openProp, defaultOpen, onOpenChange, ...props }) {
53
52
  onOpenChange: set
54
53
  });
55
54
  }
56
- /** The ink tooltip surface (V2 .glass-ink, radius 6, 8×4 padding, 12/500, 1.45 leading, wraps, fades in 160ms). */
57
- var TOOLTIP_POPUP_CLASS = cn("flex max-w-[min(280px,calc(100vw-16px))] items-start gap-2 rounded-kit-md px-2 py-1 font-kit-sans text-kit-xs font-medium leading-[1.45] data-[open]:not-data-[instant]:animate-kit-fade-in", INK);
58
- /** Portal → positioner (6px offset, 8px collision padding, z-90, its own kit scope) → ink popup. */
55
+ /** The ink tooltip surface (V2 overlay.tsx:42: .glass-ink, radius 6, 8×4 padding, 12/500, 1.45 leading, wraps, fades in
56
+ * 160ms on a delayed open). The --kit-z-tooltip layer sits on the positioner, the element Base UI places. */
57
+ var TOOLTIP_POPUP_CLASS = "flex max-w-[min(280px,calc(100vw-16px))] items-start gap-2 rounded-kit-md glass-ink px-2 py-1 text-kit-xs font-medium leading-[1.45] data-[open]:not-data-[instant]:animate-kit-fade-in";
58
+ /** Portal → positioner (6px offset, 8px collision padding, --kit-z-tooltip, its own kit scope) → ink popup (role="tooltip", as V2's). */
59
59
  function TooltipLayer({ side = "top", children }) {
60
60
  return /* @__PURE__ */ jsx(Tooltip.Portal, { children: /* @__PURE__ */ jsx(Tooltip.Positioner, {
61
61
  side,
62
62
  sideOffset: 6,
63
63
  collisionPadding: 8,
64
- className: "z-[90]",
64
+ className: "z-[var(--kit-z-tooltip,90)]",
65
65
  ...KIT_SCOPE,
66
66
  children: /* @__PURE__ */ jsx(Tooltip.Popup, {
67
+ role: "tooltip",
67
68
  "data-kit-tooltip": "",
68
69
  className: TOOLTIP_POPUP_CLASS,
69
70
  children
@@ -71,6 +72,6 @@ function TooltipLayer({ side = "top", children }) {
71
72
  }) });
72
73
  }
73
74
  //#endregion
74
- export { MODAL_LAYER, TooltipLayer, TooltipRoot };
75
+ export { MODAL_LAYER, TOOLTIP_POPUP_CLASS, TooltipLayer, TooltipRoot };
75
76
 
76
77
  //# sourceMappingURL=tooltip-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip-root.js","names":[],"sources":["../../src/ui/tooltip-root.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { Tooltip as TooltipPrimitive } from \"@base-ui/react/tooltip\";\nimport { KIT_SCOPE } from \"./surfaces\";\n\n/*\n * Tooltips close when a modal layer opens.\n *\n * Tooltips sit on --kit-z-tooltip, above dialogs (--kit-z-modal), the expanded editor and menus, so a tooltip that is open\n * when a modal opens would stay on top of it: hover \"Site settings\", open a dialog, and the hint floats over it.\n * Every modal layer in the kit marks its popup with data-kit-modal-layer (and Radix layers elsewhere in the app count\n * their scroll locks in body[data-scroll-locked]); a popover or menu marks its trigger aria-expanded. When any count\n * rises, a new layer opened, so every open tooltip closes. Tooltips inside the new layer still open normally afterwards.\n */\nexport const MODAL_LAYER = \"data-kit-modal-layer\";\nconst LAYER_SELECTOR = `[${MODAL_LAYER}]`;\nconst listeners = new Set<() => void>();\nlet observer: MutationObserver | null = null;\nlet layers = 0;\n/*\n * A POPOVER OR MENU counts too, by the trigger it opened from (`aria-expanded=\"true\"`, which Base UI and Radix both\n * set). Tooltips sit on --kit-z-tooltip, above the dashboard's popovers at --z-dropdown: a hint left open on a neighbouring\n * control when the publish popover opened stayed on screen UNDER it — ghost text behind the popover (closing QA\n * UI/UX #12). Non-modal popups mark nothing on the body, so they were never counted.\n */\nconst EXPANDED_SELECTOR = '[aria-expanded=\"true\"]';\nconst count = () =>\n (Number(document.body.getAttribute(\"data-scroll-locked\")) || 0) +\n document.querySelectorAll(LAYER_SELECTOR).length +\n document.querySelectorAll(EXPANDED_SELECTOR).length;\n\nfunction onModalLayerOpen(fn: () => void) {\n if (typeof document === \"undefined\" || typeof MutationObserver === \"undefined\") return () => {};\n if (!observer) {\n layers = count();\n observer = new MutationObserver(() => {\n const n = count();\n if (n > layers) listeners.forEach((l) => l());\n layers = n;\n });\n observer.observe(document.body, { attributes: true, attributeFilter: [\"data-scroll-locked\", \"aria-expanded\"], childList: true, subtree: true });\n }\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n if (!listeners.size) {\n observer?.disconnect();\n observer = null;\n }\n };\n}\n\n/** Drop-in for Tooltip.Root (controlled or not) that closes itself when a modal layer opens. */\nexport function TooltipRoot({ open: openProp, defaultOpen, onOpenChange, ...props }: TooltipPrimitive.Root.Props) {\n const [inner, setInner] = React.useState(!!defaultOpen);\n const open = openProp ?? inner;\n const change = React.useRef(onOpenChange);\n change.current = onOpenChange;\n const set = React.useCallback((o: boolean, details?: TooltipPrimitive.Root.ChangeEventDetails) => {\n setInner(o);\n if (details) change.current?.(o, details);\n }, []);\n React.useEffect(() => (open ? onModalLayerOpen(() => set(false)) : undefined), [open, set]);\n return <TooltipPrimitive.Root {...props} open={open} onOpenChange={set} />;\n}\n\n/** The ink tooltip surface (V2 overlay.tsx:42: .glass-ink, radius 6, 8×4 padding, 12/500, 1.45 leading, wraps, fades in\n * 160ms on a delayed open). The --kit-z-tooltip layer sits on the positioner, the element Base UI places. */\nexport const TOOLTIP_POPUP_CLASS =\n \"flex max-w-[min(280px,calc(100vw-16px))] items-start gap-2 rounded-kit-md glass-ink px-2 py-1 text-kit-xs font-medium leading-[1.45] data-[open]:not-data-[instant]:animate-kit-fade-in\";\n\n/** Portal → positioner (6px offset, 8px collision padding, --kit-z-tooltip, its own kit scope) → ink popup (role=\"tooltip\", as V2's). */\nexport function TooltipLayer({\n side = \"top\",\n children,\n}: {\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n children: React.ReactNode;\n}) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Positioner side={side} sideOffset={6} collisionPadding={8} className=\"z-[var(--kit-z-tooltip,90)]\" {...KIT_SCOPE}>\n <TooltipPrimitive.Popup role=\"tooltip\" data-kit-tooltip=\"\" className={TOOLTIP_POPUP_CLASS}>{children}</TooltipPrimitive.Popup>\n </TooltipPrimitive.Positioner>\n </TooltipPrimitive.Portal>\n );\n}\n"],"mappings":";;;;;AAaA,IAAa,cAAc;AAC3B,IAAM,iBAAiB,IAAI,YAAY;AACvC,IAAM,4BAAY,IAAI,IAAgB;AACtC,IAAI,WAAoC;AACxC,IAAI,SAAS;AAOb,IAAM,oBAAoB;AAC1B,IAAM,eACH,OAAO,SAAS,KAAK,aAAa,oBAAoB,CAAC,KAAK,KAC7D,SAAS,iBAAiB,cAAc,CAAC,CAAC,SAC1C,SAAS,iBAAiB,iBAAiB,CAAC,CAAC;AAE/C,SAAS,iBAAiB,IAAgB;CACxC,IAAI,OAAO,aAAa,eAAe,OAAO,qBAAqB,aAAa,aAAa,CAAC;CAC9F,IAAI,CAAC,UAAU;EACb,SAAS,MAAM;EACf,WAAW,IAAI,uBAAuB;GACpC,MAAM,IAAI,MAAM;GAChB,IAAI,IAAI,QAAQ,UAAU,SAAS,MAAM,EAAE,CAAC;GAC5C,SAAS;EACX,CAAC;EACD,SAAS,QAAQ,SAAS,MAAM;GAAE,YAAY;GAAM,iBAAiB,CAAC,sBAAsB,eAAe;GAAG,WAAW;GAAM,SAAS;EAAK,CAAC;CAChJ;CACA,UAAU,IAAI,EAAE;CAChB,aAAa;EACX,UAAU,OAAO,EAAE;EACnB,IAAI,CAAC,UAAU,MAAM;GACnB,UAAU,WAAW;GACrB,WAAW;EACb;CACF;AACF;;AAGA,SAAgB,YAAY,EAAE,MAAM,UAAU,aAAa,cAAc,GAAG,SAAsC;CAChH,MAAM,CAAC,OAAO,YAAY,MAAM,SAAS,CAAC,CAAC,WAAW;CACtD,MAAM,OAAO,YAAY;CACzB,MAAM,SAAS,MAAM,OAAO,YAAY;CACxC,OAAO,UAAU;CACjB,MAAM,MAAM,MAAM,aAAa,GAAY,YAAuD;EAChG,SAAS,CAAC;EACV,IAAI,SAAS,OAAO,UAAU,GAAG,OAAO;CAC1C,GAAG,CAAC,CAAC;CACL,MAAM,gBAAiB,OAAO,uBAAuB,IAAI,KAAK,CAAC,IAAI,KAAA,GAAY,CAAC,MAAM,GAAG,CAAC;CAC1F,OAAO,oBAAC,QAAiB,MAAlB;EAAuB,GAAI;EAAa;EAAM,cAAc;CAAM,CAAA;AAC3E;;;AAIA,IAAa,sBACX;;AAGF,SAAgB,aAAa,EAC3B,OAAO,OACP,YAIC;CACD,OACE,oBAAC,QAAiB,QAAlB,EAAA,UACE,oBAAC,QAAiB,YAAlB;EAAmC;EAAM,YAAY;EAAG,kBAAkB;EAAG,WAAU;EAA8B,GAAI;EACvH,UAAA,oBAAC,QAAiB,OAAlB;GAAwB,MAAK;GAAU,oBAAiB;GAAG,WAAW;GAAsB;EAAiC,CAAA;CAClG,CAAA,EACN,CAAA;AAE7B"}
@@ -1,5 +1,5 @@
1
1
  import { cn } from "../lib/cn.js";
2
- //#region src/kit/ui/variants.ts
2
+ //#region src/ui/variants.ts
3
3
  function variants(base, config) {
4
4
  return (props) => {
5
5
  const picked = {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.js","names":[],"sources":["../../src/ui/variants.ts"],"sourcesContent":["import { cn } from \"../lib/cn\";\n\n/** The slice of class-variance-authority the kit uses (variants + defaults + compound variants), kept in-package. */\ntype Config<V extends Record<string, Record<string, string>>> = {\n variants: V;\n defaultVariants: { [K in keyof V]: keyof V[K] };\n compoundVariants?: ({ [K in keyof V]?: keyof V[K] } & { className: string })[];\n};\n\nexport type VariantProps<F> = F extends (props?: infer P) => string ? NonNullable<P> : never;\n\nexport function variants<V extends Record<string, Record<string, string>>>(base: string, config: Config<V>) {\n return (props?: { [K in keyof V]?: keyof V[K] | null }) => {\n const picked = {} as { [K in keyof V]: keyof V[K] };\n for (const key of Object.keys(config.variants) as (keyof V)[]) picked[key] = props?.[key] ?? config.defaultVariants[key];\n const compound = (config.compoundVariants ?? [])\n .filter(({ className: _c, ...when }) => Object.entries(when).every(([k, v]) => picked[k as keyof V] === v))\n .map((c) => c.className);\n return cn(base, ...(Object.keys(config.variants) as (keyof V)[]).map((k) => config.variants[k][picked[k] as string]), ...compound);\n };\n}\n"],"mappings":";;AAWA,SAAgB,SAA2D,MAAc,QAAmB;CAC1G,QAAQ,UAAmD;EACzD,MAAM,SAAS,CAAC;EAChB,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,QAAQ,GAAkB,OAAO,OAAO,QAAQ,QAAQ,OAAO,gBAAgB;EACpH,MAAM,YAAY,OAAO,oBAAoB,CAAC,EAAA,CAC3C,QAAQ,EAAE,WAAW,IAAI,GAAG,WAAW,OAAO,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,OAAO,OAAO,OAAkB,CAAC,CAAC,CAAC,CAC1G,KAAK,MAAM,EAAE,SAAS;EACzB,OAAO,GAAG,MAAM,GAAI,OAAO,KAAK,OAAO,QAAQ,CAAC,CAAiB,KAAK,MAAM,OAAO,SAAS,EAAE,CAAC,OAAO,GAAa,GAAG,GAAG,QAAQ;CACnI;AACF"}
package/package.json CHANGED
@@ -1,37 +1,68 @@
1
1
  {
2
2
  "name": "@bettercms-ai/kit",
3
- "version": "1.0.0",
4
- "type": "module",
5
- "description": "The BetterCMS V2 Block Kit: schema language, form engine and controls.",
3
+ "version": "2.0.0",
4
+ "description": "The BetterCMS V2 Block Kit: schema language, form engine, controls and design tokens.",
6
5
  "license": "MIT",
7
- "main": "./index.js",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
8
9
  "exports": {
9
10
  ".": {
10
- "types": "./index.d.ts",
11
- "import": "./index.js"
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./theme": {
15
+ "types": "./dist/theme.d.ts",
16
+ "import": "./dist/theme.js"
17
+ },
18
+ "./tokens.css": "./dist/tokens.css",
19
+ "./theme.css": "./dist/theme.css",
20
+ "./styles.css": "./dist/styles.css",
21
+ "./kit.css": "./dist/kit.css",
22
+ "./ui": {
23
+ "types": "./dist/ui/index.d.ts",
24
+ "import": "./dist/ui/index.js"
25
+ },
26
+ "./controls": {
27
+ "types": "./dist/controls/index.d.ts",
28
+ "import": "./dist/controls/index.js"
12
29
  },
13
- "./schema/scale": {
14
- "types": "./schema/scale.d.ts",
15
- "import": "./schema/scale.js"
30
+ "./core": {
31
+ "types": "./dist/core/index.d.ts",
32
+ "import": "./dist/core/index.js"
16
33
  },
17
- "./schema/table": {
18
- "types": "./schema/table.d.ts",
19
- "import": "./schema/table.js"
34
+ "./library": {
35
+ "types": "./dist/library/index.d.ts",
36
+ "import": "./dist/library/index.js"
20
37
  },
21
- "./lib/utils": {
22
- "types": "./lib/utils.d.ts",
23
- "import": "./lib/utils.js"
38
+ "./library/kit-catalog.json": "./dist/library/kit-catalog.json",
39
+ "./*": {
40
+ "types": "./dist/*.d.ts",
41
+ "import": "./dist/*.js"
24
42
  },
25
- "./kit.css": "./kit.css",
26
43
  "./package.json": "./package.json"
27
44
  },
28
45
  "sideEffects": [
29
- "./kit.css",
30
- "./index.js",
31
- "./controls/*-register.js",
32
- "./controls/rich-text/index.js",
33
- "./controls/table/index.js"
46
+ "./dist/kit.css",
47
+ "./dist/tokens.css",
48
+ "./dist/theme.css",
49
+ "./dist/styles.css",
50
+ "./dist/table/table.css",
51
+ "./dist/index.js",
52
+ "./dist/controls/*-register.js",
53
+ "./dist/controls/rich-text/index.js",
54
+ "./dist/controls/table/index.js"
34
55
  ],
56
+ "files": [
57
+ "dist",
58
+ "README.md"
59
+ ],
60
+ "scripts": {
61
+ "build": "node scripts/build.mjs",
62
+ "prepack": "node scripts/build.mjs",
63
+ "test": "vitest run",
64
+ "kit:export": "bun scripts/kit-export.ts"
65
+ },
35
66
  "dependencies": {
36
67
  "clsx": "^2.1.1",
37
68
  "tailwind-merge": "^3.5.0"
@@ -43,8 +74,31 @@
43
74
  "react": "^19.2.0",
44
75
  "react-dom": "^19.2.0"
45
76
  },
46
- "types": "./index.d.ts",
77
+ "devDependencies": {
78
+ "@base-ui/react": "^1.4.1",
79
+ "@tabler/icons-react": "3.48.0",
80
+ "@tailwindcss/node": "^4.2.2",
81
+ "@tailwindcss/postcss": "^4.2.2",
82
+ "@testing-library/dom": "^10.4.1",
83
+ "@testing-library/jest-dom": "^6.9.1",
84
+ "@testing-library/react": "^16.3.2",
85
+ "@types/node": "^20",
86
+ "@types/react": "^19.2.14",
87
+ "@types/react-dom": "^19.2.3",
88
+ "@vitejs/plugin-react": "^6.0.1",
89
+ "fast-check": "^4.10.2",
90
+ "framer-motion": "^12.40.0",
91
+ "jsdom": "^29.1.1",
92
+ "postcss": "^8.5.6",
93
+ "react": "19.2.5",
94
+ "react-dom": "19.2.5",
95
+ "tailwindcss": "^4.2.2",
96
+ "typescript": "^6.0.3",
97
+ "vite": "^8.0.9",
98
+ "vitest": "^4.1.7"
99
+ },
47
100
  "publishConfig": {
48
- "access": "public"
101
+ "access": "public",
102
+ "registry": "https://registry.npmjs.org/"
49
103
  }
50
104
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"icons.js","names":[],"sources":["../../src/kit/adapters/icons.ts"],"sourcesContent":["/**\n * ICONS — the kit's Tabler names ↔ the dock's closed icon vocabulary (DOCK_ICON_NAMES).\n *\n * Since e126bf33d the dock vocabulary carries every distinct V2 corpus icon under its own Tabler name, so a Tabler name\n * that is a dock name is stored as itself. The one exception is `map` (a reserved subpath in the icons package), stored\n * as `earth-americas`, the nearest dock glyph. The map stays ONE-TO-ONE so the read side names the Tabler icon back\n * exactly: a dock name some row maps onto reads back as that row's Tabler name, never as itself. A Tabler name with no\n * row and no dock name of its own has no prod form.\n */\nimport { DOCK_ICON_NAME_SET, type DockIconName } from \"./prod-types\";\n\nexport const TABLER_TO_DOCK: Readonly<Record<string, DockIconName>> = Object.freeze({\n map: \"earth-americas\", // approximate: `map` is a reserved subpath of @bettercms-ai/icons\n});\n\n/** dock name → the one Tabler name that maps to it. */\nconst DOCK_TO_TABLER: ReadonlyMap<string, string> = new Map(Object.entries(TABLER_TO_DOCK).map(([t, d]) => [d, t]));\n\n/** The dock name a Tabler icon is stored as, or undefined when it has none. */\nexport function dockIconOf(tabler: string | undefined): DockIconName | undefined {\n if (tabler === undefined) return undefined;\n const mapped = TABLER_TO_DOCK[tabler];\n if (mapped) return mapped;\n // a Tabler name that is also a dock name is kept as itself, unless a mapped name already reads back from it\n return DOCK_ICON_NAME_SET.has(tabler) && !DOCK_TO_TABLER.has(tabler) ? (tabler as DockIconName) : undefined;\n}\n\n/** The Tabler name a stored dock icon reads back as (a dock name with no row reads as itself). */\nexport const tablerIconOf = (dock: string): string => DOCK_TO_TABLER.get(dock) ?? dock;\n"],"mappings":";;;;;;;;;;;AAWA,IAAa,iBAAyD,OAAO,OAAO,EAClF,KAAK,kBACN,CAAC;;AAGF,IAAM,iBAA8C,IAAI,IAAI,OAAO,QAAQ,eAAe,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;;AAGnH,SAAgB,WAAW,QAAsD;AAC/E,KAAI,WAAW,KAAA,EAAW,QAAO,KAAA;CACjC,MAAM,SAAS,eAAe;AAC9B,KAAI,OAAQ,QAAO;AAEnB,QAAO,mBAAmB,IAAI,OAAO,IAAI,CAAC,eAAe,IAAI,OAAO,GAAI,SAA0B,KAAA;;;AAIpG,IAAa,gBAAgB,SAAyB,eAAe,IAAI,KAAK,IAAI"}
package/adapters/lossy.js DELETED
@@ -1,233 +0,0 @@
1
- //#region src/kit/adapters/lossy.ts
2
- var FEATURES = {
3
- "type:table": {
4
- backlog: "table",
5
- reason: "Prod has no table field type (BE: a new type): the TableValue is stored verbatim in a json field."
6
- },
7
- "type:slot": {
8
- backlog: "slot",
9
- reason: "Blocks inside a block have no field: modular needs separate block models and stores {__id,__type,data}. Stored as json."
10
- },
11
- "type:polymorphic-array": {
12
- backlog: "slot",
13
- reason: "An array of several item types: a model stores it as modular (item types of object only), props have no modular. Stored as json."
14
- },
15
- "type:primitive-array": {
16
- backlog: "wontfix:item-config",
17
- reason: "A list of this item type has no prod array form: config.itemType is text, number, date, image, link or richtext. Stored as json."
18
- },
19
- "depth>10": {
20
- backlog: "wontfix:depth",
21
- reason: "Prod allows 10 field levels: the object at level 10 that would nest an 11th is stored as json."
22
- },
23
- "type name": {
24
- backlog: "corpus-fix",
25
- reason: "The schema name is stored as a kebab-case slug, which does not read back as this name."
26
- },
27
- "group name>20": {
28
- backlog: "corpus-fix",
29
- reason: "A tab name is at most 20 characters; truncated."
30
- },
31
- "group default": {
32
- backlog: "corpus-fix",
33
- reason: "The default tab is always the first one in prod."
34
- },
35
- "group icon": {
36
- backlog: "corpus-fix",
37
- reason: "A tab icon is a dock icon name (DOCK_ICON_NAMES); this name is not one."
38
- },
39
- "group (nested)": {
40
- backlog: "corpus-fix",
41
- reason: "Only top-level fields can sit in a tab."
42
- },
43
- "groups>3": {
44
- backlog: "dashboard:F12",
45
- reason: "The dock shows at most 3 tabs (DockFieldTabs), so the adapter keeps 3 until the kit GroupTabs replaces DockFieldTabs at the dock cutover: later groups' fields land in the default tab meanwhile."
46
- },
47
- "group name collision": {
48
- backlog: "corpus-fix",
49
- reason: "Two tabs share an id, or a stored name (the first 20 characters, trimmed, any case): the backend refuses that (tab_name, fieldset ids), so the later tab is not stored."
50
- },
51
- "group (props)": {
52
- backlog: "dashboard:F12",
53
- reason: "The dock shows no prop tabs today; the kit GroupTabs renders prop groups as tabs at the dock cutover."
54
- },
55
- "fieldset spans groups": {
56
- backlog: "corpus-fix",
57
- reason: "A prod fieldset sits in one tab; this field's tab differs from its fieldset's."
58
- },
59
- "fieldset (props)": {
60
- backlog: "corpus-fix",
61
- reason: "A prop group is defined on the first prop that uses it: a fieldset no prop uses is not stored (and the ones after it move up a place)."
62
- },
63
- "fieldset name>limit": {
64
- backlog: "corpus-fix",
65
- reason: "A fieldset name is at most 60 characters (a prop group label 32); truncated."
66
- },
67
- "fieldset collision": {
68
- backlog: "corpus-fix",
69
- reason: "A fieldset shares its id with a group, or this field names a fieldset the schema does not define."
70
- },
71
- "duplicate name": {
72
- backlog: "corpus-fix",
73
- reason: "Two sibling fields share a name; prod keys are unique per level, so the later one is renamed."
74
- },
75
- rows: {
76
- backlog: "corpus-fix",
77
- reason: "ui.rows is a whole number from 1 to 40, on a text or long text field only."
78
- },
79
- synced: {
80
- backlog: "corpus-fix",
81
- reason: "ui.synced names its global in 1–64 characters (trimmed)."
82
- },
83
- valueShape: {
84
- backlog: "corpus-fix",
85
- reason: "ui.valueShape is for a link, image or button field only."
86
- },
87
- "default value": {
88
- backlog: "corpus-fix",
89
- reason: "This initial value holds what the prod value cannot keep (named under it): a crop preset with no image size, a datetime without seconds, a button icon outside the dock vocabulary…"
90
- },
91
- slotSettings: {
92
- backlog: "slot",
93
- reason: "Per-child slot settings belong to the slot, which prod cannot hold."
94
- },
95
- icon: {
96
- backlog: "corpus-fix",
97
- reason: "A field icon is ui.icon, a dock icon name, on a nesting field only (an object, a list of objects, a modular list); this field is a leaf, or the name is not a dock icon."
98
- },
99
- layout: {
100
- backlog: "corpus-fix",
101
- reason: "This layout does not fit the field in prod: ui.control is dropdown / radio / grid on a select, cards on a select or multiselect, checkbox on a boolean or multiselect, switch on a boolean, segmented on a select of 2–4 options, slider on a number with min < max (≤ 1000 stops); a list of scalars or entries lays out as rows or a gallery."
102
- },
103
- "segmented>4": {
104
- backlog: "corpus-fix",
105
- reason: "Prod's segmented control holds 2–4 options (control_segmented): a segmented select with 5 or 6 is stored as radio, with more as dropdown (which V2 itself draws, since it does not fit)."
106
- },
107
- "help>limit": {
108
- backlog: "corpus-fix",
109
- reason: "Help text is at most 500 characters on a field and 200 on a prop (a placeholder 120, a prop group description 200); truncated."
110
- },
111
- "option icon": {
112
- backlog: "corpus-fix",
113
- reason: "Option icons are dock icon names, all or none per list: an icon in this list is not a dock name, so the list stores none (option_icon_unknown)."
114
- },
115
- "option description": {
116
- backlog: "corpus-fix",
117
- reason: "An option description is one line of 1–140 characters (option_description_invalid)."
118
- },
119
- condition: {
120
- backlog: "corpus-fix",
121
- reason: "This condition has no prod showIf form: it names something that is not a sibling (the block's _variant is one only for a top-level prop: show_if_variant_field), or tests a value showIf cannot."
122
- },
123
- access: {
124
- backlog: "corpus-fix",
125
- reason: "ui.access takes view \"schema.view\" and edit \"schema.manage\" only (access_cap_unknown), and a developer lock (readOnly \"developer\") is not also a plain read-only flag."
126
- },
127
- timezone: {
128
- backlog: "corpus-fix",
129
- reason: "A field's time zone is true, false, \"site\" or an IANA zone name, on a date or datetime."
130
- },
131
- "reference target": {
132
- backlog: "reference-targets",
133
- reason: "Prod references point at content models only (no page, form, shopify or collection targets); a reference prop with none of them is stored as json."
134
- },
135
- "reference filter": {
136
- backlog: "reference-targets",
137
- reason: "Prod references have no filter."
138
- },
139
- "numeric unit": {
140
- backlog: "corpus-fix",
141
- reason: "config.unit is a number's (1–24 characters); a rating has no unit."
142
- },
143
- "rating bounds": {
144
- backlog: "corpus-fix",
145
- reason: "A prod rating runs from config.min (≥ 0) to config.max (a whole 1–10) in steps of config.step, min < max and at most 100 whole steps apart."
146
- },
147
- "scale rules": {
148
- backlog: "corpus-fix",
149
- reason: "This scale breaks prod's scale rules: token values 1–32 characters and distinct, labels 1–24, at most 50 steps and 20 presets, a token preset naming a step, a { value, unit } preset needing allowCustom."
150
- },
151
- "validation.patternMessage": {
152
- backlog: "corpus-fix",
153
- reason: "A pattern message needs a stored pattern and is 1–200 characters."
154
- },
155
- "validation.pattern": {
156
- backlog: "corpus-fix",
157
- reason: "A pattern is kept on text, long text and url values, a regex of at most 200 characters that compiles."
158
- },
159
- "validation.length": {
160
- backlog: "corpus-fix",
161
- reason: "Length limits are whole numbers ≥ 0, on text, long text, url and rich text values."
162
- },
163
- "validation.items": {
164
- backlog: "corpus-fix",
165
- reason: "Item limits are whole numbers ≥ 0 on a list, min ≤ max: a tags max 1–500 and min 0–500, a prop's own list (table, array) at most 50 (SLOT_ITEMS_CAP)."
166
- },
167
- "validation.unique": {
168
- backlog: "corpus-fix",
169
- reason: "unique is for text, long text, slug, email, phone, link, number, select, date and single-model reference fields, and lists; a polymorphic reference has no one id to compare."
170
- },
171
- "validation.recommendedMax": {
172
- backlog: "corpus-fix",
173
- reason: "A soft limit is a positive whole number in prod."
174
- },
175
- "item identity": {
176
- backlog: "corpus-fix",
177
- reason: "A list item's name is an identifier (a letter, then letters, digits or _; ≤ 64) and its title 1–60 characters (ui.itemName / ui.itemTitle); an object item keeps no other key."
178
- },
179
- "item settings": {
180
- backlog: "wontfix:item-config",
181
- reason: "A list of scalars stores its item type only (config.itemType): the item's own validation, description, localized flag or multi-line variant has no prod key (array_config_key_unknown)."
182
- },
183
- itemNoun: {
184
- backlog: "corpus-fix",
185
- reason: "The item noun is ui.itemLabel, capitalised, at most 24 characters."
186
- },
187
- "block model field": {
188
- backlog: "block-model-fields",
189
- reason: "A modular item type is a kind:'block' model, which holds only fields a block primitive renders (text, long text, rich text, image, link, slug, email, phone, color, select, number, rating, date, datetime, boolean): this field is not stored."
190
- },
191
- "item icon": {
192
- backlog: "corpus-fix",
193
- reason: "Prod keeps one icon per list (ui.icon, a dock name): the list has its own icon, or this name is not a dock icon."
194
- },
195
- "preview icon": {
196
- backlog: "corpus-fix",
197
- reason: "A row preview's icon is a dock icon name."
198
- },
199
- "preview path": {
200
- backlog: "corpus-fix",
201
- reason: "A row preview names a child key, or a dotted path whose later segments are children or keys of an image, video, link, button, file, location, json, code or reference value (preview_path_unknown)."
202
- },
203
- openMode: {
204
- backlog: "corpus-fix",
205
- reason: "openMode is for object, array and table fields only."
206
- },
207
- "unsupported key": {
208
- backlog: "corpus-fix",
209
- reason: "This V2 key has no prod mapping."
210
- }
211
- };
212
- var CATALOG = {
213
- "block icon": "The block picker's icon belongs to the catalog entry; models and components carry none.",
214
- category: "The block picker's category is catalog metadata. A component takes the nearest prod category (CATEGORY_TO_PROD) when there is one; a model has none.",
215
- "document preview": "The document-level preview is catalog metadata; models and components carry none.",
216
- "kind:block (fields)": "A section's fields are stored as a model (kind model): which host places it is set at seeding.",
217
- "kind:global": "A global (synced) block is a host-level placement; its fields are stored as a model or a component.",
218
- "kind:page": "A page schema is stored as a model; the host makes it a page.",
219
- "kind:object": "An object type is stored as a model.",
220
- "kind:entry (props)": "Only blocks become components; the host decides what an entry schema is placed as.",
221
- variants: "Variants are separate components sharing a sectionType in prod: the host seeds one per variant.",
222
- ai: "The AI-assist sparkle is a host setting, not stored on the field.",
223
- "item openMode": "Prod keeps one openMode per list, the array's own; the V2 engine reads only that one too (lib/schema.ts itemOpenMode ignores the item's), so the item's changes nothing the dock shows.",
224
- "itemNoun (derived)": "A list with no itemNoun whose item title is not the field title's singular: ui.itemLabel keeps the item title, and the read side names the noun from it, which is the noun the V2 engine already falls back to (lib/schema.ts itemNoun).",
225
- "prop target": "A V2 prop has no binding path, so fromTypeSchema('props') returns none: seeding binds each prop to its target. Not a loss.",
226
- "block placement": "Where a block fits (inline / section / page) is the host's: the block picker and a body's Insert menu place it; a model or component carries none.",
227
- "seeded instance": "A starting value the host writes into a new instance when it seeds or places one: a schema-level initialValue, or a reference prop's default (a definition holds none: reference_in_definition).",
228
- "not applicable (props)": "unique on a scalar prop, or on a sub-field outside a table: each placement holds its own value, so there is nothing to be unique across (unique_prop_scope). The instance is the whole document."
229
- };
230
- //#endregion
231
- export { CATALOG, FEATURES };
232
-
233
- //# sourceMappingURL=lossy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lossy.js","names":[],"sources":["../../src/kit/adapters/lossy.ts"],"sourcesContent":["/**\n * LOSSY ITEMS — every V2 schema feature the production language cannot hold is named, never dropped silently.\n * CATALOG ITEMS (below) are the V2 metadata a host sets at seeding time, which the dock never stores.\n *\n * `path` is a JSON pointer into the V2 TypeSchema (\"/fields/3/of/0/fields/1/localized\"). `feature` is a stable name\n * from FEATURES (what the lossy ledger counts), `reason` says why prod cannot keep it, and FEATURES[feature].backlog\n * names what removes the loss.\n */\nexport interface LossyItem {\n path: string;\n feature: LossyFeature;\n reason: string;\n}\n\n/**\n * What removes a lossy feature: a named backend backlog item (its receipt is this feature's lossy count reaching 0), or\n * an explicit disposition that is not backend work: `corpus-fix` (the V2 schema breaks a prod rule the author can\n * satisfy: rename, shorten, reorder, drop a key the type cannot use), `dashboard:F12` (prod stores it; only the dock's\n * DockFieldTabs drops it, and the kit's GroupTabs replaces that at the dock cutover), `wontfix:depth` (a prod rule kept\n * on purpose: the backend refuses an 11th level with field_depth_exceeded), `wontfix:item-config` (the backend refuses\n * per-item config on a list of scalars on purpose, array_config_key_unknown). corpus-fix items are V2 corpus defects, an\n * owner note for the demo repo: the sandbox renders them from the V2 schema, seeding skips them.\n *\n * Landed on origin/dev and mapped here, so they name no feature any more: prop-reference (73a120c50), validation-parity\n * (dd021ceba), option-meta (ab15fe893), chrome-keys (98e48b9e3, 324580b2e), adapter:icons (the V2 icon vocabulary,\n * e126bf33d), localized-flag (279a10490). What those keys still cannot hold is a value the backend refuses, named\n * below as corpus-fix.\n */\nexport type Backlog =\n | \"reference-targets\"\n | \"table\"\n | \"slot\"\n | \"block-model-fields\"\n | \"corpus-fix\"\n | \"dashboard:F12\"\n | \"wontfix:depth\"\n | \"wontfix:item-config\";\n\nexport const FEATURES = {\n /* field types prod has no home for (the value is kept in a json field, or a near type) */\n \"type:table\": { backlog: \"table\", reason: \"Prod has no table field type (BE: a new type): the TableValue is stored verbatim in a json field.\" },\n \"type:slot\": { backlog: \"slot\", reason: \"Blocks inside a block have no field: modular needs separate block models and stores {__id,__type,data}. Stored as json.\" },\n \"type:polymorphic-array\": { backlog: \"slot\", reason: \"An array of several item types: a model stores it as modular (item types of object only), props have no modular. Stored as json.\" },\n \"type:primitive-array\": { backlog: \"wontfix:item-config\", reason: \"A list of this item type has no prod array form: config.itemType is text, number, date, image, link or richtext. Stored as json.\" },\n \"depth>10\": { backlog: \"wontfix:depth\", reason: \"Prod allows 10 field levels: the object at level 10 that would nest an 11th is stored as json.\" },\n /* document level */\n \"type name\": { backlog: \"corpus-fix\", reason: \"The schema name is stored as a kebab-case slug, which does not read back as this name.\" },\n /* tabs and sections */\n \"group name>20\": { backlog: \"corpus-fix\", reason: \"A tab name is at most 20 characters; truncated.\" },\n \"group default\": { backlog: \"corpus-fix\", reason: \"The default tab is always the first one in prod.\" },\n \"group icon\": { backlog: \"corpus-fix\", reason: \"A tab icon is a dock icon name (DOCK_ICON_NAMES); this name is not one.\" },\n \"group (nested)\": { backlog: \"corpus-fix\", reason: \"Only top-level fields can sit in a tab.\" },\n \"groups>3\": { backlog: \"dashboard:F12\", reason: \"The dock shows at most 3 tabs (DockFieldTabs), so the adapter keeps 3 until the kit GroupTabs replaces DockFieldTabs at the dock cutover: later groups' fields land in the default tab meanwhile.\" },\n \"group name collision\": { backlog: \"corpus-fix\", reason: \"Two tabs share an id, or a stored name (the first 20 characters, trimmed, any case): the backend refuses that (tab_name, fieldset ids), so the later tab is not stored.\" },\n \"group (props)\": { backlog: \"dashboard:F12\", reason: \"The dock shows no prop tabs today; the kit GroupTabs renders prop groups as tabs at the dock cutover.\" },\n \"fieldset spans groups\": { backlog: \"corpus-fix\", reason: \"A prod fieldset sits in one tab; this field's tab differs from its fieldset's.\" },\n \"fieldset (props)\": { backlog: \"corpus-fix\", reason: \"A prop group is defined on the first prop that uses it: a fieldset no prop uses is not stored (and the ones after it move up a place).\" },\n \"fieldset name>limit\": { backlog: \"corpus-fix\", reason: \"A fieldset name is at most 60 characters (a prop group label 32); truncated.\" },\n \"fieldset collision\": { backlog: \"corpus-fix\", reason: \"A fieldset shares its id with a group, or this field names a fieldset the schema does not define.\" },\n /* field chrome and rules */\n \"duplicate name\": { backlog: \"corpus-fix\", reason: \"Two sibling fields share a name; prod keys are unique per level, so the later one is renamed.\" },\n rows: { backlog: \"corpus-fix\", reason: \"ui.rows is a whole number from 1 to 40, on a text or long text field only.\" },\n synced: { backlog: \"corpus-fix\", reason: \"ui.synced names its global in 1–64 characters (trimmed).\" },\n valueShape: { backlog: \"corpus-fix\", reason: \"ui.valueShape is for a link, image or button field only.\" },\n \"default value\": { backlog: \"corpus-fix\", reason: \"This initial value holds what the prod value cannot keep (named under it): a crop preset with no image size, a datetime without seconds, a button icon outside the dock vocabulary…\" },\n slotSettings: { backlog: \"slot\", reason: \"Per-child slot settings belong to the slot, which prod cannot hold.\" },\n icon: { backlog: \"corpus-fix\", reason: \"A field icon is ui.icon, a dock icon name, on a nesting field only (an object, a list of objects, a modular list); this field is a leaf, or the name is not a dock icon.\" },\n layout: { backlog: \"corpus-fix\", reason: \"This layout does not fit the field in prod: ui.control is dropdown / radio / grid on a select, cards on a select or multiselect, checkbox on a boolean or multiselect, switch on a boolean, segmented on a select of 2–4 options, slider on a number with min < max (≤ 1000 stops); a list of scalars or entries lays out as rows or a gallery.\" },\n \"segmented>4\": { backlog: \"corpus-fix\", reason: \"Prod's segmented control holds 2–4 options (control_segmented): a segmented select with 5 or 6 is stored as radio, with more as dropdown (which V2 itself draws, since it does not fit).\" },\n \"help>limit\": { backlog: \"corpus-fix\", reason: \"Help text is at most 500 characters on a field and 200 on a prop (a placeholder 120, a prop group description 200); truncated.\" },\n \"option icon\": { backlog: \"corpus-fix\", reason: \"Option icons are dock icon names, all or none per list: an icon in this list is not a dock name, so the list stores none (option_icon_unknown).\" },\n \"option description\": { backlog: \"corpus-fix\", reason: \"An option description is one line of 1–140 characters (option_description_invalid).\" },\n condition: { backlog: \"corpus-fix\", reason: \"This condition has no prod showIf form: it names something that is not a sibling (the block's _variant is one only for a top-level prop: show_if_variant_field), or tests a value showIf cannot.\" },\n access: { backlog: \"corpus-fix\", reason: \"ui.access takes view \\\"schema.view\\\" and edit \\\"schema.manage\\\" only (access_cap_unknown), and a developer lock (readOnly \\\"developer\\\") is not also a plain read-only flag.\" },\n timezone: { backlog: \"corpus-fix\", reason: \"A field's time zone is true, false, \\\"site\\\" or an IANA zone name, on a date or datetime.\" },\n \"reference target\": { backlog: \"reference-targets\", reason: \"Prod references point at content models only (no page, form, shopify or collection targets); a reference prop with none of them is stored as json.\" },\n \"reference filter\": { backlog: \"reference-targets\", reason: \"Prod references have no filter.\" },\n \"numeric unit\": { backlog: \"corpus-fix\", reason: \"config.unit is a number's (1–24 characters); a rating has no unit.\" },\n \"rating bounds\": { backlog: \"corpus-fix\", reason: \"A prod rating runs from config.min (≥ 0) to config.max (a whole 1–10) in steps of config.step, min < max and at most 100 whole steps apart.\" },\n \"scale rules\": { backlog: \"corpus-fix\", reason: \"This scale breaks prod's scale rules: token values 1–32 characters and distinct, labels 1–24, at most 50 steps and 20 presets, a token preset naming a step, a { value, unit } preset needing allowCustom.\" },\n \"validation.patternMessage\": { backlog: \"corpus-fix\", reason: \"A pattern message needs a stored pattern and is 1–200 characters.\" },\n \"validation.pattern\": { backlog: \"corpus-fix\", reason: \"A pattern is kept on text, long text and url values, a regex of at most 200 characters that compiles.\" },\n \"validation.length\": { backlog: \"corpus-fix\", reason: \"Length limits are whole numbers ≥ 0, on text, long text, url and rich text values.\" },\n \"validation.items\": { backlog: \"corpus-fix\", reason: \"Item limits are whole numbers ≥ 0 on a list, min ≤ max: a tags max 1–500 and min 0–500, a prop's own list (table, array) at most 50 (SLOT_ITEMS_CAP).\" },\n \"validation.unique\": { backlog: \"corpus-fix\", reason: \"unique is for text, long text, slug, email, phone, link, number, select, date and single-model reference fields, and lists; a polymorphic reference has no one id to compare.\" },\n \"validation.recommendedMax\": { backlog: \"corpus-fix\", reason: \"A soft limit is a positive whole number in prod.\" },\n \"item identity\": { backlog: \"corpus-fix\", reason: \"A list item's name is an identifier (a letter, then letters, digits or _; ≤ 64) and its title 1–60 characters (ui.itemName / ui.itemTitle); an object item keeps no other key.\" },\n \"item settings\": { backlog: \"wontfix:item-config\", reason: \"A list of scalars stores its item type only (config.itemType): the item's own validation, description, localized flag or multi-line variant has no prod key (array_config_key_unknown).\" },\n itemNoun: { backlog: \"corpus-fix\", reason: \"The item noun is ui.itemLabel, capitalised, at most 24 characters.\" },\n \"block model field\": { backlog: \"block-model-fields\", reason: \"A modular item type is a kind:'block' model, which holds only fields a block primitive renders (text, long text, rich text, image, link, slug, email, phone, color, select, number, rating, date, datetime, boolean): this field is not stored.\" },\n \"item icon\": { backlog: \"corpus-fix\", reason: \"Prod keeps one icon per list (ui.icon, a dock name): the list has its own icon, or this name is not a dock icon.\" },\n \"preview icon\": { backlog: \"corpus-fix\", reason: \"A row preview's icon is a dock icon name.\" },\n \"preview path\": { backlog: \"corpus-fix\", reason: \"A row preview names a child key, or a dotted path whose later segments are children or keys of an image, video, link, button, file, location, json, code or reference value (preview_path_unknown).\" },\n openMode: { backlog: \"corpus-fix\", reason: \"openMode is for object, array and table fields only.\" },\n \"unsupported key\": { backlog: \"corpus-fix\", reason: \"This V2 key has no prod mapping.\" },\n} as const satisfies Record<string, { reason: string; backlog: Backlog }>;\n\nexport type LossyFeature = keyof typeof FEATURES;\n\n/**\n * CATALOG ITEMS — V2 metadata the dock never stores, set when a schema is seeded or placed by its host: not a loss of\n * stored content. Reported apart from LossyItem so the lossy ledger counts only what prod drops.\n */\nexport interface CatalogItem {\n path: string;\n feature: CatalogFeature;\n reason: string;\n}\n\nexport const CATALOG = {\n \"block icon\": \"The block picker's icon belongs to the catalog entry; models and components carry none.\",\n category: \"The block picker's category is catalog metadata. A component takes the nearest prod category (CATEGORY_TO_PROD) when there is one; a model has none.\",\n \"document preview\": \"The document-level preview is catalog metadata; models and components carry none.\",\n \"kind:block (fields)\": \"A section's fields are stored as a model (kind model): which host places it is set at seeding.\",\n \"kind:global\": \"A global (synced) block is a host-level placement; its fields are stored as a model or a component.\",\n \"kind:page\": \"A page schema is stored as a model; the host makes it a page.\",\n \"kind:object\": \"An object type is stored as a model.\",\n \"kind:entry (props)\": \"Only blocks become components; the host decides what an entry schema is placed as.\",\n variants: \"Variants are separate components sharing a sectionType in prod: the host seeds one per variant.\",\n ai: \"The AI-assist sparkle is a host setting, not stored on the field.\",\n \"item openMode\": \"Prod keeps one openMode per list, the array's own; the V2 engine reads only that one too (lib/schema.ts itemOpenMode ignores the item's), so the item's changes nothing the dock shows.\",\n \"itemNoun (derived)\": \"A list with no itemNoun whose item title is not the field title's singular: ui.itemLabel keeps the item title, and the read side names the noun from it, which is the noun the V2 engine already falls back to (lib/schema.ts itemNoun).\",\n \"prop target\": \"A V2 prop has no binding path, so fromTypeSchema('props') returns none: seeding binds each prop to its target. Not a loss.\",\n \"block placement\": \"Where a block fits (inline / section / page) is the host's: the block picker and a body's Insert menu place it; a model or component carries none.\",\n \"seeded instance\": \"A starting value the host writes into a new instance when it seeds or places one: a schema-level initialValue, or a reference prop's default (a definition holds none: reference_in_definition).\",\n \"not applicable (props)\": \"unique on a scalar prop, or on a sub-field outside a table: each placement holds its own value, so there is nothing to be unique across (unique_prop_scope). The instance is the whole document.\",\n} as const;\n\nexport type CatalogFeature = keyof typeof CATALOG;\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"prod-types.js","names":[],"sources":["../../src/kit/adapters/prod-types.ts"],"sourcesContent":["/**\n * PROD SHAPES — the production schema language and stored values, typed locally so the kit stays a package that could\n * leave the repo (it may not import @bettercms-ai/types, and the dashboard's pin predates F1 / F1.x-props anyway).\n *\n * Mirrors the backend at F1 + F1.x-props + link objects + tags / rating / code (72ea2b68d), then reference props\n * (73a120c50), validation parity (dd021ceba), option meta (ab15fe893), V2 chrome keys and types (98e48b9e3, 324580b2e),\n * the V2 icon vocabulary (e126bf33d) and the localized flag (279a10490) — origin/dev 81f385ff3:\n * packages/types/src/content-model.ts, component.ts, link-value.ts, button-look.ts, dock-icon-names.ts, video-value.ts\n * src/lib/validation/schemas/content.ts (baseField, fieldUiSchema, chromeUiProblems, fieldsets, MAX_FIELD_DEPTH)\n * src/lib/validation/schemas/components.ts (componentPropDefSchema, subFieldSchema, propUiSchema, propValidationHardening)\n * src/lib/content/validation-parity.ts, src/lib/content/dock-vocabulary.ts (TAB_MAX, TAB_NAME_MAX)\n * When the backend widens, widen these and the adapters together; the round-trip test then shrinks the lossy ledger.\n */\n\n/* ── Limits the backend enforces ─────────────────────────────────────── */\n/** Field levels one schema may nest (a top-level field, or a prop, is level 1). */\nexport const MAX_FIELD_DEPTH = 10;\n/** Tabs (`kind: \"tab\"` fieldsets) one screen may hold, and a tab name's length. */\nexport const TAB_MAX = 3;\nexport const TAB_NAME_MAX = 20;\nexport const FIELDSETS_MAX = 30;\nexport const FIELDSET_NAME_MAX = 60;\nexport const FIELDSET_DESCRIPTION_MAX = 500;\nexport const FIELD_HELP_MAX = 500;\nexport const PROP_HELP_MAX = 200;\nexport const PROP_PLACEHOLDER_MAX = 120;\nexport const HELP_MORE_MAX = 2000;\nexport const LOCK_REASON_MAX = 200;\nexport const ITEM_LABEL_MAX = 24;\nexport const PREVIEW_FALLBACK_MAX = 60;\nexport const PROP_GROUP_LABEL_MAX = 32;\nexport const PATTERN_MAX = 200;\n/** A tags value's tag length (TAG_VALUE_MAX_LENGTH), a code value's length (CODE_MAX_LENGTH), a rating's max with none set. */\nexport const TAG_VALUE_MAX_LENGTH = 64;\nexport const CODE_MAX_LENGTH = 100_000;\nexport const RATING_DEFAULT_MAX = 5;\n/** ratingConfigSchema: config.max a whole 1–10; (max − min) / step whole and at most this many stops. */\nexport const RATING_MAX = 10;\nexport const RATING_MAX_STOPS = 100;\n/** tagsConfigSchema: config.min 0–500, config.max 1–500. */\nexport const TAGS_ITEMS_MAX = 500;\n/** A choice option's description (OPTION_DESCRIPTION_MAX): one line. */\nexport const OPTION_DESCRIPTION_MAX = 140;\n/** config.patternMessage (PATTERN_MESSAGE_MAX), config.unit on a number (NUMBER_UNIT_MAX). */\nexport const PATTERN_MESSAGE_MAX = 200;\nexport const NUMBER_UNIT_MAX = 24;\n/** fieldUiSchema: ui.rows 1–40, ui.placeholder 1–120, ui.itemTitle 1–60, ui.synced.from 1–64. */\nexport const UI_ROWS_MAX = 40;\nexport const UI_PLACEHOLDER_MAX = 120;\nexport const ITEM_TITLE_MAX = 60;\nexport const SYNCED_FROM_MAX = 64;\n/** ui.itemName is an identifier: a letter, then letters, digits or _ (≤ 64). */\nexport const ITEM_NAME_RE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\n/** propUiSchema group: description 1–200, order 0–99. */\nexport const PROP_GROUP_DESCRIPTION_MAX = 200;\nexport const PROP_GROUP_ORDER_MAX = 99;\n/** numberScaleSchema: token value 1–32, label 1–24, title 1–60, css 1–60; 1–50 steps; at most 20 presets. */\nexport const SCALE_TOKEN_VALUE_MAX = 32;\nexport const SCALE_LABEL_MAX = 24;\nexport const SCALE_TITLE_MAX = 60;\nexport const SCALE_CSS_MAX = 60;\nexport const SCALE_STEPS_MAX = 50;\nexport const SCALE_PRESETS_MAX = 20;\n/** The video block's transcript cap (VIDEO_TRANSCRIPT_MAX). */\nexport const VIDEO_TRANSCRIPT_MAX = 100_000;\n\n/* ── Icons: the closed dock vocabulary (packages/types/src/dock-icon-names.ts at e126bf33d: 472 names, Sanity's set\n * plus every distinct V2 corpus icon but `map`; copied verbatim from that generated file, regenerate from it) ── */\nexport const DOCK_ICON_NAMES = [\n \"abc\", \"access-denied\", \"activity\", \"add\", \"add-circle\", \"add-comment\", \"add-document\", \"add-user\", \"address-book\",\n \"adjustments\", \"adjustments-horizontal\", \"alarm\", \"alert-triangle\", \"align-left\", \"api\", \"app-window\", \"apple\",\n \"apps\", \"archive\", \"arrow-back-up\", \"arrow-down\", \"arrow-guide\", \"arrow-left\", \"arrow-right\", \"arrow-top-right\",\n \"arrow-up\", \"arrows-diagonal\", \"arrows-down\", \"arrows-exchange\", \"arrows-horizontal\", \"arrows-left-right\",\n \"arrows-shuffle\", \"arrows-sort\", \"article\", \"aspect-ratio\", \"asterisk\", \"award\", \"axis-x\", \"backpack\", \"badge\",\n \"badge-cc\", \"badges\", \"bar-chart\", \"basket\", \"bell\", \"bill\", \"binary-document\", \"block-content\", \"block-element\",\n \"blockquote\", \"bold\", \"bolt\", \"book\", \"book-2\", \"bookmark\", \"bookmark-filled\", \"books\", \"bottle\", \"box\",\n \"brand-dribbble\", \"brand-facebook\", \"brand-instagram\", \"brand-linkedin\", \"brand-pinterest\", \"brand-tiktok\",\n \"brand-x\", \"brand-youtube\", \"briefcase\", \"broadcast\", \"browser\", \"bug\", \"building\", \"building-skyscraper\",\n \"building-store\", \"bulb-filled\", \"bulb-outline\", \"calculator\", \"calendar\", \"calendar-dollar\", \"calendar-event\",\n \"calendar-exclamation\", \"calendar-off\", \"calendar-plus\", \"calendar-star\", \"calendar-time\", \"camera\", \"campfire\",\n \"carousel-horizontal\", \"case\", \"cash\", \"category\", \"category-2\", \"chart-area\", \"chart-arrows\", \"chart-bar\",\n \"chart-bar-popular\", \"chart-donut\", \"chart-dots\", \"chart-line\", \"chart-upward\", \"check\", \"checkbox\", \"checklist\",\n \"checkmark\", \"checkmark-circle\", \"chef-hat\", \"chevron-down\", \"chevron-left\", \"chevron-right\", \"chevron-up\",\n \"chevrons-right\", \"circle\", \"circle-check\", \"circle-dot\", \"circle-number-1\", \"circle-plus\", \"click\", \"clipboard\",\n \"clipboard-image\", \"clipboard-text\", \"clock\", \"clock-check\", \"clock-hour-4\", \"close\", \"close-circle\", \"code\",\n \"code-block\", \"cog\", \"collapse\", \"color-wheel\", \"columns\", \"columns-2\", \"columns-3\", \"comment\", \"component\",\n \"compose\", \"compose-sparkles\", \"confetti\", \"controls\", \"cookie\", \"copy\", \"credit-card\", \"crop\", \"cube\",\n \"currency-dollar\", \"dashboard\", \"database\", \"database-search\", \"desktop\", \"device-desktop\", \"device-mobile\",\n \"device-tablet\", \"devices\", \"diamond\", \"discount\", \"document\", \"document-pdf\", \"document-remove\", \"document-sheet\",\n \"document-text\", \"document-video\", \"document-word\", \"document-zip\", \"documents\", \"door-exit\", \"dot\",\n \"double-chevron-down\", \"double-chevron-left\", \"double-chevron-right\", \"double-chevron-up\", \"double-quote\",\n \"download\", \"drag-handle\", \"drop\", \"droplet\", \"droplet-half\", \"earth-americas\", \"earth-globe\", \"edit\", \"egg\",\n \"ellipsis-horizontal\", \"ellipsis-vertical\", \"empty\", \"enter\", \"enter-right\", \"envelope\", \"equal\", \"error-filled\",\n \"error-outline\", \"error-screen\", \"expand\", \"eye-closed\", \"eye-off\", \"eye-open\", \"face-happy\", \"face-indifferent\",\n \"face-sad\", \"feather\", \"feedback\", \"file\", \"file-certificate\", \"file-code\", \"file-download\", \"file-text\", \"filter\",\n \"flag\", \"flame\", \"flask\", \"focus-2\", \"folder\", \"folders\", \"forms\", \"frame\", \"generate\", \"gift\", \"git-branch\",\n \"github\", \"grid-dots\", \"groq\", \"hammer\", \"hand-finger\", \"hanger\", \"hash\", \"headphones\", \"headset\", \"heart\",\n \"heart-filled\", \"heart-handshake\", \"help-circle\", \"highlight\", \"history\", \"home\", \"hourglass\", \"ice-cream\",\n \"id-badge\", \"id-badge-2\", \"image\", \"image-remove\", \"images\", \"inbox\", \"infinity\", \"info-circle\", \"info-filled\",\n \"info-outline\", \"info-square-rounded\", \"inline\", \"inline-element\", \"input-search\", \"insert-above\", \"insert-below\",\n \"italic\", \"joystick\", \"json\", \"language\", \"launch\", \"layout\", \"layout-align-center\", \"layout-board\",\n \"layout-board-split\", \"layout-bottombar\", \"layout-bottombar-expand\", \"layout-cards\", \"layout-columns\",\n \"layout-dashboard\", \"layout-grid\", \"layout-list\", \"layout-navbar\", \"layout-rows\", \"layout-sidebar\",\n \"layout-sidebar-right\", \"leaf\", \"leave\", \"lemon\", \"library-photo\", \"lifebuoy\", \"link\", \"link-removed\", \"linkedin\",\n \"list\", \"list-check\", \"list-details\", \"list-numbers\", \"list-tree\", \"lock\", \"logo-js\", \"logo-ts\", \"mail\", \"map-2\",\n \"map-pin\", \"map-pins\", \"marker\", \"marker-removed\", \"master-detail\", \"math-function\", \"meat\", \"menu\", \"message\",\n \"message-2\", \"message-check\", \"message-circle\", \"message-circle-2\", \"message-plus\", \"message-star\", \"microphone\",\n \"microphone-slash\", \"mobile-device\", \"mood-empty\", \"moon\", \"movie\", \"news\", \"notes\", \"number\", \"ok-hand\", \"olist\",\n \"overage\", \"package\", \"packages\", \"palette\", \"panel-left\", \"panel-right\", \"paperclip\", \"pause\", \"pencil\", \"phone\",\n \"photo\", \"photo-scan\", \"photo-search\", \"pig-money\", \"pin\", \"pin-filled\", \"pin-removed\", \"play\", \"player-play\",\n \"player-track-next\", \"playlist-add\", \"plug\", \"plug-connected\", \"plus-minus\", \"point\", \"presentation\", \"printer\",\n \"progress-50\", \"progress-75\", \"projects\", \"publish\", \"qrcode\", \"quote\", \"read-only\", \"receipt\", \"recycle\", \"redo\",\n \"refresh\", \"remove\", \"remove-circle\", \"repeat\", \"reset\", \"restore\", \"retrieve\", \"retry\", \"revert\", \"robot\",\n \"rocket\", \"rosette\", \"route\", \"ruler\", \"ruler-measure\", \"salad\", \"scale\", \"schema\", \"school\", \"search\", \"section\",\n \"select\", \"send\", \"server\", \"settings\", \"share\", \"shield-check\", \"shield-lock\", \"shopping-bag\", \"shopping-cart\",\n \"shopping-cart-plus\", \"signature\", \"sitemap\", \"slideshow\", \"sort\", \"sort-descending\", \"spacing-vertical\", \"sparkle\",\n \"sparkles\", \"speakerphone\", \"spinner\", \"split-horizontal\", \"split-vertical\", \"square\", \"stack\", \"stack-2\",\n \"stack-compact\", \"stairs\", \"stairs-up\", \"star\", \"star-filled\", \"stars\", \"stop\", \"strikethrough\", \"string\",\n \"subtask\", \"sun\", \"superscript\", \"sync\", \"table\", \"table-options\", \"tablet-device\", \"tag\", \"tags\", \"target\", \"task\",\n \"template\", \"tent\", \"terminal\", \"terminal-2\", \"text\", \"th-large\", \"th-list\", \"thumb-up\", \"thumbs-down\", \"thumbs-up\",\n \"ticket\", \"tiers\", \"timeline\", \"toggle-arrow-right\", \"toggle-right\", \"token\", \"tool\", \"tools-kitchen-2\", \"transfer\",\n \"translate\", \"trash\", \"trend-upward\", \"triangle-outline\", \"trolley\", \"truck\", \"truck-delivery\", \"truncate\",\n \"twitter\", \"typography\", \"ulist\", \"unarchive\", \"underline\", \"undo\", \"unknown\", \"unlink\", \"unlock\", \"unpublish\",\n \"upload\", \"user\", \"user-circle\", \"user-plus\", \"user-search\", \"user-star\", \"users\", \"users-group\", \"versions\",\n \"video\", \"vocabulary\", \"vs\", \"warning-filled\", \"warning-outline\", \"weight\", \"world\", \"wrench\", \"zoom-question\",\n] as const;\nexport type DockIconName = (typeof DOCK_ICON_NAMES)[number];\nexport const DOCK_ICON_NAME_SET: ReadonlySet<string> = new Set<string>(DOCK_ICON_NAMES);\n\n/* ── Content model fields ────────────────────────────────────────────── */\nexport type ProdFieldType =\n | \"text\" | \"richtext\" | \"document\" | \"image\" | \"boolean\" | \"number\" | \"select\"\n | \"reference\" | \"multi-reference\" | \"multiReference\" | \"array\" | \"date\" | \"datetime\"\n | \"longtext\" | \"slug\" | \"email\" | \"phone\" | \"link\" | \"color\" | \"json\" | \"file\"\n | \"component-ref\" | \"modular\" | \"sections\" | \"location\" | \"button\" | \"multiselect\" | \"icon\" | \"object\"\n | \"tags\" | \"rating\" | \"code\"\n /** V2 video: a URL string or `{ url, poster?, autoplay?, loop?, transcript? }` (VideoValue). */\n | \"video\"\n /** Legacy input only: normalized to `array` + zones on write, still read. */\n | \"group\" | \"repeater\";\n\nexport type OpenMode = \"inline\" | \"drill\" | \"popover\" | \"dialog\";\nexport type ShowIfOp = \"eq\" | \"neq\" | \"in\" | \"isSet\" | \"notEmpty\" | \"empty\";\nexport interface ShowIfRule {\n field: string;\n op: ShowIfOp;\n value?: string | string[];\n}\nexport interface ShowIf {\n match: \"all\" | \"any\";\n rules: ShowIfRule[];\n}\n\nexport type UiLayout = \"list\" | \"grid\" | \"table\" | \"rows\" | \"chips\" | \"gallery\";\n/** ui.control (UI_CONTROLS): the leaf controls, the V2 control layouts among them. */\nexport const UI_CONTROLS = [\"segmented\", \"slider\", \"rating\", \"dropdown\", \"radio\", \"cards\", \"grid\", \"switch\", \"checkbox\"] as const;\nexport type UiControl = (typeof UI_CONTROLS)[number];\n/** The V2 control layouts and the types each fits (CONTROL_TYPES); segmented / slider / rating have their own rules. */\nexport const CONTROL_TYPES: Readonly<Partial<Record<UiControl, readonly string[]>>> = {\n dropdown: [\"select\"],\n radio: [\"select\"],\n cards: [\"select\", \"multiselect\"],\n grid: [\"select\"],\n switch: [\"boolean\"],\n checkbox: [\"boolean\", \"multiselect\"],\n};\n/** A row preview: child keys or dotted paths (V2), a literal fallback, and an icon shown while there is no media. */\nexport interface UiPreview {\n title?: string;\n subtitle?: string;\n media?: string;\n fallback?: string;\n icon?: DockIconName;\n}\nexport interface FieldUi {\n collapsed?: boolean;\n preview?: UiPreview;\n layout?: UiLayout;\n reorderable?: boolean;\n control?: UiControl;\n icon?: DockIconName;\n itemLabel?: string;\n /** text / longtext: the lines a text box opens with (1–40). */\n rows?: number;\n /** a field's placeholder when its config is strict (a prop keeps its own `placeholder`). */\n placeholder?: string;\n /** a list's item type: its identifier and its title (V2 `of[0].name` / `title`). */\n itemName?: string;\n itemTitle?: string;\n /** the value comes from a global: an edit applies everywhere. */\n synced?: { from: string };\n /** link / image / button: a plain string or the object. */\n valueShape?: \"string\" | \"object\";\n /** V2 field access (D58): the editor gates, the backend stores. */\n access?: { view?: \"schema.view\"; edit?: \"schema.manage\" };\n /** true = never shown in the form; false ≡ absent. */\n hidden?: boolean;\n /** modular: per block slug, how a row of that block type reads (V2 `of[i].icon` / `preview`). */\n blocks?: Record<string, { icon?: DockIconName; preview?: UiPreview }>;\n input?: { name: string; writes?: string[] };\n}\n\nexport type ScaleUnit = \"px\" | \"%\" | \"rem\" | \"em\" | \"vw\" | \"vh\";\nexport interface ScaleCustomValue {\n value: number;\n unit: ScaleUnit;\n}\nexport interface ScaleTokenStep {\n value: string;\n label: string;\n title?: string;\n px?: number;\n css?: string;\n}\nexport type ScaleBound = number | Partial<Record<ScaleUnit, number>>;\n/**\n * A number's `config.scale` (CPO D41): a stepped range, numeric steps or token steps, units, presets, and the custom\n * escape hatch (a boolean, or its bounds). A token scale stores the token string; a custom value `{ value, unit }`.\n */\nexport interface NumberScale {\n steps: { min: number; max: number; step?: number } | Array<{ value: number; label?: string }> | ScaleTokenStep[];\n units?: ScaleUnit[];\n defaultUnit?: ScaleUnit;\n allowCustom?: boolean | { min?: ScaleBound; max?: ScaleBound; units?: ScaleUnit[]; step?: number };\n presets?: Array<{ label?: string; value: number | string | ScaleCustomValue }>;\n}\n\nexport interface ArrayZoneConfig {\n nonRepeatable?: ContentModelField[];\n repeatable?: { fields: ContentModelField[]; minItems?: number; maxItems?: number };\n}\n\n/** One choice: a bare value, or `{ label, value }` with optional chrome (a dock icon, one line ≤ 140 under the label). */\nexport interface ChoiceOption {\n label: string;\n value: string;\n icon?: DockIconName;\n description?: string;\n}\nexport type SelectOption = string | ChoiceOption;\n\n/** The typed keys of a field's `config` bag; the bag itself stays loose on scalar types. */\nexport interface FieldConfig {\n /** primitive array: scalars, or images, links or rich text (each item judged by its own type). */\n itemType?: \"text\" | \"number\" | \"date\" | \"image\" | \"link\" | \"richtext\";\n zones?: ArrayZoneConfig;\n contentModelId?: string;\n polymorphic?: boolean;\n allowedModelSlugs?: string[];\n min?: number;\n max?: number;\n step?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n /** text / longtext: the message shown when the pattern does not match (≤ 200, needs `pattern`). */\n patternMessage?: string;\n /** number: the error bounds (V2 validation.min / max); they win over min / max. */\n validation?: { min?: number; max?: number };\n /** number: what it counts (\"%\", \"USD\"), 1–24 characters. */\n unit?: string;\n placeholder?: string;\n includeTime?: boolean;\n /** \"site\", an IANA zone name, true (the editor picks a zone) or false (none). */\n timezone?: string | boolean;\n blockSlugs?: string[];\n minItems?: number;\n maxItems?: number;\n allowedSections?: string[];\n componentIds?: string[];\n scale?: NumberScale;\n /** multiselect: its choices; with `allowCustom` it is free tags. tags: its suggestions. */\n options?: SelectOption[];\n allowCustom?: boolean;\n /** code: the language, and the languages an editor may pick (strict config, with tags' and rating's). */\n language?: string;\n languages?: string[];\n /**\n * text: \"url\" marks a text field the kit edits as a URL (V2 `url`). The backend keeps a text field's config as sent and\n * enforces its minLength / maxLength / pattern, which a link field would not; it reads no other meaning into the key.\n */\n inputType?: \"url\";\n [key: string]: unknown;\n}\n\nexport interface ContentModelField {\n key: string;\n label: string;\n type: ProdFieldType;\n helpText?: string;\n required?: boolean;\n unique?: boolean;\n defaultValue?: unknown;\n /** select: strings or { label, value }. */\n options?: SelectOption[];\n config?: FieldConfig | null;\n /** object (and legacy group / repeater): child fields. */\n fields?: ContentModelField[];\n openMode?: OpenMode;\n helpMore?: string;\n advanced?: boolean;\n recommendedMax?: number;\n fieldsetId?: string;\n placement?: \"cover\" | \"title\" | \"excerpt\" | \"body\" | \"inline\" | \"panel\";\n showIf?: ShowIf;\n readOnly?: true | \"developer\";\n lockReason?: string;\n /** V2 per-field localization: once any field is marked, a translation owns only its localized values. */\n localized?: boolean;\n ui?: FieldUi;\n searchable?: boolean;\n [key: string]: unknown;\n}\n\nexport type FieldsetKind = \"group\" | \"row\" | \"tab\";\nexport interface Fieldset {\n id: string;\n name: string;\n description?: string;\n kind?: FieldsetKind;\n icon?: DockIconName;\n collapsed?: boolean;\n tab?: string;\n collapsible?: boolean;\n columns?: 1 | 2;\n layout?: \"stack\" | \"breakpoints\";\n}\n\n/** A content model as the adapters read and write it (server-owned ids and timestamps left out). */\nexport interface ProdContentModel {\n name: string;\n slug: string;\n description?: string;\n kind?: \"model\" | \"block\";\n fields: ContentModelField[];\n fieldsets?: Fieldset[];\n}\n\n/* ── Component props ─────────────────────────────────────────────────── */\nexport const COMPONENT_PROP_TYPES = [\n \"text\", \"richtext\", \"image\", \"url\", \"boolean\", \"number\", \"select\", \"group\", \"table\", \"slot\", \"form\",\n \"link\", \"button\", \"date\", \"color\", \"file\", \"icon\", \"multiselect\",\n \"object\", \"datetime\", \"slug\", \"email\", \"phone\", \"json\", \"location\", \"tags\", \"rating\", \"code\",\n /** an entry id (or `{ entryId, modelSlug }`) and a list of them, hydrated on delivery; no definition default. */\n \"reference\", \"multi-reference\",\n /** a video value, a list of `config.itemType` values, multi-line text. */\n \"video\", \"array\", \"longtext\",\n] as const;\nexport type ComponentPropType = (typeof COMPONENT_PROP_TYPES)[number];\nexport type ComponentSubFieldType = Exclude<ComponentPropType, \"slot\" | \"form\">;\n\nexport const COMPONENT_CATEGORIES = [\n \"navbar\", \"footer\", \"button\", \"section\", \"slider\", \"tabs\", \"form\", \"custom\", \"hero\", \"content\", \"social-proof\", \"conversion\",\n] as const;\nexport type ComponentCategory = (typeof COMPONENT_CATEGORIES)[number];\n\nexport interface PropGroup {\n id: string;\n label?: string;\n kind?: \"group\" | \"row\";\n icon?: DockIconName;\n collapsed?: boolean;\n /** V2 fieldset keys, on the defining prop: a line under the header (≤ 200), side by side, a static header, a\n * breakpoint switcher, and its place among the groups (0–99; absent = where its first prop sits). */\n description?: string;\n columns?: 1 | 2;\n collapsible?: boolean;\n layout?: \"stack\" | \"breakpoints\";\n order?: number;\n}\nexport type PropUi = FieldUi & { group?: PropGroup };\n\nexport interface ComponentSubField {\n key: string;\n label: string;\n type: ComponentSubFieldType;\n defaultValue?: unknown;\n required?: boolean;\n helpText?: string;\n placeholder?: string;\n /** strings or { label, value } (subFieldOptionSchema). */\n options?: SelectOption[];\n helpMore?: string;\n advanced?: boolean;\n recommendedMax?: number;\n /** on a table's sub-field: no two rows share it; on a list: no item repeats. */\n unique?: boolean;\n openMode?: OpenMode;\n showIf?: ShowIf;\n /** the prop's ui, inline group included (V2 fieldsets nest). */\n ui?: PropUi;\n readOnly?: true | \"developer\";\n lockReason?: string;\n localized?: boolean;\n fields?: ComponentSubField[];\n config?: { fields?: ComponentSubField[]; options?: SelectOption[] } & Record<string, unknown>;\n}\n\nexport interface ComponentPropDef {\n key: string;\n label: string;\n /**\n * Where the override writes inside the component's blockJson. Binding, not schema: the V2 language has no twin, so\n * fromTypeSchema leaves it unset and the host binds it (componentize lane) before the save.\n */\n target?: { blockId: string; path: string };\n type: ComponentPropType;\n defaultValue?: unknown;\n required?: boolean;\n helpText?: string;\n placeholder?: string;\n showIf?: ShowIf;\n helpMore?: string;\n advanced?: boolean;\n recommendedMax?: number;\n /** a list prop's items (a table's rows) distinct; refused on a top-level scalar (unique_prop_scope). */\n unique?: boolean;\n openMode?: OpenMode;\n readOnly?: true | \"developer\";\n lockReason?: string;\n localized?: boolean;\n config?: {\n componentIds?: string[];\n multiple?: boolean;\n minItems?: number;\n maxItems?: number;\n options?: SelectOption[];\n fields?: ComponentSubField[];\n min?: number;\n max?: number;\n step?: number;\n /** number: the error bounds (they win over min / max). */\n validation?: { min?: number; max?: number };\n /** text / url / longtext / richtext: length (richtext: its plain text). text / url / longtext: a pattern and its message. */\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n patternMessage?: string;\n /** reference / multi-reference: the target model, or polymorphic with an allowlist of model slugs. */\n contentModelId?: string;\n polymorphic?: boolean;\n allowedModelSlugs?: string[];\n /** array: what the list holds. */\n itemType?: \"text\" | \"number\" | \"date\" | \"image\" | \"link\" | \"richtext\";\n } & Record<string, unknown>;\n ui?: PropUi;\n}\n\n/** A component as the adapters read and write it. */\nexport interface ProdComponent {\n name: string;\n slug: string;\n description?: string;\n category?: ComponentCategory;\n props: ComponentPropDef[];\n}\n\n/* ── Stored values ───────────────────────────────────────────────────── */\nexport const LINK_RELS = [\"nofollow\", \"sponsored\", \"ugc\"] as const;\nexport type LinkRel = (typeof LINK_RELS)[number];\nexport const LINK_VALUE_TYPES = [\"url\", \"page\", \"entry\", \"email\", \"phone\", \"anchor\", \"section\", \"file\"] as const;\nexport type LinkValueType = (typeof LINK_VALUE_TYPES)[number];\n/** The F1 link object (link-value.ts). A bare href string stays valid too. */\nexport interface ProdLinkValue {\n type?: LinkValueType;\n href: string;\n title?: string;\n newTab?: boolean;\n target?: \"_self\" | \"_blank\";\n rel?: LinkRel;\n section?: string;\n /** page / entry links: the target's id. */\n ref?: string;\n}\n\nexport const BUTTON_VARIANTS = [\"primary\", \"secondary\", \"tertiary\", \"brand\", \"dark\", \"light\", \"outline\", \"link\"] as const;\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\nexport const BUTTON_SIZES = [\"sm\", \"md\", \"lg\"] as const;\n/** One button as one value (button-look.ts ButtonValue). */\nexport interface ProdButtonValue {\n label: string;\n href: string | ProdLinkValue;\n variant?: ButtonVariant;\n size?: (typeof BUTTON_SIZES)[number];\n arrow?: boolean;\n icon?: DockIconName | null;\n newTab?: boolean;\n rel?: LinkRel;\n /** Stretch across the column (backend button_full_width_invalid refuses a non-boolean a write brings). */\n fullWidth?: boolean;\n}\n\n/** 0–1 fractions of the image cut from each edge. */\nexport interface ProdImageCrop {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n/** The normalized image value (field-value-normalize.ts): other keys are dropped on write. */\nexport interface ProdImageValue {\n id?: string;\n url: string;\n name?: string;\n altText?: string;\n /** 0–1 fractions. */\n focal?: { x: number; y: number };\n crop?: ProdImageCrop;\n}\n\n/** The V2 video value's object form (video-value.ts): exactly the video block's props. A bare URL string is valid too. */\nexport const VIDEO_VALUE_KEYS = [\"url\", \"poster\", \"autoplay\", \"loop\", \"transcript\"] as const;\nexport interface ProdVideoValue {\n url: string;\n poster?: string;\n autoplay?: boolean;\n loop?: boolean;\n transcript?: string;\n}\n\n/** A polymorphic reference value. */\nexport interface ProdPolymorphicRef {\n entryId: string;\n modelSlug: string;\n}\n/** What a `form` prop stores. */\nexport interface ProdFormRef {\n formId: string;\n}\n"],"mappings":"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"}