@a-type/ui 1.3.0 → 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 +4 -2
  5. package/dist/cjs/components/box/Box.js +9 -6
  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 +4 -2
  106. package/dist/esm/components/box/Box.js +9 -6
  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 +27 -24
  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
@@ -1,38 +1,42 @@
1
- import { ReactNode, forwardRef, useEffect, useRef } from 'react';
2
- import classNames from 'clsx';
3
- import useMergedRef from '../../hooks/useMergedRef.js';
4
- import { useStableCallback } from '../../hooks.js';
5
-
6
- export interface InfiniteLoadTriggerProps {
7
- className?: string;
8
- children?: ReactNode;
9
- onVisible?: () => void;
10
- }
11
-
12
- export const InfiniteLoadTrigger = forwardRef<
13
- HTMLDivElement,
14
- InfiniteLoadTriggerProps
15
- >(function InfiniteLoadTrigger({ className, onVisible, ...rest }, ref) {
16
- const innerRef = useRef<HTMLDivElement>(null);
17
-
18
- const stableOnVisible = useStableCallback(onVisible);
19
- useEffect(() => {
20
- const observer = new IntersectionObserver((entries) => {
21
- if (entries[0].isIntersecting) {
22
- stableOnVisible();
23
- }
24
- });
25
- observer.observe(innerRef.current!);
26
- return () => {
27
- observer.disconnect();
28
- };
29
- }, [stableOnVisible]);
30
-
31
- return (
32
- <div
33
- ref={useMergedRef(ref, innerRef)}
34
- className={classNames('flex flex-col items-center', className)}
35
- {...rest}
36
- />
37
- );
38
- });
1
+ import classNames from 'clsx';
2
+ import { ReactNode, useEffect, useRef } from 'react';
3
+ import { useStableCallback } from '../../hooks.js';
4
+ import useMergedRef from '../../hooks/useMergedRef.js';
5
+
6
+ export interface InfiniteLoadTriggerProps {
7
+ className?: string;
8
+ children?: ReactNode;
9
+ onVisible?: () => void;
10
+ }
11
+
12
+ export const InfiniteLoadTrigger = function InfiniteLoadTrigger({
13
+ ref,
14
+ className,
15
+ onVisible,
16
+ ...rest
17
+ }: InfiniteLoadTriggerProps & {
18
+ ref?: React.Ref<HTMLDivElement>;
19
+ }) {
20
+ const innerRef = useRef<HTMLDivElement>(null);
21
+
22
+ const stableOnVisible = useStableCallback(onVisible);
23
+ useEffect(() => {
24
+ const observer = new IntersectionObserver((entries) => {
25
+ if (entries[0].isIntersecting) {
26
+ stableOnVisible();
27
+ }
28
+ });
29
+ observer.observe(innerRef.current!);
30
+ return () => {
31
+ observer.disconnect();
32
+ };
33
+ }, [stableOnVisible]);
34
+
35
+ return (
36
+ <div
37
+ ref={useMergedRef(ref, innerRef)}
38
+ className={classNames('flex flex-col items-center', className)}
39
+ {...rest}
40
+ />
41
+ );
42
+ };
@@ -1,81 +1,75 @@
1
- import { Slot } from '@radix-ui/react-slot';
2
- import classNames from 'clsx';
3
- import {
4
- ChangeEvent,
5
- ComponentProps,
6
- FocusEvent,
7
- forwardRef,
8
- useCallback,
9
- } from 'react';
10
- import { useRotatingShuffledValue } from '../../hooks/useRotatingShuffledValue.js';
11
-
12
- export const inputClassName = classNames(
13
- 'layer-components:(px-5 py-[5px] text-md font-sans rounded-20px bg-white select-auto min-w-60px color-black border-solid border-1 border-gray-5 shadow-sm-inset)',
14
- 'layer-components:focus:(outline-none bg-gray-1 ring-4 ring-white)',
15
- 'layer-components:focus-visible:(outline-none ring-gray-dark-blend)',
16
- 'layer-components:md:(min-w-120px)',
17
- );
18
-
19
- export interface InputProps extends ComponentProps<'input'> {
20
- /** @deprecated */
21
- variant?: 'default' | 'primary';
22
- autoSelect?: boolean;
23
- asChild?: boolean;
24
- /** Shuffle between random placeholders */
25
- placeholders?: string[];
26
- placeholdersIntervalMs?: number;
27
- onValueChange?: (value: string) => void;
28
- }
29
-
30
- export const Input = forwardRef<HTMLInputElement, InputProps>(function Input(
31
- {
32
- className,
33
- autoSelect,
34
- onFocus,
35
- onChange,
36
- onValueChange,
37
- variant: _,
38
- asChild,
39
- placeholders,
40
- placeholder,
41
- placeholdersIntervalMs = 5000,
42
- ...props
43
- },
44
- ref,
45
- ) {
46
- const handleFocus = useCallback(
47
- (ev: FocusEvent<HTMLInputElement>) => {
48
- if (autoSelect) {
49
- ev.target.select();
50
- }
51
- onFocus?.(ev);
52
- },
53
- [onFocus, autoSelect],
54
- );
55
-
56
- const handleChange = useCallback(
57
- (ev: ChangeEvent<HTMLInputElement>) => {
58
- onValueChange?.(ev.target.value);
59
- onChange?.(ev);
60
- },
61
- [onChange, onValueChange],
62
- );
63
-
64
- const randomPlaceholder = useRotatingShuffledValue(
65
- placeholders ?? [],
66
- placeholdersIntervalMs,
67
- );
68
-
69
- const Component = asChild ? Slot : 'input';
70
-
71
- return (
72
- <Component
73
- {...props}
74
- onFocus={handleFocus}
75
- onChange={handleChange}
76
- className={classNames(inputClassName, className)}
77
- ref={ref}
78
- placeholder={placeholder ?? randomPlaceholder}
79
- />
80
- );
81
- });
1
+ import { Slot } from '@radix-ui/react-slot';
2
+ import classNames from 'clsx';
3
+ import { ChangeEvent, ComponentProps, FocusEvent, useCallback } from 'react';
4
+ import { useRotatingShuffledValue } from '../../hooks/useRotatingShuffledValue.js';
5
+
6
+ export const inputClassName = classNames(
7
+ 'layer-components:(px-5 py-[5px] text-md font-sans rounded-20px bg-white select-auto min-w-60px color-black border-solid border-1 border-gray-5 shadow-sm-inset)',
8
+ 'layer-components:focus:(outline-none bg-gray-1 ring-4 ring-white)',
9
+ 'layer-components:focus-visible:(outline-none ring-gray-dark-blend)',
10
+ 'layer-components:md:(min-w-120px)',
11
+ );
12
+
13
+ export interface InputProps extends ComponentProps<'input'> {
14
+ /** @deprecated */
15
+ variant?: 'default' | 'primary';
16
+ autoSelect?: boolean;
17
+ asChild?: boolean;
18
+ /** Shuffle between random placeholders */
19
+ placeholders?: string[];
20
+ placeholdersIntervalMs?: number;
21
+ onValueChange?: (value: string) => void;
22
+ }
23
+
24
+ export const Input = function Input({
25
+ ref,
26
+ className,
27
+ autoSelect,
28
+ onFocus,
29
+ onChange,
30
+ onValueChange,
31
+ variant: _,
32
+ asChild,
33
+ placeholders,
34
+ placeholder,
35
+ placeholdersIntervalMs = 5000,
36
+ ...props
37
+ }: InputProps & {
38
+ ref?: React.Ref<HTMLInputElement>;
39
+ }) {
40
+ const handleFocus = useCallback(
41
+ (ev: FocusEvent<HTMLInputElement>) => {
42
+ if (autoSelect) {
43
+ ev.target.select();
44
+ }
45
+ onFocus?.(ev);
46
+ },
47
+ [onFocus, autoSelect],
48
+ );
49
+
50
+ const handleChange = useCallback(
51
+ (ev: ChangeEvent<HTMLInputElement>) => {
52
+ onValueChange?.(ev.target.value);
53
+ onChange?.(ev);
54
+ },
55
+ [onChange, onValueChange],
56
+ );
57
+
58
+ const randomPlaceholder = useRotatingShuffledValue(
59
+ placeholders ?? [],
60
+ placeholdersIntervalMs,
61
+ );
62
+
63
+ const Component = asChild ? Slot : 'input';
64
+
65
+ return (
66
+ <Component
67
+ {...props}
68
+ onFocus={handleFocus}
69
+ onChange={handleChange}
70
+ className={classNames(inputClassName, className)}
71
+ ref={ref}
72
+ placeholder={placeholder ?? randomPlaceholder}
73
+ />
74
+ );
75
+ };
@@ -1,138 +1,134 @@
1
- 'use client';
2
-
3
- import {
4
- ChangeEvent,
5
- FocusEvent,
6
- forwardRef,
7
- KeyboardEventHandler,
8
- MouseEventHandler,
9
- useCallback,
10
- useEffect,
11
- useMemo,
12
- useRef,
13
- useState,
14
- } from 'react';
15
- import { debounce } from '@a-type/utils';
16
- import { Input, InputProps } from '../input/Input.js';
17
- import { TextArea } from '../textArea/TextArea.js';
18
-
19
- export type LiveUpdateTextFieldProps = {
20
- value: string;
21
- debounceMs?: number;
22
- onChange: (value: string) => void;
23
- textArea?: boolean;
24
- className?: string;
25
- onFocus?: (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
26
- onBlur?: (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
27
- autoComplete?: InputProps['autoComplete'];
28
- autoFocus?: InputProps['autoFocus'];
29
- autoSelect?: InputProps['autoSelect'];
30
- required?: boolean;
31
- placeholder?: string;
32
- type?: InputProps['type'];
33
- id?: string;
34
- onKeyDown?: KeyboardEventHandler;
35
- onKeyUp?: KeyboardEventHandler;
36
- onClick?: MouseEventHandler;
37
- };
38
-
39
- /**
40
- * An extension of TextField which keeps a local realtime value in state and
41
- * periodically reports changes to the parent. Use this to connect
42
- * to the API and update a value from the field directly.
43
- *
44
- * This component is optimistic and will not respond to external changes while focused.
45
- */
46
- export const LiveUpdateTextField = forwardRef<
47
- HTMLInputElement | HTMLTextAreaElement,
48
- LiveUpdateTextFieldProps
49
- >(function LiveUpdateTextField(
50
- {
51
- value,
52
- onChange,
53
- debounceMs = 500,
54
- onFocus,
55
- onBlur,
56
- textArea,
57
- type,
58
- ...rest
59
- },
60
- ref,
61
- ) {
62
- const [displayValue, setDisplayValue] = useState(value || '');
63
- const ignoreUpdates = useRef(false);
64
- const didChange = useRef(false);
65
-
66
- const handleFocus = useCallback(
67
- (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
68
- onFocus?.(ev);
69
- ignoreUpdates.current = true;
70
- },
71
- [onFocus],
72
- );
73
-
74
- const handleBlur = useCallback(
75
- (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
76
- onBlur?.(ev);
77
- ignoreUpdates.current = false;
78
- // immediately send update if the user typed anything.
79
- // otherwise pull the latest remote value
80
- if (didChange.current) {
81
- onChange?.(displayValue);
82
- } else {
83
- setDisplayValue(value || '');
84
- }
85
- didChange.current = false;
86
- },
87
- [onBlur, displayValue, onChange, value],
88
- );
89
-
90
- useEffect(() => {
91
- if (ignoreUpdates.current) {
92
- return;
93
- }
94
- setDisplayValue(value || '');
95
- }, [value]);
96
-
97
- // every once in a while, send an update to parent
98
- const debouncedOnChange = useMemo(
99
- () => debounce(onChange || (() => {}), debounceMs),
100
- [onChange, debounceMs],
101
- );
102
-
103
- // update local state instantly and parent eventually
104
- const handleChange = useCallback(
105
- (ev: ChangeEvent<any>) => {
106
- setDisplayValue(ev.target.value);
107
- debouncedOnChange(ev.target.value);
108
- didChange.current = true;
109
- },
110
- [debouncedOnChange],
111
- );
112
-
113
- if (textArea) {
114
- return (
115
- <TextArea
116
- ref={ref as any}
117
- onFocus={handleFocus}
118
- onBlur={handleBlur}
119
- value={displayValue}
120
- onChange={handleChange}
121
- autoSize
122
- {...rest}
123
- />
124
- );
125
- } else {
126
- return (
127
- <Input
128
- ref={ref as any}
129
- onFocus={handleFocus}
130
- onBlur={handleBlur}
131
- value={displayValue}
132
- onChange={handleChange}
133
- type={type}
134
- {...rest}
135
- />
136
- );
137
- }
138
- });
1
+ 'use client';
2
+
3
+ import { debounce } from '@a-type/utils';
4
+ import {
5
+ ChangeEvent,
6
+ FocusEvent,
7
+ KeyboardEventHandler,
8
+ MouseEventHandler,
9
+ Ref,
10
+ useCallback,
11
+ useEffect,
12
+ useMemo,
13
+ useRef,
14
+ useState,
15
+ } from 'react';
16
+ import { Input, InputProps } from '../input/Input.js';
17
+ import { TextArea } from '../textArea/TextArea.js';
18
+
19
+ export type LiveUpdateTextFieldProps = {
20
+ value: string;
21
+ debounceMs?: number;
22
+ onChange: (value: string) => void;
23
+ textArea?: boolean;
24
+ className?: string;
25
+ onFocus?: (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
26
+ onBlur?: (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
27
+ autoComplete?: InputProps['autoComplete'];
28
+ autoFocus?: InputProps['autoFocus'];
29
+ autoSelect?: InputProps['autoSelect'];
30
+ required?: boolean;
31
+ placeholder?: string;
32
+ type?: InputProps['type'];
33
+ id?: string;
34
+ onKeyDown?: KeyboardEventHandler;
35
+ onKeyUp?: KeyboardEventHandler;
36
+ onClick?: MouseEventHandler;
37
+ ref?: Ref<HTMLInputElement | HTMLTextAreaElement>;
38
+ };
39
+
40
+ /**
41
+ * An extension of TextField which keeps a local realtime value in state and
42
+ * periodically reports changes to the parent. Use this to connect
43
+ * to the API and update a value from the field directly.
44
+ *
45
+ * This component is optimistic and will not respond to external changes while focused.
46
+ */
47
+ export const LiveUpdateTextField = function LiveUpdateTextField({
48
+ ref,
49
+ value,
50
+ onChange,
51
+ debounceMs = 500,
52
+ onFocus,
53
+ onBlur,
54
+ textArea,
55
+ type,
56
+ ...rest
57
+ }: LiveUpdateTextFieldProps) {
58
+ const [displayValue, setDisplayValue] = useState(value || '');
59
+ const ignoreUpdates = useRef(false);
60
+ const didChange = useRef(false);
61
+
62
+ const handleFocus = useCallback(
63
+ (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
64
+ onFocus?.(ev);
65
+ ignoreUpdates.current = true;
66
+ },
67
+ [onFocus],
68
+ );
69
+
70
+ const handleBlur = useCallback(
71
+ (ev: FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {
72
+ onBlur?.(ev);
73
+ ignoreUpdates.current = false;
74
+ // immediately send update if the user typed anything.
75
+ // otherwise pull the latest remote value
76
+ if (didChange.current) {
77
+ onChange?.(displayValue);
78
+ } else {
79
+ setDisplayValue(value || '');
80
+ }
81
+ didChange.current = false;
82
+ },
83
+ [onBlur, displayValue, onChange, value],
84
+ );
85
+
86
+ useEffect(() => {
87
+ if (ignoreUpdates.current) {
88
+ return;
89
+ }
90
+ setDisplayValue(value || '');
91
+ }, [value]);
92
+
93
+ // every once in a while, send an update to parent
94
+ const debouncedOnChange = useMemo(
95
+ () => debounce(onChange || (() => {}), debounceMs),
96
+ [onChange, debounceMs],
97
+ );
98
+
99
+ // update local state instantly and parent eventually
100
+ const handleChange = useCallback(
101
+ (ev: ChangeEvent<any>) => {
102
+ setDisplayValue(ev.target.value);
103
+ debouncedOnChange(ev.target.value);
104
+ didChange.current = true;
105
+ },
106
+ [debouncedOnChange],
107
+ );
108
+
109
+ if (textArea) {
110
+ return (
111
+ <TextArea
112
+ ref={ref as any}
113
+ onFocus={handleFocus}
114
+ onBlur={handleBlur}
115
+ value={displayValue}
116
+ onChange={handleChange}
117
+ autoSize
118
+ {...rest}
119
+ />
120
+ );
121
+ } else {
122
+ return (
123
+ <Input
124
+ ref={ref as any}
125
+ onFocus={handleFocus}
126
+ onBlur={handleBlur}
127
+ value={displayValue}
128
+ onChange={handleChange}
129
+ type={type}
130
+ {...rest}
131
+ />
132
+ );
133
+ }
134
+ };