@kongyo2/cards-css 0.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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/dist/active-registry.js +10 -0
  4. package/dist/active-registry.js.map +1 -0
  5. package/dist/dom.js +66 -0
  6. package/dist/dom.js.map +1 -0
  7. package/dist/holo-card.js +450 -0
  8. package/dist/holo-card.js.map +1 -0
  9. package/dist/holo-cards.css +601 -0
  10. package/dist/index.js +15 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/math.js +4 -0
  13. package/dist/math.js.map +1 -0
  14. package/dist/orientation.js +64 -0
  15. package/dist/orientation.js.map +1 -0
  16. package/dist/spring.js +123 -0
  17. package/dist/spring.js.map +1 -0
  18. package/dist/subscribers.js +26 -0
  19. package/dist/subscribers.js.map +1 -0
  20. package/dist/textures.js +178 -0
  21. package/dist/textures.js.map +1 -0
  22. package/dist/ticker.js +32 -0
  23. package/dist/ticker.js.map +1 -0
  24. package/dist/types.js +2 -0
  25. package/dist/types.js.map +1 -0
  26. package/dist-types/active-registry.d.ts +6 -0
  27. package/dist-types/active-registry.d.ts.map +1 -0
  28. package/dist-types/dom.d.ts +18 -0
  29. package/dist-types/dom.d.ts.map +1 -0
  30. package/dist-types/holo-card.d.ts +58 -0
  31. package/dist-types/holo-card.d.ts.map +1 -0
  32. package/dist-types/index.d.ts +13 -0
  33. package/dist-types/index.d.ts.map +1 -0
  34. package/dist-types/math.d.ts +4 -0
  35. package/dist-types/math.d.ts.map +1 -0
  36. package/dist-types/orientation.d.ts +13 -0
  37. package/dist-types/orientation.d.ts.map +1 -0
  38. package/dist-types/spring.d.ts +32 -0
  39. package/dist-types/spring.d.ts.map +1 -0
  40. package/dist-types/subscribers.d.ts +10 -0
  41. package/dist-types/subscribers.d.ts.map +1 -0
  42. package/dist-types/textures.d.ts +23 -0
  43. package/dist-types/textures.d.ts.map +1 -0
  44. package/dist-types/ticker.d.ts +7 -0
  45. package/dist-types/ticker.d.ts.map +1 -0
  46. package/dist-types/types.d.ts +21 -0
  47. package/dist-types/types.d.ts.map +1 -0
  48. package/package.json +75 -0
  49. package/src/active-registry.ts +15 -0
  50. package/src/dom.ts +79 -0
  51. package/src/holo-card.ts +525 -0
  52. package/src/index.ts +35 -0
  53. package/src/math.ts +6 -0
  54. package/src/orientation.ts +83 -0
  55. package/src/spring.ts +158 -0
  56. package/src/styles/base.css +262 -0
  57. package/src/styles/effects/cosmos.css +143 -0
  58. package/src/styles/effects/glitter.css +103 -0
  59. package/src/styles/effects/holo.css +127 -0
  60. package/src/styles/effects/reverse.css +55 -0
  61. package/src/styles/index.css +5 -0
  62. package/src/subscribers.ts +30 -0
  63. package/src/textures.ts +310 -0
  64. package/src/ticker.ts +46 -0
  65. package/src/types.ts +22 -0
