@helpwave/hightide 0.1.27 → 0.1.28

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 (134) hide show
  1. package/dist/coloring/index.d.mts +2 -0
  2. package/dist/coloring/index.d.ts +2 -0
  3. package/dist/coloring/index.js +85 -0
  4. package/dist/coloring/index.js.map +1 -0
  5. package/dist/coloring/index.mjs +48 -0
  6. package/dist/coloring/index.mjs.map +1 -0
  7. package/dist/components/branding/index.d.mts +3 -0
  8. package/dist/components/branding/index.d.ts +3 -0
  9. package/dist/components/branding/index.js +140 -0
  10. package/dist/components/branding/index.js.map +1 -0
  11. package/dist/components/branding/index.mjs +104 -0
  12. package/dist/components/branding/index.mjs.map +1 -0
  13. package/dist/components/date/index.d.mts +10 -0
  14. package/dist/components/date/index.d.ts +10 -0
  15. package/dist/components/date/index.js +1168 -0
  16. package/dist/components/date/index.js.map +1 -0
  17. package/dist/components/date/index.mjs +1124 -0
  18. package/dist/components/date/index.mjs.map +1 -0
  19. package/dist/components/dialog/index.js.map +1 -1
  20. package/dist/components/form/index.d.mts +5 -0
  21. package/dist/components/form/index.d.ts +5 -0
  22. package/dist/components/form/index.js +100 -0
  23. package/dist/components/form/index.js.map +1 -0
  24. package/dist/components/form/index.mjs +64 -0
  25. package/dist/components/form/index.mjs.map +1 -0
  26. package/dist/components/icons-and-geometry/index.d.mts +7 -0
  27. package/dist/components/icons-and-geometry/index.d.ts +7 -0
  28. package/dist/components/icons-and-geometry/index.js +3955 -0
  29. package/dist/components/icons-and-geometry/index.js.map +1 -0
  30. package/dist/components/icons-and-geometry/index.mjs +3939 -0
  31. package/dist/components/icons-and-geometry/index.mjs.map +1 -0
  32. package/dist/components/index.d.mts +83 -0
  33. package/dist/components/index.d.ts +83 -0
  34. package/dist/components/index.js +15471 -0
  35. package/dist/components/index.js.map +1 -0
  36. package/dist/components/index.mjs +15377 -0
  37. package/dist/components/index.mjs.map +1 -0
  38. package/dist/components/layout/index.d.mts +18 -0
  39. package/dist/components/layout/index.d.ts +18 -0
  40. package/dist/components/layout/index.js +3111 -0
  41. package/dist/components/layout/index.js.map +1 -0
  42. package/dist/components/layout/index.mjs +3064 -0
  43. package/dist/components/layout/index.mjs.map +1 -0
  44. package/dist/components/loading-states/index.d.mts +12 -0
  45. package/dist/components/loading-states/index.d.ts +12 -0
  46. package/dist/components/loading-states/index.js +614 -0
  47. package/dist/components/loading-states/index.js.map +1 -0
  48. package/dist/components/loading-states/index.mjs +573 -0
  49. package/dist/components/loading-states/index.mjs.map +1 -0
  50. package/dist/components/navigation/index.d.mts +9 -0
  51. package/dist/components/navigation/index.d.ts +9 -0
  52. package/dist/components/navigation/index.js +4660 -0
  53. package/dist/components/navigation/index.js.map +1 -0
  54. package/dist/components/navigation/index.mjs +4648 -0
  55. package/dist/components/navigation/index.mjs.map +1 -0
  56. package/dist/components/properties/index.d.mts +12 -0
  57. package/dist/components/properties/index.d.ts +12 -0
  58. package/dist/components/properties/index.js +2983 -0
  59. package/dist/components/properties/index.js.map +1 -0
  60. package/dist/components/properties/index.mjs +2951 -0
  61. package/dist/components/properties/index.mjs.map +1 -0
  62. package/dist/components/table/index.d.mts +10 -0
  63. package/dist/components/table/index.d.ts +10 -0
  64. package/dist/components/table/index.js +2329 -0
  65. package/dist/components/table/index.js.map +1 -0
  66. package/dist/components/table/index.mjs +2293 -0
  67. package/dist/components/table/index.mjs.map +1 -0
  68. package/dist/components/user-action/index.d.mts +30 -0
  69. package/dist/components/user-action/index.d.ts +30 -0
  70. package/dist/components/user-action/index.js +4257 -0
  71. package/dist/components/user-action/index.js.map +1 -0
  72. package/dist/components/user-action/index.mjs +4195 -0
  73. package/dist/components/user-action/index.mjs.map +1 -0
  74. package/dist/components/user-action/input/index.d.mts +6 -0
  75. package/dist/components/user-action/input/index.d.ts +6 -0
  76. package/dist/components/user-action/input/index.js +398 -0
  77. package/dist/components/user-action/input/index.js.map +1 -0
  78. package/dist/components/user-action/input/index.mjs +357 -0
  79. package/dist/components/user-action/input/index.mjs.map +1 -0
  80. package/dist/components/user-action/select/index.d.mts +4 -0
  81. package/dist/components/user-action/select/index.d.ts +4 -0
  82. package/dist/components/user-action/select/index.js +1369 -0
  83. package/dist/components/user-action/select/index.js.map +1 -0
  84. package/dist/components/user-action/select/index.mjs +1333 -0
  85. package/dist/components/user-action/select/index.mjs.map +1 -0
  86. package/dist/components/utils/index.d.mts +4 -0
  87. package/dist/components/utils/index.d.ts +4 -0
  88. package/dist/components/utils/index.js +302 -0
  89. package/dist/components/utils/index.js.map +1 -0
  90. package/dist/components/utils/index.mjs +275 -0
  91. package/dist/components/utils/index.mjs.map +1 -0
  92. package/dist/hooks/focus/index.d.mts +6 -0
  93. package/dist/hooks/focus/index.d.ts +6 -0
  94. package/dist/hooks/focus/index.js +379 -0
  95. package/dist/hooks/focus/index.js.map +1 -0
  96. package/dist/hooks/focus/index.mjs +339 -0
  97. package/dist/hooks/focus/index.mjs.map +1 -0
  98. package/dist/hooks/index.d.mts +16 -0
  99. package/dist/hooks/index.d.ts +16 -0
  100. package/dist/hooks/index.js +844 -0
  101. package/dist/hooks/index.js.map +1 -0
  102. package/dist/hooks/index.mjs +794 -0
  103. package/dist/hooks/index.mjs.map +1 -0
  104. package/dist/index.d.mts +110 -0
  105. package/dist/index.d.ts +110 -0
  106. package/dist/index.js +16101 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/index.mjs +15941 -0
  109. package/dist/index.mjs.map +1 -0
  110. package/dist/localization/defaults/index.d.mts +4 -0
  111. package/dist/localization/defaults/index.d.ts +4 -0
  112. package/dist/localization/defaults/index.js +223 -0
  113. package/dist/localization/defaults/index.js.map +1 -0
  114. package/dist/localization/defaults/index.mjs +195 -0
  115. package/dist/localization/defaults/index.mjs.map +1 -0
  116. package/dist/localization/index.d.mts +7 -0
  117. package/dist/localization/index.d.ts +7 -0
  118. package/dist/localization/index.js +415 -0
  119. package/dist/localization/index.js.map +1 -0
  120. package/dist/localization/index.mjs +380 -0
  121. package/dist/localization/index.mjs.map +1 -0
  122. package/dist/theming/index.d.mts +5 -0
  123. package/dist/theming/index.d.ts +5 -0
  124. package/dist/theming/index.js +174 -0
  125. package/dist/theming/index.js.map +1 -0
  126. package/dist/theming/index.mjs +145 -0
  127. package/dist/theming/index.mjs.map +1 -0
  128. package/dist/utils/index.d.mts +15 -0
  129. package/dist/utils/index.d.ts +15 -0
  130. package/dist/utils/index.js +553 -0
  131. package/dist/utils/index.js.map +1 -0
  132. package/dist/utils/index.mjs +493 -0
  133. package/dist/utils/index.mjs.map +1 -0
  134. package/package.json +25 -24
