@bettercms-ai/kit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -1,19 +1,20 @@
1
1
  import { cn } from "../lib/cn.js";
2
+ import { KitSectionTitle, useForm, useKitEnv } from "../context.js";
2
3
  import { isObj, keyStartsWith, pathKey } from "../lib/path.js";
3
4
  import { KitIcon } from "../lib/icons.js";
4
- import { useForm, useKitEnv } from "../context.js";
5
5
  import { Segmented } from "../ui/controls.js";
6
6
  import { Menu, MenuContent, MenuItem, MenuTrigger, Tooltip } from "../ui/overlay.js";
7
- import { isEmptyValue, isHidden } from "../lib/schema.js";
7
+ import { condCtx, isEmptyValue, isHidden } from "../lib/schema.js";
8
8
  import { IssueDot } from "./bits.js";
9
9
  import { PeerStack } from "./field-shell.js";
10
10
  import { groupSummary } from "./group-summary.js";
11
- import { columnSpans } from "../lib/columns.js";
11
+ import { SHORT_TEXT_MAX, columnSpans, isColumnField } from "../lib/columns.js";
12
+ import { isIconImage } from "../lib/icon-image.js";
12
13
  import * as React from "react";
13
- import { IconChevronDown, IconChevronRight, IconDeviceDesktop, IconDeviceLaptop, IconDeviceMobile, IconDeviceTablet, IconMessage } from "@tabler/icons-react";
14
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
+ import { IconChevronDown, IconChevronRight, IconDeviceDesktop, IconDeviceLaptop, IconDeviceMobile, IconDeviceTablet, IconMessage } from "@tabler/icons-react";
15
16
  import { AnimatePresence, motion, useReducedMotion } from "framer-motion";
16
- //#region src/kit/engine/grouping.tsx
17
+ //#region src/engine/grouping.tsx
17
18
  /**
18
19
  * GROUPING (CPO D45; V2 HEAD 9829bf1 kit/engine/grouping.tsx + the layout half of kit/engine/field-list.tsx) — the four
19
20
  * ways the Block Kit puts fields together, and the rules for nesting them.
@@ -191,8 +192,34 @@ function GroupBadges({ status }) {
191
192
  * Sibling fields, laid out by the D63 rule: a plain animated stack, or (when `columns` and at least one pair of short
192
193
  * neighbours) a grid that turns two-up only when the form is ≥ 420px wide. Used by sections, insets and array rows.
193
194
  */
194
- function FieldRun({ fields, render, columns = true }) {
195
+ function FieldRun({ fields, render, columns = true, values }) {
195
196
  const rhythm = useRhythm();
197
+ const icons = splitIcons(fields, values ?? {});
198
+ if (icons) return /* @__PURE__ */ jsxs("div", {
199
+ className: "flex min-w-0 flex-col",
200
+ children: [
201
+ icons.before.length ? /* @__PURE__ */ jsx(FieldRun, {
202
+ fields: icons.before,
203
+ render,
204
+ columns
205
+ }) : null,
206
+ /* @__PURE__ */ jsx("div", {
207
+ className: icons.before.length ? rhythm.field : void 0,
208
+ children: /* @__PURE__ */ jsx(IconGroup, {
209
+ fields: icons.icons,
210
+ render
211
+ })
212
+ }),
213
+ icons.after.length ? /* @__PURE__ */ jsx("div", {
214
+ className: rhythm.field,
215
+ children: /* @__PURE__ */ jsx(FieldRun, {
216
+ fields: icons.after,
217
+ render,
218
+ columns
219
+ })
220
+ }) : null
221
+ ]
222
+ });
196
223
  const spans = columns ? columnSpans(fields) : fields.map(() => false);
197
224
  if (!spans.some(Boolean)) return /* @__PURE__ */ jsx("div", {
198
225
  className: "flex min-w-0 flex-col",
@@ -210,6 +237,41 @@ function FieldRun({ fields, render, columns = true }) {
210
237
  }, f.name))
211
238
  });
212
239
  }
240
+ /**
241
+ * A header with eight social icons would otherwise stack eight rows between its texts. A lone icon is just its row:
242
+ * no heading for one. `isIconImage` is the same rule the image control draws the row by.
243
+ */
244
+ function splitIcons(fields, values) {
245
+ const icons = fields.filter((f) => isIconImage(f, values[f.name]));
246
+ if (icons.length < 2) return null;
247
+ const at = fields.indexOf(icons[0]);
248
+ const rest = fields.filter((f) => !icons.includes(f));
249
+ return {
250
+ before: rest.slice(0, at),
251
+ icons,
252
+ after: rest.slice(at)
253
+ };
254
+ }
255
+ function IconGroup({ fields, render }) {
256
+ const id = React.useId();
257
+ return /* @__PURE__ */ jsxs("div", {
258
+ role: "group",
259
+ "aria-labelledby": id,
260
+ "data-slot": "kit-icon-group",
261
+ className: "flex min-w-0 flex-col gap-1.5",
262
+ children: [/* @__PURE__ */ jsx("p", {
263
+ id,
264
+ className: "text-kit-xs font-medium text-kit-fg-3",
265
+ children: "Icons"
266
+ }), /* @__PURE__ */ jsx("div", {
267
+ className: "flex min-w-0 flex-col gap-2",
268
+ children: fields.map((f) => /* @__PURE__ */ jsx("div", {
269
+ className: "min-w-0",
270
+ children: render(f)
271
+ }, f.name))
272
+ })]
273
+ });
274
+ }
213
275
  function FieldSection({ title, description, collapsible = true, defaultOpen = true, open: openProp, onOpenChange, summary, status, divider = true, revealWhen, disabled, actions, lead, columns, icon, adornment, className, bodyClassName, children }) {
214
276
  const rhythm = useRhythm();
215
277
  const { variant } = useKitEnv();
@@ -230,7 +292,7 @@ function FieldSection({ title, description, collapsible = true, defaultOpen = tr
230
292
  comments: 0,
231
293
  ...status
232
294
  };
233
- const titleCls = cn("shrink-0 font-semibold text-kit-fg", variant === "document" ? "text-kit-base" : "text-kit-sm", disabled && "text-kit-fg-4");
295
+ const titleCls = cn("min-w-0 truncate font-semibold text-kit-fg", variant === "document" ? "text-kit-base" : "text-kit-sm", disabled && "text-kit-fg-4");
234
296
  const body = /* @__PURE__ */ jsxs("div", {
235
297
  id: `${id}-body`,
236
298
  className: cn("flex flex-col pb-2 pt-1", rhythm.stack, bodyClassName),
@@ -273,7 +335,7 @@ function FieldSection({ title, description, collapsible = true, defaultOpen = tr
273
335
  children: title
274
336
  }),
275
337
  adornment,
276
- !open && summary ? /* @__PURE__ */ jsx("span", {
338
+ !open && Array.isArray(summary) ? /* @__PURE__ */ jsx(SummaryChips, { chips: summary }) : !open && summary ? /* @__PURE__ */ jsx("span", {
277
339
  className: "min-w-0 flex-1 truncate text-right text-kit-xs text-kit-fg-3",
278
340
  children: summary
279
341
  }) : /* @__PURE__ */ jsx("span", { className: "flex-1" }),
@@ -289,10 +351,40 @@ function FieldSection({ title, description, collapsible = true, defaultOpen = tr
289
351
  className: cn(titleCls, "flex-1"),
290
352
  children: title
291
353
  }), actions]
292
- }), collapsible ? /* @__PURE__ */ jsx(SectionBody, {
293
- open,
294
- children: body
295
- }) : body]
354
+ }), /* @__PURE__ */ jsx(KitSectionTitle.Provider, {
355
+ value: title,
356
+ children: collapsible ? /* @__PURE__ */ jsx(SectionBody, {
357
+ open,
358
+ children: body
359
+ }) : body
360
+ })]
361
+ });
362
+ }
363
+ /** A collapsed section's summary as neutral chips (the schema editor's field settings): 2 chips, then "+N" with the rest
364
+ * in its tooltip; none = a quiet "Nothing set". Colour stays for type and status, so these are --constraint chips. */
365
+ function SummaryChips({ chips }) {
366
+ if (!chips.length) return /* @__PURE__ */ jsx("span", {
367
+ className: "min-w-0 flex-1 truncate text-right text-kit-xs text-kit-fg-3",
368
+ children: "Nothing set"
369
+ });
370
+ const shown = chips.slice(0, 2);
371
+ const rest = chips.slice(2);
372
+ const chip = "inline-flex h-5 min-w-0 shrink items-center rounded-[4px] bg-kit-constraint-bg px-1.5 text-kit-2xs font-medium text-kit-constraint-fg";
373
+ return /* @__PURE__ */ jsxs("span", {
374
+ className: "flex min-w-0 flex-1 items-center justify-end gap-1",
375
+ children: [shown.map((c) => /* @__PURE__ */ jsx("span", {
376
+ className: chip,
377
+ children: /* @__PURE__ */ jsx("span", {
378
+ className: "truncate",
379
+ children: c
380
+ })
381
+ }, c)), rest.length ? /* @__PURE__ */ jsx(Tooltip, {
382
+ content: rest.join(" · "),
383
+ children: /* @__PURE__ */ jsxs("span", {
384
+ className: cn(chip, "shrink-0 tabular-nums"),
385
+ children: ["+", rest.length]
386
+ })
387
+ }) : null]
296
388
  });
297
389
  }
