@bettercms-ai/kit 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/README.md +33 -0
  2. package/dist/adapters/dock-values.d.ts +28 -0
  3. package/dist/adapters/dock-values.js +41 -0
  4. package/dist/adapters/dock-values.js.map +1 -0
  5. package/{adapters → dist/adapters}/icons.js +2 -2
  6. package/dist/adapters/icons.js.map +1 -0
  7. package/{adapters → dist/adapters}/lossy.d.ts +90 -31
  8. package/dist/adapters/lossy.js +414 -0
  9. package/dist/adapters/lossy.js.map +1 -0
  10. package/{adapters → dist/adapters}/prod-types.d.ts +82 -4
  11. package/{adapters → dist/adapters}/prod-types.js +71 -3
  12. package/dist/adapters/prod-types.js.map +1 -0
  13. package/{adapters → dist/adapters}/schema.d.ts +40 -1
  14. package/{adapters → dist/adapters}/schema.js +996 -179
  15. package/dist/adapters/schema.js.map +1 -0
  16. package/{adapters → dist/adapters}/values.d.ts +26 -5
  17. package/{adapters → dist/adapters}/values.js +87 -17
  18. package/dist/adapters/values.js.map +1 -0
  19. package/dist/brand/logo.js +96 -0
  20. package/dist/brand/logo.js.map +1 -0
  21. package/{context.d.ts → dist/context.d.ts} +92 -2
  22. package/{context.js → dist/context.js} +5 -2
  23. package/dist/context.js.map +1 -0
  24. package/{controls → dist/controls}/button.d.ts +19 -5
  25. package/{controls → dist/controls}/button.js +125 -54
  26. package/dist/controls/button.js.map +1 -0
  27. package/{controls → dist/controls}/c1.js +1 -1
  28. package/dist/controls/c1.js.map +1 -0
  29. package/{controls → dist/controls}/c2.js +1 -1
  30. package/dist/controls/c2.js.map +1 -0
  31. package/{controls → dist/controls}/choice.d.ts +7 -2
  32. package/{controls → dist/controls}/choice.js +71 -18
  33. package/dist/controls/choice.js.map +1 -0
  34. package/{controls → dist/controls}/code-register.js +1 -1
  35. package/dist/controls/code-register.js.map +1 -0
  36. package/{controls → dist/controls}/code.js +10 -9
  37. package/dist/controls/code.js.map +1 -0
  38. package/{controls → dist/controls}/color.js +8 -8
  39. package/dist/controls/color.js.map +1 -0
  40. package/{controls → dist/controls}/component-services.d.ts +42 -0
  41. package/dist/controls/component-services.js +7 -0
  42. package/dist/controls/component-services.js.map +1 -0
  43. package/{controls → dist/controls}/date-register.js +1 -1
  44. package/dist/controls/date-register.js.map +1 -0
  45. package/{controls → dist/controls}/date-zone.js +8 -2
  46. package/dist/controls/date-zone.js.map +1 -0
  47. package/{controls → dist/controls}/date.js +32 -24
  48. package/dist/controls/date.js.map +1 -0
  49. package/{controls → dist/controls}/form-picker-register.js +1 -1
  50. package/dist/controls/form-picker-register.js.map +1 -0
  51. package/{controls → dist/controls}/form-picker.js +11 -9
  52. package/dist/controls/form-picker.js.map +1 -0
  53. package/{controls → dist/controls}/icon-register.js +1 -1
  54. package/dist/controls/icon-register.js.map +1 -0
  55. package/{controls → dist/controls}/icon.d.ts +4 -2
  56. package/{controls → dist/controls}/icon.js +32 -27
  57. package/dist/controls/icon.js.map +1 -0
  58. package/{controls → dist/controls}/index.d.ts +1 -1
  59. package/{controls → dist/controls}/index.js +4 -3
  60. package/dist/controls/index.js.map +1 -0
  61. package/{controls → dist/controls}/json-register.js +1 -1
  62. package/dist/controls/json-register.js.map +1 -0
  63. package/{controls → dist/controls}/json.js +13 -3
  64. package/dist/controls/json.js.map +1 -0
  65. package/{controls → dist/controls}/link.js +6 -6
  66. package/dist/controls/link.js.map +1 -0
  67. package/{controls → dist/controls}/location-register.js +1 -1
  68. package/dist/controls/location-register.js.map +1 -0
  69. package/{controls → dist/controls}/location.js +64 -40
  70. package/dist/controls/location.js.map +1 -0
  71. package/{controls → dist/controls}/media-register.js +1 -1
  72. package/dist/controls/media-register.js.map +1 -0
  73. package/{controls → dist/controls}/media-services.d.ts +6 -0
  74. package/dist/controls/media-services.js +0 -0
  75. package/{controls → dist/controls}/media.d.ts +35 -4
  76. package/{controls → dist/controls}/media.js +491 -171
  77. package/dist/controls/media.js.map +1 -0
  78. package/{controls → dist/controls}/number.js +10 -9
  79. package/dist/controls/number.js.map +1 -0
  80. package/{controls → dist/controls}/reference-register.js +1 -1
  81. package/dist/controls/reference-register.js.map +1 -0
  82. package/{controls → dist/controls}/reference-services.d.ts +4 -0
  83. package/dist/controls/reference-services.js +0 -0
  84. package/{controls → dist/controls}/reference.d.ts +1 -1
  85. package/{controls → dist/controls}/reference.js +93 -77
  86. package/dist/controls/reference.js.map +1 -0
  87. package/dist/controls/rich-text/blocks.d.ts +49 -0
  88. package/{controls → dist/controls}/rich-text/blocks.js +471 -144
  89. package/dist/controls/rich-text/blocks.js.map +1 -0
  90. package/{controls → dist/controls}/rich-text/catalog.d.ts +4 -1
  91. package/{controls → dist/controls}/rich-text/catalog.js +75 -65
  92. package/dist/controls/rich-text/catalog.js.map +1 -0
  93. package/{controls → dist/controls}/rich-text/codec.d.ts +9 -1
  94. package/{controls → dist/controls}/rich-text/codec.js +3 -1
  95. package/dist/controls/rich-text/codec.js.map +1 -0
  96. package/{controls → dist/controls}/rich-text/component-card.d.ts +1 -1
  97. package/{controls → dist/controls}/rich-text/component-card.js +417 -99
  98. package/dist/controls/rich-text/component-card.js.map +1 -0
  99. package/dist/controls/rich-text/component-panel.d.ts +47 -0
  100. package/dist/controls/rich-text/component-panel.js +141 -0
  101. package/dist/controls/rich-text/component-panel.js.map +1 -0
  102. package/{controls → dist/controls}/rich-text/control.d.ts +1 -2
  103. package/{controls → dist/controls}/rich-text/control.js +84 -42
  104. package/dist/controls/rich-text/control.js.map +1 -0
  105. package/{controls → dist/controls}/rich-text/dom.d.ts +52 -9
  106. package/{controls → dist/controls}/rich-text/dom.js +379 -50
  107. package/dist/controls/rich-text/dom.js.map +1 -0
  108. package/{controls → dist/controls}/rich-text/editor.d.ts +7 -0
  109. package/{controls → dist/controls}/rich-text/editor.js +148 -48
  110. package/dist/controls/rich-text/editor.js.map +1 -0
  111. package/{controls → dist/controls}/rich-text/floating.d.ts +6 -1
  112. package/{controls → dist/controls}/rich-text/floating.js +35 -18
  113. package/dist/controls/rich-text/floating.js.map +1 -0
  114. package/{controls → dist/controls}/rich-text/index.js +1 -1
  115. package/dist/controls/rich-text/index.js.map +1 -0
  116. package/dist/controls/rich-text/link-form.js +147 -0
  117. package/dist/controls/rich-text/link-form.js.map +1 -0
  118. package/{controls → dist/controls}/rich-text/markdown.js +4 -2
  119. package/dist/controls/rich-text/markdown.js.map +1 -0
  120. package/{controls → dist/controls}/rich-text/ops.js +17 -15
  121. package/dist/controls/rich-text/ops.js.map +1 -0
  122. package/dist/controls/rich-text/plain.d.ts +17 -0
  123. package/dist/controls/rich-text/plain.js +44 -0
  124. package/dist/controls/rich-text/plain.js.map +1 -0
  125. package/{controls → dist/controls}/rich-text/toolbar.d.ts +6 -2
  126. package/{controls → dist/controls}/rich-text/toolbar.js +12 -7
  127. package/dist/controls/rich-text/toolbar.js.map +1 -0
  128. package/{controls → dist/controls}/scale.js +5 -5
  129. package/dist/controls/scale.js.map +1 -0
  130. package/{controls → dist/controls}/slot-register.js +1 -1
  131. package/dist/controls/slot-register.js.map +1 -0
  132. package/{controls → dist/controls}/slot-services.d.ts +25 -0
  133. package/dist/controls/slot-services.js +155 -0
  134. package/dist/controls/slot-services.js.map +1 -0
  135. package/{controls → dist/controls}/slot.js +42 -24
  136. package/dist/controls/slot.js.map +1 -0
  137. package/{controls → dist/controls}/table/index.js +1 -1
  138. package/dist/controls/table/index.js.map +1 -0
  139. package/{controls → dist/controls}/table/prod.js +3 -3
  140. package/dist/controls/table/prod.js.map +1 -0
  141. package/{controls → dist/controls}/table/refs.js +13 -2
  142. package/dist/controls/table/refs.js.map +1 -0
  143. package/{controls → dist/controls}/table/stored.js +1 -1
  144. package/dist/controls/table/stored.js.map +1 -0
  145. package/{controls → dist/controls}/table/table-editor.js +51 -48
  146. package/dist/controls/table/table-editor.js.map +1 -0
  147. package/{controls → dist/controls}/table/table-link.js +3 -3
  148. package/dist/controls/table/table-link.js.map +1 -0
  149. package/{controls → dist/controls}/table/table.js +3 -3
  150. package/dist/controls/table/table.js.map +1 -0
  151. package/{controls → dist/controls}/text.d.ts +2 -2
  152. package/{controls → dist/controls}/text.js +78 -43
  153. package/dist/controls/text.js.map +1 -0
  154. package/dist/controls/unknown-value.d.ts +17 -0
  155. package/dist/controls/unknown-value.js +66 -0
  156. package/dist/controls/unknown-value.js.map +1 -0
  157. package/dist/core/core.d.ts +63 -0
  158. package/dist/core/core.js +171 -0
  159. package/dist/core/core.js.map +1 -0
  160. package/dist/core/facets.d.ts +347 -0
  161. package/dist/core/facets.js +334 -0
  162. package/dist/core/facets.js.map +1 -0
  163. package/dist/core/index.d.ts +3 -0
  164. package/dist/core/index.js +3 -0
  165. package/{engine → dist/engine}/array.js +34 -21
  166. package/dist/engine/array.js.map +1 -0
  167. package/{engine → dist/engine}/bits.js +1 -1
  168. package/dist/engine/bits.js.map +1 -0
  169. package/{engine → dist/engine}/breadcrumb.d.ts +3 -3
  170. package/{engine → dist/engine}/breadcrumb.js +12 -36
  171. package/dist/engine/breadcrumb.js.map +1 -0
  172. package/{engine → dist/engine}/expand.d.ts +2 -4
  173. package/{engine → dist/engine}/expand.js +5 -22
  174. package/dist/engine/expand.js.map +1 -0
  175. package/{engine → dist/engine}/field-list.js +1 -1
  176. package/dist/engine/field-list.js.map +1 -0
  177. package/{engine → dist/engine}/field-shell.js +249 -121
  178. package/dist/engine/field-shell.js.map +1 -0
  179. package/{engine → dist/engine}/frame.d.ts +3 -1
  180. package/{engine → dist/engine}/frame.js +16 -14
  181. package/dist/engine/frame.js.map +1 -0
  182. package/{engine → dist/engine}/group-summary.d.ts +2 -1
  183. package/{engine → dist/engine}/group-summary.js +7 -3
  184. package/dist/engine/group-summary.js.map +1 -0
  185. package/{engine → dist/engine}/grouping.d.ts +19 -5
  186. package/{engine → dist/engine}/grouping.js +193 -21
  187. package/dist/engine/grouping.js.map +1 -0
  188. package/{engine → dist/engine}/item-list.d.ts +11 -1
  189. package/{engine → dist/engine}/item-list.js +35 -13
  190. package/dist/engine/item-list.js.map +1 -0
  191. package/{engine → dist/engine}/kit-field.js +45 -10
  192. package/dist/engine/kit-field.js.map +1 -0
  193. package/{engine → dist/engine}/schema-form.d.ts +27 -2
  194. package/{engine → dist/engine}/schema-form.js +182 -40
  195. package/dist/engine/schema-form.js.map +1 -0
  196. package/{engine → dist/engine}/slot.js +5 -15
  197. package/dist/engine/slot.js.map +1 -0
  198. package/dist/index.js +47 -0
  199. package/dist/index.js.map +1 -0
  200. package/{kit.css → dist/kit.css} +19 -0
  201. package/{lib → dist/lib}/cn.js +7 -4
  202. package/dist/lib/cn.js.map +1 -0
  203. package/{lib → dist/lib}/columns.js +4 -1
  204. package/dist/lib/columns.js.map +1 -0
  205. package/{lib → dist/lib}/frames.js +2 -2
  206. package/dist/lib/frames.js.map +1 -0
  207. package/dist/lib/icon-image.d.ts +10 -0
  208. package/dist/lib/icon-image.js +8 -0
  209. package/dist/lib/icon-image.js.map +1 -0
  210. package/{lib → dist/lib}/icons.js +4 -3
  211. package/dist/lib/icons.js.map +1 -0
  212. package/dist/lib/input-modality.d.ts +11 -0
  213. package/dist/lib/input-modality.js +47 -0
  214. package/dist/lib/input-modality.js.map +1 -0
  215. package/dist/lib/key-event.d.ts +11 -0
  216. package/dist/lib/key-event.js +16 -0
  217. package/dist/lib/key-event.js.map +1 -0
  218. package/{lib → dist/lib}/path.js +4 -2
  219. package/dist/lib/path.js.map +1 -0
  220. package/{lib → dist/lib}/schema.d.ts +34 -3
  221. package/{lib → dist/lib}/schema.js +110 -13
  222. package/dist/lib/schema.js.map +1 -0
  223. package/{lib → dist/lib}/utils.js +1 -1
  224. package/dist/lib/utils.js.map +1 -0
  225. package/{lib → dist/lib}/validate.d.ts +11 -1
  226. package/{lib → dist/lib}/validate.js +85 -11
  227. package/dist/lib/validate.js.map +1 -0
  228. package/dist/library/analysis.d.ts +23 -0
  229. package/dist/library/analysis.js +160 -0
  230. package/dist/library/analysis.js.map +1 -0
  231. package/dist/library/catalog.d.ts +57 -0
  232. package/dist/library/catalog.js +307 -0
  233. package/dist/library/catalog.js.map +1 -0
  234. package/dist/library/coreNotes.d.ts +8 -0
  235. package/dist/library/coreNotes.js +111 -0
  236. package/dist/library/coreNotes.js.map +1 -0
  237. package/dist/library/coverage.d.ts +40 -0
  238. package/dist/library/coverage.js +59 -0
  239. package/dist/library/coverage.js.map +1 -0
  240. package/dist/library/entries/advanced.entries.d.ts +2 -0
  241. package/dist/library/entries/advanced.entries.js +6579 -0
  242. package/dist/library/entries/advanced.entries.js.map +1 -0
  243. package/dist/library/entries/commerce.entries.d.ts +2 -0
  244. package/dist/library/entries/commerce.entries.js +4140 -0
  245. package/dist/library/entries/commerce.entries.js.map +1 -0
  246. package/dist/library/entries/company.entries.d.ts +2 -0
  247. package/dist/library/entries/company.entries.js +2731 -0
  248. package/dist/library/entries/company.entries.js.map +1 -0
  249. package/dist/library/entries/conversion.entries.d.ts +2 -0
  250. package/dist/library/entries/conversion.entries.js +3707 -0
  251. package/dist/library/entries/conversion.entries.js.map +1 -0
  252. package/dist/library/entries/data.entries.d.ts +7 -0
  253. package/dist/library/entries/data.entries.js +4613 -0
  254. package/dist/library/entries/data.entries.js.map +1 -0
  255. package/dist/library/entries/events.entries.d.ts +2 -0
  256. package/dist/library/entries/events.entries.js +3428 -0
  257. package/dist/library/entries/events.entries.js.map +1 -0
  258. package/dist/library/entries/features.entries.d.ts +2 -0
  259. package/dist/library/entries/features.entries.js +3157 -0
  260. package/dist/library/entries/features.entries.js.map +1 -0
  261. package/dist/library/entries/heroes.entries.d.ts +2 -0
  262. package/dist/library/entries/heroes.entries.js +3401 -0
  263. package/dist/library/entries/heroes.entries.js.map +1 -0
  264. package/dist/library/entries/index.d.ts +3 -0
  265. package/dist/library/entries/index.js +35 -0
  266. package/dist/library/entries/index.js.map +1 -0
  267. package/dist/library/entries/listings.entries.d.ts +2 -0
  268. package/dist/library/entries/listings.entries.js +2976 -0
  269. package/dist/library/entries/listings.entries.js.map +1 -0
  270. package/dist/library/entries/longform.entries.d.ts +2 -0
  271. package/dist/library/entries/longform.entries.js +4227 -0
  272. package/dist/library/entries/longform.entries.js.map +1 -0
  273. package/dist/library/entries/media.entries.d.ts +2 -0
  274. package/dist/library/entries/media.entries.js +2781 -0
  275. package/dist/library/entries/media.entries.js.map +1 -0
  276. package/dist/library/entries/navigation.entries.d.ts +2 -0
  277. package/dist/library/entries/navigation.entries.js +4011 -0
  278. package/dist/library/entries/navigation.entries.js.map +1 -0
  279. package/dist/library/entries/pricing.entries.d.ts +2 -0
  280. package/dist/library/entries/pricing.entries.js +2383 -0
  281. package/dist/library/entries/pricing.entries.js.map +1 -0
  282. package/dist/library/entries/social-proof.entries.d.ts +2 -0
  283. package/dist/library/entries/social-proof.entries.js +2297 -0
  284. package/dist/library/entries/social-proof.entries.js.map +1 -0
  285. package/dist/library/examples/bento.d.ts +92 -0
  286. package/dist/library/examples/bento.js +201 -0
  287. package/dist/library/examples/bento.js.map +1 -0
  288. package/dist/library/examples/blocks.d.ts +14 -0
  289. package/dist/library/examples/blocks.js +313 -0
  290. package/dist/library/examples/blocks.js.map +1 -0
  291. package/dist/library/examples/faq.d.ts +28 -0
  292. package/dist/library/examples/faq.js +230 -0
  293. package/dist/library/examples/faq.js.map +1 -0
  294. package/dist/library/examples/hero.d.ts +43 -0
  295. package/dist/library/examples/hero.js +222 -0
  296. package/dist/library/examples/hero.js.map +1 -0
  297. package/dist/library/examples/index.d.ts +36 -0
  298. package/dist/library/examples/index.js +109 -0
  299. package/dist/library/examples/index.js.map +1 -0
  300. package/dist/library/examples/journalStory.d.ts +93 -0
  301. package/dist/library/examples/journalStory.js +338 -0
  302. package/dist/library/examples/journalStory.js.map +1 -0
  303. package/dist/library/examples/megaMenu.d.ts +134 -0
  304. package/dist/library/examples/megaMenu.js +442 -0
  305. package/dist/library/examples/megaMenu.js.map +1 -0
  306. package/dist/library/examples/pricing.d.ts +103 -0
  307. package/dist/library/examples/pricing.js +479 -0
  308. package/dist/library/examples/pricing.js.map +1 -0
  309. package/dist/library/examples/tabs.d.ts +87 -0
  310. package/dist/library/examples/tabs.js +180 -0
  311. package/dist/library/examples/tabs.js.map +1 -0
  312. package/dist/library/export.d.ts +42 -0
  313. package/dist/library/export.js +80 -0
  314. package/dist/library/export.js.map +1 -0
  315. package/dist/library/index.d.ts +13 -0
  316. package/dist/library/index.js +6 -0
  317. package/dist/library/kit-catalog.json +1510 -0
  318. package/dist/library/types.d.ts +42 -0
  319. package/dist/library/types.js +0 -0
  320. package/{schema → dist/schema}/adapters.js +1 -2
  321. package/dist/schema/adapters.js.map +1 -0
  322. package/{schema → dist/schema}/help.d.ts +2 -0
  323. package/{schema → dist/schema}/help.js +6 -4
  324. package/dist/schema/help.js.map +1 -0
  325. package/{schema → dist/schema}/scale.js +1 -1
  326. package/dist/schema/scale.js.map +1 -0
  327. package/{schema → dist/schema}/sources.js +1 -1
  328. package/dist/schema/sources.js.map +1 -0
  329. package/{schema → dist/schema}/table.js +11 -10
  330. package/dist/schema/table.js.map +1 -0
  331. package/{schema → dist/schema}/types.d.ts +29 -1
  332. package/{schema → dist/schema}/types.js +1 -1
  333. package/dist/schema/types.js.map +1 -0
  334. package/dist/styles.css +2 -0
  335. package/dist/table/table-view.d.ts +14 -0
  336. package/dist/table/table-view.js +140 -0
  337. package/dist/table/table-view.js.map +1 -0
  338. package/dist/table/table.css +73 -0
  339. package/dist/testing/corpus.d.ts +63 -0
  340. package/dist/testing/corpus.js +129 -0
  341. package/dist/testing/corpus.js.map +1 -0
  342. package/dist/testing/test-form.d.ts +11 -0
  343. package/dist/testing/test-form.js +38 -0
  344. package/dist/testing/test-form.js.map +1 -0
  345. package/dist/theme.css +345 -0
  346. package/dist/theme.d.ts +22 -0
  347. package/dist/theme.js +43 -0
  348. package/dist/theme.js.map +1 -0
  349. package/dist/tokens.css +542 -0
  350. package/dist/types.js +0 -0
  351. package/{ui → dist/ui}/action-tray.d.ts +1 -1
  352. package/{ui → dist/ui}/action-tray.js +20 -19
  353. package/dist/ui/action-tray.js.map +1 -0
  354. package/dist/ui/autocomplete.d.ts +30 -0
  355. package/dist/ui/autocomplete.js +139 -0
  356. package/dist/ui/autocomplete.js.map +1 -0
  357. package/{ui → dist/ui}/button.d.ts +3 -3
  358. package/{ui → dist/ui}/button.js +6 -7
  359. package/dist/ui/button.js.map +1 -0
  360. package/{ui → dist/ui}/choice-switch.js +1 -1
  361. package/dist/ui/choice-switch.js.map +1 -0
  362. package/{ui → dist/ui}/controls.js +51 -39
  363. package/dist/ui/controls.js.map +1 -0
  364. package/{ui → dist/ui}/display.d.ts +10 -3
  365. package/{ui → dist/ui}/display.js +57 -46
  366. package/dist/ui/display.js.map +1 -0
  367. package/{ui → dist/ui}/expanded-editor-modal.d.ts +2 -2
  368. package/{ui → dist/ui}/expanded-editor-modal.js +6 -6
  369. package/dist/ui/expanded-editor-modal.js.map +1 -0
  370. package/{ui → dist/ui}/field-context.js +1 -1
  371. package/dist/ui/field-context.js.map +1 -0
  372. package/{ui → dist/ui}/floating-panel.d.ts +1 -1
  373. package/{ui → dist/ui}/floating-panel.js +28 -12
  374. package/dist/ui/floating-panel.js.map +1 -0
  375. package/{ui → dist/ui}/index.d.ts +4 -0
  376. package/dist/ui/index.js +18 -0
  377. package/{ui → dist/ui}/input.d.ts +1 -1
  378. package/{ui → dist/ui}/input.js +9 -9
  379. package/dist/ui/input.js.map +1 -0
  380. package/{ui → dist/ui}/mode-bar.js +3 -3
  381. package/dist/ui/mode-bar.js.map +1 -0
  382. package/{ui → dist/ui}/overlay.d.ts +77 -5
  383. package/dist/ui/overlay.js +697 -0
  384. package/dist/ui/overlay.js.map +1 -0
  385. package/{ui → dist/ui}/path-crumbs.js +37 -3
  386. package/dist/ui/path-crumbs.js.map +1 -0
  387. package/{ui → dist/ui}/presence.js +2 -2
  388. package/dist/ui/presence.js.map +1 -0
  389. package/{ui → dist/ui}/select.js +89 -87
  390. package/dist/ui/select.js.map +1 -0
  391. package/{ui → dist/ui}/shortcut-hint.js +1 -1
  392. package/dist/ui/shortcut-hint.js.map +1 -0
  393. package/dist/ui/spinner.d.ts +24 -0
  394. package/dist/ui/spinner.js +42 -0
  395. package/dist/ui/spinner.js.map +1 -0
  396. package/dist/ui/split-button.d.ts +32 -0
  397. package/dist/ui/split-button.js +60 -0
  398. package/dist/ui/split-button.js.map +1 -0
  399. package/{ui → dist/ui}/surfaces.js +1 -1
  400. package/dist/ui/surfaces.js.map +1 -0
  401. package/dist/ui/tab.d.ts +38 -0
  402. package/dist/ui/tab.js +87 -0
  403. package/dist/ui/tab.js.map +1 -0
  404. package/dist/ui/toast.d.ts +20 -0
  405. package/dist/ui/toast.js +115 -0
  406. package/dist/ui/toast.js.map +1 -0
  407. package/{ui → dist/ui}/tooltip-root.d.ts +4 -3
  408. package/{ui → dist/ui}/tooltip-root.js +9 -8
  409. package/dist/ui/tooltip-root.js.map +1 -0
  410. package/{ui → dist/ui}/variants.js +1 -1
  411. package/dist/ui/variants.js.map +1 -0
  412. package/package.json +77 -23
  413. package/adapters/icons.js.map +0 -1
  414. package/adapters/lossy.js +0 -233
  415. package/adapters/lossy.js.map +0 -1
  416. package/adapters/prod-types.js.map +0 -1
  417. package/adapters/schema.js.map +0 -1
  418. package/adapters/values.js.map +0 -1
  419. package/brand/logo.js +0 -9
  420. package/brand/logo.js.map +0 -1
  421. package/context.js.map +0 -1
  422. package/controls/button.js.map +0 -1
  423. package/controls/c1.js.map +0 -1
  424. package/controls/c2.js.map +0 -1
  425. package/controls/choice.js.map +0 -1
  426. package/controls/code-register.js.map +0 -1
  427. package/controls/code.js.map +0 -1
  428. package/controls/color.js.map +0 -1
  429. package/controls/date-register.js.map +0 -1
  430. package/controls/date-zone.js.map +0 -1
  431. package/controls/date.js.map +0 -1
  432. package/controls/form-picker-register.js.map +0 -1
  433. package/controls/form-picker.js.map +0 -1
  434. package/controls/icon-register.js.map +0 -1
  435. package/controls/icon.js.map +0 -1
  436. package/controls/index.js.map +0 -1
  437. package/controls/json-register.js.map +0 -1
  438. package/controls/json.js.map +0 -1
  439. package/controls/link.js.map +0 -1
  440. package/controls/location-register.js.map +0 -1
  441. package/controls/location.js.map +0 -1
  442. package/controls/media-register.js.map +0 -1
  443. package/controls/media.js.map +0 -1
  444. package/controls/number.js.map +0 -1
  445. package/controls/reference-register.js.map +0 -1
  446. package/controls/reference.js.map +0 -1
  447. package/controls/rich-text/blocks.d.ts +0 -28
  448. package/controls/rich-text/blocks.js.map +0 -1
  449. package/controls/rich-text/catalog.js.map +0 -1
  450. package/controls/rich-text/codec.js.map +0 -1
  451. package/controls/rich-text/component-card.js.map +0 -1
  452. package/controls/rich-text/control.js.map +0 -1
  453. package/controls/rich-text/dom.js.map +0 -1
  454. package/controls/rich-text/editor.js.map +0 -1
  455. package/controls/rich-text/floating.js.map +0 -1
  456. package/controls/rich-text/index.js.map +0 -1
  457. package/controls/rich-text/link-form.js +0 -111
  458. package/controls/rich-text/link-form.js.map +0 -1
  459. package/controls/rich-text/markdown.js.map +0 -1
  460. package/controls/rich-text/ops.js.map +0 -1
  461. package/controls/rich-text/toolbar.js.map +0 -1
  462. package/controls/scale.js.map +0 -1
  463. package/controls/slot-register.js.map +0 -1
  464. package/controls/slot-services.js +0 -38
  465. package/controls/slot-services.js.map +0 -1
  466. package/controls/slot.js.map +0 -1
  467. package/controls/table/index.js.map +0 -1
  468. package/controls/table/prod.js.map +0 -1
  469. package/controls/table/refs.js.map +0 -1
  470. package/controls/table/stored.js.map +0 -1
  471. package/controls/table/table-editor.js.map +0 -1
  472. package/controls/table/table-link.js.map +0 -1
  473. package/controls/table/table.js.map +0 -1
  474. package/controls/text.js.map +0 -1
  475. package/engine/array.js.map +0 -1
  476. package/engine/bits.js.map +0 -1
  477. package/engine/breadcrumb.js.map +0 -1
  478. package/engine/expand.js.map +0 -1
  479. package/engine/field-list.js.map +0 -1
  480. package/engine/field-shell.js.map +0 -1
  481. package/engine/frame.js.map +0 -1
  482. package/engine/group-summary.js.map +0 -1
  483. package/engine/grouping.js.map +0 -1
  484. package/engine/item-list.js.map +0 -1
  485. package/engine/kit-field.js.map +0 -1
  486. package/engine/schema-form.js.map +0 -1
  487. package/engine/slot.js.map +0 -1
  488. package/index.js +0 -55
  489. package/index.js.map +0 -1
  490. package/lib/cn.js.map +0 -1
  491. package/lib/columns.js.map +0 -1
  492. package/lib/frames.js.map +0 -1
  493. package/lib/icons.js.map +0 -1
  494. package/lib/path.js.map +0 -1
  495. package/lib/schema.js.map +0 -1
  496. package/lib/utils.js.map +0 -1
  497. package/lib/validate.js.map +0 -1
  498. package/schema/adapters.js.map +0 -1
  499. package/schema/help.js.map +0 -1
  500. package/schema/scale.js.map +0 -1
  501. package/schema/sources.js.map +0 -1
  502. package/schema/table.js.map +0 -1
  503. package/schema/types.js.map +0 -1
  504. package/ui/action-tray.js.map +0 -1
  505. package/ui/button.js.map +0 -1
  506. package/ui/choice-switch.js.map +0 -1
  507. package/ui/controls.js.map +0 -1
  508. package/ui/display.js.map +0 -1
  509. package/ui/expanded-editor-modal.js.map +0 -1
  510. package/ui/field-context.js.map +0 -1
  511. package/ui/floating-panel.js.map +0 -1
  512. package/ui/index.js +0 -13
  513. package/ui/input.js.map +0 -1
  514. package/ui/mode-bar.js.map +0 -1
  515. package/ui/overlay.js +0 -378
  516. package/ui/overlay.js.map +0 -1
  517. package/ui/path-crumbs.js.map +0 -1
  518. package/ui/presence.js.map +0 -1
  519. package/ui/select.js.map +0 -1
  520. package/ui/shortcut-hint.js.map +0 -1
  521. package/ui/surfaces.js.map +0 -1
  522. package/ui/tooltip-root.js.map +0 -1
  523. package/ui/variants.js.map +0 -1
  524. /package/{_virtual → dist/_virtual}/_rolldown/runtime.js +0 -0
  525. /package/{adapters → dist/adapters}/icons.d.ts +0 -0
  526. /package/{brand → dist/brand}/logo.d.ts +0 -0
  527. /package/{controls → dist/controls}/c1.d.ts +0 -0
  528. /package/{controls → dist/controls}/c2.d.ts +0 -0
  529. /package/{controls → dist/controls}/code-register.d.ts +0 -0
  530. /package/{controls → dist/controls}/code.d.ts +0 -0
  531. /package/{controls → dist/controls}/color.d.ts +0 -0
  532. /package/{controls → dist/controls}/date-register.d.ts +0 -0
  533. /package/{controls → dist/controls}/date-zone.d.ts +0 -0
  534. /package/{controls → dist/controls}/date.d.ts +0 -0
  535. /package/{controls → dist/controls}/form-picker-register.d.ts +0 -0
  536. /package/{controls → dist/controls}/form-picker.d.ts +0 -0
  537. /package/{controls → dist/controls}/icon-register.d.ts +0 -0
  538. /package/{controls → dist/controls}/json-register.d.ts +0 -0
  539. /package/{controls → dist/controls}/json.d.ts +0 -0
  540. /package/{controls → dist/controls}/link.d.ts +0 -0
  541. /package/{controls → dist/controls}/location-register.d.ts +0 -0
  542. /package/{controls → dist/controls}/location.d.ts +0 -0
  543. /package/{controls → dist/controls}/media-register.d.ts +0 -0
  544. /package/{controls → dist/controls}/number.d.ts +0 -0
  545. /package/{controls → dist/controls}/reference-register.d.ts +0 -0
  546. /package/{controls → dist/controls}/rich-text/index.d.ts +0 -0
  547. /package/{controls → dist/controls}/rich-text/link-form.d.ts +0 -0
  548. /package/{controls → dist/controls}/rich-text/markdown.d.ts +0 -0
  549. /package/{controls → dist/controls}/rich-text/ops.d.ts +0 -0
  550. /package/{controls → dist/controls}/scale.d.ts +0 -0
  551. /package/{controls → dist/controls}/slot-register.d.ts +0 -0
  552. /package/{controls → dist/controls}/slot.d.ts +0 -0
  553. /package/{controls → dist/controls}/table/index.d.ts +0 -0
  554. /package/{controls → dist/controls}/table/prod.d.ts +0 -0
  555. /package/{controls → dist/controls}/table/refs.d.ts +0 -0
  556. /package/{controls → dist/controls}/table/stored.d.ts +0 -0
  557. /package/{controls → dist/controls}/table/table-editor.d.ts +0 -0
  558. /package/{controls → dist/controls}/table/table-link.d.ts +0 -0
  559. /package/{controls → dist/controls}/table/table.d.ts +0 -0
  560. /package/{engine → dist/engine}/array.d.ts +0 -0
  561. /package/{engine → dist/engine}/bits.d.ts +0 -0
  562. /package/{engine → dist/engine}/field-list.d.ts +0 -0
  563. /package/{engine → dist/engine}/field-shell.d.ts +0 -0
  564. /package/{engine → dist/engine}/kit-field.d.ts +0 -0
  565. /package/{engine → dist/engine}/slot.d.ts +0 -0
  566. /package/{index.d.ts → dist/index.d.ts} +0 -0
  567. /package/{lib → dist/lib}/cn.d.ts +0 -0
  568. /package/{lib → dist/lib}/columns.d.ts +0 -0
  569. /package/{lib → dist/lib}/frames.d.ts +0 -0
  570. /package/{lib → dist/lib}/icons.d.ts +0 -0
  571. /package/{lib → dist/lib}/path.d.ts +0 -0
  572. /package/{lib → dist/lib}/utils.d.ts +0 -0
  573. /package/{schema → dist/schema}/adapters.d.ts +0 -0
  574. /package/{schema → dist/schema}/scale.d.ts +0 -0
  575. /package/{schema → dist/schema}/sources.d.ts +0 -0
  576. /package/{schema → dist/schema}/table.d.ts +0 -0
  577. /package/{types.d.ts → dist/types.d.ts} +0 -0
  578. /package/{ui → dist/ui}/choice-switch.d.ts +0 -0
  579. /package/{ui → dist/ui}/controls.d.ts +0 -0
  580. /package/{ui → dist/ui}/field-context.d.ts +0 -0
  581. /package/{ui → dist/ui}/mode-bar.d.ts +0 -0
  582. /package/{ui → dist/ui}/path-crumbs.d.ts +0 -0
  583. /package/{ui → dist/ui}/presence.d.ts +0 -0
  584. /package/{ui → dist/ui}/select.d.ts +0 -0
  585. /package/{ui → dist/ui}/shortcut-hint.d.ts +0 -0
  586. /package/{ui → dist/ui}/surfaces.d.ts +0 -0
  587. /package/{ui → dist/ui}/variants.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-panel.js","names":[],"sources":["../../src/ui/floating-panel.tsx"],"sourcesContent":["/**\n * FloatingPanel (CPO D54): ONE primitive for every non-modal window over the work surface. It owns drag, magnetic snap,\n * resize and \"remember where I put it\"; the ⌘J assistant (D30) and the component properties panel both use it.\n *\n * geometry track() · snapRect() · <SnapGuides> · <ResizeEdges> (4 edges + 4 corners) · <ResizeGrip> (keyboard)\n * (the low-level pieces, shared with the assistant's floating window)\n * <FloatingPanel> a small properties window anchored to the thing it edits:\n * float (≥768 with a mouse) docks in the editor column's right gutter (≥356px), else the left gutter, else it\n * overlays the right edge; avoids a floating assistant, the Publish tray and the 56px navbar. While docked\n * it follows the anchor's top (sticky between 72px from the top and 16px from the bottom); once dragged it\n * stays where it was put. 340 × auto (≤560), resizable 300×240 … 520 × (viewport − 96). Header = drag\n * handle; double-click resets it to its docked default. Side, offset and size persist per user and per\n * width bucket (≥1280 · 768–1279).\n * side (768–1279 on touch) a 340px right sheet, no scrim.\n * sheet (<768) a bottom sheet, 50% or 90% tall; drag the grabber down to close.\n * modal inside a D49 ExpandedEditorModal (`container`): docked into the modal's right 340px (the reading column\n * shifts left), or over the modal's edge when it is narrow.\n * Non-modal: `role=\"dialog\"` + `aria-modal=\"false\"`, no focus trap, outside clicks never close it. Esc closes (menus,\n * pickers and field drafts first), F6 moves focus between the panel and `focusBack()`. Marked `data-floating-layer`.\n * Layering: canvas toolbars < panel 52 (= the D30 window) < sheets 55 < dialogs 60 < menus 80 < tooltips 90.\n */\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { motion, useMotionValue, useReducedMotion, type MotionValue } from \"framer-motion\";\nimport { cn } from \"../lib/cn\";\nimport { eventKey } from \"../lib/key-event\";\nimport { KIT_SCOPE } from \"./surfaces\";\n\n/* ── Geometry (shared with the D30 assistant window) ─────────────────────────────────────────── */\nexport const NAV = 56;\nexport const SNAP = 16;\nexport const EDGE = 16;\nexport const Z_FLOAT = \"z-[var(--kit-z-float,52)]\";\nexport const EASE = [0.32, 0.72, 0, 1] as const;\n\nexport type Rect = { x: number; y: number; w: number; h: number };\n/** Where a window may sit and how big it may get. `top` is the smallest y (under the navbar), `pad` the inset elsewhere. */\nexport interface Bounds {\n minW: number;\n minH: number;\n maxW: () => number;\n maxH: () => number;\n top: number;\n pad: number;\n}\n/** Magnetic lines in viewport px: `v` = x positions (left/right edges snap to them), `h` = y positions. */\nexport interface SnapLines {\n v: number[];\n h: number[];\n}\n/** 1px guide lines to draw (viewport px). */\nexport interface Guides {\n v: number[];\n h: number[];\n}\nexport const NO_GUIDES: Guides = { v: [], h: [] };\nexport interface Geom {\n x: MotionValue<number>;\n y: MotionValue<number>;\n w: MotionValue<number>;\n h: MotionValue<number>;\n}\n\nexport const vw = () => window.innerWidth;\nexport const vh = () => window.innerHeight;\nexport const clampN = (n: number, lo: number, hi: number) => Math.max(lo, Math.min(hi, n));\n\nexport function fitRect(g: Rect, b: Bounds): Rect {\n const w = clampN(g.w, b.minW, Math.max(b.minW, b.maxW()));\n const h = clampN(g.h, b.minH, Math.max(b.minH, b.maxH()));\n return { w, h, x: clampN(g.x, b.pad, Math.max(b.pad, vw() - w - b.pad)), y: clampN(g.y, b.top, Math.max(b.top, vh() - h - b.pad)) };\n}\n\n/** Clamp to the viewport, then pull any edge within SNAP px of a line onto it (the nearest wins). */\nexport function snapRect(x: number, y: number, w: number, h: number, lines: SnapLines, b: Bounds): { x: number; y: number; g: Guides } {\n let nx = clampN(x, b.pad, Math.max(b.pad, vw() - w - b.pad));\n let ny = clampN(y, b.top, Math.max(b.top, vh() - h - b.pad));\n const g: Guides = { v: [], h: [] };\n let best = SNAP + 1;\n let gx: number | null = null;\n let sx = nx;\n for (const L of lines.v) {\n const a = Math.abs(nx - L);\n if (a <= SNAP && a < best) (best = a), (sx = L), (gx = L - 1);\n const z = Math.abs(nx + w - L);\n if (z <= SNAP && z < best) (best = z), (sx = L - w), (gx = L);\n }\n nx = sx;\n if (gx != null) g.v.push(gx);\n best = SNAP + 1;\n let gy: number | null = null;\n let sy = ny;\n for (const L of lines.h) {\n const a = Math.abs(ny - L);\n if (a <= SNAP && a < best) (best = a), (sy = L), (gy = L - 1);\n const z = Math.abs(ny + h - L);\n if (z <= SNAP && z < best) (best = z), (sy = L - h), (gy = L);\n }\n ny = sy;\n if (gy != null) g.h.push(gy);\n return { x: nx, y: ny, g };\n}\n\n/** Runs a pointer drag on window-level listeners (works from any handle, survives leaving the element). */\nexport function track(e: React.PointerEvent, onMove: (dx: number, dy: number) => void, onEnd: (moved: boolean) => void, cursor?: string) {\n const sx = e.clientX;\n const sy = e.clientY;\n let moved = false;\n if (cursor) document.body.style.cursor = cursor;\n document.body.style.userSelect = \"none\";\n const move = (ev: PointerEvent) => {\n const dx = ev.clientX - sx;\n const dy = ev.clientY - sy;\n if (!moved && Math.abs(dx) + Math.abs(dy) < 3) return;\n moved = true;\n onMove(dx, dy);\n };\n const up = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n onEnd(moved);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n}\n\n/** Magnetic guides: a 1px hairline along each line the window is snapped to. */\nexport function SnapGuides({ guides }: { guides: Guides }) {\n // --brand (V2): #a878d2, dark #b792db\n const line = cn(\"pointer-events-none fixed bg-[var(--kit-brand)]\", Z_FLOAT);\n return (\n <>\n {guides.v.map((p) => (\n <span key={`v${p}`} aria-hidden className={line} style={{ left: p, top: 8, bottom: 8, width: 1 }} />\n ))}\n {guides.h.map((p) => (\n <span key={`h${p}`} aria-hidden className={line} style={{ top: p, left: 8, right: 8, height: 1 }} />\n ))}\n </>\n );\n}\n\nexport type ResizeDir = \"n\" | \"s\" | \"e\" | \"w\" | \"nw\" | \"ne\" | \"sw\" | \"se\";\nconst HANDLES: { d: ResizeDir; cls: string; cursor: string }[] = [\n { d: \"n\", cls: \"inset-x-3 top-0 h-1.5\", cursor: \"ns-resize\" },\n { d: \"s\", cls: \"inset-x-3 bottom-0 h-1.5\", cursor: \"ns-resize\" },\n { d: \"w\", cls: \"inset-y-3 left-0 w-1.5\", cursor: \"ew-resize\" },\n { d: \"e\", cls: \"inset-y-3 right-0 w-1.5\", cursor: \"ew-resize\" },\n { d: \"nw\", cls: \"left-0 top-0 size-3\", cursor: \"nwse-resize\" },\n { d: \"se\", cls: \"bottom-0 right-0 size-3\", cursor: \"nwse-resize\" },\n { d: \"ne\", cls: \"right-0 top-0 size-3\", cursor: \"nesw-resize\" },\n { d: \"sw\", cls: \"bottom-0 left-0 size-3\", cursor: \"nesw-resize\" },\n];\n\n/** Resize from 4 edges and 4 corners. `onStart` runs before the first read (e.g. turn an auto height into a number). */\nexport function ResizeEdges({ geom, bounds, onStart, onEnd }: { geom: Geom; bounds: Bounds; onStart?: () => void; onEnd: (dir: ResizeDir) => void }) {\n const { x, y, w, h } = geom;\n return (\n <>\n {HANDLES.map((hd) => (\n <div\n key={hd.d}\n aria-hidden\n style={{ cursor: hd.cursor }}\n className={cn(\"absolute z-30 touch-none\", hd.cls)}\n onPointerDown={(e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n onStart?.();\n const o = { x: x.get(), y: y.get(), w: w.get(), h: h.get() };\n const maxW = bounds.maxW();\n const maxH = bounds.maxH();\n track(\n e,\n (dx, dy) => {\n let nw = o.w;\n let nh = o.h;\n if (hd.d.includes(\"e\")) nw = o.w + dx;\n if (hd.d.includes(\"w\")) nw = o.w - dx;\n if (hd.d.includes(\"s\")) nh = o.h + dy;\n if (hd.d.includes(\"n\")) nh = o.h - dy;\n nw = clampN(nw, bounds.minW, maxW);\n nh = clampN(nh, bounds.minH, maxH);\n const nx = clampN(hd.d.includes(\"w\") ? o.x + o.w - nw : o.x, bounds.pad, vw() - nw - bounds.pad);\n const ny = clampN(hd.d.includes(\"n\") ? o.y + o.h - nh : o.y, bounds.top, vh() - nh - bounds.pad);\n x.set(nx);\n y.set(ny);\n w.set(nw);\n h.set(nh);\n },\n (moved) => moved && onEnd(hd.d),\n hd.cursor,\n );\n }}\n />\n ))}\n </>\n );\n}\n\n/** Keyboard resize: a focusable grip (role=\"separator\"). ←/→ width, ↑/↓ height (±16, Shift ±64); grows toward the open side. */\nexport function ResizeGrip({ geom, bounds, label, onStart, onEnd, className }: { geom: Geom; bounds: Bounds; label: string; onStart?: () => void; onEnd: () => void; className?: string }) {\n const { x, y, w, h } = geom;\n const [size, setSize] = React.useState(() => ({ w: Math.round(w.get()), h: Math.round(h.get()) }));\n return (\n <div\n role=\"separator\"\n tabIndex={0}\n aria-label={label}\n aria-valuetext={`${size.w} by ${size.h} pixels`}\n aria-keyshortcuts=\"ArrowLeft ArrowRight ArrowUp ArrowDown\"\n onFocus={() => setSize({ w: Math.round(w.get()), h: Math.round(h.get()) })}\n onKeyDown={(e) => {\n const step = e.shiftKey ? 64 : 16;\n const dw = e.key === \"ArrowRight\" ? step : e.key === \"ArrowLeft\" ? -step : 0;\n const dh = e.key === \"ArrowDown\" ? step : e.key === \"ArrowUp\" ? -step : 0;\n if (!dw && !dh) return;\n e.preventDefault();\n e.stopPropagation();\n onStart?.();\n const nw = clampN(w.get() + dw, bounds.minW, bounds.maxW());\n const nh = clampN(h.get() + dh, bounds.minH, bounds.maxH());\n x.set(clampN(x.get(), bounds.pad, Math.max(bounds.pad, vw() - nw - bounds.pad)));\n y.set(clampN(y.get(), bounds.top, Math.max(bounds.top, vh() - nh - bounds.pad)));\n w.set(nw);\n h.set(nh);\n setSize({ w: Math.round(nw), h: Math.round(nh) });\n onEnd();\n }}\n className={cn(\n \"group/kgrip pointer-events-none absolute bottom-0.5 right-0.5 z-40 flex size-4 items-end justify-end rounded-kit-sm outline-none\",\n className,\n )}\n >\n <svg aria-hidden viewBox=\"0 0 10 10\" className=\"size-2.5 text-kit-fg-4 opacity-0 transition-opacity group-focus-visible/kgrip:opacity-100\">\n <path d=\"M9 3 3 9M9 6 6 9\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n </svg>\n </div>\n );\n}\n\n/* ── Remembered placement: per user, per panel, per width bucket ─────────────────────────────── */\nexport interface PanelPref {\n side?: \"left\" | \"right\";\n /** set once the person drags it: the panel stays here instead of following its anchor */\n pos?: { x: number; y: number };\n w?: number;\n /** set once the person resizes the height; otherwise the height follows the content */\n h?: number;\n}\ninterface PanelPrefState {\n prefs: Record<string, PanelPref>;\n patch: (key: string, p: Partial<PanelPref> | null) => void;\n}\n/* Remembered per browser in localStorage (the kit carries no state library). A blocked or full storage only loses the\n memory: the panel still docks at its default. */\nconst PREFS_KEY = \"bcms-kit-floating-panel\";\nconst prefListeners = new Set<() => void>();\nfunction readPrefs(): Record<string, PanelPref> {\n try {\n const raw = typeof localStorage === \"undefined\" ? null : localStorage.getItem(PREFS_KEY);\n const parsed = raw ? (JSON.parse(raw) as unknown) : null;\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, PanelPref>) : {};\n } catch {\n return {};\n }\n}\nconst prefState: PanelPrefState = {\n prefs: readPrefs(),\n patch: (key, p) => {\n const next: PanelPref = p === null ? {} : { ...prefState.prefs[key], ...p };\n for (const k of Object.keys(next) as (keyof PanelPref)[]) if (next[k] === undefined) delete next[k];\n prefState.prefs = { ...prefState.prefs, [key]: next };\n try {\n localStorage.setItem(PREFS_KEY, JSON.stringify(prefState.prefs));\n } catch {\n /* storage blocked: placement is remembered for this session only */\n }\n prefListeners.forEach((l) => l());\n },\n};\nconst subscribePrefs = (l: () => void) => {\n prefListeners.add(l);\n return () => prefListeners.delete(l);\n};\n/** Read the remembered placements with a selector; `useFloatingPanelPrefs.getState()` for imperative reads and writes. */\nexport function useFloatingPanelPrefs<T>(select: (s: PanelPrefState) => T): T {\n return React.useSyncExternalStore(\n subscribePrefs,\n () => select(prefState),\n () => select(prefState),\n );\n}\nuseFloatingPanelPrefs.getState = (): PanelPrefState => prefState;\nexport type WidthBucket = \"wide\" | \"mid\";\nconst bucketNow = (): WidthBucket => (vw() >= 1280 ? \"wide\" : \"mid\");\n\nexport type PanelMode = \"float\" | \"side\" | \"sheet\" | \"modal\";\nfunction useMedia(q: string) {\n const [ok, setOk] = React.useState(() => typeof window !== \"undefined\" && window.matchMedia(q).matches);\n React.useEffect(() => {\n const m = window.matchMedia(q);\n const on = () => setOk(m.matches);\n on();\n m.addEventListener(\"change\", on);\n return () => m.removeEventListener(\"change\", on);\n }, [q]);\n return ok;\n}\n/** How a panel presents at this width and pointer: float · side (tablet touch) · sheet (phones) · modal (inside a D49 modal). */\nexport function usePanelMode(inModal?: boolean): PanelMode {\n const phone = useMedia(\"(max-width: 767px)\");\n const touchTablet = useMedia(\"(max-width: 1279px) and (pointer: coarse)\");\n if (inModal) return \"modal\";\n return phone ? \"sheet\" : touchTablet ? \"side\" : \"float\";\n}\n\n/* ── helpers ──────────────────────────────────────────────────────────────────────────────────── */\nfunction scrollParent(el: HTMLElement | null): HTMLElement | null {\n let p = el?.parentElement ?? null;\n while (p && p !== document.body && p !== document.documentElement) {\n const o = getComputedStyle(p).overflowY;\n if ((o === \"auto\" || o === \"scroll\") && p.scrollHeight > p.clientHeight) return p;\n p = p.parentElement;\n }\n return null;\n}\n/** Things a panel never covers by default: a floating or docked assistant, anything marked `data-floating-avoid`. */\nconst AVOID = \"#assistant-panel, [data-floating-avoid]\";\n/** Right-side panels of the page (the editor's Publishing · History · Comments): the panel takes the other side. */\nconst SIDE_PANELS = \"[data-doc-settings], [data-side-panel]\";\n/** A menu, picker, popover or another dialog is open: it takes Esc first. */\n/** An open Base UI popup (popover, menu, select, combobox): it carries data-open and data-side. Kit tooltips don't count. */\nconst POPUP_OPEN = \"[data-open][data-side]:not([data-kit-tooltip])\";\n/** A tooltip (the kit's, or the host's `data-slot=\"tooltip-content\"`), its positioner or arrow: a hint left open never takes Esc. */\nconst TOOLTIP = \"[data-kit-tooltip], [data-slot=tooltip-content]\";\nconst isTooltip = (n: Element) => !!n.closest(TOOLTIP) || !!n.querySelector(TOOLTIP);\nconst OWNS_ESCAPE = `[role=menu],[role=listbox],[data-cell-editing],${POPUP_OPEN}`;\nfunction layerOpen(self: HTMLElement | null) {\n // a popover, menu or select (tooltips don't count), a cell with a draft\n if (document.querySelector(\"[data-cell-editing]\") || Array.from(document.querySelectorAll(POPUP_OPEN)).some((n) => !isTooltip(n))) return true;\n // a floating menu or picker (the slash menu); page-level listboxes (a sidebar list) don't count\n const floating = (n: HTMLElement) => n.getAttribute(\"role\") === \"menu\" || !!n.closest(\"[data-floating-layer]:not([data-floating-panel])\");\n if (Array.from(document.querySelectorAll<HTMLElement>(\"[role=menu], [role=listbox]\")).some((n) => n.getClientRects().length && floating(n))) return true;\n return Array.from(document.querySelectorAll<HTMLElement>(\"[role=dialog]:is([data-open],[data-state=open])\")).some(\n (d) => d !== self && !d.hasAttribute(\"data-expanded-editor\") && !d.hasAttribute(\"data-floating-panel\") && d.id !== \"assistant-panel\" && !d.hasAttribute(\"data-doc-panel\"),\n );\n}\nconst FOCUSABLE = \"input:not([type=hidden]):not([disabled]), textarea:not([disabled]), [contenteditable=true], select:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex='-1'])\";\n\n/** Events from the panel never reach the React tree it was rendered from (the card, the editor around it). */\nconst stop = (e: React.SyntheticEvent) => e.stopPropagation();\nconst FENCE = {\n onFocus: stop, onBlur: stop, onClick: stop, onDoubleClick: stop, onMouseDown: stop, onMouseUp: stop, onMouseMove: stop,\n onInput: stop, onPaste: stop, onCut: stop, onCopy: stop, onKeyUp: stop, onContextMenu: stop,\n} as const;\n\n/* ── The panel ────────────────────────────────────────────────────────────────────────────────── */\nexport const PANEL_W = 340;\nconst PANEL_MAX_AUTO_H = 560;\nconst TOP_LIMIT = 72;\nconst BOTTOM_GAP = 16;\nconst FLOAT_BOUNDS: Bounds = { minW: 300, minH: 240, maxW: () => Math.min(520, vw() - 32), maxH: () => vh() - 96, top: NAV + 4, pad: 8 };\n\nexport interface FloatingPanelHandle {\n dock: (side: \"left\" | \"right\") => void;\n /** back to the docked default (position and size) */\n reset: () => void;\n /** keyboard move / resize: arrows ±16 (Shift ±64), Enter commits, Esc cancels */\n keyboard: (mode: \"move\" | \"resize\") => void;\n /** a polite announcement from the panel's own live region */\n announce: (text: string) => void;\n el: () => HTMLElement | null;\n}\nexport interface FloatingPanelProps {\n /** remembered placement key (one per kind of panel) */\n id: string;\n /** id of the element that names the panel (the header title) */\n labelledBy: string;\n /** the thing it edits: the panel follows it and docks beside its column (`[data-rt-editor]`) */\n anchor: HTMLElement | null;\n /** render inside this element instead of <body> (the D49 modal) */\n container?: HTMLElement | null;\n header: React.ReactNode;\n children: React.ReactNode;\n /** bottom-sheet footer (Done) */\n sheetFooter?: React.ReactNode;\n onClose: () => void;\n /** F6 / Esc: where focus goes back to (the card) */\n focusBack?: () => void;\n /** a refill (another component picked while open): no entrance animation */\n instant?: boolean;\n bodyClassName?: string;\n /** keys anywhere in the panel, before its own handling (⌘Z joins the host's undo) */\n onPanelKeyDown?: (e: KeyboardEvent) => void;\n}\n\nexport const FloatingPanel = React.forwardRef<FloatingPanelHandle, FloatingPanelProps>(function FloatingPanel(\n { id, labelledBy, anchor, container, header, children, sheetFooter, onClose, focusBack, instant, bodyClassName, onPanelKeyDown },\n handle,\n) {\n const reduce = useReducedMotion();\n const mode = usePanelMode(!!container);\n const root = React.useRef<HTMLDivElement>(null);\n const live = React.useRef<HTMLDivElement>(null);\n const [bucket, setBucket] = React.useState<WidthBucket>(bucketNow);\n const key = `${id}:${bucket}`;\n const pref = useFloatingPanelPrefs((s) => s.prefs[key]) ?? EMPTY;\n const patch = (p: Partial<PanelPref> | null) => {\n useFloatingPanelPrefs.getState().patch(key, p);\n // layout may run before React re-renders with the new prefs\n prefRef.current = useFloatingPanelPrefs.getState().prefs[key] ?? EMPTY;\n };\n const x = useMotionValue(-9999);\n const y = useMotionValue(-9999);\n const w = useMotionValue(pref.w ?? PANEL_W);\n const h = useMotionValue(pref.h ?? 0);\n const geom = React.useMemo<Geom>(() => ({ x, y, w, h }), [x, y, w, h]);\n const [explicitH, setExplicitH] = React.useState(!!pref.h);\n const [maxAuto, setMaxAuto] = React.useState(PANEL_MAX_AUTO_H);\n const [guides, setGuides] = React.useState<Guides>(NO_GUIDES);\n const [kbd, setKbd] = React.useState<null | { mode: \"move\" | \"resize\"; start: Rect; explicit: boolean }>(null);\n const [sheetH, setSheetH] = React.useState<50 | 90>(50);\n const busy = React.useRef(false); // dragging / resizing: layout pauses\n const prefRef = React.useRef(pref);\n prefRef.current = pref;\n const kbdRef = React.useRef(kbd);\n kbdRef.current = kbd;\n const closeRef = React.useRef(onClose);\n closeRef.current = onClose;\n const backRef = React.useRef(focusBack);\n backRef.current = focusBack;\n\n // a new width bucket brings its own remembered placement\n React.useEffect(() => {\n const on = () => setBucket(bucketNow());\n window.addEventListener(\"resize\", on);\n return () => window.removeEventListener(\"resize\", on);\n }, []);\n React.useEffect(() => {\n w.set(pref.w ?? PANEL_W);\n setExplicitH(!!pref.h);\n if (pref.h) h.set(pref.h);\n }, [key]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const column = React.useCallback(() => (anchor?.closest<HTMLElement>(\"[data-rt-editor]\") ?? anchor)?.getBoundingClientRect() ?? null, [anchor]);\n\n /** Where the panel sits now (float mode): its remembered spot, or docked beside the column, following the anchor. */\n const layout = React.useCallback(() => {\n const el = root.current;\n if (!el || !anchor || mode !== \"float\" || busy.current || kbdRef.current) return;\n const p = prefRef.current;\n const sc = scrollParent(anchor)?.getBoundingClientRect();\n const top = Math.max(TOP_LIMIT, (sc?.top ?? 0) + 8);\n let bottom = vh() - BOTTOM_GAP;\n const tray = document.querySelector<HTMLElement>(\"[data-action-tray]\")?.getBoundingClientRect();\n if (tray && tray.height && tray.top > top + 240) bottom = Math.min(bottom, tray.top - 8);\n if (sc && sc.bottom > top + 240) bottom = Math.min(bottom, sc.bottom - 8);\n const room = Math.max(FLOAT_BOUNDS.minH, bottom - top);\n const nextMax = Math.min(PANEL_MAX_AUTO_H, room);\n setMaxAuto((m) => (m === nextMax ? m : nextMax));\n const ww = w.get();\n const ph = Math.min(el.offsetHeight || 320, room);\n if (p.pos) {\n x.set(clampN(p.pos.x, 8, Math.max(8, vw() - ww - 8)));\n y.set(clampN(p.pos.y, NAV + 4, Math.max(NAV + 4, vh() - ph - 8)));\n return;\n }\n const col = column();\n const a = anchor.getBoundingClientRect();\n if (!col) return;\n let L = Math.max(8, sc?.left ?? 0);\n let R = Math.min(vw() - 8, sc?.right ?? vw());\n for (const o of Array.from(document.querySelectorAll<HTMLElement>(AVOID))) {\n if (o === el || el.contains(o)) continue;\n const r = o.getBoundingClientRect();\n if (!r.width || !r.height || r.bottom < top || r.top > bottom) continue;\n if (r.left + r.width / 2 < col.left + col.width / 2) L = Math.max(L, r.right);\n else R = Math.min(R, r.left);\n }\n const need = ww + 16;\n const fits = { right: R - col.right >= need, left: col.left - L >= need };\n // an open right-side panel (Publishing · History · Comments) sends it to the other side\n const rightBusy = Array.from(document.querySelectorAll<HTMLElement>(SIDE_PANELS)).some((n) => n.getBoundingClientRect().width > 40);\n const side = p.side ?? (rightBusy ? \"left\" : fits.right ? \"right\" : fits.left ? \"left\" : \"right\");\n const nx = side === \"right\" ? (fits.right ? col.right + 16 : R - ww - 8) : fits.left ? col.left - 16 - ww : L + 8;\n x.set(clampN(nx, 8, Math.max(8, vw() - ww - 8)));\n y.set(clampN(a.top, top, Math.max(top, bottom - ph)));\n }, [anchor, mode, column, w, x, y]);\n\n React.useLayoutEffect(() => {\n layout();\n }, [layout, pref.pos, pref.side, pref.w, explicitH]);\n React.useEffect(() => {\n if (mode !== \"float\") return;\n let raf = 0;\n let settle = 0;\n const on = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(layout);\n // once more after things stop moving (a side panel's exit animation ends after the last resize)\n window.clearTimeout(settle);\n settle = window.setTimeout(layout, 320);\n };\n window.addEventListener(\"scroll\", on, true);\n window.addEventListener(\"resize\", on);\n // something it avoids may have moved (the assistant window dropped somewhere else)\n window.addEventListener(\"pointerup\", on);\n const ro = new ResizeObserver(on);\n if (root.current) ro.observe(root.current);\n if (anchor) ro.observe(anchor);\n // the work surface narrowing (a side panel opening) moves the column without resizing the anchor\n const sc = scrollParent(anchor);\n if (sc) ro.observe(sc);\n return () => {\n cancelAnimationFrame(raf);\n window.clearTimeout(settle);\n window.removeEventListener(\"scroll\", on, true);\n window.removeEventListener(\"resize\", on);\n window.removeEventListener(\"pointerup\", on);\n ro.disconnect();\n };\n }, [mode, layout, anchor]);\n\n // modal: dock into the modal's right 340px (the reading column shifts left), or overlay its edge when narrow\n const [modalFit, setModalFit] = React.useState<\"dock\" | \"overlay\" | \"bottom\">(\"dock\");\n React.useLayoutEffect(() => {\n if (mode !== \"modal\" || !container) return;\n const fit = () => {\n const cw = container.clientWidth;\n const next = cw < 560 ? \"bottom\" : cw >= PANEL_W + 680 ? \"dock\" : \"overlay\";\n setModalFit(next);\n if (next === \"dock\") container.setAttribute(\"data-floating-dock\", \"right\");\n else container.removeAttribute(\"data-floating-dock\");\n };\n fit();\n const ro = new ResizeObserver(fit);\n ro.observe(container);\n return () => {\n ro.disconnect();\n container.removeAttribute(\"data-floating-dock\");\n };\n }, [mode, container]);\n\n const toExplicit = () => {\n if (explicitH || !root.current) return;\n h.set(root.current.offsetHeight);\n setExplicitH(true);\n };\n const say = (text: string) => {\n const el = live.current;\n if (!el) return;\n el.textContent = \"\";\n window.setTimeout(() => {\n if (live.current) live.current.textContent = text;\n }, 60);\n };\n\n const reset = () => {\n patch(null);\n setExplicitH(false);\n w.set(PANEL_W);\n };\n React.useImperativeHandle(handle, () => ({\n dock: (side) => patch({ side, pos: undefined }),\n reset,\n keyboard: (m) => {\n if (mode !== \"float\") return;\n if (m === \"resize\") toExplicit();\n setKbd({ mode: m, start: { x: x.get(), y: y.get(), w: w.get(), h: root.current?.offsetHeight ?? h.get() }, explicit: explicitH });\n // after the ⋯ menu has handed focus back to its trigger\n window.setTimeout(() => root.current?.focus({ preventScroll: true }), 80);\n say(m === \"move\" ? \"Moving the panel. Arrow keys move it, Enter keeps it there, Escape cancels.\" : \"Resizing the panel. Arrow keys resize it, Enter keeps the size, Escape cancels.\");\n },\n announce: say,\n el: () => root.current,\n }));\n\n /** Esc: keyboard mode cancels first, then the panel closes and focus goes back to the card. */\n const escape = React.useCallback(() => {\n const k = kbdRef.current;\n if (k) {\n x.set(k.start.x);\n y.set(k.start.y);\n w.set(k.start.w);\n if (!k.explicit) setExplicitH(false);\n else h.set(k.start.h);\n setKbd(null);\n say(\"Cancelled\");\n return;\n }\n closeRef.current();\n backRef.current?.();\n }, [x, y, w, h]);\n\n // Esc / F6 from OUTSIDE the panel (the text, the page); the modal forwards its Esc through \"floatingpanel:escape\"\n React.useEffect(() => {\n const el = root.current;\n const onKey = (e: KeyboardEvent) => {\n if (el?.contains(e.target as Node)) return;\n if (e.key === \"F6\") {\n e.preventDefault();\n const f = Array.from(el?.querySelectorAll<HTMLElement>(`[data-panel-body] :is(${FOCUSABLE})`) ?? []).find((n) => n.getClientRects().length) ?? el;\n f?.focus({ preventScroll: true });\n return;\n }\n if (e.key !== \"Escape\" || e.defaultPrevented || layerOpen(el)) return;\n if (!container && document.querySelector(\"[data-expanded-editor]\")) return; // a D49 modal over us owns Esc\n e.preventDefault();\n escape();\n };\n const onForward = () => escape();\n window.addEventListener(\"keydown\", onKey);\n el?.addEventListener(\"floatingpanel:escape\", onForward);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n el?.removeEventListener(\"floatingpanel:escape\", onForward);\n };\n }, [container, escape]);\n\n // Keys inside the panel\n /* Keys inside the panel run on a NATIVE listener on the panel itself: it sees them first, wherever the panel is\n portalled (inside a modal, React's own listeners sit on other containers). */\n const keyRef = React.useRef<(e: KeyboardEvent) => void>(() => {});\n keyRef.current = (e: KeyboardEvent) => {\n const native = e as KeyboardEvent & { bcmsPanelHandled?: boolean };\n onPanelKeyDown?.(e);\n const k = kbdRef.current;\n if (k) {\n const step = e.shiftKey ? 64 : 16;\n const dx = e.key === \"ArrowRight\" ? step : e.key === \"ArrowLeft\" ? -step : 0;\n const dy = e.key === \"ArrowDown\" ? step : e.key === \"ArrowUp\" ? -step : 0;\n if (dx || dy) {\n e.preventDefault();\n if (k.mode === \"move\") {\n x.set(clampN(x.get() + dx, 8, vw() - w.get() - 8));\n y.set(clampN(y.get() + dy, NAV + 4, vh() - h.get() - 8));\n } else {\n w.set(clampN(w.get() + dx, FLOAT_BOUNDS.minW, FLOAT_BOUNDS.maxW()));\n h.set(clampN(h.get() + dy, FLOAT_BOUNDS.minH, FLOAT_BOUNDS.maxH()));\n x.set(clampN(x.get(), 8, vw() - w.get() - 8));\n }\n return;\n }\n if (e.key === \"Enter\") {\n e.preventDefault();\n patch(k.mode === \"move\" ? { pos: { x: x.get(), y: y.get() } } : { w: w.get(), h: h.get(), pos: { x: x.get(), y: y.get() } });\n setKbd(null);\n say(k.mode === \"move\" ? \"Panel moved\" : \"Panel resized\");\n return;\n }\n }\n if (e.key === \"F6\") {\n e.preventDefault();\n backRef.current?.();\n } else if (e.key === \"Escape\" && !native.bcmsPanelHandled && !(e.target as HTMLElement).closest?.(OWNS_ESCAPE) && !layerOpen(root.current)) {\n e.preventDefault();\n native.bcmsPanelHandled = true;\n escape();\n }\n };\n React.useEffect(() => {\n const el = root.current;\n if (!el) return;\n const on = (e: KeyboardEvent) => keyRef.current(e);\n el.addEventListener(\"keydown\", on);\n return () => el.removeEventListener(\"keydown\", on);\n }, [mode]);\n // keep keys away from the card / editor this panel was rendered from (modified keys still reach app shortcuts)\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!(e.metaKey || e.ctrlKey) || eventKey(e) === \"z\") e.stopPropagation();\n };\n\n const onHeaderDown = (e: React.PointerEvent) => {\n if (mode !== \"float\" || e.button !== 0 || (e.target as HTMLElement).closest(\"button, a, input, textarea, [role=menuitem], [contenteditable]\")) return;\n e.preventDefault();\n const ox = x.get();\n const oy = y.get();\n const ww = w.get();\n const hh = root.current?.offsetHeight ?? h.get();\n const col = column();\n const lines: SnapLines = { v: [EDGE, vw() - EDGE, ...(col ? [col.left, col.right] : [])], h: [TOP_LIMIT, vh() - EDGE] };\n busy.current = true;\n track(\n e,\n (dx, dy) => {\n const r = snapRect(ox + dx, oy + dy, ww, hh, lines, FLOAT_BOUNDS);\n x.set(r.x);\n y.set(r.y);\n setGuides((g) => (g.v.join() === r.g.v.join() && g.h.join() === r.g.h.join() ? g : r.g));\n },\n (moved) => {\n busy.current = false;\n setGuides(NO_GUIDES);\n if (moved) patch({ pos: { x: x.get(), y: y.get() } });\n },\n \"grabbing\",\n );\n };\n\n const headerEl = (\n <div\n data-panel-header=\"\"\n onPointerDown={onHeaderDown}\n onDoubleClick={(e) => {\n if (mode !== \"float\" || (e.target as HTMLElement).closest(\"button, a, input, [role=menuitem]\")) return;\n reset();\n }}\n className={cn(\"flex h-10 shrink-0 items-center gap-1 border-b border-kit-line-subtle pl-3 pr-1.5\", mode === \"float\" && \"cursor-grab touch-none select-none active:cursor-grabbing\")}\n >\n {header}\n </div>\n );\n const body = (\n <div data-panel-body=\"\" className={cn(\"min-h-0 flex-1 overflow-y-auto overscroll-contain\", bodyClassName)}>\n {children}\n </div>\n );\n const liveEl = <div ref={live} aria-live=\"polite\" className=\"sr-only\" />;\n const common = {\n ref: root,\n role: \"dialog\",\n \"aria-modal\": false as const,\n \"aria-labelledby\": labelledBy,\n tabIndex: -1,\n ...KIT_SCOPE,\n \"data-floating-layer\": \"\",\n \"data-floating-panel\": \"\",\n \"data-state\": \"open\",\n \"data-kbd\": kbd ? kbd.mode : undefined,\n onKeyDown,\n ...FENCE,\n };\n const fade = reduce || instant ? { duration: 0 } : { duration: 0.16, ease: EASE };\n\n let node: React.ReactNode;\n if (mode === \"sheet\") {\n node = (\n <motion.div\n {...common}\n initial={{ y: reduce || instant ? 0 : \"100%\" }}\n animate={{ y: 0 }}\n transition={reduce || instant ? { duration: 0 } : { duration: 0.24, ease: EASE }}\n style={{ height: `${sheetH}dvh` }}\n className=\"fixed inset-x-0 bottom-0 z-[var(--kit-z-sheet,55)] flex flex-col overflow-hidden rounded-t-kit-xl border-t border-kit-line bg-kit-surface-raised pb-[env(safe-area-inset-bottom)] shadow-kit-sheet-b outline-none\"\n >\n <SheetGrabber height={sheetH} onHeight={setSheetH} onClose={() => escape()} />\n {headerEl}\n {body}\n {sheetFooter ? <div className=\"flex shrink-0 justify-end border-t border-kit-line-subtle px-3 py-2\">{sheetFooter}</div> : null}\n {liveEl}\n </motion.div>\n );\n } else if (mode === \"side\") {\n node = (\n <motion.div\n {...common}\n initial={{ x: reduce || instant ? 0 : \"100%\" }}\n animate={{ x: 0 }}\n transition={reduce || instant ? { duration: 0 } : { duration: 0.22, ease: EASE }}\n style={{ width: PANEL_W, top: NAV }}\n className=\"fixed bottom-0 right-0 z-[var(--kit-z-sheet,55)] flex flex-col border-l border-kit-line bg-kit-surface-raised shadow-kit-sheet-r outline-none\"\n >\n {headerEl}\n {body}\n {liveEl}\n </motion.div>\n );\n } else if (mode === \"modal\") {\n node = (\n <motion.div\n {...common}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={fade}\n style={modalFit === \"dock\" ? { width: PANEL_W, top: 48, right: 0, bottom: 0 } : modalFit === \"overlay\" ? { width: PANEL_W, top: 56, right: 8, bottom: 8 } : { left: 0, right: 0, bottom: 0, height: \"55%\" }}\n className={cn(\n \"absolute z-[20] flex flex-col overflow-hidden bg-kit-surface-raised outline-none\",\n modalFit === \"dock\"\n ? \"border-l border-kit-line\"\n : modalFit === \"overlay\"\n ? \"rounded-kit-xl border border-kit-floating-line shadow-kit-lg\"\n : \"rounded-t-kit-xl border-t border-kit-line shadow-kit-sheet-b\",\n )}\n >\n {headerEl}\n {body}\n {liveEl}\n </motion.div>\n );\n } else {\n node = (\n <>\n <SnapGuides guides={guides} />\n <motion.div\n {...common}\n style={{ x, y, width: w, height: explicitH ? h : undefined, maxHeight: explicitH ? undefined : maxAuto, left: 0, top: 0 }}\n initial={{ opacity: 0, scale: reduce || instant ? 1 : 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={fade}\n className={cn(\n \"fixed flex flex-col overflow-hidden rounded-kit-xl border bg-kit-surface-raised shadow-kit-xl outline-none\",\n // floating = level 2: --line in light, the stronger hairline in dark (DARK_MODE §5)\n kbd ? \"border-dashed border-[var(--kit-emphasis-line)]\" : \"border-kit-floating-line\",\n Z_FLOAT,\n )}\n >\n <ResizeEdges\n geom={geom}\n bounds={FLOAT_BOUNDS}\n onStart={() => {\n busy.current = true;\n toExplicit();\n }}\n onEnd={(dir) => {\n busy.current = false;\n const moved = dir.includes(\"w\") || dir.includes(\"n\") || !!prefRef.current.pos;\n patch({ w: w.get(), h: h.get(), ...(moved ? { pos: { x: x.get(), y: y.get() } } : {}) });\n }}\n />\n {headerEl}\n {body}\n <ResizeGrip\n geom={geom}\n bounds={FLOAT_BOUNDS}\n label=\"Resize panel\"\n onStart={toExplicit}\n onEnd={() => patch({ w: w.get(), h: h.get(), pos: { x: x.get(), y: y.get() } })}\n />\n {liveEl}\n </motion.div>\n </>\n );\n }\n return createPortal(node, container ?? document.body);\n});\nconst EMPTY: PanelPref = {};\n\n/** Bottom-sheet grabber: drag down to close, up for 90%; a tap toggles 50% ↔ 90%. */\nfunction SheetGrabber({ height, onHeight, onClose }: { height: 50 | 90; onHeight: (h: 50 | 90) => void; onClose: () => void }) {\n const dy = React.useRef(0);\n const dragged = React.useRef(false);\n return (\n <button\n type=\"button\"\n aria-label={height === 50 ? \"Expand panel\" : \"Shrink panel\"}\n onPointerDown={(e) => {\n dy.current = 0;\n dragged.current = false;\n track(\n e,\n (_dx, d) => {\n dy.current = d;\n dragged.current = true;\n },\n (moved) => {\n if (!moved) return;\n if (dy.current > 80) onClose();\n else if (dy.current < -40) onHeight(90);\n else if (dy.current > 40 && height === 90) onHeight(50);\n },\n );\n }}\n onClick={() => {\n if (dragged.current) return void (dragged.current = false);\n onHeight(height === 50 ? 90 : 50);\n }}\n className=\"flex h-5 w-full shrink-0 touch-none items-center justify-center\"\n >\n <span className=\"h-1 w-9 rounded-full bg-kit-line-strong\" />\n </button>\n );\n}\n"],"mappings":"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"}
