@farmzone/fz-react-ui 1.0.3 → 1.0.4

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.cjs CHANGED
@@ -78,9 +78,10 @@ var buttonVariants = classVarianceAuthority.cva(
78
78
  delete: "bg-white border border-sub-red text-main-red hover:bg-red-50 disabled:bg-light-gray disabled:border-sub-lightgray-2 disabled:text-sub-lightgray-2 font-bold min-w-22",
79
79
  reset: "bg-white border border-sub-lightgray-2 text-sub-darkgray hover:bg-gray-100 hover:text-black",
80
80
  search: "bg-main-blue border-none text-white hover:bg-main-blue/90",
81
- file: "bg-sub-darkgray text-white hover:bg-sub-darkgray/80",
81
+ file: "bg-btn-file text-white hover:bg-btn-file/90",
82
82
  carousel: "bg-white border border-gray-300 hover:bg-gray-100 hover:text-black rounded-full",
83
83
  accent: "btn-grad text-white rounded-full",
84
+ metal: "btn-metal text-white min-w-22",
84
85
  ghost: "p-1 h-auto rounded-sm bg-transparent hover:bg-sub-lightgray text-sub-darkgray hover:bg-inherit",
85
86
  link: "bg-transparent border-none text-main-blue underline-offset-4 hover:underline h-auto p-0"
86
87
  },
@@ -3396,8 +3397,7 @@ function ModalContent(props) {
3396
3397
  {
3397
3398
  ref,
3398
3399
  className: cn(
3399
- "fixed left-[50%] top-[50%] max-h-[85vh] z-55 flex flex-col w-full max-w-lg translate-x-[-50%] translate-y-[-50%] bg-white rounded-lg overflow-hidden shadow-xl duration-200",
3400
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
3400
+ "fixed left-[50%] top-[50%] max-h-[85vh] z-55 flex flex-col w-full max-w-lg translate-x-[-50%] translate-y-[-50%] bg-white rounded-lg overflow-hidden shadow-xl",
3401
3401
  className
3402
3402
  ),
3403
3403
  style: zIndex !== void 0 ? { zIndex } : void 0,
@@ -3408,7 +3408,7 @@ function ModalContent(props) {
3408
3408
  );
3409
3409
  }
3410
3410
  function ModalOverlay(props) {
3411
- const { isOpen: isOpen2, onClose, className, closeOnOverlayClick = true, zIndex } = props;
3411
+ const { ref, isOpen: isOpen2, onClose, className, closeOnOverlayClick = true, zIndex } = props;
3412
3412
  if (!isOpen2) return null;
3413
3413
  const handleOverlayClick = (e) => {
3414
3414
  if (closeOnOverlayClick && e.target === e.currentTarget) {
@@ -3418,9 +3418,10 @@ function ModalOverlay(props) {
3418
3418
  return /* @__PURE__ */ jsxRuntime.jsx(
3419
3419
  "div",
3420
3420
  {
3421
+ ref,
3421
3422
  className: cn(
3422
3423
  "fixed inset-0 z-54 bg-black/50",
3423
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
3424
+ "animate-in fade-in-0 duration-150",
3424
3425
  className
3425
3426
  ),
3426
3427
  style: zIndex !== void 0 ? { zIndex } : void 0,
@@ -3522,7 +3523,7 @@ function Modal(props) {
3522
3523
  } = props;
3523
3524
  const idRef = React6.useRef(/* @__PURE__ */ Symbol("modal"));
3524
3525
  const [depth, setDepth] = React6.useState(0);
3525
- React6.useEffect(() => {
3526
+ React6.useLayoutEffect(() => {
3526
3527
  if (!isOpen2) return;
3527
3528
  const id = idRef.current;
3528
3529
  const d = modalStack.push(id);
@@ -3559,12 +3560,22 @@ function Modal(props) {
3559
3560
  {
3560
3561
  isOpen: isOpen2,
3561
3562
  onClose,
3562
- className: overlayClassName,
3563
+ className: cn(overlayClassName, depth > 1 && "bg-black/20"),
3563
3564
  closeOnOverlayClick,
3564
3565
  zIndex: overlayZ
3565
3566
  }
3566
3567
  ),
3567
- /* @__PURE__ */ jsxRuntime.jsx(ModalContent, { className: contentClassName, zIndex: contentZ, children })
3568
+ /* @__PURE__ */ jsxRuntime.jsx(
3569
+ ModalContent,
3570
+ {
3571
+ className: cn(
3572
+ contentClassName,
3573
+ depth > 1 && "shadow-[0_0_0_1px_rgba(255,255,255,0.12),0_20px_50px_-5px_rgba(0,0,0,0.4)]"
3574
+ ),
3575
+ zIndex: contentZ,
3576
+ children
3577
+ }
3578
+ )
3568
3579
  ] });
3569
3580
  }
3570
3581
  function ConfirmModal(props) {
@@ -4065,7 +4076,7 @@ function TableHeader(props) {
4065
4076
  const subTitleClasses = column.key === "subTitle" ? "inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-blue-100 text-blue-800" : "";
4066
4077
  if (column.align === "left") {
4067
4078
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex item-center w-full", children: [
4068
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `pl-2 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title }) }),
4079
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `pl-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title }) }),
4069
4080
  column.sortable && /* @__PURE__ */ jsxRuntime.jsx(
4070
4081
  "div",
4071
4082
  {
@@ -4096,7 +4107,7 @@ function TableHeader(props) {
4096
4107
  children: renderSortIcon(column.key)
4097
4108
  }
4098
4109
  ),
4099
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `pr-2 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title }) })
4110
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: `pr-3 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title }) })
4100
4111
  ] });
