commspliant-html-editor 0.0.1

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 (323) hide show
  1. package/README.md +315 -0
  2. package/dist/commspliant-html-editor.css +1 -0
  3. package/dist/components/Editor.d.ts +3 -0
  4. package/dist/components/Editor.d.ts.map +1 -0
  5. package/dist/components/HtmlSurface.d.ts +9 -0
  6. package/dist/components/HtmlSurface.d.ts.map +1 -0
  7. package/dist/components/VisualSurface.d.ts +13 -0
  8. package/dist/components/VisualSurface.d.ts.map +1 -0
  9. package/dist/core/blockFormat.d.ts +10 -0
  10. package/dist/core/blockFormat.d.ts.map +1 -0
  11. package/dist/core/blocks.d.ts +19 -0
  12. package/dist/core/blocks.d.ts.map +1 -0
  13. package/dist/core/bookmark.d.ts +10 -0
  14. package/dist/core/bookmark.d.ts.map +1 -0
  15. package/dist/core/cellProperties.d.ts +18 -0
  16. package/dist/core/cellProperties.d.ts.map +1 -0
  17. package/dist/core/clearFormatting.d.ts +2 -0
  18. package/dist/core/clearFormatting.d.ts.map +1 -0
  19. package/dist/core/clipboard.d.ts +9 -0
  20. package/dist/core/clipboard.d.ts.map +1 -0
  21. package/dist/core/commandTypes.d.ts +229 -0
  22. package/dist/core/commandTypes.d.ts.map +1 -0
  23. package/dist/core/commands.d.ts +5 -0
  24. package/dist/core/commands.d.ts.map +1 -0
  25. package/dist/core/cssLength.d.ts +13 -0
  26. package/dist/core/cssLength.d.ts.map +1 -0
  27. package/dist/core/customActions.d.ts +12 -0
  28. package/dist/core/customActions.d.ts.map +1 -0
  29. package/dist/core/fontFamily.d.ts +40 -0
  30. package/dist/core/fontFamily.d.ts.map +1 -0
  31. package/dist/core/fontSize.d.ts +25 -0
  32. package/dist/core/fontSize.d.ts.map +1 -0
  33. package/dist/core/fontSizeUnits.d.ts +29 -0
  34. package/dist/core/fontSizeUnits.d.ts.map +1 -0
  35. package/dist/core/image.d.ts +19 -0
  36. package/dist/core/image.d.ts.map +1 -0
  37. package/dist/core/imageProperties.d.ts +35 -0
  38. package/dist/core/imageProperties.d.ts.map +1 -0
  39. package/dist/core/imageResize.d.ts +18 -0
  40. package/dist/core/imageResize.d.ts.map +1 -0
  41. package/dist/core/imageSize.d.ts +23 -0
  42. package/dist/core/imageSize.d.ts.map +1 -0
  43. package/dist/core/indent.d.ts +7 -0
  44. package/dist/core/indent.d.ts.map +1 -0
  45. package/dist/core/inlineColor.d.ts +23 -0
  46. package/dist/core/inlineColor.d.ts.map +1 -0
  47. package/dist/core/inlineRange.d.ts +10 -0
  48. package/dist/core/inlineRange.d.ts.map +1 -0
  49. package/dist/core/link.d.ts +18 -0
  50. package/dist/core/link.d.ts.map +1 -0
  51. package/dist/core/lists.d.ts +12 -0
  52. package/dist/core/lists.d.ts.map +1 -0
  53. package/dist/core/marks.d.ts +18 -0
  54. package/dist/core/marks.d.ts.map +1 -0
  55. package/dist/core/page.d.ts +8 -0
  56. package/dist/core/page.d.ts.map +1 -0
  57. package/dist/core/pageProperties.d.ts +7 -0
  58. package/dist/core/pageProperties.d.ts.map +1 -0
  59. package/dist/core/paragraphBox.d.ts +82 -0
  60. package/dist/core/paragraphBox.d.ts.map +1 -0
  61. package/dist/core/paragraphProperties.d.ts +17 -0
  62. package/dist/core/paragraphProperties.d.ts.map +1 -0
  63. package/dist/core/rowProperties.d.ts +17 -0
  64. package/dist/core/rowProperties.d.ts.map +1 -0
  65. package/dist/core/selection.d.ts +22 -0
  66. package/dist/core/selection.d.ts.map +1 -0
  67. package/dist/core/table.d.ts +28 -0
  68. package/dist/core/table.d.ts.map +1 -0
  69. package/dist/core/tableProperties.d.ts +18 -0
  70. package/dist/core/tableProperties.d.ts.map +1 -0
  71. package/dist/core/textAlign.d.ts +9 -0
  72. package/dist/core/textAlign.d.ts.map +1 -0
  73. package/dist/hooks/useControllableState.d.ts +8 -0
  74. package/dist/hooks/useControllableState.d.ts.map +1 -0
  75. package/dist/i18n/LocaleProvider.d.ts +11 -0
  76. package/dist/i18n/LocaleProvider.d.ts.map +1 -0
  77. package/dist/i18n/en.d.ts +3 -0
  78. package/dist/i18n/en.d.ts.map +1 -0
  79. package/dist/i18n/es.d.ts +3 -0
  80. package/dist/i18n/es.d.ts.map +1 -0
  81. package/dist/i18n/types.d.ts +333 -0
  82. package/dist/i18n/types.d.ts.map +1 -0
  83. package/dist/icons/AlignCenterIcon.d.ts +3 -0
  84. package/dist/icons/AlignCenterIcon.d.ts.map +1 -0
  85. package/dist/icons/AlignJustifyIcon.d.ts +3 -0
  86. package/dist/icons/AlignJustifyIcon.d.ts.map +1 -0
  87. package/dist/icons/AlignLeftIcon.d.ts +3 -0
  88. package/dist/icons/AlignLeftIcon.d.ts.map +1 -0
  89. package/dist/icons/AlignRightIcon.d.ts +3 -0
  90. package/dist/icons/AlignRightIcon.d.ts.map +1 -0
  91. package/dist/icons/BoldIcon.d.ts +3 -0
  92. package/dist/icons/BoldIcon.d.ts.map +1 -0
  93. package/dist/icons/BookmarkIcon.d.ts +3 -0
  94. package/dist/icons/BookmarkIcon.d.ts.map +1 -0
  95. package/dist/icons/BulletListIcon.d.ts +3 -0
  96. package/dist/icons/BulletListIcon.d.ts.map +1 -0
  97. package/dist/icons/CellPropertiesIcon.d.ts +3 -0
  98. package/dist/icons/CellPropertiesIcon.d.ts.map +1 -0
  99. package/dist/icons/ClearFormattingIcon.d.ts +3 -0
  100. package/dist/icons/ClearFormattingIcon.d.ts.map +1 -0
  101. package/dist/icons/CloseIcon.d.ts +3 -0
  102. package/dist/icons/CloseIcon.d.ts.map +1 -0
  103. package/dist/icons/CommspliantShieldIcon.d.ts +3 -0
  104. package/dist/icons/CommspliantShieldIcon.d.ts.map +1 -0
  105. package/dist/icons/CustomActionIcon.d.ts +3 -0
  106. package/dist/icons/CustomActionIcon.d.ts.map +1 -0
  107. package/dist/icons/FontColorIcon.d.ts +3 -0
  108. package/dist/icons/FontColorIcon.d.ts.map +1 -0
  109. package/dist/icons/FontPropertiesIcon.d.ts +3 -0
  110. package/dist/icons/FontPropertiesIcon.d.ts.map +1 -0
  111. package/dist/icons/FullscreenIcon.d.ts +3 -0
  112. package/dist/icons/FullscreenIcon.d.ts.map +1 -0
  113. package/dist/icons/HighlightColorIcon.d.ts +3 -0
  114. package/dist/icons/HighlightColorIcon.d.ts.map +1 -0
  115. package/dist/icons/HtmlIcon.d.ts +3 -0
  116. package/dist/icons/HtmlIcon.d.ts.map +1 -0
  117. package/dist/icons/ImageIcon.d.ts +3 -0
  118. package/dist/icons/ImageIcon.d.ts.map +1 -0
  119. package/dist/icons/IndentIcon.d.ts +3 -0
  120. package/dist/icons/IndentIcon.d.ts.map +1 -0
  121. package/dist/icons/ItalicIcon.d.ts +3 -0
  122. package/dist/icons/ItalicIcon.d.ts.map +1 -0
  123. package/dist/icons/LinkIcon.d.ts +3 -0
  124. package/dist/icons/LinkIcon.d.ts.map +1 -0
  125. package/dist/icons/MenuIcon.d.ts +3 -0
  126. package/dist/icons/MenuIcon.d.ts.map +1 -0
  127. package/dist/icons/NumberedListIcon.d.ts +3 -0
  128. package/dist/icons/NumberedListIcon.d.ts.map +1 -0
  129. package/dist/icons/OpenIcon.d.ts +3 -0
  130. package/dist/icons/OpenIcon.d.ts.map +1 -0
  131. package/dist/icons/OutdentIcon.d.ts +3 -0
  132. package/dist/icons/OutdentIcon.d.ts.map +1 -0
  133. package/dist/icons/PagePropertiesIcon.d.ts +3 -0
  134. package/dist/icons/PagePropertiesIcon.d.ts.map +1 -0
  135. package/dist/icons/ParagraphPropertiesIcon.d.ts +3 -0
  136. package/dist/icons/ParagraphPropertiesIcon.d.ts.map +1 -0
  137. package/dist/icons/PlusIcon.d.ts +3 -0
  138. package/dist/icons/PlusIcon.d.ts.map +1 -0
  139. package/dist/icons/PrintIcon.d.ts +3 -0
  140. package/dist/icons/PrintIcon.d.ts.map +1 -0
  141. package/dist/icons/RedoIcon.d.ts +3 -0
  142. package/dist/icons/RedoIcon.d.ts.map +1 -0
  143. package/dist/icons/RowPropertiesIcon.d.ts +3 -0
  144. package/dist/icons/RowPropertiesIcon.d.ts.map +1 -0
  145. package/dist/icons/SaveIcon.d.ts +3 -0
  146. package/dist/icons/SaveIcon.d.ts.map +1 -0
  147. package/dist/icons/StrikethroughIcon.d.ts +3 -0
  148. package/dist/icons/StrikethroughIcon.d.ts.map +1 -0
  149. package/dist/icons/TableColumnIcon.d.ts +3 -0
  150. package/dist/icons/TableColumnIcon.d.ts.map +1 -0
  151. package/dist/icons/TableIcon.d.ts +3 -0
  152. package/dist/icons/TableIcon.d.ts.map +1 -0
  153. package/dist/icons/TableRowIcon.d.ts +3 -0
  154. package/dist/icons/TableRowIcon.d.ts.map +1 -0
  155. package/dist/icons/UnderlineIcon.d.ts +3 -0
  156. package/dist/icons/UnderlineIcon.d.ts.map +1 -0
  157. package/dist/icons/UndoIcon.d.ts +3 -0
  158. package/dist/icons/UndoIcon.d.ts.map +1 -0
  159. package/dist/icons/VisualIcon.d.ts +3 -0
  160. package/dist/icons/VisualIcon.d.ts.map +1 -0
  161. package/dist/icons/index.d.ts +41 -0
  162. package/dist/icons/index.d.ts.map +1 -0
  163. package/dist/icons/types.d.ts +4 -0
  164. package/dist/icons/types.d.ts.map +1 -0
  165. package/dist/index.cjs +92 -0
  166. package/dist/index.d.ts +3 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +13150 -0
  169. package/dist/modules/contextMenu/ContextMenu.d.ts +13 -0
  170. package/dist/modules/contextMenu/ContextMenu.d.ts.map +1 -0
  171. package/dist/modules/contextMenu/commands.d.ts +3 -0
  172. package/dist/modules/contextMenu/commands.d.ts.map +1 -0
  173. package/dist/modules/contextMenu/index.d.ts +4 -0
  174. package/dist/modules/contextMenu/index.d.ts.map +1 -0
  175. package/dist/modules/file/catalog.d.ts +3 -0
  176. package/dist/modules/file/catalog.d.ts.map +1 -0
  177. package/dist/modules/file/commands.d.ts +3 -0
  178. package/dist/modules/file/commands.d.ts.map +1 -0
  179. package/dist/modules/file/fileDialogs.d.ts +3 -0
  180. package/dist/modules/file/fileDialogs.d.ts.map +1 -0
  181. package/dist/modules/file/index.d.ts +4 -0
  182. package/dist/modules/file/index.d.ts.map +1 -0
  183. package/dist/modules/file/printHtml.d.ts +2 -0
  184. package/dist/modules/file/printHtml.d.ts.map +1 -0
  185. package/dist/modules/format/ColorField.d.ts +11 -0
  186. package/dist/modules/format/ColorField.d.ts.map +1 -0
  187. package/dist/modules/format/ColorPicker.d.ts +13 -0
  188. package/dist/modules/format/ColorPicker.d.ts.map +1 -0
  189. package/dist/modules/format/ColorSelect.d.ts +16 -0
  190. package/dist/modules/format/ColorSelect.d.ts.map +1 -0
  191. package/dist/modules/format/CustomParagraphStyleDialog.d.ts +21 -0
  192. package/dist/modules/format/CustomParagraphStyleDialog.d.ts.map +1 -0
  193. package/dist/modules/format/FontColorSelect.d.ts +3 -0
  194. package/dist/modules/format/FontColorSelect.d.ts.map +1 -0
  195. package/dist/modules/format/FontFamilyList.d.ts +16 -0
  196. package/dist/modules/format/FontFamilyList.d.ts.map +1 -0
  197. package/dist/modules/format/FontFamilySelect.d.ts +15 -0
  198. package/dist/modules/format/FontFamilySelect.d.ts.map +1 -0
  199. package/dist/modules/format/FontPropertiesDialog.d.ts +24 -0
  200. package/dist/modules/format/FontPropertiesDialog.d.ts.map +1 -0
  201. package/dist/modules/format/FontPropertiesFields.d.ts +12 -0
  202. package/dist/modules/format/FontPropertiesFields.d.ts.map +1 -0
  203. package/dist/modules/format/FontSizeCombobox.d.ts +13 -0
  204. package/dist/modules/format/FontSizeCombobox.d.ts.map +1 -0
  205. package/dist/modules/format/FontSizeSelect.d.ts +3 -0
  206. package/dist/modules/format/FontSizeSelect.d.ts.map +1 -0
  207. package/dist/modules/format/HighlightColorSelect.d.ts +4 -0
  208. package/dist/modules/format/HighlightColorSelect.d.ts.map +1 -0
  209. package/dist/modules/format/LengthField.d.ts +12 -0
  210. package/dist/modules/format/LengthField.d.ts.map +1 -0
  211. package/dist/modules/format/PagePropertiesDialog.d.ts +14 -0
  212. package/dist/modules/format/PagePropertiesDialog.d.ts.map +1 -0
  213. package/dist/modules/format/ParagraphPropertiesDialog.d.ts +12 -0
  214. package/dist/modules/format/ParagraphPropertiesDialog.d.ts.map +1 -0
  215. package/dist/modules/format/ParagraphPropertiesFields.d.ts +13 -0
  216. package/dist/modules/format/ParagraphPropertiesFields.d.ts.map +1 -0
  217. package/dist/modules/format/ParagraphStyleList.d.ts +22 -0
  218. package/dist/modules/format/ParagraphStyleList.d.ts.map +1 -0
  219. package/dist/modules/format/ParagraphStyleSelect.d.ts +4 -0
  220. package/dist/modules/format/ParagraphStyleSelect.d.ts.map +1 -0
  221. package/dist/modules/format/ShadowFields.d.ts +8 -0
  222. package/dist/modules/format/ShadowFields.d.ts.map +1 -0
  223. package/dist/modules/format/catalog.d.ts +3 -0
  224. package/dist/modules/format/catalog.d.ts.map +1 -0
  225. package/dist/modules/format/colorModel.d.ts +22 -0
  226. package/dist/modules/format/colorModel.d.ts.map +1 -0
  227. package/dist/modules/format/colorPalette.d.ts +3 -0
  228. package/dist/modules/format/colorPalette.d.ts.map +1 -0
  229. package/dist/modules/format/commands.d.ts +4 -0
  230. package/dist/modules/format/commands.d.ts.map +1 -0
  231. package/dist/modules/format/fontDialog.d.ts +9 -0
  232. package/dist/modules/format/fontDialog.d.ts.map +1 -0
  233. package/dist/modules/format/fontSize.d.ts +2 -0
  234. package/dist/modules/format/fontSize.d.ts.map +1 -0
  235. package/dist/modules/format/index.d.ts +3 -0
  236. package/dist/modules/format/index.d.ts.map +1 -0
  237. package/dist/modules/format/pageDialog.d.ts +9 -0
  238. package/dist/modules/format/pageDialog.d.ts.map +1 -0
  239. package/dist/modules/format/paragraphDialog.d.ts +9 -0
  240. package/dist/modules/format/paragraphDialog.d.ts.map +1 -0
  241. package/dist/modules/history/catalog.d.ts +3 -0
  242. package/dist/modules/history/catalog.d.ts.map +1 -0
  243. package/dist/modules/history/commands.d.ts +4 -0
  244. package/dist/modules/history/commands.d.ts.map +1 -0
  245. package/dist/modules/history/history.d.ts +15 -0
  246. package/dist/modules/history/history.d.ts.map +1 -0
  247. package/dist/modules/history/index.d.ts +5 -0
  248. package/dist/modules/history/index.d.ts.map +1 -0
  249. package/dist/modules/insert/BookmarkDialog.d.ts +9 -0
  250. package/dist/modules/insert/BookmarkDialog.d.ts.map +1 -0
  251. package/dist/modules/insert/ImageDialog.d.ts +12 -0
  252. package/dist/modules/insert/ImageDialog.d.ts.map +1 -0
  253. package/dist/modules/insert/ImagePropertiesDialog.d.ts +13 -0
  254. package/dist/modules/insert/ImagePropertiesDialog.d.ts.map +1 -0
  255. package/dist/modules/insert/ImagePropertiesFields.d.ts +11 -0
  256. package/dist/modules/insert/ImagePropertiesFields.d.ts.map +1 -0
  257. package/dist/modules/insert/ImageResizeOverlay.d.ts +7 -0
  258. package/dist/modules/insert/ImageResizeOverlay.d.ts.map +1 -0
  259. package/dist/modules/insert/ImageSizeField.d.ts +10 -0
  260. package/dist/modules/insert/ImageSizeField.d.ts.map +1 -0
  261. package/dist/modules/insert/LinkDialog.d.ts +22 -0
  262. package/dist/modules/insert/LinkDialog.d.ts.map +1 -0
  263. package/dist/modules/insert/catalog.d.ts +3 -0
  264. package/dist/modules/insert/catalog.d.ts.map +1 -0
  265. package/dist/modules/insert/commands.d.ts +4 -0
  266. package/dist/modules/insert/commands.d.ts.map +1 -0
  267. package/dist/modules/insert/imagePropertiesDialog.d.ts +9 -0
  268. package/dist/modules/insert/imagePropertiesDialog.d.ts.map +1 -0
  269. package/dist/modules/insert/index.d.ts +3 -0
  270. package/dist/modules/insert/index.d.ts.map +1 -0
  271. package/dist/modules/table/CellPropertiesDialog.d.ts +10 -0
  272. package/dist/modules/table/CellPropertiesDialog.d.ts.map +1 -0
  273. package/dist/modules/table/CellPropertiesFields.d.ts +8 -0
  274. package/dist/modules/table/CellPropertiesFields.d.ts.map +1 -0
  275. package/dist/modules/table/RowPropertiesDialog.d.ts +10 -0
  276. package/dist/modules/table/RowPropertiesDialog.d.ts.map +1 -0
  277. package/dist/modules/table/RowPropertiesFields.d.ts +8 -0
  278. package/dist/modules/table/RowPropertiesFields.d.ts.map +1 -0
  279. package/dist/modules/table/TableDialog.d.ts +9 -0
  280. package/dist/modules/table/TableDialog.d.ts.map +1 -0
  281. package/dist/modules/table/TablePropertiesDialog.d.ts +10 -0
  282. package/dist/modules/table/TablePropertiesDialog.d.ts.map +1 -0
  283. package/dist/modules/table/TablePropertiesFields.d.ts +8 -0
  284. package/dist/modules/table/TablePropertiesFields.d.ts.map +1 -0
  285. package/dist/modules/table/catalog.d.ts +3 -0
  286. package/dist/modules/table/catalog.d.ts.map +1 -0
  287. package/dist/modules/table/commands.d.ts +4 -0
  288. package/dist/modules/table/commands.d.ts.map +1 -0
  289. package/dist/modules/table/index.d.ts +3 -0
  290. package/dist/modules/table/index.d.ts.map +1 -0
  291. package/dist/modules/view/catalog.d.ts +3 -0
  292. package/dist/modules/view/catalog.d.ts.map +1 -0
  293. package/dist/modules/view/commands.d.ts +4 -0
  294. package/dist/modules/view/commands.d.ts.map +1 -0
  295. package/dist/modules/view/index.d.ts +3 -0
  296. package/dist/modules/view/index.d.ts.map +1 -0
  297. package/dist/toolbar/EditorToolbar.d.ts +14 -0
  298. package/dist/toolbar/EditorToolbar.d.ts.map +1 -0
  299. package/dist/toolbar/IconNav.d.ts +12 -0
  300. package/dist/toolbar/IconNav.d.ts.map +1 -0
  301. package/dist/toolbar/MenuBar.d.ts +18 -0
  302. package/dist/toolbar/MenuBar.d.ts.map +1 -0
  303. package/dist/toolbar/ScrollChevronIcons.d.ts +4 -0
  304. package/dist/toolbar/ScrollChevronIcons.d.ts.map +1 -0
  305. package/dist/toolbar/Tooltip.d.ts +11 -0
  306. package/dist/toolbar/Tooltip.d.ts.map +1 -0
  307. package/dist/toolbar/defaultCatalog.d.ts +4 -0
  308. package/dist/toolbar/defaultCatalog.d.ts.map +1 -0
  309. package/dist/toolbar/defaultLayout.d.ts +3 -0
  310. package/dist/toolbar/defaultLayout.d.ts.map +1 -0
  311. package/dist/toolbar/index.d.ts +7 -0
  312. package/dist/toolbar/index.d.ts.map +1 -0
  313. package/dist/toolbar/overflow.d.ts +7 -0
  314. package/dist/toolbar/overflow.d.ts.map +1 -0
  315. package/dist/toolbar/resolveChrome.d.ts +12 -0
  316. package/dist/toolbar/resolveChrome.d.ts.map +1 -0
  317. package/dist/toolbar/types.d.ts +65 -0
  318. package/dist/toolbar/types.d.ts.map +1 -0
  319. package/dist/toolbar/useIconNavOverflow.d.ts +9 -0
  320. package/dist/toolbar/useIconNavOverflow.d.ts.map +1 -0
  321. package/dist/types.d.ts +186 -0
  322. package/dist/types.d.ts.map +1 -0
  323. package/package.json +53 -0
