@hyalo/angular 0.0.0-stage → 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.
- package/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +32 -3
- package/fesm2022/hyalo-angular-accordion.mjs +230 -0
- package/fesm2022/hyalo-angular-accordion.mjs.map +1 -0
- package/fesm2022/hyalo-angular-button.mjs +203 -0
- package/fesm2022/hyalo-angular-button.mjs.map +1 -0
- package/fesm2022/hyalo-angular-card.mjs +221 -0
- package/fesm2022/hyalo-angular-card.mjs.map +1 -0
- package/fesm2022/hyalo-angular-choice.mjs +788 -0
- package/fesm2022/hyalo-angular-choice.mjs.map +1 -0
- package/fesm2022/hyalo-angular-dialog.mjs +571 -0
- package/fesm2022/hyalo-angular-dialog.mjs.map +1 -0
- package/fesm2022/hyalo-angular-field.mjs +312 -0
- package/fesm2022/hyalo-angular-field.mjs.map +1 -0
- package/fesm2022/hyalo-angular-icon.mjs +343 -0
- package/fesm2022/hyalo-angular-icon.mjs.map +1 -0
- package/fesm2022/hyalo-angular-interaction.mjs +455 -0
- package/fesm2022/hyalo-angular-interaction.mjs.map +1 -0
- package/fesm2022/hyalo-angular-navbar.mjs +343 -0
- package/fesm2022/hyalo-angular-navbar.mjs.map +1 -0
- package/fesm2022/hyalo-angular-overlay.mjs +94 -0
- package/fesm2022/hyalo-angular-overlay.mjs.map +1 -0
- package/fesm2022/hyalo-angular-popover-overlay-kit-6wPwnxln.mjs +3 -0
- package/fesm2022/hyalo-angular-popover.mjs +487 -0
- package/fesm2022/hyalo-angular-popover.mjs.map +1 -0
- package/fesm2022/hyalo-angular-segmented.mjs +223 -0
- package/fesm2022/hyalo-angular-segmented.mjs.map +1 -0
- package/fesm2022/hyalo-angular-select.mjs +464 -0
- package/fesm2022/hyalo-angular-select.mjs.map +1 -0
- package/fesm2022/hyalo-angular-tabs.mjs +324 -0
- package/fesm2022/hyalo-angular-tabs.mjs.map +1 -0
- package/fesm2022/hyalo-angular-theme.mjs +94 -0
- package/fesm2022/hyalo-angular-theme.mjs.map +1 -0
- package/fesm2022/hyalo-angular-toast.mjs +322 -0
- package/fesm2022/hyalo-angular-toast.mjs.map +1 -0
- package/fesm2022/hyalo-angular.mjs +473 -0
- package/fesm2022/hyalo-angular.mjs.map +1 -0
- package/package.json +133 -3
- package/styles/hyalo-core.css +25 -0
- package/styles/hyalo.css +17 -0
- package/styles/overlays/dialog.css +9 -0
- package/styles/overlays/popover.css +9 -0
- package/styles/overlays/select.css +9 -0
- package/styles/overlays/toast.css +8 -0
- package/styles/palettes/aurora.css +47 -0
- package/styles/palettes/ember.css +47 -0
- package/styles/palettes/graphite.css +47 -0
- package/styles/palettes/ocean.css +47 -0
- package/styles/palettes/orchid.css +47 -0
- package/styles/palettes/rose.css +47 -0
- package/styles/parts/card.css +49 -0
- package/styles/parts/dialog.css +116 -0
- package/styles/parts/drawer.css +124 -0
- package/styles/parts/field.css +36 -0
- package/styles/parts/glass.css +137 -0
- package/styles/parts/motion.css +82 -0
- package/styles/parts/navbar.css +55 -0
- package/styles/parts/popover.css +27 -0
- package/styles/parts/presence.css +55 -0
- package/styles/parts/reset.css +42 -0
- package/styles/parts/select.css +46 -0
- package/styles/parts/themes.css +105 -0
- package/styles/parts/toast.css +128 -0
- package/styles/parts/tokens.css +151 -0
- package/styles/parts/typography.css +64 -0
- package/types/hyalo-angular-accordion.d.ts +74 -0
- package/types/hyalo-angular-button.d.ts +88 -0
- package/types/hyalo-angular-card.d.ts +61 -0
- package/types/hyalo-angular-choice.d.ts +259 -0
- package/types/hyalo-angular-dialog.d.ts +170 -0
- package/types/hyalo-angular-field.d.ts +135 -0
- package/types/hyalo-angular-icon.d.ts +122 -0
- package/types/hyalo-angular-interaction.d.ts +131 -0
- package/types/hyalo-angular-navbar.d.ts +110 -0
- package/types/hyalo-angular-overlay.d.ts +31 -0
- package/types/hyalo-angular-popover.d.ts +142 -0
- package/types/hyalo-angular-segmented.d.ts +79 -0
- package/types/hyalo-angular-select.d.ts +130 -0
- package/types/hyalo-angular-tabs.d.ts +102 -0
- package/types/hyalo-angular-theme.d.ts +46 -0
- package/types/hyalo-angular-toast.d.ts +79 -0
- package/types/hyalo-angular.d.ts +345 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import { DestroyRef, Directive, ElementRef, afterNextRender, booleanAttribute, inject, input, numberAttribute } from "@angular/core";
|
|
3
|
+
import { HyMotion, MOTION, ɵmatchesMedia } from "@hyalo/angular";
|
|
4
|
+
var HyReveal = class HyReveal {
|
|
5
|
+
el = inject(ElementRef).nativeElement;
|
|
6
|
+
motion = inject(HyMotion);
|
|
7
|
+
revealDelay = input(0, {
|
|
8
|
+
...ngDevMode ? { debugName: "revealDelay" } : /* istanbul ignore next */ {},
|
|
9
|
+
transform: numberAttribute
|
|
10
|
+
});
|
|
11
|
+
revealFrom = input("up", ...ngDevMode ? [{ debugName: "revealFrom" }] : /* istanbul ignore next */ []);
|
|
12
|
+
revealRepeat = input(false, {
|
|
13
|
+
...ngDevMode ? { debugName: "revealRepeat" } : /* istanbul ignore next */ {},
|
|
14
|
+
transform: booleanAttribute
|
|
15
|
+
});
|
|
16
|
+
constructor() {
|
|
17
|
+
const destroyRef = inject(DestroyRef);
|
|
18
|
+
afterNextRender(() => {
|
|
19
|
+
if (this.motion.reduced() || typeof IntersectionObserver !== "function") return;
|
|
20
|
+
let first = true;
|
|
21
|
+
const observer = new IntersectionObserver(([entry]) => {
|
|
22
|
+
if (!entry) return;
|
|
23
|
+
if (first) {
|
|
24
|
+
first = false;
|
|
25
|
+
if (entry.isIntersecting) {
|
|
26
|
+
if (!this.revealRepeat()) observer.disconnect();
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.el.setAttribute("data-hy-reveal-from", this.revealFrom());
|
|
30
|
+
this.el.setAttribute("data-hy-reveal", "hidden");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (entry.isIntersecting) {
|
|
34
|
+
this.el.setAttribute("data-hy-reveal", "shown");
|
|
35
|
+
if (!this.revealRepeat()) observer.disconnect();
|
|
36
|
+
} else if (this.revealRepeat()) this.el.setAttribute("data-hy-reveal", "hidden");
|
|
37
|
+
}, { rootMargin: "0px 0px -8% 0px" });
|
|
38
|
+
observer.observe(this.el);
|
|
39
|
+
destroyRef.onDestroy(() => observer.disconnect());
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
43
|
+
minVersion: "12.0.0",
|
|
44
|
+
version: "22.2.3",
|
|
45
|
+
ngImport: i0,
|
|
46
|
+
type: HyReveal,
|
|
47
|
+
deps: [],
|
|
48
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
49
|
+
});
|
|
50
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
51
|
+
minVersion: "17.1.0",
|
|
52
|
+
version: "22.2.3",
|
|
53
|
+
type: HyReveal,
|
|
54
|
+
isStandalone: true,
|
|
55
|
+
selector: "[hyReveal]",
|
|
56
|
+
inputs: {
|
|
57
|
+
revealDelay: {
|
|
58
|
+
classPropertyName: "revealDelay",
|
|
59
|
+
publicName: "revealDelay",
|
|
60
|
+
isSignal: true,
|
|
61
|
+
isRequired: false,
|
|
62
|
+
transformFunction: null
|
|
63
|
+
},
|
|
64
|
+
revealFrom: {
|
|
65
|
+
classPropertyName: "revealFrom",
|
|
66
|
+
publicName: "revealFrom",
|
|
67
|
+
isSignal: true,
|
|
68
|
+
isRequired: false,
|
|
69
|
+
transformFunction: null
|
|
70
|
+
},
|
|
71
|
+
revealRepeat: {
|
|
72
|
+
classPropertyName: "revealRepeat",
|
|
73
|
+
publicName: "revealRepeat",
|
|
74
|
+
isSignal: true,
|
|
75
|
+
isRequired: false,
|
|
76
|
+
transformFunction: null
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
host: { properties: { "style.--hy-reveal-delay.ms": "revealDelay()" } },
|
|
80
|
+
ngImport: i0
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
84
|
+
minVersion: "12.0.0",
|
|
85
|
+
version: "22.2.3",
|
|
86
|
+
ngImport: i0,
|
|
87
|
+
type: HyReveal,
|
|
88
|
+
decorators: [{
|
|
89
|
+
type: Directive,
|
|
90
|
+
args: [{
|
|
91
|
+
selector: "[hyReveal]",
|
|
92
|
+
host: { "[style.--hy-reveal-delay.ms]": "revealDelay()" }
|
|
93
|
+
}]
|
|
94
|
+
}],
|
|
95
|
+
ctorParameters: () => [],
|
|
96
|
+
propDecorators: {
|
|
97
|
+
revealDelay: [{
|
|
98
|
+
type: i0.Input,
|
|
99
|
+
args: [{
|
|
100
|
+
isSignal: true,
|
|
101
|
+
alias: "revealDelay",
|
|
102
|
+
required: false
|
|
103
|
+
}]
|
|
104
|
+
}],
|
|
105
|
+
revealFrom: [{
|
|
106
|
+
type: i0.Input,
|
|
107
|
+
args: [{
|
|
108
|
+
isSignal: true,
|
|
109
|
+
alias: "revealFrom",
|
|
110
|
+
required: false
|
|
111
|
+
}]
|
|
112
|
+
}],
|
|
113
|
+
revealRepeat: [{
|
|
114
|
+
type: i0.Input,
|
|
115
|
+
args: [{
|
|
116
|
+
isSignal: true,
|
|
117
|
+
alias: "revealRepeat",
|
|
118
|
+
required: false
|
|
119
|
+
}]
|
|
120
|
+
}]
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
function bindPointer(handlers) {
|
|
124
|
+
const host = inject(ElementRef).nativeElement;
|
|
125
|
+
const motion = inject(HyMotion);
|
|
126
|
+
const destroyRef = inject(DestroyRef);
|
|
127
|
+
afterNextRender(() => {
|
|
128
|
+
if (!ɵmatchesMedia("(hover: hover) and (pointer: fine)")) return;
|
|
129
|
+
const h = handlers();
|
|
130
|
+
let rect = null;
|
|
131
|
+
let active = false;
|
|
132
|
+
const enter = (event) => {
|
|
133
|
+
if (!motion.enabled() || event.pointerType === "touch") return;
|
|
134
|
+
active = true;
|
|
135
|
+
rect = host.getBoundingClientRect();
|
|
136
|
+
h.enter?.(event, rect);
|
|
137
|
+
};
|
|
138
|
+
const move = (event) => {
|
|
139
|
+
if (!active) return enter(event);
|
|
140
|
+
if (!rect) return;
|
|
141
|
+
h.move(event, rect);
|
|
142
|
+
};
|
|
143
|
+
const leave = () => {
|
|
144
|
+
if (!active) return;
|
|
145
|
+
active = false;
|
|
146
|
+
rect = null;
|
|
147
|
+
h.leave?.();
|
|
148
|
+
};
|
|
149
|
+
host.addEventListener("pointerenter", enter, { passive: true });
|
|
150
|
+
host.addEventListener("pointermove", move, { passive: true });
|
|
151
|
+
host.addEventListener("pointerleave", leave, { passive: true });
|
|
152
|
+
destroyRef.onDestroy(() => {
|
|
153
|
+
host.removeEventListener("pointerenter", enter);
|
|
154
|
+
host.removeEventListener("pointermove", move);
|
|
155
|
+
host.removeEventListener("pointerleave", leave);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function cssVarSetter(el, name, unit, motion, vars) {
|
|
160
|
+
let quick = null;
|
|
161
|
+
motion.gsap().then((gsap) => {
|
|
162
|
+
if (!gsap) return;
|
|
163
|
+
el.classList.add("hy-gsap");
|
|
164
|
+
quick = gsap.quickTo(el, name, {
|
|
165
|
+
...vars,
|
|
166
|
+
unit
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
return (value) => {
|
|
170
|
+
if (quick) quick(value);
|
|
171
|
+
else el.style.setProperty(name, `${value}${unit}`);
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
var HyTilt = class HyTilt {
|
|
175
|
+
el = inject(ElementRef).nativeElement;
|
|
176
|
+
motion = inject(HyMotion);
|
|
177
|
+
tiltMax = input(6, {
|
|
178
|
+
...ngDevMode ? { debugName: "tiltMax" } : /* istanbul ignore next */ {},
|
|
179
|
+
transform: numberAttribute
|
|
180
|
+
});
|
|
181
|
+
tiltGlow = input(true, {
|
|
182
|
+
...ngDevMode ? { debugName: "tiltGlow" } : /* istanbul ignore next */ {},
|
|
183
|
+
transform: booleanAttribute
|
|
184
|
+
});
|
|
185
|
+
constructor() {
|
|
186
|
+
bindPointer(() => {
|
|
187
|
+
const vars = {
|
|
188
|
+
duration: MOTION.settle.duration,
|
|
189
|
+
ease: MOTION.settle.ease
|
|
190
|
+
};
|
|
191
|
+
const rx = cssVarSetter(this.el, "--hy-rx", "deg", this.motion, vars);
|
|
192
|
+
const ry = cssVarSetter(this.el, "--hy-ry", "deg", this.motion, vars);
|
|
193
|
+
return {
|
|
194
|
+
enter: () => {
|
|
195
|
+
if (this.tiltGlow()) this.el.style.setProperty("--hy-glow", "0.32");
|
|
196
|
+
},
|
|
197
|
+
move: (event, rect) => {
|
|
198
|
+
const x = (event.clientX - rect.left) / rect.width;
|
|
199
|
+
const y = (event.clientY - rect.top) / rect.height;
|
|
200
|
+
const max = this.tiltMax();
|
|
201
|
+
ry((x - .5) * 2 * max);
|
|
202
|
+
rx((.5 - y) * 2 * max);
|
|
203
|
+
this.el.style.setProperty("--hy-px", `${(x * 100).toFixed(1)}%`);
|
|
204
|
+
this.el.style.setProperty("--hy-py", `${(y * 100).toFixed(1)}%`);
|
|
205
|
+
},
|
|
206
|
+
leave: () => {
|
|
207
|
+
rx(0);
|
|
208
|
+
ry(0);
|
|
209
|
+
this.el.style.setProperty("--hy-glow", "0");
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
215
|
+
minVersion: "12.0.0",
|
|
216
|
+
version: "22.2.3",
|
|
217
|
+
ngImport: i0,
|
|
218
|
+
type: HyTilt,
|
|
219
|
+
deps: [],
|
|
220
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
221
|
+
});
|
|
222
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
223
|
+
minVersion: "17.1.0",
|
|
224
|
+
version: "22.2.3",
|
|
225
|
+
type: HyTilt,
|
|
226
|
+
isStandalone: true,
|
|
227
|
+
selector: "[hyTilt]",
|
|
228
|
+
inputs: {
|
|
229
|
+
tiltMax: {
|
|
230
|
+
classPropertyName: "tiltMax",
|
|
231
|
+
publicName: "tiltMax",
|
|
232
|
+
isSignal: true,
|
|
233
|
+
isRequired: false,
|
|
234
|
+
transformFunction: null
|
|
235
|
+
},
|
|
236
|
+
tiltGlow: {
|
|
237
|
+
classPropertyName: "tiltGlow",
|
|
238
|
+
publicName: "tiltGlow",
|
|
239
|
+
isSignal: true,
|
|
240
|
+
isRequired: false,
|
|
241
|
+
transformFunction: null
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
host: { classAttribute: "hy-tilt" },
|
|
245
|
+
ngImport: i0
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
249
|
+
minVersion: "12.0.0",
|
|
250
|
+
version: "22.2.3",
|
|
251
|
+
ngImport: i0,
|
|
252
|
+
type: HyTilt,
|
|
253
|
+
decorators: [{
|
|
254
|
+
type: Directive,
|
|
255
|
+
args: [{
|
|
256
|
+
selector: "[hyTilt]",
|
|
257
|
+
host: { class: "hy-tilt" }
|
|
258
|
+
}]
|
|
259
|
+
}],
|
|
260
|
+
ctorParameters: () => [],
|
|
261
|
+
propDecorators: {
|
|
262
|
+
tiltMax: [{
|
|
263
|
+
type: i0.Input,
|
|
264
|
+
args: [{
|
|
265
|
+
isSignal: true,
|
|
266
|
+
alias: "tiltMax",
|
|
267
|
+
required: false
|
|
268
|
+
}]
|
|
269
|
+
}],
|
|
270
|
+
tiltGlow: [{
|
|
271
|
+
type: i0.Input,
|
|
272
|
+
args: [{
|
|
273
|
+
isSignal: true,
|
|
274
|
+
alias: "tiltGlow",
|
|
275
|
+
required: false
|
|
276
|
+
}]
|
|
277
|
+
}]
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
var HyMagnetic = class HyMagnetic {
|
|
281
|
+
el = inject(ElementRef).nativeElement;
|
|
282
|
+
motion = inject(HyMotion);
|
|
283
|
+
magneticStrength = input(.3, {
|
|
284
|
+
...ngDevMode ? { debugName: "magneticStrength" } : /* istanbul ignore next */ {},
|
|
285
|
+
transform: numberAttribute
|
|
286
|
+
});
|
|
287
|
+
magneticMax = input(10, {
|
|
288
|
+
...ngDevMode ? { debugName: "magneticMax" } : /* istanbul ignore next */ {},
|
|
289
|
+
transform: numberAttribute
|
|
290
|
+
});
|
|
291
|
+
constructor() {
|
|
292
|
+
bindPointer(() => {
|
|
293
|
+
const vars = {
|
|
294
|
+
duration: MOTION.settle.duration,
|
|
295
|
+
ease: MOTION.settle.ease
|
|
296
|
+
};
|
|
297
|
+
const mx = cssVarSetter(this.el, "--hy-mx", "px", this.motion, vars);
|
|
298
|
+
const my = cssVarSetter(this.el, "--hy-my", "px", this.motion, vars);
|
|
299
|
+
const clamp = (v) => Math.max(-this.magneticMax(), Math.min(this.magneticMax(), v));
|
|
300
|
+
return {
|
|
301
|
+
move: (event, rect) => {
|
|
302
|
+
const strength = this.magneticStrength();
|
|
303
|
+
mx(clamp((event.clientX - rect.left - rect.width / 2) * strength));
|
|
304
|
+
my(clamp((event.clientY - rect.top - rect.height / 2) * strength));
|
|
305
|
+
},
|
|
306
|
+
leave: () => {
|
|
307
|
+
mx(0);
|
|
308
|
+
my(0);
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
314
|
+
minVersion: "12.0.0",
|
|
315
|
+
version: "22.2.3",
|
|
316
|
+
ngImport: i0,
|
|
317
|
+
type: HyMagnetic,
|
|
318
|
+
deps: [],
|
|
319
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
320
|
+
});
|
|
321
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
322
|
+
minVersion: "17.1.0",
|
|
323
|
+
version: "22.2.3",
|
|
324
|
+
type: HyMagnetic,
|
|
325
|
+
isStandalone: true,
|
|
326
|
+
selector: "[hyMagnetic]",
|
|
327
|
+
inputs: {
|
|
328
|
+
magneticStrength: {
|
|
329
|
+
classPropertyName: "magneticStrength",
|
|
330
|
+
publicName: "magneticStrength",
|
|
331
|
+
isSignal: true,
|
|
332
|
+
isRequired: false,
|
|
333
|
+
transformFunction: null
|
|
334
|
+
},
|
|
335
|
+
magneticMax: {
|
|
336
|
+
classPropertyName: "magneticMax",
|
|
337
|
+
publicName: "magneticMax",
|
|
338
|
+
isSignal: true,
|
|
339
|
+
isRequired: false,
|
|
340
|
+
transformFunction: null
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
host: { classAttribute: "hy-magnetic" },
|
|
344
|
+
ngImport: i0
|
|
345
|
+
});
|
|
346
|
+
};
|
|
347
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
348
|
+
minVersion: "12.0.0",
|
|
349
|
+
version: "22.2.3",
|
|
350
|
+
ngImport: i0,
|
|
351
|
+
type: HyMagnetic,
|
|
352
|
+
decorators: [{
|
|
353
|
+
type: Directive,
|
|
354
|
+
args: [{
|
|
355
|
+
selector: "[hyMagnetic]",
|
|
356
|
+
host: { class: "hy-magnetic" }
|
|
357
|
+
}]
|
|
358
|
+
}],
|
|
359
|
+
ctorParameters: () => [],
|
|
360
|
+
propDecorators: {
|
|
361
|
+
magneticStrength: [{
|
|
362
|
+
type: i0.Input,
|
|
363
|
+
args: [{
|
|
364
|
+
isSignal: true,
|
|
365
|
+
alias: "magneticStrength",
|
|
366
|
+
required: false
|
|
367
|
+
}]
|
|
368
|
+
}],
|
|
369
|
+
magneticMax: [{
|
|
370
|
+
type: i0.Input,
|
|
371
|
+
args: [{
|
|
372
|
+
isSignal: true,
|
|
373
|
+
alias: "magneticMax",
|
|
374
|
+
required: false
|
|
375
|
+
}]
|
|
376
|
+
}]
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
var HyRipple = class HyRipple {
|
|
380
|
+
el = inject(ElementRef).nativeElement;
|
|
381
|
+
motion = inject(HyMotion);
|
|
382
|
+
rippleDisabled = input(false, {
|
|
383
|
+
...ngDevMode ? { debugName: "rippleDisabled" } : /* istanbul ignore next */ {},
|
|
384
|
+
transform: booleanAttribute
|
|
385
|
+
});
|
|
386
|
+
constructor() {
|
|
387
|
+
const destroyRef = inject(DestroyRef);
|
|
388
|
+
afterNextRender(() => {
|
|
389
|
+
const down = (event) => {
|
|
390
|
+
if (this.rippleDisabled() || this.motion.reduced() || event.button !== 0) return;
|
|
391
|
+
const rect = this.el.getBoundingClientRect();
|
|
392
|
+
const size = Math.hypot(rect.width, rect.height) * 2;
|
|
393
|
+
const wave = this.el.ownerDocument.createElement("span");
|
|
394
|
+
wave.className = "hy-ripple";
|
|
395
|
+
wave.setAttribute("aria-hidden", "true");
|
|
396
|
+
wave.style.setProperty("--hy-ripple-size", `${size}px`);
|
|
397
|
+
wave.style.setProperty("--hy-ripple-x", `${event.clientX - rect.left}px`);
|
|
398
|
+
wave.style.setProperty("--hy-ripple-y", `${event.clientY - rect.top}px`);
|
|
399
|
+
wave.addEventListener("animationend", () => wave.remove(), { once: true });
|
|
400
|
+
this.el.appendChild(wave);
|
|
401
|
+
};
|
|
402
|
+
this.el.addEventListener("pointerdown", down, { passive: true });
|
|
403
|
+
destroyRef.onDestroy(() => this.el.removeEventListener("pointerdown", down));
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
407
|
+
minVersion: "12.0.0",
|
|
408
|
+
version: "22.2.3",
|
|
409
|
+
ngImport: i0,
|
|
410
|
+
type: HyRipple,
|
|
411
|
+
deps: [],
|
|
412
|
+
target: i0.ɵɵFactoryTarget.Directive
|
|
413
|
+
});
|
|
414
|
+
static ɵdir = i0.ɵɵngDeclareDirective({
|
|
415
|
+
minVersion: "17.1.0",
|
|
416
|
+
version: "22.2.3",
|
|
417
|
+
type: HyRipple,
|
|
418
|
+
isStandalone: true,
|
|
419
|
+
selector: "[hyRipple]",
|
|
420
|
+
inputs: { rippleDisabled: {
|
|
421
|
+
classPropertyName: "rippleDisabled",
|
|
422
|
+
publicName: "rippleDisabled",
|
|
423
|
+
isSignal: true,
|
|
424
|
+
isRequired: false,
|
|
425
|
+
transformFunction: null
|
|
426
|
+
} },
|
|
427
|
+
host: { classAttribute: "hy-ripple-host" },
|
|
428
|
+
ngImport: i0
|
|
429
|
+
});
|
|
430
|
+
};
|
|
431
|
+
i0.ɵɵngDeclareClassMetadata({
|
|
432
|
+
minVersion: "12.0.0",
|
|
433
|
+
version: "22.2.3",
|
|
434
|
+
ngImport: i0,
|
|
435
|
+
type: HyRipple,
|
|
436
|
+
decorators: [{
|
|
437
|
+
type: Directive,
|
|
438
|
+
args: [{
|
|
439
|
+
selector: "[hyRipple]",
|
|
440
|
+
host: { class: "hy-ripple-host" }
|
|
441
|
+
}]
|
|
442
|
+
}],
|
|
443
|
+
ctorParameters: () => [],
|
|
444
|
+
propDecorators: { rippleDisabled: [{
|
|
445
|
+
type: i0.Input,
|
|
446
|
+
args: [{
|
|
447
|
+
isSignal: true,
|
|
448
|
+
alias: "rippleDisabled",
|
|
449
|
+
required: false
|
|
450
|
+
}]
|
|
451
|
+
}] }
|
|
452
|
+
});
|
|
453
|
+
export { HyMagnetic, HyReveal, HyRipple, HyTilt };
|
|
454
|
+
|
|
455
|
+
//# sourceMappingURL=hyalo-angular-interaction.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hyalo-angular-interaction.mjs","names":["matchesMedia"],"sources":["../../../projects/hyalo/interaction/reveal.ts","../../../projects/hyalo/interaction/pointer.ts","../../../projects/hyalo/interaction/tilt.ts","../../../projects/hyalo/interaction/magnetic.ts","../../../projects/hyalo/interaction/ripple.ts"],"sourcesContent":["import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { HyMotion } from '@hyalo/angular';\r\n\r\n/** Where a revealed element comes from. */\r\nexport type HyRevealFrom = 'up' | 'fade' | 'scale';\r\n\r\n/**\r\n * Fades and lifts an element in when it scrolls into view.\r\n *\r\n * ```html\r\n * @for (item of items; track item.id; let i = $index) {\r\n * <article hyReveal [revealDelay]=\"i * 60\">...</article>\r\n * }\r\n * ```\r\n *\r\n * Content is never hidden by default. The directive only hides an element\r\n * after hydration, only when it is below the fold, and only when motion is\r\n * enabled. Elements already on screen are left alone, so server-rendered\r\n * content does not flash. CSS transitions do the work, so it also runs on the\r\n * low tier when reduced motion is off.\r\n *\r\n * Put it on the glass element itself (`<hy-card hyReveal>`), not on a\r\n * wrapper around glass. While a wrapper fades, its glass children cannot\r\n * blur what is behind it, and the blur snaps in when the fade ends.\r\n */\r\n@Directive({\r\n selector: '[hyReveal]',\r\n host: { '[style.--hy-reveal-delay.ms]': 'revealDelay()' },\r\n})\r\nexport class HyReveal {\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private readonly motion = inject(HyMotion);\r\n\r\n /** Delay in milliseconds, for staggering. */\r\n readonly revealDelay = input(0, { transform: numberAttribute });\r\n /** The starting pose. */\r\n readonly revealFrom = input<HyRevealFrom>('up');\r\n /** Reveal again each time the element re-enters the viewport. */\r\n readonly revealRepeat = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n if (this.motion.reduced() || typeof IntersectionObserver !== 'function') return;\r\n let first = true;\r\n const observer = new IntersectionObserver(\r\n ([entry]) => {\r\n if (!entry) return;\r\n if (first) {\r\n first = false;\r\n if (entry.isIntersecting) {\r\n if (!this.revealRepeat()) observer.disconnect();\r\n return;\r\n }\r\n this.el.setAttribute('data-hy-reveal-from', this.revealFrom());\r\n this.el.setAttribute('data-hy-reveal', 'hidden');\r\n return;\r\n }\r\n if (entry.isIntersecting) {\r\n this.el.setAttribute('data-hy-reveal', 'shown');\r\n if (!this.revealRepeat()) observer.disconnect();\r\n } else if (this.revealRepeat()) {\r\n this.el.setAttribute('data-hy-reveal', 'hidden');\r\n }\r\n },\r\n { rootMargin: '0px 0px -8% 0px' },\r\n );\r\n observer.observe(this.el);\r\n destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n}\r\n","import { DestroyRef, ElementRef, afterNextRender, inject } from '@angular/core';\r\nimport { HyMotion, ɵmatchesMedia as matchesMedia } from '@hyalo/angular';\r\n\r\n/** Handlers that run outside change detection. */\r\nexport interface PointerHandlers {\r\n enter?(event: PointerEvent, rect: DOMRect): void;\r\n move(event: PointerEvent, rect: DOMRect): void;\r\n leave?(): void;\r\n}\r\n\r\n/**\r\n * Wires pointer listeners straight to the DOM, so high-frequency\r\n * `pointermove` events never schedule change detection. Listeners are only\r\n * attached on devices with a fine pointer, and they do nothing while motion\r\n * is disabled.\r\n */\r\nexport function bindPointer(handlers: () => PointerHandlers): void {\r\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n const motion = inject(HyMotion);\r\n const destroyRef = inject(DestroyRef);\r\n\r\n afterNextRender(() => {\r\n if (!matchesMedia('(hover: hover) and (pointer: fine)')) return;\r\n const h = handlers();\r\n let rect: DOMRect | null = null;\r\n let active = false;\r\n\r\n const enter = (event: PointerEvent): void => {\r\n if (!motion.enabled() || event.pointerType === 'touch') return;\r\n active = true;\r\n rect = host.getBoundingClientRect();\r\n h.enter?.(event, rect);\r\n };\r\n const move = (event: PointerEvent): void => {\r\n if (!active) return enter(event);\r\n if (!rect) return;\r\n h.move(event, rect);\r\n };\r\n const leave = (): void => {\r\n if (!active) return;\r\n active = false;\r\n rect = null;\r\n h.leave?.();\r\n };\r\n\r\n host.addEventListener('pointerenter', enter, { passive: true });\r\n host.addEventListener('pointermove', move, { passive: true });\r\n host.addEventListener('pointerleave', leave, { passive: true });\r\n destroyRef.onDestroy(() => {\r\n host.removeEventListener('pointerenter', enter);\r\n host.removeEventListener('pointermove', move);\r\n host.removeEventListener('pointerleave', leave);\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * Returns a setter for one CSS custom property. Uses GSAP `quickTo` when GSAP\r\n * is available, so values glide, and a plain `style.setProperty` otherwise,\r\n * where a CSS transition does the smoothing.\r\n */\r\nexport function cssVarSetter(\r\n el: HTMLElement,\r\n name: string,\r\n unit: string,\r\n motion: HyMotion,\r\n vars: Record<string, unknown>,\r\n): (value: number) => void {\r\n let quick: ((value: number) => unknown) | null = null;\r\n void motion.gsap().then((gsap) => {\r\n if (!gsap) return;\r\n el.classList.add('hy-gsap');\r\n quick = gsap.quickTo(el, name, { ...vars, unit });\r\n });\r\n return (value) => {\r\n if (quick) quick(value);\r\n else el.style.setProperty(name, `${value}${unit}`);\r\n };\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n booleanAttribute,\r\n inject,\r\n input,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { HyMotion, MOTION } from '@hyalo/angular';\r\n\r\nimport { bindPointer, cssVarSetter } from './pointer';\r\n\r\n/**\r\n * Tilts the element toward the cursor and moves a soft glow under it.\r\n *\r\n * ```html\r\n * <hy-card hyTilt [tiltMax]=\"8\">...</hy-card>\r\n * ```\r\n *\r\n * Runs only with a fine pointer, with motion enabled and above the low\r\n * fidelity tier. The glow uses `--hy-px`, `--hy-py` and `--hy-glow`, which the\r\n * glass material already reads.\r\n */\r\n@Directive({\r\n selector: '[hyTilt]',\r\n host: { class: 'hy-tilt' },\r\n})\r\nexport class HyTilt {\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private readonly motion = inject(HyMotion);\r\n\r\n /** Maximum rotation in degrees. */\r\n readonly tiltMax = input(6, { transform: numberAttribute });\r\n /** Whether to show the pointer glow. */\r\n readonly tiltGlow = input(true, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n bindPointer(() => {\r\n const vars = { duration: MOTION.settle.duration, ease: MOTION.settle.ease };\r\n const rx = cssVarSetter(this.el, '--hy-rx', 'deg', this.motion, vars);\r\n const ry = cssVarSetter(this.el, '--hy-ry', 'deg', this.motion, vars);\r\n return {\r\n enter: () => {\r\n if (this.tiltGlow()) this.el.style.setProperty('--hy-glow', '0.32');\r\n },\r\n move: (event, rect) => {\r\n const x = (event.clientX - rect.left) / rect.width;\r\n const y = (event.clientY - rect.top) / rect.height;\r\n const max = this.tiltMax();\r\n ry((x - 0.5) * 2 * max);\r\n rx((0.5 - y) * 2 * max);\r\n this.el.style.setProperty('--hy-px', `${(x * 100).toFixed(1)}%`);\r\n this.el.style.setProperty('--hy-py', `${(y * 100).toFixed(1)}%`);\r\n },\r\n leave: () => {\r\n rx(0);\r\n ry(0);\r\n this.el.style.setProperty('--hy-glow', '0');\r\n },\r\n };\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, inject, input, numberAttribute } from '@angular/core';\r\nimport { HyMotion, MOTION } from '@hyalo/angular';\r\n\r\nimport { bindPointer, cssVarSetter } from './pointer';\r\n\r\n/**\r\n * Pulls the element a little toward the cursor while it hovers.\r\n *\r\n * Uses the `translate` property, so it never fights with a `transform` the\r\n * element already has.\r\n */\r\n@Directive({\r\n selector: '[hyMagnetic]',\r\n host: { class: 'hy-magnetic' },\r\n})\r\nexport class HyMagnetic {\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private readonly motion = inject(HyMotion);\r\n\r\n /** How far the element follows the cursor, as a share of the distance. */\r\n readonly magneticStrength = input(0.3, { transform: numberAttribute });\r\n /** Upper limit for the offset in pixels. */\r\n readonly magneticMax = input(10, { transform: numberAttribute });\r\n\r\n constructor() {\r\n bindPointer(() => {\r\n const vars = { duration: MOTION.settle.duration, ease: MOTION.settle.ease };\r\n const mx = cssVarSetter(this.el, '--hy-mx', 'px', this.motion, vars);\r\n const my = cssVarSetter(this.el, '--hy-my', 'px', this.motion, vars);\r\n const clamp = (v: number): number =>\r\n Math.max(-this.magneticMax(), Math.min(this.magneticMax(), v));\r\n return {\r\n move: (event, rect) => {\r\n const strength = this.magneticStrength();\r\n mx(clamp((event.clientX - rect.left - rect.width / 2) * strength));\r\n my(clamp((event.clientY - rect.top - rect.height / 2) * strength));\r\n },\r\n leave: () => {\r\n mx(0);\r\n my(0);\r\n },\r\n };\r\n });\r\n }\r\n}\r\n","import {\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n afterNextRender,\r\n booleanAttribute,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { HyMotion } from '@hyalo/angular';\r\n\r\n/**\r\n * A soft light ripple from the press point. Purely decorative: it is\r\n * skipped with reduced motion and never affects layout.\r\n */\r\n@Directive({\r\n selector: '[hyRipple]',\r\n host: { class: 'hy-ripple-host' },\r\n})\r\nexport class HyRipple {\r\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\r\n private readonly motion = inject(HyMotion);\r\n\r\n /** Turns the ripple off without removing the directive. */\r\n readonly rippleDisabled = input(false, { transform: booleanAttribute });\r\n\r\n constructor() {\r\n const destroyRef = inject(DestroyRef);\r\n afterNextRender(() => {\r\n const down = (event: PointerEvent): void => {\r\n if (this.rippleDisabled() || this.motion.reduced() || event.button !== 0) return;\r\n const rect = this.el.getBoundingClientRect();\r\n const size = Math.hypot(rect.width, rect.height) * 2;\r\n const wave = this.el.ownerDocument.createElement('span');\r\n wave.className = 'hy-ripple';\r\n wave.setAttribute('aria-hidden', 'true');\r\n wave.style.setProperty('--hy-ripple-size', `${size}px`);\r\n wave.style.setProperty('--hy-ripple-x', `${event.clientX - rect.left}px`);\r\n wave.style.setProperty('--hy-ripple-y', `${event.clientY - rect.top}px`);\r\n wave.addEventListener('animationend', () => wave.remove(), { once: true });\r\n this.el.appendChild(wave);\r\n };\r\n this.el.addEventListener('pointerdown', down, { passive: true });\r\n destroyRef.onDestroy(() => this.el.removeEventListener('pointerdown', down));\r\n });\r\n }\r\n}\r\n"],"mappings":"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"}
|