@bettercms-ai/kit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1,7 +1,7 @@
1
- import { isObj, pathKey } from "./path.js";
2
1
  import { tableIssues } from "../schema/table.js";
2
+ import { isObj, pathKey } from "./path.js";
3
3
  import { isEmptyValue, isHidden, itemSchemaFor, plainText, primitiveItem } from "./schema.js";
4
- //#region src/kit/lib/validate.ts
4
+ //#region src/lib/validate.ts
5
5
  var textLength = (v) => plainText(v).length;
6
6
  var counted = (f) => f.type === "string" || f.type === "text" || f.type === "richtext";
7
7
  /** Validate one value against its field (not recursing into children). */
@@ -114,11 +114,50 @@ function validateValue(f, v) {
114
114
  };
115
115
  return null;
116
116
  }
117
+ /**
118
+ * What makes two values "the same" for `unique`, as the server judges a placement
119
+ * (backend prop-fields tableProblem): a row's field compares text trimmed and case-folded, and
120
+ * numbers; a list's items compare whole, strings case-folded, rows without their `_id` / `_key`.
121
+ */
122
+ var cellKey = (v) => typeof v === "number" && Number.isFinite(v) ? String(v) : typeof v === "string" && v.trim() ? v.trim().toLocaleLowerCase("und") : null;
123
+ var itemKey = (v) => {
124
+ if (typeof v === "string") return `s:${v.trim().toLocaleLowerCase("und")}`;
125
+ if (isObj(v)) {
126
+ const { _id: _i, _key: _k, ...rest } = v;
127
+ return `o:${JSON.stringify(Object.fromEntries(Object.entries(rest).sort(([a], [b]) => a.localeCompare(b))))}`;
128
+ }
129
+ return `j:${JSON.stringify(v)}`;
130
+ };
131
+ /** Indexes of the values whose key repeats one an earlier value already used. */
132
+ function repeats(values, key) {
133
+ const seen = /* @__PURE__ */ new Set();
134
+ const out = [];
135
+ values.forEach((v, i) => {
136
+ const k = key(v);
137
+ if (k === null) return;
138
+ if (seen.has(k)) out.push(i);
139
+ else seen.add(k);
140
+ });
141
+ return out;
142
+ }
143
+ var shown = (v) => {
144
+ const s = typeof v === "string" ? v.trim() : String(v ?? "");
145
+ return s.length > 40 ? `${s.slice(0, 39)}…` : s;
146
+ };
117
147
  /** Walk fields under `obj` and collect every issue, recursing into objects, array items and slot blocks. */
