@ceed/ads 1.18.1-next.1 → 1.19.0-next.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.
@@ -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
  }
@@ -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,34 @@ 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
+ };
440
446
  var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
441
447
  const {
442
448
  anchorEl,
443
449
  open,
444
450
  modifiers,
445
451
  children,
452
+ hasSecondaryText = false,
446
453
  ownerState: { loading, size: fontSize },
447
454
  ...innerProps
448
455
  } = props;
449
456
  const parentRef = (0, import_react6.useRef)(null);
450
457
  const isGrouped = children[0].every((child) => child.hasOwnProperty("group"));
451
- const renderTargets = (() => {
458
+ const itemHeight = (0, import_react6.useMemo)(() => {
459
+ const heights = itemHeightMap[fontSize ?? "md"];
460
+ return hasSecondaryText ? heights.secondary : heights.default;
461
+ }, [fontSize, hasSecondaryText]);
462
+ const renderTargets = (0, import_react6.useMemo)(() => {
452
463
  if (loading) {
453
464
  return [children[1]];
454
465
  }
@@ -462,10 +473,10 @@ var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
462
473
  ]);
463
474
  }
464
475
  return children[0];
465
- })();
476
+ }, [loading, children, isGrouped]);
466
477
  const virtualizer = (0, import_react_virtual.useVirtualizer)({
467
478
  count: renderTargets.length,
468
- estimateSize: () => 36,
479
+ estimateSize: () => itemHeight,
469
480
  getScrollElement: () => parentRef.current,
470
481
  measureElement: (element) => element.clientHeight,
471
482
  overscan: 5
@@ -476,7 +487,7 @@ var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
476
487
  virtualizer.measure();
477
488
  }
478
489
  }, [open, virtualizer]);
