@ceed/ads 1.7.8 → 1.8.0-next.10

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.
package/dist/index.js CHANGED
@@ -348,7 +348,7 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
348
348
  open,
349
349
  modifiers,
350
350
  children,
351
- ownerState: { loading, size: fontSize = "md" },
351
+ ownerState: { loading, size: fontSize },
352
352
  ...innerProps
353
353
  } = props;
354
354
  const parentRef = useRef2(null);
@@ -381,42 +381,51 @@ var AutocompleteListBox = React5.forwardRef((props, ref) => {
381
381
  virtualizer.measure();
382
382
  }
383
383
  }, [open, virtualizer]);
384
- 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(
385
- "div",
384
+ return /* @__PURE__ */ React5.createElement(
385
+ AutocompletePopper,
386
386
  {
387
- style: {
388
- height: `${virtualizer.getTotalSize()}px`,
389
- position: "relative"
390
- }
387
+ ref,
388
+ anchorEl,
389
+ open,
390
+ modifiers
391
391
  },
392
- items.map(
393
- ({ index, size, start, key }) => React5.cloneElement(renderTargets[index], {
394
- key,
392
+ /* @__PURE__ */ React5.createElement(JoyAutocompleteListbox, { ...innerProps }, /* @__PURE__ */ React5.createElement("div", { ref: parentRef, style: { overflow: "auto" } }, /* @__PURE__ */ React5.createElement(
393
+ "div",
394
+ {
395
395
  style: {
396
- position: "absolute",
397
- top: 0,
398
- left: 0,
399
- width: "100%",
400
- fontSize: `var(--ceed-fontSize-${fontSize})`,
401
- height: `${size}px`,
402
- transform: `translateY(${start}px)`,
403
- overflow: "visible"
404
- },
405
- children: /* @__PURE__ */ React5.createElement(
406
- "div",
407
- {
408
- style: {
409
- textOverflow: "ellipsis",
410
- textWrap: "nowrap",
411
- overflow: "hidden",
412
- width: "100%"
413
- }
396
+ height: `${virtualizer.getTotalSize()}px`,
397
+ position: "relative"
398
+ }
399
+ },
400
+ items.map(
401
+ ({ index, size, start, key }) => React5.cloneElement(renderTargets[index], {
402
+ key,
403
+ style: {
404
+ position: "absolute",
405
+ top: 0,
406
+ left: 0,
407
+ width: "100%",
408
+ fontSize: `var(--ceed-fontSize-${fontSize})`,
409
+ height: `${size}px`,
410
+ transform: `translateY(${start}px)`,
411
+ overflow: "visible"
414
412
  },
415
- renderTargets[index].props.children
416
- )
417
- })
418
- )
419
- ))));
413
+ children: /* @__PURE__ */ React5.createElement(
414
+ "div",
415
+ {
416
+ style: {
417
+ textOverflow: "ellipsis",
418
+ textWrap: "nowrap",
419
+ overflow: "hidden",
420
+ width: "100%"
421
+ }
422
+ },
423
+ renderTargets[index].props.children
424
+ )
425
+ })
426
+ )
427
+ )))
428
+ );
420
429
  });
