@neo-ui-kit/react 1.0.0 → 1.0.1
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/README.md +12 -2
- package/dist/components/artwork/DatabaseArt/styles.css +58 -58
- package/dist/components/artwork/Landscape/styles.css +79 -79
- package/dist/components/artwork/Planet/styles.css +52 -52
- package/dist/components/artwork/QuantumField/UPSTREAM-LICENSE.txt +21 -21
- package/dist/components/artwork/ServerArt/styles.css +43 -43
- package/dist/components/artwork/Spectrum/styles.css +35 -35
- package/dist/components/controls/Autocomplete/styles.css +1 -1
- package/dist/components/controls/Checkbox/styles.css +58 -58
- package/dist/components/controls/InputBase/styles.css +374 -374
- package/dist/components/controls/Link/styles.css +50 -50
- package/dist/components/controls/SegmentedControl/styles.css +9 -9
- package/dist/components/controls/Switch/styles.css +54 -54
- package/dist/components/controls/Tabs/styles.css +239 -239
- package/dist/components/controls/ToggleButton/styles.css +49 -49
- package/dist/components/controls/shared.css +694 -694
- package/dist/components/editor/shared.css +1 -1
- package/dist/components/effects/Beacon/styles.css +38 -38
- package/dist/components/effects/Equalizer/styles.css +34 -34
- package/dist/components/effects/GlowText/styles.css +56 -56
- package/dist/components/effects/Marquee/styles.css +46 -46
- package/dist/components/effects/Reveal/styles.css +25 -25
- package/dist/components/effects/Shimmer/styles.css +48 -48
- package/dist/components/effects/Sparkles/styles.css +28 -28
- package/dist/components/effects/Spotlight/styles.css +45 -45
- package/dist/components/effects/Tilt/styles.css +67 -67
- package/dist/components/feedback/CollapsibleSection/styles.css +76 -76
- package/dist/components/feedback/DataTable/styles.css +522 -522
- package/dist/components/feedback/EmptyState/styles.css +80 -80
- package/dist/components/feedback/KeyValueList/styles.css +51 -51
- package/dist/components/feedback/MenuItem/styles.css +71 -71
- package/dist/components/feedback/Popover/styles.css +44 -44
- package/dist/components/feedback/Steps/styles.css +152 -152
- package/dist/components/feedback/Toast/styles.css +89 -89
- package/dist/components/forms/FormFields/styles.css +21 -21
- package/dist/components/foundation/ThemeProvider/styles.css +31 -31
- package/dist/components/layout/Avatar/styles.css +151 -151
- package/dist/components/layout/Card/styles.css +37 -37
- package/dist/components/layout/DialogActions/styles.css +31 -31
- package/dist/components/layout/DialogBody/styles.css +17 -17
- package/dist/components/layout/Illustration/styles.css +104 -104
- package/dist/components/layout/ScrollArea/styles.css +61 -61
- package/dist/components/layout/TabPanel/styles.css +16 -16
- package/dist/components/layout/shared.css +65 -65
- package/dist/components/media/AudioPlayer/styles.css +86 -86
- package/dist/components/media/LevelMeter/styles.css +30 -30
- package/dist/components/media/MelodyRoll/styles.css +196 -196
- package/dist/components/media/RotaryKnob/styles.css +319 -319
- package/dist/components/media/Sparkline/styles.css +69 -69
- package/dist/components/media/WaveDecoration/styles.css +1 -1
- package/dist/components/media/shared.css +7 -7
- package/dist/fonts/melodix.css +123 -123
- package/dist/index.js +2101 -2101
- package/dist/theme/base.css +210 -210
- package/package.json +1 -1
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
/* Styles owned by LevelMeter: a glowing mirrored wave scrolls along a faint axis; muted, it dims. */
|
|
2
|
-
.ad-level-meter {
|
|
3
|
-
position: relative;
|
|
4
|
-
width: 100%;
|
|
5
|
-
height: clamp(2rem, 1.6rem + 1vw, 3rem);
|
|
6
|
-
overflow: hidden;
|
|
7
|
-
}
|
|
8
|
-
.ad-level-meter > svg {
|
|
9
|
-
display: block;
|
|
10
|
-
width: 100%;
|
|
11
|
-
height: 100%;
|
|
12
|
-
filter: drop-shadow(
|
|
13
|
-
0 0 0.22rem color-mix(in srgb, var(--ad-red) 78%, transparent)
|
|
14
|
-
);
|
|
15
|
-
}
|
|
16
|
-
.ad-level-meter-axis {
|
|
17
|
-
stroke: color-mix(in srgb, var(--ad-red) 24%, transparent);
|
|
18
|
-
stroke-width: 0.7;
|
|
19
|
-
}
|
|
20
|
-
.ad-level-meter-wave {
|
|
21
|
-
transition: opacity 0.18s ease;
|
|
22
|
-
}
|
|
23
|
-
.ad-level-meter[data-active="false"] .ad-level-meter-wave {
|
|
24
|
-
opacity: 0.28;
|
|
25
|
-
}
|
|
26
|
-
.ad-level-meter[data-compact] {
|
|
27
|
-
width: 4.6rem;
|
|
28
|
-
height: 1.45rem;
|
|
29
|
-
border-radius: 999rem;
|
|
30
|
-
}
|
|
1
|
+
/* Styles owned by LevelMeter: a glowing mirrored wave scrolls along a faint axis; muted, it dims. */
|
|
2
|
+
.ad-level-meter {
|
|
3
|
+
position: relative;
|
|
4
|
+
width: 100%;
|
|
5
|
+
height: clamp(2rem, 1.6rem + 1vw, 3rem);
|
|
6
|
+
overflow: hidden;
|
|
7
|
+
}
|
|
8
|
+
.ad-level-meter > svg {
|
|
9
|
+
display: block;
|
|
10
|
+
width: 100%;
|
|
11
|
+
height: 100%;
|
|
12
|
+
filter: drop-shadow(
|
|
13
|
+
0 0 0.22rem color-mix(in srgb, var(--ad-red) 78%, transparent)
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
.ad-level-meter-axis {
|
|
17
|
+
stroke: color-mix(in srgb, var(--ad-red) 24%, transparent);
|
|
18
|
+
stroke-width: 0.7;
|
|
19
|
+
}
|
|
20
|
+
.ad-level-meter-wave {
|
|
21
|
+
transition: opacity 0.18s ease;
|
|
22
|
+
}
|
|
23
|
+
.ad-level-meter[data-active="false"] .ad-level-meter-wave {
|
|
24
|
+
opacity: 0.28;
|
|
25
|
+
}
|
|
26
|
+
.ad-level-meter[data-compact] {
|
|
27
|
+
width: 4.6rem;
|
|
28
|
+
height: 1.45rem;
|
|
29
|
+
border-radius: 999rem;
|
|
30
|
+
}
|
|
@@ -1,196 +1,196 @@
|
|
|
1
|
-
/* Styles owned by MelodyRoll: a dark glass lane with a semitone and seconds grid; notes glide in,
|
|
2
|
-
flash green when sung right; the playhead and lane breathe with the music. */
|
|
3
|
-
.ad-melody-roll {
|
|
4
|
-
--ad-roll-keys: clamp(2.75rem, 8%, 4.5rem);
|
|
5
|
-
position: relative;
|
|
6
|
-
display: grid;
|
|
7
|
-
grid-template-columns: var(--ad-roll-keys) minmax(0, 1fr);
|
|
8
|
-
width: 100%;
|
|
9
|
-
height: 100%;
|
|
10
|
-
min-height: 8rem;
|
|
11
|
-
overflow: hidden;
|
|
12
|
-
isolation: isolate;
|
|
13
|
-
/* Room for the hairline edge that the glass layer below draws. */
|
|
14
|
-
padding: 0.0625rem;
|
|
15
|
-
border-radius: var(--ad-radius-lg, 1rem);
|
|
16
|
-
box-shadow: 0 0 calc(var(--ad-roll-beat) * 1.6rem) rgb(from var(--ad-primary) r g b / 0.25);
|
|
17
|
-
transition: box-shadow 0.12s;
|
|
18
|
-
}
|
|
19
|
-
/* The glass: its own still layer, so the frosted backdrop is never redrawn by the beat or by the
|
|
20
|
-
notes moving over it. */
|
|
21
|
-
.ad-melody-roll::before,
|
|
22
|
-
.ad-melody-roll::after {
|
|
23
|
-
content: "";
|
|
24
|
-
position: absolute;
|
|
25
|
-
inset: 0;
|
|
26
|
-
z-index: -1;
|
|
27
|
-
border: 0.0625rem solid rgb(from var(--ad-primary) r g b / 0.18);
|
|
28
|
-
border-radius: inherit;
|
|
29
|
-
pointer-events: none;
|
|
30
|
-
}
|
|
31
|
-
.ad-melody-roll::before {
|
|
32
|
-
background:
|
|
33
|
-
radial-gradient(80% 120% at 25% 50%, rgb(from var(--ad-primary) r g b / 0.05), transparent 70%),
|
|
34
|
-
linear-gradient(180deg, rgb(from var(--ad-neutral-950) r g b / 0.72), rgb(from var(--ad-neutral-900) r g b / 0.6));
|
|
35
|
-
box-shadow: inset 0 0.0625rem 0 #ffffff12;
|
|
36
|
-
backdrop-filter: blur(0.5rem);
|
|
37
|
-
}
|
|
38
|
-
/* The beat: a brighter edge and a warmer light over the glass, faded in with the music. */
|
|
39
|
-
.ad-melody-roll::after {
|
|
40
|
-
border-color: rgb(from var(--ad-primary) r g b / 0.35);
|
|
41
|
-
background: radial-gradient(80% 120% at 25% 50%, rgb(from var(--ad-primary) r g b / 0.12), transparent 70%);
|
|
42
|
-
opacity: var(--ad-roll-beat);
|
|
43
|
-
transition: opacity 0.12s;
|
|
44
|
-
will-change: opacity;
|
|
45
|
-
}
|
|
46
|
-
.ad-melody-roll-keys.ad-piano-keyboard {
|
|
47
|
-
min-height: 0;
|
|
48
|
-
z-index: 2;
|
|
49
|
-
}
|
|
50
|
-
.ad-melody-roll-lane {
|
|
51
|
-
position: relative;
|
|
52
|
-
container-type: size;
|
|
53
|
-
overflow: hidden;
|
|
54
|
-
border-left: 0.0625rem solid #ffffff22;
|
|
55
|
-
/* One line per semitone; the second lines scroll with the song on a layer of their own. */
|
|
56
|
-
background: linear-gradient(#ffffff0d 0.0625rem, transparent 0.0625rem) 0 0 / 100% calc(100% / var(--ad-roll-rows));
|
|
57
|
-
}
|
|
58
|
-
/* One line per second, a second wider than the lane, slid back by the song's fraction of a second. */
|
|
59
|
-
.ad-melody-roll-seconds {
|
|
60
|
-
position: absolute;
|
|
61
|
-
top: 0;
|
|
62
|
-
bottom: 0;
|
|
63
|
-
left: 0;
|
|
64
|
-
width: calc(100cqw + var(--ad-roll-second));
|
|
65
|
-
background: linear-gradient(90deg, #ffffff0a 0.0625rem, transparent 0.0625rem) 0 0 / var(--ad-roll-second) 100%;
|
|
66
|
-
transform: translateX(var(--ad-roll-shift));
|
|
67
|
-
will-change: transform;
|
|
68
|
-
pointer-events: none;
|
|
69
|
-
}
|
|
70
|
-
.ad-melody-roll-strip {
|
|
71
|
-
position: absolute;
|
|
72
|
-
inset: 0;
|
|
73
|
-
will-change: transform;
|
|
74
|
-
}
|
|
75
|
-
/* A note: a glossy capsule in the theme colours. */
|
|
76
|
-
.ad-melody-note {
|
|
77
|
-
position: absolute;
|
|
78
|
-
/* Three quarters of a semitone row, centred in it. */
|
|
79
|
-
height: calc(100% / var(--ad-roll-rows) * 0.76);
|
|
80
|
-
translate: 0 15.8%;
|
|
81
|
-
border-radius: 999px;
|
|
82
|
-
background-image: linear-gradient(90deg, var(--ad-primary), var(--ad-secondary));
|
|
83
|
-
box-shadow: inset 0 0.0625rem 0 #ffffff55;
|
|
84
|
-
display: flex;
|
|
85
|
-
align-items: center;
|
|
86
|
-
overflow: hidden;
|
|
87
|
-
transition:
|
|
88
|
-
filter 0.2s,
|
|
89
|
-
opacity 0.3s;
|
|
90
|
-
}
|
|
91
|
-
.ad-melody-note > span {
|
|
92
|
-
padding-inline: 0.4em;
|
|
93
|
-
color: #fff;
|
|
94
|
-
font: 600 clamp(0.5rem, 1.6cqh, 0.75rem) / 1 var(--ad-font-family-sans);
|
|
95
|
-
white-space: nowrap;
|
|
96
|
-
text-shadow: 0 0 0.3em #0008;
|
|
97
|
-
}
|
|
98
|
-
/* Under the playhead: brighter, lifted. */
|
|
99
|
-
.ad-melody-note[data-now] {
|
|
100
|
-
filter: brightness(1.3) drop-shadow(0 0 0.4rem var(--ad-primary));
|
|
101
|
-
}
|
|
102
|
-
.ad-melody-note[data-past]:not([data-hit]) {
|
|
103
|
-
opacity: 0.45;
|
|
104
|
-
}
|
|
105
|
-
/* Sung right: green with a burst of light. */
|
|
106
|
-
.ad-melody-note[data-hit] {
|
|
107
|
-
background-image: linear-gradient(90deg, #55ff9a, #16d875);
|
|
108
|
-
filter: drop-shadow(0 0 0.45rem #32ff8ff0) drop-shadow(0 0 1.1rem #32ff8f99);
|
|
109
|
-
animation: ad-melody-hit 0.62s ease-out;
|
|
110
|
-
}
|
|
111
|
-
@keyframes ad-melody-hit {
|
|
112
|
-
28% {
|
|
113
|
-
filter: brightness(1.9) drop-shadow(0 0 1.2rem #32ff8f);
|
|
114
|
-
scale: 1 1.6;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
.ad-melody-trail {
|
|
118
|
-
position: absolute;
|
|
119
|
-
inset: 0;
|
|
120
|
-
width: 100%;
|
|
121
|
-
height: 100%;
|
|
122
|
-
overflow: visible;
|
|
123
|
-
pointer-events: none;
|
|
124
|
-
}
|
|
125
|
-
.ad-melody-trail > path {
|
|
126
|
-
fill: none;
|
|
127
|
-
stroke: color-mix(in oklch, var(--ad-secondary-100), #3dff91 calc(var(--ad-roll-accuracy) * 100%));
|
|
128
|
-
stroke-width: 0.15rem;
|
|
129
|
-
stroke-linecap: round;
|
|
130
|
-
stroke-linejoin: round;
|
|
131
|
-
opacity: 0.75;
|
|
132
|
-
}
|
|
133
|
-
/* The trail's glow without a filter: two wider, faint copies of the line under it, so the
|
|
134
|
-
growing trail is never re-blurred. */
|
|
135
|
-
.ad-melody-trail > path[data-halo] {
|
|
136
|
-
stroke: currentColor;
|
|
137
|
-
}
|
|
138
|
-
.ad-melody-trail > path[data-halo="wide"] {
|
|
139
|
-
stroke-width: calc(0.15rem + 0.5rem);
|
|
140
|
-
opacity: 0.1;
|
|
141
|
-
}
|
|
142
|
-
.ad-melody-trail > path[data-halo="near"] {
|
|
143
|
-
stroke-width: calc(0.15rem + 0.25rem);
|
|
144
|
-
opacity: 0.22;
|
|
145
|
-
}
|
|
146
|
-
.ad-melody-playhead {
|
|
147
|
-
position: absolute;
|
|
148
|
-
top: 0;
|
|
149
|
-
bottom: 0;
|
|
150
|
-
width: 0.125rem;
|
|
151
|
-
translate: -50% 0;
|
|
152
|
-
background: #fff;
|
|
153
|
-
box-shadow:
|
|
154
|
-
0 0 0.6rem #fff,
|
|
155
|
-
0 0 1rem var(--ad-primary);
|
|
156
|
-
}
|
|
157
|
-
/* The playhead flares on the beat: a wider glow, drawn once, faded in. */
|
|
158
|
-
.ad-melody-playhead::after {
|
|
159
|
-
content: "";
|
|
160
|
-
position: absolute;
|
|
161
|
-
inset: 0;
|
|
162
|
-
box-shadow:
|
|
163
|
-
0 0 1.6rem #fff,
|
|
164
|
-
0 0 2.6rem var(--ad-primary);
|
|
165
|
-
opacity: var(--ad-roll-beat);
|
|
166
|
-
will-change: opacity;
|
|
167
|
-
}
|
|
168
|
-
/* The singer's voice: grows with loudness, greens with accuracy. */
|
|
169
|
-
.ad-melody-voice {
|
|
170
|
-
--ad-voice: calc(0.95rem + var(--ad-roll-level) * 0.7rem);
|
|
171
|
-
position: absolute;
|
|
172
|
-
z-index: 3;
|
|
173
|
-
width: var(--ad-voice);
|
|
174
|
-
height: var(--ad-voice);
|
|
175
|
-
translate: -50% -50%;
|
|
176
|
-
border: 0.125rem solid #fff;
|
|
177
|
-
border-radius: 50%;
|
|
178
|
-
background: color-mix(in oklch, #fff, #2ee886 calc(var(--ad-roll-accuracy) * 100%));
|
|
179
|
-
box-shadow:
|
|
180
|
-
0 0 0 0.2rem #ffffff22,
|
|
181
|
-
0 0 calc(0.5rem + var(--ad-roll-accuracy) * 1rem) rgb(46 232 134 / calc(0.2 + var(--ad-roll-accuracy) * 0.7));
|
|
182
|
-
transition:
|
|
183
|
-
top 0.08s linear,
|
|
184
|
-
width 0.08s,
|
|
185
|
-
height 0.08s,
|
|
186
|
-
background 0.08s;
|
|
187
|
-
}
|
|
188
|
-
.ad-melody-voice[data-hit] {
|
|
189
|
-
background: #4dffa0;
|
|
190
|
-
animation: ad-melody-voice-hit 0.42s ease-out;
|
|
191
|
-
}
|
|
192
|
-
@keyframes ad-melody-voice-hit {
|
|
193
|
-
45% {
|
|
194
|
-
scale: 1.35;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
1
|
+
/* Styles owned by MelodyRoll: a dark glass lane with a semitone and seconds grid; notes glide in,
|
|
2
|
+
flash green when sung right; the playhead and lane breathe with the music. */
|
|
3
|
+
.ad-melody-roll {
|
|
4
|
+
--ad-roll-keys: clamp(2.75rem, 8%, 4.5rem);
|
|
5
|
+
position: relative;
|
|
6
|
+
display: grid;
|
|
7
|
+
grid-template-columns: var(--ad-roll-keys) minmax(0, 1fr);
|
|
8
|
+
width: 100%;
|
|
9
|
+
height: 100%;
|
|
10
|
+
min-height: 8rem;
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
isolation: isolate;
|
|
13
|
+
/* Room for the hairline edge that the glass layer below draws. */
|
|
14
|
+
padding: 0.0625rem;
|
|
15
|
+
border-radius: var(--ad-radius-lg, 1rem);
|
|
16
|
+
box-shadow: 0 0 calc(var(--ad-roll-beat) * 1.6rem) rgb(from var(--ad-primary) r g b / 0.25);
|
|
17
|
+
transition: box-shadow 0.12s;
|
|
18
|
+
}
|
|
19
|
+
/* The glass: its own still layer, so the frosted backdrop is never redrawn by the beat or by the
|
|
20
|
+
notes moving over it. */
|
|
21
|
+
.ad-melody-roll::before,
|
|
22
|
+
.ad-melody-roll::after {
|
|
23
|
+
content: "";
|
|
24
|
+
position: absolute;
|
|
25
|
+
inset: 0;
|
|
26
|
+
z-index: -1;
|
|
27
|
+
border: 0.0625rem solid rgb(from var(--ad-primary) r g b / 0.18);
|
|
28
|
+
border-radius: inherit;
|
|
29
|
+
pointer-events: none;
|
|
30
|
+
}
|
|
31
|
+
.ad-melody-roll::before {
|
|
32
|
+
background:
|
|
33
|
+
radial-gradient(80% 120% at 25% 50%, rgb(from var(--ad-primary) r g b / 0.05), transparent 70%),
|
|
34
|
+
linear-gradient(180deg, rgb(from var(--ad-neutral-950) r g b / 0.72), rgb(from var(--ad-neutral-900) r g b / 0.6));
|
|
35
|
+
box-shadow: inset 0 0.0625rem 0 #ffffff12;
|
|
36
|
+
backdrop-filter: blur(0.5rem);
|
|
37
|
+
}
|
|
38
|
+
/* The beat: a brighter edge and a warmer light over the glass, faded in with the music. */
|
|
39
|
+
.ad-melody-roll::after {
|
|
40
|
+
border-color: rgb(from var(--ad-primary) r g b / 0.35);
|
|
41
|
+
background: radial-gradient(80% 120% at 25% 50%, rgb(from var(--ad-primary) r g b / 0.12), transparent 70%);
|
|
42
|
+
opacity: var(--ad-roll-beat);
|
|
43
|
+
transition: opacity 0.12s;
|
|
44
|
+
will-change: opacity;
|
|
45
|
+
}
|
|
46
|
+
.ad-melody-roll-keys.ad-piano-keyboard {
|
|
47
|
+
min-height: 0;
|
|
48
|
+
z-index: 2;
|
|
49
|
+
}
|
|
50
|
+
.ad-melody-roll-lane {
|
|
51
|
+
position: relative;
|
|
52
|
+
container-type: size;
|
|
53
|
+
overflow: hidden;
|
|
54
|
+
border-left: 0.0625rem solid #ffffff22;
|
|
55
|
+
/* One line per semitone; the second lines scroll with the song on a layer of their own. */
|
|
56
|
+
background: linear-gradient(#ffffff0d 0.0625rem, transparent 0.0625rem) 0 0 / 100% calc(100% / var(--ad-roll-rows));
|
|
57
|
+
}
|
|
58
|
+
/* One line per second, a second wider than the lane, slid back by the song's fraction of a second. */
|
|
59
|
+
.ad-melody-roll-seconds {
|
|
60
|
+
position: absolute;
|
|
61
|
+
top: 0;
|
|
62
|
+
bottom: 0;
|
|
63
|
+
left: 0;
|
|
64
|
+
width: calc(100cqw + var(--ad-roll-second));
|
|
65
|
+
background: linear-gradient(90deg, #ffffff0a 0.0625rem, transparent 0.0625rem) 0 0 / var(--ad-roll-second) 100%;
|
|
66
|
+
transform: translateX(var(--ad-roll-shift));
|
|
67
|
+
will-change: transform;
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
.ad-melody-roll-strip {
|
|
71
|
+
position: absolute;
|
|
72
|
+
inset: 0;
|
|
73
|
+
will-change: transform;
|
|
74
|
+
}
|
|
75
|
+
/* A note: a glossy capsule in the theme colours. */
|
|
76
|
+
.ad-melody-note {
|
|
77
|
+
position: absolute;
|
|
78
|
+
/* Three quarters of a semitone row, centred in it. */
|
|
79
|
+
height: calc(100% / var(--ad-roll-rows) * 0.76);
|
|
80
|
+
translate: 0 15.8%;
|
|
81
|
+
border-radius: 999px;
|
|
82
|
+
background-image: linear-gradient(90deg, var(--ad-primary), var(--ad-secondary));
|
|
83
|
+
box-shadow: inset 0 0.0625rem 0 #ffffff55;
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
overflow: hidden;
|
|
87
|
+
transition:
|
|
88
|
+
filter 0.2s,
|
|
89
|
+
opacity 0.3s;
|
|
90
|
+
}
|
|
91
|
+
.ad-melody-note > span {
|
|
92
|
+
padding-inline: 0.4em;
|
|
93
|
+
color: #fff;
|
|
94
|
+
font: 600 clamp(0.5rem, 1.6cqh, 0.75rem) / 1 var(--ad-font-family-sans);
|
|
95
|
+
white-space: nowrap;
|
|
96
|
+
text-shadow: 0 0 0.3em #0008;
|
|
97
|
+
}
|
|
98
|
+
/* Under the playhead: brighter, lifted. */
|
|
99
|
+
.ad-melody-note[data-now] {
|
|
100
|
+
filter: brightness(1.3) drop-shadow(0 0 0.4rem var(--ad-primary));
|
|
101
|
+
}
|
|
102
|
+
.ad-melody-note[data-past]:not([data-hit]) {
|
|
103
|
+
opacity: 0.45;
|
|
104
|
+
}
|
|
105
|
+
/* Sung right: green with a burst of light. */
|
|
106
|
+
.ad-melody-note[data-hit] {
|
|
107
|
+
background-image: linear-gradient(90deg, #55ff9a, #16d875);
|
|
108
|
+
filter: drop-shadow(0 0 0.45rem #32ff8ff0) drop-shadow(0 0 1.1rem #32ff8f99);
|
|
109
|
+
animation: ad-melody-hit 0.62s ease-out;
|
|
110
|
+
}
|
|
111
|
+
@keyframes ad-melody-hit {
|
|
112
|
+
28% {
|
|
113
|
+
filter: brightness(1.9) drop-shadow(0 0 1.2rem #32ff8f);
|
|
114
|
+
scale: 1 1.6;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
.ad-melody-trail {
|
|
118
|
+
position: absolute;
|
|
119
|
+
inset: 0;
|
|
120
|
+
width: 100%;
|
|
121
|
+
height: 100%;
|
|
122
|
+
overflow: visible;
|
|
123
|
+
pointer-events: none;
|
|
124
|
+
}
|
|
125
|
+
.ad-melody-trail > path {
|
|
126
|
+
fill: none;
|
|
127
|
+
stroke: color-mix(in oklch, var(--ad-secondary-100), #3dff91 calc(var(--ad-roll-accuracy) * 100%));
|
|
128
|
+
stroke-width: 0.15rem;
|
|
129
|
+
stroke-linecap: round;
|
|
130
|
+
stroke-linejoin: round;
|
|
131
|
+
opacity: 0.75;
|
|
132
|
+
}
|
|
133
|
+
/* The trail's glow without a filter: two wider, faint copies of the line under it, so the
|
|
134
|
+
growing trail is never re-blurred. */
|
|
135
|
+
.ad-melody-trail > path[data-halo] {
|
|
136
|
+
stroke: currentColor;
|
|
137
|
+
}
|
|
138
|
+
.ad-melody-trail > path[data-halo="wide"] {
|
|
139
|
+
stroke-width: calc(0.15rem + 0.5rem);
|
|
140
|
+
opacity: 0.1;
|
|
141
|
+
}
|
|
142
|
+
.ad-melody-trail > path[data-halo="near"] {
|
|
143
|
+
stroke-width: calc(0.15rem + 0.25rem);
|
|
144
|
+
opacity: 0.22;
|
|
145
|
+
}
|
|
146
|
+
.ad-melody-playhead {
|
|
147
|
+
position: absolute;
|
|
148
|
+
top: 0;
|
|
149
|
+
bottom: 0;
|
|
150
|
+
width: 0.125rem;
|
|
151
|
+
translate: -50% 0;
|
|
152
|
+
background: #fff;
|
|
153
|
+
box-shadow:
|
|
154
|
+
0 0 0.6rem #fff,
|
|
155
|
+
0 0 1rem var(--ad-primary);
|
|
156
|
+
}
|
|
157
|
+
/* The playhead flares on the beat: a wider glow, drawn once, faded in. */
|
|
158
|
+
.ad-melody-playhead::after {
|
|
159
|
+
content: "";
|
|
160
|
+
position: absolute;
|
|
161
|
+
inset: 0;
|
|
162
|
+
box-shadow:
|
|
163
|
+
0 0 1.6rem #fff,
|
|
164
|
+
0 0 2.6rem var(--ad-primary);
|
|
165
|
+
opacity: var(--ad-roll-beat);
|
|
166
|
+
will-change: opacity;
|
|
167
|
+
}
|
|
168
|
+
/* The singer's voice: grows with loudness, greens with accuracy. */
|
|
169
|
+
.ad-melody-voice {
|
|
170
|
+
--ad-voice: calc(0.95rem + var(--ad-roll-level) * 0.7rem);
|
|
171
|
+
position: absolute;
|
|
172
|
+
z-index: 3;
|
|
173
|
+
width: var(--ad-voice);
|
|
174
|
+
height: var(--ad-voice);
|
|
175
|
+
translate: -50% -50%;
|
|
176
|
+
border: 0.125rem solid #fff;
|
|
177
|
+
border-radius: 50%;
|
|
178
|
+
background: color-mix(in oklch, #fff, #2ee886 calc(var(--ad-roll-accuracy) * 100%));
|
|
179
|
+
box-shadow:
|
|
180
|
+
0 0 0 0.2rem #ffffff22,
|
|
181
|
+
0 0 calc(0.5rem + var(--ad-roll-accuracy) * 1rem) rgb(46 232 134 / calc(0.2 + var(--ad-roll-accuracy) * 0.7));
|
|
182
|
+
transition:
|
|
183
|
+
top 0.08s linear,
|
|
184
|
+
width 0.08s,
|
|
185
|
+
height 0.08s,
|
|
186
|
+
background 0.08s;
|
|
187
|
+
}
|
|
188
|
+
.ad-melody-voice[data-hit] {
|
|
189
|
+
background: #4dffa0;
|
|
190
|
+
animation: ad-melody-voice-hit 0.42s ease-out;
|
|
191
|
+
}
|
|
192
|
+
@keyframes ad-melody-voice-hit {
|
|
193
|
+
45% {
|
|
194
|
+
scale: 1.35;
|
|
195
|
+
}
|
|
196
|
+
}
|