@ceed/ads 1.18.0 → 1.19.0-next.1

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.
@@ -3,6 +3,7 @@ import { AutocompleteProps as JoyAutocompleteProps } from '@mui/joy';
3
3
  interface AutocompleteOption {
4
4
  value: string;
5
5
  label: string;
6
+ secondaryText?: string;
6
7
  startDecorator?: React.ReactNode;
7
8
  endDecorator?: React.ReactNode;
8
9
  }
@@ -26,7 +26,7 @@ interface BaseProfileMenuProps {
26
26
  src: string;
27
27
  alt: string;
28
28
  };
29
- caption?: string;
29
+ caption?: React.ReactNode;
30
30
  chip?: string;
31
31
  };
32
32
  menuItems: ({
@@ -17,6 +17,7 @@ type OptionType = {
17
17
  label: string;
18
18
  value: string | number;
19
19
  disabled?: boolean;
20
+ secondaryText?: string;
20
21
  } | string | number;
21
22
  type InferOptionValue<OptionValue> = OptionValue extends {
22
23
  value: infer V;
package/dist/index.cjs CHANGED
@@ -345,9 +345,10 @@ Alert.displayName = "Alert";
345
345
  // src/components/Autocomplete/Autocomplete.tsx
346
346
  var import_react6 = __toESM(require("react"));
347
347
  var import_joy10 = require("@mui/joy");
348
+ var import_base = require("@mui/base");
348
349
  var import_Close = __toESM(require("@mui/icons-material/Close"));
349
350
  var import_react_virtual = require("@tanstack/react-virtual");
350
- var import_base = require("@mui/base");
351
+ var import_base2 = require("@mui/base");
351
352
 
352
353
  // src/components/FormControl/FormControl.tsx
353
354
  var import_joy5 = require("@mui/joy");
@@ -431,24 +432,39 @@ function useControlledState(controlledValue, defaultValue, onChange) {
431
432
  }
432
433
 
433
434
  // src/components/Autocomplete/Autocomplete.tsx
434
- var AutocompletePopper = (0, import_joy10.styled)(import_base.Popper, {
435
+ var AutocompletePopper = (0, import_joy10.styled)(import_base2.Popper, {
435
436
  name: "Autocomplete",
436
437
  slot: "Popper"
437
438
  })(({ theme }) => ({
438
439
  zIndex: theme.zIndex.tooltip
439
440
  }));
441
+ var itemHeightMap = {
442
+ sm: { default: 32, secondary: 47 },
443
+ md: { default: 36, secondary: 55 },
444
+ lg: { default: 44, secondary: 65 }
445
+ };
446
+ var optionPaddingMap = {
447
+ sm: { px: "8px", py: "3px" },
448
+ md: { px: "12px", py: "4px" },
449
+ lg: { px: "16px", py: "6px" }
450
+ };
440
451
  var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
441
452
  const {
442
453
  anchorEl,
443
454
  open,
444
455
  modifiers,
445
456
  children,
457
+ hasSecondaryText = false,
446
458
  ownerState: { loading, size: fontSize },
447
459
  ...innerProps
448
460
  } = props;
449
461
  const parentRef = (0, import_react6.useRef)(null);
450
462
  const isGrouped = children[0].every((child) => child.hasOwnProperty("group"));
451
- const renderTargets = (() => {
463
+ const itemHeight = (0, import_react6.useMemo)(() => {
464
+ const heights = itemHeightMap[fontSize ?? "md"];
465
+ return hasSecondaryText ? heights.secondary : heights.default;
466
+ }, [fontSize, hasSecondaryText]);
467
+ const renderTargets = (0, import_react6.useMemo)(() => {
452
468
  if (loading) {
453
469
  return [children[1]];
454
470
  }
@@ -462,10 +478,10 @@ var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
462
478
  ]);
463
479
  }
464
480
  return children[0];
465
- })();
481
+ }, [loading, children, isGrouped]);
466
482
  const virtualizer = (0, import_react_virtual.useVirtualizer)({
467
483
  count: renderTargets.length,
468
- estimateSize: () => 36,
484
+ estimateSize: () => itemHeight,
469
485
  getScrollElement: () => parentRef.current,
470
486
  measureElement: (element) => element.clientHeight,
471
487
  overscan: 5
@@ -513,19 +529,24 @@ var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
513
529
  )
514
530
  ))));
