@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,5 +1,5 @@
1
- import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTable, parseTableElement, tkey } from "../../schema/table.js";
2
- //#region src/kit/controls/rich-text/dom.ts
1
+ import { boolLabels, cellText, cellValue, emptyTable, formatNumber, isCellObject, isObjLike, normalizeTable, parseTableElement, tkey, toBool, toNumber } from "../../schema/table.js";
2
+ //#region src/controls/rich-text/dom.ts
3
3
  /**
4
4
  * RICH TEXT · DOM layer (V2 HEAD controls/rich-text/dom.ts). The field value is clean, semantic HTML; rich blocks are
5
5
  * "islands" while editing.
@@ -30,6 +30,9 @@ import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTabl
30
30
  * <div data-body><p>…` (the message is plain text: paragraphs and line breaks)
31
31
  * toggle `bcmsBlock` builtin:toggle {title, body}: `<details data-rt="toggle"><summary>…<div data-body><p>…`
32
32
  * video the `video` block {src, title}: `<div data-rt="video" data-url data-title>`
33
+ * embed `bcmsBlock` builtin:video {url, title} (the package's embed: `<iframe src title>` on the page), V2's
34
+ * article Embed: `<figure data-rt="embed" data-url data-title><a href>…`. V2's Shape (`aspect`) has no
35
+ * stored key, so it is not offered: every embed draws 16:9.
33
36
  * file the `file` block {src, name, size}: `<div data-rt="file" data-url data-name data-size>`
34
37
  * component `bcmsBlock` "component" {componentId, overrides, variant} (CPO D28): `<div data-rt="component" data-ref
35
38
  * data-id data-name data-overrides data-variant>` — a linked instance of a project component, shown as a card.
@@ -37,8 +40,8 @@ import { cellText, cellValue, emptyTable, isCellObject, isObjLike, normalizeTabl
37
40
  * `data-detached="true" data-props data-blocks data-source-published-at`, and carries no overrides.
38
41
  * A key the stored block holds is an attribute or element that is present; a key it lacks is absent, so an untouched
39
42
  * block reads back exactly as stored.
40
- * V2's gallery, embed, columns, footnotes, contents, related posts and author bio have no stored form in
41
- * production and are not offered.
43
+ * V2's gallery, columns, footnotes, contents, related posts and author bio have no stored form in production and are
44
+ * not offered.
42
45
  */
43
46
  var esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
