@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frames.js","names":[],"sources":["../../src/lib/frames.ts"],"sourcesContent":["/**\n * NAVIGATION MODEL — a path resolves to a STACK OF FRAMES (one per breadcrumb). The last frame is what the\n * panel shows. Drillable nodes: object fields (drill mode), array items, slot children (blocks), button fields\n * (the one button screen) and \"@history\" (a field's versions as a stacked panel).\n */\nimport { HISTORY_SEGMENT, type Crumb, type FieldGroup, type FieldPath, type FieldSchema, type Fieldset, type TypeSchema } from \"../schema/types\";\nimport { cellText, isTableValue, normalizeTable } from \"../schema/table\";\nimport { getIn, isObj } from \"./path\";\nimport { isPrimitive, itemSchemaFor, previewOf } from \"./schema\";\n\nexport interface Frame {\n path: FieldPath;\n kind: Crumb[\"kind\"];\n title: string;\n icon?: string;\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n /** the field that owns this frame (object / array / slot / button / history target) */\n field?: FieldSchema;\n /** array items and slot children */\n item?: {\n arrayPath: FieldPath;\n index: number;\n count: number;\n itemSchema?: FieldSchema;\n block?: TypeSchema;\n slotField?: FieldSchema;\n /** the title of sibling `i` (table rows and columns, whose items have no schema to preview) */\n titleAt?: (i: number) => string;\n };\n}\n\nexport function rootFrame(schema: TypeSchema): Frame {\n return { path: [], kind: \"root\", title: schema.title, icon: schema.icon, fields: schema.fields, fieldsets: schema.fieldsets, groups: schema.groups };\n}\n\n/** Resolve `path` into frames. Stops at the first segment that doesn't resolve (returns the valid prefix). */\nexport function resolveFrames(\n schema: TypeSchema,\n value: unknown,\n path: FieldPath,\n resolveSchema?: (t: string) => TypeSchema | undefined,\n): { frames: Frame[]; path: FieldPath } {\n const frames: Frame[] = [rootFrame(schema)];\n let fields = schema.fields;\n let i = 0;\n while (i < path.length) {\n const seg = path[i];\n if (typeof seg !== \"string\") break;\n const f = fields.find((x) => x.name === seg);\n if (!f) break;\n const here = path.slice(0, i + 1);\n if (path[i + 1] === HISTORY_SEGMENT) {\n frames.push({ path: [...here, HISTORY_SEGMENT], kind: \"history\", title: \"History\", icon: \"clock\", fields: [f], field: f });\n i += 2;\n break;\n }\n if (f.type === \"object\" && f.fields) {\n frames.push({ path: here, kind: \"object\", title: f.title, icon: f.icon, fields: f.fields, field: f });\n fields = f.fields;\n i += 1;\n continue;\n }\n if (f.type === \"button\") {\n frames.push({ path: here, kind: \"button\", title: f.title, icon: \"click\", fields: [f], field: f });\n i += 1;\n // a button screen is a leaf, except for its own history\n if (path[i] === HISTORY_SEGMENT) {\n frames.push({ path: [...here, HISTORY_SEGMENT], kind: \"history\", title: \"History\", icon: \"clock\", fields: [f], field: f });\n i += 1;\n }\n break;\n }\n /* D50: a table's rows and columns drill like array items. A row inside a row group gets the group as a crumb\n (its path is the table field, which resolves back to the frame that shows the table). */\n if (f.type === \"table\" && (path[i + 1] === \"rows\" || path[i + 1] === \"columns\") && typeof path[i + 2] === \"number\") {\n const raw = getIn(value, here);\n if (!isTableValue(raw)) break;\n const t = normalizeTable(raw);\n const idx = path[i + 2] as number;\n const arrayPath = [...here, path[i + 1]];\n if (path[i + 1] === \"rows\") {\n const row = t.rows[idx];\n if (!row) break;\n const group = row.group && !row.footer ? t.rowGroups?.find((g) => g._key === row.group) : undefined;\n if (group) frames.push({ path: here, kind: \"tableGroup\", title: group.label || \"Untitled group\", icon: \"folder\", fields: [], field: f });\n const first = t.columns[0];\n const titleAt = (j: number) => {\n const r = t.rows[j];\n return (r && first && cellText(first, r, r.cells[first._key])) || \"Untitled row\";\n };\n frames.push({\n path: [...arrayPath, idx], kind: \"tableRow\", title: titleAt(idx), icon: \"list\", fields: [], field: f,\n item: { arrayPath, index: idx, count: t.rows.length, itemSchema: { name: \"row\", title: \"Row\", type: \"object\" }, titleAt },\n });\n } else {\n const col = t.columns[idx];\n if (!col) break;\n const titleAt = (j: number) => t.columns[j]?.label || \"Untitled column\";\n frames.push({\n path: [...arrayPath, idx], kind: \"tableColumn\", title: titleAt(idx), icon: \"layout-columns\", fields: [], field: f,\n item: { arrayPath, index: idx, count: t.columns.length, itemSchema: { name: \"column\", title: \"Column\", type: \"object\" }, titleAt },\n });\n }\n i += 3;\n break;\n }\n if ((f.type === \"array\" || f.type === \"slot\") && typeof path[i + 1] === \"number\") {\n const idx = path[i + 1] as number;\n const list = getIn(value, here);\n const items = Array.isArray(list) ? list : [];\n const item = items[idx];\n if (item === undefined) break;\n const itemPath = [...here, idx];\n if (f.type === \"array\") {\n const s = itemSchemaFor(f, item);\n if (!s || isPrimitive(s.type) || !s.fields) break;\n const pv = previewOf(s, item, idx);\n frames.push({\n path: itemPath, kind: \"item\", title: pv.title, icon: s.icon ?? f.icon, fields: s.fields, field: f,\n item: { arrayPath: here, index: idx, count: items.length, itemSchema: s },\n });\n fields = s.fields;\n } else {\n const type = isObj(item) && typeof item._type === \"string\" ? item._type : \"\";\n const block = resolveSchema?.(type);\n if (!block) break;\n const pv = previewOf(block, item, idx, block.title);\n frames.push({\n path: itemPath, kind: \"block\", title: pv.empty ? block.title : pv.title, icon: block.icon, fields: block.fields,\n fieldsets: block.fieldsets, groups: block.groups, field: f,\n item: { arrayPath: here, index: idx, count: items.length, block, slotField: f },\n });\n fields = block.fields;\n }\n i += 2;\n continue;\n }\n break;\n }\n return { frames, path: frames.length > 1 ? frames[frames.length - 1].path : [] };\n}\n\n/** Can this field be opened as its own frame (drill target)? */\nexport const isDrillable = (f: FieldSchema) => f.type === \"object\" || f.type === \"button\";\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Is this image field an ICON? The image control draws one 32px row for it instead of a picture card, the field shell
3
+ * gives it no second label, and the field lists gather two or more into one "Icons" group. One rule for all three, so
4
+ * they never disagree.
5
+ *
6
+ * Only `svgOnly`, which the schema adapter sets from the import's `media: "icon"` stamp (and nothing else sets). An SVG
7
+ * alone is not an icon: a site's SVG logo keeps its picture, alt text and details.
8
+ */
9
+ import type { FieldSchema } from "../schema/types";
10
+ export declare function isIconImage(field: FieldSchema, _value?: unknown): boolean;
@@ -0,0 +1,8 @@
1
+ //#region src/lib/icon-image.ts
2
+ function isIconImage(field, _value) {
3
+ return field.type === "image" && field.svgOnly === true;
4
+ }
5
+ //#endregion
6
+ export { isIconImage };
7
+
8
+ //# sourceMappingURL=icon-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-image.js","names":[],"sources":["../../src/lib/icon-image.ts"],"sourcesContent":["/**\n * Is this image field an ICON? The image control draws one 32px row for it instead of a picture card, the field shell\n * gives it no second label, and the field lists gather two or more into one \"Icons\" group. One rule for all three, so\n * they never disagree.\n *\n * Only `svgOnly`, which the schema adapter sets from the import's `media: \"icon\"` stamp (and nothing else sets). An SVG\n * alone is not an icon: a site's SVG logo keeps its picture, alt text and details.\n */\nimport type { FieldSchema } from \"../schema/types\";\n\nexport function isIconImage(field: FieldSchema, _value?: unknown): boolean {\n return field.type === \"image\" && field.svgOnly === true;\n}\n"],"mappings":";AAUA,SAAgB,YAAY,OAAoB,QAA2B;CACzE,OAAO,MAAM,SAAS,WAAW,MAAM,YAAY;AACrD"}
@@ -1,6 +1,6 @@
1
- import { IconAdjustments, IconAlertTriangle, IconAppWindow, IconArrowRight, IconArrowUpRight, IconAward, IconBadge, IconBolt, IconBook, IconBookmark, IconBox, IconBrandInstagram, IconBrandYoutube, IconBriefcase, IconBuildingStore, IconBulb, IconCalendar, IconCamera, IconCampfire, IconCards, IconCategory, IconChartBar, IconChartPie, IconCheck, IconChefHat, IconCircleCheck, IconClick, IconClipboardList, IconClock, IconCloud, IconCode, IconColumns2, IconColumns3, IconCompass, IconCreditCard, IconCurrencyDollar, IconCursorText, IconDeviceMobile, IconDiamond, IconDownload, IconFeather, IconFile, IconFileText, IconFilter, IconFlag, IconFlame, IconFolder, IconForms, IconGift, IconGlobe, IconHeart, IconHelpCircle, IconHome, IconInfoCircle, IconKey, IconLayoutBottombar, IconLayoutCards, IconLayoutColumns, IconLayoutDashboard, IconLayoutGrid, IconLayoutList, IconLayoutNavbar, IconLayoutSidebar, IconLeaf, IconLibraryPhoto, IconLink, IconList, IconListDetails, IconLock, IconMail, IconMap, IconMapPin, IconMenu2, IconMessage, IconMessage2, IconMoon, IconMountain, IconMovie, IconNews, IconPackage, IconPalette, IconPhoto, IconPlayerPlay, IconPlug, IconPresentation, IconPuzzle, IconQuote, IconRecycle, IconRocket, IconRuler, IconSearch, IconSection, IconSeo, IconSettings, IconShieldCheck, IconShoppingBag, IconShoppingCart, IconSparkles, IconSpeakerphone, IconSquareRoundedPlus, IconStack2, IconStar, IconSun, IconTable, IconTag, IconTags, IconTarget, IconTemplate, IconTent, IconToggleLeft, IconTool, IconTools, IconTruck, IconTypography, IconUser, IconUsers, IconUsersGroup, IconVideo, IconWorld } from "@tabler/icons-react";
2
1
  import { jsx } from "react/jsx-runtime";
