@open-wysiwyg-editor/react 0.0.0-stage → 1.0.1

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