@bettercms-ai/kit 1.0.0 → 2.0.0-next.1

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 (619) 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 +94 -31
  8. package/dist/adapters/lossy.js +419 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +91 -26
  11. package/{adapters → dist/adapters}/prod-types.js +82 -13
  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 +1038 -204
  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} +131 -2
  22. package/{context.js → dist/context.js} +44 -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/dist/controls/form-picker-register.d.ts +7 -0
  50. package/{controls → dist/controls}/form-picker-register.js +2 -6
  51. package/dist/controls/form-picker-register.js.map +1 -0
  52. package/{controls → dist/controls}/form-picker.js +11 -9
  53. package/dist/controls/form-picker.js.map +1 -0
  54. package/{controls → dist/controls}/icon-register.js +1 -1
  55. package/dist/controls/icon-register.js.map +1 -0
  56. package/{controls → dist/controls}/icon.d.ts +4 -2
  57. package/{controls → dist/controls}/icon.js +32 -27
  58. package/dist/controls/icon.js.map +1 -0
  59. package/{controls → dist/controls}/index.d.ts +1 -1
  60. package/{controls → dist/controls}/index.js +4 -3
  61. package/dist/controls/index.js.map +1 -0
  62. package/{controls → dist/controls}/json-register.js +1 -1
  63. package/dist/controls/json-register.js.map +1 -0
  64. package/{controls → dist/controls}/json.js +13 -3
  65. package/dist/controls/json.js.map +1 -0
  66. package/{controls → dist/controls}/link.js +116 -200
  67. package/dist/controls/link.js.map +1 -0
  68. package/{controls → dist/controls}/location-register.js +1 -1
  69. package/dist/controls/location-register.js.map +1 -0
  70. package/{controls → dist/controls}/location.js +59 -40
  71. package/dist/controls/location.js.map +1 -0
  72. package/{controls → dist/controls}/media-register.js +1 -1
  73. package/dist/controls/media-register.js.map +1 -0
  74. package/{controls → dist/controls}/media-services.d.ts +6 -0
  75. package/dist/controls/media-services.js +0 -0
  76. package/{controls → dist/controls}/media.d.ts +21 -4
  77. package/{controls → dist/controls}/media.js +407 -130
  78. package/dist/controls/media.js.map +1 -0
  79. package/{controls → dist/controls}/number.js +10 -9
  80. package/dist/controls/number.js.map +1 -0
  81. package/{controls → dist/controls}/reference-register.js +1 -1
  82. package/dist/controls/reference-register.js.map +1 -0
  83. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  84. package/dist/controls/reference-services.js +0 -0
  85. package/{controls → dist/controls}/reference.d.ts +1 -1
  86. package/{controls → dist/controls}/reference.js +93 -77
  87. package/dist/controls/reference.js.map +1 -0
  88. package/dist/controls/rich-text/article-shell.d.ts +145 -0
  89. package/dist/controls/rich-text/article-shell.js +510 -0
  90. package/dist/controls/rich-text/article-shell.js.map +1 -0
  91. package/dist/controls/rich-text/author.d.ts +25 -0
  92. package/dist/controls/rich-text/author.js +104 -0
  93. package/dist/controls/rich-text/author.js.map +1 -0
  94. package/dist/controls/rich-text/blocks.d.ts +60 -0
  95. package/{controls → dist/controls}/rich-text/blocks.js +164 -389
  96. package/dist/controls/rich-text/blocks.js.map +1 -0
  97. package/dist/controls/rich-text/button.d.ts +23 -0
  98. package/dist/controls/rich-text/button.js +85 -0
  99. package/dist/controls/rich-text/button.js.map +1 -0
  100. package/{controls → dist/controls}/rich-text/catalog.d.ts +7 -4
  101. package/{controls → dist/controls}/rich-text/catalog.js +94 -68
  102. package/dist/controls/rich-text/catalog.js.map +1 -0
  103. package/dist/controls/rich-text/checklist.d.ts +24 -0
  104. package/dist/controls/rich-text/checklist.js +115 -0
  105. package/dist/controls/rich-text/checklist.js.map +1 -0
  106. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  107. package/{controls → dist/controls}/rich-text/codec.js +7 -2
  108. package/dist/controls/rich-text/codec.js.map +1 -0
  109. package/dist/controls/rich-text/columns.d.ts +41 -0
  110. package/dist/controls/rich-text/columns.js +181 -0
  111. package/dist/controls/rich-text/columns.js.map +1 -0
  112. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  113. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  114. package/dist/controls/rich-text/component-card.js.map +1 -0
  115. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  116. package/dist/controls/rich-text/component-panel.js +141 -0
  117. package/dist/controls/rich-text/component-panel.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  119. package/{controls → dist/controls}/rich-text/control.js +84 -42
  120. package/dist/controls/rich-text/control.js.map +1 -0
  121. package/{controls → dist/controls}/rich-text/dom.d.ts +53 -9
  122. package/{controls → dist/controls}/rich-text/dom.js +388 -50
  123. package/dist/controls/rich-text/dom.js.map +1 -0
  124. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  125. package/{controls → dist/controls}/rich-text/editor.js +226 -44
  126. package/dist/controls/rich-text/editor.js.map +1 -0
  127. package/dist/controls/rich-text/embed.d.ts +28 -0
  128. package/dist/controls/rich-text/embed.js +210 -0
  129. package/dist/controls/rich-text/embed.js.map +1 -0
  130. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  131. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  132. package/dist/controls/rich-text/floating.js.map +1 -0
  133. package/dist/controls/rich-text/footnote.d.ts +41 -0
  134. package/dist/controls/rich-text/footnote.js +185 -0
  135. package/dist/controls/rich-text/footnote.js.map +1 -0
  136. package/dist/controls/rich-text/gallery.d.ts +28 -0
  137. package/dist/controls/rich-text/gallery.js +167 -0
  138. package/dist/controls/rich-text/gallery.js.map +1 -0
  139. package/{controls → dist/controls}/rich-text/index.js +1 -1
  140. package/dist/controls/rich-text/index.js.map +1 -0
  141. package/{controls → dist/controls}/rich-text/link-form.d.ts +3 -1
  142. package/dist/controls/rich-text/link-form.js +147 -0
  143. package/dist/controls/rich-text/link-form.js.map +1 -0
  144. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  145. package/dist/controls/rich-text/markdown.js.map +1 -0
  146. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  147. package/dist/controls/rich-text/ops.js.map +1 -0
  148. package/dist/controls/rich-text/plain.d.ts +17 -0
  149. package/dist/controls/rich-text/plain.js +44 -0
  150. package/dist/controls/rich-text/plain.js.map +1 -0
  151. package/dist/controls/rich-text/related.d.ts +36 -0
  152. package/dist/controls/rich-text/related.js +213 -0
  153. package/dist/controls/rich-text/related.js.map +1 -0
  154. package/dist/controls/rich-text/toc.d.ts +46 -0
  155. package/dist/controls/rich-text/toc.js +161 -0
  156. package/dist/controls/rich-text/toc.js.map +1 -0
  157. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  158. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  159. package/dist/controls/rich-text/toolbar.js.map +1 -0
  160. package/{controls → dist/controls}/scale.js +5 -5
  161. package/dist/controls/scale.js.map +1 -0
  162. package/dist/controls/slot-register.d.ts +6 -0
  163. package/{controls → dist/controls}/slot-register.js +2 -5
  164. package/dist/controls/slot-register.js.map +1 -0
  165. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  166. package/dist/controls/slot-services.js +155 -0
  167. package/dist/controls/slot-services.js.map +1 -0
  168. package/{controls → dist/controls}/slot.js +42 -24
  169. package/dist/controls/slot.js.map +1 -0
  170. package/{controls → dist/controls}/table/index.js +1 -1
  171. package/dist/controls/table/index.js.map +1 -0
  172. package/{controls → dist/controls}/table/prod.js +3 -3
  173. package/dist/controls/table/prod.js.map +1 -0
  174. package/{controls → dist/controls}/table/refs.js +13 -2
  175. package/dist/controls/table/refs.js.map +1 -0
  176. package/{controls → dist/controls}/table/stored.js +1 -1
  177. package/dist/controls/table/stored.js.map +1 -0
  178. package/{controls → dist/controls}/table/table-editor.js +51 -48
  179. package/dist/controls/table/table-editor.js.map +1 -0
  180. package/{controls → dist/controls}/table/table-link.js +3 -3
  181. package/dist/controls/table/table-link.js.map +1 -0
  182. package/{controls → dist/controls}/table/table.js +3 -3
  183. package/dist/controls/table/table.js.map +1 -0
  184. package/{controls → dist/controls}/text.d.ts +2 -2
  185. package/{controls → dist/controls}/text.js +78 -43
  186. package/dist/controls/text.js.map +1 -0
  187. package/dist/controls/unknown-value.d.ts +17 -0
  188. package/dist/controls/unknown-value.js +66 -0
  189. package/dist/controls/unknown-value.js.map +1 -0
  190. package/dist/core/core.d.ts +70 -0
  191. package/dist/core/core.js +187 -0
  192. package/dist/core/core.js.map +1 -0
  193. package/dist/core/facets.d.ts +355 -0
  194. package/dist/core/facets.js +342 -0
  195. package/dist/core/facets.js.map +1 -0
  196. package/dist/core/index.d.ts +3 -0
  197. package/dist/core/index.js +3 -0
  198. package/{engine → dist/engine}/array.js +34 -21
  199. package/dist/engine/array.js.map +1 -0
  200. package/{engine → dist/engine}/bits.js +1 -1
  201. package/dist/engine/bits.js.map +1 -0
  202. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  203. package/{engine → dist/engine}/breadcrumb.js +12 -36
  204. package/dist/engine/breadcrumb.js.map +1 -0
  205. package/{engine → dist/engine}/expand.d.ts +2 -4
  206. package/{engine → dist/engine}/expand.js +5 -22
  207. package/dist/engine/expand.js.map +1 -0
  208. package/{engine → dist/engine}/field-list.js +1 -1
  209. package/dist/engine/field-list.js.map +1 -0
  210. package/{engine → dist/engine}/field-shell.js +249 -121
  211. package/dist/engine/field-shell.js.map +1 -0
  212. package/{engine → dist/engine}/frame.d.ts +3 -1
  213. package/{engine → dist/engine}/frame.js +16 -14
  214. package/dist/engine/frame.js.map +1 -0
  215. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  216. package/{engine → dist/engine}/group-summary.js +7 -3
  217. package/dist/engine/group-summary.js.map +1 -0
  218. package/{engine → dist/engine}/grouping.d.ts +19 -5
  219. package/{engine → dist/engine}/grouping.js +193 -21
  220. package/dist/engine/grouping.js.map +1 -0
  221. package/{engine → dist/engine}/item-list.d.ts +11 -1
  222. package/{engine → dist/engine}/item-list.js +35 -13
  223. package/dist/engine/item-list.js.map +1 -0
  224. package/{engine → dist/engine}/kit-field.js +45 -10
  225. package/dist/engine/kit-field.js.map +1 -0
  226. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  227. package/{engine → dist/engine}/schema-form.js +182 -40
  228. package/dist/engine/schema-form.js.map +1 -0
  229. package/{engine → dist/engine}/slot.js +5 -15
  230. package/dist/engine/slot.js.map +1 -0
  231. package/dist/index.js +58 -0
  232. package/dist/index.js.map +1 -0
  233. package/{kit.css → dist/kit.css} +19 -0
  234. package/{lib → dist/lib}/cn.js +7 -4
  235. package/dist/lib/cn.js.map +1 -0
  236. package/{lib → dist/lib}/columns.js +4 -1
  237. package/dist/lib/columns.js.map +1 -0
  238. package/{lib → dist/lib}/frames.js +2 -2
  239. package/dist/lib/frames.js.map +1 -0
  240. package/dist/lib/icon-image.d.ts +10 -0
  241. package/dist/lib/icon-image.js +8 -0
  242. package/dist/lib/icon-image.js.map +1 -0
  243. package/{lib → dist/lib}/icons.js +4 -3
  244. package/dist/lib/icons.js.map +1 -0
  245. package/dist/lib/input-modality.d.ts +11 -0
  246. package/dist/lib/input-modality.js +47 -0
  247. package/dist/lib/input-modality.js.map +1 -0
  248. package/dist/lib/key-event.d.ts +11 -0
  249. package/dist/lib/key-event.js +16 -0
  250. package/dist/lib/key-event.js.map +1 -0
  251. package/{lib → dist/lib}/path.js +4 -2
  252. package/dist/lib/path.js.map +1 -0
  253. package/{lib → dist/lib}/schema.d.ts +34 -3
  254. package/{lib → dist/lib}/schema.js +110 -13
  255. package/dist/lib/schema.js.map +1 -0
  256. package/{lib → dist/lib}/utils.js +1 -1
  257. package/dist/lib/utils.js.map +1 -0
  258. package/{lib → dist/lib}/validate.d.ts +11 -1
  259. package/{lib → dist/lib}/validate.js +85 -11
  260. package/dist/lib/validate.js.map +1 -0
  261. package/dist/library/analysis.d.ts +23 -0
  262. package/dist/library/analysis.js +160 -0
  263. package/dist/library/analysis.js.map +1 -0
  264. package/dist/library/catalog.d.ts +57 -0
  265. package/dist/library/catalog.js +307 -0
  266. package/dist/library/catalog.js.map +1 -0
  267. package/dist/library/coreNotes.d.ts +8 -0
  268. package/dist/library/coreNotes.js +111 -0
  269. package/dist/library/coreNotes.js.map +1 -0
  270. package/dist/library/coverage.d.ts +40 -0
  271. package/dist/library/coverage.js +59 -0
  272. package/dist/library/coverage.js.map +1 -0
  273. package/dist/library/entries/advanced.entries.d.ts +2 -0
  274. package/dist/library/entries/advanced.entries.js +6579 -0
  275. package/dist/library/entries/advanced.entries.js.map +1 -0
  276. package/dist/library/entries/commerce.entries.d.ts +2 -0
  277. package/dist/library/entries/commerce.entries.js +4140 -0
  278. package/dist/library/entries/commerce.entries.js.map +1 -0
  279. package/dist/library/entries/company.entries.d.ts +2 -0
  280. package/dist/library/entries/company.entries.js +2731 -0
  281. package/dist/library/entries/company.entries.js.map +1 -0
  282. package/dist/library/entries/conversion.entries.d.ts +2 -0
  283. package/dist/library/entries/conversion.entries.js +3707 -0
  284. package/dist/library/entries/conversion.entries.js.map +1 -0
  285. package/dist/library/entries/data.entries.d.ts +7 -0
  286. package/dist/library/entries/data.entries.js +4613 -0
  287. package/dist/library/entries/data.entries.js.map +1 -0
  288. package/dist/library/entries/events.entries.d.ts +2 -0
  289. package/dist/library/entries/events.entries.js +3428 -0
  290. package/dist/library/entries/events.entries.js.map +1 -0
  291. package/dist/library/entries/features.entries.d.ts +2 -0
  292. package/dist/library/entries/features.entries.js +3157 -0
  293. package/dist/library/entries/features.entries.js.map +1 -0
  294. package/dist/library/entries/heroes.entries.d.ts +2 -0
  295. package/dist/library/entries/heroes.entries.js +3401 -0
  296. package/dist/library/entries/heroes.entries.js.map +1 -0
  297. package/dist/library/entries/index.d.ts +3 -0
  298. package/dist/library/entries/index.js +35 -0
  299. package/dist/library/entries/index.js.map +1 -0
  300. package/dist/library/entries/listings.entries.d.ts +2 -0
  301. package/dist/library/entries/listings.entries.js +2976 -0
  302. package/dist/library/entries/listings.entries.js.map +1 -0
  303. package/dist/library/entries/longform.entries.d.ts +2 -0
  304. package/dist/library/entries/longform.entries.js +4227 -0
  305. package/dist/library/entries/longform.entries.js.map +1 -0
  306. package/dist/library/entries/media.entries.d.ts +2 -0
  307. package/dist/library/entries/media.entries.js +2781 -0
  308. package/dist/library/entries/media.entries.js.map +1 -0
  309. package/dist/library/entries/navigation.entries.d.ts +2 -0
  310. package/dist/library/entries/navigation.entries.js +4011 -0
  311. package/dist/library/entries/navigation.entries.js.map +1 -0
  312. package/dist/library/entries/pricing.entries.d.ts +2 -0
  313. package/dist/library/entries/pricing.entries.js +2383 -0
  314. package/dist/library/entries/pricing.entries.js.map +1 -0
  315. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  316. package/dist/library/entries/social-proof.entries.js +2297 -0
  317. package/dist/library/entries/social-proof.entries.js.map +1 -0
  318. package/dist/library/examples/bento.d.ts +92 -0
  319. package/dist/library/examples/bento.js +201 -0
  320. package/dist/library/examples/bento.js.map +1 -0
  321. package/dist/library/examples/blocks.d.ts +14 -0
  322. package/dist/library/examples/blocks.js +313 -0
  323. package/dist/library/examples/blocks.js.map +1 -0
  324. package/dist/library/examples/faq.d.ts +28 -0
  325. package/dist/library/examples/faq.js +230 -0
  326. package/dist/library/examples/faq.js.map +1 -0
  327. package/dist/library/examples/hero.d.ts +43 -0
  328. package/dist/library/examples/hero.js +222 -0
  329. package/dist/library/examples/hero.js.map +1 -0
  330. package/dist/library/examples/index.d.ts +36 -0
  331. package/dist/library/examples/index.js +109 -0
  332. package/dist/library/examples/index.js.map +1 -0
  333. package/dist/library/examples/journalStory.d.ts +93 -0
  334. package/dist/library/examples/journalStory.js +338 -0
  335. package/dist/library/examples/journalStory.js.map +1 -0
  336. package/dist/library/examples/megaMenu.d.ts +134 -0
  337. package/dist/library/examples/megaMenu.js +442 -0
  338. package/dist/library/examples/megaMenu.js.map +1 -0
  339. package/dist/library/examples/pricing.d.ts +103 -0
  340. package/dist/library/examples/pricing.js +479 -0
  341. package/dist/library/examples/pricing.js.map +1 -0
  342. package/dist/library/examples/tabs.d.ts +87 -0
  343. package/dist/library/examples/tabs.js +180 -0
  344. package/dist/library/examples/tabs.js.map +1 -0
  345. package/dist/library/export.d.ts +42 -0
  346. package/dist/library/export.js +80 -0
  347. package/dist/library/export.js.map +1 -0
  348. package/dist/library/index.d.ts +13 -0
  349. package/dist/library/index.js +6 -0
  350. package/dist/library/kit-catalog.json +1511 -0
  351. package/dist/library/types.d.ts +42 -0
  352. package/dist/library/types.js +0 -0
  353. package/{schema → dist/schema}/adapters.js +1 -2
  354. package/dist/schema/adapters.js.map +1 -0
  355. package/{schema → dist/schema}/help.d.ts +2 -0
  356. package/{schema → dist/schema}/help.js +6 -4
  357. package/dist/schema/help.js.map +1 -0
  358. package/{schema → dist/schema}/scale.js +1 -1
  359. package/dist/schema/scale.js.map +1 -0
  360. package/{schema → dist/schema}/sources.js +1 -1
  361. package/dist/schema/sources.js.map +1 -0
  362. package/{schema → dist/schema}/table.js +11 -10
  363. package/dist/schema/table.js.map +1 -0
  364. package/{schema → dist/schema}/types.d.ts +36 -1
  365. package/{schema → dist/schema}/types.js +1 -1
  366. package/dist/schema/types.js.map +1 -0
  367. package/dist/styles.css +2 -0
  368. package/dist/table/table-view.d.ts +14 -0
  369. package/dist/table/table-view.js +140 -0
  370. package/dist/table/table-view.js.map +1 -0
  371. package/dist/table/table.css +73 -0
  372. package/dist/testing/corpus.d.ts +63 -0
  373. package/dist/testing/corpus.js +129 -0
  374. package/dist/testing/corpus.js.map +1 -0
  375. package/dist/testing/test-form.d.ts +11 -0
  376. package/dist/testing/test-form.js +38 -0
  377. package/dist/testing/test-form.js.map +1 -0
  378. package/dist/theme.css +345 -0
  379. package/dist/theme.d.ts +22 -0
  380. package/dist/theme.js +43 -0
  381. package/dist/theme.js.map +1 -0
  382. package/dist/tokens.css +542 -0
  383. package/dist/types.js +0 -0
  384. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  385. package/{ui → dist/ui}/action-tray.js +20 -19
  386. package/dist/ui/action-tray.js.map +1 -0
  387. package/dist/ui/autocomplete.d.ts +58 -0
  388. package/dist/ui/autocomplete.js +194 -0
  389. package/dist/ui/autocomplete.js.map +1 -0
  390. package/{ui → dist/ui}/button.d.ts +3 -3
  391. package/{ui → dist/ui}/button.js +8 -11
  392. package/dist/ui/button.js.map +1 -0
  393. package/{ui → dist/ui}/choice-switch.js +1 -1
  394. package/dist/ui/choice-switch.js.map +1 -0
  395. package/{ui → dist/ui}/controls.js +51 -39
  396. package/dist/ui/controls.js.map +1 -0
  397. package/{ui → dist/ui}/display.d.ts +10 -3
  398. package/{ui → dist/ui}/display.js +57 -46
  399. package/dist/ui/display.js.map +1 -0
  400. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  401. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  402. package/dist/ui/expanded-editor-modal.js.map +1 -0
  403. package/{ui → dist/ui}/field-context.js +1 -1
  404. package/dist/ui/field-context.js.map +1 -0
  405. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  406. package/{ui → dist/ui}/floating-panel.js +28 -12
  407. package/dist/ui/floating-panel.js.map +1 -0
  408. package/{ui → dist/ui}/index.d.ts +4 -0
  409. package/dist/ui/index.js +18 -0
  410. package/{ui → dist/ui}/input.d.ts +1 -1
  411. package/{ui → dist/ui}/input.js +9 -9
  412. package/dist/ui/input.js.map +1 -0
  413. package/{ui → dist/ui}/mode-bar.js +3 -3
  414. package/dist/ui/mode-bar.js.map +1 -0
  415. package/{ui → dist/ui}/overlay.d.ts +77 -5
  416. package/dist/ui/overlay.js +697 -0
  417. package/dist/ui/overlay.js.map +1 -0
  418. package/{ui → dist/ui}/path-crumbs.js +37 -3
  419. package/dist/ui/path-crumbs.js.map +1 -0
  420. package/{ui → dist/ui}/presence.js +2 -2
  421. package/dist/ui/presence.js.map +1 -0
  422. package/{ui → dist/ui}/select.js +89 -87
  423. package/dist/ui/select.js.map +1 -0
  424. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  425. package/dist/ui/shortcut-hint.js.map +1 -0
  426. package/dist/ui/spinner.d.ts +24 -0
  427. package/dist/ui/spinner.js +42 -0
  428. package/dist/ui/spinner.js.map +1 -0
  429. package/dist/ui/split-button.d.ts +32 -0
  430. package/dist/ui/split-button.js +60 -0
  431. package/dist/ui/split-button.js.map +1 -0
  432. package/{ui → dist/ui}/surfaces.js +1 -1
  433. package/dist/ui/surfaces.js.map +1 -0
  434. package/dist/ui/tab.d.ts +38 -0
  435. package/dist/ui/tab.js +87 -0
  436. package/dist/ui/tab.js.map +1 -0
  437. package/dist/ui/toast.d.ts +20 -0
  438. package/dist/ui/toast.js +115 -0
  439. package/dist/ui/toast.js.map +1 -0
  440. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  441. package/{ui → dist/ui}/tooltip-root.js +9 -8
  442. package/dist/ui/tooltip-root.js.map +1 -0
  443. package/{ui → dist/ui}/variants.js +1 -1
  444. package/dist/ui/variants.js.map +1 -0
  445. package/package.json +83 -23
  446. package/adapters/icons.js.map +0 -1
  447. package/adapters/lossy.js +0 -233
  448. package/adapters/lossy.js.map +0 -1
  449. package/adapters/prod-types.js.map +0 -1
  450. package/adapters/schema.js.map +0 -1
  451. package/adapters/values.js.map +0 -1
  452. package/brand/logo.js +0 -9
  453. package/brand/logo.js.map +0 -1
  454. package/context.js.map +0 -1
  455. package/controls/button.js.map +0 -1
  456. package/controls/c1.js.map +0 -1
  457. package/controls/c2.js.map +0 -1
  458. package/controls/choice.js.map +0 -1
  459. package/controls/code-register.js.map +0 -1
  460. package/controls/code.js.map +0 -1
  461. package/controls/color.js.map +0 -1
  462. package/controls/date-register.js.map +0 -1
  463. package/controls/date-zone.js.map +0 -1
  464. package/controls/date.js.map +0 -1
  465. package/controls/form-picker-register.d.ts +0 -1
  466. package/controls/form-picker-register.js.map +0 -1
  467. package/controls/form-picker.js.map +0 -1
  468. package/controls/icon-register.js.map +0 -1
  469. package/controls/icon.js.map +0 -1
  470. package/controls/index.js.map +0 -1
  471. package/controls/json-register.js.map +0 -1
  472. package/controls/json.js.map +0 -1
  473. package/controls/link.js.map +0 -1
  474. package/controls/location-register.js.map +0 -1
  475. package/controls/location.js.map +0 -1
  476. package/controls/media-register.js.map +0 -1
  477. package/controls/media.js.map +0 -1
  478. package/controls/number.js.map +0 -1
  479. package/controls/reference-register.js.map +0 -1
  480. package/controls/reference.js.map +0 -1
  481. package/controls/rich-text/blocks.d.ts +0 -28
  482. package/controls/rich-text/blocks.js.map +0 -1
  483. package/controls/rich-text/catalog.js.map +0 -1
  484. package/controls/rich-text/codec.js.map +0 -1
  485. package/controls/rich-text/component-card.js.map +0 -1
  486. package/controls/rich-text/control.js.map +0 -1
  487. package/controls/rich-text/dom.js.map +0 -1
  488. package/controls/rich-text/editor.js.map +0 -1
  489. package/controls/rich-text/floating.js.map +0 -1
  490. package/controls/rich-text/index.js.map +0 -1
  491. package/controls/rich-text/link-form.js +0 -111
  492. package/controls/rich-text/link-form.js.map +0 -1
  493. package/controls/rich-text/markdown.js.map +0 -1
  494. package/controls/rich-text/ops.js.map +0 -1
  495. package/controls/rich-text/toolbar.js.map +0 -1
  496. package/controls/scale.js.map +0 -1
  497. package/controls/slot-register.d.ts +0 -1
  498. package/controls/slot-register.js.map +0 -1
  499. package/controls/slot-services.js +0 -38
  500. package/controls/slot-services.js.map +0 -1
  501. package/controls/slot.js.map +0 -1
  502. package/controls/table/index.js.map +0 -1
  503. package/controls/table/prod.js.map +0 -1
  504. package/controls/table/refs.js.map +0 -1
  505. package/controls/table/stored.js.map +0 -1
  506. package/controls/table/table-editor.js.map +0 -1
  507. package/controls/table/table-link.js.map +0 -1
  508. package/controls/table/table.js.map +0 -1
  509. package/controls/text.js.map +0 -1
  510. package/engine/array.js.map +0 -1
  511. package/engine/bits.js.map +0 -1
  512. package/engine/breadcrumb.js.map +0 -1
  513. package/engine/expand.js.map +0 -1
  514. package/engine/field-list.js.map +0 -1
  515. package/engine/field-shell.js.map +0 -1
  516. package/engine/frame.js.map +0 -1
  517. package/engine/group-summary.js.map +0 -1
  518. package/engine/grouping.js.map +0 -1
  519. package/engine/item-list.js.map +0 -1
  520. package/engine/kit-field.js.map +0 -1
  521. package/engine/schema-form.js.map +0 -1
  522. package/engine/slot.js.map +0 -1
  523. package/index.js +0 -55
  524. package/index.js.map +0 -1
  525. package/lib/cn.js.map +0 -1
  526. package/lib/columns.js.map +0 -1
  527. package/lib/frames.js.map +0 -1
  528. package/lib/icons.js.map +0 -1
  529. package/lib/path.js.map +0 -1
  530. package/lib/schema.js.map +0 -1
  531. package/lib/utils.js.map +0 -1
  532. package/lib/validate.js.map +0 -1
  533. package/schema/adapters.js.map +0 -1
  534. package/schema/help.js.map +0 -1
  535. package/schema/scale.js.map +0 -1
  536. package/schema/sources.js.map +0 -1
  537. package/schema/table.js.map +0 -1
  538. package/schema/types.js.map +0 -1
  539. package/ui/action-tray.js.map +0 -1
  540. package/ui/button.js.map +0 -1
  541. package/ui/choice-switch.js.map +0 -1
  542. package/ui/controls.js.map +0 -1
  543. package/ui/display.js.map +0 -1
  544. package/ui/expanded-editor-modal.js.map +0 -1
  545. package/ui/field-context.js.map +0 -1
  546. package/ui/floating-panel.js.map +0 -1
  547. package/ui/index.js +0 -13
  548. package/ui/input.js.map +0 -1
  549. package/ui/mode-bar.js.map +0 -1
  550. package/ui/overlay.js +0 -378
  551. package/ui/overlay.js.map +0 -1
  552. package/ui/path-crumbs.js.map +0 -1
  553. package/ui/presence.js.map +0 -1
  554. package/ui/select.js.map +0 -1
  555. package/ui/shortcut-hint.js.map +0 -1
  556. package/ui/surfaces.js.map +0 -1
  557. package/ui/tooltip-root.js.map +0 -1
  558. package/ui/variants.js.map +0 -1
  559. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  560. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  561. /package/{brand → dist/brand}/logo.d.ts +0 -0
  562. /package/{controls → dist/controls}/c1.d.ts +0 -0
  563. /package/{controls → dist/controls}/c2.d.ts +0 -0
  564. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  565. /package/{controls → dist/controls}/code.d.ts +0 -0
  566. /package/{controls → dist/controls}/color.d.ts +0 -0
  567. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  568. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  569. /package/{controls → dist/controls}/date.d.ts +0 -0
  570. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  571. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  572. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  573. /package/{controls → dist/controls}/json.d.ts +0 -0
  574. /package/{controls → dist/controls}/link.d.ts +0 -0
  575. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  576. /package/{controls → dist/controls}/location.d.ts +0 -0
  577. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  578. /package/{controls → dist/controls}/number.d.ts +0 -0
  579. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  580. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  581. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  582. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  583. /package/{controls → dist/controls}/scale.d.ts +0 -0
  584. /package/{controls → dist/controls}/slot.d.ts +0 -0
  585. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  586. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  587. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  588. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  589. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  590. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  591. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  592. /package/{engine → dist/engine}/array.d.ts +0 -0
  593. /package/{engine → dist/engine}/bits.d.ts +0 -0
  594. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  595. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  596. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  597. /package/{engine → dist/engine}/slot.d.ts +0 -0
  598. /package/{index.d.ts → dist/index.d.ts} +0 -0
  599. /package/{lib → dist/lib}/cn.d.ts +0 -0
  600. /package/{lib → dist/lib}/columns.d.ts +0 -0
  601. /package/{lib → dist/lib}/frames.d.ts +0 -0
  602. /package/{lib → dist/lib}/icons.d.ts +0 -0
  603. /package/{lib → dist/lib}/path.d.ts +0 -0
  604. /package/{lib → dist/lib}/utils.d.ts +0 -0
  605. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  606. /package/{schema → dist/schema}/scale.d.ts +0 -0
  607. /package/{schema → dist/schema}/sources.d.ts +0 -0
  608. /package/{schema → dist/schema}/table.d.ts +0 -0
  609. /package/{types.d.ts → dist/types.d.ts} +0 -0
  610. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  611. /package/{ui → dist/ui}/controls.d.ts +0 -0
  612. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  613. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  614. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  615. /package/{ui → dist/ui}/presence.d.ts +0 -0
  616. /package/{ui → dist/ui}/select.d.ts +0 -0
  617. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  618. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  619. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1,18 +1,19 @@
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, Popover, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
4
+ import { Menu, MenuContent, MenuItem, MenuTrigger, Popover, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
5
5
  import { Input, Textarea } from "../../ui/input.js";
6
6
  import { TableEditor } from "../table/table-editor.js";
7
- import { SchemaForm } from "../../engine/schema-form.js";
7
+ import { VideoPreview } from "../media.js";
8
+ import { ArticleActions, ArticleCard, ArticleForm, ArticlePanel, articleCardKeyDown, useArticleOpen } from "./article-shell.js";
8
9
  import { CALLOUT_TONES, placeCaret } from "./dom.js";
9
- import { FloatingPanel } from "../../ui/floating-panel.js";
10
10
  import { LinkForm } from "./link-form.js";
11
+ import { EmbedBlock } from "./embed.js";
11
12
  import { ComponentCard } from "./component-card.js";
12
13
  import * as React from "react";
13
- import { IconAlertTriangle, IconAlt, IconArrowsHorizontal, IconArrowsMove, IconBulb, IconCheck, IconChevronDown, IconChevronRight, IconComponents, IconCopy, IconDimensions, IconDots, IconFileText, IconInfoCircle, IconLayoutAlignCenter, IconLayoutAlignLeft, IconLayoutAlignRight, IconLayoutSidebar, IconLayoutSidebarRight, IconLibraryPhoto, IconLink, IconPhoto, IconQuote, IconReplace, IconSettings, IconTrash, IconVideo, IconWorld, IconX } from "@tabler/icons-react";
14
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
- //#region src/kit/controls/rich-text/blocks.tsx
15
+ import { IconAlertTriangle, IconAlt, IconArrowsHorizontal, IconBulb, IconCheck, IconChevronDown, IconChevronRight, IconComponents, IconCopy, IconFileText, IconFileUpload, IconInfoCircle, IconLayoutAlignCenter, IconLayoutAlignLeft, IconLayoutAlignRight, IconLibraryPhoto, IconLink, IconPhoto, IconQuote, IconReplace, IconTrash, IconWorld } from "@tabler/icons-react";
16
+ //#region src/controls/rich-text/blocks.tsx
16
17
  /**
17
18
  * RICH TEXT · rich blocks ("islands", V2 HEAD controls/rich-text/blocks.tsx). Each renders through a portal into a
18
19
  * contenteditable=false element inside the editor surface; its model lives on that element (`el.__rt`) so serialize()
@@ -28,6 +29,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
28
29
  * block (article-blocks.tsx ArticleBlock + PullQuotePreview): drawn as the reader sees it, edited in the floating
29
30
  * properties panel (4 settings → panel, CPO D54) through the kit SchemaForm. Key takeaways are V2's article block too,
30
31
  * written in the text itself (article-blocks.tsx TakeawaysEditor, surface "inline"): a title line and a line per point.
32
+ * The embed island draws embed.tsx's block (V2's article Embed: Link, Title, Shape), keeping the keys it lacks absent.
31
33
  */
32
34
  function Island({ el, ctx }) {
33
35
  const kind = el.getAttribute("data-rt-island");
@@ -111,6 +113,12 @@ function Island({ el, ctx }) {
111
113
  autoFocus,
112
114
  m: model,
113
115
  set
116
+ }) : kind === "embed" ? /* @__PURE__ */ jsx(EmbedIsland, {
117
+ el,
118
+ ctx,
119
+ autoFocus,
120
+ m: model,
121
+ set
114
122
  }) : kind === "file" ? /* @__PURE__ */ jsx(FileBlock, {
115
123
  el,
116
124
  ctx,
@@ -126,6 +134,32 @@ function Island({ el, ctx }) {
126
134
  }) : null
127
135
  });
