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
@@ -3465,6 +3465,7 @@ var SField = forwardRef(function SField2({
3465
3465
  const resolvedSuccess = status === "pass";
3466
3466
  const showError = resolvedError && errorMessage !== "";
3467
3467
  const interactive = !disabled && !readOnly;
3468
+ const hug = cssLen(width) !== void 0;
3468
3469
  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)";
3469
3470
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3470
3471
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -3473,7 +3474,13 @@ var SField = forwardRef(function SField2({
3473
3474
  {
3474
3475
  ref: rootRef,
3475
3476
  "data-name": name || void 0,
3476
- className: cn("inline-flex h-fit w-full flex-col", className),
3477
+ className: cn(
3478
+ "h-fit flex-col",
3479
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
3480
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
3481
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
3482
+ className
3483
+ ),
3477
3484
  style,
3478
3485
  onMouseEnter,
3479
3486
  onMouseLeave,
@@ -3511,55 +3518,60 @@ var SField = forwardRef(function SField2({
3511
3518
  ]
3512
3519
  }
3513
3520
  ),
3514
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
3515
- /* @__PURE__ */ jsxs(
3516
- "div",
3517
- {
3518
- className: cn(
3519
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3520
- 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]",
3521
- disabled && "cursor-not-allowed"
3521
+ /* @__PURE__ */ jsxs(
3522
+ "div",
3523
+ {
3524
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
3525
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
3526
+ children: [
3527
+ /* @__PURE__ */ jsxs(
3528
+ "div",
3529
+ {
3530
+ className: cn(
3531
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3532
+ 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]",
3533
+ disabled && "cursor-not-allowed"
3534
+ ),
3535
+ style: {
3536
+ // @ts-expect-error CSS 변수
3537
+ "--field-bc": borderColor,
3538
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3539
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3540
+ ...multiline ? { minHeight: s.height } : { height: s.height },
3541
+ "borderRadius": s.radius,
3542
+ "background": bgColor,
3543
+ "color": textColor
3544
+ },
3545
+ "data-focused": focused || void 0,
3546
+ "data-hovered": hovered || void 0,
3547
+ children: [
3548
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3549
+ "div",
3550
+ {
3551
+ 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",
3552
+ style: {
3553
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3554
+ width: cssLen(labelWidth),
3555
+ justifyContent: ALIGN[addonAlign],
3556
+ background: "var(--cmp-field-addonLabel-bg)",
3557
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3558
+ borderTopLeftRadius: s.radius - 1,
3559
+ borderBottomLeftRadius: s.radius - 1
3560
+ },
3561
+ children: [
3562
+ icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3563
+ effectiveAddonLabel
3564
+ ]
3565
+ }
3566
+ ),
3567
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3568
+ ]
3569
+ }
3522
3570
  ),
3523
- style: {
3524
- // @ts-expect-error CSS 변수
3525
- "--field-bc": borderColor,
3526
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3527
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3528
- ...multiline ? { minHeight: s.height } : { height: s.height },
3529
- "minWidth": cssLen(minWidth),
3530
- "width": cssLen(width),
3531
- "borderRadius": s.radius,
3532
- "background": bgColor,
3533
- "color": textColor
3534
- },
3535
- "data-focused": focused || void 0,
3536
- "data-hovered": hovered || void 0,
3537
- children: [
3538
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3539
- "div",
3540
- {
3541
- 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",
3542
- style: {
3543
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3544
- width: cssLen(labelWidth),
3545
- justifyContent: ALIGN[addonAlign],
3546
- background: "var(--cmp-field-addonLabel-bg)",
3547
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3548
- borderTopLeftRadius: s.radius - 1,
3549
- borderBottomLeftRadius: s.radius - 1
3550
- },
3551
- children: [
3552
- icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3553
- effectiveAddonLabel
3554
- ]
3555
- }
3556
- ),
3557
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3558
- ]
3559
- }
3560
- ),
3561
- 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
3562
- ] })
3571
+ 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
3572
+ ]
3573
+ }
3574
+ )
3563
3575
  ] })
3564
3576
  }
3565
3577
  );
@@ -4236,6 +4248,7 @@ function SPortal({
4236
4248
  viewportPadding = 0,
4237
4249
  onOpenAutoFocus,
4238
4250
  onCloseAutoFocus,
4251
+ onPointerDownOutside,
4239
4252
  children,
4240
4253
  className,
4241
4254
  style,
@@ -4264,7 +4277,9 @@ function SPortal({
4264
4277
  onPointerDownOutside: (e) => {
4265
4278
  if (persistent || anchorRef.current?.contains(e.target)) {
4266
4279
  e.preventDefault();
4280
+ return;
4267
4281
  }
4282
+ onPointerDownOutside?.(e);
4268
4283
  },
4269
4284
  onFocusOutside: (e) => {
4270
4285
  if (persistent || anchorRef.current?.contains(e.target)) {
@@ -4369,6 +4384,7 @@ var SSelect = forwardRef(function SSelect2({
4369
4384
  const triggerRef = useRef(null);
4370
4385
  const searchInputRef = useRef(null);
4371
4386
  const listRef = useRef(null);
4387
+ const dismissedByPointerRef = useRef(false);
4372
4388
  const flat = useMemo(() => flattenOptions(options), [options]);
4373
4389
  const selectable = useMemo(() => selectableOptions(flat), [flat]);
4374
4390
  const hasLeaf = useMemo(() => flat.some((o) => !o.isGroup), [flat]);
@@ -4398,7 +4414,9 @@ var SSelect = forwardRef(function SSelect2({
4398
4414
  const commitOpen = (next) => {
4399
4415
  setOpen(next);
4400
4416
  onOpenChange?.(next);
4401
- if (!next) {
4417
+ if (next) {
4418
+ dismissedByPointerRef.current = false;
4419
+ } else {
4402
4420
  setPendingOpen(false);
4403
4421
  setSearch("");
4404
4422
  if (rules && rules.length > 0) {
@@ -4622,8 +4640,12 @@ var SSelect = forwardRef(function SSelect2({
4622
4640
  event.preventDefault();
4623
4641
  requestAnimationFrame(() => searchInputRef.current?.focus());
4624
4642
  },
4643
+ onPointerDownOutside: () => {
4644
+ dismissedByPointerRef.current = true;
4645
+ },
4625
4646
  onCloseAutoFocus: (event) => {
4626
4647
  event.preventDefault();
4648
+ if (dismissedByPointerRef.current) return;
4627
4649
  triggerRef.current?.focus();
4628
4650
  },
4629
4651
  className: "rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",