@tipp/ui 1.2.1 → 1.2.3

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 (78) hide show
  1. package/dist/atoms/field-error-wrapper.js +2 -2
  2. package/dist/atoms/index.js +52 -52
  3. package/dist/atoms/pagination.js +2 -2
  4. package/dist/chunk-5727WFTZ.js +340 -0
  5. package/dist/chunk-5727WFTZ.js.map +1 -0
  6. package/dist/chunk-6UGS5IDT.js +313 -0
  7. package/dist/chunk-6UGS5IDT.js.map +1 -0
  8. package/dist/chunk-AT43BHDX.js +340 -0
  9. package/dist/chunk-AT43BHDX.js.map +1 -0
  10. package/dist/chunk-B4OBVVY3.js +338 -0
  11. package/dist/chunk-B4OBVVY3.js.map +1 -0
  12. package/dist/chunk-BSXB4GUN.js +313 -0
  13. package/dist/chunk-BSXB4GUN.js.map +1 -0
  14. package/dist/chunk-BVA3AK5G.js +320 -0
  15. package/dist/chunk-BVA3AK5G.js.map +1 -0
  16. package/dist/chunk-DDCFN3P4.js +169 -0
  17. package/dist/chunk-DDCFN3P4.js.map +1 -0
  18. package/dist/chunk-E6PYYPLJ.js +340 -0
  19. package/dist/chunk-E6PYYPLJ.js.map +1 -0
  20. package/dist/chunk-EJGR7XIP.js +340 -0
  21. package/dist/chunk-EJGR7XIP.js.map +1 -0
  22. package/dist/chunk-FUFW4U2M.js +123 -0
  23. package/dist/chunk-FUFW4U2M.js.map +1 -0
  24. package/dist/chunk-GN35VNXA.js +340 -0
  25. package/dist/chunk-GN35VNXA.js.map +1 -0
  26. package/dist/chunk-GQ356XUU.js +340 -0
  27. package/dist/chunk-GQ356XUU.js.map +1 -0
  28. package/dist/chunk-KDEE2GKD.js +321 -0
  29. package/dist/chunk-KDEE2GKD.js.map +1 -0
  30. package/dist/chunk-N7LPOMB6.js +169 -0
  31. package/dist/chunk-N7LPOMB6.js.map +1 -0
  32. package/dist/chunk-OGNXJEFF.js +340 -0
  33. package/dist/chunk-OGNXJEFF.js.map +1 -0
  34. package/dist/chunk-OMWKQSGG.js +301 -0
  35. package/dist/chunk-OMWKQSGG.js.map +1 -0
  36. package/dist/chunk-SGV677GX.js +313 -0
  37. package/dist/chunk-SGV677GX.js.map +1 -0
  38. package/dist/chunk-U6ZJC6YG.js +320 -0
  39. package/dist/chunk-U6ZJC6YG.js.map +1 -0
  40. package/dist/chunk-UXHC4TWB.js +169 -0
  41. package/dist/chunk-UXHC4TWB.js.map +1 -0
  42. package/dist/chunk-VA4SUB72.js +340 -0
  43. package/dist/chunk-VA4SUB72.js.map +1 -0
  44. package/dist/chunk-VLENFHWP.js +304 -0
  45. package/dist/chunk-VLENFHWP.js.map +1 -0
  46. package/dist/chunk-WL2KNN6Q.js +320 -0
  47. package/dist/chunk-WL2KNN6Q.js.map +1 -0
  48. package/dist/chunk-XFPHKGAU.js +340 -0
  49. package/dist/chunk-XFPHKGAU.js.map +1 -0
  50. package/dist/chunk-XLJ4PRKX.js +317 -0
  51. package/dist/chunk-XLJ4PRKX.js.map +1 -0
  52. package/dist/chunk-YDXUNJVV.js +320 -0
  53. package/dist/chunk-YDXUNJVV.js.map +1 -0
  54. package/dist/chunk-ZPTZUP5Q.js +304 -0
  55. package/dist/chunk-ZPTZUP5Q.js.map +1 -0
  56. package/dist/index.cjs +41 -5
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.css +8 -3
  59. package/dist/index.css.map +1 -1
  60. package/dist/index.js +68 -68
  61. package/dist/molecules/expand-table/index.js +23 -23
  62. package/dist/molecules/expand-table/row.js +22 -22
  63. package/dist/molecules/index.cjs +41 -5
  64. package/dist/molecules/index.cjs.map +1 -1
  65. package/dist/molecules/index.js +29 -29
  66. package/dist/molecules/navigation.js +23 -23
  67. package/dist/molecules/stepper.cjs.map +1 -1
  68. package/dist/molecules/stepper.d.cts +1 -1
  69. package/dist/molecules/stepper.d.ts +1 -1
  70. package/dist/molecules/stepper.js +3 -3
  71. package/dist/molecules/tag-selector.cjs +114 -53
  72. package/dist/molecules/tag-selector.cjs.map +1 -1
  73. package/dist/molecules/tag-selector.d.cts +1 -0
  74. package/dist/molecules/tag-selector.d.ts +1 -0
  75. package/dist/molecules/tag-selector.js +23 -23
  76. package/package.json +1 -1
  77. package/src/molecules/stepper.tsx +1 -1
  78. package/src/molecules/tag-selector.tsx +52 -5
