@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
@@ -0,0 +1,42 @@
1
+ /**
2
+ * KIT LIBRARY — the benchmark set of website sections, modelled in our schema language.
3
+ * Every entry is: a real-world section → the schema we'd generate for it → realistic values → why it's modelled that way.
4
+ * The MCP/CLI uses these as the reference for "HTML section → schema + component" conversion (phase 2 exports them to Markdown).
5
+ */
6
+ import type { KitExample } from "./examples";
7
+ import type { TypeSchema } from "../schema/types";
8
+ export type KitCategory = "Navigation & chrome" | "Heroes" | "Features & storytelling" | "Social proof" | "Media & galleries" | "Commerce" | "Pricing & plans" | "Conversion & forms" | "Listings & feeds" | "Long-form & docs" | "Company & people" | "Events & places" | "Data & interactive" | "Advanced patterns";
9
+ /** Edge cases an entry exercises — the filter chips on the kit page. */
10
+ export type EdgeTag = "deep-nesting" | "polymorphic-array" | "slots" | "conditional" | "references" | "global-synced" | "localized" | "rich-text" | "media-heavy" | "variants" | "repeater" | "validation" | "dynamic-query" | "personalization" | "embed" | "form" | "commerce" | "seo-structured" | "a11y" | "responsive-layout";
11
+ export interface KitModelNotes {
12
+ /** One paragraph: why the schema is shaped this way (what's an object vs array vs reference, what's global, what's design). */
13
+ why: string;
14
+ /** How Sanity would model the same thing (type names), so the team can compare. */
15
+ sanity?: string;
16
+ /** What in raw HTML tells the converter this is this section (DOM/visual signals). */
17
+ htmlSignals: string[];
18
+ /** Instructions for the MCP/CLI converter: field mapping, what to extract, what to leave as design. */
19
+ mcp: string;
20
+ /** Known pitfalls / edge cases this entry exists to catch. */
21
+ pitfalls?: string[];
22
+ }
23
+ /**
24
+ * How the Kit Library's schematic preview arranges the section (optional — it infers from the variant, the
25
+ * schema name and the field shapes when unset). Set it when the inference would be wrong.
26
+ */
27
+ export type KitPreviewLayout = "split" | "split-reverse" | "centered" | "grid-2" | "grid-3" | "grid-4" | "list" | "carousel" | "table" | "form" | "nav" | "footer" | "banner" | "accordion" | "tabs" | "bento" | "stats" | "logos" | "gallery" | "media" | "article" | "timeline";
28
+ export interface KitEntry extends KitExample {
29
+ category: KitCategory;
30
+ tags: EdgeTag[];
31
+ notes: KitModelNotes;
32
+ /** Brand of the realistic sample (Caldera by default; others allowed for variety). */
33
+ brand?: string;
34
+ /** Optional preview arrangement hint for the Kit Library (inferred when unset). */
35
+ previewLayout?: KitPreviewLayout;
36
+ /**
37
+ * Entry-local block types that this entry's SLOTS may hold (e.g. a Columns or Accordion block that is not in
38
+ * the example BLOCK_LIBRARY). The kit page must resolve slot children against these first, then the library —
39
+ * otherwise drill-in stops at the first unknown `_type`.
40
+ */
41
+ blocks?: TypeSchema[];
42
+ }
File without changes
@@ -1,4 +1,4 @@
1
- //#region src/kit/schema/adapters.ts
1
+ //#region src/schema/adapters.ts
2
2
  var isObj = (v) => !!v && typeof v === "object" && !Array.isArray(v);
3
3
  var options = (o) => o?.map((x) => ({
4
4
  value: x,
@@ -297,7 +297,6 @@ function propDefToFieldBase(p, sample) {
297
297
  }]
298
298
  };
299
299
  }
300
- default: break;
301
300
  }
302
301
  return {
303
302
  ...base,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","names":[],"sources":["../../src/schema/adapters.ts"],"sourcesContent":["/**\n * ADAPTERS — today's field definitions → the Block Kit schema, so each editor switches to <SchemaForm> in one line.\n *\n * Visuals inspector: <SchemaForm schema={blockDefToSchema(def)} value={block.props} onChange={…} />\n * Content editor: <SchemaForm schema={fieldDefsToSchema(collection.fields, { values })} … />\n *\n * Both catalogs are loose (repeaters without item fields, links stored as strings); the adapters infer item\n * fields from sample values and mark legacy string values with `valueShape: \"string\"` so data round-trips\n * unchanged.\n */\nimport type { BlockDef, FieldDef, FieldType, PropDef } from \"./sources\";\nimport type { FieldGroup, FieldSchema, Option, TypeSchema } from \"./types\";\n\ntype Obj = Record<string, unknown>;\nconst isObj = (v: unknown): v is Obj => !!v && typeof v === \"object\" && !Array.isArray(v);\nconst options = (o?: string[]): Option[] | undefined => o?.map((x) => ({ value: x, label: x }));\n\n/** Nice titles for inferred keys (\"q\" → \"Question\"). */\nconst TITLES: Record<string, string> = {\n q: \"Question\", a: \"Answer\", href: \"Link\", url: \"Link\", cta: \"Button\", img: \"Image\", desc: \"Description\", qty: \"Amount\",\n featured: \"Highlighted\", note: \"Note\", links: \"Links\", price: \"Price\", name: \"Name\", title: \"Title\", label: \"Label\",\n};\nexport const titleFromKey = (k: string) => TITLES[k] ?? (k.charAt(0).toUpperCase() + k.slice(1)).replace(/([a-z])([A-Z])/g, \"$1 $2\").replace(/[_-]/g, \" \").replace(/ (\\w)/g, (m) => m.toLowerCase());\nconst looksLikeImage = (k: string, v: unknown) => typeof v === \"string\" && (/\\b(image|img|photo|cover|avatar|logo)\\b/i.test(k) || /picsum|\\.(jpe?g|png|webp|avif|svg)(\\?|$)/.test(v));\n\n/** Infer a field from a sample value (used for repeaters/groups without declared fields). */\nexport function inferField(key: string, sample: unknown): FieldSchema {\n const title = titleFromKey(key);\n if (Array.isArray(sample)) {\n const first = sample[0];\n if (isObj(first)) return { name: key, title, type: \"array\", of: [inferItem(key, first)] };\n if (typeof first === \"string\" && sample.every((x) => looksLikeImage(key, x)) && sample.length)\n return { name: key, title, type: \"array\", of: [{ name: \"image\", title: \"Image\", type: \"image\", valueShape: \"string\" }] };\n return { name: key, title, type: \"array\", layout: \"list\", of: [{ name: \"value\", title: singular(title), type: \"string\" }] };\n }\n if (typeof sample === \"boolean\") return { name: key, title, type: \"boolean\" };\n if (typeof sample === \"number\") return { name: key, title, type: \"number\" };\n if (looksLikeImage(key, sample)) return { name: key, title, type: \"image\", valueShape: \"string\" };\n if (isObj(sample)) {\n if (\"href\" in sample && \"label\" in sample) return { name: key, title, type: \"button\" };\n if (\"href\" in sample) return { name: key, title, type: \"link\" };\n if (\"url\" in sample) return { name: key, title, type: \"image\" };\n return { name: key, title, type: \"object\", fields: Object.entries(sample).filter(([k]) => !k.startsWith(\"_\")).map(([k, v]) => inferField(k, v)) };\n }\n if (key === \"href\" || key === \"link\") return { name: key, title, type: \"link\", valueShape: \"string\" };\n if (typeof sample === \"string\" && /<\\/?(p|h\\d|ul|ol|strong|em)\\b/.test(sample)) return { name: key, title, type: \"richtext\" };\n if (typeof sample === \"string\" && sample.length > 60) return { name: key, title, type: \"text\" };\n return { name: key, title, type: \"string\" };\n}\nfunction inferItem(arrayKey: string, sample: Obj): FieldSchema {\n const fields = Object.entries(sample).filter(([k]) => !k.startsWith(\"_\")).map(([k, v]) => inferField(k, v));\n const first = fields.find((f) => f.type === \"string\" || f.type === \"text\");\n const second = fields.find((f) => f !== first && (f.type === \"string\" || f.type === \"text\" || f.type === \"richtext\"));\n const media = fields.find((f) => f.type === \"image\");\n return {\n name: `${arrayKey}Item`,\n title: singular(titleFromKey(arrayKey)),\n type: \"object\",\n fields,\n preview: { title: first?.name, subtitle: second?.name, media: media?.name },\n };\n}\nconst cap = (t: string) => t.charAt(0).toUpperCase() + t.slice(1);\nconst singular = (t: string) => (t.endsWith(\"ies\") ? `${t.slice(0, -3)}y` : t.endsWith(\"s\") && !t.endsWith(\"ss\") ? t.slice(0, -1) : t);\n\n/* ── Visuals catalog (PropDef) → FieldSchema ─────────────────────────── */\nexport function propDefToField(p: PropDef, sample?: unknown): FieldSchema {\n const f = propDefToFieldBase(p, sample);\n // D45 organisation + conditions + array nouns ride along on every type\n return {\n ...f,\n ...(p.fieldset ? { fieldset: p.fieldset } : {}),\n ...(p.showIf ? { hidden: { field: p.showIf.key, equals: p.showIf.equals } } : {}),\n ...(p.itemNoun ? { itemNoun: p.itemNoun } : {}),\n ...(p.placeholder ? { placeholder: p.placeholder } : {}),\n ...(p.min != null && f.type === \"array\" ? { validation: { ...f.validation, min: p.min } } : {}),\n ...(p.max != null && f.type === \"array\" ? { validation: { ...f.validation, max: p.max } } : {}),\n };\n}\n\nfunction propDefToFieldBase(p: PropDef, sample?: unknown): FieldSchema {\n const base = { name: p.key, title: p.label, description: p.help, helpMore: p.helpMore, group: p.group?.toLowerCase() } satisfies Partial<FieldSchema>;\n const max = p.max ? { max: p.max } : undefined;\n switch (p.type) {\n case \"list\":\n // D47: one-line items are an array of strings, never tags\n return { ...base, type: \"array\", layout: \"list\", of: [{ name: \"value\", title: p.itemNoun ? cap(p.itemNoun) : singular(p.label), type: \"string\" }] };\n case \"icon\":\n return { ...base, type: \"icon\" };\n case \"boolean\":\n return { ...base, type: \"boolean\" };\n case \"references\":\n return { ...base, type: \"array\", validation: { unique: true }, of: [{ name: `${p.key}Ref`, title: singular(p.label), type: \"reference\", reference: { to: [p.reference ?? \"page\"] } }] };\n case \"group\": {\n const first = isObj(sample) ? sample : undefined;\n if (!p.item?.length) break;\n return { ...base, type: \"object\", fields: p.item.map((x) => propDefToField(x, first?.[x.key])) };\n }\n case \"text\":\n return { ...base, type: \"string\", validation: max, ai: true };\n case \"textarea\":\n return { ...base, type: \"text\", validation: max, ai: true };\n case \"richtext\":\n return { ...base, type: \"richtext\", ai: true };\n case \"image\":\n return { ...base, type: \"image\", valueShape: typeof sample === \"string\" ? \"string\" : undefined };\n case \"gallery\":\n return { ...base, type: \"array\", of: [{ name: \"image\", title: \"Image\", type: \"image\", valueShape: \"string\" }] };\n case \"link\":\n return { ...base, type: \"link\", valueShape: typeof sample === \"string\" ? \"string\" : undefined };\n case \"button\":\n return { ...base, type: \"button\" };\n case \"tags\":\n return { ...base, type: \"tags\" };\n case \"select\":\n return { ...base, type: \"select\", options: options(p.options) };\n case \"number\":\n return { ...base, type: \"number\" };\n case \"table\":\n return { ...base, type: \"table\", validation: { required: true } };\n case \"reference\":\n return { ...base, type: \"reference\", reference: { to: [p.reference ?? (p.key === \"form\" ? \"form\" : p.key === \"collection\" ? \"collection\" : \"page\")] } };\n case \"repeater\": {\n const items = Array.isArray(sample) ? sample : [];\n const first = items.find(isObj);\n const fields = p.item?.length ? p.item.map((x) => propDefToField(x, first?.[x.key])) : first ? inferItem(p.key, first).fields! : [{ name: \"label\", title: \"Label\", type: \"string\" as const }];\n const t = fields.find((f) => f.type === \"string\" || f.type === \"text\");\n const s = fields.find((f) => f !== t && (f.type === \"string\" || f.type === \"text\" || f.type === \"richtext\"));\n return {\n ...base,\n type: \"array\",\n of: [{ name: `${p.key}Item`, title: p.itemNoun ? cap(p.itemNoun) : singular(p.label), type: \"object\", fields, icon: undefined, preview: { title: t?.name, subtitle: s?.name, media: fields.find((f) => f.type === \"image\")?.name } }],\n };\n }\n default:\n break;\n }\n return { ...base, ...inferField(p.key, sample), title: p.label };\n}\n\n/** A visual-editor block definition → TypeSchema. Groups appear only when props use more than one group. */\nexport function blockDefToSchema(def: BlockDef): TypeSchema {\n const fields = def.content.map((p) => propDefToField(p, def.defaults[p.key]));\n const used = Array.from(new Set(fields.map((f) => f.group ?? \"content\")));\n const groups: FieldGroup[] | undefined =\n used.length > 1 ? used.map((g, i) => ({ name: g, title: g.charAt(0).toUpperCase() + g.slice(1), default: g === \"content\" || i === 0 })) : undefined;\n return {\n name: def.type,\n title: def.name,\n kind: def.global ? \"global\" : \"block\",\n icon: def.icon,\n category: def.category,\n ...(def.placement ? { placement: def.placement } : {}),\n description: def.description,\n variants: def.variants,\n initialValue: def.defaults,\n groups,\n ...(def.fieldsets?.length ? { fieldsets: def.fieldsets.map((f) => ({ name: f.name, title: f.title, collapsed: f.collapsed, columns: f.columns })) } : {}),\n fields: groups ? fields.map((f) => ({ ...f, group: f.group ?? \"content\" })) : fields.map(({ group: _g, ...f }) => f),\n };\n}\n\n/* ── Content collections (FieldDef) → FieldSchema ────────────────────── */\nconst SIMPLE: Partial<Record<FieldType, FieldSchema[\"type\"]>> = {\n text: \"string\", textarea: \"text\", richtext: \"richtext\", slug: \"slug\", boolean: \"boolean\", date: \"date\", datetime: \"datetime\",\n image: \"image\", file: \"file\", video: \"video\", link: \"link\", button: \"button\", color: \"color\", json: \"json\", code: \"code\",\n email: \"email\", url: \"url\", location: \"geopoint\", rating: \"rating\", tags: \"tags\", table: \"table\",\n};\n\nexport function fieldDefToSchema(def: FieldDef, sample?: unknown): FieldSchema {\n const base: FieldSchema = {\n name: def.id,\n title: def.name,\n type: \"string\",\n description: def.help,\n helpMore: def.helpMore,\n localized: def.localized,\n validation: def.required || def.max ? { required: def.required, max: def.max } : undefined,\n };\n const simple = SIMPLE[def.type];\n if (simple) {\n const f: FieldSchema = { ...base, type: simple };\n if (simple === \"string\" || simple === \"text\" || simple === \"richtext\") f.ai = true;\n if (simple === \"image\" && typeof sample === \"string\") f.valueShape = \"string\";\n if (simple === \"link\" && typeof sample === \"string\") f.valueShape = \"string\";\n return f;\n }\n switch (def.type) {\n case \"number\": {\n const unit = def.help && def.help.length < 14 ? def.help : def.id === \"price\" ? \"USD\" : undefined;\n return { ...base, type: \"number\", description: unit ? undefined : def.help, numeric: unit ? { unit } : undefined };\n }\n case \"select\":\n return { ...base, type: \"select\", options: options(def.options) };\n case \"multiselect\":\n return { ...base, type: \"multiselect\", options: options(def.options) };\n case \"reference\":\n return { ...base, type: \"reference\", reference: { to: [def.id === \"form\" ? \"form\" : def.id === \"collection\" && !def.reference ? \"collection\" : def.reference ?? \"page\"] } };\n case \"references\":\n return { ...base, type: \"array\", of: [{ name: `${def.id}Ref`, title: singular(def.name), type: \"reference\", reference: { to: [def.reference ?? \"page\"] } }] };\n case \"gallery\":\n return { ...base, type: \"array\", arrayLayout: \"grid\", of: [{ name: \"image\", title: \"Image\", type: \"image\" }] };\n case \"group\":\n return { ...base, type: \"object\", fields: (def.fields ?? []).map((f) => fieldDefToSchema(f, isObj(sample) ? sample[f.id] : undefined)) };\n case \"repeater\": {\n const items = Array.isArray(sample) ? sample : [];\n const first = items.find(isObj);\n const fields = def.fields?.length\n ? def.fields.map((f) => fieldDefToSchema(f, first?.[f.id]))\n : first\n ? inferItem(def.id, first).fields!\n : def.id === \"ingredients\"\n ? [{ name: \"item\", title: \"Ingredient\", type: \"string\" as const }, { name: \"qty\", title: \"Amount\", type: \"string\" as const }]\n : [{ name: \"label\", title: \"Label\", type: \"string\" as const }, { name: \"value\", title: \"Value\", type: \"string\" as const }];\n const t = fields.find((f) => f.type === \"string\" || f.type === \"text\");\n const s = fields.find((f) => f !== t && (f.type === \"string\" || f.type === \"text\"));\n return { ...base, type: \"array\", validation: def.required ? { required: true } : undefined, of: [{ name: `${def.id}Item`, title: singular(def.name), type: \"object\", fields, preview: { title: t?.name, subtitle: s?.name } }] };\n }\n default:\n return { ...base, ...inferField(def.id, sample), title: def.name };\n }\n}\n\n/** A collection's (or page's) field list → TypeSchema for the document editor. */\nexport function fieldDefsToSchema(fields: FieldDef[], opts: { name?: string; title?: string; values?: Obj; kind?: TypeSchema[\"kind\"] } = {}): TypeSchema {\n return {\n name: opts.name ?? \"document\",\n title: opts.title ?? \"Fields\",\n kind: opts.kind ?? \"entry\",\n fields: fields.map((f) => fieldDefToSchema(f, opts.values?.[f.id])),\n };\n}\n"],"mappings":"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"}
@@ -20,6 +20,8 @@
20
20
  */
21
21
  import type { FieldSchema } from "./types";
22
22
  /** The convention for a field, or undefined. Does not look at `description`; callers decide precedence. */
23
+ /** Every help line the kit itself may print — the tone test's seam, not the rule tables. */
24
+ export declare const HELP_STRINGS: readonly string[];
23
25
  export declare function conventionalHelp(field: Pick<FieldSchema, "name" | "type">): string | undefined;
24
26
  /** Help for a field following D39 precedence. `computed` is the field's own derived line (slug, number range). */
25
27
  export declare function resolveHelp(field: FieldSchema, computed?: string): string | undefined;
@@ -1,4 +1,4 @@
1
- //#region src/kit/schema/help.ts
1
+ //#region src/schema/help.ts
2
2
  var TEXT = ["string", "text"];
3
3
  /** Conventions by field name. Each says something the label and the control cannot. */