421
430
  var AutocompleteDeleteSize = {
422
431
  sm: "20px",
@@ -426,7 +435,7 @@ var AutocompleteDeleteSize = {
426
435
  var AutocompleteTagDelete = styled3(IconButton_default, {
427
436
  name: "Autocomplete",
428
437
  slot: "tagDelete"
429
- })(({ theme, size = "md" }) => ({
438
+ })(({ theme, size = "sm" }) => ({
430
439
  width: AutocompleteDeleteSize[size],
431
440
  height: AutocompleteDeleteSize[size],
432
441
  minWidth: AutocompleteDeleteSize[size],
@@ -486,7 +495,15 @@ function Autocomplete(props) {
486
495
  return {
487
496
  value: "",
488
497
  label: "",
489
- startDecorator: /* @__PURE__ */ React5.createElement(CircularProgress, { size: "sm", color: "neutral", variant: "plain", thickness: 3 })
498
+ startDecorator: /* @__PURE__ */ React5.createElement(
499
+ CircularProgress,
500
+ {
501
+ size: "sm",
502
+ color: "neutral",
503
+ variant: "plain",
504
+ thickness: 3
505
+ }
506
+ )
490
507
  };
491
508
  }
492
509
  if (Array.isArray(_value)) {
@@ -501,11 +518,15 @@ function Autocomplete(props) {
501
518
  [size, props.loading]
502
519
  );
503
520
  const startDecorator = useMemo(
504
- () => applySize(value?.startDecorator || props.startDecorator),
521
+ () => applySize(
522
+ value?.startDecorator || props.startDecorator
523
+ ),
505
524
  [value, applySize, props.startDecorator]
506
525
  );
507
526
  const endDecorator = useMemo(
508
- () => applySize(value?.endDecorator || props.endDecorator),
527
+ () => applySize(
528
+ value?.endDecorator || props.endDecorator
529
+ ),
509
530
  [value, applySize, props.endDecorator]
510
531
  );
511
532
  const handleChange = useCallback2(
@@ -543,7 +564,16 @@ function Autocomplete(props) {
543
564
  const { onClick, ...rest } = getTagProps({ index });
544
565
  return applySize(
545
566
  /* @__PURE__ */ React5.createElement(Chip_default, { color: "primary", ...rest }, /* @__PURE__ */ React5.createElement(Stack_default, { direction: "row", alignItems: "center", gap: 2, py: 0.5 }, tag.value, applySize(
546
- /* @__PURE__ */ React5.createElement(AutocompleteTagDelete, { color: "primary", variant: "soft", onClick }, /* @__PURE__ */ React5.createElement(CloseIcon, null))
567
+ /* @__PURE__ */ React5.createElement(
568
+ AutocompleteTagDelete,
569
+ {
570
+ color: "primary",
571
+ variant: "soft",
572
+ onClick,
573
+ size
574
+ },
575
+ /* @__PURE__ */ React5.createElement(CloseIcon, null)
576
+ )
547
577
  )))
548
578
  );
549
579
  }),
@@ -4091,7 +4121,9 @@ var CalendarButton2 = styled13(IconButton_default, {
4091
4121
  "&:focus": {
4092
4122
  "--Icon-color": "currentColor",
4093
4123
  outlineOffset: `${theme.getCssVar("focus-thickness")}`,
4094
- outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar("palette-focusVisible")}`
4124
+ outline: `${theme.getCssVar("focus-thickness")} solid ${theme.getCssVar(
4125
+ "palette-focusVisible"
4126
+ )}`
4095
4127
  }
4096
4128
  }));
4097
4129
  var StyledPopper2 = styled13(Popper3, {
@@ -4117,6 +4149,32 @@ var DateRangePickerRoot = styled13("div", {
4117
4149
  })({
4118
4150
  width: "100%"
4119
4151
  });
4152
+ var validValueFormat2 = (value, format) => {
4153
+ try {
4154
+ const [date1Str, date2Str] = value.split(" - ");
4155
+ if (!date1Str || !date2Str) {
4156
+ return false;
4157
+ }
4158
+ const parsedDate1 = parseDate2(date1Str, format);
4159
+ const parsedDate2 = parseDate2(date2Str, format);
4160
+ if (parsedDate1.toString() === "Invalid Date" || parsedDate2.toString() === "Invalid Date") {
4161
+ return false;
4162
+ }
4163
+ const formattedValue = formatValueString2(
4164
+ [parsedDate1, parsedDate2],
4165
+ format
4166
+ );
4167
+ if (value !== formattedValue) {
4168
+ return false;
4169
+ }
4170
+ const regex = new RegExp(
4171
+ `^${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")} - ${format.replace(/Y/g, "\\d").replace(/M/g, "\\d").replace(/D/g, "\\d")}$`
4172
+ );
4173
+ return regex.test(value);
4174
+ } catch (e) {
4175
+ return false;
4176
+ }
4177
+ };
4120
4178
  var formatValueString2 = ([date1, date2], format) => {
4121
4179
  const getStr = (date) => {
4122
4180
  let day = `${date.getDate()}`;
@@ -4213,6 +4271,7 @@ var DateRangePicker = forwardRef8(
4213
4271
  sx,
4214
4272
  className,
4215
4273
  format = "YYYY/MM/DD",
4274
+ displayFormat = "YYYY/MM/DD",
4216
4275
  size,
4217
4276
  inputReadOnly,
4218
4277
  hideClearButton,
@@ -4229,12 +4288,27 @@ var DateRangePicker = forwardRef8(
4229
4288
  [props.name, onChange]
4230
4289
  )
4231
4290
  );
4291
+ const [displayValue, setDisplayValue] = useState7(
4292
+ () => value ? formatValueString2(parseDates(value, format), displayFormat) : ""
4293
+ );
4232
4294
  const [anchorEl, setAnchorEl] = useState7(null);
4233
4295
  const open = Boolean(anchorEl);
4234
4296
  const calendarValue = useMemo9(
4235
4297
  () => value ? parseDates(value, format) : void 0,
4236
4298
  [value, format]
4237
4299
  );
4300
+ useEffect6(() => {
4301
+ if (value) {
4302
+ try {
4303
+ const dates = parseDates(value, format);
4304
+ const newDisplayValue = formatValueString2(dates, displayFormat);
4305
+ setDisplayValue(newDisplayValue);
4306
+ } catch (error2) {
4307
+ }
4308
+ } else {
4309
+ setDisplayValue("");
4310
+ }
4311
+ }, [displayFormat, value, format]);
4238
4312
  useEffect6(() => {
4239
4313
  if (!anchorEl) {
4240
4314
  innerRef.current?.blur();
@@ -4245,9 +4319,41 @@ var DateRangePicker = forwardRef8(
4245
4319
  ]);
4246
4320
  const handleChange = useCallback10(
4247
4321
  (event) => {
4248
- setValue(event.target.value);
4322
+ const value2 = event.target.value;
4323
+ setDisplayValue(
4324
+ value2 ? formatValueString2(parseDates(value2, format), displayFormat) : value2
4325
+ );
4326
+ setValue(value2);
4249
4327
  },
4250
- [setValue]
4328
+ [displayFormat, format, setValue]
4329
+ );
4330
+ const handleDisplayInputChange = useCallback10(
4331
+ (event) => {
4332
+ if (event.target.value === "") {
4333
+ handleChange({
4334
+ target: {
4335
+ name: props.name,
4336
+ value: ""
4337
+ }
4338
+ });
4339
+ return;
4340
+ }
4341
+ const isValidDisplayValue = validValueFormat2(
4342
+ event.target.value,
4343
+ displayFormat
4344
+ );
4345
+ if (isValidDisplayValue) {
4346
+ const dates = parseDates(event.target.value, displayFormat);
4347
+ const formattedValue = formatValueString2(dates, format);
4348
+ handleChange({
4349
+ target: {
4350
+ name: props.name,
4351
+ value: formattedValue
4352
+ }
4353
+ });
4354
+ }
4355
+ },
4356
+ [displayFormat, format, handleChange, props.name]
4251
4357
  );
4252
4358
  const handleCalendarToggle = useCallback10(
4253
4359
  (event) => {
@@ -4259,10 +4365,26 @@ var DateRangePicker = forwardRef8(
4259
4365
  const handleCalendarChange = useCallback10(
4260
4366
  ([date1, date2]) => {
4261
4367
  if (!date1 || !date2) return;
4262
- setValue(formatValueString2([date1, date2], format));
4368
+ const formattedValue = formatValueString2([date1, date2], format);
4369
+ if (props.value !== void 0) {
4370
+ onChange?.({ target: { name: props.name, value: formattedValue } });
4371
+ } else {
4372
+ setDisplayValue(
4373
+ formatValueString2([date1, date2], displayFormat)
4374
+ );
4375
+ setValue(formattedValue);
4376
+ }
4263
4377
  setAnchorEl(null);
4264
4378
  },
4265
- [setValue, setAnchorEl, format]
4379
+ [
4380
+ props.value,
4381
+ props.name,
4382
+ onChange,
4383
+ setValue,
4384
+ setAnchorEl,
4385
+ format,
4386
+ displayFormat
4387
+ ]
4266
4388
  );
4267
4389
  const handleInputMouseDown = useCallback10(
4268
4390
  (event) => {
@@ -4280,17 +4402,21 @@ var DateRangePicker = forwardRef8(
4280
4402
  color: error ? "danger" : innerProps.color,
4281
4403
  ref,
4282
4404
  size,
4283
- value,
4284
- onChange: handleChange,
4405
+ value: displayValue,
4406
+ onChange: handleDisplayInputChange,
4285
4407
  disabled,
4286
4408
  required,
4287
- placeholder: `${format} - ${format}`,
4409
+ placeholder: `${displayFormat} - ${displayFormat}`,
4288
4410
  slotProps: {
4289
4411
  input: {
4290
4412
  component: TextMaskAdapter5,
4291
4413
  ref: innerRef,
4292
- format,
4293
- sx: { "&:hover": { cursor: inputReadOnly || readOnly ? "default" : "text" } },
4414
+ format: displayFormat,
4415
+ sx: {
4416
+ "&:hover": {
4417
+ cursor: inputReadOnly || readOnly ? "default" : "text"
4418
+ }
4419
+ },
4294
4420
  onMouseDown: handleInputMouseDown
4295
4421
  }
4296
4422
  },
@@ -4360,6 +4486,7 @@ var DateRangePicker = forwardRef8(
4360
4486
  color: "neutral",
4361
4487
  onClick: () => {
4362
4488
  setValue("");
4489
+ setDisplayValue("");
4363
4490
  setAnchorEl(null);
4364
4491
  }
4365
4492
  },
@@ -4478,159 +4605,988 @@ var InsetDrawer = styled18(JoyDrawer)(({ theme }) => ({
4478
4605
  }
4479
4606
  }));
4480
4607
 
4481
- // src/components/Uploader/Uploader.tsx
4482
- import React28, {
4483
- useCallback as useCallback11,
4484
- useEffect as useEffect7,
4485
- useMemo as useMemo10,
4486
- useRef as useRef6,
4487
- useState as useState8
4488
- } from "react";
4489
- import { styled as styled19, Input as Input2 } from "@mui/joy";
4490
- import MuiFileUploadIcon from "@mui/icons-material/CloudUploadRounded";
4491
- import MuiUploadFileIcon from "@mui/icons-material/UploadFileRounded";
4492
- import MuiClearIcon from "@mui/icons-material/ClearRounded";
4493
- var esmFiles = {
4494
- combine: import(
4495
- // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
4496
- "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/combine.js"
4497
- ),
4498
- adapter: import(
4499
- // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
4500
- "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/external/adapter.js"
4501
- ),
4502
- file: import(
4503
- // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
4504
- "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/external/file.js"
4505
- ),
4506
- preventUnhandled: import(
4507
- // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
4508
- "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/prevent-unhandled.js"
4509
- )
4510
- };
4511
- var VisuallyHiddenInput = styled19(Input2)({
4512
- width: "1px",
4513
- height: "1px",
4514
- overflow: "hidden",
4515
- whiteSpace: "nowrap",
4516
- clip: "rect(0 0 0 0)",
4517
- clipPath: "inset(50%)",
4518
- position: "absolute"
4519
- });
4520
- var PreviewRoot = styled19(Stack_default, {
4521
- name: "Uploader",
4522
- slot: "PreviewRoot"
4523
- })({});
4524
- var UploadCard = styled19(Card, {
4525
- name: "Uploader",
4526
- slot: "UploadCard"
4527
- })(({ theme }) => ({
4528
- padding: theme.spacing(2.5),
4529
- border: `1px solid ${theme.palette.neutral.outlinedBorder}`
4530
- }));
4531
- var UploadFileIcon = styled19(MuiUploadFileIcon, {
4532
- name: "Uploader",
4533
- slot: "UploadFileIcon"
4534
- })(({ theme }) => ({
4535
- color: theme.palette.neutral["400"],
4536
- width: "32px",
4537
- height: "32px"
4538
- }));
4539
- var ClearIcon2 = styled19(MuiClearIcon, {
4540
- name: "Uploader",
4541
- slot: "ClearIcon"
4542
- })(({ theme }) => ({
4543
- color: theme.palette.neutral.plainColor,
4544
- width: "18px",
4545
- height: "18px"
4546
- }));
4547
- var UNITS = [
4548
- "byte",
4549
- "kilobyte",
4550
- "megabyte",
4551
- "gigabyte",
4552
- "terabyte",
4553
- "petabyte"
4554
- ];
4555
- var ALL_EXTENSIONS_BY_TYPE = {
4556
- "image/*": [
4557
- ".jpeg",
4558
- ".jpg",
4559
- ".png",
4560
- ".gif",
4561
- ".bmp",
4562
- ".tiff",
4563
- ".svg",
4564
- ".webp",
4565
- ".heic",
4566
- ".ico"
4567
- ],
4568
- "audio/*": [
4569
- ".mp3",
4570
- ".wav",
4571
- ".flac",
4572
- ".aac",
4573
- ".ogg",
4574
- ".m4a",
4575
- ".wma",
4576
- ".aiff",
4577
- ".alac",
4578
- ".midi",
4579
- ".mp4"
4580
- ],
4581
- "video/*": [
4582
- ".mp4",
4583
- ".avi",
4584
- ".mkv",
4585
- ".mov",
4586
- ".wmv",
4587
- ".flv",
4588
- ".webm",
4589
- ".mpeg",
4590
- ".3gp",
4591
- ".m4v"
4592
- ]
4593
- };
4594
- var getFileSize = (n) => {
4595
- const i = n == 0 ? 0 : Math.floor(Math.log(n) / Math.log(1024));
4596
- const value = n / Math.pow(1024, i);
4597
- const unit = UNITS[i];
4598
- return Intl.NumberFormat("en-us", {
4599
- style: "unit",
4600
- unit,
4601
- unitDisplay: "narrow"
4602
- }).format(value);
4603
- };
4604
- var Preview = (props) => {
4605
- const { files, uploaded, onDelete } = props;
4606
- return /* @__PURE__ */ React28.createElement(PreviewRoot, { gap: 1 }, [...uploaded, ...files].map((file) => /* @__PURE__ */ React28.createElement(UploadCard, { key: file.name, size: "sm", color: "neutral" }, /* @__PURE__ */ React28.createElement(Stack_default, { direction: "row", alignItems: "center", gap: 2 }, /* @__PURE__ */ React28.createElement(UploadFileIcon, null), /* @__PURE__ */ React28.createElement(Stack_default, { flex: "1" }, /* @__PURE__ */ React28.createElement(Typography_default, { level: "body-sm", textColor: "common.black" }, file.name), !!file.size && /* @__PURE__ */ React28.createElement(
4608
+ // src/components/FilterMenu/FilterMenu.tsx
4609
+ import React37, { useCallback as useCallback19 } from "react";
4610
+ import { Button as Button2, Stack as Stack10 } from "@mui/joy";
4611
+
4612
+ // src/components/FilterMenu/components/CheckboxGroup.tsx
4613
+ import React28, { useCallback as useCallback11 } from "react";
4614
+ import { Stack as Stack2 } from "@mui/joy";
4615
+ function CheckboxGroup(props) {
4616
+ const { id, label, options, value, onChange, hidden } = props;
4617
+ const [internalValue, setInternalValue] = useControlledState(
4618
+ value,
4619
+ [],
4620
+ onChange
4621
+ );
4622
+ const handleCheckboxChange = useCallback11(
4623
+ (optionValue) => (event) => {
4624
+ const checked = event.target.checked;
4625
+ let newValue;
4626
+ if (checked) {
4627
+ newValue = [...internalValue, optionValue];
4628
+ } else {
4629
+ newValue = internalValue.filter((v) => v !== optionValue);
4630
+ }
4631
+ setInternalValue(newValue);
4632
+ },
4633
+ [internalValue, setInternalValue]
4634
+ );
4635
+ if (hidden) {
4636
+ return null;
4637
+ }
4638
+ return /* @__PURE__ */ React28.createElement(Stack2, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React28.createElement(
4607
4639
  Typography_default,
4608
4640
  {
4609
- level: "body-xs",
4610
- fontWeight: "300",
4611
- lineHeight: "1.33",
4641
+ id,
4642
+ level: "title-sm",
4643
+ component: "label",
4612
4644
  textColor: "text.tertiary"
4613
4645
  },
4614
- getFileSize(file.size)
4615
- )), /* @__PURE__ */ React28.createElement(IconButton_default, { onClick: () => onDelete?.(file) }, /* @__PURE__ */ React28.createElement(ClearIcon2, null))))));
4616
- };
4617
- var UploaderRoot = styled19(Stack_default, {
4618
- name: "Uploader",
4619
- slot: "root"
4620
- })(({ theme }) => ({
4621
- gap: theme.spacing(2)
4622
- }));
4623
- var FileDropZone = styled19(Sheet_default, {
4624
- name: "Uploader",
4625
- slot: "dropZone",
4626
- shouldForwardProp: (prop) => prop !== "error"
4627
- })(
4628
- ({ theme, state, error }) => ({
4629
- width: "100%",
4630
- display: "flex",
4631
- flexDirection: "column",
4632
- justifyContent: "center",
4633
- alignItems: "center",
4646
+ label
4647
+ ), options.map((option) => /* @__PURE__ */ React28.createElement(
4648
+ Checkbox_default,
4649
+ {
4650
+ key: `${id}-${option.value}`,
4651
+ label: option.label,
4652
+ checked: internalValue?.includes(option.value),
4653
+ onChange: handleCheckboxChange(option.value)
4654
+ }
4655
+ )));
4656
+ }
4657
+ CheckboxGroup.displayName = "CheckboxGroup";
4658
+
4659
+ // src/components/FilterMenu/components/RadioGroup.tsx
4660
+ import React29, { useCallback as useCallback12 } from "react";
4661
+
4662
+ // src/components/Radio/Radio.tsx
4663
+ import { Radio as JoyRadio, RadioGroup as JoyRadioGroup } from "@mui/joy";
4664
+ import { motion as motion26 } from "framer-motion";
4665
+ var MotionRadio = motion26(JoyRadio);
4666
+ var Radio = MotionRadio;
4667
+ Radio.displayName = "Radio";
4668
+ var MotionRadioGroup = motion26(JoyRadioGroup);
4669
+ var RadioGroup = MotionRadioGroup;
4670
+ RadioGroup.displayName = "RadioGroup";
4671
+
4672
+ // src/components/FilterMenu/components/RadioGroup.tsx
4673
+ import { Stack as Stack3 } from "@mui/joy";
4674
+ function RadioGroup2(props) {
4675
+ const { id, label, options, value, onChange, hidden } = props;
4676
+ const [internalValue, setInternalValue] = useControlledState(
4677
+ value,
4678
+ value ?? "",
4679
+ onChange
4680
+ );
4681
+ const handleRadioChange = useCallback12(
4682
+ (event) => {
4683
+ const newValue = event.target.value;
4684
+ const option = options.find((opt) => opt.value.toString() === newValue);
4685
+ const convertedValue = option ? option.value : newValue;
4686
+ setInternalValue(convertedValue);
4687
+ },
4688
+ [options, setInternalValue]
4689
+ );
4690
+ if (hidden) {
4691
+ return null;
4692
+ }
4693
+ return /* @__PURE__ */ React29.createElement(Stack3, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React29.createElement(Stack3, { spacing: 1 }, /* @__PURE__ */ React29.createElement(
4694
+ Typography_default,
4695
+ {
4696
+ id,
4697
+ level: "title-sm",
4698
+ component: "label",
4699
+ textColor: "text.tertiary"
4700
+ },
4701
+ label
4702
+ )), /* @__PURE__ */ React29.createElement(
4703
+ RadioGroup,
4704
+ {
4705
+ name: id,
4706
+ value: internalValue?.toString(),
4707
+ onChange: handleRadioChange
4708
+ },
4709
+ options.map((option) => /* @__PURE__ */ React29.createElement(
4710
+ Radio,
4711
+ {
4712
+ key: `${id}-${option.value}`,
4713
+ value: option.value.toString(),
4714
+ label: option.label
4715
+ }
4716
+ ))
4717
+ ));
4718
+ }
4719
+ RadioGroup2.displayName = "RadioGroup";
4720
+
4721
+ // src/components/FilterMenu/components/DateRange.tsx
4722
+ import React30, { useCallback as useCallback13, useMemo as useMemo10, useState as useState8, useEffect as useEffect7 } from "react";
4723
+ import { Stack as Stack4 } from "@mui/joy";
4724
+ function DateRange(props) {
4725
+ const {
4726
+ id,
4727
+ label,
4728
+ value,
4729
+ onChange,
4730
+ hidden,
4731
+ minDate,
4732
+ maxDate,
4733
+ disableFuture,
4734
+ disablePast,
4735
+ format = "YYYY/MM/DD",
4736
+ displayFormat,
4737
+ inputReadOnly,
4738
+ hideClearButton
4739
+ } = props;
4740
+ const [internalValue, setInternalValue] = useControlledState(
4741
+ value,
4742
+ null,
4743
+ onChange
4744
+ );
4745
+ const [selectedOption, setSelectedOption] = useState8("all-time");
4746
+ const dateRangeOptions = useMemo10(
4747
+ () => [
4748
+ { label: "All Time", value: "all-time" },
4749
+ { label: "This Month", value: "this-month" },
4750
+ { label: "This Year", value: "this-year" },
4751
+ { label: "Last Month", value: "last-month" },
4752
+ { label: "Custom", value: "custom" }
4753
+ ],
4754
+ []
4755
+ );
4756
+ const getDateRangeForOption = useCallback13(
4757
+ (option) => {
4758
+ const now = /* @__PURE__ */ new Date();
4759
+ const currentYear = now.getFullYear();
4760
+ const currentMonth = now.getMonth();
4761
+ const formatDate = (date) => {
4762
+ const year = date.getFullYear();
4763
+ const month = String(date.getMonth() + 1).padStart(2, "0");
4764
+ const day = String(date.getDate()).padStart(2, "0");
4765
+ return `${year}-${month}-${day}`;
4766
+ };
4767
+ switch (option) {
4768
+ case "all-time":
4769
+ return null;
4770
+ case "this-month": {
4771
+ const startOfMonth = new Date(currentYear, currentMonth, 1);
4772
+ const endOfMonth = new Date(currentYear, currentMonth + 1, 0);
4773
+ return [
4774
+ formatDate(startOfMonth),
4775
+ formatDate(endOfMonth)
4776
+ ];
4777
+ }
4778
+ case "this-year": {
4779
+ const startOfYear = new Date(currentYear, 0, 1);
4780
+ const endOfYear = new Date(currentYear, 11, 31);
4781
+ return [
4782
+ formatDate(startOfYear),
4783
+ formatDate(endOfYear)
4784
+ ];
4785
+ }
4786
+ case "last-month": {
4787
+ const lastMonthYear = currentMonth === 0 ? currentYear - 1 : currentYear;
4788
+ const lastMonth = currentMonth === 0 ? 11 : currentMonth - 1;
4789
+ const startOfLastMonth = new Date(lastMonthYear, lastMonth, 1);
4790
+ const endOfLastMonth = new Date(lastMonthYear, lastMonth + 1, 0);
4791
+ return [
4792
+ formatDate(startOfLastMonth),
4793
+ formatDate(endOfLastMonth)
4794
+ ];
4795
+ }
4796
+ case "custom":
4797
+ return internalValue;
4798
+ default:
4799
+ return null;
4800
+ }
4801
+ },
4802
+ [internalValue]
4803
+ );
4804
+ const determineOptionFromValue = useCallback13(
4805
+ (value2) => {
4806
+ if (!value2) {
4807
+ return "all-time";
4808
+ }
4809
+ const options = ["this-month", "this-year", "last-month"];
4810
+ for (const option of options) {
4811
+ const optionRange = getDateRangeForOption(option);
4812
+ if (optionRange && optionRange[0] === value2[0] && optionRange[1] === value2[1]) {
4813
+ return option;
4814
+ }
4815
+ }
4816
+ return "custom";
4817
+ },
4818
+ [getDateRangeForOption]
4819
+ );
4820
+ const customDateRangeValue = useMemo10(() => {
4821
+ if (selectedOption === "custom" && internalValue) {
4822
+ return `${internalValue[0]} - ${internalValue[1]}`;
4823
+ }
4824
+ return "";
4825
+ }, [selectedOption, internalValue]);
4826
+ useEffect7(() => {
4827
+ const newOption = determineOptionFromValue(internalValue);
4828
+ setSelectedOption(newOption);
4829
+ }, [internalValue, determineOptionFromValue]);
4830
+ const handleOptionChange = useCallback13(
4831
+ (event) => {
4832
+ const newOption = event.target.value;
4833
+ setSelectedOption(newOption);
4834
+ const newDateRange = getDateRangeForOption(newOption);
4835
+ setInternalValue(newDateRange);
4836
+ },
4837
+ [getDateRangeForOption, setInternalValue]
4838
+ );
4839
+ const handleCustomDateChange = useCallback13(
4840
+ (event) => {
4841
+ const dateRangeString = event.target.value;
4842
+ if (dateRangeString && dateRangeString.includes(" - ")) {
4843
+ const [startDate, endDate] = dateRangeString.split(" - ");
4844
+ if (startDate && endDate) {
4845
+ const newValue = [startDate, endDate];
4846
+ setInternalValue(newValue);
4847
+ }
4848
+ } else if (!dateRangeString) {
4849
+ setInternalValue(null);
4850
+ }
4851
+ },
4852
+ [setInternalValue]
4853
+ );
4854
+ if (hidden) {
4855
+ return null;
4856
+ }
4857
+ return /* @__PURE__ */ React30.createElement(Stack4, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React30.createElement(
4858
+ Typography_default,
4859
+ {
4860
+ id,
4861
+ level: "title-sm",
4862
+ component: "label",
4863
+ textColor: "text.tertiary"
4864
+ },
4865
+ label
4866
+ ), /* @__PURE__ */ React30.createElement(
4867
+ RadioGroup,
4868
+ {
4869
+ name: `${id}-options`,
4870
+ value: selectedOption,
4871
+ onChange: handleOptionChange
4872
+ },
4873
+ dateRangeOptions.map((option) => /* @__PURE__ */ React30.createElement(
4874
+ Radio,
4875
+ {
4876
+ key: `${id}-${option.value}`,
4877
+ value: option.value,
4878
+ label: option.label
4879
+ }
4880
+ ))
4881
+ ), selectedOption === "custom" && /* @__PURE__ */ React30.createElement(
4882
+ DateRangePicker,
4883
+ {
4884
+ value: customDateRangeValue,
4885
+ onChange: handleCustomDateChange,
4886
+ minDate,
4887
+ maxDate,
4888
+ disableFuture,
4889
+ disablePast,
4890
+ format,
4891
+ displayFormat,
4892
+ inputReadOnly,
4893
+ hideClearButton
4894
+ }
4895
+ ));
4896
+ }
4897
+ DateRange.displayName = "DateRange";
4898
+
4899
+ // src/components/FilterMenu/components/CurrencyInput.tsx
4900
+ import React31, { useCallback as useCallback14 } from "react";
4901
+ import { Stack as Stack5 } from "@mui/joy";
4902
+ function CurrencyInput3(props) {
4903
+ const {
4904
+ id,
4905
+ label,
4906
+ value,
4907
+ onChange,
4908
+ hidden,
4909
+ max,
4910
+ placeholder,
4911
+ useMinorUnit,
4912
+ currency = "USD"
4913
+ } = props;
4914
+ const [internalValue, setInternalValue] = useControlledState(
4915
+ value,
4916
+ value,
4917
+ onChange
4918
+ );
4919
+ const handleCurrencyChange = useCallback14(
4920
+ (event) => {
4921
+ const newValue = event.target.value;
4922
+ setInternalValue(newValue);
4923
+ },
4924
+ [setInternalValue]
4925
+ );
4926
+ if (hidden) {
4927
+ return null;
4928
+ }
4929
+ return /* @__PURE__ */ React31.createElement(Stack5, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React31.createElement(
4930
+ Typography_default,
4931
+ {
4932
+ id,
4933
+ level: "title-sm",
4934
+ component: "label",
4935
+ textColor: "text.tertiary"
4936
+ },
4937
+ label
4938
+ ), /* @__PURE__ */ React31.createElement(
4939
+ CurrencyInput,
4940
+ {
4941
+ value: internalValue,
4942
+ onChange: handleCurrencyChange,
4943
+ max,
4944
+ placeholder,
4945
+ useMinorUnit,
4946
+ currency,
4947
+ "aria-labelledby": label ? id : void 0
4948
+ }
4949
+ ));
4950
+ }
4951
+ CurrencyInput3.displayName = "CurrencyInput";
4952
+
4953
+ // src/components/FilterMenu/components/CurrencyRange.tsx
4954
+ import React32, { useCallback as useCallback15 } from "react";
4955
+ import { Stack as Stack6 } from "@mui/joy";
4956
+ function CurrencyRange(props) {
4957
+ const {
4958
+ id,
4959
+ label,
4960
+ value,
4961
+ onChange,
4962
+ hidden,
4963
+ max,
4964
+ placeholder,
4965
+ useMinorUnit,
4966
+ currency = "USD"
4967
+ } = props;
4968
+ const [internalValue, setInternalValue] = useControlledState(
4969
+ value,
4970
+ null,
4971
+ onChange
4972
+ );
4973
+ const minValue = internalValue?.[0];
4974
+ const maxValue = internalValue?.[1];
4975
+ const handleMinChange = useCallback15(
4976
+ (event) => {
4977
+ const newMinValue = event.target.value;
4978
+ const currentMaxValue = maxValue;
4979
+ if (newMinValue !== void 0 && currentMaxValue !== void 0) {
4980
+ setInternalValue([newMinValue, currentMaxValue]);
4981
+ } else if (newMinValue !== void 0) {
4982
+ setInternalValue([newMinValue, newMinValue]);
4983
+ } else {
4984
+ setInternalValue(null);
4985
+ }
4986
+ },
4987
+ [maxValue, setInternalValue]
4988
+ );
4989
+ const handleMaxChange = useCallback15(
4990
+ (event) => {
4991
+ const newMaxValue = event.target.value;
4992
+ const currentMinValue = minValue;
4993
+ if (currentMinValue !== void 0 && newMaxValue !== void 0) {
4994
+ setInternalValue([currentMinValue, newMaxValue]);
4995
+ } else if (newMaxValue !== void 0) {
4996
+ setInternalValue([newMaxValue, newMaxValue]);
4997
+ } else {
4998
+ setInternalValue(null);
4999
+ }
5000
+ },
5001
+ [minValue, setInternalValue]
5002
+ );
5003
+ if (hidden) {
5004
+ return null;
5005
+ }
5006
+ return /* @__PURE__ */ React32.createElement(Stack6, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React32.createElement(
5007
+ Typography_default,
5008
+ {
5009
+ id,
5010
+ level: "title-sm",
5011
+ component: "label",
5012
+ textColor: "text.tertiary"
5013
+ },
5014
+ label
5015
+ ), /* @__PURE__ */ React32.createElement(Stack6, { direction: "row", spacing: 2, alignItems: "flex-end" }, /* @__PURE__ */ React32.createElement(
5016
+ CurrencyInput,
5017
+ {
5018
+ label: "Minimum",
5019
+ value: minValue,
5020
+ onChange: handleMinChange,
5021
+ max,
5022
+ placeholder,
5023
+ useMinorUnit,
5024
+ currency,
5025
+ "aria-labelledby": label ? id : void 0,
5026
+ "aria-label": "Minimum amount"
5027
+ }
5028
+ ), /* @__PURE__ */ React32.createElement(
5029
+ CurrencyInput,
5030
+ {
5031
+ label: "Maximum",
5032
+ value: maxValue,
5033
+ onChange: handleMaxChange,
5034
+ max,
5035
+ placeholder,
5036
+ useMinorUnit,
5037
+ currency,
5038
+ "aria-labelledby": label ? id : void 0,
5039
+ "aria-label": "Maximum amount"
5040
+ }
5041
+ )));
5042
+ }
5043
+ CurrencyRange.displayName = "CurrencyRange";
5044
+
5045
+ // src/components/FilterMenu/components/PercentageInput.tsx
5046
+ import React34 from "react";
5047
+ import { Stack as Stack7, Typography as Typography2 } from "@mui/joy";
5048
+
5049
+ // src/components/PercentageInput/PercentageInput.tsx
5050
+ import React33, { useCallback as useCallback16, useMemo as useMemo11, useState as useState9 } from "react";
5051
+ import { NumericFormat as NumericFormat2 } from "react-number-format";
5052
+ import { styled as styled19, useThemeProps as useThemeProps6 } from "@mui/joy";
5053
+ var padDecimal = (value, decimalScale) => {
5054
+ const [integer, decimal = ""] = `${value}`.split(".");
5055
+ return Number(`${integer}${decimal.padEnd(decimalScale, "0")}`);
5056
+ };
5057
+ var TextMaskAdapter7 = React33.forwardRef(
5058
+ function TextMaskAdapter8(props, ref) {
5059
+ const { onChange, min, max, ...innerProps } = props;
5060
+ return /* @__PURE__ */ React33.createElement(
5061
+ NumericFormat2,
5062
+ {
5063
+ ...innerProps,
5064
+ onValueChange: ({ value }) => {
5065
+ onChange?.({
5066
+ target: {
5067
+ name: props.name,
5068
+ value
5069
+ }
5070
+ });
5071
+ },
5072
+ valueIsNumericString: true,
5073
+ thousandSeparator: true,
5074
+ suffix: "%",
5075
+ getInputRef: ref,
5076
+ allowNegative: true
5077
+ }
5078
+ );
5079
+ }
5080
+ );
5081
+ var PercentageInputRoot = styled19(Input_default, {
5082
+ name: "PercentageInput",
5083
+ slot: "Root",
5084
+ overridesResolver: (props, styles) => styles.root
5085
+ })({});
5086
+ var PercentageInput = React33.forwardRef(function PercentageInput2(inProps, ref) {
5087
+ const props = useThemeProps6({ props: inProps, name: "PercentageInput" });
5088
+ const {
5089
+ name,
5090
+ onChange,
5091
+ label,
5092
+ error,
5093
+ helperText,
5094
+ required,
5095
+ disabled,
5096
+ useMinorUnit,
5097
+ maxDecimalScale = 0,
5098
+ min,
5099
+ max,
5100
+ // NOTE: 스타일 관련된 props는 최상위 엘리먼트에 적용한다.
5101
+ sx,
5102
+ className,
5103
+ ...innerProps
5104
+ } = props;
5105
+ const [_value, setValue] = useControlledState(
5106
+ props.value,
5107
+ props.defaultValue,
5108
+ useCallback16(
5109
+ (value2) => onChange?.({ target: { name, value: value2 } }),
5110
+ [onChange, name]
5111
+ )
5112
+ );
5113
+ const [internalError, setInternalError] = useState9(
5114
+ max && _value && _value > max || min && _value && _value < min
5115
+ );
5116
+ const value = useMemo11(() => {
5117
+ if (_value && useMinorUnit) {
5118
+ return _value / Math.pow(10, maxDecimalScale);
5119
+ }
5120
+ return _value;
5121
+ }, [_value, useMinorUnit, maxDecimalScale]);
5122
+ const handleChange = useCallback16(
5123
+ (event) => {
5124
+ if (event.target.value === "") {
5125
+ setValue(void 0);
5126
+ return;
5127
+ }
5128
+ const originalAmount = Number(event.target.value);
5129
+ if (min && originalAmount < min || max && originalAmount > max) {
5130
+ setInternalError(true);
5131
+ } else {
5132
+ setInternalError(false);
5133
+ }
5134
+ const amount = useMinorUnit ? padDecimal(originalAmount, maxDecimalScale) : originalAmount;
5135
+ setValue(amount);
5136
+ },
5137
+ [setValue, useMinorUnit, maxDecimalScale, min, max]
5138
+ );
5139
+ return /* @__PURE__ */ React33.createElement(
5140
+ PercentageInputRoot,
5141
+ {
5142
+ ...innerProps,
5143
+ ref,
5144
+ value,
5145
+ onChange: handleChange,
5146
+ error: internalError || error,
5147
+ disabled,
5148
+ required,
5149
+ color: internalError || error ? "danger" : props.color,
5150
+ label,
5151
+ helperText,
5152
+ slotProps: {
5153
+ input: {
5154
+ component: TextMaskAdapter7,
5155
+ "aria-label": innerProps["aria-label"],
5156
+ decimalScale: maxDecimalScale
5157
+ }
5158
+ },
5159
+ sx: {
5160
+ ...sx
5161
+ },
5162
+ className
5163
+ }
5164
+ );
5165
+ });
5166
+ PercentageInput.displayName = "PercentageInput";
5167
+
5168
+ // src/components/FilterMenu/components/PercentageInput.tsx
5169
+ var PercentageInput3 = ({
5170
+ id,
5171
+ hidden,
5172
+ label,
5173
+ value,
5174
+ onChange,
5175
+ placeholder,
5176
+ useMinorUnit,
5177
+ maxDecimalScale,
5178
+ min,
5179
+ max
5180
+ }) => {
5181
+ const [_value, setValue] = useControlledState(value, void 0, onChange);
5182
+ if (hidden) {
5183
+ return null;
5184
+ }
5185
+ return /* @__PURE__ */ React34.createElement(Stack7, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React34.createElement(
5186
+ Typography2,
5187
+ {
5188
+ id,
5189
+ level: "title-sm",
5190
+ component: "label",
5191
+ textColor: "text.tertiary"
5192
+ },
5193
+ label
5194
+ ), /* @__PURE__ */ React34.createElement(
5195
+ PercentageInput,
5196
+ {
5197
+ value: _value,
5198
+ onChange: (event) => setValue(event.target.value),
5199
+ useMinorUnit,
5200
+ maxDecimalScale,
5201
+ min,
5202
+ max,
5203
+ placeholder
5204
+ }
5205
+ ));
5206
+ };
5207
+
5208
+ // src/components/FilterMenu/components/PercentageRange.tsx
5209
+ import React35, { useCallback as useCallback17 } from "react";
5210
+ import { Stack as Stack8 } from "@mui/joy";
5211
+ function PercentageRange(props) {
5212
+ const {
5213
+ id,
5214
+ label,
5215
+ value,
5216
+ onChange,
5217
+ hidden,
5218
+ useMinorUnit,
5219
+ maxDecimalScale,
5220
+ min,
5221
+ max
5222
+ } = props;
5223
+ const [internalValue, setInternalValue] = useControlledState(value, null, onChange);
5224
+ const minValue = internalValue?.[0];
5225
+ const maxValue = internalValue?.[1];
5226
+ const handleMinChange = useCallback17(
5227
+ (event) => {
5228
+ const newMinValue = event.target.value;
5229
+ const currentMaxValue = maxValue;
5230
+ if (newMinValue !== void 0) {
5231
+ setInternalValue([newMinValue, currentMaxValue || null]);
5232
+ } else {
5233
+ setInternalValue(null);
5234
+ }
5235
+ },
5236
+ [maxValue, setInternalValue]
5237
+ );
5238
+ const handleMaxChange = useCallback17(
5239
+ (event) => {
5240
+ const newMaxValue = event.target.value;
5241
+ const currentMinValue = minValue;
5242
+ if (newMaxValue !== void 0) {
5243
+ setInternalValue([currentMinValue || null, newMaxValue]);
5244
+ } else {
5245
+ setInternalValue(null);
5246
+ }
5247
+ },
5248
+ [minValue, setInternalValue]
5249
+ );
5250
+ if (hidden) {
5251
+ return null;
5252
+ }
5253
+ return /* @__PURE__ */ React35.createElement(Stack8, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React35.createElement(
5254
+ Typography_default,
5255
+ {
5256
+ id,
5257
+ level: "title-sm",
5258
+ component: "label",
5259
+ textColor: "text.tertiary"
5260
+ },
5261
+ label
5262
+ ), /* @__PURE__ */ React35.createElement(Stack8, { direction: "row", spacing: 2, alignItems: "flex-end" }, /* @__PURE__ */ React35.createElement(
5263
+ PercentageInput,
5264
+ {
5265
+ label: "Minimum",
5266
+ value: minValue ?? void 0,
5267
+ onChange: handleMinChange,
5268
+ useMinorUnit,
5269
+ maxDecimalScale,
5270
+ min,
5271
+ max,
5272
+ "aria-labelledby": label ? id : void 0,
5273
+ "aria-label": "Minimum percentage",
5274
+ placeholder: "0%"
5275
+ }
5276
+ ), /* @__PURE__ */ React35.createElement(
5277
+ PercentageInput,
5278
+ {
5279
+ label: "Maximum",
5280
+ value: maxValue ?? void 0,
5281
+ onChange: handleMaxChange,
5282
+ useMinorUnit,
5283
+ maxDecimalScale,
5284
+ min,
5285
+ max,
5286
+ "aria-labelledby": label ? id : void 0,
5287
+ "aria-label": "Maximum percentage",
5288
+ placeholder: "0%"
5289
+ }
5290
+ )));
5291
+ }
5292
+ PercentageRange.displayName = "PercentageRange";
5293
+
5294
+ // src/components/FilterMenu/components/Autocomplete.tsx
5295
+ import React36, { useCallback as useCallback18 } from "react";
5296
+ import { Stack as Stack9 } from "@mui/joy";
5297
+ function Autocomplete2(props) {
5298
+ const { id, label, value, onChange, options, multiple, hidden, placeholder } = props;
5299
+ const [internalValue, setInternalValue] = useControlledState(
5300
+ value,
5301
+ void 0,
5302
+ onChange
5303
+ );
5304
+ const autocompleteValue = typeof internalValue === "string" || typeof internalValue === "number" ? String(internalValue) : void 0;
5305
+ const handleChange = useCallback18(
5306
+ (event) => {
5307
+ const val = event.target.value;
5308
+ if (val) {
5309
+ const numVal = Number(val);
5310
+ setInternalValue(!isNaN(numVal) && isFinite(numVal) ? numVal : val);
5311
+ } else {
5312
+ setInternalValue(void 0);
5313
+ }
5314
+ },
5315
+ [setInternalValue]
5316
+ );
5317
+ if (hidden) {
5318
+ return null;
5319
+ }
5320
+ return /* @__PURE__ */ React36.createElement(Stack9, { spacing: 3, role: "group", "aria-labelledby": id }, !!label && /* @__PURE__ */ React36.createElement(
5321
+ Typography_default,
5322
+ {
5323
+ id,
5324
+ level: "title-sm",
5325
+ component: "label",
5326
+ textColor: "text.tertiary"
5327
+ },
5328
+ label
5329
+ ), /* @__PURE__ */ React36.createElement(
5330
+ Autocomplete,
5331
+ {
5332
+ value: autocompleteValue,
5333
+ onChange: handleChange,
5334
+ options,
5335
+ multiple,
5336
+ placeholder,
5337
+ "aria-labelledby": label ? id : void 0
5338
+ }
5339
+ ));
5340
+ }
5341
+ Autocomplete2.displayName = "Autocomplete";
5342
+
5343
+ // src/components/FilterMenu/FilterMenu.tsx
5344
+ var componentMap = {
5345
+ "checkbox-group": CheckboxGroup,
5346
+ "radio-group": RadioGroup2,
5347
+ "date-range": DateRange,
5348
+ "currency-input": CurrencyInput3,
5349
+ "currency-range": CurrencyRange,
5350
+ "percentage-input": PercentageInput3,
5351
+ "percentage-range": PercentageRange,
5352
+ autocomplete: Autocomplete2
5353
+ };
5354
+ function FilterMenu(props) {
5355
+ const {
5356
+ filters,
5357
+ values,
5358
+ defaultValues,
5359
+ resetValues = {},
5360
+ onChange,
5361
+ onClose,
5362
+ useClear,
5363
+ useReset
5364
+ } = props;
5365
+ const [internalValues, setInternalValues] = useControlledState(
5366
+ values,
5367
+ defaultValues || {},
5368
+ void 0
5369
+ // onChange는 Apply 버튼에서만 호출
5370
+ );
5371
+ const handleFilterChange = useCallback19(
5372
+ (filterId, value) => {
5373
+ setInternalValues((prev) => ({
5374
+ ...prev,
5375
+ [filterId]: value
5376
+ }));
5377
+ },
5378
+ [setInternalValues]
5379
+ );
5380
+ const handleApply = useCallback19(() => {
5381
+ onChange?.(internalValues);
5382
+ onClose?.();
5383
+ }, [onChange, onClose, internalValues]);
5384
+ const handleClear = useCallback19(() => {
5385
+ const clearedValues = resetValues || {};
5386
+ setInternalValues(clearedValues);
5387
+ onChange?.(clearedValues);
5388
+ onClose?.();
5389
+ }, [resetValues, setInternalValues, onChange, onClose]);
5390
+ return /* @__PURE__ */ React37.createElement(
5391
+ ModalDialog,
5392
+ {
5393
+ sx: {
5394
+ position: "relative",
5395
+ transform: "none",
5396
+ left: "initial",
5397
+ top: "initial"
5398
+ }
5399
+ },
5400
+ /* @__PURE__ */ React37.createElement(DialogContent, { sx: { paddingTop: 5 } }, /* @__PURE__ */ React37.createElement(Stack10, { spacing: 6 }, filters?.map((filter) => {
5401
+ const FilterComponent = componentMap[filter.type];
5402
+ return FilterComponent ? /* @__PURE__ */ React37.createElement(
5403
+ FilterComponent,
5404
+ {
5405
+ key: filter.id,
5406
+ ...filter,
5407
+ value: internalValues[filter.id],
5408
+ onChange: (value) => {
5409
+ handleFilterChange(filter.id, value);
5410
+ }
5411
+ }
5412
+ ) : null;
5413
+ }))),
5414
+ /* @__PURE__ */ React37.createElement(DialogActions, { sx: { justifyContent: "space-between" } }, useClear && filters?.length === 1 && /* @__PURE__ */ React37.createElement(
5415
+ Button2,
5416
+ {
5417
+ variant: "plain",
5418
+ color: "neutral",
5419
+ size: "md",
5420
+ onClick: handleClear
5421
+ },
5422
+ "Clear"
5423
+ ), useReset && !useClear && /* @__PURE__ */ React37.createElement(
5424
+ Button2,
5425
+ {
5426
+ variant: "plain",
5427
+ color: "neutral",
5428
+ size: "md",
5429
+ onClick: handleClear
5430
+ },
5431
+ "Reset"
5432
+ ), /* @__PURE__ */ React37.createElement(Button2, { variant: "solid", color: "primary", size: "md", onClick: handleApply }, "Apply"))
5433
+ );
5434
+ }
5435
+ FilterMenu.displayName = "FilterMenu";
5436
+
5437
+ // src/components/Uploader/Uploader.tsx
5438
+ import React38, {
5439
+ useCallback as useCallback20,
5440
+ useEffect as useEffect8,
5441
+ useMemo as useMemo12,
5442
+ useRef as useRef6,
5443
+ useState as useState10
5444
+ } from "react";
5445
+ import { styled as styled20, Input as Input2 } from "@mui/joy";
5446
+ import MuiFileUploadIcon from "@mui/icons-material/CloudUploadRounded";
5447
+ import MuiUploadFileIcon from "@mui/icons-material/UploadFileRounded";
5448
+ import MuiClearIcon from "@mui/icons-material/ClearRounded";
5449
+ var esmFiles = {
5450
+ combine: import(
5451
+ // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
5452
+ "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/combine.js"
5453
+ ),
5454
+ adapter: import(
5455
+ // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
5456
+ "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/external/adapter.js"
5457
+ ),
5458
+ file: import(
5459
+ // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
5460
+ "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/external/file.js"
5461
+ ),
5462
+ preventUnhandled: import(
5463
+ // @ts-ignore: build된 pragmatic-drag-and-drop의 esm file에 extension이 없어서 에러가 발생함. 따라서 빌드된 js파일을 direct로 import한다.
5464
+ "@atlaskit/pragmatic-drag-and-drop/dist/esm/entry-point/prevent-unhandled.js"
5465
+ )
5466
+ };
5467
+ var VisuallyHiddenInput = styled20(Input2)({
5468
+ width: "1px",
5469
+ height: "1px",
5470
+ overflow: "hidden",
5471
+ whiteSpace: "nowrap",
5472
+ clip: "rect(0 0 0 0)",
5473
+ clipPath: "inset(50%)",
5474
+ position: "absolute"
5475
+ });
5476
+ var PreviewRoot = styled20(Stack_default, {
5477
+ name: "Uploader",
5478
+ slot: "PreviewRoot"
5479
+ })({});
5480
+ var UploadCard = styled20(Card, {
5481
+ name: "Uploader",
5482
+ slot: "UploadCard"
5483
+ })(({ theme }) => ({
5484
+ padding: theme.spacing(2.5),
5485
+ border: `1px solid ${theme.palette.neutral.outlinedBorder}`
5486
+ }));
5487
+ var UploadFileIcon = styled20(MuiUploadFileIcon, {
5488
+ name: "Uploader",
5489
+ slot: "UploadFileIcon"
5490
+ })(({ theme }) => ({
5491
+ color: theme.palette.neutral["400"],
5492
+ width: "32px",
5493
+ height: "32px"
5494
+ }));
5495
+ var ClearIcon2 = styled20(MuiClearIcon, {
5496
+ name: "Uploader",
5497
+ slot: "ClearIcon"
5498
+ })(({ theme }) => ({
5499
+ color: theme.palette.neutral.plainColor,
5500
+ width: "18px",
5501
+ height: "18px"
5502
+ }));
5503
+ var UNITS = [
5504
+ "byte",
5505
+ "kilobyte",
5506
+ "megabyte",
5507
+ "gigabyte",
5508
+ "terabyte",
5509
+ "petabyte"
5510
+ ];
5511
+ var ALL_EXTENSIONS_BY_TYPE = {
5512
+ "image/*": [
5513
+ ".jpeg",
5514
+ ".jpg",
5515
+ ".png",
5516
+ ".gif",
5517
+ ".bmp",
5518
+ ".tiff",
5519
+ ".svg",
5520
+ ".webp",
5521
+ ".heic",
5522
+ ".ico"
5523
+ ],
5524
+ "audio/*": [
5525
+ ".mp3",
5526
+ ".wav",
5527
+ ".flac",
5528
+ ".aac",
5529
+ ".ogg",
5530
+ ".m4a",
5531
+ ".wma",
5532
+ ".aiff",
5533
+ ".alac",
5534
+ ".midi",
5535
+ ".mp4"
5536
+ ],
5537
+ "video/*": [
5538
+ ".mp4",
5539
+ ".avi",
5540
+ ".mkv",
5541
+ ".mov",
5542
+ ".wmv",
5543
+ ".flv",
5544
+ ".webm",
5545
+ ".mpeg",
5546
+ ".3gp",
5547
+ ".m4v"
5548
+ ]
5549
+ };
5550
+ var getFileSize = (n) => {
5551
+ const i = n == 0 ? 0 : Math.floor(Math.log(n) / Math.log(1024));
5552
+ const value = n / Math.pow(1024, i);
5553
+ const unit = UNITS[i];
5554
+ return Intl.NumberFormat("en-us", {
5555
+ style: "unit",
5556
+ unit,
5557
+ unitDisplay: "narrow"
5558
+ }).format(value);
5559
+ };
5560
+ var Preview = (props) => {
5561
+ const { files, uploaded, onDelete } = props;
5562
+ return /* @__PURE__ */ React38.createElement(PreviewRoot, { gap: 1 }, [...uploaded, ...files].map((file) => /* @__PURE__ */ React38.createElement(UploadCard, { key: file.name, size: "sm", color: "neutral" }, /* @__PURE__ */ React38.createElement(Stack_default, { direction: "row", alignItems: "center", gap: 2 }, /* @__PURE__ */ React38.createElement(UploadFileIcon, null), /* @__PURE__ */ React38.createElement(Stack_default, { flex: "1" }, /* @__PURE__ */ React38.createElement(Typography_default, { level: "body-sm", textColor: "common.black" }, file.name), !!file.size && /* @__PURE__ */ React38.createElement(
5563
+ Typography_default,
5564
+ {
5565
+ level: "body-xs",
5566
+ fontWeight: "300",
5567
+ lineHeight: "1.33",
5568
+ textColor: "text.tertiary"
5569
+ },
5570
+ getFileSize(file.size)
5571
+ )), /* @__PURE__ */ React38.createElement(IconButton_default, { onClick: () => onDelete?.(file) }, /* @__PURE__ */ React38.createElement(ClearIcon2, null))))));
5572
+ };
5573
+ var UploaderRoot = styled20(Stack_default, {
5574
+ name: "Uploader",
5575
+ slot: "root"
5576
+ })(({ theme }) => ({
5577
+ gap: theme.spacing(2)
5578
+ }));
5579
+ var FileDropZone = styled20(Sheet_default, {
5580
+ name: "Uploader",
5581
+ slot: "dropZone",
5582
+ shouldForwardProp: (prop) => prop !== "error"
5583
+ })(
5584
+ ({ theme, state, error }) => ({
5585
+ width: "100%",
5586
+ display: "flex",
5587
+ flexDirection: "column",
5588
+ justifyContent: "center",
5589
+ alignItems: "center",
4634
5590
  padding: theme.spacing(5),
4635
5591
  gap: theme.spacing(4),
4636
5592
  cursor: "pointer",
@@ -4638,7 +5594,7 @@ var FileDropZone = styled19(Sheet_default, {
4638
5594
  border: error ? `1px solid ${theme.palette.danger.outlinedBorder}` : state === "idle" ? `1px solid ${theme.palette.neutral.outlinedBorder}` : `1px solid ${theme.palette.primary.outlinedBorder}`
4639
5595
  })
4640
5596
  );
4641
- var UploaderIcon = styled19(MuiFileUploadIcon, {
5597
+ var UploaderIcon = styled20(MuiFileUploadIcon, {
4642
5598
  name: "Uploader",
4643
5599
  slot: "iconContainer",
4644
5600
  shouldForwardProp: (prop) => prop !== "error"
@@ -4649,7 +5605,7 @@ var UploaderIcon = styled19(MuiFileUploadIcon, {
4649
5605
  height: "32px"
4650
5606
  })
4651
5607
  );
4652
- var Uploader = React28.memo(
5608
+ var Uploader = React38.memo(
4653
5609
  (props) => {
4654
5610
  const {
4655
5611
  accept,
@@ -4666,17 +5622,17 @@ var Uploader = React28.memo(
4666
5622
  } = props;
4667
5623
  const dropZoneRef = useRef6(null);
4668
5624
  const inputRef = useRef6(null);
4669
- const [errorText, setErrorText] = useState8();
4670
- const [files, setFiles] = useState8([]);
4671
- const [uploaded, setUploaded] = useState8(
5625
+ const [errorText, setErrorText] = useState10();
5626
+ const [files, setFiles] = useState10([]);
5627
+ const [uploaded, setUploaded] = useState10(
4672
5628
  props.uploaded || []
4673
5629
  );
4674
- const [previewState, setPreviewState] = useState8("idle");
4675
- const accepts = useMemo10(
5630
+ const [previewState, setPreviewState] = useState10("idle");
5631
+ const accepts = useMemo12(
4676
5632
  () => accept.split(",").map((accept2) => accept2.trim()),
4677
5633
  [accept]
4678
5634
  );
4679
- const parsedAccepts = useMemo10(
5635
+ const parsedAccepts = useMemo12(
4680
5636
  () => accepts.flatMap((type) => {
4681
5637
  if (["image/*", "video/*", "audio/*"].includes(type)) {
4682
5638
  return ALL_EXTENSIONS_BY_TYPE[type];
@@ -4685,7 +5641,7 @@ var Uploader = React28.memo(
4685
5641
  }),
4686
5642
  [accepts]
4687
5643
  );
4688
- const helperText = useMemo10(() => {
5644
+ const helperText = useMemo12(() => {
4689
5645
  const [allAcceptedTypes, acceptedTypes] = [
4690
5646
  accepts.filter(
4691
5647
  (accept2) => ["image/*", "video/*", "audio/*"].includes(accept2)
@@ -4718,15 +5674,15 @@ var Uploader = React28.memo(
4718
5674
  }
4719
5675
  return helperTexts.join(", ");
4720
5676
  }, [accepts, maxFileTotalSize, maxCount]);
4721
- const error = useMemo10(
5677
+ const error = useMemo12(
4722
5678
  () => !!errorText || props.error,
4723
5679
  [props.error, errorText]
4724
5680
  );
4725
- const showDropZone = useMemo10(
5681
+ const showDropZone = useMemo12(
4726
5682
  () => !maxCount || maxCount && [...uploaded, ...files].length !== maxCount,
4727
5683
  [files, maxCount, uploaded]
4728
5684
  );
4729
- const addFiles = useCallback11(
5685
+ const addFiles = useCallback20(
4730
5686
  (uploads) => {
4731
5687
  try {
4732
5688
  const types = parsedAccepts.map((type) => type.replace(".", "")) || [];
@@ -4783,7 +5739,7 @@ var Uploader = React28.memo(
4783
5739
  onChange
4784
5740
  ]
4785
5741
  );
4786
- useEffect7(() => {
5742
+ useEffect8(() => {
4787
5743
  if (!dropZoneRef.current || disabled) {
4788
5744
  return;
4789
5745
  }
@@ -4831,7 +5787,7 @@ var Uploader = React28.memo(
4831
5787
  );
4832
5788
  return () => cleanup?.();
4833
5789
  }, [disabled, addFiles]);
4834
- useEffect7(() => {
5790
+ useEffect8(() => {
4835
5791
  if (inputRef.current && minCount) {
4836
5792
  if (files.length < minCount) {
4837
5793
  inputRef.current.setCustomValidity(
@@ -4842,14 +5798,14 @@ var Uploader = React28.memo(
4842
5798
  }
4843
5799
  }
4844
5800
  }, [inputRef, files, minCount]);
4845
- const handleFileChanged = useCallback11(
5801
+ const handleFileChanged = useCallback20(
4846
5802
  (event) => {
4847
5803
  const files2 = Array.from(event.target.files || []);
4848
5804
  addFiles(files2);
4849
5805
  },
4850
5806
  [addFiles]
4851
5807
  );
4852
- const handleDeleteFile = useCallback11(
5808
+ const handleDeleteFile = useCallback20(
4853
5809
  (deletedFile) => {
4854
5810
  if (deletedFile instanceof File) {
4855
5811
  setFiles((current) => {
@@ -4871,10 +5827,10 @@ var Uploader = React28.memo(
4871
5827
  },
4872
5828
  [name, onChange, onDelete]
4873
5829
  );
4874
- const handleUploaderButtonClick = useCallback11(() => {
5830
+ const handleUploaderButtonClick = useCallback20(() => {
4875
5831
  inputRef.current?.click();
4876
5832
  }, []);
4877
- const uploader = /* @__PURE__ */ React28.createElement(
5833
+ const uploader = /* @__PURE__ */ React38.createElement(
4878
5834
  FileDropZone,
4879
5835
  {
4880
5836
  state: previewState,
@@ -4882,8 +5838,8 @@ var Uploader = React28.memo(
4882
5838
  ref: dropZoneRef,
4883
5839
  onClick: handleUploaderButtonClick
4884
5840
  },
4885
- /* @__PURE__ */ React28.createElement(Stack_default, { alignItems: "center", gap: 1 }, /* @__PURE__ */ React28.createElement(UploaderIcon, { state: previewState, error: !!(error || errorText) })),
4886
- /* @__PURE__ */ React28.createElement(
5841
+ /* @__PURE__ */ React38.createElement(Stack_default, { alignItems: "center", gap: 1 }, /* @__PURE__ */ React38.createElement(UploaderIcon, { state: previewState, error: !!(error || errorText) })),
5842
+ /* @__PURE__ */ React38.createElement(
4887
5843
  VisuallyHiddenInput,
4888
5844
  {
4889
5845
  disabled,
@@ -4908,7 +5864,7 @@ var Uploader = React28.memo(
4908
5864
  }
4909
5865
  )
4910
5866
  );
4911
- return /* @__PURE__ */ React28.createElement(UploaderRoot, null, showDropZone && /* @__PURE__ */ React28.createElement(
5867
+ return /* @__PURE__ */ React38.createElement(UploaderRoot, null, showDropZone && /* @__PURE__ */ React38.createElement(
4912
5868
  FormControl_default,
4913
5869
  {
4914
5870
  size,
@@ -4916,10 +5872,10 @@ var Uploader = React28.memo(
4916
5872
  disabled,
4917
5873
  required: !!minCount
4918
5874
  },
4919
- label && /* @__PURE__ */ React28.createElement(FormLabel_default, null, label),
5875
+ label && /* @__PURE__ */ React38.createElement(FormLabel_default, null, label),
4920
5876
  uploader,
4921
- /* @__PURE__ */ React28.createElement(FormHelperText_default, null, /* @__PURE__ */ React28.createElement(Stack_default, null, errorText && /* @__PURE__ */ React28.createElement("div", null, errorText), /* @__PURE__ */ React28.createElement("div", null, helperText)))
4922
- ), [...uploaded, ...files].length > 0 && /* @__PURE__ */ React28.createElement(
5877
+ /* @__PURE__ */ React38.createElement(FormHelperText_default, null, /* @__PURE__ */ React38.createElement(Stack_default, null, errorText && /* @__PURE__ */ React38.createElement("div", null, errorText), /* @__PURE__ */ React38.createElement("div", null, helperText)))
5878
+ ), [...uploaded, ...files].length > 0 && /* @__PURE__ */ React38.createElement(
4923
5879
  Preview,
4924
5880
  {
4925
5881
  files,
@@ -4935,7 +5891,7 @@ Uploader.displayName = "Uploader";
4935
5891
  import { Grid } from "@mui/joy";
4936
5892
 
4937
5893
  // src/components/IconMenuButton/IconMenuButton.tsx
4938
- import React29 from "react";
5894
+ import React39 from "react";
4939
5895
  import {
4940
5896
  MenuButton as JoyMenuButton2,
4941
5897
  IconButton as JoyIconButton2
@@ -4952,7 +5908,7 @@ function IconMenuButton(props) {
4952
5908
  placement = "bottom"
4953
5909
  } = props;
4954
5910
  if (!items.length) {
4955
- return /* @__PURE__ */ React29.createElement(
5911
+ return /* @__PURE__ */ React39.createElement(
4956
5912
  JoyIconButton2,
4957
5913
  {
4958
5914
  component: props.buttonComponent ?? "button",
@@ -4966,7 +5922,7 @@ function IconMenuButton(props) {
4966
5922
  icon
4967
5923
  );
4968
5924
  }
4969
- return /* @__PURE__ */ React29.createElement(Dropdown_default, null, /* @__PURE__ */ React29.createElement(
5925
+ return /* @__PURE__ */ React39.createElement(Dropdown_default, null, /* @__PURE__ */ React39.createElement(
4970
5926
  JoyMenuButton2,
4971
5927
  {
4972
5928
  slots: { root: JoyIconButton2 },
@@ -4983,7 +5939,7 @@ function IconMenuButton(props) {
4983
5939
  }
4984
5940
  },
4985
5941
  icon
4986
- ), /* @__PURE__ */ React29.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React29.createElement(
5942
+ ), /* @__PURE__ */ React39.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React39.createElement(
4987
5943
  MenuItem,
4988
5944
  {
4989
5945
  key: i.text,
@@ -4996,14 +5952,14 @@ function IconMenuButton(props) {
4996
5952
  IconMenuButton.displayName = "IconMenuButton";
4997
5953
 
4998
5954
  // src/components/Markdown/Markdown.tsx
4999
- import React30, { lazy, Suspense, useEffect as useEffect8, useState as useState9 } from "react";
5955
+ import React40, { lazy, Suspense, useEffect as useEffect9, useState as useState11 } from "react";
5000
5956
  import { Skeleton } from "@mui/joy";
5001
5957
  import { Link as Link2 } from "@mui/joy";
5002
5958
  import remarkGfm from "remark-gfm";
5003
5959
  var LazyReactMarkdown = lazy(() => import("react-markdown"));
5004
5960
  var Markdown = (props) => {
5005
- const [rehypeAccent2, setRehypeAccent] = useState9(null);
5006
- useEffect8(() => {
5961
+ const [rehypeAccent2, setRehypeAccent] = useState11(null);
5962
+ useEffect9(() => {
5007
5963
  const loadRehypeAccent = async () => {
5008
5964
  const module = await Promise.resolve().then(() => (init_rehype_accent(), rehype_accent_exports));
5009
5965
  setRehypeAccent(() => module.rehypeAccent);
@@ -5025,7 +5981,7 @@ var Markdown = (props) => {
5025
5981
  if (!rehypeAccent2) {
5026
5982
  return null;
5027
5983
  }
5028
- return /* @__PURE__ */ React30.createElement(
5984
+ return /* @__PURE__ */ React40.createElement(
5029
5985
  Typography,
5030
5986
  {
5031
5987
  component: "div",
@@ -5034,12 +5990,12 @@ var Markdown = (props) => {
5034
5990
  level: defaultLevel,
5035
5991
  ...innerProps
5036
5992
  },
5037
- /* @__PURE__ */ React30.createElement(
5993
+ /* @__PURE__ */ React40.createElement(
5038
5994
  Suspense,
5039
5995
  {
5040
- fallback: fallback || /* @__PURE__ */ React30.createElement(Typography, null, /* @__PURE__ */ React30.createElement(Skeleton, null, content || ""))
5996
+ fallback: fallback || /* @__PURE__ */ React40.createElement(Typography, null, /* @__PURE__ */ React40.createElement(Skeleton, null, content || ""))
5041
5997
  },
5042
- /* @__PURE__ */ React30.createElement(
5998
+ /* @__PURE__ */ React40.createElement(
5043
5999
  LazyReactMarkdown,
5044
6000
  {
5045
6001
  ...markdownOptions,
@@ -5047,11 +6003,11 @@ var Markdown = (props) => {
5047
6003
  rehypePlugins: [[rehypeAccent2, { accentColor }]],
5048
6004
  remarkPlugins: [remarkGfm],
5049
6005
  components: {
5050
- h1: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { color, textColor, level: "h1" }, children),
5051
- h2: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { color, textColor, level: "h2" }, children),
5052
- h3: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { color, textColor, level: "h3" }, children),
5053
- h4: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { color, textColor, level: "h4" }, children),
5054
- p: ({ children, node }) => /* @__PURE__ */ React30.createElement(
6006
+ h1: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { color, textColor, level: "h1" }, children),
6007
+ h2: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { color, textColor, level: "h2" }, children),
6008
+ h3: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { color, textColor, level: "h3" }, children),
6009
+ h4: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { color, textColor, level: "h4" }, children),
6010
+ p: ({ children, node }) => /* @__PURE__ */ React40.createElement(
5055
6011
  Typography,
5056
6012
  {
5057
6013
  color,
@@ -5061,10 +6017,10 @@ var Markdown = (props) => {
5061
6017
  },
5062
6018
  children
5063
6019
  ),
5064
- a: ({ children, href }) => /* @__PURE__ */ React30.createElement(Link2, { href, target: defaultLinkAction }, children),
5065
- hr: () => /* @__PURE__ */ React30.createElement(Divider, null),
5066
- b: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { fontWeight: boldFontWeight }, children),
5067
- strong: ({ children }) => /* @__PURE__ */ React30.createElement(Typography, { fontWeight: boldFontWeight }, children),
6020
+ a: ({ children, href }) => /* @__PURE__ */ React40.createElement(Link2, { href, target: defaultLinkAction }, children),
6021
+ hr: () => /* @__PURE__ */ React40.createElement(Divider, null),
6022
+ b: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { fontWeight: boldFontWeight }, children),
6023
+ strong: ({ children }) => /* @__PURE__ */ React40.createElement(Typography, { fontWeight: boldFontWeight }, children),
5068
6024
  ...markdownOptions?.components
5069
6025
  }
5070
6026
  }
@@ -5075,7 +6031,7 @@ var Markdown = (props) => {
5075
6031
  Markdown.displayName = "Markdown";
5076
6032
 
5077
6033
  // src/components/MenuButton/MenuButton.tsx
5078
- import React31 from "react";
6034
+ import React41 from "react";
5079
6035
  import {
5080
6036
  MenuButton as JoyMenuButton3,
5081
6037
  Button as JoyButton2
@@ -5096,7 +6052,7 @@ function MenuButton(props) {
5096
6052
  placement = "bottom"
5097
6053
  } = props;
5098
6054
  if (!items.length) {
5099
- return /* @__PURE__ */ React31.createElement(
6055
+ return /* @__PURE__ */ React41.createElement(
5100
6056
  JoyButton2,
5101
6057
  {
5102
6058
  component: props.buttonComponent ?? "button",
@@ -5107,12 +6063,12 @@ function MenuButton(props) {
5107
6063
  loading,
5108
6064
  startDecorator,
5109
6065
  ...props.buttonComponentProps ?? {},
5110
- endDecorator: showIcon ? /* @__PURE__ */ React31.createElement(React31.Fragment, null, endDecorator, /* @__PURE__ */ React31.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React31.createElement(React31.Fragment, null, endDecorator)
6066
+ endDecorator: showIcon ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, endDecorator, /* @__PURE__ */ React41.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React41.createElement(React41.Fragment, null, endDecorator)
5111
6067
  },
5112
6068
  buttonText
5113
6069
  );
5114
6070
  }
5115
- return /* @__PURE__ */ React31.createElement(Dropdown_default, null, /* @__PURE__ */ React31.createElement(
6071
+ return /* @__PURE__ */ React41.createElement(Dropdown_default, null, /* @__PURE__ */ React41.createElement(
5116
6072
  JoyMenuButton3,
5117
6073
  {
5118
6074
  component: props.buttonComponent ?? "button",
@@ -5123,10 +6079,10 @@ function MenuButton(props) {
5123
6079
  loading,
5124
6080
  startDecorator,
5125
6081
  ...props.buttonComponentProps ?? {},
5126
- endDecorator: showIcon ? /* @__PURE__ */ React31.createElement(React31.Fragment, null, endDecorator, /* @__PURE__ */ React31.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React31.createElement(React31.Fragment, null, endDecorator)
6082
+ endDecorator: showIcon ? /* @__PURE__ */ React41.createElement(React41.Fragment, null, endDecorator, /* @__PURE__ */ React41.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React41.createElement(React41.Fragment, null, endDecorator)
5127
6083
  },
5128
6084
  buttonText
5129
- ), /* @__PURE__ */ React31.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React31.createElement(
6085
+ ), /* @__PURE__ */ React41.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React41.createElement(
5130
6086
  MenuItem,
5131
6087
  {
5132
6088
  key: i.text,
@@ -5139,24 +6095,24 @@ function MenuButton(props) {
5139
6095
  MenuButton.displayName = "MenuButton";
5140
6096
 
5141
6097
  // src/components/MonthPicker/MonthPicker.tsx
5142
- import React32, {
6098
+ import React42, {
5143
6099
  forwardRef as forwardRef9,
5144
- useCallback as useCallback12,
5145
- useEffect as useEffect9,
6100
+ useCallback as useCallback21,
6101
+ useEffect as useEffect10,
5146
6102
  useImperativeHandle as useImperativeHandle4,
5147
6103
  useRef as useRef7,
5148
- useState as useState10
6104
+ useState as useState12
5149
6105
  } from "react";
5150
6106
  import CalendarTodayIcon3 from "@mui/icons-material/CalendarToday";
5151
- import { styled as styled20, useThemeProps as useThemeProps6 } from "@mui/joy";
6107
+ import { styled as styled21, useThemeProps as useThemeProps7 } from "@mui/joy";
5152
6108
  import { FocusTrap as FocusTrap3, ClickAwayListener as ClickAwayListener3, Popper as Popper4 } from "@mui/base";
5153
- var StyledPopper3 = styled20(Popper4, {
6109
+ var StyledPopper3 = styled21(Popper4, {
5154
6110
  name: "MonthPicker",
5155
6111
  slot: "popper"
5156
6112
  })(({ theme }) => ({
5157
6113
  zIndex: theme.zIndex.tooltip
5158
6114
  }));
5159
- var CalendarSheet3 = styled20(Sheet_default, {
6115
+ var CalendarSheet3 = styled21(Sheet_default, {
5160
6116
  name: "MonthPicker",
5161
6117
  slot: "sheet",
5162
6118
  overridesResolver: (props, styles) => styles.root
@@ -5165,7 +6121,7 @@ var CalendarSheet3 = styled20(Sheet_default, {
5165
6121
  boxShadow: theme.shadow.md,
5166
6122
  borderRadius: theme.radius.md
5167
6123
  }));
5168
- var MonthPickerRoot = styled20("div", {
6124
+ var MonthPickerRoot = styled21("div", {
5169
6125
  name: "MonthPicker",
5170
6126
  slot: "root",
5171
6127
  overridesResolver: (props, styles) => styles.root
@@ -5203,7 +6159,7 @@ function parseDate3(dateString, format) {
5203
6159
  }
5204
6160
  var MonthPicker = forwardRef9(
5205
6161
  (inProps, ref) => {
5206
- const props = useThemeProps6({ props: inProps, name: "MonthPicker" });
6162
+ const props = useThemeProps7({ props: inProps, name: "MonthPicker" });
5207
6163
  const {
5208
6164
  onChange,
5209
6165
  disabled,
@@ -5234,12 +6190,12 @@ var MonthPicker = forwardRef9(
5234
6190
  const [value, setValue, isControlled] = useControlledState(
5235
6191
  props.value,
5236
6192
  props.defaultValue || "",
5237
- useCallback12(
6193
+ useCallback21(
5238
6194
  (value2) => onChange?.({ target: { name: props.name, value: value2 } }),
5239
6195
  [props.name, onChange]
5240
6196
  )
5241
6197
  );
5242
- const getFormattedDisplayValue = useCallback12(
6198
+ const getFormattedDisplayValue = useCallback21(
5243
6199
  (inputValue) => {
5244
6200
  if (!inputValue) return "";
5245
6201
  try {
@@ -5254,12 +6210,12 @@ var MonthPicker = forwardRef9(
5254
6210
  },
5255
6211
  [format, displayFormat, locale]
5256
6212
  );
5257
- const [displayValue, setDisplayValue] = useState10(
6213
+ const [displayValue, setDisplayValue] = useState12(
5258
6214
  () => getFormattedDisplayValue(value)
5259
6215
  );
5260
- const [anchorEl, setAnchorEl] = useState10(null);
6216
+ const [anchorEl, setAnchorEl] = useState12(null);
5261
6217
  const open = Boolean(anchorEl);
5262
- useEffect9(() => {
6218
+ useEffect10(() => {
5263
6219
  if (!anchorEl) {
5264
6220
  innerRef.current?.blur();
5265
6221
  }
@@ -5267,10 +6223,10 @@ var MonthPicker = forwardRef9(
5267
6223
  useImperativeHandle4(ref, () => innerRef.current, [
5268
6224
  innerRef
5269
6225
  ]);
5270
- useEffect9(() => {
6226
+ useEffect10(() => {
5271
6227
  setDisplayValue(getFormattedDisplayValue(value));
5272
6228
  }, [value, getFormattedDisplayValue]);
5273
- const handleChange = useCallback12(
6229
+ const handleChange = useCallback21(
5274
6230
  (event) => {
5275
6231
  const newValue = event.target.value;
5276
6232
  setValue(newValue);
@@ -5280,21 +6236,21 @@ var MonthPicker = forwardRef9(
5280
6236
  },
5281
6237
  [setValue, getFormattedDisplayValue, isControlled]
5282
6238
  );
5283
- const handleCalendarToggle = useCallback12(
6239
+ const handleCalendarToggle = useCallback21(
5284
6240
  (event) => {
5285
6241
  setAnchorEl(anchorEl ? null : event.currentTarget);
5286
6242
  innerRef.current?.focus();
5287
6243
  },
5288
6244
  [anchorEl, setAnchorEl, innerRef]
5289
6245
  );
5290
- const handleInputMouseDown = useCallback12(
6246
+ const handleInputMouseDown = useCallback21(
5291
6247
  (event) => {
5292
6248
  event.preventDefault();
5293
6249
  buttonRef.current?.focus();
5294
6250
  },
5295
6251
  [buttonRef]
5296
6252
  );
5297
- return /* @__PURE__ */ React32.createElement(MonthPickerRoot, null, /* @__PURE__ */ React32.createElement(FocusTrap3, { open: true }, /* @__PURE__ */ React32.createElement(React32.Fragment, null, /* @__PURE__ */ React32.createElement(
6253
+ return /* @__PURE__ */ React42.createElement(MonthPickerRoot, null, /* @__PURE__ */ React42.createElement(FocusTrap3, { open: true }, /* @__PURE__ */ React42.createElement(React42.Fragment, null, /* @__PURE__ */ React42.createElement(
5298
6254
  Input_default,
5299
6255
  {
5300
6256
  ...innerProps,
@@ -5324,7 +6280,7 @@ var MonthPicker = forwardRef9(
5324
6280
  // NOTE: placeholder char 를 텍스트로 표시하므로 동일한 너비를 가지는 mono font 를 사용해야 이질감이 없다.
5325
6281
  fontFamily: "monospace"
5326
6282
  },
5327
- endDecorator: /* @__PURE__ */ React32.createElement(
6283
+ endDecorator: /* @__PURE__ */ React42.createElement(
5328
6284
  IconButton_default,
5329
6285
  {
5330
6286
  ref: buttonRef,
@@ -5336,12 +6292,12 @@ var MonthPicker = forwardRef9(
5336
6292
  "aria-expanded": open,
5337
6293
  disabled
5338
6294
  },
5339
- /* @__PURE__ */ React32.createElement(CalendarTodayIcon3, null)
6295
+ /* @__PURE__ */ React42.createElement(CalendarTodayIcon3, null)
5340
6296
  ),
5341
6297
  label,
5342
6298
  helperText
5343
6299
  }
5344
- ), open && /* @__PURE__ */ React32.createElement(ClickAwayListener3, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React32.createElement(
6300
+ ), open && /* @__PURE__ */ React42.createElement(ClickAwayListener3, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React42.createElement(
5345
6301
  StyledPopper3,
5346
6302
  {
5347
6303
  id: "month-picker-popper",
@@ -5360,7 +6316,7 @@ var MonthPicker = forwardRef9(
5360
6316
  "aria-label": "Calendar Tooltip",
5361
6317
  "aria-expanded": open
5362
6318
  },
5363
- /* @__PURE__ */ React32.createElement(CalendarSheet3, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React32.createElement(
6319
+ /* @__PURE__ */ React42.createElement(CalendarSheet3, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React42.createElement(
5364
6320
  Calendar_default,
5365
6321
  {
5366
6322
  view: "month",
@@ -5381,14 +6337,14 @@ var MonthPicker = forwardRef9(
5381
6337
  disablePast,
5382
6338
  locale
5383
6339
  }
5384
- ), /* @__PURE__ */ React32.createElement(
6340
+ ), /* @__PURE__ */ React42.createElement(
5385
6341
  DialogActions_default,
5386
6342
  {
5387
6343
  sx: {
5388
6344
  p: 1
5389
6345
  }
5390
6346
  },
5391
- /* @__PURE__ */ React32.createElement(
6347
+ /* @__PURE__ */ React42.createElement(
5392
6348
  Button_default,
5393
6349
  {
5394
6350
  size,
@@ -5412,26 +6368,26 @@ var MonthPicker = forwardRef9(
5412
6368
  );
5413
6369
 
5414
6370
  // src/components/MonthRangePicker/MonthRangePicker.tsx
5415
- import React33, {
6371
+ import React43, {
5416
6372
  forwardRef as forwardRef10,
5417
- useCallback as useCallback13,
5418
- useEffect as useEffect10,
6373
+ useCallback as useCallback22,
6374
+ useEffect as useEffect11,
5419
6375
  useImperativeHandle as useImperativeHandle5,
5420
- useMemo as useMemo11,
6376
+ useMemo as useMemo13,
5421
6377
  useRef as useRef8,
5422
- useState as useState11
6378
+ useState as useState13
5423
6379
  } from "react";
5424
6380
  import { IMaskInput as IMaskInput3, IMask as IMask3 } from "react-imask";
5425
6381
  import CalendarTodayIcon4 from "@mui/icons-material/CalendarToday";
5426
- import { styled as styled21, useThemeProps as useThemeProps7 } from "@mui/joy";
6382
+ import { styled as styled22, useThemeProps as useThemeProps8 } from "@mui/joy";
5427
6383
  import { FocusTrap as FocusTrap4, ClickAwayListener as ClickAwayListener4, Popper as Popper5 } from "@mui/base";
5428
- var StyledPopper4 = styled21(Popper5, {
6384
+ var StyledPopper4 = styled22(Popper5, {
5429
6385
  name: "MonthRangePicker",
5430
6386
  slot: "popper"
5431
6387
  })(({ theme }) => ({
5432
6388
  zIndex: theme.zIndex.tooltip
5433
6389
  }));
5434
- var CalendarSheet4 = styled21(Sheet_default, {
6390
+ var CalendarSheet4 = styled22(Sheet_default, {
5435
6391
  name: "MonthRangePicker",
5436
6392
  slot: "sheet",
5437
6393
  overridesResolver: (props, styles) => styles.root
@@ -5441,7 +6397,7 @@ var CalendarSheet4 = styled21(Sheet_default, {
5441
6397
  boxShadow: theme.shadow.md,
5442
6398
  borderRadius: theme.radius.md
5443
6399
  }));
5444
- var MonthRangePickerRoot = styled21("div", {
6400
+ var MonthRangePickerRoot = styled22("div", {
5445
6401
  name: "MonthRangePicker",
5446
6402
  slot: "root",
5447
6403
  overridesResolver: (props, styles) => styles.root
@@ -5478,10 +6434,10 @@ var parseDates2 = (str) => {
5478
6434
  var formatToPattern3 = (format) => {
5479
6435
  return `${format} - ${format}`.replace(/YYYY/g, "Y").replace(/MM/g, "m").replace(/[^YMm\s]/g, (match) => `${match}\``);
5480
6436
  };
5481
- var TextMaskAdapter7 = React33.forwardRef(
5482
- function TextMaskAdapter8(props, ref) {
6437
+ var TextMaskAdapter9 = React43.forwardRef(
6438
+ function TextMaskAdapter10(props, ref) {
5483
6439
  const { onChange, format, ...other } = props;
5484
- return /* @__PURE__ */ React33.createElement(
6440
+ return /* @__PURE__ */ React43.createElement(
5485
6441
  IMaskInput3,
5486
6442
  {
5487
6443
  ...other,
@@ -5512,7 +6468,7 @@ var TextMaskAdapter7 = React33.forwardRef(
5512
6468
  );
5513
6469
  var MonthRangePicker = forwardRef10(
5514
6470
  (inProps, ref) => {
5515
- const props = useThemeProps7({ props: inProps, name: "MonthRangePicker" });
6471
+ const props = useThemeProps8({ props: inProps, name: "MonthRangePicker" });
5516
6472
  const {
5517
6473
  onChange,
5518
6474
  disabled,
@@ -5535,18 +6491,18 @@ var MonthRangePicker = forwardRef10(
5535
6491
  const [value, setValue] = useControlledState(
5536
6492
  props.value,
5537
6493
  props.defaultValue || "",
5538
- useCallback13(
6494
+ useCallback22(
5539
6495
  (value2) => onChange?.({ target: { name: props.name, value: value2 } }),
5540
6496
  [props.name, onChange]
5541
6497
  )
5542
6498
  );
5543
- const [anchorEl, setAnchorEl] = useState11(null);
6499
+ const [anchorEl, setAnchorEl] = useState13(null);
5544
6500
  const open = Boolean(anchorEl);
5545
- const calendarValue = useMemo11(
6501
+ const calendarValue = useMemo13(
5546
6502
  () => value ? parseDates2(value) : void 0,
5547
6503
  [value]
5548
6504
  );
5549
- useEffect10(() => {
6505
+ useEffect11(() => {
5550
6506
  if (!anchorEl) {
5551
6507
  innerRef.current?.blur();
5552
6508
  }
@@ -5554,20 +6510,20 @@ var MonthRangePicker = forwardRef10(
5554
6510
  useImperativeHandle5(ref, () => innerRef.current, [
5555
6511
  innerRef
5556
6512
  ]);
5557
- const handleChange = useCallback13(
6513
+ const handleChange = useCallback22(
5558
6514
  (event) => {
5559
6515
  setValue(event.target.value);
5560
6516
  },
5561
6517
  [setValue]
5562
6518
  );
5563
- const handleCalendarToggle = useCallback13(
6519
+ const handleCalendarToggle = useCallback22(
5564
6520
  (event) => {
5565
6521
  setAnchorEl(anchorEl ? null : event.currentTarget);
5566
6522
  innerRef.current?.focus();
5567
6523
  },
5568
6524
  [anchorEl, setAnchorEl, innerRef]
5569
6525
  );
5570
- const handleCalendarChange = useCallback13(
6526
+ const handleCalendarChange = useCallback22(
5571
6527
  ([date1, date2]) => {
5572
6528
  if (!date1 || !date2) return;
5573
6529
  setValue(formatValueString4([date1, date2], format));
@@ -5575,7 +6531,7 @@ var MonthRangePicker = forwardRef10(
5575
6531
  },
5576
6532
  [setValue, setAnchorEl, format]
5577
6533
  );
5578
- return /* @__PURE__ */ React33.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ React33.createElement(FocusTrap4, { open: true }, /* @__PURE__ */ React33.createElement(React33.Fragment, null, /* @__PURE__ */ React33.createElement(
6534
+ return /* @__PURE__ */ React43.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ React43.createElement(FocusTrap4, { open: true }, /* @__PURE__ */ React43.createElement(React43.Fragment, null, /* @__PURE__ */ React43.createElement(
5579
6535
  Input_default,
5580
6536
  {
5581
6537
  ...innerProps,
@@ -5588,7 +6544,7 @@ var MonthRangePicker = forwardRef10(
5588
6544
  required,
5589
6545
  placeholder: `${format} - ${format}`,
5590
6546
  slotProps: {
5591
- input: { component: TextMaskAdapter7, ref: innerRef, format }
6547
+ input: { component: TextMaskAdapter9, ref: innerRef, format }
5592
6548
  },
5593
6549
  error,
5594
6550
  className,
@@ -5597,7 +6553,7 @@ var MonthRangePicker = forwardRef10(
5597
6553
  // NOTE: placeholder char 를 텍스트로 표시하므로 동일한 너비를 가지는 mono font 를 사용해야 이질감이 없다.
5598
6554
  fontFamily: "monospace"
5599
6555
  },
5600
- endDecorator: /* @__PURE__ */ React33.createElement(
6556
+ endDecorator: /* @__PURE__ */ React43.createElement(
5601
6557
  IconButton_default,
5602
6558
  {
5603
6559
  variant: "plain",
@@ -5607,12 +6563,12 @@ var MonthRangePicker = forwardRef10(
5607
6563
  "aria-haspopup": "dialog",
5608
6564
  "aria-expanded": open
5609
6565
  },
5610
- /* @__PURE__ */ React33.createElement(CalendarTodayIcon4, null)
6566
+ /* @__PURE__ */ React43.createElement(CalendarTodayIcon4, null)
5611
6567
  ),
5612
6568
  label,
5613
6569
  helperText
5614
6570
  }
5615
- ), open && /* @__PURE__ */ React33.createElement(ClickAwayListener4, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React33.createElement(
6571
+ ), open && /* @__PURE__ */ React43.createElement(ClickAwayListener4, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React43.createElement(
5616
6572
  StyledPopper4,
5617
6573
  {
5618
6574
  id: "month-range-picker-popper",
@@ -5631,7 +6587,7 @@ var MonthRangePicker = forwardRef10(
5631
6587
  "aria-label": "Calendar Tooltip",
5632
6588
  "aria-expanded": open
5633
6589
  },
5634
- /* @__PURE__ */ React33.createElement(CalendarSheet4, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React33.createElement(
6590
+ /* @__PURE__ */ React43.createElement(CalendarSheet4, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React43.createElement(
5635
6591
  Calendar_default,
5636
6592
  {
5637
6593
  view: "month",
@@ -5644,14 +6600,14 @@ var MonthRangePicker = forwardRef10(
5644
6600
  disableFuture,
5645
6601
  disablePast
5646
6602
  }
5647
- ), /* @__PURE__ */ React33.createElement(
6603
+ ), /* @__PURE__ */ React43.createElement(
5648
6604
  DialogActions_default,
5649
6605
  {
5650
6606
  sx: {
5651
6607
  p: 1
5652
6608
  }
5653
6609
  },
5654
- /* @__PURE__ */ React33.createElement(
6610
+ /* @__PURE__ */ React43.createElement(
5655
6611
  Button_default,
5656
6612
  {
5657
6613
  size,
@@ -5671,16 +6627,16 @@ var MonthRangePicker = forwardRef10(
5671
6627
  MonthRangePicker.displayName = "MonthRangePicker";
5672
6628
 
5673
6629
  // src/components/NavigationGroup/NavigationGroup.tsx
5674
- import React34 from "react";
6630
+ import React44 from "react";
5675
6631
  import {
5676
6632
  Accordion as JoyAccordion2,
5677
6633
  AccordionSummary as JoyAccordionSummary2,
5678
6634
  AccordionDetails as JoyAccordionDetails2,
5679
- styled as styled22,
6635
+ styled as styled23,
5680
6636
  accordionSummaryClasses,
5681
- Stack as Stack2
6637
+ Stack as Stack11
5682
6638
  } from "@mui/joy";
5683
- var AccordionSummary2 = styled22(JoyAccordionSummary2, {
6639
+ var AccordionSummary2 = styled23(JoyAccordionSummary2, {
5684
6640
  name: "NavigationGroup",
5685
6641
  slot: "Summary",
5686
6642
  shouldForwardProp: (prop) => prop !== "useIcon" && prop !== "level"
@@ -5693,7 +6649,7 @@ var AccordionSummary2 = styled22(JoyAccordionSummary2, {
5693
6649
  }
5694
6650
  }
5695
6651
  }));
5696
- var AccordionDetails2 = styled22(JoyAccordionDetails2, {
6652
+ var AccordionDetails2 = styled23(JoyAccordionDetails2, {
5697
6653
  name: "NavigationGroup",
5698
6654
  slot: "Details"
5699
6655
  })(({ theme }) => ({
@@ -5702,19 +6658,19 @@ var AccordionDetails2 = styled22(JoyAccordionDetails2, {
5702
6658
  }));
5703
6659
  function NavigationGroup(props) {
5704
6660
  const { title, children, startDecorator, level, ...rest } = props;
5705
- return /* @__PURE__ */ React34.createElement(JoyAccordion2, { ...rest }, /* @__PURE__ */ React34.createElement(AccordionSummary2, { useIcon: !!startDecorator, level }, /* @__PURE__ */ React34.createElement(Stack2, { direction: "row", gap: 4 }, startDecorator, title)), /* @__PURE__ */ React34.createElement(AccordionDetails2, null, children));
6661
+ return /* @__PURE__ */ React44.createElement(JoyAccordion2, { ...rest }, /* @__PURE__ */ React44.createElement(AccordionSummary2, { useIcon: !!startDecorator, level }, /* @__PURE__ */ React44.createElement(Stack11, { direction: "row", gap: 4 }, startDecorator, title)), /* @__PURE__ */ React44.createElement(AccordionDetails2, null, children));
5706
6662
  }
5707
6663
 
5708
6664
  // src/components/NavigationItem/NavigationItem.tsx
5709
- import React35 from "react";
6665
+ import React45 from "react";
5710
6666
  import {
5711
6667
  ListItem as JoyListItem,
5712
6668
  ListItemButton as JoyListItemButton,
5713
6669
  ListItemDecorator as JoyListItemDecorator,
5714
- styled as styled23,
6670
+ styled as styled24,
5715
6671
  listItemButtonClasses
5716
6672
  } from "@mui/joy";
5717
- var ListItemButton = styled23(JoyListItemButton, {
6673
+ var ListItemButton = styled24(JoyListItemButton, {
5718
6674
  name: "NavigationItem",
5719
6675
  slot: "Button",
5720
6676
  shouldForwardProp: (prop) => prop !== "useIcon" && prop !== "level"
@@ -5741,7 +6697,7 @@ function NavigationItem(props) {
5741
6697
  const handleClick = () => {
5742
6698
  onClick?.(id);
5743
6699
  };
5744
- return /* @__PURE__ */ React35.createElement(JoyListItem, { ...rest }, /* @__PURE__ */ React35.createElement(
6700
+ return /* @__PURE__ */ React45.createElement(JoyListItem, { ...rest }, /* @__PURE__ */ React45.createElement(
5745
6701
  ListItemButton,
5746
6702
  {
5747
6703
  level,
@@ -5750,21 +6706,21 @@ function NavigationItem(props) {
5750
6706
  "aria-current": selected,
5751
6707
  onClick: handleClick
5752
6708
  },
5753
- startDecorator && /* @__PURE__ */ React35.createElement(JoyListItemDecorator, null, startDecorator),
6709
+ startDecorator && /* @__PURE__ */ React45.createElement(JoyListItemDecorator, null, startDecorator),
5754
6710
  children
5755
6711
  ));
5756
6712
  }
5757
6713
 
5758
6714
  // src/components/Navigator/Navigator.tsx
5759
- import React36 from "react";
6715
+ import React46 from "react";
5760
6716
  function Navigator(props) {
5761
6717
  const { items, level = 0, onSelect } = props;
5762
6718
  const handleItemClick = (id) => {
5763
6719
  onSelect?.(id);
5764
6720
  };
5765
- return /* @__PURE__ */ React36.createElement("div", null, items.map((item, index) => {
6721
+ return /* @__PURE__ */ React46.createElement("div", null, items.map((item, index) => {
5766
6722
  if (item.type === "item") {
5767
- return /* @__PURE__ */ React36.createElement(
6723
+ return /* @__PURE__ */ React46.createElement(
5768
6724
  NavigationItem,
5769
6725
  {
5770
6726
  key: item.id,
@@ -5777,7 +6733,7 @@ function Navigator(props) {
5777
6733
  item.title
5778
6734
  );
5779
6735
  } else if (item.type === "group") {
5780
- return /* @__PURE__ */ React36.createElement(
6736
+ return /* @__PURE__ */ React46.createElement(
5781
6737
  NavigationGroup,
5782
6738
  {
5783
6739
  key: index,
@@ -5794,127 +6750,8 @@ function Navigator(props) {
5794
6750
  }
5795
6751
  Navigator.displayName = "Navigator";
5796
6752
 
5797
- // src/components/PercentageInput/PercentageInput.tsx
5798
- import React37, { useCallback as useCallback14, useMemo as useMemo12, useState as useState12 } from "react";
5799
- import { NumericFormat as NumericFormat2 } from "react-number-format";
5800
- import { styled as styled24, useThemeProps as useThemeProps8 } from "@mui/joy";
5801
- var padDecimal = (value, decimalScale) => {
5802
- const [integer, decimal = ""] = `${value}`.split(".");
5803
- return Number(`${integer}${decimal.padEnd(decimalScale, "0")}`);
5804
- };
5805
- var TextMaskAdapter9 = React37.forwardRef(
5806
- function TextMaskAdapter10(props, ref) {
5807
- const { onChange, min, max, ...innerProps } = props;
5808
- return /* @__PURE__ */ React37.createElement(
5809
- NumericFormat2,
5810
- {
5811
- ...innerProps,
5812
- onValueChange: ({ value }) => {
5813
- onChange?.({
5814
- target: {
5815
- name: props.name,
5816
- value
5817
- }
5818
- });
5819
- },
5820
- valueIsNumericString: true,
5821
- thousandSeparator: true,
5822
- suffix: "%",
5823
- getInputRef: ref,
5824
- allowNegative: true
5825
- }
5826
- );
5827
- }
5828
- );
5829
- var PercentageInputRoot = styled24(Input_default, {
5830
- name: "PercentageInput",
5831
- slot: "Root",
5832
- overridesResolver: (props, styles) => styles.root
5833
- })({});
5834
- var PercentageInput = React37.forwardRef(function PercentageInput2(inProps, ref) {
5835
- const props = useThemeProps8({ props: inProps, name: "PercentageInput" });
5836
- const {
5837
- name,
5838
- onChange,
5839
- label,
5840
- error,
5841
- helperText,
5842
- required,
5843
- disabled,
5844
- useMinorUnit,
5845
- maxDecimalScale = 0,
5846
- min,
5847
- max,
5848
- // NOTE: 스타일 관련된 props는 최상위 엘리먼트에 적용한다.
5849
- sx,
5850
- className,
5851
- ...innerProps
5852
- } = props;
5853
- const [_value, setValue] = useControlledState(
5854
- props.value,
5855
- props.defaultValue,
5856
- useCallback14(
5857
- (value2) => onChange?.({ target: { name, value: value2 } }),
5858
- [onChange, name]
5859
- )
5860
- );
5861
- const [internalError, setInternalError] = useState12(
5862
- max && _value && _value > max || min && _value && _value < min
5863
- );
5864
- const value = useMemo12(() => {
5865
- if (_value && useMinorUnit) {
5866
- return _value / Math.pow(10, maxDecimalScale);
5867
- }
5868
- return _value;
5869
- }, [_value, useMinorUnit, maxDecimalScale]);
5870
- const handleChange = useCallback14(
5871
- (event) => {
5872
- if (event.target.value === "") {
5873
- setValue(void 0);
5874
- return;
5875
- }
5876
- const originalAmount = Number(event.target.value);
5877
- if (min && originalAmount < min || max && originalAmount > max) {
5878
- setInternalError(true);
5879
- } else {
5880
- setInternalError(false);
5881
- }
5882
- const amount = useMinorUnit ? padDecimal(originalAmount, maxDecimalScale) : originalAmount;
5883
- setValue(amount);
5884
- },
5885
- [setValue, useMinorUnit, maxDecimalScale, min, max]
5886
- );
5887
- return /* @__PURE__ */ React37.createElement(
5888
- PercentageInputRoot,
5889
- {
5890
- ...innerProps,
5891
- ref,
5892
- value,
5893
- onChange: handleChange,
5894
- error: internalError || error,
5895
- disabled,
5896
- required,
5897
- color: internalError || error ? "danger" : props.color,
5898
- label,
5899
- helperText,
5900
- slotProps: {
5901
- input: {
5902
- component: TextMaskAdapter9,
5903
- "aria-label": innerProps["aria-label"],
5904
- decimalScale: maxDecimalScale
5905
- }
5906
- },
5907
- sx: {
5908
- ...sx
5909
- },
5910
- className
5911
- }
5912
- );
5913
- });
5914
- PercentageInput.displayName = "PercentageInput";
5915
-
5916
6753
  // src/components/ProfileMenu/ProfileMenu.tsx
5917
- import React38, { useCallback as useCallback15, useMemo as useMemo13 } from "react";
6754
+ import React47, { useCallback as useCallback23, useMemo as useMemo14 } from "react";
5918
6755
  import {
5919
6756
  Dropdown as Dropdown2,
5920
6757
  ListDivider,
@@ -5930,15 +6767,15 @@ var StyledProfileCard = styled25(Stack, {
5930
6767
  })({});
5931
6768
  function ProfileCard(props) {
5932
6769
  const { children, chip, caption, size } = props;
5933
- const captionLevel = useMemo13(
6770
+ const captionLevel = useMemo14(
5934
6771
  () => size === "sm" ? "body-xs" : "body-sm",
5935
6772
  [size]
5936
6773
  );
5937
- const nameLevel = useMemo13(
6774
+ const nameLevel = useMemo14(
5938
6775
  () => size === "sm" ? "body-sm" : "body-md",
5939
6776
  [size]
5940
6777
  );
5941
- return /* @__PURE__ */ React38.createElement(StyledProfileCard, { px: 4, py: 2 }, /* @__PURE__ */ React38.createElement(Stack, { direction: "row", gap: 2 }, /* @__PURE__ */ React38.createElement(
6778
+ return /* @__PURE__ */ React47.createElement(StyledProfileCard, { px: 4, py: 2 }, /* @__PURE__ */ React47.createElement(Stack, { direction: "row", gap: 2 }, /* @__PURE__ */ React47.createElement(
5942
6779
  Typography,
5943
6780
  {
5944
6781
  level: nameLevel,
@@ -5946,7 +6783,7 @@ function ProfileCard(props) {
5946
6783
  textColor: "text.primary"
5947
6784
  },
5948
6785
  children
5949
- ), chip && /* @__PURE__ */ React38.createElement(Chip, { size, color: "neutral", variant: "outlined" }, chip)), caption && /* @__PURE__ */ React38.createElement(Typography, { level: captionLevel, textColor: "text.tertiary" }, caption));
6786
+ ), chip && /* @__PURE__ */ React47.createElement(Chip, { size, color: "neutral", variant: "outlined" }, chip)), caption && /* @__PURE__ */ React47.createElement(Typography, { level: captionLevel, textColor: "text.tertiary" }, caption));
5950
6787
  }
5951
6788
  ProfileCard.displayName = "ProfileCard";
5952
6789
  var StyledProfileMenuButton = styled25(MenuButton2, {
@@ -5958,16 +6795,16 @@ var StyledProfileMenuButton = styled25(MenuButton2, {
5958
6795
  }));
5959
6796
  function ProfileMenuButton(props) {
5960
6797
  const { size = "md", src, alt, children, getInitial, ...innerProps } = props;
5961
- return /* @__PURE__ */ React38.createElement(
6798
+ return /* @__PURE__ */ React47.createElement(
5962
6799
  StyledProfileMenuButton,
5963
6800
  {
5964
6801
  variant: "plain",
5965
6802
  color: "neutral",
5966
6803
  size,
5967
- endDecorator: /* @__PURE__ */ React38.createElement(DropdownIcon, null),
6804
+ endDecorator: /* @__PURE__ */ React47.createElement(DropdownIcon, null),
5968
6805
  ...innerProps
5969
6806
  },
5970
- /* @__PURE__ */ React38.createElement(
6807
+ /* @__PURE__ */ React47.createElement(
5971
6808
  Avatar,
5972
6809
  {
5973
6810
  variant: "soft",
@@ -6006,9 +6843,9 @@ function ProfileMenu(props) {
6006
6843
  const [open, setOpen] = useControlledState(
6007
6844
  _open,
6008
6845
  defaultOpen ?? false,
6009
- useCallback15((value) => onOpenChange?.(value), [onOpenChange])
6846
+ useCallback23((value) => onOpenChange?.(value), [onOpenChange])
6010
6847
  );
6011
- return /* @__PURE__ */ React38.createElement(ClickAwayListener5, { onClickAway: () => setOpen(false) }, /* @__PURE__ */ React38.createElement("div", null, /* @__PURE__ */ React38.createElement(Dropdown2, { open }, /* @__PURE__ */ React38.createElement(
6848
+ return /* @__PURE__ */ React47.createElement(ClickAwayListener5, { onClickAway: () => setOpen(false) }, /* @__PURE__ */ React47.createElement("div", null, /* @__PURE__ */ React47.createElement(Dropdown2, { open }, /* @__PURE__ */ React47.createElement(
6012
6849
  ProfileMenuButton,
6013
6850
  {
6014
6851
  size,
@@ -6018,7 +6855,7 @@ function ProfileMenu(props) {
6018
6855
  getInitial
6019
6856
  },
6020
6857
  profile.name
6021
- ), /* @__PURE__ */ React38.createElement(
6858
+ ), /* @__PURE__ */ React47.createElement(
6022
6859
  ProfileMenuRoot,
6023
6860
  {
6024
6861
  size,
@@ -6026,7 +6863,7 @@ function ProfileMenu(props) {
6026
6863
  ...innerProps,
6027
6864
  onClose: () => setOpen(false)
6028
6865
  },
6029
- /* @__PURE__ */ React38.createElement(
6866
+ /* @__PURE__ */ React47.createElement(
6030
6867
  ProfileCard,
6031
6868
  {
6032
6869
  size,
@@ -6035,8 +6872,8 @@ function ProfileMenu(props) {
6035
6872
  },
6036
6873
  profile.name
6037
6874
  ),
6038
- !!menuItems.length && /* @__PURE__ */ React38.createElement(ListDivider, null),
6039
- menuItems.map(({ label, ...menuProps }) => /* @__PURE__ */ React38.createElement(
6875
+ !!menuItems.length && /* @__PURE__ */ React47.createElement(ListDivider, null),
6876
+ menuItems.map(({ label, ...menuProps }) => /* @__PURE__ */ React47.createElement(
6040
6877
  MenuItem,
6041
6878
  {
6042
6879
  ...menuProps,
@@ -6051,26 +6888,16 @@ function ProfileMenu(props) {
6051
6888
  }
6052
6889
  ProfileMenu.displayName = "ProfileMenu";
6053
6890
 
6054
- // src/components/Radio/Radio.tsx
6055
- import { Radio as JoyRadio, RadioGroup as JoyRadioGroup } from "@mui/joy";
6056
- import { motion as motion26 } from "framer-motion";
6057
- var MotionRadio = motion26(JoyRadio);
6058
- var Radio = MotionRadio;
6059
- Radio.displayName = "Radio";
6060
- var MotionRadioGroup = motion26(JoyRadioGroup);
6061
- var RadioGroup = MotionRadioGroup;
6062
- RadioGroup.displayName = "RadioGroup";
6063
-
6064
6891
  // src/components/RadioList/RadioList.tsx
6065
- import React39 from "react";
6892
+ import React48 from "react";
6066
6893
  function RadioList(props) {
6067
6894
  const { items, ...innerProps } = props;
6068
- return /* @__PURE__ */ React39.createElement(RadioGroup, { ...innerProps }, items.map((item) => /* @__PURE__ */ React39.createElement(Radio, { key: `${item.value}`, value: item.value, label: item.label })));
6895
+ return /* @__PURE__ */ React48.createElement(RadioGroup, { ...innerProps }, items.map((item) => /* @__PURE__ */ React48.createElement(Radio, { key: `${item.value}`, value: item.value, label: item.label })));
6069
6896
  }
6070
6897
  RadioList.displayName = "RadioList";
6071
6898
 
6072
6899
  // src/components/Stepper/Stepper.tsx
6073
- import React40 from "react";
6900
+ import React49 from "react";
6074
6901
  import {
6075
6902
  Stepper as JoyStepper,
6076
6903
  Step as JoyStep,
@@ -6103,7 +6930,7 @@ function Stepper(props) {
6103
6930
  inactiveLineColor = "neutral.300",
6104
6931
  activeStep
6105
6932
  } = props;
6106
- return /* @__PURE__ */ React40.createElement(
6933
+ return /* @__PURE__ */ React49.createElement(
6107
6934
  MotionStepper,
6108
6935
  {
6109
6936
  sx: (theme) => ({
@@ -6137,15 +6964,15 @@ function Stepper(props) {
6137
6964
  const completed = activeStep > i + 1;
6138
6965
  const disabled = activeStep < i + 1;
6139
6966
  const hasContent = step.label || step.extraContent;
6140
- return /* @__PURE__ */ React40.createElement(
6967
+ return /* @__PURE__ */ React49.createElement(
6141
6968
  Step,
6142
6969
  {
6143
- indicator: /* @__PURE__ */ React40.createElement(StepIndicator, { variant: "solid", color: "primary" }, completed ? /* @__PURE__ */ React40.createElement(CheckIcon, null) : step.indicatorContent),
6970
+ indicator: /* @__PURE__ */ React49.createElement(StepIndicator, { variant: "solid", color: "primary" }, completed ? /* @__PURE__ */ React49.createElement(CheckIcon, null) : step.indicatorContent),
6144
6971
  active,
6145
6972
  completed,
6146
6973
  disabled
6147
6974
  },
6148
- hasContent && /* @__PURE__ */ React40.createElement(Stack_default, null, step.label && /* @__PURE__ */ React40.createElement(Typography_default, { level: "title-sm" }, step.label), step.extraContent && /* @__PURE__ */ React40.createElement(Typography_default, { level: "body-xs" }, step.extraContent))
6975
+ hasContent && /* @__PURE__ */ React49.createElement(Stack_default, null, step.label && /* @__PURE__ */ React49.createElement(Typography_default, { level: "title-sm" }, step.label), step.extraContent && /* @__PURE__ */ React49.createElement(Typography_default, { level: "body-xs" }, step.extraContent))
6149
6976
  );
6150
6977
  })
6151
6978
  );
@@ -6153,7 +6980,7 @@ function Stepper(props) {
6153
6980
  Stepper.displayName = "Stepper";
6154
6981
 
6155
6982
  // src/components/Switch/Switch.tsx
6156
- import React41 from "react";
6983
+ import React50 from "react";
6157
6984
  import {
6158
6985
  Switch as JoySwitch,
6159
6986
  styled as styled27,
@@ -6179,14 +7006,14 @@ var StyledThumb = styled27(motion28.div)({
6179
7006
  right: "var(--Switch-thumbOffset)"
6180
7007
  }
6181
7008
  });
6182
- var Thumb = (props) => /* @__PURE__ */ React41.createElement(StyledThumb, { ...props, layout: true, transition: spring });
7009
+ var Thumb = (props) => /* @__PURE__ */ React50.createElement(StyledThumb, { ...props, layout: true, transition: spring });
6183
7010
  var spring = {
6184
7011
  type: "spring",
6185
7012
  stiffness: 700,
6186
7013
  damping: 30
6187
7014
  };
6188
7015
  var Switch = (props) => {
6189
- return /* @__PURE__ */ React41.createElement(
7016
+ return /* @__PURE__ */ React50.createElement(
6190
7017
  MotionSwitch,
6191
7018
  {
6192
7019
  ...props,
@@ -6200,7 +7027,7 @@ var Switch = (props) => {
6200
7027
  Switch.displayName = "Switch";
6201
7028
 
6202
7029
  // src/components/Tabs/Tabs.tsx
6203
- import React42, { forwardRef as forwardRef11 } from "react";
7030
+ import React51, { forwardRef as forwardRef11 } from "react";
6204
7031
  import {
6205
7032
  Tabs as JoyTabs,
6206
7033
  Tab as JoyTab,
@@ -6224,14 +7051,14 @@ var StyledTab = styled28(JoyTab)(({ theme }) => ({
6224
7051
  }
6225
7052
  }));
6226
7053
  var Tab = forwardRef11(function Tab2({ startDecorator, endDecorator, children, ...props }, ref) {
6227
- return /* @__PURE__ */ React42.createElement(StyledTab, { ...props, ref }, startDecorator, children, endDecorator);
7054
+ return /* @__PURE__ */ React51.createElement(StyledTab, { ...props, ref }, startDecorator, children, endDecorator);
6228
7055
  });
6229
7056
  Tab.displayName = "Tab";
6230
7057
  var TabList = JoyTabList;
6231
7058
  var TabPanel = JoyTabPanel;
6232
7059
 
6233
7060
  // src/components/ThemeProvider/ThemeProvider.tsx
6234
- import React43 from "react";
7061
+ import React52 from "react";
6235
7062
  import {
6236
7063
  CssBaseline,
6237
7064
  CssVarsProvider,
@@ -6410,6 +7237,11 @@ var defaultTheme = extendTheme({
6410
7237
  size: "sm"
6411
7238
  }
6412
7239
  },
7240
+ JoyRadioGroup: {
7241
+ defaultProps: {
7242
+ size: "sm"
7243
+ }
7244
+ },
6413
7245
  JoySwitch: {
6414
7246
  defaultProps: {
6415
7247
  size: "sm"
@@ -6420,6 +7252,11 @@ var defaultTheme = extendTheme({
6420
7252
  size: "sm"
6421
7253
  }
6422
7254
  },
7255
+ JoyAutocompleteListbox: {
7256
+ defaultProps: {
7257
+ size: "sm"
7258
+ }
7259
+ },
6423
7260
  JoyTextarea: {
6424
7261
  defaultProps: {
6425
7262
  size: "sm"
@@ -6496,12 +7333,17 @@ var defaultTheme = extendTheme({
6496
7333
  fontWeight: "var(--ceed-fontWeight-xl, 700)"
6497
7334
  }
6498
7335
  }
7336
+ },
7337
+ JoyFormControl: {
7338
+ defaultProps: {
7339
+ size: "sm"
7340
+ }
6499
7341
  }
6500
7342
  }
6501
7343
  });
6502
7344
  function ThemeProvider(props) {
6503
7345
  const theme = props.theme || defaultTheme;
6504
- return /* @__PURE__ */ React43.createElement(React43.Fragment, null, /* @__PURE__ */ React43.createElement(CssVarsProvider, { theme }, /* @__PURE__ */ React43.createElement(CssBaseline, null), props.children));
7346
+ return /* @__PURE__ */ React52.createElement(React52.Fragment, null, /* @__PURE__ */ React52.createElement(CssVarsProvider, { theme }, /* @__PURE__ */ React52.createElement(CssBaseline, null), props.children));
6505
7347
  }
6506
7348
  ThemeProvider.displayName = "ThemeProvider";
6507
7349
  export {
@@ -6543,6 +7385,7 @@ export {
6543
7385
  Divider,
6544
7386
  Drawer,
6545
7387
  Dropdown,
7388
+ FilterMenu,
6546
7389
  FormControl,
6547
7390
  FormHelperText,
6548
7391
  FormLabel,