@noirmd/previewer 2.0.1 → 2.0.3

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,85 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla — Accordion
3
+ ============================================================ */
4
+
5
+ .nr-accordion {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 0.5rem;
9
+ }
10
+
11
+ .nr-accordion__item {
12
+ position: relative;
13
+ display: grid;
14
+ grid-template-columns: minmax(0, 1fr);
15
+ grid-template-rows: max-content 0fr;
16
+ transition: grid-template-rows 0.25s ease;
17
+ border: 1px solid var(--nr-border);
18
+ border-radius: var(--nr-radius-sm);
19
+ background: color-mix(in oklab, var(--nr-bg-secondary) 30%, transparent);
20
+ }
21
+
22
+ .nr-accordion__item:has(> .nr-accordion__input:checked) {
23
+ grid-template-rows: max-content 1fr;
24
+ }
25
+
26
+ .nr-accordion__input {
27
+ grid-column: 1;
28
+ grid-row: 1;
29
+ position: relative;
30
+ z-index: 1;
31
+ width: 100%;
32
+ padding: 1rem;
33
+ padding-inline-end: 3rem;
34
+ margin: 0;
35
+ appearance: none;
36
+ opacity: 0;
37
+ cursor: pointer;
38
+ }
39
+
40
+ .nr-accordion__title {
41
+ grid-column: 1;
42
+ grid-row: 1;
43
+ position: relative;
44
+ padding: 1rem 2.75rem 1rem 1rem;
45
+ font-weight: 600;
46
+ font-size: 0.95rem;
47
+ color: var(--nr-text);
48
+ }
49
+
50
+ .nr-accordion__title::after {
51
+ content: "";
52
+ position: absolute;
53
+ top: 50%;
54
+ inset-inline-end: 1.4rem;
55
+ width: 0.5rem;
56
+ height: 0.5rem;
57
+ border-right: 2px solid currentColor;
58
+ border-bottom: 2px solid currentColor;
59
+ transform: translateY(-70%) rotate(45deg);
60
+ opacity: 0.55;
61
+ transition: transform 0.25s ease;
62
+ }
63
+
64
+ .nr-accordion__item:has(> .nr-accordion__input:checked) > .nr-accordion__title::after {
65
+ transform: translateY(-30%) rotate(225deg);
66
+ }
67
+
68
+ .nr-accordion__content {
69
+ grid-column: 1;
70
+ grid-row: 2;
71
+ min-height: 0;
72
+ overflow: clip;
73
+ padding: 0 1rem;
74
+ font-size: 0.875rem;
75
+ color: var(--nr-text-secondary);
76
+ }
77
+
78
+ .nr-accordion__item:has(> .nr-accordion__input:checked) > .nr-accordion__content {
79
+ padding-bottom: 1rem;
80
+ }
81
+
82
+ .nr-accordion__item:has(> .nr-accordion__input:focus-visible) {
83
+ outline: 2px solid var(--nr-accent);
84
+ outline-offset: 2px;
85
+ }
@@ -0,0 +1,121 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla — Carousel
3
+ ============================================================ */
4
+
5
+ .nr-carousel {
6
+ position: relative;
7
+ max-width: 100%;
8
+ }
9
+
10
+ .nr-carousel:focus-visible {
11
+ outline: 2px solid var(--nr-text);
12
+ outline-offset: 2px;
13
+ }
14
+
15
+ .nr-carousel__viewport {
16
+ width: 100%;
17
+ overflow: hidden;
18
+ aspect-ratio: 16 / 9;
19
+ border-radius: var(--nr-radius);
20
+ background: var(--nr-bg-secondary);
21
+ }
22
+
23
+ .nr-carousel__track {
24
+ display: flex;
25
+ height: 100%;
26
+ transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
27
+ will-change: transform;
28
+ }
29
+
30
+ .nr-carousel__item {
31
+ flex: 0 0 100%;
32
+ min-width: 0;
33
+ height: 100%;
34
+ }
35
+
36
+ .nr-carousel .nr-carousel__item img {
37
+ display: block;
38
+ width: 100%;
39
+ height: 100%;
40
+ object-fit: cover;
41
+ object-position: center;
42
+ }
43
+
44
+ .nr-carousel__item--active img {
45
+ animation: nr-carousel-in 0.6s ease both;
46
+ }
47
+
48
+ @keyframes nr-carousel-in {
49
+ from {
50
+ opacity: 0.55;
51
+ transform: scale(1.06);
52
+ }
53
+ to {
54
+ opacity: 1;
55
+ transform: scale(1);
56
+ }
57
+ }
58
+
59
+ .nr-carousel__nav {
60
+ position: absolute;
61
+ top: 50%;
62
+ transform: translateY(-50%);
63
+ z-index: 2;
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ width: 2.25rem;
68
+ height: 2.25rem;
69
+ border: 1px solid color-mix(in oklab, var(--nr-text) 15%, transparent);
70
+ border-radius: 9999px;
71
+ background: color-mix(in oklab, var(--nr-bg) 80%, transparent);
72
+ color: var(--nr-text);
73
+ backdrop-filter: blur(4px);
74
+ font-size: 1rem;
75
+ cursor: pointer;
76
+ opacity: 0.85;
77
+ transition:
78
+ opacity 0.15s ease,
79
+ background-color 0.15s ease;
80
+ }
81
+
82
+ .nr-carousel__nav:hover {
83
+ opacity: 1;
84
+ background: var(--nr-bg);
85
+ }
86
+
87
+ .nr-carousel__nav--prev {
88
+ left: 0.75rem;
89
+ }
90
+
91
+ .nr-carousel__nav--next {
92
+ right: 0.75rem;
93
+ }
94
+
95
+ .nr-carousel__dots {
96
+ position: absolute;
97
+ bottom: 0.75rem;
98
+ left: 50%;
99
+ transform: translateX(-50%);
100
+ z-index: 2;
101
+ display: flex;
102
+ gap: 0.4rem;
103
+ }
104
+
105
+ .nr-carousel__dot {
106
+ width: 0.5rem;
107
+ height: 0.5rem;
108
+ padding: 0;
109
+ border: none;
110
+ border-radius: 9999px;
111
+ background: color-mix(in oklab, var(--nr-text) 35%, transparent);
112
+ cursor: pointer;
113
+ transition:
114
+ background-color 0.15s ease,
115
+ width 0.15s ease;
116
+ }
117
+
118
+ .nr-carousel__dot--active {
119
+ width: 1.25rem;
120
+ background: var(--nr-text);
121
+ }
package/dist/chat.css ADDED
@@ -0,0 +1,182 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla — Chat
3
+ ============================================================ */
4
+
5
+ .nr-chat {
6
+ display: grid;
7
+ grid-auto-rows: min-content;
8
+ gap: 0 0.75rem;
9
+ padding: 0.25rem 0;
10
+ --nr-mask-chat: url("data:image/svg+xml,%3csvg width='13' height='13' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='M0 11.5004C0 13.0004 2 13.0004 2 13.0004H12H13V0.00036329L12.5 0C12.5 0 11.977 2.09572 11.8581 2.50033C11.6075 3.35237 10.9149 4.22374 9 5.50036C6 7.50036 0 10.0004 0 11.5004Z'/%3e%3c/svg%3e");
11
+ }
12
+
13
+ .nr-chat__header {
14
+ grid-row-start: 1;
15
+ display: flex;
16
+ align-items: center;
17
+ gap: 0.25rem;
18
+ font-size: 0.6875rem;
19
+ color: var(--nr-text-secondary);
20
+ }
21
+
22
+ .nr-chat__name {
23
+ font-weight: 600;
24
+ color: var(--nr-text);
25
+ }
26
+
27
+ .nr-chat__time {
28
+ opacity: 0.6;
29
+ font-size: 0.625rem;
30
+ }
31
+
32
+ .nr-chat__avatar {
33
+ grid-row: span 2;
34
+ align-self: end;
35
+ width: 2.5rem;
36
+ height: 2.5rem;
37
+ border-radius: 9999px;
38
+ overflow: hidden;
39
+ }
40
+
41
+ .nr-chat .nr-chat__avatar img {
42
+ width: 100%;
43
+ height: 100%;
44
+ object-fit: cover;
45
+ display: block;
46
+ }
47
+
48
+ .nr-chat__bubble {
49
+ position: relative;
50
+ grid-row-end: 3;
51
+ display: block;
52
+ width: fit-content;
53
+ max-width: 90%;
54
+ min-height: 2rem;
55
+ min-width: 2.5rem;
56
+ padding: 0.5rem 1rem;
57
+ border-radius: var(--nr-radius);
58
+ background: var(--nr-bg-secondary);
59
+ color: var(--nr-text);
60
+ font-size: 0.9rem;
61
+ }
62
+
63
+ .nr-chat__bubble::before {
64
+ content: "";
65
+ position: absolute;
66
+ bottom: 0;
67
+ width: 0.75rem;
68
+ height: 0.75rem;
69
+ background-color: inherit;
70
+ mask-repeat: no-repeat;
71
+ mask-image: var(--nr-mask-chat);
72
+ mask-position: 0px -1px;
73
+ mask-size: 0.8125rem;
74
+ }
75
+
76
+ .nr-chat__footer {
77
+ grid-row-start: 3;
78
+ display: flex;
79
+ gap: 0.25rem;
80
+ font-size: 0.6875rem;
81
+ opacity: 0.55;
82
+ }
83
+
84
+ /* ── Start side ── */
85
+
86
+ .nr-chat--start {
87
+ place-items: start;
88
+ grid-template-columns: auto 1fr;
89
+ }
90
+
91
+ .nr-chat--start .nr-chat__header {
92
+ grid-column: 2;
93
+ }
94
+
95
+ .nr-chat--start .nr-chat__footer {
96
+ grid-column: 2;
97
+ }
98
+
99
+ .nr-chat--start .nr-chat__avatar {
100
+ grid-column: 1;
101
+ }
102
+
103
+ .nr-chat--start .nr-chat__bubble {
104
+ grid-column: 2;
105
+ border-bottom-left-radius: 0;
106
+ }
107
+
108
+ .nr-chat--start .nr-chat__bubble::before {
109
+ transform: rotateY(0deg);
110
+ inset-inline-start: -0.75rem;
111
+ }
112
+
113
+ /* ── End side ── */
114
+
115
+ .nr-chat--end {
116
+ place-items: end;
117
+ grid-template-columns: 1fr auto;
118
+ }
119
+
120
+ .nr-chat--end .nr-chat__header {
121
+ grid-column: 1;
122
+ }
123
+
124
+ .nr-chat--end .nr-chat__footer {
125
+ grid-column: 1;
126
+ }
127
+
128
+ .nr-chat--end .nr-chat__avatar {
129
+ grid-column: 2;
130
+ }
131
+
132
+ .nr-chat--end .nr-chat__bubble {
133
+ grid-column: 1;
134
+ border-bottom-right-radius: 0;
135
+ }
136
+
137
+ .nr-chat--end .nr-chat__bubble::before {
138
+ transform: rotateY(180deg);
139
+ inset-inline-start: 100%;
140
+ }
141
+
142
+ /* ── Bubble colors ── */
143
+
144
+ .nr-chat__bubble--primary {
145
+ background: var(--nr-accent);
146
+ color: var(--color-primary-content, white);
147
+ }
148
+
149
+ .nr-chat__bubble--secondary {
150
+ background: var(--nr-secondary);
151
+ color: var(--color-secondary-content, white);
152
+ }
153
+
154
+ .nr-chat__bubble--accent {
155
+ background: var(--nr-accent);
156
+ color: var(--color-accent-content, white);
157
+ }
158
+
159
+ .nr-chat__bubble--neutral {
160
+ background: var(--nr-bg-secondary);
161
+ color: var(--nr-text);
162
+ }
163
+
164
+ .nr-chat__bubble--info {
165
+ background: var(--nr-info);
166
+ color: var(--color-info-content, white);
167
+ }
168
+
169
+ .nr-chat__bubble--success {
170
+ background: var(--nr-success);
171
+ color: var(--color-success-content, white);
172
+ }
173
+
174
+ .nr-chat__bubble--warning {
175
+ background: var(--nr-warning);
176
+ color: var(--color-warning-content, oklch(0.3 0.06 80));
177
+ }
178
+
179
+ .nr-chat__bubble--error {
180
+ background: var(--nr-danger);
181
+ color: var(--color-error-content, white);
182
+ }
@@ -0,0 +1,83 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla — Countdown
3
+ ============================================================ */
4
+
5
+ .nr-countdown {
6
+ display: inline-flex;
7
+ gap: 0.5rem;
8
+ flex-wrap: wrap;
9
+ }
10
+
11
+ .nr-countdown__block {
12
+ display: flex;
13
+ flex-direction: column;
14
+ align-items: center;
15
+ gap: 0.25rem;
16
+ padding: 0.5rem 0.9rem;
17
+ border-radius: var(--nr-radius-sm);
18
+ background: var(--nr-bg-secondary);
19
+ color: var(--nr-text);
20
+ }
21
+
22
+ .nr-countdown__value {
23
+ position: relative;
24
+ display: inline-block;
25
+ overflow-y: clip;
26
+ height: 1em;
27
+ line-height: 1em;
28
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
29
+ font-size: 2.25rem;
30
+ font-weight: 700;
31
+ font-variant-numeric: tabular-nums;
32
+ direction: ltr;
33
+ visibility: hidden;
34
+
35
+ --value-v: calc(mod(max(0, var(--value, 0)), 1000));
36
+ --value-hundreds: calc(round(to-zero, var(--value-v) / 100, 1));
37
+ --value-tens: calc(round(to-zero, mod(var(--value-v), 100) / 10, 1));
38
+ --value-ones: calc(mod(var(--value-v), 100));
39
+ --show-hundreds: clamp(clamp(0, var(--digits, 2) - 2, 1), var(--value-hundreds), 1);
40
+ --show-tens: clamp(
41
+ clamp(0, var(--digits, 2) - 1, 1),
42
+ var(--value-tens) + var(--show-hundreds),
43
+ 1
44
+ );
45
+ --first-digits: calc(round(to-zero, var(--value-v) / 10, 1));
46
+ width: calc(1ch + var(--show-tens) * 1ch + var(--show-hundreds) * 1ch);
47
+ }
48
+
49
+ .nr-countdown__value::before,
50
+ .nr-countdown__value::after {
51
+ visibility: visible;
52
+ position: absolute;
53
+ overflow-x: clip;
54
+ content: "00\A 01\A 02\A 03\A 04\A 05\A 06\A 07\A 08\A 09\A 10\A 11\A 12\A 13\A 14\A 15\A 16\A 17\A 18\A 19\A 20\A 21\A 22\A 23\A 24\A 25\A 26\A 27\A 28\A 29\A 30\A 31\A 32\A 33\A 34\A 35\A 36\A 37\A 38\A 39\A 40\A 41\A 42\A 43\A 44\A 45\A 46\A 47\A 48\A 49\A 50\A 51\A 52\A 53\A 54\A 55\A 56\A 57\A 58\A 59\A 60\A 61\A 62\A 63\A 64\A 65\A 66\A 67\A 68\A 69\A 70\A 71\A 72\A 73\A 74\A 75\A 76\A 77\A 78\A 79\A 80\A 81\A 82\A 83\A 84\A 85\A 86\A 87\A 88\A 89\A 90\A 91\A 92\A 93\A 94\A 95\A 96\A 97\A 98\A 99\A";
55
+ white-space: pre;
56
+ text-align: end;
57
+ direction: rtl;
58
+ font-variant-numeric: tabular-nums;
59
+ transition:
60
+ all 1s cubic-bezier(1, 0, 0, 1),
61
+ width 0.2s ease-out 0.2s,
62
+ opacity 0.2s ease-out 0.2s;
63
+ }
64
+
65
+ .nr-countdown__value::before {
66
+ width: calc(1ch + var(--show-hundreds) * 1ch);
67
+ top: calc(var(--first-digits) * -1em);
68
+ inset-inline-end: 0;
69
+ opacity: var(--show-tens);
70
+ }
71
+
72
+ .nr-countdown__value::after {
73
+ width: 1ch;
74
+ top: calc(var(--value-ones) * -1em);
75
+ inset-inline-start: 0;
76
+ }
77
+
78
+ .nr-countdown__label {
79
+ font-size: 0.7rem;
80
+ text-transform: uppercase;
81
+ letter-spacing: 0.08em;
82
+ color: var(--nr-text-secondary);
83
+ }
package/dist/diff.css ADDED
@@ -0,0 +1,94 @@
1
+ /* ============================================================
2
+ NoirMD Vanilla — Diff (before/after comparison)
3
+ ============================================================ */
4
+
5
+ .nr-diff {
6
+ position: relative;
7
+ display: grid;
8
+ grid-template-columns: 1fr;
9
+ grid-template-rows: 1fr;
10
+ width: 100%;
11
+ aspect-ratio: 16 / 9;
12
+ overflow: hidden;
13
+ user-select: none;
14
+ -webkit-user-select: none;
15
+ direction: ltr;
16
+ container-type: inline-size;
17
+ border-radius: var(--nr-radius-sm);
18
+ margin: 1rem 0;
19
+ max-width: 100%;
20
+ --nr-diff-pos: 50%;
21
+ }
22
+
23
+ .nr-diff:focus-visible,
24
+ .nr-diff:has(.nr-diff__item--before:focus-visible) {
25
+ outline: 2px solid var(--nr-text);
26
+ outline-offset: 2px;
27
+ }
28
+
29
+ .nr-diff__item--before:focus-visible {
30
+ outline: none;
31
+ }
32
+
33
+ .nr-diff__item--after,
34
+ .nr-diff__item--before {
35
+ position: relative;
36
+ grid-row: 1;
37
+ grid-column: 1;
38
+ }
39
+
40
+ .nr-diff .nr-diff__item--after > *,
41
+ .nr-diff .nr-diff__item--before > * {
42
+ position: absolute;
43
+ top: 0;
44
+ bottom: 0;
45
+ left: 0;
46
+ width: 100cqi;
47
+ max-width: none;
48
+ height: 100%;
49
+ object-fit: cover;
50
+ object-position: center;
51
+ pointer-events: none;
52
+ }
53
+
54
+ .nr-diff__item--before {
55
+ z-index: 1;
56
+ width: var(--nr-diff-pos);
57
+ overflow: hidden;
58
+ border-right: 2px solid var(--nr-bg);
59
+ box-shadow: 0 0 0 2px #0000002a;
60
+ }
61
+
62
+ .nr-diff__resizer {
63
+ position: absolute;
64
+ z-index: 3;
65
+ top: 0;
66
+ bottom: 0;
67
+ left: var(--nr-diff-pos);
68
+ width: 2.5rem;
69
+ translate: -50% 0;
70
+ cursor: ew-resize;
71
+ touch-action: none;
72
+ user-select: none;
73
+ -webkit-user-select: none;
74
+ }
75
+
76
+ .nr-diff__resizer::after {
77
+ content: "";
78
+ position: absolute;
79
+ top: 50%;
80
+ left: 50%;
81
+ width: 1.2rem;
82
+ height: 1.8rem;
83
+ border: 2px solid var(--nr-bg);
84
+ border-radius: 9999px;
85
+ background: var(--nr-bg);
86
+ box-shadow: 0 0 0 2px #0000002a;
87
+ translate: -50% -50%;
88
+ pointer-events: none;
89
+ transition: height 0.3s linear(0, 0.931 13.8%, 1.196 21.4%, 1.343 29.8%, 1.378 36%, 1.365 43.2%, 1.059 78%, 1);
90
+ }
91
+
92
+ .nr-diff:hover .nr-diff__resizer::after {
93
+ height: 2.4rem;
94
+ }