@a-type/ui 1.3.1 → 1.3.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 (233) hide show
  1. package/dist/cjs/components/actions/ActionButton.d.ts +1 -1
  2. package/dist/cjs/components/actions/ActionButton.js +4 -4
  3. package/dist/cjs/components/actions/ActionButton.js.map +1 -1
  4. package/dist/cjs/components/box/Box.d.ts +3 -1
  5. package/dist/cjs/components/box/Box.js +4 -4
  6. package/dist/cjs/components/box/Box.js.map +1 -1
  7. package/dist/cjs/components/box/Box.stories.d.ts +1 -1
  8. package/dist/cjs/components/button/Button.d.ts +3 -2
  9. package/dist/cjs/components/button/Button.js +4 -4
  10. package/dist/cjs/components/button/Button.js.map +1 -1
  11. package/dist/cjs/components/button/Button.stories.d.ts +1 -1
  12. package/dist/cjs/components/camera/Camera.d.ts +7 -5
  13. package/dist/cjs/components/camera/Camera.js +12 -10
  14. package/dist/cjs/components/camera/Camera.js.map +1 -1
  15. package/dist/cjs/components/camera/Camera.stories.d.ts +2 -2
  16. package/dist/cjs/components/card/Card.d.ts +10 -18
  17. package/dist/cjs/components/card/Card.js +11 -10
  18. package/dist/cjs/components/card/Card.js.map +1 -1
  19. package/dist/cjs/components/checkbox/Checkbox.d.ts +2 -1
  20. package/dist/cjs/components/checkbox/Checkbox.js +3 -3
  21. package/dist/cjs/components/checkbox/Checkbox.js.map +1 -1
  22. package/dist/cjs/components/chip/Chip.d.ts +3 -2
  23. package/dist/cjs/components/chip/Chip.js +4 -5
  24. package/dist/cjs/components/chip/Chip.js.map +1 -1
  25. package/dist/cjs/components/collapsible/Collapsible.d.ts +7 -4
  26. package/dist/cjs/components/collapsible/Collapsible.js +5 -5
  27. package/dist/cjs/components/collapsible/Collapsible.js.map +1 -1
  28. package/dist/cjs/components/contextMenu/contextMenu.d.ts +7 -2
  29. package/dist/cjs/components/contextMenu/contextMenu.js +5 -5
  30. package/dist/cjs/components/contextMenu/contextMenu.js.map +1 -1
  31. package/dist/cjs/components/dialog/Dialog.d.ts +37 -19
  32. package/dist/cjs/components/dialog/Dialog.js +20 -15
  33. package/dist/cjs/components/dialog/Dialog.js.map +1 -1
  34. package/dist/cjs/components/dialog/Dialog.stories.d.ts +14 -7
  35. package/dist/cjs/components/divider/Divider.d.ts +3 -1
  36. package/dist/cjs/components/divider/Divider.js +5 -5
  37. package/dist/cjs/components/divider/Divider.js.map +1 -1
  38. package/dist/cjs/components/dropdownMenu/DropdownMenu.d.ts +6 -2
  39. package/dist/cjs/components/dropdownMenu/DropdownMenu.js +3 -4
  40. package/dist/cjs/components/dropdownMenu/DropdownMenu.js.map +1 -1
  41. package/dist/cjs/components/dropdownMenu/DropdownMenu.stories.d.ts +3 -1
  42. package/dist/cjs/components/forms/TextField.d.ts +3 -1
  43. package/dist/cjs/components/forms/TextField.js +6 -5
  44. package/dist/cjs/components/forms/TextField.js.map +1 -1
  45. package/dist/cjs/components/icon/Icon.d.ts +3 -1
  46. package/dist/cjs/components/icon/Icon.js +4 -4
  47. package/dist/cjs/components/icon/Icon.js.map +1 -1
  48. package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.d.ts +3 -1
  49. package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +6 -5
  50. package/dist/cjs/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
  51. package/dist/cjs/components/input/Input.d.ts +3 -1
  52. package/dist/cjs/components/input/Input.js +4 -3
  53. package/dist/cjs/components/input/Input.js.map +1 -1
  54. package/dist/cjs/components/input/Input.stories.d.ts +3 -1
  55. package/dist/cjs/components/liveUpdateTextField/LiveUpdateTextField.d.ts +3 -2
  56. package/dist/cjs/components/liveUpdateTextField/LiveUpdateTextField.js +5 -4
  57. package/dist/cjs/components/liveUpdateTextField/LiveUpdateTextField.js.map +1 -1
  58. package/dist/cjs/components/marquee/marquee.d.ts +1 -1
  59. package/dist/cjs/components/navBar/NavBar.d.ts +10 -5
  60. package/dist/cjs/components/navBar/NavBar.js +8 -7
  61. package/dist/cjs/components/navBar/NavBar.js.map +1 -1
  62. package/dist/cjs/components/popover/Popover.d.ts +13 -8
  63. package/dist/cjs/components/popover/Popover.js +5 -5
  64. package/dist/cjs/components/popover/Popover.js.map +1 -1
  65. package/dist/cjs/components/progress/Progress.d.ts +4 -3
  66. package/dist/cjs/components/progress/Progress.js +3 -4
  67. package/dist/cjs/components/progress/Progress.js.map +1 -1
  68. package/dist/cjs/components/progress/Progress.stories.d.ts +4 -3
  69. package/dist/cjs/components/scrollArea/ScrollArea.d.ts +12 -5
  70. package/dist/cjs/components/scrollArea/ScrollArea.js +12 -9
  71. package/dist/cjs/components/scrollArea/ScrollArea.js.map +1 -1
  72. package/dist/cjs/components/select/Select.d.ts +23 -13
  73. package/dist/cjs/components/select/Select.js +18 -15
  74. package/dist/cjs/components/select/Select.js.map +1 -1
  75. package/dist/cjs/components/select/Select.stories.d.ts +10 -6
  76. package/dist/cjs/components/slider/Slider.d.ts +3 -1
  77. package/dist/cjs/components/slider/Slider.js +3 -4
  78. package/dist/cjs/components/slider/Slider.js.map +1 -1
  79. package/dist/cjs/components/slider/Slider.stories.d.ts +3 -1
  80. package/dist/cjs/components/spinner/Spinner.d.ts +6 -2
  81. package/dist/cjs/components/spinner/Spinner.js +8 -6
  82. package/dist/cjs/components/spinner/Spinner.js.map +1 -1
  83. package/dist/cjs/components/switch/Switch.d.ts +3 -1
  84. package/dist/cjs/components/switch/Switch.js +15 -4
  85. package/dist/cjs/components/switch/Switch.js.map +1 -1
  86. package/dist/cjs/components/textArea/TextArea.d.ts +3 -1
  87. package/dist/cjs/components/textArea/TextArea.js +4 -3
  88. package/dist/cjs/components/textArea/TextArea.js.map +1 -1
  89. package/dist/cjs/components/textArea/TextArea.stories.d.ts +3 -1
  90. package/dist/cjs/components/tooltip/Tooltip.d.ts +3 -1
  91. package/dist/cjs/components/tooltip/Tooltip.js +3 -4
  92. package/dist/cjs/components/tooltip/Tooltip.js.map +1 -1
  93. package/dist/cjs/components/tooltip/Tooltip.stories.d.ts +3 -1
  94. package/dist/cjs/components/utility/HideWhileKeyboardOpen.d.ts +3 -1
  95. package/dist/cjs/components/utility/HideWhileKeyboardOpen.js +5 -5
  96. package/dist/cjs/components/utility/HideWhileKeyboardOpen.js.map +1 -1
  97. package/dist/cjs/components/utility/SlotDiv.d.ts +1 -1
  98. package/dist/cjs/components/utility/SlotDiv.js +4 -4
  99. package/dist/cjs/components/utility/SlotDiv.js.map +1 -1
  100. package/dist/cjs/hooks/useMergedRef.d.ts +1 -1
  101. package/dist/cjs/hooks/useMergedRef.js.map +1 -1
  102. package/dist/esm/components/actions/ActionButton.d.ts +1 -1
  103. package/dist/esm/components/actions/ActionButton.js +4 -4
  104. package/dist/esm/components/actions/ActionButton.js.map +1 -1
  105. package/dist/esm/components/box/Box.d.ts +3 -1
  106. package/dist/esm/components/box/Box.js +4 -4
  107. package/dist/esm/components/box/Box.js.map +1 -1
  108. package/dist/esm/components/box/Box.stories.d.ts +1 -1
  109. package/dist/esm/components/button/Button.d.ts +3 -2
  110. package/dist/esm/components/button/Button.js +4 -4
  111. package/dist/esm/components/button/Button.js.map +1 -1
  112. package/dist/esm/components/button/Button.stories.d.ts +1 -1
  113. package/dist/esm/components/camera/Camera.d.ts +7 -5
  114. package/dist/esm/components/camera/Camera.js +7 -7
  115. package/dist/esm/components/camera/Camera.js.map +1 -1
  116. package/dist/esm/components/camera/Camera.stories.d.ts +2 -2
  117. package/dist/esm/components/card/Card.d.ts +10 -18
  118. package/dist/esm/components/card/Card.js +6 -7
  119. package/dist/esm/components/card/Card.js.map +1 -1
  120. package/dist/esm/components/checkbox/Checkbox.d.ts +2 -1
  121. package/dist/esm/components/checkbox/Checkbox.js +3 -3
  122. package/dist/esm/components/checkbox/Checkbox.js.map +1 -1
  123. package/dist/esm/components/chip/Chip.d.ts +3 -2
  124. package/dist/esm/components/chip/Chip.js +3 -4
  125. package/dist/esm/components/chip/Chip.js.map +1 -1
  126. package/dist/esm/components/collapsible/Collapsible.d.ts +7 -4
  127. package/dist/esm/components/collapsible/Collapsible.js +4 -5
  128. package/dist/esm/components/collapsible/Collapsible.js.map +1 -1
  129. package/dist/esm/components/contextMenu/contextMenu.d.ts +7 -2
  130. package/dist/esm/components/contextMenu/contextMenu.js +4 -5
  131. package/dist/esm/components/contextMenu/contextMenu.js.map +1 -1
  132. package/dist/esm/components/dialog/Dialog.d.ts +37 -19
  133. package/dist/esm/components/dialog/Dialog.js +16 -16
  134. package/dist/esm/components/dialog/Dialog.js.map +1 -1
  135. package/dist/esm/components/dialog/Dialog.stories.d.ts +14 -7
  136. package/dist/esm/components/divider/Divider.d.ts +3 -1
  137. package/dist/esm/components/divider/Divider.js +4 -5
  138. package/dist/esm/components/divider/Divider.js.map +1 -1
  139. package/dist/esm/components/dropdownMenu/DropdownMenu.d.ts +6 -2
  140. package/dist/esm/components/dropdownMenu/DropdownMenu.js +3 -4
  141. package/dist/esm/components/dropdownMenu/DropdownMenu.js.map +1 -1
  142. package/dist/esm/components/dropdownMenu/DropdownMenu.stories.d.ts +3 -1
  143. package/dist/esm/components/forms/TextField.d.ts +3 -1
  144. package/dist/esm/components/forms/TextField.js +6 -6
  145. package/dist/esm/components/forms/TextField.js.map +1 -1
  146. package/dist/esm/components/icon/Icon.d.ts +3 -1
  147. package/dist/esm/components/icon/Icon.js +3 -4
  148. package/dist/esm/components/icon/Icon.js.map +1 -1
  149. package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.d.ts +3 -1
  150. package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js +5 -5
  151. package/dist/esm/components/infiniteLoadTrigger/InfiniteLoadTrigger.js.map +1 -1
  152. package/dist/esm/components/input/Input.d.ts +3 -1
  153. package/dist/esm/components/input/Input.js +4 -4
  154. package/dist/esm/components/input/Input.js.map +1 -1
  155. package/dist/esm/components/input/Input.stories.d.ts +3 -1
  156. package/dist/esm/components/liveUpdateTextField/LiveUpdateTextField.d.ts +3 -2
  157. package/dist/esm/components/liveUpdateTextField/LiveUpdateTextField.js +4 -4
  158. package/dist/esm/components/liveUpdateTextField/LiveUpdateTextField.js.map +1 -1
  159. package/dist/esm/components/marquee/marquee.d.ts +1 -1
  160. package/dist/esm/components/navBar/NavBar.d.ts +10 -5
  161. package/dist/esm/components/navBar/NavBar.js +6 -7
  162. package/dist/esm/components/navBar/NavBar.js.map +1 -1
  163. package/dist/esm/components/popover/Popover.d.ts +13 -8
  164. package/dist/esm/components/popover/Popover.js +4 -5
  165. package/dist/esm/components/popover/Popover.js.map +1 -1
  166. package/dist/esm/components/progress/Progress.d.ts +4 -3
  167. package/dist/esm/components/progress/Progress.js +3 -4
  168. package/dist/esm/components/progress/Progress.js.map +1 -1
  169. package/dist/esm/components/progress/Progress.stories.d.ts +4 -3
  170. package/dist/esm/components/scrollArea/ScrollArea.d.ts +12 -5
  171. package/dist/esm/components/scrollArea/ScrollArea.js +10 -9
  172. package/dist/esm/components/scrollArea/ScrollArea.js.map +1 -1
  173. package/dist/esm/components/select/Select.d.ts +23 -13
  174. package/dist/esm/components/select/Select.js +16 -16
  175. package/dist/esm/components/select/Select.js.map +1 -1
  176. package/dist/esm/components/select/Select.stories.d.ts +10 -6
  177. package/dist/esm/components/slider/Slider.d.ts +3 -1
  178. package/dist/esm/components/slider/Slider.js +3 -4
  179. package/dist/esm/components/slider/Slider.js.map +1 -1
  180. package/dist/esm/components/slider/Slider.stories.d.ts +3 -1
  181. package/dist/esm/components/spinner/Spinner.d.ts +6 -2
  182. package/dist/esm/components/spinner/Spinner.js +6 -6
  183. package/dist/esm/components/spinner/Spinner.js.map +1 -1
  184. package/dist/esm/components/switch/Switch.d.ts +3 -1
  185. package/dist/esm/components/switch/Switch.js +15 -4
  186. package/dist/esm/components/switch/Switch.js.map +1 -1
  187. package/dist/esm/components/textArea/TextArea.d.ts +3 -1
  188. package/dist/esm/components/textArea/TextArea.js +4 -4
  189. package/dist/esm/components/textArea/TextArea.js.map +1 -1
  190. package/dist/esm/components/textArea/TextArea.stories.d.ts +3 -1
  191. package/dist/esm/components/tooltip/Tooltip.d.ts +3 -1
  192. package/dist/esm/components/tooltip/Tooltip.js +3 -4
  193. package/dist/esm/components/tooltip/Tooltip.js.map +1 -1
  194. package/dist/esm/components/tooltip/Tooltip.stories.d.ts +3 -1
  195. package/dist/esm/components/utility/HideWhileKeyboardOpen.d.ts +3 -1
  196. package/dist/esm/components/utility/HideWhileKeyboardOpen.js +4 -5
  197. package/dist/esm/components/utility/HideWhileKeyboardOpen.js.map +1 -1
  198. package/dist/esm/components/utility/SlotDiv.d.ts +1 -1
  199. package/dist/esm/components/utility/SlotDiv.js +3 -4
  200. package/dist/esm/components/utility/SlotDiv.js.map +1 -1
  201. package/dist/esm/hooks/useMergedRef.d.ts +1 -1
  202. package/dist/esm/hooks/useMergedRef.js.map +1 -1
  203. package/package.json +1 -1
  204. package/src/components/actions/ActionButton.tsx +45 -45
  205. package/src/components/box/Box.tsx +19 -20
  206. package/src/components/button/Button.tsx +54 -57
  207. package/src/components/camera/Camera.tsx +133 -133
  208. package/src/components/card/Card.tsx +24 -23
  209. package/src/components/checkbox/Checkbox.tsx +9 -10
  210. package/src/components/chip/Chip.tsx +9 -5
  211. package/src/components/collapsible/Collapsible.tsx +56 -54
  212. package/src/components/contextMenu/contextMenu.tsx +60 -56
  213. package/src/components/dialog/Dialog.tsx +328 -312
  214. package/src/components/divider/Divider.tsx +32 -26
  215. package/src/components/dropdownMenu/DropdownMenu.tsx +126 -123
  216. package/src/components/forms/TextField.tsx +137 -140
  217. package/src/components/icon/Icon.tsx +33 -28
  218. package/src/components/infiniteLoadTrigger/InfiniteLoadTrigger.tsx +42 -38
  219. package/src/components/input/Input.tsx +75 -81
  220. package/src/components/liveUpdateTextField/LiveUpdateTextField.tsx +134 -138
  221. package/src/components/navBar/NavBar.tsx +105 -96
  222. package/src/components/popover/Popover.tsx +84 -87
  223. package/src/components/progress/Progress.tsx +40 -34
  224. package/src/components/scrollArea/ScrollArea.tsx +102 -94
  225. package/src/components/select/Select.tsx +294 -283
  226. package/src/components/slider/Slider.tsx +58 -55
  227. package/src/components/spinner/Spinner.tsx +66 -59
  228. package/src/components/switch/Switch.tsx +31 -27
  229. package/src/components/textArea/TextArea.tsx +114 -117
  230. package/src/components/tooltip/Tooltip.tsx +68 -63
  231. package/src/components/utility/HideWhileKeyboardOpen.tsx +30 -26
  232. package/src/components/utility/SlotDiv.tsx +16 -15
  233. package/src/hooks/useMergedRef.ts +3 -1
