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