@bettercms-ai/kit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1,11 +1,14 @@
1
1
  import { cn } from "../../lib/cn.js";
2
2
  import { useKitServices } from "../../context.js";
3
3
  import { Button, IconButton } from "../../ui/button.js";
4
- import { Menu, MenuContent, MenuItem, MenuSeparator, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Tooltip } from "../../ui/overlay.js";
4
+ import { Menu, MenuContent, MenuItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Tooltip } from "../../ui/overlay.js";
5
+ import { eventKey } from "../../lib/key-event.js";
6
+ import { useCatalogComponents } from "./catalog.js";
7
+ import { ComponentPanel, closeComponentPanel, openComponentPanel, useComponentPanel } from "./component-panel.js";
5
8
  import * as React from "react";
6
- import { IconAlertTriangle, IconArrowDown, IconArrowUp, IconComponents, IconCopy, IconDots, IconLayoutNavbarCollapse, IconLayoutNavbarExpand, IconLink, IconRefresh, IconTrash, IconUnlink } from "@tabler/icons-react";
7
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- //#region src/kit/controls/rich-text/component-card.tsx
10
+ import { IconAdjustmentsHorizontal, IconAlertTriangle, IconArrowBarToDown, IconArrowBarToUp, IconArrowUpRight, IconCheck, IconComponents, IconCopy, IconDots, IconGripVertical, IconLayoutNavbarCollapse, IconLayoutNavbarExpand, IconLink, IconRefresh, IconReplace, IconRestore, IconTrash, IconUnlink } from "@tabler/icons-react";
11
+ //#region src/controls/rich-text/component-card.tsx
9
12
  /**
10
13
  * The embedded component card (V2 features/blocks/instance-card.tsx + instance-ui.tsx StateChip / MissingNote / dialogs),
11
14
  * drawn when the host can look the component up (KitServices.useComponentInfo, component-services.ts):
@@ -50,10 +53,13 @@ function useWidth(ref) {
50
53
  /** A stored value as one line of reading text, or null when it has none (lists, empty values, flags). */
51
54
  function readable(v) {
52
55
  if (typeof v === "number") return String(v);
53
- if (typeof v === "string") return v.replace(/<[^>]+>/g, " ").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").trim() || null;
56
+ if (typeof v === "string") {
57
+ if (v.startsWith("data:image/")) return "Image";
58
+ return (new DOMParser().parseFromString(v.replace(/<[^>]+>/g, " "), "text/html").body.textContent ?? "").replace(/\s+/g, " ").trim() || null;
59
+ }
54
60
  if (v && typeof v === "object" && !Array.isArray(v)) {
55
61
  const o = v;
56
- return readable(o.label ?? o.text ?? o.title ?? o.href);
62
+ return readable(o.label || o.text || o.title || o.altText || o.href || o.url || o.html);
57
63
  }
58
64
  return null;
59
65
  }
@@ -72,27 +78,54 @@ var laterThan = (a, b) => {
72
78
  return Number.isFinite(x) && Number.isFinite(y) && x > y;
73
79
  };
74
80
  var same = (a, b) => a === b || JSON.stringify(a) === JSON.stringify(b);
