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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +94 -31
  8. package/dist/adapters/lossy.js +419 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +91 -26
  11. package/{adapters → dist/adapters}/prod-types.js +82 -13
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +1038 -204
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +131 -2
  22. package/{context.js → dist/context.js} +44 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/dist/controls/form-picker-register.d.ts +7 -0
  50. package/{controls → dist/controls}/form-picker-register.js +2 -6
  51. package/dist/controls/form-picker-register.js.map +1 -0
  52. package/{controls → dist/controls}/form-picker.js +11 -9
  53. package/dist/controls/form-picker.js.map +1 -0
  54. package/{controls → dist/controls}/icon-register.js +1 -1
  55. package/dist/controls/icon-register.js.map +1 -0
  56. package/{controls → dist/controls}/icon.d.ts +4 -2
  57. package/{controls → dist/controls}/icon.js +32 -27
  58. package/dist/controls/icon.js.map +1 -0
  59. package/{controls → dist/controls}/index.d.ts +1 -1
  60. package/{controls → dist/controls}/index.js +4 -3
  61. package/dist/controls/index.js.map +1 -0
  62. package/{controls → dist/controls}/json-register.js +1 -1
  63. package/dist/controls/json-register.js.map +1 -0
  64. package/{controls → dist/controls}/json.js +13 -3
  65. package/dist/controls/json.js.map +1 -0
  66. package/{controls → dist/controls}/link.js +116 -200
  67. package/dist/controls/link.js.map +1 -0
  68. package/{controls → dist/controls}/location-register.js +1 -1
  69. package/dist/controls/location-register.js.map +1 -0
  70. package/{controls → dist/controls}/location.js +59 -40
  71. package/dist/controls/location.js.map +1 -0
  72. package/{controls → dist/controls}/media-register.js +1 -1
  73. package/dist/controls/media-register.js.map +1 -0
  74. package/{controls → dist/controls}/media-services.d.ts +6 -0
  75. package/dist/controls/media-services.js +0 -0
  76. package/{controls → dist/controls}/media.d.ts +21 -4
  77. package/{controls → dist/controls}/media.js +407 -130
  78. package/dist/controls/media.js.map +1 -0
  79. package/{controls → dist/controls}/number.js +10 -9
  80. package/dist/controls/number.js.map +1 -0
  81. package/{controls → dist/controls}/reference-register.js +1 -1
  82. package/dist/controls/reference-register.js.map +1 -0
  83. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  84. package/dist/controls/reference-services.js +0 -0
  85. package/{controls → dist/controls}/reference.d.ts +1 -1
  86. package/{controls → dist/controls}/reference.js +93 -77
  87. package/dist/controls/reference.js.map +1 -0
  88. package/dist/controls/rich-text/article-shell.d.ts +145 -0
  89. package/dist/controls/rich-text/article-shell.js +510 -0
  90. package/dist/controls/rich-text/article-shell.js.map +1 -0
  91. package/dist/controls/rich-text/author.d.ts +25 -0
  92. package/dist/controls/rich-text/author.js +104 -0
  93. package/dist/controls/rich-text/author.js.map +1 -0
  94. package/dist/controls/rich-text/blocks.d.ts +60 -0
  95. package/{controls → dist/controls}/rich-text/blocks.js +164 -389
  96. package/dist/controls/rich-text/blocks.js.map +1 -0
  97. package/dist/controls/rich-text/button.d.ts +23 -0
  98. package/dist/controls/rich-text/button.js +85 -0
  99. package/dist/controls/rich-text/button.js.map +1 -0
  100. package/{controls → dist/controls}/rich-text/catalog.d.ts +7 -4
  101. package/{controls → dist/controls}/rich-text/catalog.js +94 -68
  102. package/dist/controls/rich-text/catalog.js.map +1 -0
  103. package/dist/controls/rich-text/checklist.d.ts +24 -0
  104. package/dist/controls/rich-text/checklist.js +115 -0
  105. package/dist/controls/rich-text/checklist.js.map +1 -0
  106. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  107. package/{controls → dist/controls}/rich-text/codec.js +7 -2
  108. package/dist/controls/rich-text/codec.js.map +1 -0
  109. package/dist/controls/rich-text/columns.d.ts +41 -0
  110. package/dist/controls/rich-text/columns.js +181 -0
  111. package/dist/controls/rich-text/columns.js.map +1 -0
  112. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  113. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  114. package/dist/controls/rich-text/component-card.js.map +1 -0
  115. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  116. package/dist/controls/rich-text/component-panel.js +141 -0
  117. package/dist/controls/rich-text/component-panel.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  119. package/{controls → dist/controls}/rich-text/control.js +84 -42
  120. package/dist/controls/rich-text/control.js.map +1 -0
  121. package/{controls → dist/controls}/rich-text/dom.d.ts +53 -9
  122. package/{controls → dist/controls}/rich-text/dom.js +388 -50
  123. package/dist/controls/rich-text/dom.js.map +1 -0
  124. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  125. package/{controls → dist/controls}/rich-text/editor.js +226 -44
  126. package/dist/controls/rich-text/editor.js.map +1 -0
  127. package/dist/controls/rich-text/embed.d.ts +28 -0
  128. package/dist/controls/rich-text/embed.js +210 -0
  129. package/dist/controls/rich-text/embed.js.map +1 -0
  130. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  131. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  132. package/dist/controls/rich-text/floating.js.map +1 -0
  133. package/dist/controls/rich-text/footnote.d.ts +41 -0
  134. package/dist/controls/rich-text/footnote.js +185 -0
  135. package/dist/controls/rich-text/footnote.js.map +1 -0
  136. package/dist/controls/rich-text/gallery.d.ts +28 -0
  137. package/dist/controls/rich-text/gallery.js +167 -0
  138. package/dist/controls/rich-text/gallery.js.map +1 -0
  139. package/{controls → dist/controls}/rich-text/index.js +1 -1
  140. package/dist/controls/rich-text/index.js.map +1 -0
  141. package/{controls → dist/controls}/rich-text/link-form.d.ts +3 -1
  142. package/dist/controls/rich-text/link-form.js +147 -0
  143. package/dist/controls/rich-text/link-form.js.map +1 -0
  144. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  145. package/dist/controls/rich-text/markdown.js.map +1 -0
  146. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  147. package/dist/controls/rich-text/ops.js.map +1 -0
  148. package/dist/controls/rich-text/plain.d.ts +17 -0
  149. package/dist/controls/rich-text/plain.js +44 -0
  150. package/dist/controls/rich-text/plain.js.map +1 -0
  151. package/dist/controls/rich-text/related.d.ts +36 -0
  152. package/dist/controls/rich-text/related.js +213 -0
  153. package/dist/controls/rich-text/related.js.map +1 -0
  154. package/dist/controls/rich-text/toc.d.ts +46 -0
  155. package/dist/controls/rich-text/toc.js +161 -0
  156. package/dist/controls/rich-text/toc.js.map +1 -0
  157. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  158. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  159. package/dist/controls/rich-text/toolbar.js.map +1 -0
  160. package/{controls → dist/controls}/scale.js +5 -5
  161. package/dist/controls/scale.js.map +1 -0
  162. package/dist/controls/slot-register.d.ts +6 -0
  163. package/{controls → dist/controls}/slot-register.js +2 -5
  164. package/dist/controls/slot-register.js.map +1 -0
  165. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  166. package/dist/controls/slot-services.js +155 -0
  167. package/dist/controls/slot-services.js.map +1 -0
  168. package/{controls → dist/controls}/slot.js +42 -24
  169. package/dist/controls/slot.js.map +1 -0
  170. package/{controls → dist/controls}/table/index.js +1 -1
  171. package/dist/controls/table/index.js.map +1 -0
  172. package/{controls → dist/controls}/table/prod.js +3 -3
  173. package/dist/controls/table/prod.js.map +1 -0
  174. package/{controls → dist/controls}/table/refs.js +13 -2
  175. package/dist/controls/table/refs.js.map +1 -0
  176. package/{controls → dist/controls}/table/stored.js +1 -1
  177. package/dist/controls/table/stored.js.map +1 -0
  178. package/{controls → dist/controls}/table/table-editor.js +51 -48
  179. package/dist/controls/table/table-editor.js.map +1 -0
  180. package/{controls → dist/controls}/table/table-link.js +3 -3
  181. package/dist/controls/table/table-link.js.map +1 -0
  182. package/{controls → dist/controls}/table/table.js +3 -3
  183. package/dist/controls/table/table.js.map +1 -0
  184. package/{controls → dist/controls}/text.d.ts +2 -2
  185. package/{controls → dist/controls}/text.js +78 -43
  186. package/dist/controls/text.js.map +1 -0
  187. package/dist/controls/unknown-value.d.ts +17 -0
  188. package/dist/controls/unknown-value.js +66 -0
  189. package/dist/controls/unknown-value.js.map +1 -0
  190. package/dist/core/core.d.ts +70 -0
  191. package/dist/core/core.js +187 -0
  192. package/dist/core/core.js.map +1 -0
  193. package/dist/core/facets.d.ts +355 -0
  194. package/dist/core/facets.js +342 -0
  195. package/dist/core/facets.js.map +1 -0
  196. package/dist/core/index.d.ts +3 -0
  197. package/dist/core/index.js +3 -0
  198. package/{engine → dist/engine}/array.js +34 -21
  199. package/dist/engine/array.js.map +1 -0
  200. package/{engine → dist/engine}/bits.js +1 -1
  201. package/dist/engine/bits.js.map +1 -0
  202. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  203. package/{engine → dist/engine}/breadcrumb.js +12 -36
  204. package/dist/engine/breadcrumb.js.map +1 -0
  205. package/{engine → dist/engine}/expand.d.ts +2 -4
  206. package/{engine → dist/engine}/expand.js +5 -22
  207. package/dist/engine/expand.js.map +1 -0
  208. package/{engine → dist/engine}/field-list.js +1 -1
  209. package/dist/engine/field-list.js.map +1 -0
  210. package/{engine → dist/engine}/field-shell.js +249 -121
  211. package/dist/engine/field-shell.js.map +1 -0
  212. package/{engine → dist/engine}/frame.d.ts +3 -1
  213. package/{engine → dist/engine}/frame.js +16 -14
  214. package/dist/engine/frame.js.map +1 -0
  215. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  216. package/{engine → dist/engine}/group-summary.js +7 -3
  217. package/dist/engine/group-summary.js.map +1 -0
  218. package/{engine → dist/engine}/grouping.d.ts +19 -5
  219. package/{engine → dist/engine}/grouping.js +193 -21
  220. package/dist/engine/grouping.js.map +1 -0
  221. package/{engine → dist/engine}/item-list.d.ts +11 -1
  222. package/{engine → dist/engine}/item-list.js +35 -13
  223. package/dist/engine/item-list.js.map +1 -0
  224. package/{engine → dist/engine}/kit-field.js +45 -10
  225. package/dist/engine/kit-field.js.map +1 -0
  226. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  227. package/{engine → dist/engine}/schema-form.js +182 -40
  228. package/dist/engine/schema-form.js.map +1 -0
  229. package/{engine → dist/engine}/slot.js +5 -15
  230. package/dist/engine/slot.js.map +1 -0
  231. package/dist/index.js +58 -0
  232. package/dist/index.js.map +1 -0
  233. package/{kit.css → dist/kit.css} +19 -0
  234. package/{lib → dist/lib}/cn.js +7 -4
  235. package/dist/lib/cn.js.map +1 -0
  236. package/{lib → dist/lib}/columns.js +4 -1
  237. package/dist/lib/columns.js.map +1 -0
  238. package/{lib → dist/lib}/frames.js +2 -2
  239. package/dist/lib/frames.js.map +1 -0
  240. package/dist/lib/icon-image.d.ts +10 -0
  241. package/dist/lib/icon-image.js +8 -0
  242. package/dist/lib/icon-image.js.map +1 -0
  243. package/{lib → dist/lib}/icons.js +4 -3
  244. package/dist/lib/icons.js.map +1 -0
  245. package/dist/lib/input-modality.d.ts +11 -0
  246. package/dist/lib/input-modality.js +47 -0
  247. package/dist/lib/input-modality.js.map +1 -0
  248. package/dist/lib/key-event.d.ts +11 -0
  249. package/dist/lib/key-event.js +16 -0
  250. package/dist/lib/key-event.js.map +1 -0
  251. package/{lib → dist/lib}/path.js +4 -2
  252. package/dist/lib/path.js.map +1 -0
  253. package/{lib → dist/lib}/schema.d.ts +34 -3
  254. package/{lib → dist/lib}/schema.js +110 -13
  255. package/dist/lib/schema.js.map +1 -0
  256. package/{lib → dist/lib}/utils.js +1 -1
  257. package/dist/lib/utils.js.map +1 -0
  258. package/{lib → dist/lib}/validate.d.ts +11 -1
  259. package/{lib → dist/lib}/validate.js +85 -11
  260. package/dist/lib/validate.js.map +1 -0
  261. package/dist/library/analysis.d.ts +23 -0
  262. package/dist/library/analysis.js +160 -0
  263. package/dist/library/analysis.js.map +1 -0
  264. package/dist/library/catalog.d.ts +57 -0
  265. package/dist/library/catalog.js +307 -0
  266. package/dist/library/catalog.js.map +1 -0
  267. package/dist/library/coreNotes.d.ts +8 -0
  268. package/dist/library/coreNotes.js +111 -0
  269. package/dist/library/coreNotes.js.map +1 -0
  270. package/dist/library/coverage.d.ts +40 -0
  271. package/dist/library/coverage.js +59 -0
  272. package/dist/library/coverage.js.map +1 -0
  273. package/dist/library/entries/advanced.entries.d.ts +2 -0
  274. package/dist/library/entries/advanced.entries.js +6579 -0
  275. package/dist/library/entries/advanced.entries.js.map +1 -0
  276. package/dist/library/entries/commerce.entries.d.ts +2 -0
  277. package/dist/library/entries/commerce.entries.js +4140 -0
  278. package/dist/library/entries/commerce.entries.js.map +1 -0
  279. package/dist/library/entries/company.entries.d.ts +2 -0
  280. package/dist/library/entries/company.entries.js +2731 -0
  281. package/dist/library/entries/company.entries.js.map +1 -0
  282. package/dist/library/entries/conversion.entries.d.ts +2 -0
  283. package/dist/library/entries/conversion.entries.js +3707 -0
  284. package/dist/library/entries/conversion.entries.js.map +1 -0
  285. package/dist/library/entries/data.entries.d.ts +7 -0
  286. package/dist/library/entries/data.entries.js +4613 -0
  287. package/dist/library/entries/data.entries.js.map +1 -0
  288. package/dist/library/entries/events.entries.d.ts +2 -0
  289. package/dist/library/entries/events.entries.js +3428 -0
  290. package/dist/library/entries/events.entries.js.map +1 -0
  291. package/dist/library/entries/features.entries.d.ts +2 -0
  292. package/dist/library/entries/features.entries.js +3157 -0
  293. package/dist/library/entries/features.entries.js.map +1 -0
  294. package/dist/library/entries/heroes.entries.d.ts +2 -0
  295. package/dist/library/entries/heroes.entries.js +3401 -0
  296. package/dist/library/entries/heroes.entries.js.map +1 -0
  297. package/dist/library/entries/index.d.ts +3 -0
  298. package/dist/library/entries/index.js +35 -0
  299. package/dist/library/entries/index.js.map +1 -0
  300. package/dist/library/entries/listings.entries.d.ts +2 -0
  301. package/dist/library/entries/listings.entries.js +2976 -0
  302. package/dist/library/entries/listings.entries.js.map +1 -0
  303. package/dist/library/entries/longform.entries.d.ts +2 -0
  304. package/dist/library/entries/longform.entries.js +4227 -0
  305. package/dist/library/entries/longform.entries.js.map +1 -0
  306. package/dist/library/entries/media.entries.d.ts +2 -0
  307. package/dist/library/entries/media.entries.js +2781 -0
  308. package/dist/library/entries/media.entries.js.map +1 -0
  309. package/dist/library/entries/navigation.entries.d.ts +2 -0
  310. package/dist/library/entries/navigation.entries.js +4011 -0
  311. package/dist/library/entries/navigation.entries.js.map +1 -0
  312. package/dist/library/entries/pricing.entries.d.ts +2 -0
  313. package/dist/library/entries/pricing.entries.js +2383 -0
  314. package/dist/library/entries/pricing.entries.js.map +1 -0
  315. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  316. package/dist/library/entries/social-proof.entries.js +2297 -0
  317. package/dist/library/entries/social-proof.entries.js.map +1 -0
  318. package/dist/library/examples/bento.d.ts +92 -0
  319. package/dist/library/examples/bento.js +201 -0
  320. package/dist/library/examples/bento.js.map +1 -0
  321. package/dist/library/examples/blocks.d.ts +14 -0
  322. package/dist/library/examples/blocks.js +313 -0
  323. package/dist/library/examples/blocks.js.map +1 -0
  324. package/dist/library/examples/faq.d.ts +28 -0
  325. package/dist/library/examples/faq.js +230 -0
  326. package/dist/library/examples/faq.js.map +1 -0
  327. package/dist/library/examples/hero.d.ts +43 -0
  328. package/dist/library/examples/hero.js +222 -0
  329. package/dist/library/examples/hero.js.map +1 -0
  330. package/dist/library/examples/index.d.ts +36 -0
  331. package/dist/library/examples/index.js +109 -0
  332. package/dist/library/examples/index.js.map +1 -0
  333. package/dist/library/examples/journalStory.d.ts +93 -0
  334. package/dist/library/examples/journalStory.js +338 -0
  335. package/dist/library/examples/journalStory.js.map +1 -0
  336. package/dist/library/examples/megaMenu.d.ts +134 -0
  337. package/dist/library/examples/megaMenu.js +442 -0
  338. package/dist/library/examples/megaMenu.js.map +1 -0
  339. package/dist/library/examples/pricing.d.ts +103 -0
  340. package/dist/library/examples/pricing.js +479 -0
  341. package/dist/library/examples/pricing.js.map +1 -0
  342. package/dist/library/examples/tabs.d.ts +87 -0
  343. package/dist/library/examples/tabs.js +180 -0
  344. package/dist/library/examples/tabs.js.map +1 -0
  345. package/dist/library/export.d.ts +42 -0
  346. package/dist/library/export.js +80 -0
  347. package/dist/library/export.js.map +1 -0
  348. package/dist/library/index.d.ts +13 -0
  349. package/dist/library/index.js +6 -0
  350. package/dist/library/kit-catalog.json +1511 -0
  351. package/dist/library/types.d.ts +42 -0
  352. package/dist/library/types.js +0 -0
  353. package/{schema → dist/schema}/adapters.js +1 -2
  354. package/dist/schema/adapters.js.map +1 -0
  355. package/{schema → dist/schema}/help.d.ts +2 -0
  356. package/{schema → dist/schema}/help.js +6 -4
  357. package/dist/schema/help.js.map +1 -0
  358. package/{schema → dist/schema}/scale.js +1 -1
  359. package/dist/schema/scale.js.map +1 -0
  360. package/{schema → dist/schema}/sources.js +1 -1
  361. package/dist/schema/sources.js.map +1 -0
  362. package/{schema → dist/schema}/table.js +11 -10
  363. package/dist/schema/table.js.map +1 -0
  364. package/{schema → dist/schema}/types.d.ts +36 -1
  365. package/{schema → dist/schema}/types.js +1 -1
  366. package/dist/schema/types.js.map +1 -0
  367. package/dist/styles.css +2 -0
  368. package/dist/table/table-view.d.ts +14 -0
  369. package/dist/table/table-view.js +140 -0
  370. package/dist/table/table-view.js.map +1 -0
  371. package/dist/table/table.css +73 -0
  372. package/dist/testing/corpus.d.ts +63 -0
  373. package/dist/testing/corpus.js +129 -0
  374. package/dist/testing/corpus.js.map +1 -0
  375. package/dist/testing/test-form.d.ts +11 -0
  376. package/dist/testing/test-form.js +38 -0
  377. package/dist/testing/test-form.js.map +1 -0
  378. package/dist/theme.css +345 -0
  379. package/dist/theme.d.ts +22 -0
  380. package/dist/theme.js +43 -0
  381. package/dist/theme.js.map +1 -0
  382. package/dist/tokens.css +542 -0
  383. package/dist/types.js +0 -0
  384. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  385. package/{ui → dist/ui}/action-tray.js +20 -19
  386. package/dist/ui/action-tray.js.map +1 -0
  387. package/dist/ui/autocomplete.d.ts +58 -0
  388. package/dist/ui/autocomplete.js +194 -0
  389. package/dist/ui/autocomplete.js.map +1 -0
  390. package/{ui → dist/ui}/button.d.ts +3 -3
  391. package/{ui → dist/ui}/button.js +8 -11
  392. package/dist/ui/button.js.map +1 -0
  393. package/{ui → dist/ui}/choice-switch.js +1 -1
  394. package/dist/ui/choice-switch.js.map +1 -0
  395. package/{ui → dist/ui}/controls.js +51 -39
  396. package/dist/ui/controls.js.map +1 -0
  397. package/{ui → dist/ui}/display.d.ts +10 -3
  398. package/{ui → dist/ui}/display.js +57 -46
  399. package/dist/ui/display.js.map +1 -0
  400. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  401. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  402. package/dist/ui/expanded-editor-modal.js.map +1 -0
  403. package/{ui → dist/ui}/field-context.js +1 -1
  404. package/dist/ui/field-context.js.map +1 -0
  405. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  406. package/{ui → dist/ui}/floating-panel.js +28 -12
  407. package/dist/ui/floating-panel.js.map +1 -0
  408. package/{ui → dist/ui}/index.d.ts +4 -0
  409. package/dist/ui/index.js +18 -0
  410. package/{ui → dist/ui}/input.d.ts +1 -1
  411. package/{ui → dist/ui}/input.js +9 -9
  412. package/dist/ui/input.js.map +1 -0
  413. package/{ui → dist/ui}/mode-bar.js +3 -3
  414. package/dist/ui/mode-bar.js.map +1 -0
  415. package/{ui → dist/ui}/overlay.d.ts +77 -5
  416. package/dist/ui/overlay.js +697 -0
  417. package/dist/ui/overlay.js.map +1 -0
  418. package/{ui → dist/ui}/path-crumbs.js +37 -3
  419. package/dist/ui/path-crumbs.js.map +1 -0
  420. package/{ui → dist/ui}/presence.js +2 -2
  421. package/dist/ui/presence.js.map +1 -0
  422. package/{ui → dist/ui}/select.js +89 -87
  423. package/dist/ui/select.js.map +1 -0
  424. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  425. package/dist/ui/shortcut-hint.js.map +1 -0
  426. package/dist/ui/spinner.d.ts +24 -0
  427. package/dist/ui/spinner.js +42 -0
  428. package/dist/ui/spinner.js.map +1 -0
  429. package/dist/ui/split-button.d.ts +32 -0
  430. package/dist/ui/split-button.js +60 -0
  431. package/dist/ui/split-button.js.map +1 -0
  432. package/{ui → dist/ui}/surfaces.js +1 -1
  433. package/dist/ui/surfaces.js.map +1 -0
  434. package/dist/ui/tab.d.ts +38 -0
  435. package/dist/ui/tab.js +87 -0
  436. package/dist/ui/tab.js.map +1 -0
  437. package/dist/ui/toast.d.ts +20 -0
  438. package/dist/ui/toast.js +115 -0
  439. package/dist/ui/toast.js.map +1 -0
  440. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  441. package/{ui → dist/ui}/tooltip-root.js +9 -8
  442. package/dist/ui/tooltip-root.js.map +1 -0
  443. package/{ui → dist/ui}/variants.js +1 -1
  444. package/dist/ui/variants.js.map +1 -0
  445. package/package.json +83 -23
  446. package/adapters/icons.js.map +0 -1
  447. package/adapters/lossy.js +0 -233
  448. package/adapters/lossy.js.map +0 -1
  449. package/adapters/prod-types.js.map +0 -1
  450. package/adapters/schema.js.map +0 -1
  451. package/adapters/values.js.map +0 -1
  452. package/brand/logo.js +0 -9
  453. package/brand/logo.js.map +0 -1
  454. package/context.js.map +0 -1
  455. package/controls/button.js.map +0 -1
  456. package/controls/c1.js.map +0 -1
  457. package/controls/c2.js.map +0 -1
  458. package/controls/choice.js.map +0 -1
  459. package/controls/code-register.js.map +0 -1
  460. package/controls/code.js.map +0 -1
  461. package/controls/color.js.map +0 -1
  462. package/controls/date-register.js.map +0 -1
  463. package/controls/date-zone.js.map +0 -1
  464. package/controls/date.js.map +0 -1
  465. package/controls/form-picker-register.d.ts +0 -1
  466. package/controls/form-picker-register.js.map +0 -1
  467. package/controls/form-picker.js.map +0 -1
  468. package/controls/icon-register.js.map +0 -1
  469. package/controls/icon.js.map +0 -1
  470. package/controls/index.js.map +0 -1
  471. package/controls/json-register.js.map +0 -1
  472. package/controls/json.js.map +0 -1
  473. package/controls/link.js.map +0 -1
  474. package/controls/location-register.js.map +0 -1
  475. package/controls/location.js.map +0 -1
  476. package/controls/media-register.js.map +0 -1
  477. package/controls/media.js.map +0 -1
  478. package/controls/number.js.map +0 -1
  479. package/controls/reference-register.js.map +0 -1
  480. package/controls/reference.js.map +0 -1
  481. package/controls/rich-text/blocks.d.ts +0 -28
  482. package/controls/rich-text/blocks.js.map +0 -1
  483. package/controls/rich-text/catalog.js.map +0 -1
  484. package/controls/rich-text/codec.js.map +0 -1
  485. package/controls/rich-text/component-card.js.map +0 -1
  486. package/controls/rich-text/control.js.map +0 -1
  487. package/controls/rich-text/dom.js.map +0 -1
  488. package/controls/rich-text/editor.js.map +0 -1
  489. package/controls/rich-text/floating.js.map +0 -1
  490. package/controls/rich-text/index.js.map +0 -1
  491. package/controls/rich-text/link-form.js +0 -111
  492. package/controls/rich-text/link-form.js.map +0 -1
  493. package/controls/rich-text/markdown.js.map +0 -1
  494. package/controls/rich-text/ops.js.map +0 -1
  495. package/controls/rich-text/toolbar.js.map +0 -1
  496. package/controls/scale.js.map +0 -1
  497. package/controls/slot-register.d.ts +0 -1
  498. package/controls/slot-register.js.map +0 -1
  499. package/controls/slot-services.js +0 -38
  500. package/controls/slot-services.js.map +0 -1
  501. package/controls/slot.js.map +0 -1
  502. package/controls/table/index.js.map +0 -1
  503. package/controls/table/prod.js.map +0 -1
  504. package/controls/table/refs.js.map +0 -1
  505. package/controls/table/stored.js.map +0 -1
  506. package/controls/table/table-editor.js.map +0 -1
  507. package/controls/table/table-link.js.map +0 -1
  508. package/controls/table/table.js.map +0 -1
  509. package/controls/text.js.map +0 -1
  510. package/engine/array.js.map +0 -1
  511. package/engine/bits.js.map +0 -1
  512. package/engine/breadcrumb.js.map +0 -1
  513. package/engine/expand.js.map +0 -1
  514. package/engine/field-list.js.map +0 -1
  515. package/engine/field-shell.js.map +0 -1
  516. package/engine/frame.js.map +0 -1
  517. package/engine/group-summary.js.map +0 -1
  518. package/engine/grouping.js.map +0 -1
  519. package/engine/item-list.js.map +0 -1
  520. package/engine/kit-field.js.map +0 -1
  521. package/engine/schema-form.js.map +0 -1
  522. package/engine/slot.js.map +0 -1
  523. package/index.js +0 -55
  524. package/index.js.map +0 -1
  525. package/lib/cn.js.map +0 -1
  526. package/lib/columns.js.map +0 -1
  527. package/lib/frames.js.map +0 -1
  528. package/lib/icons.js.map +0 -1
  529. package/lib/path.js.map +0 -1
  530. package/lib/schema.js.map +0 -1
  531. package/lib/utils.js.map +0 -1
  532. package/lib/validate.js.map +0 -1
  533. package/schema/adapters.js.map +0 -1
  534. package/schema/help.js.map +0 -1
  535. package/schema/scale.js.map +0 -1
  536. package/schema/sources.js.map +0 -1
  537. package/schema/table.js.map +0 -1
  538. package/schema/types.js.map +0 -1
  539. package/ui/action-tray.js.map +0 -1
  540. package/ui/button.js.map +0 -1
  541. package/ui/choice-switch.js.map +0 -1
  542. package/ui/controls.js.map +0 -1
  543. package/ui/display.js.map +0 -1
  544. package/ui/expanded-editor-modal.js.map +0 -1
  545. package/ui/field-context.js.map +0 -1
  546. package/ui/floating-panel.js.map +0 -1
  547. package/ui/index.js +0 -13
  548. package/ui/input.js.map +0 -1
  549. package/ui/mode-bar.js.map +0 -1
  550. package/ui/overlay.js +0 -378
  551. package/ui/overlay.js.map +0 -1
  552. package/ui/path-crumbs.js.map +0 -1
  553. package/ui/presence.js.map +0 -1
  554. package/ui/select.js.map +0 -1
  555. package/ui/shortcut-hint.js.map +0 -1
  556. package/ui/surfaces.js.map +0 -1
  557. package/ui/tooltip-root.js.map +0 -1
  558. package/ui/variants.js.map +0 -1
  559. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  560. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  561. /package/{brand → dist/brand}/logo.d.ts +0 -0
  562. /package/{controls → dist/controls}/c1.d.ts +0 -0
  563. /package/{controls → dist/controls}/c2.d.ts +0 -0
  564. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  565. /package/{controls → dist/controls}/code.d.ts +0 -0
  566. /package/{controls → dist/controls}/color.d.ts +0 -0
  567. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  568. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  569. /package/{controls → dist/controls}/date.d.ts +0 -0
  570. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  571. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  572. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  573. /package/{controls → dist/controls}/json.d.ts +0 -0
  574. /package/{controls → dist/controls}/link.d.ts +0 -0
  575. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  576. /package/{controls → dist/controls}/location.d.ts +0 -0
  577. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  578. /package/{controls → dist/controls}/number.d.ts +0 -0
  579. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  580. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  581. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  582. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  583. /package/{controls → dist/controls}/scale.d.ts +0 -0
  584. /package/{controls → dist/controls}/slot.d.ts +0 -0
  585. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  586. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  587. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  588. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  589. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  590. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  591. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  592. /package/{engine → dist/engine}/array.d.ts +0 -0
  593. /package/{engine → dist/engine}/bits.d.ts +0 -0
  594. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  595. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  596. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  597. /package/{engine → dist/engine}/slot.d.ts +0 -0
  598. /package/{index.d.ts → dist/index.d.ts} +0 -0
  599. /package/{lib → dist/lib}/cn.d.ts +0 -0
  600. /package/{lib → dist/lib}/columns.d.ts +0 -0
  601. /package/{lib → dist/lib}/frames.d.ts +0 -0
  602. /package/{lib → dist/lib}/icons.d.ts +0 -0
  603. /package/{lib → dist/lib}/path.d.ts +0 -0
  604. /package/{lib → dist/lib}/utils.d.ts +0 -0
  605. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  606. /package/{schema → dist/schema}/scale.d.ts +0 -0
  607. /package/{schema → dist/schema}/sources.d.ts +0 -0
  608. /package/{schema → dist/schema}/table.d.ts +0 -0
  609. /package/{types.d.ts → dist/types.d.ts} +0 -0
  610. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  611. /package/{ui → dist/ui}/controls.d.ts +0 -0
  612. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  613. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  614. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  615. /package/{ui → dist/ui}/presence.d.ts +0 -0
  616. /package/{ui → dist/ui}/select.d.ts +0 -0
  617. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  618. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  619. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1,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 V2's article Embed {url, title, aspect}: `<figure data-rt="embed" data-url data-title data-aspect><a href>…`