298
390
  /**
@@ -412,7 +504,8 @@ function BreakpointGroup({ set, members, basePath, memoryKey, divider, renderFie
412
504
  const summary = differing.length ? `Own settings on ${differing.map((m) => m.title.toLowerCase()).join(" and ")}` : `Same on every screen`;
413
505
  const activeValue = valueOf(active);
414
506
  const obj = isObj(activeValue) ? activeValue : {};
415
- const fields = (active.fields ?? []).filter((f) => !isHidden(f, obj));
507
+ const cc = condCtx(form, [...basePath, active.name]);
508
+ const fields = (active.fields ?? []).filter((f) => !isHidden(f, obj, cc));
416
509
  const id = React.useId();
417
510
  const compactBp = members.length >= 4 && members.every((m) => BP_ICON[m.name.toLowerCase()] || m.icon);
418
511
  return /* @__PURE__ */ jsx(FieldSection, {
@@ -561,6 +654,18 @@ function arrangeFields(fields, fieldsets = []) {
561
654
  });
562
655
  return items;
563
656
  }
657
+ /** The frame's loose icon fields (not those inside a fieldset) as one "Icons" item where the first was. @see splitIcons */
658
+ function gatherIcons(items, obj) {
659
+ const icons = items.flatMap((it) => it.kind === "field" ? [it.field] : []).filter((f) => isIconImage(f, obj[f.name]));
660
+ if (icons.length < 2) return items;
661
+ const out = [];
662
+ for (const it of items) if (it.kind !== "field" || !icons.includes(it.field)) out.push(it);
663
+ else if (it.field === icons[0]) out.push({
664
+ kind: "icons",
665
+ fields: icons
666
+ });
667
+ return out;
668
+ }
564
669
  /** The group a field without `group` belongs to: the one marked `default`, else the first. */
565
670
  var defaultGroup = (groups) => groups?.find((g) => g.default) ?? groups?.[0];