4101
4112
  }
4102
4113
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `px-1.5 truncate ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title });
@@ -4467,7 +4478,7 @@ function SkeletonTd(props) {
4467
4478
  return /* @__PURE__ */ jsxRuntime.jsx(
4468
4479
  "td",
4469
4480
  {
4470
- className: `${col.key === "__checkbox__" ? "p-0" : "px-2 py-[6.8px]"} whitespace-nowrap text-sm border-r border-b border-gray-200/70 last:border-r-0`,
4481
+ className: `${col.key === "__checkbox__" ? "p-0" : "px-2 py-4"} whitespace-nowrap text-sm border-r border-b border-gray-200/70 last:border-r-0`,
4471
4482
  style: {
4472
4483
  width: col.width,
4473
4484
  minWidth: col.minWidth || col.width,
@@ -4539,7 +4550,7 @@ function TableCellContent(props) {
4539
4550
  "div",
4540
4551
  {
4541
4552
  ref: textRef,
4542
- className: "ellipsis-1-line table-item hover:text-main cursor-pointer w-full min-w-0",
4553
+ className: `ellipsis-1-line table-item w-full min-w-0 ${onCellClick ? "hover:text-main cursor-pointer" : "cursor-default"}`,
4543
4554
  style: { textAlign },
4544
4555
  onClick: onCellClick,
4545
4556
  children: shouldShowTooltip ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip2, { content: tooltipText, position: "bottom", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: cellContent }) }) : cellContent
@@ -5008,7 +5019,7 @@ function Table(props) {
5008
5019
  id: `${col.key}-body`,
5009
5020
  "data-row-cell": "true",
5010
5021
  "data-col-key": col.key,
5011
- className: `${isCheckbox ? "p-0" : "px-2 py-[6.8px]"} whitespace-nowrap text-sm text-gray-900 border-r border-b border-gray-200 last:border-r-0 bg-inherit group-hover:bg-gray-100 transition-all`,
5022
+ className: `${isCheckbox ? "p-0" : "px-2 py-4"} whitespace-nowrap text-sm text-gray-900 border-r border-b border-gray-200 last:border-r-0 bg-inherit group-hover:bg-gray-100 transition-all`,
5012
5023
  style: {
5013
5024
  width,
5014
5025
  minWidth: minWidth || width,
@@ -5025,7 +5036,7 @@ function Table(props) {
5025
5036
  tooltipText: String(record[col.key] ?? ""),
5026
5037
  align: align ?? "",
5027
5038
  tooltipConfig: col.key === "__checkbox__" ? false : tooltipConfig,
5028
- onCellClick: col.key !== "__checkbox__" ? () => onRowClickRef.current?.(record, rowIdx) : void 0
5039
+ onCellClick: col.key !== "__checkbox__" && onRowClickRef.current ? () => onRowClickRef.current?.(record, rowIdx) : void 0
5029
5040
  }
5030
5041
  ) })
5031
5042
  },
@@ -5100,7 +5111,7 @@ function Table(props) {
5100
5111
  const rest = baseRows.filter((row) => !effectiveRowOrder.includes(String(getRowKey(row.original, row.index))));
5101
5112
  return [...ordered, ...rest];
5102
5113
  }, [baseRows, effectiveRowOrder, getRowKey]);
5103
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white rounded table-shadow", children: [
5114
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-white rounded shadow-panel", children: [
5104
5115
  /* @__PURE__ */ jsxRuntime.jsx(
5105
5116
  "div",
5106
5117
  {
@@ -5124,7 +5135,7 @@ function Table(props) {
5124
5135
  isColumnDraggable
5125
5136
  }
5126
5137
  ),
5127
- /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "w-full h-full", children: showSkeleton ? Array.from({ length: 15 }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "hover:bg-gray-50", children: [
5138
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { className: "w-full h-full", children: showSkeleton ? Array.from({ length: 3 }).map((_, rowIdx) => /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "hover:bg-gray-50", children: [
5128
5139
  leadingPinnedCols.map((col, idx) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonTd, { col, showSquare: idx === 0 && !!checkboxInfo }, `leading-${idx}`)),
5129
5140
  leftColspan > 0 && /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: leftColspan, style: { padding: 0, border: "none" } }),
5130
5141
  virtualItems.map((vc) => /* @__PURE__ */ jsxRuntime.jsx(SkeletonTd, { col: groupCols[vc.index] }, `group-${vc.index}`)),
@@ -6838,7 +6849,8 @@ function InputField(props) {
6838
6849
  maxLength,
6839
6850
  className = "",
6840
6851
  type = "input",
6841
- numbersOnly = false
6852
+ numbersOnly = false,
6853
+ autoComplete
6842
6854
  } = config;
6843
6855
  const inputType = type === "email" ? "email" : type === "password" ? "password" : "text";
6844
6856
  if (readOnly) {
@@ -6863,6 +6875,7 @@ function InputField(props) {
6863
6875
  maxLength,
6864
6876
  status: "default",
6865
6877
  className: formControlClass(hasError),
6878
+ autoComplete,
6866
6879
  bare: true,
6867
6880
  onChange: handleChange
6868
6881
  }
@@ -7568,7 +7581,8 @@ function SubmitFormRoot(props) {
7568
7581
  className = "",
7569
7582
  formClassName,
7570
7583
  gridClassName = "grid-cols-12",
7571
- mode = "onSubmit"
7584
+ mode = "onSubmit",
7585
+ autoComplete
7572
7586
  } = props;
7573
7587
  const methods = reactHookForm.useForm({
7574
7588
  resolver: zod.zodResolver(schema),
@@ -7591,6 +7605,7 @@ function SubmitFormRoot(props) {
7591
7605
  id: formId,
7592
7606
  onSubmit: handleSubmit,
7593
7607
  className: cn2(SUBMIT_FORM_CLASS, formClassName, className),
7608
+ autoComplete,
7594
7609
  noValidate: true,
7595
7610
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `grid ${gridClassName} items-stretch gap-0`, children })
7596
7611
  }
@@ -7618,7 +7633,8 @@ function PageFilter(props) {
7618
7633
  colGap = 0,
7619
7634
  submitButtonText = "\uAC80\uC0C9",
7620
7635
  resetButtonText = "\uCD08\uAE30\uD654",
7621
- values
7636
+ values,
7637
+ primaryColor
7622
7638
  } = props;
7623
7639
  const [localValues, setLocalValues] = React6.useState(values);
7624
7640
  const initialValuesRef = React6.useRef(values);
@@ -7676,6 +7692,7 @@ function PageFilter(props) {
7676
7692
  onChange: handleSelectChange(optionKey),
7677
7693
  options: option.options,
7678
7694
  placeholder: "\uC120\uD0DD",
7695
+ canReset: true,
7679
7696
  containerClassName: option.containerClassName ?? "w-30"
7680
7697
  }
7681
7698
  ) }, String(optionKey));
@@ -7728,16 +7745,20 @@ function PageFilter(props) {
7728
7745
  "div",
7729
7746
  {
7730
7747
  className: cn(
7731
- "flex flex-col gap-3 bg-white py-3 px-5 border-t-main border-t-1 shadow-page-filter",
7748
+ "flex flex-col gap-3 bg-white py-3 px-5 border-t-main border-t-1 shadow-panel",
7732
7749
  containerClassName
7733
7750
  ),
7734
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex flex-col", style: { gap: `${colGap}px` }, children: [
7735
- rows.map((row) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-row min-h-12", children: row.options.map((option, index) => renderFilterOption(option, rowGap, index)) }, row.options.map((opt) => String(opt.key)).join("_"))),
7736
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-2 bottom-2 flex justify-end gap-2 pt-2", children: [
7737
- /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "search", onClick: handleSubmit, children: submitButtonText }),
7738
- onReset && /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "reset", onClick: handleReset, children: resetButtonText })
7739
- ] })
7740
- ] })
7751
+ style: primaryColor ? { borderTopColor: primaryColor } : void 0,
7752
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex flex-col", style: { gap: `${colGap}px` }, children: rows.map((row, ix) => {
7753
+ const isLastRow = rows.length - 1 === ix;
7754
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-row min-h-12", children: [
7755
+ row.options.map((option, index) => renderFilterOption(option, rowGap, index)),
7756
+ isLastRow && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-4 flex flex-row items-center gap-2", children: [
7757
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "search", onClick: handleSubmit, children: submitButtonText }),
7758
+ onReset && /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "reset", onClick: handleReset, children: resetButtonText })
7759
+ ] })
7760
+ ] }, row.options.map((opt) => String(opt.key)).join("_"));
7761
+ }) })
7741
7762
  }
7742
7763
  );
7743
7764
  }
@@ -7749,7 +7770,9 @@ var VARIANT_STYLES = {
7749
7770
  activeText: "font-semibold text-gray-800",
7750
7771
  inactiveText: "font-normal",
7751
7772
  indicator: "bg-blue-500",
7752
- closeBtn: "hover:bg-gray-300/60",
7773
+ closeBtn: "rounded hover:bg-gray-300/60",
7774
+ closeBtnWH: "w-3.5 h-3.5",
7775
+ closeBtnSize: 10,
7753
7776
  plusBtnArea: "border-l border-gray-100 bg-white",
7754
7777
  plusBtn: "text-gray-400 hover:text-gray-600 hover:bg-gray-100",
7755
7778
  fadeOpacity: 0.12,
@@ -7766,7 +7789,9 @@ var VARIANT_STYLES = {
7766
7789
  activeText: "font-semibold text-white",
7767
7790
  inactiveText: "font-normal",
7768
7791
  indicator: "bg-indigo-400",
7769
- closeBtn: "hover:bg-gray-600/60",
7792
+ closeBtn: "rounded hover:bg-gray-600/60",
7793
+ closeBtnWH: "w-3.5 h-3.5",
7794
+ closeBtnSize: 10,
7770
7795
  plusBtnArea: "border-l border-gray-700 bg-gray-900",
7771
7796
  plusBtn: "text-gray-500 hover:text-gray-300 hover:bg-gray-700",
7772
7797
  fadeOpacity: 0.4,
@@ -7779,11 +7804,13 @@ var VARIANT_STYLES = {
7779
7804
  "system-light": {
7780
7805
  container: "bg-gray-200 border-b border-gray-300",
7781
7806
  activeTab: "bg-white border-gray-300 text-slate-800 shadow-sm",
7782
- inactiveTab: "bg-transparent border-gray-300/80 text-slate-500 hover:text-slate-700 hover:bg-gray-200 hover:border-gray-300",
7807
+ inactiveTab: "bg-transparent border-gray-300/80 text-slate-500 hover:text-slate-700 hover:bg-[#efefef] hover:border-gray-300",
7783
7808
  activeText: "font-semibold text-slate-800",
7784
7809
  inactiveText: "font-medium",
7785
7810
  indicator: "bg-[#2b2b2b]",
7786
- closeBtn: "hover:bg-gray-300",
7811
+ closeBtn: "ml-auto text-slate-400 hover:text-slate-700",
7812
+ closeBtnWH: "w-4 h-4",
7813
+ closeBtnSize: 13,
7787
7814
  plusBtnArea: "border-l border-gray-300 bg-gray-200",
7788
7815
  plusBtn: "text-slate-400 hover:text-slate-600 hover:bg-gray-300",
7789
7816
  fadeOpacity: 0.15,
@@ -7800,7 +7827,9 @@ var VARIANT_STYLES = {
7800
7827
  activeText: "font-semibold text-slate-100",
7801
7828
  inactiveText: "font-medium",
7802
7829
  indicator: "bg-indigo-400",
7803
- closeBtn: "hover:bg-slate-600/60",
7830
+ closeBtn: "ml-auto text-slate-500 hover:text-slate-200",
7831
+ closeBtnWH: "w-4 h-4",
7832
+ closeBtnSize: 13,
7804
7833
  plusBtnArea: "border-l border-slate-700 bg-slate-900",
7805
7834
  plusBtn: "text-slate-400 hover:text-slate-200 hover:bg-slate-700",
7806
7835
  fadeOpacity: 0.45,
@@ -7953,12 +7982,12 @@ function MultiTabBar(props) {
7953
7982
  onTabClose(tab.id);
7954
7983
  },
7955
7984
  className: `
