@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,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, MenuSeparator, MenuTrigger, Popover, PopoverAnchor, 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
7
  import { SchemaForm } from "../../engine/schema-form.js";
8
- import { CALLOUT_TONES, placeCaret } from "./dom.js";
8
+ import { eventKey } from "../../lib/key-event.js";
9
9
  import { FloatingPanel } from "../../ui/floating-panel.js";
10
+ import { CALLOUT_TONES, detectEmbed, placeCaret } from "./dom.js";
10
11
  import { LinkForm } from "./link-form.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, IconArrowsMove, IconBrandCodepen, IconBrandFigma, IconBrandSpotify, IconBrandVimeo, IconBrandX, IconBrandYoutube, IconBulb, IconCheck, IconChevronDown, IconChevronRight, IconComponents, IconCopy, IconDimensions, IconDots, IconFileText, IconFileUpload, IconHeadphones, IconInfoCircle, IconLayoutAlignCenter, IconLayoutAlignLeft, IconLayoutAlignRight, IconLayoutSidebar, IconLayoutSidebarRight, IconLibraryPhoto, IconLink, IconMap, IconMicrophone, IconPhoto, IconPlayerPlayFilled, IconQuote, IconReplace, IconSettings, IconTrash, IconWorld, IconX } 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,8 @@ 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 is V2's article block too (ArticleBlock surface "popover" + EmbedPreview): a placeholder card of the link's
33
+ * provider, edited in a popover beside it (Link, Title; V2's Shape has no stored key, see dom.ts).
31
34
  */
32
35
  function Island({ el, ctx }) {
33
36
  const kind = el.getAttribute("data-rt-island");
@@ -111,6 +114,12 @@ function Island({ el, ctx }) {
111
114
  autoFocus,
112
115
  m: model,
113
116
  set
117
+ }) : kind === "embed" ? /* @__PURE__ */ jsx(EmbedBlock, {
118
+ el,
119
+ ctx,
120
+ autoFocus,
121
+ m: model,
122
+ set
114
123
  }) : kind === "file" ? /* @__PURE__ */ jsx(FileBlock, {
115
124
  el,
116
125
  ctx,
@@ -172,10 +181,10 @@ function PlainEditable({ value, onChange, label, placeholder, readOnly, autoFocu
172
181
  e.preventDefault();
173
182
  onEnter?.();
174
183
  },
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)
184
+ 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
185
  });
177
186
  }
178
- var RemoveBtn = ({ onClick, label }) => /* @__PURE__ */ jsx(IconButton, {
187
+ var RemoveBtn = ({ onClick, label = "Remove block" }) => /* @__PURE__ */ jsx(IconButton, {
179
188
  size: "xs",
180
189
  label,
181
190
  onClick,
@@ -274,19 +283,9 @@ function ImageBlock({ m, set, el, ctx }) {
274
283
  children: MediaPicker ? "Pick one from the media library or paste a link." : "Paste a link to the image."
275
284
  })]
276
285
  }),
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
- })
286
+ ro ? null : /* @__PURE__ */ jsx(RemoveBtn, {
287
+ onClick: () => ctx.remove(el),
288
+ label: "Remove image"
290
289
  })
291
290
  ]
292
291
  }),
@@ -357,8 +356,7 @@ function ImageBlock({ m, set, el, ctx }) {
357
356
  ro ? null : /* @__PURE__ */ jsxs("div", {
358
357
  role: "toolbar",
359
358
  "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"),
359
+ 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
360
  children: [
363
361
  MediaPicker ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Tooltip, {
364
362
  content: "Replace image",
@@ -440,7 +438,7 @@ function ImageBlock({ m, set, el, ctx }) {
440
438
  })
441
439
  })
442
440
  }), /* @__PURE__ */ jsxs(PopoverContent, {
443
- className: "w-[340px] p-3",
441
+ className: "w-[340px] rounded-kit-lg p-3",
444
442
  finalFocus: false,
445
443
  children: [/* @__PURE__ */ jsx("p", {
446
444
  className: "mb-2 text-kit-xs font-medium text-kit-fg-2",
@@ -507,7 +505,7 @@ function ImageBlock({ m, set, el, ctx }) {
507
505
  placeholder: ro ? "" : "Add a caption…",
508
506
  onChange: (caption) => set({ caption }, "Edit caption"),
509
507
  onEnter: () => ctx.exit(el),
510
- className: "mt-1.5 text-center text-kit-sm text-kit-fg-3"
508
+ className: "mt-1.5 text-center text-kit-sm text-kit-fg-3 empty:before:text-kit-fg-4"
511
509
  }),
512
510
  pickerEl
513
511
  ]
@@ -642,7 +640,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
642
640
  })] }),
