@farmzone/fz-react-ui 1.0.19 → 1.0.21

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
@@ -3,7 +3,7 @@ import clsx from 'clsx';
3
3
  import { twMerge } from 'tailwind-merge';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
  import * as React6 from 'react';
6
- import React6__default, { forwardRef, useState, useRef, useEffect, useImperativeHandle, useCallback, memo, createContext, useMemo, useContext, useId, useLayoutEffect, useDeferredValue } from 'react';
6
+ import React6__default, { forwardRef, useState, useRef, useEffect, useImperativeHandle, useCallback, memo, createContext, useMemo, useContext, useId, useLayoutEffect, useDeferredValue, Fragment as Fragment$1 } from 'react';
7
7
  import { Slot } from '@radix-ui/react-slot';
8
8
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
9
9
  import { ChevronLeft, ChevronRight, FileText, ZoomIn, ZoomOut, RotateCcw, RotateCw, Download, X, Trash2, Plus, EyeOff, Eye, Minus, Check, CircleX, ChevronDown, Calendar, CircleIcon, ChevronUp, Search, TriangleAlert, Info, Pencil, BadgePlus, FileSearch2, Upload, FileUp, PanelRightClose, PanelLeftClose, ChevronFirst, ChevronLast } from 'lucide-react';
@@ -2429,6 +2429,8 @@ function DatePickerRange(props) {
2429
2429
  endValue = "",
2430
2430
  onRangeChange,
2431
2431
  className = "",
2432
+ width,
2433
+ height,
2432
2434
  editDateSelect = true,
2433
2435
  onKeyDownEnter,
2434
2436
  datePosition = "bottom",
@@ -2539,7 +2541,7 @@ function DatePickerRange(props) {
2539
2541
  }
2540
2542
  };
2541
2543
  const inputClassName = cn(
2542
- "w-full px-2 py-1.25 border border-gray-300 shadow-xs outline-none text-sm rounded-sm pr-7 transition-colors",
2544
+ "w-full h-full px-2 py-1.25 border border-gray-300 shadow-xs outline-none text-sm rounded-sm pr-7 transition-colors",
2543
2545
  disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : "bg-white text-gray-900 focus:border-blue-600"
2544
2546
  );
2545
2547
  const iconWrapperClassName = cn(
@@ -2582,72 +2584,84 @@ function DatePickerRange(props) {
2582
2584
  )
2583
2585
  }
2584
2586
  );
