fable-editor 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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +175 -0
  3. package/dist/angular/LICENSE +21 -0
  4. package/dist/angular/README.md +175 -0
  5. package/dist/angular/angular/fable-editor.component.d.ts +29 -0
  6. package/dist/angular/angular/fable-editor.module.d.ts +7 -0
  7. package/dist/angular/angular/index.d.ts +2 -0
  8. package/dist/angular/core/config.d.ts +17 -0
  9. package/dist/angular/core/docx-import.d.ts +1 -0
  10. package/dist/angular/core/editor.d.ts +219 -0
  11. package/dist/angular/core/i18n.d.ts +139 -0
  12. package/dist/angular/core/icons.d.ts +2 -0
  13. package/dist/angular/core/index.d.ts +7 -0
  14. package/dist/angular/core/paste-engine.d.ts +6 -0
  15. package/dist/angular/core/types.d.ts +87 -0
  16. package/dist/angular/esm2022/angular/fable-editor.component.mjs +101 -0
  17. package/dist/angular/esm2022/angular/fable-editor.module.mjs +16 -0
  18. package/dist/angular/esm2022/angular/index.mjs +3 -0
  19. package/dist/angular/esm2022/core/config.mjs +122 -0
  20. package/dist/angular/esm2022/core/docx-import.mjs +391 -0
  21. package/dist/angular/esm2022/core/editor.mjs +2700 -0
  22. package/dist/angular/esm2022/core/i18n.mjs +278 -0
  23. package/dist/angular/esm2022/core/icons.mjs +89 -0
  24. package/dist/angular/esm2022/core/index.mjs +6 -0
  25. package/dist/angular/esm2022/core/paste-engine.mjs +482 -0
  26. package/dist/angular/esm2022/core/types.mjs +2 -0
  27. package/dist/angular/esm2022/fable-editor.mjs +5 -0
  28. package/dist/angular/esm2022/index.mjs +2 -0
  29. package/dist/angular/fesm2022/fable-editor.mjs +4176 -0
  30. package/dist/angular/fesm2022/fable-editor.mjs.map +1 -0
  31. package/dist/angular/index.d.ts +1 -0
  32. package/dist/core/config.d.ts +18 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/docx-import.d.ts +2 -0
  35. package/dist/core/docx-import.d.ts.map +1 -0
  36. package/dist/core/editor.css +1175 -0
  37. package/dist/core/editor.d.ts +221 -0
  38. package/dist/core/editor.d.ts.map +1 -0
  39. package/dist/core/i18n.d.ts +141 -0
  40. package/dist/core/i18n.d.ts.map +1 -0
  41. package/dist/core/icons.d.ts +3 -0
  42. package/dist/core/icons.d.ts.map +1 -0
  43. package/dist/core/index.cjs +12 -0
  44. package/dist/core/index.d.ts +8 -0
  45. package/dist/core/index.d.ts.map +1 -0
  46. package/dist/core/index.mjs +2789 -0
  47. package/dist/core/paste-engine.d.ts +7 -0
  48. package/dist/core/paste-engine.d.ts.map +1 -0
  49. package/dist/core/types.d.ts +88 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/react/FableEditor.d.ts +13 -0
  52. package/dist/react/FableEditor.d.ts.map +1 -0
  53. package/dist/react/index.cjs +41 -0
  54. package/dist/react/index.d.ts +3 -0
  55. package/dist/react/index.d.ts.map +1 -0
  56. package/dist/react/index.mjs +3471 -0
  57. package/package.json +105 -0
  58. package/style.css +1175 -0