34
+ * (embed.tsx). Stored today as `bcmsBlock` builtin:video {url, title}, which keeps no aspect; the PT
35
+ * `embed` block (plan RT3) does.
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,84 @@ var CALLOUT_TONES = [
61
64
  "tip",
62
65
  "warning"
63
66
  ];
67
+ var EMBED_ASPECT_VALUES = [
68
+ "16:9",
69
+ "4:3",
70
+ "1:1",
71
+ "9:16"
72
+ ];
73
+ var hostOf = (url) => {
74
+ try {
75
+ return new URL(url).hostname.replace(/^www\./, "");
76
+ } catch {
77
+ return "";
78
+ }
79
+ };
80
+ function detectEmbed(url) {
81
+ const u = url.trim();
82
+ const host = hostOf(u);
83
+ const is = (re) => re.test(u);
84
+ if (is(/(?:youtube\.com\/(?:watch\?|embed\/|shorts\/|live\/)|youtu\.be\/)/i)) return {
85
+ provider: "youtube",
86
+ label: "YouTube",
87
+ shape: "frame",
88
+ host
89
+ };
90
+ if (is(/vimeo\.com\/(?:video\/)?\d+/i)) return {
91
+ provider: "vimeo",
92
+ label: "Vimeo",
93
+ shape: "frame",
94
+ host
95
+ };
96
+ if (is(/(?:twitter|x)\.com\/[^/]+\/status\/\d+/i)) return {
97
+ provider: "x",
98
+ label: "X post",
99
+ shape: "post",
100
+ host
101
+ };
102
+ if (is(/codepen\.io\/[^/]+\/(?:pen|embed)\//i)) return {
103
+ provider: "codepen",
104
+ label: "CodePen",
105
+ shape: "frame",
106
+ host
107
+ };
108
+ if (is(/figma\.com\/(?:file|design|proto|board)\//i)) return {
109
+ provider: "figma",
110
+ label: "Figma",
111
+ shape: "frame",
112
+ host
113
+ };
114
+ if (is(/(?:google\.[a-z.]+\/maps|maps\.app\.goo\.gl|goo\.gl\/maps)/i)) return {
115
+ provider: "maps",
116
+ label: "Google Maps",
117
+ shape: "frame",
118
+ host
119
+ };
120
+ if (is(/open\.spotify\.com\/(?:episode|track|show|playlist|album)\//i)) return {
121
+ provider: "spotify",
122
+ label: "Spotify",
123
+ shape: "audio",
124
+ host
125
+ };
126
+ if (is(/podcasts\.apple\.com\//i)) return {
127
+ provider: "podcast",
128
+ label: "Apple Podcasts",
129
+ shape: "audio",
130
+ host
131
+ };
132
+ if (is(/\.(?:mp3|m4a|wav|ogg|aac)(?:\?|$)/i)) return {
133
+ provider: "audio",
134
+ label: "Audio",
135
+ shape: "audio",
136
+ host
137
+ };
138
+ return {
139
+ provider: "link",
140
+ label: host || "Link",
141
+ shape: "link",
142
+ host
143
+ };
144
+ }
64
145
  var ISLAND_KINDS = [
65
146
  "image",
66
147
  "table",
@@ -69,6 +150,7 @@ var ISLAND_KINDS = [
69
150
  "callout",
70
151
  "toggle",
71
152
  "video",
153
+ "embed",
72
154
  "file",
73
155
  "component"
74
156
  ];
@@ -99,6 +181,10 @@ function defaultModel(kind, extra) {
99
181
  body: ""
100
182
  }),
101
183
  video: () => ({ url: "" }),
184
+ embed: () => ({
185
+ url: "",
186
+ title: ""
187
+ }),
102
188
  file: () => ({
103
189
  url: "",
104
190
  name: ""
@@ -178,6 +264,10 @@ function renderStatic(kind, model) {
178
264
  const m = model;
179
265
  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
266
  }
267
+ case "embed": {
268
+ const m = model;
269
+ return `<figure data-rt="embed"${attr("data-url", m.url)}${attr("data-title", m.title)}${attr("data-aspect", m.aspect)}${xAttr(m.extra)}>${m.url ? `<a href="${escAttr(m.url)}">${esc(m.title || m.url)}</a>` : ""}</figure>`;
270
+ }
181
271
  case "file": {
182
272
  const m = model;
183
273
  const link = m.url && m.name ? `<a href="${escAttr(m.url)}" download>${esc(m.name)}</a>` : "";
@@ -206,6 +296,150 @@ var isRowGroupRow = (tr) => {
206
296
  return rows[0] === tr && rows.length > 1;
207
297
  };
208
298
  var KEY = /^[A-Za-z0-9-]{1,32}$/;
299
+ /** The column types a rich-text table stores: V2's island offers these (table-editor.tsx:80-86 TYPE_UI, the non-dev ones). */
300
+ var STORED_COLUMN_TYPES = [
301
+ "text",
302
+ "number",
303
+ "money",
304
+ "boolean",
305
+ "rating",
306
+ "link"
307
+ ];
308
+ var storedType = (v) => STORED_COLUMN_TYPES.includes(v) ? v : void 0;
309
+ /** The settings a kit column stores: none for a plain text or link column, else its type and every setting it has. */
310
+ function columnSettings(c) {
311
+ const s = {
312
+ ...c.description ? { description: c.description } : {},
313
+ ...c.unit ? { unit: c.unit } : {},
314
+ ...c.currency ? { currency: c.currency } : {},
315
+ ...c.decimals != null ? { decimals: c.decimals } : {},
316
+ ...c.align ? { align: c.align } : {},
317
+ ...c.trueLabel ? { trueLabel: c.trueLabel } : {},
318
+ ...c.falseLabel ? { falseLabel: c.falseLabel } : {},
319
+ ...c.max != null ? { max: c.max } : {}
320
+ };
321
+ const type = storedType(c.type) ?? "text";
322
+ return type === "text" || type === "link" ? Object.keys(s).length ? {
323
+ type,
324
+ ...s
325
+ } : void 0 : {
326
+ type,
327
+ ...s
328
+ };
329
+ }
330
+ /** A `<col>`'s attributes, V2 renderTableHtml's order (schema/table.ts:511-526): the column's settings, data-sortable among them. */
331
+ function colAttrs(c, sortable) {
332
+ return [
333
+ c ? ` data-type="${c.type ?? "text"}"` : "",
334
+ c?.unit ? ` data-unit="${escAttr(c.unit)}"` : "",
335
+ c?.currency ? ` data-currency="${escAttr(c.currency)}"` : "",
336
+ c?.decimals != null ? ` data-decimals="${c.decimals}"` : "",
337
+ c?.align ? ` data-align="${c.align}"` : "",
338
+ sortable ? " data-sortable=\"true\"" : "",
339
+ c?.trueLabel ? ` data-true="${escAttr(c.trueLabel)}"` : "",
340
+ c?.falseLabel ? ` data-false="${escAttr(c.falseLabel)}"` : "",
341
+ c?.max != null ? ` data-max="${c.max}"` : "",
342
+ c?.description ? ` data-description="${escAttr(c.description)}"` : ""
343
+ ].join("");
344
+ }
345
+ /** A `<col data-type …>` read back, as V2 parseTableElement reads it; undefined without a data-type. */
346
+ function colSettingsOf(col) {
347
+ const d = (n) => col.getAttribute(`data-${n}`) ?? void 0;
348
+ const type = storedType(d("type"));
349
+ if (!type) return void 0;
350
+ const int = (n, lo, hi) => {
351
+ const v = Number(d(n));
352
+ return d(n) !== void 0 && Number.isInteger(v) && v >= lo && v <= hi ? v : void 0;
353
+ };
354
+ const align = d("align");
355
+ return {
356
+ type,
357
+ ...d("unit") ? { unit: d("unit") } : {},
358
+ ...d("currency") && /^[A-Z]{3}$/.test(d("currency")) ? { currency: d("currency") } : {},
359
+ ...int("decimals", 0, 10) !== void 0 ? { decimals: int("decimals", 0, 10) } : {},
360
+ ...align === "start" || align === "center" || align === "end" ? { align } : {},
361
+ ...d("true") ? { trueLabel: d("true") } : {},
362
+ ...d("false") ? { falseLabel: d("false") } : {},
363
+ ...int("max", 1, 10) !== void 0 ? { max: int("max", 1, 10) } : {},
364
+ ...d("description") ? { description: d("description") } : {}
365
+ };
366
+ }
367
+ var NUMERIC = /* @__PURE__ */ new Set([
368
+ "number",
369
+ "money",
370
+ "rating"
371
+ ]);
372
+ /** V2 alignOf (schema/table.ts:365). */
373
+ var alignOf = (c, t) => c?.align ?? (NUMERIC.has(t) ? "end" : "start");
374
+ var isValueType = (t) => t === "boolean" || NUMERIC.has(t);
375
+ var asColumn = (c) => ({
376
+ _key: "",
377
+ label: "",
378
+ ...c,
379
+ type: c?.type ?? "text"
380
+ });
381
+ /** V2 cellText for a typed cell: the words it says (what a stored typed cell's blocks hold). */
382
+ var typedWords = (c, type, value) => value == null || value === "" ? "" : cellText(asColumn(c), void 0, {
383
+ value,
384
+ type
385
+ });
386
+ /**
387
+ * What one cell of a typed table draws, as production's renderer writes it (the package's typedCellView, V2 cellHtml
388
+ * schema/table.ts:369-437 and the column header at :564): `lead` attributes before data-label / data-highlight, `tail` after,
389
+ * and the markup when the cell is empty or of a value type (undefined: the cell draws its own text or link).
390
+ */
391
+ function typedCellView(column, rowType, cellType, value, header, inHead) {
392
+ if (inHead) {
393
+ const a = alignOf(column, column?.type ?? "text");
394
+ return {
395
+ lead: a !== "start" ? ` data-align="${a}"` : "",
396
+ tail: column?.description ? ` title="${escAttr(column.description)}"` : ""
397
+ };
398
+ }
399
+ const type = cellType ?? rowType ?? column?.type ?? "text";
400
+ const words = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : value;
401
+ let tail = cellType ? ` data-type="${cellType}"` : "";
402
+ let inner;
403
+ if (words == null || words === "") {
404
+ inner = header ? "" : "<span aria-hidden=\"true\" class=\"bt-dash\">—</span><span class=\"bt-sr\">No value</span>";
405
+ tail += " data-empty=\"\"";
406
+ } else if (type === "boolean") {
407
+ const b = toBool(words);
408
+ if (b == null) inner = esc(String(words));
409
+ else {
410
+ const { yes, no } = boolLabels(asColumn(column));
411
+ inner = `<span aria-hidden="true" class="bt-bool" data-bool="${b}">${b ? "✓" : "–"}</span><span class="bt-sr">${esc(b ? yes : no)}</span>`;
412
+ tail += ` data-value="${b}"`;
413
+ }
414
+ } else if (type === "rating") {
415
+ const n = toNumber(words);
416
+ if (n == null) inner = esc(String(words));
417
+ else {
418
+ inner = `<span aria-hidden="true" class="bt-star">★</span> ${esc(formatNumber(n, 1).replace(/\.0$/, ""))}<span class="bt-dim"> / ${column?.max ?? 5}</span>`;
419
+ tail += ` data-value="${n}"`;
420
+ }
421
+ } else if (type === "number" || type === "money") {
422
+ const n = toNumber(words);
423
+ inner = esc(typedWords(column, type, words));
424
+ if (n != null) tail += ` data-value="${n}"`;
425
+ }
426
+ const a = alignOf(column, type);
427
+ if (a !== "start") tail += ` data-align="${a}"`;
428
+ return {
429
+ lead: "",
430
+ tail,
431
+ ...inner === void 0 ? {} : { inner }
432
+ };
433
+ }
434
+ /** A typed cell read back (V2 readCell): data-empty is no value; data-value a number or true / false for a value type. */
435
+ function typedValueOf(cell, type) {
436
+ if (cell.hasAttribute("data-empty")) return "";
437
+ const raw = cell.getAttribute("data-value");
438
+ if (raw === null || !isValueType(type)) return void 0;
439
+ if (type === "boolean") return raw === "true";
440
+ return raw.trim() !== "" && Number.isFinite(Number(raw)) ? Number(raw) : void 0;
441
+ }
442
+ var typeAttrOf = (el) => storedType(el.getAttribute("data-type"));
209
443
  /**
210
444
  * Production's table markup → the table value, cell for cell (renderStoredTable's inverse): the plain `<table>`, or
211
445
  * the `<figure data-rt="table">` around one with its note. The V2 reader (parseTableElement) is not used here: it reads
@@ -225,23 +459,77 @@ function parseStoredTable(src) {
225
459
  t.headerRow = head.length > 0;
226
460
  t.headerColumn = body.length > 0 && body.every((tr) => tr.cells[0]?.tagName === "TH");
227
461
  t.caption = words(table.querySelector(":scope > caption"));
462
+ if (fig?.getAttribute("data-filter") === "true") t.filterable = true;
463
+ const resp = fig?.getAttribute("data-responsive");
464
+ if (resp === "stack" || resp === "cards") t.design = {
465
+ ...t.design,
466
+ responsive: resp
467
+ };
468
+ if (fig?.getAttribute("data-sticky") === "true") t.design = {
469
+ ...t.design,
470
+ sticky: true
471
+ };
472
+ const ld = fig?.getAttribute("data-jsonld");
473
+ if (ld === "ItemList" || ld === "Dataset" || ld === "Offers") {
474
+ const axis = fig?.getAttribute("data-jsonld-axis");
475
+ const price = fig?.getAttribute("data-jsonld-price");
476
+ t.jsonLd = {
477
+ type: ld,
478
+ ...axis === "rows" || axis === "columns" ? { axis } : {},
479
+ ...price ? { priceRow: price } : {}
480
+ };
481
+ }
482
+ const sortable = /* @__PURE__ */ new Set();
483
+ const settings = [];
484
+ let colAt = 0;
485
+ for (const g of Array.from(table.querySelectorAll(":scope > colgroup"))) {
486
+ const list = Array.from(g.querySelectorAll(":scope > col"));
487
+ if (!list.length) colAt += Math.max(1, Number(g.getAttribute("span")) || 1);
488
+ for (const col of list) {
489
+ const w = Math.max(1, Number(col.getAttribute("span")) || 1);
490
+ if (col.getAttribute("data-sortable") === "true") for (let i = 0; i < w; i++) sortable.add(colAt + i);
491
+ for (let i = 0; i < w; i++) settings[colAt + i] = colSettingsOf(col);
492
+ colAt += w;
493
+ }
494
+ }
228
495
  t.columns = Array.from({ length: width }, (_, i) => ({
229
496
  _key: tkey("c"),
230
497
  label: words(headCells[i]),
231
- type: "text"
498
+ ...settings[i],
499
+ type: settings[i]?.type ?? "text",
500
+ ...grid[0]?.cells[i]?.getAttribute("data-highlight") === "true" ? { highlight: true } : {},
501
+ ...sortable.has(i) ? { sortable: true } : {}
502
+ }));
503
+ const footnoteEls = Array.from(fig?.querySelectorAll("[data-footnotes] > li") ?? []);
504
+ if (footnoteEls.length) t.footnotes = footnoteEls.map((li) => ({
505
+ _key: li.getAttribute("data-key") || tkey("f"),
506
+ text: words(li)
232
507
  }));
233
- const cellOf = (cell) => {
508
+ const cellOf = (cell, col, rowType) => {
234
509
  if (!cell) return "";
235
510
  const { rest: c, marks } = splitMarks(cell);
511
+ let mark;
512
+ for (const sup of Array.from(c.querySelectorAll("sup"))) {
513
+ const n = /-fn-(\d+)$/.exec(sup.querySelector("a")?.getAttribute("href") ?? "")?.[1];
514
+ if (!n) continue;
515
+ mark ??= Number(n);
516
+ sup.remove();
517
+ }
518
+ const named = cell.getAttribute("data-note") ?? (mark ? t.footnotes?.[mark - 1]?._key : void 0);
519
+ const note = named && t.footnotes?.some((f) => f._key === named) ? named : void 0;
520
+ const own = typeAttrOf(cell);
521
+ const typed = typedValueOf(cell, own ?? rowType ?? col.type);
236
522
  const text = words(c);
237
523
  const a = c.children.length === 1 && c.firstElementChild?.tagName === "A" && c.firstElementChild.textContent?.trim() === text ? c.firstElementChild : null;
238
- const value = a ? {
524
+ const value = typed !== void 0 ? typed : a ? {
239
525
  label: text,
240
526
  href: a.getAttribute("href") ?? ""
241
527
  } : text;
242
- return marks ? {
528
+ return own || marks || note ? {
243
529
  value,
244
- marks
530
+ ...own ? { type: own } : {},
531
+ ...note ? { note } : {},
532
+ ...marks ? { marks } : {}
245
533
  } : value;
246
534
  };
247
535
  const groupOf = (list, own, prefix, label) => {
@@ -281,19 +569,26 @@ function parseStoredTable(src) {
281
569
  continue;
282
570
  }
283
571
  if (current && current.body !== tr.parentElement) current = void 0;
572
+ const footer = tr.parentElement?.tagName === "TFOOT";
573
+ const rowType = typeAttrOf(tr);
284
574
  t.rows.push({
285
575
  _key: tkey("r"),
286
- cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i])])),
287
- ...current ? { group: current.key } : {}
576
+ cells: Object.fromEntries(t.columns.map((col, i) => [col._key, cellOf(tr.cells[i], col, rowType)])),
577
+ ...rowType ? { type: rowType } : {},
578
+ ...current && !footer ? { group: current.key } : {},
579
+ ...footer ? { footer: true } : {},
580
+ ...tr.getAttribute("data-highlight") === "true" ? { highlight: true } : {}
288
581
  });
289
582
  }
290
583
  if (rowGroups.length) t.rowGroups = rowGroups;
291
- const note = fig?.querySelector(":scope > [data-notes]");
584
+ const note = fig?.querySelector(":scope > [data-notes], :scope > .bt-notes > [data-notes]");
585
+ const box = fig?.querySelector(":scope > .bt-notes");
292
586
  const notes = words(note);
293
587
  if (notes) t.notes = notes;
294
- const own = (note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
588
+ const own = (box?.getAttribute("id") ?? note?.getAttribute("id") ?? table.getAttribute("aria-describedby") ?? "").replace(/-notes$/, "");
295
589
  if (KEY.test(own)) t.id = own;
296
- t.columns.forEach((col) => {
590
+ t.columns.forEach((col, i) => {
591
+ if (settings[i]) return;
297
592
  const vals = t.rows.map((r) => r.cells[col._key]).filter((v) => v !== "");
298
593
  if (vals.length && vals.every((v) => isObjLike(v))) col.type = "link";
299
594
  });
@@ -304,19 +599,53 @@ function parseStoredTable(src) {
304
599
  * row in <thead>, header cells of the first column as <th>, every cell its text (a link cell its link). A caption, a
305
600
  * note or a group adds what that renderer writes for it, in the order the rows are held (an unedited stored table
306
601
  * 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.
602
+ * and is not written, as production's renderer writes none. The totals rows are a <tfoot> after every <tbody>; a
603
+ * highlighted row is `<tr data-highlight="true">` and a highlighted column `data-highlight="true"` on each of its cells
604
+ * (production 0.10, the V2 table's markup). A sortable column is its `<col data-sortable="true">` (one `<col>` per column,
605
+ * inside each column group's `<colgroup>`), and "Visitors can search rows" the figure's `data-filter="true"`.
308
606
  */
309
607
  function renderStoredTable(input) {
310
608
  const t = normalizeTable(input);
311
609
  const cols = t.columns;
312
- const cell = (row, c) => {
610
+ const settings = cols.map(columnSettings);
611
+ const typed = settings.some(Boolean) || t.rows.some((r) => !!storedType(r.type) || Object.values(r.cells).some((c) => isCellObject(c) && !!storedType(c.type)));
612
+ const cell = (row, c, i, header) => {
313
613
  const raw = row.cells[c._key];
314
614
  const v = cellValue(raw);
315
615
  const text = esc(cellText(c, row, raw));
316
616
  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;
617
+ const plain = (isObjLike(v) && typeof v.href === "string" && v.href ? `<a href="${escAttr(v.href)}">${text}</a>` : text) + marks;
618
+ const tag = header ? "th" : "td";
619
+ const fn = noted(row, c);
620
+ if (!typed) return `<${tag}${hi(c)}${fn.attr}>${plain}${fn.sup}</${tag}>`;
621
+ const view = typedCellView(settings[i], storedType(row.type), isCellObject(raw) ? storedType(raw.type) : void 0, isObjLike(v) ? cellText(c, row, raw) : v, header, false);
622
+ const tail = view.tail.replace(/( data-align="[^"]*")?$/, `${fn.attr}$1`);
623
+ return `<${tag}${view.lead}${hi(c)}${tail}>${view.inner === void 0 ? plain : view.inner + marks}${fn.sup}</${tag}>`;
318
624
  };
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>`;
625
+ const hi = (c) => c.highlight ? " data-highlight=\"true\"" : "";
626
+ const fnOf = new Map((t.footnotes ?? []).map((f, i) => [f._key, i + 1]));
627
+ const noted = (row, c) => {
628
+ const raw = row.cells[c._key];
629
+ const key = isCellObject(raw) ? raw.note : void 0;
630
+ const n = key ? fnOf.get(key) : void 0;
631
+ return n ? {
632
+ attr: ` data-note="${escAttr(key)}"`,
633
+ sup: `<sup><a href="#${escAttr(t.id ?? "tbl")}-fn-${n}" aria-label="Note ${n}">${n}</a></sup>`
634
+ } : {
635
+ attr: "",
636
+ sup: ""
637
+ };
638
+ };
639
+ 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>`;
640
+ const headRow = `<tr>${cols.map((c, i) => {
641
+ const view = typed ? typedCellView(settings[i], void 0, void 0, void 0, true, true) : {
642
+ lead: "",
643
+ tail: ""
644
+ };
645
+ return `<th${view.lead}${hi(c)}${view.tail}>${esc(c.label)}</th>`;
646
+ }).join("")}</tr>`;
647
+ const body = t.rows.filter((r) => !r.footer);
648
+ const tfoot = t.rows.some((r) => r.footer) ? `<tfoot>${t.rows.filter((r) => r.footer).map(rowHtml).join("")}</tfoot>` : "";
320
649
  const span = (name, n) => n > 1 ? ` ${name}="${n}"` : "";
321
650
  const colLabels = new Map((t.columnGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
322
651
  const rowLabels = new Map((t.rowGroups ?? []).map((g) => [g._key, String(g.label ?? "")]));
@@ -334,26 +663,39 @@ function renderStoredTable(input) {
334
663
  return out.some((r) => r.key !== void 0) ? out : [];
335
664
  };
336
665
  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);
666
+ const rowRuns = runs(body, (r) => r.group && rowLabels.has(r.group) ? r.group : void 0);
338
667
  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) {
668
+ const notes = (t.notes ?? "").trim();
669
+ const footnotes = t.footnotes ?? [];
670
+ const sortable = cols.some((c) => c.sortable) || settings.some(Boolean);
671
+ const filter = !!t.filterable;
672
+ const ld = t.jsonLd && t.jsonLd.type !== "none" ? t.jsonLd : null;
673
+ const resp = t.design?.responsive === "stack" || t.design?.responsive === "cards" ? t.design.responsive : null;
674
+ const sticky = !!t.design?.sticky;
675
+ if (!caption && !notes && !footnotes.length && !colRuns.length && !rowRuns.length && !sortable && !filter && !ld && !resp && !sticky && !typed) {
341
676
  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>`);
677
+ if (t.headerRow) out.push(`<thead>${headRow}</thead>`);
678
+ out.push(`${body.length || !tfoot ? `<tbody>${body.map(rowHtml).join("")}</tbody>` : ""}${tfoot}</table>`);
344
679
  return out.join("");
345
680
  }
346
- const notesId = notes ? `${t.id}-notes` : "";
681
+ const notesId = notes || footnotes.length ? `${t.id}-notes` : "";
347
682
  const out = [`<table${notesId ? ` aria-describedby="${escAttr(notesId)}"` : ""}>`];
348
683
  if (caption) out.push(`<caption>${esc(caption)}</caption>`);
349
- out.push(colRuns.map((r) => `<colgroup${span("span", r.items.length)}></colgroup>`).join(""));
684
+ if (sortable) {
685
+ let at = 0;
686
+ const widths = colRuns.length ? colRuns.map((r) => r.items.length) : [cols.length];
687
+ 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(""));
688
+ } else out.push(colRuns.map((r) => `<colgroup${span("span", r.items.length)}></colgroup>`).join(""));
350
689
  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>`);
690
+ if (groupRow || t.headerRow) out.push(`<thead>${groupRow}${t.headerRow ? headRow : ""}</thead>`);
352
691
  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>");
692
+ else if (body.length) out.push(`<tbody>${body.map(rowHtml).join("")}</tbody>`);
693
+ out.push(`${tfoot}</table>`);
355
694
  const html = out.join("");
356
- return notes ? `<figure data-rt="table">${html}<p data-notes id="${escAttr(notesId)}">${esc(notes)}</p></figure>` : html;
695
+ if (!notes && !footnotes.length && !filter && !ld && !resp && !sticky) return html;
696
+ const designAttrs = `${resp ? ` data-responsive="${resp}"` : ""}${sticky ? " data-sticky=\"true\"" : ""}`;
697
+ const ldAttrs = ld ? ` data-jsonld="${ld.type}"${ld.axis ? ` data-jsonld-axis="${ld.axis}"` : ""}${ld.priceRow ? ` data-jsonld-price="${escAttr(ld.priceRow)}"` : ""}` : "";
698
+ 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
699
  }
358
700
  /** The footnote markers closing a cell (`<sup data-footnote>` holding only text), and the cell without them. */
359
701
  function splitMarks(c) {
@@ -371,6 +713,7 @@ function splitMarks(c) {
371
713
  }
372
714
  /** A cell the table value can hold: text, line breaks, or one link around its text, then any footnote markers. */
373
715
  var plainCell = (cell) => {
716
+ if (cell.hasAttribute("data-value") || cell.hasAttribute("data-empty")) return true;
374
717
  const c = splitMarks(cell).rest;
375
718
  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
719
  };
@@ -469,6 +812,18 @@ function parseIsland(kind, el) {
469
812
  if (extra) m.extra = extra;
470
813
  return m;
471
814
  }
815
+ case "embed": {
816
+ const m = {};
817
+ const url = attrOf(el, "data-url");
818
+ const title = attrOf(el, "data-title");
819
+ const aspect = attrOf(el, "data-aspect");
820
+ if (url !== void 0) m.url = url;
821
+ if (title !== void 0) m.title = title;
822
+ if (aspect !== void 0 && EMBED_ASPECT_VALUES.includes(aspect)) m.aspect = aspect;
823
+ const extra = attrOf(el, "data-extra");
824
+ if (extra) m.extra = extra;
825
+ return m;
826
+ }
472
827
  case "file": {
473
828
  const m = {};
474
829
  const url = attrOf(el, "data-url");
@@ -541,7 +896,7 @@ function hydrate(root) {
541
896
  root.append(p);
542
897
  }
543
898
  }
544
- var BLOCK_TAGS = new Set([
899
+ var BLOCK_TAGS = /* @__PURE__ */ new Set([
545
900
  "P",
546
901
  "H1",
547
902
  "H2",
@@ -578,6 +933,7 @@ function serialize(root) {
578
933
  c.replaceWith(tpl.content);
579
934
  });
580
935
  clone.querySelectorAll("[data-hint]").forEach((n) => n.removeAttribute("data-hint"));
936
+ clone.querySelectorAll("ul[data-task] > li").forEach((li) => (li.removeAttribute("role"), li.removeAttribute("aria-checked")));
581
937
  while (clone.children.length > 1 && clone.lastElementChild && isEmptyP(clone.lastElementChild)) clone.lastElementChild.remove();
582
938
  const html = clone.innerHTML.replace(/​/g, "");
583
939
  return html === "<p><br></p>" || html === "<p></p>" ? "" : html;
@@ -603,7 +959,7 @@ function sanitize(html) {
603
959
  });
604
960
  return doc.body.innerHTML;
605
961
  }
606
- var TEXT_BLOCKS = new Set([
962
+ var TEXT_BLOCKS = /* @__PURE__ */ new Set([
607
963
  "P",
608
964
  "H1",
609
965
  "H2",
@@ -665,26 +1021,8 @@ function rangeRect(r, fallback) {
665
1021
  if (rect && (rect.width || rect.height)) return rect;
666
1022
  return ((r.startContainer.nodeType === 1 ? r.startContainer : r.startContainer.parentElement) ?? fallback ?? document.body).getBoundingClientRect();
667
1023
  }
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
1024
  var isEmptyHtml = (html) => !html.replace(/<(?!img|hr|figure|table|details|div data-rt)[^>]*>/g, "").replace(/&nbsp;/g, "").trim();
687
1025
  //#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 };
1026
+ 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
1027
 
690
1028
  //# sourceMappingURL=dom.js.map