2585
- return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("relative w-64 h-8", className), "aria-disabled": disabled, children: [
2586
- /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-1", children: [
2587
- /* @__PURE__ */ jsxs("div", { ref: startAnchorRef, className: "relative flex-1", children: [
2588
- /* @__PURE__ */ jsx(
2589
- "input",
2590
- {
2591
- type: "text",
2592
- value: startInputValue,
2593
- onChange: (e) => handleRangeInputChange(e, true),
2594
- placeholder: "\uC2DC\uC791 \uB0A0\uC9DC",
2595
- disabled,
2596
- className: inputClassName,
2597
- maxLength: 10,
2598
- onKeyDown: (e) => {
2599
- if (e.key === "Enter") {
2600
- e.preventDefault();
2601
- handleFieldEnter(startInputValue);
2587
+ return /* @__PURE__ */ jsxs(
2588
+ "div",
2589
+ {
2590
+ ref: containerRef,
2591
+ className: cn("relative w-64 h-8", className),
2592
+ style: {
2593
+ width: typeof width === "number" ? `${width}px` : width,
2594
+ height: typeof height === "number" ? `${height}px` : height
2595
+ },
2596
+ "aria-disabled": disabled,
2597
+ children: [
2598
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-1 h-full", children: [
2599
+ /* @__PURE__ */ jsxs("div", { ref: startAnchorRef, className: "relative flex-1 h-full", children: [
2600
+ /* @__PURE__ */ jsx(
2601
+ "input",
2602
+ {
2603
+ type: "text",
2604
+ value: startInputValue,
2605
+ onChange: (e) => handleRangeInputChange(e, true),
2606
+ placeholder: "\uC2DC\uC791 \uB0A0\uC9DC",
2607
+ disabled,
2608
+ className: inputClassName,
2609
+ maxLength: 10,
2610
+ onKeyDown: (e) => {
2611
+ if (e.key === "Enter") {
2612
+ e.preventDefault();
2613
+ handleFieldEnter(startInputValue);
2614
+ }
2615
+ }
2602
2616
  }
2603
- }
2604
- }
2605
- ),
2606
- /* @__PURE__ */ jsx(
2607
- "div",
2608
- {
2609
- onClick: () => {
2610
- if (!disabled) handleCalendarIconClick("start");
2611
- },
2612
- className: iconWrapperClassName,
2613
- children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: iconClassName })
2614
- }
2615
- )
2616
- ] }),
2617
- /* @__PURE__ */ jsx("div", { className: cn("text-sm w-2 text-center", disabled && "text-neutral-400 opacity-50"), children: "~" }),
2618
- /* @__PURE__ */ jsxs("div", { ref: endAnchorRef, className: "relative flex-1", children: [
2619
- /* @__PURE__ */ jsx(
2620
- "input",
2621
- {
2622
- type: "text",
2623
- value: endInputValue,
2624
- onChange: (e) => handleRangeInputChange(e, false),
2625
- placeholder: "\uC885\uB8CC \uB0A0\uC9DC",
2626
- disabled,
2627
- className: inputClassName,
2628
- maxLength: 10,
2629
- onKeyDown: (e) => {
2630
- if (e.key === "Enter") {
2631
- e.preventDefault();
2632
- handleFieldEnter(endInputValue);
2617
+ ),
2618
+ /* @__PURE__ */ jsx(
2619
+ "div",
2620
+ {
2621
+ onClick: () => {
2622
+ if (!disabled) handleCalendarIconClick("start");
2623
+ },
2624
+ className: iconWrapperClassName,
2625
+ children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: iconClassName })
2633
2626
  }
2634
- }
2635
- }
2636
- ),
2637
- /* @__PURE__ */ jsx(
2638
- "div",
2639
- {
2640
- onClick: () => {
2641
- if (!disabled) handleCalendarIconClick("end");
2642
- },
2643
- className: iconWrapperClassName,
2644
- children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: iconClassName })
2645
- }
2646
- )
2647
- ] })
2648
- ] }),
2649
- calendarNode
2650
- ] });
2627
+ )
2628
+ ] }),
2629
+ /* @__PURE__ */ jsx("div", { className: cn("text-sm w-2 text-center", disabled && "text-neutral-400 opacity-50"), children: "~" }),
2630
+ /* @__PURE__ */ jsxs("div", { ref: endAnchorRef, className: "relative flex-1 h-full", children: [
2631
+ /* @__PURE__ */ jsx(
2632
+ "input",
2633
+ {
2634
+ type: "text",
2635
+ value: endInputValue,
2636
+ onChange: (e) => handleRangeInputChange(e, false),
2637
+ placeholder: "\uC885\uB8CC \uB0A0\uC9DC",
2638
+ disabled,
2639
+ className: inputClassName,
2640
+ maxLength: 10,
2641
+ onKeyDown: (e) => {
2642
+ if (e.key === "Enter") {
2643
+ e.preventDefault();
2644
+ handleFieldEnter(endInputValue);
2645
+ }
2646
+ }
2647
+ }
2648
+ ),
2649
+ /* @__PURE__ */ jsx(
2650
+ "div",
2651
+ {
2652
+ onClick: () => {
2653
+ if (!disabled) handleCalendarIconClick("end");
2654
+ },
2655
+ className: iconWrapperClassName,
2656
+ children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: iconClassName })
2657
+ }
2658
+ )
2659
+ ] })
2660
+ ] }),
2661
+ calendarNode
2662
+ ]
2663
+ }
2664
+ );
2651
2665
  }