128
136
  }
137
+ /** The island's stored embed (keys absent when the block lacks them) through embed.tsx's block (V2's model). */
138
+ function EmbedIsland({ m, set, el, ctx, autoFocus }) {
139
+ return /* @__PURE__ */ jsx(EmbedBlock, {
140
+ m: {
141
+ url: m.url ?? "",
142
+ title: m.title ?? "",
143
+ aspect: m.aspect ?? "16:9"
144
+ },
145
+ set: (fn, label) => set((prev) => {
146
+ const next = fn({
147
+ url: prev.url ?? "",
148
+ title: prev.title ?? "",
149
+ aspect: prev.aspect ?? "16:9"
150
+ });
151
+ const out = { ...prev };
152
+ if (next.url !== (prev.url ?? "")) out.url = next.url;
153
+ if (next.title !== (prev.title ?? "")) out.title = next.title;
154
+ if (next.aspect !== (prev.aspect ?? "16:9")) out.aspect = next.aspect;
155
+ return out;
156
+ }, label),
157
+ el,
158
+ ctx,
159
+ autoFocus,
160
+ shape: ctx.allows?.("embedAspect") ?? false
161
+ });
162
+ }
129
163
  var Sep = () => /* @__PURE__ */ jsx("span", {
130
164
  "aria-hidden": true,
131
165
  className: "mx-0.5 h-4 w-px shrink-0 bg-kit-line"
@@ -172,10 +206,10 @@ function PlainEditable({ value, onChange, label, placeholder, readOnly, autoFocu
172
206
  e.preventDefault();
173
207
  onEnter?.();
174
208
  },
175
- className: cn("min-w-0 cursor-text whitespace-pre-wrap break-words outline-none empty:before:pointer-events-none empty:before:text-kit-fg-4 empty:before:content-[attr(data-placeholder)]", className)
209
+ className: cn("min-w-0 cursor-text whitespace-pre-wrap break-words outline-none focus-visible:shadow-none empty:before:pointer-events-none empty:before:text-kit-fg-4 empty:before:content-[attr(data-placeholder)]", className)
176
210
  });
177
211
  }
