@open-wysiwyg-editor/angular 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/style.css ADDED
@@ -0,0 +1,1165 @@
1
+ /*! open-wysiwyg-editor | MIT License */
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.
5
+ * Contrast: text >= 4.5:1, borders/focus/states >= 3:1 against --owe-bg (WCAG 1.4.3 / 1.4.11).
6
+ *
7
+ * Tokens added in 1.0 (existing names keep working):
8
+ * --owe-radius card radius (24px) --owe-radius-sm inner controls (10px)
9
+ * --owe-radius-md menus (12px) --owe-radius-lg dialogs (16px)
10
+ * --owe-btn-size toolbar button (40px) --owe-pad-x/-y editing-area padding
11
+ * --owe-chrome toolbar / status bar surface
12
+ * --owe-field-bg inputs and source view --owe-popup-border menu / dialog edge
13
+ * --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.
18
+ * Set --owe-font (e.g. "Almarai", system-ui) to change the typeface; no web fonts are bundled.
19
+ */
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);
37
+
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;
67
+
68
+ color-scheme: light;
69
+ }
70
+
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
+ }
105
+
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);
136
+ color-scheme: dark;
137
+ }
138
+
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
+ }
148
+ }
149
+
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;
193
+ }
194
+
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 {
218
+ color: #fff;
219
+ }
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
+ }
260
+
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
+ }
269
+
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);
293
+ }
294
+
295
+ /* task items in the editor */
296
+ .owe-task-control {
297
+ display: inline-flex;
298
+ user-select: none;
299
+ }
300
+
301
+ /* tables in the editor */
302
+ .owe-content .tableWrapper {
303
+ overflow-x: auto;
304
+ margin-block-end: 0.85em;
305
+ }
306
+ .owe-content table {
307
+ margin-block-end: 0;
308
+ }
309
+ .owe-content :is(td, th) {
310
+ position: relative;
311
+ }
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;
319
+ }
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;
327
+ }
328
+ .owe-content.resize-cursor {
329
+ cursor: col-resize;
330
+ }
331
+
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
+ }
344
+
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
+ }
356
+
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
+ }
378
+ }
379
+
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
+ }
406
+
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
+ }
486
+
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
+ }
521
+
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
+ }
578
+
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
+ }
591
+
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
+ }
746
+
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
+ }
800
+
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);
856
+ }
857
+ .owe-counts {
858
+ font-variant-numeric: tabular-nums;
859
+ direction: ltr;
860
+ }
861
+
862
+ /* ---- colors ----------------------------------------------------------------------------------- */
863
+ .owe-btn-color {
864
+ position: relative;
865
+ padding-block-end: 4px;
866
+ }
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;
875
+ }
876
+ .owe-color-bar-empty {
877
+ outline: 1px solid var(--owe-border);
878
+ }
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);
887
+ }
888
+ .owe-swatch-none {
889
+ background: linear-gradient(to top right, transparent 45%, var(--owe-danger) 45% 55%, transparent 55%);
890
+ }
891
+ .owe-color-preview {
892
+ display: flex;
893
+ 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);
919
+ }
920
+
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;
939
+ }
940
+ .owe-source:focus-visible {
941
+ outline: 2px solid var(--owe-focus);
942
+ outline-offset: -2px;
943
+ }
944
+ .owe-source[hidden] {
945
+ display: none;
946
+ }
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
+ }
989
+ }
990
+ }
991
+
992
+ /*
993
+ * Content styles — shared by the editing area (.owe-content) and published pages
994
+ * (wrap saved HTML in <div class="owe-content-root">), so what authors see is what readers get.
995
+ */
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
+ }
1004
+
1005
+ :is(.owe-content, .owe-content-root) > :first-child {
1006
+ margin-block-start: 0;
1007
+ }
1008
+
1009
+ :is(.owe-content, .owe-content-root) :is(p, ul, ol, blockquote, pre, table, figure, hr) {
1010
+ margin-block: 0 0.85em;
1011
+ }
1012
+
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; }
1032
+
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
+ }
1038
+
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
+ }
1045
+
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
+ }
1071
+
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
+ }
1080
+
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
+ }
1106
+
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
+ }
1112
+
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
+ }
1126
+
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
+ }
1153
+
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
+ }
1160
+
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; }
1165
+ }