@noirmd/previewer 1.0.2 → 1.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,677 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla Components CSS
3
+
4
+ Pure CSS with variables. No Tailwind dependency.
5
+ Import alongside vanilla.js for full styling.
6
+
7
+ Usage:
8
+ import '@noirmd/previewer/vanilla/vanilla.css';
9
+ // or
10
+ @import '@noirmd/previewer/vanilla/vanilla.css';
11
+
12
+ All components use .nr-* prefix to avoid conflicts.
13
+ ============================================================ */
14
+
15
+ /* ── CSS Variables (override-friendly) ────────────────── */
16
+
17
+ .nr-prose {
18
+ --nr-bg: var(--color-background-primary, #0f172a);
19
+ --nr-bg-secondary: var(--color-background-secondary-solid, #1e293b);
20
+ --nr-text: var(--color-text-primary, #e2e8f0);
21
+ --nr-text-secondary: var(--color-text-secondary, #94a3b8);
22
+ --nr-border: var(--color-border, #334155);
23
+ --nr-accent: var(--color-accent-primary, #0ea5e9);
24
+ --nr-accent-hover: var(--color-accent-hover, #38bdf8);
25
+ --nr-info: #3b82f6;
26
+ --nr-warning: #f59e0b;
27
+ --nr-danger: #ef4444;
28
+ --nr-success: #22c55e;
29
+ --nr-radius: 1rem;
30
+ --nr-radius-sm: 0.5rem;
31
+ --nr-radius-lg: 1.5rem;
32
+
33
+ color: var(--nr-text);
34
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
35
+ line-height: 1.625;
36
+ word-wrap: break-word;
37
+ }
38
+
39
+ /* ── Typography (extends markdown.css base) ───────────── */
40
+
41
+ .nr-prose .text-center { text-align: center; }
42
+ .nr-prose .text-right { text-align: right; }
43
+
44
+ /* ── Inline Elements ──────────────────────────────────── */
45
+
46
+ .nr-link {
47
+ color: var(--nr-accent);
48
+ text-decoration: none !important;
49
+ transition: color 0.15s;
50
+ }
51
+ .nr-link:hover {
52
+ text-decoration: underline !important;
53
+ color: var(--nr-accent-hover);
54
+ }
55
+
56
+ .nr-inline-code {
57
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
58
+ font-size: 0.875em;
59
+ background: var(--nr-bg-secondary);
60
+ padding: 0.125rem 0.375rem;
61
+ border-radius: var(--nr-radius-sm);
62
+ color: var(--nr-text);
63
+ }
64
+
65
+ .nr-highlight {
66
+ background: rgba(234, 179, 8, 0.2);
67
+ color: inherit;
68
+ padding: 0 0.125rem;
69
+ border-radius: 0.25rem;
70
+ }
71
+
72
+ .nr-spoiler {
73
+ background: var(--nr-text);
74
+ color: var(--nr-bg);
75
+ padding: 0 0.25rem;
76
+ border-radius: var(--nr-radius-sm);
77
+ cursor: pointer;
78
+ transition: background 0.15s, color 0.15s;
79
+ }
80
+ .nr-spoiler:hover {
81
+ background: transparent;
82
+ color: var(--nr-text);
83
+ }
84
+
85
+ .nr-underline {
86
+ text-underline-offset: 2px;
87
+ }
88
+
89
+ .nr-icon {
90
+ font-size: 1em;
91
+ line-height: 1;
92
+ vertical-align: top;
93
+ }
94
+
95
+ /* ── Code Block ───────────────────────────────────────── */
96
+
97
+ .nr-codeblock {
98
+ position: relative;
99
+ margin: 1rem 0;
100
+ border-radius: var(--nr-radius);
101
+ border: 1px solid var(--nr-border);
102
+ overflow: hidden;
103
+ background: rgba(30, 41, 59, 0.05);
104
+ }
105
+
106
+ .nr-codeblock__header {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 0.5rem;
110
+ padding: 0.5rem 1rem;
111
+ border-bottom: 1px solid var(--nr-border);
112
+ background: rgba(30, 41, 59, 0.1);
113
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
114
+ font-size: 0.75rem;
115
+ color: var(--nr-text-secondary);
116
+ }
117
+ @media (min-width: 640px) {
118
+ .nr-codeblock__header { font-size: 0.875rem; }
119
+ }
120
+
121
+ .nr-codeblock__pre {
122
+ margin: 0;
123
+ padding: 1rem;
124
+ overflow: auto;
125
+ font-size: 0.75rem;
126
+ line-height: 1.5;
127
+ }
128
+ @media (min-width: 640px) {
129
+ .nr-codeblock__pre { font-size: 0.875rem; }
130
+ }
131
+
132
+ .nr-codeblock__pre code {
133
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
134
+ }
135
+
136
+ .nr-codeblock__copy {
137
+ position: absolute;
138
+ top: 0.5rem;
139
+ right: 0.5rem;
140
+ padding: 0.375rem;
141
+ border-radius: var(--nr-radius-sm);
142
+ border: none;
143
+ background: rgba(30, 41, 59, 0.2);
144
+ color: var(--nr-text-secondary);
145
+ cursor: pointer;
146
+ transition: background 0.15s, color 0.15s;
147
+ }
148
+ .nr-codeblock__copy:hover {
149
+ background: rgba(30, 41, 59, 0.4);
150
+ color: var(--nr-text);
151
+ }
152
+
153
+ /* ── Admonition ───────────────────────────────────────── */
154
+
155
+ .nr-admonition {
156
+ border-radius: var(--nr-radius);
157
+ margin-bottom: 1.5rem;
158
+ border: 1px solid;
159
+ padding: 1rem;
160
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
161
+ }
162
+
163
+ .nr-admonition--note {
164
+ border-color: rgba(59, 130, 246, 0.2);
165
+ background: rgba(59, 130, 246, 0.05);
166
+ color: var(--nr-info);
167
+ }
168
+ .nr-admonition--info {
169
+ border-color: rgba(59, 130, 246, 0.3);
170
+ background: rgba(59, 130, 246, 0.1);
171
+ color: var(--nr-info);
172
+ }
173
+ .nr-admonition--warning {
174
+ border-color: rgba(245, 158, 11, 0.3);
175
+ background: rgba(245, 158, 11, 0.1);
176
+ color: var(--nr-warning);
177
+ }
178
+ .nr-admonition--danger {
179
+ border-color: rgba(239, 68, 68, 0.3);
180
+ background: rgba(239, 68, 68, 0.1);
181
+ color: var(--nr-danger);
182
+ }
183
+ .nr-admonition--greentext {
184
+ border-color: rgba(34, 197, 94, 0.3);
185
+ background: rgba(34, 197, 94, 0.1);
186
+ color: var(--nr-success);
187
+ }
188
+
189
+ .nr-admonition__title {
190
+ font-weight: 700;
191
+ font-size: 1rem;
192
+ margin: 0 0 0.5rem;
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 0.5rem;
196
+ }
197
+ .nr-admonition__icon {
198
+ flex-shrink: 0;
199
+ }
200
+
201
+ .nr-admonition__body {
202
+ font-size: 0.875rem;
203
+ line-height: 1.625;
204
+ opacity: 0.9;
205
+ }
206
+
207
+ /* ── Details (Collapsible) ────────────────────────────── */
208
+
209
+ .nr-details {
210
+ border-radius: var(--nr-radius);
211
+ border: 1px solid var(--nr-border);
212
+ margin-bottom: 1rem;
213
+ background: rgba(var(--nr-bg), 0.05);
214
+ }
215
+
216
+ .nr-details__summary {
217
+ cursor: pointer;
218
+ padding: 1rem;
219
+ font-weight: 700;
220
+ display: flex;
221
+ align-items: center;
222
+ gap: 0.5rem;
223
+ list-style: none;
224
+ }
225
+ .nr-details__summary::-webkit-details-marker {
226
+ display: none;
227
+ }
228
+ .nr-details__summary:hover {
229
+ color: var(--nr-accent);
230
+ transition: color 0.15s;
231
+ }
232
+
233
+ .nr-details__icon {
234
+ transition: transform 0.2s;
235
+ }
236
+ .nr-details__icon--open {
237
+ transform: rotate(90deg);
238
+ }
239
+
240
+ .nr-details__body {
241
+ padding: 0 1rem 1rem;
242
+ border-top: 1px solid var(--nr-border);
243
+ padding-top: 0.75rem;
244
+ font-size: 0.875rem;
245
+ line-height: 1.625;
246
+ opacity: 0.9;
247
+ overflow: hidden;
248
+ min-width: 0;
249
+ }
250
+
251
+ /* ── Modal (Native <dialog>) ──────────────────────────── */
252
+
253
+ .nr-modal {
254
+ padding: 0;
255
+ border: none;
256
+ border-radius: var(--nr-radius-lg);
257
+ background: transparent;
258
+ max-width: 48rem;
259
+ width: 100%;
260
+ max-height: 85vh;
261
+ overflow: hidden;
262
+ }
263
+ .nr-modal::backdrop {
264
+ background: rgba(0, 0, 0, 0.6);
265
+ backdrop-filter: blur(2px);
266
+ }
267
+
268
+ .nr-modal__popup {
269
+ display: flex;
270
+ flex-direction: column;
271
+ background: var(--nr-bg);
272
+ border: 1px solid var(--nr-border);
273
+ border-radius: var(--nr-radius-lg);
274
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
275
+ overflow: hidden;
276
+ max-height: 85vh;
277
+ }
278
+
279
+ .nr-modal__header {
280
+ display: flex;
281
+ justify-content: space-between;
282
+ align-items: center;
283
+ padding: 1rem;
284
+ border-bottom: 1px solid var(--nr-border);
285
+ background: rgba(30, 41, 59, 0.2);
286
+ }
287
+
288
+ .nr-modal__title {
289
+ font-size: 1.125rem;
290
+ font-weight: 700;
291
+ margin: 0;
292
+ }
293
+
294
+ .nr-modal__close {
295
+ width: 2rem;
296
+ height: 2rem;
297
+ border-radius: 50%;
298
+ border: none;
299
+ background: transparent;
300
+ color: var(--nr-text);
301
+ cursor: pointer;
302
+ display: flex;
303
+ align-items: center;
304
+ justify-content: center;
305
+ transition: background 0.15s;
306
+ }
307
+ .nr-modal__close:hover {
308
+ background: rgba(255, 255, 255, 0.1);
309
+ }
310
+
311
+ .nr-modal__body {
312
+ padding: 1.5rem;
313
+ overflow: auto;
314
+ min-height: 0;
315
+ color: var(--nr-text);
316
+ font-size: 0.875rem;
317
+ line-height: 1.625;
318
+ }
319
+ .nr-modal__body h1:first-child,
320
+ .nr-modal__body h2:first-child,
321
+ .nr-modal__body h3:first-child,
322
+ .nr-modal__body h4:first-child,
323
+ .nr-modal__body h5:first-child,
324
+ .nr-modal__body h6:first-child {
325
+ margin-top: 0;
326
+ }
327
+
328
+ /* ── Cards ────────────────────────────────────────────── */
329
+
330
+ .nr-card-grid {
331
+ display: flex;
332
+ flex-wrap: wrap;
333
+ gap: 1.5rem;
334
+ margin: 1.5rem 0;
335
+ }
336
+
337
+ .nr-card {
338
+ display: flex;
339
+ flex-direction: column;
340
+ height: 100%;
341
+ border-radius: var(--nr-radius-lg);
342
+ border: 1px solid var(--nr-border);
343
+ transition: all 0.2s;
344
+ position: relative;
345
+ overflow: hidden;
346
+ min-width: 18rem;
347
+ width: 18rem;
348
+ max-width: 20rem;
349
+ }
350
+
351
+ .nr-card--interactive {
352
+ cursor: pointer;
353
+ border-color: rgba(14, 165, 233, 0.1);
354
+ }
355
+ .nr-card--interactive:hover {
356
+ border-color: rgba(14, 165, 233, 0.5);
357
+ }
358
+
359
+ .nr-card__image {
360
+ width: 100%;
361
+ height: 160px;
362
+ overflow: hidden;
363
+ position: relative;
364
+ }
365
+ .nr-card__image--tall {
366
+ height: 240px;
367
+ }
368
+
369
+ .nr-card__img {
370
+ width: 100%;
371
+ height: 100%;
372
+ object-fit: cover;
373
+ margin: 0;
374
+ }
375
+
376
+ .nr-card__gradient {
377
+ position: absolute;
378
+ inset: 0;
379
+ background: linear-gradient(to top, rgba(var(--nr-bg), 0.4), transparent);
380
+ }
381
+
382
+ .nr-card__body {
383
+ display: flex;
384
+ flex-direction: column;
385
+ flex: 1;
386
+ padding: 1.5rem;
387
+ position: relative;
388
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
389
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
390
+ }
391
+ .nr-card__body--overlap {
392
+ margin-top: -2.5rem;
393
+ background: rgba(var(--nr-bg), 0.8);
394
+ border-radius: 0.75rem 0.75rem 0 0;
395
+ }
396
+
397
+ .nr-card__header {
398
+ display: flex;
399
+ align-items: center;
400
+ gap: 0.75rem;
401
+ margin-bottom: 0.75rem;
402
+ }
403
+
404
+ .nr-card__icon-wrap {
405
+ width: 2.5rem;
406
+ height: 2.5rem;
407
+ font-size: 1.6em;
408
+ border-radius: 0.75rem;
409
+ background: rgba(14, 165, 233, 0.2);
410
+ display: flex;
411
+ align-items: center;
412
+ justify-content: center;
413
+ flex-shrink: 0;
414
+ color: var(--nr-accent);
415
+ }
416
+
417
+ .nr-card__title {
418
+ font-size: 1rem;
419
+ font-weight: 900;
420
+ letter-spacing: -0.025em;
421
+ line-height: 1.25;
422
+ margin: 0;
423
+ }
424
+
425
+ .nr-card__description {
426
+ font-size: 0.875rem;
427
+ opacity: 0.8;
428
+ line-height: 1.625;
429
+ font-weight: 500;
430
+ }
431
+
432
+ .nr-card__content {
433
+ margin-top: 0.5rem;
434
+ display: flex;
435
+ flex-direction: column;
436
+ gap: 0.5rem;
437
+ flex: 1;
438
+ }
439
+
440
+ .nr-card__action {
441
+ margin-top: 1.5rem;
442
+ display: flex;
443
+ justify-content: flex-end;
444
+ }
445
+
446
+ .nr-card__action-link {
447
+ background: rgba(14, 165, 233, 0.2);
448
+ padding: 0.5rem 1rem;
449
+ border-radius: 0.75rem;
450
+ display: flex;
451
+ align-items: center;
452
+ gap: 0.375rem;
453
+ font-size: 0.625rem;
454
+ font-weight: 900;
455
+ text-transform: uppercase;
456
+ letter-spacing: 0.1em;
457
+ opacity: 0.5;
458
+ color: var(--nr-text);
459
+ text-decoration: none;
460
+ transition: all 0.15s;
461
+ }
462
+ .nr-card:hover .nr-card__action-link {
463
+ opacity: 1;
464
+ color: var(--nr-accent);
465
+ }
466
+ .nr-card__action-link:hover {
467
+ background: rgba(14, 165, 233, 0.3);
468
+ }
469
+
470
+ /* ── Button ───────────────────────────────────────────── */
471
+
472
+ .nr-button-wrap {
473
+ margin: 0.25rem 0;
474
+ }
475
+
476
+ .nr-button {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ width: fit-content;
480
+ padding: 0.5rem 1rem;
481
+ border-radius: 0.75rem;
482
+ font-weight: 700;
483
+ font-size: 0.875rem;
484
+ text-decoration: none;
485
+ gap: 0.5rem;
486
+ transition: all 0.15s;
487
+ border: 1px solid var(--nr-border);
488
+ background: rgba(var(--nr-bg), 0.05);
489
+ color: var(--nr-text);
490
+ cursor: pointer;
491
+ }
492
+ .nr-button:hover {
493
+ transform: scale(1.05);
494
+ background: rgba(var(--nr-bg), 0.1);
495
+ color: var(--nr-text);
496
+ }
497
+ .nr-button:active {
498
+ transform: scale(0.95);
499
+ }
500
+
501
+ .nr-button--default {
502
+ /* default styling applied above */
503
+ }
504
+
505
+ /* ── Table ────────────────────────────────────────────── */
506
+
507
+ .nr-table-wrap {
508
+ overflow-x: auto;
509
+ }
510
+
511
+ .nr-table {
512
+ width: 100%;
513
+ border-collapse: collapse;
514
+ margin: 1rem 0;
515
+ font-size: 0.875rem;
516
+ line-height: 1.5;
517
+ }
518
+ @media (min-width: 640px) {
519
+ .nr-table { font-size: 1rem; }
520
+ }
521
+
522
+ .nr-table__th {
523
+ padding: 0.5rem 0.75rem;
524
+ text-align: left;
525
+ font-weight: 700;
526
+ font-size: 0.75rem;
527
+ background: rgba(30, 41, 59, 0.1);
528
+ border-bottom: 1px solid var(--nr-border);
529
+ }
530
+
531
+ .nr-table__td {
532
+ padding: 0.5rem 0.75rem;
533
+ border-bottom: 1px solid var(--nr-border);
534
+ }
535
+
536
+ .nr-table tbody tr:last-child .nr-table__td {
537
+ border-bottom: none;
538
+ }
539
+
540
+ /* ── List ─────────────────────────────────────────────── */
541
+
542
+ .nr-list {
543
+ margin: 0.75rem 0;
544
+ padding-left: 1.5rem;
545
+ font-size: 0.875rem;
546
+ line-height: 1.625;
547
+ }
548
+ @media (min-width: 640px) {
549
+ .nr-list { font-size: 1rem; }
550
+ }
551
+
552
+ .nr-list__item {
553
+ margin: 0.25rem 0;
554
+ line-height: 1.625;
555
+ }
556
+
557
+ /* ── Blockquote ───────────────────────────────────────── */
558
+
559
+ .nr-blockquote {
560
+ margin: 1rem 0;
561
+ padding: 0.5rem 1rem;
562
+ border-left: 4px solid rgba(14, 165, 233, 0.3);
563
+ color: var(--nr-text-secondary);
564
+ font-style: italic;
565
+ font-size: 0.875rem;
566
+ line-height: 1.625;
567
+ }
568
+ @media (min-width: 640px) {
569
+ .nr-blockquote { font-size: 1rem; }
570
+ }
571
+
572
+ /* ── TOC ──────────────────────────────────────────────── */
573
+
574
+ .nr-toc {
575
+ margin: 1.5rem 0;
576
+ padding: 1rem;
577
+ border-radius: var(--nr-radius);
578
+ border: 1px solid var(--nr-border);
579
+ background: rgba(var(--nr-bg), 0.05);
580
+ }
581
+
582
+ .nr-toc__title {
583
+ font-size: 1rem;
584
+ font-weight: 700;
585
+ margin-bottom: 0.75rem;
586
+ }
587
+
588
+ .nr-toc__list {
589
+ list-style: none;
590
+ padding: 0;
591
+ margin: 0;
592
+ }
593
+
594
+ .nr-toc__item {
595
+ margin: 0.25rem 0;
596
+ font-size: 0.875rem;
597
+ }
598
+ @media (min-width: 640px) {
599
+ .nr-toc__item { font-size: 1rem; }
600
+ }
601
+
602
+ .nr-toc__item--h3 { padding-left: 1rem; }
603
+ .nr-toc__item--h4 { padding-left: 2rem; }
604
+ .nr-toc__item--h5 { padding-left: 3rem; }
605
+
606
+ .nr-toc__link {
607
+ color: var(--nr-accent);
608
+ text-decoration: none;
609
+ transition: color 0.15s;
610
+ }
611
+ .nr-toc__link:hover {
612
+ color: var(--nr-accent-hover);
613
+ text-decoration: underline;
614
+ }
615
+
616
+ /* ── HR ───────────────────────────────────────────────── */
617
+
618
+ .nr-hr {
619
+ margin: 2rem 0;
620
+ border-color: var(--nr-border);
621
+ }
622
+
623
+ /* ── Slide ────────────────────────────────────────────── */
624
+
625
+ .nr-slide {
626
+ overflow: hidden;
627
+ position: relative;
628
+ }
629
+
630
+ .nr-slide__track {
631
+ position: absolute;
632
+ left: 0;
633
+ right: 0;
634
+ top: 0;
635
+ }
636
+
637
+ .nr-slide__item {
638
+ display: flex;
639
+ align-items: center;
640
+ overflow: hidden;
641
+ }
642
+
643
+ /* ── Raw HTML ─────────────────────────────────────────── */
644
+
645
+ .nr-raw-html {
646
+ width: 100%;
647
+ margin: 1rem 0;
648
+ }
649
+
650
+ /* ── Unknown Directive ────────────────────────────────── */
651
+
652
+ .nr-unknown-directive {
653
+ margin: 1rem 0;
654
+ padding: 1rem;
655
+ border-radius: var(--nr-radius);
656
+ border: 1px solid var(--nr-border);
657
+ background: rgba(var(--nr-bg), 0.05);
658
+ }
659
+
660
+ /* ── Modal Trigger ────────────────────────────────────── */
661
+
662
+ .nr-modal-trigger {
663
+ display: inline-flex;
664
+ }
665
+
666
+ /* ── Wrapper ──────────────────────────────────────────── */
667
+
668
+ .nr-wrapper {
669
+ /* Generic wrapper — no default styling, inherits from children */
670
+ }
671
+
672
+ /* ── Image ────────────────────────────────────────────── */
673
+
674
+ .nr-image {
675
+ max-width: 100%;
676
+ height: auto;
677
+ }