@@ -0,0 +1,275 @@
1
+ // src/components/utils/FocusTrap.tsx
2
+ import { useRef as useRef2 } from "react";
3
+ import { useImperativeHandle } from "react";
4
+ import { forwardRef } from "react";
5
+
6
+ // src/hooks/focus/useFocusTrap.ts
7
+ import { useCallback, useEffect as useEffect2, useId, useRef, useState as useState2 } from "react";
8
+
9
+ // src/hooks/focus/useIsMounted.ts
10
+ import { useEffect, useLayoutEffect, useState } from "react";
11
+ var isClient = typeof window !== "undefined" && typeof document !== "undefined";
12
+ var useIsomorphicEffect = isClient ? useLayoutEffect : useEffect;
13
+ var useIsMounted = () => {
14
+ const [isMounted, setIsMounted] = useState(false);
15
+ useIsomorphicEffect(() => {
16
+ setIsMounted(true);
17
+ return () => {
18
+ setIsMounted(false);
19
+ };
20
+ }, []);
21
+ return isMounted;
22
+ };
23
+
24
+ // src/hooks/focus/useFocusTrap.ts
25
+ var createFocusGuard = () => {
26
+ const div = document.createElement("div");
27
+ Object.assign(div.style, {
28
+ opacity: "0",
29
+ outline: "none",
30
+ boxShadow: "none",
31
+ position: "fixed",
32
+ pointerEvents: "none",
33
+ touchAction: "none"
34
+ });
35
+ div.tabIndex = 0;
36
+ div.setAttribute("data-hw-focus-guard", "");
37
+ document.body.appendChild(div);
38
+ return div;
39
+ };
40
+ function getContainedFocusableElements(element) {
41
+ return element?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
42
+ }
43
+ var FocusTrapService = class {
44
+ constructor() {
45
+ // The last entry is always the active one
46
+ this.listeners = [];
47
+ this.onFocusIn = (event) => {
48
+ const active = this.getActive();
49
+ if (!active || !active.container.current) return;
50
+ const { container } = active;
51
+ if (!container.current.contains(event.target)) {
52
+ this.focusElement();
53
+ }
54
+ };
55
+ }
56
+ getActive() {
57
+ if (this.listeners.length === 0) return void 0;
58
+ return this.listeners[this.listeners.length - 1];
59
+ }
60
+ focusElement() {
61
+ const active = this.getActive();
62
+ if (!active) return;
63
+ const { container, initialFocusElement } = active;
64
+ const containerElement = container.current;
65
+ if (initialFocusElement?.current) {
66
+ initialFocusElement.current.focus();
67
+ } else {
68
+ const elements = getContainedFocusableElements(containerElement);
69
+ if (elements && elements.length > 0) {
70
+ const first = elements.item(0);
71
+ first.focus();
72
+ } else {
73
+ containerElement.focus();
74
+ }
75
+ }
76
+ }
77
+ removeGuards() {
78
+ document.querySelectorAll("[data-hw-focus-guard]").forEach((node) => node.remove());
79
+ }
80
+ addGuards() {
81
+ document.body.insertAdjacentElement("afterbegin", createFocusGuard());
82
+ document.body.insertAdjacentElement("beforeend", createFocusGuard());
83
+ }
84
+ activate() {
85
+ document.addEventListener("focusin", this.onFocusIn);
86
+ this.addGuards();
87
+ }
88
+ deactivate() {
89
+ document.removeEventListener("focusin", this.onFocusIn);
90
+ this.removeGuards();
91
+ }
92
+ register(listener) {
93
+ this.listeners.push(listener);
94
+ if (this.listeners.length === 1) {
95
+ this.activate();
96
+ }
97
+ const active = listener;
98
+ this.listeners.forEach((listener2) => {
99
+ const { focus, pause } = listener2;
100
+ if (listener2 === active) {
101
+ focus();
102
+ } else {
103
+ pause();
104
+ }
105
+ });
106
+ }
107
+ unregister(id) {
108
+ const index = this.listeners.findIndex((trap) => trap.id === id);
109
+ if (index !== -1) {
110
+ const isActive = index === this.listeners.length - 1;
111
+ const listener = this.listeners[index];
112
+ this.listeners = this.listeners.filter((listener2) => listener2.id !== id);
113
+ if (isActive) {
114
+ this.deactivate();
115
+ listener.focusLast();
116
+ const active = this.getActive();
117
+ this.listeners.forEach((listener2) => {
118
+ const { pause, unpause } = listener2;
119
+ if (listener2 === active) {
120
+ unpause();
121
+ } else {
122
+ pause();
123
+ }
124
+ });
125
+ if (this.listeners.length > 0) {
126
+ this.activate();
127
+ }
128
+ }
129
+ } else {
130
+ console.warn(`Unable to unregister id ${id}: not found`);
131
+ }
132
+ }
133
+ };
134
+ var service = new FocusTrapService();
135
+ var useFocusTrap = ({
136
+ container,
137
+ active = true,
138
+ initialFocus,
139
+ focusFirst = true
140
+ }) => {
141
+ const lastFocusRef = useRef(null);
142
+ const [paused, setPaused] = useState2(false);
143
+ const isMounted = useIsMounted();
144
+ const id = useId();
145
+ const focusElement = useCallback(() => {
146
+ const containerElement = container.current;
147
+ if (initialFocus?.current) {
148
+ initialFocus.current.focus();
149
+ } else {
150
+ const elements = getContainedFocusableElements(containerElement);
151
+ if (elements && elements.length > 0) {
152
+ const first = elements.item(0);
153
+ first.focus();
154
+ } else {
155
+ containerElement.focus();
156
+ }
157
+ }
158
+ }, [container, initialFocus]);
159
+ useEffect2(() => {
160
+ if (active && isMounted) {
161
+ let pause = function() {
162
+ setPaused(true);
163
+ }, unpause = function() {
164
+ setPaused(false);
165
+ if (!container.current.contains(document.activeElement)) {
166
+ focusElement();
167
+ }
168
+ }, focus = function() {
169
+ focusElement();
170
+ setPaused(false);
171
+ }, focusLast = function() {
172
+ lastFocusRef.current?.focus();
173
+ };
174
+ if (!lastFocusRef.current) {
175
+ lastFocusRef.current = document.activeElement;
176
+ }
177
+ service.register({ id, pause, focus, focusLast, unpause, container, initialFocusElement: initialFocus });
178
+ return () => {
179
+ service.unregister(id);
180
+ lastFocusRef.current = void 0;
181
+ };
182
+ }
183
+ }, [active, container, focusElement, id, initialFocus, isMounted]);
184
+ useEffect2(() => {
185
+ if (active && !paused && isMounted) {
186
+ let onKeyDown = function(event) {
187
+ const key = event.key;
188
+ const elements = getContainedFocusableElements(containerElement);
189
+ const active2 = document.activeElement;
190
+ const index = [...elements].findIndex((value) => value === active2);
191
+ if (index === -1 || event.altKey || event.ctrlKey || event.metaKey) {
192
+ return;
193
+ }
194
+ if (key === "Tab") {
195
+ const next = event.shiftKey ? -1 : 1;
196
+ const nextIndex = (index + next + elements.length) % elements.length;
197
+ const nextElement = elements[nextIndex];
198
+ nextElement.focus();
199
+ event.preventDefault();
200
+ }
201
+ };
202
+ const containerElement = container.current;
203
+ containerElement.addEventListener("keydown", onKeyDown);
204
+ return () => {
205
+ containerElement.removeEventListener("keydown", onKeyDown);
206
+ };
207
+ }
208
+ }, [active, paused, isMounted, container, initialFocus, focusFirst, focusElement]);
209
+ };
210
+
211
+ // src/components/utils/FocusTrap.tsx
212
+ import { jsx } from "react/jsx-runtime";
213
+ var FocusTrap = forwardRef(function FocusTrap2({
214
+ active = true,
215
+ initialFocus,
216
+ focusFirst = false,
217
+ ...props
218
+ }, forwardedRef) {
219
+ const innerRef = useRef2(null);
220
+ useImperativeHandle(forwardedRef, () => innerRef.current);
221
+ useFocusTrap({ container: innerRef, active, initialFocus, focusFirst });
222
+ return /* @__PURE__ */ jsx("div", { ref: innerRef, ...props });
223
+ });
224
+
225
+ // src/components/utils/Transition.tsx
226
+ import { useEffect as useEffect3, useState as useState3 } from "react";
227
+
228
+ // src/utils/bagFunctions.ts
229
+ var resolve = (children, bag) => {
230
+ if (typeof children === "function") {
231
+ return children(bag);
232
+ }
233
+ return children ?? void 0;
234
+ };
235
+ var BagFunctionUtil = {
236
+ resolve
237
+ };
238
+
239
+ // src/components/utils/Transition.tsx
240
+ function Transition({
241
+ children,
242
+ show,
243
+ includeAnimation = true
244
+ }) {
245
+ const [isOpen, setIsOpen] = useState3(show);
246
+ const [isTransitioning, setIsTransitioning] = useState3(!isOpen);
247
+ const isUsingReducedMotion = typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(prefers-reduced-motion: reduce)").matches : true;
248
+ useEffect3(() => {
249
+ setIsOpen(show);
250
+ setIsTransitioning(true);
251
+ }, [show]);
252
+ const onAnimationEnd = () => setIsTransitioning(false);
253
+ const bag = {
254
+ isOpen,
255
+ isTransitioning,
256
+ isUsingReducedMotion,
257
+ data: {
258
+ "data-open": isOpen && !isTransitioning ? "" : void 0,
259
+ "data-opening": isOpen && isTransitioning ? "" : void 0,
260
+ "data-closing": !isOpen && isTransitioning ? "" : void 0,
261
+ "data-closed": !isOpen && !isTransitioning ? "" : void 0
262
+ },
263
+ handlers: {
264
+ onTransitionEnd: () => setIsTransitioning(false),
265
+ onTransitionCancel: () => setIsTransitioning(false),
266
+ onAnimationEnd: includeAnimation ? onAnimationEnd : void 0
267
+ }
268
+ };
269
+ return BagFunctionUtil.resolve(children, bag);
270
+ }
271
+ export {
272
+ FocusTrap,
273
+ Transition
274
+ };
275
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/utils/FocusTrap.tsx","../../../src/hooks/focus/useFocusTrap.ts","../../../src/hooks/focus/useIsMounted.ts","../../../src/components/utils/Transition.tsx","../../../src/utils/bagFunctions.ts"],"sourcesContent":["'use client'\n\nimport type { HTMLAttributes, MutableRefObject } from 'react'\nimport { useRef } from 'react'\nimport { useImperativeHandle } from 'react'\nimport { forwardRef } from 'react'\nimport { useFocusTrap } from '@/src/hooks/focus/useFocusTrap'\n\nexport type FocusTrapProps = HTMLAttributes<HTMLDivElement> & {\n active?: boolean,\n initialFocus?: MutableRefObject<HTMLElement>,\n /**\n * Whether to focus the first element when the initialFocus isn't provided\n *\n * Focuses the container instead\n */\n focusFirst?: boolean,\n}\n\n/**\n * A wrapper for the useFocusTrap hook that directly renders it to a div\n */\nexport const FocusTrap = forwardRef<HTMLDivElement, FocusTrapProps>(function FocusTrap({\n active = true,\n initialFocus,\n focusFirst = false,\n ...props\n }, forwardedRef) {\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(forwardedRef, () => innerRef.current)\n\n useFocusTrap({ container: innerRef, active, initialFocus, focusFirst })\n\n return (\n <div ref={innerRef} {...props}/>\n )\n})","'use client'\n\nimport type { MutableRefObject } from 'react'\nimport { useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { useIsMounted } from '@/src/hooks/focus/useIsMounted'\n\nconst createFocusGuard = () => {\n const div = document.createElement('div')\n Object.assign(div.style, {\n opacity: '0',\n outline: 'none',\n boxShadow: 'none',\n position: 'fixed',\n pointerEvents: 'none',\n touchAction: 'none',\n })\n div.tabIndex = 0\n div.setAttribute('data-hw-focus-guard', '')\n document.body.appendChild(div)\n return div\n}\n\nfunction getContainedFocusableElements(element: HTMLElement) {\n return element?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n}\n\ntype ListenerType = {\n id: string,\n pause: () => void,\n unpause: () => void,\n focus: () => void,\n focusLast: () => void,\n container: MutableRefObject<HTMLElement>,\n initialFocusElement: MutableRefObject<HTMLElement>,\n}\n\nclass FocusTrapService {\n // The last entry is always the active one\n private listeners: ListenerType[] = []\n\n public getActive(): ListenerType | undefined {\n if (this.listeners.length === 0) return undefined\n return this.listeners[this.listeners.length - 1]\n }\n\n private focusElement() {\n const active = this.getActive()\n if(!active) return\n const { container, initialFocusElement } = active\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocusElement?.current) {\n initialFocusElement.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }\n\n private onFocusIn = (event: FocusEvent) => {\n const active = this.getActive()\n if(!active || !active.container.current) return\n const { container } = active\n if (!container.current.contains(event.target as HTMLElement)) {\n this.focusElement()\n }\n }\n\n private removeGuards() {\n document.querySelectorAll('[data-hw-focus-guard]').forEach((node) => node.remove())\n }\n\n private addGuards() {\n document.body.insertAdjacentElement('afterbegin', createFocusGuard())\n document.body.insertAdjacentElement('beforeend', createFocusGuard())\n }\n\n private activate() {\n document.addEventListener('focusin', this.onFocusIn)\n this.addGuards()\n }\n\n private deactivate() {\n document.removeEventListener('focusin', this.onFocusIn)\n this.removeGuards()\n }\n\n register(listener: ListenerType) {\n this.listeners.push(listener)\n if (this.listeners.length === 1) {\n this.activate()\n }\n const active = listener\n this.listeners.forEach((listener) => {\n const { focus, pause } = listener\n if (listener === active) {\n focus()\n } else {\n pause()\n }\n })\n }\n\n unregister(id: string) {\n const index = this.listeners.findIndex(trap => trap.id === id)\n if (index !== -1) {\n const isActive = index === this.listeners.length - 1\n const listener = this.listeners[index]\n this.listeners = this.listeners.filter(listener => listener.id !== id)\n if (isActive) {\n // Deactivate all focus traps\n this.deactivate()\n // Focus last element in previous focus context\n listener.focusLast()\n // Activate and pause remaining focus traps\n const active = this.getActive()\n this.listeners.forEach((listener) => {\n const { pause, unpause } = listener\n if (listener === active) {\n unpause()\n } else {\n pause()\n }\n })\n // Reactivate\n if (this.listeners.length > 0) {\n this.activate()\n }\n }\n } else {\n console.warn(`Unable to unregister id ${id}: not found`)\n }\n }\n}\n\nconst service = new FocusTrapService()\n\nexport type UseFocusTrapProps = {\n container: MutableRefObject<HTMLElement>,\n active?: boolean,\n initialFocus?: MutableRefObject<HTMLElement>,\n /**\n * Whether to focus the first element when the initialFocus isn't provided\n *\n * Focuses the container instead\n */\n focusFirst?: boolean,\n}\n\nexport const useFocusTrap = ({\n container,\n active = true,\n initialFocus,\n focusFirst = true,\n }: UseFocusTrapProps) => {\n const lastFocusRef = useRef<HTMLElement | null>(null)\n const [paused, setPaused] = useState(false)\n const isMounted = useIsMounted()\n const id = useId()\n\n const focusElement = useCallback(() => {\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocus?.current) {\n initialFocus.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }, [container, initialFocus])\n\n useEffect(() => {\n if (active && isMounted) {\n if (!lastFocusRef.current) {\n lastFocusRef.current = document.activeElement as HTMLElement\n }\n\n function pause() {\n setPaused(true)\n }\n\n function unpause() {\n setPaused(false)\n if (!container.current.contains(document.activeElement as HTMLElement)) {\n focusElement()\n }\n }\n\n function focus() {\n focusElement()\n setPaused(false)\n }\n\n function focusLast() {\n lastFocusRef.current?.focus()\n }\n\n service.register({ id, pause, focus, focusLast, unpause, container, initialFocusElement: initialFocus })\n return () => {\n service.unregister(id)\n lastFocusRef.current = undefined\n }\n }\n }, [active, container, focusElement, id, initialFocus, isMounted])\n\n useEffect(() => {\n if (active && !paused && isMounted) {\n const containerElement = container.current\n\n function onKeyDown(event: KeyboardEvent) {\n const key = event.key\n const elements = getContainedFocusableElements(containerElement)\n const active = document.activeElement as HTMLElement\n const index = [...elements].findIndex(value => value === active)\n if (index === -1 || event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n if (key === 'Tab') {\n const next = event.shiftKey ? -1 : 1\n const nextIndex = (index + next + elements.length) % elements.length\n const nextElement = elements[nextIndex] as HTMLElement\n nextElement.focus()\n event.preventDefault()\n }\n }\n\n // Register and unregister the listeners\n containerElement.addEventListener('keydown', onKeyDown)\n return () => {\n containerElement.removeEventListener('keydown', onKeyDown)\n }\n }\n }, [active, paused, isMounted, container, initialFocus, focusFirst, focusElement])\n}","'use client'\n\nimport { useEffect, useLayoutEffect, useState } from 'react'\n\nconst isClient = typeof window !== 'undefined' && typeof document !== 'undefined'\nconst useIsomorphicEffect = isClient ? useLayoutEffect : useEffect\n\nexport const useIsMounted = () => {\n const [isMounted, setIsMounted] = useState(false)\n\n useIsomorphicEffect(() => {\n setIsMounted(true)\n return () => {\n setIsMounted(false)\n }\n }, [])\n return isMounted\n}","import { useEffect, useState } from 'react'\nimport type { PropsWithBagFunctionOrChildren } from '@/src/utils/bagFunctions'\nimport { BagFunctionUtil } from '@/src/utils/bagFunctions'\n\ntype TransitionBag = {\n isOpen: boolean,\n isTransitioning: boolean,\n isUsingReducedMotion: boolean,\n data: { [key: `data-${string}`]: string | undefined },\n handlers: {\n onTransitionEnd?: () => void,\n onAnimationEnd?: () => void,\n onTransitionCancel?: () => void,\n },\n}\n\nexport type TransitionWrapperProps = PropsWithBagFunctionOrChildren<TransitionBag> & {\n show: boolean,\n includeAnimation?: boolean,\n}\n\n/**\n * Only use when you have a transition happening\n */\nexport function Transition({\n children,\n show,\n includeAnimation = true,\n }: TransitionWrapperProps) {\n const [isOpen, setIsOpen] = useState<boolean>(show)\n const [isTransitioning, setIsTransitioning] = useState<boolean>(!isOpen)\n\n const isUsingReducedMotion = typeof window !== 'undefined' && typeof window.matchMedia === 'function' ?\n window.matchMedia('(prefers-reduced-motion: reduce)').matches : true\n\n useEffect(() => {\n setIsOpen(show)\n setIsTransitioning(true)\n }, [show])\n\n const onAnimationEnd = () => setIsTransitioning(false)\n\n const bag: TransitionBag = {\n isOpen,\n isTransitioning,\n isUsingReducedMotion,\n data: {\n 'data-open': (isOpen && !isTransitioning) ? '' : undefined,\n 'data-opening': (isOpen && isTransitioning) ? '' : undefined,\n 'data-closing': (!isOpen && isTransitioning) ? '' : undefined,\n 'data-closed': (!isOpen && !isTransitioning) ? '' : undefined,\n },\n handlers: {\n onTransitionEnd: () => setIsTransitioning(false),\n onTransitionCancel: () => setIsTransitioning(false),\n onAnimationEnd: includeAnimation ? onAnimationEnd : undefined,\n }\n }\n\n return BagFunctionUtil.resolve(children, bag)\n}","import type { ReactNode } from 'react'\n\nexport type BagFunction<T> = (bag: T) => ReactNode\n\nexport type BagFunctionOrNode<T> = BagFunction<T> | ReactNode\n\nexport type PropsWithBagFunction<T, P = unknown> = P & { children?: BagFunction<T> }\n\nexport type PropsWithBagFunctionOrChildren<T, P = unknown> = P & { children?: BagFunctionOrNode<T> }\n\nconst resolve = <T>(children: BagFunctionOrNode<T>, bag: T): ReactNode => {\n if (typeof children === 'function') {\n return (children as BagFunction<T>)(bag)\n }\n\n return children ?? undefined\n}\n\nexport const BagFunctionUtil = {\n resolve\n}"],"mappings":"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","names":["useRef","useEffect","useState","listener","useState","useEffect","active","FocusTrap","useRef","useEffect","useState","useState","useEffect"]}
@@ -0,0 +1,6 @@
1
+ export { useFocusGuards } from './useFocusGuards.mjs';
2
+ export { useFocusManagement } from './useFocusManagement.mjs';
3
+ export { useFocusOnceVisible } from './useFocusOnceVisible.mjs';
4
+ export { UseFocusTrapProps, useFocusTrap } from './useFocusTrap.mjs';
5
+ export { useIsMounted } from './useIsMounted.mjs';
6
+ import 'react';
@@ -0,0 +1,6 @@
1
+ export { useFocusGuards } from './useFocusGuards.js';
2
+ export { useFocusManagement } from './useFocusManagement.js';
3
+ export { useFocusOnceVisible } from './useFocusOnceVisible.js';
4
+ export { UseFocusTrapProps, useFocusTrap } from './useFocusTrap.js';
5
+ export { useIsMounted } from './useIsMounted.js';
6
+ import 'react';