479
- return /* @__PURE__ */ import_react6.default.createElement(AutocompletePopper, { ref, anchorEl, open, modifiers }, /* @__PURE__ */ import_react6.default.createElement(import_joy10.AutocompleteListbox, { ...innerProps }, /* @__PURE__ */ import_react6.default.createElement("div", { ref: parentRef, style: { overflow: "auto" } }, /* @__PURE__ */ import_react6.default.createElement(
490
+ return /* @__PURE__ */ import_react6.default.createElement(AutocompletePopper, { ref, anchorEl, open, modifiers }, /* @__PURE__ */ import_react6.default.createElement(import_joy10.AutocompleteListbox, { ...innerProps, size: fontSize }, /* @__PURE__ */ import_react6.default.createElement("div", { ref: parentRef, style: { overflow: "auto" } }, /* @__PURE__ */ import_react6.default.createElement(
480
491
  "div",
481
492
  {
482
493
  style: {
@@ -513,21 +524,32 @@ var AutocompleteListBox = import_react6.default.forwardRef((props, ref) => {
513
524
  )
514
525
  ))));
515
526
  });
516
- var AutocompleteDeleteSize = {
527
+ var autocompleteDeleteSize = {
517
528
  sm: "20px",
518
529
  md: "24px",
519
530
  lg: "28px"
520
531
  };
532
+ var secondaryTextLevelMap = {
533
+ sm: "body-xs",
534
+ md: "body-sm",
535
+ lg: "body-md"
536
+ };
521
537
  var AutocompleteTagDelete = (0, import_joy10.styled)(IconButton_default, {
522
538
  name: "Autocomplete",
523
539
  slot: "tagDelete"
524
540
  })(({ theme, size = "sm" }) => ({
525
- width: AutocompleteDeleteSize[size],
526
- height: AutocompleteDeleteSize[size],
527
- minWidth: AutocompleteDeleteSize[size],
528
- minHeight: AutocompleteDeleteSize[size],
541
+ width: autocompleteDeleteSize[size],
542
+ height: autocompleteDeleteSize[size],
543
+ minWidth: autocompleteDeleteSize[size],
544
+ minHeight: autocompleteDeleteSize[size],
529
545
  borderRadius: "50%"
530
546
  }));
547
+ var autocompleteFilterOptions = (0, import_base.createFilterOptions)({
548
+ stringify: (option) => {
549
+ return option.secondaryText ? `${option.label} ${option.secondaryText}` : option.label;
550
+ }
551
+ });
552
+ var getOptionLabel = (option) => `${option.label ?? ""}`;
531
553
  function Autocomplete(props) {
532
554
  const {
533
555
  label,
@@ -603,6 +625,14 @@ function Autocomplete(props) {
603
625
  () => applySize(value?.endDecorator || props.endDecorator),
604
626
  [value, applySize, props.endDecorator]
605
627
  );
628
+ const slotProps = (0, import_react6.useMemo)(
629
+ () => ({
630
+ listbox: {
631
+ hasSecondaryText: options.some((opt) => opt.secondaryText)
632
+ }
633
+ }),
634
+ [options]
635
+ );
606
636
  const handleChange = (0, import_react6.useCallback)(
607
637
  (event, value2) => {
608
638
  const newValue = value2;
@@ -633,7 +663,7 @@ function Autocomplete(props) {
633
663
  disabled,
634
664
  startDecorator,
635
665
  endDecorator,
636
- getOptionLabel: (option) => `${option.label ?? ""}`,
666
+ getOptionLabel,
637
667
  renderTags: (tags, getTagProps) => tags.map((tag, index) => {
638
668
  const { onClick, ...rest } = getTagProps({ index });
639
669
  return applySize(
@@ -645,6 +675,8 @@ function Autocomplete(props) {
645
675
  slots: {
646
676
  listbox: AutocompleteListBox
647
677
  },
678
+ slotProps,
679
+ filterOptions: autocompleteFilterOptions,
648
680
  renderOption: (props2, option) => /* @__PURE__ */ import_react6.default.createElement(import_joy10.AutocompleteOption, { ...props2 }, option.startDecorator && /* @__PURE__ */ import_react6.default.createElement(
649
681
  import_joy10.ListItemDecorator,
650
682
  {
@@ -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,28 @@ 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
+ };
342
350
  var AutocompleteListBox = React5.forwardRef((props, ref) => {
343
351
  const {
344
352
  anchorEl,
345
353
  open,
346
354
  modifiers,
347
355
  children,
356
+ hasSecondaryText = false,
348
357
  ownerState: { loading, size: fontSize },
349
358
  ...innerProps
350
359
  } = props;
351
360
  const parentRef = useRef2(null);
352
361
  const isGrouped = children[0].every((child) => child.hasOwnProperty("group"));
353
- const renderTargets = (() => {
362
+ const itemHeight = useMemo(() => {
363
+ const heights = itemHeightMap[fontSize ?? "md"];
364
+ return hasSecondaryText ? heights.secondary : heights.default;
365
+ }, [fontSize, hasSecondaryText]);
366
+ const renderTargets = useMemo(() => {
354
367
  if (loading) {
355
368
  return [children[1]];
356
369
  }
@@ -364,10 +377,10 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
364
377
  ]);
365
378
  }
366
379
  return children[0];
367
- })();
380
+ }, [loading, children, isGrouped]);
368
381
  const virtualizer = useVirtualizer({
369
382
  count: renderTargets.length,
370
- estimateSize: () => 36,
383
+ estimateSize: () => itemHeight,
371
384
  getScrollElement: () => parentRef.current,
372
385
  measureElement: (element) => element.clientHeight,
373
386
  overscan: 5
@@ -378,7 +391,7 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
378
391
  virtualizer.measure();
379
392
  }
380
393
  }, [open, virtualizer]);
381
- return /* @__PURE__ */ React5.createElement(AutocompletePopper, { ref, anchorEl, open, modifiers }, /* @__PURE__ */ React5.createElement(JoyAutocompleteListbox, { ...innerProps }, /* @__PURE__ */ React5.createElement("div", { ref: parentRef, style: { overflow: "auto" } }, /* @__PURE__ */ React5.createElement(
394
+ return /* @__PURE__ */ React5.createElement(AutocompletePopper, { ref, anchorEl, open, modifiers }, /* @__PURE__ */ React5.createElement(JoyAutocompleteListbox, { ...innerProps, size: fontSize }, /* @__PURE__ */ React5.createElement("div", { ref: parentRef, style: { overflow: "auto" } }, /* @__PURE__ */ React5.createElement(
382
395
  "div",
383
396
  {
384
397
  style: {
@@ -415,21 +428,32 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
415
428
  )
416
429
  ))));
417
430
  });
418
- var AutocompleteDeleteSize = {
431
+ var autocompleteDeleteSize = {
419
432
  sm: "20px",
420
433
  md: "24px",
421
434
  lg: "28px"
422
435
  };
436
+ var secondaryTextLevelMap = {
437
+ sm: "body-xs",
438
+ md: "body-sm",
439
+ lg: "body-md"
440
+ };
423
441
  var AutocompleteTagDelete = styled3(IconButton_default, {
424
442
  name: "Autocomplete",
425
443
  slot: "tagDelete"
426
444
  })(({ theme, size = "sm" }) => ({
427
- width: AutocompleteDeleteSize[size],
428
- height: AutocompleteDeleteSize[size],
429
- minWidth: AutocompleteDeleteSize[size],
430
- minHeight: AutocompleteDeleteSize[size],
445
+ width: autocompleteDeleteSize[size],
446
+ height: autocompleteDeleteSize[size],
447
+ minWidth: autocompleteDeleteSize[size],
448
+ minHeight: autocompleteDeleteSize[size],
431
449
  borderRadius: "50%"
432
450
  }));
451
+ var autocompleteFilterOptions = createFilterOptions({
452
+ stringify: (option) => {
453
+ return option.secondaryText ? `${option.label} ${option.secondaryText}` : option.label;
454
+ }
455
+ });
456
+ var getOptionLabel = (option) => `${option.label ?? ""}`;
433
457
  function Autocomplete(props) {
434
458
  const {
435
459
  label,
@@ -505,6 +529,14 @@ function Autocomplete(props) {
505
529
  () => applySize(value?.endDecorator || props.endDecorator),
506
530
  [value, applySize, props.endDecorator]
507
531
  );
532
+ const slotProps = useMemo(
533
+ () => ({
534
+ listbox: {
535
+ hasSecondaryText: options.some((opt) => opt.secondaryText)
536
+ }
537
+ }),
538
+ [options]
539
+ );
508
540
  const handleChange = useCallback2(
509
541
  (event, value2) => {
510
542
  const newValue = value2;
@@ -535,7 +567,7 @@ function Autocomplete(props) {
535
567
  disabled,
536
568
  startDecorator,
537
569
  endDecorator,
538
- getOptionLabel: (option) => `${option.label ?? ""}`,
570
+ getOptionLabel,
539
571
  renderTags: (tags, getTagProps) => tags.map((tag, index) => {
540
572
  const { onClick, ...rest } = getTagProps({ index });
541
573
  return applySize(
@@ -547,6 +579,8 @@ function Autocomplete(props) {
547
579
  slots: {
548
580
  listbox: AutocompleteListBox
549
581
  },
582
+ slotProps,
583
+ filterOptions: autocompleteFilterOptions,
550
584
  renderOption: (props2, option) => /* @__PURE__ */ React5.createElement(JoyAutocompleteOption, { ...props2 }, option.startDecorator && /* @__PURE__ */ React5.createElement(
551
585
  ListItemDecorator,
552
586
  {
@@ -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,