81
+ /**
82
+ * "Collapse preview", remembered per component (V2 instance-card): read before the first render, so a reload never
83
+ * draws the preview and then folds it away. Storage that is absent or throws reads as expanded.
84
+ */
85
+ function useCollapsed(ref) {
86
+ const key = ref ? `bcms:card-collapsed:${ref}` : null;
87
+ const [collapsed, setState] = React.useState(() => {
88
+ try {
89
+ return !!key && globalThis.localStorage?.getItem(key) === "1";
90
+ } catch {
91
+ return false;
92
+ }
93
+ });
94
+ return [collapsed, React.useCallback((next) => {
95
+ setState(next);
96
+ if (!key) return;
97
+ try {
98
+ if (next) globalThis.localStorage?.setItem(key, "1");
99
+ else globalThis.localStorage?.removeItem(key);
100
+ } catch {}
101
+ }, [key])];
102
+ }
75
103
  function ComponentCard({ m, el, ctx, use, overrides, set }) {
76
- const { copyComponent, toast, ComponentPreview } = useKitServices();
77
- const { info, loading, error } = use(m.ref ?? "");
104
+ const { copyComponent, toast, ComponentPreview, IconGlyph, componentVariantMember, ComponentSettings, openComponent, componentHref } = useKitServices();
105
+ const member = !m.detached && m.ref && m.variant ? componentVariantMember?.(m.ref, m.variant) : void 0;
106
+ const ref = member ?? m.ref;
107
+ const variant = member ? void 0 : m.variant;
108
+ const { info, loading, error } = use(ref ?? "");
78
109
  const card = React.useRef(null);
79
110
  const width = useWidth(card);
80
111
  const narrow = !!width && width <= NARROW;
81
- const [collapsed, setCollapsed] = React.useState(false);
112
+ const [collapsed, setCollapsed] = useCollapsed(m.ref);
82
113
  const [dialog, setDialog] = React.useState(null);
83
114
  const [busy, setBusy] = React.useState(false);
84
115
  const detached = !!m.detached;
85
116
  const own = React.useMemo(() => parseObj(m.props), [m.props]);
86
- const missing = !m.ref || !!info?.missing;
87
- const name = info && !info.missing ? info.name : m.name || info?.name || "Component";
117
+ const missing = !ref || !!info?.missing;
118
+ const name = info && !info.missing ? info.name : m.name || info?.name || "Block";
88
119
  const fieldKeys = new Set((info?.fields ?? []).map((f) => f.key));
89
120
  const edited = missing || detached ? 0 : Object.keys(overrides).filter((k) => fieldKeys.has(k)).length;
90
121
  const places = info?.places;
91
122
  const known = !!info || missing;
92
123
  const changed = detached && !missing && laterThan(info?.publishedAt, m.sourcePublishedAt);
93
- const label = `${name} component${known ? `, ${detached ? `Detached${changed ? ", Shared version changed" : ""}` : missing ? "Missing component" : edited ? "Edited here" : "Shared"}` : ""}${known && !missing && !detached && places != null ? `, ${placesShort(places)}` : ""}`;
94
- const rows = detached ? copyRows(own, info?.fields, m.variant) : previewRows(missing, info?.fields, overrides, m.variant);
95
- const image = missing || detached || edited || m.variant ? null : info?.image || null;
124
+ const state = detached ? `Detached${changed ? ", Shared version changed" : ""}` : missing ? "Missing block" : edited || m.variant ? "Edited here" : "Shared";
125
+ const requiredEmpty = !missing && !detached && (info?.fields ?? []).some((f) => f.required && blank(f.key in overrides ? overrides[f.key] : f.value));
126
+ const label = `${name} block${known ? `, ${state}` : ""}${known && !missing && !detached && places != null ? `, ${placesShort(places)}` : ""}${requiredEmpty ? `. ${REQUIRED_EMPTY}` : ""}`;
127
+ const rows = detached ? copyRows(own, info?.fields, m.variant) : previewRows(missing, info?.fields, overrides, variant);
128
+ const image = missing || detached || edited || variant ? null : info?.image || null;
96
129
  const liveProps = React.useMemo(() => detached ? own : {
97
130
  ...Object.fromEntries((info?.fields ?? []).flatMap((f) => f.value !== void 0 ? [[f.key, f.value]] : [])),
98
131
  ...overrides
@@ -102,9 +135,9 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
102
135
  info?.fields,
103
136
  overrides
104
137
  ]);
105
- const live = ComponentPreview && m.ref && info && !missing && !m.variant ? {
138
+ const live = ComponentPreview && ref && info && !missing && !variant ? {
106
139
  Preview: ComponentPreview,
107
- ref: m.ref
140
+ ref
108
141
  } : null;
109
142
  const preview = live ? /* @__PURE__ */ jsx(LivePreview, {
110
143
  Preview: live.Preview,
@@ -117,6 +150,27 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
117
150
  rows
118
151
  }) : null;
119
152
  const canCopy = !!copyComponent && !!m.ref && !ctx.readOnly;
153
+ const ro = !!ctx.readOnly;
154
+ const linked = !missing && !detached;
155
+ const open = useComponentPanel(el);
156
+ const editing = !!open;
157
+ const [cardEl, setCardEl] = React.useState(null);
158
+ const cardRef = React.useCallback((n) => {
159
+ card.current = n;
160
+ if (n) setCardEl(n);
161
+ }, []);
162
+ const openPanel = React.useCallback((focusKey) => openComponentPanel(el, focusKey ?? null), [el]);
163
+ const closePanel = React.useCallback(() => closeComponentPanel(el), [el]);
164
+ const focusCard = React.useCallback(() => requestAnimationFrame(() => card.current?.focus({ preventScroll: true })), []);
165
+ React.useEffect(() => () => closeComponentPanel(el), [el]);
166
+ const swappable = useCatalogComponents()?.components ?? [];
167
+ const [swapTo, setSwapTo] = React.useState(null);
168
+ const editAll = openComponent && m.ref && info && linked ? {
169
+ label: places != null && places > 1 ? `Edit for all ${places} places` : "Edit the shared block",
170
+ run: () => openComponent(m.ref)
171
+ } : void 0;
172
+ const href = m.ref ? componentHref?.(m.ref, m.id) : void 0;
173
+ const hasEdits = linked && (Object.keys(overrides).length > 0 || !!m.variant);
120
174
  /**
121
175
  * The change as ONE undo step (IslandCtx.step: the dock's toolbar Undo, this toast's Undo and ⌘Z in the body are one
122
176
  * undo), and the toast that offers it back.
@@ -154,7 +208,7 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
154
208
  ...copy.blocks !== void 0 ? { blocks: copy.blocks } : {},
155
209
  ...copy.sourcePublishedAt ? { sourcePublishedAt: copy.sourcePublishedAt } : {},
156
210
  ...cur.extra !== void 0 ? { extra: cur.extra } : {}
157
- }), "Make a separate copy", title, "It keeps its content and no longer follows the shared component.");
211
+ }), "Make a separate copy", title, "It keeps its content and no longer follows the shared block.");
158
212
  } catch (e) {
159
213
  ctx.notify("This place couldn't keep its own copy", e instanceof Error ? e.message : String(e));
160
214
  } finally {
@@ -172,24 +226,143 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
172
226
  ...mode === "keep" && Object.keys(kept).length ? { overrides: JSON.stringify(kept) } : {},
173
227
  ...mode === "keep" && cur.variant !== void 0 ? { variant: cur.variant } : {},
174
228
  ...cur.extra !== void 0 ? { extra: cur.extra } : {}
175
- }), "Use shared version again", `${name} is shared again`, mode === "keep" && n ? `${n} ${n === 1 ? "edit" : "edits"} kept here.` : "It shows the component's content.");
229
+ }), "Use shared version again", `${name} is shared again`, mode === "keep" && n ? `${n} ${n === 1 ? "edit" : "edits"} kept here.` : "It shows the block's content.");
230
+ };
231
+ /** V2 instanceOps.resetAll: this place's overrides and its layout go, as one undo step. */
232
+ const resetAll = () => commit((cur) => {
233
+ const { variant: _v, ...rest } = cur;
234
+ return {
235
+ ...rest,
236
+ overrides: "{}"
237
+ };
238
+ }, "Reset all edits here", `Back to the shared ${name}`, "This place shows the block's content again.");
239
+ /**
240
+ * V2 instanceOps.swap, once the new component's fields are known (SwapResolver): this place's edits stay only where the
241
+ * new component declares a field with that key; everything else is the new component's own content. One undo step.
242
+ */
243
+ const swap = (to, next) => {
244
+ const keys = new Set((next.fields ?? []).map((f) => f.key));
245
+ const kept = Object.fromEntries(Object.entries(detached ? own : overrides).filter(([k]) => keys.has(k)));
246
+ const n = Object.keys(kept).length;
247
+ commit((cur) => ({
248
+ id: cur.id,
249
+ ref: to.id,
250
+ name: next.name || to.name,
251
+ overrides: JSON.stringify(kept),
252
+ ...cur.extra !== void 0 ? { extra: cur.extra } : {}
253
+ }), `Swap to ${to.name}`, `Swapped to ${to.name}`, n ? `Kept ${n} ${n === 1 ? "edit" : "edits"} made here.` : "It shows the block's own content.");
254
+ };
255
+ const copyLink = () => {
256
+ if (!href) return;
257
+ navigator.clipboard?.writeText(href).catch(() => {});
258
+ toast?.success("Link copied", { description: `Opens this page scrolled to the ${name}.` });
259
+ };
260
+ /** The panel's form writes this place: overrides (or the layout) as one undo step each, through the island's model. */
261
+ const onOverrides = (next) => {
262
+ const changed = [.../* @__PURE__ */ new Set([...Object.keys(next), ...Object.keys(overrides)])].find((k) => !same(next[k], overrides[k]));
263
+ set({ overrides: JSON.stringify(next) }, changed ? `Edit ${changed}` : "Edit block properties");
264
+ };
265
+ const onVariant = (variant) => set((cur) => {
266
+ const { variant: _v, ...rest } = cur;
267
+ return variant ? {
268
+ ...rest,
269
+ variant
270
+ } : rest;
271
+ }, "Change layout");
272
+ /** V2 instance card keys, on the focused card itself (fields and the portalled panel keep their own). */
273
+ const onKeyDown = (e) => {
274
+ if (e.defaultPrevented || e.target !== card.current) return;
275
+ const mod = e.metaKey || e.ctrlKey;
276
+ const k = eventKey(e);
277
+ if (mod && k === "z") {
278
+ e.preventDefault();
279
+ e.stopPropagation();
280
+ if (e.shiftKey) ctx.redo?.();
281
+ else ctx.undo?.();
282
+ return;
283
+ }
284
+ if (e.key === "Enter" || e.key === " ") {
285
+ e.preventDefault();
286
+ openPanel();
287
+ return;
288
+ }
289
+ if (e.key === "Escape") {
290
+ e.preventDefault();
291
+ e.stopPropagation();
292
+ if (editing) closePanel();
293
+ else ctx.exit(el);
294
+ return;
295
+ }
296
+ if (ro) return;
297
+ if (mod && k === "d" && ctx.duplicate) {
298
+ e.preventDefault();
299
+ e.stopPropagation();
300
+ ctx.duplicate(el);
301
+ } else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
302
+ e.preventDefault();
303
+ ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
304
+ focusCard();
305
+ } else if (e.key === "Backspace" || e.key === "Delete") {
306
+ e.preventDefault();
307
+ ctx.remove(el);
308
+ }
176
309
  };
310
+ const chip = (compact) => detached ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DetachedChip, {
311
+ name,
312
+ compact
313
+ }), changed ? /* @__PURE__ */ jsx(ChangedChip, {
314
+ name,
315
+ compact,
316
+ onReview: canCopy ? () => setDialog("relink") : void 0
317
+ }) : null] }) : known ? /* @__PURE__ */ jsx(StateChip, {
318
+ missing,
319
+ places,
320
+ edited,
321
+ layout: !!m.variant,
322
+ requiredEmpty,
323
+ compact
324
+ }) : null;
177
325
  return /* @__PURE__ */ jsxs("div", {
178
- ref: card,
326
+ ref: cardRef,
179
327
  role: "group",
328
+ tabIndex: 0,
180
329
  "aria-label": label,
181
330
  "aria-roledescription": "component",
331
+ "aria-haspopup": "dialog",
332
+ "aria-expanded": editing,
182
333
  "aria-busy": busy || void 0,
183
334
  "data-instance-card": "",
184
335
  "data-rt-isolate": "",
185
336
  "data-state": detached ? "detached" : missing ? "missing" : known ? "linked" : void 0,
186
- className: cn("group/inst relative rounded-kit-lg border bg-kit-control-bg text-left transition-colors duration-150 motion-reduce:transition-none", missing && !detached ? "border-kit-warning-line" : "border-kit-line hover:border-kit-line-strong"),
337
+ onKeyDown,
338
+ onClick: (e) => {
339
+ if (!e.currentTarget.contains(e.target) || e.target.closest("button,a,[role=menuitem],[role=note],[role=alert]")) return;
340
+ openPanel(propKeyAt(e.currentTarget, e.clientX, e.clientY));
341
+ },
342
+ className: cn("group/inst relative cursor-pointer rounded-kit-lg border bg-kit-control-bg text-left focus-visible:outline-offset-2 transition-colors duration-150 motion-reduce:transition-none", editing ? "border-transparent shadow-[0_0_0_2px_var(--kit-accent)]" : missing && !detached ? "border-kit-warning-line" : "border-kit-line hover:border-kit-line-strong"),
187
343
  children: [
188
344
  /* @__PURE__ */ jsxs("div", {
189
345
  className: "flex h-9 select-none items-center gap-1.5 pl-1 pr-1",
190
346
  children: [
191
- /* @__PURE__ */ jsx("span", { className: "w-1" }),
192
- /* @__PURE__ */ jsx(IconComponents, {
347
+ ro || !ctx.drag ? /* @__PURE__ */ jsx("span", { className: "w-1" }) : /* @__PURE__ */ jsx(Tooltip, {
348
+ content: "Drag to move",
349
+ children: /* @__PURE__ */ jsx("button", {
350
+ type: "button",
351
+ "aria-label": `Move ${name}`,
352
+ tabIndex: -1,
353
+ onPointerDown: (e) => ctx.drag?.(el, e),
354
+ className: "flex h-7 w-4 shrink-0 cursor-grab touch-none pointer-coarse:size-11 items-center justify-center rounded-kit-sm text-kit-fg-4 opacity-0 transition-opacity duration-150 hover:text-kit-fg-2 active:cursor-grabbing motion-reduce:transition-none group-hover/inst:opacity-100 group-focus-within/inst:opacity-100 pointer-coarse:opacity-100 [&_svg]:size-3.5",
355
+ children: /* @__PURE__ */ jsx(IconGripVertical, { stroke: 1.5 })
356
+ })
357
+ }),
358
+ info?.icon && IconGlyph ? /* @__PURE__ */ jsx("span", {
359
+ "aria-hidden": true,
360
+ className: "flex size-[15px] shrink-0 text-kit-fg-2 [&_svg]:size-full",
361
+ children: /* @__PURE__ */ jsx(IconGlyph, {
362
+ name: info.icon,
363
+ className: "size-[15px]"
364
+ })
365
+ }) : /* @__PURE__ */ jsx(IconComponents, {
193
366
  size: 15,
194
367
  stroke: 1.5,
195
368
  className: "shrink-0 text-kit-fg-2",
@@ -199,33 +372,31 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
199
372
  className: "min-w-0 shrink truncate text-kit-sm font-medium text-kit-fg",
200
373
  children: name
201
374
  }),
202
- detached ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(DetachedChip, {
203
- name,
204
- compact: narrow
205
- }), changed ? /* @__PURE__ */ jsx(ChangedChip, {
206
- name,
207
- compact: narrow,
208
- onReview: canCopy ? () => setDialog("relink") : void 0
209
- }) : null] }) : known ? /* @__PURE__ */ jsx(StateChip, {
210
- missing,
211
- places,
212
- edited,
213
- compact: narrow
214
- }) : null,
375
+ chip(narrow),
215
376
  /* @__PURE__ */ jsx("span", { className: "flex-1" }),
216
- ctx.readOnly ? null : /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
377
+ /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
217
378
  size: "sm",
218
379
  className: "shrink-0",
219
380
  label: `${name} actions`,
220
381
  children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
221
382
  }) }), /* @__PURE__ */ jsxs(MenuContent, {
222
383
  align: "end",
223
- className: "w-56",
384
+ className: "w-64",
224
385
  children: [
225
- preview ? /* @__PURE__ */ jsx(MenuItem, {
226
- icon: collapsed ? /* @__PURE__ */ jsx(IconLayoutNavbarExpand, { stroke: 1.5 }) : /* @__PURE__ */ jsx(IconLayoutNavbarCollapse, { stroke: 1.5 }),
227
- onClick: () => setCollapsed(!collapsed),
228
- children: collapsed ? "Show preview" : "Collapse preview"
386
+ ComponentSettings ? /* @__PURE__ */ jsx(MenuItem, {
387
+ icon: /* @__PURE__ */ jsx(IconAdjustmentsHorizontal, { stroke: 1.5 }),
388
+ onClick: () => openPanel(),
389
+ children: "Edit properties"
390
+ }) : null,
391
+ editAll ? /* @__PURE__ */ jsx(MenuItem, {
392
+ icon: /* @__PURE__ */ jsx(IconArrowUpRight, { stroke: 1.5 }),
393
+ onClick: editAll.run,
394
+ children: editAll.label
395
+ }) : null,
396
+ !ro && hasEdits ? /* @__PURE__ */ jsx(MenuItem, {
397
+ icon: /* @__PURE__ */ jsx(IconRestore, { stroke: 1.5 }),
398
+ onClick: resetAll,
399
+ children: "Reset all edits here"
229
400
  }) : null,
230
401
  canCopy && info && !missing && !detached ? /* @__PURE__ */ jsx(MenuItem, {
231
402
  icon: /* @__PURE__ */ jsx(IconUnlink, { stroke: 1.5 }),
@@ -244,29 +415,68 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
244
415
  onClick: () => setDialog("relink"),
245
416
  children: "Use shared version again"
246
417
  }) : null,
247
- ctx.duplicate ? /* @__PURE__ */ jsx(MenuItem, {
418
+ !ro && swappable.length ? /* @__PURE__ */ jsxs(MenuSub, { children: [/* @__PURE__ */ jsx(MenuSubTrigger, {
419
+ icon: /* @__PURE__ */ jsx(IconReplace, { stroke: 1.5 }),
420
+ children: "Swap block"
421
+ }), /* @__PURE__ */ jsx(MenuSubContent, {
422
+ className: "max-h-[320px] w-60 overflow-y-auto",
423
+ children: swappable.map((c) => {
424
+ const on = c.id === m.ref;
425
+ return /* @__PURE__ */ jsx(MenuItem, {
426
+ icon: /* @__PURE__ */ jsx(IconComponents, { stroke: 1.5 }),
427
+ disabled: on || !!swapTo,
428
+ onClick: () => setSwapTo(c),
429
+ children: /* @__PURE__ */ jsxs("span", {
430
+ className: "flex w-full items-center justify-between gap-2",
431
+ children: [/* @__PURE__ */ jsx("span", {
432
+ className: "truncate",
433
+ children: c.name
434
+ }), on ? /* @__PURE__ */ jsx(IconCheck, {
435
+ className: "size-3.5 shrink-0 text-kit-fg-2",
436
+ stroke: 2,
437
+ "aria-label": "Current"
438
+ }) : null]
439
+ })
440
+ }, c.id);
441
+ })
442
+ })] }) : null,
443
+ preview ? /* @__PURE__ */ jsx(MenuItem, {
444
+ icon: collapsed ? /* @__PURE__ */ jsx(IconLayoutNavbarExpand, { stroke: 1.5 }) : /* @__PURE__ */ jsx(IconLayoutNavbarCollapse, { stroke: 1.5 }),
445
+ onClick: () => setCollapsed(!collapsed),
446
+ children: collapsed ? "Show preview" : "Collapse preview"
447
+ }) : null,
448
+ /* @__PURE__ */ jsx(MenuSeparator, {}),
449
+ !ro && ctx.duplicate ? /* @__PURE__ */ jsx(MenuItem, {
248
450
  icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
451
+ shortcut: "⌘D",
249
452
  onClick: () => ctx.duplicate?.(el),
250
453
  children: "Duplicate"
251
454
  }) : null,
252
- ctx.move ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
253
- icon: /* @__PURE__ */ jsx(IconArrowUp, { stroke: 1.5 }),
455
+ !ro && ctx.move ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
456
+ icon: /* @__PURE__ */ jsx(IconArrowBarToUp, { stroke: 1.5 }),
457
+ shortcut: "⌥↑",
254
458
  disabled: !el.previousElementSibling,
255
459
  onClick: () => ctx.move?.(el, -1),
256
460
  children: "Move up"
257
461
  }), /* @__PURE__ */ jsx(MenuItem, {
258
- icon: /* @__PURE__ */ jsx(IconArrowDown, { stroke: 1.5 }),
462
+ icon: /* @__PURE__ */ jsx(IconArrowBarToDown, { stroke: 1.5 }),
463
+ shortcut: "⌥↓",
259
464
  disabled: !el.nextElementSibling,
260
465
  onClick: () => ctx.move?.(el, 1),
261
466
  children: "Move down"
262
467
  })] }) : null,
263
- /* @__PURE__ */ jsx(MenuSeparator, {}),
264
- /* @__PURE__ */ jsx(MenuItem, {
468
+ href ? /* @__PURE__ */ jsx(MenuItem, {
469
+ icon: /* @__PURE__ */ jsx(IconLink, { stroke: 1.5 }),
470
+ onClick: copyLink,
471
+ children: "Copy link"
472
+ }) : null,
473
+ !ro ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
265
474
  danger: true,
266
475
  icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
476
+ shortcut: "⌫",
267
477
  onClick: () => ctx.remove(el),
268
478
  children: "Remove"
269
- })
479
+ })] }) : null
270
480
  ]