@@ -10,3 +10,7 @@ export * from "./shortcut-hint";
10
10
  export * from "./expanded-editor-modal";
11
11
  export * from "./presence";
12
12
  export * from "./mode-bar";
13
+ export * from "./spinner";
14
+ export * from "./tab";
15
+ export * from "./toast";
16
+ export * from "./autocomplete";
@@ -0,0 +1,18 @@
1
+ import { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy } from "./field-context.js";
2
+ import { Button, HintTooltip, IconButton, RevealLink, Sparkle, TooltipScope, buttonVariants, iconButtonVariants } from "./button.js";
3
+ import { ShortcutHint, ShortcutHintsProvider, shortcutHintsOn, useShortcutHints } from "./shortcut-hint.js";
4
+ import { Checkbox, ChoiceCard, ChoiceList, Progress, Radio, RadioGroup, Segmented, Slider, Switch, ToggleGroup, ToggleItem } from "./controls.js";
5
+ import { FLOATING_LAYER, FlowBody, FlowClose, FlowFooter, FlowHeader, FlowLabel, FlowModal, HeaderStatus, HoverCard, HoverCardContent, HoverCardTrigger, Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, MoreOptions, OptionRow, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Sheet, SheetClose, SheetContent, SheetTrigger, Tooltip, TooltipProvider, useFocusReturn } from "./overlay.js";
6
+ import { Avatar, AvatarStack, Badge, Card, CardHeader, Dot, EmptyState, Kbd, PageHeader, Separator, SettingsSection, Skeleton, Stat, StatusMark, StatusPill, Table, Td, Th, Tr, avatarRingSpread, badgeVariants, colorFor, initials, statusMap } from "./display.js";
7
+ import { AGENT_PRESENCE, presenceColor, presenceSlot, registerPresenceRoster } from "./presence.js";
8
+ import { Field, HelpMore, Input, Label, SearchInput, Textarea } from "./input.js";
9
+ import { Highlight, SEARCH_THRESHOLD, Select, filterOptions, matchPositions, matchScore, nodeText, selectTriggerClass } from "./select.js";
10
+ import { ExpandedEditorModal } from "./expanded-editor-modal.js";
11
+ import { ChoiceSwitch, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, fitsSegmented } from "./choice-switch.js";
12
+ import { ActionTray, TrayMeta, TrayMore, actionTrayClass, relTime } from "./action-tray.js";
13
+ import { ModeBar, ModeBarDot, ModeBarLink } from "./mode-bar.js";
14
+ import { Spinner } from "./spinner.js";
15
+ import { Tab, TabList, TabPanel, Tabs } from "./tab.js";
16
+ import { KitToaster, kitToast, kitToastManager } from "./toast.js";
17
+ import { Autocomplete } from "./autocomplete.js";
18
+ export { AGENT_PRESENCE, ActionTray, Autocomplete, Avatar, AvatarStack, Badge, Button, Card, CardHeader, Checkbox, ChoiceCard, ChoiceList, ChoiceSwitch, Dot, EmptyState, ExpandedEditorModal, FLOATING_LAYER, Field, FieldDescribedByContext, FieldLabelledByContext, FlowBody, FlowClose, FlowFooter, FlowHeader, FlowLabel, FlowModal, HeaderStatus, HelpMore, Highlight, HintTooltip, HoverCard, HoverCardContent, HoverCardTrigger, IconButton, Input, Kbd, KitToaster, Label, Menu, MenuCheckItem, MenuContent, MenuGroup, MenuItem, MenuLabel, MenuRadioGroup, MenuRadioItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Modal, ModalBody, ModalClose, ModalContent, ModalFooter, ModalHeader, ModalTrigger, ModeBar, ModeBarDot, ModeBarLink, MoreOptions, OptionRow, PageHeader, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverTrigger, Progress, Radio, RadioGroup, RevealLink, SEARCH_THRESHOLD, SEGMENTED_MAX, SEGMENTED_MAX_LABEL, SearchInput, Segmented, Select, Separator, SettingsSection, Sheet, SheetClose, SheetContent, SheetTrigger, ShortcutHint, ShortcutHintsProvider, Skeleton, Slider, Sparkle, Spinner, Stat, StatusMark, StatusPill, Switch, Tab, TabList, TabPanel, Table, Tabs, Td, Textarea, Th, ToggleGroup, ToggleItem, Tooltip, TooltipProvider, TooltipScope, Tr, TrayMeta, TrayMore, actionTrayClass, avatarRingSpread, badgeVariants, buttonVariants, colorFor, filterOptions, fitsSegmented, iconButtonVariants, initials, kitToast, kitToastManager, matchPositions, matchScore, nodeText, presenceColor, presenceSlot, registerPresenceRoster, relTime, selectTriggerClass, shortcutHintsOn, statusMap, useFieldDescribedBy, useFieldId, useFieldLabelledBy, useFocusReturn, useShortcutHints };
@@ -49,7 +49,7 @@ export declare function Label({ className, ...props }: React.LabelHTMLAttributes
49
49
  * control
50
50
  * error: replaces the help, danger colour, under the control
51
51
  * The control gets `aria-describedby` → help + ⓘ text + error.
52
- * Required marker is --fg-2 with an sr-only "(required)" (DESIGN.md 13 #13, step 2).
52
+ * Required marker is V2 ui/input.tsx:249 (--danger-fg); the sr-only "(required)" names it for screen readers.
53
53
  */
54
54
  export declare function Field({ label, htmlFor, hint, help, helpMore, error, required, counter, actions, children, className, }: {
55
55
  label?: React.ReactNode;
@@ -1,11 +1,11 @@
1
1
  import { cn } from "../lib/cn.js";
2
- import { FieldDescribedByContext, FieldIdContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy, useLabelFor } from "./field-context.js";
2
+ import { FieldDescribedByContext, FieldIdContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy, useLabelFor } from "./field-context.js";
3
3
  import { HintTooltip } from "./button.js";
4
4
  import { useShortcutHints } from "./shortcut-hint.js";
5
5
  import * as React from "react";
6
- import { IconInfoCircle, IconSearch, IconX } from "@tabler/icons-react";
7
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- //#region src/kit/ui/input.tsx
7
+ import { IconInfoCircle, IconSearch, IconX } from "@tabler/icons-react";
8
+ //#region src/ui/input.tsx
9
9
  /**
10
10
  * Inputs — CPO D19: white field + 1px --field-border at rest (default "outline"), border darkens on hover, halo on focus.
11
11
  * "filled" (grey, borderless) is kept only for search fields, which Figma draws grey.
@@ -26,7 +26,7 @@ var Input = React.forwardRef(({ className, size = "md", leading, trailing, varia
26
26
  "aria-describedby": joinIds(rest["aria-describedby"], describedBy)
27
27
  };
28
28
  const h = size === "sm" ? "h-7 text-kit-sm" : size === "lg" ? "h-9 text-kit-base" : "h-8 text-kit-sm";
29
- const v = variant === "filled" ? "bg-kit-muted border-transparent shadow-none hover:border-kit-line-strong placeholder:text-kit-fg-3" : "";
29
+ const v = variant === "filled" ? "bg-kit-muted border-transparent shadow-none hover:border-kit-line-strong" : "";
30
30
  if (!leading && !trailing) return /* @__PURE__ */ jsx("input", {
31
31
  ref,
32
32
  className: cn(base, h, v, "px-2.5", className),
@@ -96,7 +96,7 @@ var Textarea = React.forwardRef(({ className, autoGrow = true, variant = "outlin
96
96
  grow();
97
97
  onInput?.(e);
98
98
  },
99
- className: cn(base, "min-h-16 resize-none px-2.5 py-2 text-kit-sm leading-[20px]", variant === "filled" && "bg-kit-muted border-transparent shadow-none placeholder:text-kit-fg-3", className),
99
+ className: cn(base, "min-h-16 resize-none px-2.5 py-2 text-kit-sm leading-[20px]", variant === "filled" && "bg-kit-muted border-transparent shadow-none", className),
100
100
  ...props
101
101
  });
102
102
  });
@@ -148,7 +148,7 @@ function Label({ className, ...props }) {
148
148
  * control
149
149
  * error: replaces the help, danger colour, under the control
150
150
  * The control gets `aria-describedby` → help + ⓘ text + error.
151
- * Required marker is --fg-2 with an sr-only "(required)" (DESIGN.md 13 #13, step 2).
151
+ * Required marker is V2 ui/input.tsx:249 (--danger-fg); the sr-only "(required)" names it for screen readers.
152
152
  */
153
153
  function Field({ label, htmlFor, hint, help, helpMore, error, required, counter, actions, children, className }) {
154
154
  const autoId = React.useId();
@@ -171,7 +171,7 @@ function Field({ label, htmlFor, hint, help, helpMore, error, required, counter,
171
171
  label,
172
172
  required ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
173
173
  "aria-hidden": true,
174
- className: "text-kit-fg-2",
174
+ className: "text-kit-danger-fg",
175
175
  children: "*"
176
176
  }), /* @__PURE__ */ jsx("span", {
177
177
  className: "sr-only",
@@ -231,7 +231,7 @@ function HelpMore({ id, label, children }) {
231
231
  children: /* @__PURE__ */ jsxs("button", {
232
232
  type: "button",
233
233
  "aria-label": label ? `About ${label}` : "More about this field",
234
- className: "inline-flex size-4 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 hover:text-kit-fg-2",
234
+ className: "hit-area inline-flex size-4 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 [--hit-size:16px] hover:text-kit-fg-2",
235
235
  children: [/* @__PURE__ */ jsx(IconInfoCircle, {
236
236
  className: "size-3.5",
237
237
  stroke: 1.5,
@@ -245,6 +245,6 @@ function HelpMore({ id, label, children }) {
245
245
  });
246
246
  }
247
247
  //#endregion
248
- export { Field, HelpMore, Input, Label, SearchInput, Textarea };
248
+ export { Field, FieldDescribedByContext, FieldLabelledByContext, HelpMore, Input, Label, SearchInput, Textarea, useFieldDescribedBy, useFieldId, useFieldLabelledBy };
249
249
 
250
250
  //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","names":[],"sources":["../../src/ui/input.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { IconInfoCircle, IconSearch, IconX } from \"@tabler/icons-react\";\nimport { cn } from \"../lib/cn\";\nimport { HintTooltip } from \"./button\";\nimport { useShortcutHints } from \"./shortcut-hint\";\n\n/**\n * Inputs — CPO D19: white field + 1px --field-border at rest (default \"outline\"), border darkens on hover, halo on focus.\n * \"filled\" (grey, borderless) is kept only for search fields, which Figma draws grey.\n * Heights follow buttons: sm 28 · md 32 · lg 36.\n */\nimport {\n FieldDescribedByContext,\n FieldIdContext,\n FieldLabelledByContext,\n useFieldDescribedBy,\n useFieldId,\n useFieldLabelledBy,\n useLabelFor,\n} from \"./field-context\";\n/* The Field contexts live in field-context.ts so controls in other files (Switch, Select) read the same ones. */\nexport { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy };\n\nconst joinIds = (...ids: (string | undefined)[]) => ids.filter(Boolean).join(\" \") || undefined;\n\nconst base =\n \"w-full min-w-0 rounded-kit-md border border-kit-field-border bg-kit-field-bg text-kit-fg shadow-kit-field placeholder:text-kit-fg-4 transition-[border-color,box-shadow] duration-150 hover:border-kit-field-border-hover focus:border-kit-field-border-focus focus:shadow-kit-ring-field disabled:cursor-not-allowed disabled:bg-kit-subtle disabled:opacity-60 aria-[invalid=true]:border-[var(--kit-field-invalid)]\";\n\nexport interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\" | \"prefix\"> {\n size?: \"sm\" | \"md\" | \"lg\";\n leading?: React.ReactNode;\n trailing?: React.ReactNode;\n variant?: \"filled\" | \"outline\";\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, size = \"md\", leading, trailing, variant = \"outline\", ...rest }, ref) => {\n const fieldId = useFieldId();\n const labelledBy = useFieldLabelledBy();\n const named = rest.id ?? fieldId ?? rest[\"aria-label\"] ?? rest[\"aria-labelledby\"];\n const labelFor = useLabelFor(rest.id ?? fieldId);\n const describedBy = useFieldDescribedBy();\n const props = {\n ...rest,\n id: rest.id ?? fieldId,\n \"aria-labelledby\": rest[\"aria-labelledby\"] ?? (rest[\"aria-label\"] ? undefined : (labelFor ?? (named ? undefined : labelledBy))),\n \"aria-describedby\": joinIds(rest[\"aria-describedby\"], describedBy),\n };\n const h = size === \"sm\" ? \"h-7 text-kit-sm\" : size === \"lg\" ? \"h-9 text-kit-base\" : \"h-8 text-kit-sm\";\n const v = variant === \"filled\" ? \"bg-kit-muted border-transparent shadow-none hover:border-kit-line-strong\" : \"\";\n if (!leading && !trailing) return <input ref={ref} className={cn(base, h, v, \"px-2.5\", className)} {...props} />;\n return (\n <div className={cn(\"relative flex items-center\", className)}>\n {leading ? (\n <span className=\"pointer-events-none absolute left-2.5 flex text-kit-fg-3 [&_svg]:size-4\">{leading}</span>\n ) : null}\n <input ref={ref} className={cn(base, h, v, leading ? \"pl-8\" : \"pl-2.5\", trailing ? \"pr-8\" : \"pr-2.5\")} {...props} />\n {trailing ? <span className=\"absolute right-2 flex items-center text-kit-fg-3 [&_svg]:size-4\">{trailing}</span> : null}\n </div>\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & { autoGrow?: boolean; variant?: \"filled\" | \"outline\" };\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, autoGrow = true, variant = \"outline\", onInput, ...rest }, ref) => {\n const fieldId = useFieldId();\n const labelFor = useLabelFor(rest.id ?? fieldId);\n const describedBy = useFieldDescribedBy();\n const props = {\n ...rest,\n id: rest.id ?? fieldId,\n \"aria-labelledby\": rest[\"aria-labelledby\"] ?? (rest[\"aria-label\"] ? undefined : labelFor),\n \"aria-describedby\": joinIds(rest[\"aria-describedby\"], describedBy),\n };\n const inner = React.useRef<HTMLTextAreaElement | null>(null);\n React.useImperativeHandle(ref, () => inner.current as HTMLTextAreaElement);\n const grow = () => {\n const el = inner.current;\n if (!el || !autoGrow || !el.clientWidth) return; // hidden / zero-width: measuring now would be wrong\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight + 2}px`;\n };\n React.useLayoutEffect(grow, [props.value, autoGrow]); // eslint-disable-line react-hooks/exhaustive-deps\n /* Re-measure when the WIDTH changes (a panel resize or a panel that mounts mid-animation): a height measured at a\n narrower width is stale and leaves single-line fields hundreds of px tall. Height-only changes are ignored, so\n the observer never feeds itself. */\n React.useEffect(() => {\n const el = inner.current;\n if (!el || !autoGrow || typeof ResizeObserver === \"undefined\") return;\n let w = el.clientWidth;\n let raf = 0;\n const ro = new ResizeObserver(() => {\n const nw = el.clientWidth;\n if (nw === w) return;\n w = nw;\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(grow);\n });\n ro.observe(el);\n return () => {\n cancelAnimationFrame(raf);\n ro.disconnect();\n };\n }, [autoGrow]); // eslint-disable-line react-hooks/exhaustive-deps\n return (\n <textarea\n ref={inner}\n rows={props.rows ?? 2}\n onInput={(e) => {\n grow();\n onInput?.(e);\n }}\n className={cn(\n base,\n \"min-h-16 resize-none px-2.5 py-2 text-kit-sm leading-[20px]\",\n variant === \"filled\" && \"bg-kit-muted border-transparent shadow-none\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport function SearchInput({\n value,\n onChange,\n placeholder = \"Search…\",\n className,\n size = \"md\",\n autoFocus,\n shortcut,\n variant = \"filled\",\n count,\n onKeyDown,\n inputRef,\n \"aria-label\": ariaLabel,\n}: {\n \"aria-label\"?: string;\n value: string;\n onChange: (v: string) => void;\n placeholder?: string;\n className?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n autoFocus?: boolean;\n /** Shown only while the D44 keyboard hints switch is on. */\n shortcut?: string;\n /**\n * \"filled\" (grey) for search on white surfaces (menus, sidebars, lists); \"outline\" is the standard field (field-bg,\n * field-border) for search that sits on a grey plane, where a grey fill reads as a pill, not a field (D70, the schema desk).\n */\n variant?: \"filled\" | \"outline\";\n /** a result count shown inside the field while there is a query (\"3 matches\", \"2 of 5\"); announced politely */\n count?: string;\n onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n inputRef?: React.Ref<HTMLInputElement>;\n}) {\n const hints = useShortcutHints();\n return (\n <Input\n ref={inputRef}\n variant={variant}\n size={size}\n autoFocus={autoFocus}\n value={value}\n placeholder={placeholder}\n aria-label={ariaLabel ?? placeholder.replace(/…$/, \"\")}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={onKeyDown}\n leading={<IconSearch aria-hidden />}\n className={cn(className, value && count ? \"[&_input]:pr-28\" : undefined)}\n trailing={\n value ? (\n <span className=\"flex items-center gap-1.5\">\n {count ? (\n <span aria-live=\"polite\" className=\"whitespace-nowrap text-kit-xs tabular-nums text-kit-fg-3\">\n {count}\n </span>\n ) : null}\n <button\n type=\"button\"\n aria-label=\"Clear search\"\n onClick={() => onChange(\"\")}\n className=\"flex size-5 items-center justify-center rounded-kit-sm text-kit-fg-3 hover:bg-kit-selected hover:text-kit-fg [&_svg]:size-3.5\"\n >\n <IconX aria-hidden />\n </button>\n </span>\n ) : shortcut && hints ? (\n <kbd data-hint=\"shortcuts\" className=\"font-kit-sans text-kit-2xs text-kit-fg-3\">\n {shortcut}\n </kbd>\n ) : undefined\n }\n />\n );\n}\n\nexport function Label({ className, ...props }: React.LabelHTMLAttributes<HTMLLabelElement>) {\n return <label className={cn(\"text-kit-sm font-medium text-kit-fg\", className)} {...props} />;\n}\n\n/**\n * Field = label row · help · control · error. CPO D39, the one help system (same spec as the Block Kit FieldShell):\n * [Label *] [hint] [i helpMore] …… [counter] [actions]\n * help: 12/16, --fg-3 (≥4.5:1 light + dark), 4px under the label, 1–2 lines\n * control\n * error: replaces the help, danger colour, under the control\n * The control gets `aria-describedby` → help + ⓘ text + error.\n * Required marker is V2 ui/input.tsx:249 (--danger-fg); the sr-only \"(required)\" names it for screen readers.\n */\nexport function Field({\n label,\n htmlFor,\n hint,\n help,\n helpMore,\n error,\n required,\n counter,\n actions,\n children,\n className,\n}: {\n label?: React.ReactNode;\n htmlFor?: string;\n /** short, quiet aside on the label row (\"Optional\", \"Shown publicly\") */\n hint?: React.ReactNode;\n /** the help line under the label */\n help?: React.ReactNode;\n /** longer explanation behind the ⓘ next to the label */\n helpMore?: React.ReactNode;\n error?: React.ReactNode;\n required?: boolean;\n counter?: { value: number; max: number };\n actions?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n const autoId = React.useId();\n const id = htmlFor ?? autoId;\n const helpId = `${id}-help`;\n const moreId = `${id}-more`;\n const errId = `${id}-error`;\n const describedBy = [error ? errId : help ? helpId : null, helpMore ? moreId : null].filter(Boolean).join(\" \") || undefined;\n return (\n <div className={cn(\"flex flex-col gap-1.5\", className)}>\n {label || actions || counter ? (\n <div className=\"flex min-h-5 items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-1\">\n <Label htmlFor={label ? id : undefined} className=\"flex items-center gap-1.5 text-kit-sm text-kit-fg-2\">\n {label}\n {required ? (\n <>\n <span aria-hidden className=\"text-kit-danger-fg\">*</span>\n <span className=\"sr-only\">(required)</span>\n </>\n ) : null}\n {hint ? <span className=\"font-normal text-kit-fg-3\">{hint}</span> : null}\n </Label>\n {helpMore ? (\n <HelpMore id={moreId} label={typeof label === \"string\" ? label : undefined}>\n {helpMore}\n </HelpMore>\n ) : null}\n </span>\n <div className=\"flex items-center gap-1\">\n {counter ? (\n <span\n className={cn(\n \"tabular-nums text-kit-xs\",\n counter.value > counter.max\n ? \"text-kit-danger-fg\"\n : counter.value > counter.max * 0.9\n ? \"text-kit-warning-fg\"\n : \"text-kit-fg-3\",\n )}\n >\n {counter.value}/{counter.max}\n </span>\n ) : null}\n {actions}\n </div>\n </div>\n ) : null}\n {help && !error ? (\n <p id={helpId} data-slot=\"field-help\" className=\"-mt-0.5 text-kit-xs leading-4 text-kit-fg-3\">\n {help}\n </p>\n ) : null}\n <FieldIdContext.Provider value={label ? id : undefined}>\n <FieldDescribedByContext.Provider value={describedBy}>{children}</FieldDescribedByContext.Provider>\n </FieldIdContext.Provider>\n {error ? (\n <p id={errId} role=\"alert\" className=\"text-kit-xs leading-4 text-kit-danger-fg\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** The ⓘ next to a label: longer help in a tooltip, also read by screen readers through aria-describedby (D39). */\nexport function HelpMore({ id, label, children }: { id?: string; label?: string; children: React.ReactNode }) {\n return (\n <HintTooltip content={<span className=\"block max-w-[260px] whitespace-normal font-normal leading-4\">{children}</span>}>\n <button\n type=\"button\"\n aria-label={label ? `About ${label}` : \"More about this field\"}\n className=\"hit-area inline-flex size-4 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 [--hit-size:16px] hover:text-kit-fg-2\"\n >\n <IconInfoCircle className=\"size-3.5\" stroke={1.5} aria-hidden />\n <span id={id} className=\"sr-only\">\n {children}\n </span>\n </button>\n </HintTooltip>\n );\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { cn } from "../lib/cn.js";
2
- import { KIT_SCOPE, SURFACE_RAISED } from "./surfaces.js";
2
+ import { KIT_SCOPE } from "./surfaces.js";
3
3
  import * as React from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
- //#region src/kit/ui/mode-bar.tsx
5
+ //#region src/ui/mode-bar.tsx
6
6
  /**
7
7
  * MODE BAR (D61 §3.7, shared with D58 view-as). One 36px strip that says "you are in a mode": an icon, a sentence and
8
8
  * its actions, with a polite live-region announcement. The primitive is shared; the placement is not:
@@ -16,7 +16,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
16
16
  */
17
17
  var TONE = {
18
18
  info: "border-kit-info-line bg-kit-info-soft",
19
- raised: cn("border-kit-line", SURFACE_RAISED)
19
+ raised: "border-kit-line bg-kit-surface-raised"
20
20
  };
21
21
  var ModeBar = React.forwardRef(function ModeBar({ label, icon, tone = "info", align = "center", announce, className, children, ...rest }, ref) {
22
22
  return /* @__PURE__ */ jsxs("div", {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mode-bar.js","names":[],"sources":["../../src/ui/mode-bar.tsx"],"sourcesContent":["/**\n * MODE BAR (D61 §3.7, shared with D58 view-as). One 36px strip that says \"you are in a mode\": an icon, a sentence and\n * its actions, with a polite live-region announcement. The primitive is shared; the placement is not:\n *\n * - View as (D58): app-wide, above the top bar (it changes who you are). `tone=\"info\"`, centred. Esc does not exit.\n * - Revision preview (D61): inside the editor, under its header (it changes what you are looking at).\n * `tone=\"raised\"`, start-aligned. Esc goes back to current (the host wires it).\n *\n * If both apply, both show: view-as on top. Tokens only, both themes (D56).\n * The strip sits in the app shell, outside any kit host, so its root carries the kit scope itself (like the portalled layers).\n */\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { KIT_SCOPE } from \"./surfaces\";\n\nexport type ModeBarTone = \"info\" | \"raised\";\n\nconst TONE: Record<ModeBarTone, string> = {\n info: \"border-kit-info-line bg-kit-info-soft\",\n raised: \"border-kit-line bg-kit-surface-raised\",\n};\n\nexport interface ModeBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"role\"> {\n /** the region's accessible name (\"View as\", \"Version preview\") */\n label: string;\n /** a 16px glyph, decorative */\n icon?: React.ReactNode;\n tone?: ModeBarTone;\n /** \"center\" (view-as) or \"start\" (revision preview) */\n align?: \"center\" | \"start\";\n /** polite announcement, read once when it changes */\n announce?: string;\n}\n\nexport const ModeBar = React.forwardRef<HTMLDivElement, ModeBarProps>(function ModeBar(\n { label, icon, tone = \"info\", align = \"center\", announce, className, children, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n data-mode-bar={tone}\n {...KIT_SCOPE}\n className={cn(\n \"relative flex h-9 shrink-0 items-center gap-2 border-b px-4 text-kit-sm text-kit-fg\",\n align === \"center\" ? \"justify-center\" : \"justify-start\",\n TONE[tone],\n className,\n )}\n {...rest}\n >\n <span aria-live=\"polite\" className=\"sr-only\">{announce ?? \"\"}</span>\n {icon ? <span aria-hidden className=\"flex shrink-0 text-kit-fg-2 [&>svg]:size-4\">{icon}</span> : null}\n {children}\n </div>\n );\n});\n\n/** The quiet \"·\" between parts of a mode bar sentence. */\nexport function ModeBarDot({ className }: { className?: string }) {\n return <span aria-hidden className={cn(\"text-kit-fg-3\", className)}>·</span>;\n}\n\n/** A text action in a mode bar (\"Exit\"): underlined, not a button chip. */\nexport const ModeBarLink = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(function ModeBarLink(\n { className, ...rest },\n ref,\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"shrink-0 rounded-kit-sm px-1 font-medium text-kit-fg underline decoration-kit-fg-3 underline-offset-2 hover:decoration-kit-fg\",\n className,\n )}\n {...rest}\n />\n );\n});\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,IAAM,OAAoC;CACxC,MAAM;CACN,QAAQ;AACV;AAcA,IAAa,UAAU,MAAM,WAAyC,SAAS,QAC7E,EAAE,OAAO,MAAM,OAAO,QAAQ,QAAQ,UAAU,UAAU,WAAW,UAAU,GAAG,QAClF,KACA;CACA,OACE,qBAAC,OAAD;EACO;EACL,MAAK;EACL,cAAY;EACZ,iBAAe;EACf,GAAI;EACJ,WAAW,GACT,uFACA,UAAU,WAAW,mBAAmB,iBACxC,KAAK,OACL,SACF;EACA,GAAI;EAZN,UAAA;GAcE,oBAAC,QAAD;IAAM,aAAU;IAAS,WAAU;IAAW,UAAA,YAAY;GAAS,CAAA;GAClE,OAAO,oBAAC,QAAD;IAAM,eAAA;IAAY,WAAU;IAA8C,UAAA;GAAW,CAAA,IAAI;GAChG;EACE;;AAET,CAAC;;AAGD,SAAgB,WAAW,EAAE,aAAqC;CAChE,OAAO,oBAAC,QAAD;EAAM,eAAA;EAAY,WAAW,GAAG,iBAAiB,SAAS;EAAG,UAAA;CAAO,CAAA;AAC7E;;AAGA,IAAa,cAAc,MAAM,WAA6E,SAAS,YACrH,EAAE,WAAW,GAAG,QAChB,KACA;CACA,OACE,oBAAC,UAAD;EACO;EACL,MAAK;EACL,WAAW,GACT,iIACA,SACF;EACA,GAAI;CACL,CAAA;AAEL,CAAC"}
@@ -38,7 +38,7 @@ export declare function PopoverContent({ className, align, side, sideOffset, kee
38
38
  * back on close, and a mouse-down inside it never blurs the input (text fields inside the popup still focus). */
39
39
  keepFocus?: boolean;
40
40
  }): import("react/jsx-runtime").JSX.Element;
41
- export declare const HoverCard: typeof PreviewCardPrimitive.Root;
41
+ export declare const HoverCard: <Payload>(props: PreviewCardPrimitive.Root.Props<Payload>) => React.JSX.Element;
42
42
  export declare const HoverCardTrigger: PreviewCardPrimitive.Trigger;
43
43
  export declare function HoverCardContent({ className, ...props }: Cls<PreviewCardPrimitive.Popup.Props>): import("react/jsx-runtime").JSX.Element;
44
44
  /** Arrowing past the last item stays put (loopFocus false), like V2's Radix menus. */
@@ -47,10 +47,12 @@ export declare const MenuTrigger: MenuPrimitive.Trigger;
47
47
  export declare const MenuGroup: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").ContextMenuGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
48
48
  export declare const MenuSub: typeof MenuPrimitive.SubmenuRoot;
49
49
  export declare const MenuRadioGroup: React.NamedExoticComponent<Omit<import("@base-ui/react").ContextMenuRadioGroupProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
50
- export declare function MenuContent({ className, align, side, sideOffset, ...props }: Cls<MenuPrimitive.Popup.Props> & {
50
+ export declare function MenuContent({ className, align, side, sideOffset, positionerClassName, ...props }: Cls<MenuPrimitive.Popup.Props> & {
51
51
  align?: "start" | "center" | "end";
52
52
  side?: "top" | "bottom" | "left" | "right";
53
53
  sideOffset?: number;
54
+ /** The layer: a menu opened from a dashboard dialog (z --z-modal) passes `z-[var(--z-dropdown)]`, or it opens behind it. */
55
+ positionerClassName?: string;
54
56
  }): import("react/jsx-runtime").JSX.Element;
55
57
  export declare function MenuItem({ className, icon, shortcut, danger, children, ...props }: Cls<MenuPrimitive.Item.Props> & {
56
58
  icon?: React.ReactNode;
@@ -97,14 +99,84 @@ export declare function ModalHeader({ title, description, className, children, }
97
99
  }): import("react/jsx-runtime").JSX.Element;
98
100
  export declare function ModalBody({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
99
101
  export declare function ModalFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
102
+ declare const flowWidths: {
103
+ md: string;
104
+ lg: string;
105
+ xl: string;
106
+ "2xl": string;
107
+ };
108
+ export declare function FlowModal({ open, onOpenChange, size, height, locked, children, className, }: {
109
+ open: boolean;
110
+ onOpenChange: (v: boolean) => void;
111
+ size?: keyof typeof flowWidths;
112
+ /** fixed = stable height for multi-step flows; auto = hug content */
113
+ height?: "fixed" | "auto" | "tall";
114
+ /** while true, outside-click / escape / the close button do nothing (a run is in progress) */
115
+ locked?: boolean;
116
+ children: React.ReactNode;
117
+ className?: string;
118
+ }): import("react/jsx-runtime").JSX.Element;
119
+ export declare function FlowClose({ disabled }: {
120
+ disabled?: boolean;
121
+ }): import("react/jsx-runtime").JSX.Element;
122
+ export declare function FlowHeader({ title, description, icon, status, right, children, className, closeDisabled, }: {
123
+ title: React.ReactNode;
124
+ description?: React.ReactNode;
125
+ icon?: React.ReactNode;
126
+ status?: React.ReactNode;
127
+ right?: React.ReactNode;
128
+ children?: React.ReactNode;
129
+ className?: string;
130
+ closeDisabled?: boolean;
131
+ }): import("react/jsx-runtime").JSX.Element;
132
+ /** Status chip used in flow headers ("Ready to publish" with a green dot). */
133
+ export declare function HeaderStatus({ tone, children, pulse, }: {
134
+ tone?: "success" | "warning" | "danger" | "info" | "accent" | "neutral";
135
+ children: React.ReactNode;
136
+ pulse?: boolean;
137
+ }): import("react/jsx-runtime").JSX.Element;
138
+ export declare function FlowBody({ className, children }: {
139
+ className?: string;
140
+ children: React.ReactNode;
141
+ }): import("react/jsx-runtime").JSX.Element;
142
+ export declare function FlowFooter({ left, children, className }: {
143
+ left?: React.ReactNode;
144
+ children?: React.ReactNode;
145
+ className?: string;
146
+ }): import("react/jsx-runtime").JSX.Element;
147
+ /** Small uppercase-free section label used inside flow bodies. */
148
+ export declare function FlowLabel({ children, right, className }: {
149
+ children: React.ReactNode;
150
+ right?: React.ReactNode;
151
+ className?: string;
152
+ }): import("react/jsx-runtime").JSX.Element;
153
+ /** Radio-like option row (Figma "Publish scope" / "When" rows). */
154
+ export declare function OptionRow({ selected, onSelect, title, description, right, disabled, children, className, }: {
155
+ selected: boolean;
156
+ onSelect: () => void;
157
+ title: React.ReactNode;
158
+ description?: React.ReactNode;
159
+ right?: React.ReactNode;
160
+ disabled?: boolean;
161
+ children?: React.ReactNode;
162
+ className?: string;
163
+ }): import("react/jsx-runtime").JSX.Element;
164
+ /** Progressive disclosure: advanced choices tucked behind "More options" (CPO D6). */
165
+ export declare function MoreOptions({ children, label, summary, defaultOpen, className, }: {
166
+ children: React.ReactNode;
167
+ label?: string;
168
+ summary?: React.ReactNode;
169
+ defaultOpen?: boolean;
170
+ className?: string;
171
+ }): import("react/jsx-runtime").JSX.Element;
100
172
  /** A sheet is a dialog that slides in from an edge: open it with Sheet (= Modal) and its trigger. */
101
173
  export declare const Sheet: typeof Modal;
102
174
  export declare const SheetTrigger: DialogPrimitive.Trigger;
103
175
  export declare const SheetClose: React.ForwardRefExoticComponent<Omit<import("@base-ui/react").AlertDialogCloseProps, "ref"> & React.RefAttributes<HTMLButtonElement>>;
104
176
  declare const sheetSides: {
105
- readonly right: "inset-y-0 right-0 border-l data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]";
106
- readonly left: "inset-y-0 left-0 border-r data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]";
107
- readonly bottom: "inset-x-0 bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]";
177
+ readonly right: "right-0 border-l border-kit-line data-[open]:animate-[kit-sheet-in-r_260ms_var(--kit-ease-out-soft)]";
178
+ readonly left: "left-0 border-r border-kit-line data-[open]:animate-[kit-sheet-in-l_260ms_var(--kit-ease-out-soft)]";
179
+ readonly bottom: "inset-x-0 inset-y-auto bottom-0 h-[52%] overflow-hidden rounded-t-kit-2xl border-t border-kit-line data-[open]:animate-[kit-sheet-in-b_300ms_cubic-bezier(0.32,0.72,0,1)]";
108
180
  };
109
181
  export declare function SheetContent({ className, side, children, width, label, noScrim, finalFocus, ref, style, backdropClassName, keepMounted, ...props }: Cls<DialogPrimitive.Popup.Props> & {
110
182
  side?: keyof typeof sheetSides;