sellmate-design-system-react 0.1.9 → 0.1.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.
Files changed (82) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +1 -1
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +1 -1
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +1 -1
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +1 -1
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SCircleProgress/SCircleProgress.cjs +69 -50
  10. package/dist/components/SCircleProgress/SCircleProgress.cjs.map +1 -1
  11. package/dist/components/SCircleProgress/SCircleProgress.d.ts +2 -0
  12. package/dist/components/SCircleProgress/SCircleProgress.js +69 -50
  13. package/dist/components/SCircleProgress/SCircleProgress.js.map +1 -1
  14. package/dist/components/SDatePicker/SDatePicker.cjs +1 -1
  15. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  16. package/dist/components/SDatePicker/SDatePicker.js +1 -1
  17. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  18. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +1 -1
  19. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  20. package/dist/components/SDateRangePicker/SDateRangePicker.js +1 -1
  21. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  22. package/dist/components/SField/SField.cjs +1 -1
  23. package/dist/components/SField/SField.cjs.map +1 -1
  24. package/dist/components/SField/SField.js +1 -1
  25. package/dist/components/SField/SField.js.map +1 -1
  26. package/dist/components/SFilePicker/SFilePicker.cjs +36 -17
  27. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  28. package/dist/components/SFilePicker/SFilePicker.d.ts +1 -1
  29. package/dist/components/SFilePicker/SFilePicker.js +35 -17
  30. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  31. package/dist/components/SInput/SInput.cjs +1 -1
  32. package/dist/components/SInput/SInput.cjs.map +1 -1
  33. package/dist/components/SInput/SInput.js +1 -1
  34. package/dist/components/SInput/SInput.js.map +1 -1
  35. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +43 -22
  36. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  37. package/dist/components/SKeyValueTable/SKeyValueTable.js +43 -22
  38. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  39. package/dist/components/SLoadingContainer/SLoadingContainer.cjs +69 -50
  40. package/dist/components/SLoadingContainer/SLoadingContainer.cjs.map +1 -1
  41. package/dist/components/SLoadingContainer/SLoadingContainer.js +69 -50
  42. package/dist/components/SLoadingContainer/SLoadingContainer.js.map +1 -1
  43. package/dist/components/SLoadingContainer/loading.cjs +69 -50
  44. package/dist/components/SLoadingContainer/loading.cjs.map +1 -1
  45. package/dist/components/SLoadingContainer/loading.js +69 -50
  46. package/dist/components/SLoadingContainer/loading.js.map +1 -1
  47. package/dist/components/SLoadingModal/SLoadingModal.cjs +72 -50
  48. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  49. package/dist/components/SLoadingModal/SLoadingModal.d.ts +3 -1
  50. package/dist/components/SLoadingModal/SLoadingModal.js +72 -50
  51. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  52. package/dist/components/SNumberInput/SNumberInput.cjs +1 -1
  53. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  54. package/dist/components/SNumberInput/SNumberInput.js +1 -1
  55. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  56. package/dist/components/SRadio/SRadioGroup.cjs +1 -1
  57. package/dist/components/SRadio/SRadioGroup.cjs.map +1 -1
  58. package/dist/components/SRadio/SRadioGroup.js +1 -1
  59. package/dist/components/SRadio/SRadioGroup.js.map +1 -1
  60. package/dist/components/SSelect/SSelect.cjs +8 -4
  61. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  62. package/dist/components/SSelect/SSelect.js +8 -4
  63. package/dist/components/SSelect/SSelect.js.map +1 -1
  64. package/dist/components/STable/STable.cjs +82 -56
  65. package/dist/components/STable/STable.cjs.map +1 -1
  66. package/dist/components/STable/STable.js +82 -56
  67. package/dist/components/STable/STable.js.map +1 -1
  68. package/dist/components/STextarea/STextarea.cjs +1 -1
  69. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  70. package/dist/components/STextarea/STextarea.js +1 -1
  71. package/dist/components/STextarea/STextarea.js.map +1 -1
  72. package/dist/components/STooltip/STooltip.cjs +1 -1
  73. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  74. package/dist/components/STooltip/STooltip.js +1 -1
  75. package/dist/components/STooltip/STooltip.js.map +1 -1
  76. package/dist/index.cjs +120 -74
  77. package/dist/index.cjs.map +1 -1
  78. package/dist/index.js +120 -74
  79. package/dist/index.js.map +1 -1
  80. package/dist/styles.css +62 -21
  81. package/dist/theme.css +45 -21
  82. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -3328,12 +3328,35 @@ var COLOR_MAP = {
3328
3328
  };
