sellmate-design-system-react 0.6.1 → 0.8.0

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 (92) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +62 -48
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +62 -48
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +62 -48
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +62 -48
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +62 -48
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +62 -48
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +62 -48
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +62 -48
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +62 -48
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.d.ts +6 -1
  20. package/dist/components/SField/SField.js +62 -48
  21. package/dist/components/SField/SField.js.map +1 -1
  22. package/dist/components/SFilePicker/SFilePicker.cjs +62 -48
  23. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  24. package/dist/components/SFilePicker/SFilePicker.js +62 -48
  25. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  26. package/dist/components/SInput/SInput.cjs +62 -48
  27. package/dist/components/SInput/SInput.cjs.map +1 -1
  28. package/dist/components/SInput/SInput.js +62 -48
  29. package/dist/components/SInput/SInput.js.map +1 -1
  30. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +74 -49
  31. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  32. package/dist/components/SKeyValueTable/SKeyValueTable.js +74 -49
  33. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  34. package/dist/components/SNumberInput/SNumberInput.cjs +62 -48
  35. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  36. package/dist/components/SNumberInput/SNumberInput.js +62 -48
  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 +18 -1
  46. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  47. package/dist/components/SPopup/SPopup.js +18 -1
  48. package/dist/components/SPopup/SPopup.js.map +1 -1
  49. package/dist/components/SScrollArea/SScrollArea.cjs +64 -0
  50. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -0
  51. package/dist/components/SScrollArea/SScrollArea.d.ts +21 -0
  52. package/dist/components/SScrollArea/SScrollArea.js +62 -0
  53. package/dist/components/SScrollArea/SScrollArea.js.map +1 -0
  54. package/dist/components/SScrollArea/index.d.ts +2 -0
  55. package/dist/components/SScrollArea/scrollArea.config.d.ts +2 -0
  56. package/dist/components/SSelect/SSelect.cjs +74 -49
  57. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  58. package/dist/components/SSelect/SSelect.js +74 -49
  59. package/dist/components/SSelect/SSelect.js.map +1 -1
  60. package/dist/components/SStepper/SStepper.cjs +7 -11
  61. package/dist/components/SStepper/SStepper.cjs.map +1 -1
  62. package/dist/components/SStepper/SStepper.js +7 -11
  63. package/dist/components/SStepper/SStepper.js.map +1 -1
  64. package/dist/components/STable/STable.cjs +83 -55
  65. package/dist/components/STable/STable.cjs.map +1 -1
  66. package/dist/components/STable/STable.d.ts +2 -0
  67. package/dist/components/STable/STable.js +83 -55
  68. package/dist/components/STable/STable.js.map +1 -1
  69. package/dist/components/STextarea/STextarea.cjs +62 -48
  70. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  71. package/dist/components/STextarea/STextarea.js +62 -48
  72. package/dist/components/STextarea/STextarea.js.map +1 -1
  73. package/dist/components/STimePicker/STimePicker.cjs +91 -54
  74. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  75. package/dist/components/STimePicker/STimePicker.js +91 -54
  76. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  77. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +93 -54
  78. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  79. package/dist/components/STimeRangePicker/STimeRangePicker.js +93 -54
  80. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  81. package/dist/index.cjs +220 -81
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.js +218 -82
  85. package/dist/index.js.map +1 -1
  86. package/dist/lib/scrollbar.cjs +15 -0
  87. package/dist/lib/scrollbar.cjs.map +1 -0
  88. package/dist/lib/scrollbar.d.ts +32 -0
  89. package/dist/lib/scrollbar.js +10 -0
  90. package/dist/lib/scrollbar.js.map +1 -0
  91. package/dist/styles.css +168 -17
  92. package/package.json +1 -1