643
641
  /* @__PURE__ */ jsx("span", { className: "flex-1" }),
644
642
  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",
643
+ className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
646
644
  children: /* @__PURE__ */ jsx(RemoveBtn, {
647
645
  onClick: () => ctx.remove(el),
648
646
  label: "Remove callout"
@@ -673,7 +671,7 @@ function CalloutBlock({ m, set, el, ctx, autoFocus }) {
673
671
  readOnly: ro,
674
672
  placeholder: "Write a message…",
675
673
  onChange: (b) => set({ body: b }, "Edit callout message"),
676
- className: "mt-0.5 text-kit-fg-2"
674
+ className: "mt-0.5 text-kit-fg-2 [&_p+p]:mt-2"
677
675
  })
678
676
  })
679
677
  ]
@@ -698,7 +696,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
698
696
  onClick: () => setOpen((o) => !o),
699
697
  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
698
  children: /* @__PURE__ */ jsx(IconChevronRight, {
701
- className: cn("size-4 transition-transform duration-150 motion-reduce:transition-none", open && "rotate-90"),
699
+ className: cn("size-4 transition-transform duration-150", open && "rotate-90"),
702
700
  stroke: 1.5,
703
701
  "aria-hidden": true
704
702
  })
@@ -721,7 +719,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
721
719
  className: "flex-1 py-0.5 font-medium text-kit-fg"
722
720
  }),
723
721
  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",
722
+ className: "opacity-0 transition-opacity group-hover/blk:opacity-100 group-focus-within/blk:opacity-100 pointer-coarse:opacity-100",
725
723
  children: /* @__PURE__ */ jsx(RemoveBtn, {
726
724
  onClick: () => ctx.remove(el),
727
725
  label: "Remove toggle"
@@ -740,7 +738,7 @@ function ToggleBlock({ m, set, el, ctx, autoFocus }) {
740
738
  readOnly: ro,
741
739
  placeholder: "Hidden content. Click to write…",
742
740
  onChange: (b) => set({ body: b }, "Edit toggle body"),
743
- className: "py-0.5 text-kit-fg-2"
741
+ className: "py-0.5 text-kit-fg-2 [&_p+p]:mt-2"
744
742
  })
745
743
  })]
746
744
  });
@@ -818,18 +816,14 @@ function VideoBlock({ m, set, el, ctx, autoFocus }) {
818
816
  controls: true,
819
817
  preload: "metadata",
820
818
  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."]
819
+ }) : /* @__PURE__ */ jsx("p", {
820
+ className: "px-1 pb-0.5 text-kit-xs text-kit-fg-3",
821
+ children: "No video yet."
828
822
  })
829
823
  ]
830
824
  });
831
825
  }