271
481
  })] })
272
482
  ]
@@ -336,7 +546,37 @@ function ComponentCard({ m, el, ctx, use, overrides, set }) {
336
546
  setDialog(null);
337
547
  relink(mode);
338
548
  }
339
- })] }) : null
549
+ })] }) : null,
550
+ swapTo ? /* @__PURE__ */ jsx(SwapResolver, {
551
+ use,
552
+ to: swapTo,
553
+ onReady: (next) => {
554
+ setSwapTo(null);
555
+ swap(swapTo, next);
556
+ },
557
+ onFail: (why) => {
558
+ setSwapTo(null);
559
+ ctx.notify(`Couldn't swap to ${swapTo.name}`, why);
560
+ }
561
+ }) : null,
562
+ open ? /* @__PURE__ */ jsx(ComponentPanel, {
563
+ name,
564
+ chip: chip(false),
565
+ anchor: cardEl,
566
+ open,
567
+ editAll,
568
+ onClose: closePanel,
569
+ focusBack: focusCard,
570
+ settings: {
571
+ componentId: m.ref ?? "",
572
+ overrides,
573
+ ...m.variant ? { variant: m.variant } : {},
574
+ ...detached ? { detached: { props: own } } : {},
575
+ readOnly: ro || detached || missing,
576
+ onOverrides,
577
+ onVariant
578
+ }
579
+ }) : null
340
580
  ]
