@tipp/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.
@@ -1,4 +1,13 @@
1
1
  import "../chunk-76JGDATZ.js";
2
+ import {
3
+ Switch
4
+ } from "../chunk-OYM4XCHQ.js";
5
+ import {
6
+ TabNav
7
+ } from "../chunk-YJ7ZFOYL.js";
8
+ import {
9
+ Tabs
10
+ } from "../chunk-5ZITU5L7.js";
2
11
  import {
3
12
  TextArea
4
13
  } from "../chunk-ILRUXI2E.js";
@@ -9,6 +18,15 @@ import {
9
18
  ToastContainer,
10
19
  toast
11
20
  } from "../chunk-CYYWMYE7.js";
21
+ import {
22
+ ScrollArea
23
+ } from "../chunk-ZKZDVS7G.js";
24
+ import {
25
+ Section
26
+ } from "../chunk-MUNMDHRF.js";
27
+ import {
28
+ SegmentedControl
29
+ } from "../chunk-TVDKGMBI.js";
12
30
  import {
13
31
  Select
14
32
  } from "../chunk-3JRNKBMN.js";
@@ -25,14 +43,14 @@ import {
25
43
  Strong
26
44
  } from "../chunk-74DX4CU7.js";
27
45
  import {
28
- Switch
29
- } from "../chunk-OYM4XCHQ.js";
46
+ Link
47
+ } from "../chunk-SIM6HKVI.js";
30
48
  import {
31
- TabNav
32
- } from "../chunk-YJ7ZFOYL.js";
49
+ Pagination
50
+ } from "../chunk-RJMSUTBQ.js";
33
51
  import {
34
- Tabs
35
- } from "../chunk-5ZITU5L7.js";
52
+ Popover
53
+ } from "../chunk-5AVBYDPB.js";
36
54
  import {
37
55
  Progress
38
56
  } from "../chunk-365QMK4D.js";
@@ -49,17 +67,20 @@ import {
49
67
  Radio
50
68
  } from "../chunk-FPD73OHW.js";
51
69
  import {
52
- ScrollArea
53
- } from "../chunk-ZKZDVS7G.js";
70
+ Form
71
+ } from "../chunk-2CVXGGI5.js";
54
72
  import {
55
- Section
56
- } from "../chunk-MUNMDHRF.js";
73
+ Grid
74
+ } from "../chunk-EGEQY3KT.js";
57
75
  import {
58
- SegmentedControl
59
- } from "../chunk-TVDKGMBI.js";
76
+ Heading
77
+ } from "../chunk-HK224ADT.js";
60
78
  import {
61
79
  HoverCard
62
80
  } from "../chunk-O3T3TM3V.js";
81
+ import {
82
+ IconButton
83
+ } from "../chunk-O3DNDMV3.js";
63
84
  import {
64
85
  Inset
65
86
  } from "../chunk-XQOL7UBI.js";
@@ -67,17 +88,17 @@ import {
67
88
  Kbd
68
89
  } from "../chunk-TULWX7D6.js";
69
90
  import {
70
- Link
71
- } from "../chunk-SIM6HKVI.js";
72
- import {
73
- Pagination
74
- } from "../chunk-RJMSUTBQ.js";
91
+ DataList
92
+ } from "../chunk-VTJZMOSP.js";
75
93
  import {
76
- IconButton
77
- } from "../chunk-O3DNDMV3.js";
94
+ Dialog
95
+ } from "../chunk-6AJTMXLJ.js";
78
96
  import {
79
- Popover
80
- } from "../chunk-5AVBYDPB.js";
97
+ Content,
98
+ Drawer,
99
+ Root,
100
+ Trigger
101
+ } from "../chunk-HJQQMAUB.js";
81
102
  import {
82
103
  DropdownMenu
83
104
  } from "../chunk-4WFMOFN2.js";