3
- //#region src/kit/lib/icons.tsx
2
+ import { IconAdjustments, IconAlertTriangle, IconAppWindow, IconArrowRight, IconArrowUpRight, IconAward, IconBadge, IconBolt, IconBook, IconBookmark, IconBox, IconBrandInstagram, IconBrandYoutube, IconBriefcase, IconBuildingStore, IconBulb, IconCalendar, IconCamera, IconCampfire, IconCards, IconCategory, IconChartBar, IconChartPie, IconCheck, IconChefHat, IconCircleCheck, IconClick, IconClipboardList, IconClock, IconCloud, IconCode, IconColumns2, IconColumns3, IconCompass, IconCreditCard, IconCurrencyDollar, IconCursorText, IconDeviceMobile, IconDiamond, IconDownload, IconFeather, IconFile, IconFileText, IconFilter, IconFlag, IconFlame, IconFolder, IconForms, IconGift, IconGlobe, IconHeart, IconHelpCircle, IconHome, IconInfoCircle, IconKey, IconLayoutBottombar, IconLayoutCards, IconLayoutColumns, IconLayoutDashboard, IconLayoutGrid, IconLayoutList, IconLayoutNavbar, IconLayoutSidebar, IconLeaf, IconLibraryPhoto, IconLink, IconList, IconListDetails, IconLock, IconMail, IconMap, IconMapPin, IconMenu2, IconMessage, IconMessage2, IconMoon, IconMountain, IconMovie, IconNews, IconPackage, IconPalette, IconPhoto, IconPlayerPlay, IconPlug, IconPresentation, IconPuzzle, IconQuote, IconRecycle, IconRocket, IconRuler, IconSearch, IconSection, IconSeo, IconSettings, IconShieldCheck, IconShoppingBag, IconShoppingCart, IconSparkles, IconSpeakerphone, IconSquareRoundedPlus, IconStack2, IconStar, IconSun, IconTable, IconTag, IconTags, IconTarget, IconTemplate, IconTent, IconToggleLeft, IconTool, IconTools, IconTruck, IconTypography, IconUser, IconUsers, IconUsersGroup, IconVideo, IconWorld } from "@tabler/icons-react";
3
+ //#region src/lib/icons.tsx
4
4
  /**
5
5
  * Icon names in schemas are kebab-case Tabler names ("help-circle", "layout-grid"). Catalog data still
6
6
  * carries lucide-style names ("CircleHelp", "LayoutGrid"); `kitIcon()` resolves both.
@@ -158,7 +158,8 @@ function iconKey(name) {
158
158
  }
159
159
  /** Render a schema icon by name. Falls back to `fallback` (default: a neutral square). */
