@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,1530 @@
1
+ import { cn } from "../../lib/cn.js";
2
+ import { useKitEnv, useKitServices } from "../../context.js";
3
+ import { Button } from "../../ui/button.js";
4
+ import { shortcutHintsOn } from "../../ui/shortcut-hint.js";
5
+ import { Menu, MenuContent, MenuItem, MenuSeparator, MenuSub, MenuSubContent, MenuSubTrigger, MenuTrigger, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Tooltip } from "../../ui/overlay.js";
6
+ import { Textarea } from "../../ui/input.js";
7
+ import { ExpandedEditorModal } from "../../ui/expanded-editor-modal.js";
8
+ import { bodyCountLabel, closestBlock, countComponents, countWords, createIsland, defaultModel, editingHost, esc, hydrate, isEmptyHtml, placeCaret, rangeRect, rid, sanitize, serialize, textBeforeCaret, topBlock } from "./dom.js";
9
+ import { ALL_FEATURES } from "./codec.js";
10
+ import { LinkForm } from "./link-form.js";
11
+ import { Island } from "./blocks.js";
12
+ import { CatalogComponentsProvider, InsertMenuContent, SlashMenuPanel, blockAllowed, catalogKey, noteRecent, useCatalog } from "./catalog.js";
13
+ import { htmlToMarkdown, looksLikeMarkdown, markdownToHtml } from "./markdown.js";
14
+ import { duplicateBlock, ensureLineAfter, insertBasic, insertIsland, liveInlineCode, liveMarkdown, moveBlock, restrictHtml, turnInto } from "./ops.js";
15
+ import { EMPTY_FMT, FormatToolbar, MARK_FEATURE, stylesFor } from "./toolbar.js";
16
+ import { SelectionBubble } from "./floating.js";
17
+ import * as React from "react";
18
+ import { IconArrowBarToDown, IconArrowBarToUp, IconCopy, IconGripVertical, IconPlus, IconTransform, IconTrash } from "@tabler/icons-react";
19
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
+ import { AnimatePresence, motion } from "framer-motion";
21
+ import { createPortal, flushSync } from "react-dom";
22
+ //#region src/kit/controls/rich-text/editor.tsx
23
+ /**
24
+ * RICH TEXT — the boxed rich-text editor (V2 HEAD controls/rich-text-editor.tsx, Figma 60995-5431, CPO D49 / D54 / D55).
25
+ *
26
+ * contentEditable + execCommand keeps it dependency-free; the value is clean HTML, which the field's control turns into
27
+ * the stored value through the host's codec (./codec.ts). Rich blocks (an image) are React "islands" rendered into
28
+ * contenteditable=false nodes and written back as static HTML, so a re-mount restores them (./dom.ts).
29
+ *
30
+ * ./toolbar.tsx the field toolbar (no room at rest, folds into the chevron by width)
31
+ * ./catalog.tsx Insert menu, slash menu and the shared block catalogue
32
+ * ./blocks.tsx the rich blocks (an image)
33
+ * ./markdown.ts HTML ⇄ Markdown for the Markdown toggle and pasting
34
+ * ./ops.ts pure DOM block operations (insert, turn into, move, duplicate, live Markdown, field rules)
35
+ * ./floating.tsx the selection bubble
36
+ * ./dom.ts hydrate / serialize / sanitize and selection helpers
37
+ *
38
+ * Everything the editor offers is limited to what the field accepts (`features`): a toolbar button, a slash command, a
39
+ * Markdown shortcut or pasted markup the field cannot hold is not offered, or is turned into what it can hold and said so.
40
+ */
41
+ var RT_PROSE = "text-kit-base leading-[1.6] text-kit-fg [&>*+*]:mt-3 [&_h1]:text-[28px] [&_h1]:font-semibold [&_h1]:leading-9 [&_h1]:tracking-[-0.01em] [&_h2]:text-[22px] [&_h2]:font-semibold [&_h2]:leading-8 [&_h2]:tracking-[-0.01em] [&_h3]:text-kit-lg [&_h3]:font-semibold [&_h4]:text-kit-md [&_h4]:font-semibold [&_h5]:text-kit-base [&_h5]:font-semibold [&_h6]:text-kit-sm [&_h6]:font-semibold [&_h6]:uppercase [&_h6]:tracking-wide [&_h6]:text-kit-fg-2 [&>h1]:mt-6 [&>h2]:mt-6 [&>h3]:mt-5 [&>*:first-child]:mt-0 [&_ul:not([data-rt-isolate]_*)]:list-disc [&_ul:not([data-rt-isolate]_*)]:pl-5 [&_ol:not([data-rt-isolate]_*)]:list-decimal [&_ol:not([data-rt-isolate]_*)]:pl-5 [&_li:not([data-rt-isolate]_*)]:pl-1 [&_li+li:not([data-rt-isolate]_*)]:mt-1 [&_li:not([data-rt-isolate]_*)]:marker:text-kit-fg-3 [&_blockquote]:border-l-2 [&_blockquote]:border-kit-line-strong [&_blockquote]:pl-4 [&_blockquote]:text-kit-fg-2 [&_blockquote]:italic [&_a]:text-kit-accent-fg [&_a]:underline [&_a]:decoration-kit-accent-line [&_a]:underline-offset-2 [&_abbr]:cursor-help [&_abbr]:underline [&_abbr]:decoration-dotted [&_abbr]:underline-offset-2 [&_sup]:text-[0.7em] [&_sup]:leading-none [&_code]:rounded-kit-md [&_code]:bg-kit-muted [&_code]:px-1 [&_code]:py-px [&_code]:font-kit-mono [&_code]:text-[0.9em] [&_pre]:overflow-x-auto [&_pre]:whitespace-pre-wrap [&_pre]:rounded-kit-lg [&_pre]:border [&_pre]:border-kit-line [&_pre]:bg-kit-code [&_pre]:p-3 [&_pre]:font-kit-mono [&_pre]:text-kit-sm [&_pre_code]:rounded-none [&_pre_code]:bg-transparent [&_pre_code]:p-0 [&_pre_code]:text-[1em] [&_hr]:my-6 [&_hr]:border-kit-line [&_table]:w-full [&_table]:border-collapse [&_table]:text-kit-sm [&_td]:border [&_td]:border-kit-line [&_td]:px-2.5 [&_td]:py-1.5 [&_td]:align-top [&_th]:border [&_th]:border-kit-line [&_th]:bg-kit-subtle [&_th]:px-2.5 [&_th]:py-1.5 [&_th]:text-left [&_th]:align-top [&_th]:font-medium";
42
+ /** Panel density (≈340px inspector): 13px text, smaller headings. */
43
+ var RT_PANEL = "text-kit-sm leading-[1.6] [&_h1]:text-kit-xl [&_h1]:leading-7 [&_h2]:text-kit-lg [&_h2]:leading-7 [&_h3]:text-kit-md [&_h4]:text-kit-base [&_h5]:text-kit-sm [&_h6]:text-kit-xs";
44
+ /** execCommand, where the engine has it (it returns false where it does not). */
45
+ var exec = (cmd, arg) => {
46
+ try {
47
+ return typeof document.execCommand === "function" && document.execCommand(cmd, false, arg);
48
+ } catch {
49
+ return false;
50
+ }
51
+ };
52
+ var queryState = (c) => {
53
+ try {
54
+ return typeof document.queryCommandState === "function" && document.queryCommandState(c);
55
+ } catch {
56
+ return false;
57
+ }
58
+ };
59
+ /** Insert HTML at the caret: the browser's own insert (undoable), else by hand. */
60
+ function insertHtmlAtCaret(html) {
61
+ if (exec("insertHTML", html)) return;
62
+ const s = window.getSelection();
63
+ if (!s || !s.rangeCount) return;
64
+ const r = s.getRangeAt(0);
65
+ r.deleteContents();
66
+ const tpl = document.createElement("template");
67
+ tpl.innerHTML = sanitize(html);
68
+ const last = tpl.content.lastChild;
69
+ r.insertNode(tpl.content);
70
+ if (last) {
71
+ r.setStartAfter(last);
72
+ r.collapse(true);
73
+ s.removeAllRanges();
74
+ s.addRange(r);
75
+ }
76
+ }
77
+ function insertTextAtCaret(text) {
78
+ if (exec("insertText", text)) return;
79
+ const s = window.getSelection();
80
+ if (!s || !s.rangeCount) return;
81
+ const r = s.getRangeAt(0);
82
+ r.deleteContents();
83
+ const t = document.createTextNode(text);
84
+ r.insertNode(t);
85
+ r.setStartAfter(t);
86
+ r.collapse(true);
87
+ s.removeAllRanges();
88
+ s.addRange(r);
89
+ }
90
+ /** The slash menu at full height (header 32, list 300, footer 28, borders), the least it shrinks to, and the gap it keeps from the window's edge. */
91
+ var SLASH_MENU_H = 362;
92
+ var SLASH_MIN_H = 160;
93
+ var SLASH_EDGE = 8;
94
+ /**
95
+ * Where the slash menu goes, collision-aware: below the caret when the whole menu fits there, else on the side with
96
+ * more room, and never taller than that room (its list scrolls), so the last row (More components) stays reachable in
97
+ * a short window.
98
+ */
99
+ function slashPlacement(caret, viewportH) {
100
+ const below = viewportH - caret.bottom - 6 - SLASH_EDGE;
101
+ const above = caret.top - 6 - SLASH_EDGE;
102
+ const flipUp = below < SLASH_MENU_H && above > below;
103
+ return {
104
+ flipUp,
105
+ maxHeight: Math.max(SLASH_MIN_H, Math.min(SLASH_MENU_H, flipUp ? above : below))
106
+ };
107
+ }
108
+ function RichTextEditor({ value, onChange, readOnly, placeholder, docKey, features = ALL_FEATURES, single, allowNewTab = true, id, invalid, variant = "document", expandCrumbs, expandedOpen, onExpandedOpenChange, inModal, hideFullscreen, maxHeight, autoFocus, onComment, components }) {
109
+ const hints = shortcutHintsOn();
110
+ const ph = placeholder ?? (hints ? "Type '/' for commands" : "Write something…");
111
+ const dense = variant === "panel";
112
+ const ref = React.useRef(null);
113
+ const wrap = React.useRef(null);
114
+ const scroller = React.useRef(null);
115
+ const saved = React.useRef(null);
116
+ const known = React.useRef(null);
117
+ const pending = React.useRef(null);
118
+ /** a host undo just ran: its value is loaded even while the editor has focus (⌘Z here) */
119
+ const forceLoad = React.useRef(false);
120
+ const prevDoc = React.useRef(null);
121
+ const onChangeRef = React.useRef(onChange);
122
+ onChangeRef.current = onChange;
123
+ const valueRef = React.useRef(value);
124
+ valueRef.current = value;
125
+ const services = useKitServices();
126
+ const env = useKitEnv();
127
+ const featureKey = features.join(",");
128
+ const allows = React.useCallback((f) => features.includes(f), [featureKey]);
129
+ const [empty, setEmpty] = React.useState(isEmptyHtml(value));
130
+ const [words, setWords] = React.useState(() => countWords(value));
131
+ const [comps, setComps] = React.useState(() => countComponents(value));
132
+ const [fmt, setFmt] = React.useState(EMPTY_FMT);
133
+ const [modalOwn, setModalOwn] = React.useState(false);
134
+ const modalOpen = expandedOpen ?? modalOwn;
135
+ const setModalOpen = (o) => onExpandedOpenChange ? onExpandedOpenChange(o) : setModalOwn(o);
136
+ const [md, setMd] = React.useState(null);
137
+ const [mdConfirm, setMdConfirm] = React.useState(false);
138
+ const [bubble, setBubble] = React.useState(null);
139
+ const [slash, setSlash] = React.useState(null);
140
+ const [gutter, setGutter] = React.useState(null);
141
+ const [blockMenu, setBlockMenu] = React.useState(false);
142
+ const [gutterInsert, setGutterInsert] = React.useState(false);
143
+ const gutterTarget = React.useRef(null);
144
+ const canAI = env.can("ai.use") && !!services.aiRewrite;
145
+ const aiAttempt = React.useRef(0);
146
+ const [link, setLink] = React.useState(null);
147
+ const [drag, setDrag] = React.useState(null);
148
+ const [focused, setFocused] = React.useState(false);
149
+ const [menus, setMenus] = React.useState({
150
+ style: false,
151
+ more: false
152
+ });
153
+ const [insertOpen, setInsertOpen] = React.useState(false);
154
+ const inserted = React.useRef(false);
155
+ const [islands, setIslands] = React.useState([]);
156
+ const hist = React.useRef({
157
+ past: [],
158
+ future: [],
159
+ textAt: 0,
160
+ hosts: []
161
+ });
162
+ const [width, setWidth] = React.useState(720);
163
+ const [gutterRoom, setGutterRoom] = React.useState(false);
164
+ const blurTimer = React.useRef(void 0);
165
+ const [notice, setNotice] = React.useState(null);
166
+ const expanded = !!inModal;
167
+ const toolbarOpen = !readOnly && (focused || menus.style || menus.more || insertOpen || expanded || !!md || !!link);
168
+ const scrollable = !!maxHeight && !expanded;
169
+ /** A refusal or a result the author must see: the host's toaster, else a line under the editor. Never silent. */
170
+ const notify = React.useCallback((message, opts = {}) => {
171
+ if (services.toast) services.toast(message, opts);
172
+ else setNotice({
173
+ message,
174
+ ...opts
175
+ });
176
+ }, [services]);
177
+ React.useEffect(() => {
178
+ if (!notice) return;
179
+ const t = window.setTimeout(() => setNotice(null), 8e3);
180
+ return () => window.clearTimeout(t);
181
+ }, [notice]);
182
+ const syncIslands = React.useCallback(() => {
183
+ const el = ref.current;
184
+ if (!el) return setIslands((p) => p.length ? [] : p);
185
+ const list = Array.from(el.querySelectorAll(":scope > [data-rt-island]"));
186
+ const seen = /* @__PURE__ */ new Set();
187
+ for (const x of list) {
188
+ if (!x.__rt) {
189
+ x.innerHTML = "";
190
+ x.__rt = defaultModel(x.getAttribute("data-rt-island"));
191
+ delete x.dataset.rtId;
192
+ }
193
+ if (!x.dataset.rtId || seen.has(x.dataset.rtId)) x.dataset.rtId = rid("i");
194
+ seen.add(x.dataset.rtId);
195
+ }
196
+ setIslands((prev) => prev.length === list.length && prev.every((p, i) => p.el === list[i]) ? prev : list.map((x) => ({
197
+ id: x.dataset.rtId,
198
+ el: x
199
+ })));
200
+ }, []);
201
+ const load = React.useCallback((html) => {
202
+ const el = ref.current;
203
+ if (!el) return;
204
+ el.innerHTML = sanitize(html || "") || "<p><br></p>";
205
+ hydrate(el);
206
+ known.current = html;
207
+ setEmpty(isEmptyHtml(html));
208
+ setWords(countWords(html));
209
+ setComps(countComponents(html));
210
+ syncIslands();
211
+ }, [syncIslands]);
212
+ const emit = React.useCallback(() => {
213
+ const el = ref.current;
214
+ if (!el) return;
215
+ syncIslands();
216
+ const html = serialize(el);
217
+ setEmpty(isEmptyHtml(html) && !el.querySelector(":scope > [data-rt-island], :scope > hr"));
218
+ setWords(countWords(html));
219
+ setComps(countComponents(html));
220
+ if (html === known.current) return;
221
+ forceLoad.current = false;
222
+ known.current = html;
223
+ onChangeRef.current(html);
224
+ }, [syncIslands]);
225
+ React.useLayoutEffect(() => {
226
+ const el = ref.current;
227
+ if (!el) return;
228
+ const docChanged = prevDoc.current !== null && prevDoc.current !== docKey;
229
+ prevDoc.current = docKey;
230
+ if (pending.current !== null) {
231
+ const h = pending.current;
232
+ pending.current = null;
233
+ load(h);
234
+ return;
235
+ }
236
+ if (forceLoad.current && value !== known.current) {
237
+ forceLoad.current = false;
238
+ load(value);
239
+ return;
240
+ }
241
+ if (docChanged || !el.firstChild || value !== known.current && !wrap.current?.contains(document.activeElement)) load(value);
242
+ }, [
243
+ value,
244
+ docKey,
245
+ md,
246
+ load
247
+ ]);
248
+ React.useEffect(() => {
249
+ setMd(null);
250
+ setMdConfirm(false);
251
+ setSlash(null);
252
+ setLink(null);
253
+ setGutter(null);
254
+ }, [docKey]);
255
+ React.useEffect(() => {
256
+ exec("defaultParagraphSeparator", "p");
257
+ if (autoFocus && ref.current && !readOnly) {
258
+ ref.current.focus({ preventScroll: true });
259
+ placeCaret(ref.current.lastElementChild ?? ref.current);
260
+ }
261
+ }, []);
262
+ React.useEffect(() => {
263
+ const w = wrap.current;
264
+ if (!w || typeof ResizeObserver === "undefined") return;
265
+ const measureRoom = () => {
266
+ let a = w.parentElement;
267
+ while (a && a !== document.body) {
268
+ const cs = getComputedStyle(a);
269
+ if (cs.overflowX !== "visible" || cs.overflowY !== "visible") break;
270
+ a = a.parentElement;
271
+ }
272
+ setGutterRoom(w.getBoundingClientRect().left - (a ? a.getBoundingClientRect().left : 0) >= 48);
273
+ };
274
+ const ro = new ResizeObserver(([e]) => {
275
+ setWidth(Math.round(e.contentRect.width));
276
+ measureRoom();
277
+ });
278
+ ro.observe(w);
279
+ return () => ro.disconnect();
280
+ }, []);
281
+ const [stickyTop, setStickyTop] = React.useState(0);
282
+ React.useEffect(() => {
283
+ const w = wrap.current;
284
+ if (!toolbarOpen || dense || !w) return;
285
+ let sp = w.parentElement;
286
+ while (sp && !/(auto|scroll)/.test(getComputedStyle(sp).overflowY)) sp = sp.parentElement;
287
+ if (!sp) return setStickyTop(0);
288
+ let top = 0;
289
+ sp.querySelectorAll(".sticky").forEach((h) => {
290
+ if (h.contains(w) || w.contains(h) || !(h.compareDocumentPosition(w) & Node.DOCUMENT_POSITION_FOLLOWING)) return;
291
+ const cs = getComputedStyle(h);
292
+ if (cs.position !== "sticky") return;
293
+ top = Math.max(top, (parseFloat(cs.top) || 0) + h.offsetHeight);
294
+ });
295
+ setStickyTop(top);
296
+ }, [toolbarOpen, dense]);
297
+ const hasSlash = !!slash;
298
+ React.useEffect(() => {
299
+ if (!hasSlash) return;
300
+ let raf = 0;
301
+ const on = (e) => {
302
+ if (e.target instanceof Element && e.target.closest("[role=listbox]")) return;
303
+ cancelAnimationFrame(raf);
304
+ raf = requestAnimationFrame(() => setSlash((sl) => {
305
+ const s = window.getSelection();
306
+ if (!sl || !s || !s.rangeCount || s.getRangeAt(0).startContainer !== sl.node) return null;
307
+ const rect = rangeRect(s.getRangeAt(0), sl.node.parentElement ?? ref.current);
308
+ return rect.top === sl.rect.top && rect.left === sl.rect.left ? sl : {
309
+ ...sl,
310
+ rect
311
+ };
312
+ }));
313
+ };
314
+ window.addEventListener("scroll", on, true);
315
+ return () => {
316
+ cancelAnimationFrame(raf);
317
+ window.removeEventListener("scroll", on, true);
318
+ };
319
+ }, [hasSlash]);
320
+ const hasBubble = !!bubble;
321
+ React.useEffect(() => {
322
+ if (!hasBubble) return;
323
+ let raf = 0;
324
+ const on = () => {
325
+ cancelAnimationFrame(raf);
326
+ raf = requestAnimationFrame(() => {
327
+ const s = window.getSelection();
328
+ setBubble(s && s.rangeCount && !s.isCollapsed && ref.current?.contains(s.anchorNode) ? rangeRect(s.getRangeAt(0), ref.current) : null);
329
+ });
330
+ };
331
+ window.addEventListener("scroll", on, true);
332
+ window.addEventListener("resize", on);
333
+ return () => {
334
+ cancelAnimationFrame(raf);
335
+ window.removeEventListener("scroll", on, true);
336
+ window.removeEventListener("resize", on);
337
+ };
338
+ }, [hasBubble]);
339
+ const saveSel = () => {
340
+ const s = window.getSelection();
341
+ if (s && s.rangeCount && ref.current?.contains(s.anchorNode)) saved.current = s.getRangeAt(0).cloneRange();
342
+ };
343
+ const restoreSel = () => {
344
+ const el = ref.current;
345
+ if (!el) return;
346
+ const r = saved.current;
347
+ const s = window.getSelection();
348
+ if (r && el.contains(r.startContainer) && s) {
349
+ (editingHost(r.startContainer) ?? el).focus({ preventScroll: true });
350
+ s.removeAllRanges();
351
+ s.addRange(r);
352
+ } else {
353
+ el.focus({ preventScroll: true });
354
+ placeCaret(el.lastElementChild ?? el);
355
+ }
356
+ };
357
+ const refresh = React.useCallback(() => {
358
+ const el = ref.current;
359
+ const s = window.getSelection();
360
+ if (!el || !s || !s.rangeCount || !el.contains(s.anchorNode)) return;
361
+ saved.current = s.getRangeAt(0).cloneRange();
362
+ const anchorEl = s.anchorNode?.nodeType === 1 ? s.anchorNode : s.anchorNode?.parentElement;
363
+ const inIsland = !!anchorEl?.closest("[data-rt-island]");
364
+ const tb = topBlock(el, s.anchorNode);
365
+ const r = s.getRangeAt(0);
366
+ const hasSel = !s.isCollapsed && !!r.toString().trim();
367
+ const next = {
368
+ bold: queryState("bold") && !/^H[1-6]$/.test(tb?.tagName ?? ""),
369
+ italic: queryState("italic"),
370
+ underline: queryState("underline"),
371
+ strike: queryState("strikeThrough"),
372
+ ul: !inIsland && tb?.tagName === "UL",
373
+ ol: !inIsland && tb?.tagName === "OL",
374
+ block: inIsland ? "island" : tb?.tagName.toLowerCase() ?? "p",
375
+ hasSel,
376
+ onLink: !!anchorEl?.closest("a")
377
+ };
378
+ setFmt((p) => JSON.stringify(p) === JSON.stringify(next) ? p : next);
379
+ setBubble(hasSel ? rangeRect(r, el) : null);
380
+ el.querySelectorAll(":scope > [data-hint]").forEach((n) => (n !== tb || n.textContent) && n.removeAttribute("data-hint"));
381
+ if (tb && tb.tagName === "P" && s.isCollapsed && !tb.textContent && !tb.querySelector("img") && document.activeElement === el && shortcutHintsOn()) tb.setAttribute("data-hint", "Type '/' for commands");
382
+ }, []);
383
+ React.useEffect(() => {
384
+ const on = () => refresh();
385
+ document.addEventListener("selectionchange", on);
386
+ return () => document.removeEventListener("selectionchange", on);
387
+ }, [refresh]);
388
+ const run = (fn) => {
389
+ restoreSel();
390
+ fn();
391
+ emit();
392
+ refresh();
393
+ };
394
+ const placeGutter = (b) => {
395
+ const sc = scroller.current;
396
+ if (!b || !sc) return setGutter(null);
397
+ const sr = sc.getBoundingClientRect();
398
+ const br = b.getBoundingClientRect();
399
+ setGutter((g) => {
400
+ const top = br.top - sr.top + sc.scrollTop;
401
+ return g && g.el === b && g.top === top ? g : {
402
+ el: b,
403
+ top,
404
+ height: br.height
405
+ };
406
+ });
407
+ };
408
+ const currentBlock = () => {
409
+ const el = ref.current;
410
+ if (!el) return null;
411
+ const s = window.getSelection();
412
+ return topBlock(el, s && s.rangeCount && el.contains(s.anchorNode) ? s.anchorNode : document.activeElement);
413
+ };
414
+ const deleteBlock = (b) => {
415
+ const el = ref.current;
416
+ if (!el || !el.contains(b)) return;
417
+ const next = b.nextSibling;
418
+ b.remove();
419
+ let filler = null;
420
+ if (!el.firstElementChild) {
421
+ filler = document.createElement("p");
422
+ filler.innerHTML = "<br>";
423
+ el.append(filler);
424
+ }
425
+ setGutter(null);
426
+ setBlockMenu(false);
427
+ emit();
428
+ notify("Block deleted", { action: {
429
+ label: "Undo",
430
+ onClick: () => {
431
+ const root = ref.current;
432
+ if (!root) return;
433
+ if (filler?.isConnected && !filler.textContent) filler.remove();
434
+ if (next && next.parentNode === root) root.insertBefore(b, next);
435
+ else root.append(b);
436
+ emit();
437
+ }
438
+ } });
439
+ };
440
+ const duplicateBlock$1 = (b) => {
441
+ const c = duplicateBlock(b);
442
+ emit();
443
+ if (gutter) placeGutter(c);
444
+ };
445
+ const moveBlock$1 = (b, dir) => {
446
+ if (!moveBlock(b, dir)) return;
447
+ emit();
448
+ if (gutter) requestAnimationFrame(() => placeGutter(b));
449
+ };
450
+ const turnInto$1 = (b, tag) => {
451
+ const el = ref.current;
452
+ if (el && turnInto(el, b, tag)) emit();
453
+ };
454
+ const exitIsland = (x) => {
455
+ const el = ref.current;
456
+ if (!el || !el.contains(x)) return;
457
+ const next = ensureLineAfter(x);
458
+ el.focus({ preventScroll: true });
459
+ placeCaret(next, false);
460
+ emit();
461
+ };
462
+ const insertBlock = (it) => {
463
+ const el = ref.current;
464
+ if (!el || readOnly) return;
465
+ if (it.kind === "component" && it.component) {
466
+ const c = it.component;
467
+ noteRecent(it);
468
+ oneStep(`Insert ${c.name}`, () => {
469
+ const isl = insertIsland(el, "component", {
470
+ ...defaultModel("component"),
471
+ ref: c.id,
472
+ name: c.name
473
+ });
474
+ emit();
475
+ return isl;
476
+ });
477
+ refresh();
478
+ return;
479
+ }
480
+ if (!it.id || !blockAllowed(it.id, allows)) return;
481
+ noteRecent(it);
482
+ insertBasic(el, it.id);
483
+ emit();
484
+ refresh();
485
+ };
486
+ const slashCat = useCatalog(slash?.query ?? "", allows, slash?.folder ?? false, components ?? null);
487
+ const caretRect = () => {
488
+ const s = window.getSelection();
489
+ if (!s || !s.rangeCount) return null;
490
+ return rangeRect(s.getRangeAt(0), topBlock(ref.current, s.anchorNode) ?? ref.current);
491
+ };
492
+ const pickSlash = (it) => {
493
+ if (it.kind === "folder") return setSlash((s) => s && {
494
+ ...s,
495
+ folder: true,
496
+ active: 1
497
+ });
498
+ if (it.kind === "back") return setSlash((s) => s && {
499
+ ...s,
500
+ folder: false,
501
+ active: 0
502
+ });
503
+ const sl = slash;
504
+ setSlash(null);
505
+ if (sl) {
506
+ try {
507
+ const r = document.createRange();
508
+ r.setStart(sl.node, sl.offset);
509
+ r.setEnd(sl.node, Math.min(sl.node.length, sl.offset + 1 + sl.query.length));
510
+ r.deleteContents();
511
+ const c = document.createRange();
512
+ c.setStart(sl.node, Math.min(sl.offset, sl.node.length));
513
+ c.collapse(true);
514
+ const s = window.getSelection();
515
+ s?.removeAllRanges();
516
+ s?.addRange(c);
517
+ } catch {}
518
+ if (it.kind === "component") flushSync(() => emit());
519
+ }
520
+ insertBlock(it);
521
+ };
522
+ const toggleInlineCode = () => {
523
+ const el = ref.current;
524
+ const s = window.getSelection();
525
+ if (!el || !s || !s.rangeCount || !allows("code")) return;
526
+ const code = (s.anchorNode?.nodeType === 1 ? s.anchorNode : s.anchorNode?.parentElement)?.closest("code");
527
+ if (code && el.contains(code) && !code.closest("pre")) {
528
+ code.replaceWith(...Array.from(code.childNodes));
529
+ emit();
530
+ return;
531
+ }
532
+ const text = s.toString();
533
+ if (!text) return void notify("Select some text first", { description: "Or wrap words in backticks to format them as code." });
534
+ insertHtmlAtCaret(`<code>${esc(text)}</code>`);
535
+ emit();
536
+ };
537
+ const onKeyDown = (e) => {
538
+ if (slash) {
539
+ if (e.key === "Escape") {
540
+ e.preventDefault();
541
+ e.stopPropagation();
542
+ setSlash(slash.folder ? {
543
+ ...slash,
544
+ folder: false,
545
+ active: 0
546
+ } : null);
547
+ return;
548
+ }
549
+ if (catalogKey(e, slashCat.flat, slash.active, (a) => setSlash((s) => s && {
550
+ ...s,
551
+ active: a
552
+ }), pickSlash, false)) {
553
+ e.preventDefault();
554
+ return;
555
+ }
556
+ }
557
+ const mod = e.metaKey || e.ctrlKey;
558
+ const k = e.key.toLowerCase();
559
+ if (mod && !e.altKey && k === "k") {
560
+ e.preventDefault();
561
+ saveSel();
562
+ openLink();
563
+ return;
564
+ }
565
+ if (mod && !e.altKey && !e.shiftKey && k === "e") {
566
+ e.preventDefault();
567
+ toggleInlineCode();
568
+ return;
569
+ }
570
+ if (mod && !e.altKey && !e.shiftKey && (k === "b" && !allows("bold") || k === "i" && !allows("italic") || k === "u" && !allows("underline"))) {
571
+ e.preventDefault();
572
+ return;
573
+ }
574
+ if (mod && e.altKey && /^Digit[0-6]$/.test(e.code)) {
575
+ e.preventDefault();
576
+ const n = Number(e.code.slice(5));
577
+ const tag = n === 0 ? "p" : `h${n}`;
578
+ if (tag === "p" || allows(tag)) turnInto$1(currentBlock(), tag);
579
+ return;
580
+ }
581
+ if (e.key === "Enter" && !mod && !e.shiftKey) {
582
+ if (single) {
583
+ e.preventDefault();
584
+ return;
585
+ }
586
+ const cb = currentBlock();
587
+ if (cb && /^(BLOCKQUOTE|H[1-6])$/.test(cb.tagName) && !cb.textContent?.replace(/​/g, "").trim()) {
588
+ e.preventDefault();
589
+ turnInto$1(cb, "p");
590
+ return;
591
+ }
592
+ const sel = window.getSelection();
593
+ if (cb?.tagName === "BLOCKQUOTE" && sel?.isCollapsed && sel.rangeCount && !cb.querySelector("p")) {
594
+ const rest = document.createRange();
595
+ rest.selectNodeContents(cb);
596
+ rest.setStart(sel.anchorNode, sel.anchorOffset);
597
+ if (!rest.toString().trim()) {
598
+ e.preventDefault();
599
+ const p = document.createElement("p");
600
+ p.innerHTML = "<br>";
601
+ cb.after(p);
602
+ placeCaret(p);
603
+ emit();
604
+ return;
605
+ }
606
+ }
607
+ const s = window.getSelection();
608
+ const pre = s?.anchorNode && (s.anchorNode.nodeType === 1 ? s.anchorNode : s.anchorNode.parentElement)?.closest("pre");
609
+ if (pre && ref.current?.contains(pre)) {
610
+ e.preventDefault();
611
+ exec("insertLineBreak");
612
+ return;
613
+ }
614
+ }
615
+ if (e.key === "ArrowDown" && !mod && !e.shiftKey && !single) {
616
+ const b = currentBlock();
617
+ const s = window.getSelection();
618
+ if (b && !b.nextElementSibling && b.tagName !== "P" && !b.hasAttribute("data-rt-island") && s?.isCollapsed && s.rangeCount) {
619
+ const rest = document.createRange();
620
+ rest.selectNodeContents(b);
621
+ rest.setStart(s.anchorNode, s.anchorOffset);
622
+ if (!rest.toString().trim()) {
623
+ e.preventDefault();
624
+ placeCaret(ensureLineAfter(b), false);
625
+ emit();
626
+ }
627
+ }
628
+ }
629
+ };
630
+ /** Block-level shortcuts; runs for the surface and for text inside rich blocks. */
631
+ const onWrapKeyDown = (e) => {
632
+ if (e.defaultPrevented) return;
633
+ const mod = e.metaKey || e.ctrlKey;
634
+ if (mod && e.key === "Enter" && !hideFullscreen) {
635
+ e.preventDefault();
636
+ setModalOpen(true);
637
+ return;
638
+ }
639
+ if (md || readOnly) return;
640
+ const t = e.target;
641
+ if (!ref.current?.contains(t) || t.tagName === "INPUT" || t.tagName === "TEXTAREA") return;
642
+ if (undoKey(e)) return;
643
+ if (single) return;
644
+ if (mod && !e.shiftKey && !e.altKey && e.key.toLowerCase() === "d") {
645
+ e.preventDefault();
646
+ const b = currentBlock();
647
+ if (b) duplicateBlock$1(b);
648
+ return;
649
+ }
650
+ if (mod && e.shiftKey && (e.key === "ArrowUp" || e.key === "ArrowDown")) {
651
+ e.preventDefault();
652
+ const b = currentBlock();
653
+ if (b) moveBlock$1(b, e.key === "ArrowUp" ? -1 : 1);
654
+ }
655
+ };
656
+ const onInput = (e) => {
657
+ if (e.target !== ref.current) return;
658
+ const ne = e.nativeEvent;
659
+ if (ne.inputType !== "historyUndo" && ne.inputType !== "historyRedo") {
660
+ hist.current.textAt = Date.now();
661
+ hist.current.future = [];
662
+ }
663
+ if (!single && ne.inputType === "insertText" && (ne.data === " " || ne.data === "-") && liveMarkdown(ref.current, ne.data, allows)) {
664
+ setSlash(null);
665
+ emit();
666
+ return;
667
+ }
668
+ if (ne.inputType === "insertText" && ne.data === "`" && allows("code")) liveInlineCode();
669
+ emit();
670
+ const s = window.getSelection();
671
+ if (!s || !s.rangeCount) return setSlash(null);
672
+ const r = s.getRangeAt(0);
673
+ if (!slash) {
674
+ if (single || ne.inputType !== "insertText" || ne.data !== "/" || r.startContainer.nodeType !== 3) return;
675
+ const blk = closestBlock(ref.current, r.startContainer);
676
+ if (!blk || textBeforeCaret(blk) !== "/") return;
677
+ const rect = caretRect();
678
+ if (rect) setSlash({
679
+ rect,
680
+ node: r.startContainer,
681
+ offset: r.startOffset - 1,
682
+ query: "",
683
+ folder: false,
684
+ active: 0
685
+ });
686
+ return;
687
+ }
688
+ if (r.startContainer !== slash.node || r.startOffset <= slash.offset || slash.node.data[slash.offset] !== "/") return setSlash(null);
689
+ const q = slash.node.data.slice(slash.offset + 1, r.startOffset);
690
+ if (/\s/.test(q) || q.length > 24) return setSlash(null);
691
+ setSlash({
692
+ ...slash,
693
+ query: q,
694
+ active: slash.folder ? 1 : 0
695
+ });
696
+ };
697
+ const openLink = () => {
698
+ if (!allows("link")) return;
699
+ restoreSel();
700
+ const s = window.getSelection();
701
+ const anchor = (s?.anchorNode?.nodeType === 1 ? s.anchorNode : s?.anchorNode?.parentElement)?.closest("a") ?? null;
702
+ if (!anchor && (!s || s.isCollapsed || !s.toString().trim())) {
703
+ notify("Select some text first", { description: hints ? "Then press ⌘K to link it." : "Then link it." });
704
+ return;
705
+ }
706
+ const rect = s && s.rangeCount ? rangeRect(s.getRangeAt(0), ref.current) : ref.current.getBoundingClientRect();
707
+ setBubble(null);
708
+ setLink({
709
+ rect,
710
+ existing: anchor,
711
+ initial: anchor ? {
712
+ href: anchor.getAttribute("href") ?? "",
713
+ newTab: anchor.getAttribute("target") === "_blank"
714
+ } : { href: "" }
715
+ });
716
+ };
717
+ const saveLink = (v) => {
718
+ const l = link;
719
+ setLink(null);
720
+ if (!l) return;
721
+ if (l.existing) {
722
+ l.existing.setAttribute("href", v.href);
723
+ if (v.newTab) l.existing.setAttribute("target", "_blank");
724
+ else l.existing.removeAttribute("target");
725
+ emit();
726
+ return;
727
+ }
728
+ run(() => {
729
+ const text = window.getSelection()?.toString() || v.href;
730
+ insertHtmlAtCaret(`<a href="${esc(v.href).replace(/"/g, "&quot;")}"${v.newTab ? ` target="_blank"` : ""}>${esc(text)}</a>`);
731
+ });
732
+ };
733
+ const aiRewrite = (preset) => {
734
+ const rewrite = services.aiRewrite;
735
+ restoreSel();
736
+ const range = saved.current?.cloneRange();
737
+ const text = range?.toString() ?? "";
738
+ if (!rewrite || !range || !text.trim()) return;
739
+ setBubble(null);
740
+ Promise.resolve().then(() => rewrite(text, preset, aiAttempt.current++)).then((out) => {
741
+ const el = ref.current;
742
+ if (!el || !el.contains(range.startContainer) || range.toString() !== text) {
743
+ notify("The text changed before the rewrite came back", { description: "Nothing was replaced. Select it again to retry." });
744
+ return;
745
+ }
746
+ el.focus({ preventScroll: true });
747
+ const s = window.getSelection();
748
+ s?.removeAllRanges();
749
+ s?.addRange(range);
750
+ insertTextAtCaret(out);
751
+ emit();
752
+ notify("Rewritten with AI", { description: hints ? "Press ⌘Z to undo" : void 0 });
753
+ }, (err) => notify("Could not rewrite the selection", { description: err instanceof Error ? err.message : String(err) }));
754
+ };
755
+ const onGripDown = (e) => {
756
+ if (!gutter) return;
757
+ startDrag(gutter.el, e, () => setBlockMenu(true));
758
+ };
759
+ /** Drag a top-level block (the gutter grip) to a new position; a tap calls `onTap`. */
760
+ const startDrag = (from, e, onTap) => {
761
+ if (readOnly || e.button !== 0) return;
762
+ e.preventDefault();
763
+ const start = e.clientY;
764
+ let moved = false;
765
+ const kids = () => Array.from(ref.current?.children ?? []);
766
+ const move = (ev) => {
767
+ if (!moved && Math.abs(ev.clientY - start) < 4) return;
768
+ moved = true;
769
+ const sc = scroller.current;
770
+ const sr = sc.getBoundingClientRect();
771
+ let target = null;
772
+ let line = 0;
773
+ for (const k of kids()) {
774
+ const r = k.getBoundingClientRect();
775
+ if (ev.clientY < r.top + r.height / 2) {
776
+ target = k;
777
+ line = r.top - sr.top + sc.scrollTop - 4;
778
+ break;
779
+ }
780
+ line = r.bottom - sr.top + sc.scrollTop + 4;
781
+ }
782
+ setDrag({
783
+ from,
784
+ line,
785
+ target
786
+ });
787
+ };
788
+ const up = () => {
789
+ window.removeEventListener("pointermove", move);
790
+ window.removeEventListener("pointerup", up);
791
+ if (!moved) {
792
+ onTap?.();
793
+ return;
794
+ }
795
+ setDrag((d) => {
796
+ if (d && d.target !== d.from) {
797
+ if (d.target) d.target.before(d.from);
798
+ else ref.current?.append(d.from);
799
+ setTimeout(emit, 0);
800
+ }
801
+ return null;
802
+ });
803
+ };
804
+ window.addEventListener("pointermove", move);
805
+ window.addEventListener("pointerup", up);
806
+ };
807
+ const conform = (html) => {
808
+ const r = restrictHtml(html, allows);
809
+ if (r.dropped.length) notify(`This field keeps no ${r.dropped.join(" or ")}`, { description: "They were left out; the text around them was kept." });
810
+ return r.html;
811
+ };
812
+ const toggleMarkdown = () => {
813
+ if (!md) {
814
+ const text = htmlToMarkdown(ref.current ? serialize(ref.current) : value);
815
+ setMd({
816
+ text,
817
+ original: text
818
+ });
819
+ setSlash(null);
820
+ setGutter(null);
821
+ setBubble(null);
822
+ setLink(null);
823
+ return;
824
+ }
825
+ if (md.text === md.original) {
826
+ setMd(null);
827
+ setMdConfirm(false);
828
+ return;
829
+ }
830
+ setMdConfirm(true);
831
+ };
832
+ const convertMarkdown = () => {
833
+ if (!md) return;
834
+ let html;
835
+ try {
836
+ html = conform(markdownToHtml(md.text));
837
+ } catch (err) {
838
+ notify("Could not convert this Markdown", { description: `${err instanceof Error ? err.message : String(err)}. Your rich text is unchanged.` });
839
+ return;
840
+ }
841
+ pending.current = html;
842
+ known.current = html;
843
+ onChangeRef.current(html);
844
+ setMd(null);
845
+ setMdConfirm(false);
846
+ };
847
+ /** A host step's undo or redo; its value then loads even here, with the caret in the editor. */
848
+ const runHost = (run) => {
849
+ forceLoad.current = true;
850
+ const r = run();
851
+ if (r !== true) forceLoad.current = false;
852
+ return r;
853
+ };
854
+ /**
855
+ * This body's host step that is the host's next undo (or redo) NOW. The host's toolbar moves these steps too: after
856
+ * its Undo then Redo, the step is the latest change again, so ⌘Z here undoes it. Any later change in this body is a
857
+ * host step of its own (the body's value is the host's), so a host step that is next is the latest change here.
858
+ */
859
+ const hostNext = (way) => {
860
+ const hs = hist.current.hosts;
861
+ for (let i = hs.length - 1; i >= 0; i--) if (hs[i].step.next() === way) return hs[i];
862
+ return null;
863
+ };
864
+ const islandUndo = () => {
865
+ const host = hostNext("undo");
866
+ if (host) {
867
+ const r = runHost(host.step.undo);
868
+ if (r !== true) notify("Nothing was undone", { description: r });
869
+ return true;
870
+ }
871
+ const h = hist.current;
872
+ while (h.past.length && !h.past[h.past.length - 1].el.isConnected) h.past.pop();
873
+ const step = h.past[h.past.length - 1];
874
+ if (!step || step.at < h.textAt) return false;
875
+ if (!step.el.__rtSet) return false;
876
+ h.past.pop();
877
+ h.future.push({
878
+ ...step,
879
+ before: step.el.__rt,
880
+ at: Date.now()
881
+ });
882
+ step.el.__rtSet(step.before);
883
+ return true;
884
+ };
885
+ const islandRedo = () => {
886
+ const host = hostNext("redo");
887
+ if (host) {
888
+ const r = runHost(host.step.redo);
889
+ if (r !== true) notify("Nothing was redone", { description: r });
890
+ return true;
891
+ }
892
+ const h = hist.current;
893
+ const step = h.future.pop();
894
+ if (!step || !step.el.isConnected || !step.el.__rtSet) return false;
895
+ h.past.push({
896
+ ...step,
897
+ before: step.el.__rt,
898
+ at: Date.now()
899
+ });
900
+ step.el.__rtSet(step.before);
901
+ return true;
902
+ };
903
+ /**
904
+ * One action as ONE undo step (a separate copy, "use shared version again", a component inserted): in the host's
905
+ * history when it keeps one (KitServices.historyStep: its toolbar Undo, an Undo toast and ⌘Z here are the same
906
+ * undo), else in this editor's own (`before`: the model the island had; an insert has none, and stays as undoable
907
+ * as any block inserted here). `write` makes the change and answers the island it changed. Answers its undo.
908
+ */
909
+ const oneStep = (label, write, before) => {
910
+ const h = hist.current;
911
+ const made = { el: null };
912
+ const historyStep = services.historyStep;
913
+ const step = historyStep ? historyStep(() => {
914
+ made.el = write();
915
+ }) : (made.el = write(), null);
916
+ const el = made.el;
917
+ if (step) {
918
+ h.hosts = [...h.hosts, {
919
+ label,
920
+ step
921
+ }].slice(-100);
922
+ return () => runHost(step.undo);
923
+ }
924
+ if (!el || !before) return () => "This change has no undo step here.";
925
+ const s = {
926
+ el,
927
+ before,
928
+ label,
929
+ at: Date.now()
930
+ };
931
+ h.past = [...h.past, s].slice(-100);
932
+ h.future = [];
933
+ return () => {
934
+ if (!h.past.includes(s)) return "It was undone already.";
935
+ if (h.past[h.past.length - 1] !== s || s.at < h.textAt) return "Changes made after it come first. Press ⌘Z to undo them.";
936
+ return islandUndo() ? true : "The block was removed, so there is nothing to undo.";
937
+ };
938
+ };
939
+ const record = (el, before, label, coalesce) => {
940
+ const h = hist.current;
941
+ const now = Date.now();
942
+ const top = h.past[h.past.length - 1];
943
+ if (coalesce && top && top.el === el && top.label === label && now - top.at < 500 && top.at > h.textAt) top.at = now;
944
+ else h.past = [...h.past, {
945
+ el,
946
+ before,
947
+ label,
948
+ at: now
949
+ }].slice(-100);
950
+ h.future = [];
951
+ };
952
+ const undoKey = (e) => {
953
+ if (!(e.metaKey || e.ctrlKey) || e.altKey || e.key.toLowerCase() !== "z") return false;
954
+ if (e.shiftKey) {
955
+ if (!islandRedo()) return false;
956
+ e.preventDefault();
957
+ return true;
958
+ }
959
+ if (islandUndo()) {
960
+ e.preventDefault();
961
+ return true;
962
+ }
963
+ if (!hist.current.past.length || !ref.current) return false;
964
+ e.preventDefault();
965
+ const before = ref.current.innerHTML;
966
+ exec("undo");
967
+ if (ref.current.innerHTML === before) {
968
+ hist.current.textAt = 0;
969
+ islandUndo();
970
+ }
971
+ return true;
972
+ };
973
+ const api = React.useRef({
974
+ emit,
975
+ deleteBlock,
976
+ exitIsland,
977
+ record,
978
+ oneStep,
979
+ notify,
980
+ duplicateBlock: duplicateBlock$1,
981
+ moveBlock: moveBlock$1,
982
+ islandUndo,
983
+ islandRedo
984
+ });
985
+ api.current = {
986
+ emit,
987
+ deleteBlock,
988
+ exitIsland,
989
+ record,
990
+ oneStep,
991
+ notify,
992
+ duplicateBlock: duplicateBlock$1,
993
+ moveBlock: moveBlock$1,
994
+ islandUndo,
995
+ islandRedo
996
+ };
997
+ const islandCtx = React.useMemo(() => ({
998
+ readOnly,
999
+ dense,
1000
+ emit: () => api.current.emit(),
1001
+ remove: (x) => api.current.deleteBlock(x),
1002
+ exit: (x) => api.current.exitIsland(x),
1003
+ record: (x, before, label, coalesce) => api.current.record(x, before, label, coalesce),
1004
+ step: (label, write, before) => api.current.oneStep(label, write, before),
1005
+ notify: (message, description) => api.current.notify(message, { description }),
1006
+ duplicate: (x) => api.current.duplicateBlock(x),
1007
+ move: (x, dir) => api.current.moveBlock(x, dir),
1008
+ undo: () => api.current.islandUndo(),
1009
+ redo: () => api.current.islandRedo()
1010
+ }), [readOnly, dense]);
1011
+ const commentSel = onComment ? () => {
1012
+ restoreSel();
1013
+ const q = window.getSelection()?.toString().trim();
1014
+ if (q) onComment(q);
1015
+ } : void 0;
1016
+ const onMark = (cmd) => allows(MARK_FEATURE[cmd]) && run(() => exec(cmd));
1017
+ const onStyle = (tag) => {
1018
+ restoreSel();
1019
+ turnInto$1(currentBlock(), tag);
1020
+ refresh();
1021
+ };
1022
+ const { flipUp, maxHeight: slashMaxH } = slash ? slashPlacement(slash.rect, window.innerHeight) : {
1023
+ flipUp: false,
1024
+ maxHeight: SLASH_MENU_H
1025
+ };
1026
+ const gBlock = gutter?.el;
1027
+ const gIsText = !!gBlock && !gBlock.hasAttribute("data-rt-island") && gBlock.tagName !== "HR";
1028
+ const btn = dense ? "size-5 [&_svg]:size-3.5" : "size-[22px] [&_svg]:size-3.5";
1029
+ const gutterMode = readOnly || dense || single ? "none" : gutterRoom ? "outside" : "inset";
1030
+ const showGutter = gutterMode !== "none";
1031
+ const minH = expanded ? "min-h-[60vh]" : single ? "min-h-9" : dense ? "min-h-[120px]" : "min-h-[190px]";
1032
+ const turnStyles = stylesFor(allows).filter((s) => [
1033
+ "p",
1034
+ "h1",
1035
+ "h2",
1036
+ "h3",
1037
+ "blockquote"
1038
+ ].includes(s.tag));
1039
+ return /* @__PURE__ */ jsx(CatalogComponentsProvider, {
1040
+ value: components ?? null,
1041
+ children: /* @__PURE__ */ jsxs("div", {
1042
+ ref: wrap,
1043
+ "data-rt-editor": "",
1044
+ className: cn("relative rounded-kit-lg border transition-colors duration-150 [--rt-toolbar-h:2rem] pointer-coarse:[--rt-toolbar-h:2.75rem]", expanded ? "bg-[var(--kit-surface-raised)]" : "bg-kit-surface", invalid ? "border-[var(--kit-field-invalid)]" : toolbarOpen ? "border-kit-line-strong" : "border-kit-line"),
1045
+ style: { "--rt-sticky-top": toolbarOpen && !dense ? `calc(${stickyTop}px + var(--rt-toolbar-h))` : "var(--kit-sticky-top, 0px)" },
1046
+ onMouseLeave: () => !blockMenu && !gutterInsert && !drag && setGutter(null),
1047
+ onKeyDown: onWrapKeyDown,
1048
+ onFocus: () => {
1049
+ window.clearTimeout(blurTimer.current);
1050
+ setFocused(true);
1051
+ },
1052
+ onBlur: () => {
1053
+ window.clearTimeout(blurTimer.current);
1054
+ blurTimer.current = window.setTimeout(() => {
1055
+ const a = document.activeElement;
1056
+ if (wrap.current?.contains(a) || a?.closest("[role=menu],[role=dialog],[role=listbox],[data-floating-layer]")) return;
1057
+ setFocused(false);
1058
+ setBubble(null);
1059
+ ref.current?.querySelectorAll("[data-hint]").forEach((n) => n.removeAttribute("data-hint"));
1060
+ if (valueRef.current !== known.current && !md) load(valueRef.current);
1061
+ }, 400);
1062
+ },
1063
+ children: [
1064
+ readOnly ? null : /* @__PURE__ */ jsx(FormatToolbar, {
1065
+ open: toolbarOpen,
1066
+ sticky: !dense,
1067
+ stickyTop,
1068
+ width,
1069
+ dense,
1070
+ fmt,
1071
+ md: !!md,
1072
+ allows,
1073
+ hideFullscreen,
1074
+ insertOpen,
1075
+ setInsertOpen: (o) => {
1076
+ if (o) inserted.current = false;
1077
+ setInsertOpen(o);
1078
+ },
1079
+ onMenuOpen: (name, o) => setMenus((m) => ({
1080
+ ...m,
1081
+ [name]: o
1082
+ })),
1083
+ onStyle,
1084
+ onMark,
1085
+ onList: (kind) => allows(kind) && run(() => {
1086
+ const b = currentBlock();
1087
+ if (b && /^(H[1-6]|BLOCKQUOTE)$/.test(b.tagName)) turnInto$1(b, "p");
1088
+ exec(kind === "ul" ? "insertUnorderedList" : "insertOrderedList");
1089
+ ref.current?.querySelectorAll(":is(p,h1,h2,h3,h4,h5,h6,blockquote) > :is(ul,ol)").forEach((list) => {
1090
+ const host = list.parentElement;
1091
+ host.replaceWith(...Array.from(host.childNodes).filter((n) => n.nodeType === 1 || n.textContent?.trim()));
1092
+ });
1093
+ }),
1094
+ onLink: openLink,
1095
+ onClear: () => run(() => {
1096
+ exec("removeFormat");
1097
+ exec("unlink");
1098
+ }),
1099
+ onComment: commentSel,
1100
+ onInlineCode: () => {
1101
+ restoreSel();
1102
+ toggleInlineCode();
1103
+ },
1104
+ onCodeBlock: () => {
1105
+ restoreSel();
1106
+ if (allows("pre")) turnInto$1(currentBlock(), "pre");
1107
+ },
1108
+ onInsert: (it) => {
1109
+ inserted.current = true;
1110
+ restoreSel();
1111
+ insertBlock(it);
1112
+ setInsertOpen(false);
1113
+ },
1114
+ keepFocusOnInsertClose: () => inserted.current,
1115
+ onFullscreen: () => setModalOpen(true),
1116
+ onMarkdown: toggleMarkdown,
1117
+ saveSel
1118
+ }),
1119
+ md ? /* @__PURE__ */ jsxs("div", {
1120
+ className: "px-3 pb-2.5 pt-2.5",
1121
+ children: [
1122
+ /* @__PURE__ */ jsx(Textarea, {
1123
+ "aria-label": "Field content as Markdown",
1124
+ spellCheck: false,
1125
+ value: md.text,
1126
+ readOnly,
1127
+ onChange: (e) => {
1128
+ setMd({
1129
+ ...md,
1130
+ text: e.target.value
1131
+ });
1132
+ setMdConfirm(false);
1133
+ },
1134
+ className: cn("font-kit-mono text-kit-xs leading-5", expanded ? "min-h-[60vh]" : dense ? "min-h-[120px]" : "min-h-[190px]"),
1135
+ style: scrollable ? { maxHeight } : void 0
1136
+ }),
1137
+ /* @__PURE__ */ jsx("p", {
1138
+ className: "mt-1.5 text-kit-2xs text-kit-fg-3",
1139
+ children: "Markdown. Switching back converts it to blocks."
1140
+ }),
1141
+ /* @__PURE__ */ jsx(AnimatePresence, {
1142
+ initial: false,
1143
+ children: mdConfirm ? /* @__PURE__ */ jsxs(motion.div, {
1144
+ initial: {
1145
+ opacity: 0,
1146
+ y: 4
1147
+ },
1148
+ animate: {
1149
+ opacity: 1,
1150
+ y: 0
1151
+ },
1152
+ exit: {
1153
+ opacity: 0,
1154
+ y: 4
1155
+ },
1156
+ transition: { duration: .15 },
1157
+ role: "alertdialog",
1158
+ "aria-label": "Convert edited Markdown?",
1159
+ className: "mt-2 flex flex-wrap items-center gap-2 rounded-kit-lg border border-kit-line bg-kit-subtle px-3 py-2",
1160
+ children: [
1161
+ /* @__PURE__ */ jsx("span", {
1162
+ className: "flex-1 text-kit-sm font-medium text-kit-fg",
1163
+ children: "Convert edited Markdown?"
1164
+ }),
1165
+ /* @__PURE__ */ jsx(Button, {
1166
+ size: "xs",
1167
+ variant: "ghost",
1168
+ onClick: () => setMdConfirm(false),
1169
+ children: "Keep editing Markdown"
1170
+ }),
1171
+ /* @__PURE__ */ jsx(Button, {
1172
+ size: "xs",
1173
+ variant: "primary",
1174
+ autoFocus: true,
1175
+ onClick: convertMarkdown,
1176
+ children: "Convert to rich text"
1177
+ })
1178
+ ]
1179
+ }, "confirm") : null
1180
+ })
1181
+ ]
1182
+ }) : /* @__PURE__ */ jsxs("div", {
1183
+ ref: scroller,
1184
+ className: cn("relative", scrollable && "overflow-y-auto"),
1185
+ style: scrollable ? { maxHeight } : void 0,
1186
+ onMouseMove: (e) => {
1187
+ if (drag || blockMenu || gutterInsert || !showGutter) return;
1188
+ const t = e.target;
1189
+ if (t.closest("[data-rt-gutter]")) return;
1190
+ placeGutter(topBlock(ref.current, t));
1191
+ },
1192
+ children: [
1193
+ /* @__PURE__ */ jsx("div", {
1194
+ ref,
1195
+ id: inModal ? void 0 : id,
1196
+ role: "textbox",
1197
+ "aria-multiline": !single,
1198
+ "aria-labelledby": !inModal && id ? `${id}-label` : void 0,
1199
+ "aria-label": inModal || !id ? expandCrumbs?.[expandCrumbs.length - 1] ?? "Rich text" : void 0,
1200
+ "aria-placeholder": ph,
1201
+ "aria-readonly": readOnly || void 0,
1202
+ "aria-invalid": invalid || void 0,
1203
+ contentEditable: !readOnly,
1204
+ suppressContentEditableWarning: true,
1205
+ spellCheck: true,
1206
+ tabIndex: readOnly ? 0 : void 0,
1207
+ onInput,
1208
+ onKeyDown,
1209
+ onKeyUp: refresh,
1210
+ onMouseUp: refresh,
1211
+ onPaste: (e) => {
1212
+ if (readOnly) return;
1213
+ if (Array.from(e.clipboardData.files).filter((f) => f.type.startsWith("image/")).length) {
1214
+ e.preventDefault();
1215
+ notify(allows("image") ? "Add images from the media library" : "This field keeps no images", { description: allows("image") ? "A pasted file has no address the page can show it from. Use Insert › Image." : void 0 });
1216
+ return;
1217
+ }
1218
+ const text = e.clipboardData.getData("text/plain");
1219
+ e.preventDefault();
1220
+ if (!text) return;
1221
+ if (single || !/\n/.test(text.trim()) && !looksLikeMarkdown(text)) {
1222
+ insertTextAtCaret(single ? text.replace(/\s*\n\s*/g, " ") : text);
1223
+ emit();
1224
+ return;
1225
+ }
1226
+ let html;
1227
+ try {
1228
+ html = markdownToHtml(text);
1229
+ } catch {
1230
+ html = text.split(/\n{2,}/).map((p) => `<p>${esc(p.trim()).replace(/\n/g, "<br>")}</p>`).join("");
1231
+ }
1232
+ insertHtmlAtCaret(conform(html));
1233
+ if (ref.current) hydrate(ref.current);
1234
+ emit();
1235
+ },
1236
+ onDragOver: (e) => {
1237
+ if (e.dataTransfer.types.includes("application/x-bcms-asset") && allows("image")) e.preventDefault();
1238
+ },
1239
+ onDrop: (e) => {
1240
+ const asset = e.dataTransfer.getData("application/x-bcms-asset");
1241
+ if (!asset || readOnly || !allows("image")) return;
1242
+ e.preventDefault();
1243
+ try {
1244
+ const a = JSON.parse(asset);
1245
+ const b = topBlock(ref.current, e.target);
1246
+ const isl = createIsland("image", defaultModel("image", {
1247
+ src: a.url,
1248
+ alt: a.alt ?? ""
1249
+ }));
1250
+ if (b) b.after(isl);
1251
+ else ref.current?.append(isl);
1252
+ ensureLineAfter(isl);
1253
+ emit();
1254
+ } catch {
1255
+ notify("That drop is not an image from the media library");
1256
+ }
1257
+ },
1258
+ className: cn(RT_PROSE, dense && RT_PANEL, "peer relative outline-none [&_*]:outline-none", "[&>p[data-hint]]:before:pointer-events-none [&>p[data-hint]]:before:float-left [&>p[data-hint]]:before:h-0 [&>p[data-hint]]:before:text-kit-fg-4 [&>p[data-hint]]:before:content-[attr(data-hint)]", dense ? "px-2.5 py-2" : "px-4 py-3.5", minH)
1259
+ }),
1260
+ empty ? /* @__PURE__ */ jsx("div", {
1261
+ "aria-hidden": true,
1262
+ className: cn("pointer-events-none absolute text-kit-fg-4 peer-focus:hidden", dense ? "left-2.5 top-2 text-kit-sm" : "left-4 top-3.5 text-kit-base"),
1263
+ children: ph
1264
+ }) : null,
1265
+ gutter && showGutter ? /* @__PURE__ */ jsxs("div", {
1266
+ "data-rt-gutter": "",
1267
+ className: cn("absolute z-[3] flex items-start", gutterMode === "outside" ? "-left-12 pr-1" : "left-0"),
1268
+ style: { top: gutter.top + Math.max(-2, Math.min(4, gutter.height / 2 - 12)) },
1269
+ children: [gutterMode === "outside" ? /* @__PURE__ */ jsxs(Popover, {
1270
+ open: gutterInsert,
1271
+ onOpenChange: (o) => {
1272
+ if (o) {
1273
+ gutterTarget.current = gutter.el;
1274
+ inserted.current = false;
1275
+ }
1276
+ setGutterInsert(o);
1277
+ },
1278
+ children: [/* @__PURE__ */ jsx(Tooltip, {
1279
+ content: "Add a block below",
1280
+ disabled: gutterInsert,
1281
+ children: /* @__PURE__ */ jsx(PopoverTrigger, {
1282
+ "aria-label": "Add a block below",
1283
+ className: cn("flex items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg data-[popup-open]:bg-kit-hover data-[popup-open]:text-kit-fg", btn),
1284
+ children: /* @__PURE__ */ jsx(IconPlus, {
1285
+ stroke: 1.5,
1286
+ "aria-hidden": true
1287
+ })
1288
+ })
1289
+ }), gutterInsert ? /* @__PURE__ */ jsx(InsertMenuContent, {
1290
+ side: "bottom",
1291
+ align: "start",
1292
+ allows,
1293
+ keepFocusOnClose: () => inserted.current,
1294
+ onInsert: (it) => {
1295
+ const b = gutterTarget.current;
1296
+ const el = ref.current;
1297
+ inserted.current = true;
1298
+ setGutterInsert(false);
1299
+ if (!b || !el || !el.contains(b)) return;
1300
+ const p = document.createElement("p");
1301
+ p.innerHTML = "<br>";
1302
+ b.after(p);
1303
+ el.focus({ preventScroll: true });
1304
+ placeCaret(p);
1305
+ insertBlock(it);
1306
+ }
1307
+ }) : null]
1308
+ }) : null, /* @__PURE__ */ jsxs(Menu, {
1309
+ open: blockMenu,
1310
+ onOpenChange: setBlockMenu,
1311
+ children: [/* @__PURE__ */ jsx(Tooltip, {
1312
+ content: "Drag to move, click for options",
1313
+ disabled: blockMenu || !!drag,
1314
+ children: /* @__PURE__ */ jsx(MenuTrigger, {
1315
+ "aria-label": "Block options",
1316
+ onPointerDown: onGripDown,
1317
+ onKeyDown: (e) => {
1318
+ if (e.key === "Enter" || e.key === " ") {
1319
+ e.preventDefault();
1320
+ setBlockMenu(true);
1321
+ }
1322
+ },
1323
+ className: cn("flex cursor-grab items-center justify-center rounded-kit-md text-kit-fg-3 hover:bg-kit-hover hover:text-kit-fg active:cursor-grabbing", gutterMode === "inset" ? "h-[22px] w-4 rounded-kit-sm [&_svg]:size-3.5" : btn, (blockMenu || drag) && "bg-kit-hover text-kit-fg"),
1324
+ children: /* @__PURE__ */ jsx(IconGripVertical, {
1325
+ stroke: 1.5,
1326
+ "aria-hidden": true
1327
+ })
1328
+ })
1329
+ }), /* @__PURE__ */ jsxs(MenuContent, {
1330
+ className: "w-56",
1331
+ align: "start",
1332
+ finalFocus: false,
1333
+ children: [
1334
+ turnStyles.length > 1 ? /* @__PURE__ */ jsxs(MenuSub, { children: [/* @__PURE__ */ jsx(MenuSubTrigger, {
1335
+ icon: /* @__PURE__ */ jsx(IconTransform, { stroke: 1.5 }),
1336
+ disabled: !gIsText,
1337
+ children: "Turn into"
1338
+ }), /* @__PURE__ */ jsx(MenuSubContent, {
1339
+ className: "w-48",
1340
+ children: turnStyles.map((t) => /* @__PURE__ */ jsx(MenuItem, {
1341
+ icon: t.icon,
1342
+ onClick: () => turnInto$1(gBlock ?? null, t.tag),
1343
+ children: t.label
1344
+ }, t.tag))
1345
+ })] }) : null,
1346
+ /* @__PURE__ */ jsx(MenuItem, {
1347
+ icon: /* @__PURE__ */ jsx(IconCopy, { stroke: 1.5 }),
1348
+ shortcut: "⌘D",
1349
+ onClick: () => gBlock && duplicateBlock$1(gBlock),
1350
+ children: "Duplicate"
1351
+ }),
1352
+ /* @__PURE__ */ jsx(MenuItem, {
1353
+ icon: /* @__PURE__ */ jsx(IconArrowBarToUp, { stroke: 1.5 }),
1354
+ shortcut: "⌘⇧↑",
1355
+ disabled: !gBlock?.previousElementSibling,
1356
+ onClick: () => gBlock && moveBlock$1(gBlock, -1),
1357
+ children: "Move up"
1358
+ }),
1359
+ /* @__PURE__ */ jsx(MenuItem, {
1360
+ icon: /* @__PURE__ */ jsx(IconArrowBarToDown, { stroke: 1.5 }),
1361
+ shortcut: "⌘⇧↓",
1362
+ disabled: !gBlock?.nextElementSibling,
1363
+ onClick: () => gBlock && moveBlock$1(gBlock, 1),
1364
+ children: "Move down"
1365
+ }),
1366
+ /* @__PURE__ */ jsx(MenuSeparator, {}),
1367
+ /* @__PURE__ */ jsx(MenuItem, {
1368
+ danger: true,
1369
+ icon: /* @__PURE__ */ jsx(IconTrash, { stroke: 1.5 }),
1370
+ onClick: () => gBlock && deleteBlock(gBlock),
1371
+ children: "Delete"
1372
+ })
1373
+ ]
1374
+ })]
1375
+ })]
1376
+ }) : null,
1377
+ drag?.line != null ? /* @__PURE__ */ jsx("div", {
1378
+ className: "pointer-events-none absolute inset-x-3 z-[6] h-0.5 rounded-full bg-kit-info",
1379
+ style: { top: drag.line }
1380
+ }) : null,
1381
+ islands.map(({ id: key, el }) => createPortal(/* @__PURE__ */ jsx(Island, {
1382
+ el,
1383
+ ctx: islandCtx
1384
+ }), el, key))
1385
+ ]
1386
+ }),
1387
+ /* @__PURE__ */ jsxs("div", {
1388
+ className: "flex min-h-7 items-center justify-end gap-3 rounded-b-kit-lg border-t border-kit-line-subtle px-3 text-kit-2xs text-kit-fg-3",
1389
+ children: [notice ? /* @__PURE__ */ jsxs("span", {
1390
+ role: "status",
1391
+ "aria-live": "polite",
1392
+ className: "mr-auto min-w-0 truncate text-kit-fg-2",
1393
+ children: [
1394
+ notice.message,
1395
+ notice.description ? ` ${notice.description}` : "",
1396
+ notice.action ? /* @__PURE__ */ jsx("button", {
1397
+ type: "button",
1398
+ className: "ml-1.5 font-medium text-kit-fg underline underline-offset-2",
1399
+ onClick: () => {
1400
+ notice.action.onClick();
1401
+ setNotice(null);
1402
+ },
1403
+ children: notice.action.label
1404
+ }) : null
1405
+ ]
1406
+ }) : null, /* @__PURE__ */ jsxs("span", {
1407
+ className: "shrink-0 tabular-nums",
1408
+ children: [
1409
+ words.toLocaleString("en-US"),
1410
+ " ",
1411
+ words === 1 ? "word" : "words",
1412
+ comps ? ` · ${comps} ${comps === 1 ? "component" : "components"}` : "",
1413
+ " · ",
1414
+ Math.max(1, Math.round(words / 220)),
1415
+ " min read"
1416
+ ]
1417
+ })]
1418
+ }),
1419
+ bubble && !readOnly && !slash && !link && !md && !menus.style && !menus.more && !insertOpen ? /* @__PURE__ */ jsx(SelectionBubble, {
1420
+ rect: bubble,
1421
+ avoid: toolbarOpen ? wrap.current?.querySelector("[role=\"toolbar\"][aria-label=\"Text formatting\"]")?.getBoundingClientRect() : null,
1422
+ fmt,
1423
+ allows,
1424
+ saveSel,
1425
+ onAi: canAI ? aiRewrite : void 0,
1426
+ onStyle,
1427
+ onMark,
1428
+ onInlineCode: () => {
1429
+ restoreSel();
1430
+ toggleInlineCode();
1431
+ },
1432
+ onLink: openLink,
1433
+ onComment: commentSel
1434
+ }) : null,
1435
+ slash && !md ? createPortal(/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
1436
+ "data-floating-layer": "",
1437
+ className: "pointer-events-auto fixed inset-0 z-[84]",
1438
+ onMouseDown: () => setSlash(null)
1439
+ }), /* @__PURE__ */ jsx(motion.div, {
1440
+ initial: {
1441
+ opacity: 0,
1442
+ y: flipUp ? -4 : 4
1443
+ },
1444
+ animate: {
1445
+ opacity: 1,
1446
+ y: 0
1447
+ },
1448
+ transition: { duration: .14 },
1449
+ style: {
1450
+ left: Math.min(window.innerWidth - 330, Math.max(8, slash.rect.left)),
1451
+ ...flipUp ? { bottom: window.innerHeight - slash.rect.top + 6 } : { top: slash.rect.bottom + 6 }
1452
+ },
1453
+ "data-floating-layer": "",
1454
+ className: "pointer-events-auto fixed z-[85]",
1455
+ children: /* @__PURE__ */ jsx(SlashMenuPanel, {
1456
+ query: slash.query,
1457
+ folder: slash.folder,
1458
+ active: slash.active,
1459
+ allows,
1460
+ setActive: (a) => setSlash((s) => s && {
1461
+ ...s,
1462
+ active: a
1463
+ }),
1464
+ onPick: pickSlash,
1465
+ maxHeight: slashMaxH
1466
+ })
1467
+ })] }), document.body) : null,
1468
+ /* @__PURE__ */ jsxs(Popover, {
1469
+ open: !!link,
1470
+ onOpenChange: (o) => !o && setLink(null),
1471
+ children: [/* @__PURE__ */ jsx(PopoverAnchor, { render: /* @__PURE__ */ jsx("span", {
1472
+ className: "pointer-events-none fixed",
1473
+ style: link ? {
1474
+ top: link.rect.bottom,
1475
+ left: link.rect.left,
1476
+ width: Math.max(1, link.rect.width),
1477
+ height: 1
1478
+ } : {
1479
+ top: 0,
1480
+ left: 0
1481
+ }
1482
+ }) }), /* @__PURE__ */ jsx(PopoverContent, {
1483
+ className: "w-[340px] rounded-kit-lg p-3",
1484
+ finalFocus: false,
1485
+ children: link ? /* @__PURE__ */ jsx(LinkForm, {
1486
+ initial: link.initial,
1487
+ allowNewTab,
1488
+ onSave: saveLink,
1489
+ onCancel: () => setLink(null),
1490
+ onDetach: link.existing ? () => {
1491
+ const a = link.existing;
1492
+ a.replaceWith(...Array.from(a.childNodes));
1493
+ setLink(null);
1494
+ emit();
1495
+ } : void 0
1496
+ }) : null
1497
+ })]
1498
+ }),
1499
+ !hideFullscreen ? /* @__PURE__ */ jsx(ExpandedEditorModal, {
1500
+ open: modalOpen,
1501
+ onOpenChange: setModalOpen,
1502
+ crumbs: expandCrumbs?.length ? expandCrumbs : ["Text"],
1503
+ returnFocus: () => ref.current,
1504
+ meta: bodyCountLabel(value),
1505
+ children: modalOpen ? /* @__PURE__ */ jsx(RichTextEditor, {
1506
+ value,
1507
+ onChange,
1508
+ readOnly,
1509
+ placeholder,
1510
+ docKey: `${docKey}:expanded`,
1511
+ features,
1512
+ single,
1513
+ allowNewTab,
1514
+ expandCrumbs,
1515
+ variant: "document",
1516
+ hideFullscreen: true,
1517
+ inModal: true,
1518
+ autoFocus: true,
1519
+ onComment,
1520
+ components
1521
+ }) : null
1522
+ }) : null
1523
+ ]
1524
+ })
1525
+ });
1526
+ }
1527
+ //#endregion
1528
+ export { RichTextEditor };
1529
+
1530
+ //# sourceMappingURL=editor.js.map