@journ/lift 0.2.0 → 0.3.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/README.md +17 -37
- package/dist/prefers-reduced-motion.js +1 -1
- package/dist/use-debounce-state.js +3 -3
- package/dist/use-debounced-callback.js +6 -6
- package/package.json +3 -103
- package/dist/env-C0PNnbwt.js +0 -4
- package/dist/logger-Dse1660l.js +0 -33
- package/dist/try-catch-D4d3N9_W.js +0 -29
- package/dist/use-battery.d.ts +0 -12
- package/dist/use-battery.js +0 -64
- package/dist/use-browser.d.ts +0 -6
- package/dist/use-browser.js +0 -51
- package/dist/use-haptic.d.ts +0 -8
- package/dist/use-haptic.js +0 -84
- package/dist/use-headroom.d.ts +0 -18
- package/dist/use-headroom.js +0 -65
- package/dist/use-idle-queue.d.ts +0 -28
- package/dist/use-idle-queue.js +0 -221
- package/dist/use-intersection-observer.d.ts +0 -17
- package/dist/use-intersection-observer.js +0 -50
- package/dist/use-isomorphic-effect.d.ts +0 -5
- package/dist/use-isomorphic-effect.js +0 -5
- package/dist/use-keybindings.d.ts +0 -14
- package/dist/use-keybindings.js +0 -76
- package/dist/use-local-storage.d.ts +0 -13
- package/dist/use-local-storage.js +0 -76
- package/dist/use-logger.d.ts +0 -4
- package/dist/use-logger.js +0 -17
- package/dist/use-long-press.d.ts +0 -12
- package/dist/use-long-press.js +0 -43
- package/dist/use-measure.d.ts +0 -8
- package/dist/use-measure.js +0 -27
- package/dist/use-media-query.d.ts +0 -14
- package/dist/use-media-query.js +0 -24
- package/dist/use-mouse.d.ts +0 -18
- package/dist/use-mouse.js +0 -40
- package/dist/use-network.d.ts +0 -17
- package/dist/use-network.js +0 -38
- package/dist/use-page-leave.d.ts +0 -4
- package/dist/use-page-leave.js +0 -11
- package/dist/use-reduced-motion.d.ts +0 -4
- package/dist/use-reduced-motion.js +0 -5
- package/dist/use-scroll-direction.d.ts +0 -5
- package/dist/use-scroll-direction.js +0 -33
- package/dist/use-window-event.d.ts +0 -5
- package/dist/use-window-event.js +0 -11
- package/dist/use-window-scroll.d.ts +0 -10
- package/dist/use-window-scroll.js +0 -33
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @journ/lift
|
|
2
2
|
|
|
3
|
-
React hooks for state
|
|
3
|
+
React hooks for state and timing, built on fitter-happier. None touch `window`, `document` or `navigator`, so they run in browsers, React Native and Wails webviews. Hooks that need the DOM are in `@journ/lift-dom`.
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
@@ -33,39 +33,19 @@ function Search({ query }: { query: string }) {
|
|
|
33
33
|
}
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
| Entry
|
|
37
|
-
|
|
|
38
|
-
| `@journ/lift/use-
|
|
39
|
-
| `@journ/lift/use-
|
|
40
|
-
| `@journ/lift/use-
|
|
41
|
-
| `@journ/lift/use-
|
|
42
|
-
| `@journ/lift/use-
|
|
43
|
-
| `@journ/lift/use-
|
|
44
|
-
| `@journ/lift/use-
|
|
45
|
-
| `@journ/lift/use-
|
|
46
|
-
| `@journ/lift/use-
|
|
47
|
-
| `@journ/lift/use-
|
|
48
|
-
| `@journ/lift/use-
|
|
49
|
-
| `@journ/lift/use-
|
|
50
|
-
| `@journ/lift/
|
|
51
|
-
| `@journ/lift/
|
|
52
|
-
| `@journ/lift/use-isomorphic-effect` | `useIsomorphicEffect` | `useLayoutEffect` in the browser, `useEffect` on the server * |
|
|
53
|
-
| `@journ/lift/use-keybindings` | `useKeybindings(map, target, options)` | Keyboard shortcuts and key sequences * |
|
|
54
|
-
| `@journ/lift/use-local-storage` | `useLocalStorage`, `useSessionStorage` | State synced with web storage * |
|
|
55
|
-
| `@journ/lift/use-logger` | `useLogger(name, props)` | Logs mount, update and unmount |
|
|
56
|
-
| `@journ/lift/use-long-press` | `useLongPress(onLongPress, disabled)` | Pointer handlers that fire after a 500 ms hold |
|
|
57
|
-
| `@journ/lift/use-map` | `useMap(entries)` | A `Map` that re-renders on change |
|
|
58
|
-
| `@journ/lift/use-measure` | `useMeasure()` | Element width and height * |
|
|
59
|
-
| `@journ/lift/use-media-query` | `useMediaQuery(query)`, `useBreakpoint(name)`, `breakpoints` | A media query match * |
|
|
60
|
-
| `@journ/lift/use-mouse` | `useMouse(options)`, `useMousePosition()` | Pointer position, relative to an element or the window * |
|
|
61
|
-
| `@journ/lift/use-network` | `useNetwork()` | Online state and connection details * |
|
|
62
|
-
| `@journ/lift/use-page-leave` | `usePageLeave(fn)` | Calls `fn` when the pointer leaves the page * |
|
|
63
|
-
| `@journ/lift/use-pagination` | `usePagination(options)`, `DOTS` | Page ranges with siblings and boundaries |
|
|
64
|
-
| `@journ/lift/use-reduced-motion` | `useReducedMotion()` | The `prefers-reduced-motion` media query * |
|
|
65
|
-
| `@journ/lift/use-scroll-direction` | `useScrollDirection()` | `up`, `down` or `unknown` * |
|
|
66
|
-
| `@journ/lift/use-uncontrolled` | `useUncontrolled(options)` | Controlled or uncontrolled value with a change handler |
|
|
67
|
-
| `@journ/lift/use-validated-state` | `useValidatedState(initial, validate)` | A value with its validity and last valid value |
|
|
68
|
-
| `@journ/lift/use-window-event` | `useWindowEvent(type, listener, options)` | A window event listener that never goes stale * |
|
|
69
|
-
| `@journ/lift/use-window-scroll` | `useWindowScroll()` | Window scroll position and a smooth `scrollTo` * |
|
|
70
|
-
| `@journ/lift/required-context` | `createRequiredContext(owner)` | a context whose hook throws outside it |
|
|
71
|
-
| `@journ/lift/prefers-reduced-motion` | `prefersReducedMotion()` | |
|
|
36
|
+
| Entry | Exports | Notes |
|
|
37
|
+
| ------------------------------------ | ----------------------------------------------------- | -------------------------------------------------------- |
|
|
38
|
+
| `@journ/lift/use-callback-ref` | `useCallbackRef(fn)` | A stable callback that always calls the latest `fn` |
|
|
39
|
+
| `@journ/lift/use-controllable-state` | `useControllableState(value, defaultValue, onChange)` | |
|
|
40
|
+
| `@journ/lift/use-debounce-state` | `useDebouncedState(initial, wait, options)` | State whose setter debounces updates |
|
|
41
|
+
| `@journ/lift/use-debounced-callback` | `useDebouncedCallback(fn, delayOrOptions)` | A debounced `fn` with `flush`, `cancel` and `isPending` |
|
|
42
|
+
| `@journ/lift/use-debounced-value` | `useDebouncedValue(value, delay)` | |
|
|
43
|
+
| `@journ/lift/use-did-update` | `useDidUpdate(effect, deps)` | An effect that skips the first run |
|
|
44
|
+
| `@journ/lift/use-disclosure` | `useDisclosure(initial, options)` | Open, close and toggle state with `onOpen` and `onClose` |
|
|
45
|
+
| `@journ/lift/use-draft` | `useDraft` | Text typed freely that becomes a value on commit |
|
|
46
|
+
| `@journ/lift/use-map` | `useMap(entries)` | A `Map` that re-renders on change |
|
|
47
|
+
| `@journ/lift/use-pagination` | `usePagination(options)`, `DOTS` | Page ranges with siblings and boundaries |
|
|
48
|
+
| `@journ/lift/use-uncontrolled` | `useUncontrolled(options)` | Controlled or uncontrolled value with a change handler |
|
|
49
|
+
| `@journ/lift/use-validated-state` | `useValidatedState(initial, validate)` | A value with its validity and last valid value |
|
|
50
|
+
| `@journ/lift/required-context` | `createRequiredContext(owner)` | a context whose hook throws outside it |
|
|
51
|
+
| `@journ/lift/prefers-reduced-motion` | `prefersReducedMotion()` | |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
//#region src/prefers-reduced-motion.ts
|
|
2
|
-
const prefersReducedMotion = () =>
|
|
2
|
+
const prefersReducedMotion = () => globalThis.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
|
|
3
3
|
//#endregion
|
|
4
4
|
export { prefersReducedMotion };
|
|
@@ -4,16 +4,16 @@ const useDebouncedState = (defaultValue, wait, { leading = false } = {}) => {
|
|
|
4
4
|
const [value, setValue] = useState(defaultValue);
|
|
5
5
|
const timeoutRef = useRef(void 0);
|
|
6
6
|
const leadingRef = useRef(true);
|
|
7
|
-
const cancel = useCallback(() =>
|
|
7
|
+
const cancel = useCallback(() => clearTimeout(timeoutRef.current), []);
|
|
8
8
|
useEffect(() => cancel, [cancel]);
|
|
9
9
|
return [value, useCallback((newValue) => {
|
|
10
10
|
cancel();
|
|
11
11
|
if (leadingRef.current && leading) {
|
|
12
12
|
setValue(newValue);
|
|
13
|
-
timeoutRef.current =
|
|
13
|
+
timeoutRef.current = setTimeout(() => {
|
|
14
14
|
leadingRef.current = true;
|
|
15
15
|
}, wait);
|
|
16
|
-
} else timeoutRef.current =
|
|
16
|
+
} else timeoutRef.current = setTimeout(() => {
|
|
17
17
|
leadingRef.current = true;
|
|
18
18
|
setValue(newValue);
|
|
19
19
|
}, wait);
|
|
@@ -8,8 +8,8 @@ const createDebounced = (run, { delay, leading, maxWait }) => {
|
|
|
8
8
|
let isFirstCall = true;
|
|
9
9
|
let pending = false;
|
|
10
10
|
const cancel = () => {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
clearTimeout(debounceTimer);
|
|
12
|
+
clearTimeout(maxWaitTimer);
|
|
13
13
|
debounceTimer = void 0;
|
|
14
14
|
maxWaitTimer = void 0;
|
|
15
15
|
isFirstCall = true;
|
|
@@ -23,19 +23,19 @@ const createDebounced = (run, { delay, leading, maxWait }) => {
|
|
|
23
23
|
}
|
|
24
24
|
};
|
|
25
25
|
const startMaxWait = () => {
|
|
26
|
-
if (maxWait !== void 0 && maxWaitTimer === void 0) maxWaitTimer =
|
|
26
|
+
if (maxWait !== void 0 && maxWaitTimer === void 0) maxWaitTimer = setTimeout(flush, maxWait);
|
|
27
27
|
};
|
|
28
28
|
const debounced = (...args) => {
|
|
29
|
-
|
|
29
|
+
clearTimeout(debounceTimer);
|
|
30
30
|
latestArgs = args;
|
|
31
31
|
const isLeadingCall = leading && isFirstCall;
|
|
32
32
|
isFirstCall = false;
|
|
33
33
|
if (isLeadingCall) {
|
|
34
34
|
run(...args);
|
|
35
|
-
debounceTimer =
|
|
35
|
+
debounceTimer = setTimeout(cancel, delay);
|
|
36
36
|
} else {
|
|
37
37
|
pending = true;
|
|
38
|
-
debounceTimer =
|
|
38
|
+
debounceTimer = setTimeout(leading ? cancel : flush, delay);
|
|
39
39
|
}
|
|
40
40
|
startMaxWait();
|
|
41
41
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@journ/lift",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "React hooks for state
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "React hooks for state and timing, built on fitter-happier. No DOM access, so they run in browsers, React Native and Wails webviews. Hooks that need window, document or navigator are in @journ/lift-dom.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -24,16 +24,6 @@
|
|
|
24
24
|
"types": "./dist/required-context.d.ts",
|
|
25
25
|
"default": "./dist/required-context.js"
|
|
26
26
|
},
|
|
27
|
-
"./use-battery": {
|
|
28
|
-
"@journ/source": "./src/use-battery.ts",
|
|
29
|
-
"types": "./dist/use-battery.d.ts",
|
|
30
|
-
"default": "./dist/use-battery.js"
|
|
31
|
-
},
|
|
32
|
-
"./use-browser": {
|
|
33
|
-
"@journ/source": "./src/use-browser.ts",
|
|
34
|
-
"types": "./dist/use-browser.d.ts",
|
|
35
|
-
"default": "./dist/use-browser.js"
|
|
36
|
-
},
|
|
37
27
|
"./use-callback-ref": {
|
|
38
28
|
"@journ/source": "./src/use-callback-ref.ts",
|
|
39
29
|
"types": "./dist/use-callback-ref.d.ts",
|
|
@@ -74,96 +64,16 @@
|
|
|
74
64
|
"types": "./dist/use-draft.d.ts",
|
|
75
65
|
"default": "./dist/use-draft.js"
|
|
76
66
|
},
|
|
77
|
-
"./use-haptic": {
|
|
78
|
-
"@journ/source": "./src/use-haptic.ts",
|
|
79
|
-
"types": "./dist/use-haptic.d.ts",
|
|
80
|
-
"default": "./dist/use-haptic.js"
|
|
81
|
-
},
|
|
82
|
-
"./use-headroom": {
|
|
83
|
-
"@journ/source": "./src/use-headroom.ts",
|
|
84
|
-
"types": "./dist/use-headroom.d.ts",
|
|
85
|
-
"default": "./dist/use-headroom.js"
|
|
86
|
-
},
|
|
87
|
-
"./use-idle-queue": {
|
|
88
|
-
"@journ/source": "./src/use-idle-queue.ts",
|
|
89
|
-
"types": "./dist/use-idle-queue.d.ts",
|
|
90
|
-
"default": "./dist/use-idle-queue.js"
|
|
91
|
-
},
|
|
92
|
-
"./use-intersection-observer": {
|
|
93
|
-
"@journ/source": "./src/use-intersection-observer.ts",
|
|
94
|
-
"types": "./dist/use-intersection-observer.d.ts",
|
|
95
|
-
"default": "./dist/use-intersection-observer.js"
|
|
96
|
-
},
|
|
97
|
-
"./use-isomorphic-effect": {
|
|
98
|
-
"@journ/source": "./src/use-isomorphic-effect.ts",
|
|
99
|
-
"types": "./dist/use-isomorphic-effect.d.ts",
|
|
100
|
-
"default": "./dist/use-isomorphic-effect.js"
|
|
101
|
-
},
|
|
102
|
-
"./use-keybindings": {
|
|
103
|
-
"@journ/source": "./src/use-keybindings.ts",
|
|
104
|
-
"types": "./dist/use-keybindings.d.ts",
|
|
105
|
-
"default": "./dist/use-keybindings.js"
|
|
106
|
-
},
|
|
107
|
-
"./use-local-storage": {
|
|
108
|
-
"@journ/source": "./src/use-local-storage.ts",
|
|
109
|
-
"types": "./dist/use-local-storage.d.ts",
|
|
110
|
-
"default": "./dist/use-local-storage.js"
|
|
111
|
-
},
|
|
112
|
-
"./use-logger": {
|
|
113
|
-
"@journ/source": "./src/use-logger.ts",
|
|
114
|
-
"types": "./dist/use-logger.d.ts",
|
|
115
|
-
"default": "./dist/use-logger.js"
|
|
116
|
-
},
|
|
117
|
-
"./use-long-press": {
|
|
118
|
-
"@journ/source": "./src/use-long-press.ts",
|
|
119
|
-
"types": "./dist/use-long-press.d.ts",
|
|
120
|
-
"default": "./dist/use-long-press.js"
|
|
121
|
-
},
|
|
122
67
|
"./use-map": {
|
|
123
68
|
"@journ/source": "./src/use-map.ts",
|
|
124
69
|
"types": "./dist/use-map.d.ts",
|
|
125
70
|
"default": "./dist/use-map.js"
|
|
126
71
|
},
|
|
127
|
-
"./use-measure": {
|
|
128
|
-
"@journ/source": "./src/use-measure.ts",
|
|
129
|
-
"types": "./dist/use-measure.d.ts",
|
|
130
|
-
"default": "./dist/use-measure.js"
|
|
131
|
-
},
|
|
132
|
-
"./use-media-query": {
|
|
133
|
-
"@journ/source": "./src/use-media-query.ts",
|
|
134
|
-
"types": "./dist/use-media-query.d.ts",
|
|
135
|
-
"default": "./dist/use-media-query.js"
|
|
136
|
-
},
|
|
137
|
-
"./use-mouse": {
|
|
138
|
-
"@journ/source": "./src/use-mouse.ts",
|
|
139
|
-
"types": "./dist/use-mouse.d.ts",
|
|
140
|
-
"default": "./dist/use-mouse.js"
|
|
141
|
-
},
|
|
142
|
-
"./use-network": {
|
|
143
|
-
"@journ/source": "./src/use-network.ts",
|
|
144
|
-
"types": "./dist/use-network.d.ts",
|
|
145
|
-
"default": "./dist/use-network.js"
|
|
146
|
-
},
|
|
147
|
-
"./use-page-leave": {
|
|
148
|
-
"@journ/source": "./src/use-page-leave.ts",
|
|
149
|
-
"types": "./dist/use-page-leave.d.ts",
|
|
150
|
-
"default": "./dist/use-page-leave.js"
|
|
151
|
-
},
|
|
152
72
|
"./use-pagination": {
|
|
153
73
|
"@journ/source": "./src/use-pagination.ts",
|
|
154
74
|
"types": "./dist/use-pagination.d.ts",
|
|
155
75
|
"default": "./dist/use-pagination.js"
|
|
156
76
|
},
|
|
157
|
-
"./use-reduced-motion": {
|
|
158
|
-
"@journ/source": "./src/use-reduced-motion.ts",
|
|
159
|
-
"types": "./dist/use-reduced-motion.d.ts",
|
|
160
|
-
"default": "./dist/use-reduced-motion.js"
|
|
161
|
-
},
|
|
162
|
-
"./use-scroll-direction": {
|
|
163
|
-
"@journ/source": "./src/use-scroll-direction.ts",
|
|
164
|
-
"types": "./dist/use-scroll-direction.d.ts",
|
|
165
|
-
"default": "./dist/use-scroll-direction.js"
|
|
166
|
-
},
|
|
167
77
|
"./use-uncontrolled": {
|
|
168
78
|
"@journ/source": "./src/use-uncontrolled.ts",
|
|
169
79
|
"types": "./dist/use-uncontrolled.d.ts",
|
|
@@ -174,23 +84,13 @@
|
|
|
174
84
|
"types": "./dist/use-validated-state.d.ts",
|
|
175
85
|
"default": "./dist/use-validated-state.js"
|
|
176
86
|
},
|
|
177
|
-
"./use-window-event": {
|
|
178
|
-
"@journ/source": "./src/use-window-event.ts",
|
|
179
|
-
"types": "./dist/use-window-event.d.ts",
|
|
180
|
-
"default": "./dist/use-window-event.js"
|
|
181
|
-
},
|
|
182
|
-
"./use-window-scroll": {
|
|
183
|
-
"@journ/source": "./src/use-window-scroll.ts",
|
|
184
|
-
"types": "./dist/use-window-scroll.d.ts",
|
|
185
|
-
"default": "./dist/use-window-scroll.js"
|
|
186
|
-
},
|
|
187
87
|
"./package.json": "./package.json"
|
|
188
88
|
},
|
|
189
89
|
"publishConfig": {
|
|
190
90
|
"access": "public"
|
|
191
91
|
},
|
|
192
92
|
"dependencies": {
|
|
193
|
-
"@journ/fitter-happier": "0.
|
|
93
|
+
"@journ/fitter-happier": "0.3.0"
|
|
194
94
|
},
|
|
195
95
|
"peerDependencies": {
|
|
196
96
|
"react": "^19.2.0"
|
package/dist/env-C0PNnbwt.js
DELETED
package/dist/logger-Dse1660l.js
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
//#region src/lib/logger.ts
|
|
2
|
-
const isProduction = () => {
|
|
3
|
-
const env = import.meta.env;
|
|
4
|
-
if (typeof env?.PROD === "boolean") return env.PROD;
|
|
5
|
-
return globalThis.process?.env?.NODE_ENV === "production";
|
|
6
|
-
};
|
|
7
|
-
const createLogger = () => {
|
|
8
|
-
const shouldLog = (level) => {
|
|
9
|
-
if (isProduction()) return level === "error";
|
|
10
|
-
return true;
|
|
11
|
-
};
|
|
12
|
-
const error = (...args) => {
|
|
13
|
-
if (shouldLog("error")) console.error(...args);
|
|
14
|
-
};
|
|
15
|
-
const warn = (...args) => {
|
|
16
|
-
if (shouldLog("warn")) console.warn(...args);
|
|
17
|
-
};
|
|
18
|
-
const info = (...args) => {
|
|
19
|
-
if (shouldLog("info")) console.info(...args);
|
|
20
|
-
};
|
|
21
|
-
const log = (...args) => {
|
|
22
|
-
if (shouldLog("log")) console.log(...args);
|
|
23
|
-
};
|
|
24
|
-
return {
|
|
25
|
-
error,
|
|
26
|
-
warn,
|
|
27
|
-
info,
|
|
28
|
-
log
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
const logger = createLogger();
|
|
32
|
-
//#endregion
|
|
33
|
-
export { logger as t };
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
//#region src/lib/try-catch.ts
|
|
2
|
-
const tryCatch = async (promise) => {
|
|
3
|
-
try {
|
|
4
|
-
return {
|
|
5
|
-
success: true,
|
|
6
|
-
data: await promise
|
|
7
|
-
};
|
|
8
|
-
} catch (error) {
|
|
9
|
-
return {
|
|
10
|
-
success: false,
|
|
11
|
-
error
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
const tryCatchSync = (fn) => {
|
|
16
|
-
try {
|
|
17
|
-
return {
|
|
18
|
-
success: true,
|
|
19
|
-
data: fn()
|
|
20
|
-
};
|
|
21
|
-
} catch (error) {
|
|
22
|
-
return {
|
|
23
|
-
success: false,
|
|
24
|
-
error
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
//#endregion
|
|
29
|
-
export { tryCatchSync as n, tryCatch as t };
|
package/dist/use-battery.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
//#region src/use-battery.d.ts
|
|
2
|
-
type BatteryState = {
|
|
3
|
-
supported: boolean;
|
|
4
|
-
loading: boolean;
|
|
5
|
-
level: number | null;
|
|
6
|
-
charging: boolean | null;
|
|
7
|
-
chargingTime: number | null;
|
|
8
|
-
dischargingTime: number | null;
|
|
9
|
-
};
|
|
10
|
-
declare const useBattery: () => BatteryState;
|
|
11
|
-
//#endregion
|
|
12
|
-
export { type BatteryState, useBattery };
|
package/dist/use-battery.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { t as tryCatch } from "./try-catch-D4d3N9_W.js";
|
|
2
|
-
import { useEffect, useState, useSyncExternalStore } from "react";
|
|
3
|
-
//#region src/use-battery.ts
|
|
4
|
-
const BATTERY_EVENTS = [
|
|
5
|
-
"levelchange",
|
|
6
|
-
"chargingchange",
|
|
7
|
-
"chargingtimechange",
|
|
8
|
-
"dischargingtimechange"
|
|
9
|
-
];
|
|
10
|
-
const INITIAL_STATE = {
|
|
11
|
-
supported: true,
|
|
12
|
-
loading: true,
|
|
13
|
-
level: null,
|
|
14
|
-
charging: null,
|
|
15
|
-
chargingTime: null,
|
|
16
|
-
dischargingTime: null
|
|
17
|
-
};
|
|
18
|
-
const UNSUPPORTED_STATE = {
|
|
19
|
-
...INITIAL_STATE,
|
|
20
|
-
supported: false,
|
|
21
|
-
loading: false
|
|
22
|
-
};
|
|
23
|
-
const readBattery = (battery) => ({
|
|
24
|
-
supported: true,
|
|
25
|
-
loading: false,
|
|
26
|
-
level: battery.level,
|
|
27
|
-
charging: battery.charging,
|
|
28
|
-
chargingTime: battery.chargingTime,
|
|
29
|
-
dischargingTime: battery.dischargingTime
|
|
30
|
-
});
|
|
31
|
-
const subscribeNever = () => () => {};
|
|
32
|
-
const hasBatteryApi = () => "getBattery" in navigator;
|
|
33
|
-
const useBattery = () => {
|
|
34
|
-
const supported = useSyncExternalStore(subscribeNever, hasBatteryApi, () => true);
|
|
35
|
-
const [state, setState] = useState(INITIAL_STATE);
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
const nav = navigator;
|
|
38
|
-
if (!nav.getBattery) return;
|
|
39
|
-
const getBattery = nav.getBattery.bind(nav);
|
|
40
|
-
let cancelled = false;
|
|
41
|
-
let detach = () => {};
|
|
42
|
-
tryCatch(new Promise((resolve) => resolve(getBattery()))).then((result) => {
|
|
43
|
-
if (cancelled) return;
|
|
44
|
-
if (!result.success) {
|
|
45
|
-
setState(UNSUPPORTED_STATE);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const battery = result.data;
|
|
49
|
-
const update = () => setState(readBattery(battery));
|
|
50
|
-
update();
|
|
51
|
-
for (const event of BATTERY_EVENTS) battery.addEventListener(event, update);
|
|
52
|
-
detach = () => {
|
|
53
|
-
for (const event of BATTERY_EVENTS) battery.removeEventListener(event, update);
|
|
54
|
-
};
|
|
55
|
-
});
|
|
56
|
-
return () => {
|
|
57
|
-
cancelled = true;
|
|
58
|
-
detach();
|
|
59
|
-
};
|
|
60
|
-
}, []);
|
|
61
|
-
return supported ? state : UNSUPPORTED_STATE;
|
|
62
|
-
};
|
|
63
|
-
//#endregion
|
|
64
|
-
export { useBattery };
|
package/dist/use-browser.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
//#region src/use-browser.d.ts
|
|
2
|
-
type Browser = "undetermined" | "chrome" | "firefox" | "safari" | "edge" | "opera" | "ie" | "other";
|
|
3
|
-
declare const getBrowserVersion: () => string | null;
|
|
4
|
-
declare const useBrowser: () => Browser;
|
|
5
|
-
//#endregion
|
|
6
|
-
export { type Browser, getBrowserVersion, useBrowser };
|
package/dist/use-browser.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { t as isServerSide } from "./env-C0PNnbwt.js";
|
|
2
|
-
import { useSyncExternalStore } from "react";
|
|
3
|
-
//#region src/use-browser.ts
|
|
4
|
-
const matchers = [
|
|
5
|
-
{
|
|
6
|
-
browser: "edge",
|
|
7
|
-
detect: /Edge\/([0-9]+)/i,
|
|
8
|
-
version: /Edge\/([0-9]+)/i
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
browser: "chrome",
|
|
12
|
-
detect: /(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9]+)/i,
|
|
13
|
-
version: /Chrom(?:e|ium)\/([0-9]+)/i
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
browser: "firefox",
|
|
17
|
-
detect: /Firefox\/([0-9]+)/i,
|
|
18
|
-
version: /Firefox\/([0-9]+)/i
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
browser: "safari",
|
|
22
|
-
detect: /^((?!chrome|android).)*safari/i,
|
|
23
|
-
version: /Version\/([0-9]+)/i
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
browser: "opera",
|
|
27
|
-
detect: /(OPR|Opera)\/([0-9]+)/i,
|
|
28
|
-
version: /(?:OPR|Opera)\/([0-9]+)/i
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
browser: "ie",
|
|
32
|
-
detect: /MSIE|Trident/i,
|
|
33
|
-
version: /(?:MSIE |rv:)([0-9]+)/i
|
|
34
|
-
}
|
|
35
|
-
];
|
|
36
|
-
const detectBrowser = (userAgent) => matchers.find(({ detect }) => detect.test(userAgent));
|
|
37
|
-
const getBrowser = () => {
|
|
38
|
-
if (isServerSide()) return "undetermined";
|
|
39
|
-
return detectBrowser(window.navigator.userAgent)?.browser ?? "other";
|
|
40
|
-
};
|
|
41
|
-
const getBrowserVersion = () => {
|
|
42
|
-
if (isServerSide()) return null;
|
|
43
|
-
const { userAgent } = window.navigator;
|
|
44
|
-
const matcher = detectBrowser(userAgent);
|
|
45
|
-
return matcher ? userAgent.match(matcher.version)?.[1] ?? null : null;
|
|
46
|
-
};
|
|
47
|
-
const subscribe = () => () => {};
|
|
48
|
-
const getServerSnapshot = () => "undetermined";
|
|
49
|
-
const useBrowser = () => useSyncExternalStore(subscribe, getBrowser, getServerSnapshot);
|
|
50
|
-
//#endregion
|
|
51
|
-
export { getBrowserVersion, useBrowser };
|
package/dist/use-haptic.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
//#region src/use-haptic.d.ts
|
|
2
|
-
type Duration = number | number[];
|
|
3
|
-
declare const supportsHaptics: boolean;
|
|
4
|
-
declare const useHaptic: () => ((duration?: Duration) => void);
|
|
5
|
-
declare const useHapticsError: () => (() => void);
|
|
6
|
-
declare const useHapticsConfirm: () => (() => void);
|
|
7
|
-
//#endregion
|
|
8
|
-
export { supportsHaptics, useHaptic, useHapticsConfirm, useHapticsError };
|
package/dist/use-haptic.js
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { n as tryCatchSync } from "./try-catch-D4d3N9_W.js";
|
|
2
|
-
import { t as isServerSide } from "./env-C0PNnbwt.js";
|
|
3
|
-
import { t as logger } from "./logger-Dse1660l.js";
|
|
4
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
5
|
-
//#region src/use-haptic.ts
|
|
6
|
-
const supportsVibrate = () => typeof navigator !== "undefined" && "vibrate" in navigator;
|
|
7
|
-
const supportsIOSSwitch = () => {
|
|
8
|
-
if (typeof document === "undefined") return false;
|
|
9
|
-
const result = tryCatchSync(() => {
|
|
10
|
-
const input = document.createElement("input");
|
|
11
|
-
input.setAttribute("switch", "");
|
|
12
|
-
return input.getAttribute("switch") !== null;
|
|
13
|
-
});
|
|
14
|
-
return result.success && result.data;
|
|
15
|
-
};
|
|
16
|
-
const supportsHaptics = !isServerSide() && (supportsVibrate() || supportsIOSSwitch());
|
|
17
|
-
const logFailure = (label, fn) => {
|
|
18
|
-
const result = tryCatchSync(fn);
|
|
19
|
-
if (!result.success) logger.error(label, result.error);
|
|
20
|
-
};
|
|
21
|
-
const appendHidden = (tag) => {
|
|
22
|
-
const element = document.createElement(tag);
|
|
23
|
-
Object.assign(element.style, {
|
|
24
|
-
position: "absolute",
|
|
25
|
-
opacity: "0",
|
|
26
|
-
pointerEvents: "none"
|
|
27
|
-
});
|
|
28
|
-
document.body.appendChild(element);
|
|
29
|
-
return element;
|
|
30
|
-
};
|
|
31
|
-
const triggerIOSHaptic = () => logFailure("Error triggering iOS haptic:", () => {
|
|
32
|
-
const id = `_h${Math.random().toString(36).slice(2)}`;
|
|
33
|
-
const input = appendHidden("input");
|
|
34
|
-
input.type = "checkbox";
|
|
35
|
-
input.id = id;
|
|
36
|
-
input.setAttribute("switch", "");
|
|
37
|
-
const label = appendHidden("label");
|
|
38
|
-
label.htmlFor = id;
|
|
39
|
-
label.click();
|
|
40
|
-
label.remove();
|
|
41
|
-
input.remove();
|
|
42
|
-
});
|
|
43
|
-
const dispatchHaptic = (duration = 50) => {
|
|
44
|
-
if (supportsVibrate()) {
|
|
45
|
-
navigator.vibrate(duration);
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (Array.isArray(duration)) {
|
|
49
|
-
for (const d of duration) setTimeout(triggerIOSHaptic, Math.max(d, 101));
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
triggerIOSHaptic();
|
|
53
|
-
};
|
|
54
|
-
const useHaptic = () => dispatchHaptic;
|
|
55
|
-
const useHapticsError = () => {
|
|
56
|
-
const triggerHaptic = useHaptic();
|
|
57
|
-
const timerIds = useRef([]);
|
|
58
|
-
useEffect(() => () => {
|
|
59
|
-
for (const id of timerIds.current) clearTimeout(id);
|
|
60
|
-
timerIds.current = [];
|
|
61
|
-
}, []);
|
|
62
|
-
return useCallback(() => logFailure("Error triggering error haptic:", () => {
|
|
63
|
-
if (supportsVibrate()) {
|
|
64
|
-
triggerHaptic([
|
|
65
|
-
40,
|
|
66
|
-
60,
|
|
67
|
-
40,
|
|
68
|
-
60,
|
|
69
|
-
40,
|
|
70
|
-
60,
|
|
71
|
-
40
|
|
72
|
-
]);
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
triggerHaptic();
|
|
76
|
-
timerIds.current.push(setTimeout(() => triggerHaptic(), 100), setTimeout(() => triggerHaptic(), 200), setTimeout(() => triggerHaptic(), 300));
|
|
77
|
-
}), [triggerHaptic]);
|
|
78
|
-
};
|
|
79
|
-
const useHapticsConfirm = () => {
|
|
80
|
-
const triggerHaptic = useHaptic();
|
|
81
|
-
return useCallback(() => logFailure("Error triggering confirm haptic:", () => triggerHaptic([100])), [triggerHaptic]);
|
|
82
|
-
};
|
|
83
|
-
//#endregion
|
|
84
|
-
export { supportsHaptics, useHaptic, useHapticsConfirm, useHapticsError };
|
package/dist/use-headroom.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
//#region src/use-headroom.d.ts
|
|
2
|
-
type UseHeadroomInput = {
|
|
3
|
-
fixedAt?: number;
|
|
4
|
-
scrollDistance?: number;
|
|
5
|
-
onPin?: () => void;
|
|
6
|
-
onFix?: () => void;
|
|
7
|
-
onRelease?: () => void;
|
|
8
|
-
};
|
|
9
|
-
type UseHeadroomReturnValue = {
|
|
10
|
-
pinned: boolean;
|
|
11
|
-
scrollProgress: number;
|
|
12
|
-
};
|
|
13
|
-
declare const isFixed: (current: number, fixedAt: number) => boolean;
|
|
14
|
-
declare const isPinned: (current: number, previous: number) => boolean;
|
|
15
|
-
declare const isReleased: (current: number, previous: number, fixedAt: number) => boolean;
|
|
16
|
-
declare const useHeadroom: ({ fixedAt, scrollDistance, onPin, onFix, onRelease }?: UseHeadroomInput) => UseHeadroomReturnValue;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { type UseHeadroomInput, type UseHeadroomReturnValue, isFixed, isPinned, isReleased, useHeadroom };
|