@open-wysiwyg-editor/vue 1.0.1 → 1.0.2

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/dist/style.css CHANGED
@@ -1,7 +1,11 @@
1
1
  /*! open-wysiwyg-editor | MIT License */
2
2
  /*
3
- * Design tokens. Everything lives in the `owe` cascade layer, so any unlayered host CSS wins
4
- * without !important. Override tokens on .owe to theme the editor.
3
+ * Design tokens: the editor's styling API. The defaults below are written as --owe-<name>, but the
4
+ * build renames each declaration to a private --owe-d-<name> and every use to
5
+ * var(--owe-<name>, var(--owe-d-<name>)) (scripts/build-css.mjs). So the editor never declares a public
6
+ * --owe-* property itself, and a token you set always wins: from ui.brand / ui.tokens / setTheme(),
7
+ * the brand and theme attributes, or CSS on .owe, a wrapper or :root, in any cascade layer.
8
+ * Host CSS can't restyle the editor otherwise (see base.css).
5
9
  * Contrast: text >= 4.5:1, borders/focus/states >= 3:1 against --owe-bg (WCAG 1.4.3 / 1.4.11).
6
10
  *
7
11
  * One-color branding. Set --owe-brand (on .owe, a wrapper or :root) and the whole UI follows, in
@@ -26,7 +30,7 @@
26
30
  * --owe-toolbar-bg (--owe-chrome) --owe-toolbar-border (--owe-border-subtle) toolbar, find bar, status bar
27
31
  * --owe-editor-border (--owe-border-subtle) --owe-editor-radius (--owe-radius) the card
28
32
  *
29
- * Other tokens (these are declared below, so set them on .owe):
33
+ * Other tokens (set them anywhere, like the ones above):
30
34
  * --owe-radius card radius (24px) --owe-radius-sm inner controls (10px)
31
35
  * --owe-radius-md menus (12px) --owe-radius-lg dialogs (16px)
32
36
  * --owe-btn-size toolbar button (40px) --owe-pad-x/-y editing-area padding
@@ -36,976 +40,1119 @@
36
40
  * --owe-icon toolbar icon color --owe-backdrop dialog backdrop
37
41
  * Set --owe-font (e.g. "Almarai", system-ui) to change the typeface; no web fonts are bundled.
38
42
  * The JS options `ui.brand` and `ui.tokens` and the <owe-editor brand> attribute set these
39
- * properties on the editor root, so they win over this file without any CSS.
43
+ * properties inline on the editor root.
40
44
  */