118
- function collectIssues(fields, obj, base, resolveSchema, out = []) {
148
+ function collectIssues(fields, obj, base, resolveSchema, out = [], cc) {
119
149
  const v = isObj(obj) ? obj : {};
150
+ const here = cc ?? {
151
+ root: v,
152
+ variant: typeof v._variant === "string" ? v._variant : void 0
153
+ };
154
+ const below = {
155
+ root: here.root,
156
+ parent: v,
157
+ variant: here.variant
158
+ };
120
159
  for (const f of fields) {
121
- if (isHidden(f, v)) continue;
160
+ if (isHidden(f, v, here)) continue;
122
161
  const p = [...base, f.name];
123
162
  const val = v[f.name];
124
163
  const raw = validateValue(f, val);
@@ -127,14 +166,49 @@ function collectIssues(fields, obj, base, resolveSchema, out = []) {
127
166
  key: pathKey(p),
128
167
  path: p
129
168
  });
130
- if (f.type === "object" && f.fields) collectIssues(f.fields, val, p, resolveSchema, out);
131
- if (f.type === "array" && Array.isArray(val) && !primitiveItem(f)) val.forEach((it, i) => {
132
- const s = itemSchemaFor(f, it);
133
- if (s?.fields) collectIssues(s.fields, it, [...p, i], resolveSchema, out);
134
- });
169
+ if (f.type === "object" && f.fields) collectIssues(f.fields, val, p, resolveSchema, out, below);
170
+ if ((f.type === "array" || f.type === "tags" || f.type === "multiselect") && Array.isArray(val) && f.validation?.unique && !raw) {
171
+ const [r] = repeats(val, itemKey);
172
+ if (r !== void 0) out.push({
173
+ level: "error",
174
+ kind: "rule",
175
+ message: typeof val[r] === "string" ? `“${shown(val[r])}” is in the list twice. Each item can be added once.` : `Item ${r + 1} repeats an earlier item. Each item must be different.`,
176
+ key: pathKey(p),
177
+ path: p
178
+ });
179
+ }
180
+ if (f.type === "array" && Array.isArray(val) && !primitiveItem(f)) {
181
+ val.forEach((it, i) => {
182
+ const s = itemSchemaFor(f, it);
183
+ if (s?.fields) collectIssues(s.fields, it, [...p, i], resolveSchema, out, below);
184
+ });
185
+ const keys = /* @__PURE__ */ new Set();
186
+ for (const it of val) for (const x of itemSchemaFor(f, it)?.fields ?? []) if (x.validation?.unique) keys.add(x.name);
187
+ for (const k of keys) {
188
+ const vals = val.map((it) => isObj(it) ? it[k] : void 0);
189
+ for (const i of repeats(vals, cellKey)) {
190
+ const fp = [
191
+ ...p,
192
+ i,
193
+ k
194
+ ];
195
+ const title = itemSchemaFor(f, val[i])?.fields?.find((x) => x.name === k)?.title ?? k;
196
+ if (!out.some((x) => x.key === pathKey(fp))) out.push({
197
+ level: "error",
198
+ kind: "rule",
199
+ message: `${title} must be different on each item. “${shown(vals[i])}” is already used.`,
200
+ key: pathKey(fp),
201
+ path: fp
202
+ });
203
+ }
204
+ }
205
+ }
135
206
  if (f.type === "slot" && Array.isArray(val) && resolveSchema) val.forEach((it, i) => {
136
207
  const b = isObj(it) && typeof it._type === "string" ? resolveSchema(it._type) : void 0;
137
- if (b) collectIssues(b.fields, it, [...p, i], resolveSchema, out);
208
+ if (b) collectIssues(b.fields, it, [...p, i], resolveSchema, out, {
209
+ root: it,
210
+ variant: isObj(it) && typeof it._variant === "string" ? it._variant : b.variants?.[0]?.id
211
+ });
138
212
  if (f.slotSettings && isObj(it)) collectIssues(f.slotSettings, it._settings, [
139
213
  ...p,
140
214
  i,
@@ -145,6 +219,6 @@ function collectIssues(fields, obj, base, resolveSchema, out = []) {
145
219
  return out;
146
220
  }
147
221
  //#endregion
148
- export { collectIssues, textLength };
222
+ export { collectIssues, textLength, validateValue };
149
223
 
150
224
  //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","names":[],"sources":["../../src/lib/validate.ts"],"sourcesContent":["/**\n * Validation — rules live in the schema (`validation`), messages state the rule in plain words.\n * Two kinds: \"required\" (shown after blur or a publish attempt) and \"rule\" (shown on blur too, never while\n * typing for the first time — the shell decides). Warnings (recommendedMax, missing alt) never block publish.\n */\nimport type { FieldPath, FieldSchema, TypeSchema } from \"../schema/types\";\nimport { isObj, pathKey } from \"./path\";\nimport { tableIssues } from \"../schema/table\";\nimport { isEmptyValue, isHidden, itemSchemaFor, plainText, primitiveItem, type CondCtx } from \"./schema\";\n\nexport interface KitIssue {\n key: string;\n path: FieldPath;\n level: \"error\" | \"warning\";\n kind: \"required\" | \"rule\";\n message: string;\n /** shown at once, even while the field is being typed in (a host's live check, e.g. the schema editor's help check) */\n live?: boolean;\n /** one fix the shell offers after the message (\"Clear help\") */\n fix?: { label: string; apply: () => void };\n}\ntype Raw = Omit<KitIssue, \"key\" | \"path\">;\n\nexport const textLength = (v: unknown) => plainText(v).length;\nconst counted = (f: FieldSchema) => f.type === \"string\" || f.type === \"text\" || f.type === \"richtext\";\n\n/** Validate one value against its field (not recursing into children). */\nexport function validateValue(f: FieldSchema, v: unknown): Raw | null {\n const r = f.validation ?? {};\n const label = f.title;\n if (r.required && isEmptyValue(v)) {\n const msg =\n f.type === \"image\" ? `Add an image for ${label.toLowerCase()}` :\n f.type === \"reference\" ? `Choose ${label.toLowerCase()}` :\n f.type === \"array\" || f.type === \"slot\" ? `Add at least one item to ${label.toLowerCase()}` :\n `${label} is required`;\n return { level: \"error\", kind: \"required\", message: msg };\n }\n if (isEmptyValue(v)) return null;\n\n if (counted(f)) {\n const n = textLength(v);\n if (r.max && n > r.max) return { level: \"error\", kind: \"rule\", message: `Keep it under ${r.max} characters (${n - r.max} over)` };\n if (r.min && n < r.min) return { level: \"error\", kind: \"rule\", message: `Use at least ${r.min} characters` };\n if (r.recommendedMax && n > r.recommendedMax)\n return { level: \"warning\", kind: \"rule\", message: `Longer than the recommended ${r.recommendedMax} characters. It may get cut off.` };\n }\n if ((f.type === \"array\" || f.type === \"slot\" || f.type === \"tags\" || f.type === \"multiselect\") && Array.isArray(v)) {\n if (r.min && v.length < r.min) return { level: \"error\", kind: \"rule\", message: `Add at least ${r.min} ${r.min === 1 ? \"item\" : \"items\"}` };\n if (r.max && v.length > r.max) return { level: \"error\", kind: \"rule\", message: `Use at most ${r.max} items` };\n }\n if (f.type === \"number\" && typeof v === \"number\") {\n const lo = r.min ?? f.numeric?.min;\n const hi = r.max ?? f.numeric?.max;\n if (lo != null && v < lo) return { level: \"error\", kind: \"rule\", message: `Use ${lo} or more` };\n if (hi != null && v > hi) return { level: \"error\", kind: \"rule\", message: `Use ${hi} or less` };\n }\n if (typeof v === \"string\") {\n if (f.type === \"email\" && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)) return { level: \"error\", kind: \"rule\", message: \"Use a full email address, like hello@caldera.com\" };\n if (f.type === \"url\" && !/^(https?:\\/\\/|\\/|#|mailto:|tel:)[^\\s]*$/.test(v)) return { level: \"error\", kind: \"rule\", message: \"Use a full URL, like https://example.com, or a path like /shop\" };\n if (f.type === \"url\" && /^(javascript|data):/i.test(v)) return { level: \"error\", kind: \"rule\", message: \"This kind of link isn't allowed\" };\n if (f.type === \"slug\" && !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(v)) return { level: \"error\", kind: \"rule\", message: \"Use lowercase letters, numbers and hyphens\" };\n if (f.type === \"json\") {\n try {\n JSON.parse(v);\n } catch {\n return { level: \"error\", kind: \"rule\", message: \"Invalid JSON\" };\n }\n }\n if (r.pattern && !new RegExp(r.pattern).test(v)) return { level: \"error\", kind: \"rule\", message: r.patternMessage ?? \"This doesn't match the expected format\" };\n }\n if (f.type === \"table\") {\n // caption, header labels, typed cells, row limits, markup readiness (src/schema/table.ts) — first error wins\n const issues = tableIssues(v, { ...f.table, minRows: f.table?.minRows ?? r.min, maxRows: f.table?.maxRows ?? r.max });\n const first = issues.find((i) => i.level === \"error\") ?? issues[0];\n if (first) return { level: first.level, kind: \"rule\", message: first.message };\n }\n if (f.type === \"image\" && isObj(v) && v.url && !v.alt && r.required) return { level: \"warning\", kind: \"rule\", message: \"No alt text. Describe the image for accessibility.\" };\n return null;\n}\n\n/**\n * What makes two values \"the same\" for `unique`, as the server judges a placement\n * (backend prop-fields tableProblem): a row's field compares text trimmed and case-folded, and\n * numbers; a list's items compare whole, strings case-folded, rows without their `_id` / `_key`.\n */\nconst cellKey = (v: unknown): string | null =>\n typeof v === \"number\" && Number.isFinite(v) ? String(v) : typeof v === \"string\" && v.trim() ? v.trim().toLocaleLowerCase(\"und\") : null;\nconst itemKey = (v: unknown): string => {\n if (typeof v === \"string\") return `s:${v.trim().toLocaleLowerCase(\"und\")}`;\n if (isObj(v)) {\n const { _id: _i, _key: _k, ...rest } = v;\n return `o:${JSON.stringify(Object.fromEntries(Object.entries(rest).sort(([a], [b]) => a.localeCompare(b))))}`;\n }\n return `j:${JSON.stringify(v)}`;\n};\n/** Indexes of the values whose key repeats one an earlier value already used. */\nfunction repeats(values: unknown[], key: (v: unknown) => string | null): number[] {\n const seen = new Set<string>();\n const out: number[] = [];\n values.forEach((v, i) => {\n const k = key(v);\n if (k === null) return;\n if (seen.has(k)) out.push(i);\n else seen.add(k);\n });\n return out;\n}\nconst shown = (v: unknown) => {\n const s = typeof v === \"string\" ? v.trim() : String(v ?? \"\");\n return s.length > 40 ? `${s.slice(0, 39)}…` : s;\n};\n\n/** Walk fields under `obj` and collect every issue, recursing into objects, array items and slot blocks. */\nexport function collectIssues(\n fields: FieldSchema[],\n obj: unknown,\n base: FieldPath,\n resolveSchema?: (t: string) => TypeSchema | undefined,\n out: KitIssue[] = [],\n /** what a `_variant` condition reads above this level (V2; the root call: the value itself) */\n cc?: CondCtx,\n): KitIssue[] {\n const v = isObj(obj) ? obj : {};\n const here: CondCtx = cc ?? { root: v, variant: typeof v._variant === \"string\" ? v._variant : undefined };\n const below: CondCtx = { root: here.root, parent: v, variant: here.variant };\n for (const f of fields) {\n if (isHidden(f, v, here)) continue;\n const p = [...base, f.name];\n const val = v[f.name];\n const raw = validateValue(f, val);\n if (raw) out.push({ ...raw, key: pathKey(p), path: p });\n if (f.type === \"object\" && f.fields) collectIssues(f.fields, val, p, resolveSchema, out, below);\n // A list's `unique`: no item twice (the first repeat is reported on the list).\n if ((f.type === \"array\" || f.type === \"tags\" || f.type === \"multiselect\") && Array.isArray(val) && f.validation?.unique && !raw) {\n const [r] = repeats(val, itemKey);\n if (r !== undefined) out.push({ level: \"error\", kind: \"rule\", message: typeof val[r] === \"string\" ? `“${shown(val[r])}” is in the list twice. Each item can be added once.` : `Item ${r + 1} repeats an earlier item. Each item must be different.`, key: pathKey(p), path: p });\n }\n if (f.type === \"array\" && Array.isArray(val) && !primitiveItem(f)) {\n val.forEach((it, i) => {\n const s = itemSchemaFor(f, it);\n if (s?.fields) collectIssues(s.fields, it, [...p, i], resolveSchema, out, below);\n });\n // A field inside the items with `unique`: no two items share its value.\n const keys = new Set<string>();\n for (const it of val) for (const x of itemSchemaFor(f, it)?.fields ?? []) if (x.validation?.unique) keys.add(x.name);\n for (const k of keys) {\n const vals = val.map((it) => (isObj(it) ? it[k] : undefined));\n for (const i of repeats(vals, cellKey)) {\n const fp = [...p, i, k];\n const title = itemSchemaFor(f, val[i])?.fields?.find((x) => x.name === k)?.title ?? k;\n if (!out.some((x) => x.key === pathKey(fp))) out.push({ level: \"error\", kind: \"rule\", message: `${title} must be different on each item. “${shown(vals[i])}” is already used.`, key: pathKey(fp), path: fp });\n }\n }\n }\n if (f.type === \"slot\" && Array.isArray(val) && resolveSchema) {\n val.forEach((it, i) => {\n const b = isObj(it) && typeof it._type === \"string\" ? resolveSchema(it._type) : undefined;\n if (b) collectIssues(b.fields, it, [...p, i], resolveSchema, out, { root: it, variant: isObj(it) && typeof it._variant === \"string\" ? it._variant : b.variants?.[0]?.id });\n if (f.slotSettings && isObj(it)) collectIssues(f.slotSettings, it._settings, [...p, i, \"_settings\"], resolveSchema, out);\n });\n }\n }\n return out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Static analysis of a catalog entry's schema — what the coverage matrix and the Model-notes facts show:
3
+ * field-type usage, deepest drill-in, and which schema features (conditions, localisation, groups…) it uses.
4
+ */
5
+ import type { SchemaType, TypeSchema } from "../schema/types";
6
+ import type { CatalogItem } from "./catalog";
7
+ /** Field types in the order the matrix shows them (content → media → structure → technical). */
8
+ export declare const TYPE_COLUMNS: SchemaType[];
9
+ export type FeatureKey = "conditional" | "localized" | "validation" | "devLocked" | "ai" | "groups" | "fieldsets" | "variants" | "synced";
10
+ export declare const FEATURE_COLUMNS: {
11
+ key: FeatureKey;
12
+ label: string;
13
+ }[];
14
+ export interface EntryStats {
15
+ types: Partial<Record<SchemaType, number>>;
16
+ fields: number;
17
+ /** deepest drill-in below the root (object, array item, slot child each add one level) */
18
+ depth: number;
19
+ features: Record<FeatureKey, boolean>;
20
+ /** block types reachable through slots */
21
+ slotTypes: string[];
22
+ }
23
+ export declare function statsOf(it: CatalogItem, resolve: (t: string) => TypeSchema | undefined): EntryStats;
@@ -0,0 +1,160 @@
1
+ //#region src/library/analysis.ts
2
+ /** Field types in the order the matrix shows them (content → media → structure → technical). */
3
+ var TYPE_COLUMNS = [
4
+ "string",
5
+ "text",
6
+ "richtext",
7
+ "number",
8
+ "boolean",
9
+ "select",
10
+ "multiselect",
11
+ "tags",
12
+ "slug",
13
+ "date",
14
+ "datetime",
15
+ "image",
16
+ "video",
17
+ "file",
18
+ "icon",
19
+ "color",
20
+ "link",
21
+ "button",
22
+ "url",
23
+ "email",
24
+ "reference",
25
+ "rating",
26
+ "geopoint",
27
+ "code",
28
+ "json",
29
+ "object",
30
+ "array",
31
+ "slot"
32
+ ];
33
+ var FEATURE_COLUMNS = [
34
+ {
35
+ key: "conditional",
36
+ label: "Conditional"
37
+ },
38
+ {
39
+ key: "localized",
40
+ label: "Localized"
41
+ },
42
+ {
43
+ key: "validation",
44
+ label: "Validated"
45
+ },
46
+ {
47
+ key: "devLocked",
48
+ label: "Dev-locked"
49
+ },
50
+ {
51
+ key: "ai",
52
+ label: "AI assist"
53
+ },
54
+ {
55
+ key: "groups",
56
+ label: "Tabs"
57
+ },
58
+ {
59
+ key: "fieldsets",
60
+ label: "Fieldsets"
61
+ },
62
+ {
63
+ key: "variants",
64
+ label: "Variants"
65
+ },
66
+ {
67
+ key: "synced",
68
+ label: "Synced"
69
+ }
70
+ ];
71
+ var subFields = (f) => f.type === "object" ? f.fields ?? [] : f.type === "array" && Array.isArray(f.of) ? f.of.flatMap((o) => o.type === "object" ? o.fields ?? [] : [o]) : [];
72
+ function walk(fields, visit, guard = 0) {
73
+ if (guard > 24) return;
74
+ for (const f of fields) {
75
+ visit(f);
76
+ walk(subFields(f), visit, guard + 1);
77
+ if (f.slotSettings) walk(f.slotSettings, visit, guard + 1);
78
+ }
79
+ }
80
+ /** Collect slot child types from the value too (slots without an allow-list hold whatever the sample placed). */
81
+ function valueTypes(v, out, guard = 0) {
82
+ if (guard > 30 || !v || typeof v !== "object") return;
83
+ if (Array.isArray(v)) {
84
+ for (const x of v) valueTypes(x, out, guard + 1);
85
+ return;
86
+ }
87
+ const o = v;
88
+ if (typeof o._type === "string") out.add(o._type);
89
+ for (const k of Object.keys(o)) if (k !== "_type" && k !== "_key") valueTypes(o[k], out, guard + 1);
90
+ }
91
+ function depthOf(fields, resolve, valueSlotTypes, seen, level = 0) {
92
+ if (level > 12) return level;
93
+ let max = 0;
94
+ for (const f of fields) if (f.type === "object") max = Math.max(max, 1 + depthOf(f.fields ?? [], resolve, valueSlotTypes, seen, level + 1));
95
+ else if (f.type === "array" && Array.isArray(f.of)) {
96
+ const objs = f.of.filter((o) => o.type === "object");
97
+ if (objs.length) max = Math.max(max, 1 + Math.max(...objs.map((o) => depthOf(o.fields ?? [], resolve, valueSlotTypes, seen, level + 1))));
98
+ } else if (f.type === "slot") {
99
+ const allow = f.of && !Array.isArray(f.of) ? f.of.allow : void 0;
100
+ const types = allow?.length ? allow : valueSlotTypes;
101
+ let inner = 0;
102
+ for (const t of types) {
103
+ if (seen.has(t)) continue;
104
+ const b = resolve(t);
105
+ if (!b) continue;
106
+ seen.add(t);
107
+ inner = Math.max(inner, depthOf(b.fields, resolve, valueSlotTypes, seen, level + 1));
108
+ seen.delete(t);
109
+ }
110
+ max = Math.max(max, 1 + inner);
111
+ }
112
+ return max;
113
+ }
114
+ var cache = /* @__PURE__ */ new WeakMap();
115
+ function statsOf(it, resolve) {
116
+ const hit = cache.get(it.ex);
117
+ if (hit) return hit;
118
+ const schema = it.ex.schema;
119
+ const types = {};
120
+ const features = {
121
+ conditional: false,
122
+ localized: false,
123
+ validation: false,
124
+ devLocked: false,
125
+ ai: false,
126
+ groups: (schema.groups?.length ?? 0) >= 2,
127
+ fieldsets: (schema.fieldsets?.length ?? 0) > 0,
128
+ variants: (schema.variants?.length ?? 0) > 0,
129
+ synced: !!it.ex.syncedFrom
130
+ };
131
+ let fields = 0;
132
+ walk(schema.fields, (f) => {
133
+ fields++;
134
+ types[f.type] = (types[f.type] ?? 0) + 1;
135
+ if (f.hidden && f.hidden !== true) features.conditional = true;
136
+ if (f.localized) features.localized = true;
137
+ if (f.validation && Object.keys(f.validation).length) features.validation = true;
138
+ if (f.access?.edit === "schema.manage") features.devLocked = true;
139
+ if (f.ai) features.ai = true;
140
+ if (f.fieldset) features.fieldsets = true;
141
+ if (f.synced) features.synced = true;
142
+ });
143
+ const vt = /* @__PURE__ */ new Set();
144
+ valueTypes(it.ex.value, vt);
145
+ const slotTypes = [...vt].filter((t) => !!resolve(t));
146
+ const depth = depthOf(schema.fields, resolve, slotTypes, /* @__PURE__ */ new Set([schema.name]));
147
+ const out = {
148
+ types,
149
+ fields,
150
+ depth,
151
+ features,
152
+ slotTypes
153
+ };
154
+ cache.set(it.ex, out);
155
+ return out;
156
+ }
157
+ //#endregion
158
+ export { FEATURE_COLUMNS, TYPE_COLUMNS, statsOf };
159
+
160
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","names":[],"sources":["../../src/library/analysis.ts"],"sourcesContent":["/**\n * Static analysis of a catalog entry's schema — what the coverage matrix and the Model-notes facts show:\n * field-type usage, deepest drill-in, and which schema features (conditions, localisation, groups…) it uses.\n */\nimport type { FieldSchema, SchemaType, TypeSchema } from \"../schema/types\";\nimport type { CatalogItem } from \"./catalog\";\n\n/** Field types in the order the matrix shows them (content → media → structure → technical). */\nexport const TYPE_COLUMNS: SchemaType[] = [\n \"string\", \"text\", \"richtext\", \"number\", \"boolean\", \"select\", \"multiselect\", \"tags\", \"slug\", \"date\", \"datetime\",\n \"image\", \"video\", \"file\", \"icon\", \"color\", \"link\", \"button\", \"url\", \"email\", \"reference\", \"rating\", \"geopoint\",\n \"code\", \"json\", \"object\", \"array\", \"slot\",\n];\n\nexport type FeatureKey = \"conditional\" | \"localized\" | \"validation\" | \"devLocked\" | \"ai\" | \"groups\" | \"fieldsets\" | \"variants\" | \"synced\";\nexport const FEATURE_COLUMNS: { key: FeatureKey; label: string }[] = [\n { key: \"conditional\", label: \"Conditional\" },\n { key: \"localized\", label: \"Localized\" },\n { key: \"validation\", label: \"Validated\" },\n { key: \"devLocked\", label: \"Dev-locked\" },\n { key: \"ai\", label: \"AI assist\" },\n { key: \"groups\", label: \"Tabs\" },\n { key: \"fieldsets\", label: \"Fieldsets\" },\n { key: \"variants\", label: \"Variants\" },\n { key: \"synced\", label: \"Synced\" },\n];\n\nexport interface EntryStats {\n types: Partial<Record<SchemaType, number>>;\n fields: number;\n /** deepest drill-in below the root (object, array item, slot child each add one level) */\n depth: number;\n features: Record<FeatureKey, boolean>;\n /** block types reachable through slots */\n slotTypes: string[];\n}\n\nconst subFields = (f: FieldSchema): FieldSchema[] =>\n f.type === \"object\" ? f.fields ?? [] : f.type === \"array\" && Array.isArray(f.of) ? f.of.flatMap((o) => (o.type === \"object\" ? o.fields ?? [] : [o])) : [];\n\nfunction walk(fields: FieldSchema[], visit: (f: FieldSchema) => void, guard = 0) {\n if (guard > 24) return;\n for (const f of fields) {\n visit(f);\n walk(subFields(f), visit, guard + 1);\n if (f.slotSettings) walk(f.slotSettings, visit, guard + 1);\n }\n}\n\n/** Collect slot child types from the value too (slots without an allow-list hold whatever the sample placed). */\nfunction valueTypes(v: unknown, out: Set<string>, guard = 0) {\n if (guard > 30 || !v || typeof v !== \"object\") return;\n if (Array.isArray(v)) {\n for (const x of v) valueTypes(x, out, guard + 1);\n return;\n }\n const o = v as Record<string, unknown>;\n if (typeof o._type === \"string\") out.add(o._type);\n for (const k of Object.keys(o)) if (k !== \"_type\" && k !== \"_key\") valueTypes(o[k], out, guard + 1);\n}\n\nfunction depthOf(fields: FieldSchema[], resolve: (t: string) => TypeSchema | undefined, valueSlotTypes: string[], seen: Set<string>, level = 0): number {\n if (level > 12) return level;\n let max = 0;\n for (const f of fields) {\n if (f.type === \"object\") max = Math.max(max, 1 + depthOf(f.fields ?? [], resolve, valueSlotTypes, seen, level + 1));\n else if (f.type === \"array\" && Array.isArray(f.of)) {\n const objs = f.of.filter((o) => o.type === \"object\");\n if (objs.length) max = Math.max(max, 1 + Math.max(...objs.map((o) => depthOf(o.fields ?? [], resolve, valueSlotTypes, seen, level + 1))));\n } else if (f.type === \"slot\") {\n const allow = f.of && !Array.isArray(f.of) ? f.of.allow : undefined;\n const types = allow?.length ? allow : valueSlotTypes;\n let inner = 0;\n for (const t of types) {\n if (seen.has(t)) continue;\n const b = resolve(t);\n if (!b) continue;\n seen.add(t);\n inner = Math.max(inner, depthOf(b.fields, resolve, valueSlotTypes, seen, level + 1));\n seen.delete(t);\n }\n max = Math.max(max, 1 + inner);\n }\n }\n return max;\n}\n\nconst cache = new WeakMap<object, EntryStats>();\n\nexport function statsOf(it: CatalogItem, resolve: (t: string) => TypeSchema | undefined): EntryStats {\n const hit = cache.get(it.ex);\n if (hit) return hit;\n const schema = it.ex.schema;\n const types: Partial<Record<SchemaType, number>> = {};\n const features: Record<FeatureKey, boolean> = {\n conditional: false, localized: false, validation: false, devLocked: false, ai: false,\n groups: (schema.groups?.length ?? 0) >= 2, fieldsets: (schema.fieldsets?.length ?? 0) > 0, variants: (schema.variants?.length ?? 0) > 0, synced: !!it.ex.syncedFrom,\n };\n let fields = 0;\n walk(schema.fields, (f) => {\n fields++;\n types[f.type] = (types[f.type] ?? 0) + 1;\n if (f.hidden && f.hidden !== true) features.conditional = true;\n if (f.localized) features.localized = true;\n if (f.validation && Object.keys(f.validation).length) features.validation = true;\n if (f.access?.edit === \"schema.manage\") features.devLocked = true;\n if (f.ai) features.ai = true;\n if (f.fieldset) features.fieldsets = true;\n if (f.synced) features.synced = true;\n });\n const vt = new Set<string>();\n valueTypes(it.ex.value, vt);\n const slotTypes = [...vt].filter((t) => !!resolve(t));\n const depth = depthOf(schema.fields, resolve, slotTypes, new Set([schema.name]));\n const out: EntryStats = { types, fields, depth, features, slotTypes };\n cache.set(it.ex, out);\n return out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Kit Library catalog — the library entries (`./entries/*.entries.ts`) plus the
3
+ * original Block Kit examples ("Core examples"), normalised into one list the page, the coverage matrix and
4
+ * the search use. Pure data: no React.
5
+ */
6
+ import { type KitExample } from "./examples";
7
+ import type { EdgeTag, KitCategory, KitEntry, KitModelNotes, KitPreviewLayout } from "./types";
8
+ import type { TypeSchema } from "../schema/types";
9
+ export declare const CORE_CATEGORY: "Core examples";
10
+ export type CatalogCategory = KitCategory | typeof CORE_CATEGORY;
11
+ /** Display order of the categories (the contract's union order). */
12
+ export declare const CATEGORY_ORDER: KitCategory[];
13
+ /** Every edge tag, in a reading order (structure → content → behaviour → output). */
14
+ export declare const EDGE_TAGS: {
15
+ tag: EdgeTag;
16
+ label: string;
17
+ hint: string;
18
+ }[];
19
+ export declare const TAG_LABEL: Record<string, string>;
20
+ export interface CatalogItem {
21
+ /** URL id: the entry id, or `core-{id}` for the original examples */
22
+ id: string;
23
+ ex: KitExample;
24
+ entry?: KitEntry;
25
+ core: boolean;
26
+ category: CatalogCategory;
27
+ tags: EdgeTag[];
28
+ notes?: KitModelNotes;
29
+ brand?: string;
30
+ previewLayout?: KitPreviewLayout;
31
+ /** lower-cased haystack: name, description, proves, category, tags, html signals, brand */
32
+ hay: string;
33
+ }
34
+ /** Library entries (sorted by category order, then file order) followed by the core examples. Ids are unique. */
35
+ export declare function buildCatalog(library?: KitEntry[]): CatalogItem[];
36
+ export declare const CATALOG: CatalogItem[];
37
+ /** Categories present in a list, in display order, with counts. */
38
+ export declare function categoriesOf(items: CatalogItem[]): {
39
+ category: CatalogCategory;
40
+ count: number;
41
+ }[];
42
+ /** Every term must appear somewhere in the haystack. */
43
+ export declare function matches(it: CatalogItem, terms: string[], tags: EdgeTag[]): boolean;
44
+ export declare const termsOf: (q: string) => string[];
45
+ /**
46
+ * Block schemas a slot can resolve: the shared example blocks plus every library entry whose schema is a block
47
+ * (so an entry may place another entry's block in a slot by its schema name). First definition wins.
48
+ */
49
+ export declare const LIBRARY_BLOCKS: TypeSchema[];
50
+ export declare const resolveLibraryBlock: (type: string) => TypeSchema | undefined;
51
+ /** Blocks offered by "+ Add block": only real blocks (not entries / pages). */
52
+ export declare const PICKABLE_BLOCKS: TypeSchema[];
53
+ /** Slot resolution for one catalog item: its entry-local `blocks` first (contract), then the shared library. */
54
+ export declare function blocksFor(it: CatalogItem): {
55
+ resolve: (type: string) => TypeSchema | undefined;
56
+ library: TypeSchema[];
57
+ };