@@ -100,14 +121,14 @@ import {
100
121
  Flex
101
122
  } from "../chunk-25HMMI7R.js";
102
123
  import {
103
- Form
104
- } from "../chunk-2CVXGGI5.js";
124
+ Callout
125
+ } from "../chunk-B6XJN6EC.js";
105
126
  import {
106
- Grid
107
- } from "../chunk-EGEQY3KT.js";
127
+ Card
128
+ } from "../chunk-UVKNLJDZ.js";
108
129
  import {
109
- Heading
110
- } from "../chunk-HK224ADT.js";
130
+ CheckboxCards
131
+ } from "../chunk-MIMJ7LON.js";
111
132
  import {
112
133
  CheckboxGroup
113
134
  } from "../chunk-IQEEPHOY.js";
@@ -124,17 +145,14 @@ import {
124
145
  Container
125
146
  } from "../chunk-Q37G2GS6.js";
126
147
  import {
127
- DataList
128
- } from "../chunk-VTJZMOSP.js";
148
+ AlertDialog
149
+ } from "../chunk-J242TTFH.js";
129
150
  import {
130
- Dialog
131
- } from "../chunk-6AJTMXLJ.js";
151
+ AspectRatio
152
+ } from "../chunk-EAXUQEO5.js";
132
153
  import {
133
- Content,
134
- Drawer,
135
- Root,
136
- Trigger
137
- } from "../chunk-HJQQMAUB.js";
154
+ AutoSizingInput
155
+ } from "../chunk-YJCCE5WP.js";
138
156
  import {
139
157
  Avatar
140
158
  } from "../chunk-3SSSCLJ5.js";