178
- var RemoveBtn = ({ onClick, label }) => /* @__PURE__ */ jsx(IconButton, {
212
+ var RemoveBtn = ({ onClick, label = "Remove block" }) => /* @__PURE__ */ jsx(IconButton, {
179
213
  size: "xs",
180
214
  label,
181
215
  onClick,
@@ -274,19 +308,9 @@ function ImageBlock({ m, set, el, ctx }) {
274
308
  children: MediaPicker ? "Pick one from the media library or paste a link." : "Paste a link to the image."
275
309
  })]
276
310
  }),
277
- ro ? null : /* @__PURE__ */ jsx(Tooltip, {
278
- content: "Remove image",
279
- children: /* @__PURE__ */ jsx("button", {
280
- type: "button",
281
- "aria-label": "Remove image",
282
- onClick: () => ctx.remove(el),
283
- className: "flex size-6 items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-danger-fg",
284
- children: /* @__PURE__ */ jsx(IconTrash, {
285
- className: "size-3.5",
286
- stroke: 1.5,
287
- "aria-hidden": true
288
- })
289
- })
311
+ ro ? null : /* @__PURE__ */ jsx(RemoveBtn, {
312
+ onClick: () => ctx.remove(el),
313
+ label: "Remove image"
290
314
  })
291
315
  ]
292
316
  }),
