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
  );
@@ -3446,6 +3460,8 @@ function formatTimeDisplay(value, type) {
3446
3460
  const displayHour = hour % 12 === 0 ? 12 : hour % 12;
3447
3461
  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;
3448
3462
  }
3463
+ var TIME_SELECTOR_WIDTH = 136;
3464
+ var MERIDIEM_TIME_SELECTOR_WIDTH = 154;
3449
3465
  function TimeSelector({
3450
3466
  value,
3451
3467
  useMeridiem,
@@ -3684,7 +3700,9 @@ function STimePicker({
3684
3700
  style
3685
3701
  }) {
3686
3702
  const portalContainer = usePortalContainer();
3703
+ const triggerRef = useRef(null);
3687
3704
  const [open, setOpen] = useState(false);
3705
+ const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);
3688
3706
  const [focused, setFocused] = useState(false);
3689
3707
  const [ruleError, setRuleError] = useState("");
3690
3708
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
@@ -3705,6 +3723,11 @@ function STimePicker({
3705
3723
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
3706
3724
  const commitOpen = (next) => {
3707
3725
  if (disabled) return;
3726
+ if (next) {
3727
+ const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
3728
+ const selectorWidth = effectiveUseMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
3729
+ setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));
3730
+ }
3708
3731
  setOpen(next);
3709
3732
  onOpenChange?.(next);
3710
3733
  if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
@@ -3731,19 +3754,32 @@ function STimePicker({
3731
3754
  focused: focused || open,
3732
3755
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
3733
3756
  width,
3757
+ minWidth: dims.fieldMinWidth,
3734
3758
  disabled,
3735
3759
  className,
3736
- style: { minWidth: dims.fieldMinWidth, ...style },
3760
+ style,
3737
3761
  children: /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: commitOpen, children: [
3738
3762
  /* @__PURE__ */ jsx(RPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
3739
- "button",
3763
+ "div",
3740
3764
  {
3741
- type: "button",
3742
- name,
3743
- disabled,
3765
+ ref: triggerRef,
3766
+ role: "button",
3767
+ "aria-disabled": disabled,
3768
+ tabIndex: disabled ? -1 : 0,
3769
+ "data-name": name,
3744
3770
  onFocus: () => setFocused(true),
3745
3771
  onBlur: () => setFocused(false),
3746
- className: "flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed",
3772
+ onKeyDown: (event) => {
3773
+ if (disabled) return;
3774
+ if (event.key === "Enter" || event.key === " ") {
3775
+ event.preventDefault();
3776
+ commitOpen(!open);
3777
+ }
3778
+ },
3779
+ className: cn(
3780
+ "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
3781
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
3782
+ ),
3747
3783
  style: { padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius },
3748
3784
  children: [
3749
3785
  /* @__PURE__ */ jsx(
@@ -3789,6 +3825,7 @@ function STimePicker({
3789
3825
  side: "bottom",
3790
3826
  align: "start",
3791
3827
  sideOffset: 4,
3828
+ alignOffset: popoverAlignOffset,
3792
3829
  className: cn("z-50", FLOATING_SLIDE_ANIM),
3793
3830
  children: /* @__PURE__ */ jsx(
3794
3831
  TimeSelector,