@@ -3258,6 +3258,7 @@ var SField = forwardRef(function SField2({
3258
3258
  disabled = false,
3259
3259
  readOnly = false,
3260
3260
  width,
3261
+ minWidth,
3261
3262
  multiline = false,
3262
3263
  borderless = false,
3263
3264
  children,
@@ -3293,6 +3294,7 @@ var SField = forwardRef(function SField2({
3293
3294
  const resolvedSuccess = status === "pass";
3294
3295
  const showError = resolvedError && errorMessage !== "";
3295
3296
  const interactive = !disabled && !readOnly;
3297
+ const hug = cssLen(width) !== void 0;
3296
3298
  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)";
3297
3299
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3298
3300
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -3301,7 +3303,13 @@ var SField = forwardRef(function SField2({
3301
3303
  {
3302
3304
  ref: rootRef,
3303
3305
  "data-name": name || void 0,
3304
- className: cn("inline-flex h-fit w-full flex-col", className),
3306
+ className: cn(
3307
+ "h-fit flex-col",
3308
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
3309
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
3310
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
3311
+ className
3312
+ ),
3305
3313
  style,
3306
3314
  onMouseEnter,
3307
3315
  onMouseLeave,
@@ -3339,54 +3347,60 @@ var SField = forwardRef(function SField2({
3339
3347
  ]
3340
3348
  }
3341
3349
  ),
3342
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
3343
- /* @__PURE__ */ jsxs(
3344
- "div",
3345
- {
3346
- className: cn(
3347
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3348
- 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]",
3349
- disabled && "cursor-not-allowed"
3350
+ /* @__PURE__ */ jsxs(
3351
+ "div",
3352
+ {
3353
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
3354
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
3355
+ children: [
3356
+ /* @__PURE__ */ jsxs(
3357
+ "div",
3358
+ {
3359
+ className: cn(
3360
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3361
+ 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]",
3362
+ disabled && "cursor-not-allowed"
3363
+ ),
3364
+ style: {
3365
+ // @ts-expect-error CSS 변수
3366
+ "--field-bc": borderColor,
3367
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3368
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3369
+ ...multiline ? { minHeight: s.height } : { height: s.height },
3370
+ "borderRadius": s.radius,
3371
+ "background": bgColor,
3372
+ "color": textColor
3373
+ },
3374
+ "data-focused": focused || void 0,
3375
+ "data-hovered": hovered || void 0,
3376
+ children: [
3377
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3378
+ "div",
3379
+ {
3380
+ 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",
3381
+ style: {
3382
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3383
+ width: cssLen(labelWidth),
3384
+ justifyContent: ALIGN[addonAlign],
3385
+ background: "var(--cmp-field-addonLabel-bg)",
3386
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3387
+ borderTopLeftRadius: s.radius - 1,
3388
+ borderBottomLeftRadius: s.radius - 1
3389
+ },
3390
+ children: [
3391
+ icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3392
+ effectiveAddonLabel
3393
+ ]
3394
+ }
3395
+ ),
3396
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3397
+ ]
3398
+ }
3350
3399
  ),
3351
- style: {
3352
- // @ts-expect-error CSS 변수
3353
- "--field-bc": borderColor,
3354
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3355
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3356
- ...multiline ? { minHeight: s.height } : { height: s.height },
3357
- "width": cssLen(width),
3358
- "borderRadius": s.radius,
3359
- "background": bgColor,
3360
- "color": textColor
3361
- },
3362
- "data-focused": focused || void 0,
3363
- "data-hovered": hovered || void 0,
3364
- children: [
3365
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
3366
- "div",
3367
- {
3368
- 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",
3369
- style: {
3370
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3371
- width: cssLen(labelWidth),
3372
- justifyContent: ALIGN[addonAlign],
3373
- background: "var(--cmp-field-addonLabel-bg)",
3374
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3375
- borderTopLeftRadius: s.radius - 1,
3376
- borderBottomLeftRadius: s.radius - 1
3377
- },
3378
- children: [
3379
- icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3380
- effectiveAddonLabel
3381
- ]
3382
- }
3383
- ),
3384
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
3385
- ]
3386
- }
3387
- ),
3388
- 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
3389
- ] })
3400
+ 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
3401
+ ]
3402
+ }
3403
+ )
3390
3404
  ] })
3391
3405
  }
3392
3406
  );
@@ -3467,6 +3481,11 @@ function formatTimeRangeDisplay(value, type) {
3467
3481
  if (value == null || value[0] === "" || value[1] === "") return "";
3468
3482
  return `${formatTimeDisplay(value[0], type)} ~ ${formatTimeDisplay(value[1], type)}`;
3469
3483
  }
3484
+ var TIME_RANGE_SELECTOR_WIDTH = 345;
3485
+ var MIDDAY_FIELD_MIN_WIDTH = {
3486
+ sm: 178,
3487
+ md: 216
3488
+ };
3470
3489
  function RangeTimeSelector({
3471
3490
  value,
3472
3491
  useMeridiem,
@@ -3756,7 +3775,9 @@ function STimeRangePicker({
3756
3775
  style
3757
3776
  }) {
3758
3777
  const portalContainer = usePortalContainer();
3778
+ const triggerRef = useRef(null);
3759
3779
  const [open, setOpen] = useState(false);
3780
+ const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);
3760
3781
  const [focused, setFocused] = useState(false);
3761
3782
  const [ruleError, setRuleError] = useState("");
3762
3783
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
@@ -3780,6 +3801,10 @@ function STimeRangePicker({
3780
3801
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
3781
3802
  const commitOpen = (next) => {
3782
3803
  if (disabled) return;
3804
+ if (next) {
3805
+ const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
3806
+ setPopoverAlignOffset(Math.max(0, (triggerWidth - TIME_RANGE_SELECTOR_WIDTH) / 2));
3807
+ }
3783
3808
  setOpen(next);
3784
3809
  onOpenChange?.(next);
3785
3810
  if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
@@ -3806,19 +3831,32 @@ function STimeRangePicker({
3806
3831
  focused: focused || open,
3807
3832
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
3808
3833
  width,
3834
+ minWidth: effectiveUseMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth,
3809
3835
  disabled,
3810
3836
  className,
3811
- style: { minWidth: dims.fieldMinWidth, ...style },
3837
+ style,
3812
3838
  children: /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: commitOpen, children: [
3813
3839
  /* @__PURE__ */ jsx(RPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
3814
- "button",
3840
+ "div",
3815
3841
  {
3816
- type: "button",
3817
- name,
3818
- disabled,
3842
+ ref: triggerRef,
3843
+ role: "button",
3844
+ "aria-disabled": disabled,
3845
+ tabIndex: disabled ? -1 : 0,
3846
+ "data-name": name,
3819
3847
  onFocus: () => setFocused(true),
3820
3848
  onBlur: () => setFocused(false),
3821
- className: "flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed",
3849
+ onKeyDown: (event) => {
3850
+ if (disabled) return;
3851
+ if (event.key === "Enter" || event.key === " ") {
3852
+ event.preventDefault();
3853
+ commitOpen(!open);
3854
+ }
3855
+ },
3856
+ className: cn(
3857
+ "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
3858
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
3859
+ ),
3822
3860
  style: { padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius },
3823
3861
  children: [
3824
3862
  /* @__PURE__ */ jsx(
@@ -3864,6 +3902,7 @@ function STimeRangePicker({
3864
3902
  side: "bottom",
3865
3903
  align: "start",
3866
3904
  sideOffset: 4,
3905
+ alignOffset: popoverAlignOffset,
3867
3906
  className: cn("z-50", FLOATING_SLIDE_ANIM),
3868
3907
  children: /* @__PURE__ */ jsx(
3869
3908
  RangeTimeSelector,