341
581
  });
342
582
  }
@@ -355,11 +595,14 @@ function copyEdits(m, own, fields) {
355
595
  for (const f of fields ?? []) if (f.key in own && !same(own[f.key], f.value)) out[f.key] = own[f.key];
356
596
  return out;
357
597
  }
598
+ var REQUIRED_EMPTY = "Required field empty.";
599
+ /** Nothing an author would call filled in: no value, blank text, an empty list. */
600
+ var blank = (v) => v == null || typeof v === "string" && !v.trim() || Array.isArray(v) && v.length === 0;
358
601
  /** V2 StateChip: 13px, neutral, not a pill; the missing chip is the one tinted state. */
359
- function StateChip({ missing, places, edited, compact }) {
602
+ function StateChip({ missing, places, edited, layout, requiredEmpty, compact }) {
360
603
  const base = CHIP;
361
604
  if (missing) return /* @__PURE__ */ jsx(Tooltip, {
362
- content: "The component was deleted. Readers see nothing in this place.",
605
+ content: "The block was deleted. Readers see nothing in this place.",
363
606
  children: /* @__PURE__ */ jsxs("span", {
364
607
  className: cn(base, "bg-kit-warning-soft px-1.5 text-kit-warning-fg"),
365
608
  children: [/* @__PURE__ */ jsx(IconAlertTriangle, {
@@ -368,17 +611,23 @@ function StateChip({ missing, places, edited, compact }) {
368
611
  "aria-hidden": true
369
612
  }), compact ? /* @__PURE__ */ jsx("span", {
370
613
  className: "sr-only",
371
- children: "Missing component"
372
- }) : "Missing component"]
614
+ children: "Missing block"
615
+ }) : "Missing block"]
373
616
  })
374
617
  });
