@praxisjs/composables 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/CHANGELOG.md +10 -0
- package/dist/__tests__/browser.test.js +139 -0
- package/dist/__tests__/browser.test.js.map +1 -1
- package/dist/__tests__/dom.test.js +120 -0
- package/dist/__tests__/dom.test.js.map +1 -1
- package/dist/__tests__/utilities.test.js +43 -0
- package/dist/__tests__/utilities.test.js.map +1 -1
- package/dist/browser.d.ts +10 -17
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +33 -8
- package/dist/browser.js.map +1 -1
- package/dist/dom.d.ts +10 -18
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +20 -5
- package/dist/dom.js.map +1 -1
- package/dist/utilities.d.ts +4 -0
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +16 -1
- package/dist/utilities.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/browser.test.ts +160 -0
- package/src/__tests__/dom.test.ts +144 -0
- package/src/__tests__/utilities.test.ts +62 -0
- package/src/browser.ts +35 -8
- package/src/dom.ts +21 -5
- package/src/utilities.ts +19 -1
package/dist/browser.js
CHANGED
|
@@ -6,11 +6,14 @@ export class MediaQuery extends Composable {
|
|
|
6
6
|
this.query = query;
|
|
7
7
|
}
|
|
8
8
|
setup() {
|
|
9
|
+
if (this._view)
|
|
10
|
+
return this._view;
|
|
9
11
|
this._mql = window.matchMedia(this.query);
|
|
10
12
|
const matches = signal(this._mql.matches);
|
|
11
13
|
this._handler = (e) => { matches.set(e.matches); };
|
|
12
14
|
this._mql.addEventListener("change", this._handler);
|
|
13
|
-
|
|
15
|
+
this._view = { matches };
|
|
16
|
+
return this._view;
|
|
14
17
|
}
|
|
15
18
|
onUnmount() {
|
|
16
19
|
if (this._mql && this._handler) {
|
|
@@ -20,12 +23,15 @@ export class MediaQuery extends Composable {
|
|
|
20
23
|
}
|
|
21
24
|
export class ColorScheme extends Composable {
|
|
22
25
|
setup() {
|
|
26
|
+
if (this._view)
|
|
27
|
+
return this._view;
|
|
23
28
|
this._mql = window.matchMedia("(prefers-color-scheme: dark)");
|
|
24
29
|
const isDark = signal(this._mql.matches);
|
|
25
30
|
const isLight = computed(() => !isDark());
|
|
26
31
|
this._handler = (e) => { isDark.set(e.matches); };
|
|
27
32
|
this._mql.addEventListener("change", this._handler);
|
|
28
|
-
|
|
33
|
+
this._view = { isDark, isLight };
|
|
34
|
+
return this._view;
|
|
29
35
|
}
|
|
30
36
|
onUnmount() {
|
|
31
37
|
if (this._mql && this._handler) {
|
|
@@ -40,11 +46,14 @@ export class Mouse extends Composable {
|
|
|
40
46
|
this._handler = (_e) => { };
|
|
41
47
|
}
|
|
42
48
|
setup() {
|
|
49
|
+
if (this._view)
|
|
50
|
+
return this._view;
|
|
43
51
|
const x = signal(0);
|
|
44
52
|
const y = signal(0);
|
|
45
53
|
this._handler = (e) => { x.set(e.clientX); y.set(e.clientY); };
|
|
46
54
|
window.addEventListener("mousemove", this._handler);
|
|
47
|
-
|
|
55
|
+
this._view = { x, y };
|
|
56
|
+
return this._view;
|
|
48
57
|
}
|
|
49
58
|
onUnmount() {
|
|
50
59
|
window.removeEventListener("mousemove", this._handler);
|
|
@@ -60,21 +69,34 @@ export class KeyCombo extends Composable {
|
|
|
60
69
|
this._keyupHandler = () => { };
|
|
61
70
|
}
|
|
62
71
|
setup() {
|
|
63
|
-
|
|
72
|
+
if (this._view)
|
|
73
|
+
return this._view;
|
|
74
|
+
const parts = this.combo.toLowerCase().split("+").map((p) => p.trim());
|
|
64
75
|
const pressed = signal(false);
|
|
76
|
+
const modifiers = ["ctrl", "shift", "alt", "meta"];
|
|
77
|
+
const key = parts.find((p) => !modifiers.includes(p));
|
|
78
|
+
// A combo with no non-modifier key is invalid and should never fire
|
|
79
|
+
if (!key) {
|
|
80
|
+
this._keyupHandler = () => { pressed.set(false); };
|
|
81
|
+
window.addEventListener("keydown", this._keydownHandler);
|
|
82
|
+
window.addEventListener("keyup", this._keyupHandler);
|
|
83
|
+
this._view = { pressed };
|
|
84
|
+
return this._view;
|
|
85
|
+
}
|
|
65
86
|
this._keydownHandler = (e) => {
|
|
66
87
|
const ctrl = parts.includes("ctrl") ? e.ctrlKey : true;
|
|
67
88
|
const shift = parts.includes("shift") ? e.shiftKey : true;
|
|
68
89
|
const alt = parts.includes("alt") ? e.altKey : true;
|
|
69
|
-
const
|
|
70
|
-
if (ctrl && shift && alt &&
|
|
90
|
+
const meta = parts.includes("meta") ? e.metaKey : true;
|
|
91
|
+
if (ctrl && shift && alt && meta && e.key.toLowerCase() === key) {
|
|
71
92
|
pressed.set(true);
|
|
72
93
|
}
|
|
73
94
|
};
|
|
74
95
|
this._keyupHandler = () => { pressed.set(false); };
|
|
75
96
|
window.addEventListener("keydown", this._keydownHandler);
|
|
76
97
|
window.addEventListener("keyup", this._keyupHandler);
|
|
77
|
-
|
|
98
|
+
this._view = { pressed };
|
|
99
|
+
return this._view;
|
|
78
100
|
}
|
|
79
101
|
onUnmount() {
|
|
80
102
|
window.removeEventListener("keydown", this._keydownHandler);
|
|
@@ -88,6 +110,8 @@ export class Idle extends Composable {
|
|
|
88
110
|
this._listeners = [];
|
|
89
111
|
}
|
|
90
112
|
setup() {
|
|
113
|
+
if (this._view)
|
|
114
|
+
return this._view;
|
|
91
115
|
const idle = signal(false);
|
|
92
116
|
const reset = () => {
|
|
93
117
|
idle.set(false);
|
|
@@ -99,7 +123,8 @@ export class Idle extends Composable {
|
|
|
99
123
|
this._listeners.push([event, reset]);
|
|
100
124
|
});
|
|
101
125
|
reset();
|
|
102
|
-
|
|
126
|
+
this._view = { idle };
|
|
127
|
+
return this._view;
|
|
103
128
|
}
|
|
104
129
|
onUnmount() {
|
|
105
130
|
clearTimeout(this._timer);
|
package/dist/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,OAAO,UAAW,SAAQ,UAAU;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/dist/dom.d.ts
CHANGED
|
@@ -3,10 +3,8 @@ export declare class WindowSize extends Composable {
|
|
|
3
3
|
width: number;
|
|
4
4
|
height: number;
|
|
5
5
|
private _handler;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
height: import("@praxisjs/shared").Signal<number>;
|
|
9
|
-
};
|
|
6
|
+
private _view?;
|
|
7
|
+
setup(): Record<string, unknown>;
|
|
10
8
|
onUnmount(): void;
|
|
11
9
|
}
|
|
12
10
|
export declare class ScrollPosition extends Composable {
|
|
@@ -14,11 +12,9 @@ export declare class ScrollPosition extends Composable {
|
|
|
14
12
|
y: number;
|
|
15
13
|
private readonly _target;
|
|
16
14
|
private _handler;
|
|
15
|
+
private _view?;
|
|
17
16
|
constructor(target?: HTMLElement | Window);
|
|
18
|
-
setup():
|
|
19
|
-
x: import("@praxisjs/shared").Signal<number>;
|
|
20
|
-
y: import("@praxisjs/shared").Signal<number>;
|
|
21
|
-
};
|
|
17
|
+
setup(): Record<string, unknown>;
|
|
22
18
|
onUnmount(): void;
|
|
23
19
|
}
|
|
24
20
|
export declare class ElementSize extends Composable {
|
|
@@ -26,13 +22,11 @@ export declare class ElementSize extends Composable {
|
|
|
26
22
|
width: number;
|
|
27
23
|
height: number;
|
|
28
24
|
private _observer?;
|
|
25
|
+
private _view?;
|
|
29
26
|
constructor(ref: {
|
|
30
27
|
current: HTMLElement | null;
|
|
31
28
|
});
|
|
32
|
-
setup():
|
|
33
|
-
width: import("@praxisjs/shared").Signal<number>;
|
|
34
|
-
height: import("@praxisjs/shared").Signal<number>;
|
|
35
|
-
};
|
|
29
|
+
setup(): Record<string, unknown>;
|
|
36
30
|
onUnmount(): void;
|
|
37
31
|
}
|
|
38
32
|
export declare class Intersection extends Composable {
|
|
@@ -40,22 +34,20 @@ export declare class Intersection extends Composable {
|
|
|
40
34
|
private readonly options?;
|
|
41
35
|
visible: boolean;
|
|
42
36
|
private _observer?;
|
|
37
|
+
private _view?;
|
|
43
38
|
constructor(ref: {
|
|
44
39
|
current: HTMLElement | null;
|
|
45
40
|
}, options?: IntersectionObserverInit | undefined);
|
|
46
|
-
setup():
|
|
47
|
-
visible: import("@praxisjs/shared").Signal<boolean>;
|
|
48
|
-
};
|
|
41
|
+
setup(): Record<string, unknown>;
|
|
49
42
|
onUnmount(): void;
|
|
50
43
|
}
|
|
51
44
|
export declare class Focus extends Composable {
|
|
52
45
|
private readonly ref;
|
|
53
46
|
focused: boolean;
|
|
47
|
+
private _view?;
|
|
54
48
|
constructor(ref: {
|
|
55
49
|
current: HTMLElement | null;
|
|
56
50
|
});
|
|
57
|
-
setup():
|
|
58
|
-
focused: import("@praxisjs/shared").Signal<boolean>;
|
|
59
|
-
};
|
|
51
|
+
setup(): Record<string, unknown>;
|
|
60
52
|
}
|
|
61
53
|
//# sourceMappingURL=dom.d.ts.map
|
package/dist/dom.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,qBAAa,UAAW,SAAQ,UAAU;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAGvB,OAAO,CAAC,QAAQ,CAAY;
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,qBAAa,UAAW,SAAQ,UAAU;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAGvB,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,KAAK,CAAC,CAA0B;IAExC,KAAK;IAaL,SAAS;CAGV;AAED,qBAAa,cAAe,SAAQ,UAAU;IACpC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,KAAK,CAAC,CAA0B;gBAE5B,MAAM,GAAE,WAAW,GAAG,MAAe;IAKjD,KAAK;IAcL,SAAS;CAGV;AAED,qBAAa,WAAY,SAAQ,UAAU;IAO7B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,SAAS,CAAC,CAAiB;IACnC,OAAO,CAAC,KAAK,CAAC,CAA0B;gBAEX,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE;IAIjE,KAAK;IAmBL,SAAS;CAGV;AAED,qBAAa,YAAa,SAAQ,UAAU;IAOxC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAPnB,OAAO,EAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,SAAS,CAAC,CAAuB;IACzC,OAAO,CAAC,KAAK,CAAC,CAA0B;gBAGrB,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE,EACpC,OAAO,CAAC,EAAE,wBAAwB,YAAA;IAKrD,KAAK;IAaL,SAAS;CAGV;AAED,qBAAa,KAAM,SAAQ,UAAU;IAKvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJxB,OAAO,EAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,KAAK,CAAC,CAA0B;gBAEX,GAAG,EAAE;QAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAA;KAAE;IAIjE,KAAK;CAkBN"}
|
package/dist/dom.js
CHANGED
|
@@ -7,6 +7,8 @@ export class WindowSize extends Composable {
|
|
|
7
7
|
this._handler = () => { };
|
|
8
8
|
}
|
|
9
9
|
setup() {
|
|
10
|
+
if (this._view)
|
|
11
|
+
return this._view;
|
|
10
12
|
const width = signal(window.innerWidth);
|
|
11
13
|
const height = signal(window.innerHeight);
|
|
12
14
|
this._handler = () => {
|
|
@@ -14,7 +16,8 @@ export class WindowSize extends Composable {
|
|
|
14
16
|
height.set(window.innerHeight);
|
|
15
17
|
};
|
|
16
18
|
window.addEventListener("resize", this._handler);
|
|
17
|
-
|
|
19
|
+
this._view = { width, height };
|
|
20
|
+
return this._view;
|
|
18
21
|
}
|
|
19
22
|
onUnmount() {
|
|
20
23
|
window.removeEventListener("resize", this._handler);
|
|
@@ -28,6 +31,8 @@ export class ScrollPosition extends Composable {
|
|
|
28
31
|
this._target = target;
|
|
29
32
|
}
|
|
30
33
|
setup() {
|
|
34
|
+
if (this._view)
|
|
35
|
+
return this._view;
|
|
31
36
|
const x = signal(0);
|
|
32
37
|
const y = signal(0);
|
|
33
38
|
const t = this._target;
|
|
@@ -36,7 +41,8 @@ export class ScrollPosition extends Composable {
|
|
|
36
41
|
y.set(t === window ? window.scrollY : t.scrollTop);
|
|
37
42
|
};
|
|
38
43
|
t.addEventListener("scroll", this._handler);
|
|
39
|
-
|
|
44
|
+
this._view = { x, y };
|
|
45
|
+
return this._view;
|
|
40
46
|
}
|
|
41
47
|
onUnmount() {
|
|
42
48
|
this._target.removeEventListener("scroll", this._handler);
|
|
@@ -48,6 +54,8 @@ export class ElementSize extends Composable {
|
|
|
48
54
|
this.ref = ref;
|
|
49
55
|
}
|
|
50
56
|
setup() {
|
|
57
|
+
if (this._view)
|
|
58
|
+
return this._view;
|
|
51
59
|
const width = signal(0);
|
|
52
60
|
const height = signal(0);
|
|
53
61
|
this._observer = new ResizeObserver(([entry]) => {
|
|
@@ -61,7 +69,8 @@ export class ElementSize extends Composable {
|
|
|
61
69
|
height.set(this.ref.current.offsetHeight);
|
|
62
70
|
}
|
|
63
71
|
});
|
|
64
|
-
|
|
72
|
+
this._view = { width, height };
|
|
73
|
+
return this._view;
|
|
65
74
|
}
|
|
66
75
|
onUnmount() {
|
|
67
76
|
this._observer?.disconnect();
|
|
@@ -74,6 +83,8 @@ export class Intersection extends Composable {
|
|
|
74
83
|
this.options = options;
|
|
75
84
|
}
|
|
76
85
|
setup() {
|
|
86
|
+
if (this._view)
|
|
87
|
+
return this._view;
|
|
77
88
|
const visible = signal(false);
|
|
78
89
|
this._observer = new IntersectionObserver(([entry]) => {
|
|
79
90
|
visible.set(entry.isIntersecting);
|
|
@@ -82,7 +93,8 @@ export class Intersection extends Composable {
|
|
|
82
93
|
if (this.ref.current)
|
|
83
94
|
this._observer?.observe(this.ref.current);
|
|
84
95
|
});
|
|
85
|
-
|
|
96
|
+
this._view = { visible };
|
|
97
|
+
return this._view;
|
|
86
98
|
}
|
|
87
99
|
onUnmount() {
|
|
88
100
|
this._observer?.disconnect();
|
|
@@ -94,6 +106,8 @@ export class Focus extends Composable {
|
|
|
94
106
|
this.ref = ref;
|
|
95
107
|
}
|
|
96
108
|
setup() {
|
|
109
|
+
if (this._view)
|
|
110
|
+
return this._view;
|
|
97
111
|
const focused = signal(false);
|
|
98
112
|
effect(() => {
|
|
99
113
|
const el = this.ref.current;
|
|
@@ -108,7 +122,8 @@ export class Focus extends Composable {
|
|
|
108
122
|
el.removeEventListener("blur", onBlur);
|
|
109
123
|
};
|
|
110
124
|
});
|
|
111
|
-
|
|
125
|
+
this._view = { focused };
|
|
126
|
+
return this._view;
|
|
112
127
|
}
|
|
113
128
|
}
|
|
114
129
|
//# sourceMappingURL=dom.js.map
|
package/dist/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,OAAO,UAAW,SAAQ,UAAU;IAA1C;;QAIE,gEAAgE;QACxD,aAAQ,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../src/dom.ts"],"names":[],"mappings":"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"}
|
package/dist/utilities.d.ts
CHANGED
|
@@ -10,12 +10,14 @@ export declare class Clipboard extends Composable {
|
|
|
10
10
|
copied: boolean;
|
|
11
11
|
content: string;
|
|
12
12
|
copy: (text: string) => Promise<void>;
|
|
13
|
+
private _resetTimer?;
|
|
13
14
|
constructor(resetDelay?: number);
|
|
14
15
|
setup(): {
|
|
15
16
|
copied: Signal<boolean>;
|
|
16
17
|
content: Signal<string>;
|
|
17
18
|
copy: (text: string) => Promise<void>;
|
|
18
19
|
};
|
|
20
|
+
onUnmount(): void;
|
|
19
21
|
}
|
|
20
22
|
export declare class Geolocation extends Composable {
|
|
21
23
|
private readonly options?;
|
|
@@ -23,6 +25,7 @@ export declare class Geolocation extends Composable {
|
|
|
23
25
|
lng: number | null;
|
|
24
26
|
error: GeolocationPositionError | null;
|
|
25
27
|
loading: boolean;
|
|
28
|
+
private _active;
|
|
26
29
|
constructor(options?: PositionOptions | undefined);
|
|
27
30
|
setup(): {
|
|
28
31
|
lat: Signal<number | null>;
|
|
@@ -30,6 +33,7 @@ export declare class Geolocation extends Composable {
|
|
|
30
33
|
error: Signal<GeolocationPositionError | null>;
|
|
31
34
|
loading: Signal<boolean>;
|
|
32
35
|
};
|
|
36
|
+
onUnmount(): void;
|
|
33
37
|
}
|
|
34
38
|
export declare class TimeAgo extends Composable {
|
|
35
39
|
private readonly source;
|
package/dist/utilities.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,SAAU,SAAQ,UAAU;
|
|
1
|
+
{"version":3,"file":"utilities.d.ts","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,SAAU,SAAQ,UAAU;IAO3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN/B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO,CAAC,WAAW,CAAC,CAAgC;gBAEvB,UAAU,SAAO;IAI9C,KAAK;;;qBAKuB,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;;IAelD,SAAS;CAGV;AAED,qBAAa,WAAY,SAAQ,UAAU;IAQ7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP7B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,wBAAwB,GAAG,IAAI,CAAC;IACvC,OAAO,EAAE,OAAO,CAAC;IAEzB,OAAO,CAAC,OAAO,CAAQ;gBAEM,OAAO,CAAC,EAAE,eAAe,YAAA;IAItD,KAAK;;;;;;IAwBL,SAAS;CAGV;AAED,qBAAa,OAAQ,SAAQ,UAAU;IAMnC,OAAO,CAAC,QAAQ,CAAC,MAAM;IAIvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATjB,KAAK,EAAE,MAAM,CAAC;IAEtB,OAAO,CAAC,SAAS,CAAC,CAAiC;gBAGhC,MAAM,EACnB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,GACrB,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,GACvB,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,EACR,MAAM,SAAU;IAKnC,KAAK;;;IAqBL,SAAS;CAGV;AAED,qBAAa,UAAW,SAAQ,UAAU;IAc5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;gBAEI,OAAO,EAAE,iBAAiB;IAOvD,KAAK;;;;;;;;;;kBAmBS,MAAM;;;;CAKrB"}
|
package/dist/utilities.js
CHANGED
|
@@ -14,7 +14,8 @@ export class Clipboard extends Composable {
|
|
|
14
14
|
await navigator.clipboard.writeText(text);
|
|
15
15
|
content.set(text);
|
|
16
16
|
copied.set(true);
|
|
17
|
-
|
|
17
|
+
clearTimeout(this._resetTimer);
|
|
18
|
+
this._resetTimer = setTimeout(() => { copied.set(false); }, resetDelay);
|
|
18
19
|
}
|
|
19
20
|
catch {
|
|
20
21
|
console.warn("[Clipboard] Falha ao copiar");
|
|
@@ -22,11 +23,15 @@ export class Clipboard extends Composable {
|
|
|
22
23
|
};
|
|
23
24
|
return { copied, content, copy };
|
|
24
25
|
}
|
|
26
|
+
onUnmount() {
|
|
27
|
+
clearTimeout(this._resetTimer);
|
|
28
|
+
}
|
|
25
29
|
}
|
|
26
30
|
export class Geolocation extends Composable {
|
|
27
31
|
constructor(options) {
|
|
28
32
|
super();
|
|
29
33
|
this.options = options;
|
|
34
|
+
this._active = true;
|
|
30
35
|
}
|
|
31
36
|
setup() {
|
|
32
37
|
const lat = signal(null);
|
|
@@ -34,15 +39,22 @@ export class Geolocation extends Composable {
|
|
|
34
39
|
const error = signal(null);
|
|
35
40
|
const loading = signal(true);
|
|
36
41
|
navigator.geolocation.getCurrentPosition((pos) => {
|
|
42
|
+
if (!this._active)
|
|
43
|
+
return;
|
|
37
44
|
lat.set(pos.coords.latitude);
|
|
38
45
|
lng.set(pos.coords.longitude);
|
|
39
46
|
loading.set(false);
|
|
40
47
|
}, (err) => {
|
|
48
|
+
if (!this._active)
|
|
49
|
+
return;
|
|
41
50
|
error.set(err);
|
|
42
51
|
loading.set(false);
|
|
43
52
|
}, this.options);
|
|
44
53
|
return { lat, lng, error, loading };
|
|
45
54
|
}
|
|
55
|
+
onUnmount() {
|
|
56
|
+
this._active = false;
|
|
57
|
+
}
|
|
46
58
|
}
|
|
47
59
|
export class TimeAgo extends Composable {
|
|
48
60
|
constructor(source, locale = "pt-BR") {
|
|
@@ -79,6 +91,9 @@ export class Pagination extends Composable {
|
|
|
79
91
|
constructor(options) {
|
|
80
92
|
super();
|
|
81
93
|
this.options = options;
|
|
94
|
+
if (options.pageSize <= 0) {
|
|
95
|
+
throw new Error("pageSize must be greater than 0");
|
|
96
|
+
}
|
|
82
97
|
}
|
|
83
98
|
setup() {
|
|
84
99
|
const opts = this.options;
|
package/dist/utilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAS3D,MAAM,OAAO,SAAU,SAAQ,UAAU;
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../src/utilities.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisjs/composables",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"typescript": "^5.9.3"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@praxisjs/core": "1.
|
|
17
|
+
"@praxisjs/core": "1.1.0",
|
|
18
18
|
"@praxisjs/shared": "0.2.0"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
@@ -224,4 +224,164 @@ describe("Idle", () => {
|
|
|
224
224
|
composable.onUnmount();
|
|
225
225
|
expect(remove).toHaveBeenCalled();
|
|
226
226
|
});
|
|
227
|
+
|
|
228
|
+
it("fires on scroll event", () => {
|
|
229
|
+
vi.useFakeTimers();
|
|
230
|
+
const composable = new Idle(500);
|
|
231
|
+
const { idle: isIdle } = composable.setup() as { idle: () => boolean };
|
|
232
|
+
vi.advanceTimersByTime(500);
|
|
233
|
+
expect(isIdle()).toBe(true);
|
|
234
|
+
window.dispatchEvent(new Event("scroll"));
|
|
235
|
+
expect(isIdle()).toBe(false);
|
|
236
|
+
vi.useRealTimers();
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("fires on click event", () => {
|
|
240
|
+
vi.useFakeTimers();
|
|
241
|
+
const composable = new Idle(500);
|
|
242
|
+
const { idle: isIdle } = composable.setup() as { idle: () => boolean };
|
|
243
|
+
vi.advanceTimersByTime(500);
|
|
244
|
+
expect(isIdle()).toBe(true);
|
|
245
|
+
window.dispatchEvent(new MouseEvent("click"));
|
|
246
|
+
expect(isIdle()).toBe(false);
|
|
247
|
+
vi.useRealTimers();
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
it("fires on keydown event", () => {
|
|
251
|
+
vi.useFakeTimers();
|
|
252
|
+
const composable = new Idle(500);
|
|
253
|
+
const { idle: isIdle } = composable.setup() as { idle: () => boolean };
|
|
254
|
+
vi.advanceTimersByTime(500);
|
|
255
|
+
expect(isIdle()).toBe(true);
|
|
256
|
+
window.dispatchEvent(new KeyboardEvent("keydown"));
|
|
257
|
+
expect(isIdle()).toBe(false);
|
|
258
|
+
vi.useRealTimers();
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("activity after becoming idle resets the timer", () => {
|
|
262
|
+
vi.useFakeTimers();
|
|
263
|
+
const composable = new Idle(500);
|
|
264
|
+
const { idle: isIdle } = composable.setup() as { idle: () => boolean };
|
|
265
|
+
vi.advanceTimersByTime(500);
|
|
266
|
+
expect(isIdle()).toBe(true);
|
|
267
|
+
window.dispatchEvent(new MouseEvent("mousemove"));
|
|
268
|
+
expect(isIdle()).toBe(false);
|
|
269
|
+
// Should become idle again after full timeout elapses
|
|
270
|
+
vi.advanceTimersByTime(500);
|
|
271
|
+
expect(isIdle()).toBe(true);
|
|
272
|
+
vi.useRealTimers();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
// ── KeyCombo (additional) ─────────────────────────────────────────────────────
|
|
277
|
+
|
|
278
|
+
describe("KeyCombo (additional)", () => {
|
|
279
|
+
it("fires on meta+s keydown", () => {
|
|
280
|
+
const kc = new KeyCombo("meta+s");
|
|
281
|
+
const { pressed } = kc.setup() as { pressed: () => boolean };
|
|
282
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { metaKey: true, key: "s" }));
|
|
283
|
+
expect(pressed()).toBe(true);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it("modifier-only combo (ctrl+shift) never fires", () => {
|
|
287
|
+
const kc = new KeyCombo("ctrl+shift");
|
|
288
|
+
const { pressed } = kc.setup() as { pressed: () => boolean };
|
|
289
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { ctrlKey: true, shiftKey: true, key: "Control" }));
|
|
290
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { ctrlKey: true, shiftKey: true, key: "Shift" }));
|
|
291
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { ctrlKey: true, shiftKey: true, key: "a" }));
|
|
292
|
+
expect(pressed()).toBe(false);
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it("whitespace in combo string (ctrl + s) is handled gracefully — fires on ctrl+s", () => {
|
|
296
|
+
// Parts are trimmed, so "ctrl + s" becomes ["ctrl", "s"] after trim
|
|
297
|
+
const kc = new KeyCombo("ctrl + s");
|
|
298
|
+
const { pressed } = kc.setup() as { pressed: () => boolean };
|
|
299
|
+
window.dispatchEvent(new KeyboardEvent("keydown", { ctrlKey: true, key: "s" }));
|
|
300
|
+
expect(pressed()).toBe(true);
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
it("setup() called twice registers only one set of listeners", () => {
|
|
304
|
+
const add = vi.spyOn(window, "addEventListener");
|
|
305
|
+
const kc = new KeyCombo("ctrl+s");
|
|
306
|
+
kc.setup();
|
|
307
|
+
kc.setup();
|
|
308
|
+
const keydownCalls = add.mock.calls.filter((c) => c[0] === "keydown").length;
|
|
309
|
+
expect(keydownCalls).toBe(1);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// ── MediaQuery (additional) ───────────────────────────────────────────────────
|
|
314
|
+
|
|
315
|
+
describe("MediaQuery (additional)", () => {
|
|
316
|
+
beforeEach(() => { vi.restoreAllMocks(); });
|
|
317
|
+
|
|
318
|
+
it("setup() called twice registers only one listener", () => {
|
|
319
|
+
const mql = mockMatchMedia(false);
|
|
320
|
+
const mq = new MediaQuery("(min-width: 768px)");
|
|
321
|
+
mq.setup();
|
|
322
|
+
mq.setup();
|
|
323
|
+
expect((mql.addEventListener as ReturnType<typeof vi.fn>)).toHaveBeenCalledTimes(1);
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
// ── ColorScheme (additional) ──────────────────────────────────────────────────
|
|
328
|
+
|
|
329
|
+
describe("ColorScheme (additional)", () => {
|
|
330
|
+
beforeEach(() => { vi.restoreAllMocks(); });
|
|
331
|
+
|
|
332
|
+
it("setup() called twice registers only one listener", () => {
|
|
333
|
+
const mql = mockMatchMedia(false);
|
|
334
|
+
const cs = new ColorScheme();
|
|
335
|
+
cs.setup();
|
|
336
|
+
cs.setup();
|
|
337
|
+
expect((mql.addEventListener as ReturnType<typeof vi.fn>)).toHaveBeenCalledTimes(1);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// ── Mouse (additional) ────────────────────────────────────────────────────────
|
|
342
|
+
|
|
343
|
+
describe("Mouse (additional)", () => {
|
|
344
|
+
it("setup() called twice returns the same view object", () => {
|
|
345
|
+
const mouse = new Mouse();
|
|
346
|
+
const view1 = mouse.setup();
|
|
347
|
+
const view2 = mouse.setup();
|
|
348
|
+
expect(view1).toBe(view2);
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it("setup() called twice registers only one mousemove listener", () => {
|
|
352
|
+
const add = vi.spyOn(window, "addEventListener");
|
|
353
|
+
const mouse = new Mouse();
|
|
354
|
+
mouse.setup();
|
|
355
|
+
mouse.setup();
|
|
356
|
+
const moveCalls = add.mock.calls.filter((c) => c[0] === "mousemove").length;
|
|
357
|
+
expect(moveCalls).toBe(1);
|
|
358
|
+
vi.restoreAllMocks();
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// ── Idle (additional) ─────────────────────────────────────────────────────────
|
|
363
|
+
|
|
364
|
+
describe("Idle (additional)", () => {
|
|
365
|
+
it("setup() called twice returns the same view object", () => {
|
|
366
|
+
vi.useFakeTimers();
|
|
367
|
+
const idle = new Idle(500);
|
|
368
|
+
const view1 = idle.setup();
|
|
369
|
+
const view2 = idle.setup();
|
|
370
|
+
expect(view1).toBe(view2);
|
|
371
|
+
idle.onUnmount();
|
|
372
|
+
vi.useRealTimers();
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
it("setup() called twice registers activity listeners only once", () => {
|
|
376
|
+
vi.useFakeTimers();
|
|
377
|
+
const add = vi.spyOn(window, "addEventListener");
|
|
378
|
+
const idle = new Idle(500);
|
|
379
|
+
idle.setup();
|
|
380
|
+
idle.setup();
|
|
381
|
+
const moveCalls = add.mock.calls.filter((c) => c[0] === "mousemove").length;
|
|
382
|
+
expect(moveCalls).toBe(1);
|
|
383
|
+
idle.onUnmount();
|
|
384
|
+
vi.restoreAllMocks();
|
|
385
|
+
vi.useRealTimers();
|
|
386
|
+
});
|
|
227
387
|
});
|