@a-type/ui 1.1.18 → 1.1.20

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 (88) hide show
  1. package/dist/cjs/components/card/Card.d.ts +2 -2
  2. package/dist/cjs/components/dialog/Dialog.js +10 -2
  3. package/dist/cjs/components/dialog/Dialog.js.map +1 -1
  4. package/dist/cjs/components/dialog/Dialog.stories.js +3 -1
  5. package/dist/cjs/components/dialog/Dialog.stories.js.map +1 -1
  6. package/dist/cjs/components/errorBoundary/ErrorBoundary.d.ts +1 -1
  7. package/dist/cjs/components/input/Input.d.ts +3 -0
  8. package/dist/cjs/components/input/Input.js +13 -2
  9. package/dist/cjs/components/input/Input.js.map +1 -1
  10. package/dist/cjs/components/layouts/PageNav.js +3 -2
  11. package/dist/cjs/components/layouts/PageNav.js.map +1 -1
  12. package/dist/cjs/components/layouts/PageNowPlaying.js +6 -1
  13. package/dist/cjs/components/layouts/PageNowPlaying.js.map +1 -1
  14. package/dist/cjs/components/layouts/layouts.stories.js +2 -1
  15. package/dist/cjs/components/layouts/layouts.stories.js.map +1 -1
  16. package/dist/cjs/components/masonry/masonry.js +5 -1
  17. package/dist/cjs/components/masonry/masonry.js.map +1 -1
  18. package/dist/cjs/components/particles/ParticleLayer.stories.js +2 -2
  19. package/dist/cjs/components/particles/ParticleLayer.stories.js.map +1 -1
  20. package/dist/cjs/components/particles/particlesState.js +5 -1
  21. package/dist/cjs/components/particles/particlesState.js.map +1 -1
  22. package/dist/cjs/components/provider/Provider.d.ts +6 -0
  23. package/dist/cjs/components/provider/Provider.js +14 -5
  24. package/dist/cjs/components/provider/Provider.js.map +1 -1
  25. package/dist/cjs/components/utility/HideWhileKeyboardOpen.d.ts +5 -0
  26. package/dist/cjs/components/utility/HideWhileKeyboardOpen.js +30 -0
  27. package/dist/cjs/components/utility/HideWhileKeyboardOpen.js.map +1 -0
  28. package/dist/cjs/hooks/useSize.d.ts +2 -1
  29. package/dist/cjs/hooks/useSize.js +17 -5
  30. package/dist/cjs/hooks/useSize.js.map +1 -1
  31. package/dist/cjs/hooks/useVirtualKeyboardBehavior.d.ts +1 -1
  32. package/dist/cjs/hooks/useVirtualKeyboardBehavior.js +1 -1
  33. package/dist/cjs/hooks/useVirtualKeyboardBehavior.js.map +1 -1
  34. package/dist/cjs/hooks/useVisualViewportOffset.d.ts +1 -0
  35. package/dist/cjs/hooks/useVisualViewportOffset.js +56 -6
  36. package/dist/cjs/hooks/useVisualViewportOffset.js.map +1 -1
  37. package/dist/css/main.css +1 -1
  38. package/dist/esm/components/card/Card.d.ts +2 -2
  39. package/dist/esm/components/dialog/Dialog.js +10 -2
  40. package/dist/esm/components/dialog/Dialog.js.map +1 -1
  41. package/dist/esm/components/dialog/Dialog.stories.js +3 -1
  42. package/dist/esm/components/dialog/Dialog.stories.js.map +1 -1
  43. package/dist/esm/components/errorBoundary/ErrorBoundary.d.ts +1 -1
  44. package/dist/esm/components/input/Input.d.ts +3 -0
  45. package/dist/esm/components/input/Input.js +14 -3
  46. package/dist/esm/components/input/Input.js.map +1 -1
  47. package/dist/esm/components/layouts/PageNav.js +3 -2
  48. package/dist/esm/components/layouts/PageNav.js.map +1 -1
  49. package/dist/esm/components/layouts/PageNowPlaying.js +6 -1
  50. package/dist/esm/components/layouts/PageNowPlaying.js.map +1 -1
  51. package/dist/esm/components/layouts/layouts.stories.js +2 -1
  52. package/dist/esm/components/layouts/layouts.stories.js.map +1 -1
  53. package/dist/esm/components/masonry/masonry.js +2 -1
  54. package/dist/esm/components/masonry/masonry.js.map +1 -1
  55. package/dist/esm/components/particles/ParticleLayer.stories.js +2 -2
  56. package/dist/esm/components/particles/ParticleLayer.stories.js.map +1 -1
  57. package/dist/esm/components/particles/particlesState.js +5 -1
  58. package/dist/esm/components/particles/particlesState.js.map +1 -1
  59. package/dist/esm/components/provider/Provider.d.ts +6 -0
  60. package/dist/esm/components/provider/Provider.js +12 -4
  61. package/dist/esm/components/provider/Provider.js.map +1 -1
  62. package/dist/esm/components/utility/HideWhileKeyboardOpen.d.ts +5 -0
  63. package/dist/esm/components/utility/HideWhileKeyboardOpen.js +24 -0
  64. package/dist/esm/components/utility/HideWhileKeyboardOpen.js.map +1 -0
  65. package/dist/esm/hooks/useSize.d.ts +2 -1
  66. package/dist/esm/hooks/useSize.js +17 -5
  67. package/dist/esm/hooks/useSize.js.map +1 -1
  68. package/dist/esm/hooks/useVirtualKeyboardBehavior.d.ts +1 -1
  69. package/dist/esm/hooks/useVirtualKeyboardBehavior.js +1 -1
  70. package/dist/esm/hooks/useVirtualKeyboardBehavior.js.map +1 -1
  71. package/dist/esm/hooks/useVisualViewportOffset.d.ts +1 -0
  72. package/dist/esm/hooks/useVisualViewportOffset.js +54 -5
  73. package/dist/esm/hooks/useVisualViewportOffset.js.map +1 -1
  74. package/package.json +1 -1
  75. package/src/components/dialog/Dialog.stories.tsx +6 -3
  76. package/src/components/dialog/Dialog.tsx +18 -3
  77. package/src/components/input/Input.tsx +35 -2
  78. package/src/components/layouts/PageNav.tsx +5 -3
  79. package/src/components/layouts/PageNowPlaying.tsx +7 -0
  80. package/src/components/layouts/layouts.stories.tsx +3 -1
  81. package/src/components/masonry/masonry.tsx +6 -1
  82. package/src/components/particles/ParticleLayer.stories.tsx +2 -4
  83. package/src/components/particles/particlesState.ts +5 -3
  84. package/src/components/provider/Provider.tsx +34 -14
  85. package/src/components/utility/HideWhileKeyboardOpen.tsx +26 -0
  86. package/src/hooks/useSize.ts +24 -3
  87. package/src/hooks/useVirtualKeyboardBehavior.ts +1 -3
  88. package/src/hooks/useVisualViewportOffset.ts +82 -12
