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
@@ -3280,6 +3280,7 @@ var SField = react.forwardRef(function SField2({
3280
3280
  disabled = false,
3281
3281
  readOnly = false,
3282
3282
  width,
3283
+ minWidth,
3283
3284
  multiline = false,
3284
3285
  borderless = false,
3285
3286
  children,
@@ -3315,6 +3316,7 @@ var SField = react.forwardRef(function SField2({
3315
3316
  const resolvedSuccess = status === "pass";
3316
3317
  const showError = resolvedError && errorMessage !== "";
3317
3318
  const interactive = !disabled && !readOnly;
3319
+ const hug = cssLen(width) !== void 0;
3318
3320
  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)";
3319
3321
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3320
3322
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -3323,7 +3325,13 @@ var SField = react.forwardRef(function SField2({
3323
3325
  {
3324
3326
  ref: rootRef,
3325
3327
  "data-name": name || void 0,
3326
- className: cn("inline-flex h-fit w-full flex-col", className),
3328
+ className: cn(
3329
+ "h-fit flex-col",
3330
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
3331
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
3332
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
3333
+ className
3334
+ ),
3327
3335
  style,
3328
3336
  onMouseEnter,
3329
3337
  onMouseLeave,
@@ -3361,54 +3369,60 @@ var SField = react.forwardRef(function SField2({
3361
3369
  ]
3362
3370
  }
3363
3371
  ),
3364
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
3365
- /* @__PURE__ */ jsxRuntime.jsxs(
3366
- "div",
3367
- {
3368
- className: cn(
3369
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3370
- 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]",
3371
- disabled && "cursor-not-allowed"
3372
+ /* @__PURE__ */ jsxRuntime.jsxs(
3373
+ "div",
3374
+ {
3375
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
3376
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
3377
+ children: [
3378
+ /* @__PURE__ */ jsxRuntime.jsxs(
3379
+ "div",
3380
+ {
3381
+ className: cn(
3382
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3383
+ 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]",
3384
+ disabled && "cursor-not-allowed"
3385
+ ),
3386
+ style: {
3387
+ // @ts-expect-error CSS 변수
3388
+ "--field-bc": borderColor,
3389
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3390
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3391
+ ...multiline ? { minHeight: s.height } : { height: s.height },
3392
+ "borderRadius": s.radius,
3393
+ "background": bgColor,
3394
+ "color": textColor
3395
+ },
3396
+ "data-focused": focused || void 0,
3397
+ "data-hovered": hovered || void 0,
3398
+ children: [
3399
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
3400
+ "div",
3401
+ {
3402
+ 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",
3403
+ style: {
3404
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3405
+ width: cssLen(labelWidth),
3406
+ justifyContent: ALIGN[addonAlign],
3407
+ background: "var(--cmp-field-addonLabel-bg)",
3408
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3409
+ borderTopLeftRadius: s.radius - 1,
3410
+ borderBottomLeftRadius: s.radius - 1
3411
+ },
3412
+ children: [
3413
+ icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3414
+ effectiveAddonLabel
3415
+ ]
3416
+ }
3417
+ ),
3418
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1", children })
3419
+ ]
3420
+ }
3372
3421
  ),
3373
- style: {
3374
- // @ts-expect-error CSS 변수
3375
- "--field-bc": borderColor,
3376
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3377
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3378
- ...multiline ? { minHeight: s.height } : { height: s.height },
3379
- "width": cssLen(width),
3380
- "borderRadius": s.radius,
3381
- "background": bgColor,
3382
- "color": textColor
3383
- },
3384
- "data-focused": focused || void 0,
3385
- "data-hovered": hovered || void 0,
3386
- children: [
3387
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
3388
- "div",
3389
- {
3390
- 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",
3391
- style: {
3392
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3393
- width: cssLen(labelWidth),
3394
- justifyContent: ALIGN[addonAlign],
3395
- background: "var(--cmp-field-addonLabel-bg)",
3396
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3397
- borderTopLeftRadius: s.radius - 1,
3398
- borderBottomLeftRadius: s.radius - 1
3399
- },
3400
- children: [
3401
- icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3402
- effectiveAddonLabel
3403
- ]
3404
- }
3405
- ),
3406
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1", children })
3407
- ]
3408
- }
3409
- ),
3410
- showError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3411
- ] })
3422
+ showError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3423
+ ]
3424
+ }
3425
+ )
3412
3426
  ] })
3413
3427
  }
3414
3428
  );
@@ -3468,6 +3482,8 @@ function formatTimeDisplay(value, type) {
3468
3482
  const displayHour = hour % 12 === 0 ? 12 : hour % 12;
3469
3483
  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;
3470
3484
  }
3485
+ var TIME_SELECTOR_WIDTH = 136;
3486
+ var MERIDIEM_TIME_SELECTOR_WIDTH = 154;
3471
3487
  function TimeSelector({
3472
3488
  value,
3473
3489
  useMeridiem,
@@ -3706,7 +3722,9 @@ function STimePicker({
3706
3722
  style
3707
3723
  }) {
3708
3724
  const portalContainer = usePortalContainer();
3725
+ const triggerRef = react.useRef(null);
3709
3726
  const [open, setOpen] = react.useState(false);
3727
+ const [popoverAlignOffset, setPopoverAlignOffset] = react.useState(0);
3710
3728
  const [focused, setFocused] = react.useState(false);
3711
3729
  const [ruleError, setRuleError] = react.useState("");
3712
3730
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
@@ -3727,6 +3745,11 @@ function STimePicker({
3727
3745
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
3728
3746
  const commitOpen = (next) => {
3729
3747
  if (disabled) return;
3748
+ if (next) {
3749
+ const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
3750
+ const selectorWidth = effectiveUseMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
3751
+ setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));
3752
+ }
3730
3753
  setOpen(next);
3731
3754
  onOpenChange?.(next);
3732
3755
  if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
@@ -3753,19 +3776,32 @@ function STimePicker({
3753
3776
  focused: focused || open,
3754
3777
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
3755
3778
  width,
3779
+ minWidth: dims.fieldMinWidth,
3756
3780
  disabled,
3757
3781
  className,
3758
- style: { minWidth: dims.fieldMinWidth, ...style },
3782
+ style,
3759
3783
  children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover2__namespace.Root, { open, onOpenChange: commitOpen, children: [
3760
3784
  /* @__PURE__ */ jsxRuntime.jsx(RPopover2__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
3761
- "button",
3785
+ "div",
3762
3786
  {
3763
- type: "button",
3764
- name,
3765
- disabled,
3787
+ ref: triggerRef,
3788
+ role: "button",
3789
+ "aria-disabled": disabled,
3790
+ tabIndex: disabled ? -1 : 0,
3791
+ "data-name": name,
3766
3792
  onFocus: () => setFocused(true),
3767
3793
  onBlur: () => setFocused(false),
3768
- className: "flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed",
3794
+ onKeyDown: (event) => {
3795
+ if (disabled) return;
3796
+ if (event.key === "Enter" || event.key === " ") {
3797
+ event.preventDefault();
3798
+ commitOpen(!open);
3799
+ }
3800
+ },
3801
+ className: cn(
3802
+ "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
3803
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
3804
+ ),
3769
3805
  style: { padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius },
3770
3806
  children: [
3771
3807
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -3811,6 +3847,7 @@ function STimePicker({
3811
3847
  side: "bottom",
3812
3848
  align: "start",
3813
3849
  sideOffset: 4,
3850
+ alignOffset: popoverAlignOffset,
3814
3851
  className: cn("z-50", FLOATING_SLIDE_ANIM),
3815
3852
  children: /* @__PURE__ */ jsxRuntime.jsx(
3816
3853
  TimeSelector,