@bettercms-ai/kit 0.1.0 → 1.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 (947) hide show
  1. package/_virtual/_rolldown/runtime.js +13 -0
  2. package/adapters/icons.d.ts +15 -0
  3. package/adapters/icons.js +27 -0
  4. package/adapters/icons.js.map +1 -0
  5. package/adapters/lossy.d.ts +267 -0
  6. package/adapters/lossy.js +233 -0
  7. package/adapters/lossy.js.map +1 -0
  8. package/adapters/prod-types.d.ts +468 -0
  9. package/adapters/prod-types.js +646 -0
  10. package/adapters/prod-types.js.map +1 -0
  11. package/adapters/schema.d.ts +115 -0
  12. package/adapters/schema.js +2203 -0
  13. package/adapters/schema.js.map +1 -0
  14. package/adapters/values.d.ts +200 -0
  15. package/adapters/values.js +553 -0
  16. package/adapters/values.js.map +1 -0
  17. package/brand/logo.d.ts +17 -0
  18. package/brand/logo.js +9 -0
  19. package/brand/logo.js.map +1 -0
  20. package/context.d.ts +269 -0
  21. package/context.js +214 -0
  22. package/context.js.map +1 -0
  23. package/controls/button.d.ts +58 -0
  24. package/controls/button.js +507 -0
  25. package/controls/button.js.map +1 -0
  26. package/controls/c1.d.ts +11 -0
  27. package/controls/c1.js +24 -0
  28. package/controls/c1.js.map +1 -0
  29. package/controls/c2.d.ts +10 -0
  30. package/controls/c2.js +19 -0
  31. package/controls/c2.js.map +1 -0
  32. package/controls/choice.d.ts +39 -0
  33. package/controls/choice.js +410 -0
  34. package/controls/choice.js.map +1 -0
  35. package/controls/code-register.d.ts +1 -0
  36. package/controls/code-register.js +8 -0
  37. package/controls/code-register.js.map +1 -0
  38. package/controls/code.d.ts +42 -0
  39. package/controls/code.js +396 -0
  40. package/controls/code.js.map +1 -0
  41. package/controls/color.d.ts +5 -0
  42. package/controls/color.js +130 -0
  43. package/controls/color.js.map +1 -0
  44. package/controls/component-services.d.ts +114 -0
  45. package/controls/date-register.d.ts +1 -0
  46. package/controls/date-register.js +9 -0
  47. package/controls/date-register.js.map +1 -0
  48. package/controls/date-zone.d.ts +104 -0
  49. package/controls/date-zone.js +272 -0
  50. package/controls/date-zone.js.map +1 -0
  51. package/controls/date.d.ts +7 -0
  52. package/controls/date.js +458 -0
  53. package/controls/date.js.map +1 -0
  54. package/controls/form-picker-register.d.ts +1 -0
  55. package/controls/form-picker-register.js +19 -0
  56. package/controls/form-picker-register.js.map +1 -0
  57. package/controls/form-picker.d.ts +43 -0
  58. package/controls/form-picker.js +83 -0
  59. package/controls/form-picker.js.map +1 -0
  60. package/controls/icon-register.d.ts +1 -0
  61. package/controls/icon-register.js +8 -0
  62. package/controls/icon-register.js.map +1 -0
  63. package/controls/icon.d.ts +38 -0
  64. package/controls/icon.js +355 -0
  65. package/controls/icon.js.map +1 -0
  66. package/controls/index.d.ts +5 -0
  67. package/controls/index.js +37 -0
  68. package/controls/index.js.map +1 -0
  69. package/controls/json-register.d.ts +1 -0
  70. package/controls/json-register.js +8 -0
  71. package/controls/json-register.js.map +1 -0
  72. package/controls/json.d.ts +2 -0
  73. package/controls/json.js +72 -0
  74. package/controls/json.js.map +1 -0
  75. package/controls/link.d.ts +260 -0
  76. package/controls/link.js +1186 -0
  77. package/controls/link.js.map +1 -0
  78. package/controls/location-register.d.ts +1 -0
  79. package/controls/location-register.js +8 -0
  80. package/controls/location-register.js.map +1 -0
  81. package/controls/location.d.ts +16 -0
  82. package/controls/location.js +197 -0
  83. package/controls/location.js.map +1 -0
  84. package/controls/media-register.d.ts +1 -0
  85. package/controls/media-register.js +12 -0
  86. package/controls/media-register.js.map +1 -0
  87. package/controls/media-services.d.ts +40 -0
  88. package/controls/media.d.ts +73 -0
  89. package/controls/media.js +1076 -0
  90. package/controls/media.js.map +1 -0
  91. package/controls/number.d.ts +22 -0
  92. package/controls/number.js +195 -0
  93. package/controls/number.js.map +1 -0
  94. package/controls/reference-register.d.ts +1 -0
  95. package/controls/reference-register.js +10 -0
  96. package/controls/reference-register.js.map +1 -0
  97. package/controls/reference-services.d.ts +54 -0
  98. package/controls/reference.d.ts +23 -0
  99. package/controls/reference.js +761 -0
  100. package/controls/reference.js.map +1 -0
  101. package/controls/rich-text/blocks.d.ts +28 -0
  102. package/controls/rich-text/blocks.js +1532 -0
  103. package/controls/rich-text/blocks.js.map +1 -0
  104. package/controls/rich-text/catalog.d.ts +98 -0
  105. package/controls/rich-text/catalog.js +613 -0
  106. package/controls/rich-text/catalog.js.map +1 -0
  107. package/controls/rich-text/codec.d.ts +56 -0
  108. package/controls/rich-text/codec.js +32 -0
  109. package/controls/rich-text/codec.js.map +1 -0
  110. package/controls/rich-text/component-card.d.ts +14 -0
  111. package/controls/rich-text/component-card.js +706 -0
  112. package/controls/rich-text/component-card.js.map +1 -0
  113. package/controls/rich-text/control.d.ts +21 -0
  114. package/controls/rich-text/control.js +254 -0
  115. package/controls/rich-text/control.js.map +1 -0
  116. package/controls/rich-text/dom.d.ts +190 -0
  117. package/controls/rich-text/dom.js +690 -0
  118. package/controls/rich-text/dom.js.map +1 -0
  119. package/controls/rich-text/editor.d.ts +50 -0
  120. package/controls/rich-text/editor.js +1530 -0
  121. package/controls/rich-text/editor.js.map +1 -0
  122. package/controls/rich-text/floating.d.ts +23 -0
  123. package/controls/rich-text/floating.js +137 -0
  124. package/controls/rich-text/floating.js.map +1 -0
  125. package/controls/rich-text/index.d.ts +1 -0
  126. package/controls/rich-text/index.js +12 -0
  127. package/controls/rich-text/index.js.map +1 -0
  128. package/controls/rich-text/link-form.d.ts +13 -0
  129. package/controls/rich-text/link-form.js +111 -0
  130. package/controls/rich-text/link-form.js.map +1 -0
  131. package/controls/rich-text/markdown.d.ts +6 -0
  132. package/controls/rich-text/markdown.js +179 -0
  133. package/controls/rich-text/markdown.js.map +1 -0
  134. package/controls/rich-text/ops.d.ts +35 -0
  135. package/controls/rich-text/ops.js +314 -0
  136. package/controls/rich-text/ops.js.map +1 -0
  137. package/controls/rich-text/toolbar.d.ts +85 -0
  138. package/controls/rich-text/toolbar.js +338 -0
  139. package/controls/rich-text/toolbar.js.map +1 -0
  140. package/controls/scale.d.ts +56 -0
  141. package/controls/scale.js +563 -0
  142. package/controls/scale.js.map +1 -0
  143. package/controls/slot-register.d.ts +1 -0
  144. package/controls/slot-register.js +16 -0
  145. package/controls/slot-register.js.map +1 -0
  146. package/controls/slot-services.d.ts +97 -0
  147. package/controls/slot-services.js +38 -0
  148. package/controls/slot-services.js.map +1 -0
  149. package/controls/slot.d.ts +33 -0
  150. package/controls/slot.js +348 -0
  151. package/controls/slot.js.map +1 -0
  152. package/controls/table/index.d.ts +1 -0
  153. package/controls/table/index.js +12 -0
  154. package/controls/table/index.js.map +1 -0
  155. package/controls/table/prod.d.ts +21 -0
  156. package/controls/table/prod.js +79 -0
  157. package/controls/table/prod.js.map +1 -0
  158. package/controls/table/refs.d.ts +50 -0
  159. package/controls/table/refs.js +68 -0
  160. package/controls/table/refs.js.map +1 -0
  161. package/controls/table/stored.d.ts +15 -0
  162. package/controls/table/stored.js +44 -0
  163. package/controls/table/stored.js.map +1 -0
  164. package/controls/table/table-editor.d.ts +103 -0
  165. package/controls/table/table-editor.js +2722 -0
  166. package/controls/table/table-editor.js.map +1 -0
  167. package/controls/table/table-link.d.ts +24 -0
  168. package/controls/table/table-link.js +180 -0
  169. package/controls/table/table-link.js.map +1 -0
  170. package/controls/table/table.d.ts +9 -0
  171. package/controls/table/table.js +103 -0
  172. package/controls/table/table.js.map +1 -0
  173. package/controls/text.d.ts +17 -0
  174. package/controls/text.js +287 -0
  175. package/controls/text.js.map +1 -0
  176. package/engine/array.d.ts +101 -0
  177. package/engine/array.js +893 -0
  178. package/engine/array.js.map +1 -0
  179. package/engine/bits.d.ts +24 -0
  180. package/engine/bits.js +60 -0
  181. package/engine/bits.js.map +1 -0
  182. package/engine/breadcrumb.d.ts +45 -0
  183. package/engine/breadcrumb.js +87 -0
  184. package/engine/breadcrumb.js.map +1 -0
  185. package/engine/expand.d.ts +68 -0
  186. package/engine/expand.js +170 -0
  187. package/engine/expand.js.map +1 -0
  188. package/engine/field-list.d.ts +20 -0
  189. package/engine/field-list.js +19 -0
  190. package/engine/field-list.js.map +1 -0
  191. package/engine/field-shell.d.ts +49 -0
  192. package/engine/field-shell.js +860 -0
  193. package/engine/field-shell.js.map +1 -0
  194. package/engine/frame.d.ts +120 -0
  195. package/engine/frame.js +599 -0
  196. package/engine/frame.js.map +1 -0
  197. package/engine/group-summary.d.ts +4 -0
  198. package/engine/group-summary.js +66 -0
  199. package/engine/group-summary.js.map +1 -0
  200. package/engine/grouping.d.ts +224 -0
  201. package/engine/grouping.js +824 -0
  202. package/engine/grouping.js.map +1 -0
  203. package/engine/item-list.d.ts +89 -0
  204. package/engine/item-list.js +703 -0
  205. package/engine/item-list.js.map +1 -0
  206. package/engine/kit-field.d.ts +72 -0
  207. package/engine/kit-field.js +523 -0
  208. package/engine/kit-field.js.map +1 -0
  209. package/engine/schema-form.d.ts +91 -0
  210. package/engine/schema-form.js +320 -0
  211. package/engine/schema-form.js.map +1 -0
  212. package/engine/slot.d.ts +13 -0
  213. package/engine/slot.js +226 -0
  214. package/engine/slot.js.map +1 -0
  215. package/index.d.ts +46 -0
  216. package/index.js +55 -0
  217. package/index.js.map +1 -0
  218. package/kit.css +56 -0
  219. package/lib/cn.d.ts +4 -0
  220. package/lib/cn.js +53 -0
  221. package/lib/cn.js.map +1 -0
  222. package/lib/columns.d.ts +14 -0
  223. package/lib/columns.js +27 -0
  224. package/lib/columns.js.map +1 -0
  225. package/lib/frames.d.ts +36 -0
  226. package/lib/frames.js +214 -0
  227. package/lib/frames.js.map +1 -0
  228. package/lib/icons.d.ts +16 -0
  229. package/lib/icons.js +172 -0
  230. package/lib/icons.js.map +1 -0
  231. package/lib/path.d.ts +29 -0
  232. package/lib/path.js +64 -0
  233. package/lib/path.js.map +1 -0
  234. package/lib/schema.d.ts +49 -0
  235. package/lib/schema.js +287 -0
  236. package/lib/schema.js.map +1 -0
  237. package/lib/utils.d.ts +7 -0
  238. package/lib/utils.js +37 -0
  239. package/lib/utils.js.map +1 -0
  240. package/lib/validate.d.ts +20 -0
  241. package/lib/validate.js +150 -0
  242. package/lib/validate.js.map +1 -0
  243. package/package.json +31 -59
  244. package/schema/adapters.d.ts +28 -0
  245. package/schema/adapters.js +493 -0
  246. package/schema/adapters.js.map +1 -0
  247. package/schema/help.d.ts +25 -0
  248. package/schema/help.js +54 -0
  249. package/schema/help.js.map +1 -0
  250. package/schema/scale.d.ts +69 -0
  251. package/schema/scale.js +250 -0
  252. package/schema/scale.js.map +1 -0
  253. package/schema/sources.d.ts +103 -0
  254. package/schema/sources.js +65 -0
  255. package/schema/sources.js.map +1 -0
  256. package/schema/table.d.ts +319 -0
  257. package/schema/table.js +1198 -0
  258. package/schema/table.js.map +1 -0
  259. package/schema/types.d.ts +269 -0
  260. package/schema/types.js +14 -0
  261. package/schema/types.js.map +1 -0
  262. package/types.d.ts +17 -0
  263. package/ui/action-tray.d.ts +54 -0
  264. package/ui/action-tray.js +153 -0
  265. package/ui/action-tray.js.map +1 -0
  266. package/ui/button.d.ts +57 -0
  267. package/ui/button.js +202 -0
  268. package/ui/button.js.map +1 -0
  269. package/ui/choice-switch.d.ts +36 -0
  270. package/ui/choice-switch.js +57 -0
  271. package/ui/choice-switch.js.map +1 -0
  272. package/ui/controls.d.ts +83 -0
  273. package/ui/controls.js +319 -0
  274. package/ui/controls.js.map +1 -0
  275. package/ui/display.d.ts +156 -0
  276. package/ui/display.js +444 -0
  277. package/ui/display.js.map +1 -0
  278. package/ui/expanded-editor-modal.d.ts +26 -0
  279. package/ui/expanded-editor-modal.js +140 -0
  280. package/ui/expanded-editor-modal.js.map +1 -0
  281. package/ui/field-context.d.ts +12 -0
  282. package/ui/field-context.js +23 -0
  283. package/ui/field-context.js.map +1 -0
  284. package/ui/floating-panel.d.ts +152 -0
  285. package/ui/floating-panel.js +912 -0
  286. package/ui/floating-panel.js.map +1 -0
  287. package/ui/index.d.ts +12 -0
  288. package/ui/index.js +13 -0
  289. package/ui/input.d.ts +78 -0
  290. package/ui/input.js +250 -0
  291. package/ui/input.js.map +1 -0
  292. package/ui/mode-bar.d.ts +31 -0
  293. package/ui/mode-bar.js +65 -0
  294. package/ui/mode-bar.js.map +1 -0
  295. package/ui/overlay.d.ts +123 -0
  296. package/ui/overlay.js +378 -0
  297. package/ui/overlay.js.map +1 -0
  298. package/ui/path-crumbs.d.ts +90 -0
  299. package/ui/path-crumbs.js +532 -0
  300. package/ui/path-crumbs.js.map +1 -0
  301. package/ui/presence.d.ts +16 -0
  302. package/ui/presence.js +65 -0
  303. package/ui/presence.js.map +1 -0
  304. package/ui/select.d.ts +66 -0
  305. package/ui/select.js +405 -0
  306. package/ui/select.js.map +1 -0
  307. package/ui/shortcut-hint.d.ts +14 -0
  308. package/ui/shortcut-hint.js +35 -0
  309. package/ui/shortcut-hint.js.map +1 -0
  310. package/ui/surfaces.d.ts +23 -0
  311. package/ui/surfaces.js +26 -0
  312. package/ui/surfaces.js.map +1 -0
  313. package/ui/tooltip-root.d.ts +12 -0
  314. package/ui/tooltip-root.js +76 -0
  315. package/ui/tooltip-root.js.map +1 -0
  316. package/ui/variants.d.ts +15 -0
  317. package/ui/variants.js +14 -0
  318. package/ui/variants.js.map +1 -0
  319. package/LICENSE +0 -21
  320. package/README.md +0 -27
  321. package/dist/_chunks-cjs/_visual-editing.js +0 -5898
  322. package/dist/_chunks-cjs/refractor.js +0 -22
  323. package/dist/_chunks-es/_visual-editing.mjs +0 -5904
  324. package/dist/_chunks-es/refractor.mjs +0 -25
  325. package/dist/_color.d.mts +0 -119
  326. package/dist/_color.d.ts +0 -119
  327. package/dist/_color.js +0 -1412
  328. package/dist/_color.mjs +0 -1411
  329. package/dist/_visual-editing.d.mts +0 -1126
  330. package/dist/_visual-editing.d.ts +0 -1126
  331. package/dist/_visual-editing.js +0 -30
  332. package/dist/_visual-editing.mjs +0 -30
  333. package/dist/index.d.mts +0 -3140
  334. package/dist/index.d.ts +0 -3140
  335. package/dist/index.js +0 -2036
  336. package/dist/index.mjs +0 -2044
  337. package/dist/theme.d.mts +0 -1506
  338. package/dist/theme.d.ts +0 -1506
  339. package/dist/theme.js +0 -4126
  340. package/dist/theme.mjs +0 -4126
  341. package/exports/_visual-editing.ts +0 -31
  342. package/exports/index.ts +0 -1
  343. package/exports/theme.ts +0 -1
  344. package/src/color/index.d.mts +0 -119
  345. package/src/color/index.mjs +0 -1411
  346. package/src/core/__workshop__/constants.ts +0 -293
  347. package/src/core/_compat.ts +0 -264
  348. package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
  349. package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
  350. package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
  351. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
  352. package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
  353. package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
  354. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
  355. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
  356. package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
  357. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  358. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  359. package/src/core/components/autocomplete/autocomplete.tsx +0 -767
  360. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
  361. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  362. package/src/core/components/autocomplete/constants.ts +0 -28
  363. package/src/core/components/autocomplete/index.ts +0 -2
  364. package/src/core/components/autocomplete/types.ts +0 -108
  365. package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
  366. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
  367. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  368. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
  369. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
  370. package/src/core/components/breadcrumbs/index.ts +0 -1
  371. package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
  372. package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
  373. package/src/core/components/dialog/__workshop__/index.ts +0 -19
  374. package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
  375. package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
  376. package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
  377. package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
  378. package/src/core/components/dialog/__workshop__/position.tsx +0 -30
  379. package/src/core/components/dialog/__workshop__/props.tsx +0 -75
  380. package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
  381. package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
  382. package/src/core/components/dialog/dialog.tsx +0 -430
  383. package/src/core/components/dialog/dialogContext.ts +0 -20
  384. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  385. package/src/core/components/dialog/index.ts +0 -4
  386. package/src/core/components/dialog/styles.ts +0 -77
  387. package/src/core/components/dialog/useDialog.ts +0 -11
  388. package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
  389. package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
  390. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
  391. package/src/core/components/hotkeys/hotkeys.tsx +0 -66
  392. package/src/core/components/hotkeys/index.ts +0 -1
  393. package/src/core/components/index.ts +0 -9
  394. package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
  395. package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
  396. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
  397. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
  398. package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
  399. package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
  400. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
  401. package/src/core/components/menu/__workshop__/groups.tsx +0 -156
  402. package/src/core/components/menu/__workshop__/index.ts +0 -89
  403. package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
  404. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
  405. package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
  406. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
  407. package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
  408. package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
  409. package/src/core/components/menu/__workshop__/tones.tsx +0 -25
  410. package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
  411. package/src/core/components/menu/helpers.ts +0 -82
  412. package/src/core/components/menu/index.ts +0 -5
  413. package/src/core/components/menu/menu.spacing.test.tsx +0 -63
  414. package/src/core/components/menu/menu.test.tsx +0 -125
  415. package/src/core/components/menu/menu.tsx +0 -178
  416. package/src/core/components/menu/menuButton.tsx +0 -268
  417. package/src/core/components/menu/menuContext.ts +0 -18
  418. package/src/core/components/menu/menuDivider.ts +0 -23
  419. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
  420. package/src/core/components/menu/menuGroup.tsx +0 -233
  421. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
  422. package/src/core/components/menu/menuItem.tsx +0 -197
  423. package/src/core/components/menu/useMenu.ts +0 -21
  424. package/src/core/components/menu/useMenuController.ts +0 -231
  425. package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
  426. package/src/core/components/skeleton/__workshop__/index.ts +0 -11
  427. package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
  428. package/src/core/components/skeleton/index.ts +0 -2
  429. package/src/core/components/skeleton/skeleton.tsx +0 -57
  430. package/src/core/components/skeleton/styles.ts +0 -50
  431. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  432. package/src/core/components/tab/__workshop__/example.tsx +0 -79
  433. package/src/core/components/tab/__workshop__/index.ts +0 -14
  434. package/src/core/components/tab/index.ts +0 -3
  435. package/src/core/components/tab/tab.tsx +0 -101
  436. package/src/core/components/tab/tabList.test.tsx +0 -48
  437. package/src/core/components/tab/tabList.tsx +0 -70
  438. package/src/core/components/tab/tabPanel.tsx +0 -39
  439. package/src/core/components/toast/__workshop__/hook.tsx +0 -71
  440. package/src/core/components/toast/__workshop__/index.ts +0 -19
  441. package/src/core/components/toast/__workshop__/toast.tsx +0 -26
  442. package/src/core/components/toast/index.ts +0 -4
  443. package/src/core/components/toast/styles.ts +0 -77
  444. package/src/core/components/toast/toast.test.tsx +0 -101
  445. package/src/core/components/toast/toast.tsx +0 -198
  446. package/src/core/components/toast/toastContext.ts +0 -7
  447. package/src/core/components/toast/toastLayer.tsx +0 -51
  448. package/src/core/components/toast/toastProvider.tsx +0 -113
  449. package/src/core/components/toast/toastState.ts +0 -6
  450. package/src/core/components/toast/types.ts +0 -26
  451. package/src/core/components/toast/useToast.ts +0 -25
  452. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  453. package/src/core/components/tree/__workshop__/basic.tsx +0 -105
  454. package/src/core/components/tree/__workshop__/index.ts +0 -21
  455. package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
  456. package/src/core/components/tree/helpers.ts +0 -105
  457. package/src/core/components/tree/index.ts +0 -4
  458. package/src/core/components/tree/style.ts +0 -105
  459. package/src/core/components/tree/tree.test.tsx +0 -55
  460. package/src/core/components/tree/tree.tsx +0 -240
  461. package/src/core/components/tree/treeContext.ts +0 -10
  462. package/src/core/components/tree/treeGroup.tsx +0 -28
  463. package/src/core/components/tree/treeItem.test.tsx +0 -65
  464. package/src/core/components/tree/treeItem.tsx +0 -224
  465. package/src/core/components/tree/types.ts +0 -25
  466. package/src/core/components/tree/useTree.ts +0 -17
  467. package/src/core/constants.ts +0 -79
  468. package/src/core/helpers/animation.ts +0 -27
  469. package/src/core/helpers/element.ts +0 -55
  470. package/src/core/helpers/focus.ts +0 -100
  471. package/src/core/helpers/index.ts +0 -4
  472. package/src/core/helpers/scroll.ts +0 -15
  473. package/src/core/hooks/index.ts +0 -12
  474. package/src/core/hooks/useArrayProp.ts +0 -17
  475. package/src/core/hooks/useClickOutside.test.tsx +0 -482
  476. package/src/core/hooks/useClickOutside.ts +0 -118
  477. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
  478. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  479. package/src/core/hooks/useCustomValidity.ts +0 -13
  480. package/src/core/hooks/useDelayed.test.ts +0 -88
  481. package/src/core/hooks/useDelayedState.ts +0 -36
  482. package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
  483. package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
  484. package/src/core/hooks/useElementRect/index.ts +0 -1
  485. package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
  486. package/src/core/hooks/useElementSize.ts +0 -19
  487. package/src/core/hooks/useForwardedRef.ts +0 -19
  488. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  489. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  490. package/src/core/hooks/useMatchMedia.ts +0 -28
  491. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
  492. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
  493. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  494. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
  495. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  496. package/src/core/hooks/useMounted.ts +0 -15
  497. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  498. package/src/core/hooks/usePrefersDark.test.tsx +0 -19
  499. package/src/core/hooks/usePrefersDark.ts +0 -16
  500. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  501. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
  502. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  503. package/src/core/index.ts +0 -10
  504. package/src/core/lib/createGlobalScopedContext.ts +0 -36
  505. package/src/core/lib/globalScope.ts +0 -19
  506. package/src/core/lib/isRecord.ts +0 -3
  507. package/src/core/middleware/origin.ts +0 -47
  508. package/src/core/observers/elementSizeObserver.ts +0 -116
  509. package/src/core/observers/index.ts +0 -2
  510. package/src/core/observers/resizeObserver.ts +0 -9
  511. package/src/core/primitives/_selectable/index.ts +0 -1
  512. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  513. package/src/core/primitives/_selectable/style.ts +0 -115
  514. package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
  515. package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
  516. package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
  517. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
  518. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
  519. package/src/core/primitives/avatar/avatar.tsx +0 -200
  520. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  521. package/src/core/primitives/avatar/avatarStack.tsx +0 -100
  522. package/src/core/primitives/avatar/index.ts +0 -4
  523. package/src/core/primitives/avatar/styles.ts +0 -167
  524. package/src/core/primitives/avatar/types.ts +0 -17
  525. package/src/core/primitives/badge/__workshop__/index.ts +0 -19
  526. package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
  527. package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
  528. package/src/core/primitives/badge/badge.test.tsx +0 -16
  529. package/src/core/primitives/badge/badge.tsx +0 -70
  530. package/src/core/primitives/badge/index.ts +0 -1
  531. package/src/core/primitives/badge/styles.ts +0 -20
  532. package/src/core/primitives/badge/types.ts +0 -8
  533. package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
  534. package/src/core/primitives/box/__workshop__/index.ts +0 -24
  535. package/src/core/primitives/box/__workshop__/props.tsx +0 -20
  536. package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
  537. package/src/core/primitives/box/box.test.tsx +0 -142
  538. package/src/core/primitives/box/box.tsx +0 -154
  539. package/src/core/primitives/box/index.ts +0 -1
  540. package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
  541. package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
  542. package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
  543. package/src/core/primitives/button/__workshop__/index.ts +0 -59
  544. package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
  545. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
  546. package/src/core/primitives/button/__workshop__/props.tsx +0 -55
  547. package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
  548. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  549. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  550. package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
  551. package/src/core/primitives/button/button.test.tsx +0 -82
  552. package/src/core/primitives/button/button.tsx +0 -210
  553. package/src/core/primitives/button/index.ts +0 -1
  554. package/src/core/primitives/button/styles.ts +0 -117
  555. package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
  556. package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
  557. package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
  558. package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
  559. package/src/core/primitives/card/__workshop__/index.ts +0 -18
  560. package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
  561. package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
  562. package/src/core/primitives/card/__workshop__/props.tsx +0 -53
  563. package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
  564. package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
  565. package/src/core/primitives/card/card.tsx +0 -128
  566. package/src/core/primitives/card/index.ts +0 -2
  567. package/src/core/primitives/card/styles.ts +0 -147
  568. package/src/core/primitives/card/types.ts +0 -11
  569. package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
  570. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
  571. package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
  572. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
  573. package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
  574. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  575. package/src/core/primitives/checkbox/index.ts +0 -1
  576. package/src/core/primitives/checkbox/styles.ts +0 -128
  577. package/src/core/primitives/code/__workshop__/index.ts +0 -19
  578. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
  579. package/src/core/primitives/code/__workshop__/props.tsx +0 -21
  580. package/src/core/primitives/code/code.tsx +0 -55
  581. package/src/core/primitives/code/index.ts +0 -1
  582. package/src/core/primitives/code/refractor.tsx +0 -20
  583. package/src/core/primitives/code/styles.ts +0 -77
  584. package/src/core/primitives/container/__workshop__/example.tsx +0 -20
  585. package/src/core/primitives/container/__workshop__/index.ts +0 -8
  586. package/src/core/primitives/container/container.tsx +0 -54
  587. package/src/core/primitives/container/index.ts +0 -2
  588. package/src/core/primitives/container/styles.ts +0 -23
  589. package/src/core/primitives/container/types.ts +0 -6
  590. package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
  591. package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
  592. package/src/core/primitives/flex/__workshop__/index.ts +0 -11
  593. package/src/core/primitives/flex/flex.tsx +0 -64
  594. package/src/core/primitives/flex/index.ts +0 -1
  595. package/src/core/primitives/grid/__workshop__/index.ts +0 -10
  596. package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
  597. package/src/core/primitives/grid/grid.test.tsx +0 -80
  598. package/src/core/primitives/grid/grid.tsx +0 -74
  599. package/src/core/primitives/grid/index.ts +0 -1
  600. package/src/core/primitives/heading/__workshop__/index.ts +0 -19
  601. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
  602. package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
  603. package/src/core/primitives/heading/heading.tsx +0 -88
  604. package/src/core/primitives/heading/index.ts +0 -1
  605. package/src/core/primitives/heading/styles.ts +0 -64
  606. package/src/core/primitives/heading/types.ts +0 -7
  607. package/src/core/primitives/index.ts +0 -27
  608. package/src/core/primitives/inline/__workshop__/index.ts +0 -8
  609. package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
  610. package/src/core/primitives/inline/index.ts +0 -1
  611. package/src/core/primitives/inline/inline.test.tsx +0 -51
  612. package/src/core/primitives/inline/inline.tsx +0 -63
  613. package/src/core/primitives/inline/styles.ts +0 -32
  614. package/src/core/primitives/inline/types.ts +0 -6
  615. package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
  616. package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
  617. package/src/core/primitives/kbd/index.ts +0 -1
  618. package/src/core/primitives/kbd/kbd.tsx +0 -69
  619. package/src/core/primitives/label/__workshop__/index.ts +0 -19
  620. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
  621. package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
  622. package/src/core/primitives/label/index.ts +0 -1
  623. package/src/core/primitives/label/label.tsx +0 -87
  624. package/src/core/primitives/label/styles.ts +0 -45
  625. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
  626. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  627. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  628. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  629. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
  630. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
  631. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
  632. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
  633. package/src/core/primitives/popover/__workshop__/index.ts +0 -49
  634. package/src/core/primitives/popover/constants.ts +0 -22
  635. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  636. package/src/core/primitives/popover/helpers.ts +0 -31
  637. package/src/core/primitives/popover/index.ts +0 -2
  638. package/src/core/primitives/popover/popover.tsx +0 -511
  639. package/src/core/primitives/popover/popoverCard.tsx +0 -166
  640. package/src/core/primitives/popover/types.ts +0 -7
  641. package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
  642. package/src/core/primitives/radio/__workshop__/index.ts +0 -11
  643. package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
  644. package/src/core/primitives/radio/index.ts +0 -1
  645. package/src/core/primitives/radio/radio.tsx +0 -51
  646. package/src/core/primitives/radio/styles.ts +0 -117
  647. package/src/core/primitives/select/__workshop__/index.ts +0 -11
  648. package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
  649. package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
  650. package/src/core/primitives/select/index.ts +0 -1
  651. package/src/core/primitives/select/select.test.tsx +0 -52
  652. package/src/core/primitives/select/select.tsx +0 -94
  653. package/src/core/primitives/select/styles.ts +0 -166
  654. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
  655. package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
  656. package/src/core/primitives/spinner/index.ts +0 -1
  657. package/src/core/primitives/spinner/spinner.tsx +0 -46
  658. package/src/core/primitives/stack/__workshop__/index.ts +0 -14
  659. package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
  660. package/src/core/primitives/stack/index.ts +0 -1
  661. package/src/core/primitives/stack/stack.test.tsx +0 -57
  662. package/src/core/primitives/stack/stack.tsx +0 -57
  663. package/src/core/primitives/stack/styles.ts +0 -32
  664. package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
  665. package/src/core/primitives/switch/__workshop__/index.ts +0 -11
  666. package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
  667. package/src/core/primitives/switch/index.ts +0 -1
  668. package/src/core/primitives/switch/styles.ts +0 -173
  669. package/src/core/primitives/switch/switch.tsx +0 -68
  670. package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
  671. package/src/core/primitives/text/__workshop__/example.tsx +0 -39
  672. package/src/core/primitives/text/__workshop__/index.ts +0 -24
  673. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
  674. package/src/core/primitives/text/index.ts +0 -1
  675. package/src/core/primitives/text/styles.ts +0 -74
  676. package/src/core/primitives/text/text.tsx +0 -89
  677. package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
  678. package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
  679. package/src/core/primitives/textArea/index.ts +0 -1
  680. package/src/core/primitives/textArea/textArea.tsx +0 -120
  681. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
  682. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
  683. package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
  684. package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
  685. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
  686. package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
  687. package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
  688. package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
  689. package/src/core/primitives/textInput/index.ts +0 -1
  690. package/src/core/primitives/textInput/textInput.test.tsx +0 -48
  691. package/src/core/primitives/textInput/textInput.tsx +0 -395
  692. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
  693. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
  694. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
  695. package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
  696. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
  697. package/src/core/primitives/tooltip/constants.ts +0 -23
  698. package/src/core/primitives/tooltip/index.ts +0 -2
  699. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
  700. package/src/core/primitives/tooltip/tooltip.tsx +0 -495
  701. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
  702. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  703. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  704. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  705. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  706. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  707. package/src/core/primitives/types.ts +0 -179
  708. package/src/core/styles/border/borderStyle.ts +0 -56
  709. package/src/core/styles/border/index.ts +0 -2
  710. package/src/core/styles/border/types.ts +0 -10
  711. package/src/core/styles/box/boxStyle.ts +0 -69
  712. package/src/core/styles/box/index.ts +0 -2
  713. package/src/core/styles/box/types.ts +0 -11
  714. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  715. package/src/core/styles/card/index.ts +0 -1
  716. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  717. package/src/core/styles/flex/flexStyle.ts +0 -70
  718. package/src/core/styles/flex/index.ts +0 -3
  719. package/src/core/styles/flex/types.ts +0 -25
  720. package/src/core/styles/focusRing/index.ts +0 -25
  721. package/src/core/styles/font/codeFontStyle.ts +0 -13
  722. package/src/core/styles/font/headingFontStyle.ts +0 -13
  723. package/src/core/styles/font/index.ts +0 -6
  724. package/src/core/styles/font/labelFontStyle.ts +0 -13
  725. package/src/core/styles/font/responsiveFont.ts +0 -103
  726. package/src/core/styles/font/textAlignStyle.ts +0 -19
  727. package/src/core/styles/font/textFontStyle.ts +0 -13
  728. package/src/core/styles/font/types.ts +0 -35
  729. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  730. package/src/core/styles/grid/gridStyle.ts +0 -108
  731. package/src/core/styles/grid/index.ts +0 -3
  732. package/src/core/styles/grid/types.ts +0 -37
  733. package/src/core/styles/helpers.ts +0 -72
  734. package/src/core/styles/index.ts +0 -5
  735. package/src/core/styles/input/index.ts +0 -2
  736. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  737. package/src/core/styles/input/textInputStyle.ts +0 -263
  738. package/src/core/styles/internal.ts +0 -12
  739. package/src/core/styles/margin/index.ts +0 -2
  740. package/src/core/styles/margin/marginStyle.ts +0 -21
  741. package/src/core/styles/margin/marginsStyle.test.ts +0 -33
  742. package/src/core/styles/margin/types.ts +0 -9
  743. package/src/core/styles/padding/index.ts +0 -2
  744. package/src/core/styles/padding/paddingStyle.test.ts +0 -33
  745. package/src/core/styles/padding/paddingStyle.ts +0 -21
  746. package/src/core/styles/padding/types.ts +0 -12
  747. package/src/core/styles/radius/index.ts +0 -2
  748. package/src/core/styles/radius/radiusStyle.ts +0 -23
  749. package/src/core/styles/radius/types.ts +0 -8
  750. package/src/core/styles/shadow/index.ts +0 -2
  751. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  752. package/src/core/styles/shadow/types.ts +0 -6
  753. package/src/core/styles/types.ts +0 -8
  754. package/src/core/theme/__workshop__/build/Root.tsx +0 -367
  755. package/src/core/theme/__workshop__/build/helpers.ts +0 -46
  756. package/src/core/theme/__workshop__/build/story.tsx +0 -465
  757. package/src/core/theme/__workshop__/canvas.tsx +0 -352
  758. package/src/core/theme/__workshop__/color.tsx +0 -62
  759. package/src/core/theme/__workshop__/debug/story.tsx +0 -408
  760. package/src/core/theme/__workshop__/index.ts +0 -39
  761. package/src/core/theme/__workshop__/layer.tsx +0 -78
  762. package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
  763. package/src/core/theme/index.ts +0 -5
  764. package/src/core/theme/theme.test.tsx +0 -73
  765. package/src/core/theme/themeColorProvider.tsx +0 -29
  766. package/src/core/theme/themeContext.ts +0 -10
  767. package/src/core/theme/themeProvider.tsx +0 -62
  768. package/src/core/theme/types.ts +0 -12
  769. package/src/core/theme/useRootTheme.ts +0 -17
  770. package/src/core/theme/useTheme.ts +0 -16
  771. package/src/core/types/avatar.ts +0 -14
  772. package/src/core/types/badge.ts +0 -12
  773. package/src/core/types/box.ts +0 -19
  774. package/src/core/types/button.ts +0 -21
  775. package/src/core/types/card.ts +0 -6
  776. package/src/core/types/component.ts +0 -32
  777. package/src/core/types/dialog.ts +0 -4
  778. package/src/core/types/flex.ts +0 -30
  779. package/src/core/types/grid.ts +0 -14
  780. package/src/core/types/gridItem.ts +0 -29
  781. package/src/core/types/index.ts +0 -15
  782. package/src/core/types/placement.ts +0 -18
  783. package/src/core/types/popover.ts +0 -4
  784. package/src/core/types/radius.ts +0 -4
  785. package/src/core/types/selectable.ts +0 -6
  786. package/src/core/types/text.ts +0 -4
  787. package/src/core/utils/arrow/arrow.tsx +0 -123
  788. package/src/core/utils/arrow/cmds.ts +0 -91
  789. package/src/core/utils/arrow/index.ts +0 -1
  790. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
  791. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
  792. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
  793. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  794. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  795. package/src/core/utils/boundaryElement/index.ts +0 -3
  796. package/src/core/utils/boundaryElement/types.ts +0 -7
  797. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  798. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
  799. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  800. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
  801. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
  802. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  803. package/src/core/utils/elementQuery/helpers.ts +0 -27
  804. package/src/core/utils/elementQuery/index.ts +0 -1
  805. package/src/core/utils/errorBoundary.tsx +0 -48
  806. package/src/core/utils/getElementRef.ts +0 -26
  807. package/src/core/utils/index.ts +0 -9
  808. package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
  809. package/src/core/utils/layer/__workshop__/index.ts +0 -24
  810. package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
  811. package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
  812. package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
  813. package/src/core/utils/layer/getLayerContext.test.ts +0 -30
  814. package/src/core/utils/layer/getLayerContext.ts +0 -21
  815. package/src/core/utils/layer/index.ts +0 -4
  816. package/src/core/utils/layer/layer.test.tsx +0 -108
  817. package/src/core/utils/layer/layer.tsx +0 -98
  818. package/src/core/utils/layer/layerContext.ts +0 -7
  819. package/src/core/utils/layer/layerProvider.tsx +0 -111
  820. package/src/core/utils/layer/types.ts +0 -9
  821. package/src/core/utils/layer/useLayer.ts +0 -26
  822. package/src/core/utils/portal/__workshop__/index.ts +0 -14
  823. package/src/core/utils/portal/__workshop__/named.tsx +0 -63
  824. package/src/core/utils/portal/index.ts +0 -4
  825. package/src/core/utils/portal/portal.test.tsx +0 -103
  826. package/src/core/utils/portal/portal.ts +0 -32
  827. package/src/core/utils/portal/portalContext.ts +0 -31
  828. package/src/core/utils/portal/portalProvider.tsx +0 -47
  829. package/src/core/utils/portal/types.ts +0 -9
  830. package/src/core/utils/portal/usePortal.ts +0 -25
  831. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  832. package/src/core/utils/srOnly/index.ts +0 -1
  833. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  834. package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
  835. package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
  836. package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
  837. package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
  838. package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
  839. package/src/core/utils/virtualList/index.ts +0 -1
  840. package/src/core/utils/virtualList/virtualList.tsx +0 -200
  841. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
  842. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
  843. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
  844. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
  845. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
  846. package/src/theme/build/_deprecated/color/color.test.ts +0 -63
  847. package/src/theme/build/_deprecated/color/defaults.ts +0 -390
  848. package/src/theme/build/_deprecated/color/factory.ts +0 -142
  849. package/src/theme/build/_deprecated/color/index.ts +0 -1
  850. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
  851. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
  852. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
  853. package/src/theme/build/buildColorTheme.test.ts +0 -183
  854. package/src/theme/build/buildColorTheme.ts +0 -499
  855. package/src/theme/build/buildTheme.test.ts +0 -87
  856. package/src/theme/build/buildTheme.ts +0 -36
  857. package/src/theme/build/colorToken/colorToken.ts +0 -19
  858. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  859. package/src/theme/build/colorToken/index.ts +0 -2
  860. package/src/theme/build/colorToken/types.ts +0 -6
  861. package/src/theme/build/index.ts +0 -3
  862. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  863. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  864. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  865. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  866. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
  867. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  868. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  869. package/src/theme/build/lib/color-fns/index.ts +0 -6
  870. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  871. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  872. package/src/theme/build/lib/color-fns/types.ts +0 -28
  873. package/src/theme/build/lib/isRecord.ts +0 -3
  874. package/src/theme/build/lib/lazy.ts +0 -30
  875. package/src/theme/build/lib/utils.ts +0 -19
  876. package/src/theme/build/merge.ts +0 -26
  877. package/src/theme/build/mixThemeColor.test.ts +0 -21
  878. package/src/theme/build/mixThemeColor.ts +0 -53
  879. package/src/theme/build/renderColorTheme.ts +0 -532
  880. package/src/theme/build/renderColorValue.ts +0 -85
  881. package/src/theme/build/resolveColorTokens.ts +0 -268
  882. package/src/theme/build/theme.test.ts +0 -27
  883. package/src/theme/config/helpers.ts +0 -55
  884. package/src/theme/config/index.ts +0 -4
  885. package/src/theme/config/system.ts +0 -115
  886. package/src/theme/config/tokens/color/index.ts +0 -1
  887. package/src/theme/config/tokens/color/types.ts +0 -133
  888. package/src/theme/config/tokens/index.ts +0 -4
  889. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
  890. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  891. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
  892. package/src/theme/config/tokens/parseTokenValue.ts +0 -133
  893. package/src/theme/config/tokens/types.ts +0 -53
  894. package/src/theme/config/types.ts +0 -46
  895. package/src/theme/defaults/colorPalette.ts +0 -5
  896. package/src/theme/defaults/colorTokens.ts +0 -648
  897. package/src/theme/defaults/config.ts +0 -84
  898. package/src/theme/defaults/fonts.ts +0 -227
  899. package/src/theme/getScopedTheme.ts +0 -98
  900. package/src/theme/index.ts +0 -5
  901. package/src/theme/system/avatar.ts +0 -14
  902. package/src/theme/system/color/_constants.ts +0 -45
  903. package/src/theme/system/color/_helpers.ts +0 -24
  904. package/src/theme/system/color/_system.ts +0 -40
  905. package/src/theme/system/color/avatar.ts +0 -15
  906. package/src/theme/system/color/badge.ts +0 -16
  907. package/src/theme/system/color/button.ts +0 -17
  908. package/src/theme/system/color/color.ts +0 -34
  909. package/src/theme/system/color/index.ts +0 -13
  910. package/src/theme/system/color/input.ts +0 -25
  911. package/src/theme/system/color/kbd.ts +0 -8
  912. package/src/theme/system/color/selectable.ts +0 -12
  913. package/src/theme/system/color/shadow.ts +0 -7
  914. package/src/theme/system/color/state.ts +0 -43
  915. package/src/theme/system/color/syntax.ts +0 -41
  916. package/src/theme/system/css.ts +0 -14
  917. package/src/theme/system/focusRing.ts +0 -7
  918. package/src/theme/system/font.ts +0 -52
  919. package/src/theme/system/index.ts +0 -11
  920. package/src/theme/system/input.ts +0 -33
  921. package/src/theme/system/layer.ts +0 -8
  922. package/src/theme/system/shadow.ts +0 -19
  923. package/src/theme/system/styles.ts +0 -13
  924. package/src/theme/system/theme.ts +0 -138
  925. package/src/theme/system/v0/avatar.ts +0 -10
  926. package/src/theme/system/v0/color/_generic.ts +0 -35
  927. package/src/theme/system/v0/color/_system.ts +0 -17
  928. package/src/theme/system/v0/color/base.ts +0 -21
  929. package/src/theme/system/v0/color/button.ts +0 -42
  930. package/src/theme/system/v0/color/card.ts +0 -19
  931. package/src/theme/system/v0/color/color.ts +0 -40
  932. package/src/theme/system/v0/color/index.ts +0 -11
  933. package/src/theme/system/v0/color/input.ts +0 -34
  934. package/src/theme/system/v0/color/muted.ts +0 -26
  935. package/src/theme/system/v0/color/selectable.ts +0 -31
  936. package/src/theme/system/v0/color/solid.ts +0 -26
  937. package/src/theme/system/v0/color/spot.ts +0 -13
  938. package/src/theme/system/v0/index.ts +0 -3
  939. package/src/theme/system/v0/input.ts +0 -23
  940. package/src/theme/versioning/getTheme_v2.ts +0 -57
  941. package/src/theme/versioning/index.ts +0 -5
  942. package/src/theme/versioning/is_v0.ts +0 -6
  943. package/src/theme/versioning/is_v2.ts +0 -6
  944. package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
  945. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
  946. package/src/theme/versioning/v0_v2.ts +0 -94
  947. package/src/theme/versioning/v2_v0.ts +0 -135
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","names":[],"sources":["../../src/kit/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":"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"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * BETTERCMS SCHEMA — the long-term contract for every editable thing (blocks, pages, entries, globals).
3
+ * One schema language → one form engine (`@/components/kit`) → used by BOTH the Visuals inspector and the
4
+ * Content document editor. Modelled on Sanity's schema (types, fieldsets, groups, previews, validation,
5
+ * conditional fields) plus BetterCMS's block slots for nested layouts.
6
+ *
7
+ * Design principles (CPO D8):
8
+ * - Scales to deep nesting without inline-accordion soup: arrays render compact preview rows; opening an item
9
+ * DRILLS IN (panel slides, breadcrumb grows). Small objects may render inline; lightweight settings open in a POPOVER.
10
+ * - Every field has the same chrome: label · help · required · validation · counter · ⋯ menu · presence · comments.
11
+ * - Blocks can contain blocks (slots) → complex layouts (tabs, columns, bento, mega menus, carousels).
12
+ */
13
+ import type { Cap } from "./sources";
14
+ import type { TableFieldOptions } from "./table";
15
+ export type PrimitiveType = "string" | "text" | "richtext" | "number" | "boolean" | "slug" | "url" | "email" | "date" | "datetime" | "color" | "select" | "multiselect" | "tags" | "image" | "file" | "video" | "icon" | "link" | "button" | "reference" | "code" | "json" | "geopoint" | "rating" | "table";
16
+ export type CompoundType = "object" | "array" | "slot";
17
+ export type SchemaType = PrimitiveType | CompoundType;
18
+ export interface Option {
19
+ value: string;
20
+ label: string;
21
+ icon?: string;
22
+ description?: string;
23
+ }
24
+ export interface Validation {
25
+ required?: boolean;
26
+ min?: number;
27
+ max?: number;
28
+ /** soft limit: warning (amber) instead of error — e.g. SEO title 60 */
29
+ recommendedMax?: number;
30
+ pattern?: string;
31
+ patternMessage?: string;
32
+ unique?: boolean;
33
+ }
34
+ /** How a compound field is edited when opened. */
35
+ export type OpenMode = "inline" | "drill" | "popover" | "dialog";
36
+ export interface PreviewConfig {
37
+ /** dotted paths into the item value */
38
+ title?: string;
39
+ subtitle?: string;
40
+ media?: string;
41
+ /** Fallback label, e.g. "Untitled question" */
42
+ fallback?: string;
43
+ /** Tabler icon name (kebab-case, e.g. "help-circle") shown when there is no media. */
44
+ icon?: string;
45
+ }
46
+ export interface Condition {
47
+ /** show this field only when another sibling field equals one of the values */
48
+ field: string;
49
+ equals?: unknown | unknown[];
50
+ notEmpty?: boolean;
51
+ }
52
+ export interface FieldSchema {
53
+ name: string;
54
+ title: string;
55
+ type: SchemaType;
56
+ /** Help text under the label (CPO D39). Unset → a house convention from `@/schema/help` may apply; "" = none. */
57
+ description?: string;
58
+ /** Longer explanation behind the ⓘ next to the label (tooltip). Use when one line can't carry it. */
59
+ helpMore?: string;
60
+ placeholder?: string;
61
+ initialValue?: unknown;
62
+ validation?: Validation;
63
+ options?: Option[];
64
+ layout?: "dropdown" | "radio" | "segmented" | "cards" | "switch" | "checkbox" | "slider" | "grid" | "list";
65
+ /** compound */
66
+ fields?: FieldSchema[];
67
+ of?: FieldSchema[] | {
68
+ type: "block";
69
+ allow?: string[];
70
+ };
71
+ openMode?: OpenMode;
72
+ preview?: PreviewConfig;
73
+ /** organisation */
74
+ fieldset?: string;
75
+ group?: string;
76
+ /** behaviour */
77
+ hidden?: Condition | boolean;
78
+ /** true = never editable in the form (computed or system values). Who may see or change a field is `access`. */
79
+ readOnly?: boolean;
80
+ /**
81
+ * D58 field-level access. `view` missing → everyone who can open the form sees it; `edit` missing → the form's own
82
+ * rule (the host's content.edit). A field the lens can't `view` is not rendered; one it can't `edit` renders as plain
83
+ * text. Fields in the `seo` group default to `{ edit: "seo.edit" }`.
84
+ */
85
+ access?: FieldAccess;
86
+ localized?: boolean;
87
+ advanced?: boolean;
88
+ ai?: boolean;
89
+ reference?: {
90
+ to: string[];
91
+ filter?: string;
92
+ };
93
+ numeric?: {
94
+ unit?: string;
95
+ step?: number;
96
+ min?: number;
97
+ max?: number;
98
+ };
99
+ /** number: a developer-controlled SCALE (tokens or a stepped range) with an optional custom escape hatch (CPO D41).
100
+ * Value shape → `ScaleValue`. Takes precedence over `layout: "slider"` + `numeric` (which still work, fixed-only). */
101
+ scale?: ScaleSchema;
102
+ /** table: column types allowed, developer-locked columns, row limits, caption rule, JSON-LD offered (CPO D42). */
103
+ table?: TableFieldOptions;
104
+ /** Tabler icon name (kebab-case) used on rows, crumbs and the block picker. */
105
+ icon?: string;
106
+ /** text: minimum visible rows. */
107
+ rows?: number;
108
+ /** Value is synced from a global block ("Navigation") — edits apply everywhere it is used. */
109
+ synced?: {
110
+ from: string;
111
+ };
112
+ /** slot: per-child layout settings stored on each child under `_settings` (e.g. bento span). */
113
+ slotSettings?: FieldSchema[];
114
+ /** array: singular noun for "Add {noun}" and empty states ("question"). Defaults from the item title. */
115
+ itemNoun?: string;
116
+ /** array: how rows render. "grid" = tiles (good for images / logos). */
117
+ arrayLayout?: "list" | "grid";
118
+ /** Help line shown under a field the lens can see but not change ("Set by the developer in code."). Never a key or a lock. */
119
+ lockReason?: string;
120
+ /** link / image / button: store a plain string (href or URL) instead of the object — for legacy data. */
121
+ valueShape?: "string" | "object";
122
+ /**
123
+ * date / datetime: time zone handling (CPO D43). true = the editor picks a zone (defaults to the site's) · "site" = always
124
+ * the site's zone · "fixed:<IANA>" = always that zone · false = no zone. Default: true for datetime, false for date.
125
+ * Zoned values store ISO with offset + the IANA zone: "2026-10-14T09:00:00+05:30[Asia/Kolkata]" (RFC 9557).
126
+ */
127
+ timezone?: boolean | "site" | `fixed:${string}`;
128
+ /** code: the field's own language and the only languages its picker offers (prod config.language / languages). */
129
+ language?: string;
130
+ languages?: string[];
131
+ }
132
+ /** D58: the caps that let someone see / change one field. */
133
+ export interface FieldAccess {
134
+ view?: Cap;
135
+ edit?: Cap;
136
+ }
137
+ /** Developer-owned values (anchors, custom CSS, ids): only people who can change the schema edit them. */
138
+ export declare const DEV_FIELD: FieldAccess;
139
+ /** Developer-only settings: hidden unless you can see the schema. */
140
+ export declare const DEV_ONLY_FIELD: FieldAccess;
141
+ export type ScaleUnit = "px" | "%" | "rem" | "em" | "vw" | "vh";
142
+ /** One allowed value of a token scale. `value` is what is stored; `label` is the short readout ("XL"). */
143
+ export interface ScaleStep {
144
+ value: string;
145
+ label: string;
146
+ /** Long name for screen readers and tooltips ("Extra large"). Defaults to `label`. */
147
+ title?: string;
148
+ /** Resolved size in px, shown as "XL · 48px" and used to place custom values on the track. */
149
+ px?: number;
150
+ /** Resolved CSS when it isn't px (e.g. "100vh", "var(--space-xl)"). */
151
+ css?: string;
152
+ }
153
+ /** A stepped numeric range (continuous with snapping). The stored value is a bare number in `defaultUnit`. */
154
+ export interface ScaleRange {
155
+ min: number;
156
+ max: number;
157
+ step?: number;
158
+ }
159
+ /** Bounds for the custom escape hatch. min / max may be one number or per unit ({ px: 0, "%": 0 }). */
160
+ export interface ScaleCustom {
161
+ min?: number | Partial<Record<ScaleUnit, number>>;
162
+ max?: number | Partial<Record<ScaleUnit, number>>;
163
+ /** Units the editor may type. Defaults to the scale's `units`. */
164
+ units?: ScaleUnit[];
165
+ /** Arrow-key nudge (Shift ×10, Alt ×0.1). Default 1. */
166
+ step?: number;
167
+ }
168
+ export interface ScaleSchema {
169
+ /** Token steps (S M L XL 2XL) or a numeric range ({ min, max, step }). */
170
+ steps: ScaleStep[] | ScaleRange;
171
+ /** Units of the scale; the first is the default. A range with no units is unitless. */
172
+ units?: ScaleUnit[];
173
+ defaultUnit?: ScaleUnit;
174
+ /** false (default) = fixed only: the editor can pick only the allowed values. true / object = fixed + custom. */
175
+ allowCustom?: boolean | ScaleCustom;
176
+ /** Quick picks in the unit menu when custom is allowed ("50%", "100vh"). */
177
+ presets?: {
178
+ label?: string;
179
+ value: ScaleValue;
180
+ }[];
181
+ }
182
+ /**
183
+ * How a scale value is STORED — three shapes, told apart by `typeof`, so tokens and custom values never collide and
184
+ * older data (bare token strings, bare numbers) is already valid:
185
+ * - token → the step's value string ("xl")
186
+ * - range → a bare number in the default unit (15 → 15%)
187
+ * - custom → an object ({ value: 200, unit: "px" })
188
+ */
189
+ export type ScaleValue = string | number | ScaleCustomValue;
190
+ export interface ScaleCustomValue {
191
+ value: number;
192
+ unit: ScaleUnit;
193
+ }
194
+ export interface Fieldset {
195
+ name: string;
196
+ title: string;
197
+ description?: string;
198
+ collapsed?: boolean;
199
+ columns?: 1 | 2;
200
+ /** CPO D45: the header toggles the section (default true). false = a static heading for 2–3 fields that are always needed. */
201
+ collapsible?: boolean;
202
+ /**
203
+ * CPO D45: "breakpoints" = the members are objects, one per screen size (desktop · tablet · phone), shown as ONE group with a
204
+ * segmented switcher instead of three stacked groups. Sibling objects named desktop / laptop / tablet / mobile / phone get
205
+ * this automatically.
206
+ */
207
+ layout?: "stack" | "breakpoints";
208
+ }
209
+ export interface FieldGroup {
210
+ name: string;
211
+ title: string;
212
+ icon?: string;
213
+ default?: boolean;
214
+ }
215
+ /** A developer-defined layout of a block (swap without losing content). */
216
+ export interface BlockVariant {
217
+ id: string;
218
+ name: string;
219
+ description?: string;
220
+ }
221
+ /** A document/block type. */
222
+ export interface TypeSchema {
223
+ name: string;
224
+ title: string;
225
+ kind: "block" | "page" | "entry" | "global" | "object";
226
+ icon?: string;
227
+ description?: string;
228
+ fields: FieldSchema[];
229
+ fieldsets?: Fieldset[];
230
+ groups?: FieldGroup[];
231
+ preview?: PreviewConfig;
232
+ /** Block variants (layouts) — shown as a chip on slot rows and a switcher in the block frame. */
233
+ variants?: BlockVariant[];
234
+ /** Block picker category ("Layout", "Content", "Media"…). */
235
+ category?: string;
236
+ /**
237
+ * kind "block" only (CPO D55): where the block fits. "inline" = it fits a text column, so a rich-text body lists it in
238
+ * the Insert menu's Article group. "section" (default) = page-width, reachable in a body only through More components.
239
+ * "page" = a whole page or a feed of other content; never inside a body.
240
+ */
241
+ placement?: "inline" | "section" | "page";
242
+ /** Starting value for a new instance (block added to a slot, new document). */
243
+ initialValue?: Record<string, unknown>;
244
+ }
245
+ /** Every array item / slot child carries a stable key. Slot children also carry their block type. */
246
+ export interface KeyedItem {
247
+ _key?: string;
248
+ /** item type name (arrays with several `of` types) or block type (slots) */
249
+ _type?: string;
250
+ }
251
+ /** A block inside a slot: its own props at the root, plus variant and per-slot layout settings. */
252
+ export interface SlotChild extends KeyedItem {
253
+ _type: string;
254
+ _variant?: string;
255
+ _settings?: Record<string, unknown>;
256
+ [prop: string]: unknown;
257
+ }
258
+ /** Path from the root document/block to the field being edited, e.g. ["items", 1, "answer"] */
259
+ export type FieldPath = (string | number)[];
260
+ /** One crumb in the inspector/editor breadcrumb (drill-in navigation stack). */
261
+ export interface Crumb {
262
+ path: FieldPath;
263
+ title: string;
264
+ icon?: string;
265
+ /** tableGroup / tableRow / tableColumn: a table field's rows and columns drill like array items (D50) */
266
+ kind: "root" | "object" | "item" | "block" | "button" | "history" | "tableGroup" | "tableRow" | "tableColumn";
267
+ }
268
+ /** Reserved path segment: the field's version history as a stacked panel, e.g. ["title", "@history"]. */
269
+ export declare const HISTORY_SEGMENT = "@history";
@@ -0,0 +1,14 @@
1
+ //#region src/kit/schema/types.ts
2
+ /** Developer-owned values (anchors, custom CSS, ids): only people who can change the schema edit them. */
3
+ var DEV_FIELD = { edit: "schema.manage" };
4
+ /** Developer-only settings: hidden unless you can see the schema. */
5
+ var DEV_ONLY_FIELD = {
6
+ view: "schema.view",
7
+ edit: "schema.manage"
8
+ };
9
+ /** Reserved path segment: the field's version history as a stacked panel, e.g. ["title", "@history"]. */
10
+ var HISTORY_SEGMENT = "@history";
11
+ //#endregion
12
+ export { DEV_FIELD, DEV_ONLY_FIELD, HISTORY_SEGMENT };
13
+
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/kit/schema/types.ts"],"sourcesContent":["/**\n * BETTERCMS SCHEMA — the long-term contract for every editable thing (blocks, pages, entries, globals).\n * One schema language → one form engine (`@/components/kit`) → used by BOTH the Visuals inspector and the\n * Content document editor. Modelled on Sanity's schema (types, fieldsets, groups, previews, validation,\n * conditional fields) plus BetterCMS's block slots for nested layouts.\n *\n * Design principles (CPO D8):\n * - Scales to deep nesting without inline-accordion soup: arrays render compact preview rows; opening an item\n * DRILLS IN (panel slides, breadcrumb grows). Small objects may render inline; lightweight settings open in a POPOVER.\n * - Every field has the same chrome: label · help · required · validation · counter · ⋯ menu · presence · comments.\n * - Blocks can contain blocks (slots) → complex layouts (tabs, columns, bento, mega menus, carousels).\n */\n\nimport type { Cap } from \"./sources\";\nimport type { TableFieldOptions } from \"./table\";\n\nexport type PrimitiveType =\n | \"string\" // single line\n | \"text\" // multi line, auto-grow\n | \"richtext\" // portable-text style rich text\n | \"number\"\n | \"boolean\"\n | \"slug\"\n | \"url\"\n | \"email\"\n | \"date\"\n | \"datetime\"\n | \"color\"\n | \"select\" // options: single\n | \"multiselect\"\n | \"tags\"\n | \"image\"\n | \"file\"\n | \"video\"\n | \"icon\" // icon picker (Tabler name)\n | \"link\" // url | page ref + target + rel (one unit)\n | \"button\" // label + link + style (one unit — founder rule)\n | \"reference\" // to a collection entry / page / form\n | \"code\"\n | \"json\"\n | \"geopoint\"\n | \"rating\"\n | \"table\"; // typed columns × keyed rows (CPO D42) — value: TableValue (src/schema/table.ts)\n\nexport type CompoundType =\n | \"object\" // nested fields\n | \"array\" // list of `of` (objects, primitives or references)\n | \"slot\"; // list of nested BLOCKS (block-in-block layouts)\n\nexport type SchemaType = PrimitiveType | CompoundType;\n\nexport interface Option {\n value: string;\n label: string;\n icon?: string;\n description?: string;\n}\n\nexport interface Validation {\n required?: boolean;\n min?: number; // chars for strings, items for arrays, value for numbers\n max?: number;\n /** soft limit: warning (amber) instead of error — e.g. SEO title 60 */\n recommendedMax?: number;\n pattern?: string;\n patternMessage?: string;\n unique?: boolean;\n}\n\n/** How a compound field is edited when opened. */\nexport type OpenMode =\n | \"inline\" // render fields in place (small objects, ≤3 primitives)\n | \"drill\" // slide the panel to a child view; breadcrumb grows (default for array items & objects)\n | \"popover\" // anchored popover (link settings, image crop/alt, small option sets)\n | \"dialog\"; // centered modal for heavy editors (rich text full screen, code, table)\n\nexport interface PreviewConfig {\n /** dotted paths into the item value */\n title?: string;\n subtitle?: string;\n media?: string;\n /** Fallback label, e.g. \"Untitled question\" */\n fallback?: string;\n /** Tabler icon name (kebab-case, e.g. \"help-circle\") shown when there is no media. */\n icon?: string;\n}\n\nexport interface Condition {\n /** show this field only when another sibling field equals one of the values */\n field: string;\n equals?: unknown | unknown[];\n notEmpty?: boolean;\n}\n\nexport interface FieldSchema {\n name: string; // key in the value object\n title: string; // label (sentence case)\n type: SchemaType;\n /** Help text under the label (CPO D39). Unset → a house convention from `@/schema/help` may apply; \"\" = none. */\n description?: string;\n /** Longer explanation behind the ⓘ next to the label (tooltip). Use when one line can't carry it. */\n helpMore?: string;\n placeholder?: string;\n initialValue?: unknown;\n validation?: Validation;\n options?: Option[]; // select / multiselect / radio-like\n layout?: \"dropdown\" | \"radio\" | \"segmented\" | \"cards\" | \"switch\" | \"checkbox\" | \"slider\" | \"grid\" | \"list\";\n /** compound */\n fields?: FieldSchema[]; // object\n of?: FieldSchema[] | { type: \"block\"; allow?: string[] }; // array items / slot allowed block types\n openMode?: OpenMode;\n preview?: PreviewConfig;\n /** organisation */\n fieldset?: string; // groups fields into a collapsible fieldset\n group?: string; // which tab (Content / Media / Settings / SEO…)\n /** behaviour */\n hidden?: Condition | boolean;\n /** true = never editable in the form (computed or system values). Who may see or change a field is `access`. */\n readOnly?: boolean;\n /**\n * D58 field-level access. `view` missing → everyone who can open the form sees it; `edit` missing → the form's own\n * rule (the host's content.edit). A field the lens can't `view` is not rendered; one it can't `edit` renders as plain\n * text. Fields in the `seo` group default to `{ edit: \"seo.edit\" }`.\n */\n access?: FieldAccess;\n localized?: boolean;\n advanced?: boolean; // tucked into the \"Advanced\" fieldset by default (calm UX)\n ai?: boolean; // show the AI assist sparkle\n reference?: { to: string[]; filter?: string }; // reference targets (collection ids, \"page\", \"form\")\n numeric?: { unit?: string; step?: number; min?: number; max?: number }; // number / slider\n /** number: a developer-controlled SCALE (tokens or a stepped range) with an optional custom escape hatch (CPO D41).\n * Value shape → `ScaleValue`. Takes precedence over `layout: \"slider\"` + `numeric` (which still work, fixed-only). */\n scale?: ScaleSchema;\n /** table: column types allowed, developer-locked columns, row limits, caption rule, JSON-LD offered (CPO D42). */\n table?: TableFieldOptions;\n\n /* ── additive (Block Kit v1) ─────────────────────────────────────────── */\n /** Tabler icon name (kebab-case) used on rows, crumbs and the block picker. */\n icon?: string;\n /** text: minimum visible rows. */\n rows?: number;\n /** Value is synced from a global block (\"Navigation\") — edits apply everywhere it is used. */\n synced?: { from: string };\n /** slot: per-child layout settings stored on each child under `_settings` (e.g. bento span). */\n slotSettings?: FieldSchema[];\n /** array: singular noun for \"Add {noun}\" and empty states (\"question\"). Defaults from the item title. */\n itemNoun?: string;\n /** array: how rows render. \"grid\" = tiles (good for images / logos). */\n arrayLayout?: \"list\" | \"grid\";\n /** Help line shown under a field the lens can see but not change (\"Set by the developer in code.\"). Never a key or a lock. */\n lockReason?: string;\n /** link / image / button: store a plain string (href or URL) instead of the object — for legacy data. */\n valueShape?: \"string\" | \"object\";\n /**\n * date / datetime: time zone handling (CPO D43). true = the editor picks a zone (defaults to the site's) · \"site\" = always\n * the site's zone · \"fixed:<IANA>\" = always that zone · false = no zone. Default: true for datetime, false for date.\n * Zoned values store ISO with offset + the IANA zone: \"2026-10-14T09:00:00+05:30[Asia/Kolkata]\" (RFC 9557).\n */\n timezone?: boolean | \"site\" | `fixed:${string}`;\n /** code: the field's own language and the only languages its picker offers (prod config.language / languages). */\n language?: string;\n languages?: string[];\n}\n\n/** D58: the caps that let someone see / change one field. */\nexport interface FieldAccess {\n view?: Cap;\n edit?: Cap;\n}\n/** Developer-owned values (anchors, custom CSS, ids): only people who can change the schema edit them. */\nexport const DEV_FIELD: FieldAccess = { edit: \"schema.manage\" };\n/** Developer-only settings: hidden unless you can see the schema. */\nexport const DEV_ONLY_FIELD: FieldAccess = { view: \"schema.view\", edit: \"schema.manage\" };\n\n/* ── Scales (CPO D41) ─────────────────────────────────────────────────── */\nexport type ScaleUnit = \"px\" | \"%\" | \"rem\" | \"em\" | \"vw\" | \"vh\";\n\n/** One allowed value of a token scale. `value` is what is stored; `label` is the short readout (\"XL\"). */\nexport interface ScaleStep {\n value: string;\n label: string;\n /** Long name for screen readers and tooltips (\"Extra large\"). Defaults to `label`. */\n title?: string;\n /** Resolved size in px, shown as \"XL · 48px\" and used to place custom values on the track. */\n px?: number;\n /** Resolved CSS when it isn't px (e.g. \"100vh\", \"var(--space-xl)\"). */\n css?: string;\n}\n\n/** A stepped numeric range (continuous with snapping). The stored value is a bare number in `defaultUnit`. */\nexport interface ScaleRange {\n min: number;\n max: number;\n step?: number;\n}\n\n/** Bounds for the custom escape hatch. min / max may be one number or per unit ({ px: 0, \"%\": 0 }). */\nexport interface ScaleCustom {\n min?: number | Partial<Record<ScaleUnit, number>>;\n max?: number | Partial<Record<ScaleUnit, number>>;\n /** Units the editor may type. Defaults to the scale's `units`. */\n units?: ScaleUnit[];\n /** Arrow-key nudge (Shift ×10, Alt ×0.1). Default 1. */\n step?: number;\n}\n\nexport interface ScaleSchema {\n /** Token steps (S M L XL 2XL) or a numeric range ({ min, max, step }). */\n steps: ScaleStep[] | ScaleRange;\n /** Units of the scale; the first is the default. A range with no units is unitless. */\n units?: ScaleUnit[];\n defaultUnit?: ScaleUnit;\n /** false (default) = fixed only: the editor can pick only the allowed values. true / object = fixed + custom. */\n allowCustom?: boolean | ScaleCustom;\n /** Quick picks in the unit menu when custom is allowed (\"50%\", \"100vh\"). */\n presets?: { label?: string; value: ScaleValue }[];\n}\n\n/**\n * How a scale value is STORED — three shapes, told apart by `typeof`, so tokens and custom values never collide and\n * older data (bare token strings, bare numbers) is already valid:\n * - token → the step's value string (\"xl\")\n * - range → a bare number in the default unit (15 → 15%)\n * - custom → an object ({ value: 200, unit: \"px\" })\n */\nexport type ScaleValue = string | number | ScaleCustomValue;\nexport interface ScaleCustomValue {\n value: number;\n unit: ScaleUnit;\n}\n\nexport interface Fieldset {\n name: string;\n title: string;\n description?: string;\n collapsed?: boolean; // collapsed by default\n columns?: 1 | 2; // short fields side by side\n /** CPO D45: the header toggles the section (default true). false = a static heading for 2–3 fields that are always needed. */\n collapsible?: boolean;\n /**\n * CPO D45: \"breakpoints\" = the members are objects, one per screen size (desktop · tablet · phone), shown as ONE group with a\n * segmented switcher instead of three stacked groups. Sibling objects named desktop / laptop / tablet / mobile / phone get\n * this automatically.\n */\n layout?: \"stack\" | \"breakpoints\";\n}\n\nexport interface FieldGroup {\n name: string;\n title: string;\n icon?: string;\n default?: boolean;\n}\n\n/** A developer-defined layout of a block (swap without losing content). */\nexport interface BlockVariant {\n id: string;\n name: string;\n description?: string;\n}\n\n/** A document/block type. */\nexport interface TypeSchema {\n name: string; // e.g. \"hero\", \"journalStory\"\n title: string;\n kind: \"block\" | \"page\" | \"entry\" | \"global\" | \"object\";\n icon?: string;\n description?: string;\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n preview?: PreviewConfig;\n /* ── additive (Block Kit v1) ── */\n /** Block variants (layouts) — shown as a chip on slot rows and a switcher in the block frame. */\n variants?: BlockVariant[];\n /** Block picker category (\"Layout\", \"Content\", \"Media\"…). */\n category?: string;\n /**\n * kind \"block\" only (CPO D55): where the block fits. \"inline\" = it fits a text column, so a rich-text body lists it in\n * the Insert menu's Article group. \"section\" (default) = page-width, reachable in a body only through More components.\n * \"page\" = a whole page or a feed of other content; never inside a body.\n */\n placement?: \"inline\" | \"section\" | \"page\";\n /** Starting value for a new instance (block added to a slot, new document). */\n initialValue?: Record<string, unknown>;\n}\n\n/** Every array item / slot child carries a stable key. Slot children also carry their block type. */\nexport interface KeyedItem {\n _key?: string;\n /** item type name (arrays with several `of` types) or block type (slots) */\n _type?: string;\n}\n/** A block inside a slot: its own props at the root, plus variant and per-slot layout settings. */\nexport interface SlotChild extends KeyedItem {\n _type: string;\n _variant?: string;\n _settings?: Record<string, unknown>;\n [prop: string]: unknown;\n}\n\n/** Path from the root document/block to the field being edited, e.g. [\"items\", 1, \"answer\"] */\nexport type FieldPath = (string | number)[];\n\n/** One crumb in the inspector/editor breadcrumb (drill-in navigation stack). */\nexport interface Crumb {\n path: FieldPath;\n title: string;\n icon?: string;\n /** tableGroup / tableRow / tableColumn: a table field's rows and columns drill like array items (D50) */\n kind: \"root\" | \"object\" | \"item\" | \"block\" | \"button\" | \"history\" | \"tableGroup\" | \"tableRow\" | \"tableColumn\";\n}\n\n/** Reserved path segment: the field's version history as a stacked panel, e.g. [\"title\", \"@history\"]. */\nexport const HISTORY_SEGMENT = \"@history\";\n"],"mappings":";;AA0KA,IAAa,YAAyB,EAAE,MAAM,iBAAiB;;AAE/D,IAAa,iBAA8B;CAAE,MAAM;CAAe,MAAM;CAAiB;;AA8IzF,IAAa,kBAAkB"}
package/types.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { FieldPath, FieldSchema } from "./schema/types";
2
+ /** Props every field control receives. Controls are pure: value in, onChange out; chrome lives in <FieldShell>. */
3
+ export interface ControlProps<T = unknown> {
4
+ field: FieldSchema;
5
+ value: T;
6
+ onChange: (v: T) => void;
7
+ /** DOM id for the primary input (the label points at it). */
8
+ id: string;
9
+ invalid?: boolean;
10
+ readOnly?: boolean;
11
+ /** absolute path of this field (drill-in targets, comments, rich-text identity) */
12
+ path: FieldPath;
13
+ /** sibling values (slug ← title, conditional UI) */
14
+ parent?: Record<string, unknown>;
15
+ /** mark the field touched (validation shows on blur) */
16
+ onBlur?: () => void;
17
+ }