@@ -1,38 +1,108 @@
1
1
  import { useEffect, useState } from 'react';
2
+ import { useStableCallback } from './useStableCallback.js';
3
+ import { useConfig } from '../components/provider.js';
2
4
 
3
5
  /**
4
6
  * Applies bottom offset px as a CSS custom property to the document root.
5
7
  */
6
8
  export function useVisualViewportOffset(disable?: boolean) {
9
+ useReactToViewportChanges((viewport) => {
10
+ document.documentElement.style.setProperty(
11
+ '--viewport-bottom-offset',
12
+ `${window.innerHeight - viewport.height - viewport.offsetTop}px`,
13
+ );
14
+ document.documentElement.style.setProperty(
15
+ '--viewport-height',
16
+ `${viewport.height}px`,
17
+ );
18
+ document.documentElement.style.setProperty(
19
+ '--viewport-width',
20
+ `${viewport.width}px`,
21
+ );
22
+ document.documentElement.style.setProperty(
23
+ '--viewport-top-offset',
24
+ `${viewport.offsetTop}px`,
25
+ );
26
+ document.documentElement.style.setProperty(
27
+ '--viewport-left-offset',
28
+ `${viewport.offsetLeft}px`,
29
+ );
30
+ document.documentElement.style.setProperty(
31
+ '--keyboard-open',
32
+ viewport.height < window.innerHeight ? '1' : '0',
33
+ );
34
+ }, disable);
35
+ }
36
+
37
+ export function useIsKeyboardOpen() {
38
+ const { virtualKeyboardBehavior } = useConfig();
39
+
40
+ const [isViewportConstrained, setIsViewportConstrained] = useState(false);
41
+ useReactToViewportChanges((viewport) => {
42
+ setIsViewportConstrained(viewport.height < window.innerHeight);
43
+ }, virtualKeyboardBehavior !== 'displace');
44
+
45
+ const [isKeyboardOpen, setIsKeyboardOpen] = useState(false);
7
46
  useEffect(() => {
8
- if (disable) return;
47
+ if (!('virtualKeyboard' in navigator)) {
48
+ // no support
49
+ console.warn(
50
+ `virtual keyboard behavior set to 'overlay', but virtualKeyboard API is not supported in this browser.`,
51
+ );
52
+ return;
53
+ }
54
+ const virtualKeyboard = navigator.virtualKeyboard as any;
55
+ const update = () => {
56
+ setIsKeyboardOpen(virtualKeyboard.boundingRect.height > 0);
57
+ };
58
+ update();
59
+ virtualKeyboard.addEventListener('geometrychange', update);
60
+ return () => {
61
+ virtualKeyboard.removeEventListener('geometrychange', update);
62
+ };
63
+ }, []);
64
+
65
+ if (virtualKeyboardBehavior === 'displace') {
66
+ return isViewportConstrained;
67
+ }
68
+
69
+ return isKeyboardOpen;
70
+ }
9
71
 