@@ -150,25 +168,7 @@ import {
150
168
  import {
151
169
  Button
152
170
  } from "../chunk-P3YCIJUP.js";
153
- import {
154
- Callout
155
- } from "../chunk-B6XJN6EC.js";
156
- import {
157
- Card
158
- } from "../chunk-UVKNLJDZ.js";
159
- import {
160
- CheckboxCards
161
- } from "../chunk-MIMJ7LON.js";
162
171
  import "../chunk-66C4U3BG.js";
163
- import {
164
- AlertDialog
165
- } from "../chunk-J242TTFH.js";
166
- import {
167
- AspectRatio
168
- } from "../chunk-EAXUQEO5.js";
169
- import {
170
- AutoSizingInput
171
- } from "../chunk-YJCCE5WP.js";
172
172
  import "../chunk-N552FDTV.js";
173
173
  export {
174
174
  AlertDialog,
@@ -0,0 +1,340 @@
1
+ import {
2
+ ScrollArea
3
+ } from "./chunk-ZKZDVS7G.js";
4
+ import {
5
+ Popover
6
+ } from "./chunk-5AVBYDPB.js";
7
+ import {
8
+ AutoSizingInput
9
+ } from "./chunk-YJCCE5WP.js";
10
+ import {
11
+ Grid
12
+ } from "./chunk-EGEQY3KT.js";
13
+ import {
14
+ Button
15
+ } from "./chunk-P3YCIJUP.js";
16
+ import {
17
+ Badge
18
+ } from "./chunk-EWD4AO5N.js";
19
+ import {
20
+ CheckIcon
21
+ } from "./chunk-66C4U3BG.js";
22
+ import {
23
+ Typo
24
+ } from "./chunk-52MVZ6AN.js";
25
+ import {
26
+ Flex
27
+ } from "./chunk-25HMMI7R.js";
28
+
29
+ // src/molecules/tag-selector.tsx
30
+ import {
31
+ useCallback,
32
+ useEffect,
33
+ useMemo,
34
+ useRef,
35
+ useState
36
+ } from "react";
37
+ import {
38
+ ChevronRightIcon,
39
+ Cross1Icon,
40
+ MagnifyingGlassIcon
41
+ } from "@radix-ui/react-icons";
42
+ import { jsx, jsxs } from "react/jsx-runtime";
43
+ var OPTION_HEIGHT = 32;
44
+ var DefaultDropdownContainer = (props) => {
45
+ return props.children;
46
+ };
47
+ function TagSelector(props) {
48
+ const {
49
+ options = [],
50
+ tagRender,
51
+ placeholder,
52
+ maxCount = 0,
53
+ DropdownContainer = DefaultDropdownContainer,
54
+ onChange,
55
+ size = "medium"
56
+ } = props;
57
+ const [selected, setSelected] = useState(props.selected || []);
58
+ const [value, setValue] = useState("");
59
+ const [focusIndex, setFocusIndex] = useState(null);
60
+ const [open, setOpen] = useState(false);
61
+ const [focus, setFocus] = useState(false);
62
+ const fieldRef = useRef(null);
63
+ const scrollRef = useRef(null);
64
+ const closeRef = useRef(0);
65
+ const onFocus = useCallback(() => {
66
+ clearTimeout(closeRef.current);
67
+ setFocus(true);
68
+ setOpen(true);
69
+ }, []);
70
+ const onBlur = useCallback(() => {
71
+ closeRef.current = setTimeout(() => {
72
+ setFocus(false);
73
+ setOpen(false);
74
+ setTimeout(() => {
75
+ setValue("");
76
+ }, 100);
77
+ }, 300);
78
+ }, []);
79
+ const onChangeValue = useCallback(
80
+ (e) => {
81
+ setValue(e.target.value);
82
+ },
83
+ []
84
+ );
85
+ const filteredOptions = useMemo(() => {
86
+ return options.filter((option) => {
87
+ return option.name.includes(value);
88
+ });
89
+ }, [options, value]);
90
+ const selectedItem = useMemo(() => {
91
+ const result = [];
92
+ selected.forEach((id) => {
93
+ const maybeItem = options.find((option) => option.id === id);
94
+ if (maybeItem)
95
+ result.push(maybeItem);
96
+ });
97
+ return result;
98
+ }, [options, selected]);
99
+ const onDelete = useCallback((id) => {
100
+ setSelected((prev) => prev.filter((el) => el !== id));
101
+ }, []);
102
+ const onSelect = useCallback(
103
+ (id) => {
104
+ if (maxCount && selected.length + 1 > maxCount)
105
+ return;
106
+ setSelected((prev) => [...prev, id]);
107
+ },
108
+ [maxCount, selected]
109
+ );
110
+ const toggleItem = useCallback(
111
+ (id) => {
112
+ if (selected.includes(id)) {
113
+ onDelete(id);
114
+ } else {
115
+ onSelect(id);
116
+ }
117
+ },
118
+ [onDelete, onSelect, selected]
119
+ );
120
+ const setScroll = useCallback((index) => {
121
+ if (scrollRef.current) {
122
+ const scrollTop = scrollRef.current.scrollTop;
123
+ const clientHeight = scrollRef.current.clientHeight;
124
+ const focusTop = index * OPTION_HEIGHT;
125
+ if (focusTop < scrollTop) {
126
+ scrollRef.current.scrollTop = focusTop;
127
+ } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {
128
+ scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;
129
+ }
130
+ }
131
+ }, []);
132
+ const handleKeyDown = useCallback(
133
+ (e) => {
134
+ var _a;
135
+ const key = e.key;
136
+ switch (key) {
137
+ case "ArrowDown": {
138
+ e.preventDefault();
139
+ let newFocus = 0;
140
+ if (typeof focusIndex === "number") {
141
+ newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;
142
+ }
143
+ setFocusIndex(newFocus);
144
+ setScroll(newFocus);
145
+ break;
146
+ }
147
+ case "ArrowUp": {
148
+ e.preventDefault();
149
+ let newFocus = 0;
150
+ if (typeof focusIndex === "number") {
151
+ newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;
152
+ }
153
+ setFocusIndex(newFocus);
154
+ setScroll(newFocus);
155
+ break;
156
+ }
157
+ case "Enter":
158
+ setValue("");
159
+ if (focusIndex !== null) {
160
+ toggleItem((_a = filteredOptions[focusIndex]) == null ? void 0 : _a.id);
161
+ }
162
+ break;
163
+ case "Backspace":
164
+ if (value.length === 0) {
165
+ setSelected((prev) => prev.slice(0, -1));
166
+ }
167
+ break;
168
+ case "Escape":
169
+ setOpen(false);
170
+ break;
171
+ }
172
+ },
173
+ [
174
+ focusIndex,
175
+ value.length,
176
+ setScroll,
177
+ options.length,
178
+ toggleItem,
179
+ filteredOptions
180
+ ]
181
+ );
182
+ const placeholderVisible = useMemo(() => {
183
+ if (selectedItem.length)
184
+ return false;
185
+ if (value)
186
+ return false;
187
+ if (focus)
188
+ return false;
189
+ return true;
190
+ }, [focus, selectedItem.length, value]);
191
+ useEffect(() => {
192
+ onChange == null ? void 0 : onChange(selected);
193
+ }, [[...selected].sort().join(",")]);
194
+ useEffect(() => {
195
+ setSelected(props.selected || []);
196
+ }, [[...props.selected || []].sort().join(",")]);
197
+ useEffect(() => {
198
+ setFocusIndex(null);
199
+ }, [open]);
200
+ useEffect(() => {
201
+ setFocusIndex(0);
202
+ }, [filteredOptions]);
203
+ const badgeSize = useMemo(() => {
204
+ switch (size) {
205
+ case "large":
206
+ return "large";
207
+ case "medium":
208
+ case "small":
209
+ default:
210
+ return "small";
211
+ }
212
+ }, [size]);
213
+ const placeholderVariant = useMemo(() => {
214
+ switch (size) {
215
+ case "large":
216
+ return "subtitle";
217
+ case "medium":
218
+ default:
219
+ return "body";
220
+ }
221
+ }, [size]);
222
+ return /* @__PURE__ */ jsxs(Popover.Root, { open: Boolean(filteredOptions.length) && open, children: [
223
+ /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsxs(
224
+ Grid,
225
+ {
226
+ align: "center",
227
+ className: `tag-selector ${focus ? "focused" : ""} ${size}`,
228
+ columns: "1fr auto",
229
+ gap: "1",
230
+ onClick: () => {
231
+ var _a;
232
+ return (_a = fieldRef.current) == null ? void 0 : _a.focus();
233
+ },
234
+ children: [
235
+ /* @__PURE__ */ jsxs(
236
+ Flex,
237
+ {
238
+ align: "center",
239
+ gap: "1",
240
+ maxWidth: "100%",
241
+ overflow: "hidden",
242
+ wrap: "wrap",
243
+ children: [
244
+ selectedItem.map((item) => {
245
+ return tagRender ? tagRender(item) : /* @__PURE__ */ jsxs(Badge, { size: badgeSize, children: [
246
+ item.name,
247
+ /* @__PURE__ */ jsx(
248
+ Button,
249
+ {
250
+ onClick: () => {
251
+ onDelete(item.id);
252
+ },
253
+ variant: "transparent",
254
+ children: /* @__PURE__ */ jsx(Cross1Icon, {})
255
+ }
256
+ )
257
+ ] }, item.id);
258
+ }),
259
+ placeholderVisible ? /* @__PURE__ */ jsx(Typo, { color: "gray", variant: placeholderVariant, children: placeholder }) : null,
260
+ /* @__PURE__ */ jsx(
261
+ AutoSizingInput,
262
+ {
263
+ onBlur,
264
+ onChange: onChangeValue,
265
+ onFocus,
266
+ onKeyDown: handleKeyDown,
267
+ ref: fieldRef,
268
+ value
269
+ }
270
+ )
271
+ ]
272
+ }
273
+ ),
274
+ focus ? /* @__PURE__ */ jsx(MagnifyingGlassIcon, {}) : /* @__PURE__ */ jsx(ChevronRightIcon, {})
275
+ ]
276
+ }
277
+ ) }),
278
+ /* @__PURE__ */ jsx(
279
+ Popover.Content,
280
+ {
281
+ onOpenAutoFocus: (e) => {
282
+ e.preventDefault();
283
+ },
284
+ children: /* @__PURE__ */ jsx(
285
+ DropdownContainer,
286
+ {
287
+ currentItem: filteredOptions[focusIndex || 0],
288
+ items: filteredOptions,
289
+ children: /* @__PURE__ */ jsx(
290
+ ScrollArea,
291
+ {
292
+ ref: scrollRef,
293
+ scrollbars: "vertical",
294
+ style: { height: OPTION_HEIGHT * 8 },
295
+ type: "auto",
296
+ children: /* @__PURE__ */ jsx(Flex, { direction: "column", children: filteredOptions.map((item, i) => {
297
+ const isSelected = Boolean(
298
+ selected.find((el) => el === item.id)
299
+ );
300
+ const isFocus = i === focusIndex;
301
+ return /* @__PURE__ */ jsx(
302
+ Button,
303
+ {
304
+ onClick: () => {
305
+ var _a;
306
+ toggleItem(item.id);
307
+ (_a = fieldRef.current) == null ? void 0 : _a.focus();
308
+ },
309
+ onMouseEnter: () => {
310
+ setFocusIndex(i);
311
+ },
312
+ style: {
313
+ width: "100%",
314
+ background: isFocus ? "var(--accent-a3)" : void 0,
315
+ color: "var(--gray-12)",
316
+ fontWeight: 400,
317
+ boxShadow: "none"
318
+ },
319
+ variant: isSelected ? "soft" : "outline",
320
+ children: /* @__PURE__ */ jsxs(Flex, { justify: "between", width: "100%", children: [
321
+ item.name,
322
+ isSelected ? /* @__PURE__ */ jsx(CheckIcon, {}) : null
323
+ ] })
324
+ },
325
+ item.id
326
+ );
327
+ }) })
328
+ }
329
+ )
330
+ }
331
+ )
332
+ }
333
+ )
334
+ ] });
335
+ }
336
+
337
+ export {
338
+ TagSelector
339
+ };
340
+ //# sourceMappingURL=chunk-FYUX53KS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/molecules/tag-selector.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport {\n ChevronRightIcon,\n Cross1Icon,\n MagnifyingGlassIcon,\n} from '@radix-ui/react-icons';\nimport { Popover } from '../atoms/popover';\nimport { Flex } from '../atoms/flex';\nimport { Button } from '../atoms/button';\nimport type { BadgeProps } from '../atoms/badge';\nimport { Badge } from '../atoms/badge';\nimport { CheckIcon } from '../icon';\nimport { ScrollArea } from '../atoms/scroll-area';\nimport { Grid } from '../atoms/grid';\nimport type { TypoProps } from '../atoms';\nimport { AutoSizingInput, Typo } from '../atoms';\n\ntype ID = string;\ninterface Item {\n name: string;\n id: ID;\n}\n\nconst OPTION_HEIGHT = 32;\n\nexport interface TagSelectorProps<T extends Item> {\n options?: T[];\n selected?: ID[];\n placeholder?: string;\n disabled?: boolean;\n maxCount?: number;\n style?: React.CSSProperties;\n size?: 'large' | 'medium' | 'small';\n\n onChange?: (selected: ID[]) => void;\n tagRender?: (item: T) => React.ReactElement;\n DropdownContainer?: DropdownContainer<T>;\n}\ntype DropdownContainer<T> = (props: {\n items: T[];\n children: React.ReactElement;\n currentItem?: T;\n}) => React.ReactElement;\n\nconst DefaultDropdownContainer = (props: {\n children: React.ReactElement;\n}): React.ReactElement => {\n return props.children;\n};\n\nexport function TagSelector<T extends Item>(\n props: TagSelectorProps<T>\n): React.ReactElement {\n const {\n options = [],\n tagRender,\n placeholder,\n maxCount = 0,\n DropdownContainer = DefaultDropdownContainer,\n onChange,\n size = 'medium',\n } = props;\n const [selected, setSelected] = useState<string[]>(props.selected || []);\n const [value, setValue] = useState<string>('');\n const [focusIndex, setFocusIndex] = useState<number | null>(null);\n const [open, setOpen] = useState(false);\n const [focus, setFocus] = useState(false);\n\n const fieldRef = useRef<HTMLInputElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const closeRef = useRef<number>(0);\n\n const onFocus = useCallback(() => {\n clearTimeout(closeRef.current);\n setFocus(true);\n setOpen(true);\n }, []);\n\n const onBlur = useCallback(() => {\n closeRef.current = setTimeout(() => {\n setFocus(false);\n setOpen(false);\n setTimeout(() => {\n setValue('');\n }, 100);\n }, 300);\n }, []);\n\n const onChangeValue = useCallback<React.ChangeEventHandler<HTMLInputElement>>(\n (e) => {\n setValue(e.target.value);\n },\n []\n );\n\n const filteredOptions = useMemo<T[]>(() => {\n return options.filter((option) => {\n return option.name.includes(value);\n });\n }, [options, value]);\n\n const selectedItem = useMemo<T[]>(() => {\n const result = [] as T[];\n selected.forEach((id) => {\n const maybeItem = options.find((option) => option.id === id);\n if (maybeItem) result.push(maybeItem);\n });\n return result;\n }, [options, selected]);\n\n const onDelete = useCallback((id: string) => {\n setSelected((prev) => prev.filter((el) => el !== id));\n }, []);\n\n const onSelect = useCallback(\n (id: string) => {\n if (maxCount && selected.length + 1 > maxCount) return;\n setSelected((prev) => [...prev, id]);\n },\n [maxCount, selected]\n );\n\n const toggleItem = useCallback(\n (id: string) => {\n if (selected.includes(id)) {\n onDelete(id);\n } else {\n onSelect(id);\n }\n },\n [onDelete, onSelect, selected]\n );\n\n const setScroll = useCallback((index: number): void => {\n if (scrollRef.current) {\n const scrollTop = scrollRef.current.scrollTop;\n const clientHeight = scrollRef.current.clientHeight;\n const focusTop = index * OPTION_HEIGHT;\n if (focusTop < scrollTop) {\n scrollRef.current.scrollTop = focusTop;\n } else if (focusTop + OPTION_HEIGHT > scrollTop + clientHeight) {\n scrollRef.current.scrollTop = focusTop + OPTION_HEIGHT - clientHeight;\n }\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n const key = e.key;\n\n switch (key) {\n case 'ArrowDown': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex + 1 >= options.length ? 0 : focusIndex + 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'ArrowUp': {\n e.preventDefault();\n let newFocus = 0;\n if (typeof focusIndex === 'number') {\n newFocus = focusIndex - 1 < 0 ? options.length - 1 : focusIndex - 1;\n }\n setFocusIndex(newFocus);\n setScroll(newFocus);\n break;\n }\n\n case 'Enter':\n setValue('');\n if (focusIndex !== null) {\n toggleItem(filteredOptions[focusIndex]?.id);\n }\n break;\n\n case 'Backspace':\n if (value.length === 0) {\n setSelected((prev) => prev.slice(0, -1));\n }\n break;\n\n case 'Escape':\n setOpen(false);\n break;\n }\n },\n [\n focusIndex,\n value.length,\n setScroll,\n options.length,\n toggleItem,\n filteredOptions,\n ]\n );\n\n const placeholderVisible = useMemo(() => {\n if (selectedItem.length) return false;\n if (value) return false;\n if (focus) return false;\n return true;\n }, [focus, selectedItem.length, value]);\n\n useEffect(() => {\n onChange?.(selected);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- 주소값 변경 방지\n }, [[...selected].sort().join(',')]);\n\n useEffect(() => {\n setSelected(props.selected || []);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- 주소값 변경 방지\n }, [[...(props.selected || [])].sort().join(',')]);\n\n useEffect(() => {\n setFocusIndex(null);\n }, [open]);\n\n useEffect(() => {\n setFocusIndex(0);\n }, [filteredOptions]);\n\n const badgeSize = useMemo<BadgeProps['size']>(() => {\n switch (size) {\n case 'large':\n return 'large';\n case 'medium':\n case 'small':\n default:\n return 'small';\n }\n }, [size]);\n\n const placeholderVariant = useMemo<TypoProps['variant']>(() => {\n switch (size) {\n case 'large':\n return 'subtitle';\n case 'medium':\n default:\n return 'body';\n }\n }, [size]);\n\n return (\n <Popover.Root open={Boolean(filteredOptions.length) && open}>\n <Popover.Trigger>\n <Grid\n align=\"center\"\n className={`tag-selector ${focus ? 'focused' : ''} ${size}`}\n columns=\"1fr auto\"\n gap=\"1\"\n onClick={() => fieldRef.current?.focus()}\n >\n <Flex\n align=\"center\"\n gap=\"1\"\n maxWidth=\"100%\"\n overflow=\"hidden\"\n wrap=\"wrap\"\n >\n {selectedItem.map((item) => {\n return tagRender ? (\n tagRender(item)\n ) : (\n <Badge key={item.id} size={badgeSize}>\n {item.name}\n <Button\n onClick={() => {\n onDelete(item.id);\n }}\n variant=\"transparent\"\n >\n <Cross1Icon />\n </Button>\n </Badge>\n );\n })}\n {placeholderVisible ? (\n <Typo color=\"gray\" variant={placeholderVariant}>\n {placeholder}\n </Typo>\n ) : null}\n <AutoSizingInput\n onBlur={onBlur}\n onChange={onChangeValue}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n ref={fieldRef}\n value={value}\n />\n </Flex>\n {focus ? <MagnifyingGlassIcon /> : <ChevronRightIcon />}\n </Grid>\n </Popover.Trigger>\n\n <Popover.Content\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n }}\n >\n <DropdownContainer\n currentItem={filteredOptions[focusIndex || 0]}\n items={filteredOptions}\n >\n <ScrollArea\n ref={scrollRef}\n scrollbars=\"vertical\"\n style={{ height: OPTION_HEIGHT * 8 }}\n type=\"auto\"\n >\n <Flex direction=\"column\">\n {filteredOptions.map((item, i) => {\n const isSelected = Boolean(\n selected.find((el) => el === item.id)\n );\n const isFocus = i === focusIndex;\n\n return (\n <Button\n key={item.id}\n onClick={() => {\n toggleItem(item.id);\n fieldRef.current?.focus();\n }}\n onMouseEnter={() => {\n setFocusIndex(i);\n }}\n style={{\n width: '100%',\n background: isFocus ? 'var(--accent-a3)' : undefined,\n color: 'var(--gray-12)',\n fontWeight: 400,\n boxShadow: 'none',\n }}\n variant={isSelected ? 'soft' : 'outline'}\n >\n <Flex justify=\"between\" width=\"100%\">\n {item.name}\n {isSelected ? <CheckIcon /> : null}\n </Flex>\n </Button>\n );\n })}\n </Flex>\n </ScrollArea>\n </DropdownContainer>\n </Popover.Content>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}