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.
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs +62 -48
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.js +62 -48
- package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
- package/dist/components/SChipInput/SChipInput.cjs +62 -48
- package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
- package/dist/components/SChipInput/SChipInput.js +62 -48
- package/dist/components/SChipInput/SChipInput.js.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.cjs +62 -48
- package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.js +62 -48
- package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs +62 -48
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.js +62 -48
- package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
- package/dist/components/SField/SField.cjs +62 -48
- package/dist/components/SField/SField.cjs.map +1 -1
- package/dist/components/SField/SField.d.ts +6 -1
- package/dist/components/SField/SField.js +62 -48
- package/dist/components/SField/SField.js.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.cjs +62 -48
- package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.js +62 -48
- package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
- package/dist/components/SInput/SInput.cjs +62 -48
- package/dist/components/SInput/SInput.cjs.map +1 -1
- package/dist/components/SInput/SInput.js +62 -48
- package/dist/components/SInput/SInput.js.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs +74 -49
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.js +74 -49
- package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.cjs +62 -48
- package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.js +62 -48
- package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
- package/dist/components/SPage/SPage.cjs +19 -2
- package/dist/components/SPage/SPage.cjs.map +1 -1
- package/dist/components/SPage/SPage.d.ts +7 -1
- package/dist/components/SPage/SPage.js +19 -2
- package/dist/components/SPage/SPage.js.map +1 -1
- package/dist/components/SPage/index.d.ts +1 -0
- package/dist/components/SPage/page.config.d.ts +8 -0
- package/dist/components/SPopup/SPopup.cjs +18 -1
- package/dist/components/SPopup/SPopup.cjs.map +1 -1
- package/dist/components/SPopup/SPopup.js +18 -1
- package/dist/components/SPopup/SPopup.js.map +1 -1
- package/dist/components/SScrollArea/SScrollArea.cjs +64 -0
- package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -0
- package/dist/components/SScrollArea/SScrollArea.d.ts +21 -0
- package/dist/components/SScrollArea/SScrollArea.js +62 -0
- package/dist/components/SScrollArea/SScrollArea.js.map +1 -0
- package/dist/components/SScrollArea/index.d.ts +2 -0
- package/dist/components/SScrollArea/scrollArea.config.d.ts +2 -0
- package/dist/components/SSelect/SSelect.cjs +74 -49
- package/dist/components/SSelect/SSelect.cjs.map +1 -1
- package/dist/components/SSelect/SSelect.js +74 -49
- package/dist/components/SSelect/SSelect.js.map +1 -1
- package/dist/components/SStepper/SStepper.cjs +7 -11
- package/dist/components/SStepper/SStepper.cjs.map +1 -1
- package/dist/components/SStepper/SStepper.js +7 -11
- package/dist/components/SStepper/SStepper.js.map +1 -1
- package/dist/components/STable/STable.cjs +83 -55
- package/dist/components/STable/STable.cjs.map +1 -1
- package/dist/components/STable/STable.d.ts +2 -0
- package/dist/components/STable/STable.js +83 -55
- package/dist/components/STable/STable.js.map +1 -1
- package/dist/components/STextarea/STextarea.cjs +62 -48
- package/dist/components/STextarea/STextarea.cjs.map +1 -1
- package/dist/components/STextarea/STextarea.js +62 -48
- package/dist/components/STextarea/STextarea.js.map +1 -1
- package/dist/components/STimePicker/STimePicker.cjs +91 -54
- package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
- package/dist/components/STimePicker/STimePicker.js +91 -54
- package/dist/components/STimePicker/STimePicker.js.map +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.cjs +93 -54
- package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.js +93 -54
- package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
- package/dist/index.cjs +220 -81
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +218 -82
- package/dist/index.js.map +1 -1
- package/dist/lib/scrollbar.cjs +15 -0
- package/dist/lib/scrollbar.cjs.map +1 -0
- package/dist/lib/scrollbar.d.ts +32 -0
- package/dist/lib/scrollbar.js +10 -0
- package/dist/lib/scrollbar.js.map +1 -0
- package/dist/styles.css +168 -17
- 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(
|
|
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(
|
|
3343
|
-
|
|
3344
|
-
|
|
3345
|
-
|
|
3346
|
-
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
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
|
-
|
|
3352
|
-
|
|
3353
|
-
|
|
3354
|
-
|
|
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
|
|
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
|
-
"
|
|
3840
|
+
"div",
|
|
3815
3841
|
{
|
|
3816
|
-
|
|
3817
|
-
|
|
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
|
-
|
|
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,
|