@tessera-editor/core 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,1491 @@
1
+ /* ==========================================================================
2
+ Tessera theme — Slite-style tokens + default component styles.
3
+ Hosts override via the CSS variables below (product-definition §2).
4
+ ========================================================================== */
5
+
6
+ .tessera-root,
7
+ .tessera-root * {
8
+ box-sizing: border-box;
9
+ }
10
+
11
+ .tessera-root {
12
+ --te-accent: #4f6df5;
13
+ --te-ai: #7a4fd8;
14
+ --te-text: #262629;
15
+ --te-text-soft: #6b6f76;
16
+ --te-text-faint: #9aa0a8;
17
+ --te-border: #e6e8eb;
18
+ --te-bg: #ffffff;
19
+ --te-bg-soft: #f7f7f8;
20
+ --te-bg-hover: #f2f3f5;
21
+ --te-danger: #d9414f;
22
+ --te-radius: 8px;
23
+ --te-shadow-pop: 0 2px 6px rgba(20, 22, 26, 0.06), 0 12px 28px rgba(20, 22, 26, 0.12);
24
+ --te-font:
25
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB',
26
+ 'Microsoft YaHei', 'Helvetica Neue', Arial, sans-serif;
27
+ --te-mono: ui-monospace, SFMono-Regular, 'JetBrains Mono', Menlo, Consolas, monospace;
28
+ position: relative;
29
+ font-family: var(--te-font);
30
+ color: var(--te-text);
31
+ }
32
+
33
+ /* ---------- document ---------- */
34
+
35
+ .tessera-doc {
36
+ outline: none;
37
+ font-size: 16px;
38
+ line-height: 1.72;
39
+ min-height: 40vh;
40
+ max-width: var(--te-doc-max-width, none);
41
+ margin-inline: auto;
42
+ color: var(--te-text);
43
+ caret-color: var(--te-accent);
44
+ }
45
+
46
+ .tessera-doc ::selection {
47
+ background: #e4e9ff;
48
+ }
49
+
50
+ .tessera-doc > * + * {
51
+ margin-top: 0.35em;
52
+ }
53
+
54
+ .tessera-doc h1,
55
+ .tessera-doc h2,
56
+ .tessera-doc h3,
57
+ .tessera-doc h4 {
58
+ font-weight: 700;
59
+ letter-spacing: -0.015em;
60
+ line-height: 1.3;
61
+ margin: 1.1em 0 0.25em;
62
+ }
63
+ .tessera-doc h1 { font-size: 29px; }
64
+ .tessera-doc h2 { font-size: 23px; }
65
+ .tessera-doc h3 { font-size: 19px; }
66
+ .tessera-doc h4 { font-size: 16.5px; color: #3c3f45; }
67
+
68
+ .tessera-doc ul,
69
+ .tessera-doc ol {
70
+ padding-left: 1.5em;
71
+ margin: 0.35em 0;
72
+ }
73
+ /* descendant on purpose: taskItem wraps content as li > div > p, where the
74
+ UA's default p margin would otherwise push text below the checkbox */
75
+ .tessera-doc li p {
76
+ margin: 0.1em 0;
77
+ }
78
+
79
+ .tessera-doc blockquote {
80
+ border-left: 3px solid var(--te-border);
81
+ color: var(--te-text-soft);
82
+ padding-left: 14px;
83
+ margin: 0.6em 0;
84
+ }
85
+
86
+ .tessera-doc hr {
87
+ border: none;
88
+ border-top: 1px solid var(--te-border);
89
+ margin: 1.4em 0;
90
+ }
91
+
92
+ .tessera-doc code {
93
+ background: #f2f3f5;
94
+ border-radius: 4px;
95
+ padding: 0.12em 0.38em;
96
+ font-family: var(--te-mono);
97
+ font-size: 0.86em;
98
+ }
99
+
100
+ .tessera-doc pre {
101
+ background: #fbfbfc;
102
+ border: 1px solid #eef0f3;
103
+ border-radius: var(--te-radius);
104
+ padding: 13px 16px;
105
+ overflow-x: auto;
106
+ font-size: 13.5px;
107
+ line-height: 1.6;
108
+ }
109
+ .tessera-doc pre code {
110
+ background: none;
111
+ padding: 0;
112
+ font-size: inherit;
113
+ }
114
+
115
+ .tessera-doc mark {
116
+ border-radius: 3px;
117
+ padding: 0 0.15em;
118
+ }
119
+
120
+ .tessera-doc a {
121
+ color: var(--te-accent);
122
+ text-decoration: underline;
123
+ text-underline-offset: 2px;
124
+ }
125
+
126
+ /* placeholder */
127
+ .tessera-doc p[data-placeholder]::before,
128
+ .tessera-doc p.is-empty::before {
129
+ content: attr(data-placeholder);
130
+ color: var(--te-text-faint);
131
+ float: left;
132
+ height: 0;
133
+ pointer-events: none;
134
+ }
135
+
136
+ /* task list */
137
+ .tessera-doc ul[data-type='taskList'] {
138
+ list-style: none;
139
+ padding-left: 0.15em;
140
+ }
141
+ .tessera-doc ul[data-type='taskList'] li {
142
+ display: flex;
143
+ gap: 9px;
144
+ align-items: flex-start;
145
+ }
146
+ .tessera-doc ul[data-type='taskList'] li > label {
147
+ /* flex + one-line-box height centers the checkbox on the first text line */
148
+ display: flex;
149
+ align-items: center;
150
+ height: 1.72em;
151
+ margin-top: 0.1em;
152
+ flex: none;
153
+ user-select: none;
154
+ }
155
+ .tessera-doc ul[data-type='taskList'] input[type='checkbox'] {
156
+ accent-color: var(--te-accent);
157
+ width: 15px;
158
+ height: 15px;
159
+ cursor: pointer;
160
+ }
161
+ .tessera-doc ul[data-type='taskList'] li[data-checked='true'] > div {
162
+ color: var(--te-text-faint);
163
+ text-decoration: line-through;
164
+ }
165
+
166
+ /* hint block */
167
+ .tessera-doc div[data-type='hint'] {
168
+ border-radius: var(--te-radius);
169
+ padding: 12px 16px;
170
+ margin: 0.7em 0;
171
+ border: 1px solid transparent;
172
+ }
173
+ .tessera-doc div[data-type='hint'][data-variant='info'] { background: #f0f3ff; border-color: #dce3ff; }
174
+ .tessera-doc div[data-type='hint'][data-variant='success'] { background: #eefaf3; border-color: #d3f0e0; }
175
+ .tessera-doc div[data-type='hint'][data-variant='warning'] { background: #fdf5e8; border-color: #f7e6c8; }
176
+ .tessera-doc div[data-type='hint'][data-variant='danger'] { background: #fdef1f0; border-color: #f8d8da; }
177
+ .tessera-doc div[data-type='hint'][data-variant='neutral'] { background: #f4f5f7; border-color: var(--te-border); }
178
+
179
+ /* collapsible */
180
+ .tessera-doc div[data-type='collapsible'] {
181
+ border: 1px solid var(--te-border);
182
+ border-radius: var(--te-radius);
183
+ margin: 0.7em 0;
184
+ background: #fdfdfe;
185
+ }
186
+ .tessera-doc div[data-type='collapsible-summary'] {
187
+ padding: 9px 14px;
188
+ font-weight: 600;
189
+ cursor: pointer;
190
+ user-select: none;
191
+ display: flex;
192
+ align-items: baseline;
193
+ gap: 8px;
194
+ }
195
+ .tessera-doc div[data-type='collapsible-summary']::before {
196
+ content: '▸';
197
+ color: var(--te-text-faint);
198
+ font-size: 12px;
199
+ transition: transform 120ms ease;
200
+ flex: none;
201
+ transform: translateY(-1px);
202
+ }
203
+ .tessera-doc div[data-type='collapsible'][data-open='true'] div[data-type='collapsible-summary']::before {
204
+ transform: translateY(-1px) rotate(90deg);
205
+ }
206
+ .tessera-doc div[data-type='collapsible-content'] {
207
+ border-top: 1px dashed var(--te-border);
208
+ padding: 4px 14px 8px 30px;
209
+ }
210
+ .tessera-doc div[data-type='collapsible'][data-open='false'] div[data-type='collapsible-content'] {
211
+ display: none;
212
+ }
213
+
214
+ /* AI attribution (人/Agent 归因) */
215
+ .tessera-doc [data-ai][data-pending='true'] {
216
+ background: #f5f1ff;
217
+ border-bottom: 2px solid var(--te-ai);
218
+ border-radius: 2px;
219
+ }
220
+ .tessera-doc [data-ai][data-pending='false'] {
221
+ border-bottom: 2px dotted #cdbcf7;
222
+ border-radius: 2px;
223
+ }
224
+
225
+ /* find & replace decorations */
226
+ .tessera-find-match {
227
+ background: #fff3a3;
228
+ border-radius: 2px;
229
+ }
230
+ .tessera-find-match--active {
231
+ background: #ffb13d;
232
+ color: #fff;
233
+ }
234
+
235
+ /* gapcursor / selectednode */
236
+ .tessera-doc .ProseMirror-selectednode,
237
+ .tessera-doc .ProseMirror-gapcursor {
238
+ outline: none;
239
+ }
240
+ .tessera-doc .ProseMirror-gapcursor::after {
241
+ border-top-color: var(--te-accent);
242
+ }
243
+
244
+ /* ---------- image node view ---------- */
245
+
246
+ .tessera-image {
247
+ position: relative;
248
+ margin: 0.6em 0;
249
+ }
250
+ .tessera-image[data-align='left'] { text-align: left; }
251
+ .tessera-image[data-align='center'] { text-align: center; }
252
+ .tessera-image[data-align='full'] .tessera-image-frame { width: 100% !important; }
253
+ .tessera-image-frame {
254
+ position: relative;
255
+ display: inline-block;
256
+ max-width: 100%;
257
+ line-height: 0;
258
+ }
259
+ .tessera-image-frame img {
260
+ max-width: 100%;
261
+ border-radius: 6px;
262
+ border: 1px solid var(--te-border);
263
+ }
264
+ .tessera-image-resize {
265
+ position: absolute;
266
+ top: 0;
267
+ right: -4px;
268
+ width: 8px;
269
+ height: 100%;
270
+ cursor: ew-resize;
271
+ opacity: 0;
272
+ transition: opacity 100ms ease;
273
+ }
274
+ .tessera-image-resize::after {
275
+ content: '↔';
276
+ position: absolute;
277
+ top: 50%;
278
+ right: -10px;
279
+ transform: translateY(-50%);
280
+ font-size: 13px;
281
+ color: var(--te-text-faint);
282
+ }
283
+ .tessera-image:hover .tessera-image-resize {
284
+ opacity: 1;
285
+ }
286
+ .tessera-image-align {
287
+ position: absolute;
288
+ top: 6px;
289
+ left: 6px;
290
+ display: none;
291
+ gap: 2px;
292
+ background: #fff;
293
+ border: 1px solid var(--te-border);
294
+ border-radius: 6px;
295
+ padding: 2px;
296
+ box-shadow: var(--te-shadow-pop);
297
+ line-height: 1;
298
+ z-index: 5;
299
+ }
300
+ .tessera-image:hover .tessera-image-align,
301
+ .tessera-image[data-selected='true'] .tessera-image-align {
302
+ display: flex;
303
+ }
304
+ .tessera-image-align button {
305
+ border: none;
306
+ background: none;
307
+ width: 26px;
308
+ height: 24px;
309
+ border-radius: 4px;
310
+ cursor: pointer;
311
+ color: var(--te-text-soft);
312
+ font-size: 13px;
313
+ }
314
+ .tessera-image-align button[data-on='true'] {
315
+ background: var(--te-bg-hover);
316
+ color: var(--te-accent);
317
+ }
318
+
319
+ /* ---------- shared toolbar chrome ---------- */
320
+
321
+ .tessera-emptyline-toolbar,
322
+ .tessera-selection-toolbar {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: 2px;
326
+ background: var(--te-bg);
327
+ border: 1px solid var(--te-border);
328
+ border-radius: var(--te-radius);
329
+ box-shadow: var(--te-shadow-pop);
330
+ padding: 4px;
331
+ z-index: 60;
332
+ font-family: var(--te-font);
333
+ }
334
+
335
+ /* the empty-line toolbar owns the caret's empty line: compact height so it
336
+ fits the line box, and the placeholder is suppressed while it is showing */
337
+ .tessera-emptyline-toolbar {
338
+ padding: 3px;
339
+ }
340
+
341
+ .tessera-emptyline-toolbar .tessera-tb-btn {
342
+ min-width: 28px;
343
+ height: 26px;
344
+ padding: 0 6px;
345
+ }
346
+
347
+ .tessera-doc[data-toolbar-line='true'] p[data-placeholder]::before,
348
+ .tessera-doc[data-toolbar-line='true'] p.is-empty::before {
349
+ content: none !important;
350
+ }
351
+
352
+ .tessera-tb-btn {
353
+ appearance: none;
354
+ border: none;
355
+ background: none;
356
+ min-width: 30px;
357
+ height: 30px;
358
+ padding: 0 7px;
359
+ border-radius: 6px;
360
+ font-size: 13px;
361
+ color: #3c3f45;
362
+ cursor: pointer;
363
+ font-family: var(--te-font);
364
+ transition: background 80ms ease;
365
+ display: inline-flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ }
369
+ .tessera-tb-btn:hover {
370
+ background: var(--te-bg-hover);
371
+ }
372
+ .tessera-tb-btn:active {
373
+ background: #eceef1;
374
+ }
375
+ .tessera-tb-btn[data-active='true'] {
376
+ background: #eef1ff;
377
+ color: var(--te-accent);
378
+ }
379
+ .tessera-tb-ai {
380
+ color: var(--te-ai);
381
+ }
382
+ .tessera-tb-colorchip {
383
+ width: 14px;
384
+ height: 14px;
385
+ border-radius: 4px;
386
+ border: 1px solid rgba(0, 0, 0, 0.12);
387
+ display: inline-block;
388
+ }
389
+ .tessera-emptyline-toolbar {
390
+ position: fixed;
391
+ }
392
+ .tessera-emptyline-expand[data-expanded='true'] {
393
+ transform: rotate(90deg);
394
+ }
395
+
396
+ /* empty-line expanded panel */
397
+ .tessera-emptyline-panel {
398
+ position: absolute;
399
+ top: calc(100% + 6px);
400
+ left: 0;
401
+ width: 320px;
402
+ max-height: 320px;
403
+ overflow-y: auto;
404
+ background: var(--te-bg);
405
+ border: 1px solid var(--te-border);
406
+ border-radius: var(--te-radius);
407
+ box-shadow: var(--te-shadow-pop);
408
+ padding: 4px;
409
+ }
410
+
411
+ /* near the bottom of the content/viewport the panel flips upward instead of
412
+ spilling past the document edge (Slite-style placement) */
413
+ .tessera-emptyline-panel[data-placement='top'] {
414
+ top: auto;
415
+ bottom: calc(100% + 6px);
416
+ }
417
+
418
+ /* ---------- popovers (inside toolbars) ---------- */
419
+
420
+ .tessera-popover {
421
+ position: absolute;
422
+ top: calc(100% + 8px);
423
+ left: 0;
424
+ background: var(--te-bg);
425
+ border: 1px solid var(--te-border);
426
+ border-radius: var(--te-radius);
427
+ box-shadow: var(--te-shadow-pop);
428
+ padding: 8px;
429
+ display: flex;
430
+ flex-wrap: wrap;
431
+ gap: 4px;
432
+ width: max-content;
433
+ max-width: 320px;
434
+ z-index: 70;
435
+ }
436
+ /* flip upward when the toolbar sits near the bottom of the viewport */
437
+ .tessera-popover[data-placement='top'] {
438
+ top: auto;
439
+ bottom: calc(100% + 8px);
440
+ }
441
+ .tessera-color-swatch {
442
+ width: 22px;
443
+ height: 22px;
444
+ border-radius: 6px;
445
+ border: 1px solid rgba(0, 0, 0, 0.1);
446
+ cursor: pointer;
447
+ }
448
+ .tessera-color-swatch:hover {
449
+ transform: scale(1.12);
450
+ }
451
+ .tessera-color-none {
452
+ background: #fff;
453
+ position: relative;
454
+ }
455
+ .tessera-color-none::after {
456
+ content: '∅';
457
+ position: absolute;
458
+ inset: 0;
459
+ display: flex;
460
+ align-items: center;
461
+ justify-content: center;
462
+ color: var(--te-text-faint);
463
+ font-size: 12px;
464
+ }
465
+ .tessera-link-popover {
466
+ align-items: center;
467
+ gap: 6px;
468
+ }
469
+ .tessera-link-popover input {
470
+ width: 220px;
471
+ height: 30px;
472
+ border: 1px solid var(--te-border);
473
+ border-radius: 6px;
474
+ padding: 0 8px;
475
+ font-size: 13px;
476
+ font-family: var(--te-font);
477
+ outline: none;
478
+ }
479
+ .tessera-link-popover input:focus {
480
+ border-color: var(--te-accent);
481
+ }
482
+ .tessera-link-popover button,
483
+ .tessera-popover-menu button,
484
+ .tessera-improve-popover > button {
485
+ appearance: none;
486
+ border: none;
487
+ background: none;
488
+ height: 28px;
489
+ padding: 0 10px;
490
+ border-radius: 6px;
491
+ font-size: 13px;
492
+ cursor: pointer;
493
+ color: var(--te-text);
494
+ white-space: nowrap;
495
+ }
496
+ .tessera-link-popover button:hover,
497
+ .tessera-popover-menu button:hover,
498
+ .tessera-improve-popover > button:hover {
499
+ background: var(--te-bg-hover);
500
+ }
501
+ .tessera-danger {
502
+ color: var(--te-danger) !important;
503
+ }
504
+ .tessera-popover-menu,
505
+ .tessera-improve-popover {
506
+ flex-direction: column;
507
+ align-items: stretch;
508
+ }
509
+ .tessera-improve-custom {
510
+ display: flex;
511
+ gap: 6px;
512
+ border-top: 1px dashed var(--te-border);
513
+ padding-top: 8px;
514
+ margin-top: 4px;
515
+ }
516
+ .tessera-improve-custom input {
517
+ flex: 1;
518
+ height: 28px;
519
+ border: 1px solid var(--te-border);
520
+ border-radius: 6px;
521
+ padding: 0 8px;
522
+ font-size: 13px;
523
+ outline: none;
524
+ }
525
+ .tessera-popover-error {
526
+ color: var(--te-danger);
527
+ font-size: 12px;
528
+ width: 100%;
529
+ }
530
+
531
+ /* ---------- slash menu ---------- */
532
+
533
+ .tessera-slash-wrapper {
534
+ z-index: 80;
535
+ }
536
+ .tessera-slash-menu {
537
+ /* z-index must live on the positioned menu itself: the wrapper is a
538
+ static div, where z-index has no effect (frozen table columns at
539
+ z-index 2 would otherwise paint over the menu) */
540
+ z-index: 90;
541
+ background: var(--te-bg);
542
+ border: 1px solid var(--te-border);
543
+ border-radius: 10px;
544
+ box-shadow: var(--te-shadow-pop);
545
+ padding: 6px;
546
+ max-height: 320px;
547
+ overflow-y: auto;
548
+ font-family: var(--te-font);
549
+ }
550
+ .tessera-slash-group-title {
551
+ font-size: 11px;
552
+ color: var(--te-text-faint);
553
+ padding: 8px 10px 4px;
554
+ text-transform: uppercase;
555
+ letter-spacing: 0.06em;
556
+ }
557
+ .tessera-slash-item {
558
+ display: flex;
559
+ align-items: center;
560
+ gap: 8px;
561
+ width: 100%;
562
+ border: none;
563
+ background: none;
564
+ padding: 7px 10px;
565
+ border-radius: 6px;
566
+ cursor: pointer;
567
+ text-align: left;
568
+ font-family: var(--te-font);
569
+ }
570
+ .tessera-slash-item[data-selected='true'],
571
+ .tessera-slash-item:hover {
572
+ background: var(--te-bg-hover);
573
+ }
574
+ .tessera-slash-item-title {
575
+ font-size: 14px;
576
+ color: var(--te-text);
577
+ flex: none;
578
+ }
579
+ .tessera-slash-item-desc {
580
+ font-size: 12px;
581
+ color: var(--te-text-faint);
582
+ flex: 1;
583
+ overflow: hidden;
584
+ text-overflow: ellipsis;
585
+ white-space: nowrap;
586
+ }
587
+ .tessera-slash-item-shortcut {
588
+ font-size: 11px;
589
+ color: var(--te-text-faint);
590
+ background: var(--te-bg-soft);
591
+ border-radius: 4px;
592
+ padding: 1px 6px;
593
+ flex: none;
594
+ }
595
+
596
+ /* ---------- find panel ---------- */
597
+
598
+ .tessera-find-panel {
599
+ position: absolute;
600
+ top: 8px;
601
+ right: 8px;
602
+ z-index: 60;
603
+ display: flex;
604
+ align-items: center;
605
+ gap: 4px;
606
+ background: var(--te-bg);
607
+ border: 1px solid var(--te-border);
608
+ border-radius: var(--te-radius);
609
+ box-shadow: var(--te-shadow-pop);
610
+ padding: 6px;
611
+ font-family: var(--te-font);
612
+ }
613
+ .tessera-find-panel input {
614
+ height: 28px;
615
+ width: 150px;
616
+ border: 1px solid var(--te-border);
617
+ border-radius: 6px;
618
+ padding: 0 8px;
619
+ font-size: 13px;
620
+ outline: none;
621
+ }
622
+ .tessera-find-panel input:focus {
623
+ border-color: var(--te-accent);
624
+ }
625
+ .tessera-find-panel button {
626
+ appearance: none;
627
+ border: none;
628
+ background: none;
629
+ height: 28px;
630
+ padding: 0 8px;
631
+ border-radius: 6px;
632
+ font-size: 12px;
633
+ cursor: pointer;
634
+ color: var(--te-text);
635
+ }
636
+ .tessera-find-panel button:hover {
637
+ background: var(--te-bg-hover);
638
+ }
639
+ .tessera-find-count {
640
+ font-size: 12px;
641
+ color: var(--te-text-faint);
642
+ padding: 0 4px;
643
+ }
644
+
645
+ /* ---------- ask panel ---------- */
646
+
647
+ .tessera-ask-panel {
648
+ position: absolute;
649
+ top: 48px;
650
+ right: 8px;
651
+ bottom: 8px;
652
+ width: 300px;
653
+ z-index: 55;
654
+ display: flex;
655
+ flex-direction: column;
656
+ background: var(--te-bg);
657
+ border: 1px solid var(--te-border);
658
+ border-radius: 10px;
659
+ box-shadow: var(--te-shadow-pop);
660
+ font-family: var(--te-font);
661
+ overflow: hidden;
662
+ }
663
+ .tessera-ask-header {
664
+ display: flex;
665
+ align-items: center;
666
+ justify-content: space-between;
667
+ padding: 10px 12px;
668
+ border-bottom: 1px solid var(--te-border);
669
+ font-size: 13px;
670
+ font-weight: 600;
671
+ }
672
+ .tessera-ask-header button {
673
+ border: none;
674
+ background: none;
675
+ cursor: pointer;
676
+ font-size: 16px;
677
+ color: var(--te-text-faint);
678
+ }
679
+ .tessera-ask-body {
680
+ flex: 1;
681
+ overflow-y: auto;
682
+ padding: 12px;
683
+ font-size: 13px;
684
+ line-height: 1.6;
685
+ }
686
+ .tessera-ask-answer {
687
+ white-space: pre-wrap;
688
+ }
689
+ .tessera-ask-thinking,
690
+ .tessera-ask-error {
691
+ color: var(--te-text-faint);
692
+ font-size: 12px;
693
+ }
694
+ .tessera-ask-error {
695
+ color: var(--te-danger);
696
+ }
697
+ .tessera-ask-input {
698
+ display: flex;
699
+ gap: 6px;
700
+ padding: 10px;
701
+ border-top: 1px solid var(--te-border);
702
+ }
703
+ .tessera-ask-input input {
704
+ flex: 1;
705
+ height: 30px;
706
+ border: 1px solid var(--te-border);
707
+ border-radius: 6px;
708
+ padding: 0 8px;
709
+ font-size: 13px;
710
+ outline: none;
711
+ }
712
+ .tessera-ask-input button {
713
+ border: none;
714
+ background: var(--te-accent);
715
+ color: #fff;
716
+ border-radius: 6px;
717
+ padding: 0 12px;
718
+ font-size: 13px;
719
+ cursor: pointer;
720
+ }
721
+ .tessera-ask-input button:disabled {
722
+ opacity: 0.5;
723
+ cursor: default;
724
+ }
725
+
726
+ /* ---------- suggestion bar (AI triage) ---------- */
727
+
728
+ .tessera-suggestion-bar {
729
+ position: sticky;
730
+ bottom: 12px;
731
+ left: 50%;
732
+ transform: translateX(-50%);
733
+ display: inline-flex;
734
+ align-items: center;
735
+ gap: 8px;
736
+ background: #1f1c2e;
737
+ color: #fff;
738
+ border-radius: 999px;
739
+ padding: 6px 8px 6px 16px;
740
+ box-shadow: var(--te-shadow-pop);
741
+ z-index: 60;
742
+ font-family: var(--te-font);
743
+ font-size: 13px;
744
+ width: max-content;
745
+ }
746
+ .tessera-suggestion-label {
747
+ color: #cdbcf7;
748
+ }
749
+ .tessera-suggestion-accept,
750
+ .tessera-suggestion-reject {
751
+ border: none;
752
+ border-radius: 999px;
753
+ height: 26px;
754
+ padding: 0 14px;
755
+ font-size: 12px;
756
+ cursor: pointer;
757
+ }
758
+ .tessera-suggestion-accept {
759
+ background: var(--te-ai);
760
+ color: #fff;
761
+ }
762
+ .tessera-suggestion-reject {
763
+ background: rgba(255, 255, 255, 0.14);
764
+ color: #fff;
765
+ }
766
+
767
+ /* ---------- drag handle ---------- */
768
+
769
+ .drag-handle {
770
+ color: #b6bcc4;
771
+ cursor: grab;
772
+ }
773
+ .drag-handle:hover,
774
+ .drag-handle[data-dragging='true'] {
775
+ color: #7a8189;
776
+ cursor: grabbing;
777
+ }
778
+ .drag-handle .tessera-drag-handle {
779
+ display: flex;
780
+ align-items: center;
781
+ justify-content: center;
782
+ width: 18px;
783
+ font-size: 13px;
784
+ line-height: 1;
785
+ user-select: none;
786
+ padding: 2px;
787
+ }
788
+
789
+ /* image lightbox (click to preview) */
790
+ .tessera-lightbox {
791
+ position: fixed;
792
+ inset: 0;
793
+ background: rgba(10, 12, 16, 0.82);
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: center;
797
+ z-index: 200;
798
+ cursor: zoom-out;
799
+ }
800
+ .tessera-lightbox img {
801
+ max-width: 90vw;
802
+ max-height: 90vh;
803
+ border-radius: 8px;
804
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5);
805
+ }
806
+
807
+ /* ---------- v1.1 additions: gallery / emoji picker ---------- */
808
+
809
+ /* image gallery: runs of consecutive image blocks flagged by the
810
+ tesseraGallery extension lay out three per row. The layout applies to
811
+ the .react-renderer wrapper (TipTap's node DOM); :has() bridges the
812
+ wrapper to the flagged inner NodeView. */
813
+ .tessera-doc .react-renderer.node-imageBlock:has(> .tessera-image[data-gallery]) {
814
+ display: inline-block;
815
+ width: calc(33.333% - 8px);
816
+ vertical-align: top;
817
+ margin: 0 4px 8px 0;
818
+ }
819
+ .tessera-doc .react-renderer.node-imageBlock:has(> .tessera-image[data-gallery]) .tessera-image {
820
+ display: block;
821
+ width: 100%;
822
+ }
823
+ .tessera-doc .react-renderer.node-imageBlock:has(> .tessera-image[data-gallery]) .tessera-image-frame {
824
+ width: 100% !important;
825
+ }
826
+ /* per-image chrome is hidden in gallery mode (controls would overlap) */
827
+ .tessera-doc .react-renderer.node-imageBlock:has(> .tessera-image[data-gallery]) .tessera-image-align,
828
+ .tessera-doc .react-renderer.node-imageBlock:has(> .tessera-image[data-gallery]) .tessera-image-resize {
829
+ display: none;
830
+ }
831
+
832
+ /* emoji picker popup (`:` trigger) */
833
+ .tessera-emoji-menu {
834
+ position: fixed;
835
+ display: grid;
836
+ grid-template-columns: repeat(8, 34px);
837
+ gap: 2px;
838
+ background: var(--te-bg);
839
+ border: 1px solid var(--te-border);
840
+ border-radius: 10px;
841
+ box-shadow: var(--te-shadow-pop);
842
+ padding: 6px;
843
+ max-height: 264px;
844
+ overflow-y: auto;
845
+ z-index: 80;
846
+ font-family: var(--te-font);
847
+ }
848
+ .tessera-emoji-item {
849
+ display: flex;
850
+ align-items: center;
851
+ justify-content: center;
852
+ width: 34px;
853
+ height: 34px;
854
+ font-size: 20px;
855
+ border: none;
856
+ background: none;
857
+ border-radius: 6px;
858
+ cursor: pointer;
859
+ }
860
+ .tessera-emoji-item:hover,
861
+ .tessera-emoji-item[data-selected='true'] {
862
+ background: var(--te-bg-hover);
863
+ }
864
+
865
+ /* ---------- v1.1: tables ---------- */
866
+
867
+ .tessera-doc table {
868
+ border-collapse: collapse;
869
+ table-layout: fixed;
870
+ width: 100%;
871
+ margin: 0.8em 0;
872
+ overflow: hidden;
873
+ border-radius: var(--te-radius);
874
+ border: 1px solid var(--te-border);
875
+ font-size: 14px;
876
+ line-height: 1.5;
877
+ }
878
+
879
+ .tessera-doc th,
880
+ .tessera-doc td {
881
+ border: 1px solid var(--te-border);
882
+ padding: 7px 10px;
883
+ vertical-align: middle;
884
+ position: relative;
885
+ min-width: 90px;
886
+ }
887
+
888
+ .tessera-doc th {
889
+ background: #fafbfc;
890
+ font-weight: 600;
891
+ text-align: left;
892
+ }
893
+
894
+ .tessera-doc td p,
895
+ .tessera-doc th p {
896
+ margin: 0;
897
+ }
898
+
899
+ /* React/Vue NodeView renderers wrap typed cells in a div inside <tr>;
900
+ that div is illegal in table layout and collapses rows into stacks.
901
+ display:contents removes the wrapper box so the real th/td participate
902
+ in the table formatting context. */
903
+ .tessera-doc tr > .react-renderer {
904
+ display: contents;
905
+ }
906
+
907
+ .tessera-doc tr > .react-renderer > th,
908
+ .tessera-doc tr > .react-renderer > td {
909
+ display: table-cell;
910
+ }
911
+
912
+ /* freeze first column (Slite behavior) */
913
+ .tessera-doc table[data-freeze-first='true'] td:first-child,
914
+ .tessera-doc table[data-freeze-first='true'] th:first-child {
915
+ position: sticky;
916
+ left: 0;
917
+ background: #fff;
918
+ z-index: 2;
919
+ box-shadow: 1px 0 0 var(--te-border);
920
+ }
921
+ .tessera-doc table[data-freeze-first='true'] th:first-child {
922
+ background: #fafbfc;
923
+ }
924
+
925
+ .tessera-th {
926
+ position: relative;
927
+ }
928
+
929
+ .tessera-th-content:empty::after {
930
+ content: ' ';
931
+ }
932
+
933
+ .tessera-col-menu-btn {
934
+ position: absolute;
935
+ top: 2px;
936
+ right: 2px;
937
+ width: 18px;
938
+ height: 18px;
939
+ border: none;
940
+ border-radius: 4px;
941
+ background: transparent;
942
+ color: var(--te-text-faint);
943
+ cursor: pointer;
944
+ font-size: 11px;
945
+ line-height: 1;
946
+ opacity: 0;
947
+ transition: opacity 80ms ease;
948
+ }
949
+
950
+ .tessera-th:hover .tessera-col-menu-btn,
951
+ .tessera-col-menu-btn:focus {
952
+ opacity: 1;
953
+ }
954
+
955
+ .tessera-col-menu {
956
+ flex-direction: column;
957
+ align-items: stretch;
958
+ width: 190px;
959
+ max-height: 320px;
960
+ overflow-y: auto;
961
+ top: calc(100% + 6px);
962
+ }
963
+
964
+ .tessera-menu-section {
965
+ display: grid;
966
+ grid-template-columns: 1fr 1fr;
967
+ gap: 2px;
968
+ }
969
+
970
+ .tessera-menu-sep {
971
+ height: 1px;
972
+ background: var(--te-border);
973
+ margin: 6px 0;
974
+ }
975
+
976
+ .tessera-col-menu button,
977
+ .tessera-block-menu button {
978
+ appearance: none;
979
+ border: none;
980
+ background: none;
981
+ text-align: left;
982
+ padding: 6px 10px;
983
+ border-radius: 6px;
984
+ font-size: 13px;
985
+ cursor: pointer;
986
+ color: var(--te-text);
987
+ white-space: nowrap;
988
+ }
989
+
990
+ .tessera-col-menu button:hover,
991
+ .tessera-block-menu button:hover {
992
+ background: var(--te-bg-hover);
993
+ }
994
+
995
+ .tessera-menu-label {
996
+ font-size: 11px;
997
+ color: var(--te-text-faint);
998
+ padding: 4px 10px 2px;
999
+ text-transform: uppercase;
1000
+ letter-spacing: 0.05em;
1001
+ }
1002
+
1003
+ /* typed cells */
1004
+ .tessera-td-hidden {
1005
+ display: none;
1006
+ }
1007
+
1008
+ .tessera-td--checkbox {
1009
+ text-align: center;
1010
+ }
1011
+
1012
+ .tessera-cell-checkbox {
1013
+ width: 16px;
1014
+ height: 16px;
1015
+ accent-color: var(--te-accent);
1016
+ cursor: pointer;
1017
+ }
1018
+
1019
+ .tessera-cell-input {
1020
+ width: 100%;
1021
+ border: 1px solid transparent;
1022
+ border-radius: 5px;
1023
+ padding: 3px 6px;
1024
+ font-size: 13.5px;
1025
+ font-family: var(--te-font);
1026
+ background: transparent;
1027
+ outline: none;
1028
+ color: var(--te-text);
1029
+ }
1030
+
1031
+ .tessera-cell-input:focus {
1032
+ border-color: var(--te-accent);
1033
+ background: #fff;
1034
+ }
1035
+
1036
+ .tessera-cell-input[type='number'],
1037
+ .tessera-td--number {
1038
+ text-align: right;
1039
+ }
1040
+
1041
+ .tessera-cell-tags {
1042
+ display: flex;
1043
+ flex-wrap: wrap;
1044
+ gap: 4px;
1045
+ align-items: center;
1046
+ }
1047
+
1048
+ .tessera-tag {
1049
+ display: inline-flex;
1050
+ align-items: center;
1051
+ gap: 3px;
1052
+ background: #eef1ff;
1053
+ color: var(--te-accent);
1054
+ border-radius: 999px;
1055
+ padding: 1px 8px;
1056
+ font-size: 12px;
1057
+ line-height: 1.5;
1058
+ }
1059
+
1060
+ .tessera-tag-x {
1061
+ border: none;
1062
+ background: none;
1063
+ cursor: pointer;
1064
+ color: inherit;
1065
+ font-size: 11px;
1066
+ padding: 0;
1067
+ line-height: 1;
1068
+ }
1069
+
1070
+ .tessera-cell-taginput {
1071
+ width: 90px;
1072
+ flex: 1;
1073
+ min-width: 60px;
1074
+ }
1075
+
1076
+ /* ---------- v1.1: comment mark ---------- */
1077
+
1078
+ .tessera-doc [data-comment] {
1079
+ background: #fff7d6;
1080
+ border-bottom: 2px solid #f2c94c;
1081
+ border-radius: 2px;
1082
+ cursor: pointer;
1083
+ }
1084
+
1085
+ .tessera-doc [data-comment][data-resolved='true'] {
1086
+ background: transparent;
1087
+ border-bottom: 2px dotted #e0c96b;
1088
+ }
1089
+
1090
+ .tessera-comment-panel,
1091
+ .tessera-history-panel {
1092
+ position: absolute;
1093
+ top: 48px;
1094
+ right: 8px;
1095
+ bottom: 8px;
1096
+ width: 340px;
1097
+ z-index: 55;
1098
+ display: flex;
1099
+ flex-direction: column;
1100
+ background: var(--te-bg);
1101
+ border: 1px solid var(--te-border);
1102
+ border-radius: 10px;
1103
+ box-shadow: var(--te-shadow-pop);
1104
+ font-family: var(--te-font);
1105
+ overflow: hidden;
1106
+ }
1107
+
1108
+ .tessera-history-body {
1109
+ flex: 1;
1110
+ display: grid;
1111
+ grid-template-columns: 168px 1fr;
1112
+ overflow: hidden;
1113
+ }
1114
+
1115
+ .tessera-history-list {
1116
+ border-right: 1px solid var(--te-border);
1117
+ overflow-y: auto;
1118
+ padding: 6px;
1119
+ }
1120
+
1121
+ .tessera-history-item {
1122
+ display: flex;
1123
+ flex-direction: column;
1124
+ gap: 2px;
1125
+ width: 100%;
1126
+ border: none;
1127
+ background: none;
1128
+ text-align: left;
1129
+ padding: 8px;
1130
+ border-radius: 6px;
1131
+ cursor: pointer;
1132
+ font-size: 12px;
1133
+ }
1134
+
1135
+ .tessera-history-item[data-selected='true'],
1136
+ .tessera-history-item:hover {
1137
+ background: var(--te-bg-hover);
1138
+ }
1139
+
1140
+ .tessera-history-time {
1141
+ color: var(--te-text-soft);
1142
+ font-variant-numeric: tabular-nums;
1143
+ }
1144
+
1145
+ .tessera-history-label {
1146
+ color: var(--te-text);
1147
+ font-weight: 600;
1148
+ }
1149
+
1150
+ .tessera-history-action {
1151
+ color: var(--te-accent);
1152
+ font-size: 12px;
1153
+ }
1154
+
1155
+ .tessera-history-diff {
1156
+ overflow-y: auto;
1157
+ padding: 10px;
1158
+ font-size: 12.5px;
1159
+ }
1160
+
1161
+ .tessera-diff-summary {
1162
+ color: var(--te-text-faint);
1163
+ padding-bottom: 8px;
1164
+ border-bottom: 1px dashed var(--te-border);
1165
+ margin-bottom: 8px;
1166
+ }
1167
+
1168
+ .tessera-diff-block {
1169
+ padding: 6px 8px;
1170
+ border-radius: 6px;
1171
+ margin-bottom: 6px;
1172
+ border: 1px solid var(--te-border);
1173
+ }
1174
+
1175
+ .tessera-diff-badge {
1176
+ display: inline-block;
1177
+ font-size: 10px;
1178
+ padding: 1px 6px;
1179
+ border-radius: 4px;
1180
+ margin-right: 6px;
1181
+ text-transform: uppercase;
1182
+ color: #fff;
1183
+ }
1184
+
1185
+ .tessera-diff-block--added .tessera-diff-badge { background: #31a56f; }
1186
+ .tessera-diff-block--removed .tessera-diff-badge { background: #d9414f; }
1187
+ .tessera-diff-block--changed .tessera-diff-badge { background: #e8912d; }
1188
+
1189
+ .tessera-diff-part--add { background: #e3f7ec; text-decoration: none; }
1190
+ .tessera-diff-part--del { background: #fde7e9; text-decoration: line-through; }
1191
+
1192
+ .tessera-history-actions {
1193
+ display: flex;
1194
+ gap: 4px;
1195
+ }
1196
+
1197
+ .tessera-history-actions button {
1198
+ border: none;
1199
+ background: var(--te-bg-soft);
1200
+ border-radius: 6px;
1201
+ height: 24px;
1202
+ padding: 0 10px;
1203
+ font-size: 12px;
1204
+ cursor: pointer;
1205
+ color: var(--te-text);
1206
+ }
1207
+
1208
+ /* comments */
1209
+ .tessera-thread {
1210
+ border: 1px solid var(--te-border);
1211
+ border-radius: 8px;
1212
+ padding: 8px 10px;
1213
+ margin-bottom: 8px;
1214
+ background: #fffdf5;
1215
+ }
1216
+
1217
+ .tessera-thread--resolved {
1218
+ background: var(--te-bg-soft);
1219
+ opacity: 0.8;
1220
+ }
1221
+
1222
+ .tessera-thread-quote {
1223
+ font-size: 12px;
1224
+ color: var(--te-text-faint);
1225
+ border-left: 2px solid #f2c94c;
1226
+ padding-left: 8px;
1227
+ margin-bottom: 6px;
1228
+ }
1229
+
1230
+ .tessera-thread-entry {
1231
+ font-size: 13px;
1232
+ margin: 4px 0;
1233
+ }
1234
+
1235
+ .tessera-thread-author {
1236
+ font-weight: 600;
1237
+ margin-right: 6px;
1238
+ }
1239
+
1240
+ .tessera-thread-actions {
1241
+ display: flex;
1242
+ gap: 6px;
1243
+ margin-top: 6px;
1244
+ align-items: center;
1245
+ }
1246
+
1247
+ .tessera-thread-actions button {
1248
+ border: 1px solid var(--te-border);
1249
+ background: #fff;
1250
+ border-radius: 6px;
1251
+ height: 24px;
1252
+ padding: 0 10px;
1253
+ font-size: 12px;
1254
+ cursor: pointer;
1255
+ }
1256
+
1257
+ .tessera-thread-badge {
1258
+ font-size: 11px;
1259
+ color: #31a56f;
1260
+ }
1261
+
1262
+ .tessera-comment-hint {
1263
+ padding: 8px 12px;
1264
+ border-top: 1px solid var(--te-border);
1265
+ font-size: 11px;
1266
+ color: var(--te-text-faint);
1267
+ }
1268
+
1269
+ .tessera-comment-composer {
1270
+ flex-direction: column;
1271
+ align-items: stretch;
1272
+ width: 300px;
1273
+ top: calc(100% + 8px);
1274
+ left: 0;
1275
+ gap: 8px;
1276
+ }
1277
+
1278
+ .tessera-comment-composer textarea {
1279
+ width: 100%;
1280
+ height: 70px;
1281
+ border: 1px solid var(--te-border);
1282
+ border-radius: 6px;
1283
+ padding: 8px;
1284
+ font-size: 13px;
1285
+ font-family: var(--te-font);
1286
+ outline: none;
1287
+ resize: vertical;
1288
+ }
1289
+
1290
+ .tessera-comment-composer textarea:focus {
1291
+ border-color: var(--te-accent);
1292
+ }
1293
+
1294
+ .tessera-comment-composer-actions {
1295
+ display: flex;
1296
+ justify-content: flex-end;
1297
+ }
1298
+
1299
+ .tessera-comment-composer-actions button {
1300
+ border: none;
1301
+ background: var(--te-accent);
1302
+ color: #fff;
1303
+ border-radius: 6px;
1304
+ height: 28px;
1305
+ padding: 0 16px;
1306
+ font-size: 13px;
1307
+ cursor: pointer;
1308
+ }
1309
+
1310
+ .tessera-comment-composer-actions button:disabled {
1311
+ opacity: 0.5;
1312
+ }
1313
+
1314
+ /* ---------- v1.1: placeholder mark / embed / toc ---------- */
1315
+
1316
+ .tessera-doc [data-type='tessera-placeholder'] {
1317
+ border-bottom: 2px dashed #b6bcc4;
1318
+ background: #f6f7f9;
1319
+ border-radius: 3px;
1320
+ padding: 0 3px;
1321
+ color: var(--te-text-soft);
1322
+ }
1323
+
1324
+ .tessera-embed {
1325
+ margin: 0.6em 0;
1326
+ }
1327
+
1328
+ .tessera-embed-empty {
1329
+ display: flex;
1330
+ gap: 8px;
1331
+ padding: 14px;
1332
+ border: 1px dashed var(--te-border);
1333
+ border-radius: var(--te-radius);
1334
+ background: #fbfbfc;
1335
+ }
1336
+
1337
+ .tessera-embed-input {
1338
+ flex: 1;
1339
+ height: 32px;
1340
+ border: 1px solid var(--te-border);
1341
+ border-radius: 6px;
1342
+ padding: 0 10px;
1343
+ font-size: 13px;
1344
+ outline: none;
1345
+ }
1346
+
1347
+ .tessera-embed-apply {
1348
+ border: none;
1349
+ background: var(--te-accent);
1350
+ color: #fff;
1351
+ border-radius: 6px;
1352
+ padding: 0 14px;
1353
+ font-size: 13px;
1354
+ cursor: pointer;
1355
+ }
1356
+
1357
+ .tessera-embed-frame {
1358
+ border: 1px solid var(--te-border);
1359
+ border-radius: var(--te-radius);
1360
+ overflow: hidden;
1361
+ }
1362
+
1363
+ .tessera-embed-frame iframe {
1364
+ width: 100%;
1365
+ height: 100%;
1366
+ border: none;
1367
+ display: block;
1368
+ background: #fff;
1369
+ }
1370
+
1371
+ .tessera-embed-link {
1372
+ display: inline-block;
1373
+ margin-top: 4px;
1374
+ font-size: 12px;
1375
+ color: var(--te-text-faint);
1376
+ }
1377
+
1378
+ .tessera-toc {
1379
+ border: 1px solid var(--te-border);
1380
+ border-radius: var(--te-radius);
1381
+ padding: 12px 16px;
1382
+ margin: 0.6em 0;
1383
+ background: #fbfbfc;
1384
+ }
1385
+
1386
+ .tessera-toc-title {
1387
+ font-size: 11px;
1388
+ text-transform: uppercase;
1389
+ letter-spacing: 0.06em;
1390
+ color: var(--te-text-faint);
1391
+ margin-bottom: 8px;
1392
+ }
1393
+
1394
+ .tessera-toc-empty {
1395
+ font-size: 13px;
1396
+ color: var(--te-text-faint);
1397
+ }
1398
+
1399
+ .tessera-toc-item {
1400
+ display: block;
1401
+ border: none;
1402
+ background: none;
1403
+ text-align: left;
1404
+ padding: 3px 0;
1405
+ font-size: 13.5px;
1406
+ color: var(--te-text-soft);
1407
+ cursor: pointer;
1408
+ }
1409
+
1410
+ .tessera-toc-item:hover {
1411
+ color: var(--te-accent);
1412
+ }
1413
+
1414
+ .tessera-toc-item[data-level='2'] { padding-left: 16px; }
1415
+ .tessera-toc-item[data-level='3'] { padding-left: 32px; }
1416
+ .tessera-toc-item[data-level='4'] { padding-left: 48px; }
1417
+
1418
+ /* ---------- v1.1: block context menu ---------- */
1419
+
1420
+ .tessera-block-menu {
1421
+ position: fixed;
1422
+ width: 200px;
1423
+ background: var(--te-bg);
1424
+ border: 1px solid var(--te-border);
1425
+ border-radius: var(--te-radius);
1426
+ box-shadow: var(--te-shadow-pop);
1427
+ padding: 6px;
1428
+ z-index: 90;
1429
+ font-family: var(--te-font);
1430
+ }
1431
+ .tessera-root[data-tessera-theme='dark'] {
1432
+ --te-accent: #6c85ff;
1433
+ --te-ai: #a184f0;
1434
+ --te-text: #e6e7ea;
1435
+ --te-text-soft: #a4a9b3;
1436
+ --te-text-faint: #6f7580;
1437
+ --te-border: #33363d;
1438
+ --te-bg: #1b1d22;
1439
+ --te-bg-soft: #24262c;
1440
+ --te-bg-hover: #2c2f37;
1441
+ --te-shadow-pop: 0 2px 6px rgba(0, 0, 0, 0.4), 0 12px 28px rgba(0, 0, 0, 0.5);
1442
+ }
1443
+
1444
+ /* dark palette component overrides (surfaces with fixed light colors) */
1445
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc ::selection {
1446
+ background: #2e3a6e;
1447
+ }
1448
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc h4 {
1449
+ color: #c9cdd4;
1450
+ }
1451
+ .tessera-root[data-tessera-theme='dark'] .tessera-tb-btn {
1452
+ color: #c9cdd4;
1453
+ }
1454
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='hint'][data-variant='info'] {
1455
+ background: #232c47;
1456
+ border-color: #35406a;
1457
+ }
1458
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='hint'][data-variant='success'] {
1459
+ background: #1d3128;
1460
+ border-color: #2c4a3b;
1461
+ }
1462
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='hint'][data-variant='warning'] {
1463
+ background: #33291a;
1464
+ border-color: #4d3d24;
1465
+ }
1466
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='hint'][data-variant='danger'] {
1467
+ background: #381d20;
1468
+ border-color: #55292d;
1469
+ }
1470
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='hint'][data-variant='neutral'] {
1471
+ background: #26282e;
1472
+ border-color: #33363d;
1473
+ }
1474
+ .tessera-root[data-tessera-theme='dark'] .tessera-doc div[data-type='collapsible'] {
1475
+ background: #212329;
1476
+ }
1477
+
1478
+ /* dark theme hook (host sets data-tessera-theme="dark" on .tessera-root) */
1479
+
1480
+ /* core drag-handle (framework-free variant) renders no child element */
1481
+ .drag-handle:not(:has(.tessera-drag-handle))::before {
1482
+ content: '⠿';
1483
+ display: flex;
1484
+ align-items: center;
1485
+ justify-content: center;
1486
+ width: 18px;
1487
+ font-size: 13px;
1488
+ line-height: 1;
1489
+ user-select: none;
1490
+ padding: 2px;
1491
+ }