stilo-editor 0.0.0-stage → 0.2.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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -2
  3. package/dist/characters--8h5uTeF.js +854 -0
  4. package/dist/content.css +398 -0
  5. package/dist/core/drop.d.ts +6 -0
  6. package/dist/core/editor.d.ts +120 -0
  7. package/dist/core/errors.d.ts +6 -0
  8. package/dist/core/events.d.ts +19 -0
  9. package/dist/core/extension-manager.d.ts +57 -0
  10. package/dist/core/extension.d.ts +48 -0
  11. package/dist/core/helpers/active.d.ts +33 -0
  12. package/dist/core/helpers/block-style.d.ts +25 -0
  13. package/dist/core/helpers/input-rules.d.ts +28 -0
  14. package/dist/core/helpers/lists.d.ts +20 -0
  15. package/dist/core/helpers/marks.d.ts +52 -0
  16. package/dist/core/helpers/nodes.d.ts +26 -0
  17. package/dist/core/helpers/parse-rules.d.ts +8 -0
  18. package/dist/core/helpers/word-count.d.ts +14 -0
  19. package/dist/core/html/css.d.ts +106 -0
  20. package/dist/core/html/parse.d.ts +7 -0
  21. package/dist/core/html/paste/base-styles.d.ts +7 -0
  22. package/dist/core/html/paste/google-docs.d.ts +7 -0
  23. package/dist/core/html/paste/index.d.ts +9 -0
  24. package/dist/core/html/paste/table-widths.d.ts +7 -0
  25. package/dist/core/html/paste/word.d.ts +8 -0
  26. package/dist/core/html/sanitize.d.ts +49 -0
  27. package/dist/core/html/serialize.d.ts +31 -0
  28. package/dist/core/types.d.ts +107 -0
  29. package/dist/extensions/blockquote/index.d.ts +15 -0
  30. package/dist/extensions/bold/index.d.ts +17 -0
  31. package/dist/extensions/bullet-list/index.d.ts +9 -0
  32. package/dist/extensions/clear-formatting/index.d.ts +12 -0
  33. package/dist/extensions/code/index.d.ts +15 -0
  34. package/dist/extensions/code-block/index.d.ts +24 -0
  35. package/dist/extensions/default-extensions/index.d.ts +57 -0
  36. package/dist/extensions/document/index.d.ts +17 -0
  37. package/dist/extensions/drop-cursor/index.d.ts +15 -0
  38. package/dist/extensions/gap-cursor/index.d.ts +6 -0
  39. package/dist/extensions/hard-break/index.d.ts +11 -0
  40. package/dist/extensions/heading/index.d.ts +25 -0
  41. package/dist/extensions/highlight/index.d.ts +24 -0
  42. package/dist/extensions/history/index.d.ts +21 -0
  43. package/dist/extensions/horizontal-rule/index.d.ts +11 -0
  44. package/dist/extensions/image/image-view.d.ts +27 -0
  45. package/dist/extensions/image/index.d.ts +29 -0
  46. package/dist/extensions/index.d.ts +36 -0
  47. package/dist/extensions/italic/index.d.ts +16 -0
  48. package/dist/extensions/line-height/index.d.ts +18 -0
  49. package/dist/extensions/link/index.d.ts +23 -0
  50. package/dist/extensions/list-item/index.d.ts +16 -0
  51. package/dist/extensions/move-block/index.d.ts +17 -0
  52. package/dist/extensions/ordered-list/index.d.ts +12 -0
  53. package/dist/extensions/paragraph/index.d.ts +14 -0
  54. package/dist/extensions/placeholder/index.d.ts +13 -0
  55. package/dist/extensions/search/index.d.ts +55 -0
  56. package/dist/extensions/strike/index.d.ts +16 -0
  57. package/dist/extensions/subscript/index.d.ts +16 -0
  58. package/dist/extensions/superscript/index.d.ts +17 -0
  59. package/dist/extensions/table/index.d.ts +70 -0
  60. package/dist/extensions/task-item/index.d.ts +24 -0
  61. package/dist/extensions/task-item/task-item-view.d.ts +24 -0
  62. package/dist/extensions/task-list/index.d.ts +11 -0
  63. package/dist/extensions/text/index.d.ts +12 -0
  64. package/dist/extensions/text-align/index.d.ts +18 -0
  65. package/dist/extensions/text-case/index.d.ts +14 -0
  66. package/dist/extensions/text-style/font-size.d.ts +21 -0
  67. package/dist/extensions/text-style/index.d.ts +30 -0
  68. package/dist/extensions/underline/index.d.ts +15 -0
  69. package/dist/index.d.ts +14 -0
  70. package/dist/index.js +1 -0
  71. package/dist/src-CV6pgfTS.js +2662 -0
  72. package/dist/style.css +1395 -0
  73. package/dist/ui/components/character-picker.d.ts +22 -0
  74. package/dist/ui/components/characters.d.ts +10 -0
  75. package/dist/ui/components/color-button.d.ts +23 -0
  76. package/dist/ui/components/dropdown.d.ts +34 -0
  77. package/dist/ui/components/find-bar.d.ts +24 -0
  78. package/dist/ui/components/font-size-input.d.ts +21 -0
  79. package/dist/ui/components/icon-menu.d.ts +20 -0
  80. package/dist/ui/components/icon.d.ts +3 -0
  81. package/dist/ui/components/link-bubble.d.ts +19 -0
  82. package/dist/ui/components/link-popover.d.ts +20 -0
  83. package/dist/ui/components/popover.d.ts +27 -0
  84. package/dist/ui/components/shortcut.d.ts +11 -0
  85. package/dist/ui/components/status-bar.d.ts +19 -0
  86. package/dist/ui/components/table-actions.d.ts +25 -0
  87. package/dist/ui/components/table-handles.d.ts +16 -0
  88. package/dist/ui/components/table-menu.d.ts +21 -0
  89. package/dist/ui/i18n/en.d.ts +3 -0
  90. package/dist/ui/i18n/it.d.ts +3 -0
  91. package/dist/ui/i18n/types.d.ts +4 -0
  92. package/dist/ui/index.d.ts +23 -0
  93. package/dist/ui/toolbar/fonts.d.ts +8 -0
  94. package/dist/ui/toolbar/items.d.ts +33 -0
  95. package/dist/ui/toolbar/palette.d.ts +6 -0
  96. package/dist/ui/toolbar/toolbar.d.ts +28 -0
  97. package/dist/ui/toolbar/types.d.ts +150 -0
  98. package/dist/ui.css +996 -0
  99. package/dist/ui.js +2350 -0
  100. package/package.json +96 -4