41
- @layer owe {
42
- .owe,
43
- .owe-content-root {
44
- --owe-font: system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans Arabic", "Noto Sans", Tahoma, sans-serif;
45
- --owe-font-mono: ui-monospace, "JetBrains Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace;
46
- --owe-font-size: 1rem;
47
- --owe-line-height: 1.65;
48
- --owe-radius: 24px;
49
- --owe-radius-sm: 10px;
50
- --owe-radius-md: 12px;
51
- --owe-radius-lg: 16px;
52
- --owe-space: 8px;
53
- --owe-target: 32px; /* >= 24px (WCAG 2.5.8); 32px is comfortable */
54
- --owe-btn-size: 40px;
55
- --owe-pad-x: clamp(16px, 4vw, 32px);
56
- --owe-pad-y: 28px;
45
+ .owe:not(.\#):not(.\#),
46
+ .owe-content-root:not(.\#):not(.\#) {
47
+ --owe-d-font:
48
+ system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans Arabic", "Noto Sans", Tahoma,
49
+ sans-serif;
50
+ --owe-d-font-mono:
51
+ ui-monospace, "JetBrains Mono", "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace;
52
+ --owe-d-font-size: 1rem;
53
+ --owe-d-line-height: 1.65;
54
+ --owe-d-radius: 24px;
55
+ --owe-d-radius-sm: 10px;
56
+ --owe-d-radius-md: 12px;
57
+ --owe-d-radius-lg: 16px;
58
+ --owe-d-space: 8px;
59
+ --owe-d-target: 32px; /* >= 24px (WCAG 2.5.8); 32px is comfortable */
60
+ --owe-d-btn-size: 40px;
61
+ /* cqi: a share of the editor's own width (its toolbar and editing area are size containers), so the
62
+ padding follows the editor, also when it sits in a narrow column of a wide page. */
63
+ --owe-d-pad-x: clamp(12px, 4cqi, 32px);
64
+ --owe-d-pad-y: clamp(16px, 5cqi, 28px);
57
65
 
58
- --owe-bg: #ffffff;
59
- --owe-chrome: #fafbfc;
60
- --owe-surface: #f4f6f8;
61
- --owe-surface-2: #f1f3f5;
62
- --owe-field-bg: #ffffff;
63
- --owe-text: #101112;
64
- --owe-body: #1b1f24;
65
- --owe-text-2: #3d434a;
66
- --owe-muted: #54595f; /* 7:1 on white */
67
- --owe-icon: #3a3f45;
68
- --owe-border: #8a929a; /* 3.2:1 on white */
69
- --owe-border-subtle: #e3e6ea;
70
- --owe-popup-border: #d5d9de;
71
- --owe-danger: #b3261e;
72
- --owe-warning: #8a5300;
73
- --owe-success: #146c2e;
74
- --owe-code-bg: #f4f6f8;
75
- --owe-mark: #fff2a8;
76
- --owe-shadow: 0 16px 40px rgb(16 17 18 / 0.16), 0 2px 8px rgb(16 17 18 / 0.08);
77
- --owe-backdrop: rgb(16 17 18 / 0.45);
78
- --owe-z-popover: 1000;
66
+ --owe-d-bg: #ffffff;
67
+ --owe-d-chrome: #fafbfc;
68
+ --owe-d-surface: #f4f6f8;
69
+ --owe-d-surface-2: #f1f3f5;
70
+ --owe-d-field-bg: #ffffff;
71
+ --owe-d-text: #101112;
72
+ --owe-d-body: #1b1f24;
73
+ --owe-d-text-2: #3d434a;
74
+ --owe-d-muted: #54595f; /* 7:1 on white */
75
+ --owe-d-icon: #3a3f45;
76
+ --owe-d-border: #8a929a; /* 3.2:1 on white */
77
+ --owe-d-border-subtle: #e3e6ea;
78
+ --owe-d-popup-border: #d5d9de;
79
+ --owe-d-danger: #b3261e;
80
+ --owe-d-warning: #8a5300;
81
+ --owe-d-success: #146c2e;
82
+ --owe-d-code-bg: #f4f6f8;
83
+ --owe-d-mark: #fff2a8;
84
+ --owe-d-shadow: 0 16px 40px rgb(16 17 18 / 0.16), 0 2px 8px rgb(16 17 18 / 0.08);
85
+ --owe-d-backdrop: rgb(16 17 18 / 0.45);
86
+ --owe-d-z-popover: 1000;
79
87
 
80
- /* Brand-derived. --owe-brand / -brand-2 / -on-brand have no declaration here, so they can be set
81
- on any ancestor; the fallbacks are the defaults. */
82
- --owe-gradient: linear-gradient(90deg, var(--owe-brand, #0066ff), var(--owe-brand-2, #00b8ff));
83
- --owe-on-accent: var(--owe-on-brand, #ffffff);
84
- --owe-primary: var(--owe-brand, #0066ff); /* white on #0066ff: 4.8:1 */
85
- --owe-primary-hover: color-mix(in oklab, var(--owe-primary) 85%, black);
86
- --owe-accent: color-mix(in oklab, var(--owe-brand, #0066ff) 70%, black); /* 9.8:1 on white for #0066ff */
87
- --owe-accent-soft: color-mix(in oklab, var(--owe-brand, #0066ff) 18%, var(--owe-bg));
88
- --owe-focus: var(--owe-accent);
89
- --owe-caret: var(--owe-accent);
90
- --owe-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 22%, transparent);
88
+ /* Brand-derived. --owe-brand / -brand-2 / -on-brand have no declaration here, so they can be set
89
+ on any ancestor; the fallbacks are the defaults. */
90
+ --owe-d-gradient: linear-gradient(90deg, var(--owe-brand, #0066ff), var(--owe-brand-2, #00b8ff));
91
+ --owe-d-on-accent: var(--owe-on-brand, #ffffff);
92
+ --owe-d-primary: var(--owe-brand, #0066ff); /* white on #0066ff: 4.8:1 */
93
+ --owe-d-primary-hover: color-mix(in oklab, var(--owe-primary, var(--owe-d-primary)) 85%, black);
94
+ --owe-d-accent: color-mix(
95
+ in oklab,
96
+ var(--owe-brand, #0066ff) 70%,
97
+ black
98
+ ); /* 9.8:1 on white for #0066ff */
99
+ --owe-d-accent-soft: color-mix(in oklab, var(--owe-brand, #0066ff) 18%, var(--owe-bg, var(--owe-d-bg)));
100
+ --owe-d-focus: var(--owe-accent, var(--owe-d-accent));
101
+ --owe-d-caret: var(--owe-accent, var(--owe-d-accent));
102
+ --owe-d-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 22%, transparent);
91
103
 
92
- color-scheme: light;
93
- }
94
-
95
- /* Dark values are listed twice (OS preference, then an explicit data-theme="dark"). Brand-derived
96
- tokens that read --owe-bg or --owe-accent (accent-soft, focus, caret, hover) follow on their own. */
97
- @media (prefers-color-scheme: dark) {
98
- .owe:not([data-theme="light"]),
99
- .owe-content-root:not([data-theme="light"]) {
100
- --owe-bg: #17191b;
101
- --owe-chrome: #131517;
102
- --owe-surface: #1e2124;
103
- --owe-surface-2: #25282b;
104
- --owe-field-bg: #101214;
105
- --owe-text: #ffffff;
106
- --owe-body: #dcdedf;
107
- --owe-text-2: #c3c7cb;
108
- --owe-muted: #a1a7ad;
109
- --owe-icon: #d2d4d5;
110
- --owe-border: #6b7279;
111
- --owe-border-subtle: #25282b;
112
- --owe-popup-border: #33383d;
113
- --owe-accent: color-mix(in oklab, var(--owe-brand, #0066ff) 60%, white); /* 7.5:1 on the dark card */
114
- --owe-danger: #f2b8b5;
115
- --owe-warning: #f6c66b;
116
- --owe-success: #8bd6a0;
117
- --owe-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 45%, transparent);
118
- --owe-code-bg: #0f1112;
119
- --owe-mark: #6b4e00; /* deep amber: body text stays 5.7:1 */
120
- --owe-shadow: 0 16px 40px rgb(0 0 0 / 0.55), 0 2px 8px rgb(0 0 0 / 0.4);
121
- --owe-backdrop: rgb(4 5 16 / 0.65);
122
- color-scheme: dark;
123
- }
124
- }
104
+ color-scheme: light;
105
+ }
125
106
 
126
- .owe[data-theme="dark"],
127
- .owe-content-root[data-theme="dark"] {
128
- --owe-bg: #17191b;
129
- --owe-chrome: #131517;
130
- --owe-surface: #1e2124;
131
- --owe-surface-2: #25282b;
132
- --owe-field-bg: #101214;
133
- --owe-text: #ffffff;
134
- --owe-body: #dcdedf;
135
- --owe-text-2: #c3c7cb;
136
- --owe-muted: #a1a7ad;
137
- --owe-icon: #d2d4d5;
138
- --owe-border: #6b7279;
139
- --owe-border-subtle: #25282b;
140
- --owe-popup-border: #33383d;
141
- --owe-accent: color-mix(in oklab, var(--owe-brand, #0066ff) 60%, white);
142
- --owe-danger: #f2b8b5;
143
- --owe-warning: #f6c66b;
144
- --owe-success: #8bd6a0;
145
- --owe-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 45%, transparent);
146
- --owe-code-bg: #0f1112;
147
- --owe-mark: #6b4e00;
148
- --owe-shadow: 0 16px 40px rgb(0 0 0 / 0.55), 0 2px 8px rgb(0 0 0 / 0.4);
149
- --owe-backdrop: rgb(4 5 16 / 0.65);
107
+ /* Dark values are listed twice (OS preference, then an explicit data-theme="dark"). Brand-derived
108
+ tokens that read --owe-bg or --owe-accent (accent-soft, focus, caret, hover) follow on their own. */
109
+ @media (prefers-color-scheme: dark) {
110
+ .owe:not([data-theme="light"]):not(.\#):not(.\#),
111
+ .owe-content-root:not([data-theme="light"]):not(.\#):not(.\#) {
112
+ --owe-d-bg: #17191b;
113
+ --owe-d-chrome: #131517;
114
+ --owe-d-surface: #1e2124;
115
+ --owe-d-surface-2: #25282b;
116
+ --owe-d-field-bg: #101214;
117
+ --owe-d-text: #ffffff;
118
+ --owe-d-body: #dcdedf;
119
+ --owe-d-text-2: #c3c7cb;
120
+ --owe-d-muted: #a1a7ad;
121
+ --owe-d-icon: #d2d4d5;
122
+ --owe-d-border: #6b7279;
123
+ --owe-d-border-subtle: #25282b;
124
+ --owe-d-popup-border: #33383d;
125
+ --owe-d-accent: color-mix(
126
+ in oklab,
127
+ var(--owe-brand, #0066ff) 60%,
128
+ white
129
+ ); /* 7.5:1 on the dark card */
130
+ --owe-d-danger: #f2b8b5;
131
+ --owe-d-warning: #f6c66b;
132
+ --owe-d-success: #8bd6a0;
133
+ --owe-d-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 45%, transparent);
134
+ --owe-d-code-bg: #0f1112;
135
+ --owe-d-mark: #6b4e00; /* deep amber: body text stays 5.7:1 */
136
+ --owe-d-shadow: 0 16px 40px rgb(0 0 0 / 0.55), 0 2px 8px rgb(0 0 0 / 0.4);
137
+ --owe-d-backdrop: rgb(4 5 16 / 0.65);
150
138
  color-scheme: dark;
151
139
  }
140
+ }
152
141
 
153
- @media (prefers-contrast: more) {
154
- .owe {
155
- --owe-border: currentColor;
156
- --owe-border-subtle: var(--owe-border);
157
- --owe-popup-border: var(--owe-border);
158
- --owe-muted: var(--owe-text);
159
- --owe-text-2: var(--owe-text);
160
- }
161
- }
142
+ .owe[data-theme="dark"]:not(.\#):not(.\#),
143
+ .owe-content-root[data-theme="dark"]:not(.\#):not(.\#) {
144
+ --owe-d-bg: #17191b;
145
+ --owe-d-chrome: #131517;
146
+ --owe-d-surface: #1e2124;
147
+ --owe-d-surface-2: #25282b;
148
+ --owe-d-field-bg: #101214;
149
+ --owe-d-text: #ffffff;
150
+ --owe-d-body: #dcdedf;
151
+ --owe-d-text-2: #c3c7cb;
152
+ --owe-d-muted: #a1a7ad;
153
+ --owe-d-icon: #d2d4d5;
154
+ --owe-d-border: #6b7279;
155
+ --owe-d-border-subtle: #25282b;
156
+ --owe-d-popup-border: #33383d;
157
+ --owe-d-accent: color-mix(in oklab, var(--owe-brand, #0066ff) 60%, white);
158
+ --owe-d-danger: #f2b8b5;
159
+ --owe-d-warning: #f6c66b;
160
+ --owe-d-success: #8bd6a0;
161
+ --owe-d-selection: color-mix(in oklab, var(--owe-brand, #0066ff) 45%, transparent);
162
+ --owe-d-code-bg: #0f1112;
163
+ --owe-d-mark: #6b4e00;
164
+ --owe-d-shadow: 0 16px 40px rgb(0 0 0 / 0.55), 0 2px 8px rgb(0 0 0 / 0.4);
165
+ --owe-d-backdrop: rgb(4 5 16 / 0.65);
166
+ color-scheme: dark;
162
167
  }
163
168
 
164
- @layer owe {
165
- /* ---- shell ---------------------------------------------------------------------------- */
166
- owe-editor {
167
- display: block;
168
- }
169
- .owe {
170
- position: relative;
171
- display: flex;
172
- flex-direction: column;
173
- background: var(--owe-bg);
174
- color: var(--owe-text);
175
- border: 1px solid var(--owe-editor-border, var(--owe-border-subtle));
176
- border-radius: var(--owe-editor-radius, var(--owe-radius));
177
- font-family: var(--owe-font);
178
- min-inline-size: 0;
179
- }
180
- .owe:focus-within {
181
- border-color: color-mix(in srgb, var(--owe-focus) 45%, var(--owe-editor-border, var(--owe-border-subtle)));
182
- }
183
- /* 2px gradient edge along the bottom, following the card's curve; brighter while editing.
184
- Popups are positioned children, so nothing here clips them. */
185
- .owe::after {
186
- content: "";
187
- position: absolute;
188
- inset: -1px;
189
- padding-block-end: 2px;
190
- border-radius: inherit;
191
- background: var(--owe-gradient);
192
- -webkit-mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
193
- -webkit-mask-composite: xor;
194
- mask: linear-gradient(#000 0 0) content-box exclude, linear-gradient(#000 0 0);
195
- mask-composite: exclude;
196
- opacity: 0.55;
197
- pointer-events: none;
198
- transition: opacity 0.2s;
199
- }
200
- .owe:focus-within::after {
201
- opacity: 1;
202
- }
203
- .owe-body {
204
- position: relative;
205
- flex: 1;
206
- min-block-size: 0;
169
+ @media (prefers-contrast: more) {
170
+ .owe:not(.\#):not(.\#) {
171
+ --owe-d-border: currentColor;
172
+ --owe-d-border-subtle: var(--owe-border, var(--owe-d-border));
173
+ --owe-d-popup-border: var(--owe-border, var(--owe-d-border));
174
+ --owe-d-muted: var(--owe-text, var(--owe-d-text));
175
+ --owe-d-text-2: var(--owe-text, var(--owe-d-text));
207
176
  }
177
+ }
208
178
 
209
- /* ---- editing area (ProseMirror requirements + ours) ----------------------------------- */
210
- .owe-content {
211
- position: relative;
212
- min-block-size: 8em;
213
- padding: var(--owe-pad-y) var(--owe-pad-x);
214
- outline: none;
215
- word-wrap: break-word;
216
- white-space: pre-wrap;
217
- white-space: break-spaces;
218
- font-variant-ligatures: none;
219
- font-feature-settings: "liga" 0;
220
- caret-color: var(--owe-caret);
221
- /* Keep the caret clear of the sticky toolbar when scrolling (WCAG 2.4.11). */
222
- scroll-padding-block: 4em;
223
- }
224
- .owe-content:focus-visible {
225
- outline: none; /* the shell shows focus via :focus-within (3:1 border) */
226
- }
227
- .owe-content ::selection {
228
- background: var(--owe-selection);
229
- color: inherit;
230
- }
231
- .owe[data-theme="dark"] .owe-content ::selection {
179
+ /*
180
+ * Isolation. The editor looks the same in any page: host CSS (resets such as Tailwind's preflight,
181
+ * element rules like `button {}` or `h2 {}`, utility classes on an ancestor) doesn't reach into it.
182
+ * Every stylesheet of the editor is unlayered, and the build raises the specificity of every rule by
183
+ * two classes (scripts/build-css.mjs), so only a more
184
+ * specific selector or !important overrides them. Theme the editor through its tokens instead
185
+ * (`ui.brand`, `ui.tokens`, the brand/theme attributes, or --owe-* custom properties), which always win.
186
+ * This file comes first in both bundles: the editor's own rules win ties against it.
187
+ */
188
+ .owe:not(.\#):not(.\#),
189
+ .owe-content-root:not(.\#):not(.\#) {
190
+ box-sizing: border-box;
191
+ font-style: normal;
192
+ font-weight: 400;
193
+ font-variant: normal;
194
+ font-stretch: normal;
195
+ letter-spacing: normal;
196
+ word-spacing: normal;
197
+ text-transform: none;
198
+ text-indent: 0;
199
+ text-align: start;
200
+ text-shadow: none;
201
+ white-space: normal;
202
+ }
203
+ .owe:not(.\#):not(.\#) {
204
+ font-size: var(--owe-font-size, var(--owe-d-font-size));
205
+ line-height: 1.5;
206
+ }
207
+ .owe *:not(.\#):not(.\#),
208
+ .owe-content-root *:not(.\#):not(.\#) {
209
+ box-sizing: border-box;
210
+ margin: 0;
211
+ padding: 0;
212
+ border: 0 solid;
213
+ background: transparent;
214
+ box-shadow: none;
215
+ text-shadow: none;
216
+ font: inherit;
217
+ color: inherit;
218
+ letter-spacing: inherit;
219
+ word-spacing: inherit;
220
+ text-transform: inherit;
221
+ text-indent: 0;
222
+ text-align: inherit;
223
+ text-decoration: none;
224
+ white-space: inherit;
225
+ list-style: inherit;
226
+ vertical-align: baseline;
227
+ float: none;
228
+ }
229
+ .owe :not(.\#):not(.\#)::before,
230
+ .owe :not(.\#):not(.\#)::after,
231
+ .owe-content-root :not(.\#):not(.\#)::before,
232
+ .owe-content-root :not(.\#):not(.\#)::after {
233
+ box-sizing: border-box;
234
+ }
235
+
236
+ /* ---- shell ---------------------------------------------------------------------------- */
237
+ owe-editor:not(.\#):not(.\#) {
238
+ display: block;
239
+ }
240
+ .owe:not(.\#):not(.\#) {
241
+ position: relative;
242
+ display: flex;
243
+ flex-direction: column;
244
+ background: var(--owe-bg, var(--owe-d-bg));
245
+ color: var(--owe-text, var(--owe-d-text));
246
+ border: 1px solid var(--owe-editor-border, var(--owe-border-subtle, var(--owe-d-border-subtle)));
247
+ border-radius: var(--owe-editor-radius, var(--owe-radius, var(--owe-d-radius)));
248
+ font-family: var(--owe-font, var(--owe-d-font));
249
+ min-inline-size: 0;
250
+ }
251
+ .owe:focus-within:not(.\#):not(.\#) {
252
+ border-color: color-mix(
253
+ in srgb,
254
+ var(--owe-focus, var(--owe-d-focus)) 45%,
255
+ var(--owe-editor-border, var(--owe-border-subtle, var(--owe-d-border-subtle)))
256
+ );
257
+ }
258
+ /* 2px gradient edge along the bottom, following the card's curve; brighter while editing.
259
+ Popups are positioned children, so nothing here clips them. */
260
+ .owe:not(.\#):not(.\#)::after {
261
+ content: "";
262
+ position: absolute;
263
+ inset: -1px;
264
+ padding-block-end: 2px;
265
+ border-radius: inherit;
266
+ background: var(--owe-gradient, var(--owe-d-gradient));
267
+ -webkit-mask:
268
+ linear-gradient(#000 0 0) content-box exclude,
269
+ linear-gradient(#000 0 0);
270
+ -webkit-mask-composite: xor;
271
+ mask:
272
+ linear-gradient(#000 0 0) content-box exclude,
273
+ linear-gradient(#000 0 0);
274
+ mask-composite: exclude;
275
+ opacity: 0.55;
276
+ pointer-events: none;
277
+ transition: opacity 0.2s;
278
+ }
279
+ .owe:focus-within:not(.\#):not(.\#)::after {
280
+ opacity: 1;
281
+ }
282
+ .owe-body:not(.\#):not(.\#) {
283
+ position: relative;
284
+ flex: 1;
285
+ min-block-size: 0;
286
+ /* The editing area adapts to the editor's width, not the viewport's (see --owe-pad-x/-y). */
287
+ container: owe-body / inline-size;
288
+ }
289
+
290
+ /* ---- editing area (ProseMirror requirements + ours) ----------------------------------- */
291
+ .owe-content:not(.\#):not(.\#) {
292
+ position: relative;
293
+ min-block-size: 8em;
294
+ padding: var(--owe-pad-y, var(--owe-d-pad-y)) var(--owe-pad-x, var(--owe-d-pad-x));
295
+ outline: none;
296
+ word-wrap: break-word;
297
+ white-space: pre-wrap;
298
+ white-space: break-spaces;
299
+ font-variant-ligatures: none;
300
+ font-feature-settings: "liga" 0;
301
+ caret-color: var(--owe-caret, var(--owe-d-caret));
302
+ /* Keep the caret clear of the sticky toolbar when scrolling (WCAG 2.4.11). */
303
+ scroll-padding-block: 4em;
304
+ }
305
+ .owe-content:focus-visible:not(.\#):not(.\#) {
306
+ outline: none; /* the shell shows focus via :focus-within (3:1 border) */
307
+ }
308
+ .owe-content :not(.\#):not(.\#)::selection {
309
+ background: var(--owe-selection, var(--owe-d-selection));
310
+ color: inherit;
311
+ }
312
+ .owe[data-theme="dark"] .owe-content :not(.\#):not(.\#)::selection {
313
+ color: #fff;
314
+ }
315
+ @media (prefers-color-scheme: dark) {
316
+ .owe:not([data-theme="light"]) .owe-content :not(.\#):not(.\#)::selection {
232
317
  color: #fff;
233
318
  }
234
- @media (prefers-color-scheme: dark) {
235
- .owe:not([data-theme="light"]) .owe-content ::selection {
236
- color: #fff;
237
- }
238
- }
239
- .owe-content pre {
240
- white-space: pre-wrap;
241
- }
242
- .owe-content li {
243
- position: relative;
244
- }
245
- .ProseMirror-hideselection *::selection {
246
- background: transparent;
247
- }
248
- .ProseMirror-hideselection {
249
- caret-color: transparent;
250
- }
251
- .owe-content [draggable][contenteditable="false"] {
252
- user-select: text;
253
- }
254
- .owe-content .ProseMirror-selectednode {
255
- outline: 3px solid var(--owe-focus);
256
- outline-offset: 2px;
257
- }
258
- .owe-content li.ProseMirror-selectednode {
259
- outline: none;
260
- }
261
- .owe-content li.ProseMirror-selectednode::after {
262
- content: "";
263
- position: absolute;
264
- inset-block: -2px;
265
- inset-inline: -32px -2px;
266
- border: 2px solid var(--owe-focus);
267
- pointer-events: none;
268
- }
269
- .owe-content img.ProseMirror-separator {
270
- display: inline !important;
271
- border: none !important;
272
- margin: 0 !important;
273
- }
319
+ }
320
+ .owe-content pre:not(.\#):not(.\#) {
321
+ white-space: pre-wrap;
322
+ }
323
+ .owe-content li:not(.\#):not(.\#) {
324
+ position: relative;
325
+ }
326
+ .ProseMirror-hideselection *:not(.\#):not(.\#)::selection {
327
+ background: transparent;
328
+ }
329
+ .ProseMirror-hideselection:not(.\#):not(.\#) {
330
+ caret-color: transparent;
331
+ }
332
+ .owe-content [draggable][contenteditable="false"]:not(.\#):not(.\#) {
333
+ user-select: text;
334
+ }
335
+ .owe-content .ProseMirror-selectednode:not(.\#):not(.\#) {
336
+ outline: 3px solid var(--owe-focus, var(--owe-d-focus));
337
+ outline-offset: 2px;
338
+ }
339
+ .owe-content li.ProseMirror-selectednode:not(.\#):not(.\#) {
340
+ outline: none;
341
+ }
342
+ .owe-content li.ProseMirror-selectednode:not(.\#):not(.\#)::after {
343
+ content: "";
344
+ position: absolute;
345
+ inset-block: -2px;
346
+ inset-inline: -32px -2px;
347
+ border: 2px solid var(--owe-focus, var(--owe-d-focus));
348
+ pointer-events: none;
349
+ }
350
+ .owe-content img.ProseMirror-separator:not(.\#):not(.\#) {
351
+ display: inline !important;
352
+ border: none !important;
353
+ margin: 0 !important;
354
+ }
274
355
 
275
- /* placeholder (also exposed as aria-placeholder) */
276
- .owe-content .owe-placeholder::before {
277
- content: attr(data-placeholder);
278
- color: var(--owe-muted);
279
- pointer-events: none;
280
- position: absolute;
281
- inset-inline-start: var(--owe-pad-x);
282
- }
356
+ /* placeholder (also exposed as aria-placeholder) */
357
+ .owe-content .owe-placeholder:not(.\#):not(.\#)::before {
358
+ content: attr(data-placeholder);
359
+ color: var(--owe-muted, var(--owe-d-muted));
360
+ pointer-events: none;
361
+ position: absolute;
362
+ inset-inline-start: var(--owe-pad-x, var(--owe-d-pad-x));
363
+ }
283
364
 
284
- /* gap cursor */
285
- .ProseMirror-gapcursor {
286
- display: none;
287
- pointer-events: none;
288
- position: absolute;
289
- }
290
- .ProseMirror-gapcursor::after {
291
- content: "";
292
- display: block;
293
- position: absolute;
294
- top: -2px;
295
- inline-size: 20px;
296
- border-block-start: 2px solid var(--owe-text);
297
- animation: owe-blink 1.1s steps(2, start) infinite;
298
- }
299
- .ProseMirror-focused .ProseMirror-gapcursor {
300
- display: block;
301
- }
302
- @keyframes owe-blink {
303
- to { visibility: hidden; }
304
- }
305
- .owe-dropcursor {
306
- background: var(--owe-accent);
365
+ /* gap cursor */
366
+ .ProseMirror-gapcursor:not(.\#):not(.\#) {
367
+ display: none;
368
+ pointer-events: none;
369
+ position: absolute;
370
+ }
371
+ .ProseMirror-gapcursor:not(.\#):not(.\#)::after {
372
+ content: "";
373
+ display: block;
374
+ position: absolute;
375
+ top: -2px;
376
+ inline-size: 20px;
377
+ border-block-start: 2px solid var(--owe-text, var(--owe-d-text));
378
+ animation: owe-blink 1.1s steps(2, start) infinite;
379
+ }
380
+ .ProseMirror-focused .ProseMirror-gapcursor:not(.\#):not(.\#) {
381
+ display: block;
382
+ }
383
+ @keyframes owe-blink {
384
+ to {
385
+ visibility: hidden;
307
386
  }
387
+ }
388
+ .owe-dropcursor:not(.\#):not(.\#) {
389
+ background: var(--owe-accent, var(--owe-d-accent));
390
+ }
391
+
392
+ /* task items in the editor */
393
+ .owe-task-control:not(.\#):not(.\#) {
394
+ display: inline-flex;
395
+ user-select: none;
396
+ }
397
+
398
+ /* tables in the editor */
399
+ .owe-content .tableWrapper:not(.\#):not(.\#) {
400
+ overflow-x: auto;
401
+ margin-block-end: 0.85em;
402
+ }
403
+ .owe-content table:not(.\#):not(.\#) {
404
+ margin-block-end: 0;
405
+ }
406
+ .owe-content :is(td, th):not(.\#):not(.\#) {
407
+ position: relative;
408
+ }
409
+ .owe-content .selectedCell:not(.\#):not(.\#)::after {
410
+ content: "";
411
+ position: absolute;
412
+ inset: 0;
413
+ background: var(--owe-selection, var(--owe-d-selection));
414
+ opacity: 0.5;
415
+ pointer-events: none;
416
+ }
417
+ .owe-content .column-resize-handle:not(.\#):not(.\#) {
418
+ position: absolute;
419
+ inset-inline-end: -2px;
420
+ inset-block: 0;
421
+ inline-size: 4px;
422
+ background: var(--owe-accent, var(--owe-d-accent));
423
+ pointer-events: none;
424
+ }
425
+ .owe-content.resize-cursor:not(.\#):not(.\#) {
426
+ cursor: col-resize;
427
+ }
308
428
 
309
- /* task items in the editor */
310
- .owe-task-control {
311
- display: inline-flex;
312
- user-select: none;
429
+ /* ---- utilities -------------------------------------------------------------------------- */
430
+ .owe-sr-only:not(.\#):not(.\#) {
431
+ position: absolute !important;
432
+ inline-size: 1px !important;
433
+ block-size: 1px !important;
434
+ padding: 0 !important;
435
+ margin: -1px !important;
436
+ overflow: hidden !important;
437
+ clip-path: inset(50%) !important;
438
+ white-space: nowrap !important;
439
+ border: 0 !important;
440
+ }
441
+
442
+ /* ---- user preferences -------------------------------------------------------------------- */
443
+ @media (prefers-reduced-motion: reduce) {
444
+ .owe *:not(.\#):not(.\#),
445
+ .owe *:not(.\#):not(.\#)::before,
446
+ .owe *:not(.\#):not(.\#)::after {
447
+ animation-duration: 0.01ms !important;
448
+ animation-iteration-count: 1 !important;
449
+ transition-duration: 0.01ms !important;
450
+ scroll-behavior: auto !important;
313
451
  }
452
+ }
314
453
 
315
- /* tables in the editor */
316
- .owe-content .tableWrapper {
317
- overflow-x: auto;
318
- margin-block-end: 0.85em;
454
+ @media (forced-colors: active) {
455
+ .owe:not(.\#):not(.\#) {
456
+ border-color: CanvasText;
319
457
  }
320
- .owe-content table {
321
- margin-block-end: 0;
458
+ .owe:not(.\#):not(.\#)::after {
459
+ display: none;
322
460
  }
323
- .owe-content :is(td, th) {
324
- position: relative;
461
+ .owe:focus-within:not(.\#):not(.\#) {
462
+ outline: 2px solid Highlight;
325
463
  }
326
- .owe-content .selectedCell::after {
327
- content: "";
328
- position: absolute;
329
- inset: 0;
330
- background: var(--owe-selection);
331
- opacity: 0.5;
332
- pointer-events: none;
464
+ .owe-content .ProseMirror-selectednode:not(.\#):not(.\#) {
465
+ outline-color: Highlight;
333
466
  }
334
- .owe-content .column-resize-handle {
335
- position: absolute;
336
- inset-inline-end: -2px;
337
- inset-block: 0;
338
- inline-size: 4px;
339
- background: var(--owe-accent);
340
- pointer-events: none;
467
+ .owe-content .selectedCell:not(.\#):not(.\#)::after {
468
+ background: Highlight;
469
+ forced-color-adjust: none;
341
470
  }
342
- .owe-content.resize-cursor {
343
- cursor: col-resize;
471
+ .owe-content .owe-placeholder:not(.\#):not(.\#)::before {
472
+ color: GrayText;
344
473
  }
474
+ }
345
475
 
346
- /* ---- utilities -------------------------------------------------------------------------- */
347
- .owe-sr-only {
348
- position: absolute !important;
349
- inline-size: 1px !important;
350
- block-size: 1px !important;
351
- padding: 0 !important;
352
- margin: -1px !important;
353
- overflow: hidden !important;
354
- clip-path: inset(50%) !important;
355
- white-space: nowrap !important;
356
- border: 0 !important;
357
- }
476
+ /* ---- toolbar ------------------------------------------------------------------------------ */
477
+ .owe-toolbar-wrap:not(.\#):not(.\#) {
478
+ container: owe-toolbar / inline-size;
479
+ border-block-end: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle, var(--owe-d-border-subtle)));
480
+ background: var(--owe-toolbar-bg, var(--owe-chrome, var(--owe-d-chrome)));
481
+ border-start-start-radius: calc(var(--owe-editor-radius, var(--owe-radius, var(--owe-d-radius))) - 1px);
482
+ border-start-end-radius: calc(var(--owe-editor-radius, var(--owe-radius, var(--owe-d-radius))) - 1px);
483
+ }
484
+ .owe-toolbar-wrap.owe-sticky:not(.\#):not(.\#) {
485
+ position: sticky;
486
+ inset-block-start: 0;
487
+ z-index: 2;
488
+ }
489
+ .owe-toolbar:not(.\#):not(.\#) {
490
+ display: flex;
491
+ flex-wrap: wrap; /* reflows at 320px / 400% zoom without horizontal scrolling (WCAG 1.4.10) */
492
+ align-items: center;
493
+ gap: 4px;
494
+ padding: 12px var(--owe-pad-x, var(--owe-d-pad-x));
495
+ }
496
+ .owe-separator:not(.\#):not(.\#) {
497
+ inline-size: 1px;
498
+ block-size: 24px;
499
+ margin-inline: 6px;
500
+ background: var(--owe-toolbar-border, var(--owe-border-subtle, var(--owe-d-border-subtle)));
501
+ }
358
502
 
359
- /* ---- user preferences -------------------------------------------------------------------- */
360
- @media (prefers-reduced-motion: reduce) {
361
- .owe *,
362
- .owe *::before,
363
- .owe *::after {
364
- animation-duration: 0.01ms !important;
365
- animation-iteration-count: 1 !important;
366
- transition-duration: 0.01ms !important;
367
- scroll-behavior: auto !important;
368
- }
369
- }
503
+ /* ---- buttons ------------------------------------------------------------------------------ */
504
+ .owe-btn:not(.\#):not(.\#) {
505
+ display: inline-flex;
506
+ align-items: center;
507
+ justify-content: center;
508
+ gap: 4px;
509
+ min-inline-size: var(--owe-btn-size, var(--owe-d-btn-size));
510
+ min-block-size: var(--owe-btn-size, var(--owe-d-btn-size));
511
+ padding: 0 8px;
512
+ border: 1px solid transparent;
513
+ border-radius: var(--owe-btn-radius, var(--owe-radius-sm, var(--owe-d-radius-sm)));
514
+ background: var(--owe-btn-bg, transparent);
515
+ color: var(--owe-btn-color, var(--owe-icon, var(--owe-d-icon)));
516
+ font: inherit;
517
+ font-size: 0.875rem;
518
+ line-height: 1;
519
+ cursor: pointer;
520
+ transition:
521
+ background-color 0.12s,
522
+ color 0.12s;
523
+ }
524
+ .owe-btn:hover:not(.\#):not(.\#) {
525
+ background: var(--owe-btn-hover-bg, var(--owe-surface-2, var(--owe-d-surface-2)));
526
+ color: var(--owe-btn-hover-color, var(--owe-text, var(--owe-d-text)));
527
+ }
528
+ .owe-btn:focus-visible:not(.\#):not(.\#),
529
+ .owe-button:focus-visible:not(.\#):not(.\#),
530
+ .owe-menu-item:focus-visible:not(.\#):not(.\#),
531
+ .owe-path-item:focus-visible:not(.\#):not(.\#),
532
+ .owe-input:focus-visible:not(.\#):not(.\#),
533
+ .owe-dialog :is(input, textarea, select):focus-visible:not(.\#):not(.\#) {
534
+ outline: 2px solid var(--owe-focus, var(--owe-d-focus));
535
+ outline-offset: 2px;
536
+ }
537
+ /* Pressed state: shape + colour, never colour alone (WCAG 1.4.1); 3:1 boundary (1.4.11). */
538
+ .owe-btn[aria-pressed="true"]:not(.\#):not(.\#),
539
+ .owe-btn[aria-checked="true"]:not(.\#):not(.\#),
540
+ .owe-btn[aria-expanded="true"]:not(.\#):not(.\#),
541
+ .owe-btn.is-active:not(.\#):not(.\#) {
542
+ background: var(--owe-btn-active-bg, var(--owe-primary, var(--owe-d-primary)));
543
+ color: var(--owe-btn-active-color, var(--owe-on-accent, var(--owe-d-on-accent)));
544
+ }
545
+ .owe-btn[aria-pressed="true"]:hover:not(.\#):not(.\#),
546
+ .owe-btn[aria-checked="true"]:hover:not(.\#):not(.\#),
547
+ .owe-btn[aria-expanded="true"]:hover:not(.\#):not(.\#),
548
+ .owe-btn.is-active:hover:not(.\#):not(.\#) {
549
+ background: var(
550
+ --owe-btn-active-hover-bg,
551
+ color-mix(in oklab, var(--owe-btn-active-bg, var(--owe-primary, var(--owe-d-primary))) 85%, black)
552
+ );
553
+ color: var(--owe-btn-active-color, var(--owe-on-accent, var(--owe-d-on-accent)));
554
+ }
555
+ .owe-btn[aria-disabled="true"]:not(.\#):not(.\#) {
556
+ opacity: 0.45;
557
+ cursor: not-allowed;
558
+ }
559
+ .owe-btn[aria-disabled="true"]:hover:not(.\#):not(.\#) {
560
+ background: var(--owe-btn-bg, transparent);
561
+ }
562
+ .owe-btn-wide:not(.\#):not(.\#) {
563
+ min-inline-size: 9.5em;
564
+ justify-content: space-between;
565
+ }
566
+ .owe-btn-text:not(.\#):not(.\#) {
567
+ white-space: nowrap;
568
+ }
569
+ .owe-icon:not(.\#):not(.\#) {
570
+ inline-size: 20px;
571
+ block-size: 20px;
572
+ flex: none;
573
+ fill: none;
574
+ stroke: currentColor;
575
+ stroke-width: 2;
576
+ stroke-linecap: round;
577
+ stroke-linejoin: round;
578
+ }
579
+ .owe-btn > .owe-icon + .owe-icon:not(.\#):not(.\#) {
580
+ inline-size: 14px;
581
+ block-size: 14px;
582
+ opacity: 0.8;
583
+ }
584
+ [dir="rtl"] .owe-flip:not(.\#):not(.\#) {
585
+ transform: scaleX(-1);
586
+ }
370
587
 
371
- @media (forced-colors: active) {
372
- .owe {
373
- border-color: CanvasText;
374
- }
375
- .owe::after {
376
- display: none;
377
- }
378
- .owe:focus-within {
379
- outline: 2px solid Highlight;
380
- }
381
- .owe-content .ProseMirror-selectednode {
382
- outline-color: Highlight;
383
- }
384
- .owe-content .selectedCell::after {
385
- background: Highlight;
386
- forced-color-adjust: none;
387
- }
388
- .owe-content .owe-placeholder::before {
389
- color: GrayText;
390
- }
391
- }
588
+ .owe-button:not(.\#):not(.\#) {
589
+ min-block-size: 38px;
590
+ padding: 0 16px;
591
+ border: 1px solid var(--owe-popup-border, var(--owe-d-popup-border));
592
+ border-radius: var(--owe-btn-radius, var(--owe-radius-sm, var(--owe-d-radius-sm)));
593
+ background: var(--owe-surface-2, var(--owe-d-surface-2));
594
+ color: var(--owe-text, var(--owe-d-text));
595
+ font: inherit;
596
+ font-size: 0.875rem;
597
+ font-weight: 600;
598
+ cursor: pointer;
599
+ transition: background-color 0.12s;
600
+ }
601
+ .owe-button:hover:not(.\#):not(.\#) {
602
+ background: var(--owe-border-subtle, var(--owe-d-border-subtle));
603
+ }
604
+ .owe-button-primary:not(.\#):not(.\#) {
605
+ background: var(--owe-btn-primary-bg, var(--owe-primary, var(--owe-d-primary)));
606
+ border-color: var(--owe-btn-primary-bg, var(--owe-primary, var(--owe-d-primary)));
607
+ color: var(--owe-btn-primary-color, var(--owe-on-accent, var(--owe-d-on-accent)));
608
+ }
609
+ .owe-button-primary:hover:not(.\#):not(.\#) {
610
+ background: var(--owe-btn-primary-hover-bg, var(--owe-primary-hover, var(--owe-d-primary-hover)));
611
+ border-color: var(--owe-btn-primary-hover-bg, var(--owe-primary-hover, var(--owe-d-primary-hover)));
612
+ }
613
+ .owe-button-danger:not(.\#):not(.\#) {
614
+ color: var(--owe-danger, var(--owe-d-danger));
615
+ border-color: var(--owe-danger, var(--owe-d-danger));
616
+ margin-inline-end: auto;
617
+ }
618
+ .owe-button[aria-disabled="true"]:not(.\#):not(.\#) {
619
+ opacity: 0.45;
620
+ cursor: not-allowed;
392
621
  }
393
622
 
394
- @layer owe {
395
- /* ---- toolbar ------------------------------------------------------------------------------ */
396
- .owe-toolbar-wrap {
397
- border-block-end: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle));
398
- background: var(--owe-toolbar-bg, var(--owe-chrome));
399
- border-start-start-radius: calc(var(--owe-editor-radius, var(--owe-radius)) - 1px);
400
- border-start-end-radius: calc(var(--owe-editor-radius, var(--owe-radius)) - 1px);
401
- }
402
- .owe-toolbar-wrap.owe-sticky {
403
- position: sticky;
404
- inset-block-start: 0;
405
- z-index: 2;
406
- }
407
- .owe-toolbar {
408
- display: flex;
409
- flex-wrap: wrap; /* reflows at 320px / 400% zoom without horizontal scrolling (WCAG 1.4.10) */
410
- align-items: center;
411
- gap: 4px;
412
- padding: 12px var(--owe-pad-x);
413
- }
414
- .owe-separator {
415
- inline-size: 1px;
416
- block-size: 24px;
417
- margin-inline: 6px;
418
- background: var(--owe-toolbar-border, var(--owe-border-subtle));
419
- }
623
+ /* ---- menus --------------------------------------------------------------------------------- */
624
+ .owe-menu:not(.\#):not(.\#) {
625
+ z-index: var(--owe-z-popover, var(--owe-d-z-popover));
626
+ min-inline-size: min(200px, calc(100vw - 16px));
627
+ max-inline-size: calc(100vw - 16px);
628
+ max-block-size: min(70vh, 480px);
629
+ overflow-y: auto;
630
+ padding: 6px;
631
+ background: var(--owe-surface, var(--owe-d-surface));
632
+ color: var(--owe-text, var(--owe-d-text));
633
+ border: 1px solid var(--owe-popup-border, var(--owe-d-popup-border));
634
+ border-radius: var(--owe-radius-md, var(--owe-d-radius-md));
635
+ box-shadow: var(--owe-shadow, var(--owe-d-shadow));
636
+ font-family: var(--owe-font, var(--owe-d-font));
637
+ font-size: 0.875rem;
638
+ }
639
+ .owe-menu-item:not(.\#):not(.\#) {
640
+ display: flex;
641
+ align-items: center;
642
+ gap: 8px;
643
+ min-block-size: var(--owe-target, var(--owe-d-target));
644
+ padding-block: 4px;
645
+ padding-inline: 8px 12px;
646
+ border-radius: var(--owe-btn-radius, 8px);
647
+ cursor: pointer;
648
+ outline-offset: -2px;
649
+ }
650
+ .owe-menu-item[aria-checked="true"]:not(.\#):not(.\#),
651
+ .owe-menu-item[aria-current="true"]:not(.\#):not(.\#) {
652
+ color: var(--owe-accent, var(--owe-d-accent));
653
+ font-weight: 600;
654
+ }
655
+ .owe-menu-item:focus:not(.\#):not(.\#),
656
+ .owe-menu-item:hover:not(.\#):not(.\#) {
657
+ background: var(--owe-btn-hover-bg, var(--owe-surface-2, var(--owe-d-surface-2)));
658
+ }
659
+ .owe-menu-item[aria-disabled="true"]:not(.\#):not(.\#) {
660
+ opacity: 0.45;
661
+ cursor: not-allowed;
662
+ }
663
+ .owe-menu-check:not(.\#):not(.\#) {
664
+ display: inline-flex;
665
+ inline-size: 18px;
666
+ }
667
+ .owe-menu-label:not(.\#):not(.\#) {
668
+ flex: 1;
669
+ }
670
+ .owe-menu-shortcut:not(.\#):not(.\#) {
671
+ color: var(--owe-muted, var(--owe-d-muted));
672
+ font-size: 0.8em;
673
+ direction: ltr;
674
+ }
675
+ .owe-menu-separator:not(.\#):not(.\#) {
676
+ block-size: 1px;
677
+ margin: 4px 0;
678
+ background: var(--owe-border-subtle, var(--owe-d-border-subtle));
679
+ }
420
680
 
421
- /* ---- buttons ------------------------------------------------------------------------------ */
422
- .owe-btn {
423
- display: inline-flex;
424
- align-items: center;
425
- justify-content: center;
426
- gap: 4px;
427
- min-inline-size: var(--owe-btn-size);
428
- min-block-size: var(--owe-btn-size);
429
- padding: 0 8px;
430
- border: 1px solid transparent;
431
- border-radius: var(--owe-btn-radius, var(--owe-radius-sm));
432
- background: var(--owe-btn-bg, transparent);
433
- color: var(--owe-btn-color, var(--owe-icon));
434
- font: inherit;
435
- font-size: 0.875rem;
436
- line-height: 1;
437
- cursor: pointer;
438
- transition: background-color 0.12s, color 0.12s;
439
- }
440
- .owe-btn:hover {
441
- background: var(--owe-btn-hover-bg, var(--owe-surface-2));
442
- color: var(--owe-btn-hover-color, var(--owe-text));
443
- }
444
- .owe-btn:focus-visible,
445
- .owe-button:focus-visible,
446
- .owe-menu-item:focus-visible,
447
- .owe-path-item:focus-visible,
448
- .owe-input:focus-visible,
449
- .owe-dialog :is(input, textarea, select):focus-visible {
450
- outline: 2px solid var(--owe-focus);
451
- outline-offset: 2px;
452
- }
453
- /* Pressed state: shape + colour, never colour alone (WCAG 1.4.1); 3:1 boundary (1.4.11). */
454
- .owe-btn[aria-pressed="true"],
455
- .owe-btn[aria-checked="true"],
456
- .owe-btn[aria-expanded="true"],
457
- .owe-btn.is-active {
458
- background: var(--owe-btn-active-bg, var(--owe-primary));
459
- color: var(--owe-btn-active-color, var(--owe-on-accent));
460
- }
461
- .owe-btn[aria-pressed="true"]:hover,
462
- .owe-btn[aria-checked="true"]:hover,
463
- .owe-btn[aria-expanded="true"]:hover,
464
- .owe-btn.is-active:hover {
465
- background: var(--owe-btn-active-hover-bg, color-mix(in oklab, var(--owe-btn-active-bg, var(--owe-primary)) 85%, black));
466
- color: var(--owe-btn-active-color, var(--owe-on-accent));
467
- }
468
- .owe-btn[aria-disabled="true"] {
469
- opacity: 0.45;
470
- cursor: not-allowed;
471
- }
472
- .owe-btn[aria-disabled="true"]:hover {
473
- background: var(--owe-btn-bg, transparent);
474
- }
475
- .owe-btn-wide {
476
- min-inline-size: 9.5em;
477
- justify-content: space-between;
478
- }
479
- .owe-btn-text {
480
- white-space: nowrap;
481
- }
482
- .owe-icon {
483
- inline-size: 20px;
484
- block-size: 20px;
485
- flex: none;
486
- fill: none;
487
- stroke: currentColor;
488
- stroke-width: 2;
489
- stroke-linecap: round;
490
- stroke-linejoin: round;
491
- }
492
- .owe-btn > .owe-icon + .owe-icon {
493
- inline-size: 14px;
494
- block-size: 14px;
495
- opacity: 0.8;
496
- }
497
- [dir="rtl"] .owe-flip {
498
- transform: scaleX(-1);
499
- }
681
+ /* ---- tooltip ------------------------------------------------------------------------------- */
682
+ .owe-tooltip:not(.\#):not(.\#) {
683
+ z-index: calc(var(--owe-z-popover, var(--owe-d-z-popover)) + 1);
684
+ max-inline-size: 260px;
685
+ padding: 4px 8px;
686
+ border-radius: 8px;
687
+ background: var(--owe-text, var(--owe-d-text));
688
+ color: var(--owe-bg, var(--owe-d-bg));
689
+ font-family: var(--owe-font, var(--owe-d-font));
690
+ font-size: 0.8125rem;
691
+ line-height: 1.4;
692
+ }
500
693
 
501
- .owe-button {
502
- min-block-size: 38px;
503
- padding: 0 16px;
504
- border: 1px solid var(--owe-popup-border);
505
- border-radius: var(--owe-btn-radius, var(--owe-radius-sm));
506
- background: var(--owe-surface-2);
507
- color: var(--owe-text);
508
- font: inherit;
509
- font-size: 0.875rem;
510
- font-weight: 600;
511
- cursor: pointer;
512
- transition: background-color 0.12s;
513
- }
514
- .owe-button:hover {
515
- background: var(--owe-border-subtle);
516
- }
517
- .owe-button-primary {
518
- background: var(--owe-btn-primary-bg, var(--owe-primary));
519
- border-color: var(--owe-btn-primary-bg, var(--owe-primary));
520
- color: var(--owe-btn-primary-color, var(--owe-on-accent));
521
- }
522
- .owe-button-primary:hover {
523
- background: var(--owe-btn-primary-hover-bg, var(--owe-primary-hover));
524
- border-color: var(--owe-btn-primary-hover-bg, var(--owe-primary-hover));
525
- }
526
- .owe-button-danger {
527
- color: var(--owe-danger);
528
- border-color: var(--owe-danger);
529
- margin-inline-end: auto;
530
- }
531
- .owe-button[aria-disabled="true"] {
532
- opacity: 0.45;
533
- cursor: not-allowed;
534
- }
694
+ /* ---- dialogs ------------------------------------------------------------------------------- */
695
+ .owe-dialog:not(.\#):not(.\#) {
696
+ /* Centered explicitly: CSS resets (Tailwind preflight, normalize) set margin: 0 on every element,
697
+ which removes the browser's margin: auto centering of a modal <dialog>. */
698
+ position: fixed;
699
+ inset: 50% auto auto 50%;
700
+ translate: -50% -50%;
701
+ margin: 0;
702
+ inline-size: min(440px, calc(100vw - 32px));
703
+ max-block-size: calc(100vh - 32px);
704
+ max-block-size: calc(100dvh - 32px); /* mobile browsers: excludes the browser bars */
705
+ padding: 0;
706
+ container: owe-dialog / inline-size;
707
+ border: 1px solid var(--owe-popup-border, var(--owe-d-popup-border));
708
+ border-radius: var(--owe-radius-lg, var(--owe-d-radius-lg));
709
+ background: var(--owe-surface, var(--owe-d-surface));
710
+ color: var(--owe-text, var(--owe-d-text));
711
+ box-shadow: var(--owe-shadow, var(--owe-d-shadow));
712
+ font-family: var(--owe-font, var(--owe-d-font));
713
+ }
714
+ .owe-dialog-wide:not(.\#):not(.\#) {
715
+ inline-size: min(640px, calc(100vw - 32px));
716
+ }
717
+ .owe-dialog:not(.\#):not(.\#)::backdrop {
718
+ background: var(--owe-backdrop, var(--owe-d-backdrop));
719
+ }
720
+ .owe-dialog-form:not(.\#):not(.\#) {
721
+ display: flex;
722
+ flex-direction: column;
723
+ max-block-size: calc(100vh - 34px);
724
+ }
725
+ .owe-dialog-header:not(.\#):not(.\#) {
726
+ display: flex;
727
+ align-items: center;
728
+ justify-content: space-between;
729
+ gap: 8px;
730
+ padding: 18px 16px 6px 24px;
731
+ padding-inline: 24px 16px;
732
+ }
733
+ .owe-dialog-title:not(.\#):not(.\#) {
734
+ margin: 0;
735
+ font-size: 1.1875rem;
736
+ font-weight: 700;
737
+ letter-spacing: -0.01em;
738
+ }
739
+ .owe-dialog:lang(ar) .owe-dialog-title:not(.\#):not(.\#),
740
+ .owe-dialog[dir="rtl"] .owe-dialog-title:not(.\#):not(.\#) {
741
+ letter-spacing: 0;
742
+ }
743
+ .owe-dialog-body:not(.\#):not(.\#) {
744
+ padding: 10px 24px;
745
+ overflow-y: auto;
746
+ }
747
+ .owe-dialog-body > p:not(.\#):not(.\#) {
748
+ margin-block-end: 0.75em;
749
+ }
750
+ .owe-dialog :not(.\#):not(.\#)::placeholder {
751
+ color: var(--owe-muted, var(--owe-d-muted));
752
+ opacity: 1;
753
+ }
754
+ .owe-dialog-actions:not(.\#):not(.\#) {
755
+ display: flex;
756
+ flex-wrap: wrap;
757
+ justify-content: flex-end;
758
+ gap: 8px;
759
+ padding: 14px 24px 20px;
760
+ border-block-start: 1px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
761
+ }
762
+ .owe-field:not(.\#):not(.\#) {
763
+ display: flex;
764
+ flex-direction: column;
765
+ gap: 4px;
766
+ margin-block-end: 14px;
767
+ }
768
+ .owe-field-row:not(.\#):not(.\#) {
769
+ display: flex;
770
+ gap: 12px;
771
+ }
772
+ .owe-field-row > .owe-field:not(.\#):not(.\#) {
773
+ flex: 1;
774
+ }
775
+ .owe-field-check:not(.\#):not(.\#) {
776
+ flex-direction: row;
777
+ flex-wrap: wrap;
778
+ align-items: center;
779
+ gap: 8px;
780
+ }
781
+ .owe-field-check > input:not(.\#):not(.\#) {
782
+ inline-size: 18px;
783
+ block-size: 18px;
784
+ margin: 0;
785
+ accent-color: var(--owe-accent, var(--owe-d-accent));
786
+ }
787
+ .owe-label:not(.\#):not(.\#) {
788
+ font-size: 0.875rem;
789
+ font-weight: 600;
790
+ }
791
+ .owe-required:not(.\#):not(.\#) {
792
+ font-weight: 400;
793
+ color: var(--owe-muted, var(--owe-d-muted));
794
+ }
795
+ .owe-dialog :is(input[type="text"], input[type="number"], input:not([type]), textarea, select):not(.\#):not(.\#),
796
+ .owe-input:not(.\#):not(.\#) {
797
+ min-block-size: 40px;
798
+ padding: 6px 12px;
799
+ border: 1px solid var(--owe-border, var(--owe-d-border));
800
+ border-radius: var(--owe-radius-sm, var(--owe-d-radius-sm));
801
+ background: var(--owe-field-bg, var(--owe-d-field-bg));
802
+ color: var(--owe-text, var(--owe-d-text));
803
+ font: inherit;
804
+ font-size: 0.9375rem;
805
+ }
806
+ .owe-dialog :is(input, textarea, select):focus-visible:not(.\#):not(.\#),
807
+ .owe-input:focus-visible:not(.\#):not(.\#) {
808
+ border-color: var(--owe-focus, var(--owe-d-focus));
809
+ }
810
+ .owe-dialog textarea:not(.\#):not(.\#) {
811
+ resize: vertical;
812
+ }
813
+ .owe-dialog :is(input, textarea):disabled:not(.\#):not(.\#) {
814
+ opacity: 0.55;
815
+ }
816
+ .owe-dialog [aria-invalid="true"]:not(.\#):not(.\#) {
817
+ border-color: var(--owe-danger, var(--owe-d-danger));
818
+ border-width: 2px;
819
+ }
820
+ .owe-field-help:not(.\#):not(.\#) {
821
+ color: var(--owe-muted, var(--owe-d-muted));
822
+ font-size: 0.8125rem;
823
+ }
824
+ .owe-field-error:not(.\#):not(.\#) {
825
+ color: var(--owe-danger, var(--owe-d-danger));
826
+ font-size: 0.8125rem;
827
+ font-weight: 600;
828
+ }
829
+ .owe-field-error:not(.\#):not(.\#)::before {
830
+ content: "⚠ ";
831
+ }
832
+ .owe-dialog-form[aria-busy="true"]:not(.\#):not(.\#) {
833
+ cursor: progress;
834
+ }
835
+ .owe-shortcuts:not(.\#):not(.\#) {
836
+ inline-size: 100%;
837
+ border-collapse: collapse;
838
+ margin-block: 8px 16px;
839
+ font-size: 0.875rem;
840
+ }
841
+ .owe-shortcuts caption:not(.\#):not(.\#) {
842
+ text-align: start;
843
+ font-weight: 700;
844
+ padding-block: 4px;
845
+ }
846
+ .owe-shortcuts :is(th, td):not(.\#):not(.\#) {
847
+ text-align: start;
848
+ padding: 6px 4px;
849
+ border-block-end: 1px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
850
+ }
851
+ .owe-shortcuts tbody th:not(.\#):not(.\#) {
852
+ font-weight: 400;
853
+ }
854
+ .owe-shortcuts kbd:not(.\#):not(.\#) {
855
+ font-family: var(--owe-font-mono, var(--owe-d-font-mono));
856
+ font-size: 0.8125rem;
857
+ padding: 2px 6px;
858
+ border: 1px solid var(--owe-border, var(--owe-d-border));
859
+ border-radius: 6px;
860
+ background: var(--owe-surface-2, var(--owe-d-surface-2));
861
+ white-space: nowrap;
862
+ }
535
863
 
536
- /* ---- menus --------------------------------------------------------------------------------- */
537
- .owe-menu {
538
- z-index: var(--owe-z-popover);
539
- min-inline-size: 200px;
540
- max-block-size: min(70vh, 480px);
541
- overflow-y: auto;
542
- padding: 6px;
543
- background: var(--owe-surface);
544
- color: var(--owe-text);
545
- border: 1px solid var(--owe-popup-border);
546
- border-radius: var(--owe-radius-md);
547
- box-shadow: var(--owe-shadow);
548
- font-family: var(--owe-font);
549
- font-size: 0.875rem;
550
- }
551
- .owe-menu-item {
552
- display: flex;
553
- align-items: center;
554
- gap: 8px;
555
- min-block-size: var(--owe-target);
556
- padding-block: 4px;
557
- padding-inline: 8px 12px;
558
- border-radius: var(--owe-btn-radius, 8px);
559
- cursor: pointer;
560
- outline-offset: -2px;
561
- }
562
- .owe-menu-item[aria-checked="true"],
563
- .owe-menu-item[aria-current="true"] {
564
- color: var(--owe-accent);
565
- font-weight: 600;
566
- }
567
- .owe-menu-item:focus,
568
- .owe-menu-item:hover {
569
- background: var(--owe-btn-hover-bg, var(--owe-surface-2));
570
- }
571
- .owe-menu-item[aria-disabled="true"] {
572
- opacity: 0.45;
573
- cursor: not-allowed;
574
- }
575
- .owe-menu-check {
576
- display: inline-flex;
577
- inline-size: 18px;
578
- }
579
- .owe-menu-label {
580
- flex: 1;
581
- }
582
- .owe-menu-shortcut {
583
- color: var(--owe-muted);
584
- font-size: 0.8em;
585
- direction: ltr;
586
- }
587
- .owe-menu-separator {
588
- block-size: 1px;
589
- margin: 4px 0;
590
- background: var(--owe-border-subtle);
591
- }
864
+ /* ---- find & replace -------------------------------------------------------------------------- */
865
+ .owe-findbar:not(.\#):not(.\#) {
866
+ display: flex;
867
+ flex-direction: column;
868
+ gap: 6px;
869
+ padding: 12px var(--owe-pad-x, var(--owe-d-pad-x));
870
+ border-block-end: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle, var(--owe-d-border-subtle)));
871
+ background: var(--owe-toolbar-bg, var(--owe-chrome, var(--owe-d-chrome)));
872
+ font-size: 0.875rem;
873
+ }
874
+ .owe-findbar[hidden]:not(.\#):not(.\#) {
875
+ display: none;
876
+ }
877
+ .owe-find-row:not(.\#):not(.\#) {
878
+ display: flex;
879
+ flex-wrap: wrap;
880
+ align-items: center;
881
+ gap: 6px;
882
+ }
883
+ .owe-find-label:not(.\#):not(.\#) {
884
+ min-inline-size: 6.5em;
885
+ font-weight: 600;
886
+ }
887
+ .owe-find-row .owe-input:not(.\#):not(.\#) {
888
+ flex: 1 1 12em;
889
+ min-inline-size: 8em;
890
+ }
891
+ .owe-find-status:not(.\#):not(.\#) {
892
+ min-inline-size: 6em;
893
+ color: var(--owe-muted, var(--owe-d-muted));
894
+ font-variant-numeric: tabular-nums;
895
+ }
896
+ .owe-check:not(.\#):not(.\#) {
897
+ display: inline-flex;
898
+ align-items: center;
899
+ gap: 4px;
900
+ min-block-size: var(--owe-target, var(--owe-d-target));
901
+ }
902
+ .owe-check input:not(.\#):not(.\#) {
903
+ inline-size: 16px;
904
+ block-size: 16px;
905
+ accent-color: var(--owe-accent, var(--owe-d-accent));
906
+ }
907
+ .owe-content .owe-find-match:not(.\#):not(.\#) {
908
+ background: var(--owe-mark, var(--owe-d-mark));
909
+ border-radius: 2px;
910
+ box-shadow: 0 0 0 1px var(--owe-warning, var(--owe-d-warning));
911
+ }
912
+ .owe-content .owe-find-current:not(.\#):not(.\#) {
913
+ background: var(--owe-primary, var(--owe-d-primary));
914
+ color: var(--owe-on-accent, var(--owe-d-on-accent));
915
+ box-shadow: 0 0 0 2px var(--owe-primary, var(--owe-d-primary));
916
+ }
592
917
 
593
- /* ---- tooltip ------------------------------------------------------------------------------- */
594
- .owe-tooltip {
595
- z-index: calc(var(--owe-z-popover) + 1);
596
- max-inline-size: 260px;
597
- padding: 4px 8px;
598
- border-radius: 8px;
599
- background: var(--owe-text);
600
- color: var(--owe-bg);
601
- font-family: var(--owe-font);
602
- font-size: 0.8125rem;
603
- line-height: 1.4;
604
- }
918
+ /* ---- status bar ------------------------------------------------------------------------------ */
919
+ .owe-statusbar:not(.\#):not(.\#) {
920
+ display: flex;
921
+ flex-wrap: wrap;
922
+ align-items: center;
923
+ justify-content: space-between;
924
+ gap: 4px 16px;
925
+ padding: 10px var(--owe-pad-x, var(--owe-d-pad-x)) 12px;
926
+ border-block-start: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle, var(--owe-d-border-subtle)));
927
+ background: var(--owe-toolbar-bg, var(--owe-chrome, var(--owe-d-chrome)));
928
+ border-end-start-radius: calc(var(--owe-editor-radius, var(--owe-radius, var(--owe-d-radius))) - 1px);
929
+ border-end-end-radius: calc(var(--owe-editor-radius, var(--owe-radius, var(--owe-d-radius))) - 1px);
930
+ color: var(--owe-muted, var(--owe-d-muted));
931
+ font-family: var(--owe-font-mono, var(--owe-d-font-mono));
932
+ font-size: 0.8125rem;
933
+ line-height: 1.4;
934
+ min-block-size: var(--owe-target, var(--owe-d-target));
935
+ }
936
+ .owe-path:not(.\#):not(.\#) {
937
+ display: flex;
938
+ flex-wrap: wrap;
939
+ align-items: center;
940
+ list-style: none;
941
+ margin: 0;
942
+ padding: 0;
943
+ }
944
+ .owe-path li + li:not(.\#):not(.\#)::before {
945
+ content: "›";
946
+ padding-inline: 2px;
947
+ color: var(--owe-muted, var(--owe-d-muted));
948
+ }
949
+ [dir="rtl"] .owe-path li + li:not(.\#):not(.\#)::before {
950
+ content: "‹";
951
+ }
952
+ .owe-path-item:not(.\#):not(.\#) {
953
+ min-block-size: 24px;
954
+ padding: 2px 6px;
955
+ border: 0;
956
+ border-radius: var(--owe-btn-radius, 6px);
957
+ background: transparent;
958
+ color: inherit;
959
+ font: inherit;
960
+ cursor: pointer;
961
+ }
962
+ .owe-path-item:hover:not(.\#):not(.\#) {
963
+ background: var(--owe-btn-hover-bg, var(--owe-surface-2, var(--owe-d-surface-2)));
964
+ color: var(--owe-btn-hover-color, var(--owe-text, var(--owe-d-text)));
965
+ }
966
+ .owe-path-item[aria-current]:not(.\#):not(.\#) {
967
+ color: var(--owe-accent, var(--owe-d-accent));
968
+ font-weight: 700;
969
+ }
970
+ .owe-statusbar:lang(ar):not(.\#):not(.\#),
971
+ [dir="rtl"] .owe-statusbar:not(.\#):not(.\#) {
972
+ font-family: var(--owe-font, var(--owe-d-font));
973
+ }
974
+ .owe-counts:not(.\#):not(.\#) {
975
+ font-variant-numeric: tabular-nums;
976
+ direction: ltr;
977
+ }
605
978
 
606
- /* ---- dialogs ------------------------------------------------------------------------------- */
607
- .owe-dialog {
608
- /* Centered explicitly: CSS resets (Tailwind preflight, normalize) set margin: 0 on every element,
609
- which removes the browser's margin: auto centering of a modal <dialog>. */
610
- position: fixed;
611
- inset: 50% auto auto 50%;
612
- translate: -50% -50%;
613
- margin: 0;
614
- inline-size: min(440px, calc(100vw - 32px));
615
- max-block-size: calc(100vh - 32px);
616
- padding: 0;
617
- border: 1px solid var(--owe-popup-border);
618
- border-radius: var(--owe-radius-lg);
619
- background: var(--owe-surface);
620
- color: var(--owe-text);
621
- box-shadow: var(--owe-shadow);
622
- font-family: var(--owe-font);
623
- }
624
- .owe-dialog-wide {
625
- inline-size: min(640px, calc(100vw - 32px));
626
- }
627
- .owe-dialog::backdrop {
628
- background: var(--owe-backdrop, rgb(0 0 0 / 0.45));
629
- }
630
- .owe-dialog-form {
631
- display: flex;
632
- flex-direction: column;
633
- max-block-size: calc(100vh - 34px);
634
- }
635
- .owe-dialog-header {
636
- display: flex;
637
- align-items: center;
638
- justify-content: space-between;
639
- gap: 8px;
640
- padding: 18px 16px 6px 24px;
641
- padding-inline: 24px 16px;
642
- }
643
- .owe-dialog-title {
644
- margin: 0;
645
- font-size: 1.1875rem;
646
- font-weight: 700;
647
- letter-spacing: -0.01em;
648
- }
649
- .owe-dialog:lang(ar) .owe-dialog-title,
650
- .owe-dialog[dir="rtl"] .owe-dialog-title {
651
- letter-spacing: 0;
652
- }
653
- .owe-dialog-body {
654
- padding: 10px 24px;
655
- overflow-y: auto;
656
- }
657
- .owe-dialog-actions {
658
- display: flex;
659
- flex-wrap: wrap;
660
- justify-content: flex-end;
661
- gap: 8px;
662
- padding: 14px 24px 20px;
663
- border-block-start: 1px solid var(--owe-border-subtle);
664
- }
665
- .owe-field {
666
- display: flex;
667
- flex-direction: column;
668
- gap: 4px;
669
- margin-block-end: 14px;
670
- }
671
- .owe-field-row {
672
- display: flex;
673
- gap: 12px;
674
- }
675
- .owe-field-row > .owe-field {
676
- flex: 1;
677
- }
678
- .owe-field-check {
679
- flex-direction: row;
680
- flex-wrap: wrap;
681
- align-items: center;
682
- gap: 8px;
683
- }
684
- .owe-field-check > input {
685
- inline-size: 18px;
686
- block-size: 18px;
687
- margin: 0;
688
- accent-color: var(--owe-accent);
689
- }
690
- .owe-label {
691
- font-size: 0.875rem;
692
- font-weight: 600;
693
- }
694
- .owe-required {
695
- font-weight: 400;
696
- color: var(--owe-muted);
697
- }
698
- .owe-dialog :is(input[type="text"], input[type="number"], input:not([type]), textarea, select),
699
- .owe-input {
700
- min-block-size: 40px;
701
- padding: 6px 12px;
702
- border: 1px solid var(--owe-border);
703
- border-radius: var(--owe-radius-sm);
704
- background: var(--owe-field-bg);
705
- color: var(--owe-text);
706
- font: inherit;
707
- font-size: 0.9375rem;
708
- }
709
- .owe-dialog :is(input, textarea, select):focus-visible,
710
- .owe-input:focus-visible {
711
- border-color: var(--owe-focus);
712
- }
713
- .owe-dialog textarea {
714
- resize: vertical;
715
- }
716
- .owe-dialog :is(input, textarea):disabled {
717
- opacity: 0.55;
718
- }
719
- .owe-dialog [aria-invalid="true"] {
720
- border-color: var(--owe-danger);
721
- border-width: 2px;
722
- }
723
- .owe-field-help {
724
- color: var(--owe-muted);
725
- font-size: 0.8125rem;
726
- }
727
- .owe-field-error {
728
- color: var(--owe-danger);
729
- font-size: 0.8125rem;
730
- font-weight: 600;
731
- }
732
- .owe-field-error::before {
733
- content: "⚠ ";
734
- }
735
- .owe-dialog-form[aria-busy="true"] {
736
- cursor: progress;
737
- }
738
- .owe-shortcuts {
739
- inline-size: 100%;
740
- border-collapse: collapse;
741
- margin-block: 8px 16px;
742
- font-size: 0.875rem;
743
- }
744
- .owe-shortcuts caption {
745
- text-align: start;
746
- font-weight: 700;
747
- padding-block: 4px;
748
- }
749
- .owe-shortcuts :is(th, td) {
750
- text-align: start;
751
- padding: 6px 4px;
752
- border-block-end: 1px solid var(--owe-border-subtle);
753
- }
754
- .owe-shortcuts tbody th {
755
- font-weight: 400;
756
- }
757
- .owe-shortcuts kbd {
758
- font-family: var(--owe-font-mono);
759
- font-size: 0.8125rem;
760
- padding: 2px 6px;
761
- border: 1px solid var(--owe-border);
762
- border-radius: 6px;
763
- background: var(--owe-surface-2);
764
- white-space: nowrap;
765
- }
979
+ /* ---- colors ----------------------------------------------------------------------------------- */
980
+ .owe-btn-color:not(.\#):not(.\#) {
981
+ position: relative;
982
+ padding-block-end: 4px;
983
+ }
984
+ .owe-color-bar:not(.\#):not(.\#) {
985
+ position: absolute;
986
+ inset-inline-start: 8px;
987
+ inset-block-end: 3px;
988
+ inline-size: 18px;
989
+ block-size: 3px;
990
+ border-radius: 1px;
991
+ pointer-events: none;
992
+ }
993
+ .owe-color-bar-empty:not(.\#):not(.\#) {
994
+ outline: 1px solid var(--owe-border, var(--owe-d-border));
995
+ }
996
+ .owe-swatch:not(.\#):not(.\#) {
997
+ display: inline-block;
998
+ inline-size: 18px;
999
+ block-size: 18px;
1000
+ flex: none;
1001
+ border-radius: 4px;
1002
+ /* 3:1 boundary so light tints are distinguishable (WCAG 1.4.11) */
1003
+ border: 1px solid var(--owe-border, var(--owe-d-border));
1004
+ }
1005
+ .owe-swatch-none:not(.\#):not(.\#) {
1006
+ background: linear-gradient(
1007
+ to top right,
1008
+ transparent 45%,
1009
+ var(--owe-danger, var(--owe-d-danger)) 45% 55%,
1010
+ transparent 55%
1011
+ );
1012
+ }
1013
+ .owe-color-preview:not(.\#):not(.\#) {
1014
+ display: flex;
1015
+ flex-direction: column;
1016
+ gap: 6px;
1017
+ }
1018
+ .owe-color-sample:not(.\#):not(.\#) {
1019
+ align-self: flex-start;
1020
+ padding: 6px 14px;
1021
+ border: 1px solid var(--owe-border, var(--owe-d-border));
1022
+ border-radius: var(--owe-radius-sm, var(--owe-d-radius-sm));
1023
+ font-size: 1.125rem;
1024
+ font-weight: 600;
1025
+ }
1026
+ .owe-contrast:not(.\#):not(.\#) {
1027
+ margin: 0;
1028
+ font-size: 0.875rem;
1029
+ }
1030
+ .owe-contrast-fail:not(.\#):not(.\#) {
1031
+ color: var(--owe-danger, var(--owe-d-danger));
1032
+ font-weight: 600;
1033
+ }
1034
+ .owe-dialog input[type="color"]:not(.\#):not(.\#) {
1035
+ inline-size: 100%;
1036
+ min-block-size: var(--owe-target, var(--owe-d-target));
1037
+ padding: 2px;
1038
+ border: 1px solid var(--owe-border, var(--owe-d-border));
1039
+ border-radius: var(--owe-radius-sm, var(--owe-d-radius-sm));
1040
+ background: var(--owe-field-bg, var(--owe-d-field-bg));
1041
+ }
766
1042
 
767
- /* ---- find & replace -------------------------------------------------------------------------- */
768
- .owe-findbar {
769
- display: flex;
770
- flex-direction: column;
771
- gap: 6px;
772
- padding: 12px var(--owe-pad-x);
773
- border-block-end: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle));
774
- background: var(--owe-toolbar-bg, var(--owe-chrome));
775
- font-size: 0.875rem;
776
- }
777
- .owe-findbar[hidden] {
778
- display: none;
779
- }
780
- .owe-find-row {
781
- display: flex;
782
- flex-wrap: wrap;
783
- align-items: center;
784
- gap: 6px;
785
- }
786
- .owe-find-label {
787
- min-inline-size: 6.5em;
788
- font-weight: 600;
789
- }
790
- .owe-find-row .owe-input {
791
- flex: 1 1 12em;
792
- min-inline-size: 8em;
793
- }
794
- .owe-find-status {
795
- min-inline-size: 6em;
796
- color: var(--owe-muted);
797
- font-variant-numeric: tabular-nums;
798
- }
799
- .owe-check {
800
- display: inline-flex;
801
- align-items: center;
802
- gap: 4px;
803
- min-block-size: var(--owe-target);
804
- }
805
- .owe-check input {
806
- inline-size: 16px;
807
- block-size: 16px;
808
- accent-color: var(--owe-accent);
809
- }
810
- .owe-content .owe-find-match {
811
- background: var(--owe-mark);
812
- border-radius: 2px;
813
- box-shadow: 0 0 0 1px var(--owe-warning);
814
- }
815
- .owe-content .owe-find-current {
816
- background: var(--owe-primary);
817
- color: var(--owe-on-accent);
818
- box-shadow: 0 0 0 2px var(--owe-primary);
819
- }
1043
+ /* ---- source view ------------------------------------------------------------------------------ */
1044
+ .owe-source:not(.\#):not(.\#) {
1045
+ display: block;
1046
+ box-sizing: border-box;
1047
+ inline-size: 100%;
1048
+ min-block-size: 16em;
1049
+ margin: 0;
1050
+ padding: var(--owe-pad-y, var(--owe-d-pad-y)) var(--owe-pad-x, var(--owe-d-pad-x));
1051
+ border: 0;
1052
+ background: var(--owe-code-bg, var(--owe-d-code-bg));
1053
+ color: var(--owe-text, var(--owe-d-text));
1054
+ font-family: var(--owe-font-mono, var(--owe-d-font-mono));
1055
+ font-size: 0.875rem;
1056
+ line-height: 1.6;
1057
+ resize: vertical;
1058
+ tab-size: 2;
1059
+ white-space: pre-wrap;
1060
+ text-align: left;
1061
+ }
1062
+ .owe-source:focus-visible:not(.\#):not(.\#) {
1063
+ outline: 2px solid var(--owe-focus, var(--owe-d-focus));
1064
+ outline-offset: -2px;
1065
+ }
1066
+ .owe-source[hidden]:not(.\#):not(.\#) {
1067
+ display: none;
1068
+ }
820
1069
 
821
- /* ---- status bar ------------------------------------------------------------------------------ */
822
- .owe-statusbar {
823
- display: flex;
824
- flex-wrap: wrap;
825
- align-items: center;
826
- justify-content: space-between;
827
- gap: 4px 16px;
828
- padding: 10px var(--owe-pad-x) 12px;
829
- border-block-start: 1px solid var(--owe-toolbar-border, var(--owe-border-subtle));
830
- background: var(--owe-toolbar-bg, var(--owe-chrome));
831
- border-end-start-radius: calc(var(--owe-editor-radius, var(--owe-radius)) - 1px);
832
- border-end-end-radius: calc(var(--owe-editor-radius, var(--owe-radius)) - 1px);
833
- color: var(--owe-muted);
834
- font-family: var(--owe-font-mono);
835
- font-size: 0.8125rem;
836
- line-height: 1.4;
837
- min-block-size: var(--owe-target);
838
- }
839
- .owe-path {
840
- display: flex;
841
- flex-wrap: wrap;
842
- align-items: center;
843
- list-style: none;
844
- margin: 0;
845
- padding: 0;
846
- }
847
- .owe-path li + li::before {
848
- content: "›";
849
- padding-inline: 2px;
850
- color: var(--owe-muted);
851
- }
852
- [dir="rtl"] .owe-path li + li::before {
853
- content: "‹";
854
- }
855
- .owe-path-item {
856
- min-block-size: 24px;
857
- padding: 2px 6px;
858
- border: 0;
859
- border-radius: var(--owe-btn-radius, 6px);
860
- background: transparent;
861
- color: inherit;
862
- font: inherit;
863
- cursor: pointer;
864
- }
865
- .owe-path-item:hover {
866
- background: var(--owe-btn-hover-bg, var(--owe-surface-2));
867
- color: var(--owe-btn-hover-color, var(--owe-text));
868
- }
869
- .owe-path-item[aria-current] {
870
- color: var(--owe-accent);
871
- font-weight: 700;
872
- }
873
- .owe-statusbar:lang(ar),
874
- [dir="rtl"] .owe-statusbar {
875
- font-family: var(--owe-font);
1070
+ /* ---- narrow editors ----------------------------------------------------------------------------
1071
+ Container queries: these follow the editor's own width (a phone, a sidebar, a dashboard card). */
1072
+ @container owe-toolbar (max-width: 560px) {
1073
+ .owe-toolbar:not(.\#):not(.\#) {
1074
+ gap: 2px;
1075
+ padding-block: 8px;
1076
+ }
1077
+ .owe-btn:not(.\#):not(.\#) {
1078
+ /* 36px stays well above the 24px target size (WCAG 2.5.8); a smaller --owe-btn-size still wins. */
1079
+ min-inline-size: min(var(--owe-btn-size, var(--owe-d-btn-size)), 36px);
1080
+ min-block-size: min(var(--owe-btn-size, var(--owe-d-btn-size)), 36px);
1081
+ padding-inline: 6px;
1082
+ }
1083
+ .owe-separator:not(.\#):not(.\#) {
1084
+ block-size: 20px;
1085
+ margin-inline: 2px;
876
1086
  }
877
- .owe-counts {
878
- font-variant-numeric: tabular-nums;
879
- direction: ltr;
1087
+ .owe-btn-wide:not(.\#):not(.\#) {
1088
+ min-inline-size: 0;
880
1089
  }
881
-
882
- /* ---- colors ----------------------------------------------------------------------------------- */
883
- .owe-btn-color {
884
- position: relative;
885
- padding-block-end: 4px;
1090
+ .owe-btn-wide .owe-btn-text:not(.\#):not(.\#) {
1091
+ max-inline-size: 6.5em;
1092
+ overflow: hidden;
1093
+ text-overflow: ellipsis;
886
1094
  }
887
- .owe-color-bar {
888
- position: absolute;
889
- inset-inline-start: 8px;
890
- inset-block-end: 3px;
891
- inline-size: 18px;
892
- block-size: 3px;
893
- border-radius: 1px;
894
- pointer-events: none;
1095
+ }
1096
+ @container owe-dialog (max-width: 420px) {
1097
+ .owe-dialog-header:not(.\#):not(.\#) {
1098
+ padding-block: 14px 4px;
1099
+ padding-inline: 16px 10px;
895
1100
  }
896
- .owe-color-bar-empty {
897
- outline: 1px solid var(--owe-border);
1101
+ .owe-dialog-body:not(.\#):not(.\#) {
1102
+ padding: 8px 16px;
898
1103
  }
899
- .owe-swatch {
900
- display: inline-block;
901
- inline-size: 18px;
902
- block-size: 18px;
903
- flex: none;
904
- border-radius: 4px;
905
- /* 3:1 boundary so light tints are distinguishable (WCAG 1.4.11) */
906
- border: 1px solid var(--owe-border);
1104
+ .owe-dialog-actions:not(.\#):not(.\#) {
1105
+ padding: 12px 16px 16px;
907
1106
  }
908
- .owe-swatch-none {
909
- background: linear-gradient(to top right, transparent 45%, var(--owe-danger) 45% 55%, transparent 55%);
1107
+ .owe-dialog-actions > .owe-button:not(.\#):not(.\#) {
1108
+ flex: 1 1 auto;
910
1109
  }
911
- .owe-color-preview {
912
- display: flex;
1110
+ .owe-field-row:not(.\#):not(.\#) {
913
1111
  flex-direction: column;
914
- gap: 6px;
915
- }
916
- .owe-color-sample {
917
- align-self: flex-start;
918
- padding: 6px 14px;
919
- border: 1px solid var(--owe-border);
920
- border-radius: var(--owe-radius-sm);
921
- font-size: 1.125rem;
922
- font-weight: 600;
923
- }
924
- .owe-contrast {
925
- margin: 0;
926
- font-size: 0.875rem;
927
- }
928
- .owe-contrast-fail {
929
- color: var(--owe-danger);
930
- font-weight: 600;
931
- }
932
- .owe-dialog input[type="color"] {
933
- inline-size: 100%;
934
- min-block-size: var(--owe-target);
935
- padding: 2px;
936
- border: 1px solid var(--owe-border);
937
- border-radius: var(--owe-radius-sm);
938
- background: var(--owe-field-bg);
1112
+ gap: 0;
939
1113
  }
1114
+ }
940
1115
 
941
- /* ---- source view ------------------------------------------------------------------------------ */
942
- .owe-source {
943
- display: block;
944
- box-sizing: border-box;
945
- inline-size: 100%;
946
- min-block-size: 16em;
947
- margin: 0;
948
- padding: var(--owe-pad-y) var(--owe-pad-x);
949
- border: 0;
950
- background: var(--owe-code-bg);
951
- color: var(--owe-text);
952
- font-family: var(--owe-font-mono);
953
- font-size: 0.875rem;
954
- line-height: 1.6;
955
- resize: vertical;
956
- tab-size: 2;
957
- white-space: pre-wrap;
958
- text-align: left;
1116
+ /* ---- forced colors (Windows High Contrast) ---------------------------------------------------- */
1117
+ @media (forced-colors: active) {
1118
+ .owe-btn:not(.\#):not(.\#),
1119
+ .owe-button:not(.\#):not(.\#),
1120
+ .owe-menu-item:not(.\#):not(.\#) {
1121
+ border-color: ButtonText;
1122
+ }
1123
+ .owe-btn[aria-pressed="true"]:not(.\#):not(.\#),
1124
+ .owe-btn[aria-checked="true"]:not(.\#):not(.\#),
1125
+ .owe-btn[aria-expanded="true"]:not(.\#):not(.\#),
1126
+ .owe-btn.is-active:not(.\#):not(.\#) {
1127
+ border: 2px solid Highlight;
1128
+ background: Highlight;
1129
+ color: HighlightText;
1130
+ forced-color-adjust: none;
1131
+ }
1132
+ .owe-btn[aria-pressed="true"]:hover:not(.\#):not(.\#),
1133
+ .owe-btn[aria-checked="true"]:hover:not(.\#):not(.\#),
1134
+ .owe-btn[aria-expanded="true"]:hover:not(.\#):not(.\#) {
1135
+ background: Highlight;
1136
+ color: HighlightText;
1137
+ }
1138
+ .owe-btn[aria-disabled="true"]:not(.\#):not(.\#),
1139
+ .owe-menu-item[aria-disabled="true"]:not(.\#):not(.\#) {
1140
+ color: GrayText;
1141
+ opacity: 1;
959
1142
  }
960
- .owe-source:focus-visible {
961
- outline: 2px solid var(--owe-focus);
962
- outline-offset: -2px;
1143
+ .owe-menu:not(.\#):not(.\#),
1144
+ .owe-dialog:not(.\#):not(.\#),
1145
+ .owe-tooltip:not(.\#):not(.\#) {
1146
+ border: 1px solid CanvasText;
963
1147
  }
964
- .owe-source[hidden] {
965
- display: none;
1148
+ .owe-menu-item:focus:not(.\#):not(.\#) {
1149
+ outline: 2px solid Highlight;
966
1150
  }
967
-
968
- /* ---- forced colors (Windows High Contrast) ---------------------------------------------------- */
969
- @media (forced-colors: active) {
970
- .owe-btn,
971
- .owe-button,
972
- .owe-menu-item {
973
- border-color: ButtonText;
974
- }
975
- .owe-btn[aria-pressed="true"],
976
- .owe-btn[aria-checked="true"],
977
- .owe-btn[aria-expanded="true"],
978
- .owe-btn.is-active {
979
- border: 2px solid Highlight;
980
- background: Highlight;
981
- color: HighlightText;
982
- forced-color-adjust: none;
983
- }
984
- .owe-btn[aria-pressed="true"]:hover,
985
- .owe-btn[aria-checked="true"]:hover,
986
- .owe-btn[aria-expanded="true"]:hover {
987
- background: Highlight;
988
- color: HighlightText;
989
- }
990
- .owe-btn[aria-disabled="true"],
991
- .owe-menu-item[aria-disabled="true"] {
992
- color: GrayText;
993
- opacity: 1;
994
- }
995
- .owe-menu,
996
- .owe-dialog,
997
- .owe-tooltip {
998
- border: 1px solid CanvasText;
999
- }
1000
- .owe-menu-item:focus {
1001
- outline: 2px solid Highlight;
1002
- }
1003
- .owe-content .owe-find-current {
1004
- outline: 2px solid Highlight;
1005
- }
1006
- .owe-separator {
1007
- background: CanvasText;
1008
- }
1151
+ .owe-content .owe-find-current:not(.\#):not(.\#) {
1152
+ outline: 2px solid Highlight;
1153
+ }
1154
+ .owe-separator:not(.\#):not(.\#) {
1155
+ background: CanvasText;
1009
1156
  }
1010
1157
  }
1011
1158
 
@@ -1013,173 +1160,224 @@
1013
1160
  * Content styles — shared by the editing area (.owe-content) and published pages
1014
1161
  * (wrap saved HTML in <div class="owe-content-root">), so what authors see is what readers get.
1015
1162
  */
1016
- @layer owe {
1017
- :is(.owe-content, .owe-content-root) {
1018
- font-family: var(--owe-font);
1019
- font-size: var(--owe-font-size);
1020
- line-height: var(--owe-line-height);
1021
- color: var(--owe-body);
1022
- overflow-wrap: break-word;
1023
- }
1163
+ :is(.owe-content, .owe-content-root):not(.\#):not(.\#) {
1164
+ font-family: var(--owe-font, var(--owe-d-font));
1165
+ font-size: var(--owe-font-size, var(--owe-d-font-size));
1166
+ line-height: var(--owe-line-height, var(--owe-d-line-height));
1167
+ color: var(--owe-body, var(--owe-d-body));
1168
+ overflow-wrap: break-word;
1169
+ }
1024
1170
 
1025
- :is(.owe-content, .owe-content-root) > :first-child {
1026
- margin-block-start: 0;
1027
- }
1171
+ :is(.owe-content, .owe-content-root) > :first-child:not(.\#):not(.\#) {
1172
+ margin-block-start: 0;
1173
+ }
1028
1174
 
1029
- :is(.owe-content, .owe-content-root) :is(p, ul, ol, blockquote, pre, table, figure, hr) {
1030
- margin-block: 0 0.85em;
1031
- }
1175
+ :is(.owe-content, .owe-content-root) :is(p, ul, ol, blockquote, pre, table, figure, hr):not(.\#):not(.\#) {
1176
+ margin-block: 0 0.85em;
1177
+ }
1032
1178
 
1033
- :is(.owe-content, .owe-content-root) :is(h1, h2, h3, h4, h5, h6) {
1034
- line-height: 1.2;
1035
- margin-block: 1.3em 0.5em;
1036
- font-weight: 700;
1037
- letter-spacing: -0.02em;
1038
- color: var(--owe-text);
1039
- }
1040
- /* Negative tracking breaks Arabic joining: reset for RTL / Arabic-script content. */
1041
- :is(.owe-content, .owe-content-root) :is(h1, h2, h3, h4, h5, h6):is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he)),
1042
- :is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he)) :is(.owe-content, .owe-content-root) :is(h1, h2, h3, h4, h5, h6),
1043
- :is(.owe-content, .owe-content-root):is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he)) :is(h1, h2, h3, h4, h5, h6) {
1044
- letter-spacing: 0;
1045
- }
1046
- :is(.owe-content, .owe-content-root) h1 { font-size: 2.1em; }
1047
- :is(.owe-content, .owe-content-root) h2 { font-size: 1.5em; }
1048
- :is(.owe-content, .owe-content-root) h3 { font-size: 1.25em; }
1049
- :is(.owe-content, .owe-content-root) h4 { font-size: 1.1em; }
1050
- :is(.owe-content, .owe-content-root) h5 { font-size: 1em; }
1051
- :is(.owe-content, .owe-content-root) h6 { font-size: 0.9em; }
1179
+ :is(.owe-content, .owe-content-root) :is(h1, h2, h3, h4, h5, h6):not(.\#):not(.\#) {
1180
+ line-height: 1.2;
1181
+ margin-block: 1.3em 0.5em;
1182
+ font-weight: 700;
1183
+ letter-spacing: -0.02em;
1184
+ color: var(--owe-text, var(--owe-d-text));
1185
+ }
1186
+ /* Negative tracking breaks Arabic joining: reset for RTL / Arabic-script content. */
1187
+ :is(.owe-content, .owe-content-root)
1188
+ :is(h1, h2, h3, h4, h5, h6):is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he)):not(.\#):not(.\#),
1189
+ :is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he))
1190
+ :is(.owe-content, .owe-content-root)
1191
+ :is(h1, h2, h3, h4, h5, h6):not(.\#):not(.\#),
1192
+ :is(.owe-content, .owe-content-root):is([dir="rtl"], :lang(ar), :lang(fa), :lang(ur), :lang(he))
1193
+ :is(h1, h2, h3, h4, h5, h6):not(.\#):not(.\#) {
1194
+ letter-spacing: 0;
1195
+ }
1196
+ :is(.owe-content, .owe-content-root) h1:not(.\#):not(.\#) {
1197
+ font-size: 2.1em;
1198
+ }
1199
+ :is(.owe-content, .owe-content-root) h2:not(.\#):not(.\#) {
1200
+ font-size: 1.5em;
1201
+ }
1202
+ :is(.owe-content, .owe-content-root) h3:not(.\#):not(.\#) {
1203
+ font-size: 1.25em;
1204
+ }
1205
+ :is(.owe-content, .owe-content-root) h4:not(.\#):not(.\#) {
1206
+ font-size: 1.1em;
1207
+ }
1208
+ :is(.owe-content, .owe-content-root) h5:not(.\#):not(.\#) {
1209
+ font-size: 1em;
1210
+ }
1211
+ :is(.owe-content, .owe-content-root) h6:not(.\#):not(.\#) {
1212
+ font-size: 0.9em;
1213
+ }
1052
1214
 
1053
- :is(.owe-content, .owe-content-root) a {
1054
- color: var(--owe-accent);
1055
- text-decoration: underline; /* never colour alone (WCAG 1.4.1) */
1056
- text-underline-offset: 0.15em;
1057
- }
1215
+ :is(.owe-content, .owe-content-root) a:not(.\#):not(.\#) {
1216
+ color: var(--owe-accent, var(--owe-d-accent));
1217
+ text-decoration: underline; /* never colour alone (WCAG 1.4.1) */
1218
+ text-underline-offset: 0.15em;
1219
+ }
1058
1220
 
1059
- :is(.owe-content, .owe-content-root) :is(ul, ol) {
1060
- padding-inline-start: 1.6em;
1061
- }
1062
- :is(.owe-content, .owe-content-root) li > :is(p, ul, ol) {
1063
- margin-block: 0.15em;
1064
- }
1221
+ :is(.owe-content, .owe-content-root) :is(ul, ol):not(.\#):not(.\#) {
1222
+ padding-inline-start: 1.6em;
1223
+ }
1224
+ /* Set explicitly: base.css (and resets like Tailwind's preflight) clear list markers and inline styles. */
1225
+ :is(.owe-content, .owe-content-root) ul:not(.\#):not(.\#) {
1226
+ list-style: disc;
1227
+ }
1228
+ :is(.owe-content, .owe-content-root) ol:not(.\#):not(.\#) {
1229
+ list-style: decimal;
1230
+ }
1231
+ :is(.owe-content, .owe-content-root) :is(strong, b):not(.\#):not(.\#) {
1232
+ font-weight: 700;
1233
+ }
1234
+ :is(.owe-content, .owe-content-root) :is(em, i):not(.\#):not(.\#) {
1235
+ font-style: italic;
1236
+ }
1237
+ :is(.owe-content, .owe-content-root) u:not(.\#):not(.\#) {
1238
+ text-decoration: underline;
1239
+ }
1240
+ :is(.owe-content, .owe-content-root) s:not(.\#):not(.\#) {
1241
+ text-decoration: line-through;
1242
+ }
1243
+ :is(.owe-content, .owe-content-root) :is(sub, sup):not(.\#):not(.\#) {
1244
+ position: relative;
1245
+ font-size: 0.75em;
1246
+ line-height: 0;
1247
+ vertical-align: baseline;
1248
+ }
1249
+ :is(.owe-content, .owe-content-root) sup:not(.\#):not(.\#) {
1250
+ inset-block-start: -0.5em;
1251
+ }
1252
+ :is(.owe-content, .owe-content-root) sub:not(.\#):not(.\#) {
1253
+ inset-block-end: -0.25em;
1254
+ }
1255
+ :is(.owe-content, .owe-content-root) li > :is(p, ul, ol):not(.\#):not(.\#) {
1256
+ margin-block: 0.15em;
1257
+ }
1065
1258
 
1066
- :is(.owe-content, .owe-content-root) ul[data-type="taskList"] {
1067
- list-style: none;
1068
- padding-inline-start: 0.25em;
1069
- }
1070
- :is(.owe-content, .owe-content-root) li[data-type="taskItem"] {
1071
- display: flex;
1072
- align-items: flex-start;
1073
- gap: 0.5em;
1074
- }
1075
- :is(.owe-content, .owe-content-root) li[data-type="taskItem"] > input,
1076
- .owe-task-control > input {
1077
- inline-size: 1.1em;
1078
- block-size: 1.1em;
1079
- margin-block-start: 0.3em;
1080
- accent-color: var(--owe-primary);
1081
- flex: none;
1082
- }
1083
- :is(.owe-content, .owe-content-root) li[data-type="taskItem"] > div {
1084
- flex: 1;
1085
- min-inline-size: 0;
1086
- }
1087
- :is(.owe-content, .owe-content-root) li[data-checked="true"] > div {
1088
- text-decoration: line-through;
1089
- color: var(--owe-muted);
1090
- }
1259
+ :is(.owe-content, .owe-content-root) ul[data-type="taskList"]:not(.\#):not(.\#) {
1260
+ list-style: none;
1261
+ padding-inline-start: 0.25em;
1262
+ }
1263
+ :is(.owe-content, .owe-content-root) li[data-type="taskItem"]:not(.\#):not(.\#) {
1264
+ display: flex;
1265
+ align-items: flex-start;
1266
+ gap: 0.5em;
1267
+ }
1268
+ :is(.owe-content, .owe-content-root) li[data-type="taskItem"] > input:not(.\#):not(.\#),
1269
+ .owe-task-control > input:not(.\#):not(.\#) {
1270
+ inline-size: 1.1em;
1271
+ block-size: 1.1em;
1272
+ margin-block-start: 0.3em;
1273
+ accent-color: var(--owe-primary, var(--owe-d-primary));
1274
+ flex: none;
1275
+ }
1276
+ :is(.owe-content, .owe-content-root) li[data-type="taskItem"] > div:not(.\#):not(.\#) {
1277
+ flex: 1;
1278
+ min-inline-size: 0;
1279
+ }
1280
+ :is(.owe-content, .owe-content-root) li[data-checked="true"] > div:not(.\#):not(.\#) {
1281
+ text-decoration: line-through;
1282
+ color: var(--owe-muted, var(--owe-d-muted));
1283
+ }
1091
1284
 
1092
- :is(.owe-content, .owe-content-root) blockquote {
1093
- margin-inline: 0;
1094
- padding-inline-start: 1em;
1095
- border-inline-start: 3px solid var(--owe-accent);
1096
- border-start-start-radius: 2px;
1097
- border-end-start-radius: 2px;
1098
- color: var(--owe-text-2);
1099
- }
1285
+ :is(.owe-content, .owe-content-root) blockquote:not(.\#):not(.\#) {
1286
+ margin-inline: 0;
1287
+ padding-inline-start: 1em;
1288
+ border-inline-start: 3px solid var(--owe-accent, var(--owe-d-accent));
1289
+ border-start-start-radius: 2px;
1290
+ border-end-start-radius: 2px;
1291
+ color: var(--owe-text-2, var(--owe-d-text-2));
1292
+ }
1100
1293
 
1101
- :is(.owe-content, .owe-content-root) code {
1102
- font-family: var(--owe-font-mono);
1103
- font-size: 0.9em;
1104
- background: var(--owe-code-bg);
1105
- border: 1px solid var(--owe-border-subtle);
1106
- border-radius: 6px;
1107
- padding: 0.1em 0.35em;
1108
- }
1109
- :is(.owe-content, .owe-content-root) pre {
1110
- font-family: var(--owe-font-mono);
1111
- background: var(--owe-code-bg);
1112
- border: 1px solid var(--owe-border-subtle);
1113
- border-radius: var(--owe-radius-md);
1114
- padding: 1em 1.25em;
1115
- overflow-x: auto;
1116
- direction: ltr; /* code is left-to-right even in RTL documents */
1117
- text-align: start;
1118
- tab-size: 2;
1119
- }
1120
- :is(.owe-content, .owe-content-root) pre code {
1121
- background: none;
1122
- border: 0;
1123
- padding: 0;
1124
- font-size: 0.9em;
1125
- }
1294
+ :is(.owe-content, .owe-content-root) code:not(.\#):not(.\#) {
1295
+ font-family: var(--owe-font-mono, var(--owe-d-font-mono));
1296
+ font-size: 0.9em;
1297
+ background: var(--owe-code-bg, var(--owe-d-code-bg));
1298
+ border: 1px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
1299
+ border-radius: 6px;
1300
+ padding: 0.1em 0.35em;
1301
+ }
1302
+ :is(.owe-content, .owe-content-root) pre:not(.\#):not(.\#) {
1303
+ font-family: var(--owe-font-mono, var(--owe-d-font-mono));
1304
+ background: var(--owe-code-bg, var(--owe-d-code-bg));
1305
+ border: 1px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
1306
+ border-radius: var(--owe-radius-md, var(--owe-d-radius-md));
1307
+ padding: 1em 1.25em;
1308
+ overflow-x: auto;
1309
+ direction: ltr; /* code is left-to-right even in RTL documents */
1310
+ text-align: start;
1311
+ tab-size: 2;
1312
+ }
1313
+ :is(.owe-content, .owe-content-root) pre code:not(.\#):not(.\#) {
1314
+ background: none;
1315
+ border: 0;
1316
+ padding: 0;
1317
+ font-size: 0.9em;
1318
+ }
1126
1319
 
1127
- :is(.owe-content, .owe-content-root) hr {
1128
- border: none;
1129
- border-block-start: 2px solid var(--owe-border-subtle);
1130
- margin-block: 1.5em;
1131
- }
1320
+ :is(.owe-content, .owe-content-root) hr:not(.\#):not(.\#) {
1321
+ border: none;
1322
+ border-block-start: 2px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
1323
+ margin-block: 1.5em;
1324
+ }
1132
1325
 
1133
- :is(.owe-content, .owe-content-root) img {
1134
- max-inline-size: 100%;
1135
- block-size: auto;
1136
- display: block;
1137
- }
1138
- :is(.owe-content, .owe-content-root) figure {
1139
- margin-inline: 0;
1140
- }
1141
- :is(.owe-content, .owe-content-root) figcaption {
1142
- color: var(--owe-muted);
1143
- font-size: 0.9em;
1144
- margin-block-start: 0.4em;
1145
- }
1326
+ :is(.owe-content, .owe-content-root) img:not(.\#):not(.\#) {
1327
+ max-inline-size: 100%;
1328
+ block-size: auto;
1329
+ display: block;
1330
+ }
1331
+ :is(.owe-content, .owe-content-root) figure:not(.\#):not(.\#) {
1332
+ margin-inline: 0;
1333
+ }
1334
+ :is(.owe-content, .owe-content-root) figcaption:not(.\#):not(.\#) {
1335
+ color: var(--owe-muted, var(--owe-d-muted));
1336
+ font-size: 0.9em;
1337
+ margin-block-start: 0.4em;
1338
+ }
1146
1339
 
1147
- :is(.owe-content, .owe-content-root) table {
1148
- border-collapse: collapse;
1149
- inline-size: 100%;
1150
- table-layout: fixed;
1151
- }
1152
- :is(.owe-content, .owe-content-root) caption {
1153
- caption-side: top;
1154
- text-align: start;
1155
- font-weight: 600;
1156
- padding-block-end: 0.4em;
1157
- }
1158
- :is(.owe-content, .owe-content-root) :is(td, th) {
1159
- border: 1px solid var(--owe-border-subtle);
1160
- padding: 0.55em 0.8em;
1161
- vertical-align: top;
1162
- text-align: start;
1163
- min-inline-size: 3em;
1164
- }
1165
- :is(.owe-content, .owe-content-root) th {
1166
- background: var(--owe-surface);
1167
- color: var(--owe-text);
1168
- font-weight: 700;
1169
- }
1170
- :is(.owe-content, .owe-content-root) :is(td, th) > :last-child {
1171
- margin-block-end: 0;
1172
- }
1340
+ :is(.owe-content, .owe-content-root) table:not(.\#):not(.\#) {
1341
+ border-collapse: collapse;
1342
+ inline-size: 100%;
1343
+ table-layout: fixed;
1344
+ }
1345
+ :is(.owe-content, .owe-content-root) caption:not(.\#):not(.\#) {
1346
+ caption-side: top;
1347
+ text-align: start;
1348
+ font-weight: 600;
1349
+ padding-block-end: 0.4em;
1350
+ }
1351
+ :is(.owe-content, .owe-content-root) :is(td, th):not(.\#):not(.\#) {
1352
+ border: 1px solid var(--owe-border-subtle, var(--owe-d-border-subtle));
1353
+ padding: 0.55em 0.8em;
1354
+ vertical-align: top;
1355
+ text-align: start;
1356
+ min-inline-size: 3em;
1357
+ }
1358
+ :is(.owe-content, .owe-content-root) th:not(.\#):not(.\#) {
1359
+ background: var(--owe-surface, var(--owe-d-surface));
1360
+ color: var(--owe-text, var(--owe-d-text));
1361
+ font-weight: 700;
1362
+ }
1363
+ :is(.owe-content, .owe-content-root) :is(td, th) > :last-child:not(.\#):not(.\#) {
1364
+ margin-block-end: 0;
1365
+ }
1173
1366
 
1174
- :is(.owe-content, .owe-content-root) mark {
1175
- background-color: var(--owe-mark);
1176
- color: inherit;
1177
- border-radius: 0.2em;
1178
- padding-inline: 0.15em;
1179
- }
1367
+ :is(.owe-content, .owe-content-root) mark:not(.\#):not(.\#) {
1368
+ background-color: var(--owe-mark, var(--owe-d-mark));
1369
+ color: inherit;
1370
+ border-radius: 0.2em;
1371
+ padding-inline: 0.15em;
1372
+ }
1180
1373
 
1181
- /* Alignment classes (used by the editor always, and by output when TextAlign output: "class"). */
1182
- .owe-align-center { text-align: center; }
1183
- .owe-align-end { text-align: end; }
1184
- .owe-align-justify { text-align: justify; }
1374
+ /* Alignment classes (used by the editor always, and by output when TextAlign output: "class"). */
1375
+ .owe-align-center:not(.\#):not(.\#) {
1376
+ text-align: center;
1377
+ }
1378
+ .owe-align-end:not(.\#):not(.\#) {
1379
+ text-align: end;
1380
+ }
1381
+ .owe-align-justify:not(.\#):not(.\#) {
1382
+ text-align: justify;
1185
1383
  }