drab 7.0.1 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/announcer/define.d.ts +1 -0
  2. package/dist/announcer/define.d.ts.map +1 -0
  3. package/dist/announcer/index.d.ts +1 -0
  4. package/dist/announcer/index.d.ts.map +1 -0
  5. package/dist/base/index.d.ts +1 -0
  6. package/dist/base/index.d.ts.map +1 -0
  7. package/dist/contextmenu/define.d.ts +1 -0
  8. package/dist/contextmenu/define.d.ts.map +1 -0
  9. package/dist/contextmenu/index.d.ts +2 -1
  10. package/dist/contextmenu/index.d.ts.map +1 -0
  11. package/dist/define.d.ts +1 -0
  12. package/dist/define.d.ts.map +1 -0
  13. package/dist/dialog/define.d.ts +1 -0
  14. package/dist/dialog/define.d.ts.map +1 -0
  15. package/dist/dialog/index.d.ts +2 -1
  16. package/dist/dialog/index.d.ts.map +1 -0
  17. package/dist/editor/define.d.ts +1 -0
  18. package/dist/editor/define.d.ts.map +1 -0
  19. package/dist/editor/index.d.ts +2 -1
  20. package/dist/editor/index.d.ts.map +1 -0
  21. package/dist/fullscreen/define.d.ts +1 -0
  22. package/dist/fullscreen/define.d.ts.map +1 -0
  23. package/dist/fullscreen/index.d.ts +2 -1
  24. package/dist/fullscreen/index.d.ts.map +1 -0
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/intersect/define.d.ts +1 -0
  28. package/dist/intersect/define.d.ts.map +1 -0
  29. package/dist/intersect/index.d.ts +2 -1
  30. package/dist/intersect/index.d.ts.map +1 -0
  31. package/dist/prefetch/define.d.ts +1 -0
  32. package/dist/prefetch/define.d.ts.map +1 -0
  33. package/dist/prefetch/index.d.ts +1 -0
  34. package/dist/prefetch/index.d.ts.map +1 -0
  35. package/dist/share/define.d.ts +1 -0
  36. package/dist/share/define.d.ts.map +1 -0
  37. package/dist/share/index.d.ts +2 -1
  38. package/dist/share/index.d.ts.map +1 -0
  39. package/dist/tablesort/define.d.ts +1 -0
  40. package/dist/tablesort/define.d.ts.map +1 -0
  41. package/dist/tablesort/index.d.ts +2 -1
  42. package/dist/tablesort/index.d.ts.map +1 -0
  43. package/dist/tabs/define.d.ts +1 -0
  44. package/dist/tabs/define.d.ts.map +1 -0
  45. package/dist/tabs/index.d.ts +1 -0
  46. package/dist/tabs/index.d.ts.map +1 -0
  47. package/dist/types/index.d.ts +1 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/util/define.d.ts +1 -0
  50. package/dist/util/define.d.ts.map +1 -0
  51. package/dist/util/validate.d.ts +1 -0
  52. package/dist/util/validate.d.ts.map +1 -0
  53. package/dist/wakelock/define.d.ts +1 -0
  54. package/dist/wakelock/define.d.ts.map +1 -0
  55. package/dist/wakelock/index.d.ts +2 -1
  56. package/dist/wakelock/index.d.ts.map +1 -0
  57. package/package.json +4 -2
  58. package/src/announcer/define.ts +4 -0
  59. package/src/announcer/index.ts +93 -0
  60. package/src/base/index.ts +290 -0
  61. package/src/contextmenu/define.ts +4 -0
  62. package/src/contextmenu/index.ts +95 -0
  63. package/src/define.ts +11 -0
  64. package/src/dialog/define.ts +4 -0
  65. package/src/dialog/index.ts +120 -0
  66. package/src/editor/define.ts +4 -0
  67. package/src/editor/index.ts +448 -0
  68. package/src/fullscreen/define.ts +4 -0
  69. package/src/fullscreen/index.ts +59 -0
  70. package/src/index.ts +11 -0
  71. package/src/intersect/define.ts +4 -0
  72. package/src/intersect/index.ts +79 -0
  73. package/src/prefetch/define.ts +4 -0
  74. package/src/prefetch/index.ts +195 -0
  75. package/src/share/define.ts +4 -0
  76. package/src/share/index.ts +99 -0
  77. package/src/tablesort/define.ts +4 -0
  78. package/src/tablesort/index.ts +168 -0
  79. package/src/tabs/define.ts +4 -0
  80. package/src/tabs/index.ts +173 -0
  81. package/src/types/index.ts +39 -0
  82. package/src/util/define.ts +10 -0
  83. package/src/util/validate.ts +16 -0
  84. package/src/wakelock/define.ts +4 -0
  85. 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,4 @@
1
+ import { define } from "../util/define.js";
2
+ import { WakeLock } from "./index.js";
3
+
4
+ define("drab-wakelock", WakeLock);
@@ -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
+ }