package/src/spring.ts ADDED
@@ -0,0 +1,158 @@
1
+ import { loop, now, type TaskHandle } from "./ticker.js";
2
+ import { Subscribers } from "./subscribers.js";
3
+
4
+ export type SpringValue = number | Record<string, number>;
5
+
6
+ export interface SpringOpts {
7
+ stiffness?: number;
8
+ damping?: number;
9
+ precision?: number;
10
+ }
11
+
12
+ export interface SpringSetOpts {
13
+ hard?: boolean;
14
+ soft?: boolean | number;
15
+ }
16
+
17
+ interface TickContext {
18
+ invMass: number;
19
+ stiffness: number;
20
+ damping: number;
21
+ precision: number;
22
+ settled: boolean;
23
+ dt: number;
24
+ }
25
+
26
+ const tickScalar = (ctx: TickContext, lastValue: number, currentValue: number, targetValue: number): number => {
27
+ const delta = targetValue - currentValue;
28
+ const velocity = (currentValue - lastValue) / (ctx.dt || 1 / 60);
29
+ const spring = ctx.stiffness * delta;
30
+ const damper = ctx.damping * velocity;
31
+ const acceleration = (spring - damper) * ctx.invMass;
32
+ const d = (velocity + acceleration) * ctx.dt;
33
+ if (Math.abs(d) < ctx.precision && Math.abs(delta) < ctx.precision) {
34
+ return targetValue;
35
+ }
36
+ ctx.settled = false;
37
+ return currentValue + d;
38
+ };
39
+
40
+ const tick = <T extends SpringValue>(ctx: TickContext, last: T, current: T, target: T): T => {
41
+ if (typeof current === "number") {
42
+ return tickScalar(ctx, last as number, current, target as number) as T;
43
+ }
44
+ const cur = current as Record<string, number>;
45
+ const lst = last as Record<string, number>;
46
+ const tgt = target as Record<string, number>;
47
+ const result: Record<string, number> = {};
48
+ for (const key in cur) {
49
+ const c = cur[key] ?? 0;
50
+ result[key] = tickScalar(ctx, lst[key] ?? c, c, tgt[key] ?? c);
51
+ }
52
+ return result as T;
53
+ };
54
+
55
+ export class Spring<T extends SpringValue> {
56
+ stiffness: number;
57
+ damping: number;
58
+ precision: number;
59
+
60
+ private value: T;
61
+ private lastValue: T;
62
+ private targetValue: T;
63
+ private invMass = 1;
64
+ private invMassRecoveryRate = 0;
65
+ private cancelTask = false;
66
+ private task: TaskHandle | null = null;
67
+ private lastTime = 0;
68
+ private currentToken: object | null = null;
69
+ private readonly subscribers = new Subscribers<T>(() => this.value);
70
+
71
+ constructor(value: T, opts: SpringOpts = {}) {
72
+ this.value = value;
73
+ this.lastValue = value;
74
+ this.targetValue = value;
75
+ this.stiffness = opts.stiffness ?? 0.15;
76
+ this.damping = opts.damping ?? 0.8;
77
+ this.precision = opts.precision ?? 0.01;
78
+ }
79
+
80
+ get current(): T {
81
+ return this.value;
82
+ }
83
+
84
+ subscribe(fn: (value: T) => void): () => void {
85
+ return this.subscribers.subscribe(fn);
86
+ }
87
+
88
+ private notify(): void {
89
+ this.subscribers.emit(this.value);
90
+ }
91
+
92
+ set(newValue: T, opts: SpringSetOpts = {}): Promise<void> {
93
+ this.targetValue = newValue;
94
+ const token = (this.currentToken = {});
95
+
96
+ if (opts.hard || (this.stiffness >= 1 && this.damping >= 1)) {
97
+ this.cancelTask = true;
98
+ if (this.task) {
99
+ this.task.abort();
100
+ this.task = null;
101
+ }
102
+ this.lastTime = now();
103
+ this.lastValue = newValue;
104
+ this.value = newValue;
105
+ this.notify();
106
+ return Promise.resolve();
107
+ }
108
+
109
+ if (opts.soft) {
110
+ const rate = opts.soft === true ? 0.5 : opts.soft;
111
+ this.invMassRecoveryRate = 1 / (rate * 60);
112
+ this.invMass = 0;
113
+ }
114
+
115
+ let handle = this.task;
116
+ if (!handle) {
117
+ this.lastTime = now();
118
+ this.cancelTask = false;
119
+ handle = loop((time) => {
120
+ if (this.cancelTask) {
121
+ this.cancelTask = false;
122
+ this.task = null;
123
+ return false;
124
+ }
125
+ this.invMass = Math.min(this.invMass + this.invMassRecoveryRate, 1);
126
+ const ctx: TickContext = {
127
+ invMass: this.invMass,
128
+ stiffness: this.stiffness,
129
+ damping: this.damping,
130
+ precision: this.precision,
131
+ settled: true,
132
+ dt: ((time - this.lastTime) * 60) / 1000,
133
+ };
134
+ const next = tick(ctx, this.lastValue, this.value, this.targetValue);
135
+ this.lastTime = time;
136
+ this.lastValue = this.value;
137
+ this.value = next;
138
+ this.notify();
139
+ if (ctx.settled) {
140
+ this.task = null;
141
+ }
142
+ return !ctx.settled;
143
+ });
144
+ this.task = handle;
145
+ }
146
+
147
+ return new Promise<void>((fulfil) => {
148
+ void handle.promise.then(() => (token === this.currentToken ? fulfil() : undefined));
149
+ });
150
+ }
151
+
152
+ destroy(): void {
153
+ this.cancelTask = true;
154
+ this.task?.abort();
155
+ this.task = null;
156
+ this.subscribers.clear();
157
+ }
158
+ }
@@ -0,0 +1,262 @@
1
+ :root {
2
+ --card-aspect: 0.718;
3
+ --card-radius: 4.55% / 3.5%;
4
+ --card-edge: hsl(47, 100%, 78%);
5
+ --card-back: hsl(205, 100%, 25%);
6
+ --card-glow: hsl(175, 100%, 90%);
7
+
8
+ --sunpillar-1: hsl(2, 100%, 73%);
9
+ --sunpillar-2: hsl(53, 100%, 69%);
10
+ --sunpillar-3: hsl(93, 100%, 69%);
11
+ --sunpillar-4: hsl(176, 100%, 76%);
12
+ --sunpillar-5: hsl(228, 100%, 74%);
13
+ --sunpillar-6: hsl(283, 100%, 73%);
14
+
15
+ --sunpillar-clr-1: var(--sunpillar-1);
16
+ --sunpillar-clr-2: var(--sunpillar-2);
17
+ --sunpillar-clr-3: var(--sunpillar-3);
18
+ --sunpillar-clr-4: var(--sunpillar-4);
19
+ --sunpillar-clr-5: var(--sunpillar-5);
20
+ --sunpillar-clr-6: var(--sunpillar-6);
21
+
22
+ --pointer-x: 50%;
23
+ --pointer-y: 50%;
24
+ --card-scale: 1;
25
+ --card-opacity: 0;
26
+ --translate-x: 0px;
27
+ --translate-y: 0px;
28
+ --rotate-x: 0deg;
29
+ --rotate-y: 0deg;
30
+ --background-x: var(--pointer-x);
31
+ --background-y: var(--pointer-y);
32
+ --pointer-from-center: 0;
33
+ --pointer-from-top: var(--pointer-from-center);
34
+ --pointer-from-left: var(--pointer-from-center);
35
+ }
36
+
37
+ .holo-card {
38
+ --grain: var(--hc-grain, none);
39
+ --glitter: var(--hc-glitter, none);
40
+ --glittersize: 25%;
41
+
42
+ --space: 5%;
43
+ --angle: 133deg;
44
+ --imgsize: cover;
45
+
46
+ --red: #f80e35;
47
+ --yellow: #eedf10;
48
+ --green: #21e985;
49
+ --blue: #0dbde9;
50
+ --violet: #c929f1;
51
+
52
+ transform: translate3d(0px, 0px, 0.01px);
53
+ pointer-events: none;
54
+ z-index: calc(var(--card-scale) * 2);
55
+ will-change: transform, visibility, z-index;
56
+ transform-style: preserve-3d;
57
+ }
58
+
59
+ .holo-card,
60
+ .holo-card * {
61
+ outline: 1px solid transparent;
62
+ }
63
+
64
+ .holo-card:not(.holo-card--interactive) .holo-card__translater,
65
+ .holo-card:not(.holo-card--interactive) .holo-card__rotator,
66
+ .holo-card:not(.holo-card--interactive) .holo-card__shine,
67
+ .holo-card:not(.holo-card--interactive) .holo-card__glare {
68
+ transition: all 0.3s ease;
69
+ }
70
+
71
+ .holo-card:not(.holo-card--interactive):hover {
72
+ --pointer-x: 25%;
73
+ --pointer-y: 10%;
74
+ --card-scale: 1.1;
75
+ --card-opacity: 1;
76
+ --translate-x: 0px;
77
+ --translate-y: -10px;
78
+ --rotate-x: 7deg;
79
+ --rotate-y: -19deg;
80
+ --background-x: 44%;
81
+ --background-y: 36%;
82
+ --pointer-from-center: 0.9;
83
+ --pointer-from-top: 0.11;
84
+ --pointer-from-left: 0.25;
85
+ }
86
+
87
+ .holo-card,
88
+ .holo-card__rotator {
89
+ aspect-ratio: var(--card-aspect);
90
+ border-radius: var(--card-radius);
91
+ }
92
+
93
+ .holo-card--interacting {
94
+ z-index: calc(var(--card-scale) * 120);
95
+ }
96
+
97
+ .holo-card--active .holo-card__translater,
98
+ .holo-card--active .holo-card__rotator {
99
+ touch-action: none;
100
+ }
101
+
102
+ .holo-card__translater,
103
+ .holo-card__rotator {
104
+ display: grid;
105
+ perspective: 600px;
106
+ will-change: transform, box-shadow;
107
+ transform-origin: center;
108
+ transform-style: preserve-3d;
109
+ }
110
+
111
+ .holo-card__translater {
112
+ width: auto;
113
+ position: relative;
114
+ --translate-z: calc(var(--card-scale) * 150px + 0.01px);
115
+ transform: translate3d(var(--translate-x), var(--translate-y), var(--translate-z)) scale(var(--card-scale));
116
+ }
117
+
118
+ .holo-card__rotator {
119
+ transform: rotateY(var(--rotate-x)) rotateX(var(--rotate-y));
120
+ transform-style: preserve-3d;
121
+ pointer-events: auto;
122
+ }
123
+
124
+ button.holo-card__rotator {
125
+ border: none;
126
+ background: transparent;
127
+ padding: 0;
128
+ appearance: none;
129
+ }
130
+
131
+ .holo-card__rotator,
132
+ .holo-card--active .holo-card__rotator:focus {
133
+ transition:
134
+ box-shadow 0.4s ease,
135
+ opacity 0.33s ease-out;
136
+ box-shadow:
137
+ 0 0 3px -1px transparent,
138
+ 0 0 2px 1px transparent,
139
+ 0 0 5px 0px transparent,
140
+ 0px 10px 20px -5px black,
141
+ 0 2px 15px -5px black,
142
+ 0 0 20px 0px transparent;
143
+ }
144
+
145
+ .holo-card--active .holo-card__rotator,
146
+ .holo-card__rotator:focus {
147
+ box-shadow:
148
+ 0 0 3px -1px white,
149
+ 0 0 3px 1px var(--card-edge),
150
+ 0 0 12px 2px var(--card-glow),
151
+ 0px 10px 20px -5px black,
152
+ 0 0 40px -30px var(--card-glow),
153
+ 0 0 50px -20px var(--card-glow);
154
+ }
155
+
156
+ .holo-card__rotator * {
157
+ width: 100%;
158
+ display: grid;
159
+ grid-area: 1/1;
160
+ aspect-ratio: var(--card-aspect);
161
+ border-radius: var(--card-radius);
162
+ image-rendering: optimizeQuality;
163
+ transform-style: preserve-3d;
164
+ pointer-events: none;
165
+ overflow: hidden;
166
+ }
167
+
168
+ .holo-card__rotator img {
169
+ height: auto;
170
+ }
171
+
172
+ .holo-card__rotator img:not(.holo-card__back) {
173
+ transform: translate3d(0px, 0px, 0.01px);
174
+ }
175
+
176
+ .holo-card__back {
177
+ background-color: var(--card-back);
178
+ transform: rotateY(180deg) translateZ(1px);
179
+ backface-visibility: visible;
180
+ }
181
+
182
+ .holo-card__front,
183
+ .holo-card__front * {
184
+ backface-visibility: hidden;
185
+ }
186
+
187
+ .holo-card__front {
188
+ opacity: 1;
189
+ transition: opacity 0.33s ease-out;
190
+ transform: translate3d(0px, 0px, 0.01px);
191
+ }
192
+
193
+ .holo-card--loading .holo-card__front {
194
+ opacity: 0;
195
+ }
196
+
197
+ .holo-card--loading .holo-card__back {
198
+ transform: rotateY(0deg);
199
+ }
200
+
201
+ .holo-card__shine,
202
+ .holo-card__glare {
203
+ will-change:
204
+ transform, opacity, background-image, background-size, background-position, background-blend-mode, filter;
205
+ }
206
+
207
+ .holo-card__shine {
208
+ display: grid;
209
+ transform: translateZ(1px);
210
+ overflow: hidden;
211
+ z-index: 3;
212
+ background: transparent;
213
+ background-size: cover;
214
+ background-position: center;
215
+ filter: brightness(0.85) contrast(2.75) saturate(0.65);
216
+ mix-blend-mode: color-dodge;
217
+ opacity: var(--card-opacity);
218
+ }
219
+
220
+ .holo-card__shine::before,
221
+ .holo-card__shine::after {
222
+ --sunpillar-clr-1: var(--sunpillar-5);
223
+ --sunpillar-clr-2: var(--sunpillar-6);
224
+ --sunpillar-clr-3: var(--sunpillar-1);
225
+ --sunpillar-clr-4: var(--sunpillar-2);
226
+ --sunpillar-clr-5: var(--sunpillar-3);
227
+ --sunpillar-clr-6: var(--sunpillar-4);
228
+ grid-area: 1/1;
229
+ transform: translateZ(1px);
230
+ border-radius: var(--card-radius);
231
+ }
232
+
233
+ .holo-card__shine::after {
234
+ --sunpillar-clr-1: var(--sunpillar-6);
235
+ --sunpillar-clr-2: var(--sunpillar-1);
236
+ --sunpillar-clr-3: var(--sunpillar-2);
237
+ --sunpillar-clr-4: var(--sunpillar-3);
238
+ --sunpillar-clr-5: var(--sunpillar-4);
239
+ --sunpillar-clr-6: var(--sunpillar-5);
240
+ transform: translateZ(1.2px);
241
+ }
242
+
243
+ .holo-card__glare {
244
+ transform: translateZ(1.41px);
245
+ overflow: hidden;
246
+ background-image: radial-gradient(
247
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
248
+ hsla(0, 0%, 100%, 0.8) 10%,
249
+ hsla(0, 0%, 100%, 0.65) 20%,
250
+ hsla(0, 0%, 0%, 0.5) 90%
251
+ );
252
+ opacity: var(--card-opacity);
253
+ mix-blend-mode: overlay;
254
+ }
255
+
256
+ .holo-card--masked .holo-card__shine,
257
+ .holo-card--masked .holo-card__shine::before,
258
+ .holo-card--masked .holo-card__shine::after {
259
+ mask-image: var(--mask);
260
+ mask-size: cover;
261
+ mask-position: center center;
262
+ }
@@ -0,0 +1,143 @@
1
+ .holo-card[data-effect="cosmos"] .holo-card__shine {
2
+ --space: 4%;
3
+
4
+ background-image:
5
+ var(--hc-cosmos-bottom),
6
+ repeating-linear-gradient(
7
+ 82deg,
8
+ hsl(53, 65%, 60%) calc(var(--space) * 1),
9
+ hsl(93, 56%, 50%) calc(var(--space) * 2),
10
+ hsl(176, 54%, 49%) calc(var(--space) * 3),
11
+ hsl(228, 59%, 55%) calc(var(--space) * 4),
12
+ hsl(283, 60%, 55%) calc(var(--space) * 5),
13
+ hsl(326, 59%, 51%) calc(var(--space) * 6),
14
+ hsl(326, 59%, 51%) calc(var(--space) * 7),
15
+ hsl(283, 60%, 55%) calc(var(--space) * 8),
16
+ hsl(228, 59%, 55%) calc(var(--space) * 9),
17
+ hsl(176, 54%, 49%) calc(var(--space) * 10),
18
+ hsl(93, 56%, 50%) calc(var(--space) * 11),
19
+ hsl(53, 65%, 60%) calc(var(--space) * 12)
20
+ ),
21
+ radial-gradient(
22
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
23
+ hsla(180, 100%, 89%, 0.5) 5%,
24
+ hsla(180, 14%, 57%, 0.3) 40%,
25
+ hsl(0, 0%, 0%) 130%
26
+ );
27
+
28
+ background-blend-mode: color-burn, multiply;
29
+
30
+ background-position:
31
+ var(--cosmosbg, center center),
32
+ calc(10% + (var(--pointer-from-left) * 80%)) calc(10% + (var(--pointer-from-top) * 80%)),
33
+ center center;
34
+
35
+ background-size:
36
+ cover,
37
+ 400% 900%,
38
+ cover;
39
+
40
+ filter: brightness(1) contrast(1) saturate(0.8);
41
+ mix-blend-mode: color-dodge;
42
+ }
43
+
44
+ .holo-card[data-effect="cosmos"] .holo-card__shine::before {
45
+ content: "";
46
+ z-index: 2;
47
+
48
+ background-image:
49
+ var(--hc-cosmos-middle),
50
+ repeating-linear-gradient(
51
+ 82deg,
52
+ hsl(53, 65%, 60%) calc(var(--space) * 1),
53
+ hsl(93, 56%, 50%) calc(var(--space) * 2),
54
+ hsl(176, 54%, 49%) calc(var(--space) * 3),
55
+ hsl(228, 59%, 55%) calc(var(--space) * 4),
56
+ hsl(283, 60%, 55%) calc(var(--space) * 5),
57
+ hsl(326, 59%, 51%) calc(var(--space) * 6),
58
+ hsl(326, 59%, 51%) calc(var(--space) * 7),
59
+ hsl(283, 60%, 55%) calc(var(--space) * 8),
60
+ hsl(228, 59%, 55%) calc(var(--space) * 9),
61
+ hsl(176, 54%, 49%) calc(var(--space) * 10),
62
+ hsl(93, 56%, 50%) calc(var(--space) * 11),
63
+ hsl(53, 65%, 60%) calc(var(--space) * 12)
64
+ );
65
+
66
+ background-blend-mode: lighten, multiply;
67
+
68
+ background-position:
69
+ var(--cosmosbg, center center),
70
+ calc(15% + (var(--pointer-from-left) * 70%)) calc(15% + (var(--pointer-from-top) * 70%)),
71
+ center center;
72
+
73
+ background-size:
74
+ cover,
75
+ 400% 900%,
76
+ cover;
77
+
78
+ filter: brightness(1.25) contrast(1.75) saturate(0.8);
79
+ mix-blend-mode: overlay;
80
+ }
81
+
82
+ .holo-card[data-effect="cosmos"] .holo-card__shine::after {
83
+ content: "";
84
+ z-index: 3;
85
+
86
+ background-image:
87
+ var(--hc-cosmos-top),
88
+ repeating-linear-gradient(
89
+ 82deg,
90
+ hsl(53, 65%, 60%) calc(var(--space) * 1),
91
+ hsl(93, 56%, 50%) calc(var(--space) * 2),
92
+ hsl(176, 54%, 49%) calc(var(--space) * 3),
93
+ hsl(228, 59%, 55%) calc(var(--space) * 4),
94
+ hsl(283, 60%, 55%) calc(var(--space) * 5),
95
+ hsl(326, 59%, 51%) calc(var(--space) * 6),
96
+ hsl(326, 59%, 51%) calc(var(--space) * 7),
97
+ hsl(283, 60%, 55%) calc(var(--space) * 8),
98
+ hsl(228, 59%, 55%) calc(var(--space) * 9),
99
+ hsl(176, 54%, 49%) calc(var(--space) * 10),
100
+ hsl(93, 56%, 50%) calc(var(--space) * 11),
101
+ hsl(53, 65%, 60%) calc(var(--space) * 12)
102
+ );
103
+
104
+ background-blend-mode: multiply, multiply;
105
+
106
+ background-position:
107
+ var(--cosmosbg, center center),
108
+ calc(20% + (var(--pointer-from-left) * 60%)) calc(20% + (var(--pointer-from-top) * 60%)),
109
+ center center;
110
+
111
+ background-size:
112
+ cover,
113
+ 400% 900%,
114
+ cover;
115
+
116
+ filter: brightness(1.25) contrast(1.75) saturate(0.8);
117
+ mix-blend-mode: multiply;
118
+ }
119
+
120
+ .holo-card[data-effect="cosmos"] .holo-card__glare {
121
+ background-image: radial-gradient(
122
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
123
+ hsla(204, 100%, 95%, 0.8) 5%,
124
+ hsla(250, 15%, 20%, 1) 150%
125
+ );
126
+ filter: brightness(0.75) contrast(2) saturate(2);
127
+ mix-blend-mode: overlay;
128
+ opacity: calc(var(--card-opacity) * (0.25 + var(--pointer-from-center)));
129
+ }
130
+
131
+ .holo-card[data-effect="cosmos"] .holo-card__glare::after {
132
+ content: "";
133
+
134
+ background-image: radial-gradient(
135
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
136
+ hsl(280, 100%, 96%) 5%,
137
+ hsl(0, 0%, 10%) 60%
138
+ );
139
+
140
+ filter: brightness(0.75) contrast(2.5) saturate(2);
141
+ mix-blend-mode: soft-light;
142
+ opacity: calc(1 - var(--pointer-from-top) * 0.75);
143
+ }
@@ -0,0 +1,103 @@
1
+ .holo-card[data-effect="glitter"] .holo-card__shine {
2
+ background-image:
3
+ var(--glitter), var(--glitter),
4
+ radial-gradient(
5
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
6
+ hsla(150, 20%, 10%, 1) 10%,
7
+ hsla(177, 22%, 80%, 0.1) 50%,
8
+ hsla(0, 0%, 95%, 0.98) 90%
9
+ );
10
+
11
+ background-size:
12
+ var(--glittersize) var(--glittersize),
13
+ var(--glittersize) var(--glittersize),
14
+ cover;
15
+ background-position:
16
+ 40% 45%,
17
+ 55% 55%,
18
+ center center;
19
+ background-blend-mode: soft-light, color-burn;
20
+ filter: brightness(1) contrast(1) saturate(0.9);
21
+ }
22
+
23
+ .holo-card[data-effect="glitter"] .holo-card__shine::before {
24
+ content: "";
25
+ mask-image: none !important;
26
+
27
+ background-image:
28
+ var(--foil),
29
+ radial-gradient(
30
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
31
+ hsla(50, 20%, 90%, 0.95) 10%,
32
+ rgba(181, 139, 164, 0.5) 50%,
33
+ hsl(0, 0%, 0%) 60%
34
+ );
35
+
36
+ background-size: cover, cover;
37
+ background-position:
38
+ center center,
39
+ center center;
40
+ background-blend-mode: color-burn;
41
+
42
+ mix-blend-mode: lighten;
43
+ filter: brightness(1) contrast(1) saturate(1);
44
+ opacity: 0.5;
45
+ }
46
+
47
+ .holo-card[data-effect="glitter"] .holo-card__shine::after {
48
+ content: "";
49
+ mask-image: none !important;
50
+
51
+ background-image: repeating-linear-gradient(
52
+ calc(var(--angle)),
53
+ var(--sunpillar-clr-1) calc(var(--space) * 1),
54
+ var(--sunpillar-clr-2) calc(var(--space) * 2),
55
+ var(--sunpillar-clr-3) calc(var(--space) * 3),
56
+ var(--sunpillar-clr-4) calc(var(--space) * 4),
57
+ var(--sunpillar-clr-5) calc(var(--space) * 5),
58
+ var(--sunpillar-clr-6) calc(var(--space) * 6),
59
+ var(--sunpillar-clr-1) calc(var(--space) * 7)
60
+ );
61
+
62
+ background-size: 400% 800%;
63
+ background-position: calc(50% + (50% - var(--background-x)) * 3) calc(50% + (50% - var(--background-y)) * 3);
64
+ filter: brightness(calc(0.75 - (var(--pointer-from-center) * 0.5))) contrast(1) saturate(1);
65
+ mix-blend-mode: saturation;
66
+ }
67
+
68
+ .holo-card[data-effect="glitter"]:not(.holo-card--masked) .holo-card__glare {
69
+ background-image: radial-gradient(
70
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
71
+ hsla(0, 0%, 100%, 1) 10%,
72
+ hsla(0, 0%, 100%, 0.85) 20%,
73
+ hsla(0, 0%, 0%, 0.35) 90%
74
+ );
75
+ mix-blend-mode: multiply;
76
+ }
77
+
78
+ .holo-card--masked[data-effect="glitter"] .holo-card__glare {
79
+ background-image: radial-gradient(
80
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
81
+ hsla(50, 20%, 90%, 0.45) 0%,
82
+ hsla(150, 20%, 30%, 0.45) 45%,
83
+ hsla(0, 0%, 0%, 0.9) 120%
84
+ );
85
+ filter: brightness(0.9) contrast(2);
86
+ }
87
+
88
+ .holo-card--masked[data-effect="glitter"] .holo-card__glare::after {
89
+ content: "";
90
+ mask-image: var(--mask);
91
+ mask-size: cover;
92
+
93
+ background-image: radial-gradient(
94
+ farthest-corner circle at var(--pointer-x) var(--pointer-y),
95
+ hsla(50, 20%, 90%, 0.75) 0%,
96
+ hsla(150, 20%, 30%, 0.65) 45%,
97
+ hsla(0, 0%, 0%, 1) 90%
98
+ );
99
+
100
+ filter: brightness(1) contrast(1.5);
101
+ mix-blend-mode: overlay;
102
+ opacity: 1;
103
+ }