@@ -3,8 +3,8 @@ import classNames from 'clsx';
3
3
  import {
4
4
  MouseEvent,
5
5
  ReactNode,
6
+ Ref,
6
7
  createContext,
7
- forwardRef,
8
8
  useContext,
9
9
  useEffect,
10
10
  useRef,
@@ -37,164 +37,164 @@ export interface CameraRootProps {
37
37
  children?: ReactNode;
38
38
  format?: 'image/png' | 'image/jpeg';
39
39
  facingMode?: 'user' | 'environment';
40
+ ref?: Ref<HTMLDivElement>;
40
41
  }
41
42
 
42
- export const CameraRoot = forwardRef<HTMLDivElement, CameraRootProps>(
43
- function Camera(
44
- {
45
- className,
46
- onCapture,
47
- children,
48
- facingMode,
49
- format = 'image/png',
50
- ...rest
51
- },
52
- ref,
53
- ) {
54
- const videoRef = useRef<HTMLVideoElement>(null);
43
+ export function CameraRoot({
44
+ className,
45
+ onCapture,
46
+ children,
47
+ facingMode,
48
+ format = 'image/png',
49
+ ref,
50
+ ...rest
51
+ }: CameraRootProps) {
52
+ const videoRef = useRef<HTMLVideoElement>(null);
55
53
 
56
- const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);
57
- const [stream, setStream] = useState<MediaStream | undefined>();
54
+ const [devices, setDevices] = useState<MediaDeviceInfo[]>([]);
55
+ const [stream, setStream] = useState<MediaStream | undefined>();
58
56
 
59
- useEffect(() => {
60
- navigator.mediaDevices?.enumerateDevices().then((devices): void => {
61
- setDevices(devices.filter((device) => device.kind === 'videoinput'));
62
- });
63
- }, [!!stream]);
57
+ useEffect(() => {
58
+ navigator.mediaDevices?.enumerateDevices().then((devices): void => {
59
+ setDevices(devices.filter((device) => device.kind === 'videoinput'));
60
+ });
61
+ }, [!!stream]);
64
62
 
65
- const [selectedDeviceId, setSelectedDeviceId] = useState<
66
- string | undefined
67
- >();
63
+ const [selectedDeviceId, setSelectedDeviceId] = useState<
64
+ string | undefined
65
+ >();
68
66
 
69
- const cleanupRef = useRef<() => void>(undefined);
70
- useEffect(() => {
71
- const init = () => {
72
- cleanupRef.current?.();
73
- navigator.mediaDevices
74
- ?.getUserMedia({
75
- video: {
76
- deviceId: selectedDeviceId,
77
- facingMode,
78
- },
79
- })
80
- .then((s) => {
81
- setStream(s);
82
- cleanupRef.current = () =>
83
- s.getTracks().forEach((track) => track.stop());
84
- });
85
- };
67
+ const cleanupRef = useRef<() => void>(undefined);
68
+ useEffect(() => {
69
+ const init = () => {
70
+ cleanupRef.current?.();
71
+ navigator.mediaDevices
72
+ ?.getUserMedia({
73
+ video: {
74
+ deviceId: selectedDeviceId,
75
+ facingMode,
76
+ },
77
+ })
78
+ .then((s) => {
79
+ setStream(s);
80
+ cleanupRef.current = () =>
81
+ s.getTracks().forEach((track) => track.stop());
82
+ });
83
+ };
84
+ init();
85
+
86
+ // reconnect if browser was backgrounded
87
+ const reconnect = () => {
88
+ if (stream?.active || document.visibilityState !== 'visible') {
89
+ return;
90
+ }
86
91
  init();
92
+ };
93
+ document.addEventListener('visibilitychange', reconnect);
87
94
 
88
- // reconnect if browser was backgrounded
89
- const reconnect = () => {
90
- if (stream?.active || document.visibilityState !== 'visible') {
91
- return;
92
- }
93
- init();
94
- };
95
- document.addEventListener('visibilitychange', reconnect);
95
+ return () => {
96
+ document.removeEventListener('visibilitychange', reconnect);
97
+ cleanupRef.current?.();
98
+ };
99
+ }, [selectedDeviceId, facingMode]);
96
100
 
101
+ useEffect(() => {
102
+ const video = videoRef.current;
103
+ if (video && stream) {
104
+ video.srcObject = stream;
97
105
  return () => {
98
- document.removeEventListener('visibilitychange', reconnect);
99
- cleanupRef.current?.();
106
+ video.srcObject = null;
100
107
  };
101
- }, [selectedDeviceId, facingMode]);
102
-
103
- useEffect(() => {
104
- const video = videoRef.current;
105
- if (video && stream) {
106
- video.srcObject = stream;
107
- return () => {
108
- video.srcObject = null;
109
- };
110
- }
111
- }, [stream]);
108
+ }
109
+ }, [stream]);
112
110
 
113
- const [capture, setCapture] = useState<ImageCapture>();
111
+ const [capture, setCapture] = useState<ImageCapture>();
114
112
 
115
- useEffect(() => {
116
- if (typeof window !== 'undefined' && 'ImageCapture' in window) {
117
- const videoTrack = stream?.getVideoTracks()[0];
118
- if (videoTrack) {
119
- const capturer = new ImageCapture(videoTrack);
120
- setCapture(capturer);
121
- capturer.getPhotoCapabilities().then((capabilities) => {
122
- console.log('ImageCapture capabilities:', capabilities);
123
- });
124
- }
113
+ useEffect(() => {
114
+ if (typeof window !== 'undefined' && 'ImageCapture' in window) {
115
+ const videoTrack = stream?.getVideoTracks()[0];
116
+ if (videoTrack) {
117
+ const capturer = new ImageCapture(videoTrack);
118
+ setCapture(capturer);
119
+ capturer.getPhotoCapabilities().then((capabilities) => {
120
+ console.log('ImageCapture capabilities:', capabilities);
121
+ });
125
122
  }
126
- }, [stream]);
123
+ }
124
+ }, [stream]);
127
125
 
128
- const triggerCapture = () => {
129
- if (capture) {
130
- capture.takePhoto().then((blob) => {
131
- const file = new File([blob], `image.${format.split('/')[1]}`, {
132
- type: format,
133
- });
134
- onCapture?.(file);
126
+ const triggerCapture = () => {
127
+ if (capture) {
128
+ capture.takePhoto().then((blob) => {
129
+ const file = new File([blob], `image.${format.split('/')[1]}`, {
130
+ type: format,
135
131
  });
136
- } else {
137
- // ImageCapture not supported, fallback to
138
- // canvas capture
139
- const video = videoRef.current;
140
- if (video) {
141
- const canvas = document.createElement('canvas');
142
- canvas.width = video.videoWidth;
143
- canvas.height = video.videoHeight;
144
- canvas.getContext('2d')?.drawImage(video, 0, 0);
145
- const data = canvas.toDataURL(format);
146
- const file = dataURItoFile(data);
147
- onCapture?.(file);
148
- }
132
+ onCapture?.(file);
133
+ });
134
+ } else {
135
+ // ImageCapture not supported, fallback to
136
+ // canvas capture
137
+ const video = videoRef.current;
138
+ if (video) {
139
+ const canvas = document.createElement('canvas');
140
+ canvas.width = video.videoWidth;
141
+ canvas.height = video.videoHeight;
142
+ canvas.getContext('2d')?.drawImage(video, 0, 0);
143
+ const data = canvas.toDataURL(format);
144
+ const file = dataURItoFile(data);
145
+ onCapture?.(file);
149
146
  }
150
- };
147
+ }
148
+ };
151
149
 
152
- const [fullscreen, setFullscreen] = useState(false);
150
+ const [fullscreen, setFullscreen] = useState(false);
153
151
 
154
- return (
155
- <CameraContext.Provider
156
- value={{
157
- devices,
158
- triggerCapture,
159
- selectedDeviceId,
160
- selectDeviceId: setSelectedDeviceId,
161
- setFullscreen,
162
- fullscreen,
163
- }}
152
+ return (
153
+ <CameraContext.Provider
154
+ value={{
155
+ devices,
156
+ triggerCapture,
157
+ selectedDeviceId,
158
+ selectDeviceId: setSelectedDeviceId,
159
+ setFullscreen,
160
+ fullscreen,
161
+ }}
162
+ >
163
+ <div
164
+ ref={ref}
165
+ className={classNames(
166
+ 'layer-components:([font-family:inherit] text-white bg-black rounded-lg overflow-hidden min-w-4 min-h-4 relative)',
167
+ fullscreen && 'fixed inset-0 w-full h-full z-1000 rounded-none',
168
+ className,
169
+ )}
170
+ {...rest}
164
171
  >
165
- <div
166
- ref={ref}
167
- className={classNames(
168
- 'layer-components:([font-family:inherit] text-white bg-black rounded-lg overflow-hidden min-w-4 min-h-4 relative)',
169
- fullscreen && 'fixed inset-0 w-full h-full z-1000 rounded-none',
170
- className,
171
- )}
172
- {...rest}
173
- >
174
- <video
175
- ref={videoRef}
176
- className="w-full h-full object-cover"
177
- autoPlay
178
- muted
179
- playsInline
180
- ></video>
181
- {children}
182
- </div>
183
- </CameraContext.Provider>
184
- );
185
- },
186
- );
172
+ <video
173
+ ref={videoRef}
174
+ className="w-full h-full object-cover"
175
+ autoPlay
176
+ muted
177
+ playsInline
178
+ ></video>
179
+ {children}
180
+ </div>
181
+ </CameraContext.Provider>
182
+ );
183
+ }
187
184
 
188
185
  export interface CameraShutterButtonProps {
189
186
  className?: string;
190
187
  asChild?: boolean;
191
188
  onClick?: (ev: MouseEvent<HTMLButtonElement>) => void;
189
+ ref?: Ref<HTMLButtonElement>;
192
190
  }
193
191
 
194
- export const CameraShutterButton = forwardRef<
195
- HTMLButtonElement,
196
- CameraShutterButtonProps
197
- >(function CameraShutterButton({ asChild, onClick, ...rest }, ref) {
192
+ export function CameraShutterButton({
193
+ asChild,
194
+ onClick,
195
+ ref,
196
+ ...rest
197
+ }: CameraShutterButtonProps) {
198
198
  const Comp = asChild ? Slot : StyledShutterButton;
199
199
  const { triggerCapture } = useContext(CameraContext);
200
200
 
@@ -209,7 +209,7 @@ export const CameraShutterButton = forwardRef<
209
209
  {...rest}
210
210
  />
211
211
  );
212
- });
212
+ }
213
213
 
214
214
  const StyledShutterButton = withClassName(
215
215
  'button',
@@ -1,6 +1,6 @@
1
1
  import { Slot } from '@radix-ui/react-slot';
2
2
  import classNames from 'clsx';
3
- import { HTMLAttributes, MouseEvent, ReactNode, forwardRef } from 'react';
3
+ import { HTMLAttributes, MouseEvent, ReactNode, Ref } from 'react';
4
4
  import { withClassName } from '../../hooks.js';
5
5
  import { Masonry, MasonryProps } from '../masonry/masonry.js';
6
6
  import { SlotDiv } from '../utility/SlotDiv.js';
@@ -11,23 +11,25 @@ export const CardRoot = withClassName(
11
11
  'layer-variants:[&[data-borderless=true]]:(border-none shadow-md)',
12
12
  );
13
13
 
14
- export const CardMain = forwardRef<
15
- any,
16
- {
17
- asChild?: boolean;
18
- className?: string;
19
- onClick?: (ev: MouseEvent) => void;
20
- children?: ReactNode;
21
- compact?: boolean;
22
- /** forces non-interactive version */
23
- nonInteractive?: boolean;
24
- visuallyFocused?: boolean;
25
- visuallyDisabled?: boolean;
26
- }
27
- >(function CardMain(
28
- { asChild, className, compact, nonInteractive, ...rest },
14
+ export function CardMain({
15
+ asChild,
16
+ className,
17
+ compact,
18
+ nonInteractive,
29
19
  ref,
30
- ) {
20
+ ...rest
21
+ }: {
22
+ asChild?: boolean;
23
+ className?: string;
24
+ onClick?: (ev: MouseEvent) => void;
25
+ children?: ReactNode;
26
+ compact?: boolean;
27
+ /** forces non-interactive version */
28
+ nonInteractive?: boolean;
29
+ visuallyFocused?: boolean;
30
+ visuallyDisabled?: boolean;
31
+ ref?: Ref<any>;
32
+ }) {
31
33
  const isInteractive = !nonInteractive && (!!asChild || !!rest.onClick);
32
34
  const Comp = asChild ? Slot : isInteractive ? 'button' : 'div';
33
35
  return (
@@ -51,7 +53,7 @@ export const CardMain = forwardRef<
51
53
  {...rest}
52
54
  />
53
55
  );
54
- });
56
+ }
55
57
 
56
58
  export const CardTitle = withClassName(
57
59
  'div',
@@ -67,12 +69,11 @@ const CardContentRoot = withClassName(
67
69
  );
68
70
  export interface CardContentProps extends HTMLAttributes<HTMLDivElement> {
69
71
  unstyled?: boolean;
72
+ ref?: Ref<HTMLDivElement>;
73
+ }
74
+ export function CardContent({ unstyled, ref, ...rest }: CardContentProps) {
75
+ return <CardContentRoot ref={ref} data-unstyled={unstyled} {...rest} />;
70
76
  }
71
- export const CardContent = forwardRef<HTMLDivElement, CardContentProps>(
72
- function CardContent({ unstyled, ...rest }, ref) {
73
- return <CardContentRoot ref={ref} data-unstyled={unstyled} {...rest} />;
74
- },
75
- );
76
77
 
77
78
  export const CardImage = withClassName(
78
79
  SlotDiv,
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
 
3
3
  import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
4
- import { ComponentProps, forwardRef } from 'react';
5
4
  import { CheckIcon } from '@radix-ui/react-icons';
6
5
  import classNames from 'clsx';
6
+ import { ComponentProps } from 'react';
7
7
  import { withClassName } from '../../hooks/withClassName.js';
8
8
 
9
9
  export const CheckboxRoot = withClassName(
@@ -36,15 +36,14 @@ export function CheckboxIndicator({
36
36
  }
37
37
 
38
38
  export const Checkbox = Object.assign(
39
- forwardRef<HTMLButtonElement, ComponentProps<typeof CheckboxRoot>>(
40
- function Checkbox(props, ref) {
41
- return (
42
- <CheckboxRoot ref={ref} {...props}>
43
- <CheckboxIndicator />
44
- </CheckboxRoot>
45
- );
46
- },
47
- ),
39
+ function Checkbox({ ref, ...props }: ComponentProps<typeof CheckboxRoot>) {
40
+ return (
41
+ <CheckboxRoot ref={ref} {...props}>
42
+ <CheckboxIndicator />
43
+ </CheckboxRoot>
44
+ );
45
+ },
46
+
48
47
  {
49
48
  Root: CheckboxRoot,
50
49
  Indicator: CheckboxIndicator,
@@ -1,16 +1,20 @@
1
1
  import { Slot } from '@radix-ui/react-slot';
2
2
  import classNames from 'clsx';
3
- import { HTMLAttributes, forwardRef } from 'react';
3
+ import { HTMLAttributes, Ref } from 'react';
4
4
 
5
5
  export interface ChipProps extends HTMLAttributes<HTMLElement> {
6
6
  color?: 'neutral' | 'primary' | 'accent';
7
7
  asChild?: boolean;
8
+ ref?: Ref<any>;
8
9
  }
9
10
 
10
- export const Chip = forwardRef<any, ChipProps>(function Chip(
11
- { className, color = 'neutral', asChild, ...rest },
11
+ export function Chip({
12
+ className,
13
+ color = 'neutral',
14
+ asChild,
12
15
  ref,
13
- ) {
16
+ ...rest
17
+ }: ChipProps) {
14
18
  const Component = asChild ? Slot : 'div';
15
19
  return (
16
20
  <Component
@@ -26,4 +30,4 @@ export const Chip = forwardRef<any, ChipProps>(function Chip(
26
30
  {...rest}
27
31
  />
28
32
  );
29
- });
33
+ }
@@ -1,54 +1,56 @@
1
- 'use client';
2
-
3
- import { forwardRef } from 'react';
4
- import { withClassName } from '../../hooks/withClassName.js';
5
- import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
6
-
7
- export const CollapsibleRoot = CollapsiblePrimitive.Root;
8
- const CollapsibleContentBase = withClassName(
9
- CollapsiblePrimitive.Content,
10
- 'overflow-hidden',
11
- 'layer-components:[&[data-state=open]]:(animate-radix-collapsible-open-vertical animate-duration-300 animate-ease-springy) layer-components:[&[data-state=closed]]:(animate-radix-collapsible-close-vertical animate-duration-300 animate-ease-springy)',
12
- 'layer-variants:[&[data-horizontal][data-state=open]]:(animate-radix-collapsible-open-horizontal animate-duration-300 animate-ease-springy) layer-variants:[&[data-horizontal][data-state=closed]]:(animate-radix-collapsible-close-horizontal animate-duration-300 animate-ease-springy)',
13
- 'layer-variants:[&[data-both][data-state=open]]:(animate-radix-collapsible-open-both animate-duration-300 animate-ease-springy) layer-variants:[&[data-both][data-state=closed]]:(animate-radix-collapsible-close-both animate-duration-300 animate-ease-springy)',
14
- );
15
- // specifically removing className... it's causing problems?
16
- export const CollapsibleContent = forwardRef<
17
- HTMLDivElement,
18
- CollapsiblePrimitive.CollapsibleContentProps & {
19
- horizontal?: boolean;
20
- both?: boolean;
21
- }
22
- >(function CollapsibleContent({ horizontal, both, ...props }, ref) {
23
- return (
24
- <CollapsibleContentBase
25
- data-horizontal={horizontal}
26
- data-both={both}
27
- {...props}
28
- ref={ref}
29
- />
30
- );
31
- });
32
- export const CollapsibleTrigger = CollapsiblePrimitive.Trigger;
33
-
34
- export const CollapsibleSimple = ({
35
- horizontal,
36
- both,
37
- children,
38
- ...props
39
- }: CollapsiblePrimitive.CollapsibleProps & {
40
- horizontal?: boolean;
41
- both?: boolean;
42
- }) => (
43
- <CollapsibleRoot {...props}>
44
- <CollapsibleContent horizontal={horizontal} both={both}>
45
- {children}
46
- </CollapsibleContent>
47
- </CollapsibleRoot>
48
- );
49
-
50
- export const Collapsible = Object.assign(CollapsibleRoot, {
51
- Content: CollapsibleContent,
52
- Trigger: CollapsibleTrigger,
53
- Simple: CollapsibleSimple,
54
- });
1
+ 'use client';
2
+ import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
3
+ import { Ref } from 'react';
4
+ import { withClassName } from '../../hooks/withClassName.js';
5
+
6
+ export const CollapsibleRoot = CollapsiblePrimitive.Root;
7
+ const CollapsibleContentBase = withClassName(
8
+ CollapsiblePrimitive.Content,
9
+ 'overflow-hidden',
10
+ 'layer-components:[&[data-state=open]]:(animate-radix-collapsible-open-vertical animate-duration-300 animate-ease-springy) layer-components:[&[data-state=closed]]:(animate-radix-collapsible-close-vertical animate-duration-300 animate-ease-springy)',
11
+ 'layer-variants:[&[data-horizontal][data-state=open]]:(animate-radix-collapsible-open-horizontal animate-duration-300 animate-ease-springy) layer-variants:[&[data-horizontal][data-state=closed]]:(animate-radix-collapsible-close-horizontal animate-duration-300 animate-ease-springy)',
12
+ 'layer-variants:[&[data-both][data-state=open]]:(animate-radix-collapsible-open-both animate-duration-300 animate-ease-springy) layer-variants:[&[data-both][data-state=closed]]:(animate-radix-collapsible-close-both animate-duration-300 animate-ease-springy)',
13
+ );
14
+ // specifically removing className... it's causing problems?
15
+ export const CollapsibleContent = function CollapsibleContent({
16
+ ref,
17
+ horizontal,
18
+ both,
19
+ ...props
20
+ }: CollapsiblePrimitive.CollapsibleContentProps & {
21
+ horizontal?: boolean;
22
+ both?: boolean;
23
+ ref?: Ref<HTMLDivElement>;
24
+ }) {
25
+ return (
26
+ <CollapsibleContentBase
27
+ data-horizontal={horizontal}
28
+ data-both={both}
29
+ {...props}
30
+ ref={ref}
31
+ />
32
+ );
33
+ };
34
+ export const CollapsibleTrigger = CollapsiblePrimitive.Trigger;
35
+
36
+ export const CollapsibleSimple = ({
37
+ horizontal,
38
+ both,
39
+ children,
40
+ ...props
41
+ }: CollapsiblePrimitive.CollapsibleProps & {
42
+ horizontal?: boolean;
43
+ both?: boolean;
44
+ }) => (
45
+ <CollapsibleRoot {...props}>
46
+ <CollapsibleContent horizontal={horizontal} both={both}>
47
+ {children}
48
+ </CollapsibleContent>
49
+ </CollapsibleRoot>
50
+ );
51
+
52
+ export const Collapsible = Object.assign(CollapsibleRoot, {
53
+ Content: CollapsibleContent,
54
+ Trigger: CollapsibleTrigger,
55
+ Simple: CollapsibleSimple,
56
+ });