@@ -357,8 +381,7 @@ function ImageBlock({ m, set, el, ctx }) {
357
381
  ro ? null : /* @__PURE__ */ jsxs("div", {
358
382
  role: "toolbar",
359
383
  "aria-label": "Image tools",
360
- "data-kit-scope": "",
361
- className: cn("absolute left-1/2 top-2 z-[3] flex h-8 max-w-[calc(100%-16px)] -translate-x-1/2 items-center gap-0.5 overflow-x-auto rounded-kit-lg border border-kit-line bg-kit-surface px-1 opacity-0 shadow-kit-sm transition-opacity duration-150 motion-reduce:transition-none", "group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100", busy && "opacity-100"),
384
+ className: cn("glass-strong absolute left-1/2 top-2 z-[3] flex h-8 -translate-x-1/2 items-center gap-0.5 rounded-kit-lg border border-kit-line px-1 opacity-0 transition-opacity duration-150", "group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100", busy && "opacity-100"),
362
385
  children: [
363
386
  MediaPicker ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Tooltip, {
364
387
  content: "Replace image",
@@ -440,7 +463,7 @@ function ImageBlock({ m, set, el, ctx }) {
440
463
  })
441
464
  })
442
465
  }), /* @__PURE__ */ jsxs(PopoverContent, {
443
- className: "w-[340px] p-3",
466
+ className: "w-[340px] rounded-kit-lg p-3",
444
467
  finalFocus: false,
445
468
  children: [/* @__PURE__ */ jsx("p", {
446
469
  className: "mb-2 text-kit-xs font-medium text-kit-fg-2",
@@ -507,7 +530,7 @@ function ImageBlock({ m, set, el, ctx }) {
507
530
  placeholder: ro ? "" : "Add a caption…",
508
531
  onChange: (caption) => set({ caption }, "Edit caption"),
509
532
  onEnter: () => ctx.exit(el),
510
- className: "mt-1.5 text-center text-kit-sm text-kit-fg-3"
533
+ className: "mt-1.5 text-center text-kit-sm text-kit-fg-3 empty:before:text-kit-fg-4"
511
534
  }),
512
535
  pickerEl
513
536
  ]
@@ -642,7 +665,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
642
665
  })] }),