4
4
  var RULES = [
@@ -10,12 +10,12 @@ var RULES = [
10
10
  {
11
11
  names: ["alt"],
12
12
  types: TEXT,
13
- help: "Not shown. Read by screen readers and search engines."
13
+ help: "Read by screen readers and search engines, not shown on the page."
14
14
  },
15
15
  {
16
16
  names: ["anchor"],
17
17
  types: TEXT,
18
- help: "Lowercase, no spaces. Links like /about#team jump here."
18
+ help: "Lowercase with no spaces, so links like /about#team can jump here."
19
19
  },
20
20
  {
21
21
  names: ["coverImage", "cover"],
@@ -40,6 +40,8 @@ var RULES = [
40
40
  /** Conventions by field TYPE (any name). Only consequences the editor cannot see; no advice, no restating. */
41
41
  var BY_TYPE = { slug: "Once live, changing it offers a redirect from the old address." };
42
42
  /** The convention for a field, or undefined. Does not look at `description`; callers decide precedence. */
43
+ /** Every help line the kit itself may print — the tone test's seam, not the rule tables. */
44
+ var HELP_STRINGS = [...RULES.map((r) => r.help), ...Object.values(BY_TYPE)];
43
45
  function conventionalHelp(field) {
44
46
  return RULES.find((r) => r.names.includes(field.name) && (!r.types || r.types.includes(field.type)))?.help ?? BY_TYPE[field.type];
45
47
  }
@@ -49,6 +51,6 @@ function resolveHelp(field, computed) {
49
51
  return computed ?? conventionalHelp(field);
50
52
  }
51
53
  //#endregion
52
- export { conventionalHelp, resolveHelp };
54
+ export { HELP_STRINGS, conventionalHelp, resolveHelp };
53
55
 
54
56
  //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","names":[],"sources":["../../src/schema/help.ts"],"sourcesContent":["/**\n * FIELD HELP — CPO D39, narrowed by D51 \"Help text is the exception\". One place for the grey line under a label.\n *\n * Precedence (first match wins):\n * 1. `field.description` written on the schema. `\"\"` opts out on purpose.\n * 2. A computed line from the field's own settings (slug before publish, number ranges).\n * 3. A convention from this file, matched on field NAME + TYPE. Only facts that are true for that field in every\n * block live here, and only facts the editor cannot see from the label and the control.\n *\n * The rule (D51, enforced by scripts/brain/check-help.ts):\n * - Most fields get NO help. Ask: \"Does the editor need this to type the right value?\" If no, no help.\n * - Allowed: a non-obvious format or unit (\"In minutes.\", \"A .vtt file.\"), where it shows when the canvas can't\n * show it (\"Shown in search results.\"), a real constraint or consequence (\"Changing it once live breaks links.\"),\n * a fallback (\"Leave empty to use the page title.\").\n * - Never: restating the label, writing advice (\"Keep it short\", \"Start with a verb\", \"2–4 words\"), marketing\n * theory, internal or design-system notes (\"Label and link are one unit\"), examples that belong in `placeholder`.\n * - Length guidance is a counter (`validation.max` / `recommendedMax`), never a sentence.\n * - One short sentence, under 90 characters, no em dash. Anything longer goes in `helpMore` (the ⓘ), sparingly.\n * - No type-wide defaults: a heading, a button or an image gets nothing just for being one.\n */\nimport type { FieldSchema } from \"./types\";\n\ntype Rule = { names: string[]; types?: FieldSchema[\"type\"][]; help: string };\n\nconst TEXT: FieldSchema[\"type\"][] = [\"string\", \"text\"];\n\n/** Conventions by field name. Each says something the label and the control cannot. */\nconst RULES: Rule[] = [\n { names: [\"excerpt\", \"summary\"], types: TEXT, help: \"Shown on cards and in search results.\" },\n { names: [\"alt\"], types: TEXT, help: \"Read by screen readers and search engines, not shown on the page.\" },\n // No SEO conventions (metaTitle, metaDescription, canonical, noindex, schemaType): SEO is native, never a modelled field.\n { names: [\"anchor\"], types: TEXT, help: \"Lowercase with no spaces, so links like /about#team can jump here.\" },\n { names: [\"coverImage\", \"cover\"], types: [\"image\"], help: \"Also used on cards and in link previews.\" },\n { names: [\"published\", \"publishedAt\", \"publishDate\"], types: [\"date\", \"datetime\"], help: \"Also used to sort lists.\" },\n { names: [\"readingTime\"], types: [\"number\"], help: \"In minutes.\" },\n];\n\n/** Conventions by field TYPE (any name). Only consequences the editor cannot see; no advice, no restating. */\nconst BY_TYPE: Partial<Record<FieldSchema[\"type\"], string>> = {\n slug: \"Once live, changing it offers a redirect from the old address.\",\n};\n\n/** The convention for a field, or undefined. Does not look at `description`; callers decide precedence. */\n/** Every help line the kit itself may print — the tone test's seam, not the rule tables. */\nexport const HELP_STRINGS: readonly string[] = [...RULES.map((r) => r.help), ...Object.values(BY_TYPE)];\n\nexport function conventionalHelp(field: Pick<FieldSchema, \"name\" | \"type\">): string | undefined {\n const rule = RULES.find((r) => r.names.includes(field.name) && (!r.types || r.types.includes(field.type)));\n return rule?.help ?? BY_TYPE[field.type];\n}\n\n/** Help for a field following D39 precedence. `computed` is the field's own derived line (slug, number range). */\nexport function resolveHelp(field: FieldSchema, computed?: string): string | undefined {\n if (field.description !== undefined) return field.description || undefined; // \"\" = deliberately none\n return computed ?? conventionalHelp(field);\n}\n"],"mappings":";AAwBA,IAAM,OAA8B,CAAC,UAAU,MAAM;;AAGrD,IAAM,QAAgB;CACpB;EAAE,OAAO,CAAC,WAAW,SAAS;EAAG,OAAO;EAAM,MAAM;CAAwC;CAC5F;EAAE,OAAO,CAAC,KAAK;EAAG,OAAO;EAAM,MAAM;CAAoE;CAEzG;EAAE,OAAO,CAAC,QAAQ;EAAG,OAAO;EAAM,MAAM;CAAqE;CAC7G;EAAE,OAAO,CAAC,cAAc,OAAO;EAAG,OAAO,CAAC,OAAO;EAAG,MAAM;CAA2C;CACrG;EAAE,OAAO;GAAC;GAAa;GAAe;EAAa;EAAG,OAAO,CAAC,QAAQ,UAAU;EAAG,MAAM;CAA2B;CACpH;EAAE,OAAO,CAAC,aAAa;EAAG,OAAO,CAAC,QAAQ;EAAG,MAAM;CAAc;AACnE;;AAGA,IAAM,UAAwD,EAC5D,MAAM,iEACR;;;AAIA,IAAa,eAAkC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,IAAI,GAAG,GAAG,OAAO,OAAO,OAAO,CAAC;AAEtG,SAAgB,iBAAiB,OAA+D;CAE9F,OADa,MAAM,MAAM,MAAM,EAAE,MAAM,SAAS,MAAM,IAAI,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,SAAS,MAAM,IAAI,EAChG,CAAA,EAAM,QAAQ,QAAQ,MAAM;AACrC;;AAGA,SAAgB,YAAY,OAAoB,UAAuC;CACrF,IAAI,MAAM,gBAAgB,KAAA,GAAW,OAAO,MAAM,eAAe,KAAA;CACjE,OAAO,YAAY,iBAAiB,KAAK;AAC3C"}
@@ -1,4 +1,4 @@
1
- //#region src/kit/schema/scale.ts
1
+ //#region src/schema/scale.ts
2
2
  var SCALE_UNITS = [
3
3
  "px",
4
4
  "%",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.js","names":[],"sources":["../../src/schema/scale.ts"],"sourcesContent":["/**\n * SCALES (CPO D41) — the logic behind \"fixed steps, with an optional custom escape hatch\".\n * Pure functions: the Block Kit control, the Visuals Design tab and site renderers all read values through here,\n * so a token, a stepped number and a custom size resolve the same way everywhere.\n *\n * Stored shapes (see `ScaleValue` in ./types):\n * \"xl\" → token (developers map it to their design system)\n * 15 → number on a stepped range, in the scale's default unit\n * { value: 200, unit: \"px\" } → custom (only when the field allows custom)\n */\nimport type { FieldSchema, ScaleCustomValue, ScaleRange, ScaleSchema, ScaleStep, ScaleUnit, ScaleValue } from \"./types\";\n\nexport const SCALE_UNITS: ScaleUnit[] = [\"px\", \"%\", \"rem\", \"em\", \"vw\", \"vh\"];\nconst isUnit = (u: unknown): u is ScaleUnit => typeof u === \"string\" && (SCALE_UNITS as string[]).includes(u);\n\n/** Spoken unit names for aria-valuetext (\"48 pixels\"). */\nconst UNIT_WORDS: Record<ScaleUnit, [one: string, many: string]> = {\n px: [\"pixel\", \"pixels\"],\n \"%\": [\"percent\", \"percent\"],\n rem: [\"rem\", \"rem\"],\n em: [\"em\", \"em\"],\n vw: [\"percent of the screen width\", \"percent of the screen width\"],\n vh: [\"percent of the screen height\", \"percent of the screen height\"],\n};\nexport const UNIT_NAMES: Record<ScaleUnit, string> = { px: \"Pixels\", \"%\": \"Percent\", rem: \"Root em\", em: \"Em\", vw: \"Screen width\", vh: \"Screen height\" };\n\nexport const isCustomValue = (v: unknown): v is ScaleCustomValue =>\n !!v && typeof v === \"object\" && typeof (v as ScaleCustomValue).value === \"number\" && isUnit((v as ScaleCustomValue).unit);\nexport const isTokenScale = (s: ScaleSchema): s is ScaleSchema & { steps: ScaleStep[] } => Array.isArray(s.steps);\nexport const rangeOf = (s: ScaleSchema): ScaleRange | null => (Array.isArray(s.steps) ? null : s.steps);\n\n/** Back-compat: `layout: \"slider\"` + `numeric: { min, max, step, unit }` → a fixed-only range scale. */\nexport function fieldScale(field: Pick<FieldSchema, \"scale\" | \"layout\" | \"numeric\">): ScaleSchema | null {\n if (field.scale) return field.scale;\n const n = field.numeric;\n if (field.layout === \"slider\" && n?.min != null && n?.max != null) {\n return { steps: { min: n.min, max: n.max, step: n.step ?? 1 }, units: isUnit(n.unit) ? [n.unit] : undefined };\n }\n return null;\n}\n\nexport const defaultUnit = (s: ScaleSchema): ScaleUnit | undefined => s.defaultUnit ?? s.units?.[0];\n\n/** The custom rules, or null when the field is fixed only. */\nexport function customRules(s: ScaleSchema) {\n if (!s.allowCustom) return null;\n const c = s.allowCustom === true ? {} : s.allowCustom;\n const units = c.units ?? s.units ?? [\"px\"];\n const pick = (b: typeof c.min, u: ScaleUnit) => (typeof b === \"number\" ? b : b?.[u]);\n return {\n units,\n step: c.step ?? 1,\n min: (u: ScaleUnit) => pick(c.min, u),\n max: (u: ScaleUnit) => pick(c.max, u),\n };\n}\n\nconst decimals = (n: number) => (String(n).split(\".\")[1] ?? \"\").length;\nexport function roundTo(n: number, step: number) {\n return Number((Math.round(n / step) * step).toFixed(Math.max(decimals(step), 0)));\n}\n\n/** Readable number + unit: \"200px\", \"15%\", \"1.5rem\", \"4.9\". */\nexport function formatNumber(n: number, unit?: string) {\n const t = Number.isInteger(n) ? String(n) : String(Number(n.toFixed(3)));\n if (!unit) return t;\n return isUnit(unit) ? `${t}${unit}` : `${t} ${unit}`;\n}\n\n/** px for a custom value when it can be known without layout (px, rem/em at 16). */\nexport function customPx(v: ScaleCustomValue): number | undefined {\n if (v.unit === \"px\") return v.value;\n if (v.unit === \"rem\" || v.unit === \"em\") return v.value * 16;\n return undefined;\n}\n\nexport interface ResolvedScale {\n kind: \"token\" | \"number\" | \"custom\" | \"empty\";\n /** short readout: \"XL\", \"15%\", \"200px\" */\n label: string;\n /** long name: \"Extra large\", \"15%\", \"Custom\" */\n title: string;\n /** CSS to emit (\"48px\", \"15%\", \"200px\", or a step's css) */\n css?: string;\n px?: number;\n /** token index (token scales) */\n index?: number;\n /** spoken value for aria-valuetext: \"Extra large, 48 pixels\" */\n spoken: string;\n}\n\nfunction spokenNumber(n: number, unit?: string) {\n if (!unit) return String(n);\n if (!isUnit(unit)) return `${n} ${unit}`;\n const [one, many] = UNIT_WORDS[unit];\n return `${n} ${n === 1 ? one : many}`;\n}\n\n/** Resolve any stored value against its scale. Unknown tokens fall back to \"empty\" (never throws). */\nexport function resolveScale(s: ScaleSchema, v: unknown, legacyUnit?: string): ResolvedScale {\n if (isCustomValue(v)) {\n const px = customPx(v);\n return { kind: \"custom\", label: formatNumber(v.value, v.unit), title: \"Custom\", css: `${v.value}${v.unit}`, px, spoken: `Custom, ${spokenNumber(v.value, v.unit)}` };\n }\n if (isTokenScale(s)) {\n const i = s.steps.findIndex((st) => st.value === v);\n if (i < 0) return { kind: \"empty\", label: \"—\", title: \"Not set\", spoken: \"Not set\" };\n const st = s.steps[i];\n const title = st.title ?? st.label;\n const css = st.css ?? (st.px != null ? `${st.px}px` : undefined);\n return { kind: \"token\", label: st.label, title, css, px: st.px, index: i, spoken: st.px != null ? `${title}, ${spokenNumber(st.px, \"px\")}` : st.css ? `${title}, ${st.css}` : title };\n }\n const unit = defaultUnit(s) ?? legacyUnit;\n const n = typeof v === \"number\" ? v : typeof v === \"string\" && v.trim() !== \"\" && !Number.isNaN(Number(v)) ? Number(v) : null;\n if (n == null) return { kind: \"empty\", label: \"—\", title: \"Not set\", spoken: \"Not set\" };\n const css = isUnit(unit) ? `${n}${unit}` : String(n);\n return { kind: \"number\", label: formatNumber(n, unit), title: formatNumber(n, unit), css, px: unit === \"px\" ? n : undefined, spoken: spokenNumber(n, unit) };\n}\n\n/** CSS for a stored value — what a site renderer emits. */\nexport const scaleCss = (s: ScaleSchema, v: unknown) => resolveScale(s, v).css;\n\n/** \"XL · 48px\" — the hint shown for a token. */\nexport function scaleHint(r: ResolvedScale) {\n if (r.kind === \"token\") return r.css ? `${r.title} · ${r.css}` : r.title;\n if (r.kind === \"custom\") return `Custom · ${r.label}`;\n return r.title;\n}\n\n/** Index of the token nearest to a custom value (by px), or -1 when it can't be placed. */\nexport function nearestTokenIndex(s: ScaleSchema, v: ScaleCustomValue): number {\n if (!isTokenScale(s)) return -1;\n const px = customPx(v);\n if (px == null) return -1;\n let best = -1;\n let d = Infinity;\n s.steps.forEach((st, i) => {\n if (st.px == null) return;\n const dd = Math.abs(st.px - px);\n if (dd < d) (d = dd), (best = i);\n });\n return best;\n}\n\nexport type ParseResult = { ok: true; value: ScaleValue } | { ok: false; error: string };\n\n/** Validate a custom value against the field's custom rules. Returns a plain-words error or null. */\nexport function validateCustom(s: ScaleSchema, v: ScaleCustomValue): string | null {\n const c = customRules(s);\n if (!c) return \"Pick a value on the scale.\";\n if (!c.units.includes(v.unit)) return `Use ${listUnits(c.units)}.`;\n const lo = c.min(v.unit);\n const hi = c.max(v.unit);\n if ((lo != null && v.value < lo) || (hi != null && v.value > hi)) {\n if (lo != null && hi != null) return `Use ${formatNumber(lo)}–${formatNumber(hi, v.unit)}.`;\n if (lo != null) return `Use ${formatNumber(lo, v.unit)} or more.`;\n return `Use ${formatNumber(hi!, v.unit)} or less.`;\n }\n return null;\n}\n\nconst listUnits = (u: ScaleUnit[]) => (u.length === 1 ? u[0] : `${u.slice(0, -1).join(\", \")} or ${u[u.length - 1]}`);\n\n/**\n * Parse what an editor typed: a token (\"xl\", \"XL\", \"Extra large\"), a number (\"240\" → default unit) or a number with\n * a unit (\"200px\", \"75 %\", \"1.5rem\"). Exact px matches of a token snap to the token, so the design system wins.\n */\nexport function parseScaleInput(s: ScaleSchema, text: string, unitHint?: ScaleUnit): ParseResult {\n const t = text.trim();\n if (!t) return { ok: false, error: \"Type a value, like 240px.\" };\n const low = t.toLowerCase();\n if (isTokenScale(s)) {\n const st = s.steps.find((x) => x.value.toLowerCase() === low || x.label.toLowerCase() === low || x.title?.toLowerCase() === low);\n if (st) return { ok: true, value: st.value };\n }\n const m = /^(-?(?:\\d+(?:\\.\\d+)?|\\.\\d+))\\s*(px|%|rem|em|vw|vh)?$/i.exec(t);\n if (!m) {\n const tokens = isTokenScale(s) ? ` or a size like ${s.steps[Math.min(2, s.steps.length - 1)].label}` : \"\";\n return { ok: false, error: `Type a number like 240px${tokens}.` };\n }\n const n = Number(m[1]);\n const typedUnit = m[2]?.toLowerCase() as ScaleUnit | undefined;\n const c = customRules(s);\n const range = rangeOf(s);\n if (range) {\n const base = defaultUnit(s);\n const sameUnit = !typedUnit || typedUnit === base;\n const step = range.step ?? 1;\n const onGrid = Math.abs((n - range.min) / step - Math.round((n - range.min) / step)) < 1e-9;\n if (sameUnit && n >= range.min && n <= range.max && (onGrid || !c)) return { ok: true, value: onGrid ? n : roundTo(n, step) };\n if (!c) return { ok: false, error: `Use ${formatNumber(range.min)}–${formatNumber(range.max, base)}.` };\n const unit = typedUnit ?? unitHint ?? base ?? c.units[0];\n const cv = { value: n, unit };\n const err = validateCustom(s, cv);\n return err ? { ok: false, error: err } : { ok: true, value: cv };\n }\n if (!c) return { ok: false, error: \"Pick a value on the scale.\" };\n const unit = typedUnit ?? unitHint ?? c.units[0];\n const cv: ScaleCustomValue = { value: n, unit };\n if (isTokenScale(s) && unit === \"px\") {\n const exact = s.steps.find((st) => st.px === n && !st.css);\n if (exact) return { ok: true, value: exact.value };\n }\n const err = validateCustom(s, cv);\n return err ? { ok: false, error: err } : { ok: true, value: cv };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- //#region src/kit/schema/sources.ts
1
+ //#region src/schema/sources.ts
2
2
  /**
3
3
  * The V2 shapes the schema layer reads, copied type for type so @/kit owns them and imports nothing from
4
4
  * the app. Sources at V2 HEAD 9829bf1:
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","names":[],"sources":["../../src/schema/sources.ts"],"sourcesContent":["/**\n * The V2 shapes the schema layer reads, copied type for type so @/kit owns them and imports nothing from\n * the app. Sources at V2 HEAD 9829bf1:\n * - Cap: src/lib/access/registry.ts (CAP_IDS, the permission keys a field's `access` names)\n * - FieldType, FieldDef: src/data/types.ts (content collection fields)\n * - BlockCategory, PropType, PropDef, BlockFieldset, BlockDef: src/features/visuals/model/catalog.ts\n * The production adapters (src/kit/adapters) map production models onto these; nothing here is wired yet.\n */\n\nexport const CAP_IDS = [\n // content\n \"content.view\",\n \"content.create\",\n \"content.edit\",\n \"content.delete\",\n \"content.review\",\n \"content.publish\",\n // pages and collections\n \"pages.organize\",\n \"collections.manage\",\n // schema\n \"schema.view\",\n \"schema.manage\",\n // components\n \"components.use\",\n \"components.manage\",\n // media\n \"media.upload\",\n \"media.manage\",\n // seo\n \"seo.edit\",\n \"seo.manage\",\n // forms\n \"forms.view\",\n \"forms.manage\",\n \"forms.submissions\",\n // analytics\n \"analytics.view\",\n // visuals and design\n \"visuals.edit\",\n \"design.edit\",\n \"design.manage\",\n // publish and branches\n \"publish.deploy\",\n \"publish.workflow\",\n \"branches.create\",\n \"branches.merge\",\n // agents and AI\n \"agents.run\",\n \"agents.build\",\n \"agents.manage\",\n \"ai.use\",\n \"ai.manage\",\n // comments\n \"comments.create\",\n \"comments.moderate\",\n // settings and audit\n \"settings.project\",\n \"settings.workspace\",\n \"settings.security\",\n \"audit.view\",\n // members\n \"members.view\",\n \"members.invite\",\n \"members.manage\",\n \"members.viewAs\",\n // billing and domains\n \"billing.view\",\n \"billing.manage\",\n \"domains.manage\",\n // api, integrations, projects\n \"api.view\",\n \"api.manage\",\n \"integrations.manage\",\n \"projects.create\",\n \"projects.delete\",\n] as const;\n\nexport type Cap = (typeof CAP_IDS)[number];\n\nexport type FieldType =\n | \"text\"\n | \"textarea\"\n | \"richtext\"\n | \"slug\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"select\"\n | \"multiselect\"\n | \"image\"\n | \"gallery\"\n | \"file\"\n | \"video\"\n | \"link\"\n | \"button\"\n | \"reference\"\n | \"references\"\n | \"color\"\n | \"json\"\n | \"code\"\n | \"repeater\"\n | \"group\"\n | \"email\"\n | \"url\"\n | \"location\"\n | \"rating\"\n | \"tags\"\n | \"table\";\n\nexport interface FieldDef {\n id: string;\n name: string;\n type: FieldType;\n required?: boolean;\n /** Help under the label (CPO D39). Unset → house convention by id/type; \"\" = none. */\n help?: string;\n /** Longer explanation behind the ⓘ next to the label. */\n helpMore?: string;\n options?: string[];\n reference?: string;\n max?: number;\n localized?: boolean;\n fields?: FieldDef[];\n}\n\n\nexport type BlockCategory = \"Navigation\" | \"Hero\" | \"Content\" | \"Social proof\" | \"Commerce\" | \"Conversion\" | \"Collection\" | \"Media\" | \"Footer\" | \"Basic\" | \"Blog\";\n\n/**\n * Prop types: every FieldType, plus two shapes only blocks need — \"list\" (an array of one-line strings: bullets,\n * features, \"what's included\"; never tags, D47) and \"icon\" (a Tabler icon name, picked from the icon picker).\n */\nexport type PropType = FieldType | \"list\" | \"icon\";\n\nexport interface PropDef {\n key: string;\n label: string;\n type: PropType;\n /** Help under the label (CPO D39). Unset → house convention by key/type; \"\" = none. */\n help?: string;\n /** Longer explanation behind the ⓘ next to the label. */\n helpMore?: string;\n options?: string[];\n max?: number;\n item?: PropDef[]; // for repeater\n group?: \"Content\" | \"Media\" | \"Links\" | \"Data\";\n /** reference props: the collection id the picker lists (e.g. \"col_journal\"); default = pages */\n reference?: string;\n /** D45: the fieldset (BlockDef.fieldsets) this prop sits in. */\n fieldset?: string;\n /** Show only when a sibling prop equals one of these values (the form hides it otherwise). */\n showIf?: { key: string; equals: unknown };\n /** Arrays: the noun for \"Add {noun}\". */\n itemNoun?: string;\n placeholder?: string;\n /** Arrays: the most and fewest items. */\n min?: number;\n}\n\n/** D45 fieldset: siblings with one purpose (\"Buttons\", \"Newsletter\"), optionally collapsed. */\nexport interface BlockFieldset {\n name: string;\n title: string;\n collapsed?: boolean;\n columns?: 1 | 2;\n}\n\nexport interface BlockDef {\n type: string;\n name: string;\n category: BlockCategory;\n description: string;\n icon: string; // lucide icon name\n variants: { id: string; name: string; description?: string }[];\n content: PropDef[];\n /** D45 fieldsets the content props sit in (PropDef.fieldset). */\n fieldsets?: BlockFieldset[];\n defaults: Record<string, unknown>;\n /** Global blocks (nav, footer, announcement) are synced across every page. */\n global?: boolean;\n /**\n * PLACEMENT (CPO D55): where the block fits. \"inline\" = it fits a text column, so a rich-text body offers it in the\n * Insert menu's Article group. \"section\" (the default) = page-width; a body reaches it only through More components.\n * \"page\" = a whole page or a feed of other content (Blog post, Recipe, Journal grid, Rich text); never inside a body.\n */\n placement?: \"inline\" | \"section\" | \"page\";\n /** Developer-only lock: marketers can edit content but not swap/remove. */\n tags?: string[];\n /**\n * SLOTS (CPO D8, added by the canvas team) — named areas that hold nested blocks (Tabs panels, Bento cells…).\n * Instances keep them in `BlockInstance.children[slot]`. `accepts` limits which block types can be dropped in.\n */\n slots?: { name: string; label: string; accepts?: string[] }[];\n /** Nested blocks created with a fresh instance: slot → [type, variant?, props override?][] */\n childDefaults?: Record<string, [string, string?, Record<string, unknown>?][]>;\n}\n"],"mappings":";;;;;;;;;AASA,IAAa,UAAU;CAErB;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CAEA;CACA;CAEA;CACA;CAEA;CACA;CAEA;CACA;CACA;CAEA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA;AACF"}
@@ -1,4 +1,4 @@
1
- //#region src/kit/schema/table.ts
1
+ //#region src/schema/table.ts
2
2
  var TABLE_COLUMN_TYPES = [
3
3
  {
4
4
  value: "text",
@@ -206,7 +206,7 @@ function toBool(v) {
206
206
  if (FALSE_WORDS.has(s)) return false;
207
207
  return null;
208
208
  }
209
- var TRUE_WORDS = new Set([
209
+ var TRUE_WORDS = /* @__PURE__ */ new Set([
210
210
  "✓",
211
211
  "✔",
212
212
  "✔️",
@@ -222,7 +222,7 @@ var TRUE_WORDS = new Set([
222
222
  "check",
223
223
  "●"
224
224
  ]);
225
- var FALSE_WORDS = new Set([
225
+ var FALSE_WORDS = /* @__PURE__ */ new Set([
226
226
  "✗",
227
227
  "✕",
228
228
  "✖",
@@ -244,7 +244,7 @@ var FALSE_WORDS = new Set([
244
244
  var esc = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
245
245
  var escAttr = (s) => esc(s).replace(/"/g, "&quot;");
246
246
  var safeHref = (h) => /^\s*(javascript|vbscript|data):/i.test(h) ? "#" : h;
247
- var INLINE_TAGS = new Set([
247
+ var INLINE_TAGS = /* @__PURE__ */ new Set([
248
248
  "strong",
249
249
  "b",
250
250
  "em",
@@ -579,12 +579,13 @@ function parseDelimited(text, delim) {
579
579
  let q = false;
580
580
  for (let i = 0; i < src.length; i++) {
581
581
  const ch = src[i];
582
- if (q) if (ch === "\"" && src[i + 1] === "\"") {
583
- cell += "\"";
584
- i++;
585
- } else if (ch === "\"") q = false;
586
- else cell += ch;
587
- else if (ch === "\"" && cell === "") q = true;
582
+ if (q) {
583
+ if (ch === "\"" && src[i + 1] === "\"") {
584
+ cell += "\"";
585
+ i++;
586
+ } else if (ch === "\"") q = false;
587
+ else cell += ch;
588
+ } else if (ch === "\"" && cell === "") q = true;
588
589
  else if (ch === d) {
589
590
  row.push(cell);
590
591
  cell = "";
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","names":[],"sources":["../../src/schema/table.ts"],"sourcesContent":["/**\n * TABLE — the first-class `table` value of the schema language (CPO D42, SCHEMA_GAPS gap 12).\n *\n * One model, three places: a Table block on a page, a table island inside rich text, a Table block inside a slot.\n * One renderer: `renderTableHtml()` writes the semantic HTML every surface shows (site canvas, Journal body, published\n * preview, stored rich text); `<TableView>` (src/components/table) wraps it for live pages with visitor sort/filter.\n *\n * Why this shape (vs. Sanity's rows › cells › value, Storyblok's thead/tbody strings, Prismic's head/body):\n * - Columns are TYPED and KEYED (`_key`). Cells are keyed by column key, so reordering a column never misaligns a row.\n * - A cell is a bare value (string, number, boolean, link, reference) or `{ value, type?, note? }` when it needs a\n * per-cell type (a \"limit\" in a boolean pricing column) or a footnote.\n * - Header row + optional header column (row headers), column groups (`colgroup` headers), row groups (`tbody` with a\n * `rowgroup` header), footer rows (`tfoot`), caption (required), notes, footnotes. Body cells never merge: merged body\n * cells break sorting, Markdown and screen readers. Only group headers span (`colspan` + `scope=\"colgroup\"`).\n *\n * Stored rich-text form (lossless, so the HTML IS the model — no JSON blob to drift):\n * <figure data-rt=\"table\" data-id data-header-row data-header-col data-responsive data-sticky data-filter data-jsonld…>\n * <table aria-describedby=\"…-notes\">\n * <caption>…</caption>\n * <colgroup><col data-key data-type data-unit data-currency …></colgroup>\n * <thead>[<tr data-groups><th scope=\"colgroup\" colspan data-group>…</th>…</tr>]<tr><th scope=\"col\" data-col>…</th>…</tr></thead>\n * <tbody [data-key data-label]>[<tr data-group-row><th scope=\"rowgroup\" colspan>…</th></tr>]\n * <tr data-key><th scope=\"row\" data-col>…</th><td data-col data-label [data-value] [data-type] [data-note]>…</td></tr></tbody>\n * <tfoot>…</tfoot>\n * </table>\n * <p data-notes id=\"…-notes\">…</p><ol data-footnotes><li id=\"…-fn-1\" data-key>…</li></ol>\n * </figure>\n * Pure string work (no DOM) except `parseTableElement`, which reads a DOM element (ours or any site's).\n */\n\n/* ── Types ─────────────────────────────────────────────────────────── */\nexport type TableColumnType = \"text\" | \"number\" | \"money\" | \"boolean\" | \"rating\" | \"link\" | \"richtext-inline\" | \"reference\";\nexport const TABLE_COLUMN_TYPES: { value: TableColumnType; label: string; description: string }[] = [\n { value: \"text\", label: \"Text\", description: \"Plain words\" },\n { value: \"number\", label: \"Number\", description: \"With an optional unit (kg, %, min)\" },\n { value: \"money\", label: \"Money\", description: \"An amount in one currency\" },\n { value: \"boolean\", label: \"Yes / no\", description: \"Written as Included / Not included\" },\n { value: \"rating\", label: \"Rating\", description: \"Out of 5\" },\n { value: \"link\", label: \"Link\", description: \"Label + URL\" },\n { value: \"richtext-inline\", label: \"Rich text\", description: \"Bold, italic, links, code\" },\n { value: \"reference\", label: \"Reference\", description: \"A page or entry, by id\" },\n];\n\nexport interface TableColumn {\n _key: string;\n /** Header text (plain). Required when the header row is on. */\n label: string;\n type: TableColumnType;\n /** Explains the column; written as the header's title and in the notes of the Markdown twin. */\n description?: string;\n /** number: unit after the value (\"kg\", \"%\", \"min\"). */\n unit?: string;\n /** money: ISO 4217 code. Default USD. */\n currency?: string;\n /** number / money: fixed decimals. */\n decimals?: number;\n /** Default: numbers, money and ratings align end, everything else start (WAI: right-align numbers). */\n align?: \"start\" | \"center\" | \"end\";\n /** Visitors may sort by this column (live pages only). */\n sortable?: boolean;\n /** Column group key (a spanning header above this column). */\n group?: string;\n /** boolean: what the words say. Defaults \"Included\" / \"Not included\". */\n trueLabel?: string;\n falseLabel?: string;\n /** rating: scale. Default 5. */\n max?: number;\n /** reference: allowed targets (collection ids or \"page\"). */\n refTo?: string[];\n /** Tint the column (the recommended plan). Visual only. */\n highlight?: boolean;\n}\nexport interface TableGroup {\n _key: string;\n label: string;\n}\nexport interface TableLink {\n label: string;\n href: string;\n /** set by the global link element (D57) */\n newTab?: boolean;\n rel?: \"follow\" | \"nofollow\" | \"ugc\" | \"sponsored\";\n}\nexport interface TableRef {\n ref: string;\n label?: string;\n href?: string;\n}\nexport type TableCellValue = string | number | boolean | null | TableLink | TableRef;\nexport interface TableCellObject {\n value: TableCellValue;\n /** Per-cell type (wins over the row's and the column's). */\n type?: TableColumnType;\n /** Footnote key. */\n note?: string;\n /**\n * The body's own footnote markers after the cell's text (`<sup data-footnote=\"key\">n</sup>`, a rich-text table's),\n * kept as written: the table editor does not edit them, and the cell writes them back after its text.\n */\n marks?: string;\n}\nexport type TableCell = TableCellValue | TableCellObject;\nexport interface TableRow {\n _key: string;\n cells: Record<string, TableCell | undefined>;\n /** Row group key. */\n group?: string;\n /** Totals / summary rows → <tfoot>. */\n footer?: boolean;\n /** Per-row type: pricing matrices mix yes/no rows with limit rows in the same plan columns. */\n type?: TableColumnType;\n /** Tint the row (the bestseller). Visual only — say WHY in a footnote, colour alone means nothing to a reader. */\n highlight?: boolean;\n}\nexport interface TableFootnote {\n _key: string;\n text: string;\n}\nexport type TableResponsive = \"scroll\" | \"stack\" | \"cards\";\nexport type TableJsonLdType = \"none\" | \"ItemList\" | \"Dataset\" | \"Offers\";\nexport interface TableValue {\n /** Stable id for anchors (footnotes, aria). */\n id?: string;\n /** What the table shows. Required: it names the table for screen readers, crawlers and AI answers. */\n caption: string;\n /** One or two sentences under the table: source, method, date. Linked with aria-describedby. */\n notes?: string;\n headerRow: boolean;\n /** First column holds row headers (th scope=row). */\n headerColumn: boolean;\n columns: TableColumn[];\n columnGroups?: TableGroup[];\n rowGroups?: TableGroup[];\n rows: TableRow[];\n footnotes?: TableFootnote[];\n /** Visitor UI on live pages: a filter box above the table. */\n filterable?: boolean;\n /** hideCaption: the caption stays in the HTML (screen readers, crawlers) but isn't drawn — when a heading above says it. */\n design?: { responsive?: TableResponsive; sticky?: boolean; striped?: boolean; density?: \"compact\" | \"comfortable\"; hideCaption?: boolean };\n /** Structured data from the table. Off by default: JSON-LD must describe what the page really offers. */\n jsonLd?: { type: TableJsonLdType; axis?: \"rows\" | \"columns\"; priceRow?: string };\n}\n\n/** Field-level settings (`FieldSchema.table`). */\nexport interface TableFieldOptions {\n /** Column types an editor may choose. Default: all. */\n columnTypes?: TableColumnType[];\n /** Developer-defined columns: editors fill rows but can't add, remove, retype or reorder columns. */\n lockColumns?: boolean;\n minRows?: number;\n maxRows?: number;\n maxColumns?: number;\n /** Default true. */\n requireCaption?: boolean;\n /** Row groups: \"Add group\" in the row list. Default true. */\n allowGroups?: boolean;\n /** Footnotes on cells, edited at the cell. Default true. */\n allowFootnotes?: boolean;\n /**\n * CPO D52: what Table settings offers. Each key turns one setting on or off for this table kind, so the editor only sees\n * what applies. Defaults: header row + first column, totals row, on phones (all three), highlight column ON; visitor\n * sort and search OFF; JSON-LD only when `jsonLd` lists types.\n */\n settings?: TableSettingsOptions;\n /** \"Note under the table\" (the source line, `notes`). Default true. Turn off when the block has its own source field. */\n allowNote?: boolean;\n /** JSON-LD types offered in Table settings (\"Help search engines read this as\"). Default: none offered. */\n jsonLd?: TableJsonLdType[];\n}\n\n/**\n * CPO D52: a table with no `table` options (a rich-text table, the Visuals Table block, a schema field without `table`) is a\n * general table of any kind, so every setting is offered. Setting `table` on a field narrows it to that kind.\n */\nexport const GENERAL_TABLE: TableFieldOptions = { jsonLd: [\"ItemList\", \"Dataset\", \"Offers\"], settings: { sort: true, search: true } };\n\n/** CPO D52: the settings a table kind offers (`FieldSchema.table.settings`). */\nexport interface TableSettingsOptions {\n /** \"Show column names\" (header row) and \"First column names each row\" (row headers). Default true. */\n headers?: boolean;\n /** \"Totals row\": a footer row group at the end of the row list. Default true. */\n totals?: boolean;\n /** \"On phones\": the layouts offered. Default all three; one value fixes it, [] hides the setting. */\n phones?: TableResponsive[];\n /** \"Highlight column\": one column stands out (the recommended plan, your product). Default true. */\n highlight?: boolean;\n /** \"Keep column names in view\" (developer-only, `design.sticky`). Default true; off when the block owns a sticky-header field. */\n sticky?: boolean;\n /** \"Visitors can sort columns\". Default false (data tables turn it on). */\n sort?: boolean;\n /** \"Visitors can search rows\". Default false (long data tables turn it on). */\n search?: boolean;\n}\n\n/* ── Keys + defaults ───────────────────────────────────────────────── */\nlet seq = 0;\nexport const tkey = (p: string) => `${p}${Date.now().toString(36).slice(-4)}${(seq++).toString(36)}${Math.random().toString(36).slice(2, 5)}`;\n\nexport function emptyTable(cols = 3, rows = 2): TableValue {\n const columns = Array.from({ length: cols }, () => ({ _key: tkey(\"c\"), label: \"\", type: \"text\" as const }));\n return {\n id: tkey(\"tbl\"),\n caption: \"\",\n headerRow: true,\n headerColumn: false,\n columns,\n rows: Array.from({ length: rows }, () => ({ _key: tkey(\"r\"), cells: {} })),\n design: { responsive: \"scroll\" },\n };\n}\n\nexport const isObjLike = (v: unknown): v is Record<string, unknown> => !!v && typeof v === \"object\" && !Array.isArray(v);\nexport const isCellObject = (c: unknown): c is TableCellObject => isObjLike(c) && \"value\" in c;\nexport const isTableValue = (v: unknown): v is TableValue => isObjLike(v) && Array.isArray(v.columns) && Array.isArray(v.rows);\n\n/** Repair anything loaded (missing keys, missing arrays) so editors and renderers can trust the shape. */\nexport function normalizeTable(v: unknown): TableValue {\n if (!isTableValue(v)) return emptyTable();\n const used = new Set<string>();\n const uniq = (k: unknown, p: string) => {\n let key = typeof k === \"string\" && k ? k : tkey(p);\n while (used.has(key)) key = tkey(p);\n used.add(key);\n return key;\n };\n const columns = v.columns.filter(isObjLike).map((c) => ({ ...c, _key: uniq(c._key, \"c\"), label: String(c.label ?? \"\"), type: (TABLE_COLUMN_TYPES.some((t) => t.value === c.type) ? c.type : \"text\") as TableColumnType }));\n const rows = v.rows.filter(isObjLike).map((r) => ({ ...r, _key: uniq(r._key, \"r\"), cells: isObjLike(r.cells) ? (r.cells as TableRow[\"cells\"]) : {} }));\n return {\n ...v,\n id: typeof v.id === \"string\" && v.id ? v.id : tkey(\"tbl\"),\n caption: String(v.caption ?? \"\"),\n headerRow: v.headerRow !== false,\n headerColumn: !!v.headerColumn,\n columns,\n rows,\n columnGroups: (v.columnGroups ?? []).filter(isObjLike).map((g) => ({ ...g, _key: uniq(g._key, \"g\") })),\n rowGroups: (v.rowGroups ?? []).filter(isObjLike).map((g) => ({ ...g, _key: uniq(g._key, \"rg\") })),\n footnotes: (v.footnotes ?? []).filter(isObjLike).map((f) => ({ ...f, _key: uniq(f._key, \"f\") })),\n };\n}\n\n/* ── Cells: type, value, text ──────────────────────────────────────── */\nexport const cellValue = (c: TableCell | undefined): TableCellValue => (c === undefined ? null : isCellObject(c) ? c.value : c);\nexport const cellNote = (c: TableCell | undefined): string | undefined => (isCellObject(c) ? c.note : undefined);\nexport const cellType = (col: TableColumn, row?: TableRow, c?: TableCell): TableColumnType => (isCellObject(c) && c.type) || row?.type || col.type;\n\n/** Write a value back, keeping the cell's per-cell type and footnote. */\nexport function withValue(c: TableCell | undefined, value: TableCellValue): TableCell {\n if (isCellObject(c)) return { ...c, value };\n return value;\n}\n\nexport const isEmptyCell = (v: TableCellValue) => v == null || v === \"\" || (isObjLike(v) && !(\"ref\" in v ? v.ref : (v as TableLink).label || (v as TableLink).href));\n\nconst strip = (s: string) => s.replace(/<[^>]*>/g, \"\").replace(/&nbsp;/g, \" \").replace(/&amp;/g, \"&\").replace(/&lt;/g, \"<\").replace(/&gt;/g, \">\").replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\");\n\nexport function boolLabels(col: TableColumn) {\n return { yes: col.trueLabel || \"Included\", no: col.falseLabel || \"Not included\" };\n}\n// V2 also had an unused `symbol(currency)` helper here; dropped because the dashboard compiles with noUnusedLocals.\nexport function formatNumber(n: number, decimals?: number) {\n return new Intl.NumberFormat(\"en-US\", decimals != null ? { minimumFractionDigits: decimals, maximumFractionDigits: decimals } : { maximumFractionDigits: 6 }).format(n);\n}\nexport function formatMoney(n: number, currency = \"USD\", decimals?: number) {\n try {\n const whole = Number.isInteger(n) && decimals == null;\n return new Intl.NumberFormat(\"en-US\", { style: \"currency\", currency, minimumFractionDigits: whole ? 0 : decimals ?? 2, maximumFractionDigits: whole ? 0 : decimals ?? 2 }).format(n);\n } catch {\n return `${formatNumber(n, decimals)} ${currency}`;\n }\n}\nexport const toNumber = (v: unknown): number | null => {\n if (typeof v === \"number\") return Number.isFinite(v) ? v : null;\n if (typeof v !== \"string\") return null;\n const s = v.replace(/[,\\s]/g, \"\").replace(/[^\\d.+-]/g, \"\");\n if (!s || !/^[+-]?\\d*\\.?\\d+$/.test(s)) return null;\n return Number(s);\n};\n\n/** The words a cell says, for Markdown, CSV, sorting, search and screen readers. Empty → \"\". */\nexport function cellText(col: TableColumn, row: TableRow | undefined, c: TableCell | undefined, resolveRef?: RefResolver): string {\n const v = cellValue(c);\n if (isEmptyCell(v)) return \"\";\n const t = cellType(col, row, c);\n switch (t) {\n case \"boolean\": {\n const b = toBool(v);\n return b == null ? strip(String(v)) : b ? boolLabels(col).yes : boolLabels(col).no;\n }\n case \"number\": {\n const n = toNumber(v);\n return n == null ? strip(String(v)) : `${formatNumber(n, col.decimals)}${col.unit ? (/^[%°]/.test(col.unit) ? col.unit : ` ${col.unit}`) : \"\"}`;\n }\n case \"money\": {\n const n = toNumber(v);\n return n == null ? strip(String(v)) : formatMoney(n, col.currency || \"USD\", col.decimals);\n }\n case \"rating\": {\n const n = toNumber(v);\n return n == null ? strip(String(v)) : `${formatNumber(n, 1).replace(/\\.0$/, \"\")} out of ${col.max ?? 5}`;\n }\n case \"link\":\n return isObjLike(v) ? String((v as TableLink).label || (v as TableLink).href || \"\") : strip(String(v));\n case \"reference\": {\n if (!isObjLike(v)) return strip(String(v));\n const r = v as TableRef;\n return resolveRef?.(r.ref)?.label ?? r.label ?? r.ref;\n }\n default:\n return isObjLike(v) ? String((v as TableLink).label ?? \"\") : strip(String(v)).replace(/\\s+/g, \" \").trim();\n }\n}\n\nexport function toBool(v: unknown): boolean | null {\n if (typeof v === \"boolean\") return v;\n if (typeof v !== \"string\") return null;\n const s = strip(v).trim().toLowerCase();\n if (TRUE_WORDS.has(s)) return true;\n if (FALSE_WORDS.has(s)) return false;\n return null;\n}\nconst TRUE_WORDS = new Set([\"✓\", \"✔\", \"✔️\", \"☑\", \"✅\", \"yes\", \"y\", \"true\", \"included\", \"available\", \"supported\", \"x ✓\", \"check\", \"●\"]);\nconst FALSE_WORDS = new Set([\"✗\", \"✕\", \"✖\", \"❌\", \"×\", \"x\", \"no\", \"n\", \"false\", \"not included\", \"unavailable\", \"not available\", \"unsupported\", \"—\", \"–\", \"-\", \"○\"]);\n\n/* ── Render (the ONE renderer) ─────────────────────────────────────── */\nexport type RefResolver = (id: string) => { label: string; href?: string } | undefined;\nexport interface RenderOptions {\n /** Resolve reference cells to their current label + URL. */\n resolveRef?: RefResolver;\n /** Live-page visitor UI: sortable headers become buttons with aria-sort. Never stored. */\n sort?: { key: string; dir: 1 | -1 } | null;\n interactive?: boolean;\n /** Rows to show (filter). Keys. */\n visibleRows?: Set<string>;\n /** Write the editing marks (`data-*` model attributes). Off for clean published HTML. Default true. */\n marks?: boolean;\n}\n\nconst esc = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\nconst escAttr = (s: string) => esc(s).replace(/\"/g, \"&quot;\");\nconst safeHref = (h: string) => (/^\\s*(javascript|vbscript|data):/i.test(h) ? \"#\" : h);\nconst INLINE_TAGS = new Set([\"strong\", \"b\", \"em\", \"i\", \"u\", \"s\", \"del\", \"code\", \"a\", \"br\", \"sup\", \"sub\", \"mark\", \"small\", \"abbr\"]);\n/** Inline rich text in a cell: only inline marks and safe links survive (string-based, no DOM). */\nexport function sanitizeInline(html: string): string {\n return html\n .replace(/<(script|style|iframe|object|embed|template)\\b[\\s\\S]*?<\\/\\1>/gi, \"\")\n .replace(/<\\/?([a-z][a-z0-9]*)\\b([^>]*)>/gi, (m, tag: string, attrs: string) => {\n const t = tag.toLowerCase();\n if (!INLINE_TAGS.has(t)) return \"\";\n if (m.startsWith(\"</\")) return `</${t === \"b\" ? \"strong\" : t === \"i\" ? \"em\" : t}>`;\n if (t === \"a\") {\n const href = attrs.match(/href\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/i);\n const h = href ? href[2] ?? href[3] ?? \"\" : \"\";\n return `<a href=\"${escAttr(safeHref(h))}\">`;\n }\n if (t === \"abbr\") {\n const title = attrs.match(/title\\s*=\\s*\"([^\"]*)\"/i);\n return title ? `<abbr title=\"${escAttr(title[1])}\">` : \"<abbr>\";\n }\n return `<${t === \"b\" ? \"strong\" : t === \"i\" ? \"em\" : t}>`;\n });\n}\n\nconst alignOf = (col: TableColumn, t: TableColumnType) => col.align ?? (t === \"number\" || t === \"money\" || t === \"rating\" ? \"end\" : \"start\");\nconst footnoteIndex = (t: TableValue) => new Map((t.footnotes ?? []).map((f, i) => [f._key, i + 1]));\n\n/** Inner HTML of one cell + its typed attributes. */\nfunction cellHtml(t: TableValue, col: TableColumn, row: TableRow | undefined, c: TableCell | undefined, o: RenderOptions, fn: Map<string, number>, asHeader: boolean): { inner: string; attrs: string } {\n const v = cellValue(c);\n const type = cellType(col, row, c);\n const marks = o.marks !== false;\n const typeAttr = marks && isCellObject(c) && c.type ? ` data-type=\"${c.type}\"` : \"\";\n const note = cellNote(c);\n const n = note ? fn.get(note) : undefined;\n const sup = n ? `<sup><a href=\"#${escAttr(t.id ?? \"tbl\")}-fn-${n}\" aria-label=\"Note ${n}\">${n}</a></sup>` : \"\";\n const noteAttr = marks && note ? ` data-note=\"${escAttr(note)}\"` : \"\";\n let inner = \"\";\n let valueAttr = \"\";\n if (isEmptyCell(v)) {\n inner = asHeader ? \"\" : `<span aria-hidden=\"true\" class=\"bt-dash\">—</span><span class=\"bt-sr\">No value</span>`;\n valueAttr = marks ? ` data-empty=\"\"` : \"\";\n } else\n switch (type) {\n case \"boolean\": {\n const b = toBool(v);\n if (b == null) inner = esc(strip(String(v)));\n else {\n const { yes, no } = boolLabels(col);\n inner = `<span aria-hidden=\"true\" class=\"bt-bool\" data-bool=\"${b}\">${b ? \"✓\" : \"–\"}</span><span class=\"bt-sr\">${esc(b ? yes : no)}</span>`;\n valueAttr = marks ? ` data-value=\"${b}\"` : \"\";\n }\n break;\n }\n case \"number\":\n case \"money\": {\n const num = toNumber(v);\n inner = esc(cellText(col, row, c));\n if (num != null && marks) valueAttr = ` data-value=\"${num}\"`;\n break;\n }\n case \"rating\": {\n const num = toNumber(v);\n if (num == null) inner = esc(strip(String(v)));\n else {\n const max = col.max ?? 5;\n // one reading for everyone: \"4.7 / 5\" (the star is decoration)\n inner = `<span aria-hidden=\"true\" class=\"bt-star\">★</span> ${esc(formatNumber(num, 1).replace(/\\.0$/, \"\"))}<span class=\"bt-dim\"> / ${max}</span>`;\n if (marks) valueAttr = ` data-value=\"${num}\"`;\n }\n break;\n }\n case \"link\": {\n const l = isObjLike(v) ? (v as TableLink) : { label: String(v), href: \"\" };\n const rel = [l.newTab ? \"noopener\" : \"\", l.rel && l.rel !== \"follow\" ? l.rel : \"\"].filter(Boolean).join(\" \");\n inner = l.href ? `<a href=\"${escAttr(safeHref(l.href))}\"${l.newTab ? ' target=\"_blank\"' : \"\"}${rel ? ` rel=\"${rel}\"` : \"\"}>${esc(l.label || l.href)}</a>` : esc(l.label);\n break;\n }\n case \"reference\": {\n const r: TableRef = isObjLike(v) ? (v as TableRef) : { ref: String(v) };\n const live = o.resolveRef?.(r.ref);\n const label = live?.label ?? r.label ?? r.ref;\n const href = live?.href ?? r.href;\n inner = href ? `<a href=\"${escAttr(safeHref(href))}\">${esc(label)}</a>` : esc(label);\n if (marks) valueAttr = ` data-ref=\"${escAttr(r.ref)}\"`;\n break;\n }\n case \"richtext-inline\":\n inner = sanitizeInline(String(isObjLike(v) ? (v as TableLink).label ?? \"\" : v));\n break;\n default:\n inner = esc(isObjLike(v) ? String((v as TableLink).label ?? \"\") : strip(String(v)));\n }\n const align = alignOf(col, type);\n const alignAttr = align !== \"start\" ? ` data-align=\"${align}\"` : \"\";\n return { inner: inner + sup, attrs: `${typeAttr}${valueAttr}${noteAttr}${alignAttr}` };\n}\n\n/** Rows in display order: body rows (ungrouped first, then each row group in its order), footer rows. */\nexport function orderedRows(t: TableValue) {\n const groups = t.rowGroups ?? [];\n const known = new Set(groups.map((g) => g._key));\n const body = t.rows.filter((r) => !r.footer);\n const loose = body.filter((r) => !r.group || !known.has(r.group));\n const bodies: { group?: TableGroup; rows: TableRow[] }[] = [];\n if (loose.length || !groups.length) bodies.push({ rows: loose });\n for (const g of groups) {\n const rows = body.filter((r) => r.group === g._key);\n if (rows.length) bodies.push({ group: g, rows });\n }\n return { bodies, foot: t.rows.filter((r) => r.footer) };\n}\n\n/** Sort comparator over a column (numbers numerically, booleans true first, text by locale). */\nexport function sortRows(t: TableValue, rows: TableRow[], key: string, dir: 1 | -1): TableRow[] {\n const col = t.columns.find((c) => c._key === key);\n if (!col) return rows;\n const val = (r: TableRow) => {\n const c = r.cells[key];\n const ty = cellType(col, r, c);\n const v = cellValue(c);\n if (ty === \"number\" || ty === \"money\" || ty === \"rating\") return toNumber(v);\n if (ty === \"boolean\") return toBool(v) == null ? null : toBool(v) ? 1 : 0;\n return cellText(col, r, c).toLowerCase() || null;\n };\n return [...rows].sort((a, b) => {\n const x = val(a);\n const y = val(b);\n if (x == null && y == null) return 0;\n if (x == null) return 1; // empty last, whichever direction\n if (y == null) return -1;\n return (typeof x === \"number\" && typeof y === \"number\" ? x - y : String(x).localeCompare(String(y), \"en\", { numeric: true })) * dir;\n });\n}\n\n/** The table as semantic HTML: <figure data-rt=\"table\"> › <table> (caption, colgroup, thead, tbody…, tfoot) + notes. */\nexport function renderTableHtml(input: TableValue, o: RenderOptions = {}): string {\n const t = normalizeTable(input);\n const marks = o.marks !== false;\n const id = t.id!;\n const cols = t.columns;\n const n = cols.length;\n const fn = footnoteIndex(t);\n const groups = (t.columnGroups ?? []).filter((g) => cols.some((c) => c.group === g._key));\n const describedBy = t.notes || (t.footnotes ?? []).length ? ` aria-describedby=\"${escAttr(id)}-notes\"` : \"\";\n const fig: string[] = [];\n const figAttrs = [\n `data-rt=\"table\"`,\n `data-id=\"${escAttr(id)}\"`,\n `class=\"bt-table\"`,\n marks ? `data-header-row=\"${t.headerRow}\"` : \"\",\n t.headerColumn ? `data-header-col=\"true\"` : \"\",\n `data-responsive=\"${t.design?.responsive ?? \"scroll\"}\"`,\n t.design?.sticky ? `data-sticky=\"true\"` : \"\",\n t.design?.striped ? `data-striped=\"true\"` : \"\",\n t.design?.density === \"compact\" ? `data-density=\"compact\"` : \"\",\n t.design?.hideCaption ? `data-caption=\"hidden\"` : \"\",\n marks && t.filterable ? `data-filter=\"true\"` : \"\",\n marks && t.jsonLd && t.jsonLd.type !== \"none\" ? `data-jsonld=\"${t.jsonLd.type}\"${t.jsonLd.axis ? ` data-jsonld-axis=\"${t.jsonLd.axis}\"` : \"\"}${t.jsonLd.priceRow ? ` data-jsonld-price=\"${escAttr(t.jsonLd.priceRow)}\"` : \"\"}` : \"\",\n ].filter(Boolean);\n fig.push(`<figure ${figAttrs.join(\" \")}>`);\n // the scroll region names itself after the caption; the table keeps its own (implicit) role\n fig.push(`<div class=\"bt-scroll\" role=\"region\" tabindex=\"0\" aria-labelledby=\"${escAttr(id)}-caption\">`);\n fig.push(`<table${describedBy}>`);\n fig.push(`<caption id=\"${escAttr(id)}-caption\"${t.design?.hideCaption ? ` class=\"bt-sr\"` : \"\"}>${esc(t.caption || \"Table\")}</caption>`);\n if (marks || groups.length) {\n fig.push(\n `<colgroup>${cols\n .map((c) => {\n if (!marks) return \"<col>\";\n const a = [\n `data-key=\"${escAttr(c._key)}\"`,\n `data-type=\"${c.type}\"`,\n c.unit ? `data-unit=\"${escAttr(c.unit)}\"` : \"\",\n c.currency ? `data-currency=\"${escAttr(c.currency)}\"` : \"\",\n c.decimals != null ? `data-decimals=\"${c.decimals}\"` : \"\",\n c.align ? `data-align=\"${c.align}\"` : \"\",\n c.sortable ? `data-sortable=\"true\"` : \"\",\n c.group ? `data-group=\"${escAttr(c.group)}\"` : \"\",\n c.trueLabel ? `data-true=\"${escAttr(c.trueLabel)}\"` : \"\",\n c.falseLabel ? `data-false=\"${escAttr(c.falseLabel)}\"` : \"\",\n c.max != null ? `data-max=\"${c.max}\"` : \"\",\n c.refTo?.length ? `data-ref-to=\"${escAttr(c.refTo.join(\",\"))}\"` : \"\",\n c.description ? `data-description=\"${escAttr(c.description)}\"` : \"\",\n c.highlight ? `data-highlight=\"true\"` : \"\",\n ].filter(Boolean);\n return `<col ${a.join(\" \")}>`;\n })\n .join(\"\")}</colgroup>`,\n );\n }\n // header\n if (t.headerRow) {\n fig.push(\"<thead>\");\n if (groups.length) {\n const cells: string[] = [];\n for (let i = 0; i < n; ) {\n const g = cols[i].group && groups.find((x) => x._key === cols[i].group);\n if (!g) {\n cells.push(`<td></td>`);\n i++;\n continue;\n }\n let span = 1;\n while (i + span < n && cols[i + span].group === g._key) span++;\n cells.push(`<th scope=\"colgroup\"${span > 1 ? ` colspan=\"${span}\"` : \"\"}${marks ? ` data-group=\"${escAttr(g._key)}\"` : \"\"}>${esc(g.label)}</th>`);\n i += span;\n }\n fig.push(`<tr${marks ? \" data-groups\" : \"\"}>${cells.join(\"\")}</tr>`);\n }\n fig.push(\n `<tr>${cols\n .map((c, i) => {\n const type = c.type;\n const align = alignOf(c, type);\n const sortable = o.interactive && c.sortable;\n const dir = o.sort?.key === c._key ? o.sort.dir : 0;\n const ariaSort = sortable ? ` aria-sort=\"${dir === 1 ? \"ascending\" : dir === -1 ? \"descending\" : \"none\"}\"` : \"\";\n // an unnamed corner over the row headers is a plain cell, not an empty header\n if (i === 0 && t.headerColumn && !c.label.trim()) return `<td${marks ? ` data-col=\"${escAttr(c._key)}\"` : \"\"}></td>`;\n const label = esc(c.label || `Column ${i + 1}`);\n const title = c.description ? ` title=\"${escAttr(c.description)}\"` : \"\";\n const content = sortable ? `<button type=\"button\" class=\"bt-sort\" data-sort-key=\"${escAttr(c._key)}\">${label}<span aria-hidden=\"true\" class=\"bt-sort-icon\">${dir === 1 ? \"↑\" : dir === -1 ? \"↓\" : \"↕\"}</span></button>` : label;\n return `<th scope=\"col\"${marks ? ` data-col=\"${escAttr(c._key)}\"` : \"\"}${align !== \"start\" ? ` data-align=\"${align}\"` : \"\"}${c.highlight ? ` data-highlight=\"true\"` : \"\"}${title}${ariaSort}>${content}</th>`;\n })\n .join(\"\")}</tr>`,\n );\n fig.push(\"</thead>\");\n }\n const rowHtml = (r: TableRow) => {\n const cells = cols.map((c, i) => {\n const asTh = t.headerColumn && i === 0;\n const { inner, attrs } = cellHtml(t, c, r, r.cells[c._key], o, fn, asTh);\n const label = ` data-label=\"${escAttr(c.label || `Column ${i + 1}`)}\"${c.highlight ? ` data-highlight=\"true\"` : \"\"}`;\n return asTh ? `<th scope=\"row\"${marks ? ` data-col=\"${escAttr(c._key)}\"` : \"\"}${attrs}>${inner}</th>` : `<td${marks ? ` data-col=\"${escAttr(c._key)}\"` : \"\"}${label}${attrs}>${inner}</td>`;\n });\n return `<tr${marks ? ` data-key=\"${escAttr(r._key)}\"` : \"\"}${marks && r.type ? ` data-type=\"${r.type}\"` : \"\"}${r.highlight ? ` data-highlight=\"true\"` : \"\"}>${cells.join(\"\")}</tr>`;\n };\n const { bodies, foot } = orderedRows(t);\n const vis = (rows: TableRow[]) => {\n const kept = o.visibleRows ? rows.filter((r) => o.visibleRows!.has(r._key)) : rows;\n return o.sort ? sortRows(t, kept, o.sort.key, o.sort.dir) : kept;\n };\n for (const b of bodies) {\n const rows = vis(b.rows);\n if (b.group) {\n fig.push(`<tbody${marks ? ` data-key=\"${escAttr(b.group._key)}\" data-label=\"${escAttr(b.group.label)}\"` : \"\"}>`);\n fig.push(`<tr class=\"bt-group\"${marks ? \" data-group-row\" : \"\"}><th scope=\"rowgroup\" colspan=\"${n}\">${esc(b.group.label)}</th></tr>`);\n } else fig.push(\"<tbody>\");\n fig.push(rows.map(rowHtml).join(\"\"));\n fig.push(\"</tbody>\");\n }\n if (foot.length) fig.push(`<tfoot>${foot.map(rowHtml).join(\"\")}</tfoot>`);\n fig.push(\"</table></div>\");\n if (t.notes || (t.footnotes ?? []).length) {\n fig.push(`<div class=\"bt-notes\" id=\"${escAttr(id)}-notes\">`);\n if (t.notes) fig.push(`<p${marks ? \" data-notes\" : \"\"}>${esc(t.notes)}</p>`);\n if ((t.footnotes ?? []).length)\n fig.push(`<ol${marks ? \" data-footnotes\" : \"\"}>${t.footnotes!.map((f, i) => `<li id=\"${escAttr(id)}-fn-${i + 1}\"${marks ? ` data-key=\"${escAttr(f._key)}\"` : \"\"}>${esc(f.text)}</li>`).join(\"\")}</ol>`);\n fig.push(\"</div>\");\n }\n fig.push(\"</figure>\");\n const html = fig.join(\"\");\n return t.design?.responsive === \"stack\" || t.design?.responsive === \"cards\" ? withTableRoles(html) : html;\n}\n\n/**\n * Stack / Cards change `display` on table parts, which makes some engines drop table semantics. The fix (Adrian\n * Roselli, \"Tables, CSS Display Properties, and ARIA\") restates the SAME roles explicitly — semantics unchanged.\n * Cell contents are sanitized inline HTML, so these tag patterns only ever match the table's own structure.\n */\nfunction withTableRoles(html: string) {\n return html\n .replace(/<table(?=[\\s>])/, '<table role=\"table\"')\n .replace(/<(thead|tbody|tfoot)(?=[\\s>])/g, '<$1 role=\"rowgroup\"')\n .replace(/<tr(?=[\\s>])/g, '<tr role=\"row\"')\n .replace(/<th scope=\"(col|colgroup)\"/g, '<th role=\"columnheader\" scope=\"$1\"')\n .replace(/<th scope=\"(row|rowgroup)\"/g, '<th role=\"rowheader\" scope=\"$1\"')\n .replace(/<td(?=[\\s>])/g, '<td role=\"cell\"');\n}\n\n/* ── Markdown (GFM) ────────────────────────────────────────────────── */\nconst mdCell = (s: string) => s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\|/g, \"\\\\|\").replace(/\\s*\\n\\s*/g, \" \").trim();\nfunction inlineMd(html: string): string {\n return strip(\n sanitizeInline(html)\n .replace(/<(strong)>([\\s\\S]*?)<\\/\\1>/g, \"**$2**\")\n .replace(/<(em)>([\\s\\S]*?)<\\/\\1>/g, \"_$2_\")\n .replace(/<code>([\\s\\S]*?)<\\/code>/g, \"`$1`\")\n .replace(/<a href=\"([^\"]*)\">([\\s\\S]*?)<\\/a>/g, (_m, h: string, l: string) => `[${l}](${h.replace(/&amp;/g, \"&\")})`)\n .replace(/<br>/g, \" \"),\n );\n}\n/**\n * GFM has one header row and no spans, so: column groups prefix their columns (\"Sizes · Chest\"), row groups become a\n * bold label row, the caption is a bold line above, notes and footnotes follow. Booleans say their words, never ✓.\n */\nexport function tableToMarkdown(input: TableValue, o: { resolveRef?: RefResolver; abs?: (href: string) => string } = {}): string {\n const t = normalizeTable(input);\n const cols = t.columns;\n if (!cols.length) return \"\";\n const groups = new Map((t.columnGroups ?? []).map((g) => [g._key, g.label]));\n const fn = footnoteIndex(t);\n const pfx = (t.id ?? \"t\").replace(/[^\\w-]/g, \"\");\n const head = cols.map((c, i) => mdCell([c.group && groups.get(c.group), c.label || (i === 0 && t.headerColumn ? \"\" : `Column ${i + 1}`)].filter(Boolean).join(\" · \")) || \" \");\n const sep = cols.map((c) => (alignOf(c, c.type) === \"end\" ? \"---:\" : alignOf(c, c.type) === \"center\" ? \":---:\" : \"---\"));\n const line = (cells: string[]) => `| ${cells.join(\" | \")} |`;\n const row = (r: TableRow) =>\n line(\n cols.map((c, i) => {\n const cell = r.cells[c._key];\n const v = cellValue(cell);\n const ty = cellType(c, r, cell);\n let s = ty === \"richtext-inline\" && typeof v === \"string\" ? inlineMd(v) : cellText(c, r, cell, o.resolveRef);\n if (ty === \"link\" && isObjLike(v) && (v as TableLink).href) s = `[${s}](${o.abs ? o.abs((v as TableLink).href) : (v as TableLink).href})`;\n if (ty === \"reference\" && isObjLike(v)) {\n const href = o.resolveRef?.((v as TableRef).ref)?.href ?? (v as TableRef).href;\n if (href) s = `[${s}](${o.abs ? o.abs(href) : href})`;\n }\n if (!s && !(t.headerColumn && i === 0)) s = \"—\";\n if (t.headerColumn && i === 0 && s) s = `**${s}**`;\n const note = cellNote(cell);\n if (note && fn.get(note)) s += `[^${pfx}-${fn.get(note)}]`;\n return mdCell(s) || \" \";\n }),\n );\n const out: string[] = [];\n out.push(`**${mdCell(t.caption || \"Table\")}**`, \"\");\n out.push(line(head), line(sep));\n const { bodies, foot } = orderedRows(t);\n for (const b of bodies) {\n if (b.group) out.push(line([`**${mdCell(b.group.label)}**`, ...cols.slice(1).map(() => \" \")]));\n b.rows.forEach((r) => out.push(row(r)));\n }\n foot.forEach((r) => out.push(row(r)));\n const after: string[] = [];\n if (t.notes) after.push(t.notes);\n const described = cols.filter((c) => c.description);\n if (described.length) after.push(described.map((c) => `${c.label}: ${c.description}`).join(\". \") + \".\");\n if ((t.footnotes ?? []).length) after.push(t.footnotes!.map((f, i) => `[^${pfx}-${i + 1}]: ${f.text}`).join(\"\\n\"));\n return [out.join(\"\\n\"), ...after].join(\"\\n\\n\");\n}\n\n/* ── CSV / TSV ─────────────────────────────────────────────────────── */\n/** RFC 4180 parser; the delimiter is a tab when the text has one (Excel / Sheets copy), else `;` or `,` by count. */\nexport function parseDelimited(text: string, delim?: string): string[][] {\n const src = text.replace(/\\r\\n?/g, \"\\n\").replace(/\\n+$/, \"\");\n if (!src.trim()) return [];\n const firstLine = src.split(\"\\n\")[0];\n const d = delim ?? (firstLine.includes(\"\\t\") ? \"\\t\" : (firstLine.match(/;/g)?.length ?? 0) > (firstLine.match(/,/g)?.length ?? 0) ? \";\" : \",\");\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let q = false;\n for (let i = 0; i < src.length; i++) {\n const ch = src[i];\n if (q) {\n if (ch === '\"' && src[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (ch === '\"') q = false;\n else cell += ch;\n } else if (ch === '\"' && cell === \"\") q = true;\n else if (ch === d) {\n row.push(cell);\n cell = \"\";\n } else if (ch === \"\\n\") {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n } else cell += ch;\n }\n row.push(cell);\n rows.push(row);\n const w = Math.max(...rows.map((r) => r.length));\n return rows.map((r) => [...r.map((c) => c.trim()), ...Array(w - r.length).fill(\"\")]);\n}\nexport function toDelimited(rows: string[][], delim = \",\"): string {\n return rows.map((r) => r.map((c) => (/[\",\\n\\t;]/.test(c) ? `\"${c.replace(/\"/g, '\"\"')}\"` : c)).join(delim)).join(\"\\n\");\n}\n/** Header + body rows as text (CSV export, \"Copy as CSV\"). */\nexport function tableToRows(input: TableValue, resolveRef?: RefResolver): string[][] {\n const t = normalizeTable(input);\n const { bodies, foot } = orderedRows(t);\n const all = [...bodies.flatMap((b) => b.rows), ...foot];\n return [t.columns.map((c) => c.label), ...all.map((r) => t.columns.map((c) => cellText(c, r, r.cells[c._key], resolveRef)))];\n}\n\n/* ── Type inference (CSV, paste, HTML import) ──────────────────────── */\nconst CURRENCY: Record<string, string> = { $: \"USD\", \"€\": \"EUR\", \"£\": \"GBP\", \"¥\": \"JPY\", \"₹\": \"INR\", \"A$\": \"AUD\", \"C$\": \"CAD\", \"CHF\": \"CHF\" };\nconst MONEY_RX = /^(A\\$|C\\$|CHF|[$€£¥₹])\\s?-?[\\d,]*\\.?\\d+$|^-?[\\d,]*\\.?\\d+\\s?(USD|EUR|GBP|JPY|INR|AUD|CAD|CHF)$/i;\nconst NUM_RX = /^([+-]?[\\d,]*\\.?\\d+)\\s?([a-zA-Z%°][a-zA-Z%°²³/]*)?$/;\nconst RATING_RX = /^(\\d(?:\\.\\d)?)\\s?(?:\\/\\s?(5|10)|★|stars?|out of (5|10))$/i;\n\nexport interface InferredColumn {\n type: TableColumnType;\n unit?: string;\n currency?: string;\n max?: number;\n}\n/** Look at a column's non-empty values and pick the narrowest type every value fits. */\nexport function inferColumn(values: string[]): InferredColumn {\n const vs = values.map((v) => v.trim()).filter(Boolean);\n if (!vs.length) return { type: \"text\" };\n const txt = vs.map((v) => strip(v).trim());\n if (txt.every((v) => toBool(v) != null) && txt.some((v) => toBool(v) === true)) return { type: \"boolean\" };\n if (txt.every((v) => MONEY_RX.test(v))) {\n const sym = txt[0].match(/^(A\\$|C\\$|CHF|[$€£¥₹])/)?.[1] ?? txt[0].match(/(USD|EUR|GBP|JPY|INR|AUD|CAD|CHF)$/i)?.[1]?.toUpperCase();\n const cur = sym ? CURRENCY[sym] ?? sym : \"USD\";\n if (txt.every((v) => (v.match(/^(A\\$|C\\$|CHF|[$€£¥₹])/)?.[1] ?? v.match(/(USD|EUR|GBP|JPY|INR|AUD|CAD|CHF)$/i)?.[1]?.toUpperCase()) === sym)) return { type: \"money\", currency: cur };\n }\n const rating = txt.map((v) => v.match(RATING_RX));\n if (rating.every(Boolean)) return { type: \"rating\", max: Number(rating[0]![2] || rating[0]![3] || 5) };\n const nums = txt.map((v) => v.match(NUM_RX));\n if (nums.every(Boolean)) {\n const units = new Set(nums.map((m) => m![2] ?? \"\"));\n if (units.size === 1) return { type: \"number\", ...([...units][0] ? { unit: [...units][0] } : {}) };\n }\n if (vs.every((v) => /^<a\\s[^>]*href=/i.test(v) && /<\\/a>\\s*$/i.test(v) && (v.match(/<a\\s/gi)?.length ?? 0) === 1)) return { type: \"link\" };\n if (vs.some((v) => /<(strong|b|em|i|a|code|sup|sub|br)\\b/i.test(v))) return { type: \"richtext-inline\" };\n return { type: \"text\" };\n}\n/** A raw string (CSV / paste / HTML cell) → a value of `type`. */\nexport function coerce(raw: string, col: Pick<TableColumn, \"type\" | \"max\">): TableCellValue {\n const s = raw.trim();\n const plain = strip(s).trim();\n if (!plain && col.type !== \"richtext-inline\") return null;\n switch (col.type) {\n case \"boolean\":\n return toBool(plain) ?? plain;\n case \"number\":\n case \"money\":\n return toNumber(plain.replace(/(USD|EUR|GBP|JPY|INR|AUD|CAD|CHF)$/i, \"\")) ?? plain;\n case \"rating\": {\n const m = plain.match(/(\\d+(?:\\.\\d+)?)/);\n return m ? Number(m[1]) : plain;\n }\n case \"link\": {\n const m = s.match(/<a\\s[^>]*href\\s*=\\s*\"([^\"]*)\"[^>]*>([\\s\\S]*?)<\\/a>/i);\n if (m) return { label: strip(m[2]).trim(), href: m[1].replace(/&amp;/g, \"&\") };\n return /^(https?:|\\/|mailto:)/.test(plain) ? { label: plain, href: plain } : { label: plain, href: \"\" };\n }\n case \"richtext-inline\":\n return sanitizeInline(s);\n default:\n return plain;\n }\n}\n\n/** Text rows (CSV, TSV, a pasted range) → a table. `header`: first row holds the column labels. */\nexport function tableFromRows(rows: string[][], opts: { header?: boolean; caption?: string } = {}): TableValue {\n const header = opts.header ?? true;\n const width = Math.max(1, ...rows.map((r) => r.length));\n const labels = header ? rows[0] ?? [] : [];\n const body = header ? rows.slice(1) : rows;\n const columns: TableColumn[] = Array.from({ length: width }, (_, i) => {\n const inf = inferColumn(body.map((r) => r[i] ?? \"\"));\n return { _key: tkey(\"c\"), label: strip(labels[i] ?? \"\").trim(), ...inf };\n });\n const out = emptyTable(0, 0);\n out.caption = opts.caption ?? \"\";\n out.columns = columns;\n // an empty top-left header over a text column = the first column names the rows (\"\", Carbon steel, Cast iron)\n out.headerColumn = header && !!rows.length && !strip(labels[0] ?? \"\").trim() && columns[0]?.type === \"text\" && width > 1;\n out.rows = body.filter((r) => r.some((c) => c.trim())).map((r) => ({ _key: tkey(\"r\"), cells: Object.fromEntries(columns.map((c, i) => [c._key, coerce(r[i] ?? \"\", c)])) }));\n return out;\n}\n\n/** Paste a text range into a table at (row, col), growing rows / columns as needed. Values coerce to column types. */\nexport function pasteRange(input: TableValue, at: { row: number; col: number }, grid: string[][], opts: { lockColumns?: boolean } = {}): TableValue {\n const t = normalizeTable(input);\n const columns = [...t.columns];\n const rows = t.rows.map((r) => ({ ...r, cells: { ...r.cells } }));\n let r0 = at.row;\n let g = grid;\n if (r0 < 0) {\n // pasted on the header row: the first line is labels\n const labels = g[0] ?? [];\n labels.forEach((l, j) => {\n const ci = at.col + j;\n if (ci >= columns.length) {\n if (opts.lockColumns) return;\n columns.push({ _key: tkey(\"c\"), label: \"\", type: \"text\" });\n }\n columns[ci] = { ...columns[ci], label: strip(l).trim() };\n });\n g = g.slice(1);\n r0 = 0;\n }\n const need = at.col + Math.max(0, ...g.map((r) => r.length));\n while (!opts.lockColumns && columns.length < need) columns.push({ _key: tkey(\"c\"), label: \"\", type: \"text\" });\n g.forEach((line, i) => {\n const ri = r0 + i;\n while (rows.length <= ri) rows.push({ _key: tkey(\"r\"), cells: {} });\n line.forEach((raw, j) => {\n const col = columns[at.col + j];\n if (!col) return;\n rows[ri].cells[col._key] = withValue(rows[ri].cells[col._key], coerce(raw, { type: cellType(col, rows[ri], rows[ri].cells[col._key]), max: col.max }));\n });\n });\n return { ...t, columns, rows };\n}\n\n/* ── HTML → table (ours, or any site's) ────────────────────────────── */\n/**\n * Read a DOM <table> (or our <figure data-rt=\"table\">) into the model. Our own data-* marks round-trip losslessly;\n * any other table is inferred: header rows from thead / th, row headers from tbody th[scope=row] or a th first cell,\n * caption from <caption> / figcaption / aria-label, groups from thead colspans and multiple <tbody> / rowgroup rows,\n * footer from <tfoot>, types from cell text (✓/✗ → boolean, $ → money, 4.5/5 → rating), footnote marks kept as notes.\n * Body cells with colspan/rowspan are expanded (copied) — the model has no merged body cells.\n */\nexport function parseTableElement(el: Element): TableValue {\n const fig = el.matches(\"figure\") ? el : el.closest(\"figure[data-rt=table]\");\n const table = (el.matches(\"table\") ? el : el.querySelector(\"table\")) as HTMLTableElement | null;\n const out = emptyTable(0, 0);\n if (!table) return emptyTable();\n const ds = (fig as HTMLElement | null)?.dataset ?? {};\n out.id = ds.id || out.id;\n out.caption = (table.querySelector(\":scope > caption\")?.textContent ?? fig?.querySelector(\":scope > figcaption\")?.textContent ?? table.getAttribute(\"aria-label\") ?? \"\").trim();\n out.notes = (fig?.querySelector(\"[data-notes]\")?.textContent ?? \"\").trim() || undefined;\n const fnEls = Array.from(fig?.querySelectorAll(\"[data-footnotes] > li\") ?? []);\n out.footnotes = fnEls.map((li) => ({ _key: (li as HTMLElement).dataset.key || tkey(\"f\"), text: (li.textContent ?? \"\").trim() }));\n if (!out.footnotes.length) delete out.footnotes;\n const fnByIndex = new Map((out.footnotes ?? []).map((f, i) => [i + 1, f._key]));\n if (ds.responsive === \"stack\" || ds.responsive === \"cards\") out.design = { ...out.design, responsive: ds.responsive };\n if (ds.sticky === \"true\") out.design = { ...out.design, sticky: true };\n if (ds.striped === \"true\") out.design = { ...out.design, striped: true };\n if (ds.density === \"compact\") out.design = { ...out.design, density: \"compact\" };\n if (ds.caption === \"hidden\") out.design = { ...out.design, hideCaption: true };\n if (ds.filter === \"true\") out.filterable = true;\n if (ds.jsonld) out.jsonLd = { type: ds.jsonld as TableJsonLdType, ...(ds.jsonldAxis ? { axis: ds.jsonldAxis as \"rows\" | \"columns\" } : {}), ...(ds.jsonldPrice ? { priceRow: ds.jsonldPrice } : {}) };\n\n // grid expansion (handles colspan / rowspan in any section)\n type Cell = { el: HTMLTableCellElement; th: boolean; origin: boolean };\n const expand = (trs: HTMLTableRowElement[]) => {\n const grid: Cell[][] = [];\n trs.forEach((tr, ri) => {\n grid[ri] ??= [];\n let ci = 0;\n for (const c of Array.from(tr.cells)) {\n while (grid[ri][ci]) ci++;\n const cs = Math.max(1, Math.min(50, c.colSpan || 1));\n const rs = Math.max(1, Math.min(200, c.rowSpan || 1));\n for (let dr = 0; dr < rs; dr++)\n for (let dc = 0; dc < cs; dc++) {\n grid[ri + dr] ??= [];\n grid[ri + dr][ci + dc] = { el: c, th: c.tagName === \"TH\", origin: dr === 0 && dc === 0 };\n }\n ci += cs;\n }\n });\n return grid;\n };\n const theadRows = Array.from(table.tHead?.rows ?? []);\n const bodies = Array.from(table.tBodies);\n const footRows = Array.from(table.tFoot?.rows ?? []);\n let bodyRows = bodies.flatMap((b) => Array.from(b.rows).map((tr) => ({ tr, body: b })));\n // no thead: leading rows made only of th are the header\n const head = [...theadRows];\n if (!head.length) {\n while (bodyRows.length && Array.from(bodyRows[0].tr.cells).every((c) => c.tagName === \"TH\") && bodyRows[0].tr.cells.length > 1) {\n head.push(bodyRows[0].tr);\n bodyRows = bodyRows.slice(1);\n }\n }\n const hgrid = expand(head);\n const width = Math.max(1, ...hgrid.map((r) => r.length), ...expand(bodyRows.map((b) => b.tr)).map((r) => r.length));\n out.headerRow = head.length > 0;\n const cols = Array.from(table.querySelectorAll(\":scope > colgroup > col\"));\n const lastHead = hgrid[hgrid.length - 1] ?? [];\n const columns: TableColumn[] = Array.from({ length: width }, (_, i) => {\n const col = cols[i] as HTMLElement | undefined;\n const d = col?.dataset ?? {};\n const hc = lastHead[i]?.el;\n const label = hc ? cleanText(hc) : \"\";\n const c: TableColumn = { _key: d.key || (hc as HTMLElement | undefined)?.dataset?.col || tkey(\"c\"), label, type: (d.type as TableColumnType) || \"text\" };\n if (d.unit) c.unit = d.unit;\n if (d.currency) c.currency = d.currency;\n if (d.decimals) c.decimals = Number(d.decimals);\n if (d.align) c.align = d.align as TableColumn[\"align\"];\n if (d.sortable === \"true\") c.sortable = true;\n if (d.true) c.trueLabel = d.true;\n if (d.false) c.falseLabel = d.false;\n if (d.max) c.max = Number(d.max);\n if (d.refTo) c.refTo = d.refTo.split(\",\");\n if (d.highlight === \"true\") c.highlight = true;\n if (d.description) c.description = d.description;\n else if (hc?.getAttribute(\"title\")) c.description = hc.getAttribute(\"title\")!;\n return c;\n });\n // column groups: a header row above the last whose cells span several columns\n if (hgrid.length > 1) {\n const top = hgrid[0];\n const groups: TableGroup[] = [];\n for (let i = 0; i < width; ) {\n const cell = top[i];\n let span = 1;\n while (cell && i + span < width && top[i + span]?.el === cell.el) span++;\n const text = cell && cell.el !== lastHead[i]?.el ? cleanText(cell.el) : \"\";\n if (text) {\n const key = (cell.el as HTMLElement).dataset.group || tkey(\"g\");\n groups.push({ _key: key, label: text });\n for (let k = 0; k < span; k++) columns[i + k].group = key;\n }\n i += span;\n }\n if (groups.length) out.columnGroups = groups;\n }\n // body\n const rowGroups: TableGroup[] = [];\n const known = !!cols.length && cols.some((c) => (c as HTMLElement).dataset.type);\n const rawRows: { key: string; group?: string; footer?: boolean; type?: TableColumnType; highlight?: boolean; cells: (Cell | undefined)[] }[] = [];\n let currentGroup: string | undefined;\n let lastBody: HTMLTableSectionElement | null = null;\n const bgrid = expand(bodyRows.map((b) => b.tr));\n bodyRows.forEach(({ tr, body }, ri) => {\n if (body !== lastBody) {\n lastBody = body;\n const label = (body as HTMLElement).dataset.label;\n currentGroup = label ? ((body as HTMLElement).dataset.key || tkey(\"rg\")) : undefined;\n if (label && currentGroup) rowGroups.push({ _key: currentGroup, label });\n }\n const cells = bgrid[ri] ?? [];\n // a row that is one cell spanning the table (th scope=rowgroup, or a lone th/td colspan=all) opens a row group\n const only = tr.cells.length === 1 && (tr.cells[0].colSpan >= width || tr.cells[0].getAttribute(\"scope\") === \"rowgroup\");\n if (only || tr.hasAttribute(\"data-group-row\")) {\n // our own group row repeats its <tbody data-label>; anyone else's opens a new group\n if (!(tr.hasAttribute(\"data-group-row\") && (body as HTMLElement).dataset.label)) {\n currentGroup = tkey(\"rg\");\n rowGroups.push({ _key: currentGroup, label: cleanText(tr.cells[0]) });\n }\n return;\n }\n rawRows.push({ key: (tr as HTMLElement).dataset.key || tkey(\"r\"), group: currentGroup, type: ((tr as HTMLElement).dataset.type as TableColumnType) || undefined, highlight: (tr as HTMLElement).dataset.highlight === \"true\", cells });\n });\n expand(footRows).forEach((cells, i) => rawRows.push({ key: (footRows[i] as HTMLElement).dataset.key || tkey(\"r\"), footer: true, cells }));\n // header column: our mark, or every body row starts with a th\n out.headerColumn = ds.headerCol === \"true\" || (rawRows.length > 0 && rawRows.every((r) => r.cells[0]?.th && r.cells[0].el.getAttribute(\"scope\") !== \"col\"));\n // infer types for unmarked columns\n if (!known) {\n columns.forEach((c, i) => {\n if (out.headerColumn && i === 0) return;\n const inf = inferColumn(rawRows.map((r) => (r.cells[i] ? cellSource(r.cells[i]!.el) : \"\")));\n Object.assign(c, inf);\n });\n }\n out.columns = columns;\n out.rows = rawRows.map((r) => ({\n _key: r.key,\n ...(r.group ? { group: r.group } : {}),\n ...(r.footer ? { footer: true } : {}),\n ...(r.type ? { type: r.type } : {}),\n ...(r.highlight ? { highlight: true } : {}),\n cells: Object.fromEntries(\n columns.map((c, i) => {\n const cell = r.cells[i];\n if (!cell) return [c._key, null];\n return [c._key, readCell(cell.el, c, r.type, fnByIndex)];\n }),\n ),\n }));\n if (rowGroups.length) out.rowGroups = rowGroups;\n return out;\n}\n\n/** Visible text of a header/cell minus visually-hidden helpers and footnote marks. */\nfunction cleanText(el: Element): string {\n const c = el.cloneNode(true) as HTMLElement;\n c.querySelectorAll(\"sup, .bt-sort-icon, [aria-hidden=true]\").forEach((n) => n.remove());\n return (c.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n/** A cell's source for inference: inner HTML minus footnote marks, decorative icons and sr helpers kept as words. */\nfunction cellSource(el: Element): string {\n const c = el.cloneNode(true) as HTMLElement;\n c.querySelectorAll(\"sup\").forEach((n) => n.remove());\n // an icon-only cell with a visually-hidden label reads as its label (\"Included\"); an svg/img with aria-label too\n const sr = c.querySelector(\".bt-sr, .sr-only, .visually-hidden, .screen-reader-text\");\n if (sr && !(c.textContent ?? \"\").replace(sr.textContent ?? \"\", \"\").replace(/[✓✔✗✕–—\\s]/g, \"\")) return (sr.textContent ?? \"\").trim();\n const labelled = c.querySelector(\"[aria-label]\");\n if (labelled && !(c.textContent ?? \"\").trim()) return labelled.getAttribute(\"aria-label\") ?? \"\";\n const img = c.querySelector(\"img[alt]\");\n if (img && !(c.textContent ?? \"\").trim()) return img.getAttribute(\"alt\") ?? \"\";\n c.querySelectorAll(\"[aria-hidden=true]\").forEach((n) => n.remove());\n const html = c.innerHTML.trim();\n return /<(a|strong|b|em|i|code|br)\\b/i.test(html) ? html : (c.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n}\nfunction readCell(el: HTMLTableCellElement, col: TableColumn, rowType: TableColumnType | undefined, fn: Map<number, string>): TableCell {\n const d = (el as HTMLElement).dataset;\n const type = (d.type as TableColumnType) || rowType || col.type;\n let value: TableCellValue;\n if (d.empty != null) value = null;\n else if (d.ref) value = { ref: d.ref, label: cleanText(el) || undefined, href: el.querySelector(\"a\")?.getAttribute(\"href\") ?? undefined };\n else if (d.value != null && (type === \"boolean\" || type === \"number\" || type === \"money\" || type === \"rating\")) value = type === \"boolean\" ? d.value === \"true\" : Number(d.value);\n else if (type === \"richtext-inline\") {\n const c = el.cloneNode(true) as HTMLElement;\n c.querySelectorAll(\"sup\").forEach((n) => n.remove());\n value = sanitizeInline(c.innerHTML.trim());\n } else value = coerce(cellSource(el), { type, max: col.max });\n const supN = Number(el.querySelector(\"sup a, sup\")?.textContent?.trim());\n const note = d.note || (supN ? fn.get(supN) : undefined);\n if (d.type || note) return { value, ...(d.type ? { type: d.type as TableColumnType } : {}), ...(note ? { note } : {}) };\n return value;\n}\n\n/* ── JSON-LD (opt-in) ──────────────────────────────────────────────── */\n/**\n * Dataset — a report or spec table (name = caption, description = notes, variableMeasured = columns).\n * ItemList — a comparison: the things compared (row headers, or column labels) in order.\n * Offers — a pricing matrix: one Offer per plan (columns), price from the money row `priceRow`.\n * Returns null when the table can't honestly support the type (no caption, no items, no prices).\n */\nexport function tableJsonLd(input: TableValue, o: { url?: string; resolveRef?: RefResolver } = {}): Record<string, unknown> | null {\n const t = normalizeTable(input);\n const kind = t.jsonLd?.type ?? \"none\";\n if (kind === \"none\" || !t.caption.trim()) return null;\n const body = t.rows.filter((r) => !r.footer);\n if (kind === \"Dataset\") {\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Dataset\",\n name: t.caption,\n description: t.notes || t.caption,\n ...(o.url ? { url: o.url } : {}),\n variableMeasured: t.columns.filter((_c, i) => !(t.headerColumn && i === 0)).map((c) => ({ \"@type\": \"PropertyValue\", name: c.label, ...(c.unit ? { unitText: c.unit } : {}), ...(c.description ? { description: c.description } : {}) })),\n };\n }\n const axis = t.jsonLd?.axis ?? \"rows\";\n if (kind === \"ItemList\") {\n const names = axis === \"rows\" ? body.map((r) => cellText(t.columns[0], r, r.cells[t.columns[0]._key], o.resolveRef)) : t.columns.slice(t.headerColumn ? 1 : 0).map((c) => c.label);\n const items = names.filter(Boolean);\n if (!items.length) return null;\n return { \"@context\": \"https://schema.org\", \"@type\": \"ItemList\", name: t.caption, numberOfItems: items.length, itemListElement: items.map((name, i) => ({ \"@type\": \"ListItem\", position: i + 1, name })) };\n }\n // Offers: plans are columns; the price row holds money\n const priceRow = t.rows.find((r) => r._key === t.jsonLd?.priceRow) ?? body.find((r) => t.columns.some((c) => cellType(c, r, r.cells[c._key]) === \"money\"));\n if (!priceRow) return null;\n const offers = t.columns\n .slice(t.headerColumn ? 1 : 0)\n .map((c) => {\n const cell = priceRow.cells[c._key];\n const n = toNumber(cellValue(cell));\n return n == null ? null : { \"@type\": \"Offer\", name: c.label, price: n, priceCurrency: c.currency || \"USD\", ...(o.url ? { url: o.url } : {}) };\n })\n .filter(Boolean) as { price: number; priceCurrency: string }[];\n if (!offers.length) return null;\n const prices = offers.map((x) => x.price);\n return {\n \"@context\": \"https://schema.org\",\n \"@type\": \"Product\",\n name: t.caption,\n ...(t.notes ? { description: t.notes } : {}),\n offers: { \"@type\": \"AggregateOffer\", lowPrice: Math.min(...prices), highPrice: Math.max(...prices), priceCurrency: offers[0].priceCurrency, offerCount: offers.length, offers },\n };\n}\n\n/* ── Validation (the kit engine + docs + MCP all use these words) ──── */\nexport interface TableIssue {\n level: \"error\" | \"warning\";\n message: string;\n /** where: \"caption\" · \"col:<key>\" · \"row:<key>\" · \"cell:<row>:<col>\" */\n at?: string;\n}\nexport function tableIssues(input: unknown, opts: TableFieldOptions = {}): TableIssue[] {\n if (!isTableValue(input)) return [];\n const t = input;\n const out: TableIssue[] = [];\n if (!t.caption?.trim() && opts.requireCaption !== false) out.push({ level: \"error\", message: \"Give the table a title that says what it compares.\", at: \"caption\" });\n if (!t.headerRow) out.push({ level: \"warning\", message: \"Show the column names: turn on Show column names in Table settings.\" });\n if (t.headerRow) {\n const empty = t.columns.filter((c, i) => !c.label.trim() && !(t.headerColumn && i === 0));\n if (empty.length) out.push({ level: \"error\", message: `Name ${empty.length === 1 ? \"the empty column\" : `the ${empty.length} empty columns`}.`, at: `col:${empty[0]._key}` });\n }\n const keys = new Set<string>();\n for (const c of t.columns) {\n if (keys.has(c._key)) out.push({ level: \"error\", message: \"Two columns are the same column. Delete one and add it again.\", at: `col:${c._key}` });\n keys.add(c._key);\n }\n if (opts.maxColumns && t.columns.length > opts.maxColumns) out.push({ level: \"error\", message: `Use at most ${opts.maxColumns} columns.` });\n const body = t.rows.filter((r) => !r.footer);\n if (opts.minRows && body.length < opts.minRows) out.push({ level: \"error\", message: `Add at least ${opts.minRows} rows.` });\n if (opts.maxRows && body.length > opts.maxRows) out.push({ level: \"error\", message: `Use at most ${opts.maxRows} rows.` });\n let mismatch: { row: string; col: string; label: string } | null = null;\n let mismatches = 0;\n for (const r of t.rows)\n for (const c of t.columns) {\n const cell = r.cells?.[c._key];\n const v = cellValue(cell);\n if (isEmptyCell(v)) continue;\n const ty = cellType(c, r, cell);\n const bad = ((ty === \"number\" || ty === \"money\" || ty === \"rating\") && toNumber(v) == null) || (ty === \"boolean\" && toBool(v) == null);\n if (bad) {\n mismatches++;\n mismatch ??= { row: r._key, col: c._key, label: c.label };\n }\n }\n if (mismatch)\n out.push({ level: \"warning\", message: `${mismatches} ${mismatches === 1 ? \"cell doesn't\" : \"cells don't\"} match the column type (first in “${mismatch.label || \"a column\"}”). Change the column type or set the cell's own type.`, at: `cell:${mismatch.row}:${mismatch.col}` });\n if (t.headerColumn && body.some((r) => isEmptyCell(cellValue(r.cells?.[t.columns[0]?._key])))) out.push({ level: \"warning\", message: \"Every row needs a name in the first column.\" });\n if (t.jsonLd?.type === \"Dataset\" && (t.notes ?? \"\").length < 50) out.push({ level: \"warning\", message: \"To be read as a data report, write a note under the table (a sentence or two).\" });\n if (t.jsonLd?.type === \"Offers\" && !tableJsonLd(t)) out.push({ level: \"warning\", message: \"To be read as a price list, add a row of prices, one per plan column.\" });\n if (t.columns.length > 8 && t.design?.responsive !== \"scroll\") out.push({ level: \"warning\", message: \"More than 8 columns don't fit on phones as a list. In Table settings, set On phones to Scroll.\" });\n return out;\n}\n\n/** \"4 rows × 3 columns\" (array rows, summaries, breadcrumbs). */\nexport function tableSummary(v: unknown): string {\n if (!isTableValue(v)) return \"\";\n const r = v.rows.length;\n const c = v.columns.length;\n return [v.caption?.trim(), `${r} ${r === 1 ? \"row\" : \"rows\"} × ${c} ${c === 1 ? \"column\" : \"columns\"}`].filter(Boolean).join(\" · \");\n}\n\n/** Build a table in code (seed data, Kit Library, migrations): header labels + rows of display strings. */\nexport function tableFrom(\n caption: string,\n columns: (Partial<TableColumn> & { label: string })[],\n rows: (TableCell[] | { cells: TableCell[]; group?: string; footer?: boolean; type?: TableColumnType; highlight?: boolean })[],\n extra: Partial<Omit<TableValue, \"columns\" | \"rows\" | \"caption\">> = {},\n): TableValue {\n const cols: TableColumn[] = columns.map((c, i) => ({ type: \"text\", ...c, _key: c._key ?? `c${i + 1}` }));\n return {\n id: extra.id ?? `tbl_${caption.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").slice(0, 32).replace(/-$/, \"\")}`,\n caption,\n headerRow: true,\n headerColumn: false,\n design: { responsive: \"scroll\" },\n ...extra,\n columns: cols,\n rows: rows.map((r, ri) => {\n const def = Array.isArray(r) ? { cells: r } : r;\n return {\n _key: `r${ri + 1}`,\n ...(def.group ? { group: def.group } : {}),\n ...(def.footer ? { footer: true } : {}),\n ...(def.type ? { type: def.type } : {}),\n ...(def.highlight ? { highlight: true } : {}),\n cells: Object.fromEntries(cols.map((c, ci) => [c._key, def.cells[ci] ?? null])),\n };\n }),\n };\n}\n"],"mappings":";AAgCA,IAAa,qBAAuF;CAClG;EAAE,OAAO;EAAQ,OAAO;EAAQ,aAAa;CAAc;CAC3D;EAAE,OAAO;EAAU,OAAO;EAAU,aAAa;CAAqC;CACtF;EAAE,OAAO;EAAS,OAAO;EAAS,aAAa;CAA4B;CAC3E;EAAE,OAAO;EAAW,OAAO;EAAY,aAAa;CAAqC;CACzF;EAAE,OAAO;EAAU,OAAO;EAAU,aAAa;CAAW;CAC5D;EAAE,OAAO;EAAQ,OAAO;EAAQ,aAAa;CAAc;CAC3D;EAAE,OAAO;EAAmB,OAAO;EAAa,aAAa;CAA4B;CACzF;EAAE,OAAO;EAAa,OAAO;EAAa,aAAa;CAAyB;AAClF;;;;;AAqIA,IAAa,gBAAmC;CAAE,QAAQ;EAAC;EAAY;EAAW;CAAQ;CAAG,UAAU;EAAE,MAAM;EAAM,QAAQ;CAAK;AAAE;AAqBpI,IAAI,MAAM;AACV,IAAa,QAAQ,MAAc,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,MAAA,CAAO,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;AAE1I,SAAgB,WAAW,OAAO,GAAG,OAAO,GAAe;CACzD,MAAM,UAAU,MAAM,KAAK,EAAE,QAAQ,KAAK,UAAU;EAAE,MAAM,KAAK,GAAG;EAAG,OAAO;EAAI,MAAM;CAAgB,EAAE;CAC1G,OAAO;EACL,IAAI,KAAK,KAAK;EACd,SAAS;EACT,WAAW;EACX,cAAc;EACd;EACA,MAAM,MAAM,KAAK,EAAE,QAAQ,KAAK,UAAU;GAAE,MAAM,KAAK,GAAG;GAAG,OAAO,CAAC;EAAE,EAAE;EACzE,QAAQ,EAAE,YAAY,SAAS;CACjC;AACF;AAEA,IAAa,aAAa,MAA6C,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AACvH,IAAa,gBAAgB,MAAqC,UAAU,CAAC,KAAK,WAAW;AAC7F,IAAa,gBAAgB,MAAgC,UAAU,CAAC,KAAK,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI;;AAG7H,SAAgB,eAAe,GAAwB;CACrD,IAAI,CAAC,aAAa,CAAC,GAAG,OAAO,WAAW;CACxC,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,QAAQ,GAAY,MAAc;EACtC,IAAI,MAAM,OAAO,MAAM,YAAY,IAAI,IAAI,KAAK,CAAC;EACjD,OAAO,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC;EAClC,KAAK,IAAI,GAAG;EACZ,OAAO;CACT;CACA,MAAM,UAAU,EAAE,QAAQ,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO;EAAE,GAAG;EAAG,MAAM,KAAK,EAAE,MAAM,GAAG;EAAG,OAAO,OAAO,EAAE,SAAS,EAAE;EAAG,MAAO,mBAAmB,MAAM,MAAM,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE,OAAO;CAA2B,EAAE;CACzN,MAAM,OAAO,EAAE,KAAK,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO;EAAE,GAAG;EAAG,MAAM,KAAK,EAAE,MAAM,GAAG;EAAG,OAAO,UAAU,EAAE,KAAK,IAAK,EAAE,QAA8B,CAAC;CAAE,EAAE;CACrJ,OAAO;EACL,GAAG;EACH,IAAI,OAAO,EAAE,OAAO,YAAY,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK;EACxD,SAAS,OAAO,EAAE,WAAW,EAAE;EAC/B,WAAW,EAAE,cAAc;EAC3B,cAAc,CAAC,CAAC,EAAE;EAClB;EACA;EACA,eAAe,EAAE,gBAAgB,CAAC,EAAA,CAAG,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO;GAAE,GAAG;GAAG,MAAM,KAAK,EAAE,MAAM,GAAG;EAAE,EAAE;EACrG,YAAY,EAAE,aAAa,CAAC,EAAA,CAAG,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO;GAAE,GAAG;GAAG,MAAM,KAAK,EAAE,MAAM,IAAI;EAAE,EAAE;EAChG,YAAY,EAAE,aAAa,CAAC,EAAA,CAAG,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO;GAAE,GAAG;GAAG,MAAM,KAAK,EAAE,MAAM,GAAG;EAAE,EAAE;CACjG;AACF;AAGA,IAAa,aAAa,MAA8C,MAAM,KAAA,IAAY,OAAO,aAAa,CAAC,IAAI,EAAE,QAAQ;AAC7H,IAAa,YAAY,MAAkD,aAAa,CAAC,IAAI,EAAE,OAAO,KAAA;AACtG,IAAa,YAAY,KAAkB,KAAgB,MAAoC,aAAa,CAAC,KAAK,EAAE,QAAS,KAAK,QAAQ,IAAI;;AAG9I,SAAgB,UAAU,GAA0B,OAAkC;CACpF,IAAI,aAAa,CAAC,GAAG,OAAO;EAAE,GAAG;EAAG;CAAM;CAC1C,OAAO;AACT;AAEA,IAAa,eAAe,MAAsB,KAAK,QAAQ,MAAM,MAAO,UAAU,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,MAAO,EAAgB,SAAU,EAAgB;AAE9J,IAAM,SAAS,MAAc,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,QAAQ,WAAW,GAAG,CAAC,CAAC,QAAQ,UAAU,GAAG,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,CAAC,QAAQ,WAAW,IAAG,CAAC,CAAC,QAAQ,UAAU,GAAG;AAE/L,SAAgB,WAAW,KAAkB;CAC3C,OAAO;EAAE,KAAK,IAAI,aAAa;EAAY,IAAI,IAAI,cAAc;CAAe;AAClF;AAEA,SAAgB,aAAa,GAAW,UAAmB;CACzD,OAAO,IAAI,KAAK,aAAa,SAAS,YAAY,OAAO;EAAE,uBAAuB;EAAU,uBAAuB;CAAS,IAAI,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACxK;AACA,SAAgB,YAAY,GAAW,WAAW,OAAO,UAAmB;CAC1E,IAAI;EACF,MAAM,QAAQ,OAAO,UAAU,CAAC,KAAK,YAAY;EACjD,OAAO,IAAI,KAAK,aAAa,SAAS;GAAE,OAAO;GAAY;GAAU,uBAAuB,QAAQ,IAAI,YAAY;GAAG,uBAAuB,QAAQ,IAAI,YAAY;EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;CACrL,QAAQ;EACN,OAAO,GAAG,aAAa,GAAG,QAAQ,EAAE,GAAG;CACzC;AACF;AACA,IAAa,YAAY,MAA8B;CACrD,IAAI,OAAO,MAAM,UAAU,OAAO,OAAO,SAAS,CAAC,IAAI,IAAI;CAC3D,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,MAAM,IAAI,EAAE,QAAQ,UAAU,EAAE,CAAC,CAAC,QAAQ,aAAa,EAAE;CACzD,IAAI,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,GAAG,OAAO;CAC9C,OAAO,OAAO,CAAC;AACjB;;AAGA,SAAgB,SAAS,KAAkB,KAA2B,GAA0B,YAAkC;CAChI,MAAM,IAAI,UAAU,CAAC;CACrB,IAAI,YAAY,CAAC,GAAG,OAAO;CAE3B,QADU,SAAS,KAAK,KAAK,CACrB,GAAR;EACE,KAAK,WAAW;GACd,MAAM,IAAI,OAAO,CAAC;GAClB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;EAClF;EACA,KAAK,UAAU;GACb,MAAM,IAAI,SAAS,CAAC;GACpB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,QAAQ,IAAI,IAAI,OAAQ,QAAQ,KAAK,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,SAAU;EAC7I;EACA,KAAK,SAAS;GACZ,MAAM,IAAI,SAAS,CAAC;GACpB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,YAAY,GAAG,IAAI,YAAY,OAAO,IAAI,QAAQ;EAC1F;EACA,KAAK,UAAU;GACb,MAAM,IAAI,SAAS,CAAC;GACpB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC,IAAI,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,EAAE,UAAU,IAAI,OAAO;EACvG;EACA,KAAK,QACH,OAAO,UAAU,CAAC,IAAI,OAAQ,EAAgB,SAAU,EAAgB,QAAQ,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC;EACvG,KAAK,aAAa;GAChB,IAAI,CAAC,UAAU,CAAC,GAAG,OAAO,MAAM,OAAO,CAAC,CAAC;GACzC,MAAM,IAAI;GACV,OAAO,aAAa,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE;EACpD;EACA,SACE,OAAO,UAAU,CAAC,IAAI,OAAQ,EAAgB,SAAS,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;CAC5G;AACF;AAEA,SAAgB,OAAO,GAA4B;CACjD,IAAI,OAAO,MAAM,WAAW,OAAO;CACnC,IAAI,OAAO,MAAM,UAAU,OAAO;CAClC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY;CACtC,IAAI,WAAW,IAAI,CAAC,GAAG,OAAO;CAC9B,IAAI,YAAY,IAAI,CAAC,GAAG,OAAO;CAC/B,OAAO;AACT;AACA,IAAM,6BAAa,IAAI,IAAI;CAAC;CAAK;CAAK;CAAM;CAAK;CAAK;CAAO;CAAK;CAAQ;CAAY;CAAa;CAAa;CAAO;CAAS;AAAG,CAAC;AACpI,IAAM,8BAAc,IAAI,IAAI;CAAC;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAM;CAAK;CAAS;CAAgB;CAAe;CAAiB;CAAe;CAAK;CAAK;CAAK;AAAG,CAAC;AAgBjK,IAAM,OAAO,MAAc,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC,QAAQ,MAAM,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM;AAC9F,IAAM,WAAW,MAAc,IAAI,CAAC,CAAC,CAAC,QAAQ,MAAM,QAAQ;AAC5D,IAAM,YAAY,MAAe,mCAAmC,KAAK,CAAC,IAAI,MAAM;AACpF,IAAM,8BAAc,IAAI,IAAI;CAAC;CAAU;CAAK;CAAM;CAAK;CAAK;CAAK;CAAO;CAAQ;CAAK;CAAM;CAAO;CAAO;CAAQ;CAAS;AAAM,CAAC;;AAEjI,SAAgB,eAAe,MAAsB;CACnD,OAAO,KACJ,QAAQ,kEAAkE,EAAE,CAAC,CAC7E,QAAQ,qCAAqC,GAAG,KAAa,UAAkB;EAC9E,MAAM,IAAI,IAAI,YAAY;EAC1B,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,OAAO;EAChC,IAAI,EAAE,WAAW,IAAI,GAAG,OAAO,KAAK,MAAM,MAAM,WAAW,MAAM,MAAM,OAAO,EAAE;EAChF,IAAI,MAAM,KAAK;GACb,MAAM,OAAO,MAAM,MAAM,mCAAmC;GAE5D,OAAO,YAAY,QAAQ,SADjB,OAAO,KAAK,MAAM,KAAK,MAAM,KAAK,EACP,CAAC,EAAE;EAC1C;EACA,IAAI,MAAM,QAAQ;GAChB,MAAM,QAAQ,MAAM,MAAM,wBAAwB;GAClD,OAAO,QAAQ,gBAAgB,QAAQ,MAAM,EAAE,EAAE,MAAM;EACzD;EACA,OAAO,IAAI,MAAM,MAAM,WAAW,MAAM,MAAM,OAAO,EAAE;CACzD,CAAC;AACL;AAEA,IAAM,WAAW,KAAkB,MAAuB,IAAI,UAAU,MAAM,YAAY,MAAM,WAAW,MAAM,WAAW,QAAQ;AACpI,IAAM,iBAAiB,MAAkB,IAAI,KAAK,EAAE,aAAa,CAAC,EAAA,CAAG,KAAK,GAAG,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC;;AAGnG,SAAS,SAAS,GAAe,KAAkB,KAA2B,GAA0B,GAAkB,IAAyB,UAAqD;CACtM,MAAM,IAAI,UAAU,CAAC;CACrB,MAAM,OAAO,SAAS,KAAK,KAAK,CAAC;CACjC,MAAM,QAAQ,EAAE,UAAU;CAC1B,MAAM,WAAW,SAAS,aAAa,CAAC,KAAK,EAAE,OAAO,eAAe,EAAE,KAAK,KAAK;CACjF,MAAM,OAAO,SAAS,CAAC;CACvB,MAAM,IAAI,OAAO,GAAG,IAAI,IAAI,IAAI,KAAA;CAChC,MAAM,MAAM,IAAI,kBAAkB,QAAQ,EAAE,MAAM,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,EAAE,cAAc;CAC5G,MAAM,WAAW,SAAS,OAAO,eAAe,QAAQ,IAAI,EAAE,KAAK;CACnE,IAAI,QAAQ;CACZ,IAAI,YAAY;CAChB,IAAI,YAAY,CAAC,GAAG;EAClB,QAAQ,WAAW,KAAK;EACxB,YAAY,QAAQ,mBAAmB;CACzC,OACE,QAAQ,MAAR;EACE,KAAK,WAAW;GACd,MAAM,IAAI,OAAO,CAAC;GAClB,IAAI,KAAK,MAAM,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;QACtC;IACH,MAAM,EAAE,KAAK,OAAO,WAAW,GAAG;IAClC,QAAQ,uDAAuD,EAAE,IAAI,IAAI,MAAM,IAAI,6BAA6B,IAAI,IAAI,MAAM,EAAE,EAAE;IAClI,YAAY,QAAQ,gBAAgB,EAAE,KAAK;GAC7C;GACA;EACF;EACA,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,MAAM,SAAS,CAAC;GACtB,QAAQ,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC;GACjC,IAAI,OAAO,QAAQ,OAAO,YAAY,gBAAgB,IAAI;GAC1D;EACF;EACA,KAAK,UAAU;GACb,MAAM,MAAM,SAAS,CAAC;GACtB,IAAI,OAAO,MAAM,QAAQ,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;QACxC;IACH,MAAM,MAAM,IAAI,OAAO;IAEvB,QAAQ,qDAAqD,IAAI,aAAa,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,EAAE,CAAC,EAAE,0BAA0B,IAAI;IACzI,IAAI,OAAO,YAAY,gBAAgB,IAAI;GAC7C;GACA;EACF;EACA,KAAK,QAAQ;GACX,MAAM,IAAI,UAAU,CAAC,IAAK,IAAkB;IAAE,OAAO,OAAO,CAAC;IAAG,MAAM;GAAG;GACzE,MAAM,MAAM,CAAC,EAAE,SAAS,aAAa,IAAI,EAAE,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;GAC3G,QAAQ,EAAE,OAAO,YAAY,QAAQ,SAAS,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,uBAAqB,KAAK,MAAM,SAAS,IAAI,KAAK,GAAG,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,KAAK;GACvK;EACF;EACA,KAAK,aAAa;GAChB,MAAM,IAAc,UAAU,CAAC,IAAK,IAAiB,EAAE,KAAK,OAAO,CAAC,EAAE;GACtE,MAAM,OAAO,EAAE,aAAa,EAAE,GAAG;GACjC,MAAM,QAAQ,MAAM,SAAS,EAAE,SAAS,EAAE;GAC1C,MAAM,OAAO,MAAM,QAAQ,EAAE;GAC7B,QAAQ,OAAO,YAAY,QAAQ,SAAS,IAAI,CAAC,EAAE,IAAI,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAK;GACnF,IAAI,OAAO,YAAY,cAAc,QAAQ,EAAE,GAAG,EAAE;GACpD;EACF;EACA,KAAK;GACH,QAAQ,eAAe,OAAO,UAAU,CAAC,IAAK,EAAgB,SAAS,KAAK,CAAC,CAAC;GAC9E;EACF,SACE,QAAQ,IAAI,UAAU,CAAC,IAAI,OAAQ,EAAgB,SAAS,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC;CACtF;CACF,MAAM,QAAQ,QAAQ,KAAK,IAAI;CAC/B,MAAM,YAAY,UAAU,UAAU,gBAAgB,MAAM,KAAK;CACjE,OAAO;EAAE,OAAO,QAAQ;EAAK,OAAO,GAAG,WAAW,YAAY,WAAW;CAAY;AACvF;;AAGA,SAAgB,YAAY,GAAe;CACzC,MAAM,SAAS,EAAE,aAAa,CAAC;CAC/B,MAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC;CAC/C,MAAM,OAAO,EAAE,KAAK,QAAQ,MAAM,CAAC,EAAE,MAAM;CAC3C,MAAM,QAAQ,KAAK,QAAQ,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE,KAAK,CAAC;CAChE,MAAM,SAAqD,CAAC;CAC5D,IAAI,MAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;CAC/D,KAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,UAAU,EAAE,IAAI;EAClD,IAAI,KAAK,QAAQ,OAAO,KAAK;GAAE,OAAO;GAAG;EAAK,CAAC;CACjD;CACA,OAAO;EAAE;EAAQ,MAAM,EAAE,KAAK,QAAQ,MAAM,EAAE,MAAM;CAAE;AACxD;;AAGA,SAAgB,SAAS,GAAe,MAAkB,KAAa,KAAyB;CAC9F,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,SAAS,GAAG;CAChD,IAAI,CAAC,KAAK,OAAO;CACjB,MAAM,OAAO,MAAgB;EAC3B,MAAM,IAAI,EAAE,MAAM;EAClB,MAAM,KAAK,SAAS,KAAK,GAAG,CAAC;EAC7B,MAAM,IAAI,UAAU,CAAC;EACrB,IAAI,OAAO,YAAY,OAAO,WAAW,OAAO,UAAU,OAAO,SAAS,CAAC;EAC3E,IAAI,OAAO,WAAW,OAAO,OAAO,CAAC,KAAK,OAAO,OAAO,OAAO,CAAC,IAAI,IAAI;EACxE,OAAO,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK;CAC9C;CACA,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;EAC9B,MAAM,IAAI,IAAI,CAAC;EACf,MAAM,IAAI,IAAI,CAAC;EACf,IAAI,KAAK,QAAQ,KAAK,MAAM,OAAO;EACnC,IAAI,KAAK,MAAM,OAAO;EACtB,IAAI,KAAK,MAAM,OAAO;EACtB,QAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,GAAG,MAAM,EAAE,SAAS,KAAK,CAAC,KAAK;CAClI,CAAC;AACH;;AAGA,SAAgB,gBAAgB,OAAmB,IAAmB,CAAC,GAAW;CAChF,MAAM,IAAI,eAAe,KAAK;CAC9B,MAAM,QAAQ,EAAE,UAAU;CAC1B,MAAM,KAAK,EAAE;CACb,MAAM,OAAO,EAAE;CACf,MAAM,IAAI,KAAK;CACf,MAAM,KAAK,cAAc,CAAC;CAC1B,MAAM,UAAU,EAAE,gBAAgB,CAAC,EAAA,CAAG,QAAQ,MAAM,KAAK,MAAM,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC;CACxF,MAAM,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC,EAAA,CAAG,SAAS,sBAAsB,QAAQ,EAAE,EAAE,WAAW;CACzG,MAAM,MAAgB,CAAC;CACvB,MAAM,WAAW;EACf;EACA,YAAY,QAAQ,EAAE,EAAE;EACxB;EACA,QAAQ,oBAAoB,EAAE,UAAU,KAAK;EAC7C,EAAE,eAAe,2BAA2B;EAC5C,oBAAoB,EAAE,QAAQ,cAAc,SAAS;EACrD,EAAE,QAAQ,SAAS,uBAAuB;EAC1C,EAAE,QAAQ,UAAU,wBAAwB;EAC5C,EAAE,QAAQ,YAAY,YAAY,2BAA2B;EAC7D,EAAE,QAAQ,cAAc,0BAA0B;EAClD,SAAS,EAAE,aAAa,uBAAuB;EAC/C,SAAS,EAAE,UAAU,EAAE,OAAO,SAAS,SAAS,gBAAgB,EAAE,OAAO,KAAK,GAAG,EAAE,OAAO,OAAO,sBAAsB,EAAE,OAAO,KAAK,KAAK,KAAK,EAAE,OAAO,WAAW,uBAAuB,QAAQ,EAAE,OAAO,QAAQ,EAAE,KAAK,OAAO;CACnO,CAAC,CAAC,OAAO,OAAO;CAChB,IAAI,KAAK,WAAW,SAAS,KAAK,GAAG,EAAE,EAAE;CAEzC,IAAI,KAAK,sEAAsE,QAAQ,EAAE,EAAE,WAAW;CACtG,IAAI,KAAK,SAAS,YAAY,EAAE;CAChC,IAAI,KAAK,gBAAgB,QAAQ,EAAE,EAAE,WAAW,EAAE,QAAQ,cAAc,mBAAmB,GAAG,GAAG,IAAI,EAAE,WAAW,OAAO,EAAE,WAAW;CACtI,IAAI,SAAS,OAAO,QAClB,IAAI,KACF,aAAa,KACV,KAAK,MAAM;EACV,IAAI,CAAC,OAAO,OAAO;EAiBnB,OAAO,QAhBG;GACR,aAAa,QAAQ,EAAE,IAAI,EAAE;GAC7B,cAAc,EAAE,KAAK;GACrB,EAAE,OAAO,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK;GAC5C,EAAE,WAAW,kBAAkB,QAAQ,EAAE,QAAQ,EAAE,KAAK;GACxD,EAAE,YAAY,OAAO,kBAAkB,EAAE,SAAS,KAAK;GACvD,EAAE,QAAQ,eAAe,EAAE,MAAM,KAAK;GACtC,EAAE,WAAW,yBAAyB;GACtC,EAAE,QAAQ,eAAe,QAAQ,EAAE,KAAK,EAAE,KAAK;GAC/C,EAAE,YAAY,cAAc,QAAQ,EAAE,SAAS,EAAE,KAAK;GACtD,EAAE,aAAa,eAAe,QAAQ,EAAE,UAAU,EAAE,KAAK;GACzD,EAAE,OAAO,OAAO,aAAa,EAAE,IAAI,KAAK;GACxC,EAAE,OAAO,SAAS,gBAAgB,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK;GAClE,EAAE,cAAc,qBAAqB,QAAQ,EAAE,WAAW,EAAE,KAAK;GACjE,EAAE,YAAY,0BAA0B;EAC1C,CAAC,CAAC,OAAO,OACM,CAAA,CAAE,KAAK,GAAG,EAAE;CAC7B,CAAC,CAAC,CACD,KAAK,EAAE,EAAE,YACd;CAGF,IAAI,EAAE,WAAW;EACf,IAAI,KAAK,SAAS;EAClB,IAAI,OAAO,QAAQ;GACjB,MAAM,QAAkB,CAAC;GACzB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAK;IACvB,MAAM,IAAI,KAAK,EAAE,CAAC,SAAS,OAAO,MAAM,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC,KAAK;IACtE,IAAI,CAAC,GAAG;KACN,MAAM,KAAK,WAAW;KACtB;KACA;IACF;IACA,IAAI,OAAO;IACX,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM;IACxD,MAAM,KAAK,uBAAuB,OAAO,IAAI,aAAa,KAAK,KAAK,KAAK,QAAQ,gBAAgB,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM;IAC/I,KAAK;GACP;GACA,IAAI,KAAK,MAAM,QAAQ,iBAAiB,GAAG,GAAG,MAAM,KAAK,EAAE,EAAE,MAAM;EACrE;EACA,IAAI,KACF,OAAO,KACJ,KAAK,GAAG,MAAM;GACb,MAAM,OAAO,EAAE;GACf,MAAM,QAAQ,QAAQ,GAAG,IAAI;GAC7B,MAAM,WAAW,EAAE,eAAe,EAAE;GACpC,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAO,EAAE,KAAK,MAAM;GAClD,MAAM,WAAW,WAAW,eAAe,QAAQ,IAAI,cAAc,QAAQ,KAAK,eAAe,OAAO,KAAK;GAE7G,IAAI,MAAM,KAAK,EAAE,gBAAgB,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,MAAM,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG;GAC7G,MAAM,QAAQ,IAAI,EAAE,SAAS,UAAU,IAAI,GAAG;GAC9C,MAAM,QAAQ,EAAE,cAAc,WAAW,QAAQ,EAAE,WAAW,EAAE,KAAK;GACrE,MAAM,UAAU,WAAW,wDAAwD,QAAQ,EAAE,IAAI,EAAE,IAAI,MAAM,gDAAgD,QAAQ,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,oBAAoB;GAC1N,OAAO,kBAAkB,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,UAAU,UAAU,gBAAgB,MAAM,KAAK,KAAK,EAAE,YAAY,2BAA2B,KAAK,QAAQ,SAAS,GAAG,QAAQ;EACzM,CAAC,CAAC,CACD,KAAK,EAAE,EAAE,MACd;EACA,IAAI,KAAK,UAAU;CACrB;CACA,MAAM,WAAW,MAAgB;EAC/B,MAAM,QAAQ,KAAK,KAAK,GAAG,MAAM;GAC/B,MAAM,OAAO,EAAE,gBAAgB,MAAM;GACrC,MAAM,EAAE,OAAO,UAAU,SAAS,GAAG,GAAG,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,IAAI;GACvE,MAAM,QAAQ,gBAAgB,QAAQ,EAAE,SAAS,UAAU,IAAI,GAAG,EAAE,GAAG,EAAE,YAAY,2BAA2B;GAChH,OAAO,OAAO,kBAAkB,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,MAAM,SAAS,MAAM,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,QAAQ,MAAM,GAAG,MAAM;EACvL,CAAC;EACD,OAAO,MAAM,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,KAAK,SAAS,EAAE,OAAO,eAAe,EAAE,KAAK,KAAK,KAAK,EAAE,YAAY,2BAA2B,GAAG,GAAG,MAAM,KAAK,EAAE,EAAE;CAC/K;CACA,MAAM,EAAE,QAAQ,SAAS,YAAY,CAAC;CACtC,MAAM,OAAO,SAAqB;EAChC,MAAM,OAAO,EAAE,cAAc,KAAK,QAAQ,MAAM,EAAE,YAAa,IAAI,EAAE,IAAI,CAAC,IAAI;EAC9E,OAAO,EAAE,OAAO,SAAS,GAAG,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,GAAG,IAAI;CAC9D;CACA,KAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,OAAO,IAAI,EAAE,IAAI;EACvB,IAAI,EAAE,OAAO;GACX,IAAI,KAAK,SAAS,QAAQ,cAAc,QAAQ,EAAE,MAAM,IAAI,EAAE,gBAAgB,QAAQ,EAAE,MAAM,KAAK,EAAE,KAAK,GAAG,EAAE;GAC/G,IAAI,KAAK,uBAAuB,QAAQ,oBAAoB,GAAG,iCAAiC,EAAE,IAAI,IAAI,EAAE,MAAM,KAAK,EAAE,WAAW;EACtI,OAAO,IAAI,KAAK,SAAS;EACzB,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;EACnC,IAAI,KAAK,UAAU;CACrB;CACA,IAAI,KAAK,QAAQ,IAAI,KAAK,UAAU,KAAK,IAAI,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,SAAS;CACxE,IAAI,KAAK,gBAAgB;CACzB,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,EAAA,CAAG,QAAQ;EACzC,IAAI,KAAK,6BAA6B,QAAQ,EAAE,EAAE,SAAS;EAC3D,IAAI,EAAE,OAAO,IAAI,KAAK,KAAK,QAAQ,gBAAgB,GAAG,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK;EAC3E,KAAK,EAAE,aAAa,CAAC,EAAA,CAAG,QACtB,IAAI,KAAK,MAAM,QAAQ,oBAAoB,GAAG,GAAG,EAAE,UAAW,KAAK,GAAG,MAAM,WAAW,QAAQ,EAAE,EAAE,MAAM,IAAI,EAAE,GAAG,QAAQ,cAAc,QAAQ,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,MAAM;EACxM,IAAI,KAAK,QAAQ;CACnB;CACA,IAAI,KAAK,WAAW;CACpB,MAAM,OAAO,IAAI,KAAK,EAAE;CACxB,OAAO,EAAE,QAAQ,eAAe,WAAW,EAAE,QAAQ,eAAe,UAAU,eAAe,IAAI,IAAI;AACvG;;;;;;AAOA,SAAS,eAAe,MAAc;CACpC,OAAO,KACJ,QAAQ,mBAAmB,uBAAqB,CAAC,CACjD,QAAQ,kCAAkC,uBAAqB,CAAC,CAChE,QAAQ,iBAAiB,kBAAgB,CAAC,CAC1C,QAAQ,+BAA+B,wCAAoC,CAAC,CAC5E,QAAQ,+BAA+B,qCAAiC,CAAC,CACzE,QAAQ,iBAAiB,mBAAiB;AAC/C;AAGA,IAAM,UAAU,MAAc,EAAE,QAAQ,OAAO,MAAM,CAAC,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC,QAAQ,aAAa,GAAG,CAAC,CAAC,KAAK;AAC5G,SAAS,SAAS,MAAsB;CACtC,OAAO,MACL,eAAe,IAAI,CAAC,CACjB,QAAQ,+BAA+B,QAAQ,CAAC,CAChD,QAAQ,2BAA2B,MAAM,CAAC,CAC1C,QAAQ,6BAA6B,MAAM,CAAC,CAC5C,QAAQ,uCAAuC,IAAI,GAAW,MAAc,IAAI,EAAE,IAAI,EAAE,QAAQ,UAAU,GAAG,EAAE,EAAE,CAAC,CAClH,QAAQ,SAAS,GAAG,CACzB;AACF;;;;;AAKA,SAAgB,gBAAgB,OAAmB,IAAkE,CAAC,GAAW;CAC/H,MAAM,IAAI,eAAe,KAAK;CAC9B,MAAM,OAAO,EAAE;CACf,IAAI,CAAC,KAAK,QAAQ,OAAO;CACzB,MAAM,SAAS,IAAI,KAAK,EAAE,gBAAgB,CAAC,EAAA,CAAG,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;CAC3E,MAAM,KAAK,cAAc,CAAC;CAC1B,MAAM,OAAO,EAAE,MAAM,IAAA,CAAK,QAAQ,WAAW,EAAE;CAC/C,MAAM,OAAO,KAAK,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,SAAS,OAAO,IAAI,EAAE,KAAK,GAAG,EAAE,UAAU,MAAM,KAAK,EAAE,eAAe,KAAK,UAAU,IAAI,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,KAAK,GAAG;CAC5K,MAAM,MAAM,KAAK,KAAK,MAAO,QAAQ,GAAG,EAAE,IAAI,MAAM,QAAQ,SAAS,QAAQ,GAAG,EAAE,IAAI,MAAM,WAAW,UAAU,KAAM;CACvH,MAAM,QAAQ,UAAoB,KAAK,MAAM,KAAK,KAAK,EAAE;CACzD,MAAM,OAAO,MACX,KACE,KAAK,KAAK,GAAG,MAAM;EACjB,MAAM,OAAO,EAAE,MAAM,EAAE;EACvB,MAAM,IAAI,UAAU,IAAI;EACxB,MAAM,KAAK,SAAS,GAAG,GAAG,IAAI;EAC9B,IAAI,IAAI,OAAO,qBAAqB,OAAO,MAAM,WAAW,SAAS,CAAC,IAAI,SAAS,GAAG,GAAG,MAAM,EAAE,UAAU;EAC3G,IAAI,OAAO,UAAU,UAAU,CAAC,KAAM,EAAgB,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAK,EAAgB,IAAI,IAAK,EAAgB,KAAK;EACvI,IAAI,OAAO,eAAe,UAAU,CAAC,GAAG;GACtC,MAAM,OAAO,EAAE,aAAc,EAAe,GAAG,CAAC,EAAE,QAAS,EAAe;GAC1E,IAAI,MAAM,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI,KAAK;EACrD;EACA,IAAI,CAAC,KAAK,EAAE,EAAE,gBAAgB,MAAM,IAAI,IAAI;EAC5C,IAAI,EAAE,gBAAgB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE;EAC/C,MAAM,OAAO,SAAS,IAAI;EAC1B,IAAI,QAAQ,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE;EACxD,OAAO,OAAO,CAAC,KAAK;CACtB,CAAC,CACH;CACF,MAAM,MAAgB,CAAC;CACvB,IAAI,KAAK,KAAK,OAAO,EAAE,WAAW,OAAO,EAAE,KAAK,EAAE;CAClD,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,GAAG,CAAC;CAC9B,MAAM,EAAE,QAAQ,SAAS,YAAY,CAAC;CACtC,KAAK,MAAM,KAAK,QAAQ;EACtB,IAAI,EAAE,OAAO,IAAI,KAAK,KAAK,CAAC,KAAK,OAAO,EAAE,MAAM,KAAK,EAAE,KAAK,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;EAC7F,EAAE,KAAK,SAAS,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;CACxC;CACA,KAAK,SAAS,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC;CACpC,MAAM,QAAkB,CAAC;CACzB,IAAI,EAAE,OAAO,MAAM,KAAK,EAAE,KAAK;CAC/B,MAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,WAAW;CAClD,IAAI,UAAU,QAAQ,MAAM,KAAK,UAAU,KAAK,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,aAAa,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG;CACtG,KAAK,EAAE,aAAa,CAAC,EAAA,CAAG,QAAQ,MAAM,KAAK,EAAE,UAAW,KAAK,GAAG,MAAM,KAAK,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC;CACjH,OAAO,CAAC,IAAI,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,KAAK,MAAM;AAC/C;;AAIA,SAAgB,eAAe,MAAc,OAA4B;CACvE,MAAM,MAAM,KAAK,QAAQ,UAAU,IAAI,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAC3D,IAAI,CAAC,IAAI,KAAK,GAAG,OAAO,CAAC;CACzB,MAAM,YAAY,IAAI,MAAM,IAAI,CAAC,CAAC;CAClC,MAAM,IAAI,UAAU,UAAU,SAAS,GAAI,IAAI,OAAQ,UAAU,MAAM,IAAI,CAAC,EAAE,UAAU,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,UAAU,KAAK,MAAM;CAC1I,MAAM,OAAmB,CAAC;CAC1B,IAAI,MAAgB,CAAC;CACrB,IAAI,OAAO;CACX,IAAI,IAAI;CACR,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACnC,MAAM,KAAK,IAAI;EACf,IAAI,GAAG;GACL,IAAI,OAAO,QAAO,IAAI,IAAI,OAAO,MAAK;IACpC,QAAQ;IACR;GACF,OAAO,IAAI,OAAO,MAAK,IAAI;QACtB,QAAQ;EACf,OAAO,IAAI,OAAO,QAAO,SAAS,IAAI,IAAI;OACrC,IAAI,OAAO,GAAG;GACjB,IAAI,KAAK,IAAI;GACb,OAAO;EACT,OAAO,IAAI,OAAO,MAAM;GACtB,IAAI,KAAK,IAAI;GACb,KAAK,KAAK,GAAG;GACb,MAAM,CAAC;GACP,OAAO;EACT,OAAO,QAAQ;CACjB;CACA,IAAI,KAAK,IAAI;CACb,KAAK,KAAK,GAAG;CACb,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,EAAE,MAAM,CAAC;CAC/C,OAAO,KAAK,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,GAAG,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACrF;AACA,SAAgB,YAAY,MAAkB,QAAQ,KAAa;CACjE,OAAO,KAAK,KAAK,MAAM,EAAE,KAAK,MAAO,YAAY,KAAK,CAAC,IAAI,IAAI,EAAE,QAAQ,MAAM,MAAI,EAAE,KAAK,CAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;AACtH;;AAEA,SAAgB,YAAY,OAAmB,YAAsC;CACnF,MAAM,IAAI,eAAe,KAAK;CAC9B,MAAM,EAAE,QAAQ,SAAS,YAAY,CAAC;CACtC,MAAM,MAAM,CAAC,GAAG,OAAO,SAAS,MAAM,EAAE,IAAI,GAAG,GAAG,IAAI;CACtD,OAAO,CAAC,EAAE,QAAQ,KAAK,MAAM,EAAE,KAAK,GAAG,GAAG,IAAI,KAAK,MAAM,EAAE,QAAQ,KAAK,MAAM,SAAS,GAAG,GAAG,EAAE,MAAM,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC;AAC7H;AAGA,IAAM,WAAmC;CAAE,GAAG;CAAO,KAAK;CAAO,KAAK;CAAO,KAAK;CAAO,KAAK;CAAO,MAAM;CAAO,MAAM;CAAO,OAAO;AAAM;AAC5I,IAAM,WAAW;AACjB,IAAM,SAAS;AACf,IAAM,YAAY;;AASlB,SAAgB,YAAY,QAAkC;CAC5D,MAAM,KAAK,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;CACrD,IAAI,CAAC,GAAG,QAAQ,OAAO,EAAE,MAAM,OAAO;CACtC,MAAM,MAAM,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;CACzC,IAAI,IAAI,OAAO,MAAM,OAAO,CAAC,KAAK,IAAI,KAAK,IAAI,MAAM,MAAM,OAAO,CAAC,MAAM,IAAI,GAAG,OAAO,EAAE,MAAM,UAAU;CACzG,IAAI,IAAI,OAAO,MAAM,SAAS,KAAK,CAAC,CAAC,GAAG;EACtC,MAAM,MAAM,IAAI,EAAE,CAAC,MAAM,wBAAwB,CAAC,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,qCAAqC,CAAC,GAAG,EAAE,EAAE,YAAY;EACjI,MAAM,MAAM,MAAM,SAAS,QAAQ,MAAM;EACzC,IAAI,IAAI,OAAO,OAAO,EAAE,MAAM,wBAAwB,CAAC,GAAG,MAAM,EAAE,MAAM,qCAAqC,CAAC,GAAG,EAAE,EAAE,YAAY,OAAO,GAAG,GAAG,OAAO;GAAE,MAAM;GAAS,UAAU;EAAI;CACtL;CACA,MAAM,SAAS,IAAI,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;CAChD,IAAI,OAAO,MAAM,OAAO,GAAG,OAAO;EAAE,MAAM;EAAU,KAAK,OAAO,OAAO,EAAE,CAAE,MAAM,OAAO,EAAE,CAAE,MAAM,CAAC;CAAE;CACrG,MAAM,OAAO,IAAI,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;CAC3C,IAAI,KAAK,MAAM,OAAO,GAAG;EACvB,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,MAAM,EAAG,MAAM,EAAE,CAAC;EAClD,IAAI,MAAM,SAAS,GAAG,OAAO;GAAE,MAAM;GAAU,GAAI,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;EAAG;CACnG;CACA,IAAI,GAAG,OAAO,MAAM,mBAAmB,KAAK,CAAC,KAAK,aAAa,KAAK,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,EAAE,UAAU,OAAO,CAAC,GAAG,OAAO,EAAE,MAAM,OAAO;CACzI,IAAI,GAAG,MAAM,MAAM,wCAAwC,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,kBAAkB;CACtG,OAAO,EAAE,MAAM,OAAO;AACxB;;AAEA,SAAgB,OAAO,KAAa,KAAwD;CAC1F,MAAM,IAAI,IAAI,KAAK;CACnB,MAAM,QAAQ,MAAM,CAAC,CAAC,CAAC,KAAK;CAC5B,IAAI,CAAC,SAAS,IAAI,SAAS,mBAAmB,OAAO;CACrD,QAAQ,IAAI,MAAZ;EACE,KAAK,WACH,OAAO,OAAO,KAAK,KAAK;EAC1B,KAAK;EACL,KAAK,SACH,OAAO,SAAS,MAAM,QAAQ,uCAAuC,EAAE,CAAC,KAAK;EAC/E,KAAK,UAAU;GACb,MAAM,IAAI,MAAM,MAAM,iBAAiB;GACvC,OAAO,IAAI,OAAO,EAAE,EAAE,IAAI;EAC5B;EACA,KAAK,QAAQ;GACX,MAAM,IAAI,EAAE,MAAM,qDAAqD;GACvE,IAAI,GAAG,OAAO;IAAE,OAAO,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK;IAAG,MAAM,EAAE,EAAE,CAAC,QAAQ,UAAU,GAAG;GAAE;GAC7E,OAAO,wBAAwB,KAAK,KAAK,IAAI;IAAE,OAAO;IAAO,MAAM;GAAM,IAAI;IAAE,OAAO;IAAO,MAAM;GAAG;EACxG;EACA,KAAK,mBACH,OAAO,eAAe,CAAC;EACzB,SACE,OAAO;CACX;AACF;;AAGA,SAAgB,cAAc,MAAkB,OAA+C,CAAC,GAAe;CAC7G,MAAM,SAAS,KAAK,UAAU;CAC9B,MAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,MAAM,EAAE,MAAM,CAAC;CACtD,MAAM,SAAS,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC;CACzC,MAAM,OAAO,SAAS,KAAK,MAAM,CAAC,IAAI;CACtC,MAAM,UAAyB,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MAAM;EACrE,MAAM,MAAM,YAAY,KAAK,KAAK,MAAM,EAAE,MAAM,EAAE,CAAC;EACnD,OAAO;GAAE,MAAM,KAAK,GAAG;GAAG,OAAO,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC,KAAK;GAAG,GAAG;EAAI;CACzE,CAAC;CACD,MAAM,MAAM,WAAW,GAAG,CAAC;CAC3B,IAAI,UAAU,KAAK,WAAW;CAC9B,IAAI,UAAU;CAEd,IAAI,eAAe,UAAU,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,OAAO,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,EAAE,SAAS,UAAU,QAAQ;CACvH,IAAI,OAAO,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO;EAAE,MAAM,KAAK,GAAG;EAAG,OAAO,OAAO,YAAY,QAAQ,KAAK,GAAG,MAAM,CAAC,EAAE,MAAM,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;CAAE,EAAE;CAC1K,OAAO;AACT;;AAGA,SAAgB,WAAW,OAAmB,IAAkC,MAAkB,OAAkC,CAAC,GAAe;CAClJ,MAAM,IAAI,eAAe,KAAK;CAC9B,MAAM,UAAU,CAAC,GAAG,EAAE,OAAO;CAC7B,MAAM,OAAO,EAAE,KAAK,KAAK,OAAO;EAAE,GAAG;EAAG,OAAO,EAAE,GAAG,EAAE,MAAM;CAAE,EAAE;CAChE,IAAI,KAAK,GAAG;CACZ,IAAI,IAAI;CACR,IAAI,KAAK,GAAG;EAGV,CADe,EAAE,MAAM,CAAC,EAAA,CACjB,SAAS,GAAG,MAAM;GACvB,MAAM,KAAK,GAAG,MAAM;GACpB,IAAI,MAAM,QAAQ,QAAQ;IACxB,IAAI,KAAK,aAAa;IACtB,QAAQ,KAAK;KAAE,MAAM,KAAK,GAAG;KAAG,OAAO;KAAI,MAAM;IAAO,CAAC;GAC3D;GACA,QAAQ,MAAM;IAAE,GAAG,QAAQ;IAAK,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK;GAAE;EACzD,CAAC;EACD,IAAI,EAAE,MAAM,CAAC;EACb,KAAK;CACP;CACA,MAAM,OAAO,GAAG,MAAM,KAAK,IAAI,GAAG,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,CAAC;CAC3D,OAAO,CAAC,KAAK,eAAe,QAAQ,SAAS,MAAM,QAAQ,KAAK;EAAE,MAAM,KAAK,GAAG;EAAG,OAAO;EAAI,MAAM;CAAO,CAAC;CAC5G,EAAE,SAAS,MAAM,MAAM;EACrB,MAAM,KAAK,KAAK;EAChB,OAAO,KAAK,UAAU,IAAI,KAAK,KAAK;GAAE,MAAM,KAAK,GAAG;GAAG,OAAO,CAAC;EAAE,CAAC;EAClE,KAAK,SAAS,KAAK,MAAM;GACvB,MAAM,MAAM,QAAQ,GAAG,MAAM;GAC7B,IAAI,CAAC,KAAK;GACV,KAAK,GAAG,CAAC,MAAM,IAAI,QAAQ,UAAU,KAAK,GAAG,CAAC,MAAM,IAAI,OAAO,OAAO,KAAK;IAAE,MAAM,SAAS,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC,MAAM,IAAI,KAAK;IAAG,KAAK,IAAI;GAAI,CAAC,CAAC;EACvJ,CAAC;CACH,CAAC;CACD,OAAO;EAAE,GAAG;EAAG;EAAS;CAAK;AAC/B;;;;;;;;AAUA,SAAgB,kBAAkB,IAAyB;CACzD,MAAM,MAAM,GAAG,QAAQ,QAAQ,IAAI,KAAK,GAAG,QAAQ,uBAAuB;CAC1E,MAAM,QAAS,GAAG,QAAQ,OAAO,IAAI,KAAK,GAAG,cAAc,OAAO;CAClE,MAAM,MAAM,WAAW,GAAG,CAAC;CAC3B,IAAI,CAAC,OAAO,OAAO,WAAW;CAC9B,MAAM,KAAM,KAA4B,WAAW,CAAC;CACpD,IAAI,KAAK,GAAG,MAAM,IAAI;CACtB,IAAI,WAAW,MAAM,cAAc,kBAAkB,CAAC,EAAE,eAAe,KAAK,cAAc,qBAAqB,CAAC,EAAE,eAAe,MAAM,aAAa,YAAY,KAAK,GAAA,CAAI,KAAK;CAC9K,IAAI,SAAS,KAAK,cAAc,cAAc,CAAC,EAAE,eAAe,GAAA,CAAI,KAAK,KAAK,KAAA;CAE9E,IAAI,YADU,MAAM,KAAK,KAAK,iBAAiB,uBAAuB,KAAK,CAAC,CAC5D,CAAA,CAAM,KAAK,QAAQ;EAAE,MAAO,GAAmB,QAAQ,OAAO,KAAK,GAAG;EAAG,OAAO,GAAG,eAAe,GAAA,CAAI,KAAK;CAAE,EAAE;CAC/H,IAAI,CAAC,IAAI,UAAU,QAAQ,OAAO,IAAI;CACtC,MAAM,YAAY,IAAI,KAAK,IAAI,aAAa,CAAC,EAAA,CAAG,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC;CAC9E,IAAI,GAAG,eAAe,WAAW,GAAG,eAAe,SAAS,IAAI,SAAS;EAAE,GAAG,IAAI;EAAQ,YAAY,GAAG;CAAW;CACpH,IAAI,GAAG,WAAW,QAAQ,IAAI,SAAS;EAAE,GAAG,IAAI;EAAQ,QAAQ;CAAK;CACrE,IAAI,GAAG,YAAY,QAAQ,IAAI,SAAS;EAAE,GAAG,IAAI;EAAQ,SAAS;CAAK;CACvE,IAAI,GAAG,YAAY,WAAW,IAAI,SAAS;EAAE,GAAG,IAAI;EAAQ,SAAS;CAAU;CAC/E,IAAI,GAAG,YAAY,UAAU,IAAI,SAAS;EAAE,GAAG,IAAI;EAAQ,aAAa;CAAK;CAC7E,IAAI,GAAG,WAAW,QAAQ,IAAI,aAAa;CAC3C,IAAI,GAAG,QAAQ,IAAI,SAAS;EAAE,MAAM,GAAG;EAA2B,GAAI,GAAG,aAAa,EAAE,MAAM,GAAG,WAAiC,IAAI,CAAC;EAAI,GAAI,GAAG,cAAc,EAAE,UAAU,GAAG,YAAY,IAAI,CAAC;CAAG;CAInM,MAAM,UAAU,QAA+B;EAC7C,MAAM,OAAiB,CAAC;EACxB,IAAI,SAAS,IAAI,OAAO;GACtB,KAAK,QAAQ,CAAC;GACd,IAAI,KAAK;GACT,KAAK,MAAM,KAAK,MAAM,KAAK,GAAG,KAAK,GAAG;IACpC,OAAO,KAAK,GAAG,CAAC,KAAK;IACrB,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,EAAE,WAAW,CAAC,CAAC;IACpD,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,MACxB,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,MAAM;KAC9B,KAAK,KAAK,QAAQ,CAAC;KACnB,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM;MAAE,IAAI;MAAG,IAAI,EAAE,YAAY;MAAM,QAAQ,OAAO,KAAK,OAAO;KAAE;IACzF;IACF,MAAM;GACR;EACF,CAAC;EACD,OAAO;CACT;CACA,MAAM,YAAY,MAAM,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;CACpD,MAAM,SAAS,MAAM,KAAK,MAAM,OAAO;CACvC,MAAM,WAAW,MAAM,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;CACnD,IAAI,WAAW,OAAO,SAAS,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,QAAQ;EAAE;EAAI,MAAM;CAAE,EAAE,CAAC;CAEtF,MAAM,OAAO,CAAC,GAAG,SAAS;CAC1B,IAAI,CAAC,KAAK,QACR,OAAO,SAAS,UAAU,MAAM,KAAK,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,MAAM,EAAE,YAAY,IAAI,KAAK,SAAS,EAAE,CAAC,GAAG,MAAM,SAAS,GAAG;EAC9H,KAAK,KAAK,SAAS,EAAE,CAAC,EAAE;EACxB,WAAW,SAAS,MAAM,CAAC;CAC7B;CAEF,MAAM,QAAQ,OAAO,IAAI;CACzB,MAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,MAAM,KAAK,MAAM,EAAE,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,MAAM,CAAC;CAClH,IAAI,YAAY,KAAK,SAAS;CAC9B,MAAM,OAAO,MAAM,KAAK,MAAM,iBAAiB,yBAAyB,CAAC;CACzE,MAAM,WAAW,MAAM,MAAM,SAAS,MAAM,CAAC;CAC7C,MAAM,UAAyB,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,GAAG,MAAM;EAErE,MAAM,IADM,KAAK,EACP,EAAK,WAAW,CAAC;EAC3B,MAAM,KAAK,SAAS,EAAE,EAAE;EACxB,MAAM,QAAQ,KAAK,UAAU,EAAE,IAAI;EACnC,MAAM,IAAiB;GAAE,MAAM,EAAE,OAAQ,IAAgC,SAAS,OAAO,KAAK,GAAG;GAAG;GAAO,MAAO,EAAE,QAA4B;EAAO;EACvJ,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;EACvB,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE;EAC/B,IAAI,EAAE,UAAU,EAAE,WAAW,OAAO,EAAE,QAAQ;EAC9C,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE;EACzB,IAAI,EAAE,aAAa,QAAQ,EAAE,WAAW;EACxC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE;EAC5B,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE;EAC9B,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,EAAE,GAAG;EAC/B,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,GAAG;EACxC,IAAI,EAAE,cAAc,QAAQ,EAAE,YAAY;EAC1C,IAAI,EAAE,aAAa,EAAE,cAAc,EAAE;OAChC,IAAI,IAAI,aAAa,OAAO,GAAG,EAAE,cAAc,GAAG,aAAa,OAAO;EAC3E,OAAO;CACT,CAAC;CAED,IAAI,MAAM,SAAS,GAAG;EACpB,MAAM,MAAM,MAAM;EAClB,MAAM,SAAuB,CAAC;EAC9B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAS;GAC3B,MAAM,OAAO,IAAI;GACjB,IAAI,OAAO;GACX,OAAO,QAAQ,IAAI,OAAO,SAAS,IAAI,IAAI,KAAK,EAAE,OAAO,KAAK,IAAI;GAClE,MAAM,OAAO,QAAQ,KAAK,OAAO,SAAS,EAAE,EAAE,KAAK,UAAU,KAAK,EAAE,IAAI;GACxE,IAAI,MAAM;IACR,MAAM,MAAO,KAAK,GAAmB,QAAQ,SAAS,KAAK,GAAG;IAC9D,OAAO,KAAK;KAAE,MAAM;KAAK,OAAO;IAAK,CAAC;IACtC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,QAAQ;GACxD;GACA,KAAK;EACP;EACA,IAAI,OAAO,QAAQ,IAAI,eAAe;CACxC;CAEA,MAAM,YAA0B,CAAC;CACjC,MAAM,QAAQ,CAAC,CAAC,KAAK,UAAU,KAAK,MAAM,MAAO,EAAkB,QAAQ,IAAI;CAC/E,MAAM,UAAyI,CAAC;CAChJ,IAAI;CACJ,IAAI,WAA2C;CAC/C,MAAM,QAAQ,OAAO,SAAS,KAAK,MAAM,EAAE,EAAE,CAAC;CAC9C,SAAS,SAAS,EAAE,IAAI,QAAQ,OAAO;EACrC,IAAI,SAAS,UAAU;GACrB,WAAW;GACX,MAAM,QAAS,KAAqB,QAAQ;GAC5C,eAAe,QAAU,KAAqB,QAAQ,OAAO,KAAK,IAAI,IAAK,KAAA;GAC3E,IAAI,SAAS,cAAc,UAAU,KAAK;IAAE,MAAM;IAAc;GAAM,CAAC;EACzE;EACA,MAAM,QAAQ,MAAM,OAAO,CAAC;EAG5B,IADa,GAAG,MAAM,WAAW,MAAM,GAAG,MAAM,EAAE,CAAC,WAAW,SAAS,GAAG,MAAM,EAAE,CAAC,aAAa,OAAO,MAAM,eACjG,GAAG,aAAa,gBAAgB,GAAG;GAE7C,IAAI,EAAE,GAAG,aAAa,gBAAgB,KAAM,KAAqB,QAAQ,QAAQ;IAC/E,eAAe,KAAK,IAAI;IACxB,UAAU,KAAK;KAAE,MAAM;KAAc,OAAO,UAAU,GAAG,MAAM,EAAE;IAAE,CAAC;GACtE;GACA;EACF;EACA,QAAQ,KAAK;GAAE,KAAM,GAAmB,QAAQ,OAAO,KAAK,GAAG;GAAG,OAAO;GAAc,MAAQ,GAAmB,QAAQ,QAA4B,KAAA;GAAW,WAAY,GAAmB,QAAQ,cAAc;GAAQ;EAAM,CAAC;CACvO,CAAC;CACD,OAAO,QAAQ,CAAC,CAAC,SAAS,OAAO,MAAM,QAAQ,KAAK;EAAE,KAAM,SAAS,EAAE,CAAiB,QAAQ,OAAO,KAAK,GAAG;EAAG,QAAQ;EAAM;CAAM,CAAC,CAAC;CAExI,IAAI,eAAe,GAAG,cAAc,UAAW,QAAQ,SAAS,KAAK,QAAQ,OAAO,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,aAAa,OAAO,MAAM,KAAK;CAEzJ,IAAI,CAAC,OACH,QAAQ,SAAS,GAAG,MAAM;EACxB,IAAI,IAAI,gBAAgB,MAAM,GAAG;EACjC,MAAM,MAAM,YAAY,QAAQ,KAAK,MAAO,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE,CAAE,EAAE,IAAI,EAAG,CAAC;EAC1F,OAAO,OAAO,GAAG,GAAG;CACtB,CAAC;CAEH,IAAI,UAAU;CACd,IAAI,OAAO,QAAQ,KAAK,OAAO;EAC7B,MAAM,EAAE;EACR,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;EACpC,GAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;EACnC,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;EACjC,GAAI,EAAE,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;EACzC,OAAO,OAAO,YACZ,QAAQ,KAAK,GAAG,MAAM;GACpB,MAAM,OAAO,EAAE,MAAM;GACrB,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,MAAM,IAAI;GAC/B,OAAO,CAAC,EAAE,MAAM,SAAS,KAAK,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;EACzD,CAAC,CACH;CACF,EAAE;CACF,IAAI,UAAU,QAAQ,IAAI,YAAY;CACtC,OAAO;AACT;;AAGA,SAAS,UAAU,IAAqB;CACtC,MAAM,IAAI,GAAG,UAAU,IAAI;CAC3B,EAAE,iBAAiB,wCAAwC,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC;CACtF,QAAQ,EAAE,eAAe,GAAA,CAAI,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;AACzD;;AAEA,SAAS,WAAW,IAAqB;CACvC,MAAM,IAAI,GAAG,UAAU,IAAI;CAC3B,EAAE,iBAAiB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC;CAEnD,MAAM,KAAK,EAAE,cAAc,yDAAyD;CACpF,IAAI,MAAM,EAAE,EAAE,eAAe,GAAA,CAAI,QAAQ,GAAG,eAAe,IAAI,EAAE,CAAC,CAAC,QAAQ,eAAe,EAAE,GAAG,QAAQ,GAAG,eAAe,GAAA,CAAI,KAAK;CAClI,MAAM,WAAW,EAAE,cAAc,cAAc;CAC/C,IAAI,YAAY,EAAE,EAAE,eAAe,GAAA,CAAI,KAAK,GAAG,OAAO,SAAS,aAAa,YAAY,KAAK;CAC7F,MAAM,MAAM,EAAE,cAAc,UAAU;CACtC,IAAI,OAAO,EAAE,EAAE,eAAe,GAAA,CAAI,KAAK,GAAG,OAAO,IAAI,aAAa,KAAK,KAAK;CAC5E,EAAE,iBAAiB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC;CAClE,MAAM,OAAO,EAAE,UAAU,KAAK;CAC9B,OAAO,gCAAgC,KAAK,IAAI,IAAI,QAAQ,EAAE,eAAe,GAAA,CAAI,QAAQ,QAAQ,GAAG,CAAC,CAAC,KAAK;AAC7G;AACA,SAAS,SAAS,IAA0B,KAAkB,SAAsC,IAAoC;CACtI,MAAM,IAAK,GAAmB;CAC9B,MAAM,OAAQ,EAAE,QAA4B,WAAW,IAAI;CAC3D,IAAI;CACJ,IAAI,EAAE,SAAS,MAAM,QAAQ;MACxB,IAAI,EAAE,KAAK,QAAQ;EAAE,KAAK,EAAE;EAAK,OAAO,UAAU,EAAE,KAAK,KAAA;EAAW,MAAM,GAAG,cAAc,GAAG,CAAC,EAAE,aAAa,MAAM,KAAK,KAAA;CAAU;MACnI,IAAI,EAAE,SAAS,SAAS,SAAS,aAAa,SAAS,YAAY,SAAS,WAAW,SAAS,WAAW,QAAQ,SAAS,YAAY,EAAE,UAAU,SAAS,OAAO,EAAE,KAAK;MAC3K,IAAI,SAAS,mBAAmB;EACnC,MAAM,IAAI,GAAG,UAAU,IAAI;EAC3B,EAAE,iBAAiB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,CAAC;EACnD,QAAQ,eAAe,EAAE,UAAU,KAAK,CAAC;CAC3C,OAAO,QAAQ,OAAO,WAAW,EAAE,GAAG;EAAE;EAAM,KAAK,IAAI;CAAI,CAAC;CAC5D,MAAM,OAAO,OAAO,GAAG,cAAc,YAAY,CAAC,EAAE,aAAa,KAAK,CAAC;CACvE,MAAM,OAAO,EAAE,SAAS,OAAO,GAAG,IAAI,IAAI,IAAI,KAAA;CAC9C,IAAI,EAAE,QAAQ,MAAM,OAAO;EAAE;EAAO,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAwB,IAAI,CAAC;EAAI,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;CAAG;CACtH,OAAO;AACT;;;;;;;AASA,SAAgB,YAAY,OAAmB,IAAgD,CAAC,GAAmC;CACjI,MAAM,IAAI,eAAe,KAAK;CAC9B,MAAM,OAAO,EAAE,QAAQ,QAAQ;CAC/B,IAAI,SAAS,UAAU,CAAC,EAAE,QAAQ,KAAK,GAAG,OAAO;CACjD,MAAM,OAAO,EAAE,KAAK,QAAQ,MAAM,CAAC,EAAE,MAAM;CAC3C,IAAI,SAAS,WACX,OAAO;EACL,YAAY;EACZ,SAAS;EACT,MAAM,EAAE;EACR,aAAa,EAAE,SAAS,EAAE;EAC1B,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;EAC9B,kBAAkB,EAAE,QAAQ,QAAQ,IAAI,MAAM,EAAE,EAAE,gBAAgB,MAAM,EAAE,CAAC,CAAC,KAAK,OAAO;GAAE,SAAS;GAAiB,MAAM,EAAE;GAAO,GAAI,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;GAAI,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;EAAG,EAAE;CACzO;CAEF,MAAM,OAAO,EAAE,QAAQ,QAAQ;CAC/B,IAAI,SAAS,YAAY;EAEvB,MAAM,SADQ,SAAS,SAAS,KAAK,KAAK,MAAM,SAAS,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,MAAM,EAAE,eAAe,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAAA,CAC7J,OAAO,OAAO;EAClC,IAAI,CAAC,MAAM,QAAQ,OAAO;EAC1B,OAAO;GAAE,YAAY;GAAsB,SAAS;GAAY,MAAM,EAAE;GAAS,eAAe,MAAM;GAAQ,iBAAiB,MAAM,KAAK,MAAM,OAAO;IAAE,SAAS;IAAY,UAAU,IAAI;IAAG;GAAK,EAAE;EAAE;CAC1M;CAEA,MAAM,WAAW,EAAE,KAAK,MAAM,MAAM,EAAE,SAAS,EAAE,QAAQ,QAAQ,KAAK,KAAK,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,SAAS,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,OAAO,CAAC;CACzJ,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,SAAS,EAAE,QACd,MAAM,EAAE,eAAe,IAAI,CAAC,CAAC,CAC7B,KAAK,MAAM;EACV,MAAM,OAAO,SAAS,MAAM,EAAE;EAC9B,MAAM,IAAI,SAAS,UAAU,IAAI,CAAC;EAClC,OAAO,KAAK,OAAO,OAAO;GAAE,SAAS;GAAS,MAAM,EAAE;GAAO,OAAO;GAAG,eAAe,EAAE,YAAY;GAAO,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;EAAG;CAC9I,CAAC,CAAC,CACD,OAAO,OAAO;CACjB,IAAI,CAAC,OAAO,QAAQ,OAAO;CAC3B,MAAM,SAAS,OAAO,KAAK,MAAM,EAAE,KAAK;CACxC,OAAO;EACL,YAAY;EACZ,SAAS;EACT,MAAM,EAAE;EACR,GAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;EAC1C,QAAQ;GAAE,SAAS;GAAkB,UAAU,KAAK,IAAI,GAAG,MAAM;GAAG,WAAW,KAAK,IAAI,GAAG,MAAM;GAAG,eAAe,OAAO,EAAE,CAAC;GAAe,YAAY,OAAO;GAAQ;EAAO;CAChL;AACF;AASA,SAAgB,YAAY,OAAgB,OAA0B,CAAC,GAAiB;CACtF,IAAI,CAAC,aAAa,KAAK,GAAG,OAAO,CAAC;CAClC,MAAM,IAAI;CACV,MAAM,MAAoB,CAAC;CAC3B,IAAI,CAAC,EAAE,SAAS,KAAK,KAAK,KAAK,mBAAmB,OAAO,IAAI,KAAK;EAAE,OAAO;EAAS,SAAS;EAAsD,IAAI;CAAU,CAAC;CAClK,IAAI,CAAC,EAAE,WAAW,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS;CAAsE,CAAC;CAC/H,IAAI,EAAE,WAAW;EACf,MAAM,QAAQ,EAAE,QAAQ,QAAQ,GAAG,MAAM,CAAC,EAAE,MAAM,KAAK,KAAK,EAAE,EAAE,gBAAgB,MAAM,EAAE;EACxF,IAAI,MAAM,QAAQ,IAAI,KAAK;GAAE,OAAO;GAAS,SAAS,QAAQ,MAAM,WAAW,IAAI,qBAAqB,OAAO,MAAM,OAAO,gBAAgB;GAAI,IAAI,OAAO,MAAM,EAAE,CAAC;EAAO,CAAC;CAC9K;CACA,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,KAAK,EAAE,SAAS;EACzB,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK;GAAE,OAAO;GAAS,SAAS;GAAiE,IAAI,OAAO,EAAE;EAAO,CAAC;EAChJ,KAAK,IAAI,EAAE,IAAI;CACjB;CACA,IAAI,KAAK,cAAc,EAAE,QAAQ,SAAS,KAAK,YAAY,IAAI,KAAK;EAAE,OAAO;EAAS,SAAS,eAAe,KAAK,WAAW;CAAW,CAAC;CAC1I,MAAM,OAAO,EAAE,KAAK,QAAQ,MAAM,CAAC,EAAE,MAAM;CAC3C,IAAI,KAAK,WAAW,KAAK,SAAS,KAAK,SAAS,IAAI,KAAK;EAAE,OAAO;EAAS,SAAS,gBAAgB,KAAK,QAAQ;CAAQ,CAAC;CAC1H,IAAI,KAAK,WAAW,KAAK,SAAS,KAAK,SAAS,IAAI,KAAK;EAAE,OAAO;EAAS,SAAS,eAAe,KAAK,QAAQ;CAAQ,CAAC;CACzH,IAAI,WAA+D;CACnE,IAAI,aAAa;CACjB,KAAK,MAAM,KAAK,EAAE,MAChB,KAAK,MAAM,KAAK,EAAE,SAAS;EACzB,MAAM,OAAO,EAAE,QAAQ,EAAE;EACzB,MAAM,IAAI,UAAU,IAAI;EACxB,IAAI,YAAY,CAAC,GAAG;EACpB,MAAM,KAAK,SAAS,GAAG,GAAG,IAAI;EAE9B,KADc,OAAO,YAAY,OAAO,WAAW,OAAO,aAAa,SAAS,CAAC,KAAK,QAAU,OAAO,aAAa,OAAO,CAAC,KAAK,MACxH;GACP;GACA,aAAa;IAAE,KAAK,EAAE;IAAM,KAAK,EAAE;IAAM,OAAO,EAAE;GAAM;EAC1D;CACF;CACF,IAAI,UACF,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS,GAAG,WAAW,GAAG,eAAe,IAAI,iBAAiB,cAAc,oCAAoC,SAAS,SAAS,WAAW;EAAyD,IAAI,QAAQ,SAAS,IAAI,GAAG,SAAS;CAAM,CAAC;CACjR,IAAI,EAAE,gBAAgB,KAAK,MAAM,MAAM,YAAY,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS;CAA8C,CAAC;CACpL,IAAI,EAAE,QAAQ,SAAS,cAAc,EAAE,SAAS,GAAA,CAAI,SAAS,IAAI,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS;CAAiF,CAAC;CACzL,IAAI,EAAE,QAAQ,SAAS,YAAY,CAAC,YAAY,CAAC,GAAG,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS;CAAwE,CAAC;CACnK,IAAI,EAAE,QAAQ,SAAS,KAAK,EAAE,QAAQ,eAAe,UAAU,IAAI,KAAK;EAAE,OAAO;EAAW,SAAS;CAAiG,CAAC;CACvM,OAAO;AACT;;AAGA,SAAgB,aAAa,GAAoB;CAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,OAAO;CAC7B,MAAM,IAAI,EAAE,KAAK;CACjB,MAAM,IAAI,EAAE,QAAQ;CACpB,OAAO,CAAC,EAAE,SAAS,KAAK,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,QAAQ,OAAO,KAAK,EAAE,GAAG,MAAM,IAAI,WAAW,WAAW,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK;AACpI;;AAGA,SAAgB,UACd,SACA,SACA,MACA,QAAmE,CAAC,GACxD;CACZ,MAAM,OAAsB,QAAQ,KAAK,GAAG,OAAO;EAAE,MAAM;EAAQ,GAAG;EAAG,MAAM,EAAE,QAAQ,IAAI,IAAI;CAAI,EAAE;CACvG,OAAO;EACL,IAAI,MAAM,MAAM,OAAO,QAAQ,YAAY,CAAC,CAAC,QAAQ,eAAe,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE;EACtG;EACA,WAAW;EACX,cAAc;EACd,QAAQ,EAAE,YAAY,SAAS;EAC/B,GAAG;EACH,SAAS;EACT,MAAM,KAAK,KAAK,GAAG,OAAO;GACxB,MAAM,MAAM,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI;GAC9C,OAAO;IACL,MAAM,IAAI,KAAK;IACf,GAAI,IAAI,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;IACxC,GAAI,IAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;IACrC,GAAI,IAAI,OAAO,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACrC,GAAI,IAAI,YAAY,EAAE,WAAW,KAAK,IAAI,CAAC;IAC3C,OAAO,OAAO,YAAY,KAAK,KAAK,GAAG,OAAO,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;GAChF;EACF,CAAC;CACH;AACF"}