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
|
);
|
|
@@ -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
|
|
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
|
-
"
|
|
3763
|
+
"div",
|
|
3740
3764
|
{
|
|
3741
|
-
|
|
3742
|
-
|
|
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
|
-
|
|
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,
|