@mrsf/markdown-it-mrsf 0.5.0 → 0.5.2

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.
package/dist/style.css CHANGED
@@ -1,522 +1,522 @@
1
- /*
2
- * Sidemark — MRSF plugin default styles (overlay gutter architecture).
3
- *
4
- * Include via: import "@mrsf/plugin-shared/style.css"
5
- * or <link rel="stylesheet" href=".../@mrsf/plugin-shared/dist/style.css">
6
- *
7
- * Customise with CSS custom properties (--mrsf-*).
8
- *
9
- * Layout: The controller wraps the rendered markdown in an overlay root
10
- * with position:relative, and creates absolute-positioned gutter columns
11
- * on the left and/or right. The plugins only add data-mrsf-line
12
- * attributes — no visual DOM injection.
13
- */
14
-
15
- /* ── Custom property defaults ────────────────────────────── */
16
-
17
- :root {
18
- --mrsf-accent: #3794ff;
19
- --mrsf-badge-bg: #007acc;
20
- --mrsf-badge-fg: #fff;
21
- --mrsf-badge-resolved-bg: #388a34;
22
- --mrsf-add-bg: rgba(0, 122, 204, 0.12);
23
- --mrsf-add-fg: #007acc;
24
- --mrsf-add-border: rgba(0, 122, 204, 0.28);
25
- --mrsf-tooltip-bg: #252526;
26
- --mrsf-tooltip-fg: #cccccc;
27
- --mrsf-tooltip-border: #454545;
28
- --mrsf-highlight-bg: rgba(255, 213, 79, 0.25);
29
- --mrsf-highlight-border: rgba(255, 213, 79, 0.7);
30
- --mrsf-severity-high: #e74c3c;
31
- --mrsf-severity-medium: #f39c12;
32
- --mrsf-severity-low: #3498db;
33
- --mrsf-gutter-width: 36px;
34
- --mrsf-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
35
- }
36
-
37
- @media (prefers-color-scheme: light) {
38
- :root {
39
- --mrsf-tooltip-bg: #f3f3f3;
40
- --mrsf-tooltip-fg: #333333;
41
- --mrsf-tooltip-border: #cccccc;
42
- }
43
- }
44
-
45
- /* ── Overlay root (created by controller) ────────────────── */
46
-
47
- .mrsf-overlay-root {
48
- position: relative;
49
- }
50
-
51
- .mrsf-gutter {
52
- position: absolute;
53
- top: 0;
54
- bottom: 0;
55
- width: var(--mrsf-gutter-width);
56
- pointer-events: none;
57
- z-index: 10;
58
- }
59
-
60
- .mrsf-gutter.is-hidden,
61
- .mrsf-line-highlight-layer.is-hidden {
62
- display: none;
63
- }
64
-
65
- .mrsf-gutter-left {
66
- left: calc(-1 * var(--mrsf-gutter-width) - 8px);
67
- }
68
-
69
- .mrsf-gutter-right {
70
- right: calc(-1 * var(--mrsf-gutter-width) - 8px);
71
- }
72
-
73
- .mrsf-line-highlight-layer {
74
- position: absolute;
75
- inset: 0;
76
- pointer-events: none;
77
- z-index: 1;
78
- }
79
-
80
- .mrsf-line-highlight-overlay {
81
- position: absolute;
82
- left: 0;
83
- right: 0;
84
- border-left: 3px solid var(--mrsf-accent);
85
- background: rgba(55, 148, 255, 0.06);
86
- border-radius: 2px;
87
- transition: background 0.15s ease;
88
- }
89
-
90
- .mrsf-line-highlight-overlay:hover {
91
- background: rgba(55, 148, 255, 0.12);
92
- }
93
-
94
- /* ── Line highlight (CSS-only tinting for commented lines) ── */
95
-
96
- .mrsf-line-highlight {
97
- border-left: 3px solid var(--mrsf-accent);
98
- padding-left: 8px;
99
- background: rgba(55, 148, 255, 0.06);
100
- border-radius: 2px;
101
- transition: background 0.15s ease;
102
- }
103
-
104
- .mrsf-line-highlight:hover {
105
- background: rgba(55, 148, 255, 0.12);
106
- }
107
-
108
- /* ── Gutter items (badges & add buttons, positioned by JS) ── */
109
-
110
- .mrsf-gutter-item {
111
- position: absolute;
112
- left: 0;
113
- right: 0;
114
- display: flex;
115
- align-items: center;
116
- justify-content: center;
117
- pointer-events: auto;
118
- }
119
-
120
- /* ── Badge ──────────────────────────────────────────────── */
121
-
122
- .mrsf-badge,
123
- .mrsf-gutter-add {
124
- display: inline-flex;
125
- align-items: center;
126
- justify-content: center;
127
- gap: 2px;
128
- font-size: 11px;
129
- font-weight: 600;
130
- line-height: 1;
131
- min-height: 20px;
132
- padding: 3px 8px;
133
- border-radius: 999px;
134
- user-select: none;
135
- white-space: nowrap;
136
- transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease;
137
- }
138
-
139
- .mrsf-badge {
140
- cursor: pointer;
141
- color: var(--mrsf-badge-fg);
142
- background: var(--mrsf-badge-bg);
143
- border: 1px solid transparent;
144
- border-left: 3px solid transparent;
145
- }
146
-
147
- .mrsf-badge-resolved {
148
- background: var(--mrsf-badge-resolved-bg);
149
- opacity: 0.7;
150
- }
151
-
152
- .mrsf-badge-severity-high {
153
- border-left-color: var(--mrsf-severity-high);
154
- }
155
-
156
- .mrsf-badge-severity-medium {
157
- border-left-color: var(--mrsf-severity-medium);
158
- }
159
-
160
- /* ── Add button (in gutter) ─────────────────────────────── */
161
-
162
- .mrsf-gutter-add {
163
- appearance: none;
164
- opacity: 0.38;
165
- pointer-events: auto;
166
- border: 1px solid var(--mrsf-add-border);
167
- background: var(--mrsf-add-bg);
168
- color: var(--mrsf-add-fg);
169
- cursor: pointer;
170
- font-family: var(--mrsf-font-family);
171
- }
172
-
173
- @media (prefers-color-scheme: light) {
174
- :root {
175
- --mrsf-add-bg: rgba(0, 122, 204, 0.08);
176
- --mrsf-add-border: rgba(0, 122, 204, 0.18);
177
- }
178
- }
179
-
180
- .mrsf-gutter-add:hover,
181
- .mrsf-gutter-add:focus-visible {
182
- opacity: 1;
183
- background: rgba(0, 122, 204, 0.18);
184
- border-color: rgba(0, 122, 204, 0.38);
185
- }
186
-
187
- .mrsf-gutter-add:focus-visible,
188
- .mrsf-badge:focus-visible {
189
- outline: 2px solid var(--mrsf-accent);
190
- outline-offset: 2px;
191
- }
192
-
193
- /* ── Tooltip (positioned by JS, appended to gutter item) ── */
194
-
195
- .mrsf-tooltip {
196
- display: none;
197
- position: absolute;
198
- top: 100%;
199
- z-index: 1000;
200
- min-width: 300px;
201
- max-width: 480px;
202
- max-height: 400px;
203
- overflow-y: auto;
204
- padding: 8px;
205
- margin-top: 4px;
206
- border-radius: 6px;
207
-
208
- background: var(--mrsf-tooltip-bg);
209
- border: 1px solid var(--mrsf-tooltip-border);
210
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
211
-
212
- font-family: var(--mrsf-font-family);
213
- font-size: 13px;
214
- line-height: 1.5;
215
- color: var(--mrsf-tooltip-fg);
216
- }
217
-
218
- /* Left gutter: tooltip opens to the right */
219
- .mrsf-gutter-left .mrsf-tooltip {
220
- left: 0;
221
- right: auto;
222
- }
223
-
224
- /* Right gutter: tooltip opens to the left */
225
- .mrsf-gutter-right .mrsf-tooltip {
226
- left: auto;
227
- right: 0;
228
- }
229
-
230
- .mrsf-tooltip.mrsf-tooltip-visible {
231
- display: block;
232
- animation: mrsf-fade-in 0.15s ease;
233
- }
234
-
235
- @keyframes mrsf-fade-in {
236
- from { opacity: 0; transform: translateY(-4px); }
237
- to { opacity: 1; transform: translateY(0); }
238
- }
239
-
240
- /* ── Thread / Comment ───────────────────────────────────── */
241
-
242
- .mrsf-thread {
243
- padding: 4px 0;
244
- }
245
-
246
- .mrsf-thread + .mrsf-thread {
247
- border-top: 1px solid var(--mrsf-tooltip-border);
248
- margin-top: 4px;
249
- padding-top: 8px;
250
- }
251
-
252
- .mrsf-comment {
253
- padding: 4px 0;
254
- }
255
-
256
- .mrsf-comment.mrsf-resolved {
257
- border-left: 2px solid var(--mrsf-badge-resolved-bg);
258
- padding-left: 6px;
259
- }
260
-
261
- /* ── Replies ────────────────────────────────────────────── */
262
-
263
- .mrsf-replies {
264
- margin-left: 16px;
265
- padding-left: 8px;
266
- border-left: 2px solid var(--mrsf-tooltip-border);
267
- }
268
-
269
- .mrsf-reply {
270
- font-size: 12px;
271
- }
272
-
273
- /* ── Comment header ─────────────────────────────────────── */
274
-
275
- .mrsf-comment-header {
276
- display: flex;
277
- align-items: center;
278
- gap: 6px;
279
- flex-wrap: wrap;
280
- margin-bottom: 2px;
281
- }
282
-
283
- .mrsf-author {
284
- font-weight: 600;
285
- }
286
-
287
- .mrsf-date {
288
- font-size: 11px;
289
- opacity: 0.6;
290
- }
291
-
292
- .mrsf-severity {
293
- font-size: 10px;
294
- font-weight: 600;
295
- padding: 1px 5px;
296
- border-radius: 8px;
297
- text-transform: uppercase;
298
- letter-spacing: 0.3px;
299
- }
300
-
301
- .mrsf-severity-high {
302
- background: rgba(231, 76, 60, 0.2);
303
- color: var(--mrsf-severity-high);
304
- }
305
-
306
- .mrsf-severity-medium {
307
- background: rgba(243, 156, 18, 0.2);
308
- color: var(--mrsf-severity-medium);
309
- }
310
-
311
- .mrsf-severity-low {
312
- background: rgba(52, 152, 219, 0.2);
313
- color: var(--mrsf-severity-low);
314
- }
315
-
316
- .mrsf-type {
317
- font-size: 10px;
318
- padding: 1px 5px;
319
- border-radius: 8px;
320
- background: rgba(127, 127, 127, 0.15);
321
- opacity: 0.8;
322
- }
323
-
324
- .mrsf-resolved-badge {
325
- font-size: 10px;
326
- color: var(--mrsf-badge-resolved-bg);
327
- font-weight: 600;
328
- }
329
-
330
- /* ── Comment body ───────────────────────────────────────── */
331
-
332
- .mrsf-comment-body {
333
- white-space: pre-wrap;
334
- word-break: break-word;
335
- }
336
-
337
- /* ── Selected text quote in tooltip ─────────────────────── */
338
-
339
- .mrsf-selected-text {
340
- font-family: monospace;
341
- font-size: 0.85em;
342
- background: rgba(127, 127, 127, 0.1);
343
- border-left: 3px solid rgba(127, 127, 127, 0.3);
344
- margin: 4px 0;
345
- border-radius: 2px;
346
- }
347
-
348
- .mrsf-selected-text-summary {
349
- padding: 4px 8px;
350
- cursor: pointer;
351
- overflow: hidden;
352
- text-overflow: ellipsis;
353
- white-space: nowrap;
354
- display: block;
355
- list-style: none;
356
- color: var(--mrsf-fg, inherit);
357
- opacity: 0.7;
358
- }
359
-
360
- .mrsf-selected-text-summary::-webkit-details-marker {
361
- display: none;
362
- }
363
-
364
- .mrsf-selected-text-summary::before {
365
- content: "▶ ";
366
- font-size: 0.7em;
367
- vertical-align: middle;
368
- margin-right: 2px;
369
- }
370
-
371
- .mrsf-selected-text[open] > .mrsf-selected-text-summary {
372
- display: none;
373
- }
374
-
375
- .mrsf-selected-text-full {
376
- display: block;
377
- padding: 4px 8px;
378
- white-space: pre-wrap;
379
- word-break: break-word;
380
- }
381
-
382
- /* ── Inline text highlight (overlay positioned by JS) ───── */
383
-
384
- .mrsf-highlight-overlay {
385
- position: absolute;
386
- background: var(--mrsf-highlight-bg);
387
- border-bottom: 2px solid var(--mrsf-highlight-border);
388
- border-radius: 2px;
389
- pointer-events: none;
390
- transition: background 0.15s ease;
391
- }
392
-
393
- /* ── Inline comment text highlight (<mark> by controller) ── */
394
-
395
- .mrsf-inline-highlight {
396
- background: var(--mrsf-highlight-bg);
397
- border-bottom: 2px solid var(--mrsf-highlight-border);
398
- border-radius: 2px;
399
- cursor: pointer;
400
- transition: background 0.15s ease;
401
- }
402
-
403
- .mrsf-inline-highlight:hover {
404
- background: rgba(255, 213, 79, 0.4);
405
- }
406
-
407
- /* Inline tooltip (appended to document.body, positioned by JS) */
408
- .mrsf-inline-tooltip {
409
- position: fixed;
410
- z-index: 1100;
411
- min-width: 300px;
412
- max-width: 480px;
413
- max-height: 400px;
414
- overflow-y: auto;
415
- padding: 8px;
416
- border-radius: 6px;
417
- background: var(--mrsf-tooltip-bg);
418
- border: 1px solid var(--mrsf-tooltip-border);
419
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
420
- font-family: var(--mrsf-font-family);
421
- font-size: 13px;
422
- line-height: 1.5;
423
- color: var(--mrsf-tooltip-fg);
424
- white-space: normal;
425
- animation: mrsf-fade-in 0.15s ease;
426
- }
427
-
428
- /* ── Interactive action buttons ─────────────────────────── */
429
-
430
- .mrsf-actions {
431
- display: none;
432
- gap: 4px;
433
- margin-top: 4px;
434
- padding-top: 4px;
435
- border-top: 1px solid var(--mrsf-tooltip-border);
436
- }
437
-
438
- .mrsf-interactive .mrsf-actions {
439
- display: flex;
440
- }
441
-
442
- .mrsf-tooltip-actions {
443
- display: flex;
444
- justify-content: flex-end;
445
- gap: 6px;
446
- margin-top: 8px;
447
- padding-top: 6px;
448
- border-top: 1px solid var(--mrsf-tooltip-border);
449
- }
450
-
451
- .mrsf-action-btn {
452
- font-size: 11px;
453
- padding: 2px 8px;
454
- border-radius: 4px;
455
- border: 1px solid var(--mrsf-tooltip-border);
456
- background: transparent;
457
- color: var(--mrsf-tooltip-fg);
458
- cursor: pointer;
459
- font-family: var(--mrsf-font-family);
460
- transition: background 0.15s ease;
461
- }
462
-
463
- .mrsf-action-btn.mrsf-action-danger {
464
- color: #d13438;
465
- border-color: rgba(209, 52, 56, 0.7);
466
- }
467
-
468
- .mrsf-action-btn:hover {
469
- background: rgba(127, 127, 127, 0.2);
470
- }
471
-
472
- /* ── Floating "Add comment" button (selection-based) ────── */
473
-
474
- /* ── Orphaned comments section (bottom of container) ────── */
475
-
476
- .mrsf-orphaned-section {
477
- margin-top: 24px;
478
- padding-top: 16px;
479
- border-top: 2px dashed var(--mrsf-tooltip-border);
480
- }
481
-
482
- .mrsf-orphaned-heading {
483
- font-family: var(--mrsf-font-family);
484
- font-size: 12px;
485
- font-weight: 600;
486
- text-transform: uppercase;
487
- letter-spacing: 0.5px;
488
- color: #999;
489
- margin-bottom: 8px;
490
- }
491
-
492
- .mrsf-orphaned-thread {
493
- padding: 8px;
494
- margin-bottom: 6px;
495
- border-radius: 6px;
496
- border: 1px solid var(--mrsf-tooltip-border);
497
- background: rgba(127, 127, 127, 0.06);
498
- opacity: 0.7;
499
- font-family: var(--mrsf-font-family);
500
- font-size: 13px;
501
- line-height: 1.5;
502
- color: var(--mrsf-tooltip-fg);
503
- }
504
-
505
- .mrsf-add-inline-button {
506
- position: absolute;
507
- z-index: 1200;
508
- display: none;
509
- font-size: 12px;
510
- padding: 6px 10px;
511
- border-radius: 6px;
512
- border: 1px solid var(--mrsf-tooltip-border);
513
- background: var(--mrsf-tooltip-bg);
514
- color: var(--mrsf-tooltip-fg);
515
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
516
- cursor: pointer;
517
- font-family: var(--mrsf-font-family);
518
- }
519
-
520
- .mrsf-add-inline-button:hover {
521
- background: rgba(127, 127, 127, 0.2);
522
- }
1
+ /*
2
+ * Sidemark — MRSF plugin default styles (overlay gutter architecture).
3
+ *
4
+ * Include via: import "@mrsf/plugin-shared/style.css"
5
+ * or <link rel="stylesheet" href=".../@mrsf/plugin-shared/dist/style.css">
6
+ *
7
+ * Customise with CSS custom properties (--mrsf-*).
8
+ *
9
+ * Layout: The controller wraps the rendered markdown in an overlay root
10
+ * with position:relative, and creates absolute-positioned gutter columns
11
+ * on the left and/or right. The plugins only add data-mrsf-line
12
+ * attributes — no visual DOM injection.
13
+ */
14
+
15
+ /* ── Custom property defaults ────────────────────────────── */
16
+
17
+ :root {
18
+ --mrsf-accent: #3794ff;
19
+ --mrsf-badge-bg: #007acc;
20
+ --mrsf-badge-fg: #fff;
21
+ --mrsf-badge-resolved-bg: #388a34;
22
+ --mrsf-add-bg: rgba(0, 122, 204, 0.12);
23
+ --mrsf-add-fg: #007acc;
24
+ --mrsf-add-border: rgba(0, 122, 204, 0.28);
25
+ --mrsf-tooltip-bg: #252526;
26
+ --mrsf-tooltip-fg: #cccccc;
27
+ --mrsf-tooltip-border: #454545;
28
+ --mrsf-highlight-bg: rgba(255, 213, 79, 0.25);
29
+ --mrsf-highlight-border: rgba(255, 213, 79, 0.7);
30
+ --mrsf-severity-high: #e74c3c;
31
+ --mrsf-severity-medium: #f39c12;
32
+ --mrsf-severity-low: #3498db;
33
+ --mrsf-gutter-width: 36px;
34
+ --mrsf-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
35
+ }
36
+
37
+ @media (prefers-color-scheme: light) {
38
+ :root {
39
+ --mrsf-tooltip-bg: #f3f3f3;
40
+ --mrsf-tooltip-fg: #333333;
41
+ --mrsf-tooltip-border: #cccccc;
42
+ }
43
+ }
44
+
45
+ /* ── Overlay root (created by controller) ────────────────── */
46
+
47
+ .mrsf-overlay-root {
48
+ position: relative;
49
+ }
50
+
51
+ .mrsf-gutter {
52
+ position: absolute;
53
+ top: 0;
54
+ bottom: 0;
55
+ width: var(--mrsf-gutter-width);
56
+ pointer-events: none;
57
+ z-index: 10;
58
+ }
59
+
60
+ .mrsf-gutter.is-hidden,
61
+ .mrsf-line-highlight-layer.is-hidden {
62
+ display: none;
63
+ }
64
+
65
+ .mrsf-gutter-left {
66
+ left: calc(-1 * var(--mrsf-gutter-width) - 8px);
67
+ }
68
+
69
+ .mrsf-gutter-right {
70
+ right: calc(-1 * var(--mrsf-gutter-width) - 8px);
71
+ }
72
+
73
+ .mrsf-line-highlight-layer {
74
+ position: absolute;
75
+ inset: 0;
76
+ pointer-events: none;
77
+ z-index: 1;
78
+ }
79
+
80
+ .mrsf-line-highlight-overlay {
81
+ position: absolute;
82
+ left: 0;
83
+ right: 0;
84
+ border-left: 3px solid var(--mrsf-accent);
85
+ background: rgba(55, 148, 255, 0.06);
86
+ border-radius: 2px;
87
+ transition: background 0.15s ease;
88
+ }
89
+
90
+ .mrsf-line-highlight-overlay:hover {
91
+ background: rgba(55, 148, 255, 0.12);
92
+ }
93
+
94
+ /* ── Line highlight (CSS-only tinting for commented lines) ── */
95
+
96
+ .mrsf-line-highlight {
97
+ border-left: 3px solid var(--mrsf-accent);
98
+ padding-left: 8px;
99
+ background: rgba(55, 148, 255, 0.06);
100
+ border-radius: 2px;
101
+ transition: background 0.15s ease;
102
+ }
103
+
104
+ .mrsf-line-highlight:hover {
105
+ background: rgba(55, 148, 255, 0.12);
106
+ }
107
+
108
+ /* ── Gutter items (badges & add buttons, positioned by JS) ── */
109
+
110
+ .mrsf-gutter-item {
111
+ position: absolute;
112
+ left: 0;
113
+ right: 0;
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ pointer-events: auto;
118
+ }
119
+
120
+ /* ── Badge ──────────────────────────────────────────────── */
121
+
122
+ .mrsf-badge,
123
+ .mrsf-gutter-add {
124
+ display: inline-flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ gap: 2px;
128
+ font-size: 11px;
129
+ font-weight: 600;
130
+ line-height: 1;
131
+ min-height: 20px;
132
+ padding: 3px 8px;
133
+ border-radius: 999px;
134
+ user-select: none;
135
+ white-space: nowrap;
136
+ transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease;
137
+ }
138
+
139
+ .mrsf-badge {
140
+ cursor: pointer;
141
+ color: var(--mrsf-badge-fg);
142
+ background: var(--mrsf-badge-bg);
143
+ border: 1px solid transparent;
144
+ border-left: 3px solid transparent;
145
+ }
146
+
147
+ .mrsf-badge-resolved {
148
+ background: var(--mrsf-badge-resolved-bg);
149
+ opacity: 0.7;
150
+ }
151
+
152
+ .mrsf-badge-severity-high {
153
+ border-left-color: var(--mrsf-severity-high);
154
+ }
155
+
156
+ .mrsf-badge-severity-medium {
157
+ border-left-color: var(--mrsf-severity-medium);
158
+ }
159
+
160
+ /* ── Add button (in gutter) ─────────────────────────────── */
161
+
162
+ .mrsf-gutter-add {
163
+ appearance: none;
164
+ opacity: 0.38;
165
+ pointer-events: auto;
166
+ border: 1px solid var(--mrsf-add-border);
167
+ background: var(--mrsf-add-bg);
168
+ color: var(--mrsf-add-fg);
169
+ cursor: pointer;
170
+ font-family: var(--mrsf-font-family);
171
+ }
172
+
173
+ @media (prefers-color-scheme: light) {
174
+ :root {
175
+ --mrsf-add-bg: rgba(0, 122, 204, 0.08);
176
+ --mrsf-add-border: rgba(0, 122, 204, 0.18);
177
+ }
178
+ }
179
+
180
+ .mrsf-gutter-add:hover,
181
+ .mrsf-gutter-add:focus-visible {
182
+ opacity: 1;
183
+ background: rgba(0, 122, 204, 0.18);
184
+ border-color: rgba(0, 122, 204, 0.38);
185
+ }
186
+
187
+ .mrsf-gutter-add:focus-visible,
188
+ .mrsf-badge:focus-visible {
189
+ outline: 2px solid var(--mrsf-accent);
190
+ outline-offset: 2px;
191
+ }
192
+
193
+ /* ── Tooltip (positioned by JS, appended to gutter item) ── */
194
+
195
+ .mrsf-tooltip {
196
+ display: none;
197
+ position: absolute;
198
+ top: 100%;
199
+ z-index: 1000;
200
+ min-width: 300px;
201
+ max-width: 480px;
202
+ max-height: 400px;
203
+ overflow-y: auto;
204
+ padding: 8px;
205
+ margin-top: 4px;
206
+ border-radius: 6px;
207
+
208
+ background: var(--mrsf-tooltip-bg);
209
+ border: 1px solid var(--mrsf-tooltip-border);
210
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
211
+
212
+ font-family: var(--mrsf-font-family);
213
+ font-size: 13px;
214
+ line-height: 1.5;
215
+ color: var(--mrsf-tooltip-fg);
216
+ }
217
+
218
+ /* Left gutter: tooltip opens to the right */
219
+ .mrsf-gutter-left .mrsf-tooltip {
220
+ left: 0;
221
+ right: auto;
222
+ }
223
+
224
+ /* Right gutter: tooltip opens to the left */
225
+ .mrsf-gutter-right .mrsf-tooltip {
226
+ left: auto;
227
+ right: 0;
228
+ }
229
+
230
+ .mrsf-tooltip.mrsf-tooltip-visible {
231
+ display: block;
232
+ animation: mrsf-fade-in 0.15s ease;
233
+ }
234
+
235
+ @keyframes mrsf-fade-in {
236
+ from { opacity: 0; transform: translateY(-4px); }
237
+ to { opacity: 1; transform: translateY(0); }
238
+ }
239
+
240
+ /* ── Thread / Comment ───────────────────────────────────── */
241
+
242
+ .mrsf-thread {
243
+ padding: 4px 0;
244
+ }
245
+
246
+ .mrsf-thread + .mrsf-thread {
247
+ border-top: 1px solid var(--mrsf-tooltip-border);
248
+ margin-top: 4px;
249
+ padding-top: 8px;
250
+ }
251
+
252
+ .mrsf-comment {
253
+ padding: 4px 0;
254
+ }
255
+
256
+ .mrsf-comment.mrsf-resolved {
257
+ border-left: 2px solid var(--mrsf-badge-resolved-bg);
258
+ padding-left: 6px;
259
+ }
260
+
261
+ /* ── Replies ────────────────────────────────────────────── */
262
+
263
+ .mrsf-replies {
264
+ margin-left: 16px;
265
+ padding-left: 8px;
266
+ border-left: 2px solid var(--mrsf-tooltip-border);
267
+ }
268
+
269
+ .mrsf-reply {
270
+ font-size: 12px;
271
+ }
272
+
273
+ /* ── Comment header ─────────────────────────────────────── */
274
+
275
+ .mrsf-comment-header {
276
+ display: flex;
277
+ align-items: center;
278
+ gap: 6px;
279
+ flex-wrap: wrap;
280
+ margin-bottom: 2px;
281
+ }
282
+
283
+ .mrsf-author {
284
+ font-weight: 600;
285
+ }
286
+
287
+ .mrsf-date {
288
+ font-size: 11px;
289
+ opacity: 0.6;
290
+ }
291
+
292
+ .mrsf-severity {
293
+ font-size: 10px;
294
+ font-weight: 600;
295
+ padding: 1px 5px;
296
+ border-radius: 8px;
297
+ text-transform: uppercase;
298
+ letter-spacing: 0.3px;
299
+ }
300
+
301
+ .mrsf-severity-high {
302
+ background: rgba(231, 76, 60, 0.2);
303
+ color: var(--mrsf-severity-high);
304
+ }
305
+
306
+ .mrsf-severity-medium {
307
+ background: rgba(243, 156, 18, 0.2);
308
+ color: var(--mrsf-severity-medium);
309
+ }
310
+
311
+ .mrsf-severity-low {
312
+ background: rgba(52, 152, 219, 0.2);
313
+ color: var(--mrsf-severity-low);
314
+ }
315
+
316
+ .mrsf-type {
317
+ font-size: 10px;
318
+ padding: 1px 5px;
319
+ border-radius: 8px;
320
+ background: rgba(127, 127, 127, 0.15);
321
+ opacity: 0.8;
322
+ }
323
+
324
+ .mrsf-resolved-badge {
325
+ font-size: 10px;
326
+ color: var(--mrsf-badge-resolved-bg);
327
+ font-weight: 600;
328
+ }
329
+
330
+ /* ── Comment body ───────────────────────────────────────── */
331
+
332
+ .mrsf-comment-body {
333
+ white-space: pre-wrap;
334
+ word-break: break-word;
335
+ }
336
+
337
+ /* ── Selected text quote in tooltip ─────────────────────── */
338
+
339
+ .mrsf-selected-text {
340
+ font-family: monospace;
341
+ font-size: 0.85em;
342
+ background: rgba(127, 127, 127, 0.1);
343
+ border-left: 3px solid rgba(127, 127, 127, 0.3);
344
+ margin: 4px 0;
345
+ border-radius: 2px;
346
+ }
347
+
348
+ .mrsf-selected-text-summary {
349
+ padding: 4px 8px;
350
+ cursor: pointer;
351
+ overflow: hidden;
352
+ text-overflow: ellipsis;
353
+ white-space: nowrap;
354
+ display: block;
355
+ list-style: none;
356
+ color: var(--mrsf-fg, inherit);
357
+ opacity: 0.7;
358
+ }
359
+
360
+ .mrsf-selected-text-summary::-webkit-details-marker {
361
+ display: none;
362
+ }
363
+
364
+ .mrsf-selected-text-summary::before {
365
+ content: "▶ ";
366
+ font-size: 0.7em;
367
+ vertical-align: middle;
368
+ margin-right: 2px;
369
+ }
370
+
371
+ .mrsf-selected-text[open] > .mrsf-selected-text-summary {
372
+ display: none;
373
+ }
374
+
375
+ .mrsf-selected-text-full {
376
+ display: block;
377
+ padding: 4px 8px;
378
+ white-space: pre-wrap;
379
+ word-break: break-word;
380
+ }
381
+
382
+ /* ── Inline text highlight (overlay positioned by JS) ───── */
383
+
384
+ .mrsf-highlight-overlay {
385
+ position: absolute;
386
+ background: var(--mrsf-highlight-bg);
387
+ border-bottom: 2px solid var(--mrsf-highlight-border);
388
+ border-radius: 2px;
389
+ pointer-events: none;
390
+ transition: background 0.15s ease;
391
+ }
392
+
393
+ /* ── Inline comment text highlight (<mark> by controller) ── */
394
+
395
+ .mrsf-inline-highlight {
396
+ background: var(--mrsf-highlight-bg);
397
+ border-bottom: 2px solid var(--mrsf-highlight-border);
398
+ border-radius: 2px;
399
+ cursor: pointer;
400
+ transition: background 0.15s ease;
401
+ }
402
+
403
+ .mrsf-inline-highlight:hover {
404
+ background: rgba(255, 213, 79, 0.4);
405
+ }
406
+
407
+ /* Inline tooltip (appended to document.body, positioned by JS) */
408
+ .mrsf-inline-tooltip {
409
+ position: fixed;
410
+ z-index: 1100;
411
+ min-width: 300px;
412
+ max-width: 480px;
413
+ max-height: 400px;
414
+ overflow-y: auto;
415
+ padding: 8px;
416
+ border-radius: 6px;
417
+ background: var(--mrsf-tooltip-bg);
418
+ border: 1px solid var(--mrsf-tooltip-border);
419
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
420
+ font-family: var(--mrsf-font-family);
421
+ font-size: 13px;
422
+ line-height: 1.5;
423
+ color: var(--mrsf-tooltip-fg);
424
+ white-space: normal;
425
+ animation: mrsf-fade-in 0.15s ease;
426
+ }
427
+
428
+ /* ── Interactive action buttons ─────────────────────────── */
429
+
430
+ .mrsf-actions {
431
+ display: none;
432
+ gap: 4px;
433
+ margin-top: 4px;
434
+ padding-top: 4px;
435
+ border-top: 1px solid var(--mrsf-tooltip-border);
436
+ }
437
+
438
+ .mrsf-interactive .mrsf-actions {
439
+ display: flex;
440
+ }
441
+
442
+ .mrsf-tooltip-actions {
443
+ display: flex;
444
+ justify-content: flex-end;
445
+ gap: 6px;
446
+ margin-top: 8px;
447
+ padding-top: 6px;
448
+ border-top: 1px solid var(--mrsf-tooltip-border);
449
+ }
450
+
451
+ .mrsf-action-btn {
452
+ font-size: 11px;
453
+ padding: 2px 8px;
454
+ border-radius: 4px;
455
+ border: 1px solid var(--mrsf-tooltip-border);
456
+ background: transparent;
457
+ color: var(--mrsf-tooltip-fg);
458
+ cursor: pointer;
459
+ font-family: var(--mrsf-font-family);
460
+ transition: background 0.15s ease;
461
+ }
462
+
463
+ .mrsf-action-btn.mrsf-action-danger {
464
+ color: #d13438;
465
+ border-color: rgba(209, 52, 56, 0.7);
466
+ }
467
+
468
+ .mrsf-action-btn:hover {
469
+ background: rgba(127, 127, 127, 0.2);
470
+ }
471
+
472
+ /* ── Floating "Add comment" button (selection-based) ────── */
473
+
474
+ /* ── Orphaned comments section (bottom of container) ────── */
475
+
476
+ .mrsf-orphaned-section {
477
+ margin-top: 24px;
478
+ padding-top: 16px;
479
+ border-top: 2px dashed var(--mrsf-tooltip-border);
480
+ }
481
+
482
+ .mrsf-orphaned-heading {
483
+ font-family: var(--mrsf-font-family);
484
+ font-size: 12px;
485
+ font-weight: 600;
486
+ text-transform: uppercase;
487
+ letter-spacing: 0.5px;
488
+ color: #999;
489
+ margin-bottom: 8px;
490
+ }
491
+
492
+ .mrsf-orphaned-thread {
493
+ padding: 8px;
494
+ margin-bottom: 6px;
495
+ border-radius: 6px;
496
+ border: 1px solid var(--mrsf-tooltip-border);
497
+ background: rgba(127, 127, 127, 0.06);
498
+ opacity: 0.7;
499
+ font-family: var(--mrsf-font-family);
500
+ font-size: 13px;
501
+ line-height: 1.5;
502
+ color: var(--mrsf-tooltip-fg);
503
+ }
504
+
505
+ .mrsf-add-inline-button {
506
+ position: absolute;
507
+ z-index: 1200;
508
+ display: none;
509
+ font-size: 12px;
510
+ padding: 6px 10px;
511
+ border-radius: 6px;
512
+ border: 1px solid var(--mrsf-tooltip-border);
513
+ background: var(--mrsf-tooltip-bg);
514
+ color: var(--mrsf-tooltip-fg);
515
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
516
+ cursor: pointer;
517
+ font-family: var(--mrsf-font-family);
518
+ }
519
+
520
+ .mrsf-add-inline-button:hover {
521
+ background: rgba(127, 127, 127, 0.2);
522
+ }