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

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