@openleaf-editor/ui 0.1.0-beta.2 → 0.1.0-beta.3
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.
- package/README.md +85 -0
- package/dist/block-type.d.ts +5 -0
- package/dist/block-type.d.ts.map +1 -0
- package/dist/block-type.js +133 -0
- package/dist/block-type.js.map +1 -0
- package/dist/content-css.d.ts +18 -0
- package/dist/content-css.d.ts.map +1 -1
- package/dist/content-css.js +231 -16
- package/dist/content-css.js.map +1 -1
- package/dist/css.d.ts +23 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +813 -0
- package/dist/css.js.map +1 -0
- package/dist/dialog.d.ts +93 -0
- package/dist/dialog.d.ts.map +1 -1
- package/dist/dialog.js +414 -86
- package/dist/dialog.js.map +1 -1
- package/dist/floating.d.ts +4 -0
- package/dist/floating.d.ts.map +1 -1
- package/dist/floating.js +50 -2
- package/dist/floating.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.d.ts.map +1 -1
- package/dist/help.js +29 -5
- package/dist/help.js.map +1 -1
- package/dist/i18n.d.ts +8 -0
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +32 -7
- package/dist/i18n.js.map +1 -1
- package/dist/icons.d.ts +7 -1
- package/dist/icons.d.ts.map +1 -1
- package/dist/icons.js +6 -2
- package/dist/icons.js.map +1 -1
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -6
- package/dist/index.js.map +1 -1
- package/dist/items.d.ts +0 -1
- package/dist/items.d.ts.map +1 -1
- package/dist/items.js +226 -20
- package/dist/items.js.map +1 -1
- package/dist/live.d.ts +42 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +83 -0
- package/dist/live.js.map +1 -0
- package/dist/menu.d.ts +31 -2
- package/dist/menu.d.ts.map +1 -1
- package/dist/menu.js +163 -23
- package/dist/menu.js.map +1 -1
- package/dist/openleaf.css +114 -12
- package/dist/overflow.d.ts +31 -4
- package/dist/overflow.d.ts.map +1 -1
- package/dist/overflow.js +267 -82
- package/dist/overflow.js.map +1 -1
- package/dist/registry.d.ts +72 -18
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +7 -6
- package/dist/registry.js.map +1 -1
- package/dist/skins.d.ts.map +1 -1
- package/dist/skins.js +48 -14
- package/dist/skins.js.map +1 -1
- package/dist/styles.d.ts +61 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +77 -637
- package/dist/styles.js.map +1 -1
- package/dist/testing.d.ts +3 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +3 -0
- package/dist/testing.js.map +1 -0
- package/dist/toolbar.d.ts +71 -12
- package/dist/toolbar.d.ts.map +1 -1
- package/dist/toolbar.js +410 -166
- package/dist/toolbar.js.map +1 -1
- package/dist/upload.d.ts +11 -0
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +15 -1
- package/dist/upload.js.map +1 -1
- package/package.json +17 -3
package/dist/css.js
ADDED
|
@@ -0,0 +1,813 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The editor stylesheet, as a string, and nothing else.
|
|
3
|
+
*
|
|
4
|
+
* ## Why this is not in `styles.ts`
|
|
5
|
+
*
|
|
6
|
+
* This is 20 KB of the ~24 KB `@openleaf-editor/ui` ships, and it is needed by
|
|
7
|
+
* exactly one function -- `ensureStyles`. While it lived beside `registerStyles`
|
|
8
|
+
* in `styles.ts`, every consumer that reached that module for any reason paid for
|
|
9
|
+
* the whole stylesheet: `skins.ts` imports `registerStyles`, so a bundle that
|
|
10
|
+
* touched a skin -- or, through the barrel, one that touched nothing but `t()` --
|
|
11
|
+
* carried the full sheet.
|
|
12
|
+
*
|
|
13
|
+
* Alone in a module whose only top-level binding is a string literal, it is
|
|
14
|
+
* trivially droppable. A bundler keeps it when something calls `ensureStyles` and
|
|
15
|
+
* discards it when the integrator has linked `openleaf.css` themselves, which is
|
|
16
|
+
* the distinction `markStylesExternal()` has always claimed to offer and could
|
|
17
|
+
* not previously deliver at bundle time.
|
|
18
|
+
*
|
|
19
|
+
* `dist/openleaf.css` is generated from this constant by `scripts/emit-css.mjs`,
|
|
20
|
+
* so the constructable-stylesheet path and the linked-file path cannot drift.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* The dark palette, as fallbacks for the same public tokens the light one uses.
|
|
24
|
+
*
|
|
25
|
+
* Written once and applied from three selectors below rather than pasted three
|
|
26
|
+
* times, because the failure mode of a pasted palette is one selector quietly
|
|
27
|
+
* missing a line -- and the line it is missing is a colour nobody looks at until
|
|
28
|
+
* it is the wrong one.
|
|
29
|
+
*/
|
|
30
|
+
/**
|
|
31
|
+
* ## Why the accessibility reasoning lives out here
|
|
32
|
+
*
|
|
33
|
+
* The bundles are minified, which strips these comments but NOT the contents of
|
|
34
|
+
* the template literal below -- a CSS comment is string data and ships to every
|
|
35
|
+
* user. So the long-form arguments sit here and the rules carry a short marker
|
|
36
|
+
* pointing back. Ratios below are computed with the WCAG 2.x sRGB formula
|
|
37
|
+
* against all four built-in palettes: default light, midnight, paper, contrast.
|
|
38
|
+
*
|
|
39
|
+
* ### Two border tokens
|
|
40
|
+
*
|
|
41
|
+
* `--ol-border` is 1.43:1 against the default surface (1.92 midnight, 1.47
|
|
42
|
+
* paper). That is right for a table rule or a group divider and wrong for the
|
|
43
|
+
* only thing delimiting a `<select>`, where WCAG 1.4.11 wants 3:1 for the parts
|
|
44
|
+
* of a control that identify it. Rather than darken every hairline in the
|
|
45
|
+
* editor, the two jobs are split: `--ol-border-strong` takes the control
|
|
46
|
+
* boundaries -- toolbar, menubar, content frame, source view, select, menu --
|
|
47
|
+
* and the decorative one stays quiet. The fallback clears 3:1 on a white
|
|
48
|
+
* surface (4.55:1) and a dark one (4.16:1) alike, so a third-party skin that
|
|
49
|
+
* sets only `--openleaf-color-border` still gets a legible control boundary.
|
|
50
|
+
*
|
|
51
|
+
* ### Menu focus
|
|
52
|
+
*
|
|
53
|
+
* `.ol-menu-item` had `outline: none` and a background swap standing in for the
|
|
54
|
+
* ring. That swap is 1.13:1 on the default palette, 1.24 midnight, 1.13 paper,
|
|
55
|
+
* and 1.23 in the skin named "High contrast"; 1.4.11 requires 3:1. A menu item
|
|
56
|
+
* is reachable only by ArrowDown, so that swap was the author's sole position
|
|
57
|
+
* marker. The ring is back and the swap stays as hover affordance. It is inset
|
|
58
|
+
* two pixels rather than outset so it is drawn inside the item rather than over
|
|
59
|
+
* the menu's padding and its neighbour, and it lands at 4.59:1 against the
|
|
60
|
+
* item's own hovered background (7.82 midnight, 4.88 paper, 9.73 contrast).
|
|
61
|
+
*
|
|
62
|
+
* ### Disabled is not invisible
|
|
63
|
+
*
|
|
64
|
+
* `opacity: 0.4` put a 16px glyph at 2.41:1 (2.34 paper, 2.85 contrast), which
|
|
65
|
+
* is not a dimmed icon but an absent one -- and `undo`, `redo` and `link` are
|
|
66
|
+
* disabled at rest. 0.55 stays plainly quieter than an enabled control while
|
|
67
|
+
* clearing 3:1 as non-text content. A disabled control is exempt from 1.4.3
|
|
68
|
+
* either way; being exempt from a rule is not a reason to be unreadable.
|
|
69
|
+
*
|
|
70
|
+
* ### Cell selection
|
|
71
|
+
*
|
|
72
|
+
* The `.selectedCell` tint alone measured 1.06-1.18:1 depending on the palette,
|
|
73
|
+
* and a selection you cannot see is one you will destroy by typing. The ring
|
|
74
|
+
* carries the information now and the tint is the nicety. The ring goes on the
|
|
75
|
+
* cell rather than on the `::after` overlay because the overlay's own `opacity`
|
|
76
|
+
* would fade it to the same invisibility -- a 40% accent lands near 2:1. Per
|
|
77
|
+
* CSS 2.1 Appendix E an element's outline paints in step 10, after all its
|
|
78
|
+
* descendants, so the tint does not cover it.
|
|
79
|
+
*
|
|
80
|
+
* ### Forced colours
|
|
81
|
+
*
|
|
82
|
+
* The block at the end of the sheet previously stopped at `.ol-btn`. Everything
|
|
83
|
+
* added to it depends on a palette this mode discards outright, so each of them
|
|
84
|
+
* had no indicator at all: which menu is open, which menu item has focus, which
|
|
85
|
+
* cells are selected, and every one of the visual aids -- whose entire output
|
|
86
|
+
* is a colour.
|
|
87
|
+
*/
|
|
88
|
+
const DARK_TOKENS = `
|
|
89
|
+
--ol-text: var(--openleaf-color-text, #e6edf3);
|
|
90
|
+
--ol-text-muted: var(--openleaf-color-text-muted, #9198a1);
|
|
91
|
+
--ol-surface: var(--openleaf-color-surface, #0d1117);
|
|
92
|
+
--ol-surface-hover: var(--openleaf-color-surface-hover, #21262d);
|
|
93
|
+
--ol-surface-active: var(--openleaf-color-surface-active, #1f3a5f);
|
|
94
|
+
--ol-border: var(--openleaf-color-border, #3d444d);
|
|
95
|
+
--ol-border-strong: var(--openleaf-color-border-strong, #8b949e);
|
|
96
|
+
--ol-accent: var(--openleaf-color-accent, #79c0ff);
|
|
97
|
+
--ol-focus: var(--openleaf-color-focus, #79c0ff);
|
|
98
|
+
--ol-danger: var(--openleaf-color-danger, #ff8182);
|
|
99
|
+
`;
|
|
100
|
+
export const CSS = `
|
|
101
|
+
.ol-editor {
|
|
102
|
+
/* Two families, named before either is public API. A singular
|
|
103
|
+
\`--openleaf-font\` implies "the" font, and source view already has a
|
|
104
|
+
monospace surface -- bolting a mono token on beside a singular name later
|
|
105
|
+
is the awkward outcome worth avoiding now. \`--openleaf-font\` is still
|
|
106
|
+
honoured as a fallback. */
|
|
107
|
+
--ol-font: var(--openleaf-font-ui, var(--openleaf-font, system-ui, -apple-system, "Segoe UI", sans-serif));
|
|
108
|
+
--ol-font-mono: var(--openleaf-font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
|
|
109
|
+
--ol-font-size: var(--openleaf-font-size, 14px);
|
|
110
|
+
--ol-radius: var(--openleaf-radius, 4px);
|
|
111
|
+
--ol-text: var(--openleaf-color-text, #1f2328);
|
|
112
|
+
--ol-text-muted: var(--openleaf-color-text-muted, #59636e);
|
|
113
|
+
--ol-surface: var(--openleaf-color-surface, #ffffff);
|
|
114
|
+
--ol-surface-hover: var(--openleaf-color-surface-hover, #f0f1f3);
|
|
115
|
+
--ol-surface-active: var(--openleaf-color-surface-active, #dbe9ff);
|
|
116
|
+
--ol-border: var(--openleaf-color-border, #d1d9e0);
|
|
117
|
+
/* Control boundaries, not decoration. See "Two border tokens" above. */
|
|
118
|
+
--ol-border-strong: var(--openleaf-color-border-strong, #6e7781);
|
|
119
|
+
--ol-accent: var(--openleaf-color-accent, #0550ae);
|
|
120
|
+
--ol-focus: var(--openleaf-color-focus, #0969da);
|
|
121
|
+
--ol-danger: var(--openleaf-color-danger, #cf222e);
|
|
122
|
+
--ol-button-size: var(--openleaf-button-size, 32px);
|
|
123
|
+
--ol-icon-size: var(--openleaf-icon-size, 16px);
|
|
124
|
+
--ol-gap: var(--openleaf-gap, 2px);
|
|
125
|
+
/* A 2009 WordPress admin bar sits at z-index 99999 and Drupal's toolbar plays
|
|
126
|
+
similar games. Without a sanctioned escape hatch integrators fix a toolbar
|
|
127
|
+
rendered behind a sticky host header with !important -- the exact thing the
|
|
128
|
+
token API exists to prevent. */
|
|
129
|
+
--ol-z: var(--openleaf-z-index, 1);
|
|
130
|
+
/* Thickness and offset, not just colour: "you can change the colour but not
|
|
131
|
+
the thickness" is a poor answer to a Section 508 team citing WCAG 2.2
|
|
132
|
+
Focus Appearance. */
|
|
133
|
+
--ol-focus-width: var(--openleaf-focus-width, 2px);
|
|
134
|
+
--ol-focus-offset: var(--openleaf-focus-offset, 1px);
|
|
135
|
+
|
|
136
|
+
display: block;
|
|
137
|
+
position: relative;
|
|
138
|
+
color: var(--ol-text);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/* Three ways into the dark palette, and one way out of it.
|
|
142
|
+
\`data-ol-scheme\` is set from the applied skin's declared scheme, and a skin
|
|
143
|
+
that declares one outranks both the attribute and the system -- it has to,
|
|
144
|
+
because its tokens have already replaced the palette outright. Without the
|
|
145
|
+
\`:not()\` guards a light skin on a dark machine would take these fallbacks for
|
|
146
|
+
every token it did not itself set, which is a light surface carrying dark-mode
|
|
147
|
+
muted text. */
|
|
148
|
+
@media (prefers-color-scheme: dark) {
|
|
149
|
+
.ol-editor:not([data-ol-theme="light"]):not([data-ol-scheme]) {${DARK_TOKENS}}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.ol-editor[data-ol-theme="dark"]:not([data-ol-scheme]) {${DARK_TOKENS}}
|
|
153
|
+
|
|
154
|
+
.ol-editor[data-ol-scheme="dark"] {${DARK_TOKENS}}
|
|
155
|
+
|
|
156
|
+
/* Native widget chrome -- the popup a \`select\` opens, scrollbars, the caret,
|
|
157
|
+
form control backgrounds -- is painted by the browser from \`color-scheme\`,
|
|
158
|
+
not from any property we can hand an integrator. Left alone it follows the
|
|
159
|
+
page, which is right while the editor's own palette also follows the page and
|
|
160
|
+
wrong the moment either attribute pins the editor to one world. So it is set
|
|
161
|
+
exactly when the editor stops following along, and inherited from the host
|
|
162
|
+
otherwise. */
|
|
163
|
+
.ol-editor[data-ol-theme="light"] { color-scheme: light; }
|
|
164
|
+
.ol-editor[data-ol-theme="dark"] { color-scheme: dark; }
|
|
165
|
+
.ol-editor[data-ol-scheme="light"] { color-scheme: light; }
|
|
166
|
+
.ol-editor[data-ol-scheme="dark"] { color-scheme: dark; }
|
|
167
|
+
|
|
168
|
+
/* Wrapping, not scrolling and not an overflow menu. Both of those hide
|
|
169
|
+
controls -- one off-screen, one behind a click -- and a formatting control
|
|
170
|
+
the author cannot see is a control they do not have. */
|
|
171
|
+
.ol-editor .ol-toolbar {
|
|
172
|
+
display: flex;
|
|
173
|
+
flex-wrap: wrap;
|
|
174
|
+
align-items: center;
|
|
175
|
+
gap: var(--ol-gap);
|
|
176
|
+
box-sizing: border-box;
|
|
177
|
+
margin: 0;
|
|
178
|
+
padding: 4px;
|
|
179
|
+
border: 1px solid var(--ol-border-strong);
|
|
180
|
+
border-bottom: 0;
|
|
181
|
+
border-radius: var(--ol-radius) var(--ol-radius) 0 0;
|
|
182
|
+
background: var(--ol-surface);
|
|
183
|
+
font: inherit;
|
|
184
|
+
position: relative;
|
|
185
|
+
z-index: var(--ol-z);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.ol-editor .ol-group {
|
|
189
|
+
display: flex;
|
|
190
|
+
flex-wrap: wrap;
|
|
191
|
+
align-items: center;
|
|
192
|
+
gap: var(--ol-gap);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* The divider is a BORDER on the group, not a standalone flex item.
|
|
196
|
+
As its own element it could wrap onto the trailing edge of a row with nothing
|
|
197
|
+
after it -- a stranded line floating at the end of a row. Wrapping begins
|
|
198
|
+
around 690-740px, well inside ordinary desktop widths (a CMS sidebar, a
|
|
199
|
+
half-width split pane), so this was not a 360px-only edge case.
|
|
200
|
+
border-inline-start rather than border-left, so it flips under RTL.
|
|
201
|
+
|
|
202
|
+
This selector is why the renderer emits NO element between groups. It used to
|
|
203
|
+
emit an .ol-sep div, which made the two groups non-adjacent and stopped this
|
|
204
|
+
rule from ever matching -- so no divider rendered in any theme, and every bar
|
|
205
|
+
carried inert empty divs. Adding a separator element back here breaks this. */
|
|
206
|
+
.ol-editor .ol-group + .ol-group {
|
|
207
|
+
border-inline-start: 1px solid var(--ol-border);
|
|
208
|
+
padding-inline-start: 5px;
|
|
209
|
+
margin-inline-start: 1px;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Every property a host reset or \`button {}\` rule is likely to touch is set
|
|
213
|
+
here explicitly. Specificity is (0,2,0) via the descendant selector, which
|
|
214
|
+
beats a bare element or single-class host rule without resorting to
|
|
215
|
+
!important. */
|
|
216
|
+
.ol-editor .ol-btn {
|
|
217
|
+
box-sizing: border-box;
|
|
218
|
+
display: inline-flex;
|
|
219
|
+
align-items: center;
|
|
220
|
+
justify-content: center;
|
|
221
|
+
flex: 0 0 auto;
|
|
222
|
+
width: var(--ol-button-size);
|
|
223
|
+
height: var(--ol-button-size);
|
|
224
|
+
min-width: var(--ol-button-size);
|
|
225
|
+
min-height: var(--ol-button-size);
|
|
226
|
+
max-width: none;
|
|
227
|
+
padding: 0;
|
|
228
|
+
margin: 0;
|
|
229
|
+
border: 1px solid transparent;
|
|
230
|
+
border-radius: var(--ol-radius);
|
|
231
|
+
background: transparent;
|
|
232
|
+
color: var(--ol-text);
|
|
233
|
+
font: inherit;
|
|
234
|
+
font-family: var(--ol-font);
|
|
235
|
+
font-size: var(--ol-font-size);
|
|
236
|
+
font-weight: 400;
|
|
237
|
+
line-height: 1;
|
|
238
|
+
letter-spacing: normal;
|
|
239
|
+
text-transform: none;
|
|
240
|
+
text-align: center;
|
|
241
|
+
text-decoration: none;
|
|
242
|
+
text-shadow: none;
|
|
243
|
+
box-shadow: none;
|
|
244
|
+
opacity: 1;
|
|
245
|
+
cursor: pointer;
|
|
246
|
+
appearance: none;
|
|
247
|
+
-webkit-appearance: none;
|
|
248
|
+
outline-offset: var(--ol-focus-offset);
|
|
249
|
+
-webkit-tap-highlight-color: transparent;
|
|
250
|
+
transition: background-color 120ms ease, border-color 120ms ease;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.ol-editor .ol-btn:hover {
|
|
254
|
+
background: var(--ol-surface-hover);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* :focus-visible only, so a mouse click does not leave a ring behind, but the
|
|
258
|
+
ring is never removed for keyboard users. */
|
|
259
|
+
.ol-editor .ol-btn:focus-visible {
|
|
260
|
+
outline: var(--ol-focus-width) solid var(--ol-focus);
|
|
261
|
+
outline-offset: var(--ol-focus-offset);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/* Pressed state is distinguished from hover by THREE signals, not just colour:
|
|
265
|
+
a filled background, a visible border, and an inset shadow that reads as
|
|
266
|
+
physically depressed. Colour alone would fail for a colour-blind author and
|
|
267
|
+
would be invisible in forced-colours mode. */
|
|
268
|
+
.ol-editor .ol-btn[aria-pressed="true"] {
|
|
269
|
+
background: var(--ol-surface-active);
|
|
270
|
+
border-color: var(--ol-accent);
|
|
271
|
+
color: var(--ol-accent);
|
|
272
|
+
box-shadow: inset 0 1px 2px rgb(0 0 0 / 12%);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.ol-editor .ol-btn[aria-pressed="true"]:hover {
|
|
276
|
+
background: var(--ol-surface-active);
|
|
277
|
+
border-color: var(--ol-accent);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* aria-disabled rather than the disabled attribute: a disabled button is
|
|
281
|
+
removed from the roving tabindex and cannot be reached or announced, so an
|
|
282
|
+
author using a screen reader cannot discover that the control exists. */
|
|
283
|
+
.ol-editor .ol-btn[aria-disabled="true"] {
|
|
284
|
+
opacity: 0.55;
|
|
285
|
+
cursor: default;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
.ol-editor .ol-btn[aria-disabled="true"]:hover {
|
|
289
|
+
background: transparent;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
.ol-editor .ol-icon {
|
|
293
|
+
width: var(--ol-icon-size);
|
|
294
|
+
height: var(--ol-icon-size);
|
|
295
|
+
display: block;
|
|
296
|
+
pointer-events: none;
|
|
297
|
+
flex: 0 0 auto;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/* Block-type select. Sized and coloured to sit level with the icon buttons so
|
|
301
|
+
it does not read as bolted on, but it stays a native <select> -- a custom
|
|
302
|
+
listbox is a large amount of ARIA that would then owe real screen reader
|
|
303
|
+
testing to be worth anything. */
|
|
304
|
+
.ol-editor .ol-select {
|
|
305
|
+
box-sizing: border-box;
|
|
306
|
+
height: var(--ol-button-size);
|
|
307
|
+
max-width: 11em;
|
|
308
|
+
padding: 0 22px 0 6px;
|
|
309
|
+
margin: 0;
|
|
310
|
+
border: 1px solid var(--ol-border-strong);
|
|
311
|
+
border-radius: var(--ol-radius);
|
|
312
|
+
background-color: transparent;
|
|
313
|
+
background-image: linear-gradient(45deg, transparent 50%, currentColor 50%),
|
|
314
|
+
linear-gradient(135deg, currentColor 50%, transparent 50%);
|
|
315
|
+
background-position: right 10px center, right 6px center;
|
|
316
|
+
background-size: 4px 4px, 4px 4px;
|
|
317
|
+
background-repeat: no-repeat;
|
|
318
|
+
color: var(--ol-text);
|
|
319
|
+
font-family: var(--ol-font);
|
|
320
|
+
font-size: var(--ol-font-size);
|
|
321
|
+
font-weight: 400;
|
|
322
|
+
line-height: 1;
|
|
323
|
+
text-transform: none;
|
|
324
|
+
letter-spacing: normal;
|
|
325
|
+
box-shadow: none;
|
|
326
|
+
cursor: pointer;
|
|
327
|
+
appearance: none;
|
|
328
|
+
-webkit-appearance: none;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.ol-editor .ol-select--wide {
|
|
332
|
+
max-width: 14em;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.ol-editor .ol-select:hover {
|
|
336
|
+
background-color: var(--ol-surface-hover);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.ol-editor .ol-select:focus-visible {
|
|
340
|
+
outline: var(--ol-focus-width) solid var(--ol-focus);
|
|
341
|
+
outline-offset: var(--ol-focus-offset);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/* The option list is painted by the OS, which does not inherit our tokens, so
|
|
345
|
+
give it explicit colours or dark mode shows black text on black. */
|
|
346
|
+
.ol-editor .ol-select option {
|
|
347
|
+
background: var(--ol-surface);
|
|
348
|
+
color: var(--ol-text);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
.ol-editor .ol-content {
|
|
352
|
+
box-sizing: border-box;
|
|
353
|
+
border: 1px solid var(--ol-border-strong);
|
|
354
|
+
border-radius: 0 0 var(--ol-radius) var(--ol-radius);
|
|
355
|
+
background: var(--ol-surface);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/* Deliberately minimal: the content area inherits the host's typography, which
|
|
359
|
+
is the entire reason this project does not use Shadow DOM. Only padding and
|
|
360
|
+
the focus ring are ours. */
|
|
361
|
+
.ol-editor .ol-content .ProseMirror {
|
|
362
|
+
padding: 12px;
|
|
363
|
+
min-height: 8rem;
|
|
364
|
+
outline: none;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
.ol-editor .ol-content:focus-within {
|
|
368
|
+
outline: 2px solid var(--ol-focus);
|
|
369
|
+
outline-offset: -1px;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
/* Tables.
|
|
373
|
+
These styles live in core, not in the opt-in table plugin, because table
|
|
374
|
+
NODES live in core: every deployment reads and renders tables even where
|
|
375
|
+
editing them is switched off. Unstyled tables would render as runs of
|
|
376
|
+
undelimited text. */
|
|
377
|
+
.ol-editor .ol-content .ProseMirror table {
|
|
378
|
+
border-collapse: collapse;
|
|
379
|
+
table-layout: fixed;
|
|
380
|
+
width: 100%;
|
|
381
|
+
margin: 0 0 1em;
|
|
382
|
+
overflow: hidden;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
.ol-editor .ol-content .ProseMirror td,
|
|
386
|
+
.ol-editor .ol-content .ProseMirror th {
|
|
387
|
+
border: 1px solid var(--ol-border);
|
|
388
|
+
padding: 6px 8px;
|
|
389
|
+
vertical-align: top;
|
|
390
|
+
/* A zero-width cell cannot be clicked into, so it cannot be repaired. */
|
|
391
|
+
min-width: 2em;
|
|
392
|
+
position: relative;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
/* Presentational valign is otherwise beaten by the rule above, which would
|
|
396
|
+
make the cell-properties dialog a no-op on screen. */
|
|
397
|
+
.ol-editor .ol-content .ProseMirror td[valign="middle"],
|
|
398
|
+
.ol-editor .ol-content .ProseMirror th[valign="middle"] { vertical-align: middle; }
|
|
399
|
+
.ol-editor .ol-content .ProseMirror td[valign="bottom"],
|
|
400
|
+
.ol-editor .ol-content .ProseMirror th[valign="bottom"] { vertical-align: bottom; }
|
|
401
|
+
.ol-editor .ol-content .ProseMirror td[valign="baseline"],
|
|
402
|
+
.ol-editor .ol-content .ProseMirror th[valign="baseline"] { vertical-align: baseline; }
|
|
403
|
+
|
|
404
|
+
.ol-editor .ol-content .ProseMirror th {
|
|
405
|
+
background: var(--ol-surface-hover);
|
|
406
|
+
font-weight: 600;
|
|
407
|
+
text-align: start;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/* prosemirror-tables marks cells in a rectangular selection with this class.
|
|
411
|
+
An ::after overlay rather than a background so it composes with a cell that
|
|
412
|
+
already has one, and so a header cell still reads as a header.
|
|
413
|
+
|
|
414
|
+
The ring, not the tint, is the indicator -- see "Cell selection" above. */
|
|
415
|
+
.ol-editor .ol-content .ProseMirror .selectedCell {
|
|
416
|
+
outline: 2px solid var(--ol-accent);
|
|
417
|
+
outline-offset: -2px;
|
|
418
|
+
}
|
|
419
|
+
.ol-editor .ol-content .ProseMirror .selectedCell::after {
|
|
420
|
+
content: "";
|
|
421
|
+
position: absolute;
|
|
422
|
+
inset: 0;
|
|
423
|
+
background: var(--ol-surface-active);
|
|
424
|
+
opacity: 0.4;
|
|
425
|
+
pointer-events: none;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* The column resize handle, drawn by prosemirror-tables' columnResizing. */
|
|
429
|
+
.ol-editor .ol-content .ProseMirror .column-resize-handle {
|
|
430
|
+
position: absolute;
|
|
431
|
+
right: -2px;
|
|
432
|
+
top: 0;
|
|
433
|
+
bottom: 0;
|
|
434
|
+
width: 4px;
|
|
435
|
+
background: var(--ol-accent);
|
|
436
|
+
pointer-events: none;
|
|
437
|
+
z-index: 20;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.ol-editor .ol-content .ProseMirror.resize-cursor {
|
|
441
|
+
cursor: col-resize;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.ol-editor .ol-content .ProseMirror img.ol-float-left {
|
|
445
|
+
float: left;
|
|
446
|
+
margin: 0 1em 0.5em 0;
|
|
447
|
+
}
|
|
448
|
+
.ol-editor .ol-content .ProseMirror img.ol-float-right {
|
|
449
|
+
float: right;
|
|
450
|
+
margin: 0 0 0.5em 1em;
|
|
451
|
+
}
|
|
452
|
+
.ol-editor .ol-content .ProseMirror img.ol-align-center {
|
|
453
|
+
display: block;
|
|
454
|
+
margin: 0 auto 0.5em;
|
|
455
|
+
}
|
|
456
|
+
.ol-editor .ol-content .ProseMirror figure {
|
|
457
|
+
margin: 0 0 1em;
|
|
458
|
+
}
|
|
459
|
+
.ol-editor .ol-content .ProseMirror figcaption {
|
|
460
|
+
font-size: .9em;
|
|
461
|
+
opacity: .8;
|
|
462
|
+
margin-top: .35em;
|
|
463
|
+
}
|
|
464
|
+
.ol-editor .ol-content .ProseMirror details {
|
|
465
|
+
border: 1px solid var(--ol-border);
|
|
466
|
+
border-radius: var(--ol-radius);
|
|
467
|
+
padding: .5em .75em;
|
|
468
|
+
margin: 0 0 1em;
|
|
469
|
+
}
|
|
470
|
+
.ol-editor .ol-content .ProseMirror summary {
|
|
471
|
+
cursor: pointer;
|
|
472
|
+
font-weight: 600;
|
|
473
|
+
}
|
|
474
|
+
.ol-editor .ol-content .ProseMirror hr.ol-pagebreak {
|
|
475
|
+
border: 0;
|
|
476
|
+
border-top: 2px dashed var(--ol-border);
|
|
477
|
+
margin: 1.5em 0;
|
|
478
|
+
}
|
|
479
|
+
.ol-editor .ol-content .ProseMirror iframe,
|
|
480
|
+
.ol-editor .ol-content .ProseMirror video,
|
|
481
|
+
.ol-editor .ol-content .ProseMirror audio {
|
|
482
|
+
max-width: 100%;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/* Preserved-but-unrecognised markup, surfaced rather than hidden. */
|
|
486
|
+
.ol-editor .ol-content .ProseMirror-selectednode {
|
|
487
|
+
outline: 2px solid var(--ol-focus);
|
|
488
|
+
outline-offset: 2px;
|
|
489
|
+
border-radius: 2px;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.ol-editor .ol-source {
|
|
493
|
+
box-sizing: border-box;
|
|
494
|
+
display: block;
|
|
495
|
+
width: 100%;
|
|
496
|
+
min-height: 12rem;
|
|
497
|
+
padding: 12px;
|
|
498
|
+
border: 1px solid var(--ol-border-strong);
|
|
499
|
+
border-radius: 0 0 var(--ol-radius) var(--ol-radius);
|
|
500
|
+
background: var(--ol-surface);
|
|
501
|
+
color: var(--ol-text);
|
|
502
|
+
font-family: var(--ol-font-mono);
|
|
503
|
+
font-size: 13px;
|
|
504
|
+
line-height: 1.5;
|
|
505
|
+
resize: vertical;
|
|
506
|
+
white-space: pre-wrap;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/* Directional icons under RTL.
|
|
510
|
+
Group order reverses for free with flexbox, but a curved undo arrow does not:
|
|
511
|
+
in an RTL document "back" points the other way. Only genuinely directional
|
|
512
|
+
icons are flipped -- bold and italic must not be mirrored. */
|
|
513
|
+
.ol-editor[dir="rtl"] .ol-icon--directional,
|
|
514
|
+
[dir="rtl"] .ol-editor .ol-icon--directional {
|
|
515
|
+
transform: scaleX(-1);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/* The announcement region. Visually hidden but not display:none, which would
|
|
519
|
+
remove it from the accessibility tree and silence it. */
|
|
520
|
+
.ol-editor .ol-live {
|
|
521
|
+
position: absolute;
|
|
522
|
+
width: 1px;
|
|
523
|
+
height: 1px;
|
|
524
|
+
margin: -1px;
|
|
525
|
+
padding: 0;
|
|
526
|
+
overflow: hidden;
|
|
527
|
+
clip: rect(0 0 0 0);
|
|
528
|
+
clip-path: inset(50%);
|
|
529
|
+
white-space: nowrap;
|
|
530
|
+
border: 0;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/* Menubar, menus, floating chrome, visual aids, fullscreen, inline. */
|
|
534
|
+
.ol-editor .ol-menubar {
|
|
535
|
+
display: flex;
|
|
536
|
+
flex-wrap: wrap;
|
|
537
|
+
gap: var(--ol-gap);
|
|
538
|
+
box-sizing: border-box;
|
|
539
|
+
margin: 0;
|
|
540
|
+
padding: 2px 4px;
|
|
541
|
+
border: 1px solid var(--ol-border-strong);
|
|
542
|
+
border-bottom: 0;
|
|
543
|
+
border-radius: var(--ol-radius) var(--ol-radius) 0 0;
|
|
544
|
+
background: var(--ol-surface);
|
|
545
|
+
position: relative;
|
|
546
|
+
z-index: var(--ol-z);
|
|
547
|
+
}
|
|
548
|
+
.ol-editor .ol-menubar + .ol-toolbar {
|
|
549
|
+
border-radius: 0;
|
|
550
|
+
}
|
|
551
|
+
.ol-editor .ol-menu-trigger {
|
|
552
|
+
box-sizing: border-box;
|
|
553
|
+
margin: 0;
|
|
554
|
+
padding: 4px 8px;
|
|
555
|
+
border: 1px solid transparent;
|
|
556
|
+
border-radius: var(--ol-radius);
|
|
557
|
+
background: transparent;
|
|
558
|
+
color: var(--ol-text);
|
|
559
|
+
font: inherit;
|
|
560
|
+
font-family: var(--ol-font);
|
|
561
|
+
font-size: var(--ol-font-size);
|
|
562
|
+
cursor: pointer;
|
|
563
|
+
appearance: none;
|
|
564
|
+
}
|
|
565
|
+
.ol-editor .ol-menu-trigger:hover,
|
|
566
|
+
.ol-editor .ol-menu-trigger[aria-expanded="true"] {
|
|
567
|
+
background: var(--ol-surface-hover);
|
|
568
|
+
}
|
|
569
|
+
.ol-editor .ol-menu-trigger:focus-visible {
|
|
570
|
+
outline: var(--ol-focus-width) solid var(--ol-focus);
|
|
571
|
+
outline-offset: var(--ol-focus-offset);
|
|
572
|
+
}
|
|
573
|
+
.ol-editor .ol-menu {
|
|
574
|
+
position: absolute;
|
|
575
|
+
z-index: calc(var(--ol-z) + 20);
|
|
576
|
+
min-width: 12rem;
|
|
577
|
+
/* Capped, so a deep menu opened low on a short window can be flipped above
|
|
578
|
+
its trigger instead of running off the bottom of the page. */
|
|
579
|
+
max-height: 60vh;
|
|
580
|
+
overflow-y: auto;
|
|
581
|
+
margin: 0;
|
|
582
|
+
padding: 4px;
|
|
583
|
+
border: 1px solid var(--ol-border-strong);
|
|
584
|
+
border-radius: var(--ol-radius);
|
|
585
|
+
background: var(--ol-surface);
|
|
586
|
+
box-shadow: 0 8px 24px rgb(0 0 0 / 12%);
|
|
587
|
+
}
|
|
588
|
+
.ol-editor .ol-menu-item {
|
|
589
|
+
display: block;
|
|
590
|
+
box-sizing: border-box;
|
|
591
|
+
width: 100%;
|
|
592
|
+
margin: 0;
|
|
593
|
+
padding: 6px 10px;
|
|
594
|
+
border: 0;
|
|
595
|
+
border-radius: var(--ol-radius);
|
|
596
|
+
background: transparent;
|
|
597
|
+
color: var(--ol-text);
|
|
598
|
+
font: inherit;
|
|
599
|
+
font-family: var(--ol-font);
|
|
600
|
+
font-size: var(--ol-font-size);
|
|
601
|
+
text-align: start;
|
|
602
|
+
cursor: pointer;
|
|
603
|
+
appearance: none;
|
|
604
|
+
}
|
|
605
|
+
.ol-editor .ol-menu-item:hover {
|
|
606
|
+
background: var(--ol-surface-hover);
|
|
607
|
+
}
|
|
608
|
+
/* Was outline:none plus a 1.13:1 background swap. See "Menu focus" above. */
|
|
609
|
+
.ol-editor .ol-menu-item:focus-visible {
|
|
610
|
+
background: var(--ol-surface-hover);
|
|
611
|
+
outline: var(--ol-focus-width) solid var(--ol-focus);
|
|
612
|
+
outline-offset: -2px;
|
|
613
|
+
}
|
|
614
|
+
/* 0.55, not 0.4: see "Disabled is not invisible" above. */
|
|
615
|
+
.ol-editor .ol-menu-item[aria-disabled="true"] {
|
|
616
|
+
opacity: 0.55;
|
|
617
|
+
cursor: default;
|
|
618
|
+
}
|
|
619
|
+
.ol-editor .ol-menu-sep {
|
|
620
|
+
height: 1px;
|
|
621
|
+
margin: 4px 0;
|
|
622
|
+
background: var(--ol-border);
|
|
623
|
+
}
|
|
624
|
+
/* \`display: flex\` on .ol-toolbar above outranks the UA's \`[hidden]\` rule --
|
|
625
|
+
a class selector beats an attribute selector on specificity -- so setting
|
|
626
|
+
\`el.hidden = true\` in floating.ts styled a hidden bar and showed it anyway.
|
|
627
|
+
Both floating bars sat over the prose at rest, with no selection to format.
|
|
628
|
+
The overflow panel needed the same rule for the same reason; see below. */
|
|
629
|
+
.ol-editor .ol-toolbar.ol-floating[hidden] {
|
|
630
|
+
display: none;
|
|
631
|
+
}
|
|
632
|
+
.ol-editor .ol-toolbar.ol-floating {
|
|
633
|
+
position: absolute;
|
|
634
|
+
flex-wrap: nowrap;
|
|
635
|
+
border: 1px solid var(--ol-border);
|
|
636
|
+
border-radius: var(--ol-radius);
|
|
637
|
+
box-shadow: 0 8px 24px rgb(0 0 0 / 12%);
|
|
638
|
+
z-index: calc(var(--ol-z) + 10);
|
|
639
|
+
}
|
|
640
|
+
.ol-editor .ol-toolbar.ol-toolbar--overflow {
|
|
641
|
+
flex-wrap: nowrap;
|
|
642
|
+
overflow: hidden;
|
|
643
|
+
}
|
|
644
|
+
/* The More panel. Positioned in viewport coordinates from script, because the
|
|
645
|
+
bar it belongs to may live inside a host with \`overflow: hidden\` -- which is
|
|
646
|
+
the situation the whole feature exists for. */
|
|
647
|
+
.ol-editor .ol-overflow-menu {
|
|
648
|
+
display: flex;
|
|
649
|
+
flex-direction: column;
|
|
650
|
+
align-items: stretch;
|
|
651
|
+
gap: var(--ol-gap);
|
|
652
|
+
max-height: 70vh;
|
|
653
|
+
overflow-y: auto;
|
|
654
|
+
}
|
|
655
|
+
.ol-editor .ol-overflow-menu[hidden] {
|
|
656
|
+
display: none;
|
|
657
|
+
}
|
|
658
|
+
/* Vertical: the panel exists because there is no horizontal room left. */
|
|
659
|
+
.ol-editor .ol-overflow-menu .ol-group {
|
|
660
|
+
flex-direction: column;
|
|
661
|
+
align-items: stretch;
|
|
662
|
+
}
|
|
663
|
+
.ol-editor .ol-overflow-menu .ol-group + .ol-group {
|
|
664
|
+
border-inline-start: 0;
|
|
665
|
+
border-block-start: 1px solid var(--ol-border);
|
|
666
|
+
padding-inline-start: 0;
|
|
667
|
+
margin-inline-start: 0;
|
|
668
|
+
padding-block-start: 4px;
|
|
669
|
+
margin-block-start: 3px;
|
|
670
|
+
}
|
|
671
|
+
.ol-editor.ol-visual-aids .ol-empty-block {
|
|
672
|
+
outline: 1px dashed var(--ol-border);
|
|
673
|
+
outline-offset: 2px;
|
|
674
|
+
min-height: 1.2em;
|
|
675
|
+
}
|
|
676
|
+
.ol-editor.ol-visual-aids .ol-nbsp {
|
|
677
|
+
background: color-mix(in srgb, var(--ol-accent) 25%, transparent);
|
|
678
|
+
box-shadow: inset 0 -1px 0 var(--ol-accent);
|
|
679
|
+
}
|
|
680
|
+
.ol-editor.ol-visual-aids .ol-hidden-structure {
|
|
681
|
+
outline: 1px dotted var(--ol-accent);
|
|
682
|
+
outline-offset: 2px;
|
|
683
|
+
}
|
|
684
|
+
.ol-editor .ol-noneditable {
|
|
685
|
+
cursor: default;
|
|
686
|
+
background: repeating-linear-gradient(
|
|
687
|
+
-45deg,
|
|
688
|
+
transparent,
|
|
689
|
+
transparent 6px,
|
|
690
|
+
color-mix(in srgb, var(--ol-border) 35%, transparent) 6px,
|
|
691
|
+
color-mix(in srgb, var(--ol-border) 35%, transparent) 7px
|
|
692
|
+
);
|
|
693
|
+
}
|
|
694
|
+
.ol-editor.ol-fullscreen {
|
|
695
|
+
position: fixed;
|
|
696
|
+
inset: 0;
|
|
697
|
+
z-index: 2147483000;
|
|
698
|
+
margin: 0;
|
|
699
|
+
border-radius: 0;
|
|
700
|
+
background: var(--ol-surface);
|
|
701
|
+
display: flex;
|
|
702
|
+
flex-direction: column;
|
|
703
|
+
}
|
|
704
|
+
.ol-editor.ol-fullscreen .ol-content,
|
|
705
|
+
.ol-editor.ol-fullscreen .ol-source {
|
|
706
|
+
flex: 1 1 auto;
|
|
707
|
+
min-height: 0;
|
|
708
|
+
overflow: auto;
|
|
709
|
+
}
|
|
710
|
+
.ol-editor.ol-autoresize .ol-content .ProseMirror {
|
|
711
|
+
overflow: hidden;
|
|
712
|
+
}
|
|
713
|
+
.ol-editor.ol-inline:not(.ol-inline-active) .ol-toolbar,
|
|
714
|
+
.ol-editor.ol-inline:not(.ol-inline-active) .ol-menubar {
|
|
715
|
+
position: absolute;
|
|
716
|
+
width: 1px;
|
|
717
|
+
height: 1px;
|
|
718
|
+
overflow: hidden;
|
|
719
|
+
clip: rect(0 0 0 0);
|
|
720
|
+
clip-path: inset(50%);
|
|
721
|
+
}
|
|
722
|
+
.ol-editor.ol-inline .ol-content {
|
|
723
|
+
border-radius: var(--ol-radius);
|
|
724
|
+
}
|
|
725
|
+
.ol-help-table {
|
|
726
|
+
width: 100%;
|
|
727
|
+
border-collapse: collapse;
|
|
728
|
+
font: inherit;
|
|
729
|
+
}
|
|
730
|
+
.ol-help-table th,
|
|
731
|
+
.ol-help-table td {
|
|
732
|
+
padding: 4px 8px;
|
|
733
|
+
text-align: start;
|
|
734
|
+
vertical-align: top;
|
|
735
|
+
border-bottom: 1px solid var(--openleaf-color-border, #d1d9e0);
|
|
736
|
+
}
|
|
737
|
+
.ol-help-table th {
|
|
738
|
+
font-weight: 600;
|
|
739
|
+
white-space: nowrap;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
/* Coarse pointers get a larger target. WCAG 2.2 SC 2.5.8 asks for 24x24 CSS px
|
|
743
|
+
minimum; 32 clears that on a mouse and 40 is comfortable on a thumb. */
|
|
744
|
+
@media (pointer: coarse) {
|
|
745
|
+
.ol-editor {
|
|
746
|
+
--ol-button-size: var(--openleaf-button-size, 40px);
|
|
747
|
+
--ol-gap: var(--openleaf-gap, 4px);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
@media (prefers-reduced-motion: reduce) {
|
|
752
|
+
.ol-editor .ol-btn {
|
|
753
|
+
transition: none;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/* Forced colours (Windows high contrast) replaces our palette wholesale. The
|
|
758
|
+
pressed state must not depend on a background we no longer control, so it is
|
|
759
|
+
re-expressed as a border, which the mode preserves. */
|
|
760
|
+
@media (forced-colors: active) {
|
|
761
|
+
.ol-editor .ol-btn {
|
|
762
|
+
border-color: ButtonBorder;
|
|
763
|
+
color: ButtonText;
|
|
764
|
+
}
|
|
765
|
+
.ol-editor .ol-btn[aria-pressed="true"] {
|
|
766
|
+
border-color: Highlight;
|
|
767
|
+
color: Highlight;
|
|
768
|
+
box-shadow: none;
|
|
769
|
+
}
|
|
770
|
+
.ol-editor .ol-btn:focus-visible {
|
|
771
|
+
outline-color: Highlight;
|
|
772
|
+
}
|
|
773
|
+
.ol-editor .ol-btn[aria-disabled="true"] {
|
|
774
|
+
color: GrayText;
|
|
775
|
+
opacity: 1;
|
|
776
|
+
}
|
|
777
|
+
.ol-editor .ol-menu-item:focus-visible {
|
|
778
|
+
outline-color: Highlight;
|
|
779
|
+
}
|
|
780
|
+
.ol-editor .ol-menu-item[aria-disabled="true"] {
|
|
781
|
+
color: GrayText;
|
|
782
|
+
opacity: 1;
|
|
783
|
+
}
|
|
784
|
+
.ol-editor .ol-menu-trigger[aria-expanded="true"] {
|
|
785
|
+
border-color: Highlight;
|
|
786
|
+
color: Highlight;
|
|
787
|
+
}
|
|
788
|
+
.ol-editor .ol-content .ProseMirror .selectedCell {
|
|
789
|
+
outline-color: Highlight;
|
|
790
|
+
}
|
|
791
|
+
.ol-editor .ol-content .ProseMirror .selectedCell::after {
|
|
792
|
+
background: transparent;
|
|
793
|
+
}
|
|
794
|
+
.ol-editor .ol-content .ProseMirror .column-resize-handle {
|
|
795
|
+
background: Highlight;
|
|
796
|
+
}
|
|
797
|
+
.ol-editor.ol-visual-aids .ol-nbsp {
|
|
798
|
+
background: transparent;
|
|
799
|
+
box-shadow: inset 0 -2px 0 Highlight;
|
|
800
|
+
}
|
|
801
|
+
.ol-editor.ol-visual-aids .ol-hidden-structure {
|
|
802
|
+
outline-color: Highlight;
|
|
803
|
+
}
|
|
804
|
+
.ol-editor.ol-visual-aids .ol-empty-block {
|
|
805
|
+
outline-color: GrayText;
|
|
806
|
+
}
|
|
807
|
+
.ol-editor .ol-noneditable {
|
|
808
|
+
background: transparent;
|
|
809
|
+
outline: 1px dashed GrayText;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
`;
|
|
813
|
+
//# sourceMappingURL=css.js.map
|