2652
2666
  function DatePickerSingle(props) {
2653
2667
  const {
@@ -2655,6 +2669,8 @@ function DatePickerSingle(props) {
2655
2669
  onChange,
2656
2670
  placeholder = "\uB0A0\uC9DC \uC120\uD0DD",
2657
2671
  className = "",
2672
+ width,
2673
+ height,
2658
2674
  editDateSelect = true,
2659
2675
  onKeyDownEnter,
2660
2676
  datePosition = "bottom",
@@ -2765,56 +2781,70 @@ function DatePickerSingle(props) {
2765
2781
  )
2766
2782
  }
2767
2783
  );
2768
- return /* @__PURE__ */ jsxs("div", { ref: containerRef, className: cn("relative w-30 h-8", className), "aria-disabled": disabled, children: [
2769
- /* @__PURE__ */ jsxs("div", { className: "relative", children: [
2770
- /* @__PURE__ */ jsx(
2771
- "input",
2772
- {
2773
- type: "text",
2774
- value: inputValue,
2775
- onChange: handleInputChange,
2776
- onBlur: () => onBlur && handleInputBlur(),
2777
- placeholder,
2778
- disabled,
2779
- className: cn(
2780
- "w-full px-2 py-1.25 border text-sm rounded-sm outline-none shadow-xs transition-colors",
2781
- validation ? "border-red-600 focus:border-blue-600 focus-visible:border-blue-600 focus-visible:ring-1 focus-visible:ring-blue-600/30 focus-visible:outline-none" : "border-gray-300 focus:border-blue-600 focus-visible:border-blue-600 focus-visible:ring-1 focus-visible:ring-blue-600/30 focus-visible:outline-none",
2782
- disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : "bg-white text-gray-900"
2783
- ),
2784
- maxLength: 10,
2785
- onKeyDown: (e) => {
2786
- if (e.key === "Enter") {
2787
- e.preventDefault();
2788
- handleFieldEnter(inputValue);
2784
+ return /* @__PURE__ */ jsxs(
2785
+ "div",
2786
+ {
2787
+ ref: containerRef,
2788
+ className: cn("relative w-30 h-8", className),
2789
+ style: {
2790
+ width: typeof width === "number" ? `${width}px` : width,
2791
+ height: typeof height === "number" ? `${height}px` : height
2792
+ },
2793
+ "aria-disabled": disabled,
2794
+ children: [
2795
+ /* @__PURE__ */ jsxs("div", { className: "relative h-full", children: [
2796
+ /* @__PURE__ */ jsx(
2797
+ "input",
2798
+ {
2799
+ type: "text",
2800
+ value: inputValue,
2801
+ onChange: handleInputChange,
2802
+ onBlur: () => onBlur && handleInputBlur(),
2803
+ placeholder,
2804
+ disabled,
2805
+ className: cn(
2806
+ "w-full h-full px-2 py-1.25 border text-sm rounded-sm outline-none shadow-xs transition-colors",
2807
+ validation ? "border-red-600 focus:border-blue-600 focus-visible:border-blue-600 focus-visible:ring-1 focus-visible:ring-blue-600/30 focus-visible:outline-none" : "border-gray-300 focus:border-blue-600 focus-visible:border-blue-600 focus-visible:ring-1 focus-visible:ring-blue-600/30 focus-visible:outline-none",
2808
+ disabled ? DATE_PICKER_FIELD_DISABLED_CLASS : "bg-white text-gray-900"
2809
+ ),
2810
+ maxLength: 10,
2811
+ onKeyDown: (e) => {
2812
+ if (e.key === "Enter") {
2813
+ e.preventDefault();
2814
+ handleFieldEnter(inputValue);
2815
+ }
2816
+ },
2817
+ "data-date-input": "true"
2789
2818
  }
2790
- },
2791
- "data-date-input": "true"
2792
- }
2793
- ),
2794
- /* @__PURE__ */ jsx(
2795
- "div",
2796
- {
2797
- role: "button",
2798
- tabIndex: -1,
2799
- "aria-hidden": disabled,
2800
- onClick: () => {
2801
- if (!disabled) toggleCalendar(inputValue);
2802
- },
2803
- className: cn(
2804
- "absolute right-1 top-1/2 -translate-y-1/2 rounded-full p-1",
2805
- disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS
2806
2819
  ),
2807
- children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: cn(disabled ? "text-neutral-400 opacity-50" : "text-gray-600") })
2808
- }
2809
- )
2810
- ] }),
2811
- calendarNode
2812
- ] });
2820
+ /* @__PURE__ */ jsx(
2821
+ "div",
2822
+ {
2823
+ role: "button",
2824
+ tabIndex: -1,
2825
+ "aria-hidden": disabled,
2826
+ onClick: () => {
2827
+ if (!disabled) toggleCalendar(inputValue);
2828
+ },
2829
+ className: cn(
2830
+ "absolute right-1 top-1/2 -translate-y-1/2 rounded-full p-1",
2831
+ disabled ? DATE_PICKER_ICON_DISABLED_CLASS : DATE_PICKER_ICON_ENABLED_CLASS
2832
+ ),
2833
+ children: /* @__PURE__ */ jsx(Calendar, { size: 15, className: cn(disabled ? "text-neutral-400 opacity-50" : "text-gray-600") })
2834
+ }
2835
+ )
2836
+ ] }),
2837
+ calendarNode
2838
+ ]
2839
+ }
2840
+ );
2813
2841
  }
2814
2842
  function DatePicker(props) {
2815
2843
  const {
2816
2844
  isRange,
2817
2845
  className,
2846
+ width,
2847
+ height,
2818
2848
  editDateSelect,
2819
2849
  onKeyDownEnter,
2820
2850
  datePosition,
@@ -2833,6 +2863,8 @@ function DatePicker(props) {
2833
2863
  endValue,
2834
2864
  onRangeChange,
2835
2865
  className,
2866
+ width,
2867
+ height,
2836
2868
  editDateSelect,
2837
2869
  onKeyDownEnter,
2838
2870
  datePosition,
@@ -2852,6 +2884,8 @@ function DatePicker(props) {
2852
2884
  onChange,
2853
2885
  placeholder,
2854
2886
  className,
2887
+ width,
2888
+ height,
2855
2889
  editDateSelect,
2856
2890
  onKeyDownEnter,
2857
2891
  datePosition,
@@ -4106,13 +4140,25 @@ function TableHeader(props) {
4106
4140
  };
4107
4141
  };
4108
4142
  const renderColumnTitle = (column, isClickableHead) => {
4109
- const baseClasses = "pt-0.5 select-none truncate";
4143
+ const hasWrapParts = column.isWrap && column.wrapParts && column.wrapParts.length > 0;
4144
+ const baseClasses = hasWrapParts ? "pt-0.5 select-none whitespace-normal" : column.isWrap ? "pt-0.5 select-none whitespace-normal break-words" : "pt-0.5 select-none truncate";
4110
4145
  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" : "";
4111
4146
  const hasSortIcon = column.sortable;
4112
4147
  const textAlignClass = column.align === "center" ? "text-center" : column.align === "right" ? "text-right" : "text-left";
4148
+ const titleContent = hasWrapParts ? column.wrapParts.map((part, idx) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
4149
+ idx > 0 && /* @__PURE__ */ jsx("wbr", {}),
4150
+ part
4151
+ ] }, idx)) : column.title;
4113
4152
  return /* @__PURE__ */ jsxs("div", { className: "flex items-center w-full", children: [
4114
4153
  hasSortIcon && column.align === "center" && /* @__PURE__ */ jsx("div", { className: "w-5 shrink-0" }),
4115
- /* @__PURE__ */ jsx("span", { className: `flex-1 px-3 ${textAlignClass} ${baseClasses} ${isClickableHead} ${subTitleClasses}`, children: column.title }),
4154
+ /* @__PURE__ */ jsx(
4155
+ "span",
4156
+ {
4157
+ className: `flex-1 px-3 ${textAlignClass} ${baseClasses} ${isClickableHead} ${subTitleClasses}`,
4158
+ style: hasWrapParts ? { wordBreak: "keep-all" } : void 0,
4159
+ children: titleContent
4160
+ }
4161
+ ),
4116
4162
  hasSortIcon && /* @__PURE__ */ jsx("div", { className: `w-6 shrink-0 flex items-center justify-center cursor-pointer ${isClickableHead}`, children: renderSortIcon(column.key) })
4117
4163
  ] });
4118
4164
  };