@@ -0,0 +1,1175 @@
1
+ /* ================= page ================= */
2
+ body {
3
+ margin: 0;
4
+ background: #f1f3f6;
5
+ font-family: 'Segoe UI', system-ui, Arial, sans-serif;
6
+ color: #222f3e;
7
+ }
8
+
9
+ .demo {
10
+ max-width: 1180px;
11
+ margin: 26px auto;
12
+ padding: 0 18px;
13
+ }
14
+
15
+ .demo-bar {
16
+ display: flex;
17
+ gap: 8px;
18
+ align-items: center;
19
+ margin-bottom: 14px;
20
+ font-size: 13.5px;
21
+ color: #556
22
+ }
23
+
24
+ .demo-bar button {
25
+ border: 1px solid #cfd6df;
26
+ background: #fff;
27
+ border-radius: 6px;
28
+ padding: 6px 14px;
29
+ font: 13px inherit;
30
+ cursor: pointer
31
+ }
32
+
33
+ .demo-bar button.on {
34
+ background: #006ce7;
35
+ border-color: #006ce7;
36
+ color: #fff
37
+ }
38
+
39
+ /* ================= editor shell (oxide-like skin) ================= */
40
+ .tox {
41
+ background: #fff;
42
+ border: 1px solid #eeeeee;
43
+ border-radius: 10px;
44
+ box-shadow: 0 1px 2px rgba(34, 47, 62, .06);
45
+ display: flex;
46
+ flex-direction: column;
47
+ font-family: 'Segoe UI', system-ui, Arial, sans-serif;
48
+ position: relative;
49
+ }
50
+
51
+ .tox.fullscreen {
52
+ position: fixed;
53
+ inset: 0;
54
+ z-index: 1000;
55
+ border-radius: 0;
56
+ }
57
+
58
+ /* menubar */
59
+ .mnb {
60
+ display: flex;
61
+ flex-wrap: wrap;
62
+ padding: 5px 8px;
63
+ gap: 1px;
64
+ border-bottom: 1px solid #eeeeee;
65
+ }
66
+
67
+ .mnb button {
68
+ border: 0;
69
+ background: none;
70
+ font: 14px/1 inherit;
71
+ color: #222f3e;
72
+ padding: 5px 20px;
73
+ border-radius: 3px;
74
+ cursor: pointer;
75
+ }
76
+
77
+ .mnb button:hover,
78
+ .mnb button.open {
79
+ background: #f0f0f0;
80
+ }
81
+
82
+ /* toolbar — rounded pill bar with flat controls */
83
+ .tbr {
84
+ display: flex;
85
+ flex-wrap: wrap;
86
+ align-items: center;
87
+ /* margin: 6px 10px 8px; */
88
+ padding: 5px;
89
+ gap: 7px 10px;
90
+ /* border: 1px solid #e4e6ea; */
91
+ border-radius: 12px;
92
+ background: #fff;
93
+ box-shadow: 0 1px 2px rgba(34, 47, 62, .04);
94
+ }
95
+
96
+ .tgrp {
97
+ display: flex;
98
+ align-items: center;
99
+ padding: 0 5px;
100
+ position: relative;
101
+ background: #f1f3f6;
102
+ border-radius: 20px;
103
+ }
104
+
105
+ /* .tgrp+.tgrp::before {
106
+ content: "";
107
+ position: absolute;
108
+ inset-inline-start: 0;
109
+ top: 7px;
110
+ bottom: 7px;
111
+ width: 1px;
112
+ background: #e9ebee;
113
+ } */
114
+
115
+ .tbtn {
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ gap: 0;
120
+ min-width: 25px;
121
+ height: 25px;
122
+ padding: 5px;
123
+ margin: 3px;
124
+ border: 0;
125
+ background: none;
126
+ border-radius: 5px;
127
+ cursor: pointer;
128
+ color: #2f3744;
129
+ position: relative;
130
+ }
131
+
132
+ .tbtn:hover {
133
+ background: #f1f2f4;
134
+ }
135
+
136
+ .tbtn.on {
137
+ background: #e3edfb;
138
+ }
139
+
140
+ .tbtn:disabled {
141
+ opacity: .4;
142
+ cursor: default;
143
+ background: none;
144
+ }
145
+
146
+ .tbtn svg {
147
+ width: 21px;
148
+ height: 21px;
149
+ stroke: #2f3744;
150
+ fill: none;
151
+ stroke-width: 1.7;
152
+ stroke-linecap: round;
153
+ stroke-linejoin: round;
154
+ }
155
+
156
+ .tbtn svg .f {
157
+ fill: #2f3744;
158
+ stroke: none;
159
+ }
160
+
161
+ .tbtn .txt {
162
+ font: 600 15.5px/1 Georgia, 'Times New Roman', serif;
163
+ }
164
+
165
+ .tbtn .txt.sans {
166
+ font-family: Arial, sans-serif;
167
+ }
168
+
169
+ /* color underline bar inside buttons */
170
+ .colorbar {
171
+ position: absolute;
172
+ bottom: 5px;
173
+ left: 7px;
174
+ right: 7px;
175
+ height: 3px;
176
+ border-radius: 1px;
177
+ background: #000;
178
+ }
179
+
180
+ .tbtn.hasmenu .colorbar {
181
+ left: auto;
182
+ right: auto;
183
+ inset-inline-start: 7px;
184
+ inset-inline-end: 19px;
185
+ }
186
+
187
+ /* toolbar selects — flat, text + chevron */
188
+ .tsel {
189
+ display: flex;
190
+ align-items: center;
191
+ justify-content: space-between;
192
+ gap: 7px;
193
+ background: none;
194
+ border: 0;
195
+ border-radius: 8px;
196
+ height: 32px;
197
+ margin: 0 1px;
198
+ padding: 0 8px;
199
+ font: 500 13.5px inherit;
200
+ color: #2f3744;
201
+ cursor: pointer;
202
+ }
203
+
204
+ .tsel:hover {
205
+ background: #f1f2f4;
206
+ }
207
+
208
+ .tsel .lbl {
209
+ white-space: nowrap;
210
+ overflow: hidden;
211
+ text-overflow: ellipsis;
212
+ text-align: start;
213
+ }
214
+
215
+ .tsel .lbl.empty {
216
+ color: #8b93a1;
217
+ }
218
+
219
+ .tsel svg {
220
+ width: 9px;
221
+ height: 9px;
222
+ stroke: #7a828e;
223
+ stroke-width: 2.2;
224
+ fill: none;
225
+ flex: none;
226
+ }
227
+
228
+ .tsel.w-font {
229
+ width: 118px;
230
+ }
231
+
232
+ .tsel.w-size {
233
+ width: 120px;
234
+ }
235
+
236
+ .tsel.w-block {
237
+ width: 116px;
238
+ }
239
+
240
+ /* edit area */
241
+ .earea {
242
+ outline: none;
243
+ overflow: auto;
244
+ padding: 16px;
245
+ height: 302px;
246
+ font-family: Helvetica, Arial, sans-serif;
247
+ font-size: 14px;
248
+ line-height: 1.4;
249
+ border-top: 1px solid #eeeeee;
250
+ }
251
+
252
+ .tox.fullscreen .earea {
253
+ flex: 1;
254
+ height: auto;
255
+ }
256
+
257
+ .earea p {
258
+ margin: 0 0 1em;
259
+ }
260
+
261
+ .earea table {
262
+ border-collapse: collapse;
263
+ }
264
+
265
+ .earea table td,
266
+ .earea table th {
267
+ padding: 4px 8px;
268
+ min-width: 26px;
269
+ overflow-wrap: break-word;
270
+ word-break: break-word;
271
+ }
272
+
273
+ .earea img {
274
+ max-width: 100%;
275
+ height: auto;
276
+ }
277
+
278
+ /* image upload placeholder */
279
+ .earea .img-ph {
280
+ display: flex;
281
+ align-items: center;
282
+ justify-content: center;
283
+ gap: 9px;
284
+ max-width: 360px;
285
+ padding: 18px 14px;
286
+ margin: 8px 0;
287
+ border: 1.5px solid #a8c7f0;
288
+ border-radius: 8px;
289
+ background: #fbfdff;
290
+ color: #7a828e;
291
+ font-size: 13.5px;
292
+ text-align: center;
293
+ cursor: pointer;
294
+ -webkit-user-select: none;
295
+ user-select: none;
296
+ }
297
+
298
+ .earea .img-ph svg {
299
+ width: 20px;
300
+ height: 20px;
301
+ flex: none;
302
+ }
303
+
304
+ .earea .img-ph svg .f {
305
+ fill: #7a828e;
306
+ }
307
+
308
+ .earea .img-ph.active {
309
+ outline: 2px solid #006ce7;
310
+ outline-offset: 1px;
311
+ }
312
+
313
+ .earea .img-ph.uploading {
314
+ cursor: wait;
315
+ opacity: 0.75;
316
+ }
317
+
318
+ .earea .img-ph.uploading svg {
319
+ animation: img-ph-spin 1s linear infinite;
320
+ transform-origin: center;
321
+ }
322
+
323
+ @keyframes img-ph-spin {
324
+ to { transform: rotate(360deg); }
325
+ }
326
+
327
+ .earea .img-ph.upload-error {
328
+ border-color: #e03e2d;
329
+ background: #fff5f5;
330
+ color: #c92a2a;
331
+ }
332
+
333
+ .earea .img-ph.upload-error svg .f {
334
+ fill: #c92a2a;
335
+ }
336
+
337
+ .earea table.tbl-selected {
338
+ outline: 2px solid #006ce7;
339
+ outline-offset: 1px;
340
+ }
341
+
342
+ .tbl-handle {
343
+ position: absolute;
344
+ width: 10px;
345
+ height: 10px;
346
+ background: #006ce7;
347
+ border: 1px solid #fff;
348
+ border-radius: 2px;
349
+ box-shadow: 0 0 0 1px rgba(34, 47, 62, .25);
350
+ z-index: 1150;
351
+ }
352
+
353
+ .tbl-colbar {
354
+ position: absolute;
355
+ width: 7px;
356
+ margin-inline-start: -3px;
357
+ z-index: 1140;
358
+ cursor: col-resize;
359
+ border-radius: 2px;
360
+ }
361
+
362
+ .tbl-colbar:hover,
363
+ .tbl-colbar.active {
364
+ background: rgba(0, 108, 231, .28);
365
+ }
366
+
367
+ /* border around the cell that holds the caret */
368
+ .tbl-cellmark {
369
+ position: absolute;
370
+ pointer-events: none;
371
+ border: 1.5px solid #006ce7;
372
+ border-radius: 1px;
373
+ z-index: 1145;
374
+ }
375
+
376
+ /* dashed highlight over the row/column a hovered operation targets */
377
+ .tbl-opmark {
378
+ position: absolute;
379
+ pointer-events: none;
380
+ border: 1.5px dashed #006ce7;
381
+ background: rgba(0, 108, 231, .07);
382
+ border-radius: 2px;
383
+ z-index: 1144;
384
+ }
385
+
386
+ .tblctx {
387
+ position: absolute;
388
+ display: flex;
389
+ align-items: center;
390
+ gap: 1px;
391
+ background: #fff;
392
+ border-radius: 8px;
393
+ box-shadow: 0 4px 14px rgba(34, 47, 62, .18), 0 0 0 1px rgba(34, 47, 62, .06);
394
+ padding: 4px;
395
+ z-index: 1160;
396
+ }
397
+
398
+ .tblctx button {
399
+ display: flex;
400
+ align-items: center;
401
+ justify-content: center;
402
+ width: 32px;
403
+ height: 32px;
404
+ border: 0;
405
+ background: none;
406
+ border-radius: 5px;
407
+ cursor: pointer;
408
+ color: #222f3e;
409
+ padding: 0;
410
+ }
411
+
412
+ .tblctx button:hover {
413
+ background: #f0f0f0;
414
+ }
415
+
416
+ .tblctx button svg {
417
+ width: 20px;
418
+ height: 20px;
419
+ stroke: #222f3e;
420
+ fill: none;
421
+ stroke-width: 1.7;
422
+ stroke-linecap: round;
423
+ stroke-linejoin: round;
424
+ }
425
+
426
+ .tblctx button svg .f {
427
+ fill: #222f3e;
428
+ stroke: none;
429
+ }
430
+
431
+ .tblctx .sep {
432
+ width: 1px;
433
+ align-self: stretch;
434
+ margin: 3px 3px;
435
+ background: #eeeeee;
436
+ }
437
+
438
+ /* image resize / align toolbar */
439
+ .earea img.img-selected {
440
+ outline: 2px solid #006ce7;
441
+ outline-offset: 1px;
442
+ }
443
+
444
+ .img-handle {
445
+ position: absolute;
446
+ width: 10px;
447
+ height: 10px;
448
+ background: #006ce7;
449
+ border: 1px solid #fff;
450
+ border-radius: 2px;
451
+ box-shadow: 0 0 0 1px rgba(34, 47, 62, .25);
452
+ z-index: 1150;
453
+ }
454
+
455
+ .img-handle-nw,
456
+ .img-handle-se {
457
+ cursor: nwse-resize;
458
+ }
459
+
460
+ .img-handle-ne,
461
+ .img-handle-sw {
462
+ cursor: nesw-resize;
463
+ }
464
+
465
+ .imgctx {
466
+ position: absolute;
467
+ display: flex;
468
+ align-items: center;
469
+ gap: 1px;
470
+ background: #fff;
471
+ border-radius: 8px;
472
+ box-shadow: 0 4px 14px rgba(34, 47, 62, .18), 0 0 0 1px rgba(34, 47, 62, .06);
473
+ padding: 4px;
474
+ z-index: 1160;
475
+ }
476
+
477
+ .imgctx button {
478
+ display: flex;
479
+ align-items: center;
480
+ justify-content: center;
481
+ width: 32px;
482
+ height: 32px;
483
+ border: 0;
484
+ background: none;
485
+ border-radius: 5px;
486
+ cursor: pointer;
487
+ color: #222f3e;
488
+ padding: 0;
489
+ }
490
+
491
+ .imgctx button:hover {
492
+ background: #f0f0f0;
493
+ }
494
+
495
+ .imgctx button.on {
496
+ background: #cce2fa;
497
+ }
498
+
499
+ .imgctx button svg {
500
+ width: 20px;
501
+ height: 20px;
502
+ stroke: #222f3e;
503
+ fill: none;
504
+ stroke-width: 1.7;
505
+ stroke-linecap: round;
506
+ stroke-linejoin: round;
507
+ }
508
+
509
+ .imgctx button svg .f {
510
+ fill: #222f3e;
511
+ stroke: none;
512
+ }
513
+
514
+ /* image placeholder toolbar: URL input mode */
515
+ .imgctx input.urlinp {
516
+ width: 240px;
517
+ height: 30px;
518
+ border: 1px solid #cfd6df;
519
+ border-radius: 5px;
520
+ padding: 0 9px;
521
+ font: 13.5px inherit;
522
+ margin: 0 2px;
523
+ }
524
+
525
+ .imgctx input.urlinp.err {
526
+ border-color: #e03e2d;
527
+ }
528
+
529
+ .imgctx button.txtbtn {
530
+ width: auto;
531
+ padding: 0 12px;
532
+ font: 13.5px inherit;
533
+ white-space: nowrap;
534
+ }
535
+
536
+ /* text selection bubble toolbar */
537
+ .selctx {
538
+ position: absolute;
539
+ display: flex;
540
+ align-items: center;
541
+ gap: 1px;
542
+ background: #222f3e;
543
+ border-radius: 8px;
544
+ box-shadow: 0 6px 18px rgba(34, 47, 62, .3), 0 0 0 1px rgba(34, 47, 62, .06);
545
+ padding: 4px;
546
+ z-index: 1160;
547
+ }
548
+
549
+ .selctx button {
550
+ position: relative;
551
+ display: flex;
552
+ align-items: center;
553
+ justify-content: center;
554
+ min-width: 32px;
555
+ height: 32px;
556
+ padding: 0 7px;
557
+ border: 0;
558
+ background: none;
559
+ border-radius: 5px;
560
+ cursor: pointer;
561
+ color: #fff;
562
+ }
563
+
564
+ .selctx button:hover {
565
+ background: rgba(255, 255, 255, .15);
566
+ }
567
+
568
+ .selctx button.on {
569
+ background: rgba(255, 255, 255, .28);
570
+ }
571
+
572
+ .selctx button svg {
573
+ width: 18px;
574
+ height: 18px;
575
+ stroke: #fff;
576
+ fill: none;
577
+ stroke-width: 1.7;
578
+ stroke-linecap: round;
579
+ stroke-linejoin: round;
580
+ }
581
+
582
+ .selctx button svg .f {
583
+ fill: #fff;
584
+ stroke: none;
585
+ }
586
+
587
+ .selctx .sep {
588
+ width: 1px;
589
+ align-self: stretch;
590
+ margin: 3px 3px;
591
+ background: rgba(255, 255, 255, .25);
592
+ }
593
+
594
+ .selctx .colorbar {
595
+ position: absolute;
596
+ bottom: 4px;
597
+ left: 7px;
598
+ right: 7px;
599
+ height: 3px;
600
+ border-radius: 1px;
601
+ background: #fff;
602
+ }
603
+
604
+ .earea hr.pagebreak {
605
+ border: 0;
606
+ border-top: 2px dashed #aab2bd;
607
+ margin: 14px 0;
608
+ page-break-after: always;
609
+ }
610
+
611
+ .earea:focus {}
612
+
613
+ /* statusbar */
614
+ .sbar {
615
+ display: flex;
616
+ align-items: center;
617
+ border-top: 1px solid #eeeeee;
618
+ height: 32px;
619
+ padding: 0 10px;
620
+ font-size: 13px;
621
+ color: #7a828e;
622
+ position: relative;
623
+ }
624
+
625
+ .sbar .mid {
626
+ position: absolute;
627
+ left: 0;
628
+ right: 0;
629
+ text-align: center;
630
+ pointer-events: none;
631
+ }
632
+
633
+ .sbar .words {
634
+ margin-inline-start: auto;
635
+ z-index: 1;
636
+ }
637
+
638
+ .sbar .grip {
639
+ width: 16px;
640
+ height: 16px;
641
+ margin-inline-start: 8px;
642
+ cursor: ns-resize;
643
+ z-index: 1;
644
+ display: flex;
645
+ align-items: flex-end;
646
+ justify-content: flex-end;
647
+ }
648
+
649
+ .sbar .grip svg {
650
+ width: 11px;
651
+ height: 11px;
652
+ stroke: #9aa2ac;
653
+ stroke-width: 1.6;
654
+ }
655
+
656
+ /* ================= popups / menus ================= */
657
+ .pop {
658
+ position: absolute;
659
+ z-index: 1200;
660
+ background: #fff;
661
+ border-radius: 8px;
662
+ padding: 6px;
663
+ box-shadow: 0 6px 18px rgba(34, 47, 62, .16), 0 0 0 1px rgba(34, 47, 62, .07);
664
+ min-width: 160px;
665
+ max-height: 70vh;
666
+ overflow: auto;
667
+ }
668
+
669
+ .pop .mi {
670
+ display: flex;
671
+ align-items: center;
672
+ gap: 9px;
673
+ width: 100%;
674
+ min-height: 32px;
675
+ border: 0;
676
+ background: none;
677
+ padding: 6px 10px;
678
+ border-radius: 5px;
679
+ font: 14px inherit;
680
+ color: #222f3e;
681
+ cursor: pointer;
682
+ text-align: start;
683
+ white-space: nowrap;
684
+ }
685
+
686
+ .pop .mi:hover {
687
+ background: #f0f0f0;
688
+ }
689
+
690
+ .pop .mi.on {
691
+ background: #cce2fa;
692
+ }
693
+
694
+ .pop .mi .ic {
695
+ width: 20px;
696
+ flex: none;
697
+ display: flex;
698
+ }
699
+
700
+ .pop .mi .ic svg {
701
+ width: 27px;
702
+ height: 27px;
703
+ stroke: #222f3e;
704
+ fill: none;
705
+ stroke-width: 1.7;
706
+ stroke-linecap: round;
707
+ stroke-linejoin: round;
708
+ }
709
+
710
+ .pop .mi .ic svg .f {
711
+ fill: #222f3e;
712
+ stroke: none;
713
+ }
714
+
715
+ .pop .mi .sc {
716
+ margin-inline-start: auto;
717
+ color: #9aa2ac;
718
+ font-size: 12.5px;
719
+ padding-inline-start: 22px;
720
+ min-width: 46px;
721
+ text-align: end;
722
+ }
723
+
724
+ .pop .sep {
725
+ height: 1px;
726
+ background: #ebedf0;
727
+ margin: 5px 8px;
728
+ }
729
+
730
+ .mi-grid {
731
+ display: grid;
732
+ grid-template-columns: 1fr 1fr;
733
+ gap: 2px;
734
+ }
735
+
736
+ /* flyout submenus */
737
+ .pop.sub {
738
+ z-index: 1210;
739
+ }
740
+
741
+ .pop .mi .subarrow {
742
+ margin-inline-start: auto;
743
+ padding-inline-start: 18px;
744
+ display: flex;
745
+ align-items: center;
746
+ }
747
+
748
+ .pop .mi .subarrow svg {
749
+ width: 10px;
750
+ height: 10px;
751
+ stroke: #7a828e;
752
+ stroke-width: 2;
753
+ fill: none;
754
+ transform: rotate(-90deg);
755
+ }
756
+
757
+ [dir=rtl] .pop .mi .subarrow svg {
758
+ transform: rotate(90deg);
759
+ }
760
+
761
+ .pop .mi .prev {
762
+ font-size: 14px
763
+ }
764
+
765
+ /* color palette */
766
+ .cpal {
767
+ display: grid;
768
+ grid-template-columns: repeat(5, 26px);
769
+ gap: 4px;
770
+ padding: 6px;
771
+ }
772
+
773
+ .cpal button {
774
+ width: 26px;
775
+ height: 26px;
776
+ border: 1px solid rgba(34, 47, 62, .18);
777
+ border-radius: 3px;
778
+ cursor: pointer;
779
+ padding: 0;
780
+ transition: transform .06s ease;
781
+ }
782
+
783
+ .cpal button:hover {
784
+ transform: scale(0.9);
785
+ }
786
+
787
+ /* custom color footer: current color, no-color, custom-color wheel */
788
+ .cfoot {
789
+ display: flex;
790
+ align-items: center;
791
+ justify-content: space-between;
792
+ padding: 4px 2px;
793
+ }
794
+
795
+ .cswatch {
796
+ width: 26px;
797
+ height: 26px;
798
+ flex: none;
799
+ border: 1px solid rgba(34, 47, 62, .18);
800
+ border-radius: 5px;
801
+ padding: 0;
802
+ position: relative;
803
+ }
804
+
805
+ .cswatch.cur {
806
+ cursor: default;
807
+ }
808
+
809
+ .cswatch.cur svg {
810
+ position: absolute;
811
+ inset: 0;
812
+ margin: auto;
813
+ width: 14px;
814
+ height: 14px;
815
+ stroke: #fff;
816
+ fill: none;
817
+ stroke-width: 2.4;
818
+ stroke-linecap: round;
819
+ stroke-linejoin: round;
820
+ filter: drop-shadow(0 0 1px rgba(0, 0, 0, .5));
821
+ }
822
+
823
+ .cswatch.nocolor {
824
+ cursor: pointer;
825
+ background: #fff;
826
+ }
827
+
828
+ .cswatch.nocolor::after {
829
+ content: "";
830
+ position: absolute;
831
+ inset: 1px;
832
+ border-radius: 3px;
833
+ background: linear-gradient(to top left, transparent calc(50% - 1px), #e03e2d calc(50% - 1px), #e03e2d calc(50% + 1px), transparent calc(50% + 1px));
834
+ }
835
+
836
+ .cswatch.nocolor:hover {
837
+ border-color: rgba(34, 47, 62, .35);
838
+ }
839
+
840
+ .cwheel {
841
+ cursor: pointer;
842
+ display: flex;
843
+ align-items: center;
844
+ justify-content: center;
845
+ }
846
+
847
+ .cwheel:hover {
848
+ border-color: rgba(34, 47, 62, .35);
849
+ }
850
+
851
+ .cwheel svg {
852
+ width: 20px;
853
+ height: 20px;
854
+ stroke: #556;
855
+ fill: none;
856
+ stroke-width: 1.6;
857
+ stroke-linecap: round;
858
+ stroke-linejoin: round;
859
+ }
860
+
861
+ .cwheel svg .f {
862
+ fill: #556;
863
+ stroke: none;
864
+ }
865
+
866
+ .cwheel input[type=color] {
867
+ position: absolute;
868
+ width: 1px;
869
+ height: 1px;
870
+ opacity: 0;
871
+ overflow: hidden;
872
+ border: 0;
873
+ padding: 0;
874
+ }
875
+
876
+ .tsel.w-size {
877
+ width: 58px;
878
+ }
879
+
880
+ /* toolbar buttons that open a menu */
881
+ .tbtn.hasmenu {
882
+ gap: 4px;
883
+ padding: 0 7px;
884
+ }
885
+
886
+ .tbtn.hasmenu svg:last-child {
887
+ width: 9px;
888
+ height: 9px;
889
+ stroke: #7a828e;
890
+ stroke-width: 2.2;
891
+ flex: none;
892
+ }
893
+
894
+ /* quick color chips */
895
+ .cchip {
896
+ width: 23px;
897
+ height: 23px;
898
+ flex: none;
899
+ border: 0;
900
+ border-radius: 20px;
901
+ margin: 0 3px;
902
+ padding: 0;
903
+ cursor: pointer;
904
+ box-shadow: inset 0 0 0 1px rgba(34, 47, 62, .08);
905
+ transition: transform .08s ease;
906
+ }
907
+
908
+ .cchip:hover {
909
+ transform: scale(1.1);
910
+ }
911
+
912
+ .cchip.more {
913
+ display: flex;
914
+ align-items: center;
915
+ justify-content: center;
916
+ background: #222f3e;
917
+ }
918
+
919
+ .cchip.more svg {
920
+ width: 11px;
921
+ height: 11px;
922
+ stroke: #fff;
923
+ stroke-width: 2.4;
924
+ fill: none;
925
+ stroke-linecap: round;
926
+ stroke-linejoin: round;
927
+ transform: rotate(-90deg);
928
+ }
929
+
930
+ [dir=rtl] .cchip.more svg {
931
+ transform: rotate(90deg);
932
+ }
933
+
934
+ /* selection toolbar dark icons with text glyphs */
935
+ .selctx button svg text {
936
+ fill: #fff;
937
+ }
938
+
939
+ /* revision history */
940
+ .revwrap {
941
+ display: flex;
942
+ gap: 12px;
943
+ min-width: 560px;
944
+ max-width: 82vw;
945
+ }
946
+
947
+ .revlist {
948
+ width: 230px;
949
+ flex: none;
950
+ max-height: 48vh;
951
+ overflow: auto;
952
+ display: flex;
953
+ flex-direction: column;
954
+ gap: 2px;
955
+ }
956
+
957
+ .revlist button {
958
+ display: flex;
959
+ flex-direction: column;
960
+ align-items: flex-start;
961
+ gap: 2px;
962
+ text-align: start;
963
+ border: 0;
964
+ background: none;
965
+ border-radius: 5px;
966
+ padding: 8px 10px;
967
+ font: 13.5px inherit;
968
+ color: #222f3e;
969
+ cursor: pointer;
970
+ }
971
+
972
+ .revlist button:hover {
973
+ background: #f0f0f0;
974
+ }
975
+
976
+ .revlist button.on {
977
+ background: #cce2fa;
978
+ }
979
+
980
+ .revlist button .wc {
981
+ font-size: 12px;
982
+ color: #7a828e;
983
+ }
984
+
985
+ .revlist button.revrestore {
986
+ display: block;
987
+ text-align: center;
988
+ margin-top: 8px;
989
+ border: 1px solid #006ce7;
990
+ background: #006ce7;
991
+ color: #fff;
992
+ padding: 8px 12px;
993
+ border-radius: 6px;
994
+ }
995
+
996
+ .revlist button.revrestore:disabled {
997
+ opacity: .45;
998
+ cursor: default;
999
+ }
1000
+
1001
+ .revprev {
1002
+ flex: 1;
1003
+ min-width: 300px;
1004
+ max-height: 48vh;
1005
+ overflow: auto;
1006
+ border: 1px solid #e3e3e3;
1007
+ border-radius: 6px;
1008
+ padding: 12px;
1009
+ font-family: Helvetica, Arial, sans-serif;
1010
+ font-size: 14px;
1011
+ }
1012
+
1013
+ /* char map */
1014
+ .chgrid {
1015
+ display: grid;
1016
+ grid-template-columns: repeat(8, 30px);
1017
+ gap: 2px;
1018
+ padding: 6px;
1019
+ }
1020
+
1021
+ .chgrid button {
1022
+ width: 30px;
1023
+ height: 30px;
1024
+ border: 0;
1025
+ background: none;
1026
+ border-radius: 3px;
1027
+ font-size: 15px;
1028
+ cursor: pointer;
1029
+ }
1030
+
1031
+ .chgrid button:hover {
1032
+ background: #f0f0f0;
1033
+ }
1034
+
1035
+ /* table grid picker */
1036
+ .tgridwrap {
1037
+ padding: 8px;
1038
+ }
1039
+
1040
+ .tgrid {
1041
+ display: grid;
1042
+ grid-template-columns: repeat(10, 16px);
1043
+ gap: 2px;
1044
+ direction: ltr;
1045
+ }
1046
+
1047
+ .tgrid span {
1048
+ width: 16px;
1049
+ height: 16px;
1050
+ border: 1px solid #c9d1da;
1051
+ border-radius: 2px;
1052
+ background: #fff;
1053
+ }
1054
+
1055
+ .tgrid span.hot {
1056
+ background: #cce2fa;
1057
+ border-color: #7fb3ef;
1058
+ }
1059
+
1060
+ .tgridlbl {
1061
+ text-align: center;
1062
+ font-size: 12.5px;
1063
+ color: #556;
1064
+ padding-top: 6px;
1065
+ }
1066
+
1067
+ /* ================= dialogs ================= */
1068
+ .ovl {
1069
+ position: fixed;
1070
+ inset: 0;
1071
+ background: rgba(34, 47, 62, .5);
1072
+ z-index: 1500;
1073
+ display: flex;
1074
+ align-items: flex-start;
1075
+ justify-content: center;
1076
+ padding-top: 9vh;
1077
+ }
1078
+
1079
+ .dlg {
1080
+ background: #fff;
1081
+ border-radius: 10px;
1082
+ min-width: 420px;
1083
+ max-width: 90vw;
1084
+ max-height: 80vh;
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+ box-shadow: 0 16px 32px rgba(0, 0, 0, .25);
1088
+ }
1089
+
1090
+ .dlg header {
1091
+ display: flex;
1092
+ align-items: center;
1093
+ justify-content: space-between;
1094
+ padding: 14px 16px;
1095
+ font-size: 18px;
1096
+ font-weight: 600;
1097
+ }
1098
+
1099
+ .dlg header button {
1100
+ border: 0;
1101
+ background: none;
1102
+ font-size: 20px;
1103
+ cursor: pointer;
1104
+ color: #222f3e;
1105
+ border-radius: 3px;
1106
+ width: 32px;
1107
+ height: 32px;
1108
+ }
1109
+
1110
+ .dlg header button:hover {
1111
+ background: #f0f0f0;
1112
+ }
1113
+
1114
+ .dlg .body {
1115
+ padding: 0 16px 8px;
1116
+ overflow: auto;
1117
+ font-size: 14px;
1118
+ }
1119
+
1120
+ .dlg footer {
1121
+ display: flex;
1122
+ justify-content: flex-end;
1123
+ gap: 8px;
1124
+ padding: 12px 16px;
1125
+ }
1126
+
1127
+ .dlg footer button {
1128
+ border-radius: 6px;
1129
+ padding: 8px 16px;
1130
+ font: 14px inherit;
1131
+ cursor: pointer;
1132
+ border: 1px solid #cfd6df;
1133
+ background: #fff;
1134
+ color: #222f3e;
1135
+ }
1136
+
1137
+ .dlg footer button.pri {
1138
+ background: #006ce7;
1139
+ border-color: #006ce7;
1140
+ color: #fff;
1141
+ }
1142
+
1143
+ .dlg textarea {
1144
+ width: 640px;
1145
+ max-width: 80vw;
1146
+ height: 300px;
1147
+ font: 12.5px/1.5 Consolas, monospace;
1148
+ border: 1px solid #cfd6df;
1149
+ border-radius: 6px;
1150
+ padding: 10px;
1151
+ resize: vertical;
1152
+ }
1153
+
1154
+ .dlg table.kbd {
1155
+ border-collapse: collapse;
1156
+ width: 100%;
1157
+ }
1158
+
1159
+ .dlg table.kbd td {
1160
+ border-bottom: 1px solid #eee;
1161
+ padding: 7px 4px;
1162
+ }
1163
+
1164
+ .dlg table.kbd td:last-child {
1165
+ text-align: end;
1166
+ color: #556;
1167
+ }
1168
+
1169
+ kbd {
1170
+ background: #f3f4f6;
1171
+ border-radius: 4px;
1172
+ padding: 2px 7px;
1173
+ font: 12px Consolas, monospace;
1174
+ border: 1px solid #dde2e8;
1175
+ }