7956
- flex-shrink-0 w-3.5 h-3.5 flex items-center justify-center
7957
- rounded transition-all duration-100 cursor-pointer
7985
+ flex-shrink-0 ${s.closeBtnWH} flex items-center justify-center
7986
+ transition-all duration-100 cursor-pointer
7958
7987
  ${s.closeBtn}
7959
7988
  ${isActive ? "opacity-100" : "opacity-40 group-hover:opacity-60"}
7960
7989
  `,
7961
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: 10, strokeWidth: 2.5 })
7990
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { size: s.closeBtnSize, strokeWidth: 2.5 })
7962
7991
  }
7963
7992
  )
7964
7993
  ]
@@ -8788,7 +8817,8 @@ var VARIANT_STYLES2 = {
8788
8817
  iconClass: "w-4 h-4 flex-shrink-0",
8789
8818
  activeItemStyle: {},
8790
8819
  activeChildStyle: {},
8791
- activeGrandchildStyle: {}
8820
+ activeGrandchildStyle: {},
8821
+ footerBorder: "border-t border-gray-200"
8792
8822
  },
8793
8823
  dark: {
8794
8824
  aside: "bg-gray-900 border-r border-gray-700",
@@ -8814,7 +8844,8 @@ var VARIANT_STYLES2 = {
8814
8844
  iconClass: "w-4 h-4 flex-shrink-0",
8815
8845
  activeItemStyle: {},
8816
8846
  activeChildStyle: {},
8817
- activeGrandchildStyle: {}
8847
+ activeGrandchildStyle: {},
8848
+ footerBorder: "border-t border-gray-700"
8818
8849
  },
8819
8850
  "system-dark": {
8820
8851
  aside: "bg-slate-900 border-r border-slate-700",
@@ -8840,7 +8871,8 @@ var VARIANT_STYLES2 = {
8840
8871
  iconClass: "w-4.5 h-4.5 flex-shrink-0",
8841
8872
  activeItemStyle: { borderLeft: "3px solid #818cf8", paddingLeft: "9px" },
8842
8873
  activeChildStyle: { borderLeft: "2px solid #818cf8", paddingLeft: "14px" },
8843
- activeGrandchildStyle: { borderLeft: "2px solid #818cf8", paddingLeft: "10px" }
8874
+ activeGrandchildStyle: { borderLeft: "2px solid #818cf8", paddingLeft: "10px" },
8875
+ footerBorder: "border-t border-slate-700"
8844
8876
  },
8845
8877
  "system-light": {
8846
8878
  aside: "bg-gray-50 border-r border-gray-200",
@@ -8881,7 +8913,8 @@ var VARIANT_STYLES2 = {
8881
8913
  backgroundColor: "color-mix(in srgb, #2b2b2b 10%, transparent)",
8882
8914
  borderLeft: "2px solid #2b2b2b",
8883
8915
  paddingLeft: "10px"
8884
- }
8916
+ },
8917
+ footerBorder: "border-t border-gray-200"
8885
8918
  }
8886
8919
  };
8887
8920
  function tintedStyle(color) {
@@ -8958,6 +8991,7 @@ function Sidebar(props) {
8958
8991
  onClose,
8959
8992
  menuSections,
8960
8993
  header,
8994
+ footer,
8961
8995
  className,
8962
8996
  showCollapseButton = false,
8963
8997
  variant = "light",
@@ -8965,8 +8999,17 @@ function Sidebar(props) {
8965
8999
  } = props;
8966
9000
  const { pathname } = reactRouter.useLocation();
8967
9001
  const [isCollapsed, setIsCollapsed] = React6.useState(false);
9002
+ const [overflowVisible, setOverflowVisible] = React6.useState(true);
8968
9003
  const [expandedItems, setExpandedItems] = React6.useState(/* @__PURE__ */ new Set());
8969
9004
  const [expandedSubItems, setExpandedSubItems] = React6.useState(/* @__PURE__ */ new Set());
9005
+ React6.useEffect(() => {
9006
+ if (isCollapsed) {
9007
+ setOverflowVisible(false);
9008
+ return;
9009
+ }
9010
+ const timer = setTimeout(() => setOverflowVisible(true), 300);
9011
+ return () => clearTimeout(timer);
9012
+ }, [isCollapsed]);
8970
9013
  const s = VARIANT_STYLES2[variant];
8971
9014
  const applier = ACCENT_APPLIERS[variant];
8972
9015
  React6.useEffect(() => {
@@ -9028,7 +9071,7 @@ function Sidebar(props) {
9028
9071
  className: `