566
671
  /**
@@ -575,7 +680,8 @@ function FieldList({ fields, fieldsets, groups, basePath, memoryKey, renderField
575
680
  const env = useKitEnv();
576
681
  const raw = form.getAt(basePath);
577
682
  const obj = isObj(raw) ? raw : {};
578
- const visible = fields.filter((f) => !isHidden(f, obj));
683
+ const cc = condCtx(form, basePath);
684
+ const visible = fields.filter((f) => !isHidden(f, obj, cc));
579
685
  const usable = (groups ?? []).filter((g) => visible.some((f) => (f.group ?? defaultGroup(groups)?.name) === g.name));
580
686
  const tabs = usable.length >= 2;
581
687
  const allTab = tabs && env.variant === "document";
@@ -589,8 +695,42 @@ function FieldList({ fields, fieldsets, groups, basePath, memoryKey, renderField
589
695
  const active = validTabs.includes(tab) ? tab : validTabs[0] ?? "";
590
696
  const inTab = (f) => !tabs || active === "__all" || (f.group ?? defaultGroup(groups)?.name) === active;
591
697
  const groupErrors = (g) => visible.filter((f) => (f.group ?? defaultGroup(groups)?.name) === g).reduce((n, f) => n + form.rollup([...basePath, f.name]).errors, 0);
592
- const items = arrangeFields(visible.filter(inTab), fieldsets);
698
+ const items = gatherIcons(arrangeFields(visible.filter(inTab), fieldsets), obj);
593
699
  const rhythm = useRhythm();
700
+ const review = env.review;
701
+ const [openRuns, setOpenRuns] = React.useState(() => /* @__PURE__ */ new Set());
702
+ const itemChanged = (it) => !review || (it.kind === "field" ? review.count([...basePath, it.field.name]) > 0 : it.fields.some((f) => review.count([...basePath, f.name]) > 0));
703
+ const segs = [];
704
+ for (const it of items) {
705
+ if (!review?.onlyChanges || itemChanged(it)) {
706
+ segs.push({
707
+ kind: "item",
708
+ it
709
+ });
710
+ continue;
711
+ }
712
+ const last = segs[segs.length - 1];
713
+ const n = it.kind === "field" ? 1 : it.fields.length;
714
+ if (last?.kind === "fold") {
715
+ last.items.push(it);
716
+ last.n += n;
717
+ } else segs.push({
718
+ kind: "fold",
719
+ key: `fold:${it.kind === "field" ? it.field.name : it.kind === "set" ? it.set.name : "icons"}`,
720
+ items: [it],
721
+ n
722
+ });
723
+ }
724
+ const rows = segs.flatMap((sg) => sg.kind === "item" ? [sg] : [sg, ...openRuns.has(sg.key) ? sg.items.map((it) => ({
725
+ kind: "item",
726
+ it
727
+ })) : []]);
728
+ const toggleRun = (key) => setOpenRuns((o) => {
729
+ const n = new Set(o);
730
+ if (n.has(key)) n.delete(key);
731
+ else n.add(key);
732
+ return n;
733
+ });
594
734
  return /* @__PURE__ */ jsxs("div", {
595
735
  className: "flex flex-col",
596
736
  children: [
@@ -613,13 +753,44 @@ function FieldList({ fields, fieldsets, groups, basePath, memoryKey, renderField
613
753
  }) : null,
614
754
  /* @__PURE__ */ jsx(AnimatePresence, {
615
755
  initial: false,
616
- children: items.map((it, i) => {
617
- const prev = items[i - 1];
618
- const space = i === 0 ? void 0 : it.kind === "set" ? prev?.kind === "set" ? void 0 : rhythm.group : rhythm.field;
756
+ children: rows.map((row, i) => {
757
+ if (row.kind === "fold") {
758
+ const open = openRuns.has(row.key);
759
+ const label = `${row.n} unchanged ${row.n === 1 ? "field" : "fields"}`;
760
+ return /* @__PURE__ */ jsx(Appear, {
761
+ space: i === 0 ? void 0 : rhythm.field,
762
+ children: /* @__PURE__ */ jsxs("button", {
763
+ type: "button",
764
+ "aria-expanded": open,
765
+ onClick: () => toggleRun(row.key),
766
+ className: "flex w-full items-center gap-2 rounded-kit-md text-kit-xs text-kit-fg-3 outline-none hover:text-kit-fg-2 focus-visible:text-kit-fg",
767
+ children: [
768
+ /* @__PURE__ */ jsx("span", {
769
+ "aria-hidden": true,
770
+ className: "h-px flex-1 bg-kit-line-subtle"
771
+ }),
772
+ open ? `Hide ${label}` : label,
773
+ /* @__PURE__ */ jsx("span", {
774
+ "aria-hidden": true,
775
+ className: "h-px flex-1 bg-kit-line-subtle"
776
+ })
777
+ ]
778
+ })
779
+ }, row.key);
780
+ }
781
+ const it = row.it;
782
+ const prev = rows[i - 1];
783
+ const space = i === 0 ? void 0 : it.kind === "set" ? prev?.kind === "item" && prev.it.kind === "set" ? void 0 : rhythm.group : rhythm.field;
619
784
  return it.kind === "field" ? /* @__PURE__ */ jsx(Appear, {
620
785
  space,
621
786
  children: renderField(it.field, [...basePath, it.field.name], obj)
622
- }, it.field.name) : /* @__PURE__ */ jsx(Appear, {
787
+ }, it.field.name) : it.kind === "icons" ? /* @__PURE__ */ jsx(Appear, {
788
+ space,
789
+ children: /* @__PURE__ */ jsx(IconGroup, {
790
+ fields: it.fields,
791
+ render: (f) => renderField(f, [...basePath, f.name], obj)
792
+ })
793
+ }, "icons") : /* @__PURE__ */ jsx(Appear, {
623
794
  space,
624
795
  children: /* @__PURE__ */ jsx(FieldsetSection, {
625
796
  set: it.set,
@@ -772,6 +943,7 @@ function GroupTabs({ id, value, onChange, items }) {
772
943
  }
773
944
  function FieldsetSection({ set, fields, basePath, obj, memoryKey, divider, renderField }) {
774
945
  const form = useForm();
946
+ const env = useKitEnv();
775
947
  const breakpoints = set.layout === "breakpoints" && fields.length >= 2 && fields.every((f) => f.type === "object");
776
948
  const remembered = form.memory.get(memoryKey);
777
949
  const [open, setOpen] = React.useState(remembered ?? !set.collapsed);
@@ -793,7 +965,7 @@ function FieldsetSection({ set, fields, basePath, obj, memoryKey, divider, rende
793
965
  setOpen(o);
794
966
  form.memory.set(memoryKey, o);
795
967
  },
796
- summary: groupSummary(fields, obj) || "Nothing set yet",
968
+ summary: env.sectionSummary?.(set, obj) ?? (groupSummary(fields, obj) || "Nothing set yet"),
797
969
  status,
798
970
  divider,
799
971
  revealWhen: form.showAllErrors && status.errors > 0,
@@ -819,6 +991,6 @@ var isShort = (f) => [
819
991
  "rating"
820
992
  ].includes(f.type) && !(f.type === "select" && (f.layout === "cards" || f.layout === "radio")) && !(f.type === "number" && (f.scale || f.layout === "slider"));
821
993
  //#endregion
822
- export { AnimatedFields, Appear, BreakpointGroup, FieldInset, FieldList, FieldRun, FieldSection, FieldUnit, FieldUnitRow, FieldsetSection, GroupTabs, INSET_LINE, InsetScope, RHYTHM, arrangeFields, defaultGroup, isBreakpointName, isShort, useGroupStatus, useInsetDepth, useRhythm };
994
+ export { AnimatedFields, Appear, BreakpointGroup, FieldInset, FieldList, FieldRun, FieldSection, FieldUnit, FieldUnitRow, FieldsetSection, GroupTabs, INSET_LINE, IconGroup, InsetScope, RHYTHM, SHORT_TEXT_MAX, arrangeFields, columnSpans, defaultGroup, groupSummary, isBreakpointName, isColumnField, isShort, splitIcons, useGroupStatus, useInsetDepth, useRhythm };
823
995
 
824
996
  //# sourceMappingURL=grouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping.js","names":[],"sources":["../../src/engine/grouping.tsx"],"sourcesContent":["/**\n * GROUPING (CPO D45; V2 HEAD 9829bf1 kit/engine/grouping.tsx + the layout half of kit/engine/field-list.tsx) — the four\n * ways the Block Kit puts fields together, and the rules for nesting them.\n *\n * Group tabs Content · Media · Design · Settings top of a frame only (FieldList)\n * <FieldSection> ────────────────────────────────── a titled set of siblings: hairline above, 36px header,\n * Spacing Top 56 · Bottom 88 › no box, no left rule; collapsed = one-line summary\n * <FieldInset> Rating line a small object (≤3 simple fields): its label, then the\n * │ Stars [ 4.9 / 5 ] children behind ONE 1px --line inset line (D63). No tint,\n * │ Text [ 4.9 from 2,400+ reviews ] no box, no radius: never a box inside a line.\n * <FieldUnit> ┌ Shop cookware Primary › ┐ ONE compound control (button = label + link, image + alt)\n * └ /products ┘\n * Drill row [▣] Desktop › anything bigger, or anything one level deeper\n *\n * Nesting: section (level 1, spacing only) → inset (level 2, the inset line) → level 3+ always drills. Never two\n * containers in one level. Rhythm: field gap 16 · group gap 24, the same gap inside an inset; dense (form width ≤ 360px)\n * 12 · 20; document 20 · 32.\n * Columns (D63, `columnSpans`): side by side only for genuinely short fields (number, switch, select, date, colour, icon,\n * rating, text with max ≤ 24) AND only when the form is at least 420px wide (a container query). Everything else is full\n * width, so a text value never wraps in a cramped column.\n * `<BreakpointGroup>`: per-screen-size objects (desktop / tablet / phone) as ONE group with a segmented switcher.\n *\n * Port notes (kit vs V2): V2 token utilities carry the kit- prefix (text-fg-3 → text-kit-fg-3, bg-well →\n * bg-kit-well, border-field → border-kit-field-border); `motion/react` is `framer-motion`; V2's `scrollbar-none` and\n * `tabular` utilities are written out. V2's FieldList imports KitField directly; here it takes `renderField` so the\n * engine has no grouping ↔ kit-field import cycle.\n */\nimport * as React from \"react\";\nimport { IconChevronDown, IconChevronRight, IconDeviceDesktop, IconDeviceLaptop, IconDeviceMobile, IconDeviceTablet, IconMessage } from \"@tabler/icons-react\";\nimport { AnimatePresence, motion, useReducedMotion } from \"framer-motion\";\nimport { Segmented } from \"../ui/controls\";\nimport { Menu, MenuContent, MenuItem, MenuTrigger, Tooltip } from \"../ui/overlay\";\nimport { cn } from \"../lib/cn\";\nimport type { FieldGroup, FieldPath, FieldSchema, Fieldset } from \"../schema/types\";\nimport { KitSectionTitle, useForm, useKitEnv, type KitPeer } from \"../context\";\nimport { isObj, keyStartsWith, pathKey } from \"../lib/path\";\nimport { condCtx, isEmptyValue, isHidden } from \"../lib/schema\";\nimport { IssueDot } from \"./bits\";\nimport { PeerStack } from \"./field-shell\";\nimport { groupSummary } from \"./group-summary\";\nimport { KitIcon } from \"../lib/icons\";\nimport { columnSpans } from \"../lib/columns\";\nimport { isIconImage } from \"../lib/icon-image\";\nexport { columnSpans, isColumnField, SHORT_TEXT_MAX } from \"../lib/columns\";\n\nexport { groupSummary };\n\n\n/* ── Rhythm ─────────────────────────────────────────────────────────── */\n/** Gaps per host. `stack` = between sibling fields; `group` = before a section / after one; `gridY` = rows of a column grid.\n * An inset uses the same field gap as everything else (D63: one rhythm). */\nexport const RHYTHM = {\n panel: { tabs: \"pb-4 @max-[360px]:pb-3\", stack: \"gap-4 @max-[360px]:gap-3\", field: \"pt-4 @max-[360px]:pt-3\", group: \"pt-6 @max-[360px]:pt-5\", gridY: \"gap-y-4 @max-[360px]:gap-y-3\" },\n document: { tabs: \"pb-5\", stack: \"gap-5\", field: \"pt-5\", group: \"pt-8\", gridY: \"gap-y-5\" },\n} as const;\nexport const useRhythm = () => RHYTHM[useKitEnv().variant];\n\n/* ── Depth: how many visual containers the current field sits in ────── */\nconst InsetDepth = React.createContext(0);\n/** 0 at a frame's top level and inside sections; 1 inside an inset (or an expanded array row). */\nexport const useInsetDepth = () => React.useContext(InsetDepth);\n/** Mark children as sitting inside one container (array inline rows use this so objects inside them drill). */\nexport function InsetScope({ children }: { children: React.ReactNode }) {\n const d = React.useContext(InsetDepth);\n return <InsetDepth.Provider value={d + 1}>{children}</InsetDepth.Provider>;\n}\n\n/* ── Status of everything under a set of paths (errors, warnings, peers, comments) ── */\nexport function useGroupStatus(paths: FieldPath[]) {\n const form = useForm();\n const env = useKitEnv();\n let errors = 0;\n let warnings = 0;\n const peers: KitPeer[] = [];\n let comments = 0;\n const keys = paths.map(pathKey);\n for (const p of paths) {\n const r = form?.rollup(p) ?? { errors: 0, warnings: 0 };\n errors += r.errors;\n warnings += r.warnings;\n }\n for (const [k, list] of Object.entries(env.presence)) if (keys.some((g) => keyStartsWith(k, g))) for (const p of list) if (!peers.some((x) => x.name === p.name)) peers.push(p);\n for (const [k, n] of Object.entries(env.comments)) if (keys.some((g) => keyStartsWith(k, g))) comments += n;\n return { errors, warnings, peers, comments };\n}\nexport type GroupStatus = ReturnType<typeof useGroupStatus>;\n\n/** A field that animates its height in and out when a condition shows or hides it (D45). `space` = its top spacing. */\nexport const Appear = React.forwardRef<HTMLDivElement, { children: React.ReactNode; space?: string; className?: string }>(({ children, space, className }, ref) => {\n const reduce = useReducedMotion();\n const t = { duration: reduce ? 0 : 0.2, ease: [0.22, 1, 0.36, 1] as const };\n const el = React.useRef<HTMLDivElement | null>(null);\n /* clip only while the height moves: at rest focus rings, popovers and the section edge must not be cut off */\n const clip = (on: boolean) => {\n if (el.current) el.current.style.overflow = on ? \"hidden\" : \"\";\n };\n return (\n <motion.div\n ref={(n) => {\n el.current = n;\n if (typeof ref === \"function\") ref(n);\n else if (ref) ref.current = n;\n }}\n initial={{ height: 0, opacity: 0 }}\n animate={{ height: \"auto\", opacity: 1 }}\n exit={{ height: 0, opacity: 0 }}\n transition={t}\n onAnimationStart={() => clip(true)}\n onAnimationComplete={() => clip(false)}\n className={cn(\"min-w-0\", className)}\n >\n <div className={space}>{children}</div>\n </motion.div>\n );\n});\nAppear.displayName = \"Appear\";\n\n/** Sibling fields that appear / disappear smoothly. `gapless`: the parent draws the gaps (grid, inset). */\nexport function AnimatedFields({ fields, render, gapless, space }: { fields: FieldSchema[]; render: (f: FieldSchema) => React.ReactNode; gapless?: boolean; space?: string }) {\n const rhythm = useRhythm();\n return (\n <AnimatePresence initial={false}>\n {fields.map((f, i) => (\n <Appear key={f.name} space={gapless || i === 0 ? undefined : space ?? rhythm.field}>\n {render(f)}\n </Appear>\n ))}\n </AnimatePresence>\n );\n}\n\n/* ── Header status: issue count, peers, comments (shown while collapsed) ── */\nfunction GroupBadges({ status }: { status: GroupStatus }) {\n const { errors, warnings, peers, comments } = status;\n return (\n <>\n {errors ? (\n <Tooltip content={`${errors} ${errors === 1 ? \"issue\" : \"issues\"} to fix inside`}>\n <span role=\"img\" aria-label={`${errors} ${errors === 1 ? \"issue\" : \"issues\"} to fix`} className=\"inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full bg-kit-danger-soft px-1 text-kit-2xs font-medium tabular-nums text-kit-danger-fg\">\n {errors}\n </span>\n </Tooltip>\n ) : warnings ? (\n <IssueDot errors={0} warnings={warnings} />\n ) : null}\n {comments ? (\n <Tooltip content={`${comments} open ${comments === 1 ? \"comment\" : \"comments\"} inside`}>\n <span role=\"img\" aria-label={`${comments} open ${comments === 1 ? \"comment\" : \"comments\"}`} className=\"inline-flex h-4 shrink-0 items-center gap-0.5 rounded-kit-md px-0.5 text-kit-2xs tabular-nums text-kit-fg-3\">\n <IconMessage className=\"size-3\" stroke={1.75} aria-hidden />\n {comments}\n </span>\n </Tooltip>\n ) : null}\n {peers.length ? <PeerStack peers={peers} size={16} /> : null}\n </>\n );\n}\n\n/* ── Columns (D63): one rule for every host ───────────────────────────── */\n/**\n * Sibling fields, laid out by the D63 rule: a plain animated stack, or (when `columns` and at least one pair of short\n * neighbours) a grid that turns two-up only when the form is ≥ 420px wide. Used by sections, insets and array rows.\n */\nexport function FieldRun({ fields, render, columns = true, values }: { fields: FieldSchema[]; render: (f: FieldSchema) => React.ReactNode; columns?: boolean; values?: Record<string, unknown> }) {\n const rhythm = useRhythm();\n const icons = splitIcons(fields, values ?? {});\n if (icons)\n return (\n <div className=\"flex min-w-0 flex-col\">\n {icons.before.length ? <FieldRun fields={icons.before} render={render} columns={columns} /> : null}\n <div className={icons.before.length ? rhythm.field : undefined}>\n <IconGroup fields={icons.icons} render={render} />\n </div>\n {icons.after.length ? (\n <div className={rhythm.field}>\n <FieldRun fields={icons.after} render={render} columns={columns} />\n </div>\n ) : null}\n </div>\n );\n const spans = columns ? columnSpans(fields) : fields.map(() => false);\n if (!spans.some(Boolean))\n return (\n <div className=\"flex min-w-0 flex-col\">\n <AnimatedFields fields={fields} render={render} />\n </div>\n );\n return (\n <div data-slot=\"field-columns\" className={cn(\"grid min-w-0 grid-cols-1 gap-x-3 @[420px]:grid-cols-2\", rhythm.gridY)}>\n {fields.map((f, i) => (\n <div key={f.name} className={cn(\"min-w-0\", !spans[i] && \"@[420px]:col-span-2\")}>{render(f)}</div>\n ))}\n </div>\n );\n}\n\n/* ── Icons: two or more icon images, one \"Icons\" group where the first was ── */\n/**\n * A header with eight social icons would otherwise stack eight rows between its texts. A lone icon is just its row:\n * no heading for one. `isIconImage` is the same rule the image control draws the row by.\n */\nexport function splitIcons(fields: FieldSchema[], values: Record<string, unknown>): { before: FieldSchema[]; icons: FieldSchema[]; after: FieldSchema[] } | null {\n const icons = fields.filter((f) => isIconImage(f, values[f.name]));\n if (icons.length < 2) return null;\n const at = fields.indexOf(icons[0]);\n const rest = fields.filter((f) => !icons.includes(f));\n return { before: rest.slice(0, at), icons, after: rest.slice(at) };\n}\n\nexport function IconGroup({ fields, render }: { fields: FieldSchema[]; render: (f: FieldSchema) => React.ReactNode }) {\n const id = React.useId();\n return (\n <div role=\"group\" aria-labelledby={id} data-slot=\"kit-icon-group\" className=\"flex min-w-0 flex-col gap-1.5\">\n <p id={id} className=\"text-kit-xs font-medium text-kit-fg-3\">Icons</p>\n <div className=\"flex min-w-0 flex-col gap-2\">\n {fields.map((f) => (\n <div key={f.name} className=\"min-w-0\">{render(f)}</div>\n ))}\n </div>\n </div>\n );\n}\n\n/* ── <FieldSection>: a titled set of sibling fields ─────────────────── */\nexport interface FieldSectionProps {\n title: string;\n description?: string;\n /** collapsible header (default true). false = a static heading. */\n collapsible?: boolean;\n defaultOpen?: boolean;\n /** controlled */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** one-line summary shown while collapsed (\"Top 56 · Bottom 88\"); a string list renders as neutral chips */\n summary?: React.ReactNode;\n /** roll-up shown on the header while collapsed */\n status?: Partial<GroupStatus>;\n /** hairline above (off for the first item of a frame) */\n divider?: boolean;\n /** open the section when this turns true (e.g. a publish attempt found errors inside) */\n revealWhen?: boolean;\n disabled?: boolean;\n /** extra header control, outside the toggle (rare) */\n actions?: React.ReactNode;\n /** content above the fields, inside the body (e.g. a breakpoint switcher) */\n lead?: React.ReactNode;\n columns?: 1 | 2;\n /** leading glyph before the title (dense panels: the Design tab's section icons) */\n icon?: React.ReactNode;\n /** small mark right after the title, inside the toggle (e.g. a \"changed\" dot) */\n adornment?: React.ReactNode;\n className?: string;\n /** override the body's gap (dense rows) */\n bodyClassName?: string;\n children: React.ReactNode;\n}\n\nexport function FieldSection({\n title, description, collapsible = true, defaultOpen = true, open: openProp, onOpenChange, summary, status, divider = true, revealWhen,\n disabled, actions, lead, columns, icon, adornment, className, bodyClassName, children,\n}: FieldSectionProps) {\n const rhythm = useRhythm();\n const { variant } = useKitEnv();\n const id = React.useId();\n const [inner, setInner] = React.useState(defaultOpen);\n const open = !collapsible || (openProp ?? inner);\n const setOpen = (o: boolean) => {\n if (openProp === undefined) setInner(o);\n onOpenChange?.(o);\n };\n React.useEffect(() => {\n if (revealWhen && !open) setOpen(true);\n }, [revealWhen]); // eslint-disable-line react-hooks/exhaustive-deps\n const st: GroupStatus = { errors: 0, warnings: 0, peers: [], comments: 0, ...status };\n const titleCls = cn(\"min-w-0 truncate font-semibold text-kit-fg\", variant === \"document\" ? \"text-kit-base\" : \"text-kit-sm\", disabled && \"text-kit-fg-4\");\n const body = (\n <div id={`${id}-body`} className={cn(\"flex flex-col pb-2 pt-1\", rhythm.stack, bodyClassName)}>\n {description ? <p className=\"-mt-1 text-kit-xs leading-4 text-kit-fg-3\">{description}</p> : null}\n {lead}\n {columns === 2 ? <div className={cn(\"grid grid-cols-1 gap-x-3 @[420px]:grid-cols-2\", rhythm.gridY)}>{children}</div> : children}\n </div>\n );\n return (\n <section\n role=\"group\"\n aria-labelledby={`${id}-title`}\n data-group=\"section\"\n data-state={open ? \"open\" : \"closed\"}\n className={cn(\n \"group/section relative\",\n divider && \"border-t border-kit-line pt-1\",\n /* \"which group am I in\": a quiet edge in the gutter while focus is inside an open section (no rule at rest). D52: the\n same 1px line token as every other inset line (row groups, nested lists), never a darker 2px bar. */\n \"before:pointer-events-none before:absolute before:-left-2.5 before:bottom-2 before:top-11 before:w-px before:bg-transparent before:transition-colors before:duration-200 data-[state=open]:focus-within:before:bg-kit-line\",\n /* D63: inside an inset the inset's own line already says where you are; never two parallel lines */\n \"[&:has([data-group=inset]:focus-within)]:before:!bg-transparent\",\n className,\n )}\n >\n <div className=\"flex min-h-9 items-center gap-2\">\n {collapsible ? (\n <button\n type=\"button\"\n onClick={() => !disabled && setOpen(!open)}\n aria-expanded={open}\n aria-controls={open ? `${id}-body` : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"group/sh -mx-2 flex h-9 min-w-0 flex-1 items-center gap-2 rounded-kit-md px-2 text-left transition-colors\",\n disabled ? \"cursor-not-allowed\" : \"hover:bg-kit-hover\",\n )}\n >\n {icon ? <span aria-hidden className=\"flex shrink-0 text-kit-fg-3 [&_svg]:size-3.5\">{icon}</span> : null}\n <span id={`${id}-title`} className={titleCls}>{title}</span>\n {adornment}\n {!open && Array.isArray(summary) ? (\n <SummaryChips chips={summary as string[]} />\n ) : !open && summary ? (\n <span className=\"min-w-0 flex-1 truncate text-right text-kit-xs text-kit-fg-3\">{summary}</span>\n ) : (\n <span className=\"flex-1\" />\n )}\n {!open ? <GroupBadges status={st} /> : null}\n <IconChevronRight aria-hidden stroke={1.5} className={cn(\"size-4 shrink-0 text-kit-fg-3 transition-transform duration-200 group-hover/sh:text-kit-fg-2\", open && \"rotate-90\")} />\n </button>\n ) : (\n <h3 id={`${id}-title`} className={cn(titleCls, \"flex-1\")}>{title}</h3>\n )}\n {actions}\n </div>\n <KitSectionTitle.Provider value={title}>{collapsible ? <SectionBody open={open}>{body}</SectionBody> : body}</KitSectionTitle.Provider>\n </section>\n );\n}\n\n/** A collapsed section's summary as neutral chips (the schema editor's field settings): 2 chips, then \"+N\" with the rest\n * in its tooltip; none = a quiet \"Nothing set\". Colour stays for type and status, so these are --constraint chips. */\nfunction SummaryChips({ chips }: { chips: string[] }) {\n if (!chips.length) return <span className=\"min-w-0 flex-1 truncate text-right text-kit-xs text-kit-fg-3\">Nothing set</span>;\n const shown = chips.slice(0, 2);\n const rest = chips.slice(2);\n const chip = \"inline-flex h-5 min-w-0 shrink items-center rounded-[4px] bg-kit-constraint-bg px-1.5 text-kit-2xs font-medium text-kit-constraint-fg\";\n return (\n <span className=\"flex min-w-0 flex-1 items-center justify-end gap-1\">\n {shown.map((c) => (\n <span key={c} className={chip}>\n <span className=\"truncate\">{c}</span>\n </span>\n ))}\n {rest.length ? (\n <Tooltip content={rest.join(\" · \")}>\n <span className={cn(chip, \"shrink-0 tabular-nums\")}>+{rest.length}</span>\n </Tooltip>\n ) : null}\n </span>\n );\n}\n\n/**\n * The open / close motion of a section (D52: no jitter). Height only, 200ms, the same curve as conditional fields. The\n * body is clipped ONLY while the height moves, so focus rings, the gutter edge and popovers are never cut at rest and\n * nothing snaps when the clip comes off; no opacity flash on the content; instant with reduced motion.\n */\nfunction SectionBody({ open, children }: { open: boolean; children: React.ReactNode }) {\n const reduce = useReducedMotion();\n const el = React.useRef<HTMLDivElement | null>(null);\n const clip = (on: boolean) => {\n if (el.current) el.current.style.overflow = on ? \"hidden\" : \"\";\n };\n return (\n <AnimatePresence initial={false}>\n {open ? (\n <motion.div\n ref={el}\n initial={{ height: 0 }}\n animate={{ height: \"auto\" }}\n exit={{ height: 0 }}\n transition={{ duration: reduce ? 0 : 0.2, ease: [0.22, 1, 0.36, 1] }}\n onAnimationStart={() => clip(true)}\n onAnimationComplete={() => clip(false)}\n className=\"min-w-0\"\n >\n {children}\n </motion.div>\n ) : null}\n </AnimatePresence>\n );\n}\n\n/* ── <FieldInset>: a small object, inline ───────────────────────────── */\n/**\n * D63: the ONE way to show \"these fields belong together\" inside a form. The object's label sits above (the field shell);\n * the children sit behind a single 1px --line inset line, `ml-1.5 pl-3`. No tint, no ring, no radius, no padding box.\n * Children keep the form's own field gap. Short neighbours pair up on wide forms through `FieldRun`.\n */\nexport function FieldInset({\n children, labelledBy, label, className,\n}: { children: React.ReactNode; labelledBy?: string; label?: string; className?: string }) {\n return (\n <InsetScope>\n <div\n role=\"group\"\n aria-labelledby={labelledBy}\n aria-label={labelledBy ? undefined : label}\n data-group=\"inset\"\n className={cn(INSET_LINE, \"flex flex-col\", className)}\n >\n {children}\n </div>\n </InsetScope>\n );\n}\n/** The inset line every nested group uses (inline objects, expanded array rows). */\nexport const INSET_LINE = \"ml-1.5 min-w-0 border-l border-kit-line pl-3\";\n\n/* ── <FieldUnit>: one compound control (button = label + link, image + alt) ── */\n/**\n * Reads as ONE input: the field border, radius 6, the input focus treatment on the whole unit; rows inside are split by a\n * hairline and have no borders of their own. Use for values that only make sense together (founder rule: a button's\n * label and link are one unit).\n */\nexport const FieldUnit = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement> & { invalid?: boolean; disabled?: boolean }>(\n ({ invalid, disabled, className, children, ...rest }, ref) => (\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"field-unit\"\n data-invalid={invalid || undefined}\n aria-disabled={disabled || undefined}\n {...rest}\n className={cn(\n \"flex min-w-0 flex-col divide-y divide-kit-line-subtle rounded-kit-md border border-kit-field-border bg-kit-field-bg shadow-kit-field transition-[border-color,box-shadow] duration-150\",\n \"hover:border-kit-field-border-hover focus-within:border-kit-field-border-focus focus-within:shadow-kit-ring-field\",\n \"[&>*:first-child]:rounded-t-[5px] [&>*:last-child]:rounded-b-[5px]\",\n invalid && \"border-[var(--kit-field-invalid)] hover:border-[var(--kit-field-invalid)]\",\n disabled && \"pointer-events-none bg-kit-subtle opacity-60\",\n className,\n )}\n >\n {children}\n </div>\n ),\n);\nFieldUnit.displayName = \"FieldUnit\";\n\n/** One row of a unit: 36px, 8px side padding, no border (the unit draws the hairline between rows). */\nexport function FieldUnitRow({ className, children, ...rest }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div {...rest} className={cn(\"flex min-h-9 min-w-0 items-center gap-2 px-1\", className)}>\n {children}\n </div>\n );\n}\n\n/* ── Breakpoints: one group, one switcher ───────────────────────────── */\nconst BREAKPOINT_NAMES = [\"desktop\", \"laptop\", \"tablet\", \"mobile\", \"phone\"] as const;\nexport const isBreakpointName = (n: string) => (BREAKPOINT_NAMES as readonly string[]).includes(n.toLowerCase());\nconst BP_ICON: Record<string, React.ComponentType<{ className?: string; stroke?: number }>> = {\n desktop: IconDeviceDesktop, laptop: IconDeviceLaptop, tablet: IconDeviceTablet, mobile: IconDeviceMobile, phone: IconDeviceMobile,\n};\n/** An object field \"differs\" from the base breakpoint when it has an inherit switch that is off, or (without one) any value. */\nfunction overrides(f: FieldSchema, v: unknown): boolean {\n if (!isObj(v)) return false;\n const inherit = (f.fields ?? []).find((x) => x.type === \"boolean\" && /^(inherit|same|sameAs|useDesktop|inheritDesktop)/i.test(x.name));\n if (inherit) return v[inherit.name] === false;\n return (f.fields ?? []).some((x) => !isEmptyValue(v[x.name]));\n}\n\nexport type RenderField = (field: FieldSchema, path: FieldPath, parent: Record<string, unknown>) => React.ReactNode;\n\n/**\n * Per-screen-size settings as ONE group: the section header, then a segmented switcher (Desktop · Tablet · Phone) with a\n * dot on every size that has its own values; only the chosen size's fields show. Replaces three stacked groups.\n */\nexport function BreakpointGroup({\n set, members, basePath, memoryKey, divider, renderField,\n}: {\n set: Fieldset;\n members: FieldSchema[];\n basePath: FieldPath;\n memoryKey: string;\n divider?: boolean;\n renderField: RenderField;\n}) {\n const form = useForm()!;\n const rhythm = useRhythm();\n const [bp, setBp] = React.useState<string>(() => (form.memory.get(`${memoryKey}:bp`) as string | undefined) ?? members[0].name);\n const active = members.find((m) => m.name === bp) ?? members[0];\n const select = (n: string) => {\n setBp(n);\n form.memory.set(`${memoryKey}:bp`, n);\n };\n const [open, setOpen] = React.useState<boolean>(() => (form.memory.get(memoryKey) as boolean | undefined) ?? !set.collapsed);\n const status = useGroupStatus(members.map((m) => [...basePath, m.name]));\n const valueOf = (m: FieldSchema) => form.getAt([...basePath, m.name]);\n const differing = members.slice(1).filter((m) => overrides(m, valueOf(m)));\n const summary = differing.length ? `Own settings on ${differing.map((m) => m.title.toLowerCase()).join(\" and \")}` : `Same on every screen`;\n const activeValue = valueOf(active);\n const obj = isObj(activeValue) ? activeValue : {};\n const cc = condCtx(form, [...basePath, active.name]);\n const fields = (active.fields ?? []).filter((f) => !isHidden(f, obj, cc));\n const id = React.useId();\n const compactBp = members.length >= 4 && members.every((m) => BP_ICON[m.name.toLowerCase()] || m.icon);\n return (\n <FieldSection\n title={set.title}\n description={set.description}\n collapsible={set.collapsible !== false}\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n form.memory.set(memoryKey, o);\n }}\n summary={summary}\n status={status}\n divider={divider}\n revealWhen={form.showAllErrors && status.errors > 0}\n lead={\n <div className=\"flex flex-col gap-1.5\">\n {/* D46: up to three sizes show their names; four or more (desktop · laptop · tablet · phone) become a device\n switcher: the chosen size keeps its name, the others collapse to icons with a tooltip. Status dots sit on the icon. */}\n <Segmented\n aria-label={`${set.title}: screen size`}\n size=\"sm\"\n value={active.name}\n onChange={select}\n collapseInactive={compactBp}\n className=\"w-full [&>button]:flex-1\"\n items={members.map((m, i) => {\n const Icon = BP_ICON[m.name.toLowerCase()];\n const own = i > 0 && differing.includes(m);\n const errs = form.rollup([...basePath, m.name]).errors;\n const dot = errs ? <span aria-hidden className=\"size-1.5 rounded-full bg-kit-danger\" /> : own ? <span aria-hidden className=\"size-1.5 rounded-full bg-kit-accent\" /> : null;\n const sr = errs ? \", has issues\" : own ? \", has its own settings\" : \"\";\n const glyph = Icon ? <Icon stroke={1.5} /> : m.icon ? <KitIcon name={m.icon} /> : undefined;\n if (compactBp)\n return {\n value: m.name,\n name: `${m.title}${sr}`,\n tooltip: m.title,\n icon: (\n <span className=\"relative inline-flex\">\n {glyph}\n {dot ? <span className=\"absolute -right-1 -top-0.5 inline-flex\">{dot}</span> : null}\n </span>\n ),\n label: <span>{m.title}{sr ? <span className=\"sr-only\">{sr}</span> : null}</span>,\n };\n return {\n value: m.name,\n icon: glyph,\n label: (\n <span className=\"inline-flex items-center gap-1\">\n {m.title}\n {dot}\n {sr ? <span className=\"sr-only\">{sr}</span> : null}\n </span>\n ),\n };\n })}\n />\n {active.description ? <p className=\"text-kit-xs leading-4 text-kit-fg-3\">{active.title} · {active.description}</p> : null}\n </div>\n }\n >\n <div role=\"group\" aria-labelledby={`${id}-bp`} className=\"flex flex-col\">\n <span id={`${id}-bp`} className=\"sr-only\">{active.title} settings</span>\n <AnimatePresence initial={false} key={active.name}>\n {fields.map((f, i) => (\n <Appear key={f.name} space={i === 0 ? undefined : rhythm.field}>{renderField(f, [...basePath, active.name, f.name], obj)}</Appear>\n ))}\n </AnimatePresence>\n </div>\n </FieldSection>\n );\n}\n\n/* ══ Frame layout (V2 engine/field-list.tsx): group tabs → fieldsets → fields ══════════════════════════════════════ */\ntype ArrangedItem = { kind: \"field\"; field: FieldSchema } | { kind: \"set\"; set: Fieldset; fields: FieldSchema[] };\n/** What a frame renders: the arranged fields, with two or more loose icons gathered into one (`gatherIcons`). */\ntype Item = ArrangedItem | { kind: \"icons\"; fields: FieldSchema[] };\n\nconst ADVANCED: Fieldset = { name: \"__advanced\", title: \"Advanced\", description: \"Rarely-changed and developer settings\", collapsed: true };\nconst BREAKPOINTS: Fieldset = { name: \"__breakpoints\", title: \"Screen sizes\", layout: \"breakpoints\" };\n\n/** Fields in schema order, with each fieldset (and the auto \"Advanced\" / \"Screen sizes\" sets) placed at its first member. */\nexport function arrangeFields(fields: FieldSchema[], fieldsets: Fieldset[] = []): ArrangedItem[] {\n const items: ArrangedItem[] = [];\n const sets = new Map<string, Extract<ArrangedItem, { kind: \"set\" }>>();\n const adv: FieldSchema[] = [];\n /* D45: two or more sibling objects named for screen sizes (desktop · tablet · phone) become ONE breakpoint group */\n const bpCount = fields.filter((f) => !f.fieldset && !f.advanced && f.type === \"object\" && isBreakpointName(f.name)).length;\n for (const f of fields) {\n const auto = !f.fieldset && !f.advanced && bpCount >= 2 && f.type === \"object\" && isBreakpointName(f.name);\n const setName = f.fieldset ?? (auto ? BREAKPOINTS.name : undefined);\n if (setName) {\n let s = sets.get(setName);\n if (!s) {\n s = { kind: \"set\", set: auto ? BREAKPOINTS : fieldsets.find((x) => x.name === setName) ?? { name: setName, title: setName }, fields: [] };\n sets.set(setName, s);\n items.push(s);\n }\n s.fields.push(f);\n } else if (f.advanced) adv.push(f);\n else items.push({ kind: \"field\", field: f });\n }\n if (adv.length) items.push({ kind: \"set\", set: ADVANCED, fields: adv });\n return items;\n}\n\n/** The frame's loose icon fields (not those inside a fieldset) as one \"Icons\" item where the first was. @see splitIcons */\nfunction gatherIcons(items: ArrangedItem[], obj: Record<string, unknown>): Item[] {\n const loose = items.flatMap((it) => (it.kind === \"field\" ? [it.field] : []));\n const icons = loose.filter((f) => isIconImage(f, obj[f.name]));\n if (icons.length < 2) return items;\n const out: Item[] = [];\n for (const it of items) {\n if (it.kind !== \"field\" || !icons.includes(it.field)) out.push(it);\n else if (it.field === icons[0]) out.push({ kind: \"icons\", fields: icons });\n }\n return out;\n}\n\n/** The group a field without `group` belongs to: the one marked `default`, else the first. */\nexport const defaultGroup = (groups?: FieldGroup[]) => groups?.find((g) => g.default) ?? groups?.[0];\n\n/**\n * FieldList — lays out one frame's fields (CPO D45 grouping): group TABS (with error dots) at the top of the frame only,\n * FIELDSETS as <FieldSection> (hairline + 36px header, no box, collapsed = one-line summary), breakpoint objects as ONE\n * <BreakpointGroup> with a switcher, an auto \"Advanced\" section for `advanced` fields, and `hidden` conditions that\n * appear / disappear with a height animation.\n * Rhythm: label→control 6 · fields 16 · groups 24 (dense ≤360px: 12 · 20; document: 20 · 32).\n */\nexport function FieldList({\n fields,\n fieldsets,\n groups,\n basePath,\n memoryKey,\n renderField,\n}: {\n fields: FieldSchema[];\n fieldsets?: Fieldset[];\n groups?: FieldGroup[];\n basePath: FieldPath;\n /** where to remember the selected tab / open fieldsets */\n memoryKey: string;\n /** draws one field (the engine passes KitField) */\n renderField: RenderField;\n}) {\n const form = useForm()!;\n const env = useKitEnv();\n const raw = form.getAt(basePath);\n const obj = isObj(raw) ? raw : {};\n const cc = condCtx(form, basePath);\n const visible = fields.filter((f) => !isHidden(f, obj, cc));\n\n const usable = (groups ?? []).filter((g) => visible.some((f) => (f.group ?? defaultGroup(groups)?.name) === g.name));\n const tabs = usable.length >= 2;\n const allTab = tabs && env.variant === \"document\";\n const memTab = form.memory.get(`${memoryKey}:tab`) as string | undefined;\n const [tab, setTab] = React.useState<string>(memTab ?? (allTab ? \"__all\" : defaultGroup(usable)?.name ?? \"\"));\n const select = (t: string) => {\n setTab(t);\n form.memory.set(`${memoryKey}:tab`, t);\n };\n const validTabs = [...(allTab ? [\"__all\"] : []), ...usable.map((g) => g.name)];\n const active = validTabs.includes(tab) ? tab : validTabs[0] ?? \"\";\n const inTab = (f: FieldSchema) => !tabs || active === \"__all\" || (f.group ?? defaultGroup(groups)?.name) === active;\n const groupErrors = (g: string) =>\n visible.filter((f) => (f.group ?? defaultGroup(groups)?.name) === g).reduce((n, f) => n + form.rollup([...basePath, f.name]).errors, 0);\n\n const items = gatherIcons(arrangeFields(visible.filter(inTab), fieldsets), obj);\n const rhythm = useRhythm();\n /* D61 Show only changes: runs of unchanged fields fold into one quiet line (\"4 unchanged fields\") that opens in place */\n const review = env.review;\n const [openRuns, setOpenRuns] = React.useState<Set<string>>(() => new Set());\n const itemChanged = (it: Item) =>\n !review || (it.kind === \"field\" ? review.count([...basePath, it.field.name]) > 0 : it.fields.some((f) => review.count([...basePath, f.name]) > 0));\n type Seg = { kind: \"item\"; it: Item } | { kind: \"fold\"; key: string; items: Item[]; n: number };\n const segs: Seg[] = [];\n for (const it of items) {\n if (!review?.onlyChanges || itemChanged(it)) {\n segs.push({ kind: \"item\", it });\n continue;\n }\n const last = segs[segs.length - 1];\n const n = it.kind === \"field\" ? 1 : it.fields.length;\n if (last?.kind === \"fold\") {\n last.items.push(it);\n last.n += n;\n } else segs.push({ kind: \"fold\", key: `fold:${it.kind === \"field\" ? it.field.name : it.kind === \"set\" ? it.set.name : \"icons\"}`, items: [it], n });\n }\n /* what renders, in order: items, and one fold line per unchanged run (its items follow it while it is open) */\n const rows: ({ kind: \"item\"; it: Item } | Extract<Seg, { kind: \"fold\" }>)[] = segs.flatMap((sg) =>\n sg.kind === \"item\" ? [sg] : [sg, ...(openRuns.has(sg.key) ? sg.items.map((it) => ({ kind: \"item\" as const, it })) : [])],\n );\n const toggleRun = (key: string) =>\n setOpenRuns((o) => {\n const n = new Set(o);\n if (n.has(key)) n.delete(key);\n else n.add(key);\n return n;\n });\n return (\n <div className=\"flex flex-col\">\n {tabs ? (\n <div className={rhythm.tabs}>\n <GroupTabs\n id={memoryKey}\n value={active}\n onChange={select}\n items={[...(allTab ? [{ name: \"__all\", title: \"All fields\" }] : []), ...usable].map((g) => ({ value: g.name, label: g.title, icon: \"icon\" in g ? g.icon : undefined, errors: g.name === \"__all\" ? 0 : groupErrors(g.name) }))}\n />\n </div>\n ) : null}\n {/* keyed by tab: switching tabs swaps the list at once; only conditions inside a tab animate */}\n <AnimatePresence initial={false} key={active || \"all\"}>\n {rows.map((row, i) => {\n if (row.kind === \"fold\") {\n const open = openRuns.has(row.key);\n const label = `${row.n} unchanged ${row.n === 1 ? \"field\" : \"fields\"}`;\n return (\n <Appear key={row.key} space={i === 0 ? undefined : rhythm.field}>\n <button type=\"button\" aria-expanded={open} onClick={() => toggleRun(row.key)} className=\"flex w-full items-center gap-2 rounded-kit-md text-kit-xs text-kit-fg-3 outline-none hover:text-kit-fg-2 focus-visible:text-kit-fg\">\n <span aria-hidden className=\"h-px flex-1 bg-kit-line-subtle\" />\n {open ? `Hide ${label}` : label}\n <span aria-hidden className=\"h-px flex-1 bg-kit-line-subtle\" />\n </button>\n </Appear>\n );\n }\n const it = row.it;\n const prev = rows[i - 1];\n /* spacing: 16 between fields; 24 before a section that follows a field and after a section; sections that follow\n sections sit flush (their hairline is the separator) */\n const space = i === 0 ? undefined : it.kind === \"set\" ? (prev?.kind === \"item\" && prev.it.kind === \"set\" ? undefined : rhythm.group) : rhythm.field;\n return it.kind === \"field\" ? (\n <Appear key={it.field.name} space={space}>\n {renderField(it.field, [...basePath, it.field.name], obj)}\n </Appear>\n ) : it.kind === \"icons\" ? (\n <Appear key=\"icons\" space={space}>\n <IconGroup fields={it.fields} render={(f) => renderField(f, [...basePath, f.name], obj)} />\n </Appear>\n ) : (\n <Appear key={`set:${it.set.name}`} space={space}>\n <FieldsetSection set={it.set} fields={it.fields} basePath={basePath} obj={obj} memoryKey={`${memoryKey}:fs:${it.set.name}`} divider={i > 0} renderField={renderField} />\n </Appear>\n );\n })}\n </AnimatePresence>\n {items.length === 0 ? <p className=\"py-6 text-center text-kit-sm text-kit-fg-3\">No fields here yet.</p> : null}\n </div>\n );\n}\n\n/* ── Group tabs (underline, with error dots) ───────────────────────── */\nexport interface GroupTabItem {\n value: string;\n label: string;\n icon?: string;\n errors: number;\n}\nconst MORE_W = 72;\n/** Tabs that don't fit the width fold into a \"More\" menu, never clipped (V2 HEAD c896beb field-list.tsx GroupTabs). The\n * active tab always shows its label: when it sits in the fold it takes the last visible slot. */\nexport function GroupTabs({ id, value, onChange, items }: { id: string; value: string; onChange: (v: string) => void; items: GroupTabItem[] }) {\n const { variant } = useKitEnv();\n /* `id` is the memoryKey (\"root\" in every form): a NestedForm with groups in a dialog would share the panel's\n underline layoutId and animate across forms. useId scopes it to this tab strip (kit deviation, no DOM change). */\n const uid = React.useId();\n const gap = variant === \"document\" ? 20 : 16;\n const wrap = React.useRef<HTMLDivElement>(null);\n const measure = React.useRef<HTMLDivElement>(null);\n const [fit, setFit] = React.useState(items.length);\n const sig = items.map((t) => `${t.value}:${t.label}:${t.icon ?? \"\"}`).join(\"|\");\n React.useLayoutEffect(() => {\n const w = wrap.current;\n const m = measure.current;\n if (!w || !m) return;\n const run = () => {\n const widths = Array.from(m.querySelectorAll<HTMLElement>(\"[data-seg-value]\")).map((el) => el.offsetWidth);\n const room = w.clientWidth;\n if (!room || !widths.length) return;\n const total = widths.reduce((a, b) => a + b, 0) + gap * (widths.length - 1);\n if (total <= room) return setFit(widths.length);\n let used = 0;\n let k = 0;\n for (; k < widths.length; k++) {\n const next = used + (k ? gap : 0) + widths[k];\n if (next + gap + MORE_W > room) break;\n used = next;\n }\n setFit(Math.max(1, k));\n };\n run();\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(run);\n ro.observe(w);\n return () => ro.disconnect();\n }, [sig, gap]);\n\n const toTab = (t: GroupTabItem) => ({\n value: t.value,\n icon: t.icon ? <KitIcon name={t.icon} className=\"size-3.5\" /> : undefined,\n label: (\n <span className=\"inline-flex items-center gap-1.5\" aria-label={t.errors ? `${t.label}, has errors` : undefined}>\n {t.label}\n {t.errors ? <span className=\"size-1.5 rounded-full bg-kit-danger\" aria-hidden /> : null}\n </span>\n ),\n });\n let shown = items.slice(0, fit);\n if (fit < items.length && !shown.some((t) => t.value === value)) {\n const act = items.find((t) => t.value === value);\n if (act) shown = [...shown.slice(0, Math.max(0, fit - 1)), act];\n }\n const rest = items.filter((t) => !shown.includes(t));\n return (\n <div ref={wrap} className=\"relative -mt-1 flex min-w-0 items-stretch\">\n {/* D12/D43: text tabs, 14px in every host, the active one in fg with the 1.5px underline — never a 12px whisper */}\n <Segmented\n variant=\"tabs\"\n bordered\n aria-label=\"Field groups\"\n size=\"md\"\n layoutId={`kit-tab-${uid}-${id}`}\n value={value}\n onChange={onChange}\n className={cn(\"min-w-0 flex-1\", variant === \"document\" ? \"gap-5\" : \"gap-4\")}\n items={shown.map(toTab)}\n />\n {rest.length ? (\n <span className=\"flex shrink-0 items-center border-b border-kit-line pl-2\">\n <Menu>\n <MenuTrigger\n render={\n <button type=\"button\" className=\"inline-flex h-8 items-center gap-1 text-kit-sm font-medium text-kit-fg-3 transition-colors hover:text-kit-fg-2 data-[popup-open]:text-kit-fg\" />\n }\n >\n More\n {rest.some((t) => t.errors) ? <span className=\"size-1.5 rounded-full bg-kit-danger\" aria-label=\"has errors\" /> : null}\n <IconChevronDown className=\"size-3.5\" stroke={1.5} aria-hidden />\n </MenuTrigger>\n <MenuContent align=\"end\">\n {rest.map((t) => (\n <MenuItem key={t.value} icon={t.icon ? <KitIcon name={t.icon} className=\"size-3.5\" /> : undefined} onClick={() => onChange(t.value)}>\n {t.label}\n {t.errors ? <span className=\"ml-1.5 inline-block size-1.5 rounded-full bg-kit-danger\" aria-label=\"has errors\" /> : null}\n </MenuItem>\n ))}\n </MenuContent>\n </Menu>\n {/* a host can still open a folded tab by its value (the schema preview jumps to a field in another tab) */}\n <span hidden>\n {rest.map((t) => (\n <button key={t.value} type=\"button\" tabIndex={-1} data-seg-value={t.value} onClick={() => onChange(t.value)} />\n ))}\n </span>\n </span>\n ) : null}\n {/* the measuring row: every tab at its natural width, never seen, never focused */}\n <div ref={measure} aria-hidden inert className=\"pointer-events-none invisible absolute left-0 top-0 flex whitespace-nowrap\">\n <Segmented variant=\"tabs\" size=\"md\" value=\"__measure\" onChange={() => {}} className={variant === \"document\" ? \"gap-5\" : \"gap-4\"} items={items.map(toTab)} />\n </div>\n </div>\n );\n}\n\n/* ── Fieldset → <FieldSection> (both hosts; the document only scales the rhythm) ── */\nexport function FieldsetSection({\n set, fields, basePath, obj, memoryKey, divider, renderField,\n}: { set: Fieldset; fields: FieldSchema[]; basePath: FieldPath; obj: Record<string, unknown>; memoryKey: string; divider: boolean; renderField: RenderField }) {\n const form = useForm()!;\n const env = useKitEnv();\n const breakpoints = set.layout === \"breakpoints\" && fields.length >= 2 && fields.every((f) => f.type === \"object\");\n const remembered = form.memory.get(memoryKey) as boolean | undefined;\n const [open, setOpen] = React.useState(remembered ?? !set.collapsed);\n const status = useGroupStatus(fields.map((f) => [...basePath, f.name]));\n if (breakpoints) return <BreakpointGroup set={set} members={fields} basePath={basePath} memoryKey={memoryKey} divider={divider} renderField={renderField} />;\n return (\n <FieldSection\n title={set.title}\n description={set.description}\n collapsible={set.collapsible !== false}\n open={open}\n onOpenChange={(o) => {\n setOpen(o);\n form.memory.set(memoryKey, o);\n }}\n summary={env.sectionSummary?.(set, obj) ?? (groupSummary(fields, obj) || \"Nothing set yet\")}\n status={status}\n divider={divider}\n revealWhen={form.showAllErrors && status.errors > 0}\n >\n {/* D63: `columns: 2` pairs short neighbours on a wide form only; long fields always take the full row */}\n <FieldRun fields={fields} columns={set.columns === 2} render={(f) => renderField(f, [...basePath, f.name], obj)} />\n </FieldSection>\n );\n}\n/** D41: a short field shares a 2-column row; a scale, slider, cards or radio select needs the full row. */\nexport const isShort = (f: FieldSchema) => [\"string\", \"number\", \"select\", \"color\", \"icon\", \"boolean\", \"date\", \"slug\", \"email\", \"url\", \"rating\"].includes(f.type) && !(f.type === \"select\" && (f.layout === \"cards\" || f.layout === \"radio\")) && !(f.type === \"number\" && (f.scale || f.layout === \"slider\"));\n"],"mappings":"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"}
@@ -41,10 +41,12 @@ export declare const arrayMove: <T>(list: T[], from: number, to: number) => T[];
41
41
  * a row of tiles) move it one slot; Space / Enter / Tab drops it as ONE reorder; Escape (or leaving the grip) cancels
42
42
  * with nothing written. Focus stays on the grip.
43
43
  */
44
- export declare function useDragReorder(ids: string[], onReorder: (from: number, to: number) => void, { axis, disabled, distance }?: {
44
+ export declare function useDragReorder(ids: string[], onReorder: (from: number, to: number) => void, { axis, disabled, distance, rest, }?: {
45
45
  axis?: "y" | "grid";
46
46
  disabled?: boolean;
47
47
  distance?: number;
48
+ /** the row style at rest: dnd-kit's disabledTransition (V2 object rows, chips), or none (V2 item-list rows) */
49
+ rest?: "dnd" | "none";
48
50
  }): {
49
51
  register: (id: string) => (el: HTMLElement | null) => void;
50
52
  handle: (id: string) => {
@@ -52,6 +54,7 @@ export declare function useDragReorder(ids: string[], onReorder: (from: number,
52
54
  onPointerDown: (e: React.PointerEvent) => void;
53
55
  onKeyDown: (e: React.KeyboardEvent) => void;
54
56
  onBlur: () => void;
57
+ role: string;
55
58
  "aria-pressed": boolean | undefined;
56
59
  "aria-roledescription": string;
57
60
  "aria-describedby": string;
@@ -87,3 +90,10 @@ export declare function ItemList({ field, path, list, readOnly, adapter, inputId
87
90
  /** the field label's `htmlFor` lands on the first row */
88
91
  inputId?: string;
89
92
  }): import("react/jsx-runtime").JSX.Element;
93
+ /**
94
+ * The grip slot of a list whose order the site's code sets (identity rule 36): V2 content/editor/page-sections.tsx:155,
95
+ * a lock where the grip was, not interactive.
96
+ */
97
+ export declare function OrderLockSlot({ className }: {
98
+ className?: string;
99
+ }): import("react/jsx-runtime").JSX.Element;