643
666
  /* @__PURE__ */ jsx("span", { className: "flex-1" }),
644
667
  ro ? null : /* @__PURE__ */ jsx("div", {
645
- className: "opacity-0 transition-opacity motion-reduce:transition-none group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
668
+ className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
646
669
  children: /* @__PURE__ */ jsx(RemoveBtn, {
647
670
  onClick: () => ctx.remove(el),
648
671
  label: "Remove callout"
@@ -673,7 +696,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
673
696
  readOnly: ro,
674
697
  placeholder: "Write a message…",
675
698
  onChange: (b) => set({ body: b }, "Edit callout message"),
676
- className: "mt-0.5 text-kit-fg-2"
699
+ className: "mt-0.5 text-kit-fg-2 [&_p+p]:mt-2"
677
700
  })
678
701
  })
679
702
  ]
@@ -698,7 +721,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
698
721
  onClick: () => setOpen((o) => !o),
699
722
  className: "mt-0.5 flex size-6 shrink-0 items-center justify-center rounded-kit-md text-kit-fg-2 hover:bg-kit-hover hover:text-kit-fg",
700
723
  children: /* @__PURE__ */ jsx(IconChevronRight, {
701
- className: cn("size-4 transition-transform duration-150 motion-reduce:transition-none", open && "rotate-90"),
724
+ className: cn("size-4 transition-transform duration-150", open && "rotate-90"),
702
725
  stroke: 1.5,
703
726
  "aria-hidden": true
704
727
  })
@@ -721,7 +744,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
721
744
  className: "flex-1 py-0.5 font-medium text-kit-fg"
722
745
  }),
723
746
  ro ? null : /* @__PURE__ */ jsx("div", {
724
- className: "opacity-0 transition-opacity motion-reduce:transition-none group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
747
+ className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
725
748
  children: /* @__PURE__ */ jsx(RemoveBtn, {
726
749
  onClick: () => ctx.remove(el),
727
750
  label: "Remove toggle"
@@ -740,19 +763,12 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
740
763
  readOnly: ro,
741
764
  placeholder: "Hidden content. Click to write…",
742
765
  onChange: (b) => set({ body: b }, "Edit toggle body"),
743
- className: "py-0.5 text-kit-fg-2"
766
+ className: "py-0.5 text-kit-fg-2 [&_p+p]:mt-2"
744
767
  })
745
768
  })]
746
769
  });
747
770
  }
748
771
  var videoUrlOk = (u) => /^https?:\/\/\S+$/i.test(u) || /^\/(?!\/)\S*$/.test(u);