375
618
  const count = places ? placesShort(places) : null;
619
+ const tip = `Changes here apply only to this place. Edit the block to change ${places && places > 1 ? `all ${places}` : "it everywhere"}.${edited ? ` ${edited} ${edited === 1 ? "field" : "fields"} edited here.` : ""}${layout ? " Its layout is set here." : ""}${requiredEmpty ? ` ${REQUIRED_EMPTY}` : ""}`;
376
620
  return /* @__PURE__ */ jsx(Tooltip, {
377
- content: `Changes here apply only to this place. Edit the component to change ${places && places > 1 ? `all ${places}` : "it everywhere"}.${edited ? ` ${edited} ${edited === 1 ? "field" : "fields"} edited here.` : ""}`,
621
+ content: tip,
378
622
  children: /* @__PURE__ */ jsxs("span", {
379
623
  className: cn(base, "px-1 text-kit-fg-2"),
380
624
  tabIndex: -1,
381
625
  children: [
626
+ requiredEmpty ? /* @__PURE__ */ jsx("span", {
627
+ "data-required-empty": true,
628
+ className: "size-1.5 shrink-0 rounded-full bg-kit-danger-fg",
629
+ "aria-hidden": true
630
+ }) : null,
382
631
  /* @__PURE__ */ jsx(IconLink, {
383
632
  className: "size-3.5 shrink-0",
384
633
  stroke: 1.5,
@@ -392,7 +641,7 @@ function StateChip({ missing, places, edited, compact }) {
392
641
  className: "sr-only",
393
642
  children: ", shared"
394
643
  }) : null,
395
- edited ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
644
+ edited || layout ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
396
645
  className: "ml-1 size-1.5 shrink-0 rounded-full bg-kit-accent",
397
646
  "aria-hidden": true
398
647
  }), compact ? /* @__PURE__ */ jsx("span", {
@@ -453,7 +702,7 @@ function DetachDialog({ open, name, places, onClose, onConfirm }) {
453
702
  children: [
454
703
  /* @__PURE__ */ jsx(ModalHeader, {
455
704
  title: `Make a separate copy of ${name}?`,
456
- description: "This place keeps its current content and stops following the shared component."
705
+ description: "This place keeps its current content and stops following the shared block."
457
706
  }),
458
707
  others != null ? /* @__PURE__ */ jsx(ModalBody, {
459
708
  className: "pt-2 text-kit-sm text-kit-fg-2",
@@ -496,7 +745,7 @@ function RelinkDialog({ open, name, kept, onClose, onConfirm }) {
496
745
  children: [
497
746
  /* @__PURE__ */ jsx(ModalHeader, {
498
747
  title: `Use the shared ${name} again?`,
499
- description: "This place follows the shared component again."
748
+ description: "This place follows the shared block again."
500
749
  }),
501
750
  /* @__PURE__ */ jsx(ModalBody, {
502
751
  className: "pt-3",
@@ -558,6 +807,12 @@ function RelinkDialog({ open, name, kept, onClose, onConfirm }) {
558
807
  * component's own), then the layout this place draws it in. A missing component has only what this place stored: its
559
808
  * overrides, named by their keys, and its layout.
560
809
  */
810
+ /** A choice field's value as its option's label (BUG-8: a select whose values are ids listed the id); others as they are. */
811
+ function chosen(f, v) {
812
+ if (!f.options) return v;
813
+ const label = (x) => f.options.find((o) => o.value === x)?.label ?? x;
814
+ return Array.isArray(v) ? v.map(label).join(", ") : label(v);
815
+ }
561
816
  function previewRows(missing, fields, overrides, variant) {
562
817
  const out = [];
563
818
  if (missing || !fields) for (const [key, v] of Object.entries(overrides)) {
@@ -569,7 +824,7 @@ function previewRows(missing, fields, overrides, variant) {
569
824
  });
570
825
  }
571
826
  else for (const f of fields) {
572
- const text = readable(f.key in overrides ? overrides[f.key] : f.value);
827
+ const text = readable(chosen(f, f.key in overrides ? overrides[f.key] : f.value));
573
828
  if (text) out.push({
574
829
  key: f.key,
575
830
  label: f.label,
@@ -598,7 +853,7 @@ function copyRows(own, fields, variant) {
598
853
  text
599
854
  });
600
855
  };
601
- for (const f of fields ?? []) push(f.key, f.label, f.key in own ? own[f.key] : f.value);
856
+ for (const f of fields ?? []) push(f.key, f.label, chosen(f, f.key in own ? own[f.key] : f.value));
602
857
  for (const [key, v] of Object.entries(own)) if (!fields?.some((f) => f.key === key)) push(key, key, v);
603
858
  if (variant) out.push({
604
859
  key: "__variant",
@@ -607,19 +862,65 @@ function copyRows(own, fields, variant) {
607
862
  });
608
863
  return out;
609
864
  }
610
- /** The preview's frame: under the card's header, at most PREVIEW_H tall. */
611
- var PREVIEW_CHROME = "relative overflow-hidden rounded-b-kit-lg border-t border-kit-line-subtle bg-kit-subtle";
612
- function PreviewWindow({ image, rows }) {
613
- return /* @__PURE__ */ jsx("div", {
865
+ /**
866
+ * The preview's frame: under the card's header, capped at PREVIEW_H (its top border inside, as V2's CappedPreview).
867
+ * The cap lifts instantly on hover: a height animation is layout work every frame (canvas revamp V937).
868
+ */
869
+ var PREVIEW_CHROME = "group/cap relative max-h-[240px] overflow-hidden rounded-b-kit-lg border-t border-kit-line-subtle";
870
+ /**
871
+ * V2 instance-card CappedPreview: at most 240px, faded at its foot when the content is taller; hover shows its full
872
+ * height. Measured a frame after each resize, so a frame or picture that sizes itself late is read once settled.
873
+ */
874
+ function CappedPreview({ live, children }) {
875
+ const inner = React.useRef(null);
876
+ const [tall, setTall] = React.useState(false);
877
+ const [site, setSite] = React.useState(false);
878
+ React.useLayoutEffect(() => {
879
+ const el = inner.current;
880
+ if (!el) return;
881
+ let raf = 0;
882
+ const measure = () => {
883
+ cancelAnimationFrame(raf);
884
+ raf = requestAnimationFrame(() => {
885
+ setTall(el.offsetHeight > 241);
886
+ setSite(!!el.querySelector("iframe"));
887
+ });
888
+ };
889
+ measure();
890
+ const ro = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(measure);
891
+ ro?.observe(el);
892
+ const mo = typeof MutationObserver === "undefined" ? null : new MutationObserver(measure);
893
+ mo?.observe(el, {
894
+ childList: true,
895
+ subtree: true
896
+ });
897
+ return () => {
898
+ ro?.disconnect();
899
+ mo?.disconnect();
900
+ cancelAnimationFrame(raf);
901
+ };
902
+ }, []);
903
+ return /* @__PURE__ */ jsxs("div", {
614
904
  "data-instance-preview": "",
615
- className: PREVIEW_CHROME,
616
- style: { maxHeight: PREVIEW_H },
617
- children: /* @__PURE__ */ jsx(PreviewBody, {
618
- image,
619
- rows
620
- })
905
+ "data-live": live ? "" : void 0,
906
+ "data-tall": tall ? "" : void 0,
907
+ "data-site": site ? "" : void 0,
908
+ className: cn(PREVIEW_CHROME, site ? "bg-kit-site-paper" : "bg-kit-subtle", tall && "can-hover:hover:max-h-[2400px]"),
909
+ children: [/* @__PURE__ */ jsx("div", {
910
+ ref: inner,
911
+ children
912
+ }), tall ? /* @__PURE__ */ jsx("div", {
913
+ "aria-hidden": true,
914
+ className: cn("pointer-events-none absolute inset-x-0 bottom-0 h-6 bg-gradient-to-b from-transparent transition-opacity duration-150 ease-out can-hover:group-hover/cap:opacity-0 motion-reduce:transition-none", site ? "to-kit-site-paper" : "to-kit-subtle")
915
+ }) : null]
621
916
  });
622
917
  }
918
+ function PreviewWindow({ image, rows }) {
919
+ return /* @__PURE__ */ jsx(CappedPreview, { children: /* @__PURE__ */ jsx(PreviewBody, {
920
+ image,
921
+ rows
922
+ }) });
923
+ }
623
924
  /**
624
925
  * The component drawn live by the host (KitServices.ComponentPreview), mounted once the card is on screen. Its height is
625
926
  * reserved from the start (PREVIEW_H), so the card never moves while it loads; where the host cannot draw it, the values
@@ -637,44 +938,30 @@ function LivePreview({ Preview, componentId, title, props, rows }) {
637
938
  io.observe(el);
638
939
  return () => io.disconnect();
639
940
  }, [seen]);
640
- return /* @__PURE__ */ jsx("div", {
641
- ref: box,
642
- "data-instance-preview": "",
643
- "data-live": "",
644
- className: PREVIEW_CHROME,
645
- children: seen ? /* @__PURE__ */ jsx(Preview, {
646
- componentId,
647
- title,
648
- props,
649
- fallback: (reason) => /* @__PURE__ */ jsx(PreviewBody, {
650
- image: null,
651
- rows,
652
- note: reason
941
+ return /* @__PURE__ */ jsx(CappedPreview, {
942
+ live: true,
943
+ children: /* @__PURE__ */ jsx("div", {
944
+ ref: box,
945
+ children: seen ? /* @__PURE__ */ jsx(Preview, {
946
+ componentId,
947
+ title,
948
+ props,
949
+ fallback: (reason) => /* @__PURE__ */ jsx(PreviewBody, {
950
+ image: null,
951
+ rows,
952
+ note: reason
953
+ })
954
+ }) : /* @__PURE__ */ jsx("div", {
955
+ "aria-hidden": true,
956
+ style: { height: PREVIEW_H }
653
957
  })
654
- }) : /* @__PURE__ */ jsx("div", {
655
- "aria-hidden": true,
656
- style: { height: PREVIEW_H }
657
958
  })
658
959
  });
659
960
  }
660
961
  function PreviewBody({ image, rows, note }) {
661
- const inner = React.useRef(null);
662
- const [tall, setTall] = React.useState(false);
663
962
  const [loaded, setLoaded] = React.useState(!image);
664
- React.useLayoutEffect(() => {
665
- const el = inner.current;
666
- if (!el) return;
667
- const on = () => setTall(el.scrollHeight > PREVIEW_H + 1);
668
- on();
669
- if (typeof ResizeObserver === "undefined") return;
670
- const ro = new ResizeObserver(on);
671
- ro.observe(el);
672
- return () => ro.disconnect();
673
- }, []);
674
963
  return /* @__PURE__ */ jsx("div", {
675
- ref: inner,
676
- className: cn(tall && "[mask-image:linear-gradient(to_bottom,black_calc(100%-24px),transparent)]"),
677
- style: tall || !loaded ? { height: PREVIEW_H } : void 0,
964
+ style: !loaded ? { height: PREVIEW_H } : void 0,
678
965
  children: image ? /* @__PURE__ */ jsx("img", {
679
966
  src: image,
680
967
  alt: "",
@@ -688,6 +975,7 @@ function PreviewBody({ image, rows, note }) {
688
975
  }) : null, /* @__PURE__ */ jsx("dl", {
689
976
  className: "flex flex-col gap-3 px-4 py-3.5",
690
977
  children: rows.map((r) => /* @__PURE__ */ jsxs("div", {
978
+ "data-prop-key": r.key === "__variant" ? void 0 : r.key,
691
979
  className: "min-w-0",
692
980
  children: [/* @__PURE__ */ jsx("dt", {
693
981
  className: "truncate text-kit-xs text-kit-fg-3",
@@ -700,6 +988,36 @@ function PreviewBody({ image, rows, note }) {
700
988
  })] })
701
989
  });
702
990
  }
991
+ /** The listed value (`data-prop-key`) under a point of the card, else null. */
992
+ function propKeyAt(root, x, y) {
993
+ for (const row of root.querySelectorAll("[data-prop-key]")) {
994
+ const r = row.getBoundingClientRect();
995
+ if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) return row.dataset.propKey ?? null;
996
+ }
997
+ return null;
998
+ }
999
+ /**
1000
+ * Swap component: the new component's fields come from the same lookup the card reads (KitServices.useComponentInfo, a
1001
+ * hook, so it is asked from a component of its own). Answers once, when they are known.
1002
+ */
1003
+ function SwapResolver({ use, to, onReady, onFail }) {
1004
+ const { info, error } = use(to.id);
1005
+ const done = React.useRef(false);
1006
+ React.useEffect(() => {
1007
+ if (done.current) return;
1008
+ if (error) {
1009
+ done.current = true;
1010
+ onFail(error);
1011
+ } else if (info?.missing) {
1012
+ done.current = true;
1013
+ onFail("The library has no such block.");
1014
+ } else if (info) {
1015
+ done.current = true;
1016
+ onReady(info);
1017
+ }
1018
+ });
1019
+ return null;
1020
+ }
703
1021
  //#endregion
704
1022
  export { ComponentCard };
705
1023