9029
9072
  ${isCollapsed ? "w-11 min-w-11" : "min-w-60 w-62"}
9030
9073
  transition-[width,min-width] duration-300 ease-in-out
9031
- hide-scrollbar relative h-screen shrink-0 overflow-y-auto overflow-x-hidden
9074
+ relative h-screen shrink-0 overflow-x-hidden flex flex-col
9032
9075
  ${s.aside}
9033
9076
  ${className ?? ""}
9034
9077
  `,
@@ -9041,14 +9084,14 @@ function Sidebar(props) {
9041
9084
  children: isCollapsed ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PanelRightClose, { size: 18, color: primaryColor ?? s.collapseIcon }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PanelLeftClose, { size: 18, color: primaryColor ?? s.collapseIcon })
9042
9085
  }
9043
9086
  ),
9044
- /* @__PURE__ */ jsxRuntime.jsxs(
9087
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex-1 min-h-0 hide-scrollbar ${overflowVisible ? "overflow-y-auto" : "overflow-hidden"}`, children: /* @__PURE__ */ jsxRuntime.jsxs(
9045
9088
  "div",
9046
9089
  {
9047
- className: `transition-opacity duration-200 ease-in-out ${isCollapsed ? "opacity-0 pointer-events-none select-none" : "opacity-100"} ${variant === "system-dark" || variant === "system-light" ? "px-1 py-6" : "px-4 py-6"}`,
9090
+ className: `transition-opacity duration-200 ease-in-out ${isCollapsed ? "opacity-0 pointer-events-none select-none" : "opacity-100"} ${variant === "system-dark" || variant === "system-light" ? "pb-6" : "px-4 pb-6"}`,
9048
9091
  style: { transitionDelay: isCollapsed ? "0ms" : "150ms" },
9049
9092
  children: [
9050
- header && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6 mt-2", children: header }),
9051
- /* @__PURE__ */ jsxRuntime.jsx("nav", { className: "space-y-6", children: menuSections.map((section, sectionIndex) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
9093
+ header && header,
9094
+ /* @__PURE__ */ jsxRuntime.jsx("nav", { className: `space-y-6 ${variant === "system-dark" || variant === "system-light" ? "px-1" : ""}`, children: menuSections.map((section, sectionIndex) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
9052
9095
  section.title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: s.sectionTitle, children: section.title }),
9053
9096
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0.5", children: section.items.map((item) => {
9054
9097
  const isActive = !item.children && pathname === item.path;
@@ -9187,6 +9230,14 @@ function Sidebar(props) {
9187
9230
  ] }, section.title ?? sectionIndex)) })
9188
9231
  ]
9189
9232
  }
