@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
@@ -52,7 +52,7 @@ __export(tag_selector_exports, {
52
52
  TagSelector: () => TagSelector
53
53
  });
54
54
  module.exports = __toCommonJS(tag_selector_exports);
55
- var import_react4 = require("react");
55
+ var import_react5 = require("react");
56
56
  var import_react_icons2 = require("@radix-ui/react-icons");
57
57
 
58
58
  // src/atoms/popover.tsx
@@ -156,41 +156,66 @@ var import_themes5 = require("@radix-ui/themes");
156
156
  // src/atoms/grid.tsx
157
157
  var import_themes6 = require("@radix-ui/themes");
158
158
 
159
- // src/atoms/auto-sizing-input.tsx
159
+ // src/atoms/typo.tsx
160
+ var import_themes7 = require("@radix-ui/themes");
160
161
  var import_react3 = require("react");
161
162
  var import_jsx_runtime3 = require("react/jsx-runtime");
162
- var AutoSizingInput = (0, import_react3.forwardRef)(
163
+ var Typo = (0, import_react3.forwardRef)(
164
+ (props, ref) => {
165
+ const _a = props, { size, variant, children } = _a, rest = __objRest(_a, ["size", "variant", "children"]);
166
+ const radixSize = (0, import_react3.useMemo)(() => {
167
+ if (size !== void 0)
168
+ return size;
169
+ switch (variant) {
170
+ case "caption":
171
+ return "1";
172
+ case "subtitle":
173
+ return "3";
174
+ case "body":
175
+ default:
176
+ return "2";
177
+ }
178
+ }, [size, variant]);
179
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_themes7.Text, __spreadProps(__spreadValues({}, rest), { ref, size: radixSize, children }));
180
+ }
181
+ );
182
+ Typo.displayName = "Typo";
183
+
184
+ // src/atoms/auto-sizing-input.tsx
185
+ var import_react4 = require("react");
186
+ var import_jsx_runtime4 = require("react/jsx-runtime");
187
+ var AutoSizingInput = (0, import_react4.forwardRef)(
163
188
  (_a, ref) => {
164
189
  var _b = _a, { value: _value, onChangeValue, onChange } = _b, rest = __objRest(_b, ["value", "onChangeValue", "onChange"]);
165
- const [value, setValue] = (0, import_react3.useState)(_value);
166
- const [width, setWidth] = (0, import_react3.useState)(0);
167
- const span = (0, import_react3.useRef)(null);
168
- (0, import_react3.useEffect)(() => {
190
+ const [value, setValue] = (0, import_react4.useState)(_value);
191
+ const [width, setWidth] = (0, import_react4.useState)(0);
192
+ const span = (0, import_react4.useRef)(null);
193
+ (0, import_react4.useEffect)(() => {
169
194
  span.current && setWidth(span.current.offsetWidth);
170
195
  }, [value]);
171
- const changeHandler = (0, import_react3.useCallback)(
196
+ const changeHandler = (0, import_react4.useCallback)(
172
197
  (evt) => {
173
198
  onChange == null ? void 0 : onChange(evt);
174
199
  setValue(evt.target.value);
175
200
  },
176
201
  [onChange]
177
202
  );
178
- (0, import_react3.useEffect)(() => {
203
+ (0, import_react4.useEffect)(() => {
179
204
  setValue(_value || "");
180
205
  }, [_value]);
181
- (0, import_react3.useEffect)(() => {
206
+ (0, import_react4.useEffect)(() => {
182
207
  onChangeValue == null ? void 0 : onChangeValue(value || "");
183
208
  }, [value, onChangeValue]);
184
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "auto-sizing-input wrapper", style: { width: width + 24 }, children: [
185
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("input", __spreadValues({ onChange: changeHandler, ref, value }, rest)),
186
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { "aria-hidden": "true", ref: span, children: value })
209
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: "auto-sizing-input wrapper", style: { width: width + 24 }, children: [
210
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("input", __spreadValues({ onChange: changeHandler, ref, value }, rest)),
211
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("span", { "aria-hidden": "true", ref: span, children: value })
187
212
  ] });
188
213
  }
189
214
  );
190
215
  AutoSizingInput.displayName = "AutoSizingInput";
191
216
 
192
217
  // src/molecules/tag-selector.tsx
193
- var import_jsx_runtime4 = require("react/jsx-runtime");
218
+ var import_jsx_runtime5 = require("react/jsx-runtime");
194
219
  var OPTION_HEIGHT = 32;
195
220
  var DefaultDropdownContainer = (props) => {
196
221
  return props.children;
@@ -201,42 +226,44 @@ function TagSelector(props) {
201
226
  tagRender,
202
227
  placeholder,
203
228
  maxCount = 0,
204
- DropdownContainer = DefaultDropdownContainer
229
+ DropdownContainer = DefaultDropdownContainer,
230
+ onChange,
231
+ size = "medium"
205
232
  } = props;
206
- const [selected, setSelected] = (0, import_react4.useState)(props.selected || []);
207
- const [value, setValue] = (0, import_react4.useState)("");
208
- const [focusIndex, setFocusIndex] = (0, import_react4.useState)(null);
209
- const [open, setOpen] = (0, import_react4.useState)(false);
210
- const [focus, setFocus] = (0, import_react4.useState)(false);
211
- const fieldRef = (0, import_react4.useRef)(null);
212
- const scrollRef = (0, import_react4.useRef)(null);
213
- const closeRef = (0, import_react4.useRef)(0);
214
- const onFocus = (0, import_react4.useCallback)(() => {
233
+ const [selected, setSelected] = (0, import_react5.useState)(props.selected || []);
234
+ const [value, setValue] = (0, import_react5.useState)("");
235
+ const [focusIndex, setFocusIndex] = (0, import_react5.useState)(null);
236
+ const [open, setOpen] = (0, import_react5.useState)(false);
237
+ const [focus, setFocus] = (0, import_react5.useState)(false);
238
+ const fieldRef = (0, import_react5.useRef)(null);
239
+ const scrollRef = (0, import_react5.useRef)(null);
240
+ const closeRef = (0, import_react5.useRef)(0);
241
+ const onFocus = (0, import_react5.useCallback)(() => {
215
242
  clearTimeout(closeRef.current);
216
243
  setFocus(true);
217
244
  setOpen(true);
218
245
  }, []);
219
- const onBlur = (0, import_react4.useCallback)(() => {
246
+ const onBlur = (0, import_react5.useCallback)(() => {
220
247
  closeRef.current = setTimeout(() => {
221
248
  setFocus(false);
222
249
  setOpen(false);
223
250
  setTimeout(() => {
224
251
  setValue("");
225
252
  }, 100);
226
- }, 100);
253
+ }, 300);
227
254
  }, []);
228
- const onChangeValue = (0, import_react4.useCallback)(
255
+ const onChangeValue = (0, import_react5.useCallback)(
229
256
  (e) => {
230
257
  setValue(e.target.value);
231
258
  },
232
259
  []
233
260
  );
234
- const filteredOptions = (0, import_react4.useMemo)(() => {
261
+ const filteredOptions = (0, import_react5.useMemo)(() => {
235
262
  return options.filter((option) => {
236
263
  return option.name.includes(value);
237
264
  });
238
265
  }, [options, value]);
239
- const selectedItem = (0, import_react4.useMemo)(() => {
266
+ const selectedItem = (0, import_react5.useMemo)(() => {
240
267
  const result = [];
241
268
  selected.forEach((id) => {
242
269
  const maybeItem = options.find((option) => option.id === id);
@@ -245,10 +272,10 @@ function TagSelector(props) {
245
272
  });
246
273
  return result;
247
274
  }, [options, selected]);
248
- const onDelete = (0, import_react4.useCallback)((id) => {
275
+ const onDelete = (0, import_react5.useCallback)((id) => {
249
276
  setSelected((prev) => prev.filter((el) => el !== id));
250
277
  }, []);
251
- const onSelect = (0, import_react4.useCallback)(
278
+ const onSelect = (0, import_react5.useCallback)(
252
279
  (id) => {
253
280
  if (maxCount && selected.length + 1 > maxCount)
254
281
  return;
@@ -256,7 +283,7 @@ function TagSelector(props) {
256
283
  },
257
284
  [maxCount, selected]
258
285
  );
259
- const toggleItem = (0, import_react4.useCallback)(
286
+ const toggleItem = (0, import_react5.useCallback)(
260
287
  (id) => {
261
288
  if (selected.includes(id)) {
262
289
  onDelete(id);
@@ -266,7 +293,7 @@ function TagSelector(props) {
266
293
  },
267
294
  [onDelete, onSelect, selected]
268
295
  );
269
- const setScroll = (0, import_react4.useCallback)((index) => {
296
+ const setScroll = (0, import_react5.useCallback)((index) => {
270
297
  if (scrollRef.current) {
271
298
  const scrollTop = scrollRef.current.scrollTop;
272
299
  const clientHeight = scrollRef.current.clientHeight;
@@ -278,7 +305,7 @@ function TagSelector(props) {
278
305
  }
279
306
  }
280
307
  }, []);
281
- const handleKeyDown = (0, import_react4.useCallback)(
308
+ const handleKeyDown = (0, import_react5.useCallback)(
282
309
  (e) => {
283
310
  var _a;
284
311
  const key = e.key;
@@ -328,18 +355,52 @@ function TagSelector(props) {
328
355
  filteredOptions
329
356
  ]
330
357
  );
331
- (0, import_react4.useEffect)(() => {
358
+ const placeholderVisible = (0, import_react5.useMemo)(() => {
359
+ if (selectedItem.length)
360
+ return false;
361
+ if (value)
362
+ return false;
363
+ if (focus)
364
+ return false;
365
+ return true;
366
+ }, [focus, selectedItem.length, value]);
367
+ (0, import_react5.useEffect)(() => {
368
+ onChange == null ? void 0 : onChange(selected);
369
+ }, [[...selected].sort().join(",")]);
370
+ (0, import_react5.useEffect)(() => {
371
+ setSelected(props.selected || []);
372
+ }, [[...props.selected || []].sort().join(",")]);
373
+ (0, import_react5.useEffect)(() => {
332
374
  setFocusIndex(null);
333
375
  }, [open]);
334
- (0, import_react4.useEffect)(() => {
376
+ (0, import_react5.useEffect)(() => {
335
377
  setFocusIndex(0);
336
378
  }, [filteredOptions]);
337
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_themes.Popover.Root, { open: Boolean(filteredOptions.length) && open, children: [
338
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_themes.Popover.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
379
+ const badgeSize = (0, import_react5.useMemo)(() => {
380
+ switch (size) {
381
+ case "large":
382
+ return "large";
383
+ case "medium":
384
+ case "small":
385
+ default:
386
+ return "small";
387
+ }
388
+ }, [size]);
389
+ const placeholderVariant = (0, import_react5.useMemo)(() => {
390
+ switch (size) {
391
+ case "large":
392
+ return "subtitle";
393
+ case "medium":
394
+ default:
395
+ return "body";
396
+ }
397
+ }, [size]);
398
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_themes.Popover.Root, { open: Boolean(filteredOptions.length) && open, children: [
399
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_themes.Popover.Trigger, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
339
400
  import_themes6.Grid,
340
401
  {
341
402
  align: "center",
342
- className: `tag-selector ${focus ? "focused" : ""}`,
403
+ className: `tag-selector ${focus ? "focused" : ""} ${size}`,
343
404
  columns: "1fr auto",
344
405
  gap: "1",
345
406
  onClick: () => {
@@ -347,7 +408,7 @@ function TagSelector(props) {
347
408
  return (_a = fieldRef.current) == null ? void 0 : _a.focus();
348
409
  },
349
410
  children: [
350
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(
411
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
351
412
  import_themes2.Flex,
352
413
  {
353
414
  align: "center",
@@ -357,28 +418,28 @@ function TagSelector(props) {
357
418
  wrap: "wrap",
358
419
  children: [
359
420
  selectedItem.map((item) => {
360
- return tagRender ? tagRender(item) : /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(Badge, { children: [
421
+ return tagRender ? tagRender(item) : /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(Badge, { size: badgeSize, children: [
361
422
  item.name,
362
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
423
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
363
424
  Button,
364
425
  {
365
426
  onClick: () => {
366
427
  onDelete(item.id);
367
428
  },
368
429
  variant: "transparent",
369
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_icons2.Cross1Icon, {})
430
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_icons2.Cross1Icon, {})
370
431
  }
371
432
  )
372
433
  ] }, item.id);
373
434
  }),
374
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
435
+ placeholderVisible ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Typo, { color: "gray", variant: placeholderVariant, children: placeholder }) : null,
436
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
375
437
  AutoSizingInput,
376
438
  {
377
439
  onBlur,
378
440
  onChange: onChangeValue,
379
441
  onFocus,
380
442
  onKeyDown: handleKeyDown,
381
- placeholder,
382
443
  ref: fieldRef,
383
444
  value
384
445
  }
@@ -386,34 +447,34 @@ function TagSelector(props) {
386
447
  ]
387
448
  }
388
449
  ),
389
- focus ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_icons2.MagnifyingGlassIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_icons2.ChevronRightIcon, {})
450
+ focus ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_icons2.MagnifyingGlassIcon, {}) : /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_icons2.ChevronRightIcon, {})
390
451
  ]
391
452
  }
392
453
  ) }),
393
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
454
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
394
455
  import_themes.Popover.Content,
395
456
  {
396
457
  onOpenAutoFocus: (e) => {
397
458
  e.preventDefault();
398
459
  },
399
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
460
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
400
461
  DropdownContainer,
401
462
  {
402
463
  currentItem: filteredOptions[focusIndex || 0],
403
464
  items: filteredOptions,
404
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
465
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
405
466
  import_themes5.ScrollArea,
406
467
  {
407
468
  ref: scrollRef,
408
469
  scrollbars: "vertical",
409
470
  style: { height: OPTION_HEIGHT * 8 },
410
471
  type: "auto",
411
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_themes2.Flex, { direction: "column", children: filteredOptions.map((item, i) => {
472
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_themes2.Flex, { direction: "column", children: filteredOptions.map((item, i) => {
412
473
  const isSelected = Boolean(
413
474
  selected.find((el) => el === item.id)
414
475
  );
415
476
  const isFocus = i === focusIndex;
416
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
477
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
417
478
  Button,
418
479
  {
419
480
  onClick: () => {
@@ -432,9 +493,9 @@ function TagSelector(props) {
432
493
  boxShadow: "none"
433
494
  },
434
495
  variant: isSelected ? "soft" : "outline",
435
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_themes2.Flex, { justify: "between", width: "100%", children: [
496
+ children: /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_themes2.Flex, { justify: "between", width: "100%", children: [
436
497
  item.name,
437
- isSelected ? /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_icons.CheckIcon, {}) : null
498
+ isSelected ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_icons.CheckIcon, {}) : null
438
499
  ] })
439
500
  },
440
501
  item.id
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/molecules/tag-selector.tsx","../../src/atoms/popover.tsx","../../src/atoms/flex.tsx","../../src/atoms/button.tsx","../../src/atoms/badge.tsx","../../src/icon.ts","../../src/atoms/scroll-area.tsx","../../src/atoms/grid.tsx","../../src/atoms/auto-sizing-input.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 { Badge } from '../atoms/badge';\nimport { CheckIcon } from '../icon';\nimport { ScrollArea } from '../atoms/scroll-area';\nimport { Grid } from '../atoms/grid';\nimport { AutoSizingInput } 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\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 } = 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 }, 100);\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 useEffect(() => {\n setFocusIndex(null);\n }, [open]);\n\n useEffect(() => {\n setFocusIndex(0);\n }, [filteredOptions]);\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' : ''}`}\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}>\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 <AutoSizingInput\n onBlur={onBlur}\n onChange={onChangeValue}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\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","export { Popover } from '@radix-ui/themes';\n","export { Flex, type FlexProps } from '@radix-ui/themes';\n","import {\n Button as RadixButton,\n type ButtonProps as RadixButtonProps,\n} from '@radix-ui/themes';\nimport React, { forwardRef, useMemo } from 'react';\n\nexport type ButtonProps = Omit<RadixButtonProps, 'size' | 'variant'> & {\n size?: 'small' | 'medium' | 'large' | 'largest';\n variant?: RadixButtonProps['variant'] | 'transparent';\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (props, ref): React.ReactElement => {\n const { size, style, variant, ...restProps } = props;\n\n const radixSize = useMemo(() => {\n switch (size) {\n case 'small':\n return '1';\n case 'medium':\n return '2';\n case 'large':\n case 'largest':\n return '3';\n default:\n return '2';\n }\n }, [size]);\n\n const mergedStyle = useMemo<ButtonProps['style']>(() => {\n const baseStyle = {\n background: variant === 'transparent' ? 'transparent' : undefined,\n };\n if (size === 'largest')\n return {\n ...baseStyle,\n borderRadius: 'var(--radius-4)',\n padding: 'var(--space-5)',\n fontSize: 'var(--font-size-4)',\n ...style,\n };\n return { ...baseStyle, ...style };\n }, [size, style, variant]);\n\n const radixVariant = useMemo(() => {\n if (variant === 'transparent') return 'ghost';\n return variant;\n }, [variant]);\n\n return (\n <RadixButton\n style={mergedStyle}\n variant={radixVariant}\n {...restProps}\n ref={ref}\n size={radixSize}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n","import {\n Badge as RadixBadge,\n type BadgeProps as RadixBadgeProps,\n} from '@radix-ui/themes';\nimport { useMemo, forwardRef } from 'react';\n\nexport type BadgeProps = Omit<RadixBadgeProps, 'color' | 'size'> & {\n size?: 'small' | 'large';\n color?: 'error' | 'accent' | 'neutral' | 'success';\n};\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (props: BadgeProps, ref): React.ReactElement => {\n const { size = 'small', color = 'accent', ...rest } = props;\n\n const radixSize = useMemo(() => {\n switch (size) {\n case 'small':\n return '1';\n case 'large':\n return '3';\n default:\n return '1';\n }\n }, [size]);\n\n const radixColor = useMemo(() => {\n switch (color) {\n case 'error':\n return 'red';\n case 'neutral':\n return 'gray';\n case 'success':\n return 'green';\n case 'accent':\n default:\n return undefined;\n }\n }, [color]);\n\n return (\n <RadixBadge {...rest} color={radixColor} ref={ref} size={radixSize} />\n );\n }\n);\n\nBadge.displayName = 'Badge';\n","export {\n BookmarkIcon,\n ExitIcon,\n InfoCircledIcon,\n ExclamationTriangleIcon,\n MagnifyingGlassIcon,\n DotsHorizontalIcon,\n ChatBubbleIcon,\n PlusIcon,\n BookmarkFilledIcon,\n MixerHorizontalIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ClipboardIcon,\n BarChartIcon,\n PersonIcon,\n GearIcon,\n DotsVerticalIcon,\n Pencil1Icon,\n Cross1Icon,\n Link2Icon,\n ChevronUpIcon,\n ChevronDownIcon,\n FileIcon,\n TrashIcon,\n DoubleArrowLeftIcon,\n DoubleArrowRightIcon,\n GlobeIcon,\n BackpackIcon,\n CalendarIcon,\n CheckIcon,\n ArchiveIcon,\n} from '@radix-ui/react-icons';\n","export { ScrollArea, type ScrollAreaProps } from '@radix-ui/themes';\n","export { Grid, type GridProps } from '@radix-ui/themes';\n","import type { DetailedHTMLProps } from 'react';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nexport interface AutoSizingInputProps\n extends DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n > {\n value?: string;\n onChangeValue?: (value: string) => void;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\nexport const AutoSizingInput = forwardRef<\n HTMLInputElement,\n AutoSizingInputProps\n>(\n (\n { value: _value, onChangeValue, onChange, ...rest },\n ref\n ): React.ReactNode => {\n const [value, setValue] = useState(_value);\n const [width, setWidth] = useState(0);\n const span = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n span.current && setWidth(span.current.offsetWidth);\n }, [value]);\n\n const changeHandler = useCallback<\n React.ChangeEventHandler<HTMLInputElement>\n >(\n (evt) => {\n onChange?.(evt);\n setValue(evt.target.value);\n },\n [onChange]\n );\n\n useEffect(() => {\n setValue(_value || '');\n }, [_value]);\n\n useEffect(() => {\n onChangeValue?.(value || '');\n }, [value, onChangeValue]);\n\n return (\n <div className=\"auto-sizing-input wrapper\" style={{ width: width + 24 }}>\n <input onChange={changeHandler} ref={ref} value={value} {...rest} />\n <span aria-hidden=\"true\" ref={span}>\n {value}\n </span>\n </div>\n );\n }\n);\n\nAutoSizingInput.displayName = 'AutoSizingInput';\n"],"mappings":"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","names":["import_react","import_react_icons","import_themes","import_themes","RadixButton","import_themes","import_react","import_jsx_runtime","RadixBadge","import_themes","import_themes","import_react","import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/molecules/tag-selector.tsx","../../src/atoms/popover.tsx","../../src/atoms/flex.tsx","../../src/atoms/button.tsx","../../src/atoms/badge.tsx","../../src/icon.ts","../../src/atoms/scroll-area.tsx","../../src/atoms/grid.tsx","../../src/atoms/typo.tsx","../../src/atoms/auto-sizing-input.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","export { Popover } from '@radix-ui/themes';\n","export { Flex, type FlexProps } from '@radix-ui/themes';\n","import {\n Button as RadixButton,\n type ButtonProps as RadixButtonProps,\n} from '@radix-ui/themes';\nimport React, { forwardRef, useMemo } from 'react';\n\nexport type ButtonProps = Omit<RadixButtonProps, 'size' | 'variant'> & {\n size?: 'small' | 'medium' | 'large' | 'largest';\n variant?: RadixButtonProps['variant'] | 'transparent';\n};\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (props, ref): React.ReactElement => {\n const { size, style, variant, ...restProps } = props;\n\n const radixSize = useMemo(() => {\n switch (size) {\n case 'small':\n return '1';\n case 'medium':\n return '2';\n case 'large':\n case 'largest':\n return '3';\n default:\n return '2';\n }\n }, [size]);\n\n const mergedStyle = useMemo<ButtonProps['style']>(() => {\n const baseStyle = {\n background: variant === 'transparent' ? 'transparent' : undefined,\n };\n if (size === 'largest')\n return {\n ...baseStyle,\n borderRadius: 'var(--radius-4)',\n padding: 'var(--space-5)',\n fontSize: 'var(--font-size-4)',\n ...style,\n };\n return { ...baseStyle, ...style };\n }, [size, style, variant]);\n\n const radixVariant = useMemo(() => {\n if (variant === 'transparent') return 'ghost';\n return variant;\n }, [variant]);\n\n return (\n <RadixButton\n style={mergedStyle}\n variant={radixVariant}\n {...restProps}\n ref={ref}\n size={radixSize}\n />\n );\n }\n);\n\nButton.displayName = 'Button';\n","import {\n Badge as RadixBadge,\n type BadgeProps as RadixBadgeProps,\n} from '@radix-ui/themes';\nimport { useMemo, forwardRef } from 'react';\n\nexport type BadgeProps = Omit<RadixBadgeProps, 'color' | 'size'> & {\n size?: 'small' | 'large';\n color?: 'error' | 'accent' | 'neutral' | 'success';\n};\n\nexport const Badge = forwardRef<HTMLSpanElement, BadgeProps>(\n (props: BadgeProps, ref): React.ReactElement => {\n const { size = 'small', color = 'accent', ...rest } = props;\n\n const radixSize = useMemo(() => {\n switch (size) {\n case 'small':\n return '1';\n case 'large':\n return '3';\n default:\n return '1';\n }\n }, [size]);\n\n const radixColor = useMemo(() => {\n switch (color) {\n case 'error':\n return 'red';\n case 'neutral':\n return 'gray';\n case 'success':\n return 'green';\n case 'accent':\n default:\n return undefined;\n }\n }, [color]);\n\n return (\n <RadixBadge {...rest} color={radixColor} ref={ref} size={radixSize} />\n );\n }\n);\n\nBadge.displayName = 'Badge';\n","export {\n BookmarkIcon,\n ExitIcon,\n InfoCircledIcon,\n ExclamationTriangleIcon,\n MagnifyingGlassIcon,\n DotsHorizontalIcon,\n ChatBubbleIcon,\n PlusIcon,\n BookmarkFilledIcon,\n MixerHorizontalIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ClipboardIcon,\n BarChartIcon,\n PersonIcon,\n GearIcon,\n DotsVerticalIcon,\n Pencil1Icon,\n Cross1Icon,\n Link2Icon,\n ChevronUpIcon,\n ChevronDownIcon,\n FileIcon,\n TrashIcon,\n DoubleArrowLeftIcon,\n DoubleArrowRightIcon,\n GlobeIcon,\n BackpackIcon,\n CalendarIcon,\n CheckIcon,\n ArchiveIcon,\n} from '@radix-ui/react-icons';\n","export { ScrollArea, type ScrollAreaProps } from '@radix-ui/themes';\n","export { Grid, type GridProps } from '@radix-ui/themes';\n","import type { TextProps as RadixTextProps } from '@radix-ui/themes';\nimport { Text as RadixText } from '@radix-ui/themes';\nimport React, { useMemo, forwardRef } from 'react';\n\nexport type TypoProps = RadixTextProps & {\n variant?: 'body' | 'caption' | 'subtitle';\n};\n\nexport const Typo = forwardRef<HTMLSpanElement, TypoProps>(\n (props: TypoProps, ref): React.ReactElement => {\n const { size, variant, children, ...rest } = props;\n\n const radixSize = useMemo<RadixTextProps['size']>(() => {\n if (size !== undefined) return size;\n switch (variant) {\n case 'caption':\n return '1';\n case 'subtitle':\n return '3';\n case 'body':\n default:\n return '2';\n }\n }, [size, variant]);\n\n return (\n <RadixText {...rest} ref={ref} size={radixSize}>\n {children}\n </RadixText>\n );\n }\n);\n\nTypo.displayName = 'Typo';\n","import type { DetailedHTMLProps } from 'react';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nexport interface AutoSizingInputProps\n extends DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n > {\n value?: string;\n onChangeValue?: (value: string) => void;\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n}\n\nexport const AutoSizingInput = forwardRef<\n HTMLInputElement,\n AutoSizingInputProps\n>(\n (\n { value: _value, onChangeValue, onChange, ...rest },\n ref\n ): React.ReactNode => {\n const [value, setValue] = useState(_value);\n const [width, setWidth] = useState(0);\n const span = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n span.current && setWidth(span.current.offsetWidth);\n }, [value]);\n\n const changeHandler = useCallback<\n React.ChangeEventHandler<HTMLInputElement>\n >(\n (evt) => {\n onChange?.(evt);\n setValue(evt.target.value);\n },\n [onChange]\n );\n\n useEffect(() => {\n setValue(_value || '');\n }, [_value]);\n\n useEffect(() => {\n onChangeValue?.(value || '');\n }, [value, onChangeValue]);\n\n return (\n <div className=\"auto-sizing-input wrapper\" style={{ width: width + 24 }}>\n <input onChange={changeHandler} ref={ref} value={value} {...rest} />\n <span aria-hidden=\"true\" ref={span}>\n {value}\n </span>\n </div>\n );\n }\n);\n\nAutoSizingInput.displayName = 'AutoSizingInput';\n"],"mappings":"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","names":["import_react","import_react_icons","import_themes","import_themes","RadixButton","import_themes","import_react","import_jsx_runtime","RadixBadge","import_themes","import_themes","import_themes","import_react","import_jsx_runtime","RadixText","import_react","import_jsx_runtime","import_jsx_runtime"]}
@@ -12,6 +12,7 @@ interface TagSelectorProps<T extends Item> {
12
12
  disabled?: boolean;
13
13
  maxCount?: number;
14
14
  style?: react__default.CSSProperties;
15
+ size?: 'large' | 'medium' | 'small';
15
16
  onChange?: (selected: ID[]) => void;
16
17
  tagRender?: (item: T) => react__default.ReactElement;
17
18
  DropdownContainer?: DropdownContainer<T>;
@@ -12,6 +12,7 @@ interface TagSelectorProps<T extends Item> {
12
12
  disabled?: boolean;
13
13
  maxCount?: number;
14
14
  style?: react__default.CSSProperties;
15
+ size?: 'large' | 'medium' | 'small';
15
16
  onChange?: (selected: ID[]) => void;
16
17
  tagRender?: (item: T) => react__default.ReactElement;
17
18
  DropdownContainer?: DropdownContainer<T>;
@@ -1,44 +1,36 @@
1
1
  import {
2
2
  TagSelector
3
- } from "../chunk-CGR5CDCB.js";
3
+ } from "../chunk-GN35VNXA.js";
4
4
  import "../chunk-76JGDATZ.js";
5
- import "../chunk-ILRUXI2E.js";
6
- import "../chunk-JPIZP2PZ.js";
7
- import "../chunk-3JRNKBMN.js";
8
- import "../chunk-HYITAA4J.js";
9
- import "../chunk-5H3YPCZK.js";
10
5
  import "../chunk-FR2GDOU2.js";
11
6
  import "../chunk-74DX4CU7.js";
12
7
  import "../chunk-OYM4XCHQ.js";
13
8
  import "../chunk-YJ7ZFOYL.js";
14
9
  import "../chunk-5ZITU5L7.js";
15
- import "../chunk-365QMK4D.js";
16
- import "../chunk-YO3BQW6S.js";
17
- import "../chunk-6IVCARWS.js";
10
+ import "../chunk-ILRUXI2E.js";
11
+ import "../chunk-JPIZP2PZ.js";
18
12
  import "../chunk-6DJOIRMF.js";
19
13
  import "../chunk-FPD73OHW.js";
20
14
  import "../chunk-ZKZDVS7G.js";
21
15
  import "../chunk-MUNMDHRF.js";
22
16
  import "../chunk-TVDKGMBI.js";
23
- import "../chunk-O3T3TM3V.js";
17
+ import "../chunk-3JRNKBMN.js";
18
+ import "../chunk-HYITAA4J.js";
19
+ import "../chunk-5H3YPCZK.js";
24
20
  import "../chunk-XQOL7UBI.js";
25
21
  import "../chunk-TULWX7D6.js";
26
22
  import "../chunk-SIM6HKVI.js";
27
- import "../chunk-ZTEJRYCB.js";
23
+ import "../chunk-CCXV7EK4.js";
28
24
  import "../chunk-5AVBYDPB.js";
29
- import "../chunk-4WFMOFN2.js";
30
- import "../chunk-E3Z3D4EY.js";
31
- import "../chunk-ACVANQJ4.js";
32
- import "../chunk-2DZ2Y3JI.js";
33
- import "../chunk-QDZS4B6A.js";
34
- import "../chunk-52MVZ6AN.js";
25
+ import "../chunk-365QMK4D.js";
26
+ import "../chunk-YO3BQW6S.js";
27
+ import "../chunk-6IVCARWS.js";
28
+ import "../chunk-DJN2IEY6.js";
35
29
  import "../chunk-25HMMI7R.js";
36
30
  import "../chunk-2CVXGGI5.js";
37
31
  import "../chunk-EGEQY3KT.js";
38
32
  import "../chunk-WMZAV6PQ.js";
39
- import "../chunk-IQEEPHOY.js";
40
- import "../chunk-LHCDPZ5E.js";
41
- import "../chunk-OHMOP5PV.js";
33
+ import "../chunk-O3T3TM3V.js";
42
34
  import "../chunk-KGLIAFTI.js";
43
35
  import "../chunk-Q37G2GS6.js";
44
36
  import "../chunk-VTJZMOSP.js";
@@ -47,18 +39,26 @@ import "../chunk-ZZXCFJOT.js";
47
39
  import "../chunk-BVBX6IJ3.js";
48
40
  import "../chunk-NJ2U2TVS.js";
49
41
  import "../chunk-O3DNDMV3.js";
50
- import "../chunk-3SSSCLJ5.js";
51
- import "../chunk-EFMOJ6IL.js";
52
- import "../chunk-YGL6SWKN.js";
42
+ import "../chunk-4WFMOFN2.js";
43
+ import "../chunk-E3Z3D4EY.js";
44
+ import "../chunk-ACVANQJ4.js";
45
+ import "../chunk-52MVZ6AN.js";
46
+ import "../chunk-2DZ2Y3JI.js";
53
47
  import "../chunk-4Y5BEXVN.js";
54
48
  import "../chunk-4B77ZZOP.js";
55
49
  import "../chunk-B6XJN6EC.js";
56
50
  import "../chunk-UVKNLJDZ.js";
57
51
  import "../chunk-MIMJ7LON.js";
52
+ import "../chunk-IQEEPHOY.js";
53
+ import "../chunk-LHCDPZ5E.js";
54
+ import "../chunk-OHMOP5PV.js";
58
55
  import "../chunk-AW44EUZH.js";
59
56
  import "../chunk-J242TTFH.js";
60
57
  import "../chunk-EAXUQEO5.js";
61
58
  import "../chunk-YJCCE5WP.js";
59
+ import "../chunk-3SSSCLJ5.js";
60
+ import "../chunk-EFMOJ6IL.js";
61
+ import "../chunk-YGL6SWKN.js";
62
62
  import "../chunk-N552FDTV.js";
63
63
  export {
64
64
  TagSelector
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tipp/ui",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -71,7 +71,7 @@ interface StepProps {
71
71
  Icon?: (args: { completed: boolean; active: boolean }) => React.ReactElement;
72
72
  }
73
73
 
74
- function Step(props: StepProps): React.ReactNode {
74
+ function Step(props: StepProps): React.ReactElement {
75
75
  const { Icon, children } = props;
76
76
  const {
77
77
  active,