3329
3329
  var clamp2 = (v) => Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0;
3330
3330
  var SCircleProgress = react.forwardRef(
3331
- function SCircleProgress2({ value = 0, type = "primary", indeterminate = false, label, className, style }, ref) {
3331
+ function SCircleProgress2({
3332
+ value = 0,
3333
+ type = "primary",
3334
+ indeterminate = false,
3335
+ label,
3336
+ innerValue = false,
3337
+ className,
3338
+ style
3339
+ }, ref) {
3332
3340
  const v = clamp2(value);
3333
3341
  const colors = COLOR_MAP[type];
3334
3342
  const c = VIEWBOX / 2;
3335
3343
  const percentColor = v === 0 ? "var(--sys-color-fg-tertiary, #888888)" : colors.arc;
3336
3344
  const filled = v / 100 * CIRCUMFERENCE;
3345
+ const showPercent = !indeterminate;
3346
+ const percentNode = /* @__PURE__ */ jsxRuntime.jsxs(
3347
+ "span",
3348
+ {
3349
+ className: cn(
3350
+ "text-center text-[16px] font-bold leading-[26px]",
3351
+ innerValue && "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2"
3352
+ ),
3353
+ style: { color: percentColor },
3354
+ children: [
3355
+ Math.round(v),
3356
+ "%"
3357
+ ]
3358
+ }
3359
+ );
3337
3360
  return /* @__PURE__ */ jsxRuntime.jsxs(
3338
3361
  "div",
3339
3362
  {
@@ -3344,57 +3367,53 @@ var SCircleProgress = react.forwardRef(
3344
3367
  ),
3345
3368
  style,
3346
3369
  children: [
3347
- /* @__PURE__ */ jsxRuntime.jsxs(
3348
- "svg",
3349
- {
3350
- viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
3351
- xmlns: "http://www.w3.org/2000/svg",
3352
- className: cn("h-[80px] w-[80px]", indeterminate && "origin-center animate-circle-spin"),
3353
- children: [
3354
- /* @__PURE__ */ jsxRuntime.jsx(
3355
- "circle",
3356
- {
3357
- cx: c,
3358
- cy: c,
3359
- r: RADIUS,
3360
- fill: "none",
3361
- strokeWidth: STROKE,
3362
- style: { stroke: colors.track }
3363
- }
3370
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(innerValue && "relative"), children: [
3371
+ /* @__PURE__ */ jsxRuntime.jsxs(
3372
+ "svg",
3373
+ {
3374
+ viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
3375
+ xmlns: "http://www.w3.org/2000/svg",
3376
+ className: cn(
3377
+ "h-[80px] w-[80px]",
3378
+ indeterminate && "origin-center animate-circle-spin"
3364
3379
  ),
3365
- /* @__PURE__ */ jsxRuntime.jsx(
3366
- "circle",
3367
- {
3368
- cx: c,
3369
- cy: c,
3370
- r: RADIUS,
3371
- fill: "none",
3372
- strokeWidth: STROKE,
3373
- strokeLinecap: "round",
3374
- className: cn(
3375
- "origin-center",
3376
- indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
3377
- ),
3378
- style: {
3379
- stroke: colors.arc,
3380
- ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
3380
+ children: [
3381
+ /* @__PURE__ */ jsxRuntime.jsx(
3382
+ "circle",
3383
+ {
3384
+ cx: c,
3385
+ cy: c,
3386
+ r: RADIUS,
3387
+ fill: "none",
3388
+ strokeWidth: STROKE,
3389
+ style: { stroke: colors.track }
3381
3390
  }
3382
- }
3383
- )
3384
- ]
3385
- }
3386
- ),
3387
- !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
3388
- "span",
3389
- {
3390
- className: "text-center text-[16px] font-bold leading-[26px]",
3391
- style: { color: percentColor },
3392
- children: [
3393
- Math.round(v),
3394
- "%"
3395
- ]
3396
- }
3397
- ),
3391
+ ),
3392
+ /* @__PURE__ */ jsxRuntime.jsx(
3393
+ "circle",
3394
+ {
3395
+ cx: c,
3396
+ cy: c,
3397
+ r: RADIUS,
3398
+ fill: "none",
3399
+ strokeWidth: STROKE,
3400
+ strokeLinecap: "round",
3401
+ className: cn(
3402
+ "origin-center",
3403
+ indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
3404
+ ),
3405
+ style: {
3406
+ stroke: colors.arc,
3407
+ ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
3408
+ }
3409
+ }
3410
+ )
3411
+ ]
3412
+ }
3413
+ ),
3414
+ showPercent && innerValue && percentNode
3415
+ ] }),
3416
+ showPercent && !innerValue && percentNode,
3398
3417
  label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
3399
3418
  ]
3400
3419
  }
@@ -4153,7 +4172,7 @@ var STooltip = react.forwardRef(function STooltip2({
4153
4172
  if (disabled || body == null) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: triggerNode });
4154
4173
  const isHover = trigger === "hover";
4155
4174
  const contentClass = cn(
4156
- "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
4175
+ "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
4157
4176
  FLOATING_SLIDE_ANIM,
4158
4177
  className
4159
4178
  );
@@ -4815,6 +4834,7 @@ var DEFAULT_BUTTON_LABEL = {
4815
4834
  function SLoadingModal({
4816
4835
  open,
4817
4836
  onOpenChange,
4837
+ onClose,
4818
4838
  persistent,
4819
4839
  state: state2 = "loading",
4820
4840
  progress,
@@ -4833,6 +4853,8 @@ function SLoadingModal({
4833
4853
  {
4834
4854
  open,
4835
4855
  onOpenChange,
4856
+ onClose,
4857
+ showClose: state2 === "error",
4836
4858
  persistent,
4837
4859
  ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
4838
4860
  width,
@@ -5642,7 +5664,7 @@ function ItemList({
5642
5664
  isDepth1 ? "border-t border-solid border-[color:var(--cmp-listItem-depth1-border-color)] bg-[var(--cmp-listItem-depth1-bg-default)] font-bold" : "bg-[var(--cmp-listItem-depth2-middle-bg)] font-medium",
5643
5665
  // 하위가 전부 비활성이면(select.config 에서 bubble-up) 어미 그룹도 비활성 처리:
5644
5666
  // 텍스트는 회색(#888), depth1 그룹은 파란 배경 대신 회색(#EEE)으로 (depth2 는 #F6F6F6 유지)
5645
- o.disabled && "text-[color:var(--cmp-listItem-content-disabled)]",
5667
+ o.disabled && "cursor-not-allowed text-[color:var(--cmp-listItem-content-disabled)]",
5646
5668
  o.disabled && isDepth1 && "bg-[var(--cmp-listItem-depth1-bg-disabled)]"
5647
5669
  ),
5648
5670
  style: { paddingLeft: padLeft },
@@ -5657,10 +5679,14 @@ function ItemList({
5657
5679
  {
5658
5680
  value: o.value,
5659
5681
  disabled: o.disabled,
5682
+ accessibleWhenDisabled: true,
5660
5683
  className: cn(
5661
5684
  itemBase,
5662
5685
  isSelected && !multi && "font-bold text-[color:var(--cmp-listItem-content-selected)]",
5663
- activeClass
5686
+ // Ariakit은 disabled 항목도 hover 시 active(data-active-item) 처리하므로,
5687
+ // 비활성 항목에는 hover 하이라이트를 적용하지 않아 회색 비활성 스타일을 유지한다.
5688
+ // (원본 Stencil의 `--focused...:not(--disabled)` 규칙과 동일한 의도)
5689
+ !o.disabled && activeClass
5664
5690
  ),
5665
5691
  style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: padLeft },
5666
5692
  render: useSearch ? /* @__PURE__ */ jsxRuntime.jsx(Ariakit__namespace.ComboboxItem, {}) : void 0,
@@ -5673,7 +5699,7 @@ function ItemList({
5673
5699
  "flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid",
5674
5700
  o.disabled ? (
5675
5701
  // 비활성: 회색 채움(#E1E1E1) + 회색 테두리(#CCCCCC)
5676
- "border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]"
5702
+ "cursor-not-allowed border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]"
5677
5703
  ) : cn(
5678
5704
  "group-data-[active-item]:border-[color:var(--cmp-checkbox-checked-border-inverse)]",
5679
5705
  isSelected ? "border-[color:var(--cmp-checkbox-checked-bg-default)] bg-[var(--cmp-checkbox-checked-bg-default)] group-data-[active-item]:bg-transparent" : "border-[color:var(--cmp-checkbox-unchecked-border-default)] bg-transparent"
@@ -5975,7 +6001,8 @@ var STable = react.forwardRef(function STable2({
5975
6001
  else onSelectedChange?.([...selected, row]);
5976
6002
  };
5977
6003
  const radiusClass = radius === "full" ? "rounded-none" : radius === "useTop" ? "rounded-b-[var(--cmp-table-radius)] rounded-t-none" : "rounded-[var(--cmp-table-radius)]";
5978
- const cellPadY = dense ? "var(--cmp-table-body-dense-paddingY)" : "var(--cmp-table-body-default-paddingY)";
6004
+ const cellPadY = dense ? "var(--cmp-table-body-paddingY-dense)" : "var(--cmp-table-body-paddingY-default)";
6005
+ const cellPadX = dense ? "var(--cmp-table-body-paddingX-default)" : "var(--cmp-table-body-paddingX-wide)";
5979
6006
  const rowH = dense ? "var(--cmp-table-body-dense-height)" : "var(--cmp-table-body-default-height)";
5980
6007
  const totalColSpan = visibleCols.length + (selectable ? 1 : 0);
5981
6008
  const stickyInfo = (i) => {
@@ -6150,13 +6177,15 @@ var STable = react.forwardRef(function STable2({
6150
6177
  className: cn(
6151
6178
  // 원본 .td: 컬럼 폭에 맞춰 내용 말줄임(overflow hidden + ellipsis) + 행 구분선(border-b)
6152
6179
  // 셀 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.
6153
- "overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] px-[16px] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]",
6180
+ "overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]",
6154
6181
  rowBg,
6155
6182
  "group-hover:bg-[var(--color-grey-05)]",
6156
6183
  stickyShadowClass(i),
6157
6184
  col.tdClass
6158
6185
  ),
6159
6186
  style: {
6187
+ paddingLeft: cellPadX,
6188
+ paddingRight: cellPadX,
6160
6189
  paddingTop: cellPadY,
6161
6190
  paddingBottom: cellPadY,
6162
6191
  textAlign: col.align ?? "left",
@@ -6890,7 +6919,7 @@ function SRadioGroup({
6890
6919
  role: "radiogroup",
6891
6920
  className: cn(
6892
6921
  "inline-flex",
6893
- direction === "vertical" ? "flex-col gap-[8px]" : "flex-row gap-[20px]",
6922
+ direction === "vertical" ? "flex-col gap-[var(--cmp-radio-group-gap-vertical)]" : "flex-row gap-[var(--cmp-radio-group-gap-horizontal)]",
6894
6923
  className
6895
6924
  ),
6896
6925
  style,
@@ -7798,7 +7827,10 @@ function SFilePicker({
7798
7827
  const autoId = react.useId();
7799
7828
  const resolvedName = name ?? autoId;
7800
7829
  const inputRef = react.useRef(null);
7830
+ const contentBoxRef = react.useRef(null);
7801
7831
  const [ruleError, setRuleError] = react.useState("");
7832
+ const [listOpen, setListOpen] = react.useState(false);
7833
+ const portalContainer = usePortalContainer();
7802
7834
  const files = multiple ? Array.isArray(value) ? value : [] : value && !Array.isArray(value) ? value : null;
7803
7835
  const hasFiles = multiple ? files.length > 0 : !!files;
7804
7836
  const displayText = !hasFiles ? placeholder : multiple ? files.map((f) => f.name).join(", ") : files.name;
@@ -7852,10 +7884,12 @@ function SFilePicker({
7852
7884
  e.stopPropagation();
7853
7885
  if (disabled) return;
7854
7886
  onValueChange?.(multiple ? [] : null);
7887
+ setListOpen(false);
7855
7888
  };
7856
7889
  const removeChip = (i) => {
7857
7890
  const next = files.filter((_, idx) => idx !== i);
7858
7891
  onValueChange?.(next);
7892
+ if (next.length === 0) setListOpen(false);
7859
7893
  };
7860
7894
  const open = () => {
7861
7895
  if (!disabled) inputRef.current?.click();
@@ -7866,9 +7900,12 @@ function SFilePicker({
7866
7900
  const iconSize = size === "md" ? 20 : 16;
7867
7901
  const gapCls = size === "md" ? "gap-[var(--cmp-filepicker-md-gap)]" : "gap-[var(--cmp-filepicker-sm-gap)]";
7868
7902
  const inlinePlaceholder = inline && !disabled && !hasFiles;
7869
- const content = /* @__PURE__ */ jsxRuntime.jsxs(
7903
+ const showListbox = multiple && useMultipleListBox;
7904
+ const filesArr = multiple ? files : [];
7905
+ const contentInner = /* @__PURE__ */ jsxRuntime.jsxs(
7870
7906
  "div",
7871
7907
  {
7908
+ ref: contentBoxRef,
7872
7909
  className: cn("group/filepicker flex h-full w-full items-center", gapCls),
7873
7910
  style: { padding: inline ? 0 : `0 ${padX}` },
7874
7911
  children: [
@@ -7923,25 +7960,34 @@ function SFilePicker({
7923
7960
  ]
7924
7961
  }
7925
7962
  ),
7963
+ showListbox && hasFiles && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
7964
+ Ariakit__namespace.PopoverDisclosure,
7965
+ {
7966
+ render: /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "caretDown", size: "xxs", ariaLabel: "toggle file list" }),
7967
+ className: cn("shrink-0 transition-transform duration-150", listOpen && "rotate-180")
7968
+ }
7969
+ ),
7926
7970
  !disabled && hasFiles && /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "close", size: "xxs", ariaLabel: "clear", onClick: clear })
7927
7971
  ]
7928
7972
  }
7929
7973
  );
7930
- const chips = multiple && files.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
7931
- "div",
7932
- {
7933
- className: cn(
7934
- "mt-[8px] flex gap-[8px]",
7935
- useMultipleListBox ? "box-border flex-col items-start rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] p-[8px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]" : "flex-wrap"
7936
- ),
7937
- style: useMultipleListBox ? {
7938
- width: typeof width === "number" ? `${width}px` : width,
7939
- // label 있으면 SField 입력 박스 시작 위치(labelWidth + fieldGap) 맞춰 정렬
7940
- marginLeft: label && labelWidth != null ? `calc(${typeof labelWidth === "number" ? `${labelWidth}px` : labelWidth} + var(--sys-space-field-${size}-gap))` : void 0
7941
- } : void 0,
7942
- children: files.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i))
7943
- }
7944
- );
7974
+ const content = showListbox ? /* @__PURE__ */ jsxRuntime.jsxs(Ariakit__namespace.PopoverProvider, { open: listOpen, setOpen: setListOpen, placement: "bottom-start", children: [
7975
+ contentInner,
7976
+ /* @__PURE__ */ jsxRuntime.jsx(
7977
+ Ariakit__namespace.Popover,
7978
+ {
7979
+ portal: true,
7980
+ portalElement: portalContainer,
7981
+ gutter: 4,
7982
+ unmountOnHide: true,
7983
+ getAnchorRect: () => contentBoxRef.current?.getBoundingClientRect() ?? null,
7984
+ style: { minWidth: contentBoxRef.current?.offsetWidth },
7985
+ className: "z-50 box-border flex flex-col items-stretch gap-[8px] rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] p-[8px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
7986
+ children: filesArr.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i))
7987
+ }
7988
+ )
7989
+ ] }) : contentInner;
7990
+ const chips = multiple && !useMultipleListBox && filesArr.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-[8px] flex flex-wrap gap-[8px]", children: filesArr.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i)) });
7945
7991
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style, children: [
7946
7992
  /* @__PURE__ */ jsxRuntime.jsx(
7947
7993
  SField,
@@ -7983,7 +8029,7 @@ function SKeyValueTable({
7983
8029
  if (fields.length === 0) return null;
7984
8030
  const emit2 = (name, value) => onChange?.({ name, value });
7985
8031
  const cellHeight = dense ? "var(--cmp-table-body-dense-height)" : "var(--cmp-table-keyValue-height)";
7986
- const cellPadY = dense ? "var(--cmp-table-body-dense-paddingY)" : "var(--cmp-table-keyValue-body-paddingY)";
8032
+ const cellPadY = dense ? "var(--cmp-table-body-paddingY-dense)" : "var(--cmp-table-keyValue-body-paddingY)";
7987
8033
  const renderField = (f) => {
7988
8034
  if (f.render) return f.render;
7989
8035
  const opt = f.options ?? {};