9233
+ ) }),
9234
+ footer && /* @__PURE__ */ jsxRuntime.jsx(
9235
+ "div",
9236
+ {
9237
+ className: `flex-shrink-0 transition-opacity duration-200 ease-in-out ${isCollapsed ? "opacity-0 pointer-events-none select-none" : "opacity-100"} ${s.footerBorder}`,
9238
+ style: { transitionDelay: isCollapsed ? "0ms" : "150ms" },
9239
+ children: footer
9240
+ }
9190
9241
  )
9191
9242
  ]
9192
9243
  }
@@ -9505,7 +9556,7 @@ function DetailModalFrame(props) {
9505
9556
  ) }),
9506
9557
  renderExtraContent?.({ isEditMode })
9507
9558
  ] }),
9508
- /* @__PURE__ */ jsxRuntime.jsx(ModalFooter, { className: "flex justify-end gap-2", children: isEditMode ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
9559
+ /* @__PURE__ */ jsxRuntime.jsx(ModalFooter, { className: "flex justify-end", children: isEditMode ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
9509
9560
  /* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "outline", onClick: handleCancelEdit, disabled: controller.isSaving, children: "\uCDE8\uC18C" }),
9510
9561
  /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", form: controller.formId, variant: "save", disabled: controller.isSaving, children: "\uC800\uC7A5" })
9511
9562
  ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [