@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,283 +1,294 @@
1
- 'use client';
2
-
3
- import {
4
- CheckIcon,
5
- ChevronDownIcon,
6
- ChevronUpIcon,
7
- } from '@radix-ui/react-icons';
8
- import * as SelectPrimitive from '@radix-ui/react-select';
9
- import classNames from 'clsx';
10
- import {
11
- ComponentPropsWithRef,
12
- ComponentType,
13
- ElementType,
14
- FunctionComponent,
15
- ReactNode,
16
- createContext,
17
- forwardRef,
18
- useContext,
19
- } from 'react';
20
- import { withClassName } from '../../hooks/withClassName.js';
21
- import { Button, ButtonProps, getButtonClassName } from '../button/index.js';
22
- import { Icon } from '../icon/index.js';
23
-
24
- export const SelectItem = forwardRef<
25
- HTMLDivElement,
26
- SelectPrimitive.SelectItemProps
27
- >(({ children, className, ...props }, forwardedRef) => {
28
- const isNative = useContext(IsNativeContext);
29
-
30
- if (isNative) {
31
- return <option value={props.value}>{children}</option>;
32
- }
33
-
34
- return (
35
- <SelectItemRoot className={className} {...props} ref={forwardedRef}>
36
- <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
37
- <SelectItemIndicator />
38
- </SelectItemRoot>
39
- );
40
- });
41
-
42
- export const SelectItemRoot = withClassName(
43
- SelectPrimitive.Item,
44
- 'text-md leading-4 color-black rounded-sm flex items-center flex-row h-36px pr-4 pl-35px relative select-none',
45
- '[&[data-disabled]]:(color-gray5 pointer-events-none) [&[data-highlighted]]:(outline-none bg-primary-wash color-black)',
46
- );
47
- export const SelectItemIndicatorRoot = withClassName(
48
- SelectPrimitive.ItemIndicator,
49
- 'absolute left-0 w-25px inline-flex items-center justify-center',
50
- );
51
- export const SelectItemIndicator = withNoNativeRender(
52
- (props: SelectPrimitive.SelectItemIndicatorProps) => (
53
- <SelectItemIndicatorRoot {...props}>
54
- <CheckIcon />
55
- </SelectItemIndicatorRoot>
56
- ),
57
- );
58
- export const SelectItemText = withClassName(SelectPrimitive.ItemText, '');
59
- export const SelectGroup = (props: SelectPrimitive.SelectGroupProps) => {
60
- const isNative = useContext(IsNativeContext);
61
-
62
- if (isNative) {
63
- return (
64
- <optgroup id={props.id} className={props.className}>
65
- {props.children}
66
- </optgroup>
67
- );
68
- }
69
-
70
- return <SelectPrimitive.Group {...props} />;
71
- };
72
-
73
- export const SelectRoot = SelectPrimitive.Root;
74
- export const selectTriggerClassName = classNames(
75
- getButtonClassName({ color: 'default' }),
76
- 'layer-components:([all:unset] inline-flex [&[data-placeholder]]:color-gray8)',
77
- );
78
- export const SelectTriggerBase = withNoNativeRender(
79
- withClassName(SelectPrimitive.Trigger, selectTriggerClassName),
80
- );
81
- export const UnstyledSelectTrigger = withNoNativeRender(
82
- SelectPrimitive.Trigger,
83
- );
84
-
85
- export interface SelectTriggerProps extends ButtonProps {}
86
- export const SelectTrigger = forwardRef<HTMLButtonElement, SelectTriggerProps>(
87
- function SelectTrigger({ children, ...props }, ref) {
88
- return (
89
- <UnstyledSelectTrigger asChild {...props} ref={ref}>
90
- <Button className="gap-2 font-normal">
91
- {children || (
92
- <>
93
- <SelectValue />
94
- <SelectIcon />
95
- </>
96
- )}
97
- </Button>
98
- </UnstyledSelectTrigger>
99
- );
100
- },
101
- );
102
-
103
- export const SelectValue = withNoNativeRender(
104
- withClassName(SelectPrimitive.Value, 'flex flex-row'),
105
- );
106
- export const SelectLabel = withNoNativeRender(
107
- withClassName(
108
- SelectPrimitive.Label,
109
- 'px-25px text-xs leading-6 color-black select-none',
110
- ),
111
- );
112
- export const SelectSeparator = withNoNativeRender(
113
- withClassName(SelectPrimitive.Separator, 'h-1px bg-gray50 m-1'),
114
- );
115
- export const SelectIcon = withNoNativeRender(
116
- forwardRef<HTMLDivElement, SelectPrimitive.SelectIconProps>(
117
- ({ className, ...props }, forwardedRef) => {
118
- return (
119
- <SelectPrimitive.Icon
120
- className={classNames('color-inherit', className)}
121
- {...props}
122
- ref={forwardedRef}
123
- >
124
- <Icon name="chevron" className="w-[12px] h-[12px] relative top-1px" />
125
- </SelectPrimitive.Icon>
126
- );
127
- },
128
- ),
129
- );
130
-
131
- const zIndex = { zIndex: 1001 };
132
- export const SelectContent = withPassthroughNativeRender(
133
- forwardRef<
134
- HTMLDivElement,
135
- SelectPrimitive.SelectContentProps & { inDialog?: boolean }
136
- >(({ children, inDialog, className, ...props }, forwardedRef) => {
137
- return (
138
- <SelectPrimitive.Portal>
139
- <SelectPrimitive.Content
140
- className={classNames(
141
- 'layer-components:(overflow-hidden bg-white rounded-lg border border-solid border-1 border-black z-menu shadow-lg)',
142
- 'layer-components:transform-origin-[var(--radix-select-content-transform-origin)]',
143
- 'layer-components:[&[data-state=open]]:animate-popover-in',
144
- 'layer-components:[&[data-state=closed]]:animate-popover-out',
145
- 'layer-components:(min-w-[var(--radix-select-trigger-width)] max-h-[var(--radix-select-content-available-height)])',
146
- inDialog && 'z-[calc(var(--z-dialog)+1)]',
147
- className,
148
- )}
149
- style={zIndex}
150
- {...props}
151
- ref={forwardedRef}
152
- >
153
- <SelectPrimitive.ScrollUpButton className="flex items-center justify-center h-25px bg-white color-primary-dark cursor-default">
154
- <ChevronUpIcon />
155
- </SelectPrimitive.ScrollUpButton>
156
- <SelectPrimitive.Viewport className="p-1">
157
- {children}
158
- </SelectPrimitive.Viewport>
159
- <SelectPrimitive.ScrollDownButton className="flex items-center justify-center h-25px bg-white color-primary-dark cursor-default">
160
- <ChevronDownIcon />
161
- </SelectPrimitive.ScrollDownButton>
162
- </SelectPrimitive.Content>
163
- </SelectPrimitive.Portal>
164
- );
165
- }),
166
- );
167
-
168
- export const NativeSelect = forwardRef<
169
- HTMLSelectElement,
170
- React.SelectHTMLAttributes<HTMLSelectElement>
171
- >(({ className, ...props }, forwardedRef) => {
172
- return (
173
- <div className={classNames('relative', className)}>
174
- <select
175
- className={classNames(
176
- 'appearance-none font-inherit bg-white inline-flex items-center justify-center rounded-full px-3 py-1 pr-8 text-sm gap-2 color-black border-solid border border-gray5 hover:border-gray7 focus:outline-none focus-visible:shadow-focus [&[data-placeholder]]:color-gray8',
177
- )}
178
- {...props}
179
- ref={forwardedRef}
180
- />
181
- <div className="absolute right-1 top-50% translate-y-[-50%] pointer-events-none">
182
- <ChevronDownIcon className="w-4 h-4 m-2" />
183
- </div>
184
- </div>
185
- );
186
- });
187
-
188
- export type SelectProps<T extends string = string> = {
189
- children?: ReactNode;
190
- value: T;
191
- onValueChange?: (value: T) => void;
192
- className?: string;
193
- id?: string;
194
- /** Native on mobile; otherwise use custom select impl */
195
- mobileNative?: boolean;
196
- /** won't work on mobile and mobileNative=true */
197
- open?: boolean;
198
- /** won't work on mobile and mobileNative=true */
199
- onOpenChange?: (open: boolean) => void;
200
- };
201
- /**
202
- * A high-level Select which converts to native on mobile. Use with SelectItem.
203
- */
204
- const SelectBase = <T extends string = string>({
205
- children,
206
- value,
207
- onValueChange,
208
- mobileNative,
209
- ...rest
210
- }: SelectProps<T>) => {
211
- const mobile = isMobile();
212
-
213
- if (mobile && mobileNative) {
214
- return (
215
- <IsNativeContext.Provider value={true}>
216
- <NativeSelect
217
- onChange={(ev) => {
218
- onValueChange?.(ev.target.value as any);
219
- }}
220
- value={value}
221
- {...rest}
222
- >
223
- {children}
224
- </NativeSelect>
225
- </IsNativeContext.Provider>
226
- );
227
- }
228
-
229
- return (
230
- <SelectRoot value={value} onValueChange={onValueChange}>
231
- {children}
232
- </SelectRoot>
233
- );
234
- };
235
-
236
- export const Select = Object.assign(SelectBase, {
237
- Root: SelectRoot,
238
- Item: SelectItem,
239
- Group: SelectGroup,
240
- Trigger: SelectTrigger,
241
- Value: SelectValue,
242
- Label: SelectLabel,
243
- Separator: SelectSeparator,
244
- Icon: SelectIcon,
245
- Content: SelectContent,
246
- });
247
-
248
- function isMobile() {
249
- return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
250
- navigator.userAgent,
251
- );
252
- }
253
-
254
- // facilitate the auto native switching
255
- const IsNativeContext = createContext(false);
256
-
257
- function withNoNativeRender<T extends ComponentType<any> | ElementType<any>>(
258
- Component: T,
259
- ): FunctionComponent<ComponentPropsWithRef<T>> {
260
- const WithNoNativeRender = (props: any) => {
261
- const isNative = useContext(IsNativeContext);
262
-
263
- if (isNative) return null;
264
-
265
- return <Component {...props} />;
266
- };
267
- return WithNoNativeRender as any;
268
- }
269
-
270
- function withPassthroughNativeRender<
271
- T extends ComponentType<any> | ElementType<any>,
272
- >(Component: T): FunctionComponent<ComponentPropsWithRef<T>> {
273
- const WithPassthroughNativeRender = (props: any) => {
274
- const isNative = useContext(IsNativeContext);
275
-
276
- if (isNative) {
277
- return <>{props.children}</>;
278
- }
279
-
280
- return <Component {...props} />;
281
- };
282
- return WithPassthroughNativeRender as any;
283
- }
1
+ 'use client';
2
+
3
+ import {
4
+ CheckIcon,
5
+ ChevronDownIcon,
6
+ ChevronUpIcon,
7
+ } from '@radix-ui/react-icons';
8
+ import * as SelectPrimitive from '@radix-ui/react-select';
9
+ import classNames from 'clsx';
10
+ import {
11
+ ComponentPropsWithRef,
12
+ ComponentType,
13
+ ElementType,
14
+ FunctionComponent,
15
+ ReactNode,
16
+ createContext,
17
+ useContext,
18
+ } from 'react';
19
+ import { withClassName } from '../../hooks/withClassName.js';
20
+ import { Button, ButtonProps, getButtonClassName } from '../button/index.js';
21
+ import { Icon } from '../icon/index.js';
22
+
23
+ export const SelectItem = ({
24
+ ref: forwardedRef,
25
+ children,
26
+ className,
27
+ ...props
28
+ }: SelectPrimitive.SelectItemProps & {
29
+ ref?: React.Ref<HTMLDivElement>;
30
+ }) => {
31
+ const isNative = useContext(IsNativeContext);
32
+
33
+ if (isNative) {
34
+ return <option value={props.value}>{children}</option>;
35
+ }
36
+
37
+ return (
38
+ <SelectItemRoot className={className} {...props} ref={forwardedRef}>
39
+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
40
+ <SelectItemIndicator />
41
+ </SelectItemRoot>
42
+ );
43
+ };
44
+
45
+ export const SelectItemRoot = withClassName(
46
+ SelectPrimitive.Item,
47
+ 'text-md leading-4 color-black rounded-sm flex items-center flex-row h-36px pr-4 pl-35px relative select-none',
48
+ '[&[data-disabled]]:(color-gray5 pointer-events-none) [&[data-highlighted]]:(outline-none bg-primary-wash color-black)',
49
+ );
50
+ export const SelectItemIndicatorRoot = withClassName(
51
+ SelectPrimitive.ItemIndicator,
52
+ 'absolute left-0 w-25px inline-flex items-center justify-center',
53
+ );
54
+ export const SelectItemIndicator = withNoNativeRender(
55
+ (props: SelectPrimitive.SelectItemIndicatorProps) => (
56
+ <SelectItemIndicatorRoot {...props}>
57
+ <CheckIcon />
58
+ </SelectItemIndicatorRoot>
59
+ ),
60
+ );
61
+ export const SelectItemText = withClassName(SelectPrimitive.ItemText, '');
62
+ export const SelectGroup = (props: SelectPrimitive.SelectGroupProps) => {
63
+ const isNative = useContext(IsNativeContext);
64
+
65
+ if (isNative) {
66
+ return (
67
+ <optgroup id={props.id} className={props.className}>
68
+ {props.children}
69
+ </optgroup>
70
+ );
71
+ }
72
+
73
+ return <SelectPrimitive.Group {...props} />;
74
+ };
75
+
76
+ export const SelectRoot = SelectPrimitive.Root;
77
+ export const selectTriggerClassName = classNames(
78
+ getButtonClassName({ color: 'default' }),
79
+ 'layer-components:([all:unset] inline-flex [&[data-placeholder]]:color-gray8)',
80
+ );
81
+ export const SelectTriggerBase = withNoNativeRender(
82
+ withClassName(SelectPrimitive.Trigger, selectTriggerClassName),
83
+ );
84
+ export const UnstyledSelectTrigger = withNoNativeRender(
85
+ SelectPrimitive.Trigger,
86
+ );
87
+
88
+ export interface SelectTriggerProps extends ButtonProps {}
89
+ export const SelectTrigger = function SelectTrigger({
90
+ ref,
91
+ children,
92
+ ...props
93
+ }: SelectTriggerProps & {
94
+ ref?: React.Ref<HTMLButtonElement>;
95
+ }) {
96
+ return (
97
+ <UnstyledSelectTrigger asChild {...props} ref={ref}>
98
+ <Button className="gap-2 font-normal">
99
+ {children || (
100
+ <>
101
+ <SelectValue />
102
+ <SelectIcon />
103
+ </>
104
+ )}
105
+ </Button>
106
+ </UnstyledSelectTrigger>
107
+ );
108
+ };
109
+
110
+ export const SelectValue = withNoNativeRender(
111
+ withClassName(SelectPrimitive.Value, 'flex flex-row'),
112
+ );
113
+ export const SelectLabel = withNoNativeRender(
114
+ withClassName(
115
+ SelectPrimitive.Label,
116
+ 'px-25px text-xs leading-6 color-black select-none',
117
+ ),
118
+ );
119
+ export const SelectSeparator = withNoNativeRender(
120
+ withClassName(SelectPrimitive.Separator, 'h-1px bg-gray50 m-1'),
121
+ );
122
+ export const SelectIcon = withNoNativeRender(
123
+ ({
124
+ ref: forwardedRef,
125
+ className,
126
+ ...props
127
+ }: SelectPrimitive.SelectIconProps & {
128
+ ref?: React.Ref<HTMLDivElement>;
129
+ }) => {
130
+ return (
131
+ <SelectPrimitive.Icon
132
+ className={classNames('color-inherit', className)}
133
+ {...props}
134
+ ref={forwardedRef}
135
+ >
136
+ <Icon name="chevron" className="w-[12px] h-[12px] relative top-1px" />
137
+ </SelectPrimitive.Icon>
138
+ );
139
+ },
140
+ );
141
+
142
+ const zIndex = { zIndex: 1001 };
143
+ export const SelectContent = withPassthroughNativeRender(
144
+ ({ ref: forwardedRef, children, inDialog, className, ...props }) => {
145
+ return (
146
+ <SelectPrimitive.Portal>
147
+ <SelectPrimitive.Content
148
+ className={classNames(
149
+ 'layer-components:(overflow-hidden bg-white rounded-lg border border-solid border-1 border-black z-menu shadow-lg)',
150
+ 'layer-components:transform-origin-[var(--radix-select-content-transform-origin)]',
151
+ 'layer-components:[&[data-state=open]]:animate-popover-in',
152
+ 'layer-components:[&[data-state=closed]]:animate-popover-out',
153
+ 'layer-components:(min-w-[var(--radix-select-trigger-width)] max-h-[var(--radix-select-content-available-height)])',
154
+ inDialog && 'z-[calc(var(--z-dialog)+1)]',
155
+ className,
156
+ )}
157
+ style={zIndex}
158
+ {...props}
159
+ ref={forwardedRef}
160
+ >
161
+ <SelectPrimitive.ScrollUpButton className="flex items-center justify-center h-25px bg-white color-primary-dark cursor-default">
162
+ <ChevronUpIcon />
163
+ </SelectPrimitive.ScrollUpButton>
164
+ <SelectPrimitive.Viewport className="p-1">
165
+ {children}
166
+ </SelectPrimitive.Viewport>
167
+ <SelectPrimitive.ScrollDownButton className="flex items-center justify-center h-25px bg-white color-primary-dark cursor-default">
168
+ <ChevronDownIcon />
169
+ </SelectPrimitive.ScrollDownButton>
170
+ </SelectPrimitive.Content>
171
+ </SelectPrimitive.Portal>
172
+ );
173
+ },
174
+ );
175
+
176
+ export const NativeSelect = ({
177
+ ref: forwardedRef,
178
+ className,
179
+ ...props
180
+ }: React.SelectHTMLAttributes<HTMLSelectElement> & {
181
+ ref?: React.Ref<HTMLSelectElement>;
182
+ }) => {
183
+ return (
184
+ <div className={classNames('relative', className)}>
185
+ <select
186
+ className={classNames(
187
+ 'appearance-none font-inherit bg-white inline-flex items-center justify-center rounded-full px-3 py-1 pr-8 text-sm gap-2 color-black border-solid border border-gray5 hover:border-gray7 focus:outline-none focus-visible:shadow-focus [&[data-placeholder]]:color-gray8',
188
+ )}
189
+ {...props}
190
+ ref={forwardedRef}
191
+ />
192
+ <div className="absolute right-1 top-50% translate-y-[-50%] pointer-events-none">
193
+ <ChevronDownIcon className="w-4 h-4 m-2" />
194
+ </div>
195
+ </div>
196
+ );
197
+ };
198
+
199
+ export type SelectProps<T extends string = string> = {
200
+ children?: ReactNode;
201
+ value: T;
202
+ onValueChange?: (value: T) => void;
203
+ className?: string;
204
+ id?: string;
205
+ /** Native on mobile; otherwise use custom select impl */
206
+ mobileNative?: boolean;
207
+ /** won't work on mobile and mobileNative=true */
208
+ open?: boolean;
209
+ /** won't work on mobile and mobileNative=true */
210
+ onOpenChange?: (open: boolean) => void;
211
+ };
212
+ /**
213
+ * A high-level Select which converts to native on mobile. Use with SelectItem.
214
+ */
215
+ const SelectBase = <T extends string = string>({
216
+ children,
217
+ value,
218
+ onValueChange,
219
+ mobileNative,
220
+ ...rest
221
+ }: SelectProps<T>) => {
222
+ const mobile = isMobile();
223
+
224
+ if (mobile && mobileNative) {
225
+ return (
226
+ <IsNativeContext.Provider value={true}>
227
+ <NativeSelect
228
+ onChange={(ev) => {
229
+ onValueChange?.(ev.target.value as any);
230
+ }}
231
+ value={value}
232
+ {...rest}
233
+ >
234
+ {children}
235
+ </NativeSelect>
236
+ </IsNativeContext.Provider>
237
+ );
238
+ }
239
+
240
+ return (
241
+ <SelectRoot value={value} onValueChange={onValueChange}>
242
+ {children}
243
+ </SelectRoot>
244
+ );
245
+ };
246
+
247
+ export const Select = Object.assign(SelectBase, {
248
+ Root: SelectRoot,
249
+ Item: SelectItem,
250
+ Group: SelectGroup,
251
+ Trigger: SelectTrigger,
252
+ Value: SelectValue,
253
+ Label: SelectLabel,
254
+ Separator: SelectSeparator,
255
+ Icon: SelectIcon,
256
+ Content: SelectContent,
257
+ });
258
+
259
+ function isMobile() {
260
+ return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
261
+ navigator.userAgent,
262
+ );
263
+ }
264
+
265
+ // facilitate the auto native switching
266
+ const IsNativeContext = createContext(false);
267
+
268
+ function withNoNativeRender<T extends ComponentType<any> | ElementType<any>>(
269
+ Component: T,
270
+ ): FunctionComponent<ComponentPropsWithRef<T>> {
271
+ const WithNoNativeRender = (props: any) => {
272
+ const isNative = useContext(IsNativeContext);
273
+
274
+ if (isNative) return null;
275
+
276
+ return <Component {...props} />;
277
+ };
278
+ return WithNoNativeRender as any;
279
+ }
280
+
281
+ function withPassthroughNativeRender<
282
+ T extends ComponentType<any> | ElementType<any>,
283
+ >(Component: T): FunctionComponent<ComponentPropsWithRef<T>> {
284
+ const WithPassthroughNativeRender = (props: any) => {
285
+ const isNative = useContext(IsNativeContext);
286
+
287
+ if (isNative) {
288
+ return <>{props.children}</>;
289
+ }
290
+
291
+ return <Component {...props} />;
292
+ };
293
+ return WithPassthroughNativeRender as any;
294
+ }