package/README.md ADDED
@@ -0,0 +1,315 @@
1
+ # commspliant-html-editor
2
+
3
+ **Try it out here:** [https://htmleditor.commspliant.com/](https://htmleditor.commspliant.com/)
4
+
5
+ Reusable React + TypeScript editor with two base modes: **Visual** (`contenteditable`) and **HTML** (plain-text source). Downstream apps import the package; they do not copy source.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install commspliant-html-editor
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ Peer dependencies: `react` and `react-dom` (^18).
16
+
17
+ ```tsx
18
+ import { useState } from 'react'
19
+ import { Editor } from 'commspliant-html-editor'
20
+ import 'commspliant-html-editor/styles.css'
21
+
22
+ export function App() {
23
+ const [fullscreen, setFullscreen] = useState(false)
24
+
25
+ return (
26
+ <Editor
27
+ defaultValue="<p>Hello <strong>world</strong></p>"
28
+ placeholder="Start writing…"
29
+ fullscreen={fullscreen}
30
+ onFullscreenChange={setFullscreen}
31
+ />
32
+ )
33
+ }
34
+ ```
35
+
36
+ ### Props
37
+
38
+ | Prop | Type | Default | Description |
39
+ | --- | --- | --- | --- |
40
+ | `value` | `string` | — | Controlled HTML document |
41
+ | `defaultValue` | `string` | `''` | Initial HTML when uncontrolled |
42
+ | `onChange` | `(html: string) => void` | — | Fires when either surface edits the document |
43
+ | `mode` | `'visual' \| 'html'` | — | Controlled mode |
44
+ | `defaultMode` | `'visual' \| 'html'` | `'visual'` | Initial mode when uncontrolled |
45
+ | `onModeChange` | `(mode: EditorMode) => void` | — | Fires when the built-in Visual / HTML toggle is used |
46
+ | `fullscreen` | `boolean` | — | Controlled full-screen overlay |
47
+ | `defaultFullscreen` | `boolean` | `false` | Initial overlay when uncontrolled |
48
+ | `onFullscreenChange` | `(fullscreen: boolean) => void` | — | Fires when full screen is entered or exited |
49
+ | `placeholder` | `string` | — | Empty-state hint |
50
+ | `disabled` | `boolean` | — | Disables both surfaces, menus, toolbar commands, and the Visual / HTML / Full screen toggles |
51
+ | `className` | `string` | — | Extra class on the editor root |
52
+ | `locale` | `'en' \| 'es'` | `'en'` | Library chrome language. Document content is not translated |
53
+ | `toolbarBackground` | `string` | `#f0f0f0` | CSS color for the icon toolbar row. Omit to use the default light gray |
54
+ | `menuColor` | `string` | `#444` | CSS color for menu bar text and dropdown items |
55
+ | `menuBackground` | `string` | `#fff` | CSS color for the menu bar and dropdown panel |
56
+ | `menuFontSize` | `string` | `0.875rem` | CSS font-size for menu triggers and items. Omit to use the default |
57
+ | `menuFontFamily` | `string` | inherit | CSS font-family for menus. Omit to inherit `system-ui, sans-serif`. Load webfonts on the host page before passing a custom family |
58
+ | `border` | `'none' \| EditorBorder` | `1px` `#d0d0d0`, radius `6px` | Outer editor box. `'none'` removes width, radius, and shadow. Object fields (`width`, `color`, `radius`, `shadow`) are independent; omitted fields keep the defaults |
59
+ | `menuVisible` | `boolean` | `true` | Show the dropdown menu bar. Set `false` to hide it |
60
+ | `toolbarVisible` | `boolean` | `true` | Show the icon toolbar. Set `false` to hide it |
61
+ | `customActions` | `CustomAction[]` | — | Host-defined menu items and/or toolbar buttons. See [Custom actions](#custom-actions) |
62
+ | `customFonts` | `CustomFont[]` | — | Extra document font faces after the built-in web-safe list. See [Custom fonts](#custom-fonts) |
63
+ | `transformHtml` | `(html: string) => string` | — | Optional map over document HTML before it is stored and passed to `onChange`. See [Transform HTML](#transform-html) |
64
+ | `customImagePicker` | `CustomImagePicker` | — | Optional third Insert image source. See [Custom image picker](#custom-image-picker) |
65
+ | `disableBuiltinImageInsert` | `boolean` | `false` | Skip the Insert image dialog and call `customImagePicker.onPick` from the toolbar or Insert menu |
66
+
67
+ `mode`, `value`, and `fullscreen` are optional. Omit them for internal state; pass them to control from the parent. Chrome includes a File menu (Save, Load, and Print), an Edit menu (Undo and Redo), an Insert menu (Link and Bookmark), a File icon group (Save and Load), a Print icon group, an Edit icon group (Undo and Redo), an Insert icon group (Link and Bookmark), and the Visual | HTML | Full screen toggle unless `menuVisible` or `toolbarVisible` is `false`. Hide both to drop the chrome slot entirely. Full screen covers the host page with a fixed overlay; an X control (and Escape) returns to the in-page layout. Visual and HTML mode stay independent of the overlay. Save writes the current document to an HTML file; Load replaces it from an HTML file. Print opens the browser print dialog for the document HTML only (not the editor chrome). Undo and Redo walk document HTML history; they are grayed out when there is nothing to undo or redo. The File, Edit, and Insert menu items use the same icons as the toolbar buttons. Link wraps the selection (or inserts the URL as the visible text at the caret) in an `<a href>` tag; an optional title becomes the native hover tooltip, and opening in a new tab sets `target="_blank"`. Bookmark inserts a named destination (`id`) at the caret or around the selection.
68
+
69
+ `menuColor`, `menuBackground`, `menuFontSize`, and `menuFontFamily` restyle the dropdown menu bar and panels only — not the icon toolbar. `border` is the outer editor box and is ignored in fullscreen. Custom menu fonts must already be available on the page.
70
+
71
+ The toolbar Font dropdown lists web-safe faces (Arial, Georgia, Times New Roman, and the rest of the usual stacks). Choose **Default** to clear an authored `font-family` so the text inherits. Applied faces are written as inline `style="font-family: …"` on the selection (or the page shell from Page properties).
72
+
73
+ ### Editor chrome
74
+
75
+ Show or hide the menu bar and icon toolbar, and control the full-screen overlay from the host.
76
+
77
+ ```tsx
78
+ import { useState } from 'react'
79
+ import { Editor } from 'commspliant-html-editor'
80
+
81
+ export function App() {
82
+ const [fullscreen, setFullscreen] = useState(false)
83
+
84
+ return (
85
+ <Editor
86
+ menuVisible
87
+ toolbarVisible
88
+ fullscreen={fullscreen}
89
+ onFullscreenChange={setFullscreen}
90
+ />
91
+ )
92
+ }
93
+ ```
94
+
95
+ ```tsx
96
+ import { Editor } from 'commspliant-html-editor'
97
+
98
+ <Editor menuVisible={false} toolbarVisible={false} />
99
+ ```
100
+
101
+ ### Menu appearance
102
+
103
+ Restyle the dropdown menu bar only — not the icon toolbar. Load any custom webfont on the host page before passing its family name.
104
+
105
+ ```tsx
106
+ import { Editor } from 'commspliant-html-editor'
107
+
108
+ <Editor
109
+ menuColor="#1e3a5f"
110
+ menuBackground="#fef3c7"
111
+ menuFontSize="1.05rem"
112
+ menuFontFamily="Georgia, serif"
113
+ />
114
+ ```
115
+
116
+ ### Editor border
117
+
118
+ Set the outer editor box. Use `"none"` to remove width, radius and shadow. Object fields are independent; omitted fields keep the defaults. Ignored in full screen.
119
+
120
+ ```tsx
121
+ import { Editor } from 'commspliant-html-editor'
122
+
123
+ <Editor border="none" />
124
+ ```
125
+
126
+ ```tsx
127
+ import { Editor, type EditorBorder } from 'commspliant-html-editor'
128
+
129
+ const border: EditorBorder = {
130
+ width: '2px',
131
+ color: '#2563eb',
132
+ radius: '12px',
133
+ shadow: '0 8px 24px rgb(0 0 0 / 15%)',
134
+ }
135
+
136
+ <Editor border={border} />
137
+ ```
138
+
139
+ ### Locale
140
+
141
+ Pass `locale` to switch library chrome between English and Spanish. Document content is not translated.
142
+
143
+ ```tsx
144
+ import { Editor } from 'commspliant-html-editor'
145
+
146
+ <Editor locale="en" />
147
+ ```
148
+
149
+ ```tsx
150
+ import { Editor } from 'commspliant-html-editor'
151
+
152
+ <Editor locale="es" />
153
+ ```
154
+
155
+ ### Custom fonts
156
+
157
+ Pass `customFonts` to append host faces after the built-in list. Duplicate `family` values are ignored. Optional `css` is a stylesheet URL (Google Fonts CSS, or a host file with `@font-face`) — not a raw `.woff2`. The editor loads those stylesheets for the picker preview. When a webfont is used in the document, its `<link rel="stylesheet">` is prepended to the HTML `onChange` receives, so the snippet still loads the face outside the editor.
158
+
159
+ ```tsx
160
+ <Editor
161
+ customFonts={[
162
+ {
163
+ name: 'Roboto',
164
+ family: 'Roboto, sans-serif',
165
+ css: 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap',
166
+ },
167
+ ]}
168
+ />
169
+ ```
170
+
171
+ ### Transform HTML
172
+
173
+ Pass `transformHtml` to sanitize or enhance the document on every write: visual typing and paste, HTML-source edits, Load, inserts, and `setHtml`. The result is what the editor stores and what `onChange` receives. Inbound `value` / `defaultValue` are not transformed — sanitize those before passing if needed.
174
+
175
+ ```tsx
176
+ <Editor
177
+ defaultValue="<p>Hello</p>"
178
+ transformHtml={(html) => html.replace(/<script[\s\S]*?<\/script>/gi, '')}
179
+ />
180
+ ```
181
+
182
+ Keep the callback idempotent. If it rewrites markup on every keystroke (pretty-print, wrap tags), the visual surface resyncs `innerHTML` and the caret may jump. Prefer stripping disallowed tags over format-on-type.
183
+
184
+ ### Custom actions
185
+
186
+ Pass a `customActions` array to add host buttons, menu items, or both. Labels and tooltips are your copy — the library does not translate them.
187
+
188
+ ```tsx
189
+ import { Editor, type CustomAction } from 'commspliant-html-editor'
190
+
191
+ const insertStamp: CustomAction = {
192
+ id: 'stamp',
193
+ label: 'Stamp',
194
+ showIn: 'both',
195
+ menu: { id: 'tools', label: 'Tools' },
196
+ onAction: (api) => {
197
+ api.insertHtml('<p>[stamp]</p>')
198
+ },
199
+ }
200
+
201
+ <Editor customActions={[insertStamp]} />
202
+ ```
203
+
204
+ Each object:
205
+
206
+ | Field | Type | Description |
207
+ | --- | --- | --- |
208
+ | `id` | `string` | Stable id. Must not collide with built-ins (`save`, `open`, `undo`, `redo`, `visual`, `html`, `fullscreen`) |
209
+ | `label` | `string` | Menu item text; also the toolbar tooltip and accessible name when those are omitted |
210
+ | `tooltip` | `string` | Toolbar tooltip. Defaults to `label` |
211
+ | `icon` | React component | Optional 16×16 icon. Omit to use the built-in custom-action icon |
212
+ | `showIn` | `'menu'` \| `'toolbar'` \| `'both'` | Which chrome surfaces show the action |
213
+ | `menu` | `{ id?: string; label?: string }` | Menu placement. Built-in ids: `file`, `edit`, `insert`, `view`, `format`. Other ids create a new top-level menu. Default id: `custom` |
214
+ | `toolbarGroup` | `string` | Icon group. Built-in ids: `file`, `edit`, `insert`, `view`. Other ids create a group at the end. Default: `custom` |
215
+ | `onAction` | `(api: CustomActionApi) => void` | Called when the item is activated |
216
+
217
+ **Placement**
218
+
219
+ - New top-level menu: `{ menu: { id: 'tools', label: 'Tools' } }`
220
+ - Item in an existing menu: `{ menu: { id: 'file' } }`
221
+ - Existing toolbar group: `{ toolbarGroup: 'file' }`
222
+ - Array order is the order inside the target menu or group
223
+ - `showIn: 'menu'` skips the toolbar; `'toolbar'` skips the menu
224
+
225
+ When the action runs, `onAction` receives a snapshot of the caret or selection plus edit helpers. You choose the outcome:
226
+
227
+ | Method | Effect |
228
+ | --- | --- |
229
+ | `api.selection.text` | Selected plain text, or `''` if the caret is collapsed |
230
+ | `api.selection.start` / `end` | Offsets (visual: `textContent`; HTML mode: textarea indices) |
231
+ | `api.insertHtml(html, formattedText?)` | Insert HTML at the caret, or replace the selection. Pass `formattedText` to insert visible text instead of parsing markup |
232
+ | `api.insertText(text)` | Insert formatted text at the caret, or replace the selection |
233
+ | `api.setHtml(html)` | Replace the entire document |
234
+ | `api.getHtml()` | Current document HTML |
235
+
236
+ The snapshot is taken before chrome steals focus, so a host dialog can call `insertHtml` later and still hit the original caret or selection.
237
+
238
+ Both modes share one HTML string. Switching Visual → HTML flushes the contenteditable markup into the textarea; switching back mounts that string into the visual surface.
239
+
240
+ ### Custom image picker
241
+
242
+ Pass `customImagePicker` to add a third Insert image source. Labels are your copy — the library does not translate them. When the host finishes picking, call the `insertImage` function received by `onPick`.
243
+
244
+ ```tsx
245
+ import { Editor, type CustomImagePicker } from 'commspliant-html-editor'
246
+
247
+ const gallery: CustomImagePicker = {
248
+ text: 'Gallery',
249
+ description: 'Choose from your media library.',
250
+ buttonCaption: 'Open gallery',
251
+ onPick: (insertImage) => {
252
+ openHostGallery().then((picked) => {
253
+ insertImage({
254
+ src: picked.url,
255
+ alt: picked.alt,
256
+ title: picked.title,
257
+ css: 'width: 200px; border-radius: 8px',
258
+ })
259
+ })
260
+ },
261
+ }
262
+
263
+ <Editor customImagePicker={gallery} />
264
+ ```
265
+
266
+ | Field | Type | Description |
267
+ | --- | --- | --- |
268
+ | `text` | `string` | Third source / navigation button label |
269
+ | `description` | `string` | Shown on the custom source panel |
270
+ | `buttonCaption` | `string` | Caption of the button that starts the host picker |
271
+ | `onPick` | `(insertImage) => void` | Called when that button is clicked. Call `insertImage` with a URL or raster data URL, plus optional `alt`, `title`, and inline `css` |
272
+
273
+ Omit `customImagePicker` to keep File and URL only. Set `disableBuiltinImageInsert` to skip the dialog: Insert → Image and the toolbar Image button call `onPick` immediately.
274
+
275
+ ```tsx
276
+ <Editor customImagePicker={gallery} disableBuiltinImageInsert />
277
+ ```
278
+
279
+ `insertImage` uses the same insert path as File and URL: an `<img>` with inline `max-width: 100%; height: auto`, then any host `css`. `src` must be `http(s)`, a relative path, or a raster `data:` URL.
280
+
281
+ ### Style isolation
282
+
283
+ The shipped CSS resets inherited styles on the editor root and restyles chrome and the visual document so typical host-page rules (`p`, `button`, `textarea`, inherited typography) do not restyle the editor. Pass `className` on the root to override that look on purpose. Isolation is not a hard boundary: high-specificity host selectors or `!important` can still win.
284
+
285
+ ## Development
286
+
287
+ ```bash
288
+ make install # npm install
289
+ make dev # playground at the Vite dev server
290
+ make build # static playground to dist/ (index.html for hosting)
291
+ make build-lib # library to dist/ (es, cjs, types, CSS)
292
+ make preview # serve dist/ locally
293
+ make test # vitest
294
+ make storybook # Storybook on port 6006
295
+ ```
296
+
297
+ `make build` and `make build-lib` both write to `dist/` and overwrite each other. Use `make build` for the hosted demo; use `make build-lib` when packaging the library.
298
+
299
+ - `src/` is the library. Public exports live in `src/index.ts`.
300
+ - `playground/` is a consumer app: it imports `commspliant-html-editor` the same way other projects will. No editor logic belongs there.
301
+ - Stories (`*.stories.tsx`) sit next to public UI and are the visual contract.
302
+ - Tests (`*.test.ts(x)`) sit next to modules.
303
+
304
+ The live demo is the playground static build. DigitalOcean App Platform defaults (`npm run build`, output `dist`) match this. Deploy a **static site** from the repo root with:
305
+
306
+ - **Build command:** `npm run build` (or leave the Node default)
307
+ - **Output directory:** `dist` (not `playground/dist`)
308
+ - **Source directory:** `/`
309
+ - **Node:** 18+ (this repo pins 20 via `.nvmrc`; set `NODE_VERSION=20` if the build image ignores it)
310
+
311
+ ```tsx
312
+ import { Editor } from 'commspliant-html-editor'
313
+ ```
314
+
315
+ [Brought to you by CommsPliant Communication](https://commspliant.com/)
@@ -0,0 +1 @@
1
+ ._menu_uy4s1_1{position:fixed;z-index:1150;display:flex;flex-direction:column;min-width:12rem;margin:0;padding:.25rem 0;border:1px solid #d0d0d0;border-radius:4px;background:#fff;box-shadow:0 4px 12px #00000014;color:#444;font:.875rem/1.4 system-ui,sans-serif}._item_uy4s1_17{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;align-items:center;width:100%;margin:0;padding:.4rem .75rem;border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:start;white-space:nowrap;cursor:pointer;box-shadow:none}._item_uy4s1_17:hover,._item_uy4s1_17:focus-visible{background:#f0f0f0;color:#111}._item_uy4s1_17:focus-visible{outline:2px solid #8ab4ff;outline-offset:-2px}._item_uy4s1_17:disabled{cursor:not-allowed;opacity:.5}._item_uy4s1_17:disabled:hover,._item_uy4s1_17:disabled:focus-visible{background:transparent;color:inherit}._separator_uy4s1_57{height:1px;margin:.25rem .5rem;background:#d0d0d0;border:0}._picker_vmqkv_1{display:flex;flex-direction:column;gap:.45rem;box-sizing:border-box;width:14.5rem;padding:.4rem .5rem .5rem;color:#222;font:.75rem/1.2 system-ui,sans-serif}._none_vmqkv_12,._customToggle_vmqkv_13,._eyedrop_vmqkv_14{display:flex;align-items:center;gap:.4rem;width:100%;margin:0;padding:.25rem .35rem;border:0;border-radius:3px;background:transparent;color:inherit;font:inherit;text-align:start;cursor:pointer}._none_vmqkv_12:hover,._none_vmqkv_12:focus-visible,._customToggle_vmqkv_13:hover,._customToggle_vmqkv_13:focus-visible,._eyedrop_vmqkv_14:hover,._eyedrop_vmqkv_14:focus-visible{background:#e8f0fe;outline:none}._none_vmqkv_12[aria-checked=true],._none_vmqkv_12[aria-selected=true]{font-weight:600}._none_vmqkv_12:disabled,._customToggle_vmqkv_13:disabled,._eyedrop_vmqkv_14:disabled,._swatch_vmqkv_48:disabled,._field_vmqkv_49 input:disabled{cursor:not-allowed;opacity:.5}._grid_vmqkv_54,._recents_vmqkv_55{display:grid;grid-template-columns:repeat(8,1.25rem);gap:.22rem;justify-content:space-between}._swatch_vmqkv_48{box-sizing:border-box;width:1.25rem;height:1.25rem;padding:0;border:1px solid #c8c8c8;border-radius:2px;cursor:pointer}._swatch_vmqkv_48:hover,._swatch_vmqkv_48:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._swatch_vmqkv_48[aria-checked=true],._swatch_vmqkv_48[aria-selected=true]{outline:2px solid #111;outline-offset:1px}._sectionLabel_vmqkv_84{margin:.15rem 0 0;font-weight:600}._custom_vmqkv_13{display:flex;flex-direction:column;gap:.45rem}._sv_vmqkv_95{position:relative;width:100%;height:7.5rem;border:1px solid #c8c8c8;border-radius:3px;cursor:crosshair;touch-action:none}._svThumb_vmqkv_105{position:absolute;width:.7rem;height:.7rem;border:2px solid #fff;border-radius:50%;box-shadow:0 0 0 1px #111;transform:translate(-50%,-50%);pointer-events:none}._hue_vmqkv_116{width:100%;height:.85rem;margin:0;padding:0;border-radius:3px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red);cursor:pointer}._hue_vmqkv_116::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:.7rem;height:.85rem;border:2px solid #fff;border-radius:2px;background:transparent;box-shadow:0 0 0 1px #111}._hue_vmqkv_116::-moz-range-thumb{width:.7rem;height:.85rem;border:2px solid #fff;border-radius:2px;background:transparent;box-shadow:0 0 0 1px #111}._rgbRow_vmqkv_155,._hexRow_vmqkv_156{display:flex;align-items:center;gap:.3rem}._field_vmqkv_49{display:flex;flex:1 1 0;flex-direction:column;gap:.1rem;min-width:0}._field_vmqkv_49 label{font-weight:600}._field_vmqkv_49 input{box-sizing:border-box;width:100%;margin:0;padding:.15rem .25rem;border:1px solid #c8c8c8;border-radius:3px;font:inherit}._hexRow_vmqkv_156 ._field_vmqkv_49{flex:1 1 auto}._eyedrop_vmqkv_14{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23222' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15.5 4.5l4 4-9 9H6.5v-4.5z'/%3E%3Cpath d='M13.5 6.5l4 4'/%3E%3C/svg%3E") 2 18,crosshair}._wrap_mid65_1{position:relative;display:inline-flex;flex-shrink:0;align-items:stretch}._button_mid65_8{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:.15rem;min-width:1.75rem;padding:.4rem .5rem .3rem}._icon_mid65_18{display:block;width:1rem;height:1rem}._bar_mid65_24{display:block;width:1rem;height:.2rem;border:1px solid #c8c8c8;border-radius:1px;background:transparent}._barEmpty_mid65_33{background:repeating-linear-gradient(-45deg,#ddd,#ddd 1px,transparent 1px,transparent 3px)}._popover_mid65_43{position:fixed;z-index:1300;border:1px solid #d0d0d0;border-radius:4px;background:#fff;box-shadow:0 4px 12px #0000001f}._field_pl3rn_1{display:flex;align-items:center;justify-content:space-between;gap:.75rem}._label_pl3rn_8{font-weight:600}._button_pl3rn_12{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;width:2.4rem;height:1.5rem;margin:0;padding:.15rem;border:1px solid #c8c8c8;border-radius:3px;background:#fff;cursor:pointer}._button_pl3rn_12:disabled{cursor:not-allowed;opacity:.5}._button_pl3rn_12:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._swatch_pl3rn_37{display:block;width:100%;height:100%;border-radius:2px}._swatchEmpty_pl3rn_44{background:repeating-linear-gradient(-45deg,#ddd,#ddd 1px,transparent 1px,transparent 3px)}._toolbar_xlok8_1{display:flex;flex-direction:column;align-items:stretch;width:100%;min-width:0}._toolbar_xlok8_1._toolbar_xlok8_1{container-type:inline-size}._toolbar_xlok8_1 ._menuBar_xlok8_14{display:flex;align-items:stretch;width:100%;background:var(--wysiwyg-menu-background, #fff);border-bottom:1px solid #e5e5e5}._toolbar_xlok8_1 ._menuBarDesktop_xlok8_22{display:flex;align-items:stretch;min-width:0}._toolbar_xlok8_1 ._brandMark_xlok8_28{display:inline-flex;flex-shrink:0;align-items:center;padding:.25rem .65rem .25rem .5rem}._toolbar_xlok8_1 ._brandMarkIcon_xlok8_35{display:block;height:2.5rem;width:auto;aspect-ratio:616.23 / 542.09;overflow:visible}._toolbar_xlok8_1 ._brandMarkIcon_xlok8_35 *{stroke:none}._toolbar_xlok8_1 ._menuBarCompact_xlok8_47{display:none;align-items:stretch}._toolbar_xlok8_1[data-compact] ._menuBarDesktop_xlok8_22{display:none}._toolbar_xlok8_1[data-compact] ._menuBarCompact_xlok8_47{display:flex}@container (max-width: 40rem){._toolbar_xlok8_1 ._menuBarDesktop_xlok8_22{display:none}._toolbar_xlok8_1 ._menuBarCompact_xlok8_47{display:flex}}._toolbar_xlok8_1 ._menuWrap_xlok8_70{position:relative;display:flex;align-items:stretch}._toolbar_xlok8_1 ._menuButton_xlok8_76,._toolbar_xlok8_1 ._iconButton_xlok8_77,._toolbar_xlok8_1 ._menuItem_xlok8_78{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;border:0;border-radius:0;background:transparent;font:inherit;font-weight:400;line-height:inherit;letter-spacing:inherit;text-transform:none;text-decoration:none;color:#444;cursor:pointer;box-shadow:none}._toolbar_xlok8_1 ._menuButton_xlok8_76,._toolbar_xlok8_1 ._menuItem_xlok8_78{color:var(--wysiwyg-menu-color, #444);font-size:var(--wysiwyg-menu-font-size, .875rem);font-family:var(--wysiwyg-menu-font-family, inherit)}._toolbar_xlok8_1 ._menuButton_xlok8_76{display:inline-flex;align-items:center;padding:.5rem .9rem;text-align:center}._toolbar_xlok8_1 ._menuButton_xlok8_76:after{content:"";display:inline-block;width:0;height:0;margin-left:.4rem;border-style:solid;border-width:.28rem .22rem 0;border-color:currentColor transparent transparent;transform:translateY(.08em)}._toolbar_xlok8_1 ._hamburgerButton_xlok8_121:after{content:none;display:none;margin:0;border:0}._toolbar_xlok8_1 ._iconNav_xlok8_128{position:relative;display:flex;align-items:stretch;width:100%;min-width:0;background:var(--wysiwyg-toolbar-background, #f0f0f0)}._toolbar_xlok8_1 ._iconTrack_xlok8_137{display:flex;flex:1 1 auto;align-items:stretch;min-width:0;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-width:none}._toolbar_xlok8_1 ._iconTrack_xlok8_137::-webkit-scrollbar{display:none}._toolbar_xlok8_1 ._iconTrackInner_xlok8_152,._toolbar_xlok8_1 ._iconGroup_xlok8_158{display:flex;flex:0 0 auto;align-items:stretch}._toolbar_xlok8_1 ._iconGroup_xlok8_158:not(:last-child):after{content:"";width:1px;align-self:stretch;margin:.35rem .15rem;background:#d0d0d0}._toolbar_xlok8_1 ._iconButton_xlok8_77{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;padding:.5rem .65rem}._tooltipTrigger_xlok8_180{display:inline-flex;flex-shrink:0;align-items:stretch}._toolbar_xlok8_1 ._scrollButton_xlok8_186{position:absolute;z-index:1;top:0;bottom:0;background:var(--wysiwyg-toolbar-background, #f0f0f0)}._toolbar_xlok8_1 ._scrollButton_xlok8_186 ._iconButton_xlok8_77{height:100%}._toolbar_xlok8_1 ._scrollButton_xlok8_186:hover,._toolbar_xlok8_1 ._scrollButton_xlok8_186:focus-within{background:var(--wysiwyg-toolbar-background, #f0f0f0)}._toolbar_xlok8_1 ._scrollButtonLeft_xlok8_203{left:0;box-shadow:6px 0 8px -4px #00000029}._toolbar_xlok8_1 ._scrollButtonRight_xlok8_208{right:0;box-shadow:-6px 0 8px -4px #00000029}._toolbar_xlok8_1 ._iconButton_xlok8_77[aria-pressed=true]{color:#111;background:#ececec;box-shadow:inset 0 -2px #111}._toolbar_xlok8_1 ._menu_xlok8_14{position:absolute;top:100%;left:0;z-index:2;display:flex;flex-direction:column;min-width:10rem;margin:0;padding:.25rem 0;border:1px solid #d0d0d0;border-radius:4px;background:var(--wysiwyg-menu-background, #fff);box-shadow:0 4px 12px #00000014}._toolbar_xlok8_1 ._submenuWrap_xlok8_235{position:relative}._toolbar_xlok8_1 ._submenu_xlok8_235{top:0;left:100%;z-index:3}._toolbar_xlok8_1 ._submenuTrigger_xlok8_245{justify-content:space-between}._toolbar_xlok8_1 ._submenuTrigger_xlok8_245:after{content:"";display:inline-block;width:0;height:0;margin-left:.75rem;border-style:solid;border-width:.22rem 0 .22rem .28rem;border-color:transparent transparent transparent currentColor}._toolbar_xlok8_1 ._menuOverlay_xlok8_260{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1100;display:flex;flex-direction:column;background:var(--wysiwyg-menu-background, #fff);color:var(--wysiwyg-menu-color, #444);font-size:var(--wysiwyg-menu-font-size, .875rem);font-family:var(--wysiwyg-menu-font-family, inherit)}._toolbar_xlok8_1 ._menuOverlayHeader_xlok8_272{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;gap:.5rem;padding:.15rem .15rem .15rem .9rem;border-bottom:1px solid #e5e5e5}._toolbar_xlok8_1 ._menuOverlayTitle_xlok8_282{font-size:inherit;font-weight:600;color:inherit}._toolbar_xlok8_1 ._menuOverlayBody_xlok8_288{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:auto}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._menuWrap_xlok8_70{flex-direction:column;align-items:stretch;width:100%}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._menuButton_xlok8_76{width:100%;justify-content:space-between}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._menu_xlok8_14{position:static;top:auto;left:auto;z-index:auto;min-width:0;width:100%;border:0;border-radius:0;box-shadow:none;padding:0 0 .25rem}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._submenuWrap_xlok8_235{position:static}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._submenu_xlok8_235{position:static;top:auto;left:auto;z-index:auto}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._submenuTrigger_xlok8_245:after{transform:rotate(90deg)}._toolbar_xlok8_1 ._menuOverlay_xlok8_260 ._menuItem_xlok8_78{white-space:normal}._toolbar_xlok8_1 ._menuSeparator_xlok8_339{height:1px;margin:.25rem .5rem;background:#d0d0d0;border:0}._toolbar_xlok8_1 ._menuItem_xlok8_78{display:flex;align-items:center;gap:.5rem;width:100%;padding:.4rem .75rem;text-align:start;white-space:nowrap}._toolbar_xlok8_1 ._menuItem_xlok8_78:hover,._toolbar_xlok8_1 ._menuItem_xlok8_78:focus-visible{background:#f0f0f0;color:#111}._toolbar_xlok8_1 ._menuItem_xlok8_78[aria-checked=true]{color:#111;font-weight:600}._toolbar_xlok8_1 ._menuButton_xlok8_76:hover,._toolbar_xlok8_1 ._iconButton_xlok8_77:hover,._toolbar_xlok8_1 ._menuButton_xlok8_76:focus-visible,._toolbar_xlok8_1 ._iconButton_xlok8_77:focus-visible{color:#111;background:#f0f0f0}._toolbar_xlok8_1 ._menuButton_xlok8_76:focus-visible,._toolbar_xlok8_1 ._iconButton_xlok8_77:focus-visible,._toolbar_xlok8_1 ._menuItem_xlok8_78:focus-visible{outline:2px solid #8ab4ff;outline-offset:-2px}._toolbar_xlok8_1 ._menuButton_xlok8_76:disabled,._toolbar_xlok8_1 ._iconButton_xlok8_77:disabled,._toolbar_xlok8_1 ._menuItem_xlok8_78:disabled{cursor:not-allowed;opacity:.5}._toolbar_xlok8_1 ._menuItem_xlok8_78:disabled:hover,._toolbar_xlok8_1 ._menuItem_xlok8_78:disabled:focus-visible{background:transparent;color:inherit}._toolbar_xlok8_1 ._icon_xlok8_77,._toolbar_xlok8_1 ._icon_xlok8_77 *{overflow:visible;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}._toolbar_xlok8_1 ._icon_xlok8_77{display:block;width:1rem;height:1rem;flex-shrink:0}._tooltip_xlok8_180{position:fixed;z-index:1100;padding:.2rem .45rem;border-radius:3px;background:#222;color:#fff;font:.75rem/1.2 system-ui,sans-serif;white-space:nowrap;pointer-events:none}._tooltipElevated_xlok8_424{z-index:1300;max-width:18rem;white-space:normal}._wrap_o2uzw_1._wrap_o2uzw_1{display:inline-flex;flex-shrink:0;align-items:stretch}._wrap_o2uzw_1._wrapToolbar_o2uzw_7{align-self:stretch;padding:7px .35rem 0}._wrap_o2uzw_1 ._field_o2uzw_12{position:relative;display:flex;flex:0 0 auto;align-items:stretch;height:1.6rem}._wrap_o2uzw_1 ._trigger_o2uzw_20{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;min-width:9.5rem;max-width:12rem;height:100%;margin:0;padding:0 1.35rem 0 .45rem;overflow:hidden;border:1px solid #c8c8c8;border-radius:3px;background:#fff;color:#222;font:.75rem/1.2 system-ui,sans-serif;text-align:start;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}._wrap_o2uzw_1 ._trigger_o2uzw_20:focus{outline:2px solid #8ab4ff;outline-offset:-1px}._wrap_o2uzw_1 ._trigger_o2uzw_20:disabled{cursor:not-allowed;opacity:.5}._wrap_o2uzw_1 ._chevron_o2uzw_50{position:absolute;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;width:1.15rem;pointer-events:none;color:#444}._wrap_o2uzw_1 ._chevron_o2uzw_50:after{content:"";display:block;width:0;height:0;border-style:solid;border-width:.28rem .22rem 0;border-color:currentColor transparent transparent}._list_o2uzw_73{position:fixed;z-index:1300;min-width:12rem;max-height:18rem;margin:0;padding:.15rem 0;overflow:auto;border:1px solid #d0d0d0;border-radius:3px;background:#fff;box-shadow:0 4px 12px #0000001f;list-style:none}._listInline_o2uzw_88{position:static;z-index:auto;min-width:100%;max-height:14rem;box-shadow:none}._option_o2uzw_96{display:block;width:100%;margin:0;padding:.3rem .75rem;border:0;background:transparent;color:#222;font-size:.875rem;line-height:1.3;text-align:start;cursor:pointer}._option_o2uzw_96:hover,._option_o2uzw_96:focus-visible{background:#e8f0fe;outline:none}._option_o2uzw_96[aria-checked=true]{font-weight:600}._option_o2uzw_96:disabled{cursor:not-allowed;opacity:.5}._separator_o2uzw_125{height:1px;margin:.25rem .5rem;padding:0;background:#d0d0d0;border:0;list-style:none}._wrap_1qhfu_1._wrap_1qhfu_1{display:inline-flex;flex-direction:row;flex-shrink:0;align-items:center;gap:.25rem}._wrap_1qhfu_1._wrapToolbar_1qhfu_9{align-self:stretch;padding:7px .35rem 0}._wrap_1qhfu_1 ._field_1qhfu_14{position:relative;display:flex;flex:0 0 auto;align-items:stretch;height:1.6rem}._wrap_1qhfu_1 ._input_1qhfu_22{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;width:3.4rem;height:100%;margin:0;padding:0 1.35rem 0 .35rem;border:1px solid #c8c8c8;border-radius:3px;background:#fff;color:#222;font:.75rem/1.2 system-ui,sans-serif}._wrap_1qhfu_1 ._input_1qhfu_22:focus{outline:2px solid #8ab4ff;outline-offset:-1px}._wrap_1qhfu_1 ._toggle_1qhfu_41,._wrap_1qhfu_1 ._chevron_1qhfu_42{position:absolute;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.15rem;margin:0;padding:0;border:0;border-radius:0 3px 3px 0;background:transparent;color:#444}._wrap_1qhfu_1 ._toggle_1qhfu_41{cursor:pointer}._wrap_1qhfu_1 ._chevron_1qhfu_42{pointer-events:none}._wrap_1qhfu_1 ._toggle_1qhfu_41:after,._wrap_1qhfu_1 ._chevron_1qhfu_42:after{content:"";display:block;width:0;height:0;margin:0;border-style:solid;border-width:.28rem .22rem 0;border-color:currentColor transparent transparent}._wrap_1qhfu_1 ._unit_1qhfu_80{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;width:3.4rem;height:100%;margin:0;padding:0 1.35rem 0 .35rem;border:1px solid #c8c8c8;border-radius:3px;background:#fff;color:#222;font:.75rem/1.2 system-ui,sans-serif}._wrap_1qhfu_1 ._unit_1qhfu_80::-ms-expand{display:none}._wrap_1qhfu_1 ._unit_1qhfu_80:focus{outline:2px solid #8ab4ff;outline-offset:-1px}._wrap_1qhfu_1 ._input_1qhfu_22:disabled,._wrap_1qhfu_1 ._toggle_1qhfu_41:disabled,._wrap_1qhfu_1 ._unit_1qhfu_80:disabled{cursor:not-allowed;opacity:.5}._list_1qhfu_110{position:fixed;z-index:1300;min-width:4.5rem;max-height:12rem;margin:0;padding:.15rem 0;overflow:auto;border:1px solid #d0d0d0;border-radius:3px;background:#fff;box-shadow:0 4px 12px #0000001f;list-style:none}._list_1qhfu_110 ._option_1qhfu_125{display:block;width:100%;margin:0;padding:.2rem .5rem;border:0;background:transparent;color:#222;font:.75rem/1.3 system-ui,sans-serif;text-align:start;cursor:pointer}._list_1qhfu_110 ._option_1qhfu_125:hover,._list_1qhfu_110 ._option_1qhfu_125:focus-visible{background:#e8f0fe;outline:none}._backdrop_po4dq_1{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1200;display:flex;align-items:center;justify-content:center;padding:1rem;background:#00000052}._backdrop_po4dq_1 ._dialog_po4dq_12{display:flex;flex-direction:column;width:min(32rem,100%);max-height:calc(100% - 2rem);margin:0;padding:0;overflow:hidden;border:1px solid #c8c8c8;border-radius:6px;background:#fff;box-shadow:0 8px 24px #0000002e;color:#222;font:.875rem/1.4 system-ui,sans-serif}._backdrop_po4dq_1 ._dialogWide_po4dq_28{width:min(38rem,100%)}._backdrop_po4dq_1 ._header_po4dq_32{margin:0;padding:.75rem 1rem .5rem;font-size:1rem;font-weight:600}._backdrop_po4dq_1 ._tabs_po4dq_39{display:flex;flex-wrap:wrap;gap:.15rem;padding:0 1rem;border-bottom:1px solid #e5e5e5}._backdrop_po4dq_1 ._tab_po4dq_39{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0 0 -1px;padding:.4rem .75rem;border:1px solid transparent;border-bottom:0;border-radius:4px 4px 0 0;background:transparent;color:inherit;font:inherit;cursor:pointer}._backdrop_po4dq_1 ._tab_po4dq_39[aria-selected=true]{border-color:#e5e5e5;background:#fff;font-weight:600}._backdrop_po4dq_1 ._tab_po4dq_39:disabled{cursor:not-allowed;opacity:.5}._backdrop_po4dq_1 ._body_po4dq_71{display:flex;flex-direction:column;gap:.85rem;padding:1rem;overflow:auto}._backdrop_po4dq_1 ._field_po4dq_79{display:flex;flex-direction:column;gap:.35rem}._backdrop_po4dq_1 ._label_po4dq_85{font-weight:600}._backdrop_po4dq_1 ._sizeRow_po4dq_89{display:flex;gap:.4rem;align-items:center}._backdrop_po4dq_1 ._fileRow_po4dq_95{display:flex;align-items:center;gap:.5rem}._backdrop_po4dq_1 ._fileName_po4dq_101{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#555}._backdrop_po4dq_1 ._marks_po4dq_108{display:flex;flex-direction:column;gap:.35rem;margin:0;padding:0;border:0}._backdrop_po4dq_1 ._mark_po4dq_108{display:flex;align-items:center;gap:.4rem}._backdrop_po4dq_1 ._actions_po4dq_123{display:flex;justify-content:flex-end;gap:.5rem;padding:.75rem 1rem 1rem}._backdrop_po4dq_1 ._actionsSpread_po4dq_130{justify-content:space-between}._backdrop_po4dq_1 ._actionsEnd_po4dq_134{display:flex;gap:.5rem}._backdrop_po4dq_1 ._headerRow_po4dq_139{display:flex;align-items:flex-start;gap:.5rem;padding:.75rem .5rem .5rem 1rem}._backdrop_po4dq_1 ._headerRow_po4dq_139 ._header_po4dq_32{flex:1;padding:0}._backdrop_po4dq_1 ._close_po4dq_151{-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-shrink:0;margin:0;padding:.25rem;border:0;border-radius:4px;background:transparent;color:inherit;cursor:pointer}._backdrop_po4dq_1 ._close_po4dq_151:hover,._backdrop_po4dq_1 ._close_po4dq_151:focus-visible{background:#f0f0f0}._backdrop_po4dq_1 ._nameSection_po4dq_168{padding:.5rem 1rem .75rem}._backdrop_po4dq_1 ._nameInput_po4dq_172{box-sizing:border-box;width:100%;margin:0;padding:.35rem .5rem;border:1px solid #c8c8c8;border-radius:4px;background:#fff;color:inherit;font:inherit}._backdrop_po4dq_1 ._nameInput_po4dq_172:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._backdrop_po4dq_1 ._labelRow_po4dq_189{display:flex;align-items:center;gap:.35rem}._backdrop_po4dq_1 ._help_po4dq_195{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin:0;padding:0;border:1px solid #c8c8c8;border-radius:50%;background:#f7f7f7;color:inherit;font:.7rem/1 system-ui,sans-serif;font-weight:700;cursor:help}._backdrop_po4dq_1 ._textInput_po4dq_213{box-sizing:border-box;width:100%;margin:0;padding:.35rem .5rem;border:1px solid #c8c8c8;border-radius:4px;background:#fff;color:inherit;font:inherit}._backdrop_po4dq_1 ._fullSelect_po4dq_225{width:100%}._backdrop_po4dq_1 ._error_po4dq_229{color:#b33;font-size:.8rem}._backdrop_po4dq_1 ._emptyHint_po4dq_234{margin:0;color:#666}._backdrop_po4dq_1 ._action_po4dq_123[aria-pressed=true],._backdrop_po4dq_1 ._action_po4dq_123[aria-checked=true]{border-color:#4a7fd4;background:#e8eef8}._backdrop_po4dq_1 ._textarea_po4dq_245{box-sizing:border-box;width:100%;min-height:6.5rem;margin:0;padding:.4rem .5rem;border:1px solid #c8c8c8;border-radius:4px;background:#fff;color:inherit;font:.8rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;resize:vertical}._backdrop_po4dq_1 ._actionDanger_po4dq_259{border-color:#c44;background:#fff;color:#b33}._backdrop_po4dq_1 ._confirmBody_po4dq_265{padding:1rem}._backdrop_po4dq_1 ._emptyPanel_po4dq_269{min-height:4rem}._backdrop_po4dq_1 ._nestedPanel_po4dq_273{margin:.85rem 1rem .15rem;overflow:hidden;border:1px solid #c8c8c8;border-radius:4px}._backdrop_po4dq_1 ._nestedPanel_po4dq_273 ._tabs_po4dq_39{padding-top:.4rem}._spinnerWrap_po4dq_284{display:flex;align-items:center;justify-content:center;padding:.5rem .75rem}._spinner_po4dq_284{width:1.1rem;height:1.1rem;border:2px solid #d0d0d0;border-top-color:#4a7fd4;border-radius:50%;animation:_spin_po4dq_284 .7s linear infinite}@keyframes _spin_po4dq_284{to{transform:rotate(360deg)}}._backdrop_po4dq_1 ._action_po4dq_123{-webkit-appearance:none;-moz-appearance:none;appearance:none;min-width:5.5rem;margin:0;padding:.35rem .75rem;border:1px solid #c8c8c8;border-radius:4px;background:#f7f7f7;color:inherit;font:inherit;cursor:pointer}._backdrop_po4dq_1 ._actionPrimary_po4dq_319{border-color:#4a7fd4;background:#4a7fd4;color:#fff}._backdrop_po4dq_1 ._action_po4dq_123:disabled{cursor:not-allowed;opacity:.5}._backdrop_po4dq_1 ._action_po4dq_123:focus-visible,._backdrop_po4dq_1 ._tab_po4dq_39:focus-visible,._backdrop_po4dq_1 ._close_po4dq_151:focus-visible,._backdrop_po4dq_1 ._iconButton_po4dq_333:focus-visible,._backdrop_po4dq_1 ._select_po4dq_334:focus-visible,._backdrop_po4dq_1 ._lengthInput_po4dq_335:focus-visible,._backdrop_po4dq_1 ._lengthUnit_po4dq_336:focus-visible,._backdrop_po4dq_1 ._textInput_po4dq_213:focus-visible,._backdrop_po4dq_1 ._textarea_po4dq_245:focus-visible,._backdrop_po4dq_1 ._help_po4dq_195:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._backdrop_po4dq_1 ._group_po4dq_344{display:flex;flex-direction:column;gap:.75rem;margin:0;padding:.75rem;border:1px solid #e5e5e5;border-radius:4px}._backdrop_po4dq_1 ._nestedGroup_po4dq_354{display:flex;flex-direction:column;gap:.5rem;margin:0;padding:.6rem .7rem;border:1px solid #ececec;border-radius:4px}._backdrop_po4dq_1 ._subLabel_po4dq_364{font-weight:600}._backdrop_po4dq_1 ._iconRow_po4dq_368{display:flex;gap:.25rem}._backdrop_po4dq_1 ._iconButton_po4dq_333{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:1px solid #c8c8c8;border-radius:4px;background:#f7f7f7;color:inherit;cursor:pointer}._backdrop_po4dq_1 ._iconButton_po4dq_333[aria-checked=true],._backdrop_po4dq_1 ._iconButton_po4dq_333[aria-pressed=true]{border-color:#4a7fd4;background:#e8eef8}._backdrop_po4dq_1 ._iconButton_po4dq_333:disabled{cursor:not-allowed;opacity:.5}._backdrop_po4dq_1 ._lengthField_po4dq_400{display:flex;flex-direction:column;gap:.25rem}._backdrop_po4dq_1 ._sideLabel_po4dq_406{font-weight:600}._backdrop_po4dq_1 ._lengthRow_po4dq_410{display:flex;gap:.35rem;align-items:center}._backdrop_po4dq_1 ._lengthInput_po4dq_335,._backdrop_po4dq_1 ._select_po4dq_334,._backdrop_po4dq_1 ._lengthUnit_po4dq_336{box-sizing:border-box;margin:0;padding:.3rem .4rem;border:1px solid #c8c8c8;border-radius:4px;background:#fff;color:inherit;font:inherit}._backdrop_po4dq_1 ._lengthInput_po4dq_335{width:4.75rem}._backdrop_po4dq_1 ._select_po4dq_334,._backdrop_po4dq_1 ._lengthUnit_po4dq_336{min-width:4.5rem}._backdrop_po4dq_1 ._sideGrid_po4dq_438,._backdrop_po4dq_1 ._shadowGrid_po4dq_439{display:grid;grid-template-columns:1fr 1fr;gap:.55rem .75rem}._frame_bwkh8_1{position:fixed;z-index:1140;box-sizing:border-box;pointer-events:none;border:1px solid #4a90d9}._handle_bwkh8_9{position:absolute;box-sizing:border-box;padding:0;pointer-events:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;box-shadow:none}._handle_bwkh8_9:focus{outline:none}._handle_bwkh8_9:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._handleEast_bwkh8_29{top:0;right:-4px;width:8px;height:calc(100% - 10px);cursor:e-resize}._handleSouth_bwkh8_37{left:0;bottom:-4px;width:calc(100% - 10px);height:8px;cursor:s-resize}._handleSouthEast_bwkh8_45{right:-5px;bottom:-5px;z-index:1;width:10px;height:10px;cursor:se-resize;border:1px solid #4a90d9;background:#fff}._grid_5kups_1{display:grid;grid-template-columns:repeat(10,1.15rem);gap:2px;width:max-content}._cell_5kups_8{width:1.15rem;height:1.15rem;padding:0;border:1px solid #c8c8c8;background:#fff;cursor:pointer}._cell_5kups_8[data-active=true]{background:#cfe3ff;border-color:#4a90d9}._cell_5kups_8:focus-visible{outline:2px solid #4a90d9;outline-offset:1px}._sizeLabel_5kups_27{margin:.35rem 0 0;color:#444;font-variant-numeric:tabular-nums}._sizeFields_5kups_33{align-items:flex-end}._numberInput_5kups_37{box-sizing:border-box;width:4.5rem;margin:0;padding:.35rem .4rem;border:1px solid #c8c8c8;border-radius:4px;background:#fff;color:inherit;font:inherit}._numberInput_5kups_37:focus-visible{outline:2px solid #8ab4ff;outline-offset:1px}._wrap_1wd6e_1._wrap_1wd6e_1{display:inline-flex;flex-shrink:0;align-items:stretch}._wrap_1wd6e_1._wrapToolbar_1wd6e_7{align-self:stretch;padding:7px .35rem 0}._wrap_1wd6e_1 ._field_1wd6e_12{position:relative;display:flex;flex:0 0 auto;align-items:stretch;height:1.6rem}._wrap_1wd6e_1 ._trigger_1wd6e_20{-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;min-width:8.5rem;height:100%;margin:0;padding:0 1.35rem 0 .45rem;border:1px solid #c8c8c8;border-radius:3px;background:#fff;color:#222;font:.75rem/1.2 system-ui,sans-serif;text-align:start;cursor:pointer}._wrap_1wd6e_1 ._trigger_1wd6e_20:focus{outline:2px solid #8ab4ff;outline-offset:-1px}._wrap_1wd6e_1 ._trigger_1wd6e_20:disabled{cursor:not-allowed;opacity:.5}._wrap_1wd6e_1 ._chevron_1wd6e_46{position:absolute;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;width:1.15rem;pointer-events:none;color:#444}._wrap_1wd6e_1 ._chevron_1wd6e_46:after{content:"";display:block;width:0;height:0;border-style:solid;border-width:.28rem .22rem 0;border-color:currentColor transparent transparent}._list_1wd6e_69{position:fixed;z-index:1300;min-width:10rem;max-height:18rem;margin:0;padding:.15rem 0;overflow:auto;border:1px solid #d0d0d0;border-radius:3px;background:#fff;box-shadow:0 4px 12px #0000001f;list-style:none}._option_1wd6e_84{display:block;width:100%;margin:0;padding:.25rem .75rem;border:0;background:transparent;color:#222;font-family:system-ui,sans-serif;line-height:1.25;text-align:start;cursor:pointer}._option_1wd6e_84:hover,._option_1wd6e_84:focus-visible{background:#e8f0fe;outline:none}._option_1wd6e_84[aria-checked=true]{font-weight:600}._option_1wd6e_84:disabled{cursor:not-allowed;opacity:.5}._separator_1wd6e_113{height:1px;margin:.25rem .5rem;padding:0;background:#d0d0d0;border:0;list-style:none}._root_14tok_1{all:revert;position:relative;box-sizing:border-box;display:flex;flex-direction:column;width:100%;min-width:0;height:100%;min-height:16rem;border:var(--wysiwyg-border-width, 1px) solid var(--wysiwyg-border-color, #d0d0d0);border-radius:var(--wysiwyg-border-radius, 6px);box-shadow:var(--wysiwyg-border-shadow, none);overflow:hidden;background:#fff;color:#111;font-family:system-ui,sans-serif;font-size:1rem;font-weight:400;font-style:normal;font-variant:normal;line-height:1.5;letter-spacing:normal;text-align:start;text-indent:0;text-transform:none;text-decoration:none;text-shadow:none;white-space:normal;word-spacing:normal;direction:ltr}._root_14tok_1._fullscreen_14tok_34{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;width:100%;height:100%;min-height:0;border:none;border-radius:0;box-shadow:none}._root_14tok_1 ._exitFullscreen_14tok_46{position:absolute;z-index:2;top:.4rem;right:.4rem;display:inline-flex;align-items:center;justify-content:center;-webkit-appearance:none;-moz-appearance:none;appearance:none;width:2rem;height:2rem;margin:0;padding:0;border:0;border-radius:4px;background:#fff;color:#444;font:inherit;cursor:pointer;box-shadow:0 1px 3px #0003}._root_14tok_1 ._exitFullscreen_14tok_46:hover{background:#f4f4f4}._root_14tok_1 ._exitFullscreen_14tok_46:focus{outline:none;box-shadow:inset 0 0 0 2px #8ab4ff}._root_14tok_1 ._exitFullscreenIcon_14tok_77{display:block;width:1rem;height:1rem;flex-shrink:0}._root_14tok_1 *:not(:is(svg,svg *)),._root_14tok_1 *:before,._root_14tok_1 *:after{all:revert;box-sizing:border-box}._root_14tok_1 ._chrome_14tok_92{display:flex;flex-direction:column;flex-shrink:0;align-items:stretch;z-index:1;width:100%;min-width:0;border-bottom:1px solid #e5e5e5}._root_14tok_1 ._workspace_14tok_103{display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:auto;padding:1rem;background:#f0f0f0}._root_14tok_1 ._surface_14tok_113{width:100%;min-height:100%;background:#fff;box-shadow:0 1px 3px #0000001f}._root_14tok_1 ._visual_14tok_120{flex:1 0 auto;min-height:100%;padding:.75rem;outline:none}._root_14tok_1 ._visual_14tok_120:focus{box-shadow:inset 0 0 0 2px #8ab4ff}._root_14tok_1 ._visual_14tok_120:empty:before{content:attr(data-placeholder);color:#888}._root_14tok_1 ._html_14tok_136{display:block;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;flex:1 1 auto;width:100%;margin:0;min-height:100%;padding:.75rem;border:0;border-radius:0;resize:none;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.875rem;font-weight:400;font-style:normal;line-height:1.5;letter-spacing:normal;color:#111;outline:none;background:#fff}._root_14tok_1 ._html_14tok_136:focus{box-shadow:inset 0 0 0 2px #8ab4ff}._root_14tok_1 ._html_14tok_136:disabled{opacity:.6}._visual_14tok_120 p{margin:0 0 .75em}._visual_14tok_120 p:last-child{margin-bottom:0}._visual_14tok_120 h1,._visual_14tok_120 h2,._visual_14tok_120 h3,._visual_14tok_120 h4,._visual_14tok_120 h5,._visual_14tok_120 h6{margin:1em 0 .5em;font-weight:600;line-height:1.25;color:inherit}._visual_14tok_120 h1:first-child,._visual_14tok_120 h2:first-child,._visual_14tok_120 h3:first-child,._visual_14tok_120 h4:first-child,._visual_14tok_120 h5:first-child,._visual_14tok_120 h6:first-child{margin-top:0}._visual_14tok_120 h1{font-size:1.75rem}._visual_14tok_120 h2{font-size:1.5rem}._visual_14tok_120 h3{font-size:1.25rem}._visual_14tok_120 h4{font-size:1.125rem}._visual_14tok_120 h5{font-size:1rem}._visual_14tok_120 h6{font-size:.875rem}._visual_14tok_120 ul,._visual_14tok_120 ol{margin:0 0 .75em;padding-left:1.5em}._visual_14tok_120 li{margin:.25em 0}._visual_14tok_120 a{color:#06c;text-decoration:underline}._visual_14tok_120 strong,._visual_14tok_120 b{font-weight:700}._visual_14tok_120 em,._visual_14tok_120 i{font-style:italic}._visual_14tok_120 u{text-decoration:underline}._visual_14tok_120 s{text-decoration:line-through}._visual_14tok_120 blockquote{margin:0 0 .75em;padding:0 0 0 .75em;border:0;border-left:3px solid #d0d0d0;color:#444}._visual_14tok_120 code{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.875em;background:#f4f4f4;padding:.1em .3em;border-radius:3px}._visual_14tok_120 pre{margin:0 0 .75em;padding:.75em;overflow:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.875rem;line-height:1.5;background:#f4f4f4;border-radius:4px}._visual_14tok_120 pre code{background:transparent;padding:0;font-size:inherit}._visual_14tok_120 hr{margin:1em 0;border:0;border-top:1px solid #d0d0d0}._visual_14tok_120 img{max-width:100%;vertical-align:middle}
@@ -0,0 +1,3 @@
1
+ import { EditorProps } from '../types';
2
+ export declare function Editor({ value, defaultValue, onChange, mode: modeProp, defaultMode, onModeChange, fullscreen: fullscreenProp, defaultFullscreen, onFullscreenChange, placeholder, disabled, className, locale, toolbarBackground, menuColor, menuBackground, menuFontSize, menuFontFamily, border, menuVisible, toolbarVisible, customActions, customFonts, transformHtml, loadCustomParagraphStyles, onSaveCustomParagraphStyle, onDeleteCustomParagraphStyle, customImagePicker, disableBuiltinImageInsert, }: EditorProps): import("react").JSX.Element;
3
+ //# sourceMappingURL=Editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../../src/components/Editor.tsx"],"names":[],"mappings":"AA4JA,OAAO,KAAK,EAOV,WAAW,EACZ,MAAM,UAAU,CAAA;AAKjB,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,YAAiB,EACjB,QAAQ,EACR,IAAI,EAAE,QAAQ,EACd,WAAsB,EACtB,YAAY,EACZ,UAAU,EAAE,cAAc,EAC1B,iBAAyB,EACzB,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,SAAS,EACT,MAAa,EACb,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,YAAY,EACZ,cAAc,EACd,MAAM,EACN,WAAkB,EAClB,cAAqB,EACrB,aAAa,EACb,WAAW,EACX,aAAa,EACb,yBAAyB,EACzB,0BAA0B,EAC1B,4BAA4B,EAC5B,iBAAiB,EACjB,yBAAyB,GAC1B,EAAE,WAAW,+BAm4Db"}
@@ -0,0 +1,9 @@
1
+ type HtmlSurfaceProps = {
2
+ html: string;
3
+ onChange: (html: string) => void;
4
+ placeholder?: string;
5
+ disabled?: boolean;
6
+ };
7
+ export declare const HtmlSurface: import('react').ForwardRefExoticComponent<HtmlSurfaceProps & import('react').RefAttributes<HTMLTextAreaElement>>;
8
+ export {};
9
+ //# sourceMappingURL=HtmlSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HtmlSurface.d.ts","sourceRoot":"","sources":["../../src/components/HtmlSurface.tsx"],"names":[],"mappings":"AAIA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,WAAW,kHAiBvB,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { MouseEvent as ReactMouseEvent, PointerEvent as ReactPointerEvent } from 'react';
2
+ type VisualSurfaceProps = {
3
+ html: string;
4
+ onChange: (html: string) => void;
5
+ placeholder?: string;
6
+ disabled?: boolean;
7
+ onBeforeInput?: (event: InputEvent) => void;
8
+ onPointerDown?: (event: ReactPointerEvent<HTMLDivElement>) => void;
9
+ onContextMenu?: (event: ReactMouseEvent<HTMLDivElement>) => void;
10
+ };
11
+ export declare const VisualSurface: import('react').ForwardRefExoticComponent<VisualSurfaceProps & import('react').RefAttributes<HTMLDivElement>>;
12
+ export {};
13
+ //# sourceMappingURL=VisualSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisualSurface.d.ts","sourceRoot":"","sources":["../../src/components/VisualSurface.tsx"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,UAAU,IAAI,eAAe,EAClC,KAAK,YAAY,IAAI,iBAAiB,EACvC,MAAM,OAAO,CAAA;AAKd,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAC3C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;IAClE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,cAAc,CAAC,KAAK,IAAI,CAAA;CACjE,CAAA;AAED,eAAO,MAAM,aAAa,+GAgDzB,CAAA"}
@@ -0,0 +1,10 @@
1
+ export declare const PARAGRAPH_STYLE_TAGS: readonly ["p", "h1", "h2", "h3", "h4", "h5", "h6"];
2
+ export type ParagraphStyleTag = (typeof PARAGRAPH_STYLE_TAGS)[number];
3
+ export type BlockFormatQuery = {
4
+ tag: ParagraphStyleTag | null;
5
+ mixed: boolean;
6
+ };
7
+ export declare function isParagraphStyleTag(tag: string): tag is ParagraphStyleTag;
8
+ export declare function queryBlockFormat(root: HTMLElement): BlockFormatQuery;
9
+ export declare function setBlockFormatInDocument(root: HTMLElement, tag: ParagraphStyleTag): boolean;
10
+ //# sourceMappingURL=blockFormat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockFormat.d.ts","sourceRoot":"","sources":["../../src/core/blockFormat.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,oBAAoB,oDAAqD,CAAA;AAEtF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC7B,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAoBD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAEzE;AAyHD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAapE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAyB3F"}
@@ -0,0 +1,19 @@
1
+ export declare const ALIGNABLE_TAGS: Set<string>;
2
+ export declare function tagName(el: Element): string;
3
+ export declare function elementFromNode(node: Node): Element | null;
4
+ export declare function isListContainer(node: Node): node is HTMLElement;
5
+ export declare function isListItem(node: Node): node is HTMLElement;
6
+ export declare function currentRange(root: HTMLElement): Range | null;
7
+ export declare function nodesForRange(range: Range): Node[];
8
+ export declare function textOffsetFromRoot(root: HTMLElement, node: Node, offset: number): number;
9
+ export declare function restoreOffsets(root: HTMLElement, start: number, end: number): void;
10
+ export declare function withRestoredSelection(root: HTMLElement, mutate: () => boolean): boolean;
11
+ export declare function renameElement(el: HTMLElement, tag: string): HTMLElement;
12
+ export declare function clearEmptyStyle(el: HTMLElement): void;
13
+ export declare function nearestAlignable(root: HTMLElement, node: Node): HTMLElement | null;
14
+ export declare function collectSelectedBlocks(root: HTMLElement): HTMLElement[];
15
+ export declare function wrapLoosePhrasing(root: HTMLElement, range: Range): HTMLElement | null;
16
+ export declare function ensureSelectedBlocks(root: HTMLElement): HTMLElement[];
17
+ export declare function parentList(li: HTMLElement): HTMLElement | null;
18
+ export declare function groupConsecutiveSiblings(blocks: HTMLElement[]): HTMLElement[][];
19
+ //# sourceMappingURL=blocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/core/blocks.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,aAWzB,CAAA;AAKF,wBAAgB,OAAO,CAAC,EAAE,EAAE,OAAO,GAAG,MAAM,CAE3C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,CAI1D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,WAAW,CAE/D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,WAAW,CAE1D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,KAAK,GAAG,IAAI,CAM5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,CAKlD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKlF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,GAAG,OAAO,CAUvF;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CAWvE;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAIrD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,GAAG,WAAW,GAAG,IAAI,CAalF;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAatE;AAuDD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAwBrF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAOrE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAG9D;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,EAAE,CAa/E"}
@@ -0,0 +1,10 @@
1
+ export declare const BOOKMARK_NAME_PATTERN: RegExp;
2
+ export type BookmarkEntry = {
3
+ id: string;
4
+ };
5
+ export type BookmarkNameError = 'empty' | 'invalid' | 'duplicate';
6
+ export declare function listBookmarks(visualRoot: HTMLElement): BookmarkEntry[];
7
+ export declare function bookmarkIds(visualRoot: HTMLElement): Set<string>;
8
+ export declare function validateBookmarkName(name: string, existingIds: ReadonlySet<string>): BookmarkNameError | null;
9
+ export declare function insertBookmarkInDocument(root: HTMLElement, name: string): boolean;
10
+ //# sourceMappingURL=bookmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bookmark.d.ts","sourceRoot":"","sources":["../../src/core/bookmark.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,QAA6B,CAAA;AAE/D,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,SAAS,GAAG,WAAW,CAAA;AAIjE,wBAAgB,aAAa,CAAC,UAAU,EAAE,WAAW,GAAG,aAAa,EAAE,CAatE;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAEhE;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAC/B,iBAAiB,GAAG,IAAI,CAM1B;AAqBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CA8BjF"}
@@ -0,0 +1,18 @@
1
+ import { CssLength } from './cssLength';
2
+ import { BoxSides } from './paragraphBox';
3
+ export declare const CELL_VERTICAL_ALIGNS: readonly ["top", "middle", "bottom", "baseline"];
4
+ export type CellVerticalAlign = (typeof CELL_VERTICAL_ALIGNS)[number];
5
+ export type CellPropertiesApply = {
6
+ backgroundColor: string | null;
7
+ color: string | null;
8
+ padding: BoxSides;
9
+ verticalAlign: CellVerticalAlign | null;
10
+ width: CssLength | null;
11
+ };
12
+ export declare function defaultCellPropertiesApply(overrides?: Partial<CellPropertiesApply>): CellPropertiesApply;
13
+ export declare function readCellProperties(cell: HTMLTableCellElement): CellPropertiesApply;
14
+ export declare function writeCellProperties(cell: HTMLTableCellElement, draft: CellPropertiesApply): boolean;
15
+ export declare function queryCellAtSelection(root: HTMLElement): CellPropertiesApply | null;
16
+ export declare function applyCellPropertiesInDocument(root: HTMLElement, draft: CellPropertiesApply): boolean;
17
+ export declare function cellPropertiesEqual(a: CellPropertiesApply, b: CellPropertiesApply): boolean;
18
+ //# sourceMappingURL=cellProperties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cellProperties.d.ts","sourceRoot":"","sources":["../../src/core/cellProperties.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,aAAa,CAAA;AAEpB,OAAO,EAKL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAA;AAGvB,eAAO,MAAM,oBAAoB,kDAAmD,CAAA;AAEpF,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAA;AAErE,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,OAAO,EAAE,QAAQ,CAAA;IACjB,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACvC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA;CACxB,CAAA;AAID,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,mBAAmB,CAAM,GAC3C,mBAAmB,CASrB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,mBAAmB,CASlF;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAwBT;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,GAAG,IAAI,CAIlF;AAED,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAQT;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAQ3F"}
@@ -0,0 +1,2 @@
1
+ export declare function clearFormattingInDocument(root: HTMLElement): boolean;
2
+ //# sourceMappingURL=clearFormatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearFormatting.d.ts","sourceRoot":"","sources":["../../src/core/clearFormatting.ts"],"names":[],"mappings":"AAyDA,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAcpE"}
@@ -0,0 +1,9 @@
1
+ export type ClipboardPayload = {
2
+ html: string;
3
+ text: string;
4
+ };
5
+ export declare function serializeSelection(root: HTMLElement): ClipboardPayload | null;
6
+ export declare function deleteSelectionInDocument(root: HTMLElement): boolean;
7
+ export declare function copySelectionInDocument(root: HTMLElement): Promise<boolean>;
8
+ export declare function cutSelectionInDocument(root: HTMLElement): Promise<boolean>;
9
+ //# sourceMappingURL=clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/core/clipboard.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAUD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAe7E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAQpE;AAiCD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAIjF;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhF"}