832
- var formatBytes = (n) => n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
826
+ var formatBytes = (n) => n < 1024 ? `${n} B` : n < 1048576 ? `${(n / 1024).toFixed(0)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;
833
827
  function FileBlock({ m, set, el, ctx, autoFocus }) {
834
828
  const { MediaPicker } = useKitServices();
835
829
  const [picker, setPicker] = React.useState(false);
@@ -848,45 +842,47 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
848
842
  }, "Choose file")
849
843
  }) : null;
850
844
  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",
845
+ className: "group/blk",
852
846
  "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
- ]
847
+ children: [/* @__PURE__ */ jsxs("div", {
848
+ className: "flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
849
+ children: [
850
+ /* @__PURE__ */ jsx("span", {
851
+ className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2",
852
+ children: /* @__PURE__ */ jsx(IconFileText, {
853
+ className: "size-[18px]",
854
+ stroke: 1.5,
855
+ "aria-hidden": true
856
+ })
857
+ }),
858
+ /* @__PURE__ */ jsxs("div", {
859
+ className: "min-w-0 flex-1",
860
+ children: [/* @__PURE__ */ jsx("div", {
861
+ className: "truncate text-kit-sm font-medium text-kit-fg",
862
+ children: m.name
863
+ }), /* @__PURE__ */ jsxs("div", {
864
+ className: "truncate text-kit-xs text-kit-fg-3",
865
+ children: [m.size ? `${formatBytes(m.size)} · ` : "", (m.name.includes(".") ? m.name.split(".").pop() : "file").toUpperCase()]
866
+ })]
867
+ }),
868
+ ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
869
+ size: "xs",
870
+ variant: "ghost",
871
+ onClick: () => setPicker(true),
872
+ children: "Replace"
873
+ }) : null, /* @__PURE__ */ jsx(RemoveBtn, {
874
+ onClick: () => ctx.remove(el),
875
+ label: "Remove file"
876
+ })] })
877
+ ]
878
+ }), pickerEl]
883
879
  });
884
880
  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",
881
+ className: "group/blk",
886
882
  "data-rt-isolate": "",
887
883
  children: [
888
884
  /* @__PURE__ */ jsxs("div", {
889
- className: "flex items-center gap-3",
885
+ 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
886
  children: [
891
887
  /* @__PURE__ */ jsx("span", {
892
888
  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 +904,7 @@ function FileBlock({ m, set, el, ctx, autoFocus }) {
908
904
  }),
909
905
  ro ? null : /* @__PURE__ */ jsxs(Fragment, { children: [MediaPicker ? /* @__PURE__ */ jsx(Button, {
910
906
  size: "sm",
911
- leftIcon: /* @__PURE__ */ jsx(IconLibraryPhoto, { stroke: 1.5 }),
907
+ leftIcon: /* @__PURE__ */ jsx(IconFileUpload, { stroke: 1.5 }),
912
908
  onClick: () => setPicker(true),
913
909
  children: "Choose file"
914
910
  }) : null, /* @__PURE__ */ jsx(RemoveBtn, {
@@ -982,10 +978,10 @@ function ComponentBlock({ m, el, ctx, set }) {
982
978
  set
983
979
  });
984
980
  const count = Object.keys(overrides).length;
985
- const name = m.name || "Component";
981
+ const name = m.name || "Block";
986
982
  return /* @__PURE__ */ jsxs("div", {
987
983
  role: "group",
988
- "aria-label": `${name}, ${m.detached ? "separate copy" : "linked component"}`,
984
+ "aria-label": `${name}, ${m.detached ? "separate copy" : "linked block"}`,
989
985
  className: "group/blk flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
990
986
  "data-rt-isolate": "",
991
987
  children: [
@@ -1004,8 +1000,8 @@ function ComponentBlock({ m, el, ctx, set }) {
1004
1000
  children: name
1005
1001
  }), /* @__PURE__ */ jsx("div", {
1006
1002
  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",
1003
+ children: m.detached ? "Separate copy · edits to the block don't reach it" : /* @__PURE__ */ jsxs(Fragment, { children: [
1004
+ m.ref ? "Linked block" : "Block with no source",
1009
1005
  count ? ` · ${count} ${count === 1 ? "override" : "overrides"}` : "",
1010
1006
  " · edits to the component show here too"
1011
1007
  ] })
@@ -1027,24 +1023,28 @@ function ComponentBlock({ m, el, ctx, set }) {
1027
1023
  });
1028
1024
  }
1029
1025
  /**
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.
1026
+ * What production's rich-text table keeps: typed columns (V2's Text, Number, Price, Yes / No, Link and Rating with their unit,
1027
+ * currency, decimals, alignment, yes / no words, scale and description; a row's and a cell's type and a cell's value: a
1028
+ * first-row cell's `column`, a row's / cell's `type`, a cell's `value`), the header row and row headers, an optional caption,
1029
+ * the note under the table, row groups, the totals row and the row and column highlights (`caption`, `notes`,
1030
+ * `rowGroups`, a row's `footer` / `highlight`, a first-row cell's `highlight` / `sortable`, the table's `filterable`).
1031
+ * 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
1032
+ * pinned: V2's island passes no options, so its editor offers GENERAL_TABLE (sort, search and the JSON-LD choice on,
1033
+ * everything else at its default), and so does this.
1032
1034
  */
1033
1035
  var STORED_TABLE = {
1034
- columnTypes: ["text", "link"],
1035
1036
  requireCaption: false,
1036
1037
  allowGroups: true,
1037
- allowFootnotes: false,
1038
1038
  allowNote: true,
1039
1039
  settings: {
1040
- headers: true,
1041
- totals: false,
1042
- phones: [],
1043
- highlight: false,
1044
- sticky: false,
1045
- sort: false,
1046
- search: false
1047
- }
1040
+ sort: true,
1041
+ search: true
1042
+ },
1043
+ jsonLd: [
1044
+ "ItemList",
1045
+ "Dataset",
1046
+ "Offers"
1047
+ ]
1048
1048
  };
1049
1049
  function TableBlock({ m, set, el, ctx }) {
1050
1050
  return /* @__PURE__ */ jsx("div", {
@@ -1159,7 +1159,7 @@ function PullQuoteBlock({ m, set, el, ctx, autoFocus }) {
1159
1159
  const onKeyDown = (e) => {
1160
1160
  if (e.defaultPrevented || e.target !== card.current) return;
1161
1161
  const mod = e.metaKey || e.ctrlKey;
1162
- const k = e.key.toLowerCase();
1162
+ const k = eventKey(e);
1163
1163
  if (mod && k === "z") {
1164
1164
  e.preventDefault();
1165
1165
  e.stopPropagation();
@@ -1277,7 +1277,7 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
1277
1277
  const onKeyDown = (e) => {
1278
1278
  if (e.defaultPrevented || e.target !== card.current) return;
1279
1279
  const mod = e.metaKey || e.ctrlKey;
1280
- const k = e.key.toLowerCase();
1280
+ const k = eventKey(e);
1281
1281
  if (mod && k === "z") {
1282
1282
  e.preventDefault();
1283
1283
  e.stopPropagation();
@@ -1382,6 +1382,332 @@ function TakeawaysBlock({ m, set, el, ctx, autoFocus }) {
1382
1382
  })]
1383
1383
  });
1384
1384
  }
1385
+ var EMBED_LABEL = "Embed";
1386
+ /** V2 article.ts ARTICLE_SCHEMAS.embed without `aspect` (the stored block keeps no shape): the popover is built from it. */
1387
+ var EMBED_SCHEMA = {
1388
+ name: "embed",
1389
+ title: EMBED_LABEL,
1390
+ kind: "object",
1391
+ icon: "code",
1392
+ fields: [{
1393
+ name: "url",
1394
+ title: "Link",
1395
+ type: "url",
1396
+ placeholder: "Paste a YouTube, X, CodePen, Figma or map link",
1397
+ validation: { required: true }
1398
+ }, {
1399
+ name: "title",
1400
+ title: "Title",
1401
+ type: "string",
1402
+ validation: {
1403
+ required: true,
1404
+ max: 120
1405
+ },
1406
+ description: "Not shown. Read by screen readers."
1407
+ }]
1408
+ };
1409
+ function EmbedBlock({ m, set, el, ctx, autoFocus }) {
1410
+ const label = EMBED_LABEL;
1411
+ const uid = React.useId();
1412
+ const card = React.useRef(null);
1413
+ const form = React.useRef(null);
1414
+ const open = useOpenArticle();
1415
+ const editing = open?.id === uid;
1416
+ const ro = !!ctx.readOnly;
1417
+ const modelRef = React.useRef(m);
1418
+ modelRef.current = m;
1419
+ const openPopover = React.useCallback((k) => {
1420
+ if (!ro) setOpenArticle({
1421
+ id: uid,
1422
+ focusKey: k ?? null,
1423
+ nonce: (openArticle?.nonce ?? 0) + 1
1424
+ });
1425
+ }, [uid, ro]);
1426
+ const close = React.useCallback(() => {
1427
+ if (openArticle?.id === uid) setOpenArticle(null);
1428
+ }, [uid]);
1429
+ const focusCard = React.useCallback(() => requestAnimationFrame(() => card.current?.focus({ preventScroll: true })), []);
1430
+ React.useEffect(() => () => {
1431
+ if (openArticle?.id === uid) setOpenArticle(null);
1432
+ }, [uid]);
1433
+ React.useEffect(() => {
1434
+ if (autoFocus && !ro) openPopover();
1435
+ }, []);
1436
+ const nonce = editing ? open.nonce : 0;
1437
+ React.useEffect(() => {
1438
+ if (!nonce) return;
1439
+ const id = requestAnimationFrame(() => focusField(form.current, openArticle?.focusKey ?? null));
1440
+ return () => cancelAnimationFrame(id);
1441
+ }, [nonce]);
1442
+ /** a form edit joins the body's one undo history (D54); typing coalesces per field */
1443
+ const commit = (next) => {
1444
+ const prev = modelRef.current;
1445
+ const field = ["url", "title"].find((k) => (next[k] ?? "") !== (prev[k] ?? "")) ?? "";
1446
+ set(() => next, `Edit ${label.toLowerCase()} ${field}`);
1447
+ };
1448
+ const onKeyDown = (e) => {
1449
+ if (e.defaultPrevented || e.target !== card.current) return;
1450
+ const mod = e.metaKey || e.ctrlKey;
1451
+ const k = eventKey(e);
1452
+ if (mod && k === "z") {
1453
+ e.preventDefault();
1454
+ e.stopPropagation();
1455
+ if (e.shiftKey) ctx.redo?.();
1456
+ else ctx.undo?.();
1457
+ return;
1458
+ }
1459
+ if (e.key === "Enter" || e.key === " ") {
1460
+ e.preventDefault();
1461
+ openPopover();
1462
+ return;
1463
+ }
1464
+ if (e.key === "Escape") {
1465
+ e.preventDefault();
1466
+ e.stopPropagation();
1467
+ if (editing) close();
1468
+ else ctx.exit(el);
1469
+ return;
1470
+ }
1471
+ if (ro) return;
1472
+ if (mod && k === "d" && ctx.duplicate) {
1473
+ e.preventDefault();
1474
+ e.stopPropagation();
1475
+ ctx.duplicate(el);
1476
+ } else if (e.altKey && (e.key === "ArrowUp" || e.key === "ArrowDown") && ctx.move) {
1477
+ e.preventDefault();
1478
+ ctx.move(el, e.key === "ArrowUp" ? -1 : 1);
1479
+ focusCard();
1480
+ } else if (e.key === "Backspace" || e.key === "Delete") {
1481
+ e.preventDefault();
1482
+ ctx.remove(el);
1483
+ }
1484
+ };
1485
+ const actions = ro ? null : /* @__PURE__ */ jsxs("div", {
1486
+ 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"),
1487
+ children: [/* @__PURE__ */ jsx(Tooltip, {
1488
+ content: `Edit ${label.toLowerCase()}`,
1489
+ children: /* @__PURE__ */ jsx(IconButton, {
1490
+ size: "xs",
1491
+ label: `Edit ${label.toLowerCase()}`,
1492
+ onClick: () => editing ? close() : openPopover(),
1493
+ children: /* @__PURE__ */ jsx(IconSettings, { stroke: 1.5 })
1494
+ })
1495
+ }), /* @__PURE__ */ jsx(Tooltip, {
1496
+ content: `Remove ${label.toLowerCase()}`,
1497
+ children: /* @__PURE__ */ jsx(IconButton, {
1498
+ size: "xs",
1499
+ label: `Remove ${label.toLowerCase()}`,
1500
+ onClick: () => ctx.remove(el),
1501
+ className: "hover:text-kit-danger-fg",
1502
+ children: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 })
1503
+ })
1504
+ })]
1505
+ });
1506
+ return /* @__PURE__ */ jsxs(Popover, {
1507
+ open: editing,
1508
+ onOpenChange: (o, d) => {
1509
+ if (o) return;
1510
+ close();
1511
+ if (d?.reason !== "outside-press") focusCard();
1512
+ },
1513
+ children: [/* @__PURE__ */ jsxs("div", {
1514
+ ref: card,
1515
+ role: "group",
1516
+ tabIndex: 0,
1517
+ "aria-label": `${label}${editing ? ", editing" : ""}`,
1518
+ "aria-roledescription": "block",
1519
+ "aria-haspopup": "dialog",
1520
+ "aria-expanded": editing,
1521
+ "data-rt-isolate": "",
1522
+ "data-article-block": "embed",
1523
+ onKeyDown,
1524
+ onClick: (e) => {
1525
+ if (ro || !e.currentTarget.contains(e.target)) return;
1526
+ const t = e.target;
1527
+ if (t.closest("button,a,[role=menuitem]")) return;
1528
+ openPopover(t.closest("[data-field]")?.getAttribute("data-field") ?? null);
1529
+ },
1530
+ 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)]"),
1531
+ children: [
1532
+ /* @__PURE__ */ jsx(EmbedPreview, {
1533
+ m,
1534
+ onAdd: () => openPopover("url"),
1535
+ ro
1536
+ }),
1537
+ actions,
1538
+ /* @__PURE__ */ jsx(PopoverAnchor, { render: /* @__PURE__ */ jsx("span", {
1539
+ "aria-hidden": true,
1540
+ className: "pointer-events-none absolute right-2 top-2 size-px"
1541
+ }) })
1542
+ ]
1543
+ }), editing ? /* @__PURE__ */ jsxs(PopoverContent, {
1544
+ align: "end",
1545
+ side: "bottom",
1546
+ className: "w-[340px] p-0",
1547
+ initialFocus: false,
1548
+ finalFocus: false,
1549
+ onKeyDown: (e) => {
1550
+ if ((e.metaKey || e.ctrlKey) && !e.altKey && eventKey(e) === "z" && !e.defaultPrevented) {
1551
+ e.preventDefault();
1552
+ if (e.shiftKey) ctx.redo?.();
1553
+ else ctx.undo?.();
1554
+ }
1555
+ },
1556
+ children: [/* @__PURE__ */ jsxs("div", {
1557
+ className: "flex h-10 items-center gap-2 border-b border-kit-line-subtle pl-4 pr-1.5",
1558
+ children: [/* @__PURE__ */ jsx("span", {
1559
+ className: "flex-1 truncate text-kit-sm font-medium text-kit-fg",
1560
+ children: label
1561
+ }), /* @__PURE__ */ jsx(IconButton, {
1562
+ size: "sm",
1563
+ label: "Close",
1564
+ onClick: () => (close(), focusCard()),
1565
+ children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
1566
+ })]
1567
+ }), /* @__PURE__ */ jsx("div", {
1568
+ ref: form,
1569
+ className: "max-h-[min(480px,70vh)] overflow-y-auto pb-2",
1570
+ children: /* @__PURE__ */ jsxs("div", {
1571
+ "data-article-form": "",
1572
+ className: "min-w-0",
1573
+ children: [/* @__PURE__ */ jsx(SchemaForm, {
1574
+ schema: EMBED_SCHEMA,
1575
+ value: {
1576
+ url: m.url ?? "",
1577
+ title: m.title ?? ""
1578
+ },
1579
+ onChange: (v) => commit({
1580
+ ...modelRef.current,
1581
+ url: String(v.url ?? ""),
1582
+ title: String(v.title ?? "")
1583
+ }),
1584
+ variant: "panel",
1585
+ scroll: false,
1586
+ readOnly: ro,
1587
+ rootLabel: label,
1588
+ env: {
1589
+ docId: `article:${EMBED_SCHEMA.name}`,
1590
+ docTitle: label
1591
+ }
1592
+ }), /* @__PURE__ */ jsx("style", { children: `[data-article-form] [data-kit-form] section:first-of-type { border-top-width: 0; margin-top: 0; padding-top: 0; }` })]
1593
+ })
1594
+ })]
1595
+ }) : null]
1596
+ });
1597
+ }
1598
+ /** V2 article-blocks.tsx Empty: a block with nothing to show yet. */
1599
+ var ArticleEmpty = ({ icon, title, action, onAction, ro }) => /* @__PURE__ */ jsxs("div", {
1600
+ className: "flex items-center gap-3 rounded-kit-lg border border-dashed border-kit-line-strong bg-kit-subtle px-4 py-3.5",
1601
+ children: [
1602
+ /* @__PURE__ */ jsx("span", {
1603
+ className: "flex size-8 shrink-0 items-center justify-center rounded-kit-md border border-kit-line bg-kit-control-bg text-kit-fg-2 [&_svg]:size-4",
1604
+ children: icon
1605
+ }),
1606
+ /* @__PURE__ */ jsx("span", {
1607
+ className: "min-w-0 flex-1 text-kit-sm font-medium text-kit-fg",
1608
+ children: title
1609
+ }),
1610
+ ro ? null : /* @__PURE__ */ jsx(Button, {
1611
+ size: "sm",
1612
+ onClick: onAction,
1613
+ children: action
1614
+ })
1615
+ ]
1616
+ });
1617
+ var PROVIDER_ICON = {
1618
+ youtube: /* @__PURE__ */ jsx(IconBrandYoutube, { stroke: 1.5 }),
1619
+ vimeo: /* @__PURE__ */ jsx(IconBrandVimeo, { stroke: 1.5 }),
1620
+ x: /* @__PURE__ */ jsx(IconBrandX, { stroke: 1.5 }),
1621
+ codepen: /* @__PURE__ */ jsx(IconBrandCodepen, { stroke: 1.5 }),
1622
+ figma: /* @__PURE__ */ jsx(IconBrandFigma, { stroke: 1.5 }),
1623
+ maps: /* @__PURE__ */ jsx(IconMap, { stroke: 1.5 }),
1624
+ spotify: /* @__PURE__ */ jsx(IconBrandSpotify, { stroke: 1.5 }),
1625
+ podcast: /* @__PURE__ */ jsx(IconMicrophone, { stroke: 1.5 }),
1626
+ audio: /* @__PURE__ */ jsx(IconHeadphones, { stroke: 1.5 }),
1627
+ link: /* @__PURE__ */ jsx(IconWorld, { stroke: 1.5 })
1628
+ };
1629
+ /** V2 EmbedPreview: a faithful placeholder (provider, title and shape), no third-party frame in the editor. Drawn 16:9. */
1630
+ function EmbedPreview({ m, onAdd, ro }) {
1631
+ if (!m.url) return /* @__PURE__ */ jsx(ArticleEmpty, {
1632
+ icon: /* @__PURE__ */ jsx(IconLink, { stroke: 1.5 }),
1633
+ title: "Embed",
1634
+ action: "Paste a link",
1635
+ onAction: onAdd,
1636
+ ro
1637
+ });
1638
+ const info = detectEmbed(m.url);
1639
+ const icon = PROVIDER_ICON[info.provider];
1640
+ const title = m.title || /* @__PURE__ */ jsx("span", {
1641
+ className: "text-kit-warning-fg",
1642
+ children: "Add a title"
1643
+ });
1644
+ if (info.shape === "frame") return /* @__PURE__ */ jsx("figure", {
1645
+ className: "m-0",
1646
+ "data-field": "url",
1647
+ children: /* @__PURE__ */ jsxs("div", {
1648
+ className: "relative mx-auto flex w-full flex-col items-center justify-center gap-2 overflow-hidden rounded-kit-lg border border-kit-line bg-kit-subtle text-center",
1649
+ style: { aspectRatio: "16 / 9" },
1650
+ children: [
1651
+ /* @__PURE__ */ jsx("span", {
1652
+ className: "flex size-11 items-center justify-center rounded-full bg-kit-inverse text-kit-fg-inverse [&_svg]:size-5",
1653
+ children: info.provider === "youtube" || info.provider === "vimeo" ? /* @__PURE__ */ jsx(IconPlayerPlayFilled, {}) : icon
1654
+ }),
1655
+ /* @__PURE__ */ jsx("span", {
1656
+ "data-field": "title",
1657
+ className: "max-w-[80%] truncate text-kit-sm font-medium text-kit-fg",
1658
+ children: title
1659
+ }),
1660
+ /* @__PURE__ */ jsxs("span", {
1661
+ className: "absolute left-3 top-2.5 flex items-center gap-1.5 text-kit-xs text-kit-fg-2 [&_svg]:size-3.5",
1662
+ children: [icon, info.label]
1663
+ })
1664
+ ]
1665
+ })
1666
+ });
1667
+ if (info.shape === "audio") return /* @__PURE__ */ jsxs("figure", {
1668
+ className: "m-0 flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-subtle px-3 py-2.5",
1669
+ "data-field": "url",
1670
+ children: [
1671
+ /* @__PURE__ */ jsx("span", {
1672
+ className: "flex size-9 shrink-0 items-center justify-center rounded-full bg-kit-inverse text-kit-fg-inverse [&_svg]:size-4",
1673
+ children: /* @__PURE__ */ jsx(IconPlayerPlayFilled, {})
1674
+ }),
1675
+ /* @__PURE__ */ jsxs("span", {
1676
+ className: "min-w-0 flex-1",
1677
+ children: [/* @__PURE__ */ jsx("span", {
1678
+ "data-field": "title",
1679
+ className: "block truncate text-kit-sm font-medium text-kit-fg",
1680
+ children: title
1681
+ }), /* @__PURE__ */ jsxs("span", {
1682
+ className: "flex items-center gap-1 text-kit-xs text-kit-fg-3 [&_svg]:size-3",
1683
+ children: [icon, info.label]
1684
+ })]
1685
+ }),
1686
+ /* @__PURE__ */ jsx("span", {
1687
+ "aria-hidden": true,
1688
+ className: "hidden h-1 w-28 rounded-full bg-kit-line-strong sm:block"
1689
+ })
1690
+ ]
1691
+ });
1692
+ return /* @__PURE__ */ jsxs("figure", {
1693
+ className: "m-0 flex items-center gap-3 rounded-kit-lg border border-kit-line bg-kit-surface px-3 py-2.5",
1694
+ "data-field": "url",
1695
+ children: [/* @__PURE__ */ jsx("span", {
1696
+ className: "flex size-9 shrink-0 items-center justify-center rounded-kit-md bg-kit-muted text-kit-fg-2 [&_svg]:size-4",
1697
+ children: icon
1698
+ }), /* @__PURE__ */ jsxs("span", {
1699
+ className: "min-w-0 flex-1",
1700
+ children: [/* @__PURE__ */ jsx("span", {
1701
+ "data-field": "title",
1702
+ className: "block truncate text-kit-sm font-medium text-kit-fg",
1703
+ children: title
1704
+ }), /* @__PURE__ */ jsx("span", {
1705
+ className: "block truncate text-kit-xs text-kit-fg-3",
1706
+ children: info.shape === "post" ? `${info.label} · ${m.url.replace(/^https?:\/\/(www\.)?/, "")}` : m.url.replace(/^https?:\/\/(www\.)?/, "")
1707
+ })]
1708
+ })]
1709
+ });
1710
+ }
1385
1711
  function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx, el, children }) {
1386
1712
  const panel = React.useRef(null);
1387
1713
  const titleId = React.useId();
@@ -1408,71 +1734,72 @@ function ArticlePanel({ label, anchor, nonce, focusKey, onClose, focusBack, ctx,
1408
1734
  return () => timers.forEach((t) => window.clearTimeout(t));
1409
1735
  }, [nonce]);
1410
1736
  React.useEffect(() => panel.current?.announce(`${label} properties.`), [label]);
1737
+ const header = /* @__PURE__ */ jsxs(Fragment, { children: [
1738
+ /* @__PURE__ */ jsx("span", {
1739
+ id: titleId,
1740
+ className: "min-w-0 flex-1 truncate text-kit-sm font-medium text-kit-fg",
1741
+ children: label
1742
+ }),
1743
+ /* @__PURE__ */ jsxs(Menu, { children: [/* @__PURE__ */ jsx(MenuTrigger, { render: /* @__PURE__ */ jsx(IconButton, {
1744
+ size: "sm",
1745
+ label: `${label} actions`,
1746
+ children: /* @__PURE__ */ jsx(IconDots, { stroke: 1.5 })
1747
+ }) }), /* @__PURE__ */ jsxs(MenuContent, {
1748
+ align: "end",
1749
+ className: "w-52",
1750
+ children: [
1751
+ ctx.readOnly || !ctx.duplicate ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuItem, {
1752
+ icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
1753
+ onClick: () => ctx.duplicate?.(el),
1754
+ children: "Duplicate"
1755
+ }), /* @__PURE__ */ jsx(MenuSeparator, {})] }),
1756
+ /* @__PURE__ */ jsx(MenuItem, {
1757
+ icon: /* @__PURE__ */ jsx(IconArrowsMove, { stroke: 1.5 }),
1758
+ onClick: () => panel.current?.keyboard("move"),
1759
+ children: "Move panel"
1760
+ }),
1761
+ /* @__PURE__ */ jsx(MenuItem, {
1762
+ icon: /* @__PURE__ */ jsx(IconDimensions, { stroke: 1.5 }),
1763
+ onClick: () => panel.current?.keyboard("resize"),
1764
+ children: "Resize panel"
1765
+ }),
1766
+ /* @__PURE__ */ jsx(MenuItem, {
1767
+ icon: /* @__PURE__ */ jsx(IconLayoutSidebar, { stroke: 1.5 }),
1768
+ onClick: () => panel.current?.dock("left"),
1769
+ children: "Dock left"
1770
+ }),
1771
+ /* @__PURE__ */ jsx(MenuItem, {
1772
+ icon: /* @__PURE__ */ jsx(IconLayoutSidebarRight, { stroke: 1.5 }),
1773
+ onClick: () => panel.current?.dock("right"),
1774
+ children: "Dock right"
1775
+ }),
1776
+ ctx.readOnly ? null : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(MenuSeparator, {}), /* @__PURE__ */ jsx(MenuItem, {
1777
+ danger: true,
1778
+ icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
1779
+ onClick: () => ctx.remove(el),
1780
+ children: "Remove"
1781
+ })] })
1782
+ ]
1783
+ })] }),
1784
+ /* @__PURE__ */ jsx(IconButton, {
1785
+ size: "sm",
1786
+ label: "Close properties",
1787
+ tooltip: "Close",
1788
+ onClick: () => (onClose(), focusBack()),
1789
+ children: /* @__PURE__ */ jsx(IconX, { stroke: 1.5 })
1790
+ })
1791
+ ] });
1411
1792
  return /* @__PURE__ */ jsx(FloatingPanel, {
1412
1793
  ref: panel,
1413
1794
  id: "article-properties",
1414
1795
  labelledBy: titleId,
1415
1796
  anchor,
1416
1797
  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
- ] }),
1798
+ header,
1472
1799
  onClose,
1473
1800
  focusBack,
1474
1801
  onPanelKeyDown: (e) => {
1475
- if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === "z" && !e.defaultPrevented) {
1802
+ if ((e.metaKey || e.ctrlKey) && !e.altKey && eventKey(e) === "z" && !e.defaultPrevented) {
1476
1803
  e.preventDefault();
1477
1804
  if (e.shiftKey) ctx.redo?.();
1478
1805
  else ctx.undo?.();