quill-clausula 0.1.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.
@@ -0,0 +1,856 @@
1
+ /* ── Toolbar enhancements ── */
2
+
3
+ /* Group visual separator between legal tools and standard tools */
4
+ .ql-snow .ql-toolbar .ql-formats:has(.ql-clausula, .ql-parte) {
5
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
6
+ padding-right: 8px;
7
+ margin-right: 4px;
8
+ }
9
+
10
+ .ql-snow .ql-toolbar .ql-formats:has(.ql-objeto, .ql-assinatura) {
11
+ border-right: 1px solid rgba(0, 0, 0, 0.1);
12
+ padding-right: 8px;
13
+ margin-right: 4px;
14
+ }
15
+
16
+ /* Tooltip styling for toolbar buttons */
17
+ .ql-snow .ql-toolbar button[title],
18
+ .ql-snow .ql-toolbar .ql-picker[title] {
19
+ position: relative;
20
+ }
21
+
22
+ /* ── Container ── */
23
+ .ql-clausula-container {
24
+ margin: 0;
25
+ padding: 0;
26
+ }
27
+
28
+ /* ── Item base ── */
29
+ .ql-clausula-item {
30
+ position: relative;
31
+ list-style: none;
32
+ }
33
+
34
+ /*
35
+ * The .ql-ui span is set to position:absolute by Quill's core CSS.
36
+ * We position it at the left edge of each item's padding area,
37
+ * so it doesn't overlap the content text.
38
+ */
39
+ .ql-clausula-item > .ql-ui {
40
+ left: 0;
41
+ font-weight: bold;
42
+ white-space: nowrap;
43
+ user-select: none;
44
+ pointer-events: none;
45
+ }
46
+
47
+ /* ── Per-type indentation + prefix space ── */
48
+
49
+ /* Cláusula: prefix like "CLÁUSULA PRIMEIRA — " needs ~20em */
50
+ .ql-clausula-item[data-clausula-type='clausula'] {
51
+ padding-left: 0;
52
+ margin-top: 1em;
53
+ margin-bottom: 0.3em;
54
+ }
55
+ .ql-clausula-item[data-clausula-type='clausula']:first-child {
56
+ margin-top: 0;
57
+ }
58
+ /* Cláusula prefix is inline, not absolutely positioned — it's too long and variable */
59
+ .ql-clausula-item[data-clausula-type='clausula'] > .ql-ui {
60
+ position: relative;
61
+ left: auto;
62
+ }
63
+
64
+ /* Sub-cláusula: prefix like "1.2 " */
65
+ .ql-clausula-item[data-clausula-type='subclausula'] {
66
+ padding-left: 5em;
67
+ margin-top: 0.25em;
68
+ }
69
+ .ql-clausula-item[data-clausula-type='subclausula'] > .ql-ui {
70
+ left: 2em;
71
+ }
72
+
73
+ /* Parágrafo: prefix like "Parágrafo Único. " */
74
+ .ql-clausula-item[data-clausula-type='paragrafo'] {
75
+ padding-left: 2em;
76
+ margin-top: 0.4em;
77
+ }
78
+ .ql-clausula-item[data-clausula-type='paragrafo'] > .ql-ui {
79
+ position: relative;
80
+ left: auto;
81
+ }
82
+
83
+ /* Inciso: prefix like "III — " */
84
+ .ql-clausula-item[data-clausula-type='inciso'] {
85
+ padding-left: 7em;
86
+ margin-top: 0.15em;
87
+ }
88
+ .ql-clausula-item[data-clausula-type='inciso'] > .ql-ui {
89
+ left: 4em;
90
+ font-weight: normal;
91
+ }
92
+
93
+ /* Alínea: prefix like "a) " */
94
+ .ql-clausula-item[data-clausula-type='alinea'] {
95
+ padding-left: 9em;
96
+ margin-top: 0.15em;
97
+ }
98
+ .ql-clausula-item[data-clausula-type='alinea'] > .ql-ui {
99
+ left: 7em;
100
+ font-weight: normal;
101
+ }
102
+
103
+ /* ── Toolbar dropdown labels ── */
104
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label::before,
105
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item::before {
106
+ content: 'Cláusula \25BE';
107
+ }
108
+
109
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item::before {
110
+ content: 'Sem formatação';
111
+ }
112
+
113
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label[data-value='clausula']::before,
114
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='clausula']::before {
115
+ content: 'Cláusula';
116
+ }
117
+
118
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label[data-value='subclausula']::before,
119
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='subclausula']::before {
120
+ content: 'Sub-cláusula';
121
+ }
122
+
123
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label[data-value='paragrafo']::before,
124
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='paragrafo']::before {
125
+ content: 'Parágrafo';
126
+ }
127
+
128
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label[data-value='inciso']::before,
129
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='inciso']::before {
130
+ content: 'Inciso';
131
+ }
132
+
133
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label[data-value='alinea']::before,
134
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='alinea']::before {
135
+ content: 'Alínea';
136
+ }
137
+
138
+ .ql-snow .ql-picker.ql-clausula {
139
+ width: 140px;
140
+ }
141
+
142
+ /* Hide the default SVG arrow on clausula picker since we use ▾ in content */
143
+ .ql-snow .ql-picker.ql-clausula .ql-picker-label svg {
144
+ display: none;
145
+ }
146
+
147
+ /* Indent sub-items in the clausula dropdown to show hierarchy */
148
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='subclausula']::before {
149
+ padding-left: 12px;
150
+ }
151
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='paragrafo']::before {
152
+ padding-left: 12px;
153
+ }
154
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='inciso']::before {
155
+ padding-left: 24px;
156
+ }
157
+ .ql-snow .ql-picker.ql-clausula .ql-picker-item[data-value='alinea']::before {
158
+ padding-left: 36px;
159
+ }
160
+
161
+ /* ── Action buttons ── */
162
+ .ql-clausula-actions {
163
+ position: absolute;
164
+ top: 2px;
165
+ right: 4px;
166
+ display: flex;
167
+ gap: 2px;
168
+ opacity: 0;
169
+ transition: opacity 0.15s;
170
+ z-index: 1;
171
+ }
172
+
173
+ .ql-clausula-item:hover > .ql-clausula-actions {
174
+ opacity: 1;
175
+ }
176
+
177
+ /* Always visible when any button is active */
178
+ .ql-clausula-actions:has(.active) {
179
+ opacity: 1;
180
+ }
181
+
182
+ .ql-clausula-btn {
183
+ width: 22px;
184
+ height: 22px;
185
+ padding: 3px;
186
+ border: 1px solid transparent;
187
+ border-radius: 3px;
188
+ background: none;
189
+ color: #888;
190
+ cursor: pointer;
191
+ display: inline-flex;
192
+ align-items: center;
193
+ justify-content: center;
194
+ transition: all 0.12s;
195
+ }
196
+
197
+ .ql-clausula-btn:hover {
198
+ background: rgba(0, 0, 0, 0.06);
199
+ color: #555;
200
+ }
201
+
202
+ .ql-clausula-lock.active {
203
+ color: #c0392b;
204
+ background: rgba(192, 57, 43, 0.08);
205
+ border-color: rgba(192, 57, 43, 0.2);
206
+ }
207
+
208
+ .ql-clausula-agree.active {
209
+ color: #27ae60;
210
+ background: rgba(39, 174, 96, 0.08);
211
+ border-color: rgba(39, 174, 96, 0.2);
212
+ }
213
+
214
+ .ql-clausula-disagree.active {
215
+ color: #e67e22;
216
+ background: rgba(230, 126, 34, 0.08);
217
+ border-color: rgba(230, 126, 34, 0.2);
218
+ }
219
+
220
+ .ql-clausula-conversation:hover {
221
+ color: #2980b9;
222
+ }
223
+
224
+ .ql-clausula-conversation.active {
225
+ color: #2980b9;
226
+ background: rgba(41, 128, 185, 0.08);
227
+ border-color: rgba(41, 128, 185, 0.2);
228
+ }
229
+
230
+ .ql-clausula-btn:disabled {
231
+ opacity: 0.3;
232
+ cursor: not-allowed;
233
+ }
234
+
235
+ /* ── Locked state ── */
236
+ .ql-clausula-item.ql-locked-true {
237
+ background: rgba(0, 0, 0, 0.03);
238
+ border-left: 3px solid #c0392b;
239
+ }
240
+
241
+ /* ── Agreed state ── */
242
+ .ql-clausula-item.ql-agreed {
243
+ border-left: 3px solid #27ae60;
244
+ }
245
+
246
+ /* ── Disagreed state ── */
247
+ .ql-clausula-item.ql-disagreed {
248
+ border-left: 3px solid #e67e22;
249
+ }
250
+
251
+ /* ══════════════════════════════════════════
252
+ Floating Action Bar
253
+ ══════════════════════════════════════════ */
254
+
255
+ .ql-clausula-floating-bar {
256
+ position: sticky;
257
+ bottom: 16px;
258
+ left: 50%;
259
+ transform: translateX(-50%);
260
+ display: inline-flex;
261
+ gap: 4px;
262
+ padding: 10px 16px;
263
+ background: #fff;
264
+ border: 2px solid #222;
265
+ border-radius: 50px;
266
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.12);
267
+ z-index: 100;
268
+ width: fit-content;
269
+ margin: 24px auto 0;
270
+ user-select: none;
271
+ }
272
+
273
+ .ql-floating-btn {
274
+ width: 40px;
275
+ height: 40px;
276
+ padding: 8px;
277
+ border: none;
278
+ border-radius: 50%;
279
+ background: none;
280
+ color: #333;
281
+ cursor: pointer;
282
+ display: inline-flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ transition: all 0.15s ease;
286
+ position: relative;
287
+ }
288
+
289
+ .ql-floating-btn:hover {
290
+ background: rgba(0, 0, 0, 0.07);
291
+ transform: scale(1.1);
292
+ }
293
+
294
+ .ql-floating-btn:active {
295
+ transform: scale(0.95);
296
+ }
297
+
298
+ .ql-floating-btn:disabled {
299
+ opacity: 0.25;
300
+ cursor: not-allowed;
301
+ transform: none;
302
+ }
303
+
304
+ .ql-floating-btn:disabled:hover {
305
+ background: none;
306
+ transform: none;
307
+ }
308
+
309
+ /* Individual button hover colors */
310
+ .ql-floating-undo:hover {
311
+ color: #7f8c8d;
312
+ }
313
+
314
+ .ql-floating-agree-all:hover {
315
+ color: #27ae60;
316
+ background: rgba(39, 174, 96, 0.1);
317
+ }
318
+
319
+ .ql-floating-disagree-all:hover {
320
+ color: #e67e22;
321
+ background: rgba(230, 126, 34, 0.1);
322
+ }
323
+
324
+ .ql-floating-lock-all:hover {
325
+ color: #c0392b;
326
+ background: rgba(192, 57, 43, 0.1);
327
+ }
328
+
329
+ .ql-floating-judge:hover {
330
+ color: #8e44ad;
331
+ background: rgba(142, 68, 173, 0.1);
332
+ }
333
+
334
+ .ql-floating-share:hover {
335
+ color: #2980b9;
336
+ background: rgba(41, 128, 185, 0.1);
337
+ }
338
+
339
+ .ql-floating-sign:hover:not(:disabled) {
340
+ color: #2c3e50;
341
+ background: rgba(44, 62, 80, 0.1);
342
+ }
343
+
344
+ /* Sign button ready state (all parties agreed) */
345
+ .ql-floating-sign.ready {
346
+ color: #27ae60;
347
+ animation: sign-pulse 2s ease-in-out infinite;
348
+ }
349
+
350
+ .ql-floating-sign.ready:hover {
351
+ color: #fff;
352
+ background: #27ae60;
353
+ }
354
+
355
+ @keyframes sign-pulse {
356
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(39, 174, 96, 0.3); }
357
+ 50% { box-shadow: 0 0 0 6px rgba(39, 174, 96, 0); }
358
+ }
359
+
360
+ /* Dividers between button groups */
361
+ .ql-floating-btn.ql-floating-lock-all::before,
362
+ .ql-floating-btn.ql-floating-sign::before {
363
+ content: '';
364
+ position: absolute;
365
+ left: -4px;
366
+ top: 8px;
367
+ bottom: 8px;
368
+ width: 1px;
369
+ background: rgba(0, 0, 0, 0.15);
370
+ }
371
+
372
+ /* ══════════════════════════════════════════
373
+ Undo Warning Modal
374
+ ══════════════════════════════════════════ */
375
+
376
+ .ql-clausula-modal-overlay {
377
+ position: fixed;
378
+ inset: 0;
379
+ background: rgba(0, 0, 0, 0.4);
380
+ display: flex;
381
+ align-items: center;
382
+ justify-content: center;
383
+ z-index: 10000;
384
+ animation: modal-fade-in 0.15s ease;
385
+ }
386
+
387
+ @keyframes modal-fade-in {
388
+ from { opacity: 0; }
389
+ to { opacity: 1; }
390
+ }
391
+
392
+ .ql-clausula-modal {
393
+ background: #fff;
394
+ border-radius: 12px;
395
+ padding: 28px 32px;
396
+ max-width: 420px;
397
+ width: 90%;
398
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
399
+ animation: modal-slide-in 0.2s ease;
400
+ }
401
+
402
+ @keyframes modal-slide-in {
403
+ from { transform: translateY(20px); opacity: 0; }
404
+ to { transform: translateY(0); opacity: 1; }
405
+ }
406
+
407
+ .ql-clausula-modal-title {
408
+ margin: 0 0 12px;
409
+ font-size: 18px;
410
+ font-weight: 600;
411
+ color: #2c3e50;
412
+ }
413
+
414
+ .ql-clausula-modal-message {
415
+ margin: 0 0 24px;
416
+ font-size: 14px;
417
+ line-height: 1.5;
418
+ color: #555;
419
+ }
420
+
421
+ .ql-clausula-modal-actions {
422
+ display: flex;
423
+ justify-content: flex-end;
424
+ gap: 10px;
425
+ }
426
+
427
+ .ql-clausula-modal-btn {
428
+ padding: 8px 20px;
429
+ border-radius: 6px;
430
+ border: none;
431
+ font-size: 14px;
432
+ font-weight: 500;
433
+ cursor: pointer;
434
+ transition: all 0.12s;
435
+ }
436
+
437
+ .ql-clausula-modal-cancel {
438
+ background: #eee;
439
+ color: #555;
440
+ }
441
+
442
+ .ql-clausula-modal-cancel:hover {
443
+ background: #ddd;
444
+ }
445
+
446
+ .ql-clausula-modal-confirm {
447
+ background: #c0392b;
448
+ color: #fff;
449
+ }
450
+
451
+ .ql-clausula-modal-confirm:hover {
452
+ background: #a93226;
453
+ }
454
+
455
+ /* ══════════════════════════════════════════
456
+ PARTE (Contract Parties)
457
+ ══════════════════════════════════════════ */
458
+
459
+ .ql-parte-container {
460
+ margin: 0;
461
+ padding: 0;
462
+ }
463
+
464
+ .ql-parte-item {
465
+ position: relative;
466
+ list-style: none;
467
+ padding-left: 0;
468
+ margin-top: 0.5em;
469
+ line-height: 1.6;
470
+ }
471
+
472
+ .ql-parte-item:first-child {
473
+ margin-top: 0;
474
+ }
475
+
476
+ .ql-parte-item > .ql-ui {
477
+ position: relative;
478
+ left: auto;
479
+ font-weight: bold;
480
+ white-space: nowrap;
481
+ user-select: none;
482
+ pointer-events: none;
483
+ text-transform: uppercase;
484
+ color: #2c3e50;
485
+ }
486
+
487
+ /* ── Parte toolbar dropdown labels ── */
488
+ .ql-snow .ql-picker.ql-parte .ql-picker-label::before,
489
+ .ql-snow .ql-picker.ql-parte .ql-picker-item::before {
490
+ content: 'Partes \25BE';
491
+ }
492
+
493
+ .ql-snow .ql-picker.ql-parte .ql-picker-item::before {
494
+ content: 'Sem formatação';
495
+ }
496
+
497
+ .ql-snow .ql-picker.ql-parte .ql-picker-label[data-value='contratante']::before,
498
+ .ql-snow .ql-picker.ql-parte .ql-picker-item[data-value='contratante']::before {
499
+ content: 'Contratante';
500
+ }
501
+
502
+ .ql-snow .ql-picker.ql-parte .ql-picker-label[data-value='contratado']::before,
503
+ .ql-snow .ql-picker.ql-parte .ql-picker-item[data-value='contratado']::before {
504
+ content: 'Contratado';
505
+ }
506
+
507
+ .ql-snow .ql-picker.ql-parte {
508
+ width: 140px;
509
+ }
510
+
511
+ /* Hide the default SVG arrow on parte picker since we use ▾ in content */
512
+ .ql-snow .ql-picker.ql-parte .ql-picker-label svg {
513
+ display: none;
514
+ }
515
+
516
+ /* ══════════════════════════════════════════
517
+ OBJETO (Contract Object)
518
+ ══════════════════════════════════════════ */
519
+
520
+ .ql-objeto-container {
521
+ margin: 0;
522
+ padding: 0;
523
+ }
524
+
525
+ .ql-objeto-item {
526
+ position: relative;
527
+ list-style: none;
528
+ padding-left: 0;
529
+ margin-top: 1em;
530
+ margin-bottom: 0.5em;
531
+ text-align: center;
532
+ font-weight: bold;
533
+ text-transform: uppercase;
534
+ border-top: 2px solid #2c3e50;
535
+ border-bottom: 2px solid #2c3e50;
536
+ padding: 0.5em 1em;
537
+ background: rgba(44, 62, 80, 0.03);
538
+ }
539
+
540
+ .ql-objeto-item > .ql-ui {
541
+ position: relative;
542
+ left: auto;
543
+ font-weight: bold;
544
+ white-space: nowrap;
545
+ user-select: none;
546
+ pointer-events: none;
547
+ color: #2c3e50;
548
+ }
549
+
550
+ /* ── Objeto toolbar button ── */
551
+ .ql-snow .ql-objeto {
552
+ width: auto !important;
553
+ display: inline-flex !important;
554
+ align-items: center;
555
+ gap: 4px;
556
+ padding: 3px 8px !important;
557
+ border-radius: 3px;
558
+ transition: background 0.15s, color 0.15s;
559
+ }
560
+
561
+ .ql-snow .ql-objeto::before {
562
+ content: '';
563
+ display: inline-block;
564
+ width: 16px;
565
+ height: 16px;
566
+ background: currentColor;
567
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='16'/%3E%3Cline x1='8' y1='12' x2='16' y2='12'/%3E%3C/svg%3E");
568
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cline x1='12' y1='8' x2='12' y2='16'/%3E%3Cline x1='8' y1='12' x2='16' y2='12'/%3E%3C/svg%3E");
569
+ -webkit-mask-size: contain;
570
+ mask-size: contain;
571
+ -webkit-mask-repeat: no-repeat;
572
+ mask-repeat: no-repeat;
573
+ flex-shrink: 0;
574
+ }
575
+
576
+ .ql-snow .ql-objeto::after {
577
+ content: 'Objeto';
578
+ font-size: 13px;
579
+ }
580
+
581
+ /* Active state when OBJETO exists in document */
582
+ .ql-snow .ql-objeto.ql-active {
583
+ color: #2c3e50 !important;
584
+ background: rgba(44, 62, 80, 0.1);
585
+ }
586
+
587
+ .ql-snow .ql-objeto:hover {
588
+ background: rgba(44, 62, 80, 0.07);
589
+ }
590
+
591
+ /* ══════════════════════════════════════════
592
+ ASSINATURA (Signatures)
593
+ ══════════════════════════════════════════ */
594
+
595
+ .ql-assinatura-block {
596
+ margin-top: 2em;
597
+ padding: 1.5em 2em;
598
+ border-top: 2px solid #2c3e50;
599
+ text-align: center;
600
+ user-select: none;
601
+ }
602
+
603
+ .ql-assinatura-header {
604
+ margin-bottom: 2em;
605
+ font-size: 0.95em;
606
+ color: #555;
607
+ }
608
+
609
+ .ql-assinatura-line {
610
+ display: inline-block;
611
+ width: 280px;
612
+ margin: 1em 2em;
613
+ text-align: center;
614
+ vertical-align: top;
615
+ }
616
+
617
+ .ql-assinatura-rule {
618
+ font-size: 0.9em;
619
+ color: #333;
620
+ margin-bottom: 0.3em;
621
+ letter-spacing: 0.02em;
622
+ }
623
+
624
+ .ql-assinatura-nome {
625
+ font-weight: bold;
626
+ font-size: 0.9em;
627
+ color: #2c3e50;
628
+ }
629
+
630
+ .ql-assinatura-role {
631
+ font-size: 0.75em;
632
+ text-transform: uppercase;
633
+ letter-spacing: 0.08em;
634
+ color: #7a7062;
635
+ margin-top: 0.15em;
636
+ }
637
+
638
+ .ql-assinatura-testemunhas-header {
639
+ margin-top: 2em;
640
+ margin-bottom: 0.5em;
641
+ font-weight: bold;
642
+ font-size: 0.85em;
643
+ text-transform: uppercase;
644
+ letter-spacing: 0.08em;
645
+ color: #555;
646
+ }
647
+
648
+ /* ── Assinatura toolbar button ── */
649
+ .ql-snow .ql-assinatura {
650
+ width: auto !important;
651
+ display: inline-flex !important;
652
+ align-items: center;
653
+ gap: 4px;
654
+ padding: 3px 8px !important;
655
+ border-radius: 3px;
656
+ transition: background 0.15s, color 0.15s;
657
+ }
658
+
659
+ .ql-snow .ql-assinatura::before {
660
+ content: '';
661
+ display: inline-block;
662
+ width: 16px;
663
+ height: 16px;
664
+ background: currentColor;
665
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17 3a2.83 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z'/%3E%3C/svg%3E");
666
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17 3a2.83 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z'/%3E%3C/svg%3E");
667
+ -webkit-mask-size: contain;
668
+ mask-size: contain;
669
+ -webkit-mask-repeat: no-repeat;
670
+ mask-repeat: no-repeat;
671
+ flex-shrink: 0;
672
+ }
673
+
674
+ .ql-snow .ql-assinatura::after {
675
+ content: 'Assinatura';
676
+ font-size: 13px;
677
+ }
678
+
679
+ .ql-snow .ql-assinatura:hover {
680
+ background: rgba(44, 62, 80, 0.07);
681
+ }
682
+
683
+ /* ══════════════════════════════════════════════
684
+ Ghost Cut — faded, inert content awaiting paste
685
+ ══════════════════════════════════════════════ */
686
+
687
+ .ql-ghost-true {
688
+ opacity: 0.35;
689
+ filter: grayscale(0.5);
690
+ text-decoration: none;
691
+ user-select: none;
692
+ transition: opacity 0.18s ease;
693
+ }
694
+
695
+ /* ══════════════════════════════════════════════
696
+ Clause organizer — floating drag handle
697
+ ══════════════════════════════════════════════ */
698
+
699
+ .ql-container {
700
+ position: relative;
701
+ }
702
+
703
+ .ql-clausula-drag-handle {
704
+ position: absolute;
705
+ z-index: 20;
706
+ display: none;
707
+ padding: 4px 3px;
708
+ color: #9a9186;
709
+ background: rgba(255, 255, 255, 0.9);
710
+ border: 1px solid rgba(0, 0, 0, 0.08);
711
+ border-radius: 4px;
712
+ cursor: grab;
713
+ line-height: 0;
714
+ touch-action: none;
715
+ transition: color 0.15s, background 0.15s;
716
+ }
717
+
718
+ .ql-clausula-drag-handle.visible {
719
+ display: block;
720
+ }
721
+
722
+ .ql-clausula-drag-handle:hover {
723
+ color: #2c3e50;
724
+ background: #fff;
725
+ }
726
+
727
+ .ql-clausula-dragging,
728
+ .ql-clausula-dragging .ql-clausula-drag-handle {
729
+ cursor: grabbing;
730
+ }
731
+
732
+ .ql-clausula-dragging .ql-editor {
733
+ user-select: none;
734
+ }
735
+
736
+ .ql-clausula-drop-indicator {
737
+ position: absolute;
738
+ z-index: 19;
739
+ left: 1.5rem;
740
+ right: 1.5rem;
741
+ height: 2px;
742
+ border-radius: 1px;
743
+ background: #2c7be5;
744
+ box-shadow: 0 0 0 1px rgba(44, 123, 229, 0.25);
745
+ display: none;
746
+ pointer-events: none;
747
+ }
748
+
749
+ .ql-clausula-drop-indicator.visible {
750
+ display: block;
751
+ }
752
+
753
+ .ql-drag-source {
754
+ opacity: 0.35;
755
+ transition: opacity 0.15s ease;
756
+ }
757
+
758
+ /* ══════════════════════════════════════════════
759
+ Word-style spacing pickers (toolbar)
760
+ ══════════════════════════════════════════════ */
761
+
762
+ .ql-snow .ql-picker.ql-lineheight {
763
+ width: 62px;
764
+ }
765
+
766
+ .ql-snow .ql-picker.ql-lineheight .ql-picker-label::before {
767
+ content: '↕ —';
768
+ }
769
+
770
+ .ql-snow .ql-picker.ql-lineheight .ql-picker-label[data-value]::before {
771
+ content: '↕ ' attr(data-value);
772
+ }
773
+
774
+ .ql-snow .ql-picker.ql-lineheight .ql-picker-item::before {
775
+ content: attr(data-value);
776
+ }
777
+
778
+ .ql-snow .ql-picker.ql-lineheight .ql-picker-item:not([data-value])::before {
779
+ content: 'Padrão';
780
+ }
781
+
782
+ .ql-snow .ql-picker.ql-spacing {
783
+ width: 68px;
784
+ }
785
+
786
+ .ql-snow .ql-picker.ql-spacing .ql-picker-label::before {
787
+ content: '¶ —';
788
+ }
789
+
790
+ .ql-snow .ql-picker.ql-spacing .ql-picker-label[data-value]::before {
791
+ content: '¶ ' attr(data-value);
792
+ }
793
+
794
+ .ql-snow .ql-picker.ql-spacing .ql-picker-item::before {
795
+ content: attr(data-value);
796
+ }
797
+
798
+ .ql-snow .ql-picker.ql-spacing .ql-picker-item:not([data-value])::before {
799
+ content: 'Padrão';
800
+ }
801
+
802
+ /* ══════════════════════════════════════════════
803
+ Table toolbar button + basic table styling
804
+ ══════════════════════════════════════════════ */
805
+
806
+ .ql-snow .ql-table {
807
+ display: inline-flex !important;
808
+ align-items: center;
809
+ gap: 4px;
810
+ width: auto !important;
811
+ padding: 3px 8px !important;
812
+ border-radius: 4px;
813
+ }
814
+
815
+ .ql-snow .ql-table::after {
816
+ content: 'Tabela';
817
+ font-size: 13px;
818
+ }
819
+
820
+ .ql-snow .ql-table:hover {
821
+ background: rgba(44, 62, 80, 0.07);
822
+ }
823
+
824
+ .ql-editor table {
825
+ border-collapse: collapse;
826
+ width: 100%;
827
+ margin: 0.75em 0;
828
+ }
829
+
830
+ .ql-editor td {
831
+ border: 1px solid #c9c1b4;
832
+ padding: 0.35em 0.6em;
833
+ vertical-align: top;
834
+ }
835
+
836
+ /* Ghost Cut: fully-covered lines fade as a whole, label included */
837
+ .ql-ghost-line {
838
+ opacity: 0.35;
839
+ filter: grayscale(0.5);
840
+ transition: opacity 0.18s ease;
841
+ }
842
+
843
+ .ql-ghost-line .ql-ghost-true {
844
+ opacity: 1;
845
+ filter: none;
846
+ }
847
+
848
+ /* Invisible extension of the drag handle's hit area (bridges the gap to the text) */
849
+ .ql-clausula-drag-handle::before {
850
+ content: '';
851
+ position: absolute;
852
+ top: -10px;
853
+ right: -18px;
854
+ bottom: -10px;
855
+ left: -10px;
856
+ }