package/dist/ui.js ADDED
@@ -0,0 +1,2350 @@
1
+ import { V as e, _ as t, a as n, f as r, i, nt as a } from "./src-CV6pgfTS.js";
2
+ import { ALargeSmall as o, Bold as s, CaseSensitive as c, ChevronDown as l, ChevronUp as u, Code as d, ExternalLink as f, FaceSlightlySmilingPlus as p, Grip as m, GripHorizontal as h, GripVertical as g, Highlighter as _, Italic as v, Link as y, List as b, ListChevronsUpDown as x, ListOrdered as S, ListTodo as C, Minus as w, Pencil as T, Plus as E, Quote as D, Redo2 as O, RemoveFormatting as k, Search as A, SquareCode as j, Strikethrough as M, Subscript as N, Superscript as P, Table as F, TextAlignCenter as I, TextAlignEnd as L, TextAlignJustify as R, TextAlignStart as z, Type as ee, Underline as te, Undo2 as ne, Unlink as re, WholeWord as ie, X as ae, createElement as oe } from "lucide";
3
+ import { autoUpdate as se, computePosition as ce, flip as le, hide as ue, offset as B, shift as de } from "@floating-ui/dom";
4
+ //#region src/ui/components/shortcut.ts
5
+ function fe() {
6
+ return /Mac|iPhone|iPad/.test(navigator.platform);
7
+ }
8
+ function V(e, t) {
9
+ let n = e.split("-"), r = n.pop(), i = [];
10
+ if (t) return n.includes("Ctrl") && i.push("⌃"), n.includes("Alt") && i.push("⌥"), n.includes("Shift") && i.push("⇧"), n.includes("Mod") && i.push("⌘"), i.join("") + (r.length === 1 ? r.toUpperCase() : r);
11
+ let a = n.includes("Mod"), o = n.includes("Ctrl");
12
+ return (o || a && !o) && i.push("Ctrl"), n.includes("Alt") && i.push("Alt"), n.includes("Shift") && i.push("Shift"), i.join("+") + (i.length > 0 ? "+" : "") + (r.length === 1 ? r.toUpperCase() : r);
13
+ }
14
+ //#endregion
15
+ //#region src/ui/i18n/en.ts
16
+ var H = {
17
+ "toolbar.label": "Formatting",
18
+ "toolbar.undo": "Undo",
19
+ "toolbar.redo": "Redo",
20
+ "toolbar.bold": "Bold",
21
+ "toolbar.italic": "Italic",
22
+ "toolbar.underline": "Underline",
23
+ "toolbar.strike": "Strikethrough",
24
+ "toolbar.subscript": "Subscript",
25
+ "toolbar.superscript": "Superscript",
26
+ "toolbar.code": "Code",
27
+ "toolbar.clearFormatting": "Clear formatting",
28
+ "toolbar.textCase": "Text case",
29
+ "toolbar.bulletList": "Bulleted list",
30
+ "toolbar.orderedList": "Numbered list",
31
+ "toolbar.taskList": "Checklist",
32
+ "toolbar.blockquote": "Quote",
33
+ "toolbar.codeBlock": "Code block",
34
+ "toolbar.horizontalRule": "Horizontal line",
35
+ "toolbar.link": "Link",
36
+ "toolbar.heading": "Text style",
37
+ "toolbar.fontFamily": "Font",
38
+ "toolbar.fontSize": "Font size",
39
+ "fontSize.decrease": "Decrease font size",
40
+ "fontSize.increase": "Increase font size",
41
+ "toolbar.textAlign": "Alignment",
42
+ "align.left": "Align left",
43
+ "align.center": "Center",
44
+ "align.right": "Align right",
45
+ "align.justify": "Justify",
46
+ "toolbar.lineHeight": "Line spacing",
47
+ "lineHeight.default": "Default",
48
+ "textCase.upper": "UPPERCASE",
49
+ "textCase.lower": "lowercase",
50
+ "textCase.title": "Title Case",
51
+ "textCase.sentence": "Sentence case",
52
+ "textCase.toggle": "tOGGLE cASE",
53
+ "font.default": "Default",
54
+ "font.sansSerif": "Sans serif",
55
+ "font.serif": "Serif",
56
+ "font.monospace": "Monospace",
57
+ "heading.paragraph": "Paragraph",
58
+ "heading.h1": "Heading 1",
59
+ "heading.h2": "Heading 2",
60
+ "heading.h3": "Heading 3",
61
+ "heading.h4": "Heading 4",
62
+ "heading.h5": "Heading 5",
63
+ "heading.h6": "Heading 6",
64
+ "link.url": "URL",
65
+ "link.newTab": "Open in new tab",
66
+ "link.apply": "Apply",
67
+ "link.remove": "Remove link",
68
+ "link.edit": "Edit link",
69
+ "link.open": "Open link in a new tab",
70
+ "toolbar.characters": "Insert character",
71
+ "characters.search": "Search",
72
+ "characters.noResults": "No results",
73
+ "characters.symbols": "Symbols",
74
+ "characters.emoji": "Emoji",
75
+ "characters.punctuation": "Punctuation",
76
+ "characters.currency": "Currency",
77
+ "characters.math": "Math",
78
+ "characters.arrows": "Arrows",
79
+ "characters.greek": "Greek",
80
+ "characters.latin": "Accented letters",
81
+ "characters.signs": "Signs and shapes",
82
+ "characters.smileys": "Smileys",
83
+ "characters.people": "People and gestures",
84
+ "characters.nature": "Animals and nature",
85
+ "characters.food": "Food and drink",
86
+ "characters.travel": "Travel and places",
87
+ "characters.activities": "Activities",
88
+ "characters.objects": "Objects",
89
+ "characters.emojiSymbols": "Symbols",
90
+ "toolbar.textColor": "Text color",
91
+ "toolbar.highlight": "Highlight",
92
+ "color.more": "more colors",
93
+ "color.default": "Default",
94
+ "color.none": "No color",
95
+ "color.pick": "Pick a color",
96
+ "color.custom": "Custom color",
97
+ "color.apply": "Apply",
98
+ "color.black": "Black",
99
+ "color.darkGray2": "Dark gray 2",
100
+ "color.darkGray1": "Dark gray 1",
101
+ "color.gray": "Gray",
102
+ "color.lightGray1": "Light gray 1",
103
+ "color.lightGray2": "Light gray 2",
104
+ "color.lightGray3": "Light gray 3",
105
+ "color.white": "White",
106
+ "color.red": "Red",
107
+ "color.orange": "Orange",
108
+ "color.yellow": "Yellow",
109
+ "color.green": "Green",
110
+ "color.cyan": "Cyan",
111
+ "color.blue": "Blue",
112
+ "color.purple": "Purple",
113
+ "color.pink": "Pink",
114
+ "color.lightRed": "Light red",
115
+ "color.lightOrange": "Light orange",
116
+ "color.lightYellow": "Light yellow",
117
+ "color.lightGreen": "Light green",
118
+ "color.lightCyan": "Light cyan",
119
+ "color.lightBlue": "Light blue",
120
+ "color.lightPurple": "Light purple",
121
+ "color.lightPink": "Light pink",
122
+ "color.darkRed": "Dark red",
123
+ "color.darkOrange": "Dark orange",
124
+ "color.darkYellow": "Dark yellow",
125
+ "color.darkGreen": "Dark green",
126
+ "color.darkCyan": "Dark cyan",
127
+ "color.darkBlue": "Dark blue",
128
+ "color.darkPurple": "Dark purple",
129
+ "color.darkPink": "Dark pink",
130
+ "toolbar.table": "Table",
131
+ "table.insert": "Insert table",
132
+ "table.size": "{columns} × {rows}",
133
+ "table.row": "Row",
134
+ "table.column": "Column",
135
+ "table.headerRow": "Header row",
136
+ "table.headerColumn": "Header column",
137
+ "table.addRowBefore": "Insert row above",
138
+ "table.addRowAfter": "Insert row below",
139
+ "table.deleteRow": "Delete row",
140
+ "table.addColumnBefore": "Insert column left",
141
+ "table.addColumnAfter": "Insert column right",
142
+ "table.deleteColumn": "Delete column",
143
+ "table.mergeCells": "Merge cells",
144
+ "table.splitCell": "Split cell",
145
+ "table.deleteTable": "Delete table",
146
+ "toolbar.find": "Find and replace",
147
+ "find.find": "Find",
148
+ "find.replace": "Replace with",
149
+ "find.previous": "Previous match",
150
+ "find.next": "Next match",
151
+ "find.matchCase": "Match case",
152
+ "find.wholeWord": "Whole word",
153
+ "find.replaceOne": "Replace",
154
+ "find.replaceAll": "Replace all",
155
+ "find.close": "Close",
156
+ "find.position": "{current} of {total}",
157
+ "find.results": "Results: {total}",
158
+ "find.noResults": "No results",
159
+ "status.words": "Words",
160
+ "status.characters": "Characters"
161
+ }, pe = 500;
162
+ function me(t, n) {
163
+ let { container: r, messages: i = H } = n, a = document.createElement("div");
164
+ a.className = "stilo-status-bar";
165
+ let o = document.createElement("span");
166
+ o.className = "stilo-status-bar__words";
167
+ let s = document.createElement("span");
168
+ s.className = "stilo-status-bar__characters", a.append(o, s), r.append(a);
169
+ let c = 0, l = !1;
170
+ function u() {
171
+ clearTimeout(c), c = 0;
172
+ let n = e(t);
173
+ o.textContent = `${i["status.words"]}: ${n.words.toLocaleString()}`, s.textContent = `${i["status.characters"]}: ${n.characters.toLocaleString()}`;
174
+ }
175
+ let d = () => {
176
+ clearTimeout(c), c = window.setTimeout(u, pe);
177
+ };
178
+ function f() {
179
+ l || (l = !0, clearTimeout(c), t.off("input", d), t.off("destroy", f), a.remove());
180
+ }
181
+ return t.on("input", d), t.on("destroy", f), u(), {
182
+ element: a,
183
+ update: u,
184
+ destroy: f
185
+ };
186
+ }
187
+ //#endregion
188
+ //#region src/ui/i18n/it.ts
189
+ var he = {
190
+ "toolbar.label": "Formattazione",
191
+ "toolbar.undo": "Annulla",
192
+ "toolbar.redo": "Ripeti",
193
+ "toolbar.bold": "Grassetto",
194
+ "toolbar.italic": "Corsivo",
195
+ "toolbar.underline": "Sottolineato",
196
+ "toolbar.strike": "Barrato",
197
+ "toolbar.subscript": "Pedice",
198
+ "toolbar.superscript": "Apice",
199
+ "toolbar.code": "Codice",
200
+ "toolbar.clearFormatting": "Cancella formattazione",
201
+ "toolbar.textCase": "Maiuscole e minuscole",
202
+ "toolbar.bulletList": "Elenco puntato",
203
+ "toolbar.orderedList": "Elenco numerato",
204
+ "toolbar.taskList": "Elenco di controllo",
205
+ "toolbar.blockquote": "Citazione",
206
+ "toolbar.codeBlock": "Blocco di codice",
207
+ "toolbar.horizontalRule": "Linea orizzontale",
208
+ "toolbar.link": "Collegamento",
209
+ "toolbar.heading": "Stile testo",
210
+ "toolbar.fontFamily": "Carattere",
211
+ "toolbar.fontSize": "Dimensione carattere",
212
+ "fontSize.decrease": "Riduci dimensione carattere",
213
+ "fontSize.increase": "Aumenta dimensione carattere",
214
+ "toolbar.textAlign": "Allineamento",
215
+ "align.left": "Allinea a sinistra",
216
+ "align.center": "Centra",
217
+ "align.right": "Allinea a destra",
218
+ "align.justify": "Giustifica",
219
+ "toolbar.lineHeight": "Interlinea",
220
+ "lineHeight.default": "Predefinita",
221
+ "textCase.upper": "MAIUSCOLO",
222
+ "textCase.lower": "minuscolo",
223
+ "textCase.title": "Iniziali Maiuscole",
224
+ "textCase.sentence": "Tipo frase",
225
+ "textCase.toggle": "iNVERTI mAIUSCOLE",
226
+ "font.default": "Predefinito",
227
+ "font.sansSerif": "Senza grazie",
228
+ "font.serif": "Con grazie",
229
+ "font.monospace": "Monospaziato",
230
+ "heading.paragraph": "Paragrafo",
231
+ "heading.h1": "Titolo 1",
232
+ "heading.h2": "Titolo 2",
233
+ "heading.h3": "Titolo 3",
234
+ "heading.h4": "Titolo 4",
235
+ "heading.h5": "Titolo 5",
236
+ "heading.h6": "Titolo 6",
237
+ "link.url": "URL",
238
+ "link.newTab": "Apri in una nuova scheda",
239
+ "link.apply": "Applica",
240
+ "link.remove": "Rimuovi collegamento",
241
+ "link.edit": "Modifica collegamento",
242
+ "link.open": "Apri il collegamento in una nuova scheda",
243
+ "toolbar.characters": "Inserisci carattere",
244
+ "characters.search": "Cerca",
245
+ "characters.noResults": "Nessun risultato",
246
+ "characters.symbols": "Simboli",
247
+ "characters.emoji": "Emoji",
248
+ "characters.punctuation": "Punteggiatura",
249
+ "characters.currency": "Valute",
250
+ "characters.math": "Matematica",
251
+ "characters.arrows": "Frecce",
252
+ "characters.greek": "Greco",
253
+ "characters.latin": "Lettere accentate",
254
+ "characters.signs": "Segni e forme",
255
+ "characters.smileys": "Faccine",
256
+ "characters.people": "Persone e gesti",
257
+ "characters.nature": "Animali e natura",
258
+ "characters.food": "Cibo e bevande",
259
+ "characters.travel": "Viaggi e luoghi",
260
+ "characters.activities": "Attività",
261
+ "characters.objects": "Oggetti",
262
+ "characters.emojiSymbols": "Simboli",
263
+ "toolbar.textColor": "Colore testo",
264
+ "toolbar.highlight": "Evidenziatore",
265
+ "color.more": "altri colori",
266
+ "color.default": "Predefinito",
267
+ "color.none": "Nessun colore",
268
+ "color.pick": "Scegli un colore",
269
+ "color.custom": "Colore personalizzato",
270
+ "color.apply": "Applica",
271
+ "color.black": "Nero",
272
+ "color.darkGray2": "Grigio scuro 2",
273
+ "color.darkGray1": "Grigio scuro 1",
274
+ "color.gray": "Grigio",
275
+ "color.lightGray1": "Grigio chiaro 1",
276
+ "color.lightGray2": "Grigio chiaro 2",
277
+ "color.lightGray3": "Grigio chiaro 3",
278
+ "color.white": "Bianco",
279
+ "color.red": "Rosso",
280
+ "color.orange": "Arancione",
281
+ "color.yellow": "Giallo",
282
+ "color.green": "Verde",
283
+ "color.cyan": "Ciano",
284
+ "color.blue": "Blu",
285
+ "color.purple": "Viola",
286
+ "color.pink": "Rosa",
287
+ "color.lightRed": "Rosso chiaro",
288
+ "color.lightOrange": "Arancione chiaro",
289
+ "color.lightYellow": "Giallo chiaro",
290
+ "color.lightGreen": "Verde chiaro",
291
+ "color.lightCyan": "Ciano chiaro",
292
+ "color.lightBlue": "Blu chiaro",
293
+ "color.lightPurple": "Viola chiaro",
294
+ "color.lightPink": "Rosa chiaro",
295
+ "color.darkRed": "Rosso scuro",
296
+ "color.darkOrange": "Arancione scuro",
297
+ "color.darkYellow": "Giallo scuro",
298
+ "color.darkGreen": "Verde scuro",
299
+ "color.darkCyan": "Ciano scuro",
300
+ "color.darkBlue": "Blu scuro",
301
+ "color.darkPurple": "Viola scuro",
302
+ "color.darkPink": "Rosa scuro",
303
+ "toolbar.table": "Tabella",
304
+ "table.insert": "Inserisci tabella",
305
+ "table.size": "{columns} × {rows}",
306
+ "table.row": "Riga",
307
+ "table.column": "Colonna",
308
+ "table.headerRow": "Riga di intestazione",
309
+ "table.headerColumn": "Colonna di intestazione",
310
+ "table.addRowBefore": "Inserisci riga sopra",
311
+ "table.addRowAfter": "Inserisci riga sotto",
312
+ "table.deleteRow": "Elimina riga",
313
+ "table.addColumnBefore": "Inserisci colonna a sinistra",
314
+ "table.addColumnAfter": "Inserisci colonna a destra",
315
+ "table.deleteColumn": "Elimina colonna",
316
+ "table.mergeCells": "Unisci celle",
317
+ "table.splitCell": "Dividi cella",
318
+ "table.deleteTable": "Elimina tabella",
319
+ "toolbar.find": "Trova e sostituisci",
320
+ "find.find": "Trova",
321
+ "find.replace": "Sostituisci con",
322
+ "find.previous": "Risultato precedente",
323
+ "find.next": "Risultato successivo",
324
+ "find.matchCase": "Maiuscole/minuscole",
325
+ "find.wholeWord": "Parola intera",
326
+ "find.replaceOne": "Sostituisci",
327
+ "find.replaceAll": "Sostituisci tutto",
328
+ "find.close": "Chiudi",
329
+ "find.position": "{current} di {total}",
330
+ "find.results": "Risultati: {total}",
331
+ "find.noResults": "Nessun risultato",
332
+ "status.words": "Parole",
333
+ "status.characters": "Caratteri"
334
+ }, ge = [
335
+ {
336
+ fontFamily: "sans-serif",
337
+ labelKey: "font.sansSerif"
338
+ },
339
+ {
340
+ fontFamily: "serif",
341
+ labelKey: "font.serif"
342
+ },
343
+ {
344
+ fontFamily: "monospace",
345
+ labelKey: "font.monospace"
346
+ },
347
+ {
348
+ fontFamily: "Arial, Helvetica, sans-serif",
349
+ labelKey: "Arial"
350
+ },
351
+ {
352
+ fontFamily: "Verdana, Geneva, sans-serif",
353
+ labelKey: "Verdana"
354
+ },
355
+ {
356
+ fontFamily: "Tahoma, Geneva, sans-serif",
357
+ labelKey: "Tahoma"
358
+ },
359
+ {
360
+ fontFamily: "'Trebuchet MS', Helvetica, sans-serif",
361
+ labelKey: "Trebuchet MS"
362
+ },
363
+ {
364
+ fontFamily: "Georgia, serif",
365
+ labelKey: "Georgia"
366
+ },
367
+ {
368
+ fontFamily: "'Times New Roman', Times, serif",
369
+ labelKey: "Times New Roman"
370
+ },
371
+ {
372
+ fontFamily: "'Courier New', Courier, monospace",
373
+ labelKey: "Courier New"
374
+ }
375
+ ], _e = {
376
+ pt: [
377
+ 8,
378
+ 9,
379
+ 10,
380
+ 11,
381
+ 12,
382
+ 14,
383
+ 18,
384
+ 24,
385
+ 36,
386
+ 48,
387
+ 72
388
+ ],
389
+ px: [
390
+ 10,
391
+ 12,
392
+ 14,
393
+ 16,
394
+ 18,
395
+ 20,
396
+ 24,
397
+ 32,
398
+ 48,
399
+ 64,
400
+ 96
401
+ ]
402
+ };
403
+ //#endregion
404
+ //#region src/ui/components/popover.ts
405
+ function U(e) {
406
+ let { anchor: t, content: n, container: r, placement: i = "bottom-start", offset: a = 4, onClose: o } = e, s = !1, c = !1, l, u = 0;
407
+ n.classList.add("stilo-popover"), n.setAttribute("hidden", ""), r.classList.add("stilo-popover-host"), r.appendChild(n);
408
+ function d() {
409
+ let e = ++u;
410
+ Promise.resolve(ce(t, n, {
411
+ strategy: "absolute",
412
+ placement: i,
413
+ middleware: [
414
+ B(a),
415
+ le(),
416
+ de({ padding: 8 })
417
+ ]
418
+ }).then((t) => {
419
+ s || u !== e || (n.style.left = `${t.x}px`, n.style.top = `${t.y}px`);
420
+ }));
421
+ }
422
+ function f() {
423
+ c || s || (c = !0, n.removeAttribute("hidden"), l = se(t, n, () => {
424
+ c && d();
425
+ }), document.addEventListener("pointerdown", h, !0), document.addEventListener("keydown", g, !0));
426
+ }
427
+ function p(e = "api") {
428
+ c && !s && (c = !1, n.setAttribute("hidden", ""), l?.(), l = void 0, document.removeEventListener("pointerdown", h, !0), document.removeEventListener("keydown", g, !0), o?.(e));
429
+ }
430
+ function m() {
431
+ s || (s = !0, c && (c = !1, n.setAttribute("hidden", ""), l?.(), l = void 0, document.removeEventListener("pointerdown", h, !0), document.removeEventListener("keydown", g, !0), o?.("api")), r.contains(n) && r.removeChild(n), r.querySelector(":scope > .stilo-popover") || r.classList.remove("stilo-popover-host"));
432
+ }
433
+ function h(e) {
434
+ if (!c || s) return;
435
+ let r = e.target;
436
+ n.contains(r) || typeof t == "object" && "nodeType" in t && t.nodeType === 1 && t.contains(r) || p("outside");
437
+ }
438
+ function g(e) {
439
+ c && !s && e.key === "Escape" && (e.preventDefault(), p("escape"));
440
+ }
441
+ return {
442
+ get isOpen() {
443
+ return c;
444
+ },
445
+ open: f,
446
+ close: p,
447
+ destroy: m
448
+ };
449
+ }
450
+ //#endregion
451
+ //#region src/ui/components/link-popover.ts
452
+ var ve = "https://example.com";
453
+ function ye(e) {
454
+ return e.isActive("link") || e.commands.setLink.can({ href: ve });
455
+ }
456
+ function be(e, t) {
457
+ let { container: n, messages: r } = t, i = {
458
+ contextElement: e.view.dom,
459
+ getBoundingClientRect: () => {
460
+ let { from: t, to: n } = e.state.selection, r = e.view.coordsAtPos(t), i = e.view.coordsAtPos(n), a = Math.min(r.left, i.left), o = Math.max(r.right, i.right), { top: s } = r, { bottom: c } = i;
461
+ return {
462
+ x: a,
463
+ y: s,
464
+ left: a,
465
+ top: s,
466
+ right: o,
467
+ bottom: c,
468
+ width: o - a,
469
+ height: c - s
470
+ };
471
+ }
472
+ }, a = document.createElement("div");
473
+ a.className = "stilo-link-popover", a.setAttribute("role", "dialog"), a.setAttribute("aria-label", r["toolbar.link"]);
474
+ let o = document.createElement("form");
475
+ o.className = "stilo-link-popover__form";
476
+ let s = document.createElement("input");
477
+ s.type = "text", s.inputMode = "url", s.className = "stilo-link-popover__url", s.placeholder = "https://", s.autocomplete = "off", s.spellcheck = !1, s.setAttribute("aria-label", r["link.url"]);
478
+ let c = document.createElement("label");
479
+ c.className = "stilo-link-popover__new-tab";
480
+ let l = document.createElement("input");
481
+ l.type = "checkbox", c.append(l, r["link.newTab"]);
482
+ let u = document.createElement("div");
483
+ u.className = "stilo-link-popover__actions";
484
+ let d = xe("submit", r["link.apply"]);
485
+ d.classList.add("stilo-link-popover__button--primary");
486
+ let f = xe("button", r["link.remove"]);
487
+ u.append(d, f), o.append(s, c, u), a.append(o);
488
+ let p = U({
489
+ anchor: i,
490
+ content: a,
491
+ container: n,
492
+ onClose: (t) => {
493
+ t === "escape" && e.focus();
494
+ }
495
+ });
496
+ function m() {
497
+ p.close(), e.focus();
498
+ }
499
+ let h = (t) => {
500
+ t.preventDefault();
501
+ let n = s.value.trim();
502
+ (n ? e.commands.setLink({
503
+ href: n,
504
+ target: l.checked ? "_blank" : null
505
+ }) : !e.isActive("link") || e.commands.unsetLink()) ? m() : (s.setAttribute("aria-invalid", "true"), s.focus());
506
+ }, g = () => {
507
+ e.commands.unsetLink(), m();
508
+ }, _ = () => {
509
+ s.removeAttribute("aria-invalid");
510
+ };
511
+ o.addEventListener("submit", h), f.addEventListener("click", g), s.addEventListener("input", _);
512
+ function v() {
513
+ if (p.isOpen || !ye(e)) return;
514
+ let { href: t, target: n } = e.getAttributes("link");
515
+ s.value = typeof t == "string" ? t : "", s.removeAttribute("aria-invalid"), l.checked = n === "_blank", f.hidden = !e.isActive("link"), p.open(), s.focus({ preventScroll: !0 }), s.select();
516
+ }
517
+ function y() {
518
+ o.removeEventListener("submit", h), f.removeEventListener("click", g), s.removeEventListener("input", _), p.destroy();
519
+ }
520
+ return {
521
+ get isOpen() {
522
+ return p.isOpen;
523
+ },
524
+ open: v,
525
+ close: () => p.close(),
526
+ destroy: y
527
+ };
528
+ }
529
+ function xe(e, t) {
530
+ let n = document.createElement("button");
531
+ return n.type = e, n.className = "stilo-link-popover__button", n.textContent = t, n;
532
+ }
533
+ //#endregion
534
+ //#region src/ui/toolbar/palette.ts
535
+ function W(e, t) {
536
+ return {
537
+ color: e,
538
+ labelKey: t
539
+ };
540
+ }
541
+ var G = [
542
+ W("#000000", "color.black"),
543
+ W("#404040", "color.darkGray2"),
544
+ W("#737373", "color.darkGray1"),
545
+ W("#a3a3a3", "color.gray"),
546
+ W("#d4d4d4", "color.lightGray1"),
547
+ W("#e5e5e5", "color.lightGray2"),
548
+ W("#f5f5f5", "color.lightGray3"),
549
+ W("#ffffff", "color.white"),
550
+ W("#ef4444", "color.red"),
551
+ W("#f97316", "color.orange"),
552
+ W("#eab308", "color.yellow"),
553
+ W("#22c55e", "color.green"),
554
+ W("#06b6d4", "color.cyan"),
555
+ W("#3b82f6", "color.blue"),
556
+ W("#a855f7", "color.purple"),
557
+ W("#ec4899", "color.pink"),
558
+ W("#fecaca", "color.lightRed"),
559
+ W("#fed7aa", "color.lightOrange"),
560
+ W("#fef08a", "color.lightYellow"),
561
+ W("#bbf7d0", "color.lightGreen"),
562
+ W("#a5f3fc", "color.lightCyan"),
563
+ W("#bfdbfe", "color.lightBlue"),
564
+ W("#e9d5ff", "color.lightPurple"),
565
+ W("#fbcfe8", "color.lightPink"),
566
+ W("#991b1b", "color.darkRed"),
567
+ W("#9a3412", "color.darkOrange"),
568
+ W("#854d0e", "color.darkYellow"),
569
+ W("#166534", "color.darkGreen"),
570
+ W("#155e75", "color.darkCyan"),
571
+ W("#1e40af", "color.darkBlue"),
572
+ W("#6b21a8", "color.darkPurple"),
573
+ W("#9d174d", "color.darkPink")
574
+ ], Se = [
575
+ ["undo", "redo"],
576
+ ["heading"],
577
+ ["fontFamily", "fontSize"],
578
+ [
579
+ "bold",
580
+ "italic",
581
+ "underline",
582
+ "strike",
583
+ "code",
584
+ "subscript",
585
+ "superscript",
586
+ "link",
587
+ "clearFormatting",
588
+ "textCase"
589
+ ],
590
+ ["textColor", "highlight"],
591
+ ["textAlign", "lineHeight"],
592
+ [
593
+ "bulletList",
594
+ "orderedList",
595
+ "taskList",
596
+ "blockquote",
597
+ "codeBlock",
598
+ "horizontalRule",
599
+ "table",
600
+ "characters"
601
+ ],
602
+ ["find"]
603
+ ], Ce = {
604
+ undo: {
605
+ id: "undo",
606
+ kind: "button",
607
+ icon: ne,
608
+ labelKey: "toolbar.undo",
609
+ shortcut: "Mod-z",
610
+ run: (e) => {
611
+ e.commands.undo();
612
+ },
613
+ isEnabled: (e) => e.commands.undo.can()
614
+ },
615
+ redo: {
616
+ id: "redo",
617
+ kind: "button",
618
+ icon: O,
619
+ labelKey: "toolbar.redo",
620
+ shortcut: "Mod-Shift-z",
621
+ run: (e) => {
622
+ e.commands.redo();
623
+ },
624
+ isEnabled: (e) => e.commands.redo.can()
625
+ },
626
+ bold: {
627
+ id: "bold",
628
+ kind: "button",
629
+ icon: s,
630
+ labelKey: "toolbar.bold",
631
+ shortcut: "Mod-b",
632
+ run: (e) => {
633
+ e.commands.toggleBold();
634
+ },
635
+ isActive: (e) => e.isActive("bold"),
636
+ isEnabled: (e) => "toggleBold" in e.commands && e.commands.toggleBold.can(),
637
+ isAvailable: (e) => "toggleBold" in e.commands
638
+ },
639
+ italic: {
640
+ id: "italic",
641
+ kind: "button",
642
+ icon: v,
643
+ labelKey: "toolbar.italic",
644
+ shortcut: "Mod-i",
645
+ run: (e) => {
646
+ e.commands.toggleItalic();
647
+ },
648
+ isActive: (e) => e.isActive("italic"),
649
+ isEnabled: (e) => "toggleItalic" in e.commands && e.commands.toggleItalic.can(),
650
+ isAvailable: (e) => "toggleItalic" in e.commands
651
+ },
652
+ underline: {
653
+ id: "underline",
654
+ kind: "button",
655
+ icon: te,
656
+ labelKey: "toolbar.underline",
657
+ shortcut: "Mod-u",
658
+ run: (e) => {
659
+ e.commands.toggleUnderline();
660
+ },
661
+ isActive: (e) => e.isActive("underline"),
662
+ isEnabled: (e) => "toggleUnderline" in e.commands && e.commands.toggleUnderline.can(),
663
+ isAvailable: (e) => "toggleUnderline" in e.commands
664
+ },
665
+ strike: {
666
+ id: "strike",
667
+ kind: "button",
668
+ icon: M,
669
+ labelKey: "toolbar.strike",
670
+ shortcut: "Mod-Shift-s",
671
+ run: (e) => {
672
+ e.commands.toggleStrike();
673
+ },
674
+ isActive: (e) => e.isActive("strike"),
675
+ isEnabled: (e) => "toggleStrike" in e.commands && e.commands.toggleStrike.can(),
676
+ isAvailable: (e) => "toggleStrike" in e.commands
677
+ },
678
+ code: {
679
+ id: "code",
680
+ kind: "button",
681
+ icon: d,
682
+ labelKey: "toolbar.code",
683
+ shortcut: "Mod-e",
684
+ run: (e) => {
685
+ e.commands.toggleCode();
686
+ },
687
+ isActive: (e) => e.isActive("code"),
688
+ isEnabled: (e) => "toggleCode" in e.commands && e.commands.toggleCode.can(),
689
+ isAvailable: (e) => "toggleCode" in e.commands
690
+ },
691
+ subscript: {
692
+ id: "subscript",
693
+ kind: "button",
694
+ icon: N,
695
+ labelKey: "toolbar.subscript",
696
+ shortcut: "Mod-,",
697
+ run: (e) => {
698
+ e.commands.toggleSubscript();
699
+ },
700
+ isActive: (e) => e.isActive("subscript"),
701
+ isEnabled: (e) => "toggleSubscript" in e.commands && e.commands.toggleSubscript.can(),
702
+ isAvailable: (e) => "toggleSubscript" in e.commands
703
+ },
704
+ superscript: {
705
+ id: "superscript",
706
+ kind: "button",
707
+ icon: P,
708
+ labelKey: "toolbar.superscript",
709
+ shortcut: "Mod-.",
710
+ run: (e) => {
711
+ e.commands.toggleSuperscript();
712
+ },
713
+ isActive: (e) => e.isActive("superscript"),
714
+ isEnabled: (e) => "toggleSuperscript" in e.commands && e.commands.toggleSuperscript.can(),
715
+ isAvailable: (e) => "toggleSuperscript" in e.commands
716
+ },
717
+ link: {
718
+ id: "link",
719
+ kind: "button",
720
+ icon: y,
721
+ labelKey: "toolbar.link",
722
+ shortcut: "Mod-k",
723
+ run: (e, t) => {
724
+ t.openLinkPopover();
725
+ },
726
+ isActive: (e) => e.isActive("link"),
727
+ isEnabled: (e) => "setLink" in e.commands && ye(e),
728
+ isAvailable: (e) => "setLink" in e.commands
729
+ },
730
+ clearFormatting: {
731
+ id: "clearFormatting",
732
+ kind: "button",
733
+ icon: k,
734
+ labelKey: "toolbar.clearFormatting",
735
+ shortcut: "Mod-\\",
736
+ run: (e) => {
737
+ e.commands.clearFormatting();
738
+ },
739
+ isEnabled: (e) => "clearFormatting" in e.commands && e.commands.clearFormatting.can(),
740
+ isAvailable: (e) => "clearFormatting" in e.commands
741
+ },
742
+ textCase: {
743
+ id: "textCase",
744
+ kind: "dropdown",
745
+ labelKey: "toolbar.textCase",
746
+ icon: o,
747
+ options: [
748
+ "upper",
749
+ "lower",
750
+ "title",
751
+ "sentence",
752
+ "toggle"
753
+ ].map((e) => ({
754
+ id: e,
755
+ labelKey: `textCase.${e}`,
756
+ run: (t) => {
757
+ t.commands.setTextCase(e);
758
+ },
759
+ isEnabled: (t) => t.commands.setTextCase.can(e)
760
+ })),
761
+ isAvailable: (e) => "setTextCase" in e.commands
762
+ },
763
+ bulletList: {
764
+ id: "bulletList",
765
+ kind: "button",
766
+ icon: b,
767
+ labelKey: "toolbar.bulletList",
768
+ shortcut: "Mod-Shift-8",
769
+ run: (e) => {
770
+ e.commands.toggleBulletList();
771
+ },
772
+ isActive: (e) => e.isActive("bulletList"),
773
+ isEnabled: (e) => "toggleBulletList" in e.commands && e.commands.toggleBulletList.can(),
774
+ isAvailable: (e) => "toggleBulletList" in e.commands
775
+ },
776
+ orderedList: {
777
+ id: "orderedList",
778
+ kind: "button",
779
+ icon: S,
780
+ labelKey: "toolbar.orderedList",
781
+ shortcut: "Mod-Shift-7",
782
+ run: (e) => {
783
+ e.commands.toggleOrderedList();
784
+ },
785
+ isActive: (e) => e.isActive("orderedList"),
786
+ isEnabled: (e) => "toggleOrderedList" in e.commands && e.commands.toggleOrderedList.can(),
787
+ isAvailable: (e) => "toggleOrderedList" in e.commands
788
+ },
789
+ taskList: {
790
+ id: "taskList",
791
+ kind: "button",
792
+ icon: C,
793
+ labelKey: "toolbar.taskList",
794
+ shortcut: "Mod-Shift-9",
795
+ run: (e) => {
796
+ e.commands.toggleTaskList();
797
+ },
798
+ isActive: (e) => e.isActive("taskList"),
799
+ isEnabled: (e) => "toggleTaskList" in e.commands && e.commands.toggleTaskList.can(),
800
+ isAvailable: (e) => "toggleTaskList" in e.commands
801
+ },
802
+ blockquote: {
803
+ id: "blockquote",
804
+ kind: "button",
805
+ icon: D,
806
+ labelKey: "toolbar.blockquote",
807
+ shortcut: "Mod-Shift-b",
808
+ run: (e) => {
809
+ e.commands.toggleBlockquote();
810
+ },
811
+ isActive: (e) => e.isActive("blockquote"),
812
+ isEnabled: (e) => "toggleBlockquote" in e.commands && e.commands.toggleBlockquote.can(),
813
+ isAvailable: (e) => "toggleBlockquote" in e.commands
814
+ },
815
+ codeBlock: {
816
+ id: "codeBlock",
817
+ kind: "button",
818
+ icon: j,
819
+ labelKey: "toolbar.codeBlock",
820
+ shortcut: "Mod-Alt-c",
821
+ run: (e) => {
822
+ e.commands.toggleCodeBlock();
823
+ },
824
+ isActive: (e) => e.isActive("codeBlock"),
825
+ isEnabled: (e) => "toggleCodeBlock" in e.commands && e.commands.toggleCodeBlock.can(),
826
+ isAvailable: (e) => "toggleCodeBlock" in e.commands
827
+ },
828
+ horizontalRule: {
829
+ id: "horizontalRule",
830
+ kind: "button",
831
+ icon: w,
832
+ labelKey: "toolbar.horizontalRule",
833
+ run: (e) => {
834
+ e.commands.setHorizontalRule();
835
+ },
836
+ isEnabled: (e) => "setHorizontalRule" in e.commands && e.commands.setHorizontalRule.can(),
837
+ isAvailable: (e) => "setHorizontalRule" in e.commands
838
+ },
839
+ table: {
840
+ id: "table",
841
+ kind: "button",
842
+ icon: F,
843
+ labelKey: "toolbar.table",
844
+ run: (e, t) => {
845
+ t.toggleTableMenu();
846
+ },
847
+ isEnabled: (e) => e.isActive("table") || e.commands.insertTable.can(),
848
+ isAvailable: (e) => "insertTable" in e.commands
849
+ },
850
+ characters: {
851
+ id: "characters",
852
+ kind: "button",
853
+ icon: p,
854
+ labelKey: "toolbar.characters",
855
+ run: (e, t) => {
856
+ t.toggleCharacterPicker();
857
+ },
858
+ isAvailable: (e) => "insertText" in e.commands
859
+ },
860
+ find: {
861
+ id: "find",
862
+ kind: "button",
863
+ icon: A,
864
+ labelKey: "toolbar.find",
865
+ shortcut: "Mod-f",
866
+ run: (e, t) => {
867
+ t.toggleFindBar();
868
+ },
869
+ isAvailable: (e) => "setSearch" in e.commands
870
+ },
871
+ heading: Ie(),
872
+ fontFamily: Ae(),
873
+ fontSize: je(),
874
+ textAlign: Ne(),
875
+ lineHeight: Fe(),
876
+ textColor: Te(),
877
+ highlight: Ee()
878
+ };
879
+ function we(e, t) {
880
+ let { color: n } = e.getAttributes(t);
881
+ return typeof n == "string" ? n : null;
882
+ }
883
+ function Te(e = G) {
884
+ return {
885
+ id: "textColor",
886
+ kind: "color",
887
+ icon: ee,
888
+ labelKey: "toolbar.textColor",
889
+ palette: e,
890
+ defaultColor: "#000000",
891
+ setColor: (e, t) => t !== null && e.commands.setColor(t),
892
+ unsetColor: (e) => {
893
+ e.commands.unsetColor();
894
+ },
895
+ hasColor: (e, t) => e.isActive("textStyle", { color: t }),
896
+ getColor: (e) => we(e, "textStyle"),
897
+ isEnabled: (e) => "setColor" in e.commands && e.commands.setColor.can("#000000"),
898
+ isAvailable: (e) => "setColor" in e.commands
899
+ };
900
+ }
901
+ function Ee(e = G) {
902
+ return {
903
+ id: "highlight",
904
+ kind: "color",
905
+ icon: _,
906
+ labelKey: "toolbar.highlight",
907
+ palette: e,
908
+ defaultColor: null,
909
+ defaultChoice: !0,
910
+ setColor: (e, t) => e.commands.setHighlight({ color: t }),
911
+ unsetColor: (e) => {
912
+ e.commands.unsetHighlight();
913
+ },
914
+ hasColor: (e, t) => e.isActive("highlight", { color: t }),
915
+ getColor: (e) => we(e, "highlight"),
916
+ isEnabled: (e) => "setHighlight" in e.commands && e.commands.setHighlight.can(),
917
+ isAvailable: (e) => "setHighlight" in e.commands
918
+ };
919
+ }
920
+ function De(e) {
921
+ return e.split(",")[0].replace(/'/g, "").trim();
922
+ }
923
+ function Oe(e) {
924
+ return De(e).toLowerCase().replace(/[^a-z0-9]+/g, "-");
925
+ }
926
+ function ke(e) {
927
+ let { fontFamily: t } = e.getAttributes("textStyle");
928
+ return typeof t == "string" && e.isActive("textStyle", { fontFamily: t }) ? t : null;
929
+ }
930
+ function Ae(e = ge) {
931
+ return {
932
+ id: "fontFamily",
933
+ kind: "dropdown",
934
+ labelKey: "toolbar.fontFamily",
935
+ options: [{
936
+ id: "default",
937
+ labelKey: "font.default",
938
+ run: (e) => {
939
+ e.commands.unsetFontFamily();
940
+ },
941
+ isActive: () => !1,
942
+ isEnabled: (e) => e.commands.setFontFamily.can("serif")
943
+ }, ...e.map(({ fontFamily: e, labelKey: t }) => ({
944
+ id: Oe(e),
945
+ labelKey: t,
946
+ fontFamily: e,
947
+ run: (t) => {
948
+ t.commands.setFontFamily(e);
949
+ },
950
+ isActive: (t) => t.isActive("textStyle", { fontFamily: e }),
951
+ isEnabled: (t) => t.commands.setFontFamily.can(e)
952
+ }))],
953
+ getValueLabel: (e) => {
954
+ let t = ke(e);
955
+ return t === null ? null : De(t);
956
+ },
957
+ isAvailable: (e) => "setFontFamily" in e.commands
958
+ };
959
+ }
960
+ function je(e = {}) {
961
+ let { unit: t = "pt", sizes: n = _e[t === "pt" ? "pt" : "px"] } = e;
962
+ return {
963
+ id: "fontSize",
964
+ kind: "fontSize",
965
+ labelKey: "toolbar.fontSize",
966
+ unit: t,
967
+ sizes: n,
968
+ isAvailable: (e) => "stepFontSize" in e.commands
969
+ };
970
+ }
971
+ function Me(e) {
972
+ let t = e.getAttributes("heading").textAlign ?? e.getAttributes("paragraph").textAlign;
973
+ return typeof t == "string" ? t : "left";
974
+ }
975
+ function Ne() {
976
+ return {
977
+ id: "textAlign",
978
+ kind: "iconMenu",
979
+ labelKey: "toolbar.textAlign",
980
+ options: [
981
+ [
982
+ "left",
983
+ z,
984
+ "Mod-Shift-l"
985
+ ],
986
+ [
987
+ "center",
988
+ I,
989
+ "Mod-Shift-e"
990
+ ],
991
+ [
992
+ "right",
993
+ L,
994
+ "Mod-Shift-r"
995
+ ],
996
+ [
997
+ "justify",
998
+ R,
999
+ "Mod-Shift-j"
1000
+ ]
1001
+ ].map(([e, t, n]) => ({
1002
+ id: e,
1003
+ icon: t,
1004
+ labelKey: `align.${e}`,
1005
+ shortcut: n,
1006
+ run: (t) => {
1007
+ t.commands.setTextAlign(e);
1008
+ },
1009
+ isActive: (t) => Me(t) === e,
1010
+ isEnabled: (t) => t.commands.setTextAlign.can(e)
1011
+ })),
1012
+ isAvailable: (e) => "setTextAlign" in e.commands
1013
+ };
1014
+ }
1015
+ function Pe(e) {
1016
+ return e.getAttributes("heading").lineHeight ?? e.getAttributes("paragraph").lineHeight;
1017
+ }
1018
+ function Fe(e = [
1019
+ 1,
1020
+ 1.15,
1021
+ 1.5,
1022
+ 2
1023
+ ]) {
1024
+ return {
1025
+ id: "lineHeight",
1026
+ kind: "dropdown",
1027
+ labelKey: "toolbar.lineHeight",
1028
+ icon: x,
1029
+ options: [{
1030
+ id: "default",
1031
+ labelKey: "lineHeight.default",
1032
+ run: (e) => {
1033
+ e.commands.unsetLineHeight();
1034
+ },
1035
+ isActive: (e) => Pe(e) == null,
1036
+ isEnabled: (e) => e.commands.unsetLineHeight.can()
1037
+ }, ...e.map((e) => ({
1038
+ id: String(e).replace(".", "-"),
1039
+ labelKey: String(e),
1040
+ run: (t) => {
1041
+ t.commands.setLineHeight(e);
1042
+ },
1043
+ isActive: (t) => Pe(t) === String(e),
1044
+ isEnabled: (t) => t.commands.setLineHeight.can(e)
1045
+ }))],
1046
+ isAvailable: (e) => "setLineHeight" in e.commands
1047
+ };
1048
+ }
1049
+ function Ie(e = [
1050
+ 1,
1051
+ 2,
1052
+ 3,
1053
+ 4,
1054
+ 5,
1055
+ 6
1056
+ ]) {
1057
+ return {
1058
+ id: "heading",
1059
+ kind: "dropdown",
1060
+ labelKey: "toolbar.heading",
1061
+ options: [{
1062
+ id: "paragraph",
1063
+ labelKey: "heading.paragraph",
1064
+ shortcut: "Mod-Alt-0",
1065
+ run: (e) => {
1066
+ e.commands.setParagraph();
1067
+ },
1068
+ isActive: (e) => e.isActive("paragraph"),
1069
+ isEnabled: (e) => e.isActive("paragraph") || e.commands.setParagraph.can()
1070
+ }, ...e.map((e) => ({
1071
+ id: `h${e}`,
1072
+ labelKey: `heading.h${e}`,
1073
+ shortcut: `Mod-Alt-${e}`,
1074
+ run: (t) => {
1075
+ t.commands.setHeading({ level: e });
1076
+ },
1077
+ isActive: (t) => t.isActive("heading", { level: e }),
1078
+ isEnabled: (t) => t.isActive("heading", { level: e }) || t.commands.setHeading.can({ level: e })
1079
+ }))],
1080
+ isAvailable: (e) => "setHeading" in e.commands
1081
+ };
1082
+ }
1083
+ //#endregion
1084
+ //#region src/ui/components/character-picker.ts
1085
+ var Le = 10;
1086
+ async function Re() {
1087
+ let { SYMBOLS: e, EMOJI: t } = await import("./characters--8h5uTeF.js");
1088
+ return {
1089
+ symbols: e,
1090
+ emoji: t
1091
+ };
1092
+ }
1093
+ function ze(e, t) {
1094
+ let { anchor: n, container: r, messages: i } = t, a = document.createElement("div");
1095
+ a.className = "stilo-char-picker", a.setAttribute("role", "dialog"), a.setAttribute("aria-label", i["toolbar.characters"]);
1096
+ let o = document.createElement("input");
1097
+ o.type = "search", o.className = "stilo-char-picker__search", o.placeholder = i["characters.search"], o.autocomplete = "off", o.spellcheck = !1, o.setAttribute("aria-label", i["characters.search"]);
1098
+ let s = document.createElement("div");
1099
+ s.className = "stilo-char-picker__tabs", s.setAttribute("role", "tablist");
1100
+ let c = /* @__PURE__ */ new Map();
1101
+ for (let e of ["symbols", "emoji"]) {
1102
+ let t = document.createElement("button");
1103
+ t.type = "button", t.className = "stilo-char-picker__tab", t.setAttribute("role", "tab"), t.textContent = i[`characters.${e}`], c.set(e, t), s.append(t);
1104
+ }
1105
+ let l = document.createElement("div");
1106
+ l.className = "stilo-char-picker__panel", l.setAttribute("role", "tabpanel"), a.append(o, s, l), n.setAttribute("aria-haspopup", "dialog"), n.setAttribute("aria-expanded", "false");
1107
+ let u = U({
1108
+ anchor: n,
1109
+ content: a,
1110
+ container: r,
1111
+ onClose: (t) => {
1112
+ n.setAttribute("aria-expanded", "false"), t === "escape" && e.focus();
1113
+ }
1114
+ }), d = null, f = "symbols", p = [], m = [];
1115
+ function h(e) {
1116
+ f = e;
1117
+ for (let [t, n] of c) {
1118
+ let r = t === e;
1119
+ n.setAttribute("aria-selected", String(r)), n.tabIndex = r ? 0 : -1;
1120
+ }
1121
+ }
1122
+ function g(e, t) {
1123
+ let n = document.createElement("div");
1124
+ n.className = "stilo-char-picker__grid", n.setAttribute("role", "group"), n.setAttribute("aria-label", t);
1125
+ let r = e.map(([e, t]) => {
1126
+ let n = document.createElement("button");
1127
+ return n.type = "button", n.className = "stilo-char-picker__char", n.tabIndex = -1, n.title = t, n.setAttribute("aria-label", t), n.dataset.character = e, n.textContent = e, n;
1128
+ });
1129
+ n.append(...r), p.push(...r);
1130
+ for (let e = 0; e < r.length; e += Le) m.push(r.slice(e, e + Le));
1131
+ return n;
1132
+ }
1133
+ function _() {
1134
+ if (!d) return;
1135
+ p = [], m = [], l.replaceChildren();
1136
+ let e = o.value.trim().toLowerCase();
1137
+ if (s.hidden = e !== "", e) {
1138
+ let t = [...d.symbols, ...d.emoji].flatMap((e) => e.characters).filter(([t, n]) => t === e || n.toLowerCase().includes(e));
1139
+ if (t.length > 0) l.append(g(t, i["characters.search"]));
1140
+ else {
1141
+ let e = document.createElement("p");
1142
+ e.className = "stilo-char-picker__empty", e.textContent = i["characters.noResults"], l.append(e);
1143
+ }
1144
+ } else for (let e of d[f]) {
1145
+ let t = i[e.labelKey], n = document.createElement("div");
1146
+ n.className = "stilo-char-picker__heading", n.textContent = t, l.append(n, g(e.characters, t));
1147
+ }
1148
+ p[0] && (p[0].tabIndex = 0);
1149
+ }
1150
+ function v(e) {
1151
+ if (e) {
1152
+ for (let e of p) e.tabIndex = -1;
1153
+ e.tabIndex = 0, e.focus();
1154
+ }
1155
+ }
1156
+ function y(e, t) {
1157
+ if (t === "ArrowLeft") return p[p.indexOf(e) - 1];
1158
+ if (t === "ArrowRight") return p[p.indexOf(e) + 1];
1159
+ let n = m.findIndex((t) => t.includes(e)), r = m[n].indexOf(e), i = m[t === "ArrowUp" ? n - 1 : n + 1];
1160
+ return i?.[Math.min(r, i.length - 1)];
1161
+ }
1162
+ let b = () => _(), x = (e) => {
1163
+ e.key === "ArrowDown" && p[0] && (e.preventDefault(), v(p[0]));
1164
+ }, S = (e) => {
1165
+ let t = [...c].find(([, t]) => t === e.target)?.[0];
1166
+ t && (h(t), _());
1167
+ }, C = (e) => {
1168
+ if (e.key !== "ArrowLeft" && e.key !== "ArrowRight") return;
1169
+ e.preventDefault();
1170
+ let t = f === "symbols" ? "emoji" : "symbols";
1171
+ h(t), _(), c.get(t).focus();
1172
+ }, w = (t) => {
1173
+ let n = t.target.closest(".stilo-char-picker__char");
1174
+ n?.dataset.character && (e.commands.insertText(n.dataset.character), v(n));
1175
+ }, T = (e) => {
1176
+ let t = e.target.closest(".stilo-char-picker__char");
1177
+ t && [
1178
+ "ArrowLeft",
1179
+ "ArrowRight",
1180
+ "ArrowUp",
1181
+ "ArrowDown"
1182
+ ].includes(e.key) && (e.preventDefault(), v(y(t, e.key)));
1183
+ };
1184
+ o.addEventListener("input", b), o.addEventListener("keydown", x), s.addEventListener("click", S), s.addEventListener("keydown", C), l.addEventListener("click", w), l.addEventListener("keydown", T), h(f);
1185
+ async function E() {
1186
+ u.isOpen || (u.open(), n.setAttribute("aria-expanded", "true"), d ??= await Re(), u.isOpen && (o.value = "", _(), o.focus({ preventScroll: !0 })));
1187
+ }
1188
+ function D() {
1189
+ u.isOpen && (u.close(), e.focus());
1190
+ }
1191
+ function O() {
1192
+ o.removeEventListener("input", b), o.removeEventListener("keydown", x), s.removeEventListener("click", S), s.removeEventListener("keydown", C), l.removeEventListener("click", w), l.removeEventListener("keydown", T), u.destroy(), n.removeAttribute("aria-haspopup"), n.removeAttribute("aria-expanded");
1193
+ }
1194
+ return {
1195
+ get isOpen() {
1196
+ return u.isOpen;
1197
+ },
1198
+ open: E,
1199
+ close: D,
1200
+ toggle: () => u.isOpen ? D() : void E(),
1201
+ destroy: O
1202
+ };
1203
+ }
1204
+ //#endregion
1205
+ //#region src/ui/components/icon.ts
1206
+ function K(e) {
1207
+ return oe(e, {
1208
+ class: "stilo-icon",
1209
+ "aria-hidden": "true"
1210
+ });
1211
+ }
1212
+ //#endregion
1213
+ //#region src/ui/components/color-button.ts
1214
+ var Be = 8, Ve = "Mark", He = /^#[0-9a-f]{6}$/;
1215
+ function q(e, t) {
1216
+ let n = document.createElement(e);
1217
+ return n.className = t, n;
1218
+ }
1219
+ function J(e, t) {
1220
+ let n = q("button", e);
1221
+ return n.type = "button", n.setAttribute("aria-label", t), n.title = t, n;
1222
+ }
1223
+ function Ue(e, t, n) {
1224
+ let { container: r, messages: i } = n, a = i[t.labelKey] ?? t.labelKey, o = t.defaultColor, s = q("span", "stilo-split"), c = J("stilo-toolbar__button stilo-split__main", a), u = q("span", "stilo-split__color");
1225
+ c.append(K(t.icon), u);
1226
+ let d = J("stilo-toolbar__button stilo-split__arrow", `${a}: ${i["color.more"]}`);
1227
+ d.append(K(l));
1228
+ for (let e of [c, d]) e.dataset.item = t.id, e.tabIndex = -1;
1229
+ c.setAttribute("aria-pressed", "false"), d.setAttribute("aria-haspopup", "dialog"), d.setAttribute("aria-expanded", "false"), s.append(c, d);
1230
+ let f = q("div", "stilo-color-picker");
1231
+ f.setAttribute("role", "dialog"), f.setAttribute("aria-label", a);
1232
+ let p = q("div", "stilo-color-picker__actions"), m = q("button", "stilo-color-picker__none");
1233
+ m.type = "button", m.textContent = i["color.none"], p.append(m);
1234
+ let h = null;
1235
+ if (t.defaultChoice) {
1236
+ let e = q("span", "stilo-color-picker__separator");
1237
+ e.setAttribute("aria-hidden", "true"), h = q("button", "stilo-color-picker__default"), h.type = "button";
1238
+ let t = document.createElement("mark");
1239
+ t.textContent = i["color.default"], h.append(t), p.append(e, h);
1240
+ }
1241
+ let g = q("div", "stilo-color-picker__grid");
1242
+ g.setAttribute("role", "group"), g.setAttribute("aria-label", a);
1243
+ let _ = t.palette.map(({ color: e, labelKey: t }) => {
1244
+ let n = J("stilo-color-picker__swatch", i[t] ?? t);
1245
+ return n.tabIndex = -1, n.dataset.color = e, n.style.backgroundColor = e, n;
1246
+ });
1247
+ g.append(..._);
1248
+ let v = q("form", "stilo-color-picker__custom"), y = q("input", "stilo-color-picker__native");
1249
+ y.type = "color", y.setAttribute("aria-label", i["color.pick"]);
1250
+ let b = q("input", "stilo-color-picker__value");
1251
+ b.type = "text", b.placeholder = "#000000", b.autocomplete = "off", b.spellcheck = !1, b.setAttribute("aria-label", i["color.custom"]);
1252
+ let x = q("button", "stilo-color-picker__apply");
1253
+ x.type = "submit", x.textContent = i["color.apply"], v.append(y, b, x), f.append(p, g, v);
1254
+ let S = U({
1255
+ anchor: s,
1256
+ content: f,
1257
+ container: r,
1258
+ onClose: (t) => {
1259
+ d.setAttribute("aria-expanded", "false"), t === "escape" && e.focus();
1260
+ }
1261
+ });
1262
+ function C() {
1263
+ u.style.backgroundColor = o ?? Ve;
1264
+ }
1265
+ function w() {
1266
+ return t.isEnabled?.(e) ?? !0;
1267
+ }
1268
+ function T() {
1269
+ let n = w();
1270
+ for (let e of [c, d]) n ? e.removeAttribute("aria-disabled") : e.setAttribute("aria-disabled", "true");
1271
+ let r = n && t.hasColor(e, o);
1272
+ c.setAttribute("aria-pressed", String(r)), c.classList.toggle("stilo-toolbar__button--active", r);
1273
+ }
1274
+ function E(e, t) {
1275
+ if (e) {
1276
+ for (let e of _) e.tabIndex = -1;
1277
+ e.tabIndex = 0, e.focus(t);
1278
+ }
1279
+ }
1280
+ function D() {
1281
+ let n = t.getColor(e);
1282
+ for (let e of _) e.setAttribute("aria-pressed", String(e.dataset.color === n));
1283
+ h?.setAttribute("aria-pressed", String(t.hasColor(e, null))), b.value = n ?? "", b.removeAttribute("aria-invalid"), y.value = n && He.test(n) ? n : "#000000", S.open(), d.setAttribute("aria-expanded", "true");
1284
+ let r = _.find((e) => e.getAttribute("aria-pressed") === "true");
1285
+ !r && h?.getAttribute("aria-pressed") === "true" ? h.focus({ preventScroll: !0 }) : E(r ?? _[0], { preventScroll: !0 });
1286
+ }
1287
+ function O() {
1288
+ S.close(), e.focus();
1289
+ }
1290
+ function k(n) {
1291
+ return t.setColor(e, n) ? (o = t.getColor(e), C(), !0) : !1;
1292
+ }
1293
+ let A = () => {
1294
+ w() && (S.close(), e.focus(), t.hasColor(e, o) ? t.unsetColor(e) : k(o));
1295
+ }, j = () => {
1296
+ S.isOpen ? O() : w() && D();
1297
+ }, M = () => {
1298
+ t.unsetColor(e), o = t.defaultColor, C(), O();
1299
+ }, N = () => {
1300
+ k(null), O();
1301
+ }, P = (e) => {
1302
+ let t = e.target.closest(".stilo-color-picker__swatch");
1303
+ t?.dataset.color && (k(t.dataset.color), O());
1304
+ }, F = (e) => {
1305
+ let t = {
1306
+ ArrowLeft: -1,
1307
+ ArrowRight: 1,
1308
+ ArrowUp: -8,
1309
+ ArrowDown: Be
1310
+ }[e.key], n = _.indexOf(e.target);
1311
+ t !== void 0 && n !== -1 && (e.preventDefault(), E(_[n + t]));
1312
+ }, I = () => {
1313
+ b.value = y.value, b.removeAttribute("aria-invalid");
1314
+ }, L = () => b.removeAttribute("aria-invalid"), R = (e) => {
1315
+ e.preventDefault(), k(b.value.trim()) ? O() : (b.setAttribute("aria-invalid", "true"), b.focus());
1316
+ };
1317
+ c.addEventListener("click", A), d.addEventListener("click", j), m.addEventListener("click", M), h?.addEventListener("click", N), g.addEventListener("click", P), g.addEventListener("keydown", F), y.addEventListener("input", I), b.addEventListener("input", L), v.addEventListener("submit", R), C();
1318
+ function z() {
1319
+ c.removeEventListener("click", A), d.removeEventListener("click", j), m.removeEventListener("click", M), h?.removeEventListener("click", N), g.removeEventListener("click", P), g.removeEventListener("keydown", F), y.removeEventListener("input", I), b.removeEventListener("input", L), v.removeEventListener("submit", R), S.destroy(), s.remove();
1320
+ }
1321
+ return {
1322
+ element: s,
1323
+ main: c,
1324
+ arrow: d,
1325
+ update: T,
1326
+ destroy: z
1327
+ };
1328
+ }
1329
+ //#endregion
1330
+ //#region src/ui/components/dropdown.ts
1331
+ function We(e) {
1332
+ let { label: t, options: n, icon: r, container: i, onSelect: a } = e, o = document.createElement("button");
1333
+ o.type = "button", o.className = `stilo-toolbar__button stilo-dropdown__trigger${r ? " stilo-dropdown__trigger--icon" : ""}`, o.setAttribute("aria-haspopup", "menu"), o.setAttribute("aria-expanded", "false"), o.setAttribute("title", t), o.setAttribute("tabindex", "-1");
1334
+ let s = document.createElement("span");
1335
+ s.className = "stilo-dropdown__value", o.appendChild(r ? K(r) : s);
1336
+ let c = K(l);
1337
+ o.appendChild(c);
1338
+ let u = document.createElement("div");
1339
+ u.className = "stilo-dropdown__menu stilo-popover", u.setAttribute("role", "menu"), u.setAttribute("aria-label", t), u.setAttribute("hidden", "");
1340
+ let d = [];
1341
+ for (let e of n) {
1342
+ let t = document.createElement("div");
1343
+ t.className = `stilo-dropdown__option stilo-dropdown__option--${e.id}`, t.setAttribute("role", e.action ? "menuitem" : "menuitemradio"), t.setAttribute("tabindex", "-1"), t.setAttribute("data-option", e.id), e.action || t.setAttribute("aria-checked", "false");
1344
+ let n = document.createElement("span");
1345
+ if (n.className = "stilo-dropdown__label", n.textContent = e.label, e.fontFamily && (n.style.fontFamily = e.fontFamily), t.appendChild(n), e.shortcut) {
1346
+ let n = document.createElement("span");
1347
+ n.className = "stilo-dropdown__shortcut", n.textContent = e.shortcut, t.appendChild(n);
1348
+ }
1349
+ d.push(t), u.appendChild(t);
1350
+ }
1351
+ let f;
1352
+ i.appendChild(u);
1353
+ function p() {
1354
+ if (f) return;
1355
+ f = U({
1356
+ anchor: o,
1357
+ content: u,
1358
+ container: i,
1359
+ onClose(e) {
1360
+ e === "escape" && o.focus(), o.setAttribute("aria-expanded", "false"), f = void 0;
1361
+ }
1362
+ }), o.setAttribute("aria-expanded", "true"), f.open();
1363
+ let e = d.findIndex((e) => e.getAttribute("aria-checked") === "true");
1364
+ if (e >= 0) d[e].focus();
1365
+ else {
1366
+ let e = d.findIndex((e) => e.getAttribute("aria-disabled") !== "true");
1367
+ e >= 0 && d[e].focus();
1368
+ }
1369
+ }
1370
+ function m() {
1371
+ f && (f.close(), o.setAttribute("aria-expanded", "false"));
1372
+ }
1373
+ function h() {
1374
+ o.getAttribute("aria-disabled") !== "true" && (f ? m() : p());
1375
+ }
1376
+ o.addEventListener("click", h);
1377
+ function g(e) {
1378
+ if (o.getAttribute("aria-disabled") !== "true") switch (e.key) {
1379
+ case "ArrowDown": {
1380
+ e.preventDefault(), p();
1381
+ let t = d.findIndex((e) => e.getAttribute("aria-disabled") !== "true");
1382
+ t >= 0 && d[t].focus();
1383
+ break;
1384
+ }
1385
+ case "ArrowUp":
1386
+ e.preventDefault(), p();
1387
+ for (let e = d.length - 1; e >= 0; e--) if (d[e].getAttribute("aria-disabled") !== "true") {
1388
+ d[e].focus();
1389
+ break;
1390
+ }
1391
+ }
1392
+ }
1393
+ o.addEventListener("keydown", g);
1394
+ function _(e) {
1395
+ let t = document.activeElement;
1396
+ if (!t || !u.contains(t)) return;
1397
+ let n = d.filter((e) => e.getAttribute("aria-disabled") !== "true"), r = n.indexOf(t);
1398
+ switch (e.key) {
1399
+ case "ArrowDown":
1400
+ e.preventDefault(), n[(r + 1) % n.length].focus();
1401
+ break;
1402
+ case "ArrowUp":
1403
+ e.preventDefault(), n[(r - 1 + n.length) % n.length].focus();
1404
+ break;
1405
+ case "Home":
1406
+ e.preventDefault(), n[0].focus();
1407
+ break;
1408
+ case "End":
1409
+ e.preventDefault(), n[n.length - 1].focus();
1410
+ break;
1411
+ case "Enter":
1412
+ if (e.preventDefault(), t === document.activeElement && t !== o) {
1413
+ let e = t.getAttribute("data-option");
1414
+ e && t.getAttribute("aria-disabled") !== "true" && (a(e), m());
1415
+ }
1416
+ break;
1417
+ case " ":
1418
+ if (e.preventDefault(), t === document.activeElement && t !== o) {
1419
+ let e = t.getAttribute("data-option");
1420
+ e && t.getAttribute("aria-disabled") !== "true" && a(e);
1421
+ }
1422
+ break;
1423
+ case "Escape":
1424
+ e.preventDefault(), m(), o.focus();
1425
+ break;
1426
+ case "Tab": m();
1427
+ }
1428
+ }
1429
+ u.addEventListener("keydown", _);
1430
+ for (let e of d) e.addEventListener("click", () => {
1431
+ let t = e.getAttribute("data-option");
1432
+ t && e.getAttribute("aria-disabled") !== "true" && (a(t), m());
1433
+ });
1434
+ let v = !1;
1435
+ function y(e) {
1436
+ let { activeId: r, disabledIds: i, valueLabel: a } = e, c = n.find((e) => e.id === r)?.label ?? a ?? t;
1437
+ s.textContent = c;
1438
+ let l = n.every((e) => e.action);
1439
+ o.setAttribute("aria-label", l ? t : `${t}: ${c}`), i.size === n.length ? o.setAttribute("aria-disabled", "true") : o.removeAttribute("aria-disabled");
1440
+ for (let e of d) {
1441
+ let t = e.getAttribute("data-option");
1442
+ i.has(t) ? e.setAttribute("aria-disabled", "true") : e.removeAttribute("aria-disabled"), e.getAttribute("role") === "menuitemradio" && e.setAttribute("aria-checked", t === r ? "true" : "false");
1443
+ }
1444
+ }
1445
+ function b() {
1446
+ v || (v = !0, f?.destroy(), f = void 0, o.removeEventListener("click", h), o.removeEventListener("keydown", g), u.removeEventListener("keydown", _));
1447
+ }
1448
+ return {
1449
+ get trigger() {
1450
+ return o;
1451
+ },
1452
+ update: y,
1453
+ destroy: b
1454
+ };
1455
+ }
1456
+ //#endregion
1457
+ //#region src/ui/components/find-bar.ts
1458
+ var Ge = 350, Ke = 2;
1459
+ function qe(e, n) {
1460
+ let { container: r, messages: i, button: a } = n, o = fe(), s = document.createElement("div");
1461
+ s.className = "stilo-find-bar", s.setAttribute("role", "search"), s.setAttribute("aria-label", i["toolbar.find"]), s.hidden = !0, a?.setAttribute("aria-expanded", "false");
1462
+ function d(e, t) {
1463
+ let n = document.createElement("input");
1464
+ return n.type = "text", n.className = `stilo-find-bar__input stilo-find-bar__input--${t}`, n.placeholder = i[e], n.autocomplete = "off", n.spellcheck = !1, n.setAttribute("aria-label", i[e]), n;
1465
+ }
1466
+ function f(e, t, n) {
1467
+ let r = document.createElement("button");
1468
+ return r.type = "button", r.className = "stilo-find-bar__button", t ? (r.append(K(t)), r.setAttribute("aria-label", i[e]), r.title = n ?? i[e]) : (r.classList.add("stilo-find-bar__button--text"), r.textContent = i[e]), r;
1469
+ }
1470
+ function p(e, t) {
1471
+ let n = f(e, t);
1472
+ return n.classList.add("stilo-find-bar__toggle"), n.setAttribute("aria-pressed", "false"), n;
1473
+ }
1474
+ let m = d("find.find", "find"), h = document.createElement("span");
1475
+ h.className = "stilo-find-bar__count", h.setAttribute("aria-live", "polite");
1476
+ let g = f("find.previous", u, `${i["find.previous"]} (Shift+Enter)`), _ = f("find.next", l, `${i["find.next"]} (Enter)`), v = p("find.matchCase", c), y = p("find.wholeWord", ie), b = f("find.close", ae, `${i["find.close"]} (Esc)`), x = d("find.replace", "replace"), S = f("find.replaceOne", null), C = f("find.replaceAll", null), w = document.createElement("div");
1477
+ w.className = "stilo-find-bar__row", w.append(m, h, g, _, v, y, b);
1478
+ let T = document.createElement("div");
1479
+ T.className = "stilo-find-bar__row", T.append(x, S, C), s.append(w, T), r.append(s), r.classList.add("stilo-find-bar-host");
1480
+ let E = 0, D = "";
1481
+ function O(e) {
1482
+ return e.getAttribute("aria-pressed") === "true";
1483
+ }
1484
+ function k() {
1485
+ clearTimeout(E), E = 0, D = m.value.length >= Ke ? m.value : "", D ? e.commands.setSearch({
1486
+ text: D,
1487
+ caseSensitive: O(v),
1488
+ wholeWord: O(y)
1489
+ }) : e.commands.clearSearch(), j();
1490
+ }
1491
+ function A() {
1492
+ E && k();
1493
+ }
1494
+ function j() {
1495
+ if (!D) {
1496
+ h.textContent = "";
1497
+ return;
1498
+ }
1499
+ let n = t(e), r = n.count.toLocaleString();
1500
+ h.textContent = n.count === 0 ? i["find.noResults"] : n.current > 0 ? i["find.position"].replace("{current}", n.current.toLocaleString()).replace("{total}", r) : i["find.results"].replace("{total}", r);
1501
+ }
1502
+ function M() {
1503
+ let { $from: t, $to: n, empty: r } = e.state.selection;
1504
+ return r || !t.sameParent(n) || !t.parent.isTextblock ? "" : e.state.doc.textBetween(t.pos, n.pos);
1505
+ }
1506
+ function N() {
1507
+ let t = M();
1508
+ s.hidden = !1, a?.setAttribute("aria-expanded", "true"), T.hidden = !e.isEditable, t && (m.value = t), m.focus({ preventScroll: !0 }), m.select(), k();
1509
+ }
1510
+ function P() {
1511
+ s.hidden || (clearTimeout(E), E = 0, s.hidden = !0, a?.setAttribute("aria-expanded", "false"), D = "", e.commands.clearSearch(), e.focus());
1512
+ }
1513
+ let F = () => {
1514
+ clearTimeout(E), E = window.setTimeout(k, Ge);
1515
+ }, I = (t) => {
1516
+ let n = o ? t.metaKey : t.ctrlKey;
1517
+ t.key === "Escape" ? (t.preventDefault(), P()) : n && !t.altKey && !t.shiftKey && t.key.toLowerCase() === "f" ? (t.preventDefault(), m.focus(), m.select()) : t.key === "Enter" && t.target === m ? (t.preventDefault(), A(), t.shiftKey ? e.commands.findPrevious() : e.commands.findNext()) : t.key === "Enter" && t.target === x && (t.preventDefault(), A(), e.commands.replaceNext(x.value));
1518
+ }, L = (t) => {
1519
+ let n = t.target.closest("button");
1520
+ n === v || n === y ? (n.setAttribute("aria-pressed", String(!O(n))), k()) : (A(), n === g ? e.commands.findPrevious() : n === _ ? e.commands.findNext() : n === S ? e.commands.replaceNext(x.value) : n === C ? e.commands.replaceAll(x.value) : n === b && P());
1521
+ }, R = () => {
1522
+ s.hidden || j();
1523
+ };
1524
+ return m.addEventListener("input", F), s.addEventListener("keydown", I), s.addEventListener("click", L), e.on("transaction", R), {
1525
+ element: s,
1526
+ get isOpen() {
1527
+ return !s.hidden;
1528
+ },
1529
+ open: N,
1530
+ close: P,
1531
+ toggle: () => s.hidden ? N() : P(),
1532
+ destroy() {
1533
+ clearTimeout(E), m.removeEventListener("input", F), s.removeEventListener("keydown", I), s.removeEventListener("click", L), e.off("transaction", R), s.remove(), r.classList.remove("stilo-find-bar-host"), a?.removeAttribute("aria-expanded");
1534
+ }
1535
+ };
1536
+ }
1537
+ //#endregion
1538
+ //#region src/ui/components/font-size-input.ts
1539
+ var Je = /^(\d+(?:[.,]\d+)?)\s*(px|pt|em|rem|%)?$/i, Ye = 1, Xe = 400;
1540
+ function Ze(e) {
1541
+ let { from: t, to: n, empty: r } = e.state.selection;
1542
+ if (r) return !1;
1543
+ let i = /* @__PURE__ */ new Set();
1544
+ return e.state.doc.nodesBetween(t, n, (e) => (e.isText && i.add(e.marks.find((e) => e.type.name === "textStyle")?.attrs.fontSize ?? null), i.size < 2)), i.size > 1;
1545
+ }
1546
+ function Qe(e, t) {
1547
+ let n = document.createElement("button");
1548
+ return n.type = "button", n.className = `stilo-toolbar__button ${e}`, n.setAttribute("aria-label", t), n.title = t, n;
1549
+ }
1550
+ function $e(e, t, r) {
1551
+ let { container: a, messages: o } = r, { unit: s, sizes: c } = t, l = o[t.labelKey] ?? t.labelKey, u = document.createElement("span");
1552
+ u.className = "stilo-font-size";
1553
+ let d = Qe("stilo-font-size__decrease", o["fontSize.decrease"]);
1554
+ d.append(K(w));
1555
+ let f = Qe("stilo-font-size__increase", o["fontSize.increase"]);
1556
+ f.append(K(E));
1557
+ let p = document.createElement("input");
1558
+ p.type = "text", p.className = "stilo-font-size__input", p.inputMode = "decimal", p.autocomplete = "off", p.spellcheck = !1, p.setAttribute("role", "combobox"), p.setAttribute("aria-label", l), p.setAttribute("aria-autocomplete", "none"), p.setAttribute("aria-expanded", "false"), p.title = l;
1559
+ let m = [
1560
+ d,
1561
+ p,
1562
+ f
1563
+ ];
1564
+ for (let e of m) e.dataset.item = t.id, e.tabIndex = -1;
1565
+ u.append(...m);
1566
+ let h = document.createElement("div");
1567
+ h.className = "stilo-font-size__list", h.id = `stilo-font-size-${Math.random().toString(36).slice(2)}`, h.setAttribute("role", "listbox"), h.setAttribute("aria-label", l), p.setAttribute("aria-controls", h.id);
1568
+ let g = c.map((e, t) => {
1569
+ let n = document.createElement("div");
1570
+ return n.className = "stilo-font-size__option", n.id = `${h.id}-${t}`, n.setAttribute("role", "option"), n.setAttribute("aria-selected", "false"), n.dataset.size = String(e), n.textContent = String(e), n;
1571
+ });
1572
+ h.append(...g);
1573
+ let _ = U({
1574
+ anchor: p,
1575
+ content: h,
1576
+ container: a,
1577
+ onClose: () => {
1578
+ p.setAttribute("aria-expanded", "false"), x(-1);
1579
+ }
1580
+ }), v = "", y = -1;
1581
+ function b() {
1582
+ return e.commands.setFontSize.can("12pt");
1583
+ }
1584
+ function x(e) {
1585
+ y = e, g.forEach((t, n) => {
1586
+ t.classList.toggle("stilo-font-size__option--active", n === e);
1587
+ }), e >= 0 ? p.setAttribute("aria-activedescendant", g[e].id) : p.removeAttribute("aria-activedescendant");
1588
+ }
1589
+ function S() {
1590
+ let t = b();
1591
+ for (let e of m) t ? e.removeAttribute("aria-disabled") : e.setAttribute("aria-disabled", "true");
1592
+ p.readOnly = !t, v = t && !Ze(e) ? String(i(e, s)) : "", document.activeElement !== p && (p.value = v);
1593
+ }
1594
+ function C() {
1595
+ if (!_.isOpen && b()) {
1596
+ for (let e of g) e.setAttribute("aria-selected", String(e.dataset.size === v));
1597
+ _.open(), p.setAttribute("aria-expanded", "true");
1598
+ }
1599
+ }
1600
+ function T() {
1601
+ _.close(), p.removeAttribute("aria-invalid"), e.focus(), S();
1602
+ }
1603
+ function D(t) {
1604
+ let r = Je.exec(t.trim());
1605
+ if (!r) return null;
1606
+ let i = Number(r[1].replace(",", ".")), a = r[2]?.toLowerCase();
1607
+ return i === 0 || (!a || a === "px" || a === "pt") && (i < Ye || i > Xe) ? null : a ? `${i}${a}` : n(e, i, s);
1608
+ }
1609
+ function O(t) {
1610
+ let n = D(t);
1611
+ n && e.commands.setFontSize(n) ? T() : p.setAttribute("aria-invalid", "true");
1612
+ }
1613
+ let k = (t) => () => {
1614
+ b() && (_.close(), e.focus(), e.commands.stepFontSize(t, s));
1615
+ }, A = k(-1), j = k(1), M = () => p.select(), N = () => C(), P = () => {
1616
+ p.removeAttribute("aria-invalid"), x(-1);
1617
+ }, F = (e) => {
1618
+ switch (e.key) {
1619
+ case "ArrowDown":
1620
+ case "ArrowUp": {
1621
+ e.preventDefault(), C();
1622
+ let t = e.key === "ArrowDown" ? 1 : -1, n = y === -1 ? g.findIndex((e) => e.dataset.size === v) : y, r = n === -1 ? t > 0 ? 0 : g.length - 1 : n + t;
1623
+ x(Math.min(g.length - 1, Math.max(0, r))), g[y]?.scrollIntoView?.({ block: "nearest" });
1624
+ break;
1625
+ }
1626
+ case "Enter":
1627
+ e.preventDefault(), O(y >= 0 ? g[y].dataset.size : p.value);
1628
+ break;
1629
+ case "Escape": e.preventDefault(), T();
1630
+ }
1631
+ }, I = () => {
1632
+ _.close(), p.removeAttribute("aria-invalid"), p.value = v;
1633
+ }, L = (e) => e.preventDefault(), R = (e) => {
1634
+ let t = e.target.closest(".stilo-font-size__option");
1635
+ t?.dataset.size && O(t.dataset.size);
1636
+ };
1637
+ d.addEventListener("click", A), f.addEventListener("click", j), p.addEventListener("focus", M), p.addEventListener("click", N), p.addEventListener("input", P), p.addEventListener("keydown", F), p.addEventListener("blur", I), h.addEventListener("pointerdown", L), h.addEventListener("click", R);
1638
+ let z = !1;
1639
+ function ee() {
1640
+ z || (z = !0, d.removeEventListener("click", A), f.removeEventListener("click", j), p.removeEventListener("focus", M), p.removeEventListener("click", N), p.removeEventListener("input", P), p.removeEventListener("keydown", F), p.removeEventListener("blur", I), h.removeEventListener("pointerdown", L), h.removeEventListener("click", R), _.destroy());
1641
+ }
1642
+ return S(), {
1643
+ element: u,
1644
+ parts: m,
1645
+ update: S,
1646
+ destroy: ee
1647
+ };
1648
+ }
1649
+ //#endregion
1650
+ //#region src/ui/components/icon-menu.ts
1651
+ function et(e, t, n) {
1652
+ let { container: r, messages: i, mac: a } = n, o = i[t.labelKey] ?? t.labelKey, s = (e, t) => {
1653
+ let n = i[e] ?? e;
1654
+ return t ? `${n} (${V(t, a)})` : n;
1655
+ }, c = document.createElement("button");
1656
+ c.type = "button", c.className = "stilo-toolbar__button stilo-icon-menu__trigger", c.dataset.item = t.id, c.tabIndex = -1, c.title = o, c.setAttribute("aria-haspopup", "menu"), c.setAttribute("aria-expanded", "false");
1657
+ let u = t.options.map((e) => K(e.icon)), d = u[0];
1658
+ c.append(d, K(l));
1659
+ let f = document.createElement("div");
1660
+ f.className = "stilo-icon-menu", f.setAttribute("role", "menu"), f.setAttribute("aria-label", o), f.setAttribute("aria-orientation", "horizontal");
1661
+ let p = t.options.map((e) => {
1662
+ let t = document.createElement("button");
1663
+ t.type = "button", t.className = `stilo-toolbar__button stilo-icon-menu__option stilo-icon-menu__option--${e.id}`, t.dataset.option = e.id, t.tabIndex = -1, t.setAttribute("role", "menuitemradio"), t.setAttribute("aria-checked", "false");
1664
+ let n = s(e.labelKey, e.shortcut);
1665
+ return t.setAttribute("aria-label", i[e.labelKey] ?? e.labelKey), t.title = n, t.append(K(e.icon)), t;
1666
+ });
1667
+ f.append(...p);
1668
+ let m = U({
1669
+ anchor: c,
1670
+ content: f,
1671
+ container: r,
1672
+ onClose: (e) => {
1673
+ c.setAttribute("aria-expanded", "false"), e === "escape" && c.focus();
1674
+ }
1675
+ }), h = (n) => t.options[n].isEnabled?.(e) ?? !0;
1676
+ function g() {
1677
+ let n = t.options.findIndex((t) => t.isActive(e)), r = Math.max(n, 0);
1678
+ d.replaceWith(u[r]), d = u[r];
1679
+ let a = i[t.options[r].labelKey] ?? t.options[r].labelKey;
1680
+ c.setAttribute("aria-label", `${o}: ${a}`), p.forEach((e, t) => {
1681
+ e.setAttribute("aria-checked", String(t === n)), e.classList.toggle("stilo-toolbar__button--active", t === n), h(t) ? e.removeAttribute("aria-disabled") : e.setAttribute("aria-disabled", "true");
1682
+ }), t.options.some((e, t) => h(t)) ? c.removeAttribute("aria-disabled") : c.setAttribute("aria-disabled", "true");
1683
+ }
1684
+ function _(e) {
1685
+ p[e]?.focus({ preventScroll: !0 });
1686
+ }
1687
+ function v() {
1688
+ if (m.isOpen || c.getAttribute("aria-disabled") === "true") return;
1689
+ m.open(), c.setAttribute("aria-expanded", "true");
1690
+ let e = p.findIndex((e) => e.getAttribute("aria-checked") === "true");
1691
+ _(Math.max(e, 0));
1692
+ }
1693
+ function y(n) {
1694
+ h(n) && (m.close(), e.focus(), t.options[n].run(e));
1695
+ }
1696
+ let b = () => {
1697
+ m.isOpen ? m.close() : v();
1698
+ }, x = (e) => {
1699
+ e.key === "ArrowDown" && (e.preventDefault(), v());
1700
+ }, S = (e) => {
1701
+ let t = e.target.closest(".stilo-icon-menu__option");
1702
+ t && y(p.indexOf(t));
1703
+ }, C = (e) => {
1704
+ let t = p.indexOf(e.target);
1705
+ if (t === -1) return;
1706
+ let n = p.length - 1, r = {
1707
+ ArrowRight: t === n ? 0 : t + 1,
1708
+ ArrowLeft: t === 0 ? n : t - 1,
1709
+ Home: 0,
1710
+ End: n
1711
+ }[e.key];
1712
+ r === void 0 ? e.key === "Tab" && m.close() : (e.preventDefault(), _(r));
1713
+ };
1714
+ c.addEventListener("click", b), c.addEventListener("keydown", x), f.addEventListener("click", S), f.addEventListener("keydown", C);
1715
+ let w = !1;
1716
+ function T() {
1717
+ w || (w = !0, c.removeEventListener("click", b), c.removeEventListener("keydown", x), f.removeEventListener("click", S), f.removeEventListener("keydown", C), m.destroy());
1718
+ }
1719
+ return g(), {
1720
+ trigger: c,
1721
+ update: g,
1722
+ destroy: T
1723
+ };
1724
+ }
1725
+ //#endregion
1726
+ //#region src/ui/components/link-bubble.ts
1727
+ function tt(e, t) {
1728
+ let { container: n, messages: r, onEdit: i } = t, a = null, o = {
1729
+ contextElement: e.view.dom,
1730
+ getBoundingClientRect: () => (a ?? e.view.dom).getBoundingClientRect()
1731
+ }, s = document.createElement("div");
1732
+ s.className = "stilo-link-bubble", s.setAttribute("role", "group"), s.setAttribute("aria-label", r["toolbar.link"]);
1733
+ let c = document.createElement("a");
1734
+ c.className = "stilo-link-bubble__button", c.target = "_blank", c.rel = "noopener noreferrer", c.setAttribute("aria-label", r["link.open"]), c.append(K(f));
1735
+ let l = Y(T, r["link.edit"]), u = Y(re, r["link.remove"]);
1736
+ s.append(c, l, u);
1737
+ let d = U({
1738
+ anchor: o,
1739
+ content: s,
1740
+ container: n
1741
+ }), p = (e) => {
1742
+ e.preventDefault();
1743
+ }, m = () => {
1744
+ d.close(), i();
1745
+ }, h = () => {
1746
+ e.commands.unsetLink();
1747
+ };
1748
+ s.addEventListener("mousedown", p), l.addEventListener("click", m), u.addEventListener("click", h), e.on("transaction", _), e.on("focus", _), e.on("blur", _);
1749
+ function g() {
1750
+ let { selection: t } = e.state;
1751
+ if (!t.empty || !e.isActive("link") || !e.view.hasFocus()) return null;
1752
+ let { node: n } = e.view.domAtPos(t.from);
1753
+ return (n instanceof Element ? n : n.parentElement)?.closest("a") ?? null;
1754
+ }
1755
+ function _() {
1756
+ let t = g();
1757
+ if (t !== a && d.close(), a = t, !a) return;
1758
+ let n = String(e.getAttributes("link").href ?? "");
1759
+ c.href = n, c.title = `${r["link.open"]}: ${n}`, d.open();
1760
+ }
1761
+ function v() {
1762
+ e.off("transaction", _), e.off("focus", _), e.off("blur", _), s.removeEventListener("mousedown", p), l.removeEventListener("click", m), u.removeEventListener("click", h), d.destroy();
1763
+ }
1764
+ return {
1765
+ get isOpen() {
1766
+ return d.isOpen;
1767
+ },
1768
+ update: _,
1769
+ destroy: v
1770
+ };
1771
+ }
1772
+ function Y(e, t) {
1773
+ let n = document.createElement("button");
1774
+ return n.type = "button", n.className = "stilo-link-bubble__button", n.setAttribute("aria-label", t), n.title = t, n.append(K(e)), n;
1775
+ }
1776
+ //#endregion
1777
+ //#region src/ui/components/table-actions.ts
1778
+ var nt = {
1779
+ addRowBefore: "table.addRowBefore",
1780
+ addRowAfter: "table.addRowAfter",
1781
+ deleteRow: "table.deleteRow",
1782
+ addColumnBefore: "table.addColumnBefore",
1783
+ addColumnAfter: "table.addColumnAfter",
1784
+ deleteColumn: "table.deleteColumn",
1785
+ mergeCells: "table.mergeCells",
1786
+ splitCell: "table.splitCell",
1787
+ toggleHeaderRow: "table.headerRow",
1788
+ toggleHeaderColumn: "table.headerColumn",
1789
+ deleteTable: "table.deleteTable"
1790
+ };
1791
+ function rt(e, t) {
1792
+ let { groups: n, label: i, messages: a, close: o } = t, s = document.createElement("div");
1793
+ s.className = "stilo-table-menu__actions", s.setAttribute("role", "menu"), s.setAttribute("aria-label", i);
1794
+ let c = /* @__PURE__ */ new Map();
1795
+ n.forEach((e, t) => {
1796
+ if (t > 0) {
1797
+ let e = document.createElement("div");
1798
+ e.className = "stilo-table-menu__separator", e.setAttribute("role", "separator"), s.append(e);
1799
+ }
1800
+ for (let t of e) {
1801
+ let e = document.createElement("div");
1802
+ e.className = `stilo-dropdown__option stilo-table-menu__item--${t}`, e.tabIndex = -1;
1803
+ let n = t === "toggleHeaderRow" || t === "toggleHeaderColumn";
1804
+ e.setAttribute("role", n ? "menuitemcheckbox" : "menuitem"), e.textContent = a[nt[t]], c.set(e, t), s.append(e);
1805
+ }
1806
+ });
1807
+ let l = () => [...c.keys()].filter((e) => e.getAttribute("aria-disabled") !== "true");
1808
+ function u() {
1809
+ let t = r(e);
1810
+ for (let [n, r] of c) e.commands[r].can() ? n.removeAttribute("aria-disabled") : n.setAttribute("aria-disabled", "true"), r === "toggleHeaderRow" && n.setAttribute("aria-checked", String(!!t?.row)), r === "toggleHeaderColumn" && n.setAttribute("aria-checked", String(!!t?.column));
1811
+ }
1812
+ function d(t) {
1813
+ let n = c.get(t);
1814
+ n && t.getAttribute("aria-disabled") !== "true" && (o(), e.focus(), e.commands[n]());
1815
+ }
1816
+ let f = (e) => {
1817
+ let t = e.target.closest("[role^=\"menuitem\"]");
1818
+ t && d(t);
1819
+ }, p = (e) => {
1820
+ let t = l(), n = t.indexOf(e.target), r;
1821
+ switch (e.key) {
1822
+ case "ArrowDown":
1823
+ r = t[(n + 1) % t.length];
1824
+ break;
1825
+ case "ArrowUp":
1826
+ r = t[(n - 1 + t.length) % t.length];
1827
+ break;
1828
+ case "Home":
1829
+ r = t[0];
1830
+ break;
1831
+ case "End":
1832
+ r = t.at(-1);
1833
+ break;
1834
+ case "Enter":
1835
+ case " ":
1836
+ e.preventDefault(), d(e.target);
1837
+ return;
1838
+ case "Tab":
1839
+ o();
1840
+ return;
1841
+ default: return;
1842
+ }
1843
+ e.preventDefault(), r?.focus();
1844
+ };
1845
+ return s.addEventListener("click", f), s.addEventListener("keydown", p), {
1846
+ element: s,
1847
+ refresh: u,
1848
+ focusFirst: () => l()[0]?.focus({ preventScroll: !0 }),
1849
+ destroy() {
1850
+ s.removeEventListener("click", f), s.removeEventListener("keydown", p);
1851
+ }
1852
+ };
1853
+ }
1854
+ //#endregion
1855
+ //#region src/ui/components/table-handles.ts
1856
+ var X = 4, Z = 32, it = [
1857
+ {
1858
+ kind: "row",
1859
+ labelKey: "table.row",
1860
+ icon: g,
1861
+ placement: "left",
1862
+ groups: [["addRowBefore", "addRowAfter"], ["deleteRow"]]
1863
+ },
1864
+ {
1865
+ kind: "column",
1866
+ labelKey: "table.column",
1867
+ icon: h,
1868
+ placement: "top",
1869
+ groups: [["addColumnBefore", "addColumnAfter"], ["deleteColumn"]]
1870
+ },
1871
+ {
1872
+ kind: "table",
1873
+ labelKey: "toolbar.table",
1874
+ icon: m,
1875
+ placement: "top-end",
1876
+ groups: [["mergeCells", "splitCell"], ["deleteTable"]]
1877
+ }
1878
+ ];
1879
+ function Q(e, t, n, r) {
1880
+ return {
1881
+ x: e,
1882
+ y: t,
1883
+ width: n,
1884
+ height: r,
1885
+ left: e,
1886
+ top: t,
1887
+ right: e + n,
1888
+ bottom: t + r
1889
+ };
1890
+ }
1891
+ function at(e, t) {
1892
+ let { container: n, messages: r } = t, { view: i } = e, a = null, o = null, s = (e) => Math.max(e.getBoundingClientRect().left, e.parentElement?.getBoundingClientRect().left ?? -Infinity);
1893
+ function c(e) {
1894
+ let t = a?.closest("table");
1895
+ if (!a || !t) return Q(0, 0, 0, 0);
1896
+ let n = a.getBoundingClientRect(), r = t.getBoundingClientRect().top, i = s(t);
1897
+ return e === "row" ? Q(i, n.top, Math.max(n.right - i, 0), n.height) : e === "column" ? Q(n.left, r, n.width, n.bottom - r) : Q(i - X, r, 0, 0);
1898
+ }
1899
+ let l = it.map(({ kind: t, labelKey: i, icon: o, placement: s, groups: l }) => {
1900
+ let u = r[i], d = document.createElement("button");
1901
+ d.type = "button", d.className = `stilo-table-handle stilo-table-handle--${t}`, d.tabIndex = -1, d.title = u, d.setAttribute("aria-label", u), d.setAttribute("aria-haspopup", "menu"), d.setAttribute("aria-expanded", "false"), d.hidden = !0, d.append(K(o)), n.append(d);
1902
+ let f = rt(e, {
1903
+ groups: l,
1904
+ label: u,
1905
+ messages: r,
1906
+ close: () => p.close()
1907
+ });
1908
+ f.element.classList.add("stilo-table-handle-menu");
1909
+ let p = U({
1910
+ anchor: d,
1911
+ content: f.element,
1912
+ container: n,
1913
+ onClose: (t) => {
1914
+ d.setAttribute("aria-expanded", "false"), t === "escape" && e.focus(), m();
1915
+ }
1916
+ });
1917
+ return {
1918
+ kind: t,
1919
+ button: d,
1920
+ anchor: {
1921
+ getBoundingClientRect: () => c(t),
1922
+ get contextElement() {
1923
+ return a ?? void 0;
1924
+ }
1925
+ },
1926
+ placement: s,
1927
+ actions: f,
1928
+ popover: p,
1929
+ generation: 0
1930
+ };
1931
+ }), u = () => l.some((e) => e.popover.isOpen);
1932
+ function d(e) {
1933
+ let t = ++e.generation;
1934
+ Promise.resolve(ce(e.anchor, e.button, {
1935
+ strategy: "absolute",
1936
+ placement: e.placement,
1937
+ middleware: e.kind === "table" ? [B(X)] : [B(X), ue()]
1938
+ }).then(({ x: n, y: r, middlewareData: i }) => {
1939
+ e.generation === t && (e.button.style.left = `${n}px`, e.button.style.top = `${r}px`, e.button.style.visibility = i.hide?.referenceHidden ? "hidden" : "");
1940
+ }));
1941
+ }
1942
+ function f() {
1943
+ let { node: t, offset: n } = i.domAtPos(e.state.selection.head), r = t.childNodes[n], a = (r instanceof Element ? r : t instanceof Element ? t : t.parentElement)?.closest("td, th");
1944
+ return a && i.dom.contains(a) ? a : null;
1945
+ }
1946
+ function p(e) {
1947
+ if (e !== a) {
1948
+ a = e;
1949
+ for (let e of l) e.stopAutoUpdate?.(), e.stopAutoUpdate = void 0, e.generation++, e.button.hidden = !a, a && (e.stopAutoUpdate = se(e.anchor, e.button, () => d(e)));
1950
+ }
1951
+ }
1952
+ function m() {
1953
+ if (u()) return;
1954
+ o && !o.isConnected && (o = null);
1955
+ let t = i.hasFocus() ? f() : null;
1956
+ p(e.isEditable ? o ?? t : null);
1957
+ }
1958
+ function h(e, t) {
1959
+ let n = e.closest("table")?.getBoundingClientRect();
1960
+ if (!n) return !1;
1961
+ let { clientX: r, clientY: i } = t;
1962
+ return r >= n.left - Z && r <= n.right + Z && i >= n.top - Z && i <= n.bottom + Z;
1963
+ }
1964
+ function g(t) {
1965
+ if (!a) return;
1966
+ let n = a.closest("table"), r = i.posAtDOM(a, 0);
1967
+ o = a, t.kind === "row" ? e.commands.selectRow(r) : t.kind === "column" ? e.commands.selectColumn(r) : f()?.closest("table") !== n && e.commands.selectTable(r), t.popover.open(), t.button.setAttribute("aria-expanded", "true"), t.actions.refresh(), t.actions.focusFirst();
1968
+ }
1969
+ let _ = (e) => {
1970
+ let t = e.target;
1971
+ if (u() || t.closest(".stilo-table-handle")) return;
1972
+ let n = t.closest("td, th");
1973
+ n && i.dom.contains(n) ? o = n : o && !h(o, e) && (o = null), m();
1974
+ }, v = () => {
1975
+ o = null, m();
1976
+ }, y = (e) => {
1977
+ e.target.closest(".stilo-table-handle") && e.preventDefault();
1978
+ }, b = (t) => {
1979
+ let n = t.target.closest(".stilo-table-handle"), r = l.find((e) => e.button === n);
1980
+ r && (r.popover.isOpen ? (r.popover.close(), e.focus()) : g(r));
1981
+ };
1982
+ n.addEventListener("mousemove", _), n.addEventListener("mouseleave", v), n.addEventListener("mousedown", y), n.addEventListener("click", b), e.on("transaction", m), e.on("focus", m), e.on("blur", m);
1983
+ function x() {
1984
+ n.removeEventListener("mousemove", _), n.removeEventListener("mouseleave", v), n.removeEventListener("mousedown", y), n.removeEventListener("click", b), e.off("transaction", m), e.off("focus", m), e.off("blur", m);
1985
+ for (let e of l) e.popover.destroy();
1986
+ p(null);
1987
+ for (let e of l) e.actions.destroy(), e.button.remove();
1988
+ }
1989
+ return {
1990
+ update: m,
1991
+ destroy: x
1992
+ };
1993
+ }
1994
+ //#endregion
1995
+ //#region src/ui/components/table-menu.ts
1996
+ var ot = 8, $ = 10, st = [
1997
+ [
1998
+ "addRowBefore",
1999
+ "addRowAfter",
2000
+ "deleteRow"
2001
+ ],
2002
+ [
2003
+ "addColumnBefore",
2004
+ "addColumnAfter",
2005
+ "deleteColumn"
2006
+ ],
2007
+ ["mergeCells", "splitCell"],
2008
+ ["toggleHeaderRow", "toggleHeaderColumn"],
2009
+ ["deleteTable"]
2010
+ ];
2011
+ function ct(e, t) {
2012
+ let { anchor: n, container: r, messages: i } = t, a = document.createElement("div");
2013
+ a.className = "stilo-table-menu", a.setAttribute("role", "dialog");
2014
+ let o = document.createElement("div");
2015
+ o.className = "stilo-table-menu__picker";
2016
+ let s = document.createElement("div");
2017
+ s.className = "stilo-table-menu__grid", s.setAttribute("role", "group"), s.setAttribute("aria-label", i["table.insert"]);
2018
+ let c = [];
2019
+ for (let e = 1; e <= ot; e++) for (let t = 1; t <= $; t++) {
2020
+ let n = document.createElement("button");
2021
+ n.type = "button", n.className = "stilo-table-menu__cell", n.tabIndex = -1, n.dataset.rows = String(e), n.dataset.columns = String(t), n.setAttribute("aria-label", h(e, t)), c.push(n);
2022
+ }
2023
+ s.append(...c);
2024
+ let l = document.createElement("div");
2025
+ l.className = "stilo-table-menu__size", l.setAttribute("aria-hidden", "true");
2026
+ let u = document.createElement("label");
2027
+ u.className = "stilo-table-menu__header";
2028
+ let d = document.createElement("input");
2029
+ d.type = "checkbox", d.checked = !0, u.append(d, ` ${i["table.headerRow"]}`), o.append(s, l, u);
2030
+ let f = rt(e, {
2031
+ groups: st,
2032
+ label: i["toolbar.table"],
2033
+ messages: i,
2034
+ close: () => m.close()
2035
+ }), p = f.element;
2036
+ a.append(o, p), n.setAttribute("aria-haspopup", "dialog"), n.setAttribute("aria-expanded", "false");
2037
+ let m = U({
2038
+ anchor: n,
2039
+ content: a,
2040
+ container: r,
2041
+ onClose: (t) => {
2042
+ n.setAttribute("aria-expanded", "false"), t === "escape" && e.focus();
2043
+ }
2044
+ });
2045
+ function h(e, t) {
2046
+ return i["table.size"].replace("{rows}", String(e)).replace("{columns}", String(t));
2047
+ }
2048
+ function g(e, t, n) {
2049
+ for (let n of c) {
2050
+ let r = Number(n.dataset.rows) <= e && Number(n.dataset.columns) <= t;
2051
+ n.classList.toggle("stilo-table-menu__cell--active", r), n.tabIndex = -1;
2052
+ }
2053
+ let r = c[(e - 1) * $ + t - 1];
2054
+ r.tabIndex = 0, n && r.focus({ preventScroll: !0 }), l.textContent = h(e, t);
2055
+ }
2056
+ function _(t) {
2057
+ let n = Number(t.dataset.rows), r = Number(t.dataset.columns);
2058
+ m.close(), e.focus(), e.commands.insertTable({
2059
+ rows: n,
2060
+ cols: r,
2061
+ withHeaderRow: d.checked
2062
+ });
2063
+ }
2064
+ let v = (e) => e.closest(".stilo-table-menu__cell"), y = (e) => {
2065
+ let t = v(e.target);
2066
+ t && g(Number(t.dataset.rows), Number(t.dataset.columns), !1);
2067
+ }, b = (e) => {
2068
+ let t = v(e.target);
2069
+ t && _(t);
2070
+ }, x = (e) => {
2071
+ let t = v(e.target);
2072
+ if (!t) return;
2073
+ let n = Number(t.dataset.rows), r = Number(t.dataset.columns);
2074
+ if (e.key === "ArrowDown") n = Math.min(n + 1, ot);
2075
+ else if (e.key === "ArrowUp") n = Math.max(n - 1, 1);
2076
+ else if (e.key === "ArrowRight") r = Math.min(r + 1, $);
2077
+ else if (e.key === "ArrowLeft") r = Math.max(r - 1, 1);
2078
+ else return;
2079
+ e.preventDefault(), g(n, r, !0);
2080
+ };
2081
+ s.addEventListener("mouseover", y), s.addEventListener("click", b), s.addEventListener("keydown", x);
2082
+ function S() {
2083
+ if (m.isOpen) return;
2084
+ let t = e.isActive("table");
2085
+ o.hidden = t, p.hidden = !t, a.setAttribute("aria-label", t ? i["toolbar.table"] : i["table.insert"]), m.open(), n.setAttribute("aria-expanded", "true"), t ? (f.refresh(), f.focusFirst()) : g(1, 1, !0);
2086
+ }
2087
+ function C() {
2088
+ m.isOpen && (m.close(), e.focus());
2089
+ }
2090
+ function w() {
2091
+ s.removeEventListener("mouseover", y), s.removeEventListener("click", b), s.removeEventListener("keydown", x), f.destroy(), m.destroy(), n.removeAttribute("aria-haspopup"), n.removeAttribute("aria-expanded");
2092
+ }
2093
+ return {
2094
+ get isOpen() {
2095
+ return m.isOpen;
2096
+ },
2097
+ open: S,
2098
+ close: C,
2099
+ toggle: () => m.isOpen ? C() : S(),
2100
+ destroy: w
2101
+ };
2102
+ }
2103
+ //#endregion
2104
+ //#region src/ui/toolbar/toolbar.ts
2105
+ function lt(e, t) {
2106
+ if (typeof e == "string") {
2107
+ let n = Ce[e];
2108
+ if (!n) throw new a(`Toolbar: unknown item "${e}"`);
2109
+ return n.isAvailable && !n.isAvailable(t) ? void 0 : n;
2110
+ }
2111
+ if (!e.isAvailable || e.isAvailable(t)) return e;
2112
+ }
2113
+ function ut(e, t) {
2114
+ let { selectionStart: n, selectionEnd: r, value: i } = t;
2115
+ switch (e.key) {
2116
+ case "Home":
2117
+ case "End": return !0;
2118
+ case "ArrowLeft": return n !== 0 || r !== 0;
2119
+ case "ArrowRight": return n !== i.length || r !== i.length;
2120
+ default: return !1;
2121
+ }
2122
+ }
2123
+ function dt(e, t) {
2124
+ let { container: n, items: r = Se, messages: i = H, sticky: a = !0 } = t, o = fe(), s = [];
2125
+ for (let t of r) {
2126
+ let n = [];
2127
+ for (let r of t) {
2128
+ let t = lt(r, e);
2129
+ t && n.push(t);
2130
+ }
2131
+ n.length > 0 && s.push(n);
2132
+ }
2133
+ let c = document.createElement("div");
2134
+ c.className = "stilo-toolbar", c.setAttribute("role", "toolbar"), c.setAttribute("aria-label", i?.["toolbar.label"] ?? "Formatting"), c.setAttribute("aria-orientation", "horizontal");
2135
+ let l = [], u = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(), f = [], p = [], m = [];
2136
+ for (let t of s) {
2137
+ let n = document.createElement("div");
2138
+ n.className = "stilo-toolbar__group", n.setAttribute("role", "group");
2139
+ for (let r of t) if (r.kind === "dropdown") {
2140
+ let t = r, a = t.options.map((e) => {
2141
+ let t = i[e.labelKey] ?? e.labelKey, n = e.shortcut ? V(e.shortcut, o) : void 0;
2142
+ return {
2143
+ id: e.id,
2144
+ label: t,
2145
+ shortcut: n,
2146
+ fontFamily: e.fontFamily,
2147
+ action: !e.isActive
2148
+ };
2149
+ }), s = We({
2150
+ label: i[t.labelKey] ?? t.labelKey,
2151
+ options: a,
2152
+ icon: t.icon,
2153
+ container: c,
2154
+ onSelect: (n) => {
2155
+ let r = t.options.find((e) => e.id === n);
2156
+ r && (r.run(e), e.focus());
2157
+ }
2158
+ });
2159
+ s.trigger.setAttribute("data-item", t.id), n.appendChild(s.trigger), l.push(s.trigger), u.set(s.trigger, t), d.set(t.id, s);
2160
+ } else if (r.kind === "iconMenu") {
2161
+ let t = et(e, r, {
2162
+ container: c,
2163
+ messages: i,
2164
+ mac: o
2165
+ });
2166
+ n.appendChild(t.trigger), l.push(t.trigger), u.set(t.trigger, r), m.push(t);
2167
+ } else if (r.kind === "fontSize") {
2168
+ let t = $e(e, r, {
2169
+ container: c,
2170
+ messages: i
2171
+ });
2172
+ n.appendChild(t.element);
2173
+ for (let e of t.parts) l.push(e), u.set(e, r);
2174
+ p.push(t);
2175
+ } else if (r.kind === "color") {
2176
+ let t = Ue(e, r, {
2177
+ container: c,
2178
+ messages: i
2179
+ });
2180
+ n.appendChild(t.element);
2181
+ for (let e of [t.main, t.arrow]) l.push(e), u.set(e, r);
2182
+ f.push(t);
2183
+ } else {
2184
+ let e = r, t = i[e.labelKey] ?? e.labelKey, a = e.shortcut === void 0 ? t : `${t} (${V(e.shortcut, o)})`, s = document.createElement("button");
2185
+ s.type = "button", s.className = "stilo-toolbar__button", s.setAttribute("data-item", e.id), s.setAttribute("aria-label", t), s.setAttribute("title", a), s.setAttribute("tabindex", "-1"), e.isActive && s.setAttribute("aria-pressed", "false");
2186
+ let c = K(e.icon);
2187
+ s.appendChild(c), n.appendChild(s), l.push(s), u.set(s, e);
2188
+ }
2189
+ c.appendChild(n);
2190
+ }
2191
+ let h = e.view.dom.parentElement ?? c, g = "setLink" in e.commands ? be(e, {
2192
+ container: h,
2193
+ messages: i
2194
+ }) : null, _ = g ? tt(e, {
2195
+ container: h,
2196
+ messages: i,
2197
+ onEdit: () => g.open()
2198
+ }) : null, v = "selectRow" in e.commands ? at(e, {
2199
+ container: h,
2200
+ messages: i
2201
+ }) : null, y = c.querySelector("[data-item=\"characters\"]"), b = y ? ze(e, {
2202
+ anchor: y,
2203
+ container: c,
2204
+ messages: i
2205
+ }) : null, x = c.querySelector("[data-item=\"table\"]"), S = x ? ct(e, {
2206
+ anchor: x,
2207
+ container: c,
2208
+ messages: i
2209
+ }) : null, C = {
2210
+ openLinkPopover: () => g?.open(),
2211
+ toggleCharacterPicker: () => b?.toggle(),
2212
+ toggleFindBar: () => T?.toggle(),
2213
+ toggleTableMenu: () => S?.toggle()
2214
+ };
2215
+ n.appendChild(c);
2216
+ let w = c.querySelector("[data-item=\"find\"]"), T = "setSearch" in e.commands ? qe(e, {
2217
+ container: n,
2218
+ messages: i,
2219
+ button: w
2220
+ }) : null, E = null;
2221
+ if (a) {
2222
+ n.classList.add("stilo-toolbar-host");
2223
+ let t = () => {
2224
+ let t = n.offsetHeight + 5;
2225
+ e.view.setProps({ scrollMargin: {
2226
+ top: t,
2227
+ right: 5,
2228
+ bottom: 5,
2229
+ left: 5
2230
+ } });
2231
+ };
2232
+ t(), typeof ResizeObserver < "u" && (E = new ResizeObserver(t), E.observe(n));
2233
+ }
2234
+ let D = 0, O = !1, k = 0;
2235
+ function A(e) {
2236
+ l.forEach((t, n) => {
2237
+ t.setAttribute("tabindex", n === e ? "0" : "-1");
2238
+ }), k = e;
2239
+ }
2240
+ A(0);
2241
+ function j() {
2242
+ for (let e of f) e.update();
2243
+ for (let e of p) e.update();
2244
+ for (let e of m) e.update();
2245
+ for (let t of l) {
2246
+ let n = u.get(t);
2247
+ if (n && n.kind !== "color" && n.kind !== "fontSize" && n.kind !== "iconMenu") {
2248
+ if (n.kind === "dropdown") {
2249
+ let t = n, r = null, i = /* @__PURE__ */ new Set();
2250
+ for (let n of t.options) {
2251
+ let t = n.isActive?.(e) ?? !1;
2252
+ n.isEnabled !== void 0 && !n.isEnabled(e) && i.add(n.id), t && r === null && (r = n.id);
2253
+ }
2254
+ let a = d.get(t.id), o = r === null ? t.getValueLabel?.(e) ?? null : null;
2255
+ a?.update({
2256
+ activeId: r,
2257
+ disabledIds: i,
2258
+ valueLabel: o
2259
+ });
2260
+ } else {
2261
+ let r = t, i = n;
2262
+ if (i.isActive) {
2263
+ let t = i.isActive(e);
2264
+ r.setAttribute("aria-pressed", t ? "true" : "false"), t ? r.classList.add("stilo-toolbar__button--active") : r.classList.remove("stilo-toolbar__button--active");
2265
+ } else r.removeAttribute("aria-pressed"), r.classList.remove("stilo-toolbar__button--active");
2266
+ i.isEnabled ? i.isEnabled(e) ? r.removeAttribute("aria-disabled") : r.setAttribute("aria-disabled", "true") : r.removeAttribute("aria-disabled");
2267
+ }
2268
+ }
2269
+ }
2270
+ }
2271
+ j();
2272
+ let M = () => {
2273
+ O || (D ||= requestAnimationFrame(() => {
2274
+ O || (D = 0, j());
2275
+ }));
2276
+ };
2277
+ e.on("transaction", M);
2278
+ let N = (e) => {
2279
+ O || e.target.closest(".stilo-char-picker, .stilo-color-picker, .stilo-font-size__input") || e.preventDefault();
2280
+ };
2281
+ c.addEventListener("mousedown", N);
2282
+ let P = (t) => {
2283
+ if (O) return;
2284
+ let n = t.target.closest("[data-item]");
2285
+ if (!n) return;
2286
+ let r = u.get(n);
2287
+ r && r.kind === "button" && (!r.isEnabled || r.isEnabled(e)) && (e.focus(), r.run(e, C));
2288
+ };
2289
+ c.addEventListener("click", P);
2290
+ let F = (t) => {
2291
+ if (O) return;
2292
+ let n = t.target.closest("[data-item]");
2293
+ if (!n) return;
2294
+ let r = l.indexOf(n);
2295
+ if (!(r === -1 || n instanceof HTMLInputElement && ut(t, n))) switch (t.key) {
2296
+ case "ArrowRight": {
2297
+ t.preventDefault();
2298
+ let e = (r + 1) % l.length;
2299
+ A(e), l[e].focus();
2300
+ break;
2301
+ }
2302
+ case "ArrowLeft": {
2303
+ t.preventDefault();
2304
+ let e = (r - 1 + l.length) % l.length;
2305
+ A(e), l[e].focus();
2306
+ break;
2307
+ }
2308
+ case "Home":
2309
+ t.preventDefault(), A(0), l[0].focus();
2310
+ break;
2311
+ case "End": {
2312
+ t.preventDefault();
2313
+ let e = l.length - 1;
2314
+ A(e), l[e].focus();
2315
+ break;
2316
+ }
2317
+ case "Escape": t.preventDefault(), e.focus();
2318
+ }
2319
+ };
2320
+ c.addEventListener("keydown", F);
2321
+ let I = (t) => {
2322
+ if (O) return;
2323
+ let n = o ? t.metaKey : t.ctrlKey;
2324
+ g && n && !t.altKey && !t.shiftKey && t.key.toLowerCase() === "k" ? (t.preventDefault(), g.open()) : T && n && !t.altKey && !t.shiftKey && t.key.toLowerCase() === "f" ? (t.preventDefault(), T.open()) : t.key === "F10" && t.altKey && (t.preventDefault(), e.focus(), k >= 0 && k < l.length && l[k].focus());
2325
+ };
2326
+ e.view.dom.addEventListener("keydown", I);
2327
+ let L = () => {
2328
+ R();
2329
+ };
2330
+ e.on("destroy", L);
2331
+ function R() {
2332
+ if (!O) {
2333
+ O = !0, D &&= (cancelAnimationFrame(D), 0), e.off("transaction", M), e.off("destroy", L), c.removeEventListener("mousedown", N), c.removeEventListener("click", P), c.removeEventListener("keydown", F), e.view.dom.removeEventListener("keydown", I);
2334
+ for (let e of d.values()) e.destroy();
2335
+ for (let e of f) e.destroy();
2336
+ for (let e of p) e.destroy();
2337
+ for (let e of m) e.destroy();
2338
+ g?.destroy(), _?.destroy(), v?.destroy(), b?.destroy(), S?.destroy(), T?.destroy(), n.contains(c) && n.removeChild(c), a && (E?.disconnect(), n.classList.remove("stilo-toolbar-host"), e.view.setProps({ scrollMargin: void 0 }));
2339
+ }
2340
+ }
2341
+ return {
2342
+ get element() {
2343
+ return c;
2344
+ },
2345
+ update: j,
2346
+ destroy: R
2347
+ };
2348
+ }
2349
+ //#endregion
2350
+ export { ge as DEFAULT_FONTS, _e as DEFAULT_FONT_SIZES, Ce as DEFAULT_ITEMS, G as DEFAULT_PALETTE, Se as DEFAULT_TOOLBAR, me as createStatusBar, dt as createToolbar, H as en, Ae as fontFamilyDropdown, je as fontSizeInput, V as formatShortcut, Ie as headingDropdown, Ee as highlightButton, he as it, Fe as lineHeightDropdown, Ne as textAlignMenu, Te as textColorButton };