160
160
  function KitIcon({ name, className, fallback = "box" }) {
161
- return /* @__PURE__ */ jsx(KIT_ICONS[iconKey(name) ?? fallback] ?? IconBox, {
161
+ const I = KIT_ICONS[iconKey(name) ?? fallback] ?? IconBox;
162
+ return /* @__PURE__ */ jsx(I, {
162
163
  className,
163
164
  stroke: 1.5,
164
165
  "aria-hidden": true
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","names":[],"sources":["../../src/lib/icons.tsx"],"sourcesContent":["/**\n * Icon names in schemas are kebab-case Tabler names (\"help-circle\", \"layout-grid\"). Catalog data still\n * carries lucide-style names (\"CircleHelp\", \"LayoutGrid\"); `kitIcon()` resolves both.\n * The curated set doubles as the icon picker's library (explicit imports keep the bundle small).\n */\nimport {\n IconAlertTriangle, IconAppWindow, IconArrowRight, IconArrowUpRight, IconAward, IconBadge, IconBolt, IconBook, IconBookmark,\n IconBox, IconBrandInstagram, IconBriefcase, IconBuildingStore, IconBulb, IconCalendar, IconCamera, IconCampfire, IconCards,\n IconChartBar, IconChartPie, IconCheck, IconChefHat, IconCircleCheck, IconClick, IconClock, IconCloud, IconCode, IconColumns2,\n IconColumns3, IconCompass, IconCreditCard, IconCurrencyDollar, IconDeviceMobile, IconDiamond, IconDownload, IconFeather,\n IconFile, IconFileText, IconFilter, IconFlag, IconFlame, IconForms, IconGift, IconGlobe, IconHeart, IconHelpCircle, IconHome,\n IconInfoCircle, IconKey, IconLayoutBottombar, IconLayoutCards, IconLayoutGrid, IconLayoutNavbar, IconLayoutSidebar,\n IconLayoutList, IconLeaf, IconLibraryPhoto, IconLink, IconList, IconListDetails, IconLock, IconMail, IconMap, IconMapPin,\n IconMenu2, IconMessage, IconMessage2, IconMoon, IconMountain, IconMovie, IconNews, IconPackage, IconPalette, IconPhoto,\n IconPlayerPlay, IconPlug, IconPresentation, IconPuzzle, IconQuote, IconRecycle, IconRocket, IconRuler, IconSearch, IconSeo,\n IconSettings, IconShieldCheck, IconShoppingBag, IconShoppingCart, IconSparkles, IconSpeakerphone, IconStack2, IconStar,\n IconSun, IconTable, IconTag, IconTags, IconTarget, IconTemplate, IconTent, IconTool, IconTools, IconTruck, IconTypography,\n IconUser, IconUsers, IconUsersGroup, IconVideo, IconWorld, IconSquareRoundedPlus, IconLayoutDashboard, IconAdjustments,\n IconLayoutColumns, IconSection, IconCategory, IconToggleLeft, IconCursorText, IconBrandYoutube, IconFolder, IconClipboardList,\n type Icon,\n} from \"@tabler/icons-react\";\n\nexport const KIT_ICONS: Record<string, Icon> = {\n \"alert-triangle\": IconAlertTriangle, \"app-window\": IconAppWindow, \"arrow-right\": IconArrowRight, \"arrow-up-right\": IconArrowUpRight,\n award: IconAward, badge: IconBadge, bolt: IconBolt, book: IconBook, bookmark: IconBookmark, box: IconBox, instagram: IconBrandInstagram,\n briefcase: IconBriefcase, store: IconBuildingStore, bulb: IconBulb, calendar: IconCalendar, camera: IconCamera, campfire: IconCampfire,\n cards: IconCards, \"chart-bar\": IconChartBar, \"chart-pie\": IconChartPie, check: IconCheck, \"chef-hat\": IconChefHat,\n \"circle-check\": IconCircleCheck, click: IconClick, clock: IconClock, cloud: IconCloud, code: IconCode, \"columns-2\": IconColumns2,\n \"columns-3\": IconColumns3, compass: IconCompass, \"credit-card\": IconCreditCard, \"currency-dollar\": IconCurrencyDollar,\n \"device-mobile\": IconDeviceMobile, diamond: IconDiamond, download: IconDownload, feather: IconFeather, file: IconFile,\n \"file-text\": IconFileText, filter: IconFilter, flag: IconFlag, flame: IconFlame, forms: IconForms, gift: IconGift, globe: IconGlobe,\n heart: IconHeart, \"help-circle\": IconHelpCircle, home: IconHome, \"info-circle\": IconInfoCircle, key: IconKey,\n \"layout-bottombar\": IconLayoutBottombar, \"layout-cards\": IconLayoutCards, \"layout-grid\": IconLayoutGrid, \"layout-navbar\": IconLayoutNavbar,\n \"layout-sidebar\": IconLayoutSidebar, \"layout-list\": IconLayoutList, leaf: IconLeaf, \"library-photo\": IconLibraryPhoto, link: IconLink,\n list: IconList, \"list-details\": IconListDetails, lock: IconLock, mail: IconMail, map: IconMap, \"map-pin\": IconMapPin, menu: IconMenu2,\n message: IconMessage, \"message-2\": IconMessage2, moon: IconMoon, mountain: IconMountain, movie: IconMovie, news: IconNews,\n package: IconPackage, palette: IconPalette, photo: IconPhoto, \"player-play\": IconPlayerPlay, plug: IconPlug, presentation: IconPresentation,\n puzzle: IconPuzzle, quote: IconQuote, recycle: IconRecycle, rocket: IconRocket, ruler: IconRuler, search: IconSearch, seo: IconSeo,\n settings: IconSettings, \"shield-check\": IconShieldCheck, \"shopping-bag\": IconShoppingBag, \"shopping-cart\": IconShoppingCart,\n sparkles: IconSparkles, speakerphone: IconSpeakerphone, stack: IconStack2, star: IconStar, sun: IconSun, table: IconTable, tag: IconTag,\n tags: IconTags, target: IconTarget, template: IconTemplate, tent: IconTent, tool: IconTool, tools: IconTools, truck: IconTruck,\n typography: IconTypography, user: IconUser, users: IconUsers, \"users-group\": IconUsersGroup, video: IconVideo, world: IconWorld,\n \"square-plus\": IconSquareRoundedPlus, \"layout-dashboard\": IconLayoutDashboard, adjustments: IconAdjustments,\n \"layout-columns\": IconLayoutColumns, section: IconSection, category: IconCategory, toggle: IconToggleLeft, \"cursor-text\": IconCursorText,\n youtube: IconBrandYoutube, folder: IconFolder, \"clipboard-list\": IconClipboardList,\n};\n\n/** lucide-style names used by seed/catalog data → our kebab keys. */\nconst ALIASES: Record<string, string> = {\n \"circle-help\": \"help-circle\", megaphone: \"speakerphone\", \"panel-top\": \"layout-navbar\", \"panel-bottom\": \"layout-bottombar\",\n \"layout-template\": \"template\", \"bar-chart-3\": \"chart-bar\", \"badge-dollar-sign\": \"currency-dollar\", newspaper: \"news\",\n \"mouse-pointer-click\": \"click\", images: \"library-photo\", \"message-square-text\": \"message-2\", type: \"typography\",\n \"shield-check\": \"shield-check\", \"shopping-bag\": \"shopping-bag\", \"columns-2\": \"columns-2\", \"layout-grid\": \"layout-grid\",\n \"help-circle\": \"help-circle\", sparkle: \"sparkles\",\n};\n\nconst kebab = (s: string) =>\n s.replace(/^Icon/, \"\").replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").replace(/([A-Z])([A-Z][a-z])/g, \"$1-$2\").replace(/[_\\s]+/g, \"-\").toLowerCase();\n\nexport function iconKey(name?: string): string | undefined {\n if (!name) return undefined;\n const k = kebab(name);\n if (KIT_ICONS[k]) return k;\n const a = ALIASES[k];\n return a && KIT_ICONS[a] ? a : undefined;\n}\n\n/** Render a schema icon by name. Falls back to `fallback` (default: a neutral square). */\nexport function KitIcon({ name, className, fallback = \"box\" }: { name?: string; className?: string; fallback?: string }) {\n const I = KIT_ICONS[iconKey(name) ?? fallback] ?? IconBox;\n return <I className={className} stroke={1.5} aria-hidden />;\n}\n\n/** Human label for an icon key: \"help-circle\" → \"Help circle\". */\nexport const iconLabel = (k: string) => (k.charAt(0).toUpperCase() + k.slice(1)).replace(/-/g, \" \");\n"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Keyboard-only focus rings (D29, founder rule "never a dark box after a mouse click", DESIGN.md 3.7).
3
+ *
4
+ * `:focus-visible` alone isn't enough: Base UI returns focus to a trigger programmatically when a menu or popover
5
+ * closes, and Chrome/Safari can paint the ring there even though the user only ever used the mouse. We record the
6
+ * last input modality on <html data-input-modality> and the stylesheet suppresses rings while it is "pointer".
7
+ */
8
+ export declare const NAV_KEYS: ReadonlySet<string>;
9
+ export type InputModality = "pointer" | "keyboard";
10
+ /** Starts tracking; returns a function that stops it. Safe to call during SSR (no-op). */
11
+ export declare function trackInputModality(): () => void;
@@ -0,0 +1,47 @@
1
+ //#region src/lib/input-modality.ts
2
+ /**
3
+ * Keyboard-only focus rings (D29, founder rule "never a dark box after a mouse click", DESIGN.md 3.7).
4
+ *
5
+ * `:focus-visible` alone isn't enough: Base UI returns focus to a trigger programmatically when a menu or popover
6
+ * closes, and Chrome/Safari can paint the ring there even though the user only ever used the mouse. We record the
7
+ * last input modality on <html data-input-modality> and the stylesheet suppresses rings while it is "pointer".
8
+ */
9
+ var NAV_KEYS = /* @__PURE__ */ new Set([
10
+ "Tab",
11
+ "ArrowUp",
12
+ "ArrowDown",
13
+ "ArrowLeft",
14
+ "ArrowRight",
15
+ "Enter",
16
+ " ",
17
+ "Escape",
18
+ "Home",
19
+ "End",
20
+ "PageUp",
21
+ "PageDown",
22
+ "F6"
23
+ ]);
24
+ /** Starts tracking; returns a function that stops it. Safe to call during SSR (no-op). */
25
+ function trackInputModality() {
26
+ if (typeof document === "undefined") return () => {};
27
+ const root = document.documentElement;
28
+ const set = (m) => {
29
+ if (root.dataset.inputModality !== m) root.dataset.inputModality = m;
30
+ };
31
+ set("pointer");
32
+ const onPointer = () => set("pointer");
33
+ const onKey = (e) => {
34
+ if (e.metaKey || e.ctrlKey || e.altKey) return;
35
+ if (NAV_KEYS.has(e.key)) set("keyboard");
36
+ };
37
+ window.addEventListener("pointerdown", onPointer, true);
38
+ window.addEventListener("keydown", onKey, true);
39
+ return () => {
40
+ window.removeEventListener("pointerdown", onPointer, true);
41
+ window.removeEventListener("keydown", onKey, true);
42
+ };
43
+ }
44
+ //#endregion
45
+ export { NAV_KEYS, trackInputModality };
46
+
47
+ //# sourceMappingURL=input-modality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-modality.js","names":[],"sources":["../../src/lib/input-modality.ts"],"sourcesContent":["/**\n * Keyboard-only focus rings (D29, founder rule \"never a dark box after a mouse click\", DESIGN.md 3.7).\n *\n * `:focus-visible` alone isn't enough: Base UI returns focus to a trigger programmatically when a menu or popover\n * closes, and Chrome/Safari can paint the ring there even though the user only ever used the mouse. We record the\n * last input modality on <html data-input-modality> and the stylesheet suppresses rings while it is \"pointer\".\n */\nexport const NAV_KEYS: ReadonlySet<string> = new Set([\n \"Tab\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Enter\",\n \" \",\n \"Escape\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\",\n \"F6\",\n]);\n\nexport type InputModality = \"pointer\" | \"keyboard\";\n\n/** Starts tracking; returns a function that stops it. Safe to call during SSR (no-op). */\nexport function trackInputModality(): () => void {\n if (typeof document === \"undefined\") return () => {};\n const root = document.documentElement;\n const set = (m: InputModality) => {\n if (root.dataset.inputModality !== m) root.dataset.inputModality = m;\n };\n set(\"pointer\");\n const onPointer = () => set(\"pointer\");\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (NAV_KEYS.has(e.key)) set(\"keyboard\");\n };\n window.addEventListener(\"pointerdown\", onPointer, true);\n window.addEventListener(\"keydown\", onKey, true);\n return () => {\n window.removeEventListener(\"pointerdown\", onPointer, true);\n window.removeEventListener(\"keydown\", onKey, true);\n };\n}\n"],"mappings":";;;;;;;;AAOA,IAAa,2BAAgC,IAAI,IAAI;CACnD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;AAKD,SAAgB,qBAAiC;CAC/C,IAAI,OAAO,aAAa,aAAa,aAAa,CAAC;CACnD,MAAM,OAAO,SAAS;CACtB,MAAM,OAAO,MAAqB;EAChC,IAAI,KAAK,QAAQ,kBAAkB,GAAG,KAAK,QAAQ,gBAAgB;CACrE;CACA,IAAI,SAAS;CACb,MAAM,kBAAkB,IAAI,SAAS;CACrC,MAAM,SAAS,MAAqB;EAClC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ;EACxC,IAAI,SAAS,IAAI,EAAE,GAAG,GAAG,IAAI,UAAU;CACzC;CACA,OAAO,iBAAiB,eAAe,WAAW,IAAI;CACtD,OAAO,iBAAiB,WAAW,OAAO,IAAI;CAC9C,aAAa;EACX,OAAO,oBAAoB,eAAe,WAAW,IAAI;EACzD,OAAO,oBAAoB,WAAW,OAAO,IAAI;CACnD;AACF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The lower-cased key of a keyboard event, or `null` when the event carries none.
3
+ *
4
+ * The kit's copy of `src/lib/keyEvent.ts` (the kit imports only itself). Chrome's autofill, password
5
+ * managers, some IME compositions and extension-made events dispatch `keydown` with no `key`, and
6
+ * `e.key.toLowerCase()` threw a TypeError on each of them. A handler reads the key through this and
7
+ * treats `null` as "not my shortcut".
8
+ */
9
+ export declare function eventKey(event: {
10
+ key?: unknown;
11
+ }): string | null;
@@ -0,0 +1,16 @@
1
+ //#region src/lib/key-event.ts
2
+ /**
3
+ * The lower-cased key of a keyboard event, or `null` when the event carries none.
4
+ *
5
+ * The kit's copy of `src/lib/keyEvent.ts` (the kit imports only itself). Chrome's autofill, password
6
+ * managers, some IME compositions and extension-made events dispatch `keydown` with no `key`, and
7
+ * `e.key.toLowerCase()` threw a TypeError on each of them. A handler reads the key through this and
8
+ * treats `null` as "not my shortcut".
9
+ */
10
+ function eventKey(event) {
11
+ return typeof event.key === "string" ? event.key.toLowerCase() : null;
12
+ }
13
+ //#endregion
14
+ export { eventKey };
15
+
16
+ //# sourceMappingURL=key-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-event.js","names":[],"sources":["../../src/lib/key-event.ts"],"sourcesContent":["/**\n * The lower-cased key of a keyboard event, or `null` when the event carries none.\n *\n * The kit's copy of `src/lib/keyEvent.ts` (the kit imports only itself). Chrome's autofill, password\n * managers, some IME compositions and extension-made events dispatch `keydown` with no `key`, and\n * `e.key.toLowerCase()` threw a TypeError on each of them. A handler reads the key through this and\n * treats `null` as \"not my shortcut\".\n */\nexport function eventKey(event: { key?: unknown }): string | null {\n return typeof event.key === \"string\" ? event.key.toLowerCase() : null;\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,SAAS,OAAyC;CAChE,OAAO,OAAO,MAAM,QAAQ,WAAW,MAAM,IAAI,YAAY,IAAI;AACnE"}
@@ -1,4 +1,4 @@
1
- //#region src/kit/lib/path.ts
1
+ //#region src/lib/path.ts
2
2
  var isObj = (v) => !!v && typeof v === "object" && !Array.isArray(v);
3
3
  function getIn(root, path) {
4
4
  let cur = root;
@@ -30,6 +30,8 @@ var pathKey = (p) => p.join(".");
30
30
  */
31
31
  var frameKeyOf = (p) => p.length === 0 ? "root" : p.length === 1 && p[0] === "root" ? ".root" : pathKey(p);
32
32
  var pathEq = (a, b) => a.length === b.length && a.every((s, i) => s === b[i]);
33
+ /** `prefix` is an ancestor of (or equal to) `p`. */
34
+ var isPrefix = (prefix, p) => prefix.length <= p.length && prefix.every((s, i) => s === p[i]);
33
35
  var keyStartsWith = (key, prefix) => prefix === "" || key === prefix || key.startsWith(`${prefix}.`);
34
36
  var same = (a, b) => {
35
37
  if (a === b) return true;
@@ -59,6 +61,6 @@ function ensureKeys(items) {
59
61
  /** A stable React/dnd id for an item (objects use `_key`, primitives their index). */
60
62
  var itemId = (it, i) => isObj(it) && typeof it._key === "string" ? it._key : `i${i}`;
61
63
  //#endregion
62
- export { ensureKeys, frameKeyOf, getIn, isObj, itemId, keyStartsWith, newKey, pathEq, pathKey, same, setIn };
64
+ export { ensureKeys, frameKeyOf, getIn, isObj, isPrefix, itemId, keyStartsWith, newKey, pathEq, pathKey, same, setIn };
63
65
 
64
66
  //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","names":[],"sources":["../../src/lib/path.ts"],"sourcesContent":["/**\n * Immutable path helpers. A path addresses any value inside a document/block:\n * [\"items\", 1, \"answer\"] · [\"tabs\", 0, \"content\", 2, \"heading\"] · [\"title\", \"@history\"]\n * Writes share structure (only the spine is copied), so callers can diff top-level keys by identity.\n */\nimport type { FieldPath } from \"../schema/types\";\n\ntype Obj = Record<string, unknown>;\n\nexport const isObj = (v: unknown): v is Obj => !!v && typeof v === \"object\" && !Array.isArray(v);\n\nexport function getIn(root: unknown, path: FieldPath): unknown {\n let cur: unknown = root;\n for (const seg of path) {\n if (cur == null) return undefined;\n if (typeof seg === \"number\") cur = Array.isArray(cur) ? cur[seg] : undefined;\n else cur = isObj(cur) ? cur[seg] : undefined;\n }\n return cur;\n}\n\nexport function setIn<T>(root: T, path: FieldPath, value: unknown): T {\n if (path.length === 0) return value as T;\n const [head, ...rest] = path;\n if (typeof head === \"number\") {\n const arr = Array.isArray(root) ? root.slice() : [];\n arr[head] = setIn(arr[head], rest, value);\n return arr as unknown as T;\n }\n const obj: Obj = isObj(root) ? { ...root } : {};\n obj[head] = setIn(obj[head], rest, value);\n return obj as T;\n}\n\n/** \"items.1.answer\" — stable string key for maps (issues, presence, comments, history). */\nexport const pathKey = (p: FieldPath) => p.join(\".\");\n/**\n * The key of a frame (AnimatePresence key, `data-frame-body`, scroll memory, crumb key): \"root\" for the root frame,\n * else the path key. V2 used `pathKey(p) || \"root\"`, which collides when a root field is itself named `root`; that one\n * case gets \".root\", which no field path can produce (kit deviation, identical output for every other path).\n */\nexport const frameKeyOf = (p: FieldPath) => (p.length === 0 ? \"root\" : p.length === 1 && p[0] === \"root\" ? \".root\" : pathKey(p));\nexport const pathEq = (a: FieldPath, b: FieldPath) => a.length === b.length && a.every((s, i) => s === b[i]);\n/** `prefix` is an ancestor of (or equal to) `p`. */\nexport const isPrefix = (prefix: FieldPath, p: FieldPath) => prefix.length <= p.length && prefix.every((s, i) => s === p[i]);\nexport const keyStartsWith = (key: string, prefix: string) => prefix === \"\" || key === prefix || key.startsWith(`${prefix}.`);\n\nexport const same = (a: unknown, b: unknown) => {\n if (a === b) return true;\n try {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n } catch {\n return false;\n }\n};\n\nlet seq = 0;\nexport const newKey = () => `k${Date.now().toString(36).slice(-4)}${(seq++).toString(36)}${Math.random().toString(36).slice(2, 5)}`;\n\n/** Give every object item a `_key` (stable identity for drag and layout animation). Returns the same array when nothing changed. */\nexport function ensureKeys<T>(items: T[]): T[] {\n let changed = false;\n const out = items.map((it) => {\n if (isObj(it) && typeof it._key !== \"string\") {\n changed = true;\n return { _key: newKey(), ...it } as T;\n }\n return it;\n });\n return changed ? out : items;\n}\n\n/** A stable React/dnd id for an item (objects use `_key`, primitives their index). */\nexport const itemId = (it: unknown, i: number) => (isObj(it) && typeof it._key === \"string\" ? it._key : `i${i}`);\n"],"mappings":";AASA,IAAa,SAAS,MAAyB,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAE/F,SAAgB,MAAM,MAAe,MAA0B;CAC7D,IAAI,MAAe;CACnB,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,OAAO,MAAM,OAAO,KAAA;EACxB,IAAI,OAAO,QAAQ,UAAU,MAAM,MAAM,QAAQ,GAAG,IAAI,IAAI,OAAO,KAAA;OAC9D,MAAM,MAAM,GAAG,IAAI,IAAI,OAAO,KAAA;CACrC;CACA,OAAO;AACT;AAEA,SAAgB,MAAS,MAAS,MAAiB,OAAmB;CACpE,IAAI,KAAK,WAAW,GAAG,OAAO;CAC9B,MAAM,CAAC,MAAM,GAAG,QAAQ;CACxB,IAAI,OAAO,SAAS,UAAU;EAC5B,MAAM,MAAM,MAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC;EAClD,IAAI,QAAQ,MAAM,IAAI,OAAO,MAAM,KAAK;EACxC,OAAO;CACT;CACA,MAAM,MAAW,MAAM,IAAI,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;CAC9C,IAAI,QAAQ,MAAM,IAAI,OAAO,MAAM,KAAK;CACxC,OAAO;AACT;;AAGA,IAAa,WAAW,MAAiB,EAAE,KAAK,GAAG;;;;;;AAMnD,IAAa,cAAc,MAAkB,EAAE,WAAW,IAAI,SAAS,EAAE,WAAW,KAAK,EAAE,OAAO,SAAS,UAAU,QAAQ,CAAC;AAC9H,IAAa,UAAU,GAAc,MAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM,MAAM,EAAE,EAAE;;AAE3G,IAAa,YAAY,QAAmB,MAAiB,OAAO,UAAU,EAAE,UAAU,OAAO,OAAO,GAAG,MAAM,MAAM,EAAE,EAAE;AAC3H,IAAa,iBAAiB,KAAa,WAAmB,WAAW,MAAM,QAAQ,UAAU,IAAI,WAAW,GAAG,OAAO,EAAE;AAE5H,IAAa,QAAQ,GAAY,MAAe;CAC9C,IAAI,MAAM,GAAG,OAAO;CACpB,IAAI;EACF,OAAO,KAAK,UAAU,KAAK,IAAI,MAAM,KAAK,UAAU,KAAK,IAAI;CAC/D,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAI,MAAM;AACV,IAAa,eAAe,IAAI,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,MAAA,CAAO,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;;AAGhI,SAAgB,WAAc,OAAiB;CAC7C,IAAI,UAAU;CACd,MAAM,MAAM,MAAM,KAAK,OAAO;EAC5B,IAAI,MAAM,EAAE,KAAK,OAAO,GAAG,SAAS,UAAU;GAC5C,UAAU;GACV,OAAO;IAAE,MAAM,OAAO;IAAG,GAAG;GAAG;EACjC;EACA,OAAO;CACT,CAAC;CACD,OAAO,UAAU,MAAM;AACzB;;AAGA,IAAa,UAAU,IAAa,MAAe,MAAM,EAAE,KAAK,OAAO,GAAG,SAAS,WAAW,GAAG,OAAO,IAAI"}
@@ -26,11 +26,33 @@ export declare function objectInitial(fields: FieldSchema[]): Record<string, unk
26
26
  export declare function newItem(arrayField: FieldSchema, itemSchema: FieldSchema): unknown;
27
27
  export declare function newBlock(block: TypeSchema, settings?: FieldSchema[]): Record<string, unknown>;
28
28
  export declare function structuredCloneSafe<T>(v: T): T;
29
- /** `hidden: true` hides; a Condition SHOWS the field only when the sibling matches (types.ts contract). */
30
- export declare function isHidden(f: FieldSchema, parent: unknown): boolean;
29
+ /**
30
+ * What a condition can read beyond the fields beside it (V2 kit lib/schema.ts CondCtx): the object that holds them
31
+ * (`parent`), the top of the component or CMS item (`root`) and its variant. Callers that don't pass it get the sibling
32
+ * rules only; a `_variant` rule that can't be read then counts as met (the field shows), never as a silent hide.
33
+ */
34
+ export interface CondCtx {
35
+ parent?: unknown;
36
+ root?: unknown;
37
+ /** the component's variant id, its first variant when the value has none */
38
+ variant?: string;
39
+ }
40
+ /** The condition context for fields under `basePath` of a form (the nearest slot child is the component's root). V2 condCtx. */
41
+ export declare function condCtx(form: {
42
+ schema: TypeSchema;
43
+ getAt: (p: (string | number)[]) => unknown;
44
+ resolveSchema?: (t: string) => TypeSchema | undefined;
45
+ }, basePath: (string | number)[]): CondCtx;
46
+ /** `hidden: true` hides; a Condition SHOWS the field only while its rules hold (types.ts contract). A rule it can't read
47
+ * here (a `_variant` or scoped rule with no context) holds, so the field shows. V2 isHidden. */
48
+ export declare function isHidden(f: FieldSchema, parent: unknown, ctx?: CondCtx): boolean;
31
49
  /**
32
50
  * A value as one line of text. Stored rich text reads as its words in every shape production keeps: an html string,
33
- * Portable Text blocks, and the component props envelope `{ content: { version, content: blocks }, html }`.
51
+ * Portable Text blocks, the component props envelope `{ content: { version, content: blocks }, html }`, and the field
52
+ * envelope `{ format, value: blocks, html }`.
53
+ *
54
+ * 🔴 An html string's words are DECODED: a row titled by `<p>Advisors &amp; specialists</p>` read "Advisors &amp;
55
+ * specialists" in the dock (marby-astro QA, 2026-10-22).
34
56
  */
35
57
  export declare const plainText: (v: unknown) => string;
36
58
  export declare function isEmptyValue(v: unknown): boolean;
@@ -45,5 +67,14 @@ export interface Preview {
45
67
  empty: boolean;
46
68
  }
47
69
  export declare function previewOf(itemSchema: FieldSchema | TypeSchema | undefined, item: unknown, index: number, fallbackTitle?: string): Preview;
70
+ /**
71
+ * How one slot child reads as a row (SlotField): its block's preview (the block's title while it has no text), the
72
+ * variant chip its `_variant` names, and the line under it (block title · settings, else description, else "Block i of n").
73
+ */
74
+ export declare function slotRowOf(block: TypeSchema | undefined, item: unknown, index: number, count: number, slotSettings?: FieldSchema[]): {
75
+ preview: Preview;
76
+ chip?: string;
77
+ extra: string;
78
+ };
48
79
  /** "Cast iron · 4 items" — one-line summary of an object for collapsed rows and fieldset headers. */
49
80
  export declare function summarize(fields: FieldSchema[], v: unknown, max?: number): string;
@@ -1,7 +1,7 @@
1
- import { getIn, isObj, newKey } from "./path.js";
2
1
  import { cellValue, isEmptyCell, isTableValue, tableSummary } from "../schema/table.js";
3
- //#region src/kit/lib/schema.ts
4
- var PRIMITIVES = new Set([
2
+ import { getIn, isObj, newKey } from "./path.js";
3
+ //#region src/lib/schema.ts
4
+ var PRIMITIVES = /* @__PURE__ */ new Set([
5
5
  "string",
6
6
  "text",
7
7
  "richtext",
@@ -33,7 +33,7 @@ var isPrimitive = (t) => PRIMITIVES.has(t);
33
33
  /** Types whose value is plain text (counters, AI rewrite, copy/paste as text). */
34
34
  var isTextual = (t) => t === "string" || t === "text" || t === "richtext" || t === "slug" || t === "url" || t === "email";
35
35
  /** Types that are cheap to show inline inside a small object (no heavy surfaces). */
36
- var INLINE_OK = new Set([
36
+ var INLINE_OK = /* @__PURE__ */ new Set([
37
37
  "string",
38
38
  "number",
39
39
  "boolean",
@@ -131,24 +131,99 @@ function structuredCloneSafe(v) {
131
131
  return JSON.parse(JSON.stringify(v));
132
132
  }
133
133
  }
134
- /** `hidden: true` hides; a Condition SHOWS the field only when the sibling matches (types.ts contract). */
135
- function isHidden(f, parent) {
134
+ /** The condition context for fields under `basePath` of a form (the nearest slot child is the component's root). V2 condCtx. */
135
+ function condCtx(form, basePath) {
136
+ const up = (p) => {
137
+ const q = [...p];
138
+ while (q.length && typeof q[q.length - 1] === "number") q.pop();
139
+ q.pop();
140
+ return q;
141
+ };
142
+ let rootPath = [];
143
+ let rootSchema = form.schema;
144
+ for (let i = basePath.length; i > 0; i--) {
145
+ const v = form.getAt(basePath.slice(0, i));
146
+ if (isObj(v) && typeof v._type === "string" && typeof basePath[i - 1] === "number") {
147
+ rootPath = basePath.slice(0, i);
148
+ rootSchema = form.resolveSchema?.(v._type);
149
+ break;
150
+ }
151
+ }
152
+ const root = form.getAt(rootPath);
153
+ const own = isObj(root) && typeof root._variant === "string" ? root._variant : void 0;
154
+ return {
155
+ parent: basePath.length > rootPath.length ? form.getAt(up(basePath)) : void 0,
156
+ root,
157
+ variant: own ?? rootSchema?.variants?.[0]?.id
158
+ };
159
+ }
160
+ var num = (v) => typeof v === "number" ? v : typeof v === "string" && v.trim() !== "" && !Number.isNaN(Number(v)) ? Number(v) : typeof v === "string" && !Number.isNaN(Date.parse(v)) ? Date.parse(v) : NaN;
161
+ /** One rule (V2 ruleHolds): true when it holds, null when it can't be read here (no context). */
162
+ function ruleHolds(c, siblings, ctx) {
163
+ let v;
164
+ if (c.field === "_variant" && !c.scope) {
165
+ if (isObj(siblings) && typeof siblings._variant === "string") v = siblings._variant;
166
+ else if (ctx) v = ctx.variant;
167
+ else return null;
168
+ } else if (c.scope) {
169
+ if (!ctx) return null;
170
+ const from = c.scope === "root" ? ctx.root : ctx.parent;
171
+ v = c.field === "_variant" ? ctx.variant : isObj(from) ? from[c.field] : void 0;
172
+ } else v = isObj(siblings) ? siblings[c.field] : void 0;
173
+ const op = c.op ?? (c.notEmpty ? "notEmpty" : c.equals !== void 0 ? Array.isArray(c.equals) ? "in" : "is" : null);
174
+ const target = c.op ? c.value : c.equals;
175
+ const list = Array.isArray(target) ? target : [target];
176
+ const has = (x) => list.some((y) => y === x || Array.isArray(x) && x.includes(y));
177
+ switch (op) {
178
+ case "notEmpty": return !isEmptyValue(v);
179
+ case "empty": return isEmptyValue(v);
180
+ case "is":
181
+ case "in": return has(v);
182
+ case "isNot":
183
+ case "notIn": return !has(v);
184
+ case "gt": return num(v) > num(target);
185
+ case "lt": return num(v) < num(target);
186
+ default: return true;
187
+ }
188
+ }
189
+ /** `hidden: true` hides; a Condition SHOWS the field only while its rules hold (types.ts contract). A rule it can't read
190
+ * here (a `_variant` or scoped rule with no context) holds, so the field shows. V2 isHidden. */
191
+ function isHidden(f, parent, ctx) {
136
192
  if (f.hidden === true) return true;
137
193
  if (!f.hidden) return false;
138
194
  const c = f.hidden;
139
- const sib = isObj(parent) ? parent[c.field] : void 0;
140
- if (c.notEmpty) return isEmptyValue(sib);
141
- if (c.equals !== void 0) return !(Array.isArray(c.equals) ? c.equals : [c.equals]).includes(sib);
142
- return false;
195
+ const met = [c, ...c.also ?? []].map((r) => ruleHolds(r, parent, ctx) ?? true);
196
+ return !(c.match === "any" ? met.some(Boolean) : met.every(Boolean));
143
197
  }
144
198
  /** Portable Text blocks' text, one block per space; "" when the array holds no blocks (a list of items). */
145
199
  var blocksText = (v) => v.map((b) => isObj(b) && Array.isArray(b.children) ? b.children.map((c) => isObj(c) && typeof c.text === "string" ? c.text : "").join("") : "").filter(Boolean).join(" ").replace(/\s+/g, " ").trim();
200
+ var NAMED_ENTITIES = {
201
+ amp: "&",
202
+ lt: "<",
203
+ gt: ">",
204
+ quot: "\"",
205
+ apos: "'",
206
+ nbsp: " "
207
+ };
208
+ /**
209
+ * Markup's character references as the characters they stand for, AFTER the tags are gone (so a decoded `&lt;b&gt;`
210
+ * stays words). Named ones a rich text editor writes, and every numeric one; anything else is left as written.
211
+ */
212
+ var decodeEntities = (s) => s.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (whole, ref) => {
213
+ if (ref[0] !== "#") return NAMED_ENTITIES[ref.toLowerCase()] ?? whole;
214
+ const code = ref[1] === "x" || ref[1] === "X" ? parseInt(ref.slice(2), 16) : parseInt(ref.slice(1), 10);
215
+ return Number.isFinite(code) && code > 0 && code <= 1114111 ? String.fromCodePoint(code) : whole;
216
+ });
146
217
  /**
147
218
  * A value as one line of text. Stored rich text reads as its words in every shape production keeps: an html string,
148
- * Portable Text blocks, and the component props envelope `{ content: { version, content: blocks }, html }`.
219
+ * Portable Text blocks, the component props envelope `{ content: { version, content: blocks }, html }`, and the field
220
+ * envelope `{ format, value: blocks, html }`.
221
+ *
222
+ * 🔴 An html string's words are DECODED: a row titled by `<p>Advisors &amp; specialists</p>` read "Advisors &amp;
223
+ * specialists" in the dock (marby-astro QA, 2026-10-22).
149
224
  */
150
225
  var plainText = (v) => {
151
- if (typeof v === "string") return v.replace(/<[^>]*>/g, " ").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim();
226
+ if (typeof v === "string") return decodeEntities(v.replace(/<[^>]*>/g, " ")).replace(/\s+/g, " ").trim();
152
227
  if (typeof v === "number") return String(v);
153
228
  if (Array.isArray(v)) return blocksText(v);
154
229
  if (isObj(v)) {
@@ -160,6 +235,10 @@ var plainText = (v) => {
160
235
  const t = plainText(v.content);
161
236
  if (t) return t;
162
237
  }
238
+ if (Array.isArray(v.value)) {
239
+ const t = blocksText(v.value);
240
+ if (t) return t;
241
+ }
163
242
  if (typeof v.html === "string") return plainText(v.html);
164
243
  }
165
244
  return "";
@@ -254,6 +333,24 @@ function previewOf(itemSchema, item, index, fallbackTitle) {
254
333
  empty
255
334
  };
256
335
  }
336
+ /**
337
+ * How one slot child reads as a row (SlotField): its block's preview (the block's title while it has no text), the
338
+ * variant chip its `_variant` names, and the line under it (block title · settings, else description, else "Block i of n").
339
+ */
340
+ function slotRowOf(block, item, index, count, slotSettings) {
341
+ const pv = previewOf(block, item, index, block?.title ?? "Block");
342
+ const variant = block?.variants?.find((v) => isObj(item) && v.id === item._variant)?.name;
343
+ const settings = slotSettings && isObj(item) ? summarize(slotSettings, item._settings, 2) : "";
344
+ return {
345
+ preview: {
346
+ ...pv,
347
+ title: pv.empty ? block?.title ?? "Unknown block" : pv.title,
348
+ icon: block?.icon ?? "box"
349
+ },
350
+ chip: variant,
351
+ extra: [pv.empty ? void 0 : block?.title, settings].filter(Boolean).join(" · ") || block?.description || `Block ${index + 1} of ${count}`
352
+ };
353
+ }
257
354
  /** "Cast iron · 4 items" — one-line summary of an object for collapsed rows and fieldset headers. */
258
355
  function summarize(fields, v, max = 2) {
259
356
  if (!isObj(v)) return "";
@@ -282,6 +379,6 @@ function summarize(fields, v, max = 2) {
282
379
  }
283
380
  var itemNounSafe = (f) => f.type === "array" || f.type === "slot" ? itemNoun(f) : "item";
284
381
  //#endregion
285
- export { initialFor, isEmptyValue, isHidden, isPrimitive, isTextual, itemNoun, itemOpenMode, itemSchemaFor, itemSchemas, newBlock, newItem, objectOpenMode, plainText, previewOf, primitiveItem, slotAllow, summarize };
382
+ export { condCtx, emptyFor, imageUrl, initialFor, isEmptyValue, isHidden, isPrimitive, isSmallObject, isTextual, itemNoun, itemOpenMode, itemSchemaFor, itemSchemas, newBlock, newItem, objectInitial, objectOpenMode, plainText, previewOf, primitiveItem, slotAllow, slotRowOf, structuredCloneSafe, summarize };
286
383
 
287
384
  //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../src/lib/schema.ts"],"sourcesContent":["/**\n * Schema helpers — pure functions the engine uses to decide HOW a field is edited and WHAT a row shows.\n */\nimport type { Condition, FieldSchema, OpenMode, PrimitiveType, SchemaType, TypeSchema } from \"../schema/types\";\nimport { getIn, isObj, newKey } from \"./path\";\nimport { cellValue, isEmptyCell, isTableValue, tableSummary } from \"../schema/table\";\n\nconst PRIMITIVES: ReadonlySet<SchemaType> = new Set<PrimitiveType>([\n \"string\", \"text\", \"richtext\", \"number\", \"boolean\", \"slug\", \"url\", \"email\", \"date\", \"datetime\", \"color\", \"select\", \"multiselect\",\n \"tags\", \"image\", \"file\", \"video\", \"icon\", \"link\", \"button\", \"reference\", \"code\", \"json\", \"geopoint\", \"rating\", \"table\",\n]);\nexport const isPrimitive = (t: SchemaType) => PRIMITIVES.has(t);\n/** Types whose value is plain text (counters, AI rewrite, copy/paste as text). */\nexport const isTextual = (t: SchemaType) => t === \"string\" || t === \"text\" || t === \"richtext\" || t === \"slug\" || t === \"url\" || t === \"email\";\n/** Types that are cheap to show inline inside a small object (no heavy surfaces). */\nconst INLINE_OK: ReadonlySet<SchemaType> = new Set([\"string\", \"number\", \"boolean\", \"select\", \"color\", \"icon\", \"url\", \"email\", \"date\", \"rating\", \"slug\"]);\n\nexport const itemSchemas = (f: FieldSchema): FieldSchema[] => (Array.isArray(f.of) ? f.of : []);\nexport const slotAllow = (f: FieldSchema): string[] | undefined => (f.of && !Array.isArray(f.of) ? f.of.allow : undefined);\nexport const itemSchemaFor = (f: FieldSchema, item: unknown): FieldSchema | undefined => {\n const of = itemSchemas(f);\n if (isObj(item) && typeof item._type === \"string\") return of.find((o) => o.name === item._type) ?? of[0];\n return of[0];\n};\n/** An array whose single item type is a primitive (tags, gallery, references, list of strings). */\nexport const primitiveItem = (f: FieldSchema): FieldSchema | undefined => {\n const of = itemSchemas(f);\n return of.length === 1 && isPrimitive(of[0].type) ? of[0] : undefined;\n};\nexport const isSmallObject = (fields: FieldSchema[] = []) => fields.length > 0 && fields.length <= 3 && fields.every((f) => INLINE_OK.has(f.type));\n\n/** How an object field / array item opens (CPO D8: inline for ≤3 primitives, else drill). */\nexport function objectOpenMode(f: FieldSchema): OpenMode {\n if (f.openMode) return f.openMode;\n return isSmallObject(f.fields) ? \"inline\" : \"drill\";\n}\n/**\n * CPO D43 — one rule for rows: an item of ≤3 simple fields (text, number, switch, select, colour, icon, url, email,\n * date, rating, slug) EXPANDS inline under its row; anything bigger, nested or rich DRILLS into its own frame.\n * `openMode` on the array still wins (developer override). Several item types → drill (they rarely share a shape).\n */\nexport function itemOpenMode(arrayField: FieldSchema): OpenMode {\n if (arrayField.openMode) return arrayField.openMode;\n const of = itemSchemas(arrayField);\n return of.length === 1 && isSmallObject(of[0].fields) ? \"inline\" : \"drill\";\n}\n\nexport function emptyFor(f: FieldSchema): unknown {\n switch (f.type) {\n case \"boolean\": return false;\n case \"number\": case \"rating\": return null;\n case \"multiselect\": case \"tags\": case \"array\": case \"slot\": return [];\n case \"object\": return objectInitial(f.fields ?? []);\n case \"image\": case \"file\": case \"video\": case \"reference\": case \"link\": case \"button\": case \"geopoint\": case \"json\": case \"table\": return null;\n default: return \"\";\n }\n}\nexport const initialFor = (f: FieldSchema) => (f.initialValue !== undefined ? structuredCloneSafe(f.initialValue) : emptyFor(f));\nexport function objectInitial(fields: FieldSchema[]): Record<string, unknown> {\n const o: Record<string, unknown> = {};\n for (const f of fields) if (f.initialValue !== undefined) o[f.name] = structuredCloneSafe(f.initialValue);\n return o;\n}\n/** A new array item for `itemSchema` (stamped with `_key` and, when the array allows several types, `_type`). */\nexport function newItem(arrayField: FieldSchema, itemSchema: FieldSchema): unknown {\n if (isPrimitive(itemSchema.type)) return initialFor(itemSchema);\n const base = itemSchema.initialValue && isObj(itemSchema.initialValue) ? structuredCloneSafe(itemSchema.initialValue) : objectInitial(itemSchema.fields ?? []);\n const multi = itemSchemas(arrayField).length > 1;\n return { _key: newKey(), ...(multi ? { _type: itemSchema.name } : {}), ...(base as object) };\n}\nexport function newBlock(block: TypeSchema, settings?: FieldSchema[]): Record<string, unknown> {\n const init = block.initialValue ? structuredCloneSafe(block.initialValue) : objectInitial(block.fields);\n const s = settings?.length ? { _settings: objectInitial(settings) } : {};\n return { _key: newKey(), _type: block.name, ...(block.variants?.[0] ? { _variant: block.variants[0].id } : {}), ...s, ...(init as object) };\n}\nexport function structuredCloneSafe<T>(v: T): T {\n try {\n return structuredClone(v);\n } catch {\n return JSON.parse(JSON.stringify(v)) as T;\n }\n}\n\n/* ── Conditions ───────────────────────────────────────────────────────── */\n/**\n * What a condition can read beyond the fields beside it (V2 kit lib/schema.ts CondCtx): the object that holds them\n * (`parent`), the top of the component or CMS item (`root`) and its variant. Callers that don't pass it get the sibling\n * rules only; a `_variant` rule that can't be read then counts as met (the field shows), never as a silent hide.\n */\nexport interface CondCtx {\n parent?: unknown;\n root?: unknown;\n /** the component's variant id, its first variant when the value has none */\n variant?: string;\n}\n/** The condition context for fields under `basePath` of a form (the nearest slot child is the component's root). V2 condCtx. */\nexport function condCtx(form: { schema: TypeSchema; getAt: (p: (string | number)[]) => unknown; resolveSchema?: (t: string) => TypeSchema | undefined }, basePath: (string | number)[]): CondCtx {\n const up = (p: (string | number)[]) => {\n const q = [...p];\n // the container may be a list item ([\"items\", 0]): the object holding it is one key further up\n while (q.length && typeof q[q.length - 1] === \"number\") q.pop();\n q.pop();\n return q;\n };\n let rootPath: (string | number)[] = [];\n let rootSchema: TypeSchema | undefined = form.schema;\n for (let i = basePath.length; i > 0; i--) {\n const v = form.getAt(basePath.slice(0, i));\n if (isObj(v) && typeof v._type === \"string\" && typeof basePath[i - 1] === \"number\") {\n rootPath = basePath.slice(0, i);\n rootSchema = form.resolveSchema?.(v._type);\n break;\n }\n }\n const root = form.getAt(rootPath);\n const own = isObj(root) && typeof root._variant === \"string\" ? root._variant : undefined;\n return { parent: basePath.length > rootPath.length ? form.getAt(up(basePath)) : undefined, root, variant: own ?? rootSchema?.variants?.[0]?.id };\n}\n\nconst num = (v: unknown) => (typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" && !Number.isNaN(Number(v)) ? Number(v) : typeof v === \"string\" && !Number.isNaN(Date.parse(v)) ? Date.parse(v) : NaN);\n/** One rule (V2 ruleHolds): true when it holds, null when it can't be read here (no context). */\nfunction ruleHolds(c: Condition, siblings: unknown, ctx: CondCtx | undefined): boolean | null {\n let v: unknown;\n if (c.field === \"_variant\" && !c.scope) {\n if (isObj(siblings) && typeof siblings._variant === \"string\") v = siblings._variant;\n else if (ctx) v = ctx.variant;\n else return null;\n } else if (c.scope) {\n if (!ctx) return null;\n const from = c.scope === \"root\" ? ctx.root : ctx.parent;\n v = c.field === \"_variant\" ? ctx.variant : isObj(from) ? from[c.field] : undefined;\n } else v = isObj(siblings) ? siblings[c.field] : undefined;\n const op = c.op ?? (c.notEmpty ? \"notEmpty\" : c.equals !== undefined ? (Array.isArray(c.equals) ? \"in\" : \"is\") : null);\n const target = c.op ? c.value : c.equals;\n const list = Array.isArray(target) ? target : [target];\n const has = (x: unknown) => list.some((y) => y === x || (Array.isArray(x) && x.includes(y as never)));\n switch (op) {\n case \"notEmpty\": return !isEmptyValue(v);\n case \"empty\": return isEmptyValue(v);\n case \"is\":\n case \"in\": return has(v);\n case \"isNot\":\n case \"notIn\": return !has(v);\n case \"gt\": return num(v) > num(target);\n case \"lt\": return num(v) < num(target);\n default: return true;\n }\n}\n\n/** `hidden: true` hides; a Condition SHOWS the field only while its rules hold (types.ts contract). A rule it can't read\n * here (a `_variant` or scoped rule with no context) holds, so the field shows. V2 isHidden. */\nexport function isHidden(f: FieldSchema, parent: unknown, ctx?: CondCtx): boolean {\n if (f.hidden === true) return true;\n if (!f.hidden) return false;\n const c = f.hidden as Condition;\n const met = [c, ...(c.also ?? [])].map((r) => ruleHolds(r, parent, ctx) ?? true);\n return !(c.match === \"any\" ? met.some(Boolean) : met.every(Boolean));\n}\n\n/* ── Values → text ────────────────────────────────────────────────────── */\n/** Portable Text blocks' text, one block per space; \"\" when the array holds no blocks (a list of items). */\nconst blocksText = (v: unknown[]): string =>\n v\n .map((b) => (isObj(b) && Array.isArray(b.children) ? b.children.map((c) => (isObj(c) && typeof c.text === \"string\" ? c.text : \"\")).join(\"\") : \"\"))\n .filter(Boolean)\n .join(\" \")\n .replace(/\\s+/g, \" \")\n .trim();\nconst NAMED_ENTITIES: Record<string, string> = { amp: \"&\", lt: \"<\", gt: \">\", quot: '\"', apos: \"'\", nbsp: \" \" };\n/**\n * Markup's character references as the characters they stand for, AFTER the tags are gone (so a decoded `&lt;b&gt;`\n * stays words). Named ones a rich text editor writes, and every numeric one; anything else is left as written.\n */\nconst decodeEntities = (s: string): string =>\n s.replace(/&(#x[0-9a-f]+|#\\d+|[a-z]+);/gi, (whole, ref: string) => {\n if (ref[0] !== \"#\") return NAMED_ENTITIES[ref.toLowerCase()] ?? whole;\n const code = ref[1] === \"x\" || ref[1] === \"X\" ? parseInt(ref.slice(2), 16) : parseInt(ref.slice(1), 10);\n return Number.isFinite(code) && code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : whole;\n });\n/**\n * A value as one line of text. Stored rich text reads as its words in every shape production keeps: an html string,\n * Portable Text blocks, the component props envelope `{ content: { version, content: blocks }, html }`, and the field\n * envelope `{ format, value: blocks, html }`.\n *\n * 🔴 An html string's words are DECODED: a row titled by `<p>Advisors &amp; specialists</p>` read \"Advisors &amp;\n * specialists\" in the dock (marby-astro QA, 2026-10-22).\n */\nexport const plainText = (v: unknown): string => {\n if (typeof v === \"string\") return decodeEntities(v.replace(/<[^>]*>/g, \" \")).replace(/\\s+/g, \" \").trim();\n if (typeof v === \"number\") return String(v);\n if (Array.isArray(v)) return blocksText(v);\n if (isObj(v)) {\n if (typeof v.label === \"string\" && v.label) return v.label;\n if (typeof v.title === \"string\") return v.title;\n if (typeof v.href === \"string\") return v.href;\n if (typeof v.name === \"string\") return v.name;\n // the envelope's blocks first: their text is unescaped (the html holds `&amp;`)\n if (\"content\" in v && typeof v.content === \"object\" && v.content !== null) {\n const t = plainText(v.content);\n if (t) return t;\n }\n if (Array.isArray(v.value)) {\n const t = blocksText(v.value);\n if (t) return t;\n }\n if (typeof v.html === \"string\") return plainText(v.html);\n }\n return \"\";\n};\nexport function isEmptyValue(v: unknown): boolean {\n if (v == null) return true;\n if (typeof v === \"string\") return plainText(v) === \"\" && !/<img|<hr|<table|data-block|data-embed/.test(v);\n if (Array.isArray(v)) return v.length === 0;\n if (isTableValue(v)) return !v.caption?.trim() && v.rows.every((r) => Object.values(r.cells ?? {}).every((c) => isEmptyCell(cellValue(c))));\n if (isObj(v)) {\n if (\"url\" in v) return !v.url;\n if (\"href\" in v && !(\"label\" in v)) return !v.href;\n if (\"label\" in v && \"href\" in v) return !v.label && !v.href;\n return Object.keys(v).filter((k) => !k.startsWith(\"_\")).every((k) => isEmptyValue(v[k]));\n }\n return false;\n}\nexport const imageUrl = (v: unknown): string | undefined =>\n typeof v === \"string\" && /^(https?:|blob:|data:image|\\/)/.test(v) ? v : isObj(v) && typeof v.url === \"string\" && v.url ? v.url : undefined;\n\n/** Singular noun for an array's items: itemNoun → item title → field title minus \"s\". */\nexport function itemNoun(f: FieldSchema): string {\n if (f.itemNoun) return f.itemNoun;\n const of = itemSchemas(f);\n if (of.length === 1 && of[0].title && !isPrimitive(of[0].type)) return of[0].title.toLowerCase();\n const t = f.title.toLowerCase();\n return t.endsWith(\"ies\") ? `${t.slice(0, -3)}y` : t.endsWith(\"s\") ? t.slice(0, -1) : \"item\";\n}\n\n/* ── Previews (array rows, slot rows, crumbs) ─────────────────────────── */\nexport interface Preview {\n title: string;\n subtitle?: string;\n media?: string;\n icon?: string;\n empty: boolean;\n}\n/** Display text of one field value (select → option label). */\nfunction fieldText(f: FieldSchema | undefined, v: unknown): string {\n if (f?.type === \"select\") return f.options?.find((o) => o.value === v)?.label ?? plainText(v);\n return plainText(v);\n}\nfunction firstText(fields: FieldSchema[], v: Record<string, unknown>, skip?: string) {\n for (const f of fields) {\n if (f.name === skip) continue;\n if (f.type === \"select\") {\n const t = fieldText(f, v[f.name]);\n if (t) return { name: f.name, text: t };\n }\n if (f.type === \"string\" || f.type === \"text\" || f.type === \"richtext\" || f.type === \"number\") {\n const t = plainText(v[f.name]);\n if (t) return { name: f.name, text: t };\n }\n if (f.type === \"button\" || f.type === \"link\") {\n const t = plainText(v[f.name]);\n if (t) return { name: f.name, text: t };\n }\n }\n // no prose anywhere: a URL or address still beats \"Item 3\" (D47 — item titles use the first text value)\n for (const f of fields) {\n if (f.name === skip || (f.type !== \"url\" && f.type !== \"email\" && f.type !== \"slug\")) continue;\n const t = plainText(v[f.name]);\n if (t) return { name: f.name, text: t };\n }\n return undefined;\n}\nexport function previewOf(itemSchema: FieldSchema | TypeSchema | undefined, item: unknown, index: number, fallbackTitle?: string): Preview {\n const v = isObj(item) ? item : {};\n const fields = (itemSchema && \"fields\" in itemSchema ? itemSchema.fields : undefined) ?? [];\n const cfg = itemSchema?.preview;\n const at = (p: string) => fieldText(fields.find((f) => f.name === p), getIn(v, p.split(\".\")));\n let title = cfg?.title ? at(cfg.title) : \"\";\n let titleField = cfg?.title;\n if (!title) {\n const t = firstText(fields, v);\n title = t?.text ?? \"\";\n titleField = t?.name;\n }\n let subtitle = cfg?.subtitle ? at(cfg.subtitle) : \"\";\n if (!subtitle && !cfg?.subtitle) subtitle = firstText(fields, v, titleField)?.text ?? \"\";\n let media = cfg?.media ? imageUrl(getIn(v, cfg.media.split(\".\"))) : undefined;\n if (!media && !cfg?.media) {\n const img = fields.find((f) => f.type === \"image\");\n if (img) media = imageUrl(v[img.name]);\n }\n const empty = !title;\n const noun = fallbackTitle ?? (itemSchema?.title ?? \"Item\");\n return {\n title: title || cfg?.fallback || `${noun} ${index + 1}`,\n subtitle: subtitle ? (subtitle.length > 90 ? `${subtitle.slice(0, 88)}…` : subtitle) : undefined,\n media,\n icon: cfg?.icon ?? (itemSchema as FieldSchema | undefined)?.icon,\n empty,\n };\n}\n\n/**\n * How one slot child reads as a row (SlotField): its block's preview (the block's title while it has no text), the\n * variant chip its `_variant` names, and the line under it (block title · settings, else description, else \"Block i of n\").\n */\nexport function slotRowOf(block: TypeSchema | undefined, item: unknown, index: number, count: number, slotSettings?: FieldSchema[]): { preview: Preview; chip?: string; extra: string } {\n const pv = previewOf(block, item, index, block?.title ?? \"Block\");\n const variant = block?.variants?.find((v) => isObj(item) && v.id === item._variant)?.name;\n const settings = slotSettings && isObj(item) ? summarize(slotSettings, item._settings, 2) : \"\";\n return {\n preview: { ...pv, title: pv.empty ? (block?.title ?? \"Unknown block\") : pv.title, icon: block?.icon ?? \"box\" },\n chip: variant,\n extra: [pv.empty ? undefined : block?.title, settings].filter(Boolean).join(\" · \") || block?.description || `Block ${index + 1} of ${count}`,\n };\n}\n\n/** \"Cast iron · 4 items\" — one-line summary of an object for collapsed rows and fieldset headers. */\nexport function summarize(fields: FieldSchema[], v: unknown, max = 2): string {\n if (!isObj(v)) return \"\";\n const parts: string[] = [];\n for (const f of fields) {\n if (parts.length >= max) break;\n const x = v[f.name];\n if (isEmptyValue(x)) continue;\n if (f.type === \"reference\" || f.type === \"json\" || f.type === \"code\" || f.type === \"image\" || f.type === \"file\") continue; // ids and blobs read badly\n if (f.type === \"table\") {\n parts.push(tableSummary(x));\n continue;\n }\n if (f.type === \"rating\" && typeof x === \"number\") {\n parts.push(`${x} / 5`);\n continue;\n }\n if (Array.isArray(x)) parts.push(`${x.length} ${x.length === 1 ? itemNounSafe(f) : `${itemNounSafe(f)}s`}`);\n else if (typeof x === \"boolean\") parts.push(`${f.title}: ${x ? \"on\" : \"off\"}`);\n else {\n const t = fieldText(f, x);\n if (t) parts.push(t.length > 40 ? `${t.slice(0, 38)}…` : t);\n }\n }\n return parts.join(\" · \");\n}\nconst itemNounSafe = (f: FieldSchema) => (f.type === \"array\" || f.type === \"slot\" ? itemNoun(f) : \"item\");\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region src/kit/lib/utils.ts
1
+ //#region src/lib/utils.ts
2
2
  var sleep = (ms) => new Promise((r) => setTimeout(r, ms));
3
3
  var uid = (p = "id") => `${p}_${Math.random().toString(36).slice(2, 9)}`;
4
4
  function formatNumber(n) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/lib/utils.ts"],"sourcesContent":["export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\nexport const uid = (p = \"id\") => `${p}_${Math.random().toString(36).slice(2, 9)}`;\nexport function formatNumber(n: number) {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(n >= 10_000_000 ? 0 : 1)}M`;\n if (n >= 1000) return `${(n / 1000).toFixed(n >= 10000 ? 0 : 1)}k`;\n return `${n}`;\n}\nexport function plural(n: number, one: string, many = `${one}s`) {\n return `${n} ${n === 1 ? one : many}`;\n}\nexport function initials(name: string) {\n return name.split(/\\s+/).map((p) => p[0]).slice(0, 2).join(\"\").toUpperCase();\n}\nexport function relTime(iso: string | number | Date) {\n const d = new Date(iso).getTime();\n const s = Math.round((Date.now() - d) / 1000);\n if (s < 45) return \"just now\";\n const m = Math.round(s / 60); if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60); if (h < 24) return `${h}h ago`;\n const days = Math.round(h / 24); if (days < 7) return `${days}d ago`;\n const w = Math.round(days / 7); if (w < 5) return `${w}w ago`;\n return new Date(iso).toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", year: \"numeric\" });\n}\nexport const slugify = (s: string) => s.toLowerCase().trim().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n"],"mappings":";AAAA,IAAa,SAAS,OAAe,IAAI,SAAS,MAAM,WAAW,GAAG,EAAE,CAAC;AACzE,IAAa,OAAO,IAAI,SAAS,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;AAC9E,SAAgB,aAAa,GAAW;CACtC,IAAI,KAAK,KAAW,OAAO,IAAI,IAAI,IAAA,CAAW,QAAQ,KAAK,MAAa,IAAI,CAAC,EAAE;CAC/E,IAAI,KAAK,KAAM,OAAO,IAAI,IAAI,IAAA,CAAM,QAAQ,KAAK,MAAQ,IAAI,CAAC,EAAE;CAChE,OAAO,GAAG;AACZ;AACA,SAAgB,OAAO,GAAW,KAAa,OAAO,GAAG,IAAI,IAAI;CAC/D,OAAO,GAAG,EAAE,GAAG,MAAM,IAAI,MAAM;AACjC;AACA,SAAgB,SAAS,MAAc;CACrC,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY;AAC7E;AACA,SAAgB,QAAQ,KAA6B;CACnD,MAAM,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,QAAQ;CAChC,MAAM,IAAI,KAAK,OAAO,KAAK,IAAI,IAAI,KAAK,GAAI;CAC5C,IAAI,IAAI,IAAI,OAAO;CACnB,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;CAAG,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE;CACtD,MAAM,IAAI,KAAK,MAAM,IAAI,EAAE;CAAG,IAAI,IAAI,IAAI,OAAO,GAAG,EAAE;CACtD,MAAM,OAAO,KAAK,MAAM,IAAI,EAAE;CAAG,IAAI,OAAO,GAAG,OAAO,GAAG,KAAK;CAC9D,MAAM,IAAI,KAAK,MAAM,OAAO,CAAC;CAAG,IAAI,IAAI,GAAG,OAAO,GAAG,EAAE;CACvD,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,mBAAmB,SAAS;EAAE,OAAO;EAAS,KAAK;EAAW,MAAM;CAAU,CAAC;AACtG;AACA,IAAa,WAAW,MAAc,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,eAAe,GAAG,CAAC,CAAC,QAAQ,UAAU,EAAE"}
@@ -4,17 +4,27 @@
4
4
  * typing for the first time — the shell decides). Warnings (recommendedMax, missing alt) never block publish.
5
5
  */
6
6
  import type { FieldPath, FieldSchema, TypeSchema } from "../schema/types";
7
+ import { type CondCtx } from "./schema";
7
8
  export interface KitIssue {
8
9
  key: string;
9
10
  path: FieldPath;
10
11
  level: "error" | "warning";
11
12
  kind: "required" | "rule";
12
13
  message: string;
14
+ /** shown at once, even while the field is being typed in (a host's live check, e.g. the schema editor's help check) */
15
+ live?: boolean;
16
+ /** one fix the shell offers after the message ("Clear help") */
17
+ fix?: {
18
+ label: string;
19
+ apply: () => void;
20
+ };
13
21
  }
14
22
  type Raw = Omit<KitIssue, "key" | "path">;
15
23
  export declare const textLength: (v: unknown) => number;
16
24
  /** Validate one value against its field (not recursing into children). */
17
25
  export declare function validateValue(f: FieldSchema, v: unknown): Raw | null;
18
26
  /** Walk fields under `obj` and collect every issue, recursing into objects, array items and slot blocks. */
19
- export declare function collectIssues(fields: FieldSchema[], obj: unknown, base: FieldPath, resolveSchema?: (t: string) => TypeSchema | undefined, out?: KitIssue[]): KitIssue[];
27
+ export declare function collectIssues(fields: FieldSchema[], obj: unknown, base: FieldPath, resolveSchema?: (t: string) => TypeSchema | undefined, out?: KitIssue[],
28
+ /** what a `_variant` condition reads above this level (V2; the root call: the value itself) */
29
+ cc?: CondCtx): KitIssue[];
20
30
  export {};