@vaadin/rich-text-editor 25.0.0-alpha2 → 25.0.0-alpha20

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.
@@ -0,0 +1,580 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2000 - 2025 Vaadin Ltd.
4
+ *
5
+ * This program is available under Vaadin Commercial License and Service Terms.
6
+ *
7
+ *
8
+ * See https://vaadin.com/commercial-license-and-service-terms for the full
9
+ * license.
10
+ */
11
+ import { css } from 'lit';
12
+ import { icons } from './vaadin-rich-text-editor-base-icons.js';
13
+
14
+ const base = css`
15
+ :host {
16
+ background: var(--vaadin-rich-text-editor-background, var(--vaadin-background-color));
17
+ border: var(--vaadin-input-field-border-width, 1px) solid
18
+ var(--vaadin-input-field-border-color, var(--vaadin-border-color));
19
+ border-radius: var(--vaadin-input-field-border-radius, var(--vaadin-radius-m));
20
+ box-sizing: border-box;
21
+ display: flex;
22
+ flex-direction: column;
23
+ overflow: hidden;
24
+ }
25
+
26
+ :host(:focus-within) {
27
+ outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
28
+ outline-offset: -1px;
29
+ }
30
+
31
+ :host([hidden]) {
32
+ display: none !important;
33
+ }
34
+
35
+ .announcer {
36
+ clip: rect(0, 0, 0, 0);
37
+ position: fixed;
38
+ }
39
+
40
+ input[type='file'] {
41
+ display: none;
42
+ }
43
+
44
+ .vaadin-rich-text-editor-container {
45
+ display: flex;
46
+ flex: auto;
47
+ flex-direction: column;
48
+ max-height: inherit;
49
+ min-height: inherit;
50
+ }
51
+ `;
52
+
53
+ export const content = css`
54
+ :host {
55
+ --_item-indent: var(--vaadin-padding-l);
56
+ --_marker-indent: calc(var(--vaadin-padding-s) / 2);
57
+ --_list-indent: calc(var(--_item-indent) + var(--_marker-indent));
58
+ }
59
+
60
+ [part='content'] {
61
+ box-sizing: border-box;
62
+ display: flex;
63
+ flex: auto;
64
+ flex-direction: column;
65
+ overflow: hidden;
66
+ position: relative;
67
+ }
68
+
69
+ /*
70
+ Quill core styles.
71
+ CSS selectors removed: margin & padding reset, check list, indentation, video, colors, ordered & unordered list, h1-6, anchor
72
+ */
73
+ .ql-clipboard {
74
+ height: 1px;
75
+ left: -100000px;
76
+ overflow-y: hidden;
77
+ position: absolute;
78
+ top: 50%;
79
+ }
80
+
81
+ .ql-clipboard p {
82
+ margin: 0;
83
+ padding: 0;
84
+ }
85
+
86
+ .ql-editor {
87
+ box-sizing: border-box;
88
+ color: var(--vaadin-rich-text-editor-editor-color, var(--vaadin-text-color));
89
+ flex: 1;
90
+ font-size: var(--vaadin-rich-text-editor-editor-font-size, inherit);
91
+ height: 100%;
92
+ line-height: var(--vaadin-rich-text-editor-editor-line-height, inherit);
93
+ outline: none;
94
+ overflow-y: auto;
95
+ padding: var(--vaadin-rich-text-editor-editor-padding, var(--vaadin-padding-container));
96
+ tab-size: calc(var(--_item-indent) * 2);
97
+ text-align: left;
98
+ white-space: pre-wrap;
99
+ word-wrap: break-word;
100
+ }
101
+
102
+ .ql-editor > * {
103
+ cursor: text;
104
+ }
105
+
106
+ .ql-align-left {
107
+ text-align: left;
108
+ }
109
+
110
+ .ql-direction-rtl {
111
+ direction: rtl;
112
+ text-align: inherit;
113
+ }
114
+
115
+ .ql-align-center {
116
+ text-align: center;
117
+ }
118
+
119
+ .ql-align-justify {
120
+ text-align: justify;
121
+ }
122
+
123
+ .ql-align-right {
124
+ text-align: right;
125
+ }
126
+
127
+ .ql-code-block-container {
128
+ font-family: monospace;
129
+ background-color: var(--vaadin-background-container);
130
+ border-radius: var(--vaadin-radius-s);
131
+ white-space: pre-wrap;
132
+ margin-block: var(--vaadin-padding-s);
133
+ padding: var(--vaadin-padding-container);
134
+ }
135
+
136
+ /* lists */
137
+ .ql-editor ol {
138
+ padding-inline-start: var(--_list-indent);
139
+ }
140
+
141
+ .ql-editor li {
142
+ list-style-type: none;
143
+ position: relative;
144
+ padding-inline-start: var(--_item-indent);
145
+ }
146
+
147
+ .ql-editor li > .ql-ui::before {
148
+ display: inline-block;
149
+ width: var(--_item-indent);
150
+ margin-inline: calc(var(--_item-indent) * -1) var(--_marker-indent);
151
+ text-align: end;
152
+ white-space: nowrap;
153
+ }
154
+
155
+ .ql-editor li[data-list='bullet'] > .ql-ui::before {
156
+ content: '\\2022';
157
+ font-size: 1.5rem;
158
+ line-height: 1rem;
159
+ align-self: baseline;
160
+ vertical-align: text-top;
161
+ }
162
+
163
+ .ql-editor p,
164
+ .ql-editor h1,
165
+ .ql-editor h2,
166
+ .ql-editor h3,
167
+ .ql-editor h4,
168
+ .ql-editor h5,
169
+ .ql-editor h6 {
170
+ counter-set: list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
171
+ }
172
+
173
+ /* 0 */
174
+ .ql-editor li[data-list='ordered'] {
175
+ counter-increment: list-0;
176
+ }
177
+
178
+ .ql-editor li[data-list='ordered'] > .ql-ui::before {
179
+ content: counter(list-0, decimal) '. ';
180
+ }
181
+
182
+ /* 1 */
183
+ .ql-editor li[data-list='ordered'].ql-indent-1 {
184
+ counter-increment: list-1;
185
+ }
186
+
187
+ .ql-editor li[data-list='ordered'].ql-indent-1 > .ql-ui::before {
188
+ content: counter(list-1, lower-alpha) '. ';
189
+ }
190
+
191
+ .ql-editor li[data-list].ql-indent-1 {
192
+ counter-set: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
193
+ }
194
+
195
+ /* 2 */
196
+ .ql-editor li[data-list='ordered'].ql-indent-2 {
197
+ counter-increment: list-2;
198
+ }
199
+
200
+ .ql-editor li[data-list='ordered'].ql-indent-2 > .ql-ui::before {
201
+ content: counter(list-2, lower-roman) '. ';
202
+ }
203
+
204
+ .ql-editor li[data-list].ql-indent-2 {
205
+ counter-set: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
206
+ }
207
+
208
+ /* 3 */
209
+ .ql-editor li[data-list='ordered'].ql-indent-3 {
210
+ counter-increment: list-3;
211
+ }
212
+
213
+ .ql-editor li[data-list='ordered'].ql-indent-3 > .ql-ui::before {
214
+ content: counter(list-3, decimal) '. ';
215
+ }
216
+
217
+ .ql-editor li[data-list].ql-indent-3 {
218
+ counter-set: list-4 list-5 list-6 list-7 list-8 list-9;
219
+ }
220
+
221
+ /* 4 */
222
+ .ql-editor li[data-list='ordered'].ql-indent-4 {
223
+ counter-increment: list-4;
224
+ }
225
+
226
+ .ql-editor li[data-list='ordered'].ql-indent-4 > .ql-ui::before {
227
+ content: counter(list-4, lower-alpha) '. ';
228
+ }
229
+
230
+ .ql-editor li[data-list].ql-indent-4 {
231
+ counter-set: list-5 list-6 list-7 list-8 list-9;
232
+ }
233
+
234
+ /* 5 */
235
+ .ql-editor li[data-list='ordered'].ql-indent-5 {
236
+ counter-increment: list-5;
237
+ }
238
+
239
+ .ql-editor li[data-list='ordered'].ql-indent-5 > .ql-ui::before {
240
+ content: counter(list-5, lower-roman) '. ';
241
+ }
242
+
243
+ .ql-editor li[data-list].ql-indent-5 {
244
+ counter-set: list-6 list-7 list-8 list-9;
245
+ }
246
+
247
+ /* 6 */
248
+ .ql-editor li[data-list='ordered'].ql-indent-6 {
249
+ counter-increment: list-6;
250
+ }
251
+
252
+ .ql-editor li[data-list='ordered'].ql-indent-6 > .ql-ui::before {
253
+ content: counter(list-6, decimal) '. ';
254
+ }
255
+
256
+ .ql-editor li[data-list].ql-indent-6 {
257
+ counter-set: list-7 list-8 list-9;
258
+ }
259
+
260
+ /* 7 */
261
+ .ql-editor li[data-list='ordered'].ql-indent-7 {
262
+ counter-increment: list-7;
263
+ }
264
+
265
+ .ql-editor li[data-list='ordered'].ql-indent-7 > .ql-ui::before {
266
+ content: counter(list-7, lower-alpha) '. ';
267
+ }
268
+
269
+ .ql-editor li[data-list].ql-indent-7 {
270
+ counter-set: list-8 list-9;
271
+ }
272
+
273
+ /* 8 */
274
+ .ql-editor li[data-list='ordered'].ql-indent-8 {
275
+ counter-increment: list-8;
276
+ }
277
+
278
+ .ql-editor li[data-list='ordered'].ql-indent-8 > .ql-ui::before {
279
+ content: counter(list-8, lower-roman) '. ';
280
+ }
281
+
282
+ .ql-editor li[data-list].ql-indent-8 {
283
+ counter-set: list-9;
284
+ }
285
+
286
+ /* indent 1 */
287
+ .ql-editor .ql-indent-1 {
288
+ padding-inline-start: calc(var(--_item-indent) * 2);
289
+ }
290
+
291
+ .ql-editor li.ql-indent-1 {
292
+ padding-inline-start: calc(var(--_list-indent) + var(--_item-indent) * 2);
293
+ }
294
+
295
+ /* indent 2 */
296
+ .ql-editor .ql-indent-2 {
297
+ padding-inline-start: calc(var(--_item-indent) * 4);
298
+ }
299
+
300
+ .ql-editor li.ql-indent-2 {
301
+ padding-inline-start: calc(var(--_list-indent) * 2 + var(--_item-indent) * 3);
302
+ }
303
+
304
+ /* indent 3 */
305
+ .ql-editor .ql-indent-3 {
306
+ padding-inline-start: calc(var(--_item-indent) * 6);
307
+ }
308
+
309
+ .ql-editor li.ql-indent-3 {
310
+ padding-inline-start: calc(var(--_list-indent) * 3 + var(--_item-indent) * 4);
311
+ }
312
+
313
+ /* indent 4 */
314
+ .ql-editor .ql-indent-4 {
315
+ padding-inline-start: calc(var(--_item-indent) * 8);
316
+ }
317
+
318
+ .ql-editor li.ql-indent-4 {
319
+ padding-inline-start: calc(var(--_list-indent) * 4 + var(--_item-indent) * 5);
320
+ }
321
+
322
+ /* indent 5 */
323
+ .ql-editor .ql-indent-5 {
324
+ padding-inline-start: calc(var(--_item-indent) * 10);
325
+ }
326
+
327
+ .ql-editor li.ql-indent-5 {
328
+ padding-inline-start: calc(var(--_list-indent) * 5 + var(--_item-indent) * 6);
329
+ }
330
+
331
+ /* indent 6 */
332
+ .ql-editor .ql-indent-6 {
333
+ padding-inline-start: calc(var(--_item-indent) * 12);
334
+ }
335
+
336
+ .ql-editor li.ql-indent-6 {
337
+ padding-inline-start: calc(var(--_list-indent) * 6 + var(--_item-indent) * 7);
338
+ }
339
+
340
+ /* indent 7 */
341
+ .ql-editor .ql-indent-7 {
342
+ padding-inline-start: calc(var(--_item-indent) * 14);
343
+ }
344
+
345
+ .ql-editor li.ql-indent-7 {
346
+ padding-inline-start: calc(var(--_list-indent) * 7 + var(--_item-indent) * 8);
347
+ }
348
+
349
+ /* indent 8 */
350
+ .ql-editor .ql-indent-8 {
351
+ padding-inline-start: calc(var(--_item-indent) * 16);
352
+ }
353
+
354
+ .ql-editor li.ql-indent-8 {
355
+ padding-inline-start: calc(var(--_list-indent) * 8 + var(--_item-indent) * 9);
356
+ }
357
+ /* quill core end */
358
+
359
+ blockquote {
360
+ border-inline-start: 4px solid var(--vaadin-border-color-secondary);
361
+ margin: var(--vaadin-padding-container);
362
+ padding-inline-start: var(--vaadin-padding-s);
363
+ }
364
+
365
+ code {
366
+ background-color: var(--vaadin-background-container);
367
+ border-radius: var(--vaadin-radius-s);
368
+ padding: 0.125rem 0.25rem;
369
+ }
370
+
371
+ img {
372
+ max-width: 100%;
373
+ }
374
+
375
+ /* RTL specific styles */
376
+ :host([dir='rtl']) .ql-editor {
377
+ direction: rtl;
378
+ text-align: right;
379
+ }
380
+ `;
381
+
382
+ const toolbar = css`
383
+ [part='toolbar'] {
384
+ background-color: var(--vaadin-rich-text-editor-toolbar-background, var(--vaadin-background-container));
385
+ display: flex;
386
+ flex-shrink: 0;
387
+ flex-wrap: wrap;
388
+ gap: var(--vaadin-rich-text-editor-toolbar-gap, var(--vaadin-gap-s));
389
+ padding: var(--vaadin-rich-text-editor-toolbar-padding, var(--vaadin-padding-s));
390
+ }
391
+
392
+ [part~='toolbar-group'] {
393
+ display: flex;
394
+ }
395
+
396
+ [part~='toolbar-button'] {
397
+ background: var(--vaadin-rich-text-editor-toolbar-button-background, var(--vaadin-background-container));
398
+ border: var(--vaadin-rich-text-editor-toolbar-button-border-width, 1px) solid
399
+ var(--vaadin-rich-text-editor-toolbar-button-border-color, transparent);
400
+ border-radius: var(--vaadin-rich-text-editor-toolbar-button-border-radius, var(--vaadin-radius-m));
401
+ color: var(--vaadin-rich-text-editor-toolbar-button-text-color, var(--vaadin-text-color));
402
+ cursor: var(--vaadin-clickable-cursor);
403
+ flex-shrink: 0;
404
+ font-family: var(--vaadin-rich-text-editor-toolbar-button-font-family, inherit);
405
+ font-size: var(--vaadin-rich-text-editor-toolbar-button-font-size, inherit);
406
+ font-weight: var(--vaadin-rich-text-editor-toolbar-button-font-weight, 500);
407
+ height: var(--vaadin-rich-text-editor-toolbar-button-height, auto);
408
+ line-height: var(--vaadin-rich-text-editor-toolbar-button-line-height, inherit);
409
+ padding: var(--vaadin-rich-text-editor-toolbar-button-padding, var(--vaadin-padding-container));
410
+ position: relative;
411
+ }
412
+
413
+ [part~='toolbar-button']::before {
414
+ background: currentColor;
415
+ content: '';
416
+ display: block;
417
+ height: var(--vaadin-icon-size, 1lh);
418
+ width: var(--vaadin-icon-size, 1lh);
419
+ }
420
+
421
+ [part~='toolbar-button']:focus {
422
+ outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
423
+ outline-offset: 1px;
424
+ z-index: 1;
425
+ }
426
+
427
+ [part~='toolbar-button-pressed'],
428
+ [part~='toolbar-button'][aria-expanded='true'] {
429
+ --vaadin-rich-text-editor-toolbar-button-background: var(--vaadin-background-container-strong);
430
+ }
431
+
432
+ [part~='toolbar-button-undo']::before {
433
+ mask-image: var(--_vaadin-icon-undo);
434
+ }
435
+
436
+ [part~='toolbar-button-redo']::before {
437
+ mask-image: var(--_vaadin-icon-redo);
438
+ }
439
+
440
+ [part~='toolbar-button-bold']::before {
441
+ mask-image: var(--_vaadin-icon-bold);
442
+ }
443
+
444
+ [part~='toolbar-button-italic']::before {
445
+ mask-image: var(--_vaadin-icon-italic);
446
+ }
447
+
448
+ [part~='toolbar-button-underline']::before {
449
+ mask-image: var(--_vaadin-icon-underline);
450
+ }
451
+
452
+ [part~='toolbar-button-strike']::before {
453
+ mask-image: var(--_vaadin-icon-strikethrough);
454
+ }
455
+
456
+ [part~='toolbar-button-color']::before {
457
+ mask-image: var(--_vaadin-icon-color);
458
+ }
459
+
460
+ [part~='toolbar-button-color']::after {
461
+ background-color: var(--_color-value, currentColor);
462
+ }
463
+
464
+ [part~='toolbar-button-background']::before {
465
+ mask-image: var(--_vaadin-icon-background);
466
+ }
467
+
468
+ [part~='toolbar-button-background']::after {
469
+ background-color: var(--_background-value, currentColor);
470
+ }
471
+
472
+ [part~='toolbar-button-color']::after,
473
+ [part~='toolbar-button-background']::after {
474
+ bottom: 50%;
475
+ content: '';
476
+ display: block;
477
+ height: var(--vaadin-icon-size, 1lh);
478
+ mask-image: var(--_vaadin-icon-color-underline);
479
+ position: absolute;
480
+ transform: translateY(50%);
481
+ width: var(--vaadin-icon-size, 1lh);
482
+ }
483
+
484
+ [part~='toolbar-button-h1']::before {
485
+ mask-image: var(--_vaadin-icon-h1);
486
+ }
487
+
488
+ [part~='toolbar-button-h2']::before {
489
+ mask-image: var(--_vaadin-icon-h2);
490
+ }
491
+
492
+ [part~='toolbar-button-h3']::before {
493
+ mask-image: var(--_vaadin-icon-h3);
494
+ }
495
+
496
+ [part~='toolbar-button-subscript']::before {
497
+ mask-image: var(--_vaadin-icon-subscript);
498
+ }
499
+
500
+ [part~='toolbar-button-superscript']::before {
501
+ mask-image: var(--_vaadin-icon-superscript);
502
+ }
503
+
504
+ [part~='toolbar-button-list-ordered']::before {
505
+ mask-image: var(--_vaadin-icon-list-number);
506
+ }
507
+
508
+ [part~='toolbar-button-list-bullet']::before {
509
+ mask-image: var(--_vaadin-icon-list-bullet);
510
+ }
511
+
512
+ [part~='toolbar-button-outdent']::before {
513
+ mask-image: var(--_vaadin-icon-outdent);
514
+ }
515
+
516
+ [part~='toolbar-button-indent']::before {
517
+ mask-image: var(--_vaadin-icon-indent);
518
+ }
519
+
520
+ [part~='toolbar-button-align-left']::before {
521
+ mask-image: var(--_vaadin-icon-align-left);
522
+ }
523
+
524
+ [part~='toolbar-button-align-center']::before {
525
+ mask-image: var(--_vaadin-icon-align-center);
526
+ }
527
+
528
+ [part~='toolbar-button-align-right']::before {
529
+ mask-image: var(--_vaadin-icon-align-right);
530
+ }
531
+
532
+ [part~='toolbar-button-image']::before {
533
+ mask-image: var(--_vaadin-icon-image);
534
+ }
535
+
536
+ [part~='toolbar-button-link']::before {
537
+ mask-image: var(--_vaadin-icon-link);
538
+ }
539
+
540
+ [part~='toolbar-button-blockquote']::before {
541
+ mask-image: var(--_vaadin-icon-quote);
542
+ }
543
+
544
+ [part~='toolbar-button-code-block']::before {
545
+ mask-image: var(--_vaadin-icon-code);
546
+ }
547
+
548
+ [part~='toolbar-button-clean']::before {
549
+ mask-image: var(--_vaadin-icon-clear);
550
+ }
551
+
552
+ @media (forced-colors: active) {
553
+ [part~='toolbar-button']::before {
554
+ background: CanvasText;
555
+ }
556
+
557
+ [part~='toolbar-button-pressed'] {
558
+ background: Highlight;
559
+ }
560
+
561
+ [part~='toolbar-button-pressed']::before {
562
+ background: HighlightText;
563
+ }
564
+ }
565
+ `;
566
+
567
+ const states = css`
568
+ :host([readonly]) [part='toolbar'] {
569
+ display: none;
570
+ }
571
+
572
+ :host([disabled]) {
573
+ pointer-events: none;
574
+ opacity: 0.5;
575
+ -webkit-user-select: none;
576
+ user-select: none;
577
+ }
578
+ `;
579
+
580
+ export const richTextEditorStyles = [icons, base, content, toolbar, states];
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright (c) 2000 - 2025 Vaadin Ltd.
4
+ *
5
+ * This program is available under Vaadin Commercial License and Service Terms.
6
+ *
7
+ *
8
+ * See https://vaadin.com/commercial-license-and-service-terms for the full
9
+ * license.
10
+ */
11
+ import { css } from 'lit';
12
+ import { overlayStyles } from '@vaadin/overlay/src/styles/vaadin-overlay-base-styles.js';
13
+
14
+ export const richTextEditorPopupOverlay = css`
15
+ [part='overlay'] {
16
+ padding: var(--vaadin-rich-text-editor-overlay-padding, var(--vaadin-padding-container));
17
+ }
18
+
19
+ [part='content'] {
20
+ display: grid;
21
+ gap: var(--vaadin-rich-text-editor-overlay-gap, var(--vaadin-gap-s));
22
+ grid-template-columns: repeat(7, minmax(0, 1fr));
23
+ }
24
+
25
+ [part='content'] ::slotted(button) {
26
+ border: var(--vaadin-rich-text-editor-overlay-color-option-border-width, 1px) solid
27
+ var(--vaadin-rich-text-editor-overlay-color-option-border-color, transparent);
28
+ border-radius: var(--vaadin-rich-text-editor-overlay-color-option-border-radius, 9999px);
29
+ cursor: var(--vaadin-clickable-cursor);
30
+ font-size: var(--vaadin-rich-text-editor-overlay-color-option-font-size, inherit);
31
+ height: var(--vaadin-rich-text-editor-overlay-color-option-height, 1lh);
32
+ line-height: var(--vaadin-rich-text-editor-overlay-color-option-line-height, inherit);
33
+ padding: var(--vaadin-rich-text-editor-overlay-color-option-padding, 0);
34
+ width: var(--vaadin-rich-text-editor-overlay-color-option-width, 1lh);
35
+ }
36
+
37
+ [part='content'] ::slotted(button:focus-visible) {
38
+ outline: var(--vaadin-focus-ring-width) solid var(--vaadin-focus-ring-color);
39
+ outline-offset: 1px;
40
+ }
41
+ `;
42
+
43
+ export const richTextEditorPopupOverlayStyles = [overlayStyles, richTextEditorPopupOverlay];
@@ -27,6 +27,8 @@ export interface RichTextEditorI18n {
27
27
  superscript?: string;
28
28
  listOrdered?: string;
29
29
  listBullet?: string;
30
+ outdent?: string;
31
+ indent?: string;
30
32
  alignLeft?: string;
31
33
  alignCenter?: string;
32
34
  alignRight?: string;