@@ -13,11 +13,13 @@ import {
13
13
  import { Popover } from '../atoms/popover';
14
14
  import { Flex } from '../atoms/flex';
15
15
  import { Button } from '../atoms/button';
16
+ import type { BadgeProps } from '../atoms/badge';
16
17
  import { Badge } from '../atoms/badge';
17
18
  import { CheckIcon } from '../icon';
18
19
  import { ScrollArea } from '../atoms/scroll-area';
19
20
  import { Grid } from '../atoms/grid';
20
- import { AutoSizingInput } from '../atoms';
21
+ import type { TypoProps } from '../atoms';
22
+ import { AutoSizingInput, Typo } from '../atoms';
21
23
 
22
24
  type ID = string;
23
25
  interface Item {
@@ -34,6 +36,7 @@ export interface TagSelectorProps<T extends Item> {
34
36
  disabled?: boolean;
35
37
  maxCount?: number;
36
38
  style?: React.CSSProperties;
39
+ size?: 'large' | 'medium' | 'small';
37
40
 
38
41
  onChange?: (selected: ID[]) => void;
39
42
  tagRender?: (item: T) => React.ReactElement;
@@ -60,6 +63,8 @@ export function TagSelector<T extends Item>(
60
63
  placeholder,
61
64
  maxCount = 0,
62
65
  DropdownContainer = DefaultDropdownContainer,
66
+ onChange,
67
+ size = 'medium',
63
68
  } = props;
64
69
  const [selected, setSelected] = useState<string[]>(props.selected || []);
65
70
  const [value, setValue] = useState<string>('');
@@ -85,7 +90,7 @@ export function TagSelector<T extends Item>(
85
90
  setTimeout(() => {
86
91
  setValue('');
87
92
  }, 100);
88
- }, 100);
93
+ }, 300);
89
94
  }, []);
90
95
 
91
96
  const onChangeValue = useCallback<React.ChangeEventHandler<HTMLInputElement>>(
@@ -201,6 +206,23 @@ export function TagSelector<T extends Item>(
201
206
  ]
202
207
  );
203
208
 
209
+ const placeholderVisible = useMemo(() => {
210
+ if (selectedItem.length) return false;
211
+ if (value) return false;
212
+ if (focus) return false;
213
+ return true;
214
+ }, [focus, selectedItem.length, value]);
215
+
216
+ useEffect(() => {
217
+ onChange?.(selected);
218
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- 주소값 변경 방지
219
+ }, [[...selected].sort().join(',')]);
220
+
221
+ useEffect(() => {
222
+ setSelected(props.selected || []);
223
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- 주소값 변경 방지
224
+ }, [[...(props.selected || [])].sort().join(',')]);
225
+
204
226
  useEffect(() => {
205
227
  setFocusIndex(null);
206
228
  }, [open]);
@@ -209,12 +231,33 @@ export function TagSelector<T extends Item>(
209
231
  setFocusIndex(0);
210
232
  }, [filteredOptions]);
211
233
 
234
+ const badgeSize = useMemo<BadgeProps['size']>(() => {
235
+ switch (size) {
236
+ case 'large':
237
+ return 'large';
238
+ case 'medium':
239
+ case 'small':
240
+ default:
241
+ return 'small';
242
+ }
243
+ }, [size]);
244
+
245
+ const placeholderVariant = useMemo<TypoProps['variant']>(() => {
246
+ switch (size) {
247
+ case 'large':
248
+ return 'subtitle';
249
+ case 'medium':
250
+ default:
251
+ return 'body';
252
+ }
253
+ }, [size]);
254
+
212
255
  return (
213
256
  <Popover.Root open={Boolean(filteredOptions.length) && open}>
214
257
  <Popover.Trigger>
215
258
  <Grid
216
259
  align="center"
217
- className={`tag-selector ${focus ? 'focused' : ''}`}
260
+ className={`tag-selector ${focus ? 'focused' : ''} ${size}`}
218
261
  columns="1fr auto"
219
262
  gap="1"
220
263
  onClick={() => fieldRef.current?.focus()}
@@ -230,7 +273,7 @@ export function TagSelector<T extends Item>(
230
273
  return tagRender ? (
231
274
  tagRender(item)
232
275
  ) : (
233
- <Badge key={item.id}>
276
+ <Badge key={item.id} size={badgeSize}>
234
277
  {item.name}
235
278
  <Button
236
279
  onClick={() => {
@@ -243,12 +286,16 @@ export function TagSelector<T extends Item>(
243
286
  </Badge>
244
287
  );
245
288
  })}
289
+ {placeholderVisible ? (
290
+ <Typo color="gray" variant={placeholderVariant}>
291
+ {placeholder}
292
+ </Typo>
293
+ ) : null}
246
294
  <AutoSizingInput
247
295
  onBlur={onBlur}
248
296
  onChange={onChangeValue}
249
297
  onFocus={onFocus}
250
298
  onKeyDown={handleKeyDown}
251
- placeholder={placeholder}
252
299
  ref={fieldRef}
253
300
  value={value}
254
301
  />