drab 7.0.1 → 7.0.3
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/dist/announcer/define.d.ts +1 -0
- package/dist/announcer/define.d.ts.map +1 -0
- package/dist/announcer/index.d.ts +1 -0
- package/dist/announcer/index.d.ts.map +1 -0
- package/dist/base/index.d.ts +1 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/contextmenu/define.d.ts +1 -0
- package/dist/contextmenu/define.d.ts.map +1 -0
- package/dist/contextmenu/index.d.ts +2 -1
- package/dist/contextmenu/index.d.ts.map +1 -0
- package/dist/define.d.ts +1 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/dialog/define.d.ts +1 -0
- package/dist/dialog/define.d.ts.map +1 -0
- package/dist/dialog/index.d.ts +2 -1
- package/dist/dialog/index.d.ts.map +1 -0
- package/dist/dialog/index.js +2 -2
- package/dist/editor/define.d.ts +1 -0
- package/dist/editor/define.d.ts.map +1 -0
- package/dist/editor/index.d.ts +2 -1
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/fullscreen/define.d.ts +1 -0
- package/dist/fullscreen/define.d.ts.map +1 -0
- package/dist/fullscreen/index.d.ts +2 -1
- package/dist/fullscreen/index.d.ts.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/intersect/define.d.ts +1 -0
- package/dist/intersect/define.d.ts.map +1 -0
- package/dist/intersect/index.d.ts +2 -1
- package/dist/intersect/index.d.ts.map +1 -0
- package/dist/prefetch/define.d.ts +1 -0
- package/dist/prefetch/define.d.ts.map +1 -0
- package/dist/prefetch/index.d.ts +1 -0
- package/dist/prefetch/index.d.ts.map +1 -0
- package/dist/share/define.d.ts +1 -0
- package/dist/share/define.d.ts.map +1 -0
- package/dist/share/index.d.ts +2 -1
- package/dist/share/index.d.ts.map +1 -0
- package/dist/tablesort/define.d.ts +1 -0
- package/dist/tablesort/define.d.ts.map +1 -0
- package/dist/tablesort/index.d.ts +2 -1
- package/dist/tablesort/index.d.ts.map +1 -0
- package/dist/tabs/define.d.ts +1 -0
- package/dist/tabs/define.d.ts.map +1 -0
- package/dist/tabs/index.d.ts +1 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/util/define.d.ts +1 -0
- package/dist/util/define.d.ts.map +1 -0
- package/dist/util/validate.d.ts +1 -0
- package/dist/util/validate.d.ts.map +1 -0
- package/dist/wakelock/define.d.ts +1 -0
- package/dist/wakelock/define.d.ts.map +1 -0
- package/dist/wakelock/index.d.ts +2 -1
- package/dist/wakelock/index.d.ts.map +1 -0
- package/package.json +4 -2
- package/src/announcer/define.ts +4 -0
- package/src/announcer/index.ts +93 -0
- package/src/base/index.ts +290 -0
- package/src/contextmenu/define.ts +4 -0
- package/src/contextmenu/index.ts +95 -0
- package/src/define.ts +11 -0
- package/src/dialog/define.ts +4 -0
- package/src/dialog/index.ts +120 -0
- package/src/editor/define.ts +4 -0
- package/src/editor/index.ts +448 -0
- package/src/fullscreen/define.ts +4 -0
- package/src/fullscreen/index.ts +59 -0
- package/src/index.ts +11 -0
- package/src/intersect/define.ts +4 -0
- package/src/intersect/index.ts +79 -0
- package/src/prefetch/define.ts +4 -0
- package/src/prefetch/index.ts +195 -0
- package/src/share/define.ts +4 -0
- package/src/share/index.ts +99 -0
- package/src/tablesort/define.ts +4 -0
- package/src/tablesort/index.ts +168 -0
- package/src/tabs/define.ts +4 -0
- package/src/tabs/index.ts +178 -0
- package/src/types/index.ts +39 -0
- package/src/util/define.ts +10 -0
- package/src/util/validate.ts +16 -0
- package/src/wakelock/define.ts +4 -0
- package/src/wakelock/index.ts +133 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
import type { Constructor } from "../base/index.js";
|
2
|
+
|
3
|
+
/**
|
4
|
+
* @param actual Element to validate.
|
5
|
+
* @param expected Constructor of the expected element.
|
6
|
+
* @returns If valid returns `actual` otherwise throws `TypeError`.
|
7
|
+
*/
|
8
|
+
export const validate = <T extends HTMLElement>(
|
9
|
+
actual: unknown,
|
10
|
+
expected: Constructor<T>,
|
11
|
+
) => {
|
12
|
+
if (!(actual instanceof expected))
|
13
|
+
throw new TypeError(`${actual} is not an instance of ${expected.name}.`);
|
14
|
+
|
15
|
+
return actual;
|
16
|
+
};
|
@@ -0,0 +1,133 @@
|
|
1
|
+
import {
|
2
|
+
Announce,
|
3
|
+
Content,
|
4
|
+
type ContentAttributes,
|
5
|
+
Lifecycle,
|
6
|
+
Trigger,
|
7
|
+
type TriggerAttributes,
|
8
|
+
} from "../base/index.js";
|
9
|
+
|
10
|
+
export interface WakeLockAttributes
|
11
|
+
extends TriggerAttributes,
|
12
|
+
ContentAttributes {
|
13
|
+
/** Auto request wakelock when user returns to inactive tab. */
|
14
|
+
"auto-lock"?: boolean;
|
15
|
+
|
16
|
+
/** Set to request wakelock immediately when the element has connected. */
|
17
|
+
locked?: boolean;
|
18
|
+
}
|
19
|
+
|
20
|
+
/**
|
21
|
+
* `WakeLock` uses the
|
22
|
+
* [WakeLock API](https://developer.mozilla.org/en-US/docs/Web/API/Screen_Wake_Lock_API)
|
23
|
+
* to ensure the screen does not turn off when viewing the page on supported devices.
|
24
|
+
* Use your best judgement for when this is necessary, for example, if you have a timer
|
25
|
+
* that needs to stay on, or you are displaying a QR code.
|
26
|
+
*
|
27
|
+
* - Use `content` and `swap` elements to adjust the UI based on the current state.
|
28
|
+
* - `trigger` is disabled if not supported.
|
29
|
+
* - WakeLock is released when the element is removed from the DOM.
|
30
|
+
*
|
31
|
+
* ### Attributes
|
32
|
+
*
|
33
|
+
* `auto-lock`
|
34
|
+
*
|
35
|
+
* By default, the WakeLock will be released when the tab is not active. Use the
|
36
|
+
* `auto-lock` attribute to automatically request the WakeLock when the user views
|
37
|
+
* the tab again.
|
38
|
+
*
|
39
|
+
* `locked`
|
40
|
+
*
|
41
|
+
* WakeLock can be toggled with a `trigger`, or will be requested if the element has
|
42
|
+
* a `locked` attribute when connected.
|
43
|
+
*/
|
44
|
+
export class WakeLock extends Lifecycle(Trigger(Content(Announce()))) {
|
45
|
+
#wakeLock: WakeLockSentinel | null = null;
|
46
|
+
|
47
|
+
constructor() {
|
48
|
+
super();
|
49
|
+
}
|
50
|
+
|
51
|
+
/** If the WakeLock API is supported on the user's device. */
|
52
|
+
#wakeLockSupported() {
|
53
|
+
return "wakeLock" in navigator;
|
54
|
+
}
|
55
|
+
|
56
|
+
/**
|
57
|
+
* the `auto-lock` attribute controls whether an active WakeLock should be restored when navigating back to
|
58
|
+
* the page.
|
59
|
+
*/
|
60
|
+
get #autoLock() {
|
61
|
+
return this.hasAttribute("auto-lock");
|
62
|
+
}
|
63
|
+
|
64
|
+
/** Requests WakeLock on the current page. */
|
65
|
+
async request() {
|
66
|
+
if (this.#wakeLockSupported() && document.visibilityState === "visible") {
|
67
|
+
this.#wakeLock = await navigator.wakeLock.request("screen");
|
68
|
+
this.setAttribute("locked", "");
|
69
|
+
this.announce("screen wake lock activated");
|
70
|
+
this.swap(false);
|
71
|
+
|
72
|
+
this.#wakeLock.addEventListener("release", () => {
|
73
|
+
this.removeAttribute("locked");
|
74
|
+
this.announce("screen wake lock deactivated");
|
75
|
+
this.swap(false);
|
76
|
+
|
77
|
+
if (!this.#autoLock) {
|
78
|
+
// set to null is required, used to determine if screen should be
|
79
|
+
// locked again, see visibilitychange listener
|
80
|
+
this.#wakeLock = null;
|
81
|
+
}
|
82
|
+
});
|
83
|
+
}
|
84
|
+
}
|
85
|
+
|
86
|
+
/** Releases the WakeLock, sets `this.wakeLock` to null. */
|
87
|
+
async release() {
|
88
|
+
await this.#wakeLock?.release();
|
89
|
+
this.#wakeLock = null;
|
90
|
+
}
|
91
|
+
|
92
|
+
override mount() {
|
93
|
+
// lock on mount if the `locked` attribute is present
|
94
|
+
if (this.hasAttribute("locked")) {
|
95
|
+
this.request();
|
96
|
+
}
|
97
|
+
|
98
|
+
this.listener(() => {
|
99
|
+
// toggle
|
100
|
+
if (this.#wakeLock) {
|
101
|
+
this.release();
|
102
|
+
} else {
|
103
|
+
this.request();
|
104
|
+
}
|
105
|
+
});
|
106
|
+
|
107
|
+
for (const trigger of this.triggers()) {
|
108
|
+
if (!this.#wakeLockSupported() && "disabled" in trigger) {
|
109
|
+
// disable `trigger` if not supported
|
110
|
+
trigger.disabled = true;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
if (this.#autoLock) {
|
115
|
+
this.safeListener(
|
116
|
+
"visibilitychange",
|
117
|
+
() => {
|
118
|
+
// When the tab is not visible, the wakeLock is automatically released.
|
119
|
+
// This requests it back if it exists, if it is `null`, that
|
120
|
+
// means it was removed. In which case, it shouldn't be requested again.
|
121
|
+
if (this.#wakeLock) {
|
122
|
+
this.request();
|
123
|
+
}
|
124
|
+
},
|
125
|
+
document,
|
126
|
+
);
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
override destroy() {
|
131
|
+
this.release();
|
132
|
+
}
|
133
|
+
}
|