@ceed/cds 1.14.0 → 1.15.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
@@ -3466,8 +3466,10 @@ TableBody.displayName = "TableBody";
3466
3466
 
3467
3467
  // src/components/Pagination/Pagination.tsx
3468
3468
  import React24, { useCallback as useCallback10, useEffect as useEffect6 } from "react";
3469
- import PreviousIcon from "@mui/icons-material/ChevronLeft";
3470
- import NextIcon from "@mui/icons-material/ChevronRight";
3469
+ import PreviousIcon from "@mui/icons-material/ChevronLeftRounded";
3470
+ import NextIcon from "@mui/icons-material/ChevronRightRounded";
3471
+ import FirstPageIcon from "@mui/icons-material/FirstPageRounded";
3472
+ import LastPageIcon from "@mui/icons-material/LastPageRounded";
3471
3473
  import { styled as styled13 } from "@mui/joy";
3472
3474
  var PaginationButton = styled13(Button_default, {
3473
3475
  name: "Pagination",
@@ -3526,6 +3528,7 @@ function Pagination(props) {
3526
3528
  onPageChange,
3527
3529
  rowCount,
3528
3530
  size = "md",
3531
+ variant = "standard",
3529
3532
  ...innerProps
3530
3533
  } = props;
3531
3534
  const [paginationModel, setPaginationModel] = useControlledState(
@@ -3552,6 +3555,87 @@ function Pagination(props) {
3552
3555
  setPaginationModel({ ...paginationModel, page: lastPage });
3553
3556
  }
3554
3557
  }, [rowCount, paginationModel, lastPage, setPaginationModel]);
3558
+ const pageOptions = Array.from({ length: lastPage }, (_, i) => ({
3559
+ label: `${i + 1}`,
3560
+ value: `${i + 1}`
3561
+ }));
3562
+ if (variant === "compact") {
3563
+ return /* @__PURE__ */ React24.createElement(PaginationRoot, { ...innerProps }, /* @__PURE__ */ React24.createElement(PaginationContainer, { direction: "row", size, alignItems: "center" }, /* @__PURE__ */ React24.createElement(Stack_default, { direction: "row" }, /* @__PURE__ */ React24.createElement(
3564
+ PaginationIconButton,
3565
+ {
3566
+ size,
3567
+ variant: "plain",
3568
+ color: "neutral",
3569
+ onClick: () => handlePageChange(firstPage),
3570
+ disabled: paginationModel.page === firstPage,
3571
+ "aria-label": "First page"
3572
+ },
3573
+ /* @__PURE__ */ React24.createElement(FirstPageIcon, null)
3574
+ ), /* @__PURE__ */ React24.createElement(
3575
+ PaginationIconButton,
3576
+ {
3577
+ size,
3578
+ variant: "plain",
3579
+ color: "neutral",
3580
+ onClick: () => handlePageChange(paginationModel.page - 1),
3581
+ disabled: paginationModel.page === firstPage,
3582
+ "aria-label": "Previous page"
3583
+ },
3584
+ /* @__PURE__ */ React24.createElement(PreviousIcon, null)
3585
+ )), /* @__PURE__ */ React24.createElement(
3586
+ Autocomplete_default,
3587
+ {
3588
+ size,
3589
+ value: `${paginationModel.page}`,
3590
+ onChange: (event) => {
3591
+ if (event.target.value) {
3592
+ handlePageChange(parseInt(event.target.value, 10));
3593
+ }
3594
+ },
3595
+ options: pageOptions,
3596
+ sx: {
3597
+ width: {
3598
+ sm: "80px",
3599
+ md: "100px",
3600
+ lg: "120px"
3601
+ }[size]
3602
+ }
3603
+ }
3604
+ ), /* @__PURE__ */ React24.createElement(
3605
+ Typography_default,
3606
+ {
3607
+ level: `body-${size}`,
3608
+ sx: (theme) => ({
3609
+ color: theme.palette.text.secondary,
3610
+ fontWeight: 500
3611
+ })
3612
+ },
3613
+ "/ ",
3614
+ lastPage
3615
+ ), /* @__PURE__ */ React24.createElement(Stack_default, { direction: "row" }, /* @__PURE__ */ React24.createElement(
3616
+ PaginationIconButton,
3617
+ {
3618
+ size,
3619
+ variant: "plain",
3620
+ color: "neutral",
3621
+ onClick: () => handlePageChange(paginationModel.page + 1),
3622
+ disabled: paginationModel.page === lastPage,
3623
+ "aria-label": "Next page"
3624
+ },
3625
+ /* @__PURE__ */ React24.createElement(NextIcon, null)
3626
+ ), /* @__PURE__ */ React24.createElement(
3627
+ PaginationIconButton,
3628
+ {
3629
+ size,
3630
+ variant: "plain",
3631
+ color: "neutral",
3632
+ onClick: () => handlePageChange(lastPage),
3633
+ disabled: paginationModel.page === lastPage,
3634
+ "aria-label": "Last page"
3635
+ },
3636
+ /* @__PURE__ */ React24.createElement(LastPageIcon, null)
3637
+ ))));
3638
+ }
3555
3639
  return /* @__PURE__ */ React24.createElement(PaginationRoot, { ...innerProps }, /* @__PURE__ */ React24.createElement(PaginationContainer, { direction: "row", size, alignItems: "center" }, /* @__PURE__ */ React24.createElement(
3556
3640
  PaginationIconButton,
3557
3641
  {
@@ -3573,7 +3657,7 @@ function Pagination(props) {
3573
3657
  "aria-label": "More previous pages"
3574
3658
  },
3575
3659
  "..."
3576
- ), beforePages.map((p) => /* @__PURE__ */ React24.createElement(PaginationButton, { key: p, size, variant: "plain", color: "neutral", onClick: () => handlePageChange(p) }, p)), /* @__PURE__ */ React24.createElement(PaginationButton, { active: "active", size, "aria-current": "page" }, paginationModel.page), afterPages.map((p) => /* @__PURE__ */ React24.createElement(PaginationButton, { key: p, size, variant: "plain", color: "neutral", onClick: () => handlePageChange(p) }, p)), isMoreAfterPages && /* @__PURE__ */ React24.createElement(
3660
+ ), beforePages.map((p) => /* @__PURE__ */ React24.createElement(PaginationButton, { key: p, size, variant: "plain", color: "neutral", onClick: () => handlePageChange(p) }, p)), /* @__PURE__ */ React24.createElement(PaginationButton, { active: "true", size, "aria-current": "page" }, paginationModel.page), afterPages.map((p) => /* @__PURE__ */ React24.createElement(PaginationButton, { key: p, size, variant: "plain", color: "neutral", onClick: () => handlePageChange(p) }, p)), isMoreAfterPages && /* @__PURE__ */ React24.createElement(
3577
3661
  PaginationButton,
3578
3662
  {
3579
3663
  size,
@@ -4442,11 +4526,248 @@ var InsetDrawer = styled20(JoyDrawer2)(({ theme }) => ({
4442
4526
  }
4443
4527
  }));
4444
4528
 
4529
+ // src/components/FilterableCheckboxGroup/FilterableCheckboxGroup.tsx
4530
+ import React31, { useCallback as useCallback13, useEffect as useEffect8, useMemo as useMemo12, useRef as useRef8, useState as useState10 } from "react";
4531
+ import SearchIcon from "@mui/icons-material/Search";
4532
+ import { useVirtualizer as useVirtualizer3 } from "@tanstack/react-virtual";
4533
+ function LabelWithTooltip(props) {
4534
+ const { label, size } = props;
4535
+ const labelContentRef = useRef8(null);
4536
+ const [isOverflowing, setIsOverflowing] = useState10(false);
4537
+ const labelContent = /* @__PURE__ */ React31.createElement(
4538
+ "span",
4539
+ {
4540
+ ref: labelContentRef,
4541
+ style: {
4542
+ textOverflow: "ellipsis",
4543
+ overflow: "hidden",
4544
+ whiteSpace: "nowrap",
4545
+ display: "block",
4546
+ position: "relative",
4547
+ zIndex: 1,
4548
+ cursor: "pointer"
4549
+ }
4550
+ },
4551
+ label
4552
+ );
4553
+ useEffect8(() => {
4554
+ const element = labelContentRef.current;
4555
+ if (element) {
4556
+ setIsOverflowing(element.scrollWidth > element.clientWidth);
4557
+ }
4558
+ }, [label]);
4559
+ if (isOverflowing) {
4560
+ return /* @__PURE__ */ React31.createElement(Tooltip_default, { variant: "solid", size, title: label, placement: "bottom-start" }, labelContent);
4561
+ }
4562
+ return labelContent;
4563
+ }
4564
+ function FilterableCheckboxGroup(props) {
4565
+ const {
4566
+ value,
4567
+ options,
4568
+ label,
4569
+ placeholder,
4570
+ helperText,
4571
+ size = "md",
4572
+ required,
4573
+ onChange,
4574
+ maxHeight = 300,
4575
+ disabled
4576
+ } = props;
4577
+ const [searchTerm, setSearchTerm] = useState10("");
4578
+ const [sortedOptions, setSortedOptions] = useState10(options);
4579
+ const [internalValue, setInternalValue] = useControlledState(
4580
+ value,
4581
+ value ?? [],
4582
+ useCallback13((newValue) => onChange?.(newValue), [onChange])
4583
+ );
4584
+ const parentRef = useRef8(null);
4585
+ const isInitialSortRef = useRef8(false);
4586
+ const filteredOptions = useMemo12(() => {
4587
+ if (!searchTerm) return sortedOptions;
4588
+ return sortedOptions.filter((option) => option.label.toLowerCase().includes(searchTerm.toLowerCase()));
4589
+ }, [sortedOptions, searchTerm]);
4590
+ const itemSize = useMemo12(() => {
4591
+ switch (size) {
4592
+ case "sm":
4593
+ return 28;
4594
+ case "md":
4595
+ return 32;
4596
+ case "lg":
4597
+ return 36;
4598
+ }
4599
+ }, [size]);
4600
+ const noOptionsFontSize = useMemo12(() => {
4601
+ switch (size) {
4602
+ case "sm":
4603
+ return "14px";
4604
+ case "md":
4605
+ return "16px";
4606
+ case "lg":
4607
+ return "18px";
4608
+ }
4609
+ }, [size]);
4610
+ const virtualizer = useVirtualizer3({
4611
+ count: filteredOptions.length,
4612
+ estimateSize: () => itemSize,
4613
+ measureElement: (element) => element.clientHeight,
4614
+ getScrollElement: () => parentRef.current,
4615
+ overscan: 5
4616
+ });
4617
+ const items = virtualizer.getVirtualItems();
4618
+ useEffect8(() => {
4619
+ if (isInitialSortRef.current) return;
4620
+ const initialValue = value ?? [];
4621
+ const sorted = [...options].sort((a, b) => {
4622
+ const aSelected = initialValue.includes(a.value);
4623
+ const bSelected = initialValue.includes(b.value);
4624
+ if (aSelected !== bSelected) {
4625
+ return aSelected ? -1 : 1;
4626
+ }
4627
+ const aIsAlpha = /^[a-zA-Z]/.test(a.label);
4628
+ const bIsAlpha = /^[a-zA-Z]/.test(b.label);
4629
+ if (aIsAlpha !== bIsAlpha) {
4630
+ return aIsAlpha ? -1 : 1;
4631
+ }
4632
+ return a.label.localeCompare(b.label);
4633
+ });
4634
+ setSortedOptions(sorted);
4635
+ isInitialSortRef.current = true;
4636
+ }, [options, value]);
4637
+ useEffect8(() => {
4638
+ virtualizer.measure();
4639
+ }, [virtualizer, filteredOptions]);
4640
+ const handleSearchChange = useCallback13((event) => {
4641
+ setSearchTerm(event.target.value);
4642
+ }, []);
4643
+ const handleCheckboxChange = useCallback13(
4644
+ (optionValue) => (event) => {
4645
+ const checked = event.target.checked;
4646
+ const newValue = checked ? [...internalValue, optionValue] : internalValue.filter((v) => v !== optionValue);
4647
+ setInternalValue(newValue);
4648
+ },
4649
+ [internalValue, setInternalValue]
4650
+ );
4651
+ const handleSelectAll = useCallback13(
4652
+ (event) => {
4653
+ const checked = event.target.checked;
4654
+ const enabledOptions = filteredOptions.filter((option) => !option.disabled);
4655
+ const disabledSelectedValues = internalValue.filter(
4656
+ (v) => filteredOptions.some((opt) => opt.value === v && opt.disabled)
4657
+ );
4658
+ if (checked) {
4659
+ const enabledValues = enabledOptions.map((option) => option.value);
4660
+ setInternalValue([...disabledSelectedValues, ...enabledValues]);
4661
+ } else {
4662
+ setInternalValue(disabledSelectedValues);
4663
+ }
4664
+ },
4665
+ [filteredOptions, internalValue, setInternalValue]
4666
+ );
4667
+ const enabledFilteredOptions = useMemo12(() => filteredOptions.filter((option) => !option.disabled), [filteredOptions]);
4668
+ const isAllSelected = enabledFilteredOptions.length > 0 && enabledFilteredOptions.every((option) => internalValue.includes(option.value));
4669
+ const isIndeterminate = !isAllSelected && enabledFilteredOptions.some((option) => internalValue.includes(option.value));
4670
+ return /* @__PURE__ */ React31.createElement("div", { style: { width: "100%" } }, /* @__PURE__ */ React31.createElement(
4671
+ Input_default,
4672
+ {
4673
+ label,
4674
+ helperText,
4675
+ required,
4676
+ variant: "outlined",
4677
+ color: "neutral",
4678
+ placeholder,
4679
+ value: searchTerm,
4680
+ onChange: handleSearchChange,
4681
+ size,
4682
+ disabled,
4683
+ endDecorator: /* @__PURE__ */ React31.createElement(SearchIcon, null)
4684
+ }
4685
+ ), filteredOptions.length === 0 ? /* @__PURE__ */ React31.createElement(
4686
+ Stack_default,
4687
+ {
4688
+ sx: (theme) => ({
4689
+ padding: "20px 12px",
4690
+ justifyContent: "center",
4691
+ alignItems: "center",
4692
+ fontSize: noOptionsFontSize,
4693
+ color: theme.palette.neutral.softDisabledColor
4694
+ })
4695
+ },
4696
+ "No options found."
4697
+ ) : /* @__PURE__ */ React31.createElement(
4698
+ "div",
4699
+ {
4700
+ ref: parentRef,
4701
+ style: {
4702
+ overflow: "auto",
4703
+ maxHeight: typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight,
4704
+ padding: "8px 0px",
4705
+ marginTop: "8px"
4706
+ }
4707
+ },
4708
+ !searchTerm && /* @__PURE__ */ React31.createElement(
4709
+ Checkbox_default,
4710
+ {
4711
+ label: "Select all",
4712
+ checked: isAllSelected,
4713
+ indeterminate: isIndeterminate,
4714
+ onChange: handleSelectAll,
4715
+ size,
4716
+ disabled,
4717
+ slotProps: {
4718
+ action: {
4719
+ sx: { top: 0, left: 0, bottom: 0, right: 0 }
4720
+ }
4721
+ },
4722
+ sx: { width: "100%", height: itemSize }
4723
+ }
4724
+ ),
4725
+ /* @__PURE__ */ React31.createElement(
4726
+ Stack_default,
4727
+ {
4728
+ sx: {
4729
+ height: `${virtualizer.getTotalSize()}px`,
4730
+ position: "relative"
4731
+ }
4732
+ },
4733
+ items.map((virtualRow) => {
4734
+ const option = filteredOptions[virtualRow.index];
4735
+ return /* @__PURE__ */ React31.createElement(
4736
+ Checkbox_default,
4737
+ {
4738
+ key: virtualRow.key,
4739
+ label: /* @__PURE__ */ React31.createElement(LabelWithTooltip, { label: option.label, size }),
4740
+ checked: internalValue.includes(option.value),
4741
+ onChange: handleCheckboxChange(option.value),
4742
+ size,
4743
+ disabled: disabled || option.disabled,
4744
+ slotProps: {
4745
+ action: {
4746
+ sx: { top: 0, left: 0, bottom: 0, right: 0 }
4747
+ // NOTE: 불필요한 좌우 스크롤 방지
4748
+ }
4749
+ },
4750
+ sx: {
4751
+ position: "absolute",
4752
+ top: 0,
4753
+ left: 0,
4754
+ width: "100%",
4755
+ height: `${virtualRow.size}px`,
4756
+ transform: `translateY(${virtualRow.start}px)`
4757
+ }
4758
+ }
4759
+ );
4760
+ })
4761
+ )
4762
+ ));
4763
+ }
4764
+ FilterableCheckboxGroup.displayName = "FilterableCheckboxGroup";
4765
+
4445
4766
  // src/components/Grid/Grid.tsx
4446
4767
  import { Grid } from "@mui/joy";
4447
4768
 
4448
4769
  // src/components/IconMenuButton/IconMenuButton.tsx
4449
- import React31 from "react";
4770
+ import React32 from "react";
4450
4771
  import { MenuButton as JoyMenuButton2, IconButton as JoyIconButton2 } from "@mui/joy";
4451
4772
  function IconMenuButton(props) {
4452
4773
  const {
@@ -4460,7 +4781,7 @@ function IconMenuButton(props) {
4460
4781
  placement = "bottom"
4461
4782
  } = props;
4462
4783
  if (!items.length) {
4463
- return /* @__PURE__ */ React31.createElement(
4784
+ return /* @__PURE__ */ React32.createElement(
4464
4785
  JoyIconButton2,
4465
4786
  {
4466
4787
  component: props.buttonComponent ?? "button",
@@ -4474,7 +4795,7 @@ function IconMenuButton(props) {
4474
4795
  icon
4475
4796
  );
4476
4797
  }
4477
- return /* @__PURE__ */ React31.createElement(Dropdown_default, null, /* @__PURE__ */ React31.createElement(
4798
+ return /* @__PURE__ */ React32.createElement(Dropdown_default, null, /* @__PURE__ */ React32.createElement(
4478
4799
  JoyMenuButton2,
4479
4800
  {
4480
4801
  slots: { root: JoyIconButton2 },
@@ -4491,19 +4812,19 @@ function IconMenuButton(props) {
4491
4812
  }
4492
4813
  },
4493
4814
  icon
4494
- ), /* @__PURE__ */ React31.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React31.createElement(MenuItem, { key: i.text, component: i.component, ...i.componentProps ?? {} }, i.text))));
4815
+ ), /* @__PURE__ */ React32.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React32.createElement(MenuItem, { key: i.text, component: i.component, ...i.componentProps ?? {} }, i.text))));
4495
4816
  }
4496
4817
  IconMenuButton.displayName = "IconMenuButton";
4497
4818
 
4498
4819
  // src/components/Markdown/Markdown.tsx
4499
- import React32, { lazy, Suspense, useEffect as useEffect8, useState as useState10 } from "react";
4820
+ import React33, { lazy, Suspense, useEffect as useEffect9, useState as useState11 } from "react";
4500
4821
  import { Skeleton } from "@mui/joy";
4501
4822
  import { Link as Link2 } from "@mui/joy";
4502
4823
  import remarkGfm from "remark-gfm";
4503
4824
  var LazyReactMarkdown = lazy(() => import("react-markdown"));
4504
4825
  var Markdown = (props) => {
4505
- const [rehypeAccent2, setRehypeAccent] = useState10(null);
4506
- useEffect8(() => {
4826
+ const [rehypeAccent2, setRehypeAccent] = useState11(null);
4827
+ useEffect9(() => {
4507
4828
  const loadRehypeAccent = async () => {
4508
4829
  const module = await Promise.resolve().then(() => (init_rehype_accent(), rehype_accent_exports));
4509
4830
  setRehypeAccent(() => module.rehypeAccent);
@@ -4525,12 +4846,12 @@ var Markdown = (props) => {
4525
4846
  if (!rehypeAccent2) {
4526
4847
  return null;
4527
4848
  }
4528
- return /* @__PURE__ */ React32.createElement(Typography, { component: "div", color, textColor, level: defaultLevel, ...innerProps }, /* @__PURE__ */ React32.createElement(
4849
+ return /* @__PURE__ */ React33.createElement(Typography, { component: "div", color, textColor, level: defaultLevel, ...innerProps }, /* @__PURE__ */ React33.createElement(
4529
4850
  Suspense,
4530
4851
  {
4531
- fallback: fallback || /* @__PURE__ */ React32.createElement(Typography, null, /* @__PURE__ */ React32.createElement(Skeleton, null, content || ""))
4852
+ fallback: fallback || /* @__PURE__ */ React33.createElement(Typography, null, /* @__PURE__ */ React33.createElement(Skeleton, null, content || ""))
4532
4853
  },
4533
- /* @__PURE__ */ React32.createElement(
4854
+ /* @__PURE__ */ React33.createElement(
4534
4855
  LazyReactMarkdown,
4535
4856
  {
4536
4857
  ...markdownOptions,
@@ -4538,15 +4859,15 @@ var Markdown = (props) => {
4538
4859
  rehypePlugins: [[rehypeAccent2, { accentColor }]],
4539
4860
  remarkPlugins: [remarkGfm],
4540
4861
  components: {
4541
- h1: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { color, textColor, level: "h1" }, children),
4542
- h2: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { color, textColor, level: "h2" }, children),
4543
- h3: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { color, textColor, level: "h3" }, children),
4544
- h4: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { color, textColor, level: "h4" }, children),
4545
- p: ({ children, node }) => /* @__PURE__ */ React32.createElement(Typography, { color, textColor, level: defaultLevel, ...node?.properties }, children),
4546
- a: ({ children, href }) => /* @__PURE__ */ React32.createElement(Link2, { href, target: defaultLinkAction }, children),
4547
- hr: () => /* @__PURE__ */ React32.createElement(Divider, null),
4548
- b: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { fontWeight: boldFontWeight }, children),
4549
- strong: ({ children }) => /* @__PURE__ */ React32.createElement(Typography, { fontWeight: boldFontWeight }, children),
4862
+ h1: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { color, textColor, level: "h1" }, children),
4863
+ h2: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { color, textColor, level: "h2" }, children),
4864
+ h3: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { color, textColor, level: "h3" }, children),
4865
+ h4: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { color, textColor, level: "h4" }, children),
4866
+ p: ({ children, node }) => /* @__PURE__ */ React33.createElement(Typography, { color, textColor, level: defaultLevel, ...node?.properties }, children),
4867
+ a: ({ children, href }) => /* @__PURE__ */ React33.createElement(Link2, { href, target: defaultLinkAction }, children),
4868
+ hr: () => /* @__PURE__ */ React33.createElement(Divider, null),
4869
+ b: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { fontWeight: boldFontWeight }, children),
4870
+ strong: ({ children }) => /* @__PURE__ */ React33.createElement(Typography, { fontWeight: boldFontWeight }, children),
4550
4871
  ...markdownOptions?.components
4551
4872
  }
4552
4873
  }
@@ -4556,7 +4877,7 @@ var Markdown = (props) => {
4556
4877
  Markdown.displayName = "Markdown";
4557
4878
 
4558
4879
  // src/components/MenuButton/MenuButton.tsx
4559
- import React33 from "react";
4880
+ import React34 from "react";
4560
4881
  import { MenuButton as JoyMenuButton3, Button as JoyButton2 } from "@mui/joy";
4561
4882
  import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
4562
4883
  function MenuButton(props) {
@@ -4574,7 +4895,7 @@ function MenuButton(props) {
4574
4895
  placement = "bottom"
4575
4896
  } = props;
4576
4897
  if (!items.length) {
4577
- return /* @__PURE__ */ React33.createElement(
4898
+ return /* @__PURE__ */ React34.createElement(
4578
4899
  JoyButton2,
4579
4900
  {
4580
4901
  component: props.buttonComponent ?? "button",
@@ -4585,12 +4906,12 @@ function MenuButton(props) {
4585
4906
  loading,
4586
4907
  startDecorator,
4587
4908
  ...props.buttonComponentProps ?? {},
4588
- endDecorator: showIcon ? /* @__PURE__ */ React33.createElement(React33.Fragment, null, endDecorator, /* @__PURE__ */ React33.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React33.createElement(React33.Fragment, null, endDecorator)
4909
+ endDecorator: showIcon ? /* @__PURE__ */ React34.createElement(React34.Fragment, null, endDecorator, /* @__PURE__ */ React34.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React34.createElement(React34.Fragment, null, endDecorator)
4589
4910
  },
4590
4911
  buttonText
4591
4912
  );
4592
4913
  }
4593
- return /* @__PURE__ */ React33.createElement(Dropdown_default, null, /* @__PURE__ */ React33.createElement(
4914
+ return /* @__PURE__ */ React34.createElement(Dropdown_default, null, /* @__PURE__ */ React34.createElement(
4594
4915
  JoyMenuButton3,
4595
4916
  {
4596
4917
  component: props.buttonComponent ?? "button",
@@ -4601,15 +4922,15 @@ function MenuButton(props) {
4601
4922
  loading,
4602
4923
  startDecorator,
4603
4924
  ...props.buttonComponentProps ?? {},
4604
- endDecorator: showIcon ? /* @__PURE__ */ React33.createElement(React33.Fragment, null, endDecorator, /* @__PURE__ */ React33.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React33.createElement(React33.Fragment, null, endDecorator)
4925
+ endDecorator: showIcon ? /* @__PURE__ */ React34.createElement(React34.Fragment, null, endDecorator, /* @__PURE__ */ React34.createElement(ExpandMoreIcon, null)) : /* @__PURE__ */ React34.createElement(React34.Fragment, null, endDecorator)
4605
4926
  },
4606
4927
  buttonText
4607
- ), /* @__PURE__ */ React33.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React33.createElement(MenuItem, { key: i.text, component: i.component, ...i.componentProps ?? {} }, i.text))));
4928
+ ), /* @__PURE__ */ React34.createElement(Menu, { placement, size }, items.map((i) => /* @__PURE__ */ React34.createElement(MenuItem, { key: i.text, component: i.component, ...i.componentProps ?? {} }, i.text))));
4608
4929
  }
4609
4930
  MenuButton.displayName = "MenuButton";
4610
4931
 
4611
4932
  // src/components/MonthPicker/MonthPicker.tsx
4612
- import React34, { forwardRef as forwardRef9, useCallback as useCallback13, useEffect as useEffect9, useImperativeHandle as useImperativeHandle4, useRef as useRef8, useState as useState11 } from "react";
4933
+ import React35, { forwardRef as forwardRef9, useCallback as useCallback14, useEffect as useEffect10, useImperativeHandle as useImperativeHandle4, useRef as useRef9, useState as useState12 } from "react";
4613
4934
  import CalendarTodayIcon3 from "@mui/icons-material/CalendarToday";
4614
4935
  import { styled as styled21, useThemeProps as useThemeProps6 } from "@mui/joy";
4615
4936
  import { FocusTrap as FocusTrap3, ClickAwayListener as ClickAwayListener3, Popper as Popper4 } from "@mui/base";
@@ -4691,14 +5012,14 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4691
5012
  locale,
4692
5013
  ...innerProps
4693
5014
  } = props;
4694
- const innerRef = useRef8(null);
4695
- const buttonRef = useRef8(null);
5015
+ const innerRef = useRef9(null);
5016
+ const buttonRef = useRef9(null);
4696
5017
  const [value, setValue, isControlled] = useControlledState(
4697
5018
  props.value,
4698
5019
  props.defaultValue || "",
4699
- useCallback13((value2) => onChange?.({ target: { name: props.name, value: value2 } }), [props.name, onChange])
5020
+ useCallback14((value2) => onChange?.({ target: { name: props.name, value: value2 } }), [props.name, onChange])
4700
5021
  );
4701
- const getFormattedDisplayValue = useCallback13(
5022
+ const getFormattedDisplayValue = useCallback14(
4702
5023
  (inputValue) => {
4703
5024
  if (!inputValue) return "";
4704
5025
  try {
@@ -4709,19 +5030,19 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4709
5030
  },
4710
5031
  [format, displayFormat, locale]
4711
5032
  );
4712
- const [displayValue, setDisplayValue] = useState11(() => getFormattedDisplayValue(value));
4713
- const [anchorEl, setAnchorEl] = useState11(null);
5033
+ const [displayValue, setDisplayValue] = useState12(() => getFormattedDisplayValue(value));
5034
+ const [anchorEl, setAnchorEl] = useState12(null);
4714
5035
  const open = Boolean(anchorEl);
4715
- useEffect9(() => {
5036
+ useEffect10(() => {
4716
5037
  if (!anchorEl) {
4717
5038
  innerRef.current?.blur();
4718
5039
  }
4719
5040
  }, [anchorEl, innerRef]);
4720
5041
  useImperativeHandle4(ref, () => innerRef.current, [innerRef]);
4721
- useEffect9(() => {
5042
+ useEffect10(() => {
4722
5043
  setDisplayValue(getFormattedDisplayValue(value));
4723
5044
  }, [value, getFormattedDisplayValue]);
4724
- const handleChange = useCallback13(
5045
+ const handleChange = useCallback14(
4725
5046
  (event) => {
4726
5047
  const newValue = event.target.value;
4727
5048
  setValue(newValue);
@@ -4731,21 +5052,21 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4731
5052
  },
4732
5053
  [setValue, getFormattedDisplayValue, isControlled]
4733
5054
  );
4734
- const handleCalendarToggle = useCallback13(
5055
+ const handleCalendarToggle = useCallback14(
4735
5056
  (event) => {
4736
5057
  setAnchorEl(anchorEl ? null : event.currentTarget);
4737
5058
  innerRef.current?.focus();
4738
5059
  },
4739
5060
  [anchorEl, setAnchorEl, innerRef]
4740
5061
  );
4741
- const handleInputMouseDown = useCallback13(
5062
+ const handleInputMouseDown = useCallback14(
4742
5063
  (event) => {
4743
5064
  event.preventDefault();
4744
5065
  buttonRef.current?.focus();
4745
5066
  },
4746
5067
  [buttonRef]
4747
5068
  );
4748
- return /* @__PURE__ */ React34.createElement(MonthPickerRoot, null, /* @__PURE__ */ React34.createElement(FocusTrap3, { open: true }, /* @__PURE__ */ React34.createElement(React34.Fragment, null, /* @__PURE__ */ React34.createElement(
5069
+ return /* @__PURE__ */ React35.createElement(MonthPickerRoot, null, /* @__PURE__ */ React35.createElement(FocusTrap3, { open: true }, /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement(
4749
5070
  Input_default,
4750
5071
  {
4751
5072
  ...innerProps,
@@ -4775,7 +5096,7 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4775
5096
  // NOTE: placeholder char 를 텍스트로 표시하므로 동일한 너비를 가지는 mono font 를 사용해야 이질감이 없다.
4776
5097
  fontFamily: "monospace"
4777
5098
  },
4778
- endDecorator: /* @__PURE__ */ React34.createElement(
5099
+ endDecorator: /* @__PURE__ */ React35.createElement(
4779
5100
  IconButton_default,
4780
5101
  {
4781
5102
  ref: buttonRef,
@@ -4787,12 +5108,12 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4787
5108
  "aria-expanded": open,
4788
5109
  disabled
4789
5110
  },
4790
- /* @__PURE__ */ React34.createElement(CalendarTodayIcon3, null)
5111
+ /* @__PURE__ */ React35.createElement(CalendarTodayIcon3, null)
4791
5112
  ),
4792
5113
  label,
4793
5114
  helperText
4794
5115
  }
4795
- ), open && /* @__PURE__ */ React34.createElement(ClickAwayListener3, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React34.createElement(
5116
+ ), open && /* @__PURE__ */ React35.createElement(ClickAwayListener3, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React35.createElement(
4796
5117
  StyledPopper3,
4797
5118
  {
4798
5119
  id: "month-picker-popper",
@@ -4811,7 +5132,7 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4811
5132
  "aria-label": "Calendar Tooltip",
4812
5133
  "aria-expanded": open
4813
5134
  },
4814
- /* @__PURE__ */ React34.createElement(CalendarSheet3, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React34.createElement(
5135
+ /* @__PURE__ */ React35.createElement(CalendarSheet3, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React35.createElement(
4815
5136
  Calendar_default,
4816
5137
  {
4817
5138
  view: "month",
@@ -4832,14 +5153,14 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4832
5153
  disablePast,
4833
5154
  locale
4834
5155
  }
4835
- ), /* @__PURE__ */ React34.createElement(
5156
+ ), /* @__PURE__ */ React35.createElement(
4836
5157
  DialogActions_default,
4837
5158
  {
4838
5159
  sx: {
4839
5160
  p: 1
4840
5161
  }
4841
5162
  },
4842
- /* @__PURE__ */ React34.createElement(
5163
+ /* @__PURE__ */ React35.createElement(
4843
5164
  Button_default,
4844
5165
  {
4845
5166
  size,
@@ -4862,7 +5183,7 @@ var MonthPicker = forwardRef9((inProps, ref) => {
4862
5183
  });
4863
5184
 
4864
5185
  // src/components/MonthRangePicker/MonthRangePicker.tsx
4865
- import React35, { forwardRef as forwardRef10, useCallback as useCallback14, useEffect as useEffect10, useImperativeHandle as useImperativeHandle5, useMemo as useMemo12, useRef as useRef9, useState as useState12 } from "react";
5186
+ import React36, { forwardRef as forwardRef10, useCallback as useCallback15, useEffect as useEffect11, useImperativeHandle as useImperativeHandle5, useMemo as useMemo13, useRef as useRef10, useState as useState13 } from "react";
4866
5187
  import { IMaskInput as IMaskInput3, IMask as IMask3 } from "react-imask";
4867
5188
  import CalendarTodayIcon4 from "@mui/icons-material/CalendarToday";
4868
5189
  import { styled as styled22, useThemeProps as useThemeProps7 } from "@mui/joy";
@@ -4920,9 +5241,9 @@ var parseDates2 = (str) => {
4920
5241
  var formatToPattern3 = (format) => {
4921
5242
  return `${format} - ${format}`.replace(/YYYY/g, "Y").replace(/MM/g, "m").replace(/[^YMm\s]/g, (match) => `${match}\``);
4922
5243
  };
4923
- var TextMaskAdapter7 = React35.forwardRef(function TextMaskAdapter8(props, ref) {
5244
+ var TextMaskAdapter7 = React36.forwardRef(function TextMaskAdapter8(props, ref) {
4924
5245
  const { onChange, format, ...other } = props;
4925
- return /* @__PURE__ */ React35.createElement(
5246
+ return /* @__PURE__ */ React36.createElement(
4926
5247
  IMaskInput3,
4927
5248
  {
4928
5249
  ...other,
@@ -4970,35 +5291,35 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
4970
5291
  size,
4971
5292
  ...innerProps
4972
5293
  } = props;
4973
- const innerRef = useRef9(null);
5294
+ const innerRef = useRef10(null);
4974
5295
  const [value, setValue] = useControlledState(
4975
5296
  props.value,
4976
5297
  props.defaultValue || "",
4977
- useCallback14((value2) => onChange?.({ target: { name: props.name, value: value2 } }), [props.name, onChange])
5298
+ useCallback15((value2) => onChange?.({ target: { name: props.name, value: value2 } }), [props.name, onChange])
4978
5299
  );
4979
- const [anchorEl, setAnchorEl] = useState12(null);
5300
+ const [anchorEl, setAnchorEl] = useState13(null);
4980
5301
  const open = Boolean(anchorEl);
4981
- const calendarValue = useMemo12(() => value ? parseDates2(value) : void 0, [value]);
4982
- useEffect10(() => {
5302
+ const calendarValue = useMemo13(() => value ? parseDates2(value) : void 0, [value]);
5303
+ useEffect11(() => {
4983
5304
  if (!anchorEl) {
4984
5305
  innerRef.current?.blur();
4985
5306
  }
4986
5307
  }, [anchorEl, innerRef]);
4987
5308
  useImperativeHandle5(ref, () => innerRef.current, [innerRef]);
4988
- const handleChange = useCallback14(
5309
+ const handleChange = useCallback15(
4989
5310
  (event) => {
4990
5311
  setValue(event.target.value);
4991
5312
  },
4992
5313
  [setValue]
4993
5314
  );
4994
- const handleCalendarToggle = useCallback14(
5315
+ const handleCalendarToggle = useCallback15(
4995
5316
  (event) => {
4996
5317
  setAnchorEl(anchorEl ? null : event.currentTarget);
4997
5318
  innerRef.current?.focus();
4998
5319
  },
4999
5320
  [anchorEl, setAnchorEl, innerRef]
5000
5321
  );
5001
- const handleCalendarChange = useCallback14(
5322
+ const handleCalendarChange = useCallback15(
5002
5323
  ([date1, date2]) => {
5003
5324
  if (!date1 || !date2) return;
5004
5325
  setValue(formatValueString4([date1, date2], format));
@@ -5006,7 +5327,7 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5006
5327
  },
5007
5328
  [setValue, setAnchorEl, format]
5008
5329
  );
5009
- return /* @__PURE__ */ React35.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ React35.createElement(FocusTrap4, { open: true }, /* @__PURE__ */ React35.createElement(React35.Fragment, null, /* @__PURE__ */ React35.createElement(
5330
+ return /* @__PURE__ */ React36.createElement(MonthRangePickerRoot, null, /* @__PURE__ */ React36.createElement(FocusTrap4, { open: true }, /* @__PURE__ */ React36.createElement(React36.Fragment, null, /* @__PURE__ */ React36.createElement(
5010
5331
  Input_default,
5011
5332
  {
5012
5333
  ...innerProps,
@@ -5028,7 +5349,7 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5028
5349
  // NOTE: placeholder char 를 텍스트로 표시하므로 동일한 너비를 가지는 mono font 를 사용해야 이질감이 없다.
5029
5350
  fontFamily: "monospace"
5030
5351
  },
5031
- endDecorator: /* @__PURE__ */ React35.createElement(
5352
+ endDecorator: /* @__PURE__ */ React36.createElement(
5032
5353
  IconButton_default,
5033
5354
  {
5034
5355
  variant: "plain",
@@ -5038,12 +5359,12 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5038
5359
  "aria-haspopup": "dialog",
5039
5360
  "aria-expanded": open
5040
5361
  },
5041
- /* @__PURE__ */ React35.createElement(CalendarTodayIcon4, null)
5362
+ /* @__PURE__ */ React36.createElement(CalendarTodayIcon4, null)
5042
5363
  ),
5043
5364
  label,
5044
5365
  helperText
5045
5366
  }
5046
- ), open && /* @__PURE__ */ React35.createElement(ClickAwayListener4, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React35.createElement(
5367
+ ), open && /* @__PURE__ */ React36.createElement(ClickAwayListener4, { onClickAway: () => setAnchorEl(null) }, /* @__PURE__ */ React36.createElement(
5047
5368
  StyledPopper4,
5048
5369
  {
5049
5370
  id: "month-range-picker-popper",
@@ -5062,7 +5383,7 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5062
5383
  "aria-label": "Calendar Tooltip",
5063
5384
  "aria-expanded": open
5064
5385
  },
5065
- /* @__PURE__ */ React35.createElement(CalendarSheet4, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React35.createElement(
5386
+ /* @__PURE__ */ React36.createElement(CalendarSheet4, { tabIndex: -1, role: "presentation" }, /* @__PURE__ */ React36.createElement(
5066
5387
  Calendar_default,
5067
5388
  {
5068
5389
  view: "month",
@@ -5075,14 +5396,14 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5075
5396
  disableFuture,
5076
5397
  disablePast
5077
5398
  }
5078
- ), /* @__PURE__ */ React35.createElement(
5399
+ ), /* @__PURE__ */ React36.createElement(
5079
5400
  DialogActions_default,
5080
5401
  {
5081
5402
  sx: {
5082
5403
  p: 1
5083
5404
  }
5084
5405
  },
5085
- /* @__PURE__ */ React35.createElement(
5406
+ /* @__PURE__ */ React36.createElement(
5086
5407
  Button_default,
5087
5408
  {
5088
5409
  size,
@@ -5101,7 +5422,7 @@ var MonthRangePicker = forwardRef10((inProps, ref) => {
5101
5422
  MonthRangePicker.displayName = "MonthRangePicker";
5102
5423
 
5103
5424
  // src/components/NavigationGroup/NavigationGroup.tsx
5104
- import React36 from "react";
5425
+ import React37 from "react";
5105
5426
  import {
5106
5427
  Accordion as JoyAccordion2,
5107
5428
  AccordionSummary as JoyAccordionSummary2,
@@ -5132,11 +5453,11 @@ var AccordionDetails2 = styled23(JoyAccordionDetails2, {
5132
5453
  }));
5133
5454
  function NavigationGroup(props) {
5134
5455
  const { title, children, startDecorator, level, ...rest } = props;
5135
- return /* @__PURE__ */ React36.createElement(JoyAccordion2, { ...rest }, /* @__PURE__ */ React36.createElement(AccordionSummary2, { useIcon: !!startDecorator, level }, /* @__PURE__ */ React36.createElement(Stack2, { direction: "row", gap: 4 }, startDecorator, title)), /* @__PURE__ */ React36.createElement(AccordionDetails2, null, children));
5456
+ return /* @__PURE__ */ React37.createElement(JoyAccordion2, { ...rest }, /* @__PURE__ */ React37.createElement(AccordionSummary2, { useIcon: !!startDecorator, level }, /* @__PURE__ */ React37.createElement(Stack2, { direction: "row", gap: 4 }, startDecorator, title)), /* @__PURE__ */ React37.createElement(AccordionDetails2, null, children));
5136
5457
  }
5137
5458
 
5138
5459
  // src/components/NavigationItem/NavigationItem.tsx
5139
- import React37 from "react";
5460
+ import React38 from "react";
5140
5461
  import {
5141
5462
  ListItem as JoyListItem,
5142
5463
  ListItemButton as JoyListItemButton,
@@ -5171,7 +5492,7 @@ function NavigationItem(props) {
5171
5492
  const handleClick = () => {
5172
5493
  onClick?.(id);
5173
5494
  };
5174
- return /* @__PURE__ */ React37.createElement(JoyListItem, { ...rest }, /* @__PURE__ */ React37.createElement(
5495
+ return /* @__PURE__ */ React38.createElement(JoyListItem, { ...rest }, /* @__PURE__ */ React38.createElement(
5175
5496
  ListItemButton,
5176
5497
  {
5177
5498
  level,
@@ -5180,21 +5501,21 @@ function NavigationItem(props) {
5180
5501
  "aria-current": selected,
5181
5502
  onClick: handleClick
5182
5503
  },
5183
- startDecorator && /* @__PURE__ */ React37.createElement(JoyListItemDecorator, null, startDecorator),
5504
+ startDecorator && /* @__PURE__ */ React38.createElement(JoyListItemDecorator, null, startDecorator),
5184
5505
  children
5185
5506
  ));
5186
5507
  }
5187
5508
 
5188
5509
  // src/components/Navigator/Navigator.tsx
5189
- import React38 from "react";
5510
+ import React39 from "react";
5190
5511
  function Navigator(props) {
5191
5512
  const { items, level = 0, onSelect } = props;
5192
5513
  const handleItemClick = (id) => {
5193
5514
  onSelect?.(id);
5194
5515
  };
5195
- return /* @__PURE__ */ React38.createElement("div", null, items.map((item, index) => {
5516
+ return /* @__PURE__ */ React39.createElement("div", null, items.map((item, index) => {
5196
5517
  if (item.type === "item") {
5197
- return /* @__PURE__ */ React38.createElement(
5518
+ return /* @__PURE__ */ React39.createElement(
5198
5519
  NavigationItem,
5199
5520
  {
5200
5521
  key: item.id,
@@ -5207,7 +5528,7 @@ function Navigator(props) {
5207
5528
  item.title
5208
5529
  );
5209
5530
  } else if (item.type === "group") {
5210
- return /* @__PURE__ */ React38.createElement(
5531
+ return /* @__PURE__ */ React39.createElement(
5211
5532
  NavigationGroup,
5212
5533
  {
5213
5534
  key: `${item.title}-${index}`,
@@ -5225,16 +5546,16 @@ function Navigator(props) {
5225
5546
  Navigator.displayName = "Navigator";
5226
5547
 
5227
5548
  // src/components/PercentageInput/PercentageInput.tsx
5228
- import React39, { useCallback as useCallback15, useMemo as useMemo13, useState as useState13 } from "react";
5549
+ import React40, { useCallback as useCallback16, useMemo as useMemo14, useState as useState14 } from "react";
5229
5550
  import { NumericFormat as NumericFormat2 } from "react-number-format";
5230
5551
  import { styled as styled25, useThemeProps as useThemeProps8 } from "@mui/joy";
5231
5552
  var padDecimal = (value, decimalScale) => {
5232
5553
  const [integer, decimal = ""] = `${value}`.split(".");
5233
5554
  return Number(`${integer}${decimal.padEnd(decimalScale, "0")}`);
5234
5555
  };
5235
- var TextMaskAdapter9 = React39.forwardRef(function TextMaskAdapter10(props, ref) {
5556
+ var TextMaskAdapter9 = React40.forwardRef(function TextMaskAdapter10(props, ref) {
5236
5557
  const { onChange, min, max, ...innerProps } = props;
5237
- return /* @__PURE__ */ React39.createElement(
5558
+ return /* @__PURE__ */ React40.createElement(
5238
5559
  NumericFormat2,
5239
5560
  {
5240
5561
  ...innerProps,
@@ -5259,7 +5580,7 @@ var PercentageInputRoot = styled25(Input_default, {
5259
5580
  slot: "Root",
5260
5581
  overridesResolver: (props, styles) => styles.root
5261
5582
  })({});
5262
- var PercentageInput = React39.forwardRef(
5583
+ var PercentageInput = React40.forwardRef(
5263
5584
  function PercentageInput2(inProps, ref) {
5264
5585
  const props = useThemeProps8({ props: inProps, name: "PercentageInput" });
5265
5586
  const {
@@ -5282,18 +5603,18 @@ var PercentageInput = React39.forwardRef(
5282
5603
  const [_value, setValue] = useControlledState(
5283
5604
  props.value,
5284
5605
  props.defaultValue,
5285
- useCallback15((value2) => onChange?.({ target: { name, value: value2 } }), [onChange, name])
5606
+ useCallback16((value2) => onChange?.({ target: { name, value: value2 } }), [onChange, name])
5286
5607
  );
5287
- const [internalError, setInternalError] = useState13(
5608
+ const [internalError, setInternalError] = useState14(
5288
5609
  max && _value && _value > max || min && _value && _value < min
5289
5610
  );
5290
- const value = useMemo13(() => {
5611
+ const value = useMemo14(() => {
5291
5612
  if (_value && useMinorUnit) {
5292
5613
  return _value / Math.pow(10, maxDecimalScale);
5293
5614
  }
5294
5615
  return _value;
5295
5616
  }, [_value, useMinorUnit, maxDecimalScale]);
5296
- const handleChange = useCallback15(
5617
+ const handleChange = useCallback16(
5297
5618
  (event) => {
5298
5619
  if (event.target.value === "") {
5299
5620
  setValue(void 0);
@@ -5310,7 +5631,7 @@ var PercentageInput = React39.forwardRef(
5310
5631
  },
5311
5632
  [setValue, useMinorUnit, maxDecimalScale, min, max]
5312
5633
  );
5313
- return /* @__PURE__ */ React39.createElement(
5634
+ return /* @__PURE__ */ React40.createElement(
5314
5635
  PercentageInputRoot,
5315
5636
  {
5316
5637
  ...innerProps,
@@ -5351,15 +5672,15 @@ var RadioGroup = MotionRadioGroup;
5351
5672
  RadioGroup.displayName = "RadioGroup";
5352
5673
 
5353
5674
  // src/components/RadioList/RadioList.tsx
5354
- import React40 from "react";
5675
+ import React41 from "react";
5355
5676
  function RadioList(props) {
5356
5677
  const { items, ...innerProps } = props;
5357
- return /* @__PURE__ */ React40.createElement(RadioGroup, { ...innerProps }, items.map((item) => /* @__PURE__ */ React40.createElement(Radio, { key: `${item.value}`, value: item.value, label: item.label })));
5678
+ return /* @__PURE__ */ React41.createElement(RadioGroup, { ...innerProps }, items.map((item) => /* @__PURE__ */ React41.createElement(Radio, { key: `${item.value}`, value: item.value, label: item.label })));
5358
5679
  }
5359
5680
  RadioList.displayName = "RadioList";
5360
5681
 
5361
5682
  // src/components/Stepper/Stepper.tsx
5362
- import React41 from "react";
5683
+ import React42 from "react";
5363
5684
  import {
5364
5685
  Stepper as JoyStepper,
5365
5686
  Step as JoyStep,
@@ -5395,7 +5716,7 @@ function Stepper(props) {
5395
5716
  stepOrientation = "horizontal"
5396
5717
  } = props;
5397
5718
  const effectiveStepOrientation = orientation === "vertical" ? "horizontal" : stepOrientation;
5398
- return /* @__PURE__ */ React41.createElement(
5719
+ return /* @__PURE__ */ React42.createElement(
5399
5720
  MotionStepper,
5400
5721
  {
5401
5722
  orientation,
@@ -5434,23 +5755,23 @@ function Stepper(props) {
5434
5755
  const completed = activeStep > i + 1;
5435
5756
  const disabled = activeStep < i + 1;
5436
5757
  const hasContent = step.label || step.extraContent;
5437
- return /* @__PURE__ */ React41.createElement(
5758
+ return /* @__PURE__ */ React42.createElement(
5438
5759
  Step,
5439
5760
  {
5440
5761
  key: `step-${i}`,
5441
- indicator: /* @__PURE__ */ React41.createElement(StepIndicator, { variant: disabled ? "outlined" : "solid", color: disabled ? "neutral" : "primary" }, completed ? /* @__PURE__ */ React41.createElement(CheckIcon, null) : step.indicatorContent),
5762
+ indicator: /* @__PURE__ */ React42.createElement(StepIndicator, { variant: disabled ? "outlined" : "solid", color: disabled ? "neutral" : "primary" }, completed ? /* @__PURE__ */ React42.createElement(CheckIcon, null) : step.indicatorContent),
5442
5763
  active,
5443
5764
  completed,
5444
5765
  disabled,
5445
5766
  orientation: effectiveStepOrientation
5446
5767
  },
5447
- hasContent && /* @__PURE__ */ React41.createElement(
5768
+ hasContent && /* @__PURE__ */ React42.createElement(
5448
5769
  Stack_default,
5449
5770
  {
5450
5771
  sx: orientation === "horizontal" && effectiveStepOrientation === "vertical" ? { alignItems: "center" } : {}
5451
5772
  },
5452
- step.label && /* @__PURE__ */ React41.createElement(Typography_default, { level: "title-sm" }, step.label),
5453
- step.extraContent && /* @__PURE__ */ React41.createElement(Typography_default, { level: "body-xs" }, step.extraContent)
5773
+ step.label && /* @__PURE__ */ React42.createElement(Typography_default, { level: "title-sm" }, step.label),
5774
+ step.extraContent && /* @__PURE__ */ React42.createElement(Typography_default, { level: "body-xs" }, step.extraContent)
5454
5775
  )
5455
5776
  );
5456
5777
  })
@@ -5459,7 +5780,7 @@ function Stepper(props) {
5459
5780
  Stepper.displayName = "Stepper";
5460
5781
 
5461
5782
  // src/components/Switch/Switch.tsx
5462
- import React42 from "react";
5783
+ import React43 from "react";
5463
5784
  import { Switch as JoySwitch, styled as styled27, switchClasses } from "@mui/joy";
5464
5785
  import { motion as motion28 } from "framer-motion";
5465
5786
  var MotionSwitch = motion28(JoySwitch);
@@ -5481,14 +5802,14 @@ var StyledThumb = styled27(motion28.div)({
5481
5802
  right: "var(--Switch-thumbOffset)"
5482
5803
  }
5483
5804
  });
5484
- var Thumb = (props) => /* @__PURE__ */ React42.createElement(StyledThumb, { ...props, layout: true, transition: spring });
5805
+ var Thumb = (props) => /* @__PURE__ */ React43.createElement(StyledThumb, { ...props, layout: true, transition: spring });
5485
5806
  var spring = {
5486
5807
  type: "spring",
5487
5808
  stiffness: 700,
5488
5809
  damping: 30
5489
5810
  };
5490
5811
  var Switch = (props) => {
5491
- return /* @__PURE__ */ React42.createElement(
5812
+ return /* @__PURE__ */ React43.createElement(
5492
5813
  MotionSwitch,
5493
5814
  {
5494
5815
  ...props,
@@ -5502,7 +5823,7 @@ var Switch = (props) => {
5502
5823
  Switch.displayName = "Switch";
5503
5824
 
5504
5825
  // src/components/Tabs/Tabs.tsx
5505
- import React43, { forwardRef as forwardRef11 } from "react";
5826
+ import React44, { forwardRef as forwardRef11 } from "react";
5506
5827
  import {
5507
5828
  Tabs as JoyTabs,
5508
5829
  Tab as JoyTab,
@@ -5526,14 +5847,14 @@ var StyledTab = styled28(JoyTab)(({ theme }) => ({
5526
5847
  }
5527
5848
  }));
5528
5849
  var Tab = forwardRef11(function Tab2({ startDecorator, endDecorator, children, ...props }, ref) {
5529
- return /* @__PURE__ */ React43.createElement(StyledTab, { ...props, ref }, startDecorator, children, endDecorator);
5850
+ return /* @__PURE__ */ React44.createElement(StyledTab, { ...props, ref }, startDecorator, children, endDecorator);
5530
5851
  });
5531
5852
  Tab.displayName = "Tab";
5532
5853
  var TabList = JoyTabList;
5533
5854
  var TabPanel = JoyTabPanel;
5534
5855
 
5535
5856
  // src/components/ThemeProvider/ThemeProvider.tsx
5536
- import React44 from "react";
5857
+ import React45 from "react";
5537
5858
  import {
5538
5859
  CssBaseline,
5539
5860
  CssVarsProvider,
@@ -5789,12 +6110,12 @@ var defaultTheme = extendTheme({
5789
6110
  });
5790
6111
  function ThemeProvider(props) {
5791
6112
  const theme = props.theme || defaultTheme;
5792
- return /* @__PURE__ */ React44.createElement(React44.Fragment, null, /* @__PURE__ */ React44.createElement(CssVarsProvider, { theme }, /* @__PURE__ */ React44.createElement(CssBaseline, null), props.children));
6113
+ return /* @__PURE__ */ React45.createElement(React45.Fragment, null, /* @__PURE__ */ React45.createElement(CssVarsProvider, { theme }, /* @__PURE__ */ React45.createElement(CssBaseline, null), props.children));
5793
6114
  }
5794
6115
  ThemeProvider.displayName = "ThemeProvider";
5795
6116
 
5796
6117
  // src/components/Uploader/Uploader.tsx
5797
- import React45, { useCallback as useCallback16, useEffect as useEffect11, useMemo as useMemo14, useRef as useRef10, useState as useState14 } from "react";
6118
+ import React46, { useCallback as useCallback17, useEffect as useEffect12, useMemo as useMemo15, useRef as useRef11, useState as useState15 } from "react";
5798
6119
  import { styled as styled29, Input as Input2 } from "@mui/joy";
5799
6120
  import MuiFileUploadIcon from "@mui/icons-material/CloudUploadRounded";
5800
6121
  import MuiUploadFileIcon from "@mui/icons-material/UploadFileRounded";
@@ -5871,7 +6192,7 @@ var getFileSize = (n) => {
5871
6192
  };
5872
6193
  var Preview = (props) => {
5873
6194
  const { files, uploaded, onDelete } = props;
5874
- return /* @__PURE__ */ React45.createElement(PreviewRoot, { gap: 1 }, [...uploaded, ...files].map((file) => /* @__PURE__ */ React45.createElement(UploadCard, { key: file.name, size: "sm", color: "neutral" }, /* @__PURE__ */ React45.createElement(Stack_default, { direction: "row", alignItems: "center", gap: 2 }, /* @__PURE__ */ React45.createElement(UploadFileIcon, null), /* @__PURE__ */ React45.createElement(Stack_default, { flex: "1", sx: { overflow: "hidden" } }, /* @__PURE__ */ React45.createElement(
6195
+ return /* @__PURE__ */ React46.createElement(PreviewRoot, { gap: 1 }, [...uploaded, ...files].map((file) => /* @__PURE__ */ React46.createElement(UploadCard, { key: file.name, size: "sm", color: "neutral" }, /* @__PURE__ */ React46.createElement(Stack_default, { direction: "row", alignItems: "center", gap: 2 }, /* @__PURE__ */ React46.createElement(UploadFileIcon, null), /* @__PURE__ */ React46.createElement(Stack_default, { flex: "1", sx: { overflow: "hidden" } }, /* @__PURE__ */ React46.createElement(
5875
6196
  Typography_default,
5876
6197
  {
5877
6198
  level: "body-sm",
@@ -5883,7 +6204,7 @@ var Preview = (props) => {
5883
6204
  }
5884
6205
  },
5885
6206
  file.name
5886
- ), !!file.size && /* @__PURE__ */ React45.createElement(Typography_default, { level: "body-xs", fontWeight: "300", lineHeight: "1.33", textColor: "text.tertiary" }, getFileSize(file.size))), /* @__PURE__ */ React45.createElement(IconButton_default, { onClick: () => onDelete?.(file) }, /* @__PURE__ */ React45.createElement(ClearIcon2, null))))));
6207
+ ), !!file.size && /* @__PURE__ */ React46.createElement(Typography_default, { level: "body-xs", fontWeight: "300", lineHeight: "1.33", textColor: "text.tertiary" }, getFileSize(file.size))), /* @__PURE__ */ React46.createElement(IconButton_default, { onClick: () => onDelete?.(file) }, /* @__PURE__ */ React46.createElement(ClearIcon2, null))))));
5887
6208
  };
5888
6209
  var UploaderRoot = styled29(Stack_default, {
5889
6210
  name: "Uploader",
@@ -5926,7 +6247,7 @@ var UploaderIcon = styled29(MuiFileUploadIcon, {
5926
6247
  }
5927
6248
  })
5928
6249
  );
5929
- var Uploader = React45.memo(
6250
+ var Uploader = React46.memo(
5930
6251
  (props) => {
5931
6252
  const {
5932
6253
  accept,
@@ -5943,14 +6264,14 @@ var Uploader = React45.memo(
5943
6264
  error: errorProp,
5944
6265
  helperText: helperTextProp
5945
6266
  } = props;
5946
- const dropZoneRef = useRef10(null);
5947
- const inputRef = useRef10(null);
5948
- const [errorText, setErrorText] = useState14();
5949
- const [files, setFiles] = useState14([]);
5950
- const [uploaded, setUploaded] = useState14(props.uploaded || []);
5951
- const [previewState, setPreviewState] = useState14("idle");
5952
- const accepts = useMemo14(() => accept.split(",").map((accept2) => accept2.trim()), [accept]);
5953
- const parsedAccepts = useMemo14(
6267
+ const dropZoneRef = useRef11(null);
6268
+ const inputRef = useRef11(null);
6269
+ const [errorText, setErrorText] = useState15();
6270
+ const [files, setFiles] = useState15([]);
6271
+ const [uploaded, setUploaded] = useState15(props.uploaded || []);
6272
+ const [previewState, setPreviewState] = useState15("idle");
6273
+ const accepts = useMemo15(() => accept.split(",").map((accept2) => accept2.trim()), [accept]);
6274
+ const parsedAccepts = useMemo15(
5954
6275
  () => accepts.flatMap((type) => {
5955
6276
  if (["image/*", "video/*", "audio/*"].includes(type)) {
5956
6277
  return ALL_EXTENSIONS_BY_TYPE[type];
@@ -5959,7 +6280,7 @@ var Uploader = React45.memo(
5959
6280
  }),
5960
6281
  [accepts]
5961
6282
  );
5962
- const helperText = useMemo14(() => {
6283
+ const helperText = useMemo15(() => {
5963
6284
  if (helperTextProp) {
5964
6285
  return helperTextProp;
5965
6286
  }
@@ -5989,12 +6310,12 @@ var Uploader = React45.memo(
5989
6310
  }
5990
6311
  return helperTexts.join(", ");
5991
6312
  }, [accepts, maxFileTotalSize, maxCount, helperTextProp]);
5992
- const error = useMemo14(() => !!errorText || errorProp, [errorProp, errorText]);
5993
- const showDropZone = useMemo14(
6313
+ const error = useMemo15(() => !!errorText || errorProp, [errorProp, errorText]);
6314
+ const showDropZone = useMemo15(
5994
6315
  () => !maxCount || maxCount && [...uploaded, ...files].length !== maxCount,
5995
6316
  [files, maxCount, uploaded]
5996
6317
  );
5997
- const addFiles = useCallback16(
6318
+ const addFiles = useCallback17(
5998
6319
  (uploads) => {
5999
6320
  try {
6000
6321
  const types = parsedAccepts.map((type) => type.replace(".", "")) || [];
@@ -6039,7 +6360,7 @@ var Uploader = React45.memo(
6039
6360
  },
6040
6361
  [files, uploaded, maxCount, parsedAccepts, maxFileSize, maxFileTotalSize, name, onChange]
6041
6362
  );
6042
- useEffect11(() => {
6363
+ useEffect12(() => {
6043
6364
  if (!dropZoneRef.current || disabled) {
6044
6365
  return;
6045
6366
  }
@@ -6077,7 +6398,7 @@ var Uploader = React45.memo(
6077
6398
  );
6078
6399
  return () => cleanup?.();
6079
6400
  }, [disabled, addFiles]);
6080
- useEffect11(() => {
6401
+ useEffect12(() => {
6081
6402
  if (inputRef.current && minCount) {
6082
6403
  if (files.length < minCount) {
6083
6404
  inputRef.current.setCustomValidity(`At least ${minCount} files are required.`);
@@ -6086,14 +6407,14 @@ var Uploader = React45.memo(
6086
6407
  }
6087
6408
  }
6088
6409
  }, [inputRef, files, minCount]);
6089
- const handleFileChanged = useCallback16(
6410
+ const handleFileChanged = useCallback17(
6090
6411
  (event) => {
6091
6412
  const files2 = Array.from(event.target.files || []);
6092
6413
  addFiles(files2);
6093
6414
  },
6094
6415
  [addFiles]
6095
6416
  );
6096
- const handleDeleteFile = useCallback16(
6417
+ const handleDeleteFile = useCallback17(
6097
6418
  (deletedFile) => {
6098
6419
  if (deletedFile instanceof File) {
6099
6420
  setFiles((current) => {
@@ -6113,10 +6434,10 @@ var Uploader = React45.memo(
6113
6434
  },
6114
6435
  [name, onChange, onDelete]
6115
6436
  );
6116
- const handleUploaderButtonClick = useCallback16(() => {
6437
+ const handleUploaderButtonClick = useCallback17(() => {
6117
6438
  inputRef.current?.click();
6118
6439
  }, []);
6119
- const uploader = /* @__PURE__ */ React45.createElement(
6440
+ const uploader = /* @__PURE__ */ React46.createElement(
6120
6441
  FileDropZone,
6121
6442
  {
6122
6443
  state: previewState,
@@ -6125,8 +6446,8 @@ var Uploader = React45.memo(
6125
6446
  ref: dropZoneRef,
6126
6447
  onClick: handleUploaderButtonClick
6127
6448
  },
6128
- /* @__PURE__ */ React45.createElement(Stack_default, { alignItems: "center", gap: 1 }, /* @__PURE__ */ React45.createElement(UploaderIcon, { state: previewState, error: !!(error || errorText), disabled })),
6129
- /* @__PURE__ */ React45.createElement(
6449
+ /* @__PURE__ */ React46.createElement(Stack_default, { alignItems: "center", gap: 1 }, /* @__PURE__ */ React46.createElement(UploaderIcon, { state: previewState, error: !!(error || errorText), disabled })),
6450
+ /* @__PURE__ */ React46.createElement(
6130
6451
  VisuallyHiddenInput,
6131
6452
  {
6132
6453
  disabled,
@@ -6149,7 +6470,7 @@ var Uploader = React45.memo(
6149
6470
  }
6150
6471
  )
6151
6472
  );
6152
- return /* @__PURE__ */ React45.createElement(UploaderRoot, null, showDropZone && /* @__PURE__ */ React45.createElement(FormControl_default, { size, error: !!(error || errorText), disabled, required: !!minCount }, label && /* @__PURE__ */ React45.createElement(FormLabel_default, null, label), uploader, /* @__PURE__ */ React45.createElement(FormHelperText_default, null, /* @__PURE__ */ React45.createElement(Stack_default, null, errorText && /* @__PURE__ */ React45.createElement("div", null, errorText), /* @__PURE__ */ React45.createElement("div", null, helperText)))), [...uploaded, ...files].length > 0 && /* @__PURE__ */ React45.createElement(Preview, { files, uploaded, onDelete: handleDeleteFile }));
6473
+ return /* @__PURE__ */ React46.createElement(UploaderRoot, null, showDropZone && /* @__PURE__ */ React46.createElement(FormControl_default, { size, error: !!(error || errorText), disabled, required: !!minCount }, label && /* @__PURE__ */ React46.createElement(FormLabel_default, null, label), uploader, /* @__PURE__ */ React46.createElement(FormHelperText_default, null, /* @__PURE__ */ React46.createElement(Stack_default, null, errorText && /* @__PURE__ */ React46.createElement("div", null, errorText), /* @__PURE__ */ React46.createElement("div", null, helperText)))), [...uploaded, ...files].length > 0 && /* @__PURE__ */ React46.createElement(Preview, { files, uploaded, onDelete: handleDeleteFile }));
6153
6474
  }
6154
6475
  );
6155
6476
  Uploader.displayName = "Uploader";
@@ -6191,6 +6512,7 @@ export {
6191
6512
  Divider,
6192
6513
  Drawer,
6193
6514
  Dropdown,
6515
+ FilterableCheckboxGroup,
6194
6516
  FormControl,
6195
6517
  FormHelperText,
6196
6518
  FormLabel,