44
47
  var escAttr = (s) => esc(s).replace(/"/g, "&quot;");
@@ -61,6 +64,78 @@ var CALLOUT_TONES = [
61
64
  "tip",
62
65
  "warning"
63
66
  ];
67
+ var hostOf = (url) => {
68
+ try {
69
+ return new URL(url).hostname.replace(/^www\./, "");
70
+ } catch {
71
+ return "";
72
+ }
73
+ };
74
+ function detectEmbed(url) {
75
+ const u = url.trim();
76
+ const host = hostOf(u);
77
+ const is = (re) => re.test(u);
78
+ if (is(/(?:youtube\.com\/(?:watch\?|embed\/|shorts\/|live\/)|youtu\.be\/)/i)) return {
79
+ provider: "youtube",
80
+ label: "YouTube",
81
+ shape: "frame",
82
+ host
83
+ };
84
+ if (is(/vimeo\.com\/(?:video\/)?\d+/i)) return {
85
+ provider: "vimeo",
86
+ label: "Vimeo",
87
+ shape: "frame",
88
+ host
89
+ };
90
+ if (is(/(?:twitter|x)\.com\/[^/]+\/status\/\d+/i)) return {
91
+ provider: "x",
92
+ label: "X post",
93
+ shape: "post",
94
+ host
95
+ };
96
+ if (is(/codepen\.io\/[^/]+\/(?:pen|embed)\//i)) return {
97
+ provider: "codepen",
98
+ label: "CodePen",
99
+ shape: "frame",
100
+ host
101
+ };
102
+ if (is(/figma\.com\/(?:file|design|proto|board)\//i)) return {
103
+ provider: "figma",
104
+ label: "Figma",
105
+ shape: "frame",
106
+ host
107
+ };
108
+ if (is(/(?:google\.[a-z.]+\/maps|maps\.app\.goo\.gl|goo\.gl\/maps)/i)) return {
109
+ provider: "maps",
110
+ label: "Google Maps",
111
+ shape: "frame",
112
+ host
113
+ };
114
+ if (is(/open\.spotify\.com\/(?:episode|track|show|playlist|album)\//i)) return {
115
+ provider: "spotify",
116
+ label: "Spotify",
117
+ shape: "audio",
118
+ host
119
+ };
120
+ if (is(/podcasts\.apple\.com\//i)) return {
121
+ provider: "podcast",
122
+ label: "Apple Podcasts",
123
+ shape: "audio",
124
+ host
125
+ };
126
+ if (is(/\.(?:mp3|m4a|wav|ogg|aac)(?:\?|$)/i)) return {
127
+ provider: "audio",
128
+ label: "Audio",
129
+ shape: "audio",
130
+ host
131
+ };
132
+ return {
133
+ provider: "link",
134
+ label: host || "Link",
135
+ shape: "link",
136
+ host
137
+ };
138
+ }
64
139
  var ISLAND_KINDS = [
65
140
  "image",
66
141
  "table",
@@ -69,6 +144,7 @@ var ISLAND_KINDS = [
69
144
  "callout",
70
145
  "toggle",
71
146
  "video",
147
+ "embed",
72
148
  "file",
73
149
  "component"
74
150
  ];
@@ -99,6 +175,10 @@ function defaultModel(kind, extra) {
99
175
  body: ""
100
176
  }),
101
177
  video: () => ({ url: "" }),
178
+ embed: () => ({
179
+ url: "",
180
+ title: ""
181
+ }),
102
182
  file: () => ({
103
183
  url: "",
104
184
  name: ""
@@ -178,6 +258,10 @@ function renderStatic(kind, model) {
178
258
  const m = model;
179
259
  return `<div data-rt="video"${attr("data-url", m.url)}${attr("data-title", m.title)}${xAttr(m.extra)}>${m.url ? `<a href="${escAttr(m.url)}">${esc(m.title || m.url)}</a>` : ""}</div>`;
180
260
  }
261
+ case "embed": {
262
+ const m = model;
263
+ return `<figure data-rt="embed"${attr("data-url", m.url)}${attr("data-title", m.title)}${xAttr(m.extra)}>${m.url ? `<a href="${escAttr(m.url)}">${esc(m.title || m.url)}</a>` : ""}</figure>`;
264
+ }
181
265
  case "file": {
182
266
  const m = model;
183
267
  const link = m.url && m.name ? `<a href="${escAttr(m.url)}" download>${esc(m.name)}</a>` : "";
@@ -206,6 +290,150 @@ var isRowGroupRow = (tr) => {
206
290
  return rows[0] === tr && rows.length > 1;
207
291
  };
208
292
  var KEY = /^[A-Za-z0-9-]{1,32}$/;
293
+ /** The column types a rich-text table stores: V2's island offers these (table-editor.tsx:80-86 TYPE_UI, the non-dev ones). */
294
+ var STORED_COLUMN_TYPES = [
295
+ "text",
296
+ "number",
297
+ "money",
298
+ "boolean",
299
+ "rating",
300
+ "link"
301
+ ];
302
+ var storedType = (v) => STORED_COLUMN_TYPES.includes(v) ? v : void 0;
303
+ /** The settings a kit column stores: none for a plain text or link column, else its type and every setting it has. */
304
+ function columnSettings(c) {
305
+ const s = {
306
+ ...c.description ? { description: c.description } : {},
307
+ ...c.unit ? { unit: c.unit } : {},
308
+ ...c.currency ? { currency: c.currency } : {},
309
+ ...c.decimals != null ? { decimals: c.decimals } : {},
310
+ ...c.align ? { align: c.align } : {},
311
+ ...c.trueLabel ? { trueLabel: c.trueLabel } : {},
312
+ ...c.falseLabel ? { falseLabel: c.falseLabel } : {},
313
+ ...c.max != null ? { max: c.max } : {}
314
+ };
315
+ const type = storedType(c.type) ?? "text";
316
+ return type === "text" || type === "link" ? Object.keys(s).length ? {
317
+ type,
318
+ ...s
319
+ } : void 0 : {
320
+ type,
321
+ ...s
322
+ };
323
+ }
324
+ /** A `<col>`'s attributes, V2 renderTableHtml's order (schema/table.ts:511-526): the column's settings, data-sortable among them. */
325
+ function colAttrs(c, sortable) {
326
+ return [
327
+ c ? ` data-type="${c.type ?? "text"}"` : "",
328
+ c?.unit ? ` data-unit="${escAttr(c.unit)}"` : "",
329
+ c?.currency ? ` data-currency="${escAttr(c.currency)}"` : "",
330
+ c?.decimals != null ? ` data-decimals="${c.decimals}"` : "",
331
+ c?.align ? ` data-align="${c.align}"` : "",
332
+ sortable ? " data-sortable=\"true\"" : "",
333
+ c?.trueLabel ? ` data-true="${escAttr(c.trueLabel)}"` : "",
334
+ c?.falseLabel ? ` data-false="${escAttr(c.falseLabel)}"` : "",
335
+ c?.max != null ? ` data-max="${c.max}"` : "",
336
+ c?.description ? ` data-description="${escAttr(c.description)}"` : ""
337
+ ].join("");
338
+ }
339
+ /** A `<col data-type …>` read back, as V2 parseTableElement reads it; undefined without a data-type. */
340
+ function colSettingsOf(col) {
341
+ const d = (n) => col.getAttribute(`data-${n}`) ?? void 0;
342
+ const type = storedType(d("type"));
343
+ if (!type) return void 0;
344
+ const int = (n, lo, hi) => {
345
+ const v = Number(d(n));
346
+ return d(n) !== void 0 && Number.isInteger(v) && v >= lo && v <= hi ? v : void 0;
347
+ };
348
+ const align = d("align");
349
+ return {
350
+ type,
351
+ ...d("unit") ? { unit: d("unit") } : {},
352
+ ...d("currency") && /^[A-Z]{3}$/.test(d("currency")) ? { currency: d("currency") } : {},
353
+ ...int("decimals", 0, 10) !== void 0 ? { decimals: int("decimals", 0, 10) } : {},
354
+ ...align === "start" || align === "center" || align === "end" ? { align } : {},
355
+ ...d("true") ? { trueLabel: d("true") } : {},
356
+ ...d("false") ? { falseLabel: d("false") } : {},
357
+ ...int("max", 1, 10) !== void 0 ? { max: int("max", 1, 10) } : {},
358
+ ...d("description") ? { description: d("description") } : {}
359
+ };
360
+ }
361
+ var NUMERIC = /* @__PURE__ */ new Set([
362
+ "number",
363
+ "money",
364
+ "rating"
365
+ ]);
366
+ /** V2 alignOf (schema/table.ts:365). */
367
+ var alignOf = (c, t) => c?.align ?? (NUMERIC.has(t) ? "end" : "start");
368
+ var isValueType = (t) => t === "boolean" || NUMERIC.has(t);
369
+ var asColumn = (c) => ({
370
+ _key: "",
371
+ label: "",
372
+ ...c,
373
+ type: c?.type ?? "text"
374
+ });
375
+ /** V2 cellText for a typed cell: the words it says (what a stored typed cell's blocks hold). */
376
+ var typedWords = (c, type, value) => value == null || value === "" ? "" : cellText(asColumn(c), void 0, {
377
+ value,
378
+ type
379
+ });
380
+ /**
381
+ * What one cell of a typed table draws, as production's renderer writes it (the package's typedCellView, V2 cellHtml
382
+ * schema/table.ts:369-437 and the column header at :564): `lead` attributes before data-label / data-highlight, `tail` after,
383
+ * and the markup when the cell is empty or of a value type (undefined: the cell draws its own text or link).
384
+ */
385
+ function typedCellView(column, rowType, cellType, value, header, inHead) {
386
+ if (inHead) {
387
+ const a = alignOf(column, column?.type ?? "text");
388
+ return {
389
+ lead: a !== "start" ? ` data-align="${a}"` : "",
390
+ tail: column?.description ? ` title="${escAttr(column.description)}"` : ""
391
+ };
392
+ }
393
+ const type = cellType ?? rowType ?? column?.type ?? "text";
394
+ const words = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : value;
395
+ let tail = cellType ? ` data-type="${cellType}"` : "";
396
+ let inner;
397
+ if (words == null || words === "") {
398
+ inner = header ? "" : "<span aria-hidden=\"true\" class=\"bt-dash\">—</span><span class=\"bt-sr\">No value</span>";
399
+ tail += " data-empty=\"\"";
400
+ } else if (type === "boolean") {
401
+ const b = toBool(words);
402
+ if (b == null) inner = esc(String(words));
403
+ else {
404
+ const { yes, no } = boolLabels(asColumn(column));
405
+ inner = `<span aria-hidden="true" class="bt-bool" data-bool="${b}">${b ? "✓" : "–"}</span><span class="bt-sr">${esc(b ? yes : no)}</span>`;
406
+ tail += ` data-value="${b}"`;
407
+ }
408
+ } else if (type === "rating") {
409
+ const n = toNumber(words);
410
+ if (n == null) inner = esc(String(words));
411
+ else {
412
+ inner = `<span aria-hidden="true" class="bt-star">★</span> ${esc(formatNumber(n, 1).replace(/\.0$/, ""))}<span class="bt-dim"> / ${column?.max ?? 5}</span>`;
413
+ tail += ` data-value="${n}"`;
414
+ }
415
+ } else if (type === "number" || type === "money") {
416
+ const n = toNumber(words);
417
+ inner = esc(typedWords(column, type, words));
418
+ if (n != null) tail += ` data-value="${n}"`;
419
+ }
420
+ const a = alignOf(column, type);
421
+ if (a !== "start") tail += ` data-align="${a}"`;
422
+ return {
423
+ lead: "",
424
+ tail,
425
+ ...inner === void 0 ? {} : { inner }
426
+ };
427
+ }
428
+ /** A typed cell read back (V2 readCell): data-empty is no value; data-value a number or true / false for a value type. */
429
+ function typedValueOf(cell, type) {
430
+ if (cell.hasAttribute("data-empty")) return "";
431
+ const raw = cell.getAttribute("data-value");
432
+ if (raw === null || !isValueType(type)) return void 0;
433
+ if (type === "boolean") return raw === "true";
434
+ return raw.trim() !== "" && Number.isFinite(Number(raw)) ? Number(raw) : void 0;
435
+ }
436
+ var typeAttrOf = (el) => storedType(el.getAttribute("data-type"));
209
437
  /**
210
438
  * Production's table markup → the table value, cell for cell (renderStoredTable's inverse): the plain `<table>`, or
211
439
  * the `<figure data-rt="table">` around one with its note. The V2 reader (parseTableElement) is not used here: it reads
@@ -225,23 +453,77 @@ function parseStoredTable(src) {
225
453
  t.headerRow = head.length > 0;
226
454
  t.headerColumn = body.length > 0 && body.every((tr) => tr.cells[0]?.tagName === "TH");
227
455
  t.caption = words(table.querySelector(":scope > caption"));
456
+ if (fig?.getAttribute("data-filter") === "true") t.filterable = true;
457
+ const resp = fig?.getAttribute("data-responsive");
458
+ if (resp === "stack" || resp === "cards") t.design = {
459
+ ...t.design,
460
+ responsive: resp
461
+ };
462
+ if (fig?.getAttribute("data-sticky") === "true") t.design = {
463
+ ...t.design,
464
+ sticky: true
465
+ };
466
+ const ld = fig?.getAttribute("data-jsonld");
467
+ if (ld === "ItemList" || ld === "Dataset" || ld === "Offers") {
468
+ const axis = fig?.getAttribute("data-jsonld-axis");
469
+ const price = fig?.getAttribute("data-jsonld-price");
470
+ t.jsonLd = {
471
+ type: ld,
472
+ ...axis === "rows" || axis === "columns" ? { axis } : {},
473
+ ...price ? { priceRow: price } : {}
474
+ };
475
+ }
476
+ const sortable = /* @__PURE__ */ new Set();
477
+ const settings = [];
478
+ let colAt = 0;
479
+ for (const g of Array.from(table.querySelectorAll(":scope > colgroup"))) {
480
+ const list = Array.from(g.querySelectorAll(":scope > col"));
481
+ if (!list.length) colAt += Math.max(1, Number(g.getAttribute("span")) || 1);
482
+ for (const col of list) {
483
+ const w = Math.max(1, Number(col.getAttribute("span")) || 1);
484
+ if (col.getAttribute("data-sortable") === "true") for (let i = 0; i < w; i++) sortable.add(colAt + i);
485
+ for (let i = 0; i < w; i++) settings[colAt + i] = colSettingsOf(col);
486
+ colAt += w;
487
+ }
488
+ }
228
489
  t.columns = Array.from({ length: width }, (_, i) => ({
229
490
  _key: tkey("c"),
230
491
  label: words(headCells[i]),
231
- type: "text"
492
+ ...settings[i],
493
+ type: settings[i]?.type ?? "text",
494
+ ...grid[0]?.cells[i]?.getAttribute("data-highlight") === "true" ? { highlight: true } : {},
495
+ ...sortable.has(i) ? { sortable: true } : {}
496
+ }));
497
+ const footnoteEls = Array.from(fig?.querySelectorAll("[data-footnotes] > li") ?? []);
498
+ if (footnoteEls.length) t.footnotes = footnoteEls.map((li) => ({
499
+ _key: li.getAttribute("data-key") || tkey("f"),
500
+ text: words(li)
232
501
  }));
233
- const cellOf = (cell) => {
502
+ const cellOf = (cell, col, rowType) => {
234
503
  if (!cell) return "";
235
504
  const { rest: c, marks } = splitMarks(cell);
505
+ let mark;
506
+ for (const sup of Array.from(c.querySelectorAll("sup"))) {
507
+ const n = /-fn-(\d+)$/.exec(sup.querySelector("a")?.getAttribute("href") ?? "")?.[1];
508
+ if (!n) continue;
509
+ mark ??= Number(n);
510
+ sup.remove();
511
+ }
512
+ const named = cell.getAttribute("data-note") ?? (mark ? t.footnotes?.[mark - 1]?._key : void 0);
513
+ const note = named && t.footnotes?.some((f) => f._key === named) ? named : void 0;
514
+ const own = typeAttrOf(cell);
515
+ const typed = typedValueOf(cell, own ?? rowType ?? col.type);
236
516
  const text = words(c);
237
517
  const a = c.children.length === 1 && c.firstElementChild?.tagName === "A" && c.firstElementChild.textContent?.trim() === text ? c.firstElementChild : null;
238
- const value = a ? {
518
+ const value = typed !== void 0 ? typed : a ? {
239
519
  label: text,
240
520
  href: a.getAttribute("href") ?? ""
241
521
  } : text;
242
- return marks ? {
522
+ return own || marks || note ? {
243
523
  value,
244
- marks
524
+ ...own ? { type: own } : {},
525
+ ...note ? { note } : {},
526
+ ...marks ? { marks } : {}
245
527
  } : value;
246
528
  };
247
529
  const groupOf = (list, own, prefix, label) => {
@@ -281,19 +563,26 @@ function parseStoredTable(src) {
281
563
  continue;
282
564
  }
283
565
  if (current && current.body !== tr.parentElement) current = void 0;
566
+ const footer = tr.parentElement?.tagName === "TFOOT";
567
+ const rowType = typeAttrOf(tr);
284
568
  t.rows.push({
285
569
  _key: tkey("r"),
286
- cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i])])),
287
- ...current ? { group: current.key } : {}
570
+ cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i], col, rowType)])),
571
+ ...rowType ? { type: rowType } : {},
572
+ ...current && !footer ? { group: current.key } : {},
573
+ ...footer ? { footer: true } : {},
574
+ ...tr.getAttribute("data-highlight") === "true" ? { highlight: true } : {}
288
575
  });
289
576
  }
290
577
  if (rowGroups.length) t.rowGroups = rowGroups;
291
- const note = fig?.querySelector(":scope > [data-notes]");
578
+ const note = fig?.querySelector(":scope > [data-notes], :scope > .bt-notes > [data-notes]");
579
+ const box = fig?.querySelector(":scope > .bt-notes");
292
580
  const notes = words(note);
293
581
  if (notes) t.notes = notes;
294
- const own = (note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
582
+ const own = (box?.getAttribute("id") ?? note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
295
583
  if (KEY.test(own)) t.id = own;
296
- t.columns.forEach((col) => {
584
+ t.columns.forEach((col, i) => {
585
+ if (settings[i]) return;
297
586
  const vals = t.rows.map((r) => r.cells[col._key]).filter((v) => v !== "");
298
587
  if (vals.length && vals.every((v) => isObjLike(v))) col.type = "link";
299
588
  });
@@ -304,19 +593,53 @@ function parseStoredTable(src) {
304
593
  * row in <thead>, header cells of the first column as <th>, every cell its text (a link cell its link). A caption, a
305
594
  * note or a group adds what that renderer writes for it, in the order the rows are held (an unedited stored table
306
595
  * comes back as it was; the editor's row list writes V2's order, loose rows first). An empty group has no row to label
307
- * and is not written, as production's renderer writes none.
596
+ * and is not written, as production's renderer writes none. The totals rows are a <tfoot> after every <tbody>; a
597
+ * highlighted row is `<tr data-highlight="true">` and a highlighted column `data-highlight="true"` on each of its cells
598
+ * (production 0.10, the V2 table's markup). A sortable column is its `<col data-sortable="true">` (one `<col>` per column,
599
+ * inside each column group's `<colgroup>`), and "Visitors can search rows" the figure's `data-filter="true"`.
308
600
  */
309
601
  function renderStoredTable(input) {
310
602
  const t = normalizeTable(input);
311
603
  const cols = t.columns;
312
- const cell = (row, c) => {
604
+ const settings = cols.map(columnSettings);
605
+ const typed = settings.some(Boolean) || t.rows.some((r) => !!storedType(r.type) || Object.values(r.cells).some((c) => isCellObject(c) && !!storedType(c.type)));
606
+ const cell = (row, c, i, header) => {
313
607
  const raw = row.cells[c._key];
314
608
  const v = cellValue(raw);
315
609
  const text = esc(cellText(c, row, raw));
316
610
  const marks = isCellObject(raw) && typeof raw.marks === "string" ? raw.marks : "";
317
- return (isObjLike(v) && typeof v.href === "string" && v.href ? `<a href="${escAttr(v.href)}">${text}</a>` : text) + marks;
611
+ const plain = (isObjLike(v) && typeof v.href === "string" && v.href ? `<a href="${escAttr(v.href)}">${text}</a>` : text) + marks;
612
+ const tag = header ? "th" : "td";
613
+ const fn = noted(row, c);
614
+ if (!typed) return `<${tag}${hi(c)}${fn.attr}>${plain}${fn.sup}</${tag}>`;
615
+ const view = typedCellView(settings[i], storedType(row.type), isCellObject(raw) ? storedType(raw.type) : void 0, isObjLike(v) ? cellText(c, row, raw) : v, header, false);
616
+ const tail = view.tail.replace(/( data-align="[^"]*")?$/, `${fn.attr}$1`);
617
+ return `<${tag}${view.lead}${hi(c)}${tail}>${view.inner === void 0 ? plain : view.inner + marks}${fn.sup}</${tag}>`;
318
618
  };
319
- const rowHtml = (row) => `<tr>${cols.map((c, i) => i === 0 && t.headerColumn ? `<th>${cell(row, c)}</th>` : `<td>${cell(row, c)}</td>`).join("")}</tr>`;
619
+ const hi = (c) => c.highlight ? " data-highlight=\"true\"" : "";
620
+ const fnOf = new Map((t.footnotes ?? []).map((f, i) => [f._key, i + 1]));
621
+ const noted = (row, c) => {
622
+ const raw = row.cells[c._key];
623
+ const key = isCellObject(raw) ? raw.note : void 0;
624
+ const n = key ? fnOf.get(key) : void 0;
625
+ return n ? {
626
+ attr: ` data-note="${escAttr(key)}"`,
627
+ sup: `<sup><a href="#${escAttr(t.id ?? "tbl")}-fn-${n}" aria-label="Note ${n}">${n}</a></sup>`
628
+ } : {
629
+ attr: "",
630
+ sup: ""
631
+ };
632
+ };
633
+ const rowHtml = (row) => `<tr${typed && storedType(row.type) ? ` data-type="${row.type}"` : ""}${row.highlight ? " data-highlight=\"true\"" : ""}>${cols.map((c, i) => cell(row, c, i, i === 0 && t.headerColumn)).join("")}</tr>`;
634
+ const headRow = `<tr>${cols.map((c, i) => {
635
+ const view = typed ? typedCellView(settings[i], void 0, void 0, void 0, true, true) : {
636
+ lead: "",
637
+ tail: ""
638
+ };
639
+ return `<th${view.lead}${hi(c)}${view.tail}>${esc(c.label)}</th>`;
640
+ }).join("")}</tr>`;
641
+ const body = t.rows.filter((r) => !r.footer);
642
+ const tfoot = t.rows.some((r) => r.footer) ? `<tfoot>${t.rows.filter((r) => r.footer).map(rowHtml).join("")}</tfoot>` : "";
320
643
  const span = (name, n) => n > 1 ? ` ${name}="${n}"` : "";
321
644
  const colLabels = new Map((t.columnGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
322
645
  const rowLabels = new Map((t.rowGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
@@ -334,26 +657,39 @@ function renderStoredTable(input) {
334
657
  return out.some((r) => r.key !== void 0) ? out : [];
335
658
  };
336
659
  const colRuns = runs(cols, (c) => c.group && colLabels.has(c.group) ? c.group : void 0);
337
- const rowRuns = runs(t.rows, (r) => r.group && rowLabels.has(r.group) ? r.group : void 0);
660
+ const rowRuns = runs(body, (r) => r.group && rowLabels.has(r.group) ? r.group : void 0);
338
661
  const caption = t.caption.trim();
339
- const notes = [(t.notes ?? "").trim(), ...(t.footnotes ?? []).map((f, i) => f.text.trim() ? `[${i + 1}] ${f.text.trim()}` : "")].filter(Boolean).join(" ");
340
- if (!caption && !notes && !colRuns.length && !rowRuns.length) {
662
+ const notes = (t.notes ?? "").trim();
663
+ const footnotes = t.footnotes ?? [];
664
+ const sortable = cols.some((c) => c.sortable) || settings.some(Boolean);
665
+ const filter = !!t.filterable;
666
+ const ld = t.jsonLd && t.jsonLd.type !== "none" ? t.jsonLd : null;
667
+ const resp = t.design?.responsive === "stack" || t.design?.responsive === "cards" ? t.design.responsive : null;
668
+ const sticky = !!t.design?.sticky;
669
+ if (!caption && !notes && !footnotes.length && !colRuns.length && !rowRuns.length && !sortable && !filter && !ld && !resp && !sticky && !typed) {
341
670
  const out = ["<table>"];
342
- if (t.headerRow) out.push(`<thead><tr>${cols.map((c) => `<th>${esc(c.label)}</th>`).join("")}</tr></thead>`);
343
- out.push(`<tbody>${t.rows.map(rowHtml).join("")}</tbody></table>`);
671
+ if (t.headerRow) out.push(`<thead>${headRow}</thead>`);
672
+ out.push(`${body.length || !tfoot ? `<tbody>${body.map(rowHtml).join("")}</tbody>` : ""}${tfoot}</table>`);
344
673
  return out.join("");
345
674
  }
346
- const notesId = notes ? `${t.id}-notes` : "";
675
+ const notesId = notes || footnotes.length ? `${t.id}-notes` : "";
347
676
  const out = [`<table${notesId ? ` aria-describedby="${escAttr(notesId)}"` : ""}>`];
348
677
  if (caption) out.push(`<caption>${esc(caption)}</caption>`);
349
- out.push(colRuns.map((r) => `<colgroup${span("span", r.items.length)}></colgroup>`).join(""));
678
+ if (sortable) {
679
+ let at = 0;
680
+ const widths = colRuns.length ? colRuns.map((r) => r.items.length) : [cols.length];
681
+ out.push(widths.map((w) => `<colgroup>${cols.slice(at, at += w).map((c, k) => `<col${colAttrs(settings[at - w + k], !!c.sortable)}>`).join("")}</colgroup>`).join(""));
682
+ } else out.push(colRuns.map((r) => `<colgroup${span("span", r.items.length)}></colgroup>`).join(""));
350
683
  const groupRow = colRuns.length ? `<tr>${colRuns.map((r) => r.key === void 0 ? "<td></td>".repeat(r.items.length) : `<th scope="colgroup"${span("colspan", r.items.length)} data-group="${escAttr(r.key)}">${esc(colLabels.get(r.key))}</th>`).join("")}</tr>` : "";
351
- if (groupRow || t.headerRow) out.push(`<thead>${groupRow}${t.headerRow ? `<tr>${cols.map((c) => `<th>${esc(c.label)}</th>`).join("")}</tr>` : ""}</thead>`);
684
+ if (groupRow || t.headerRow) out.push(`<thead>${groupRow}${t.headerRow ? headRow : ""}</thead>`);
352
685
  if (rowRuns.length) for (const r of rowRuns) out.push(`<tbody${r.key === void 0 ? "" : ` data-key="${escAttr(r.key)}"`}>${r.key === void 0 ? "" : `<tr><th scope="rowgroup"${span("colspan", cols.length)}>${esc(rowLabels.get(r.key))}</th></tr>`}${r.items.map(rowHtml).join("")}</tbody>`);
353
- else if (t.rows.length) out.push(`<tbody>${t.rows.map(rowHtml).join("")}</tbody>`);
354
- out.push("</table>");
686
+ else if (body.length) out.push(`<tbody>${body.map(rowHtml).join("")}</tbody>`);
687
+ out.push(`${tfoot}</table>`);
355
688
  const html = out.join("");
356
- return notes ? `<figure data-rt="table">${html}<p data-notes id="${escAttr(notesId)}">${esc(notes)}</p></figure>` : html;
689
+ if (!notes && !footnotes.length && !filter && !ld && !resp && !sticky) return html;
690
+ const designAttrs = `${resp ? ` data-responsive="${resp}"` : ""}${sticky ? " data-sticky=\"true\"" : ""}`;
691
+ const ldAttrs = ld ? ` data-jsonld="${ld.type}"${ld.axis ? ` data-jsonld-axis="${ld.axis}"` : ""}${ld.priceRow ? ` data-jsonld-price="${escAttr(ld.priceRow)}"` : ""}` : "";
692
+ return `<figure data-rt="table"${designAttrs}${filter ? " data-filter=\"true\"" : ""}${ldAttrs}>${html}${footnotes.length ? `<div class="bt-notes" id="${escAttr(notesId)}">${notes ? `<p data-notes>${esc(notes)}</p>` : ""}<ol data-footnotes>${footnotes.map((f, i) => `<li id="${escAttr(t.id ?? "tbl")}-fn-${i + 1}" data-key="${escAttr(f._key)}">${esc(f.text)}</li>`).join("")}</ol></div>` : notes ? `<p data-notes id="${escAttr(notesId)}">${esc(notes)}</p>` : ""}</figure>`;
357
693
  }
358
694
  /** The footnote markers closing a cell (`<sup data-footnote>` holding only text), and the cell without them. */
359
695
  function splitMarks(c) {
@@ -371,6 +707,7 @@ function splitMarks(c) {
371
707
  }
372
708
  /** A cell the table value can hold: text, line breaks, or one link around its text, then any footnote markers. */
373
709
  var plainCell = (cell) => {
710
+ if (cell.hasAttribute("data-value") || cell.hasAttribute("data-empty")) return true;
374
711
  const c = splitMarks(cell).rest;
375
712
  return Array.from(c.childNodes).every((n) => n.nodeType === 3 || n.nodeType === 1 && n.tagName === "BR") || c.children.length === 1 && c.firstElementChild.tagName === "A" && c.firstElementChild.children.length === 0 && (c.textContent ?? "").trim() === (c.firstElementChild.textContent ?? "").trim();
376
713
  };
@@ -469,6 +806,16 @@ function parseIsland(kind, el) {
469
806
  if (extra) m.extra = extra;
470
807
  return m;
471
808
  }
809
+ case "embed": {
810
+ const m = {};
811
+ const url = attrOf(el, "data-url");
812
+ const title = attrOf(el, "data-title");
813
+ if (url !== void 0) m.url = url;
814
+ if (title !== void 0) m.title = title;
815
+ const extra = attrOf(el, "data-extra");
816
+ if (extra) m.extra = extra;
817
+ return m;
818
+ }
472
819
  case "file": {
473
820
  const m = {};
474
821
  const url = attrOf(el, "data-url");
@@ -541,7 +888,7 @@ function hydrate(root) {
541
888
  root.append(p);
542
889
  }
543
890
  }
544
- var BLOCK_TAGS = new Set([
891
+ var BLOCK_TAGS = /* @__PURE__ */ new Set([
545
892
  "P",
546
893
  "H1",
547
894
  "H2",
@@ -603,7 +950,7 @@ function sanitize(html) {
603
950
  });
604
951
  return doc.body.innerHTML;
605
952
  }
606
- var TEXT_BLOCKS = new Set([
953
+ var TEXT_BLOCKS = /* @__PURE__ */ new Set([
607
954
  "P",
608
955
  "H1",
609
956
  "H2",
@@ -665,26 +1012,8 @@ function rangeRect(r, fallback) {
665
1012
  if (rect && (rect.width || rect.height)) return rect;
666
1013
  return ((r.startContainer.nodeType === 1 ? r.startContainer : r.startContainer.parentElement) ?? fallback ?? document.body).getBoundingClientRect();
667
1014
  }
668
- var NOT_COUNTED = "[data-rt=component],[data-rt=pullquote],[data-rt=takeaways],[data-rt=video],[data-rt=file]";
669
- var WORDS = (s) => s.replace(/\u200b/g, "").trim().split(/\s+/).filter(Boolean).length;
670
- function countWords(html) {
671
- if (!html) return 0;
672
- if (!/data-rt="(?:component|pullquote|takeaways|video|file)"/.test(html) || typeof DOMParser === "undefined") return WORDS(html.replace(/<\/(p|li|h[1-6]|blockquote|pre|figcaption|td|th|summary)>/g, " ").replace(/<[^>]+>/g, " ").replace(/&nbsp;|&[a-z]+;/g, " "));
673
- const doc = new DOMParser().parseFromString(`<body>${html}</body>`, "text/html");
674
- doc.body.querySelectorAll(NOT_COUNTED).forEach((n) => n.remove());
675
- doc.body.querySelectorAll("p,li,h1,h2,h3,h4,h5,h6,td,th,figcaption,summary,pre,blockquote,div").forEach((n) => n.append(" "));
676
- return WORDS(doc.body.textContent ?? "");
677
- }
678
- /** Linked component instances in the body. */
679
- var countComponents = (html) => (html.match(/data-rt="component"/g) ?? []).length;
680
- /** "1,840 words · 3 components" */
681
- var bodyCountLabel = (html) => {
682
- const w = countWords(html);
683
- const c = countComponents(html);
684
- return `${w.toLocaleString("en-US")} ${w === 1 ? "word" : "words"}${c ? ` · ${c} ${c === 1 ? "component" : "components"}` : ""}`;
685
- };
686
1015
  var isEmptyHtml = (html) => !html.replace(/<(?!img|hr|figure|table|details|div data-rt)[^>]*>/g, "").replace(/&nbsp;/g, "").trim();
687
1016
  //#endregion
688
- export { CALLOUT_TONES, bodyCountLabel, cloneModel, closestBlock, countComponents, countWords, createIsland, defaultModel, editingHost, editorRoundTrip, esc, escAttr, hydrate, isEmptyHtml, placeCaret, rangeRect, rid, sanitize, serialize, textBeforeCaret, topBlock };
1017
+ export { CALLOUT_TONES, IMAGE_ALIGNS, IMAGE_SIZES, ISLAND_KINDS, STORED_COLUMN_TYPES, TEXT_BLOCKS, cloneModel, closestBlock, colAttrs, colSettingsOf, columnSettings, createIsland, defaultModel, detectEmbed, detectKind, editingHost, editorRoundTrip, esc, escAttr, hydrate, isEmptyHtml, isValueType, parasToText, parseIsland, parseStoredTable, placeCaret, rangeRect, renderStatic, renderStoredTable, rid, sanitize, serialize, textBeforeCaret, textToParas, topBlock, typeAttrOf, typedCellView, typedValueOf, typedWords };
689
1018
 
690
1019
  //# sourceMappingURL=dom.js.map