10
- const viewport =
11
- typeof window === 'undefined' ? undefined : window.visualViewport;
72
+ function useReactToViewportChanges(
73
+ cb: (viewport: VisualViewport) => void,
74
+ disable?: boolean,
75
+ ) {
76
+ const stableCb = useStableCallback(cb);
77
+ useEffect(() => {
78
+ if (disable) return;
12
79
 
80
+ const viewport = window.visualViewport;
13
81
  if (!viewport) {
14
82
  return;
15
83
  }
16
84
 
17
85
  const update = () => {
18
- document.documentElement.style.setProperty(
19
- '--viewport-bottom-offset',
20
- `${window.innerHeight - viewport.height}px`,
21
- );
22
- document.documentElement.style.setProperty(
23
- '--viewport-height',
24
- `${viewport.height}px`,
25
- );
86
+ stableCb(viewport);
87
+ };
88
+ let prevTimeout: number | undefined;
89
+ const debouncedUpdate = () => {
90
+ if (prevTimeout) {
91
+ clearTimeout(prevTimeout);
92
+ }
93
+ prevTimeout = window.setTimeout(update, 50);
26
94
  };
27
95
 
28
96
  update();
29
97
 
30
98
  window.addEventListener('scroll', update, { passive: true });
31
99
  viewport.addEventListener('resize', update);
100
+ viewport.addEventListener('scroll', debouncedUpdate, { passive: true });
32
101
 
33
102
  return () => {
34
103
  viewport.removeEventListener('resize', update);
35
104
  window.removeEventListener('scroll', update);
105
+ viewport.removeEventListener('scroll', debouncedUpdate);
36
106
  };
37
- }, [disable]);
107
+ }, [stableCb, disable]);
38
108
  }