sellmate-design-system-react 0.7.0 → 0.8.1

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 (85) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +61 -49
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +61 -49
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +64 -49
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +64 -49
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +61 -49
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +61 -49
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +61 -49
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +61 -49
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +61 -49
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.d.ts +5 -2
  20. package/dist/components/SField/SField.js +61 -49
  21. package/dist/components/SField/SField.js.map +1 -1
  22. package/dist/components/SFilePicker/SFilePicker.cjs +61 -49
  23. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  24. package/dist/components/SFilePicker/SFilePicker.js +61 -49
  25. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  26. package/dist/components/SInput/SInput.cjs +61 -49
  27. package/dist/components/SInput/SInput.cjs.map +1 -1
  28. package/dist/components/SInput/SInput.js +61 -49
  29. package/dist/components/SInput/SInput.js.map +1 -1
  30. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +72 -50
  31. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  32. package/dist/components/SKeyValueTable/SKeyValueTable.js +72 -50
  33. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  34. package/dist/components/SNumberInput/SNumberInput.cjs +61 -49
  35. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  36. package/dist/components/SNumberInput/SNumberInput.js +61 -49
  37. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  38. package/dist/components/SPage/SPage.cjs +19 -2
  39. package/dist/components/SPage/SPage.cjs.map +1 -1
  40. package/dist/components/SPage/SPage.d.ts +7 -1
  41. package/dist/components/SPage/SPage.js +19 -2
  42. package/dist/components/SPage/SPage.js.map +1 -1
  43. package/dist/components/SPage/index.d.ts +1 -0
  44. package/dist/components/SPage/page.config.d.ts +8 -0
  45. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  46. package/dist/components/SPopup/SPopup.js.map +1 -1
  47. package/dist/components/SPortal/SPortal.cjs +3 -0
  48. package/dist/components/SPortal/SPortal.cjs.map +1 -1
  49. package/dist/components/SPortal/SPortal.d.ts +3 -1
  50. package/dist/components/SPortal/SPortal.js +3 -0
  51. package/dist/components/SPortal/SPortal.js.map +1 -1
  52. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -1
  53. package/dist/components/SScrollArea/SScrollArea.js.map +1 -1
  54. package/dist/components/SSelect/SSelect.cjs +72 -50
  55. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  56. package/dist/components/SSelect/SSelect.js +72 -50
  57. package/dist/components/SSelect/SSelect.js.map +1 -1
  58. package/dist/components/STable/STable.cjs +78 -56
  59. package/dist/components/STable/STable.cjs.map +1 -1
  60. package/dist/components/STable/STable.d.ts +2 -0
  61. package/dist/components/STable/STable.js +78 -56
  62. package/dist/components/STable/STable.js.map +1 -1
  63. package/dist/components/STextarea/STextarea.cjs +61 -49
  64. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  65. package/dist/components/STextarea/STextarea.js +61 -49
  66. package/dist/components/STextarea/STextarea.js.map +1 -1
  67. package/dist/components/STimePicker/STimePicker.cjs +61 -49
  68. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  69. package/dist/components/STimePicker/STimePicker.js +61 -49
  70. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  71. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +61 -49
  72. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  73. package/dist/components/STimeRangePicker/STimeRangePicker.js +61 -49
  74. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  75. package/dist/index.cjs +95 -58
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.js +95 -59
  78. package/dist/index.js.map +1 -1
  79. package/dist/lib/scrollbar.cjs +2 -0
  80. package/dist/lib/scrollbar.cjs.map +1 -1
  81. package/dist/lib/scrollbar.d.ts +13 -1
  82. package/dist/lib/scrollbar.js +2 -1
  83. package/dist/lib/scrollbar.js.map +1 -1
  84. package/dist/styles.css +53 -3
  85. package/package.json +1 -1
