@mrsf/marked-mrsf 0.4.7
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/LICENSE +21 -0
- package/README.md +44 -0
- package/dist/browser.d.ts +8 -0
- package/dist/browser.js +272 -0
- package/dist/browser.js.map +7 -0
- package/dist/controller.d.ts +169 -0
- package/dist/controller.js +1059 -0
- package/dist/controller.js.map +7 -0
- package/dist/html.d.ts +13 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +306 -0
- package/dist/index.js.map +7 -0
- package/dist/shared.d.ts +7 -0
- package/dist/style.css +496 -0
- package/dist/types.d.ts +104 -0
- package/package.json +81 -0
package/dist/style.css
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
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-left {
|
|
61
|
+
left: calc(-1 * var(--mrsf-gutter-width) - 8px);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.mrsf-gutter-right {
|
|
65
|
+
right: calc(-1 * var(--mrsf-gutter-width) - 8px);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* ── Line highlight (CSS-only tinting for commented lines) ── */
|
|
69
|
+
|
|
70
|
+
.mrsf-line-highlight {
|
|
71
|
+
border-left: 3px solid var(--mrsf-accent);
|
|
72
|
+
padding-left: 8px;
|
|
73
|
+
background: rgba(55, 148, 255, 0.06);
|
|
74
|
+
border-radius: 2px;
|
|
75
|
+
transition: background 0.15s ease;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.mrsf-line-highlight:hover {
|
|
79
|
+
background: rgba(55, 148, 255, 0.12);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* ── Gutter items (badges & add buttons, positioned by JS) ── */
|
|
83
|
+
|
|
84
|
+
.mrsf-gutter-item {
|
|
85
|
+
position: absolute;
|
|
86
|
+
left: 0;
|
|
87
|
+
right: 0;
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
justify-content: center;
|
|
91
|
+
pointer-events: auto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* ── Badge ──────────────────────────────────────────────── */
|
|
95
|
+
|
|
96
|
+
.mrsf-badge,
|
|
97
|
+
.mrsf-gutter-add {
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
justify-content: center;
|
|
101
|
+
gap: 2px;
|
|
102
|
+
font-size: 11px;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
line-height: 1;
|
|
105
|
+
min-height: 20px;
|
|
106
|
+
padding: 3px 8px;
|
|
107
|
+
border-radius: 999px;
|
|
108
|
+
user-select: none;
|
|
109
|
+
white-space: nowrap;
|
|
110
|
+
transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.mrsf-badge {
|
|
114
|
+
cursor: pointer;
|
|
115
|
+
color: var(--mrsf-badge-fg);
|
|
116
|
+
background: var(--mrsf-badge-bg);
|
|
117
|
+
border: 1px solid transparent;
|
|
118
|
+
border-left: 3px solid transparent;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.mrsf-badge-resolved {
|
|
122
|
+
background: var(--mrsf-badge-resolved-bg);
|
|
123
|
+
opacity: 0.7;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.mrsf-badge-severity-high {
|
|
127
|
+
border-left-color: var(--mrsf-severity-high);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.mrsf-badge-severity-medium {
|
|
131
|
+
border-left-color: var(--mrsf-severity-medium);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/* ── Add button (in gutter) ─────────────────────────────── */
|
|
135
|
+
|
|
136
|
+
.mrsf-gutter-add {
|
|
137
|
+
appearance: none;
|
|
138
|
+
opacity: 0.38;
|
|
139
|
+
pointer-events: auto;
|
|
140
|
+
border: 1px solid var(--mrsf-add-border);
|
|
141
|
+
background: var(--mrsf-add-bg);
|
|
142
|
+
color: var(--mrsf-add-fg);
|
|
143
|
+
cursor: pointer;
|
|
144
|
+
font-family: var(--mrsf-font-family);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@media (prefers-color-scheme: light) {
|
|
148
|
+
:root {
|
|
149
|
+
--mrsf-add-bg: rgba(0, 122, 204, 0.08);
|
|
150
|
+
--mrsf-add-border: rgba(0, 122, 204, 0.18);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.mrsf-gutter-add:hover,
|
|
155
|
+
.mrsf-gutter-add:focus-visible {
|
|
156
|
+
opacity: 1;
|
|
157
|
+
background: rgba(0, 122, 204, 0.18);
|
|
158
|
+
border-color: rgba(0, 122, 204, 0.38);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.mrsf-gutter-add:focus-visible,
|
|
162
|
+
.mrsf-badge:focus-visible {
|
|
163
|
+
outline: 2px solid var(--mrsf-accent);
|
|
164
|
+
outline-offset: 2px;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/* ── Tooltip (positioned by JS, appended to gutter item) ── */
|
|
168
|
+
|
|
169
|
+
.mrsf-tooltip {
|
|
170
|
+
display: none;
|
|
171
|
+
position: absolute;
|
|
172
|
+
top: 100%;
|
|
173
|
+
z-index: 1000;
|
|
174
|
+
min-width: 300px;
|
|
175
|
+
max-width: 480px;
|
|
176
|
+
max-height: 400px;
|
|
177
|
+
overflow-y: auto;
|
|
178
|
+
padding: 8px;
|
|
179
|
+
margin-top: 4px;
|
|
180
|
+
border-radius: 6px;
|
|
181
|
+
|
|
182
|
+
background: var(--mrsf-tooltip-bg);
|
|
183
|
+
border: 1px solid var(--mrsf-tooltip-border);
|
|
184
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
185
|
+
|
|
186
|
+
font-family: var(--mrsf-font-family);
|
|
187
|
+
font-size: 13px;
|
|
188
|
+
line-height: 1.5;
|
|
189
|
+
color: var(--mrsf-tooltip-fg);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/* Left gutter: tooltip opens to the right */
|
|
193
|
+
.mrsf-gutter-left .mrsf-tooltip {
|
|
194
|
+
left: 0;
|
|
195
|
+
right: auto;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/* Right gutter: tooltip opens to the left */
|
|
199
|
+
.mrsf-gutter-right .mrsf-tooltip {
|
|
200
|
+
left: auto;
|
|
201
|
+
right: 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
.mrsf-tooltip.mrsf-tooltip-visible {
|
|
205
|
+
display: block;
|
|
206
|
+
animation: mrsf-fade-in 0.15s ease;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@keyframes mrsf-fade-in {
|
|
210
|
+
from { opacity: 0; transform: translateY(-4px); }
|
|
211
|
+
to { opacity: 1; transform: translateY(0); }
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/* ── Thread / Comment ───────────────────────────────────── */
|
|
215
|
+
|
|
216
|
+
.mrsf-thread {
|
|
217
|
+
padding: 4px 0;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.mrsf-thread + .mrsf-thread {
|
|
221
|
+
border-top: 1px solid var(--mrsf-tooltip-border);
|
|
222
|
+
margin-top: 4px;
|
|
223
|
+
padding-top: 8px;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.mrsf-comment {
|
|
227
|
+
padding: 4px 0;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
.mrsf-comment.mrsf-resolved {
|
|
231
|
+
border-left: 2px solid var(--mrsf-badge-resolved-bg);
|
|
232
|
+
padding-left: 6px;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/* ── Replies ────────────────────────────────────────────── */
|
|
236
|
+
|
|
237
|
+
.mrsf-replies {
|
|
238
|
+
margin-left: 16px;
|
|
239
|
+
padding-left: 8px;
|
|
240
|
+
border-left: 2px solid var(--mrsf-tooltip-border);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
.mrsf-reply {
|
|
244
|
+
font-size: 12px;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* ── Comment header ─────────────────────────────────────── */
|
|
248
|
+
|
|
249
|
+
.mrsf-comment-header {
|
|
250
|
+
display: flex;
|
|
251
|
+
align-items: center;
|
|
252
|
+
gap: 6px;
|
|
253
|
+
flex-wrap: wrap;
|
|
254
|
+
margin-bottom: 2px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.mrsf-author {
|
|
258
|
+
font-weight: 600;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.mrsf-date {
|
|
262
|
+
font-size: 11px;
|
|
263
|
+
opacity: 0.6;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.mrsf-severity {
|
|
267
|
+
font-size: 10px;
|
|
268
|
+
font-weight: 600;
|
|
269
|
+
padding: 1px 5px;
|
|
270
|
+
border-radius: 8px;
|
|
271
|
+
text-transform: uppercase;
|
|
272
|
+
letter-spacing: 0.3px;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.mrsf-severity-high {
|
|
276
|
+
background: rgba(231, 76, 60, 0.2);
|
|
277
|
+
color: var(--mrsf-severity-high);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.mrsf-severity-medium {
|
|
281
|
+
background: rgba(243, 156, 18, 0.2);
|
|
282
|
+
color: var(--mrsf-severity-medium);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.mrsf-severity-low {
|
|
286
|
+
background: rgba(52, 152, 219, 0.2);
|
|
287
|
+
color: var(--mrsf-severity-low);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.mrsf-type {
|
|
291
|
+
font-size: 10px;
|
|
292
|
+
padding: 1px 5px;
|
|
293
|
+
border-radius: 8px;
|
|
294
|
+
background: rgba(127, 127, 127, 0.15);
|
|
295
|
+
opacity: 0.8;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.mrsf-resolved-badge {
|
|
299
|
+
font-size: 10px;
|
|
300
|
+
color: var(--mrsf-badge-resolved-bg);
|
|
301
|
+
font-weight: 600;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/* ── Comment body ───────────────────────────────────────── */
|
|
305
|
+
|
|
306
|
+
.mrsf-comment-body {
|
|
307
|
+
white-space: pre-wrap;
|
|
308
|
+
word-break: break-word;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* ── Selected text quote in tooltip ─────────────────────── */
|
|
312
|
+
|
|
313
|
+
.mrsf-selected-text {
|
|
314
|
+
font-family: monospace;
|
|
315
|
+
font-size: 0.85em;
|
|
316
|
+
background: rgba(127, 127, 127, 0.1);
|
|
317
|
+
border-left: 3px solid rgba(127, 127, 127, 0.3);
|
|
318
|
+
margin: 4px 0;
|
|
319
|
+
border-radius: 2px;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
.mrsf-selected-text-summary {
|
|
323
|
+
padding: 4px 8px;
|
|
324
|
+
cursor: pointer;
|
|
325
|
+
overflow: hidden;
|
|
326
|
+
text-overflow: ellipsis;
|
|
327
|
+
white-space: nowrap;
|
|
328
|
+
display: block;
|
|
329
|
+
list-style: none;
|
|
330
|
+
color: var(--mrsf-fg, inherit);
|
|
331
|
+
opacity: 0.7;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.mrsf-selected-text-summary::-webkit-details-marker {
|
|
335
|
+
display: none;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
.mrsf-selected-text-summary::before {
|
|
339
|
+
content: "▶ ";
|
|
340
|
+
font-size: 0.7em;
|
|
341
|
+
vertical-align: middle;
|
|
342
|
+
margin-right: 2px;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.mrsf-selected-text[open] > .mrsf-selected-text-summary {
|
|
346
|
+
display: none;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.mrsf-selected-text-full {
|
|
350
|
+
display: block;
|
|
351
|
+
padding: 4px 8px;
|
|
352
|
+
white-space: pre-wrap;
|
|
353
|
+
word-break: break-word;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/* ── Inline text highlight (overlay positioned by JS) ───── */
|
|
357
|
+
|
|
358
|
+
.mrsf-highlight-overlay {
|
|
359
|
+
position: absolute;
|
|
360
|
+
background: var(--mrsf-highlight-bg);
|
|
361
|
+
border-bottom: 2px solid var(--mrsf-highlight-border);
|
|
362
|
+
border-radius: 2px;
|
|
363
|
+
pointer-events: none;
|
|
364
|
+
transition: background 0.15s ease;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/* ── Inline comment text highlight (<mark> by controller) ── */
|
|
368
|
+
|
|
369
|
+
.mrsf-inline-highlight {
|
|
370
|
+
background: var(--mrsf-highlight-bg);
|
|
371
|
+
border-bottom: 2px solid var(--mrsf-highlight-border);
|
|
372
|
+
border-radius: 2px;
|
|
373
|
+
cursor: pointer;
|
|
374
|
+
transition: background 0.15s ease;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
.mrsf-inline-highlight:hover {
|
|
378
|
+
background: rgba(255, 213, 79, 0.4);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/* Inline tooltip (appended to document.body, positioned by JS) */
|
|
382
|
+
.mrsf-inline-tooltip {
|
|
383
|
+
position: fixed;
|
|
384
|
+
z-index: 1100;
|
|
385
|
+
min-width: 300px;
|
|
386
|
+
max-width: 480px;
|
|
387
|
+
max-height: 400px;
|
|
388
|
+
overflow-y: auto;
|
|
389
|
+
padding: 8px;
|
|
390
|
+
border-radius: 6px;
|
|
391
|
+
background: var(--mrsf-tooltip-bg);
|
|
392
|
+
border: 1px solid var(--mrsf-tooltip-border);
|
|
393
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
|
|
394
|
+
font-family: var(--mrsf-font-family);
|
|
395
|
+
font-size: 13px;
|
|
396
|
+
line-height: 1.5;
|
|
397
|
+
color: var(--mrsf-tooltip-fg);
|
|
398
|
+
white-space: normal;
|
|
399
|
+
animation: mrsf-fade-in 0.15s ease;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/* ── Interactive action buttons ─────────────────────────── */
|
|
403
|
+
|
|
404
|
+
.mrsf-actions {
|
|
405
|
+
display: none;
|
|
406
|
+
gap: 4px;
|
|
407
|
+
margin-top: 4px;
|
|
408
|
+
padding-top: 4px;
|
|
409
|
+
border-top: 1px solid var(--mrsf-tooltip-border);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
.mrsf-interactive .mrsf-actions {
|
|
413
|
+
display: flex;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
.mrsf-tooltip-actions {
|
|
417
|
+
display: flex;
|
|
418
|
+
justify-content: flex-end;
|
|
419
|
+
gap: 6px;
|
|
420
|
+
margin-top: 8px;
|
|
421
|
+
padding-top: 6px;
|
|
422
|
+
border-top: 1px solid var(--mrsf-tooltip-border);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.mrsf-action-btn {
|
|
426
|
+
font-size: 11px;
|
|
427
|
+
padding: 2px 8px;
|
|
428
|
+
border-radius: 4px;
|
|
429
|
+
border: 1px solid var(--mrsf-tooltip-border);
|
|
430
|
+
background: transparent;
|
|
431
|
+
color: var(--mrsf-tooltip-fg);
|
|
432
|
+
cursor: pointer;
|
|
433
|
+
font-family: var(--mrsf-font-family);
|
|
434
|
+
transition: background 0.15s ease;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
.mrsf-action-btn.mrsf-action-danger {
|
|
438
|
+
color: #d13438;
|
|
439
|
+
border-color: rgba(209, 52, 56, 0.7);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.mrsf-action-btn:hover {
|
|
443
|
+
background: rgba(127, 127, 127, 0.2);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/* ── Floating "Add comment" button (selection-based) ────── */
|
|
447
|
+
|
|
448
|
+
/* ── Orphaned comments section (bottom of container) ────── */
|
|
449
|
+
|
|
450
|
+
.mrsf-orphaned-section {
|
|
451
|
+
margin-top: 24px;
|
|
452
|
+
padding-top: 16px;
|
|
453
|
+
border-top: 2px dashed var(--mrsf-tooltip-border);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
.mrsf-orphaned-heading {
|
|
457
|
+
font-family: var(--mrsf-font-family);
|
|
458
|
+
font-size: 12px;
|
|
459
|
+
font-weight: 600;
|
|
460
|
+
text-transform: uppercase;
|
|
461
|
+
letter-spacing: 0.5px;
|
|
462
|
+
color: #999;
|
|
463
|
+
margin-bottom: 8px;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
.mrsf-orphaned-thread {
|
|
467
|
+
padding: 8px;
|
|
468
|
+
margin-bottom: 6px;
|
|
469
|
+
border-radius: 6px;
|
|
470
|
+
border: 1px solid var(--mrsf-tooltip-border);
|
|
471
|
+
background: rgba(127, 127, 127, 0.06);
|
|
472
|
+
opacity: 0.7;
|
|
473
|
+
font-family: var(--mrsf-font-family);
|
|
474
|
+
font-size: 13px;
|
|
475
|
+
line-height: 1.5;
|
|
476
|
+
color: var(--mrsf-tooltip-fg);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
.mrsf-add-inline-button {
|
|
480
|
+
position: absolute;
|
|
481
|
+
z-index: 1200;
|
|
482
|
+
display: none;
|
|
483
|
+
font-size: 12px;
|
|
484
|
+
padding: 6px 10px;
|
|
485
|
+
border-radius: 6px;
|
|
486
|
+
border: 1px solid var(--mrsf-tooltip-border);
|
|
487
|
+
background: var(--mrsf-tooltip-bg);
|
|
488
|
+
color: var(--mrsf-tooltip-fg);
|
|
489
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
|
|
490
|
+
cursor: pointer;
|
|
491
|
+
font-family: var(--mrsf-font-family);
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
.mrsf-add-inline-button:hover {
|
|
495
|
+
background: rgba(127, 127, 127, 0.2);
|
|
496
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared type definitions for MRSF rendering plugins.
|
|
3
|
+
*
|
|
4
|
+
* These types are used by both @mrsf/markdown-it-mrsf and @mrsf/rehype-mrsf.
|
|
5
|
+
*/
|
|
6
|
+
import type { MrsfDocument } from "@mrsf/cli";
|
|
7
|
+
/** Base options shared by all MRSF rendering plugins. */
|
|
8
|
+
export interface MrsfPluginOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Path to the Markdown document on disk.
|
|
11
|
+
* Used for auto-discovery of the sidecar file via `@mrsf/cli`.
|
|
12
|
+
*/
|
|
13
|
+
documentPath?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Explicit path to the `.review.yaml` or `.review.json` sidecar file.
|
|
16
|
+
* Takes precedence over auto-discovery.
|
|
17
|
+
*/
|
|
18
|
+
sidecarPath?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Pre-loaded MRSF sidecar data.
|
|
21
|
+
* Takes precedence over `loader`, `sidecarPath`, and `documentPath`.
|
|
22
|
+
* Enables browser use, custom pipelines, and testing.
|
|
23
|
+
*/
|
|
24
|
+
comments?: MrsfDocument;
|
|
25
|
+
/**
|
|
26
|
+
* Custom loader function that returns sidecar data.
|
|
27
|
+
* Takes precedence over `sidecarPath` and `documentPath`.
|
|
28
|
+
* Useful for integrations that manage their own sidecar state.
|
|
29
|
+
*/
|
|
30
|
+
loader?: (options: MrsfPluginOptions, env?: unknown) => MrsfDocument | null;
|
|
31
|
+
/** Whether to show resolved comments (default: true). */
|
|
32
|
+
showResolved?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* How serialized review data should be embedded into rendered HTML.
|
|
35
|
+
* - `script`: emits `<script type="application/mrsf+json">` (default)
|
|
36
|
+
* - `element`: emits a hidden element with JSON in a data attribute
|
|
37
|
+
*/
|
|
38
|
+
dataContainer?: "script" | "element";
|
|
39
|
+
/**
|
|
40
|
+
* Element id used when `dataContainer` is set to `element`.
|
|
41
|
+
* Default: `mrsf-comment-data`.
|
|
42
|
+
*/
|
|
43
|
+
dataElementId?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Enable interactive mode — adds action buttons with `data-mrsf-action`
|
|
46
|
+
* attributes for host applications to hook into (default: false).
|
|
47
|
+
*/
|
|
48
|
+
interactive?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Position of the gutter badge relative to the line content.
|
|
51
|
+
* - `'left'`: badge in a left margin gutter, outside the content area
|
|
52
|
+
* - `'right'`: badge floated to the right of the content (default)
|
|
53
|
+
*/
|
|
54
|
+
gutterPosition?: "left" | "right";
|
|
55
|
+
/**
|
|
56
|
+
* Whether to show the gutter badge on lines that have inline-highlighted
|
|
57
|
+
* comments (i.e. comments with `selected_text`). When false, lines where
|
|
58
|
+
* ALL comments have inline highlights will not get a gutter badge — the
|
|
59
|
+
* inline tooltip is the only way to view the comment. Default: true.
|
|
60
|
+
*/
|
|
61
|
+
gutterForInline?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to render inline text highlights for comments that have
|
|
64
|
+
* `selected_text`. When false, only gutter badges are shown.
|
|
65
|
+
* Default: true.
|
|
66
|
+
*/
|
|
67
|
+
inlineHighlights?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether to add a `mrsf-line-highlight` CSS class on block elements
|
|
70
|
+
* that have comments. Provides a subtle visual tint on commented lines.
|
|
71
|
+
* Default: false.
|
|
72
|
+
*/
|
|
73
|
+
lineHighlight?: boolean;
|
|
74
|
+
/** Color scheme hint (default: 'auto'). */
|
|
75
|
+
theme?: "light" | "dark" | "auto";
|
|
76
|
+
/** Working directory for sidecar discovery (default: process.cwd()). */
|
|
77
|
+
cwd?: string;
|
|
78
|
+
}
|
|
79
|
+
/** Slim comment shape used internally after loading. */
|
|
80
|
+
export interface SlimComment {
|
|
81
|
+
id: string;
|
|
82
|
+
author: string;
|
|
83
|
+
text: string;
|
|
84
|
+
line: number | null;
|
|
85
|
+
end_line: number | null;
|
|
86
|
+
start_column: number | null;
|
|
87
|
+
end_column: number | null;
|
|
88
|
+
selected_text: string | null;
|
|
89
|
+
resolved: boolean;
|
|
90
|
+
reply_to: string | null;
|
|
91
|
+
severity: string | null;
|
|
92
|
+
type: string | null;
|
|
93
|
+
timestamp: string | null;
|
|
94
|
+
}
|
|
95
|
+
/** A root comment with its threaded replies. */
|
|
96
|
+
export interface CommentThread {
|
|
97
|
+
comment: SlimComment;
|
|
98
|
+
replies: SlimComment[];
|
|
99
|
+
}
|
|
100
|
+
/** Comments grouped by their anchored source line. */
|
|
101
|
+
export type LineMap = Map<number, CommentThread[]>;
|
|
102
|
+
/** A function that loads sidecar data from plugin options and render context. */
|
|
103
|
+
export type CommentLoader = (options: MrsfPluginOptions, env?: unknown) => MrsfDocument | null;
|
|
104
|
+
//# sourceMappingURL=types.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mrsf/marked-mrsf",
|
|
3
|
+
"version": "0.4.7",
|
|
4
|
+
"description": "Marked plugin for rendering Sidemark/MRSF review comments",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"browser": {
|
|
11
|
+
"import": "./dist/browser.js",
|
|
12
|
+
"types": "./dist/browser.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"import": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./browser": {
|
|
18
|
+
"import": "./dist/browser.js",
|
|
19
|
+
"types": "./dist/browser.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./style.css": "./dist/style.css",
|
|
22
|
+
"./controller": {
|
|
23
|
+
"import": "./dist/controller.js",
|
|
24
|
+
"types": "./dist/controller.d.ts"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "node ../sync-types.mjs && node esbuild.config.mjs",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"lint": "tsc --noEmit",
|
|
36
|
+
"prepublishOnly": "cp ../../LICENSE . && npm run build && npm test",
|
|
37
|
+
"postpublish": "rm -f LICENSE"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"marked",
|
|
41
|
+
"marked-plugin",
|
|
42
|
+
"markdown",
|
|
43
|
+
"review",
|
|
44
|
+
"sidecar",
|
|
45
|
+
"mrsf",
|
|
46
|
+
"sidemark",
|
|
47
|
+
"comments",
|
|
48
|
+
"annotation",
|
|
49
|
+
"rendering"
|
|
50
|
+
],
|
|
51
|
+
"license": "MIT",
|
|
52
|
+
"author": "Wictor Wilén (https://github.com/wictorwilen)",
|
|
53
|
+
"homepage": "https://github.com/wictorwilen/MRSF/tree/main/plugins/marked#readme",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/wictorwilen/MRSF/issues"
|
|
56
|
+
},
|
|
57
|
+
"repository": {
|
|
58
|
+
"type": "git",
|
|
59
|
+
"url": "https://github.com/wictorwilen/MRSF.git",
|
|
60
|
+
"directory": "plugins/marked"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist/**/*.js",
|
|
64
|
+
"dist/**/*.js.map",
|
|
65
|
+
"dist/**/*.d.ts",
|
|
66
|
+
"dist/style.css",
|
|
67
|
+
"README.md",
|
|
68
|
+
"LICENSE"
|
|
69
|
+
],
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@mrsf/cli": "^0.3.0",
|
|
72
|
+
"marked": "^16.4.2"
|
|
73
|
+
},
|
|
74
|
+
"devDependencies": {
|
|
75
|
+
"@mrsf/plugin-shared": "file:../shared",
|
|
76
|
+
"@types/node": "^22.13.10",
|
|
77
|
+
"esbuild": "^0.27.3",
|
|
78
|
+
"typescript": "^5.8.2",
|
|
79
|
+
"vitest": "^3.0.9"
|
|
80
|
+
}
|
|
81
|
+
}
|