@bettercms-ai/kit 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (947) hide show
  1. package/_virtual/_rolldown/runtime.js +13 -0
  2. package/adapters/icons.d.ts +15 -0
  3. package/adapters/icons.js +27 -0
  4. package/adapters/icons.js.map +1 -0
  5. package/adapters/lossy.d.ts +267 -0
  6. package/adapters/lossy.js +233 -0
  7. package/adapters/lossy.js.map +1 -0
  8. package/adapters/prod-types.d.ts +468 -0
  9. package/adapters/prod-types.js +646 -0
  10. package/adapters/prod-types.js.map +1 -0
  11. package/adapters/schema.d.ts +115 -0
  12. package/adapters/schema.js +2203 -0
  13. package/adapters/schema.js.map +1 -0
  14. package/adapters/values.d.ts +200 -0
  15. package/adapters/values.js +553 -0
  16. package/adapters/values.js.map +1 -0
  17. package/brand/logo.d.ts +17 -0
  18. package/brand/logo.js +9 -0
  19. package/brand/logo.js.map +1 -0
  20. package/context.d.ts +269 -0
  21. package/context.js +214 -0
  22. package/context.js.map +1 -0
  23. package/controls/button.d.ts +58 -0
  24. package/controls/button.js +507 -0
  25. package/controls/button.js.map +1 -0
  26. package/controls/c1.d.ts +11 -0
  27. package/controls/c1.js +24 -0
  28. package/controls/c1.js.map +1 -0
  29. package/controls/c2.d.ts +10 -0
  30. package/controls/c2.js +19 -0
  31. package/controls/c2.js.map +1 -0
  32. package/controls/choice.d.ts +39 -0
  33. package/controls/choice.js +410 -0
  34. package/controls/choice.js.map +1 -0
  35. package/controls/code-register.d.ts +1 -0
  36. package/controls/code-register.js +8 -0
  37. package/controls/code-register.js.map +1 -0
  38. package/controls/code.d.ts +42 -0
  39. package/controls/code.js +396 -0
  40. package/controls/code.js.map +1 -0
  41. package/controls/color.d.ts +5 -0
  42. package/controls/color.js +130 -0
  43. package/controls/color.js.map +1 -0
  44. package/controls/component-services.d.ts +114 -0
  45. package/controls/date-register.d.ts +1 -0
  46. package/controls/date-register.js +9 -0
  47. package/controls/date-register.js.map +1 -0
  48. package/controls/date-zone.d.ts +104 -0
  49. package/controls/date-zone.js +272 -0
  50. package/controls/date-zone.js.map +1 -0
  51. package/controls/date.d.ts +7 -0
  52. package/controls/date.js +458 -0
  53. package/controls/date.js.map +1 -0
  54. package/controls/form-picker-register.d.ts +1 -0
  55. package/controls/form-picker-register.js +19 -0
  56. package/controls/form-picker-register.js.map +1 -0
  57. package/controls/form-picker.d.ts +43 -0
  58. package/controls/form-picker.js +83 -0
  59. package/controls/form-picker.js.map +1 -0
  60. package/controls/icon-register.d.ts +1 -0
  61. package/controls/icon-register.js +8 -0
  62. package/controls/icon-register.js.map +1 -0
  63. package/controls/icon.d.ts +38 -0
  64. package/controls/icon.js +355 -0
  65. package/controls/icon.js.map +1 -0
  66. package/controls/index.d.ts +5 -0
  67. package/controls/index.js +37 -0
  68. package/controls/index.js.map +1 -0
  69. package/controls/json-register.d.ts +1 -0
  70. package/controls/json-register.js +8 -0
  71. package/controls/json-register.js.map +1 -0
  72. package/controls/json.d.ts +2 -0
  73. package/controls/json.js +72 -0
  74. package/controls/json.js.map +1 -0
  75. package/controls/link.d.ts +260 -0
  76. package/controls/link.js +1186 -0
  77. package/controls/link.js.map +1 -0
  78. package/controls/location-register.d.ts +1 -0
  79. package/controls/location-register.js +8 -0
  80. package/controls/location-register.js.map +1 -0
  81. package/controls/location.d.ts +16 -0
  82. package/controls/location.js +197 -0
  83. package/controls/location.js.map +1 -0
  84. package/controls/media-register.d.ts +1 -0
  85. package/controls/media-register.js +12 -0
  86. package/controls/media-register.js.map +1 -0
  87. package/controls/media-services.d.ts +40 -0
  88. package/controls/media.d.ts +73 -0
  89. package/controls/media.js +1076 -0
  90. package/controls/media.js.map +1 -0
  91. package/controls/number.d.ts +22 -0
  92. package/controls/number.js +195 -0
  93. package/controls/number.js.map +1 -0
  94. package/controls/reference-register.d.ts +1 -0
  95. package/controls/reference-register.js +10 -0
  96. package/controls/reference-register.js.map +1 -0
  97. package/controls/reference-services.d.ts +54 -0
  98. package/controls/reference.d.ts +23 -0
  99. package/controls/reference.js +761 -0
  100. package/controls/reference.js.map +1 -0
  101. package/controls/rich-text/blocks.d.ts +28 -0
  102. package/controls/rich-text/blocks.js +1532 -0
  103. package/controls/rich-text/blocks.js.map +1 -0
  104. package/controls/rich-text/catalog.d.ts +98 -0
  105. package/controls/rich-text/catalog.js +613 -0
  106. package/controls/rich-text/catalog.js.map +1 -0
  107. package/controls/rich-text/codec.d.ts +56 -0
  108. package/controls/rich-text/codec.js +32 -0
  109. package/controls/rich-text/codec.js.map +1 -0
  110. package/controls/rich-text/component-card.d.ts +14 -0
  111. package/controls/rich-text/component-card.js +706 -0
  112. package/controls/rich-text/component-card.js.map +1 -0
  113. package/controls/rich-text/control.d.ts +21 -0
  114. package/controls/rich-text/control.js +254 -0
  115. package/controls/rich-text/control.js.map +1 -0
  116. package/controls/rich-text/dom.d.ts +190 -0
  117. package/controls/rich-text/dom.js +690 -0
  118. package/controls/rich-text/dom.js.map +1 -0
  119. package/controls/rich-text/editor.d.ts +50 -0
  120. package/controls/rich-text/editor.js +1530 -0
  121. package/controls/rich-text/editor.js.map +1 -0
  122. package/controls/rich-text/floating.d.ts +23 -0
  123. package/controls/rich-text/floating.js +137 -0
  124. package/controls/rich-text/floating.js.map +1 -0
  125. package/controls/rich-text/index.d.ts +1 -0
  126. package/controls/rich-text/index.js +12 -0
  127. package/controls/rich-text/index.js.map +1 -0
  128. package/controls/rich-text/link-form.d.ts +13 -0
  129. package/controls/rich-text/link-form.js +111 -0
  130. package/controls/rich-text/link-form.js.map +1 -0
  131. package/controls/rich-text/markdown.d.ts +6 -0
  132. package/controls/rich-text/markdown.js +179 -0
  133. package/controls/rich-text/markdown.js.map +1 -0
  134. package/controls/rich-text/ops.d.ts +35 -0
  135. package/controls/rich-text/ops.js +314 -0
  136. package/controls/rich-text/ops.js.map +1 -0
  137. package/controls/rich-text/toolbar.d.ts +85 -0
  138. package/controls/rich-text/toolbar.js +338 -0
  139. package/controls/rich-text/toolbar.js.map +1 -0
  140. package/controls/scale.d.ts +56 -0
  141. package/controls/scale.js +563 -0
  142. package/controls/scale.js.map +1 -0
  143. package/controls/slot-register.d.ts +1 -0
  144. package/controls/slot-register.js +16 -0
  145. package/controls/slot-register.js.map +1 -0
  146. package/controls/slot-services.d.ts +97 -0
  147. package/controls/slot-services.js +38 -0
  148. package/controls/slot-services.js.map +1 -0
  149. package/controls/slot.d.ts +33 -0
  150. package/controls/slot.js +348 -0
  151. package/controls/slot.js.map +1 -0
  152. package/controls/table/index.d.ts +1 -0
  153. package/controls/table/index.js +12 -0
  154. package/controls/table/index.js.map +1 -0
  155. package/controls/table/prod.d.ts +21 -0
  156. package/controls/table/prod.js +79 -0
  157. package/controls/table/prod.js.map +1 -0
  158. package/controls/table/refs.d.ts +50 -0
  159. package/controls/table/refs.js +68 -0
  160. package/controls/table/refs.js.map +1 -0
  161. package/controls/table/stored.d.ts +15 -0
  162. package/controls/table/stored.js +44 -0
  163. package/controls/table/stored.js.map +1 -0
  164. package/controls/table/table-editor.d.ts +103 -0
  165. package/controls/table/table-editor.js +2722 -0
  166. package/controls/table/table-editor.js.map +1 -0
  167. package/controls/table/table-link.d.ts +24 -0
  168. package/controls/table/table-link.js +180 -0
  169. package/controls/table/table-link.js.map +1 -0
  170. package/controls/table/table.d.ts +9 -0
  171. package/controls/table/table.js +103 -0
  172. package/controls/table/table.js.map +1 -0
  173. package/controls/text.d.ts +17 -0
  174. package/controls/text.js +287 -0
  175. package/controls/text.js.map +1 -0
  176. package/engine/array.d.ts +101 -0
  177. package/engine/array.js +893 -0
  178. package/engine/array.js.map +1 -0
  179. package/engine/bits.d.ts +24 -0
  180. package/engine/bits.js +60 -0
  181. package/engine/bits.js.map +1 -0
  182. package/engine/breadcrumb.d.ts +45 -0
  183. package/engine/breadcrumb.js +87 -0
  184. package/engine/breadcrumb.js.map +1 -0
  185. package/engine/expand.d.ts +68 -0
  186. package/engine/expand.js +170 -0
  187. package/engine/expand.js.map +1 -0
  188. package/engine/field-list.d.ts +20 -0
  189. package/engine/field-list.js +19 -0
  190. package/engine/field-list.js.map +1 -0
  191. package/engine/field-shell.d.ts +49 -0
  192. package/engine/field-shell.js +860 -0
  193. package/engine/field-shell.js.map +1 -0
  194. package/engine/frame.d.ts +120 -0
  195. package/engine/frame.js +599 -0
  196. package/engine/frame.js.map +1 -0
  197. package/engine/group-summary.d.ts +4 -0
  198. package/engine/group-summary.js +66 -0
  199. package/engine/group-summary.js.map +1 -0
  200. package/engine/grouping.d.ts +224 -0
  201. package/engine/grouping.js +824 -0
  202. package/engine/grouping.js.map +1 -0
  203. package/engine/item-list.d.ts +89 -0
  204. package/engine/item-list.js +703 -0
  205. package/engine/item-list.js.map +1 -0
  206. package/engine/kit-field.d.ts +72 -0
  207. package/engine/kit-field.js +523 -0
  208. package/engine/kit-field.js.map +1 -0
  209. package/engine/schema-form.d.ts +91 -0
  210. package/engine/schema-form.js +320 -0
  211. package/engine/schema-form.js.map +1 -0
  212. package/engine/slot.d.ts +13 -0
  213. package/engine/slot.js +226 -0
  214. package/engine/slot.js.map +1 -0
  215. package/index.d.ts +46 -0
  216. package/index.js +55 -0
  217. package/index.js.map +1 -0
  218. package/kit.css +56 -0
  219. package/lib/cn.d.ts +4 -0
  220. package/lib/cn.js +53 -0
  221. package/lib/cn.js.map +1 -0
  222. package/lib/columns.d.ts +14 -0
  223. package/lib/columns.js +27 -0
  224. package/lib/columns.js.map +1 -0
  225. package/lib/frames.d.ts +36 -0
  226. package/lib/frames.js +214 -0
  227. package/lib/frames.js.map +1 -0
  228. package/lib/icons.d.ts +16 -0
  229. package/lib/icons.js +172 -0
  230. package/lib/icons.js.map +1 -0
  231. package/lib/path.d.ts +29 -0
  232. package/lib/path.js +64 -0
  233. package/lib/path.js.map +1 -0
  234. package/lib/schema.d.ts +49 -0
  235. package/lib/schema.js +287 -0
  236. package/lib/schema.js.map +1 -0
  237. package/lib/utils.d.ts +7 -0
  238. package/lib/utils.js +37 -0
  239. package/lib/utils.js.map +1 -0
  240. package/lib/validate.d.ts +20 -0
  241. package/lib/validate.js +150 -0
  242. package/lib/validate.js.map +1 -0
  243. package/package.json +31 -59
  244. package/schema/adapters.d.ts +28 -0
  245. package/schema/adapters.js +493 -0
  246. package/schema/adapters.js.map +1 -0
  247. package/schema/help.d.ts +25 -0
  248. package/schema/help.js +54 -0
  249. package/schema/help.js.map +1 -0
  250. package/schema/scale.d.ts +69 -0
  251. package/schema/scale.js +250 -0
  252. package/schema/scale.js.map +1 -0
  253. package/schema/sources.d.ts +103 -0
  254. package/schema/sources.js +65 -0
  255. package/schema/sources.js.map +1 -0
  256. package/schema/table.d.ts +319 -0
  257. package/schema/table.js +1198 -0
  258. package/schema/table.js.map +1 -0
  259. package/schema/types.d.ts +269 -0
  260. package/schema/types.js +14 -0
  261. package/schema/types.js.map +1 -0
  262. package/types.d.ts +17 -0
  263. package/ui/action-tray.d.ts +54 -0
  264. package/ui/action-tray.js +153 -0
  265. package/ui/action-tray.js.map +1 -0
  266. package/ui/button.d.ts +57 -0
  267. package/ui/button.js +202 -0
  268. package/ui/button.js.map +1 -0
  269. package/ui/choice-switch.d.ts +36 -0
  270. package/ui/choice-switch.js +57 -0
  271. package/ui/choice-switch.js.map +1 -0
  272. package/ui/controls.d.ts +83 -0
  273. package/ui/controls.js +319 -0
  274. package/ui/controls.js.map +1 -0
  275. package/ui/display.d.ts +156 -0
  276. package/ui/display.js +444 -0
  277. package/ui/display.js.map +1 -0
  278. package/ui/expanded-editor-modal.d.ts +26 -0
  279. package/ui/expanded-editor-modal.js +140 -0
  280. package/ui/expanded-editor-modal.js.map +1 -0
  281. package/ui/field-context.d.ts +12 -0
  282. package/ui/field-context.js +23 -0
  283. package/ui/field-context.js.map +1 -0
  284. package/ui/floating-panel.d.ts +152 -0
  285. package/ui/floating-panel.js +912 -0
  286. package/ui/floating-panel.js.map +1 -0
  287. package/ui/index.d.ts +12 -0
  288. package/ui/index.js +13 -0
  289. package/ui/input.d.ts +78 -0
  290. package/ui/input.js +250 -0
  291. package/ui/input.js.map +1 -0
  292. package/ui/mode-bar.d.ts +31 -0
  293. package/ui/mode-bar.js +65 -0
  294. package/ui/mode-bar.js.map +1 -0
  295. package/ui/overlay.d.ts +123 -0
  296. package/ui/overlay.js +378 -0
  297. package/ui/overlay.js.map +1 -0
  298. package/ui/path-crumbs.d.ts +90 -0
  299. package/ui/path-crumbs.js +532 -0
  300. package/ui/path-crumbs.js.map +1 -0
  301. package/ui/presence.d.ts +16 -0
  302. package/ui/presence.js +65 -0
  303. package/ui/presence.js.map +1 -0
  304. package/ui/select.d.ts +66 -0
  305. package/ui/select.js +405 -0
  306. package/ui/select.js.map +1 -0
  307. package/ui/shortcut-hint.d.ts +14 -0
  308. package/ui/shortcut-hint.js +35 -0
  309. package/ui/shortcut-hint.js.map +1 -0
  310. package/ui/surfaces.d.ts +23 -0
  311. package/ui/surfaces.js +26 -0
  312. package/ui/surfaces.js.map +1 -0
  313. package/ui/tooltip-root.d.ts +12 -0
  314. package/ui/tooltip-root.js +76 -0
  315. package/ui/tooltip-root.js.map +1 -0
  316. package/ui/variants.d.ts +15 -0
  317. package/ui/variants.js +14 -0
  318. package/ui/variants.js.map +1 -0
  319. package/LICENSE +0 -21
  320. package/README.md +0 -27
  321. package/dist/_chunks-cjs/_visual-editing.js +0 -5898
  322. package/dist/_chunks-cjs/refractor.js +0 -22
  323. package/dist/_chunks-es/_visual-editing.mjs +0 -5904
  324. package/dist/_chunks-es/refractor.mjs +0 -25
  325. package/dist/_color.d.mts +0 -119
  326. package/dist/_color.d.ts +0 -119
  327. package/dist/_color.js +0 -1412
  328. package/dist/_color.mjs +0 -1411
  329. package/dist/_visual-editing.d.mts +0 -1126
  330. package/dist/_visual-editing.d.ts +0 -1126
  331. package/dist/_visual-editing.js +0 -30
  332. package/dist/_visual-editing.mjs +0 -30
  333. package/dist/index.d.mts +0 -3140
  334. package/dist/index.d.ts +0 -3140
  335. package/dist/index.js +0 -2036
  336. package/dist/index.mjs +0 -2044
  337. package/dist/theme.d.mts +0 -1506
  338. package/dist/theme.d.ts +0 -1506
  339. package/dist/theme.js +0 -4126
  340. package/dist/theme.mjs +0 -4126
  341. package/exports/_visual-editing.ts +0 -31
  342. package/exports/index.ts +0 -1
  343. package/exports/theme.ts +0 -1
  344. package/src/color/index.d.mts +0 -119
  345. package/src/color/index.mjs +0 -1411
  346. package/src/core/__workshop__/constants.ts +0 -293
  347. package/src/core/_compat.ts +0 -264
  348. package/src/core/components/autocomplete/__mocks__/apiStore.ts +0 -49
  349. package/src/core/components/autocomplete/__mocks__/countries.ts +0 -245
  350. package/src/core/components/autocomplete/__workshop__/async.tsx +0 -156
  351. package/src/core/components/autocomplete/__workshop__/constrainedHeight.tsx +0 -137
  352. package/src/core/components/autocomplete/__workshop__/custom.tsx +0 -89
  353. package/src/core/components/autocomplete/__workshop__/example.tsx +0 -79
  354. package/src/core/components/autocomplete/__workshop__/focusAndBlur.tsx +0 -36
  355. package/src/core/components/autocomplete/__workshop__/fullscreen.tsx +0 -294
  356. package/src/core/components/autocomplete/__workshop__/index.ts +0 -39
  357. package/src/core/components/autocomplete/__workshop__/types.ts +0 -4
  358. package/src/core/components/autocomplete/autocomplete.styles.tsx +0 -39
  359. package/src/core/components/autocomplete/autocomplete.tsx +0 -767
  360. package/src/core/components/autocomplete/autocompleteOption.tsx +0 -45
  361. package/src/core/components/autocomplete/autocompleteReducer.ts +0 -47
  362. package/src/core/components/autocomplete/constants.ts +0 -28
  363. package/src/core/components/autocomplete/index.ts +0 -2
  364. package/src/core/components/autocomplete/types.ts +0 -108
  365. package/src/core/components/breadcrumbs/__workshop__/example.tsx +0 -62
  366. package/src/core/components/breadcrumbs/__workshop__/index.ts +0 -14
  367. package/src/core/components/breadcrumbs/breadcrumbs.styles.ts +0 -18
  368. package/src/core/components/breadcrumbs/breadcrumbs.test.tsx +0 -51
  369. package/src/core/components/breadcrumbs/breadcrumbs.tsx +0 -133
  370. package/src/core/components/breadcrumbs/index.ts +0 -1
  371. package/src/core/components/dialog/__workshop__/activate.tsx +0 -134
  372. package/src/core/components/dialog/__workshop__/autoFocus.tsx +0 -29
  373. package/src/core/components/dialog/__workshop__/index.ts +0 -19
  374. package/src/core/components/dialog/__workshop__/layering.tsx +0 -41
  375. package/src/core/components/dialog/__workshop__/nested.tsx +0 -72
  376. package/src/core/components/dialog/__workshop__/onScroll.tsx +0 -39
  377. package/src/core/components/dialog/__workshop__/panes.tsx +0 -82
  378. package/src/core/components/dialog/__workshop__/position.tsx +0 -30
  379. package/src/core/components/dialog/__workshop__/props.tsx +0 -75
  380. package/src/core/components/dialog/__workshop__/provider.tsx +0 -11
  381. package/src/core/components/dialog/__workshop__/wrapped.tsx +0 -76
  382. package/src/core/components/dialog/dialog.tsx +0 -430
  383. package/src/core/components/dialog/dialogContext.ts +0 -20
  384. package/src/core/components/dialog/dialogProvider.tsx +0 -35
  385. package/src/core/components/dialog/index.ts +0 -4
  386. package/src/core/components/dialog/styles.ts +0 -77
  387. package/src/core/components/dialog/useDialog.ts +0 -11
  388. package/src/core/components/hotkeys/__workshop__/index.ts +0 -14
  389. package/src/core/components/hotkeys/__workshop__/plain.tsx +0 -9
  390. package/src/core/components/hotkeys/hotkeys.test.tsx +0 -42
  391. package/src/core/components/hotkeys/hotkeys.tsx +0 -66
  392. package/src/core/components/hotkeys/index.ts +0 -1
  393. package/src/core/components/index.ts +0 -9
  394. package/src/core/components/menu/__workshop__/asComponent.tsx +0 -45
  395. package/src/core/components/menu/__workshop__/avatarMenu.tsx +0 -51
  396. package/src/core/components/menu/__workshop__/closableMenuButton.tsx +0 -46
  397. package/src/core/components/menu/__workshop__/constrainedInBoundary.tsx +0 -134
  398. package/src/core/components/menu/__workshop__/customMenuItem.tsx +0 -45
  399. package/src/core/components/menu/__workshop__/customSelectedState.tsx +0 -39
  400. package/src/core/components/menu/__workshop__/disableFocusOnClose.tsx +0 -40
  401. package/src/core/components/menu/__workshop__/groups.tsx +0 -156
  402. package/src/core/components/menu/__workshop__/index.ts +0 -89
  403. package/src/core/components/menu/__workshop__/menuButton.tsx +0 -80
  404. package/src/core/components/menu/__workshop__/menuGroupRight.tsx +0 -58
  405. package/src/core/components/menu/__workshop__/nestedMenu.tsx +0 -22
  406. package/src/core/components/menu/__workshop__/onCloseMenuButton.tsx +0 -41
  407. package/src/core/components/menu/__workshop__/selectedItem.tsx +0 -69
  408. package/src/core/components/menu/__workshop__/shouldFocus.tsx +0 -47
  409. package/src/core/components/menu/__workshop__/tones.tsx +0 -25
  410. package/src/core/components/menu/__workshop__/withoutArrow.tsx +0 -32
  411. package/src/core/components/menu/helpers.ts +0 -82
  412. package/src/core/components/menu/index.ts +0 -5
  413. package/src/core/components/menu/menu.spacing.test.tsx +0 -63
  414. package/src/core/components/menu/menu.test.tsx +0 -125
  415. package/src/core/components/menu/menu.tsx +0 -178
  416. package/src/core/components/menu/menuButton.tsx +0 -268
  417. package/src/core/components/menu/menuContext.ts +0 -18
  418. package/src/core/components/menu/menuDivider.ts +0 -23
  419. package/src/core/components/menu/menuGroup.spacing.test.tsx +0 -63
  420. package/src/core/components/menu/menuGroup.tsx +0 -233
  421. package/src/core/components/menu/menuItem.spacing.test.tsx +0 -59
  422. package/src/core/components/menu/menuItem.tsx +0 -197
  423. package/src/core/components/menu/useMenu.ts +0 -21
  424. package/src/core/components/menu/useMenuController.ts +0 -231
  425. package/src/core/components/skeleton/__workshop__/delay.tsx +0 -70
  426. package/src/core/components/skeleton/__workshop__/index.ts +0 -11
  427. package/src/core/components/skeleton/__workshop__/skeleton.tsx +0 -64
  428. package/src/core/components/skeleton/index.ts +0 -2
  429. package/src/core/components/skeleton/skeleton.tsx +0 -57
  430. package/src/core/components/skeleton/styles.ts +0 -50
  431. package/src/core/components/skeleton/textSkeleton.tsx +0 -122
  432. package/src/core/components/tab/__workshop__/example.tsx +0 -79
  433. package/src/core/components/tab/__workshop__/index.ts +0 -14
  434. package/src/core/components/tab/index.ts +0 -3
  435. package/src/core/components/tab/tab.tsx +0 -101
  436. package/src/core/components/tab/tabList.test.tsx +0 -48
  437. package/src/core/components/tab/tabList.tsx +0 -70
  438. package/src/core/components/tab/tabPanel.tsx +0 -39
  439. package/src/core/components/toast/__workshop__/hook.tsx +0 -71
  440. package/src/core/components/toast/__workshop__/index.ts +0 -19
  441. package/src/core/components/toast/__workshop__/toast.tsx +0 -26
  442. package/src/core/components/toast/index.ts +0 -4
  443. package/src/core/components/toast/styles.ts +0 -77
  444. package/src/core/components/toast/toast.test.tsx +0 -101
  445. package/src/core/components/toast/toast.tsx +0 -198
  446. package/src/core/components/toast/toastContext.ts +0 -7
  447. package/src/core/components/toast/toastLayer.tsx +0 -51
  448. package/src/core/components/toast/toastProvider.tsx +0 -113
  449. package/src/core/components/toast/toastState.ts +0 -6
  450. package/src/core/components/toast/types.ts +0 -26
  451. package/src/core/components/toast/useToast.ts +0 -25
  452. package/src/core/components/tree/__workshop__/basic.perf.ts +0 -19
  453. package/src/core/components/tree/__workshop__/basic.tsx +0 -105
  454. package/src/core/components/tree/__workshop__/index.ts +0 -21
  455. package/src/core/components/tree/__workshop__/tabFromElement.tsx +0 -84
  456. package/src/core/components/tree/helpers.ts +0 -105
  457. package/src/core/components/tree/index.ts +0 -4
  458. package/src/core/components/tree/style.ts +0 -105
  459. package/src/core/components/tree/tree.test.tsx +0 -55
  460. package/src/core/components/tree/tree.tsx +0 -240
  461. package/src/core/components/tree/treeContext.ts +0 -10
  462. package/src/core/components/tree/treeGroup.tsx +0 -28
  463. package/src/core/components/tree/treeItem.test.tsx +0 -65
  464. package/src/core/components/tree/treeItem.tsx +0 -224
  465. package/src/core/components/tree/types.ts +0 -25
  466. package/src/core/components/tree/useTree.ts +0 -17
  467. package/src/core/constants.ts +0 -79
  468. package/src/core/helpers/animation.ts +0 -27
  469. package/src/core/helpers/element.ts +0 -55
  470. package/src/core/helpers/focus.ts +0 -100
  471. package/src/core/helpers/index.ts +0 -4
  472. package/src/core/helpers/scroll.ts +0 -15
  473. package/src/core/hooks/index.ts +0 -12
  474. package/src/core/hooks/useArrayProp.ts +0 -17
  475. package/src/core/hooks/useClickOutside.test.tsx +0 -482
  476. package/src/core/hooks/useClickOutside.ts +0 -118
  477. package/src/core/hooks/useClickOutsideEvent.test.tsx +0 -115
  478. package/src/core/hooks/useClickOutsideEvent.ts +0 -73
  479. package/src/core/hooks/useCustomValidity.ts +0 -13
  480. package/src/core/hooks/useDelayed.test.ts +0 -88
  481. package/src/core/hooks/useDelayedState.ts +0 -36
  482. package/src/core/hooks/useElementRect/__workshop__/example.tsx +0 -32
  483. package/src/core/hooks/useElementRect/__workshop__/index.ts +0 -14
  484. package/src/core/hooks/useElementRect/index.ts +0 -1
  485. package/src/core/hooks/useElementRect/useElementRect.ts +0 -13
  486. package/src/core/hooks/useElementSize.ts +0 -19
  487. package/src/core/hooks/useForwardedRef.ts +0 -19
  488. package/src/core/hooks/useGlobalKeyDown.ts +0 -24
  489. package/src/core/hooks/useIsomorphicEffect.ts +0 -7
  490. package/src/core/hooks/useMatchMedia.ts +0 -28
  491. package/src/core/hooks/useMediaIndex/__workshop__/index.ts +0 -14
  492. package/src/core/hooks/useMediaIndex/__workshop__/test.tsx +0 -14
  493. package/src/core/hooks/useMediaIndex/index.ts +0 -1
  494. package/src/core/hooks/useMediaIndex/useMediaIndex.test.tsx +0 -36
  495. package/src/core/hooks/useMediaIndex/useMediaIndex.ts +0 -102
  496. package/src/core/hooks/useMounted.ts +0 -15
  497. package/src/core/hooks/usePrefersDark.hydration.test.tsx +0 -56
  498. package/src/core/hooks/usePrefersDark.test.tsx +0 -19
  499. package/src/core/hooks/usePrefersDark.ts +0 -16
  500. package/src/core/hooks/usePrefersReducedMotion.hydration.test.tsx +0 -56
  501. package/src/core/hooks/usePrefersReducedMotion.test.tsx +0 -19
  502. package/src/core/hooks/usePrefersReducedMotion.ts +0 -16
  503. package/src/core/index.ts +0 -10
  504. package/src/core/lib/createGlobalScopedContext.ts +0 -36
  505. package/src/core/lib/globalScope.ts +0 -19
  506. package/src/core/lib/isRecord.ts +0 -3
  507. package/src/core/middleware/origin.ts +0 -47
  508. package/src/core/observers/elementSizeObserver.ts +0 -116
  509. package/src/core/observers/index.ts +0 -2
  510. package/src/core/observers/resizeObserver.ts +0 -9
  511. package/src/core/primitives/_selectable/index.ts +0 -1
  512. package/src/core/primitives/_selectable/selectable.tsx +0 -15
  513. package/src/core/primitives/_selectable/style.ts +0 -115
  514. package/src/core/primitives/avatar/__workshop__/asButton.tsx +0 -14
  515. package/src/core/primitives/avatar/__workshop__/index.ts +0 -29
  516. package/src/core/primitives/avatar/__workshop__/stack.tsx +0 -25
  517. package/src/core/primitives/avatar/__workshop__/withinButton.tsx +0 -63
  518. package/src/core/primitives/avatar/__workshop__/withinMenuItem.tsx +0 -70
  519. package/src/core/primitives/avatar/avatar.tsx +0 -200
  520. package/src/core/primitives/avatar/avatarCounter.tsx +0 -91
  521. package/src/core/primitives/avatar/avatarStack.tsx +0 -100
  522. package/src/core/primitives/avatar/index.ts +0 -4
  523. package/src/core/primitives/avatar/styles.ts +0 -167
  524. package/src/core/primitives/avatar/types.ts +0 -17
  525. package/src/core/primitives/badge/__workshop__/index.ts +0 -19
  526. package/src/core/primitives/badge/__workshop__/props.tsx +0 -30
  527. package/src/core/primitives/badge/__workshop__/tones.tsx +0 -21
  528. package/src/core/primitives/badge/badge.test.tsx +0 -16
  529. package/src/core/primitives/badge/badge.tsx +0 -70
  530. package/src/core/primitives/badge/index.ts +0 -1
  531. package/src/core/primitives/badge/styles.ts +0 -20
  532. package/src/core/primitives/badge/types.ts +0 -8
  533. package/src/core/primitives/box/__workshop__/asComponent.tsx +0 -31
  534. package/src/core/primitives/box/__workshop__/index.ts +0 -24
  535. package/src/core/primitives/box/__workshop__/props.tsx +0 -20
  536. package/src/core/primitives/box/__workshop__/responsive.tsx +0 -20
  537. package/src/core/primitives/box/box.test.tsx +0 -142
  538. package/src/core/primitives/box/box.tsx +0 -154
  539. package/src/core/primitives/box/index.ts +0 -1
  540. package/src/core/primitives/button/__workshop__/custom.tsx +0 -51
  541. package/src/core/primitives/button/__workshop__/customIcons.tsx +0 -30
  542. package/src/core/primitives/button/__workshop__/disabled.tsx +0 -74
  543. package/src/core/primitives/button/__workshop__/index.ts +0 -59
  544. package/src/core/primitives/button/__workshop__/labelUploadButton.tsx +0 -36
  545. package/src/core/primitives/button/__workshop__/mixedChildren.tsx +0 -12
  546. package/src/core/primitives/button/__workshop__/props.tsx +0 -55
  547. package/src/core/primitives/button/__workshop__/stacked.tsx +0 -58
  548. package/src/core/primitives/button/__workshop__/styled1.tsx +0 -17
  549. package/src/core/primitives/button/__workshop__/styled2.tsx +0 -19
  550. package/src/core/primitives/button/__workshop__/uploadButton.tsx +0 -28
  551. package/src/core/primitives/button/button.test.tsx +0 -82
  552. package/src/core/primitives/button/button.tsx +0 -210
  553. package/src/core/primitives/button/index.ts +0 -1
  554. package/src/core/primitives/button/styles.ts +0 -117
  555. package/src/core/primitives/card/__workshop__/allTones.tsx +0 -25
  556. package/src/core/primitives/card/__workshop__/asButton.tsx +0 -107
  557. package/src/core/primitives/card/__workshop__/asComponent.tsx +0 -27
  558. package/src/core/primitives/card/__workshop__/checkered.tsx +0 -26
  559. package/src/core/primitives/card/__workshop__/index.ts +0 -18
  560. package/src/core/primitives/card/__workshop__/interactive.tsx +0 -30
  561. package/src/core/primitives/card/__workshop__/listNavigation.tsx +0 -80
  562. package/src/core/primitives/card/__workshop__/props.tsx +0 -53
  563. package/src/core/primitives/card/__workshop__/selected.tsx +0 -94
  564. package/src/core/primitives/card/__workshop__/styled.tsx +0 -14
  565. package/src/core/primitives/card/card.tsx +0 -128
  566. package/src/core/primitives/card/index.ts +0 -2
  567. package/src/core/primitives/card/styles.ts +0 -147
  568. package/src/core/primitives/card/types.ts +0 -11
  569. package/src/core/primitives/checkbox/__workshop__/example.tsx +0 -25
  570. package/src/core/primitives/checkbox/__workshop__/index.ts +0 -13
  571. package/src/core/primitives/checkbox/__workshop__/props.tsx +0 -33
  572. package/src/core/primitives/checkbox/__workshop__/readOnly.tsx +0 -16
  573. package/src/core/primitives/checkbox/__workshop__/tones.tsx +0 -28
  574. package/src/core/primitives/checkbox/checkbox.tsx +0 -73
  575. package/src/core/primitives/checkbox/index.ts +0 -1
  576. package/src/core/primitives/checkbox/styles.ts +0 -128
  577. package/src/core/primitives/code/__workshop__/index.ts +0 -19
  578. package/src/core/primitives/code/__workshop__/opticalAlignment.tsx +0 -48
  579. package/src/core/primitives/code/__workshop__/props.tsx +0 -21
  580. package/src/core/primitives/code/code.tsx +0 -55
  581. package/src/core/primitives/code/index.ts +0 -1
  582. package/src/core/primitives/code/refractor.tsx +0 -20
  583. package/src/core/primitives/code/styles.ts +0 -77
  584. package/src/core/primitives/container/__workshop__/example.tsx +0 -20
  585. package/src/core/primitives/container/__workshop__/index.ts +0 -8
  586. package/src/core/primitives/container/container.tsx +0 -54
  587. package/src/core/primitives/container/index.ts +0 -2
  588. package/src/core/primitives/container/styles.ts +0 -23
  589. package/src/core/primitives/container/types.ts +0 -6
  590. package/src/core/primitives/flex/__workshop__/example.tsx +0 -34
  591. package/src/core/primitives/flex/__workshop__/gap.tsx +0 -25
  592. package/src/core/primitives/flex/__workshop__/index.ts +0 -11
  593. package/src/core/primitives/flex/flex.tsx +0 -64
  594. package/src/core/primitives/flex/index.ts +0 -1
  595. package/src/core/primitives/grid/__workshop__/index.ts +0 -10
  596. package/src/core/primitives/grid/__workshop__/responsive.tsx +0 -54
  597. package/src/core/primitives/grid/grid.test.tsx +0 -80
  598. package/src/core/primitives/grid/grid.tsx +0 -74
  599. package/src/core/primitives/grid/index.ts +0 -1
  600. package/src/core/primitives/heading/__workshop__/index.ts +0 -19
  601. package/src/core/primitives/heading/__workshop__/opticalAlignment.tsx +0 -54
  602. package/src/core/primitives/heading/__workshop__/plain.tsx +0 -32
  603. package/src/core/primitives/heading/heading.tsx +0 -88
  604. package/src/core/primitives/heading/index.ts +0 -1
  605. package/src/core/primitives/heading/styles.ts +0 -64
  606. package/src/core/primitives/heading/types.ts +0 -7
  607. package/src/core/primitives/index.ts +0 -27
  608. package/src/core/primitives/inline/__workshop__/index.ts +0 -8
  609. package/src/core/primitives/inline/__workshop__/plain.tsx +0 -27
  610. package/src/core/primitives/inline/index.ts +0 -1
  611. package/src/core/primitives/inline/inline.test.tsx +0 -51
  612. package/src/core/primitives/inline/inline.tsx +0 -63
  613. package/src/core/primitives/inline/styles.ts +0 -32
  614. package/src/core/primitives/inline/types.ts +0 -6
  615. package/src/core/primitives/kbd/__workshop__/index.ts +0 -8
  616. package/src/core/primitives/kbd/__workshop__/plain.tsx +0 -9
  617. package/src/core/primitives/kbd/index.ts +0 -1
  618. package/src/core/primitives/kbd/kbd.tsx +0 -69
  619. package/src/core/primitives/label/__workshop__/index.ts +0 -19
  620. package/src/core/primitives/label/__workshop__/opticalAlignment.tsx +0 -48
  621. package/src/core/primitives/label/__workshop__/plain.tsx +0 -24
  622. package/src/core/primitives/label/index.ts +0 -1
  623. package/src/core/primitives/label/label.tsx +0 -87
  624. package/src/core/primitives/label/styles.ts +0 -45
  625. package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +0 -77
  626. package/src/core/primitives/popover/__workshop__/MarginsStory.tsx +0 -31
  627. package/src/core/primitives/popover/__workshop__/MatchReferenceWidthStory.tsx +0 -32
  628. package/src/core/primitives/popover/__workshop__/OpenOnMountStory.tsx +0 -11
  629. package/src/core/primitives/popover/__workshop__/PlainStory.tsx +0 -71
  630. package/src/core/primitives/popover/__workshop__/RecursiveStory.tsx +0 -71
  631. package/src/core/primitives/popover/__workshop__/SidePanelStory.tsx +0 -89
  632. package/src/core/primitives/popover/__workshop__/TestStory.tsx +0 -97
  633. package/src/core/primitives/popover/__workshop__/index.ts +0 -49
  634. package/src/core/primitives/popover/constants.ts +0 -22
  635. package/src/core/primitives/popover/floating-ui/size.ts +0 -99
  636. package/src/core/primitives/popover/helpers.ts +0 -31
  637. package/src/core/primitives/popover/index.ts +0 -2
  638. package/src/core/primitives/popover/popover.tsx +0 -511
  639. package/src/core/primitives/popover/popoverCard.tsx +0 -166
  640. package/src/core/primitives/popover/types.ts +0 -7
  641. package/src/core/primitives/radio/__workshop__/example.tsx +0 -63
  642. package/src/core/primitives/radio/__workshop__/index.ts +0 -11
  643. package/src/core/primitives/radio/__workshop__/plain.tsx +0 -28
  644. package/src/core/primitives/radio/index.ts +0 -1
  645. package/src/core/primitives/radio/radio.tsx +0 -51
  646. package/src/core/primitives/radio/styles.ts +0 -117
  647. package/src/core/primitives/select/__workshop__/index.ts +0 -11
  648. package/src/core/primitives/select/__workshop__/plain.tsx +0 -27
  649. package/src/core/primitives/select/__workshop__/readOnly.tsx +0 -23
  650. package/src/core/primitives/select/index.ts +0 -1
  651. package/src/core/primitives/select/select.test.tsx +0 -52
  652. package/src/core/primitives/select/select.tsx +0 -94
  653. package/src/core/primitives/select/styles.ts +0 -166
  654. package/src/core/primitives/spinner/__workshop__/Props.tsx +0 -15
  655. package/src/core/primitives/spinner/__workshop__/index.ts +0 -14
  656. package/src/core/primitives/spinner/index.ts +0 -1
  657. package/src/core/primitives/spinner/spinner.tsx +0 -46
  658. package/src/core/primitives/stack/__workshop__/index.ts +0 -14
  659. package/src/core/primitives/stack/__workshop__/plain.tsx +0 -32
  660. package/src/core/primitives/stack/index.ts +0 -1
  661. package/src/core/primitives/stack/stack.test.tsx +0 -57
  662. package/src/core/primitives/stack/stack.tsx +0 -57
  663. package/src/core/primitives/stack/styles.ts +0 -32
  664. package/src/core/primitives/switch/__workshop__/example.tsx +0 -23
  665. package/src/core/primitives/switch/__workshop__/index.ts +0 -11
  666. package/src/core/primitives/switch/__workshop__/props.tsx +0 -21
  667. package/src/core/primitives/switch/index.ts +0 -1
  668. package/src/core/primitives/switch/styles.ts +0 -173
  669. package/src/core/primitives/switch/switch.tsx +0 -68
  670. package/src/core/primitives/text/__workshop__/colored.tsx +0 -30
  671. package/src/core/primitives/text/__workshop__/example.tsx +0 -39
  672. package/src/core/primitives/text/__workshop__/index.ts +0 -24
  673. package/src/core/primitives/text/__workshop__/opticalAlignment.tsx +0 -48
  674. package/src/core/primitives/text/index.ts +0 -1
  675. package/src/core/primitives/text/styles.ts +0 -74
  676. package/src/core/primitives/text/text.tsx +0 -89
  677. package/src/core/primitives/textArea/__workshop__/index.ts +0 -14
  678. package/src/core/primitives/textArea/__workshop__/plain.tsx +0 -50
  679. package/src/core/primitives/textArea/index.ts +0 -1
  680. package/src/core/primitives/textArea/textArea.tsx +0 -120
  681. package/src/core/primitives/textInput/__workshop__/clearButton.tsx +0 -30
  682. package/src/core/primitives/textInput/__workshop__/customValidity.tsx +0 -17
  683. package/src/core/primitives/textInput/__workshop__/index.ts +0 -44
  684. package/src/core/primitives/textInput/__workshop__/plain.tsx +0 -98
  685. package/src/core/primitives/textInput/__workshop__/readOnly.tsx +0 -9
  686. package/src/core/primitives/textInput/__workshop__/states.tsx +0 -53
  687. package/src/core/primitives/textInput/__workshop__/tones.tsx +0 -277
  688. package/src/core/primitives/textInput/__workshop__/typed.tsx +0 -23
  689. package/src/core/primitives/textInput/index.ts +0 -1
  690. package/src/core/primitives/textInput/textInput.test.tsx +0 -48
  691. package/src/core/primitives/textInput/textInput.tsx +0 -395
  692. package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +0 -102
  693. package/src/core/primitives/tooltip/__workshop__/index.ts +0 -29
  694. package/src/core/primitives/tooltip/__workshop__/overflowingBoundary.tsx +0 -74
  695. package/src/core/primitives/tooltip/__workshop__/props.tsx +0 -107
  696. package/src/core/primitives/tooltip/__workshop__/resizableBoundary.tsx +0 -86
  697. package/src/core/primitives/tooltip/constants.ts +0 -23
  698. package/src/core/primitives/tooltip/index.ts +0 -2
  699. package/src/core/primitives/tooltip/tooltip.test.tsx +0 -452
  700. package/src/core/primitives/tooltip/tooltip.tsx +0 -495
  701. package/src/core/primitives/tooltip/tooltipCard.tsx +0 -109
  702. package/src/core/primitives/tooltip/tooltipDelayGroup/index.ts +0 -4
  703. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupContext.tsx +0 -11
  704. package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -57
  705. package/src/core/primitives/tooltip/tooltipDelayGroup/types.ts +0 -10
  706. package/src/core/primitives/tooltip/tooltipDelayGroup/useTooltipDelayGroup.ts +0 -13
  707. package/src/core/primitives/types.ts +0 -179
  708. package/src/core/styles/border/borderStyle.ts +0 -56
  709. package/src/core/styles/border/index.ts +0 -2
  710. package/src/core/styles/border/types.ts +0 -10
  711. package/src/core/styles/box/boxStyle.ts +0 -69
  712. package/src/core/styles/box/index.ts +0 -2
  713. package/src/core/styles/box/types.ts +0 -11
  714. package/src/core/styles/card/_cardColorStyle.ts +0 -108
  715. package/src/core/styles/card/index.ts +0 -1
  716. package/src/core/styles/flex/flexItemStyle.ts +0 -27
  717. package/src/core/styles/flex/flexStyle.ts +0 -70
  718. package/src/core/styles/flex/index.ts +0 -3
  719. package/src/core/styles/flex/types.ts +0 -25
  720. package/src/core/styles/focusRing/index.ts +0 -25
  721. package/src/core/styles/font/codeFontStyle.ts +0 -13
  722. package/src/core/styles/font/headingFontStyle.ts +0 -13
  723. package/src/core/styles/font/index.ts +0 -6
  724. package/src/core/styles/font/labelFontStyle.ts +0 -13
  725. package/src/core/styles/font/responsiveFont.ts +0 -103
  726. package/src/core/styles/font/textAlignStyle.ts +0 -19
  727. package/src/core/styles/font/textFontStyle.ts +0 -13
  728. package/src/core/styles/font/types.ts +0 -35
  729. package/src/core/styles/grid/gridItemStyle.ts +0 -82
  730. package/src/core/styles/grid/gridStyle.ts +0 -108
  731. package/src/core/styles/grid/index.ts +0 -3
  732. package/src/core/styles/grid/types.ts +0 -37
  733. package/src/core/styles/helpers.ts +0 -72
  734. package/src/core/styles/index.ts +0 -5
  735. package/src/core/styles/input/index.ts +0 -2
  736. package/src/core/styles/input/responsiveInputPaddingStyle.ts +0 -78
  737. package/src/core/styles/input/textInputStyle.ts +0 -263
  738. package/src/core/styles/internal.ts +0 -12
  739. package/src/core/styles/margin/index.ts +0 -2
  740. package/src/core/styles/margin/marginStyle.ts +0 -21
  741. package/src/core/styles/margin/marginsStyle.test.ts +0 -33
  742. package/src/core/styles/margin/types.ts +0 -9
  743. package/src/core/styles/padding/index.ts +0 -2
  744. package/src/core/styles/padding/paddingStyle.test.ts +0 -33
  745. package/src/core/styles/padding/paddingStyle.ts +0 -21
  746. package/src/core/styles/padding/types.ts +0 -12
  747. package/src/core/styles/radius/index.ts +0 -2
  748. package/src/core/styles/radius/radiusStyle.ts +0 -23
  749. package/src/core/styles/radius/types.ts +0 -8
  750. package/src/core/styles/shadow/index.ts +0 -2
  751. package/src/core/styles/shadow/shadowStyle.ts +0 -29
  752. package/src/core/styles/shadow/types.ts +0 -6
  753. package/src/core/styles/types.ts +0 -8
  754. package/src/core/theme/__workshop__/build/Root.tsx +0 -367
  755. package/src/core/theme/__workshop__/build/helpers.ts +0 -46
  756. package/src/core/theme/__workshop__/build/story.tsx +0 -465
  757. package/src/core/theme/__workshop__/canvas.tsx +0 -352
  758. package/src/core/theme/__workshop__/color.tsx +0 -62
  759. package/src/core/theme/__workshop__/debug/story.tsx +0 -408
  760. package/src/core/theme/__workshop__/index.ts +0 -39
  761. package/src/core/theme/__workshop__/layer.tsx +0 -78
  762. package/src/core/theme/__workshop__/nestedProvider.tsx +0 -15
  763. package/src/core/theme/index.ts +0 -5
  764. package/src/core/theme/theme.test.tsx +0 -73
  765. package/src/core/theme/themeColorProvider.tsx +0 -29
  766. package/src/core/theme/themeContext.ts +0 -10
  767. package/src/core/theme/themeProvider.tsx +0 -62
  768. package/src/core/theme/types.ts +0 -12
  769. package/src/core/theme/useRootTheme.ts +0 -17
  770. package/src/core/theme/useTheme.ts +0 -16
  771. package/src/core/types/avatar.ts +0 -14
  772. package/src/core/types/badge.ts +0 -12
  773. package/src/core/types/box.ts +0 -19
  774. package/src/core/types/button.ts +0 -21
  775. package/src/core/types/card.ts +0 -6
  776. package/src/core/types/component.ts +0 -32
  777. package/src/core/types/dialog.ts +0 -4
  778. package/src/core/types/flex.ts +0 -30
  779. package/src/core/types/grid.ts +0 -14
  780. package/src/core/types/gridItem.ts +0 -29
  781. package/src/core/types/index.ts +0 -15
  782. package/src/core/types/placement.ts +0 -18
  783. package/src/core/types/popover.ts +0 -4
  784. package/src/core/types/radius.ts +0 -4
  785. package/src/core/types/selectable.ts +0 -6
  786. package/src/core/types/text.ts +0 -4
  787. package/src/core/utils/arrow/arrow.tsx +0 -123
  788. package/src/core/utils/arrow/cmds.ts +0 -91
  789. package/src/core/utils/arrow/index.ts +0 -1
  790. package/src/core/utils/boundaryElement/__workshop__/index.ts +0 -14
  791. package/src/core/utils/boundaryElement/__workshop__/plain.tsx +0 -19
  792. package/src/core/utils/boundaryElement/boundaryElement.test.tsx +0 -100
  793. package/src/core/utils/boundaryElement/boundaryElementContext.ts +0 -7
  794. package/src/core/utils/boundaryElement/boundaryElementProvider.tsx +0 -24
  795. package/src/core/utils/boundaryElement/index.ts +0 -3
  796. package/src/core/utils/boundaryElement/types.ts +0 -7
  797. package/src/core/utils/boundaryElement/useBoundaryElement.ts +0 -26
  798. package/src/core/utils/conditionalWrapper/conditionalWrapper.tsx +0 -21
  799. package/src/core/utils/conditionalWrapper/index.ts +0 -1
  800. package/src/core/utils/elementQuery/__workshop__/customMedia.tsx +0 -30
  801. package/src/core/utils/elementQuery/__workshop__/index.ts +0 -14
  802. package/src/core/utils/elementQuery/elementQuery.tsx +0 -53
  803. package/src/core/utils/elementQuery/helpers.ts +0 -27
  804. package/src/core/utils/elementQuery/index.ts +0 -1
  805. package/src/core/utils/errorBoundary.tsx +0 -48
  806. package/src/core/utils/getElementRef.ts +0 -26
  807. package/src/core/utils/index.ts +0 -9
  808. package/src/core/utils/layer/__workshop__/_debug.tsx +0 -17
  809. package/src/core/utils/layer/__workshop__/index.ts +0 -24
  810. package/src/core/utils/layer/__workshop__/multipleRoots.tsx +0 -49
  811. package/src/core/utils/layer/__workshop__/nested.tsx +0 -98
  812. package/src/core/utils/layer/__workshop__/responsiveZOffset.tsx +0 -13
  813. package/src/core/utils/layer/getLayerContext.test.ts +0 -30
  814. package/src/core/utils/layer/getLayerContext.ts +0 -21
  815. package/src/core/utils/layer/index.ts +0 -4
  816. package/src/core/utils/layer/layer.test.tsx +0 -108
  817. package/src/core/utils/layer/layer.tsx +0 -98
  818. package/src/core/utils/layer/layerContext.ts +0 -7
  819. package/src/core/utils/layer/layerProvider.tsx +0 -111
  820. package/src/core/utils/layer/types.ts +0 -9
  821. package/src/core/utils/layer/useLayer.ts +0 -26
  822. package/src/core/utils/portal/__workshop__/index.ts +0 -14
  823. package/src/core/utils/portal/__workshop__/named.tsx +0 -63
  824. package/src/core/utils/portal/index.ts +0 -4
  825. package/src/core/utils/portal/portal.test.tsx +0 -103
  826. package/src/core/utils/portal/portal.ts +0 -32
  827. package/src/core/utils/portal/portalContext.ts +0 -31
  828. package/src/core/utils/portal/portalProvider.tsx +0 -47
  829. package/src/core/utils/portal/types.ts +0 -9
  830. package/src/core/utils/portal/usePortal.ts +0 -25
  831. package/src/core/utils/spanWithTextOverflow.tsx +0 -10
  832. package/src/core/utils/srOnly/index.ts +0 -1
  833. package/src/core/utils/srOnly/srOnly.tsx +0 -36
  834. package/src/core/utils/virtualList/__workshop__/changingProps.tsx +0 -36
  835. package/src/core/utils/virtualList/__workshop__/elementScroll.tsx +0 -24
  836. package/src/core/utils/virtualList/__workshop__/index.ts +0 -29
  837. package/src/core/utils/virtualList/__workshop__/infiniteList.tsx +0 -48
  838. package/src/core/utils/virtualList/__workshop__/windowScrolll.tsx +0 -22
  839. package/src/core/utils/virtualList/index.ts +0 -1
  840. package/src/core/utils/virtualList/virtualList.tsx +0 -200
  841. package/src/theme/build/_deprecated/color/_selectable/createSelectableTones.ts +0 -76
  842. package/src/theme/build/_deprecated/color/_solid/createSolidTones.ts +0 -54
  843. package/src/theme/build/_deprecated/color/button/createButtonModes.ts +0 -22
  844. package/src/theme/build/_deprecated/color/button/createButtonTones.ts +0 -55
  845. package/src/theme/build/_deprecated/color/card/createCardStates.ts +0 -60
  846. package/src/theme/build/_deprecated/color/color.test.ts +0 -63
  847. package/src/theme/build/_deprecated/color/defaults.ts +0 -390
  848. package/src/theme/build/_deprecated/color/factory.ts +0 -142
  849. package/src/theme/build/_deprecated/color/index.ts +0 -1
  850. package/src/theme/build/_deprecated/color/input/createInputModes.ts +0 -81
  851. package/src/theme/build/_deprecated/color/muted/createMuted.ts +0 -54
  852. package/src/theme/build/_deprecated/color/spot/createSpot.ts +0 -20
  853. package/src/theme/build/buildColorTheme.test.ts +0 -183
  854. package/src/theme/build/buildColorTheme.ts +0 -499
  855. package/src/theme/build/buildTheme.test.ts +0 -87
  856. package/src/theme/build/buildTheme.ts +0 -36
  857. package/src/theme/build/colorToken/colorToken.ts +0 -19
  858. package/src/theme/build/colorToken/compileColorToken.ts +0 -21
  859. package/src/theme/build/colorToken/index.ts +0 -2
  860. package/src/theme/build/colorToken/types.ts +0 -6
  861. package/src/theme/build/index.ts +0 -3
  862. package/src/theme/build/lib/color-fns/blend/index.ts +0 -3
  863. package/src/theme/build/lib/color-fns/blend/mix.ts +0 -21
  864. package/src/theme/build/lib/color-fns/blend/multiply.ts +0 -18
  865. package/src/theme/build/lib/color-fns/blend/screen.ts +0 -18
  866. package/src/theme/build/lib/color-fns/color-fns.test.ts +0 -68
  867. package/src/theme/build/lib/color-fns/contrastRatio.ts +0 -31
  868. package/src/theme/build/lib/color-fns/convert.ts +0 -150
  869. package/src/theme/build/lib/color-fns/index.ts +0 -6
  870. package/src/theme/build/lib/color-fns/parse.ts +0 -60
  871. package/src/theme/build/lib/color-fns/rgba.ts +0 -10
  872. package/src/theme/build/lib/color-fns/types.ts +0 -28
  873. package/src/theme/build/lib/isRecord.ts +0 -3
  874. package/src/theme/build/lib/lazy.ts +0 -30
  875. package/src/theme/build/lib/utils.ts +0 -19
  876. package/src/theme/build/merge.ts +0 -26
  877. package/src/theme/build/mixThemeColor.test.ts +0 -21
  878. package/src/theme/build/mixThemeColor.ts +0 -53
  879. package/src/theme/build/renderColorTheme.ts +0 -532
  880. package/src/theme/build/renderColorValue.ts +0 -85
  881. package/src/theme/build/resolveColorTokens.ts +0 -268
  882. package/src/theme/build/theme.test.ts +0 -27
  883. package/src/theme/config/helpers.ts +0 -55
  884. package/src/theme/config/index.ts +0 -4
  885. package/src/theme/config/system.ts +0 -115
  886. package/src/theme/config/tokens/color/index.ts +0 -1
  887. package/src/theme/config/tokens/color/types.ts +0 -133
  888. package/src/theme/config/tokens/index.ts +0 -4
  889. package/src/theme/config/tokens/parseTokenKey.test.ts +0 -64
  890. package/src/theme/config/tokens/parseTokenKey.ts +0 -67
  891. package/src/theme/config/tokens/parseTokenValue.test.ts +0 -42
  892. package/src/theme/config/tokens/parseTokenValue.ts +0 -133
  893. package/src/theme/config/tokens/types.ts +0 -53
  894. package/src/theme/config/types.ts +0 -46
  895. package/src/theme/defaults/colorPalette.ts +0 -5
  896. package/src/theme/defaults/colorTokens.ts +0 -648
  897. package/src/theme/defaults/config.ts +0 -84
  898. package/src/theme/defaults/fonts.ts +0 -227
  899. package/src/theme/getScopedTheme.ts +0 -98
  900. package/src/theme/index.ts +0 -5
  901. package/src/theme/system/avatar.ts +0 -14
  902. package/src/theme/system/color/_constants.ts +0 -45
  903. package/src/theme/system/color/_helpers.ts +0 -24
  904. package/src/theme/system/color/_system.ts +0 -40
  905. package/src/theme/system/color/avatar.ts +0 -15
  906. package/src/theme/system/color/badge.ts +0 -16
  907. package/src/theme/system/color/button.ts +0 -17
  908. package/src/theme/system/color/color.ts +0 -34
  909. package/src/theme/system/color/index.ts +0 -13
  910. package/src/theme/system/color/input.ts +0 -25
  911. package/src/theme/system/color/kbd.ts +0 -8
  912. package/src/theme/system/color/selectable.ts +0 -12
  913. package/src/theme/system/color/shadow.ts +0 -7
  914. package/src/theme/system/color/state.ts +0 -43
  915. package/src/theme/system/color/syntax.ts +0 -41
  916. package/src/theme/system/css.ts +0 -14
  917. package/src/theme/system/focusRing.ts +0 -7
  918. package/src/theme/system/font.ts +0 -52
  919. package/src/theme/system/index.ts +0 -11
  920. package/src/theme/system/input.ts +0 -33
  921. package/src/theme/system/layer.ts +0 -8
  922. package/src/theme/system/shadow.ts +0 -19
  923. package/src/theme/system/styles.ts +0 -13
  924. package/src/theme/system/theme.ts +0 -138
  925. package/src/theme/system/v0/avatar.ts +0 -10
  926. package/src/theme/system/v0/color/_generic.ts +0 -35
  927. package/src/theme/system/v0/color/_system.ts +0 -17
  928. package/src/theme/system/v0/color/base.ts +0 -21
  929. package/src/theme/system/v0/color/button.ts +0 -42
  930. package/src/theme/system/v0/color/card.ts +0 -19
  931. package/src/theme/system/v0/color/color.ts +0 -40
  932. package/src/theme/system/v0/color/index.ts +0 -11
  933. package/src/theme/system/v0/color/input.ts +0 -34
  934. package/src/theme/system/v0/color/muted.ts +0 -26
  935. package/src/theme/system/v0/color/selectable.ts +0 -31
  936. package/src/theme/system/v0/color/solid.ts +0 -26
  937. package/src/theme/system/v0/color/spot.ts +0 -13
  938. package/src/theme/system/v0/index.ts +0 -3
  939. package/src/theme/system/v0/input.ts +0 -23
  940. package/src/theme/versioning/getTheme_v2.ts +0 -57
  941. package/src/theme/versioning/index.ts +0 -5
  942. package/src/theme/versioning/is_v0.ts +0 -6
  943. package/src/theme/versioning/is_v2.ts +0 -6
  944. package/src/theme/versioning/themeColor_v0_v2.ts +0 -243
  945. package/src/theme/versioning/themeColor_v2_v2_9.ts +0 -49
  946. package/src/theme/versioning/v0_v2.ts +0 -94
  947. package/src/theme/versioning/v2_v0.ts +0 -135
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating-panel.js","names":[],"sources":["../../src/kit/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 { FLOATING_LINE, KIT_SCOPE, SURFACE_RAISED } from \"./surfaces\";\n\n/* V2 --shadow-sheet-r / --shadow-sheet-b, light and dark (kit.css has no sheet shadows yet). */\nconst SHADOW_SHEET_R = \"shadow-[-12px_0_32px_-16px_rgb(0_0_0/0.18)] [.dark_&]:shadow-[-12px_0_32px_-16px_oklch(0.12_0.01_286/0.5)]\";\nconst SHADOW_SHEET_B = \"shadow-[0_-16px_40px_-12px_rgb(0_0_0/0.2)] [.dark_&]:shadow-[0_-16px_40px_-12px_oklch(0.12_0.01_286/0.5)]\";\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-[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])\";\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(`${POPUP_OPEN}, [data-cell-editing]`)) 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) || e.key.toLowerCase() === \"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={cn(\n \"fixed inset-x-0 bottom-0 z-[55] flex flex-col overflow-hidden rounded-t-kit-xl border-t border-kit-line pb-[env(safe-area-inset-bottom)] text-kit-fg outline-none\",\n SURFACE_RAISED,\n SHADOW_SHEET_B,\n )}\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={cn(\"fixed bottom-0 right-0 z-[55] flex flex-col border-l border-kit-line text-kit-fg outline-none\", SURFACE_RAISED, SHADOW_SHEET_R)}\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 text-kit-fg outline-none\",\n SURFACE_RAISED,\n modalFit === \"dock\"\n ? \"border-l border-kit-line\"\n : modalFit === \"overlay\"\n ? cn(\"rounded-kit-xl border shadow-kit-lg\", FLOATING_LINE)\n : cn(\"rounded-t-kit-xl border-t border-kit-line\", SHADOW_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 text-kit-fg shadow-kit-xl outline-none\",\n SURFACE_RAISED,\n // floating = level 2: --line in light, the stronger hairline in dark (DARK_MODE §5)\n kbd ? \"border-dashed border-[var(--kit-emphasis-line)]\" : 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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"}
package/ui/index.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export * from "./button";
2
+ export * from "./input";
3
+ export * from "./controls";
4
+ export * from "./select";
5
+ export * from "./choice-switch";
6
+ export * from "./overlay";
7
+ export * from "./display";
8
+ export * from "./action-tray";
9
+ export * from "./shortcut-hint";
10
+ export * from "./expanded-editor-modal";
11
+ export * from "./presence";
12
+ export * from "./mode-bar";
package/ui/index.js ADDED
@@ -0,0 +1,13 @@
1
+ import "./field-context.js";
2
+ import "./button.js";
3
+ import "./shortcut-hint.js";
4
+ import "./controls.js";
5
+ import "./overlay.js";
6
+ import "./display.js";
7
+ import "./input.js";
8
+ import "./presence.js";
9
+ import "./select.js";
10
+ import "./expanded-editor-modal.js";
11
+ import "./choice-switch.js";
12
+ import "./action-tray.js";
13
+ import "./mode-bar.js";
package/ui/input.d.ts ADDED
@@ -0,0 +1,78 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Inputs — CPO D19: white field + 1px --field-border at rest (default "outline"), border darkens on hover, halo on focus.
4
+ * "filled" (grey, borderless) is kept only for search fields, which Figma draws grey.
5
+ * Heights follow buttons: sm 28 · md 32 · lg 36.
6
+ */
7
+ import { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy } from "./field-context";
8
+ export { FieldDescribedByContext, FieldLabelledByContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy };
9
+ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> {
10
+ size?: "sm" | "md" | "lg";
11
+ leading?: React.ReactNode;
12
+ trailing?: React.ReactNode;
13
+ variant?: "filled" | "outline";
14
+ }
15
+ export declare const Input: React.ForwardRefExoticComponent<InputProps & React.RefAttributes<HTMLInputElement>>;
16
+ export type TextareaProps = React.TextareaHTMLAttributes<HTMLTextAreaElement> & {
17
+ autoGrow?: boolean;
18
+ variant?: "filled" | "outline";
19
+ };
20
+ export declare const Textarea: React.ForwardRefExoticComponent<React.TextareaHTMLAttributes<HTMLTextAreaElement> & {
21
+ autoGrow?: boolean;
22
+ variant?: "filled" | "outline";
23
+ } & React.RefAttributes<HTMLTextAreaElement>>;
24
+ export declare function SearchInput({ value, onChange, placeholder, className, size, autoFocus, shortcut, variant, count, onKeyDown, inputRef, "aria-label": ariaLabel, }: {
25
+ "aria-label"?: string;
26
+ value: string;
27
+ onChange: (v: string) => void;
28
+ placeholder?: string;
29
+ className?: string;
30
+ size?: "sm" | "md" | "lg";
31
+ autoFocus?: boolean;
32
+ /** Shown only while the D44 keyboard hints switch is on. */
33
+ shortcut?: string;
34
+ /**
35
+ * "filled" (grey) for search on white surfaces (menus, sidebars, lists); "outline" is the standard field (field-bg,
36
+ * 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).
37
+ */
38
+ variant?: "filled" | "outline";
39
+ /** a result count shown inside the field while there is a query ("3 matches", "2 of 5"); announced politely */
40
+ count?: string;
41
+ onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
42
+ inputRef?: React.Ref<HTMLInputElement>;
43
+ }): import("react/jsx-runtime").JSX.Element;
44
+ export declare function Label({ className, ...props }: React.LabelHTMLAttributes<HTMLLabelElement>): import("react/jsx-runtime").JSX.Element;
45
+ /**
46
+ * Field = label row · help · control · error. CPO D39, the one help system (same spec as the Block Kit FieldShell):
47
+ * [Label *] [hint] [i helpMore] …… [counter] [actions]
48
+ * help: 12/16, --fg-3 (≥4.5:1 light + dark), 4px under the label, 1–2 lines
49
+ * control
50
+ * error: replaces the help, danger colour, under the control
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).
53
+ */
54
+ export declare function Field({ label, htmlFor, hint, help, helpMore, error, required, counter, actions, children, className, }: {
55
+ label?: React.ReactNode;
56
+ htmlFor?: string;
57
+ /** short, quiet aside on the label row ("Optional", "Shown publicly") */
58
+ hint?: React.ReactNode;
59
+ /** the help line under the label */
60
+ help?: React.ReactNode;
61
+ /** longer explanation behind the ⓘ next to the label */
62
+ helpMore?: React.ReactNode;
63
+ error?: React.ReactNode;
64
+ required?: boolean;
65
+ counter?: {
66
+ value: number;
67
+ max: number;
68
+ };
69
+ actions?: React.ReactNode;
70
+ children: React.ReactNode;
71
+ className?: string;
72
+ }): import("react/jsx-runtime").JSX.Element;
73
+ /** The ⓘ next to a label: longer help in a tooltip, also read by screen readers through aria-describedby (D39). */
74
+ export declare function HelpMore({ id, label, children }: {
75
+ id?: string;
76
+ label?: string;
77
+ children: React.ReactNode;
78
+ }): import("react/jsx-runtime").JSX.Element;
package/ui/input.js ADDED
@@ -0,0 +1,250 @@
1
+ import { cn } from "../lib/cn.js";
2
+ import { FieldDescribedByContext, FieldIdContext, useFieldDescribedBy, useFieldId, useFieldLabelledBy, useLabelFor } from "./field-context.js";
3
+ import { HintTooltip } from "./button.js";
4
+ import { useShortcutHints } from "./shortcut-hint.js";
5
+ import * as React from "react";
6
+ import { IconInfoCircle, IconSearch, IconX } from "@tabler/icons-react";
7
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ //#region src/kit/ui/input.tsx
9
+ /**
10
+ * Inputs — CPO D19: white field + 1px --field-border at rest (default "outline"), border darkens on hover, halo on focus.
11
+ * "filled" (grey, borderless) is kept only for search fields, which Figma draws grey.
12
+ * Heights follow buttons: sm 28 · md 32 · lg 36.
13
+ */
14
+ var joinIds = (...ids) => ids.filter(Boolean).join(" ") || void 0;
15
+ var base = "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)]";
16
+ var Input = React.forwardRef(({ className, size = "md", leading, trailing, variant = "outline", ...rest }, ref) => {
17
+ const fieldId = useFieldId();
18
+ const labelledBy = useFieldLabelledBy();
19
+ const named = rest.id ?? fieldId ?? rest["aria-label"] ?? rest["aria-labelledby"];
20
+ const labelFor = useLabelFor(rest.id ?? fieldId);
21
+ const describedBy = useFieldDescribedBy();
22
+ const props = {
23
+ ...rest,
24
+ id: rest.id ?? fieldId,
25
+ "aria-labelledby": rest["aria-labelledby"] ?? (rest["aria-label"] ? void 0 : labelFor ?? (named ? void 0 : labelledBy)),
26
+ "aria-describedby": joinIds(rest["aria-describedby"], describedBy)
27
+ };
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" : "";
30
+ if (!leading && !trailing) return /* @__PURE__ */ jsx("input", {
31
+ ref,
32
+ className: cn(base, h, v, "px-2.5", className),
33
+ ...props
34
+ });
35
+ return /* @__PURE__ */ jsxs("div", {
36
+ className: cn("relative flex items-center", className),
37
+ children: [
38
+ leading ? /* @__PURE__ */ jsx("span", {
39
+ className: "pointer-events-none absolute left-2.5 flex text-kit-fg-3 [&_svg]:size-4",
40
+ children: leading
41
+ }) : null,
42
+ /* @__PURE__ */ jsx("input", {
43
+ ref,
44
+ className: cn(base, h, v, leading ? "pl-8" : "pl-2.5", trailing ? "pr-8" : "pr-2.5"),
45
+ ...props
46
+ }),
47
+ trailing ? /* @__PURE__ */ jsx("span", {
48
+ className: "absolute right-2 flex items-center text-kit-fg-3 [&_svg]:size-4",
49
+ children: trailing
50
+ }) : null
51
+ ]
52
+ });
53
+ });
54
+ Input.displayName = "Input";
55
+ var Textarea = React.forwardRef(({ className, autoGrow = true, variant = "outline", onInput, ...rest }, ref) => {
56
+ const fieldId = useFieldId();
57
+ const labelFor = useLabelFor(rest.id ?? fieldId);
58
+ const describedBy = useFieldDescribedBy();
59
+ const props = {
60
+ ...rest,
61
+ id: rest.id ?? fieldId,
62
+ "aria-labelledby": rest["aria-labelledby"] ?? (rest["aria-label"] ? void 0 : labelFor),
63
+ "aria-describedby": joinIds(rest["aria-describedby"], describedBy)
64
+ };
65
+ const inner = React.useRef(null);
66
+ React.useImperativeHandle(ref, () => inner.current);
67
+ const grow = () => {
68
+ const el = inner.current;
69
+ if (!el || !autoGrow || !el.clientWidth) return;
70
+ el.style.height = "auto";
71
+ el.style.height = `${el.scrollHeight + 2}px`;
72
+ };
73
+ React.useLayoutEffect(grow, [props.value, autoGrow]);
74
+ React.useEffect(() => {
75
+ const el = inner.current;
76
+ if (!el || !autoGrow || typeof ResizeObserver === "undefined") return;
77
+ let w = el.clientWidth;
78
+ let raf = 0;
79
+ const ro = new ResizeObserver(() => {
80
+ const nw = el.clientWidth;
81
+ if (nw === w) return;
82
+ w = nw;
83
+ cancelAnimationFrame(raf);
84
+ raf = requestAnimationFrame(grow);
85
+ });
86
+ ro.observe(el);
87
+ return () => {
88
+ cancelAnimationFrame(raf);
89
+ ro.disconnect();
90
+ };
91
+ }, [autoGrow]);
92
+ return /* @__PURE__ */ jsx("textarea", {
93
+ ref: inner,
94
+ rows: props.rows ?? 2,
95
+ onInput: (e) => {
96
+ grow();
97
+ onInput?.(e);
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),
100
+ ...props
101
+ });
102
+ });
103
+ Textarea.displayName = "Textarea";
104
+ function SearchInput({ value, onChange, placeholder = "Search…", className, size = "md", autoFocus, shortcut, variant = "filled", count, onKeyDown, inputRef, "aria-label": ariaLabel }) {
105
+ const hints = useShortcutHints();
106
+ return /* @__PURE__ */ jsx(Input, {
107
+ ref: inputRef,
108
+ variant,
109
+ size,
110
+ autoFocus,
111
+ value,
112
+ placeholder,
113
+ "aria-label": ariaLabel ?? placeholder.replace(/…$/, ""),
114
+ onChange: (e) => onChange(e.target.value),
115
+ onKeyDown,
116
+ leading: /* @__PURE__ */ jsx(IconSearch, { "aria-hidden": true }),
117
+ className: cn(className, value && count ? "[&_input]:pr-28" : void 0),
118
+ trailing: value ? /* @__PURE__ */ jsxs("span", {
119
+ className: "flex items-center gap-1.5",
120
+ children: [count ? /* @__PURE__ */ jsx("span", {
121
+ "aria-live": "polite",
122
+ className: "whitespace-nowrap text-kit-xs tabular-nums text-kit-fg-3",
123
+ children: count
124
+ }) : null, /* @__PURE__ */ jsx("button", {
125
+ type: "button",
126
+ "aria-label": "Clear search",
127
+ onClick: () => onChange(""),
128
+ 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",
129
+ children: /* @__PURE__ */ jsx(IconX, { "aria-hidden": true })
130
+ })]
131
+ }) : shortcut && hints ? /* @__PURE__ */ jsx("kbd", {
132
+ "data-hint": "shortcuts",
133
+ className: "font-kit-sans text-kit-2xs text-kit-fg-3",
134
+ children: shortcut
135
+ }) : void 0
136
+ });
137
+ }
138
+ function Label({ className, ...props }) {
139
+ return /* @__PURE__ */ jsx("label", {
140
+ className: cn("text-kit-sm font-medium text-kit-fg", className),
141
+ ...props
142
+ });
143
+ }
144
+ /**
145
+ * Field = label row · help · control · error. CPO D39, the one help system (same spec as the Block Kit FieldShell):
146
+ * [Label *] [hint] [i helpMore] …… [counter] [actions]
147
+ * help: 12/16, --fg-3 (≥4.5:1 light + dark), 4px under the label, 1–2 lines
148
+ * control
149
+ * error: replaces the help, danger colour, under the control
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).
152
+ */
153
+ function Field({ label, htmlFor, hint, help, helpMore, error, required, counter, actions, children, className }) {
154
+ const autoId = React.useId();
155
+ const id = htmlFor ?? autoId;
156
+ const helpId = `${id}-help`;
157
+ const moreId = `${id}-more`;
158
+ const errId = `${id}-error`;
159
+ const describedBy = [error ? errId : help ? helpId : null, helpMore ? moreId : null].filter(Boolean).join(" ") || void 0;
160
+ return /* @__PURE__ */ jsxs("div", {
161
+ className: cn("flex flex-col gap-1.5", className),
162
+ children: [
163
+ label || actions || counter ? /* @__PURE__ */ jsxs("div", {
164
+ className: "flex min-h-5 items-center justify-between gap-2",
165
+ children: [/* @__PURE__ */ jsxs("span", {
166
+ className: "flex min-w-0 items-center gap-1",
167
+ children: [/* @__PURE__ */ jsxs(Label, {
168
+ htmlFor: label ? id : void 0,
169
+ className: "flex items-center gap-1.5 text-kit-sm text-kit-fg-2",
170
+ children: [
171
+ label,
172
+ required ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
173
+ "aria-hidden": true,
174
+ className: "text-kit-fg-2",
175
+ children: "*"
176
+ }), /* @__PURE__ */ jsx("span", {
177
+ className: "sr-only",
178
+ children: "(required)"
179
+ })] }) : null,
180
+ hint ? /* @__PURE__ */ jsx("span", {
181
+ className: "font-normal text-kit-fg-3",
182
+ children: hint
183
+ }) : null
184
+ ]
185
+ }), helpMore ? /* @__PURE__ */ jsx(HelpMore, {
186
+ id: moreId,
187
+ label: typeof label === "string" ? label : void 0,
188
+ children: helpMore
189
+ }) : null]
190
+ }), /* @__PURE__ */ jsxs("div", {
191
+ className: "flex items-center gap-1",
192
+ children: [counter ? /* @__PURE__ */ jsxs("span", {
193
+ className: cn("tabular-nums text-kit-xs", counter.value > counter.max ? "text-kit-danger-fg" : counter.value > counter.max * .9 ? "text-kit-warning-fg" : "text-kit-fg-3"),
194
+ children: [
195
+ counter.value,
196
+ "/",
197
+ counter.max
198
+ ]
199
+ }) : null, actions]
200
+ })]
201
+ }) : null,
202
+ help && !error ? /* @__PURE__ */ jsx("p", {
203
+ id: helpId,
204
+ "data-slot": "field-help",
205
+ className: "-mt-0.5 text-kit-xs leading-4 text-kit-fg-3",
206
+ children: help
207
+ }) : null,
208
+ /* @__PURE__ */ jsx(FieldIdContext.Provider, {
209
+ value: label ? id : void 0,
210
+ children: /* @__PURE__ */ jsx(FieldDescribedByContext.Provider, {
211
+ value: describedBy,
212
+ children
213
+ })
214
+ }),
215
+ error ? /* @__PURE__ */ jsx("p", {
216
+ id: errId,
217
+ role: "alert",
218
+ className: "text-kit-xs leading-4 text-kit-danger-fg",
219
+ children: error
220
+ }) : null
221
+ ]
222
+ });
223
+ }
224
+ /** The ⓘ next to a label: longer help in a tooltip, also read by screen readers through aria-describedby (D39). */
225
+ function HelpMore({ id, label, children }) {
226
+ return /* @__PURE__ */ jsx(HintTooltip, {
227
+ content: /* @__PURE__ */ jsx("span", {
228
+ className: "block max-w-[260px] whitespace-normal font-normal leading-4",
229
+ children
230
+ }),
231
+ children: /* @__PURE__ */ jsxs("button", {
232
+ type: "button",
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",
235
+ children: [/* @__PURE__ */ jsx(IconInfoCircle, {
236
+ className: "size-3.5",
237
+ stroke: 1.5,
238
+ "aria-hidden": true
239
+ }), /* @__PURE__ */ jsx("span", {
240
+ id,
241
+ className: "sr-only",
242
+ children
243
+ })]
244
+ })
245
+ });
246
+ }
247
+ //#endregion
248
+ export { Field, HelpMore, Input, Label, SearchInput, Textarea };
249
+
250
+ //# sourceMappingURL=input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input.js","names":[],"sources":["../../src/kit/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 placeholder:text-kit-fg-3\" : \"\";\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 placeholder:text-kit-fg-3\",\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 --fg-2 with an sr-only \"(required)\" (DESIGN.md 13 #13, step 2).\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-fg-2\">*</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=\"inline-flex size-4 shrink-0 items-center justify-center rounded-kit-sm text-kit-fg-4 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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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 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
3
+ * its actions, with a polite live-region announcement. The primitive is shared; the placement is not:
4
+ *
5
+ * - View as (D58): app-wide, above the top bar (it changes who you are). `tone="info"`, centred. Esc does not exit.
6
+ * - Revision preview (D61): inside the editor, under its header (it changes what you are looking at).
7
+ * `tone="raised"`, start-aligned. Esc goes back to current (the host wires it).
8
+ *
9
+ * If both apply, both show: view-as on top. Tokens only, both themes (D56).
10
+ * The strip sits in the app shell, outside any kit host, so its root carries the kit scope itself (like the portalled layers).
11
+ */
12
+ import * as React from "react";
13
+ export type ModeBarTone = "info" | "raised";
14
+ export interface ModeBarProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "role"> {
15
+ /** the region's accessible name ("View as", "Version preview") */
16
+ label: string;
17
+ /** a 16px glyph, decorative */
18
+ icon?: React.ReactNode;
19
+ tone?: ModeBarTone;
20
+ /** "center" (view-as) or "start" (revision preview) */
21
+ align?: "center" | "start";
22
+ /** polite announcement, read once when it changes */
23
+ announce?: string;
24
+ }
25
+ export declare const ModeBar: React.ForwardRefExoticComponent<ModeBarProps & React.RefAttributes<HTMLDivElement>>;
26
+ /** The quiet "·" between parts of a mode bar sentence. */
27
+ export declare function ModeBarDot({ className }: {
28
+ className?: string;
29
+ }): import("react/jsx-runtime").JSX.Element;
30
+ /** A text action in a mode bar ("Exit"): underlined, not a button chip. */
31
+ export declare const ModeBarLink: React.ForwardRefExoticComponent<React.ButtonHTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
package/ui/mode-bar.js ADDED
@@ -0,0 +1,65 @@
1
+ import { cn } from "../lib/cn.js";
2
+ import { KIT_SCOPE, SURFACE_RAISED } from "./surfaces.js";
3
+ import * as React from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/kit/ui/mode-bar.tsx
6
+ /**
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
+ * its actions, with a polite live-region announcement. The primitive is shared; the placement is not:
9
+ *
10
+ * - View as (D58): app-wide, above the top bar (it changes who you are). `tone="info"`, centred. Esc does not exit.
11
+ * - Revision preview (D61): inside the editor, under its header (it changes what you are looking at).
12
+ * `tone="raised"`, start-aligned. Esc goes back to current (the host wires it).
13
+ *
14
+ * If both apply, both show: view-as on top. Tokens only, both themes (D56).
15
+ * The strip sits in the app shell, outside any kit host, so its root carries the kit scope itself (like the portalled layers).
16
+ */
17
+ var TONE = {
18
+ info: "border-kit-info-line bg-kit-info-soft",
19
+ raised: cn("border-kit-line", SURFACE_RAISED)
20
+ };
21
+ var ModeBar = React.forwardRef(function ModeBar({ label, icon, tone = "info", align = "center", announce, className, children, ...rest }, ref) {
22
+ return /* @__PURE__ */ jsxs("div", {
23
+ ref,
24
+ role: "region",
25
+ "aria-label": label,
26
+ "data-mode-bar": tone,
27
+ ...KIT_SCOPE,
28
+ className: cn("relative flex h-9 shrink-0 items-center gap-2 border-b px-4 text-kit-sm text-kit-fg", align === "center" ? "justify-center" : "justify-start", TONE[tone], className),
29
+ ...rest,
30
+ children: [
31
+ /* @__PURE__ */ jsx("span", {
32
+ "aria-live": "polite",
33
+ className: "sr-only",
34
+ children: announce ?? ""
35
+ }),
36
+ icon ? /* @__PURE__ */ jsx("span", {
37
+ "aria-hidden": true,
38
+ className: "flex shrink-0 text-kit-fg-2 [&>svg]:size-4",
39
+ children: icon
40
+ }) : null,
41
+ children
42
+ ]
43
+ });
44
+ });
45
+ /** The quiet "·" between parts of a mode bar sentence. */
46
+ function ModeBarDot({ className }) {
47
+ return /* @__PURE__ */ jsx("span", {
48
+ "aria-hidden": true,
49
+ className: cn("text-kit-fg-3", className),
50
+ children: "·"
51
+ });
52
+ }
53
+ /** A text action in a mode bar ("Exit"): underlined, not a button chip. */
54
+ var ModeBarLink = React.forwardRef(function ModeBarLink({ className, ...rest }, ref) {
55
+ return /* @__PURE__ */ jsx("button", {
56
+ ref,
57
+ type: "button",
58
+ className: cn("shrink-0 rounded-kit-sm px-1 font-medium text-kit-fg underline decoration-kit-fg-3 underline-offset-2 hover:decoration-kit-fg", className),
59
+ ...rest
60
+ });
61
+ });
62
+ //#endregion
63
+ export { ModeBar, ModeBarDot, ModeBarLink };
64
+
65
+ //# sourceMappingURL=mode-bar.js.map