@@ -3372,6 +3372,7 @@ var SField = forwardRef(function SField2({
3372
3372
  const resolvedSuccess = status === "pass";
3373
3373
  const showError = resolvedError && errorMessage !== "";
3374
3374
  const interactive = !disabled && !readOnly;
3375
+ const hug = cssLen(width) !== void 0;
3375
3376
  const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3376
3377
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3377
3378
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -3380,7 +3381,13 @@ var SField = forwardRef(function SField2({
3380
3381
  {
3381
3382
  ref: rootRef,
3382
3383
  "data-name": name || void 0,
3383
- className: cn("inline-flex h-fit w-full flex-col", className),
3384
+ className: cn(
3385
+ "h-fit flex-col",
3386
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
3387
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
3388
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
3389
+ className
3390
+ ),
3384
3391
  style,
3385
3392
  onMouseEnter,
3386
3393
  onMouseLeave,
@@ -3418,55 +3425,60 @@ var SField = forwardRef(function SField2({
3418
3425
  ]
3419
3426
  }
3420
3427
  ),
3421
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
3422
- /* @__PURE__ */ jsxs(
3423
- "div",
3424
- {
3425
- className: cn(
3426
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3427
- interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3428
- disabled && "cursor-not-allowed"
3428
+ /* @__PURE__ */ jsxs(
3429
+ "div",
3430
+ {
3431
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
3432
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
3433
+ children: [
3434
+ /* @__PURE__ */ jsxs(
3435
+ "div",
3436
+ {
3437
+ className: cn(
3438
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3439
+ interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3440
+ disabled && "cursor-not-allowed"
3441
+ ),
3442
+ style: {
3443
+ // @ts-expect-error CSS 변수
3444
+ "--field-bc": borderColor,
3445
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3446
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3447
+ ...multiline ? { minHeight: s.height } : { height: s.height },
3448
+ "borderRadius": s.radius,
3449
+ "background": bgColor,
3450
+ "color": textColor
3451
+ },
3452
+ "data-focused": focused || void 0,
3453
+ "data-hovered": hovered || void 0,
3454
+ children: [
3455
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3456
+ "div",
3457
+ {
3458
+ className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-20",
3459
+ style: {
3460
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3461
+ width: cssLen(labelWidth),
3462
+ justifyContent: ALIGN[addonAlign],
3463
+ background: "var(--cmp-field-addonLabel-bg)",
3464
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3465
+ borderTopLeftRadius: s.radius - 1,
3466
+ borderBottomLeftRadius: s.radius - 1
3467
+ },
3468
+ children: [
3469
+ icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3470
+ effectiveAddonLabel
3471
+ ]
3472
+ }
3473
+ ),
3474
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3475
+ ]
3476
+ }
3429
3477
  ),
3430
- style: {
3431
- // @ts-expect-error CSS 변수
3432
- "--field-bc": borderColor,
3433
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3434
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3435
- ...multiline ? { minHeight: s.height } : { height: s.height },
3436
- "minWidth": cssLen(minWidth),
3437
- "width": cssLen(width),
3438
- "borderRadius": s.radius,
3439
- "background": bgColor,
3440
- "color": textColor
3441
- },
3442
- "data-focused": focused || void 0,
3443
- "data-hovered": hovered || void 0,
3444
- children: [
3445
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3446
- "div",
3447
- {
3448
- className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-20",
3449
- style: {
3450
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3451
- width: cssLen(labelWidth),
3452
- justifyContent: ALIGN[addonAlign],
3453
- background: "var(--cmp-field-addonLabel-bg)",
3454
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3455
- borderTopLeftRadius: s.radius - 1,
3456
- borderBottomLeftRadius: s.radius - 1
3457
- },
3458
- children: [
3459
- icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3460
- effectiveAddonLabel
3461
- ]
3462
- }
3463
- ),
3464
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3465
- ]
3466
- }
3467
- ),
3468
- showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3469
- ] })
3478
+ showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3479
+ ]
3480
+ }
3481
+ )
3470
3482
  ] })
3471
3483
  }
3472
3484
  );
@@ -3487,6 +3499,7 @@ function SPortal({
3487
3499
  viewportPadding = 0,
3488
3500
  onOpenAutoFocus,
3489
3501
  onCloseAutoFocus,
3502
+ onPointerDownOutside,
3490
3503
  children,
3491
3504
  className,
3492
3505
  style,
@@ -3515,7 +3528,9 @@ function SPortal({
3515
3528
  onPointerDownOutside: (e) => {
3516
3529
  if (persistent || anchorRef.current?.contains(e.target)) {
3517
3530
  e.preventDefault();
3531
+ return;
3518
3532
  }
3533
+ onPointerDownOutside?.(e);
3519
3534
  },
3520
3535
  onFocusOutside: (e) => {
3521
3536
  if (persistent || anchorRef.current?.contains(e.target)) {
@@ -3620,6 +3635,7 @@ var SSelect = forwardRef(function SSelect2({
3620
3635
  const triggerRef = useRef(null);
3621
3636
  const searchInputRef = useRef(null);
3622
3637
  const listRef = useRef(null);
3638
+ const dismissedByPointerRef = useRef(false);
3623
3639
  const flat = useMemo(() => flattenOptions(options), [options]);
3624
3640
  const selectable = useMemo(() => selectableOptions(flat), [flat]);
3625
3641
  const hasLeaf = useMemo(() => flat.some((o) => !o.isGroup), [flat]);
@@ -3649,7 +3665,9 @@ var SSelect = forwardRef(function SSelect2({
3649
3665
  const commitOpen = (next) => {
3650
3666
  setOpen(next);
3651
3667
  onOpenChange?.(next);
3652
- if (!next) {
3668
+ if (next) {
3669
+ dismissedByPointerRef.current = false;
3670
+ } else {
3653
3671
  setPendingOpen(false);
3654
3672
  setSearch("");
3655
3673
  if (rules && rules.length > 0) {
@@ -3873,8 +3891,12 @@ var SSelect = forwardRef(function SSelect2({
3873
3891
  event.preventDefault();
3874
3892
  requestAnimationFrame(() => searchInputRef.current?.focus());
3875
3893
  },
3894
+ onPointerDownOutside: () => {
3895
+ dismissedByPointerRef.current = true;
3896
+ },
3876
3897
  onCloseAutoFocus: (event) => {
3877
3898
  event.preventDefault();
3899
+ if (dismissedByPointerRef.current) return;
3878
3900
  triggerRef.current?.focus();
3879
3901
  },
3880
3902
  className: "rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",