@@ -4151,7 +4197,7 @@ function TableHeader(props) {
4151
4197
  const hasMainGroups = Object.keys(mainGroups).length > 0;
4152
4198
  const hasSubGroups = Object.keys(subGroups).length > 0;
4153
4199
  if (!hasMainGroups && !hasSubGroups) {
4154
- return /* @__PURE__ */ jsx("thead", { className: "w-full sticky top-0 z-10", children: /* @__PURE__ */ jsx("tr", { className: "w-full h-10", children: columns.map((column, idx) => {
4200
+ return /* @__PURE__ */ jsx("thead", { className: "w-full sticky top-0 z-10", children: /* @__PURE__ */ jsx("tr", { className: "w-full min-h-10", children: columns.map((column, idx) => {
4155
4201
  const width = column.width;
4156
4202
  const minWidth = column.minWidth;
4157
4203
  const maxWidth = column.maxWidth;
@@ -4162,7 +4208,7 @@ function TableHeader(props) {
4162
4208
  {
4163
4209
  id: `${column.key}-header`,
4164
4210
  ...getDragProps(column),
4165
- className: `bg-gray-200 border-b border-r border-gray-300 py-2 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden last:border-r-0 transition-all ${isClickableHead}`,
4211
+ className: `bg-gray-200 border-b border-r border-gray-300 py-2 text-left font-semibold text-gray-700 text-sm tracking-wider last:border-r-0 transition-all ${column.isWrap ? "" : "overflow-hidden"} ${isClickableHead}`,
4166
4212
  onClick: () => {
4167
4213
  if (column.sortable) {
4168
4214
  handleSort(column.key);
@@ -4195,7 +4241,7 @@ function TableHeader(props) {
4195
4241
  }
4196
4242
  if (hasMainGroups) {
4197
4243
  return /* @__PURE__ */ jsxs("thead", { className: "w-full sticky top-0 z-10", children: [
4198
- /* @__PURE__ */ jsx("tr", { className: "w-full h-8", children: columns.map((column, idx) => {
4244
+ /* @__PURE__ */ jsx("tr", { className: "w-full min-h-8", children: columns.map((column, idx) => {
4199
4245
  const width = column.width;
4200
4246
  const minWidth = column.minWidth;
4201
4247
  const maxWidth = column.maxWidth;
@@ -4276,7 +4322,7 @@ function TableHeader(props) {
4276
4322
  width,
4277
4323
  minWidth: minWidth || width,
4278
4324
  maxWidth: maxWidth || width,
4279
- whiteSpace: "nowrap",
4325
+ whiteSpace: column.isWrap ? "normal" : "nowrap",
4280
4326
  ...fixedStyle
4281
4327
  },
4282
4328
  children: renderColumnTitle(column, column.sortable ? "cursor-pointer" : "")
@@ -4284,7 +4330,7 @@ function TableHeader(props) {
4284
4330
  `${column.key}-${idx}`
4285
4331
  );
4286
4332
  }) }),
4287
- /* @__PURE__ */ jsx("tr", { className: "w-full h-8", children: columns.map((column, idx) => {
4333
+ /* @__PURE__ */ jsx("tr", { className: "w-full min-h-8", children: columns.map((column, idx) => {
4288
4334
  const width = column.width;
4289
4335
  const minWidth = column.minWidth;
4290
4336
  const maxWidth = column.maxWidth;
@@ -4328,7 +4374,7 @@ function TableHeader(props) {
4328
4374
  }
4329
4375
  return null;
4330
4376
  }) }),
4331
- /* @__PURE__ */ jsx("tr", { className: "w-full h-8", children: columns.map((column, idx) => {
4377
+ /* @__PURE__ */ jsx("tr", { className: "w-full min-h-8", children: columns.map((column, idx) => {
4332
4378
  const width = column.width;
4333
4379
  const minWidth = column.minWidth;
4334
4380
  const maxWidth = column.maxWidth;
@@ -4342,7 +4388,7 @@ function TableHeader(props) {
4342
4388
  {
4343
4389
  id: `${column.key}-header`,
4344
4390
  ...getDragProps(column),
4345
- className: `bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`,
4391
+ className: `bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.isWrap ? "" : "overflow-hidden"} ${isClickableHead}`,
4346
4392
  onClick: () => {
4347
4393
  if (column.sortable) {
4348
4394
  handleSort(column.key);
@@ -4352,7 +4398,7 @@ function TableHeader(props) {
4352
4398
  width,
4353
4399
  minWidth: minWidth || width,
4354
4400
  maxWidth: maxWidth || width,
4355
- whiteSpace: "nowrap",
4401
+ whiteSpace: column.isWrap ? "normal" : "nowrap",
4356
4402
  ...fixedStyle
4357
4403
  },
4358
4404
  children: /* @__PURE__ */ jsx(
@@ -4374,7 +4420,7 @@ function TableHeader(props) {
4374
4420
  ] });
4375
4421
  }
4376
4422
  return /* @__PURE__ */ jsxs("thead", { className: "w-full sticky top-0 z-10", children: [
4377
- /* @__PURE__ */ jsx("tr", { className: "w-full h-8 ", children: columns.map((column) => {
4423
+ /* @__PURE__ */ jsx("tr", { className: "w-full min-h-8 ", children: columns.map((column) => {
4378
4424
  const width = column.width;
4379
4425
  const minWidth = column.minWidth;
4380
4426
  const maxWidth = column.maxWidth;
@@ -4424,7 +4470,7 @@ function TableHeader(props) {
4424
4470
  width,
4425
4471
  minWidth: minWidth || width,
4426
4472
  maxWidth: maxWidth || width,
4427
- whiteSpace: "nowrap",
4473
+ whiteSpace: column.isWrap ? "normal" : "nowrap",
4428
4474
  ...fixedStyle
4429
4475
  },
4430
4476
  children: renderColumnTitle(column, isClickableHead)
@@ -4432,7 +4478,7 @@ function TableHeader(props) {
4432
4478
  column.key
4433
4479
  );
4434
4480
  }) }),
4435
- /* @__PURE__ */ jsx("tr", { className: "w-full h-8", children: columns.map((column) => {
4481
+ /* @__PURE__ */ jsx("tr", { className: "w-full min-h-8", children: columns.map((column) => {
4436
4482
  const width = column.width;
4437
4483
  const minWidth = column.minWidth;
4438
4484
  const maxWidth = column.maxWidth;
@@ -4446,7 +4492,7 @@ function TableHeader(props) {
4446
4492
  {
4447
4493
  id: `${column.key}-header`,
4448
4494
  ...getDragProps(column),
4449
- className: `bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider overflow-hidden transition-all ${isClickableHead}`,
4495
+ className: `bg-gray-200 border-b border-r border-gray-300 py-1 text-left font-semibold text-gray-700 text-sm tracking-wider transition-all ${column.isWrap ? "" : "overflow-hidden"} ${isClickableHead}`,
4450
4496
  onClick: () => {
4451
4497
  if (column.sortable) {
4452
4498
  handleSort(column.key);
@@ -4456,7 +4502,7 @@ function TableHeader(props) {
4456
4502
  width,
4457
4503
  minWidth: minWidth || width,
4458
4504
  maxWidth: maxWidth || width,
4459
- whiteSpace: "nowrap",
4505
+ whiteSpace: column.isWrap ? "normal" : "nowrap",
4460
4506
  ...fixedStyle
4461
4507
  },
4462
4508
  children: /* @__PURE__ */ jsx(
@@ -8589,7 +8635,9 @@ function BaseUploader(props) {
8589
8635
  maxSize,
8590
8636
  disabled = false,
8591
8637
  placeholder,
8592
- className
8638
+ className,
8639
+ width,
8640
+ height
8593
8641
  } = props;
8594
8642
  const inputRef = useRef(null);
8595
8643
  const inputId = useId();
@@ -8632,7 +8680,7 @@ function BaseUploader(props) {
8632
8680
  };
8633
8681
  const showZone = multiple || files.length === 0;
8634
8682
  const acceptLabel = accept ? accept.split(",").map((s) => s.trim().toUpperCase()).join(", ") : "\uBAA8\uB4E0 \uD615\uC2DD";
8635
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
8683
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), style: { width: typeof width === "number" ? `${width}px` : width }, children: [
8636
8684
  /* @__PURE__ */ jsx(
8637
8685
  "input",
8638
8686
  {
@@ -8666,6 +8714,7 @@ function BaseUploader(props) {
8666
8714
  setIsDragging(false);
8667
8715
  },
8668
8716
  onDrop: handleDrop,
8717
+ style: { minHeight: typeof height === "number" ? `${height}px` : height ?? "7rem" },
8669
8718
  className: cn(
8670
8719
  "flex flex-col items-center justify-center gap-2 min-h-28 w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed",
8671
8720
  disabled ? "cursor-not-allowed border-gray-200 bg-gray-100 opacity-60" : "cursor-pointer hover:bg-gray-50",
@@ -8711,7 +8760,7 @@ function BaseUploader(props) {
8711
8760
  var EXCEL_ACCEPT = ".xlsx,.xls,.csv";
8712
8761
  var MAX_EXCEL_BYTES = 10 * 1024 * 1024;
8713
8762
  function ExcelUploader(props) {
8714
- const { files, onChange, disabled, className } = props;
8763
+ const { files, onChange, disabled, className, width, height } = props;
8715
8764
  return /* @__PURE__ */ jsx(
8716
8765
  BaseUploader,
8717
8766
  {
@@ -8722,7 +8771,9 @@ function ExcelUploader(props) {
8722
8771
  maxSize: MAX_EXCEL_BYTES,
8723
8772
  disabled,
8724
8773
  placeholder: "\uC5D1\uC140 \uD30C\uC77C\uC744 \uD074\uB9AD\uD558\uAC70\uB098 \uB4DC\uB798\uADF8\uD558\uC138\uC694",
8725
- className
8774
+ className,
8775
+ width,
8776
+ height
8726
8777
  }
8727
8778
  );
8728
8779
  }
@@ -8819,7 +8870,7 @@ var compressImage = (file) => {
8819
8870
  }).catch(() => file);
8820
8871
  };
8821
8872
  function FileUploader(props) {
8822
- const { files, onChange, multiple = true, disabled = false, className } = props;
8873
+ const { files, onChange, multiple = true, disabled = false, className, width, height } = props;
8823
8874
  const inputRef = useRef(null);
8824
8875
  const containerRef = useRef(null);
8825
8876
  const [isDragging, setIsDragging] = useState(false);
@@ -8926,121 +8977,129 @@ function FileUploader(props) {
8926
8977
  setError("");
8927
8978
  };
8928
8979
  const isProcessing = processingCount > 0;
8929
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", className), children: [
8930
- /* @__PURE__ */ jsx(
8931
- "input",
8932
- {
8933
- ref: inputRef,
8934
- type: "file",
8935
- multiple,
8936
- accept: "image/jpeg,image/png,image/webp,image/heic,image/heif,application/pdf,.heic,.heif",
8937
- disabled,
8938
- className: "hidden",
8939
- onChange: (e) => {
8940
- handleFiles(e.target.files);
8941
- if (inputRef.current) inputRef.current.value = "";
8942
- }
8943
- }
8944
- ),
8945
- /* @__PURE__ */ jsxs(
8946
- "div",
8947
- {
8948
- ref: containerRef,
8949
- onClick: isProcessing || disabled ? void 0 : () => inputRef.current?.click(),
8950
- onDragOver: handleDragOver,
8951
- onDragEnter: handleDragOver,
8952
- onDragLeave: handleDragLeave,
8953
- onDrop: handleDrop,
8954
- className: cn(
8955
- "relative w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed",
8956
- disabled ? "cursor-not-allowed border-gray-200 bg-gray-100 opacity-60" : isProcessing ? "cursor-default border-gray-300" : "cursor-pointer hover:bg-gray-50",
8957
- isDragging ? "border-blue-500 bg-blue-50" : "border-gray-300",
8958
- error && !isDragging ? "border-red-300 bg-red-50" : "",
8959
- files.length > 0 ? "p-3" : "flex flex-col items-center justify-center gap-1 min-h-32"
8980
+ return /* @__PURE__ */ jsxs(
8981
+ "div",
8982
+ {
8983
+ className: cn("space-y-3", className),
8984
+ style: { width: typeof width === "number" ? `${width}px` : width },
8985
+ children: [
8986
+ /* @__PURE__ */ jsx(
8987
+ "input",
8988
+ {
8989
+ ref: inputRef,
8990
+ type: "file",
8991
+ multiple,
8992
+ accept: "image/jpeg,image/png,image/webp,image/heic,image/heif,application/pdf,.heic,.heif",
8993
+ disabled,
8994
+ className: "hidden",
8995
+ onChange: (e) => {
8996
+ handleFiles(e.target.files);
8997
+ if (inputRef.current) inputRef.current.value = "";
8998
+ }
8999
+ }
8960
9000
  ),
8961
- children: [
8962
- isProcessing && /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-white/80", children: [
8963
- /* @__PURE__ */ jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-blue-400 border-t-transparent" }),
8964
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-600", children: "\uCC98\uB9AC \uC911..." })
8965
- ] }),
8966
- files.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
8967
- /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3", children: files.map((file, idx) => {
8968
- const url = previewUrls[idx];
8969
- const isImage = file.type.startsWith("image/");
8970
- return /* @__PURE__ */ jsxs(
8971
- "div",
8972
- {
8973
- className: "group relative overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow-md",
8974
- children: [
8975
- /* @__PURE__ */ jsx(
8976
- "button",
8977
- {
8978
- type: "button",
8979
- onClick: (e) => {
8980
- e.stopPropagation();
8981
- viewer.open(idx);
8982
- },
8983
- className: "block w-full aspect-square cursor-pointer",
8984
- "aria-label": `${file.name} \uBBF8\uB9AC\uBCF4\uAE30`,
8985
- children: isImage && url ? /* @__PURE__ */ jsx("img", { src: url, alt: file.name, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col items-center justify-center bg-gray-50 text-gray-400", children: [
8986
- /* @__PURE__ */ jsx(FileText, { className: "w-8 h-8" }),
8987
- /* @__PURE__ */ jsx("span", { className: "mt-1 max-w-full truncate px-1 text-center text-[10px]", children: file.name })
8988
- ] })
8989
- }
8990
- ),
8991
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-1 border-t border-gray-100 px-1.5 py-1", children: [
8992
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-[10px] text-gray-600", title: file.name, children: file.name }),
8993
- /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[10px] text-gray-400", children: formatFileSize(file.size) })
8994
- ] }),
8995
- !disabled && /* @__PURE__ */ jsx(
8996
- "button",
8997
- {
8998
- type: "button",
8999
- onClick: (e) => {
9000
- e.stopPropagation();
9001
- removeFile(idx);
9002
- },
9003
- className: "absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity group-hover:opacity-100 cursor-pointer",
9004
- "aria-label": "\uD30C\uC77C \uC81C\uAC70",
9005
- children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
9006
- }
9007
- )
9008
- ]
9009
- },
9010
- `${file.name}-${idx}`
9011
- );
9012
- }) }),
9013
- /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center justify-between text-xs text-gray-500", children: [
9014
- /* @__PURE__ */ jsxs("span", { children: [
9015
- files.length,
9016
- "\uAC1C \uD30C\uC77C \uC120\uD0DD\uB428",
9017
- !disabled && " \xB7 \uD074\uB9AD\uD558\uC5EC \uCD94\uAC00"
9001
+ /* @__PURE__ */ jsxs(
9002
+ "div",
9003
+ {
9004
+ ref: containerRef,
9005
+ onClick: isProcessing || disabled ? void 0 : () => inputRef.current?.click(),
9006
+ onDragOver: handleDragOver,
9007
+ onDragEnter: handleDragOver,
9008
+ onDragLeave: handleDragLeave,
9009
+ onDrop: handleDrop,
9010
+ className: cn(
9011
+ "relative w-full rounded-lg bg-gray-50/50 border-[1.5px] border-dashed",
9012
+ disabled ? "cursor-not-allowed border-gray-200 bg-gray-100 opacity-60" : isProcessing ? "cursor-default border-gray-300" : "cursor-pointer hover:bg-gray-50",
9013
+ isDragging ? "border-blue-500 bg-blue-50" : "border-gray-300",
9014
+ error && !isDragging ? "border-red-300 bg-red-50" : "",
9015
+ files.length > 0 ? "p-3" : "flex flex-col items-center justify-center gap-1"
9016
+ ),
9017
+ style: files.length === 0 ? { minHeight: typeof height === "number" ? `${height}px` : height ?? "8rem" } : void 0,
9018
+ children: [
9019
+ isProcessing && /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 z-10 flex flex-col items-center justify-center gap-2 rounded-lg bg-white/80", children: [
9020
+ /* @__PURE__ */ jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-4 border-blue-400 border-t-transparent" }),
9021
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-600", children: "\uCC98\uB9AC \uC911..." })
9018
9022
  ] }),
9019
- /* @__PURE__ */ jsxs("span", { children: [
9020
- "\uCD1D ",
9021
- formatFileSize(files.reduce((sum, f) => sum + f.size, 0))
9023
+ files.length > 0 ? /* @__PURE__ */ jsxs(Fragment, { children: [
9024
+ /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 gap-3", children: files.map((file, idx) => {
9025
+ const url = previewUrls[idx];
9026
+ const isImage = file.type.startsWith("image/");
9027
+ return /* @__PURE__ */ jsxs(
9028
+ "div",
9029
+ {
9030
+ className: "group relative overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm transition-shadow hover:shadow-md",
9031
+ children: [
9032
+ /* @__PURE__ */ jsx(
9033
+ "button",
9034
+ {
9035
+ type: "button",
9036
+ onClick: (e) => {
9037
+ e.stopPropagation();
9038
+ viewer.open(idx);
9039
+ },
9040
+ className: "block w-full aspect-square cursor-pointer",
9041
+ "aria-label": `${file.name} \uBBF8\uB9AC\uBCF4\uAE30`,
9042
+ children: isImage && url ? /* @__PURE__ */ jsx("img", { src: url, alt: file.name, className: "h-full w-full object-cover" }) : /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col items-center justify-center bg-gray-50 text-gray-400", children: [
9043
+ /* @__PURE__ */ jsx(FileText, { className: "w-8 h-8" }),
9044
+ /* @__PURE__ */ jsx("span", { className: "mt-1 max-w-full truncate px-1 text-center text-[10px]", children: file.name })
9045
+ ] })
9046
+ }
9047
+ ),
9048
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-1 border-t border-gray-100 px-1.5 py-1", children: [
9049
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-[10px] text-gray-600", title: file.name, children: file.name }),
9050
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-[10px] text-gray-400", children: formatFileSize(file.size) })
9051
+ ] }),
9052
+ !disabled && /* @__PURE__ */ jsx(
9053
+ "button",
9054
+ {
9055
+ type: "button",
9056
+ onClick: (e) => {
9057
+ e.stopPropagation();
9058
+ removeFile(idx);
9059
+ },
9060
+ className: "absolute right-1 top-1 flex h-5 w-5 items-center justify-center rounded-full bg-black/60 text-white opacity-0 transition-opacity group-hover:opacity-100 cursor-pointer",
9061
+ "aria-label": "\uD30C\uC77C \uC81C\uAC70",
9062
+ children: /* @__PURE__ */ jsx(X, { className: "w-3 h-3" })
9063
+ }
9064
+ )
9065
+ ]
9066
+ },
9067
+ `${file.name}-${idx}`
9068
+ );
9069
+ }) }),
9070
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center justify-between text-xs text-gray-500", children: [
9071
+ /* @__PURE__ */ jsxs("span", { children: [
9072
+ files.length,
9073
+ "\uAC1C \uD30C\uC77C \uC120\uD0DD\uB428",
9074
+ !disabled && " \xB7 \uD074\uB9AD\uD558\uC5EC \uCD94\uAC00"
9075
+ ] }),
9076
+ /* @__PURE__ */ jsxs("span", { children: [
9077
+ "\uCD1D ",
9078
+ formatFileSize(files.reduce((sum, f) => sum + f.size, 0))
9079
+ ] })
9080
+ ] })
9081
+ ] }) : isDragging ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-1 text-blue-500", children: [
9082
+ /* @__PURE__ */ jsxs("p", { className: "text-sm font-semibold flex gap-1", children: [
9083
+ /* @__PURE__ */ jsx(FileUp, { size: 15, className: "mt-[1px]" }),
9084
+ "\uD30C\uC77C\uC744 \uC5EC\uAE30\uC5D0 \uB193\uC544\uC8FC\uC138\uC694"
9085
+ ] }),
9086
+ /* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "\uB4DC\uB86D\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4." })
9087
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
9088
+ /* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-600 flex gap-1", children: [
9089
+ /* @__PURE__ */ jsx(FileUp, { size: 15, className: "text-gray-400 mt-[1px]" }),
9090
+ " \uD074\uB9AD\uD558\uC5EC \uD30C\uC77C\uC744 \uC120\uD0DD\uD558\uAC70\uB098 \uB4DC\uB798\uADF8\uD558\uC138\uC694"
9091
+ ] }),
9092
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400", children: "\uC774\uBBF8\uC9C0(JPG \xB7 PNG \xB7 WEBP \xB7 HEIC, \uCD5C\uB300 50MB) \xB7 PDF(\uCD5C\uB300 10MB)" }),
9093
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400", children: multiple ? `\uCD5C\uB300 ${MAX_FILES}\uAC1C \xB7 \uC804\uCCB4 20MB \uC774\uD558` : "\uB2E8\uC77C \uD30C\uC77C" })
9022
9094
  ] })
9023
- ] })
9024
- ] }) : isDragging ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center gap-1 text-blue-500", children: [
9025
- /* @__PURE__ */ jsxs("p", { className: "text-sm font-semibold flex gap-1", children: [
9026
- /* @__PURE__ */ jsx(FileUp, { size: 15, className: "mt-[1px]" }),
9027
- "\uD30C\uC77C\uC744 \uC5EC\uAE30\uC5D0 \uB193\uC544\uC8FC\uC138\uC694"
9028
- ] }),
9029
- /* @__PURE__ */ jsx("p", { className: "text-xs font-medium", children: "\uB4DC\uB86D\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5C5\uB85C\uB4DC\uB429\uB2C8\uB2E4." })
9030
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
9031
- /* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-600 flex gap-1", children: [
9032
- /* @__PURE__ */ jsx(FileUp, { size: 15, className: "text-gray-400 mt-[1px]" }),
9033
- " \uD074\uB9AD\uD558\uC5EC \uD30C\uC77C\uC744 \uC120\uD0DD\uD558\uAC70\uB098 \uB4DC\uB798\uADF8\uD558\uC138\uC694"
9034
- ] }),
9035
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400", children: "\uC774\uBBF8\uC9C0(JPG \xB7 PNG \xB7 WEBP \xB7 HEIC, \uCD5C\uB300 50MB) \xB7 PDF(\uCD5C\uB300 10MB)" }),
9036
- /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-400", children: multiple ? `\uCD5C\uB300 ${MAX_FILES}\uAC1C \xB7 \uC804\uCCB4 20MB \uC774\uD558` : "\uB2E8\uC77C \uD30C\uC77C" })
9037
- ] })
9038
- ]
9039
- }
9040
- ),
9041
- error && /* @__PURE__ */ jsx("p", { className: "whitespace-pre-line text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2", children: error }),
9042
- /* @__PURE__ */ jsx(FilePreviewViewer, { ...viewer.viewerProps, fileTypes, fileNames: files.map((f) => f.name) })
9043
- ] });
9095
+ ]
9096
+ }
9097
+ ),
9098
+ error && /* @__PURE__ */ jsx("p", { className: "whitespace-pre-line text-xs text-red-500 bg-red-50 border border-red-200 rounded px-3 py-2", children: error }),
9099
+ /* @__PURE__ */ jsx(FilePreviewViewer, { ...viewer.viewerProps, fileTypes, fileNames: files.map((f) => f.name) })
9100
+ ]
9101
+ }
9102
+ );
9044
9103
  }
9045
9104
  var VARIANT_STYLES2 = {
9046
9105
  light: {