749
- function videoEmbedSrc(url) {
750
- const yt = /(?:youtube\.com\/(?:watch\?(?:.*&)?v=|embed\/|shorts\/|live\/)|youtu\.be\/)([\w-]{6,})/i.exec(url);
751
- if (yt) return `https://www.youtube-nocookie.com/embed/${yt[1]}`;
752
- const vimeo = /vimeo\.com\/(?:video\/)?(\d+)/i.exec(url);
753
- if (vimeo) return `https://player.vimeo.com/video/${vimeo[1]}`;
754
- return null;
755
- }
756
772
  function VideoBlock({ m, set, el, ctx, autoFocus }) {
757
773
  const [draft, setDraft] = React.useState(m.url ?? "");
758
774
  React.useEffect(() => setDraft(m.url ?? ""), [m.url]);
@@ -766,7 +782,6 @@ function VideoBlock({ m, set, el, ctx, autoFocus }) {
766
782
  set({ url: u }, "Set video link");
767
783
  };
768
784
  const ro = ctx.readOnly;
769
- const frame = m.url ? videoEmbedSrc(m.url) : null;
770
785
  return /* @__PURE__ */ jsxs("div", {
771
786
  className: "group/blk rounded-kit-lg border border-kit-line bg-kit-subtle p-2.5",
772
787
  "data-rt-isolate": "",
@@ -804,32 +819,17 @@ function VideoBlock({ m, set, el, ctx, autoFocus }) {
804
819
  className: "mb-2 px-1 text-kit-xs text-kit-danger-fg",
805
820
  children: error
806
821
  }) : null,
807
- frame ? /* @__PURE__ */ jsx("iframe", {
808
- src: frame,
809
- title: m.title || "Video preview",
810
- loading: "lazy",
811
- tabIndex: -1,
812
- sandbox: "allow-scripts allow-same-origin allow-presentation",
813
- referrerPolicy: "strict-origin-when-cross-origin",
814
- className: "pointer-events-none aspect-video w-full rounded-kit-md border-0 bg-kit-muted"
815
- }) : m.url ? /* @__PURE__ */ jsx("video", {
816
- src: m.url,
817
- title: m.title || "Video preview",
818
- controls: true,
819
- preload: "metadata",
820
- className: "aspect-video w-full rounded-kit-md bg-kit-muted"
821
- }) : /* @__PURE__ */ jsxs("p", {
822
- className: "flex items-center gap-1.5 px-1 pb-0.5 text-kit-xs text-kit-fg-3",
823
- children: [/* @__PURE__ */ jsx(IconVideo, {
824
- className: "size-3.5",
825
- stroke: 1.5,
826
- "aria-hidden": true
827
- }), "No video yet."]
822
+ m.url ? /* @__PURE__ */ jsx(VideoPreview, {
823
+ url: m.url,
824
+ title: "Video"
825
+ }) : /* @__PURE__ */ jsx("p", {
826
+ className: "px-1 pb-0.5 text-kit-xs text-kit-fg-3",
827
+ children: "No video yet."
828
828
  })
829
829
  ]
830
830
  });
831
831
  }
832
- var formatBytes = (n) => n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
832
+ var formatBytes = (n) => n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
833
833
  function FileBlock({ m, set, el, ctx, autoFocus }) {
834
834
  const { MediaPicker } = useKitServices();
835
835
  const [picker, setPicker] = React.useState(false);
@@ -848,45 +848,47 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
848
848
  }, "Choose file")
849
849
  }) : null;
850
850
  if (has) return /* @__PURE__ */ jsxs("div", {
851
- className: "group/blk flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
851
+ className: "group/blk",
852
852
  "data-rt-isolate": "",
853
- children: [
854
- /* @__PURE__ */ jsx("span", {
855
- className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2",
856
- children: /* @__PURE__ */ jsx(IconFileText, {
857
- className: "size-[18px]",
858
- stroke: 1.5,
859
- "aria-hidden": true
860
- })
861
- }),
862
- /* @__PURE__ */ jsxs("div", {
863
- className: "min-w-0 flex-1",
864
- children: [/* @__PURE__ */ jsx("div", {
865
- className: "truncate text-kit-sm font-medium text-kit-fg",
866
- children: m.name
867
- }), /* @__PURE__ */ jsxs("div", {
868
- className: "truncate text-kit-xs text-kit-fg-3",
869
- children: [m.size ? `${formatBytes(m.size)} · ` : "", (m.name.includes(".") ? m.name.split(".").pop() : "file").toUpperCase()]
870
- })]
871
- }),
872
- ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
873
- size: "xs",
874
- variant: "ghost",
875
- onClick: () => setPicker(true),
876
- children: "Replace"
877
- }) : null, /* @__PURE__ */ jsx(RemoveBtn, {
878
- onClick: () => ctx.remove(el),
879
- label: "Remove file"
880
- })] }),
881
- pickerEl
882
- ]
853
+ children: [/* @__PURE__ */ jsxs("div", {
854
+ className: "flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
855
+ children: [
856
+ /* @__PURE__ */ jsx("span", {
857
+ className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2",
858
+ children: /* @__PURE__ */ jsx(IconFileText, {
859
+ className: "size-[18px]",
860
+ stroke: 1.5,
861
+ "aria-hidden": true
862
+ })
863
+ }),
864
+ /* @__PURE__ */ jsxs("div", {
865
+ className: "min-w-0 flex-1",
866
+ children: [/* @__PURE__ */ jsx("div", {
867
+ className: "truncate text-kit-sm font-medium text-kit-fg",
868
+ children: m.name
869
+ }), /* @__PURE__ */ jsxs("div", {
870
+ className: "truncate text-kit-xs text-kit-fg-3",
871
+ children: [m.size ? `${formatBytes(m.size)} · ` : "", (m.name.includes(".") ? m.name.split(".").pop() : "file").toUpperCase()]
872
+ })]
873
+ }),
874
+ ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
875
+ size: "xs",
876
+ variant: "ghost",
877
+ onClick: () => setPicker(true),
878
+ children: "Replace"
879
+ }) : null, /* @__PURE__ */ jsx(RemoveBtn, {
880
+ onClick: () => ctx.remove(el),
881
+ label: "Remove file"
882
+ })] })
883
+ ]
884
+ }), pickerEl]
883
885
  });
884
886
  return /* @__PURE__ */ jsxs("div", {
885
- className: "group/blk rounded-kit-lg border border-dashed border-kit-line-strong bg-kit-subtle px-3 py-2.5",
887
+ className: "group/blk",
886
888
  "data-rt-isolate": "",
887
889
  children: [
888
890
  /* @__PURE__ */ jsxs("div", {
889
- className: "flex items-center gap-3",
891
+ className: "flex items-center gap-3 rounded-kit-lg border border-dashed border-kit-line-strong bg-kit-subtle px-3 py-2.5",
890
892
  children: [
891
893
  /* @__PURE__ */ jsx("span", {
892
894
  className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg-3",
@@ -908,7 +910,7 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
908
910
  }),
909
911
  ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
910
912
  size: "sm",
911
- leftIcon: /* @__PURE__ */ jsx(IconLibraryPhoto, { stroke: 1.5 }),
913
+ leftIcon: /* @__PURE__ */ jsx(IconFileUpload, { stroke: 1.5 }),
912
914
  onClick: () => setPicker(true),
913
915
  children: "Choose file"
914
916
  }) : null, /* @__PURE__ */ jsx(RemoveBtn, {
@@ -982,10 +984,10 @@ function ComponentBlock({ m, el, ctx, set }) {
982
984
  set
983
985
  });
984
986
  const count = Object.keys(overrides).length;
985
- const name = m.name || "Component";
987
+ const name = m.name || "Block";
986
988
  return /* @__PURE__ */ jsxs("div", {
987
989
  role: "group",
988
- "aria-label": `${name}, ${m.detached ? "separate copy" : "linked component"}`,
990
+ "aria-label": `${name}, ${m.detached ? "separate copy" : "linked block"}`,
989
991
  className: "group/blk flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
990
992
  "data-rt-isolate": "",
991
993
  children: [
@@ -1004,8 +1006,8 @@ function ComponentBlock({ m, el, ctx, set }) {
1004
1006
  children: name
1005
1007
  }), /* @__PURE__ */ jsx("div", {
1006
1008
  className: "truncate text-kit-xs text-kit-fg-3",
1007
- children: m.detached ? "Separate copy · edits to the component don't reach it" : /* @__PURE__ */ jsxs(Fragment, { children: [
1008
- m.ref ? "Linked component" : "Component with no source",
1009
+ children: m.detached ? "Separate copy · edits to the block don't reach it" : /* @__PURE__ */ jsxs(Fragment, { children: [
1010
+ m.ref ? "Linked block" : "Block with no source",
1009
1011
  count ? ` · ${count} ${count === 1 ? "override" : "overrides"}` : "",
1010
1012
  " · edits to the component show here too"
1011
1013
  ] })
@@ -1027,24 +1029,28 @@ function ComponentBlock({ m, el, ctx, set }) {
1027
1029
  });
1028
1030
  }
1029
1031
  /**
1030
- * What production's rich-text table keeps: text and link cells, the header row and row headers, an optional caption,
1031
- * the note under the table and row groups (`caption`, `notes`, `rowGroups`). Footnotes have no place there.
1032
+ * What production's rich-text table keeps: typed columns (V2's Text, Number, Price, Yes / No, Link and Rating with their unit,
1033
+ * currency, decimals, alignment, yes / no words, scale and description; a row's and a cell's type and a cell's value: a
1034
+ * first-row cell's `column`, a row's / cell's `type`, a cell's `value`), the header row and row headers, an optional caption,
1035
+ * the note under the table, row groups, the totals row and the row and column highlights (`caption`, `notes`,
1036
+ * `rowGroups`, a row's `footer` / `highlight`, a first-row cell's `highlight` / `sortable`, the table's `filterable`).
1037
+ * the table's `jsonLd` and `design` (On phones, Keep column names in view)). Footnotes are stored as the table's `footnotes` and a cell's `note` (V2's default, allowFootnotes on). No setting is
1038
+ * pinned: V2's island passes no options, so its editor offers GENERAL_TABLE (sort, search and the JSON-LD choice on,
1039
+ * everything else at its default), and so does this.
1032
1040
  */
1033
1041
  var STORED_TABLE = {
1034
- columnTypes: ["text", "link"],
1035
1042
  requireCaption: false,
1036
1043
  allowGroups: true,
1037
- allowFootnotes: false,
1038
1044
  allowNote: true,
1039
1045
  settings: {
1040
- headers: true,
1041
- totals: false,
1042
- phones: [],
1043
- highlight: false,
1044
- sticky: false,
1045
- sort: false,
1046
- search: false
1047
- }
1046
+ sort: true,
1047
+ search: true
1048
+ },
1049
+ jsonLd: [
1050
+ "ItemList",
1051
+ "Dataset",
1052
+ "Offers"
1053
+ ]
1048
1054
  };
1049
1055
  function TableBlock({ m, set, el, ctx }) {
1050
1056
  return /* @__PURE__ */ jsx("div", {
@@ -1101,132 +1107,52 @@ var PULL_QUOTE_SCHEMA = {
1101
1107
  }
1102
1108
  ]
1103
1109
  };
1104
- var openArticle = null;
1105
- var articleSubs = /* @__PURE__ */ new Set();
1106
- var setOpenArticle = (next) => {
1107
- openArticle = next;
1108
- articleSubs.forEach((f) => f());
1109
- };
1110
- function useOpenArticle() {
1111
- return React.useSyncExternalStore((cb) => (articleSubs.add(cb), () => void articleSubs.delete(cb)), () => openArticle, () => openArticle);
1112
- }
1113
- var controlOf = (el) => Array.from(el.querySelectorAll("textarea, input:not([type=hidden]), [contenteditable=true], [role=combobox]")).find((n) => n.getClientRects().length) ?? Array.from(el.querySelectorAll(":scope > :not(:first-child) button")).find((n) => n.getClientRects().length);
1114
- function focusField(root, key) {
1115
- if (!root) return;
1116
- const rows = Array.from(root.querySelectorAll("[data-field-key]"));
1117
- const row = key && rows.find((r) => r.getAttribute("data-field-key") === key) || rows[0];
1118
- if (!row) return;
1119
- row.scrollIntoView({ block: "nearest" });
1120
- controlOf(row)?.focus({ preventScroll: true });
1121
- }
1122
1110
  function PullQuoteBlock({ m, set, el, ctx, autoFocus }) {
1123
1111
  const label = PULL_QUOTE_LABEL;
1124
- const uid = React.useId();
1125
1112
  const card = React.useRef(null);
1126
1113
  const [cardEl, setCardEl] = React.useState(null);
1127
- const open = useOpenArticle();
1128
- const editing = open?.id === uid;
1114
+ const ro = !!ctx.readOnly;
1115
+ const { open, editing, openPanel, close } = useArticleOpen({
1116
+ ro,
1117
+ autoFocus
1118
+ });
1129
1119
  const cardRef = React.useCallback((n) => {
1130
1120
  card.current = n;
1131
1121
  if (n) setCardEl(n);
1132
1122
  }, []);
1133
- const ro = !!ctx.readOnly;
1134
1123
  const modelRef = React.useRef(m);
1135
1124
  modelRef.current = m;
1136
- const openPanel = React.useCallback((k) => {
1137
- if (!ro) setOpenArticle({
1138
- id: uid,
1139
- focusKey: k ?? null,
1140
- nonce: (openArticle?.nonce ?? 0) + 1
1141
- });
1142
- }, [uid, ro]);
1143
- const close = React.useCallback(() => {
1144
- if (openArticle?.id === uid) setOpenArticle(null);
1145
- }, [uid]);
1146
1125
  const focusCard = React.useCallback(() => requestAnimationFrame(() => card.current?.focus({ preventScroll: true })), []);
1147
- React.useEffect(() => () => {
1148
- if (openArticle?.id === uid) setOpenArticle(null);
1149
- }, [uid]);
1150
- React.useEffect(() => {
1151
- if (autoFocus && !ro) openPanel();
1152
- }, []);
1153
1126
  /** a form edit joins the body's one undo history (D54); typing coalesces per field */
1154
1127
  const commit = (next) => {
1155
1128
  const prev = modelRef.current;
1156
1129
  const field = Object.keys(next).find((k) => next[k] !== prev[k]) ?? "";
1157
1130
  set(() => next, `Edit ${label.toLowerCase()} ${field}`);
1158
1131
  };
1159
- const onKeyDown = (e) => {
1160
- if (e.defaultPrevented || e.target !== card.current) return;
1161
- const mod = e.metaKey || e.ctrlKey;
1162
- const k = e.key.toLowerCase();
1163
- if (mod && k === "z") {
1164
- e.preventDefault();
1165
- e.stopPropagation();
1166
- if (e.shiftKey) ctx.redo?.();
1167
- else ctx.undo?.();
1168
- return;
1169
- }
1170
- if (e.key === "Enter" || e.key === " ") {
1171
- e.preventDefault();
1172
- openPanel();
1173
- return;
1174
- }
1175
- if (e.key === "Escape") {
1176
- e.preventDefault();
1177
- e.stopPropagation();
1178
- if (editing) close();
1179
- else ctx.exit(el);
1180
- return;
1181
- }
1182
- if (ro) return;
1183
- if (mod && k === "d" && ctx.duplicate) {
1184
- e.preventDefault();
1185
- e.stopPropagation();
1186
- ctx.duplicate(el);
1187
- } else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
1188
- e.preventDefault();
1189
- ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
1190
- focusCard();
1191
- } else if (e.key === "Backspace" || e.key === "Delete") {
1192
- e.preventDefault();
1193
- ctx.remove(el);
1194
- }
1195
- };
1196
- const actions = ro ? null : /* @__PURE__ */ jsxs("div", {
1197
- className: cn("absolute -top-3.5 right-2 z-[2] flex items-center gap-0.5 rounded-kit-md border border-kit-line bg-kit-surface-raised p-0.5 opacity-0 shadow-kit-sm transition-opacity", "group-hover/art:opacity-100 group-focus-within/art:opacity-100 pointer-coarse:opacity-100", editing && "opacity-100"),
1198
- children: [/* @__PURE__ */ jsx(IconButton, {
1199
- size: "xs",
1200
- label: `Edit ${label.toLowerCase()}`,
1201
- onClick: () => editing ? close() : openPanel(),
1202
- children: /* @__PURE__ */ jsx(IconSettings, { stroke: 1.5 })
1203
- }), /* @__PURE__ */ jsx(IconButton, {
1204
- size: "xs",
1205
- label: `Remove ${label.toLowerCase()}`,
1206
- onClick: () => ctx.remove(el),
1207
- className: "hover:text-kit-danger-fg",
1208
- children: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 })
1209
- })]
1210
- });
1211
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1132
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(ArticleCard, {
1212
1133
  ref: cardRef,
1213
- role: "group",
1214
- tabIndex: 0,
1215
- "aria-label": `${label}${editing ? ", editing" : ""}`,
1216
- "aria-roledescription": "block",
1217
- "aria-haspopup": "dialog",
1218
- "aria-expanded": editing,
1219
- "data-rt-isolate": "",
1220
- "data-article-block": "pullquote",
1221
- onKeyDown,
1222
- onClick: (e) => {
1223
- if (ro || !e.currentTarget.contains(e.target)) return;
1224
- const t = e.target;
1225
- if (t.closest("button,a,[role=menuitem]")) return;
1226
- openPanel(t.closest("[data-field]")?.getAttribute("data-field") ?? null);
1227
- },
1228
- className: cn("group/art relative rounded-kit-lg outline-none transition-shadow duration-150", !ro && "cursor-pointer", "focus-visible:shadow-[0_0_0_1px_var(--kit-line-strong)]", editing ? "shadow-[0_0_0_2px_var(--kit-accent)] focus-visible:shadow-[0_0_0_2px_var(--kit-accent)]" : !ro && "hover:shadow-[0_0_0_1px_var(--kit-line)]"),
1229
- children: [/* @__PURE__ */ jsx(PullQuotePreview, { m }), actions]
1134
+ label,
1135
+ kind: "pullquote",
1136
+ ro,
1137
+ editing,
1138
+ onOpen: openPanel,
1139
+ onKeyDown: articleCardKeyDown({
1140
+ card,
1141
+ ctx,
1142
+ el,
1143
+ ro,
1144
+ editing,
1145
+ onOpen: openPanel,
1146
+ onClose: close,
1147
+ focusCard
1148
+ }),
1149
+ children: [/* @__PURE__ */ jsx(PullQuotePreview, { m }), /* @__PURE__ */ jsx(ArticleActions, {
1150
+ label,
1151
+ ctx,
1152
+ el,
1153
+ editing,
1154
+ onEdit: () => editing ? close() : openPanel()
1155
+ })]
1230
1156
  }), editing ? /* @__PURE__ */ jsx(ArticlePanel, {
1231
1157
  label,
1232
1158
  anchor: cardEl,
@@ -1236,22 +1162,12 @@ function PullQuoteBlock({ m, set, el, ctx, autoFocus }) {
1236
1162
  focusBack: focusCard,
1237
1163
  ctx,
1238
1164
  el,
1239
- children: /* @__PURE__ */ jsxs("div", {
1240
- "data-article-form": "",
1241
- className: "min-w-0",
1242
- children: [/* @__PURE__ */ jsx(SchemaForm, {
1243
- schema: PULL_QUOTE_SCHEMA,
1244
- value: m,
1245
- onChange: (v) => commit(v),
1246
- variant: "panel",
1247
- scroll: false,
1248
- readOnly: ro,
1249
- rootLabel: label,
1250
- env: {
1251
- docId: `article:${PULL_QUOTE_SCHEMA.name}`,
1252
- docTitle: label
1253
- }
1254
- }), /* @__PURE__ */ jsx("style", { children: `[data-article-form] [data-kit-form] section:first-of-type { border-top-width: 0; margin-top: 0; padding-top: 0; }` })]
1165
+ children: /* @__PURE__ */ jsx(ArticleForm, {
1166
+ schema: PULL_QUOTE_SCHEMA,
1167
+ label,
1168
+ value: m,
1169
+ onChange: (v) => commit(v),
1170
+ ro
1255
1171
  })
1256
1172
  }) : null] });
1257
1173
  }
@@ -1274,47 +1190,19 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
1274
1190
  });
1275
1191
  const setPoint = (i, v) => set({ points: m.points.map((p, j) => j === i ? v : p) }, `Edit key takeaways point ${i + 1}`);
1276
1192
  /** V2 ArticleBlock onKeyDown, on the block itself (its lines handle their own keys) */
1277
- const onKeyDown = (e) => {
1278
- if (e.defaultPrevented || e.target !== card.current) return;
1279
- const mod = e.metaKey || e.ctrlKey;
1280
- const k = e.key.toLowerCase();
1281
- if (mod && k === "z") {
1282
- e.preventDefault();
1283
- e.stopPropagation();
1284
- if (e.shiftKey) ctx.redo?.();
1285
- else ctx.undo?.();
1286
- return;
1287
- }
1288
- if (e.key === "Escape") {
1289
- e.preventDefault();
1290
- e.stopPropagation();
1291
- ctx.exit(el);
1292
- return;
1293
- }
1294
- if (ro) return;
1295
- if (mod && k === "d" && ctx.duplicate) {
1296
- e.preventDefault();
1297
- e.stopPropagation();
1298
- ctx.duplicate(el);
1299
- } else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
1300
- e.preventDefault();
1301
- ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
1302
- focusCard();
1303
- } else if (e.key === "Backspace" || e.key === "Delete") {
1304
- e.preventDefault();
1305
- ctx.remove(el);
1306
- }
1307
- };
1308
- return /* @__PURE__ */ jsxs("div", {
1193
+ const onKeyDown = articleCardKeyDown({
1194
+ card,
1195
+ ctx,
1196
+ el,
1197
+ ro,
1198
+ focusCard
1199
+ });
1200
+ return /* @__PURE__ */ jsxs(ArticleCard, {
1309
1201
  ref: card,
1310
- role: "group",
1311
- tabIndex: 0,
1312
- "aria-label": label,
1313
- "aria-roledescription": "block",
1314
- "data-rt-isolate": "",
1315
- "data-article-block": "takeaways",
1202
+ label,
1203
+ kind: "takeaways",
1204
+ ro,
1316
1205
  onKeyDown,
1317
- className: "group/art relative rounded-kit-lg outline-none transition-shadow duration-150 focus-visible:shadow-[0_0_0_1px_var(--kit-line-strong)]",
1318
1206
  children: [/* @__PURE__ */ jsxs("aside", {
1319
1207
  className: "rounded-kit-lg border border-kit-line bg-kit-subtle px-4 py-3",
1320
1208
  "aria-label": m.title || label,
@@ -1370,126 +1258,13 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
1370
1258
  })]
1371
1259
  }, i))
1372
1260
  })]
1373
- }), ro ? null : /* @__PURE__ */ jsx("div", {
1374
- className: cn("absolute -top-3.5 right-2 z-[2] flex items-center gap-0.5 rounded-kit-md border border-kit-line bg-kit-surface-raised p-0.5 opacity-0 shadow-kit-sm transition-opacity", "group-hover/art:opacity-100 group-focus-within/art:opacity-100 pointer-coarse:opacity-100"),
1375
- children: /* @__PURE__ */ jsx(IconButton, {
1376
- size: "xs",
1377
- label: `Remove ${label.toLowerCase()}`,
1378
- onClick: () => ctx.remove(el),
1379
- className: "hover:text-kit-danger-fg",
1380
- children: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 })
1381
- })
1261
+ }), /* @__PURE__ */ jsx(ArticleActions, {
1262
+ label,
1263
+ ctx,
1264
+ el
1382
1265
  })]
1383
1266
  });
1384
1267
  }
1385
- function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx, el, children }) {
1386
- const panel = React.useRef(null);
1387
- const titleId = React.useId();
1388
- const container = anchor?.closest("[data-expanded-editor]") ?? null;
1389
- React.useEffect(() => {
1390
- const timers = [];
1391
- let landed = false;
1392
- for (const ms of [
1393
- 40,
1394
- 90,
1395
- 160,
1396
- 260,
1397
- 420,
1398
- 640
1399
- ]) timers.push(window.setTimeout(() => {
1400
- const root = panel.current?.el() ?? null;
1401
- if (!root?.querySelector("[data-field-key]")) return;
1402
- const a = document.activeElement;
1403
- const lost = !a || a === document.body || a.hasAttribute("data-expanded-editor") || a.hasAttribute("data-article-block");
1404
- if (root.contains(a)) return void (landed = true);
1405
- if (!landed || lost) focusField(root, focusKey);
1406
- if (root.contains(document.activeElement)) landed = true;
1407
- }, ms));
1408
- return () => timers.forEach((t) => window.clearTimeout(t));
1409
- }, [nonce]);
1410
- React.useEffect(() => panel.current?.announce(`${label} properties.`), [label]);
1411
- return /* @__PURE__ */ jsx(FloatingPanel, {
1412
- ref: panel,
1413
- id: "article-properties",
1414
- labelledBy: titleId,
1415
- anchor,
1416
- container,
1417
- header: /* @__PURE__ */ jsxs(Fragment, { children: [
1418
- /* @__PURE__ */ jsx("span", {
1419
- id: titleId,
1420
- className: "min-w-0 flex-1 truncate text-kit-sm font-medium text-kit-fg",
1421
- children: label
1422
- }),
1423
- /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
1424
- size: "sm",
1425
- label: `${label} actions`,
1426
- children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
1427
- }) }), /* @__PURE__ */ jsxs(MenuContent, {
1428
- align: "end",
1429
- className: "w-52",
1430
- children: [
1431
- ctx.readOnly || !ctx.duplicate ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
1432
- icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
1433
- onClick: () => ctx.duplicate?.(el),
1434
- children: "Duplicate"
1435
- }), /* @__PURE__ */ jsx(MenuSeparator, {})] }),
1436
- /* @__PURE__ */ jsx(MenuItem, {
1437
- icon: /* @__PURE__ */ jsx(IconArrowsMove, { stroke: 1.5 }),
1438
- onClick: () => panel.current?.keyboard("move"),
1439
- children: "Move panel"
1440
- }),
1441
- /* @__PURE__ */ jsx(MenuItem, {
1442
- icon: /* @__PURE__ */ jsx(IconDimensions, { stroke: 1.5 }),
1443
- onClick: () => panel.current?.keyboard("resize"),
1444
- children: "Resize panel"
1445
- }),
1446
- /* @__PURE__ */ jsx(MenuItem, {
1447
- icon: /* @__PURE__ */ jsx(IconLayoutSidebar, { stroke: 1.5 }),
1448
- onClick: () => panel.current?.dock("left"),
1449
- children: "Dock left"
1450
- }),
1451
- /* @__PURE__ */ jsx(MenuItem, {
1452
- icon: /* @__PURE__ */ jsx(IconLayoutSidebarRight, { stroke: 1.5 }),
1453
- onClick: () => panel.current?.dock("right"),
1454
- children: "Dock right"
1455
- }),
1456
- ctx.readOnly ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
1457
- danger: true,
1458
- icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
1459
- onClick: () => ctx.remove(el),
1460
- children: "Remove"
1461
- })] })
1462
- ]
1463
- })] }),
1464
- /* @__PURE__ */ jsx(IconButton, {
1465
- size: "sm",
1466
- label: "Close properties",
1467
- tooltip: "Close",
1468
- onClick: () => (onClose(), focusBack()),
1469
- children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
1470
- })
1471
- ] }),
1472
- onClose,
1473
- focusBack,
1474
- onPanelKeyDown: (e) => {
1475
- if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === "z" && !e.defaultPrevented) {
1476
- e.preventDefault();
1477
- if (e.shiftKey) ctx.redo?.();
1478
- else ctx.undo?.();
1479
- }
1480
- },
1481
- sheetFooter: /* @__PURE__ */ jsx(Button, {
1482
- size: "sm",
1483
- variant: "primary",
1484
- onClick: () => (onClose(), focusBack()),
1485
- children: "Done"
1486
- }),
1487
- children: /* @__PURE__ */ jsx("div", {
1488
- className: "pb-3 pt-1",
1489
- children
1490
- })
1491
- });
1492
- }
1493
1268
  function PullQuotePreview({ m }) {
1494
1269
  return /* @__PURE__ */ jsxs("figure", {
1495
1270
  className: "m-0 py-2 pl-5 pr-10",