515
531
  });
516
- var AutocompleteDeleteSize = {
532
+ var autocompleteDeleteSize = {
517
533
  sm: "20px",
518
534
  md: "24px",
519
535
  lg: "28px"
520
536
  };
537
+ var secondaryTextLevelMap = {
538
+ sm: "body-xs",
539
+ md: "body-sm",
540
+ lg: "body-md"
541
+ };
521
542
  var AutocompleteTagDelete = (0, import_joy10.styled)(IconButton_default, {
522
543
  name: "Autocomplete",
523
544
  slot: "tagDelete"
524
545
  })(({ theme, size = "sm" }) => ({
525
- width: AutocompleteDeleteSize[size],
526
- height: AutocompleteDeleteSize[size],
527
- minWidth: AutocompleteDeleteSize[size],
528
- minHeight: AutocompleteDeleteSize[size],
546
+ width: autocompleteDeleteSize[size],
547
+ height: autocompleteDeleteSize[size],
548
+ minWidth: autocompleteDeleteSize[size],
549
+ minHeight: autocompleteDeleteSize[size],
529
550
  borderRadius: "50%"
530
551
  }));
531
552
  function Autocomplete(props) {
@@ -645,7 +666,18 @@ function Autocomplete(props) {
645
666
  slots: {
646
667
  listbox: AutocompleteListBox
647
668
  },
648
- renderOption: (props2, option) => /* @__PURE__ */ import_react6.default.createElement(import_joy10.AutocompleteOption, { ...props2 }, option.startDecorator && /* @__PURE__ */ import_react6.default.createElement(
669
+ slotProps: {
670
+ listbox: {
671
+ hasSecondaryText: options.some((opt) => opt.secondaryText)
672
+ }
673
+ },
674
+ filterOptions: (0, import_base.createFilterOptions)({
675
+ stringify: (option) => {
676
+ const opt = option;
677
+ return opt.secondaryText ? `${opt.label} ${opt.secondaryText}` : opt.label;
678
+ }
679
+ }),
680
+ renderOption: (props2, option) => /* @__PURE__ */ import_react6.default.createElement(import_joy10.AutocompleteOption, { ...props2, sx: optionPaddingMap[size ?? "md"] }, option.startDecorator && /* @__PURE__ */ import_react6.default.createElement(
649
681
  import_joy10.ListItemDecorator,
650
682
  {
651
683
  sx: (theme) => ({
@@ -653,7 +685,10 @@ function Autocomplete(props) {
653
685
  })
654
686
  },
655
687
  applySize(option.startDecorator)
656
- ), applySize(option.label), option.endDecorator && /* @__PURE__ */ import_react6.default.createElement(
688
+ ), option.secondaryText ? /* @__PURE__ */ import_react6.default.createElement(import_joy10.ListItemContent, { sx: { gap: 0.5 } }, /* @__PURE__ */ import_react6.default.createElement(import_joy10.Typography, { level: "inherit" }, applySize(option.label)), /* @__PURE__ */ import_react6.default.createElement(import_joy10.Typography, { level: secondaryTextLevelMap[size ?? "md"], textColor: "text.tertiary" }, option.secondaryText)) : (
689
+ // TODO: haulla에서 사용할 때, label을 ReactNode로 넘기면 에러가 발생함....
690
+ applySize(option.label)
691
+ ), option.endDecorator && /* @__PURE__ */ import_react6.default.createElement(
657
692
  import_joy10.ListItemDecorator,
658
693
  {
659
694
  sx: (theme) => ({
@@ -2215,7 +2250,7 @@ var import_react19 = __toESM(require("react"));
2215
2250
  var import_react_imask = require("react-imask");
2216
2251
  var import_CalendarToday = __toESM(require("@mui/icons-material/CalendarToday"));
2217
2252
  var import_joy27 = require("@mui/joy");
2218
- var import_base2 = require("@mui/base");
2253
+ var import_base3 = require("@mui/base");
2219
2254
 
2220
2255
  // src/components/Sheet/Sheet.tsx
2221
2256
  var import_joy25 = require("@mui/joy");
@@ -2251,7 +2286,7 @@ var CalendarButton = (0, import_joy27.styled)(IconButton_default, {
2251
2286
  outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
2252
2287
  }
2253
2288
  }));
2254
- var StyledPopper = (0, import_joy27.styled)(import_base2.Popper, {
2289
+ var StyledPopper = (0, import_joy27.styled)(import_base3.Popper, {
2255
2290
  name: "DatePicker",
2256
2291
  slot: "popper"
2257
2292
  })(({ theme }) => ({
@@ -2464,7 +2499,7 @@ var DatePicker = (0, import_react19.forwardRef)((inProps, ref) => {
2464
2499
  },
2465
2500
  [inputReadOnly, buttonRef]
2466
2501
  );
2467
- return /* @__PURE__ */ import_react19.default.createElement(DatePickerRoot, null, /* @__PURE__ */ import_react19.default.createElement(import_base2.FocusTrap, { open: true }, /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
2502
+ return /* @__PURE__ */ import_react19.default.createElement(DatePickerRoot, null, /* @__PURE__ */ import_react19.default.createElement(import_base3.FocusTrap, { open: true }, /* @__PURE__ */ import_react19.default.createElement(import_react19.default.Fragment, null, /* @__PURE__ */ import_react19.default.createElement(
2468
2503
  Input_default,
2469
2504
  {
2470
2505
  ...innerProps,
@@ -2510,7 +2545,7 @@ var DatePicker = (0, import_react19.forwardRef)((inProps, ref) => {
2510
2545
  helperText,
2511
2546
  readOnly: readOnly || inputReadOnly
2512
2547
  }
2513
- ), open && /* @__PURE__ */ import_react19.default.createElement(import_base2.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react19.default.createElement(
2548
+ ), open && /* @__PURE__ */ import_react19.default.createElement(import_base3.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react19.default.createElement(
2514
2549
  StyledPopper,
2515
2550
  {
2516
2551
  id: "date-picker-popper",
@@ -2640,6 +2675,11 @@ var import_joy29 = require("@mui/joy");
2640
2675
  var import_framer_motion19 = require("framer-motion");
2641
2676
  var MotionOption = (0, import_framer_motion19.motion)(import_joy29.Option);
2642
2677
  var Option = MotionOption;
2678
+ var secondaryTextLevelMap2 = {
2679
+ sm: "body-xs",
2680
+ md: "body-sm",
2681
+ lg: "body-md"
2682
+ };
2643
2683
  Option.displayName = "Option";
2644
2684
  function Select(props) {
2645
2685
  const {
@@ -2681,6 +2721,13 @@ function Select(props) {
2681
2721
  };
2682
2722
  onChange?.(newEvent, newValue);
2683
2723
  };
2724
+ const optionMap = (0, import_react21.useMemo)(() => {
2725
+ const map = /* @__PURE__ */ new Map();
2726
+ options.forEach((option) => {
2727
+ map.set(option.value, option);
2728
+ });
2729
+ return map;
2730
+ }, [options]);
2684
2731
  const select = /* @__PURE__ */ import_react21.default.createElement(
2685
2732
  import_joy29.Select,
2686
2733
  {
@@ -2689,9 +2736,16 @@ function Select(props) {
2689
2736
  disabled,
2690
2737
  size,
2691
2738
  color: error ? "danger" : color,
2692
- onChange: handleChange
2739
+ onChange: handleChange,
2740
+ renderValue: (selected) => {
2741
+ if (!selected) return null;
2742
+ if (Array.isArray(selected)) {
2743
+ return selected.map((s) => optionMap.get(s.value)?.label).join(", ");
2744
+ }
2745
+ return optionMap.get(selected.value)?.label;
2746
+ }
2693
2747
  },
2694
- options.map((option) => /* @__PURE__ */ import_react21.default.createElement(Option, { key: option.value, value: option.value, disabled: option.disabled }, option.label))
2748
+ options.map((option) => /* @__PURE__ */ import_react21.default.createElement(Option, { key: option.value, value: option.value, disabled: option.disabled }, option.secondaryText ? /* @__PURE__ */ import_react21.default.createElement(import_joy29.ListItemContent, { sx: { gap: 0.5 } }, /* @__PURE__ */ import_react21.default.createElement(import_joy29.Typography, { level: "inherit" }, option.label), /* @__PURE__ */ import_react21.default.createElement(import_joy29.Typography, { level: secondaryTextLevelMap2[size ?? "md"], textColor: "text.tertiary" }, option.secondaryText)) : option.label))
2695
2749
  );
2696
2750
  return /* @__PURE__ */ import_react21.default.createElement(
2697
2751
  FormControl_default,
@@ -4111,7 +4165,7 @@ var import_react29 = __toESM(require("react"));
4111
4165
  var import_react_imask2 = require("react-imask");
4112
4166
  var import_CalendarToday2 = __toESM(require("@mui/icons-material/CalendarToday"));
4113
4167
  var import_joy36 = require("@mui/joy");
4114
- var import_base3 = require("@mui/base");
4168
+ var import_base4 = require("@mui/base");
4115
4169
  var CalendarButton2 = (0, import_joy36.styled)(IconButton_default, {
4116
4170
  name: "DateRangePicker",
4117
4171
  slot: "calendarButton"
@@ -4122,7 +4176,7 @@ var CalendarButton2 = (0, import_joy36.styled)(IconButton_default, {
4122
4176
  outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4123
4177
  }
4124
4178
  }));
4125
- var StyledPopper2 = (0, import_joy36.styled)(import_base3.Popper, {
4179
+ var StyledPopper2 = (0, import_joy36.styled)(import_base4.Popper, {
4126
4180
  name: "DateRangePicker",
4127
4181
  slot: "popper"
4128
4182
  })(({ theme }) => ({
@@ -4365,7 +4419,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4365
4419
  },
4366
4420
  [inputReadOnly, buttonRef]
4367
4421
  );
4368
- return /* @__PURE__ */ import_react29.default.createElement(DateRangePickerRoot, null, /* @__PURE__ */ import_react29.default.createElement(import_base3.FocusTrap, { open: true }, /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement(
4422
+ return /* @__PURE__ */ import_react29.default.createElement(DateRangePickerRoot, null, /* @__PURE__ */ import_react29.default.createElement(import_base4.FocusTrap, { open: true }, /* @__PURE__ */ import_react29.default.createElement(import_react29.default.Fragment, null, /* @__PURE__ */ import_react29.default.createElement(
4369
4423
  Input_default,
4370
4424
  {
4371
4425
  ...innerProps,
@@ -4411,7 +4465,7 @@ var DateRangePicker = (0, import_react29.forwardRef)((inProps, ref) => {
4411
4465
  helperText,
4412
4466
  readOnly: readOnly || inputReadOnly
4413
4467
  }
4414
- ), open && /* @__PURE__ */ import_react29.default.createElement(import_base3.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react29.default.createElement(
4468
+ ), open && /* @__PURE__ */ import_react29.default.createElement(import_base4.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react29.default.createElement(
4415
4469
  StyledPopper2,
4416
4470
  {
4417
4471
  id: "date-range-picker-popper",
@@ -5982,8 +6036,8 @@ MenuButton.displayName = "MenuButton";
5982
6036
  var import_react49 = __toESM(require("react"));
5983
6037
  var import_CalendarToday3 = __toESM(require("@mui/icons-material/CalendarToday"));
5984
6038
  var import_joy61 = require("@mui/joy");
5985
- var import_base4 = require("@mui/base");
5986
- var StyledPopper3 = (0, import_joy61.styled)(import_base4.Popper, {
6039
+ var import_base5 = require("@mui/base");
6040
+ var StyledPopper3 = (0, import_joy61.styled)(import_base5.Popper, {
5987
6041
  name: "MonthPicker",
5988
6042
  slot: "popper"
5989
6043
  })(({ theme }) => ({
@@ -6115,7 +6169,7 @@ var MonthPicker = (0, import_react49.forwardRef)((inProps, ref) => {
6115
6169
  },
6116
6170
  [buttonRef]
6117
6171
  );
6118
- return /* @__PURE__ */ import_react49.default.createElement(MonthPickerRoot, null, /* @__PURE__ */ import_react49.default.createElement(import_base4.FocusTrap, { open: true }, /* @__PURE__ */ import_react49.default.createElement(import_react49.default.Fragment, null, /* @__PURE__ */ import_react49.default.createElement(
6172
+ return /* @__PURE__ */ import_react49.default.createElement(MonthPickerRoot, null, /* @__PURE__ */ import_react49.default.createElement(import_base5.FocusTrap, { open: true }, /* @__PURE__ */ import_react49.default.createElement(import_react49.default.Fragment, null, /* @__PURE__ */ import_react49.default.createElement(
6119
6173
  Input_default,
6120
6174
  {
6121
6175
  ...innerProps,
@@ -6162,7 +6216,7 @@ var MonthPicker = (0, import_react49.forwardRef)((inProps, ref) => {
6162
6216
  label,
6163
6217
  helperText
6164
6218
  }
6165
- ), open && /* @__PURE__ */ import_react49.default.createElement(import_base4.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react49.default.createElement(
6219
+ ), open && /* @__PURE__ */ import_react49.default.createElement(import_base5.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react49.default.createElement(
6166
6220
  StyledPopper3,
6167
6221
  {
6168
6222
  id: "month-picker-popper",
@@ -6236,8 +6290,8 @@ var import_react50 = __toESM(require("react"));
6236
6290
  var import_react_imask3 = require("react-imask");
6237
6291
  var import_CalendarToday4 = __toESM(require("@mui/icons-material/CalendarToday"));
6238
6292
  var import_joy62 = require("@mui/joy");
6239
- var import_base5 = require("@mui/base");
6240
- var StyledPopper4 = (0, import_joy62.styled)(import_base5.Popper, {
6293
+ var import_base6 = require("@mui/base");
6294
+ var StyledPopper4 = (0, import_joy62.styled)(import_base6.Popper, {
6241
6295
  name: "MonthRangePicker",
6242
6296
  slot: "popper"
6243
6297
  })(({ theme }) => ({
@@ -6376,7 +6430,7 @@ var MonthRangePicker = (0, import_react50.forwardRef)((inProps, ref) => {
6376
6430
  },
6377
6431
  [setValue, setAnchorEl, format]
6378
6432
  );
6379
- return /* @__PURE__ */ import_react50.default.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ import_react50.default.createElement(import_base5.FocusTrap, { open: true }, /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement(
6433
+ return /* @__PURE__ */ import_react50.default.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ import_react50.default.createElement(import_base6.FocusTrap, { open: true }, /* @__PURE__ */ import_react50.default.createElement(import_react50.default.Fragment, null, /* @__PURE__ */ import_react50.default.createElement(
6380
6434
  Input_default,
6381
6435
  {
6382
6436
  ...innerProps,
@@ -6413,7 +6467,7 @@ var MonthRangePicker = (0, import_react50.forwardRef)((inProps, ref) => {
6413
6467
  label,
6414
6468
  helperText
6415
6469
  }
6416
- ), open && /* @__PURE__ */ import_react50.default.createElement(import_base5.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react50.default.createElement(
6470
+ ), open && /* @__PURE__ */ import_react50.default.createElement(import_base6.ClickAwayListener, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ import_react50.default.createElement(
6417
6471
  StyledPopper4,
6418
6472
  {
6419
6473
  id: "month-range-picker-popper",
@@ -6584,7 +6638,7 @@ Navigator.displayName = "Navigator";
6584
6638
  // src/components/ProfileMenu/ProfileMenu.tsx
6585
6639
  var import_react54 = __toESM(require("react"));
6586
6640
  var import_joy65 = require("@mui/joy");
6587
- var import_base6 = require("@mui/base");
6641
+ var import_base7 = require("@mui/base");
6588
6642
  var import_ArrowDropDown = __toESM(require("@mui/icons-material/ArrowDropDown"));
6589
6643
  var StyledProfileCard = (0, import_joy65.styled)(import_joy3.Stack, {
6590
6644
  name: "ProfileMenu",
@@ -6636,7 +6690,7 @@ function ProfileMenu(props) {
6636
6690
  defaultOpen ?? false,
6637
6691
  (0, import_react54.useCallback)((value) => onOpenChange?.(value), [onOpenChange])
6638
6692
  );
6639
- return /* @__PURE__ */ import_react54.default.createElement(import_base6.ClickAwayListener, { onClickAway: () => setOpen(false) }, /* @__PURE__ */ import_react54.default.createElement("div", null, /* @__PURE__ */ import_react54.default.createElement(import_joy65.Dropdown, { open }, /* @__PURE__ */ import_react54.default.createElement(
6693
+ return /* @__PURE__ */ import_react54.default.createElement(import_base7.ClickAwayListener, { onClickAway: () => setOpen(false) }, /* @__PURE__ */ import_react54.default.createElement("div", null, /* @__PURE__ */ import_react54.default.createElement(import_joy65.Dropdown, { open }, /* @__PURE__ */ import_react54.default.createElement(
6640
6694
  ProfileMenuButton,
6641
6695
  {
6642
6696
  size,
package/dist/index.js CHANGED
@@ -131,7 +131,7 @@ import {
131
131
  listItemClasses,
132
132
  ListItemButton as ListItemButton2,
133
133
  listItemButtonClasses as listItemButtonClasses2,
134
- ListItemContent,
134
+ ListItemContent as ListItemContent3,
135
135
  listItemContentClasses,
136
136
  ListItemDecorator as ListItemDecorator2,
137
137
  listItemDecoratorClasses,
@@ -244,9 +244,12 @@ import {
244
244
  ListSubheader as JoyListSubheader,
245
245
  AutocompleteListbox as JoyAutocompleteListbox,
246
246
  ListItemDecorator,
247
+ ListItemContent,
248
+ Typography as Typography2,
247
249
  CircularProgress,
248
250
  styled as styled3
249
251
  } from "@mui/joy";
252
+ import { createFilterOptions } from "@mui/base";
250
253
  import CloseIcon from "@mui/icons-material/Close";
251
254
  import { useVirtualizer } from "@tanstack/react-virtual";
252
255
  import { Popper } from "@mui/base";
@@ -339,18 +342,33 @@ var AutocompletePopper = styled3(Popper, {
339
342
  })(({ theme }) => ({
340
343
  zIndex: theme.zIndex.tooltip
341
344
  }));
345
+ var itemHeightMap = {
346
+ sm: { default: 32, secondary: 47 },
347
+ md: { default: 36, secondary: 55 },
348
+ lg: { default: 44, secondary: 65 }
349
+ };
350
+ var optionPaddingMap = {
351
+ sm: { px: "8px", py: "3px" },
352
+ md: { px: "12px", py: "4px" },
353
+ lg: { px: "16px", py: "6px" }
354
+ };
342
355
  var AutocompleteListBox = React5.forwardRef((props, ref) => {
343
356
  const {
344
357
  anchorEl,
345
358
  open,
346
359
  modifiers,
347
360
  children,
361
+ hasSecondaryText = false,
348
362
  ownerState: { loading, size: fontSize },
349
363
  ...innerProps
350
364
  } = props;
351
365
  const parentRef = useRef2(null);
352
366
  const isGrouped = children[0].every((child) => child.hasOwnProperty("group"));
353
- const renderTargets = (() => {
367
+ const itemHeight = useMemo(() => {
368
+ const heights = itemHeightMap[fontSize ?? "md"];
369
+ return hasSecondaryText ? heights.secondary : heights.default;
370
+ }, [fontSize, hasSecondaryText]);
371
+ const renderTargets = useMemo(() => {
354
372
  if (loading) {
355
373
  return [children[1]];
356
374
  }
@@ -364,10 +382,10 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
364
382
  ]);
365
383
  }
366
384
  return children[0];
367
- })();
385
+ }, [loading, children, isGrouped]);
368
386
  const virtualizer = useVirtualizer({
369
387
  count: renderTargets.length,
370
- estimateSize: () => 36,
388
+ estimateSize: () => itemHeight,
371
389
  getScrollElement: () => parentRef.current,
372
390
  measureElement: (element) => element.clientHeight,
373
391
  overscan: 5
@@ -415,19 +433,24 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
415
433
  )
416
434
  ))));
417
435
  });
418
- var AutocompleteDeleteSize = {
436
+ var autocompleteDeleteSize = {
419
437
  sm: "20px",
420
438
  md: "24px",
421
439
  lg: "28px"
422
440
  };
441
+ var secondaryTextLevelMap = {
442
+ sm: "body-xs",
443
+ md: "body-sm",
444
+ lg: "body-md"
445
+ };
423
446
  var AutocompleteTagDelete = styled3(IconButton_default, {
424
447
  name: "Autocomplete",
425
448
  slot: "tagDelete"
426
449
  })(({ theme, size = "sm" }) => ({
427
- width: AutocompleteDeleteSize[size],
428
- height: AutocompleteDeleteSize[size],
429
- minWidth: AutocompleteDeleteSize[size],
430
- minHeight: AutocompleteDeleteSize[size],
450
+ width: autocompleteDeleteSize[size],
451
+ height: autocompleteDeleteSize[size],
452
+ minWidth: autocompleteDeleteSize[size],
453
+ minHeight: autocompleteDeleteSize[size],
431
454
  borderRadius: "50%"
432
455
  }));
433
456
  function Autocomplete(props) {
@@ -547,7 +570,18 @@ function Autocomplete(props) {
547
570
  slots: {
548
571
  listbox: AutocompleteListBox
549
572
  },
550
- renderOption: (props2, option) => /* @__PURE__ */ React5.createElement(JoyAutocompleteOption, { ...props2 }, option.startDecorator && /* @__PURE__ */ React5.createElement(
573
+ slotProps: {
574
+ listbox: {
575
+ hasSecondaryText: options.some((opt) => opt.secondaryText)
576
+ }
577
+ },
578
+ filterOptions: createFilterOptions({
579
+ stringify: (option) => {
580
+ const opt = option;
581
+ return opt.secondaryText ? `${opt.label} ${opt.secondaryText}` : opt.label;
582
+ }
583
+ }),
584
+ renderOption: (props2, option) => /* @__PURE__ */ React5.createElement(JoyAutocompleteOption, { ...props2, sx: optionPaddingMap[size ?? "md"] }, option.startDecorator && /* @__PURE__ */ React5.createElement(
551
585
  ListItemDecorator,
552
586
  {
553
587
  sx: (theme) => ({
@@ -555,7 +589,10 @@ function Autocomplete(props) {
555
589
  })
556
590
  },
557
591
  applySize(option.startDecorator)
558
- ), applySize(option.label), option.endDecorator && /* @__PURE__ */ React5.createElement(
592
+ ), option.secondaryText ? /* @__PURE__ */ React5.createElement(ListItemContent, { sx: { gap: 0.5 } }, /* @__PURE__ */ React5.createElement(Typography2, { level: "inherit" }, applySize(option.label)), /* @__PURE__ */ React5.createElement(Typography2, { level: secondaryTextLevelMap[size ?? "md"], textColor: "text.tertiary" }, option.secondaryText)) : (
593
+ // TODO: haulla에서 사용할 때, label을 ReactNode로 넘기면 에러가 발생함....
594
+ applySize(option.label)
595
+ ), option.endDecorator && /* @__PURE__ */ React5.createElement(
559
596
  ListItemDecorator,
560
597
  {
561
598
  sx: (theme) => ({
@@ -2565,10 +2602,15 @@ var Textarea_default = Textarea;
2565
2602
 
2566
2603
  // src/components/Select/Select.tsx
2567
2604
  import React19, { useMemo as useMemo7 } from "react";
2568
- import { Select as JoySelect, Option as JoyOption } from "@mui/joy";
2605
+ import { Select as JoySelect, Option as JoyOption, ListItemContent as ListItemContent2, Typography as Typography3 } from "@mui/joy";
2569
2606
  import { motion as motion19 } from "framer-motion";
2570
2607
  var MotionOption = motion19(JoyOption);
2571
2608
  var Option = MotionOption;
2609
+ var secondaryTextLevelMap2 = {
2610
+ sm: "body-xs",
2611
+ md: "body-sm",
2612
+ lg: "body-md"
2613
+ };
2572
2614
  Option.displayName = "Option";
2573
2615
  function Select(props) {
2574
2616
  const {
@@ -2610,6 +2652,13 @@ function Select(props) {
2610
2652
  };
2611
2653
  onChange?.(newEvent, newValue);
2612
2654
  };
2655
+ const optionMap = useMemo7(() => {
2656
+ const map = /* @__PURE__ */ new Map();
2657
+ options.forEach((option) => {
2658
+ map.set(option.value, option);
2659
+ });
2660
+ return map;
2661
+ }, [options]);
2613
2662
  const select = /* @__PURE__ */ React19.createElement(
2614
2663
  JoySelect,
2615
2664
  {
@@ -2618,9 +2667,16 @@ function Select(props) {
2618
2667
  disabled,
2619
2668
  size,
2620
2669
  color: error ? "danger" : color,
2621
- onChange: handleChange
2670
+ onChange: handleChange,
2671
+ renderValue: (selected) => {
2672
+ if (!selected) return null;
2673
+ if (Array.isArray(selected)) {
2674
+ return selected.map((s) => optionMap.get(s.value)?.label).join(", ");
2675
+ }
2676
+ return optionMap.get(selected.value)?.label;
2677
+ }
2622
2678
  },
2623
- options.map((option) => /* @__PURE__ */ React19.createElement(Option, { key: option.value, value: option.value, disabled: option.disabled }, option.label))
2679
+ options.map((option) => /* @__PURE__ */ React19.createElement(Option, { key: option.value, value: option.value, disabled: option.disabled }, option.secondaryText ? /* @__PURE__ */ React19.createElement(ListItemContent2, { sx: { gap: 0.5 } }, /* @__PURE__ */ React19.createElement(Typography3, { level: "inherit" }, option.label), /* @__PURE__ */ React19.createElement(Typography3, { level: secondaryTextLevelMap2[size ?? "md"], textColor: "text.tertiary" }, option.secondaryText)) : option.label))
2624
2680
  );
2625
2681
  return /* @__PURE__ */ React19.createElement(
2626
2682
  FormControl_default,
@@ -5062,7 +5118,7 @@ CurrencyRange.displayName = "CurrencyRange";
5062
5118
 
5063
5119
  // src/components/FilterMenu/components/PercentageInput.tsx
5064
5120
  import React38 from "react";
5065
- import { Stack as Stack8, Typography as Typography2 } from "@mui/joy";
5121
+ import { Stack as Stack8, Typography as Typography4 } from "@mui/joy";
5066
5122
 
5067
5123
  // src/components/PercentageInput/PercentageInput.tsx
5068
5124
  import React37, { useCallback as useCallback20, useMemo as useMemo14, useState as useState12 } from "react";
@@ -5197,7 +5253,7 @@ var PercentageInput3 = ({
5197
5253
  if (hidden) {
5198
5254
  return null;
5199
5255
  }
5200
- return /* @__PURE__ */ React38.createElement(Stack8, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React38.createElement(Typography2, { id, level: "title-sm", component: "label", textColor: "text.tertiary" }, label), /* @__PURE__ */ React38.createElement(
5256
+ return /* @__PURE__ */ React38.createElement(Stack8, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React38.createElement(Typography4, { id, level: "title-sm", component: "label", textColor: "text.tertiary" }, label), /* @__PURE__ */ React38.createElement(
5201
5257
  PercentageInput,
5202
5258
  {
5203
5259
  value: _value,
@@ -7293,7 +7349,7 @@ export {
7293
7349
  ListDivider2 as ListDivider,
7294
7350
  ListItem,
7295
7351
  ListItemButton2 as ListItemButton,
7296
- ListItemContent,
7352
+ ListItemContent3 as ListItemContent,
7297
7353
  ListItemDecorator2 as ListItemDecorator,
7298
7354
  ListSubheader,
7299
7355
  Markdown,