sellmate-design-system-react 9.0.0-beta.35 → 9.0.0-beta.36
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/AGENTS.md +46 -17
- package/dist/components/SCallout/README.md +2 -2
- package/dist/components/SCallout/SCallout.d.ts +9 -4
- package/dist/components/SLayout/README.md +5 -0
- package/dist/components/SLayout/SLayout.d.ts +4 -0
- package/dist/components/SPage/README.md +7 -3
- package/dist/components/SPage/SPage.d.ts +3 -9
- package/dist/components/SPage/SPageHeader.d.ts +18 -11
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page-column.d.ts +25 -0
- package/dist/index.cjs +123 -110
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +123 -111
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +58 -22
- package/dist/llms.txt +46 -17
- package/dist/styles.css +36 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -6266,6 +6266,28 @@ var SSplitter2 = /* @__PURE__ */ Object.assign(SSplitterRoot, {
|
|
|
6266
6266
|
Before: SSplitterBefore2,
|
|
6267
6267
|
After: SSplitterAfter2
|
|
6268
6268
|
});
|
|
6269
|
+
var SURFACE = {
|
|
6270
|
+
default: {
|
|
6271
|
+
bg: "var(--cmp-callout-default-bg)",
|
|
6272
|
+
border: "var(--cmp-callout-default-border)",
|
|
6273
|
+
content: "var(--cmp-callout-default-content)"
|
|
6274
|
+
},
|
|
6275
|
+
danger: {
|
|
6276
|
+
bg: "var(--cmp-callout-danger-bg)",
|
|
6277
|
+
border: "var(--cmp-callout-danger-border)",
|
|
6278
|
+
content: "var(--cmp-callout-danger-content)"
|
|
6279
|
+
},
|
|
6280
|
+
// default 와 같은 안내인데 배경만 흰 면이다 — 회색 면(neutral·screen) 위에서 default 의
|
|
6281
|
+
// 옅은 회색이 묻히는 자리에 쓴다.
|
|
6282
|
+
//
|
|
6283
|
+
// ⚠️ callout.white 토큰 그룹이 아직 없어 배경은 시스템 흰 면을, 테두리·본문색은 default 것을
|
|
6284
|
+
// 빌려 쓴다. 디자인팀이 전용 토큰을 내면 이 세 줄을 그것으로 갈아끼운다(토큰 키는 만들지 않는다).
|
|
6285
|
+
white: {
|
|
6286
|
+
bg: "var(--sys-color-bg-frame)",
|
|
6287
|
+
border: "var(--cmp-callout-default-border)",
|
|
6288
|
+
content: "var(--cmp-callout-default-content)"
|
|
6289
|
+
}
|
|
6290
|
+
};
|
|
6269
6291
|
var DANGER_TITLE_LABEL = "\uC8FC\uC758\uC0AC\uD56D";
|
|
6270
6292
|
function renderItems(message, depth = 1) {
|
|
6271
6293
|
const out = [];
|
|
@@ -6299,10 +6321,11 @@ function renderItems(message, depth = 1) {
|
|
|
6299
6321
|
}
|
|
6300
6322
|
var SCallout = /* @__PURE__ */ react.forwardRef(function SCallout2({ type = "default", message = [], children, className, style }, ref) {
|
|
6301
6323
|
const isDanger = type === "danger";
|
|
6324
|
+
const surface = SURFACE[type];
|
|
6302
6325
|
const vars = {
|
|
6303
|
-
"--co-bg":
|
|
6304
|
-
"--co-border":
|
|
6305
|
-
"--co-content":
|
|
6326
|
+
"--co-bg": surface.bg,
|
|
6327
|
+
"--co-border": surface.border,
|
|
6328
|
+
"--co-content": surface.content
|
|
6306
6329
|
};
|
|
6307
6330
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6308
6331
|
"div",
|
|
@@ -9076,8 +9099,22 @@ function SModalOutlet() {
|
|
|
9076
9099
|
return /* @__PURE__ */ jsxRuntime.jsx(PortalContainerProvider, { value: null, children: /* @__PURE__ */ jsxRuntime.jsx(InsideModalProvider, { value: false, children: entries3.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(SModalEntryPortal, { entry }, entry.id)) }) });
|
|
9077
9100
|
}
|
|
9078
9101
|
var useIsomorphicLayoutEffect = typeof window !== "undefined" ? react.useLayoutEffect : react.useEffect;
|
|
9102
|
+
var SPageColumnContext = /* @__PURE__ */ react.createContext(null);
|
|
9103
|
+
function SPageColumn({ full, children }) {
|
|
9104
|
+
const [scrolled, setScrolled] = react.useState(false);
|
|
9105
|
+
const value = react.useMemo(() => ({ scrolled, setScrolled }), [scrolled]);
|
|
9106
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SPageColumnContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9107
|
+
"div",
|
|
9108
|
+
{
|
|
9109
|
+
className: "flex min-h-0 min-w-0 flex-1 flex-col",
|
|
9110
|
+
style: full ? { gridArea: "page" } : void 0,
|
|
9111
|
+
children
|
|
9112
|
+
}
|
|
9113
|
+
) });
|
|
9114
|
+
}
|
|
9079
9115
|
var isSameNav = (a, b) => a === b || !!a && !!b && a.columnWidth === b.columnWidth && a.topHeight === b.topHeight && a.foldMs === b.foldMs && a.requireFullHeader === b.requireFullHeader && a.resizing === b.resizing;
|
|
9080
9116
|
var SLayoutContext = /* @__PURE__ */ react.createContext(null);
|
|
9117
|
+
var isPageHeaderElement = (node) => react.isValidElement(node) && node.type?.displayName === "SPageHeader";
|
|
9081
9118
|
var SLAYOUT_MIN_WIDTH = 1366;
|
|
9082
9119
|
var SLAYOUT_MIN_WIDTH_VAR = "--s-layout-min-width";
|
|
9083
9120
|
function useSLayout() {
|
|
@@ -9139,6 +9176,15 @@ var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
|
|
|
9139
9176
|
// 단 폭을 끄는 중에는 전환을 끈다 — 그러지 않으면 열이 손보다 늦게 따라온다.
|
|
9140
9177
|
transition: nav?.resizing ? "none" : `grid-template-columns ${nav?.foldMs ?? 0}ms ease-out`
|
|
9141
9178
|
} : void 0;
|
|
9179
|
+
const laidOutChildren = react.useMemo(() => {
|
|
9180
|
+
const kids = react.Children.toArray(children);
|
|
9181
|
+
const at = kids.findIndex(isPageHeaderElement);
|
|
9182
|
+
if (at === -1) return children;
|
|
9183
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9184
|
+
kids.slice(0, at),
|
|
9185
|
+
/* @__PURE__ */ jsxRuntime.jsx(SPageColumn, { full: isFullHeader, children: kids.slice(at) })
|
|
9186
|
+
] });
|
|
9187
|
+
}, [children, isFullHeader]);
|
|
9142
9188
|
return /* @__PURE__ */ jsxRuntime.jsx(SLayoutContext.Provider, { value: ctx, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9143
9189
|
"div",
|
|
9144
9190
|
{
|
|
@@ -9152,7 +9198,7 @@ var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
|
|
|
9152
9198
|
),
|
|
9153
9199
|
style: { ...minWidthStyle, ...frameStyle, ...style },
|
|
9154
9200
|
...rest,
|
|
9155
|
-
children
|
|
9201
|
+
children: laidOutChildren
|
|
9156
9202
|
}
|
|
9157
9203
|
) });
|
|
9158
9204
|
});
|
|
@@ -10517,63 +10563,12 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
|
|
|
10517
10563
|
}
|
|
10518
10564
|
);
|
|
10519
10565
|
});
|
|
10520
|
-
var SPageHeader = /* @__PURE__ */ withDisplayName(
|
|
10521
|
-
react.forwardRef(function SPageHeader2({ title, subText, fix = false, onBack, slot, scrolled = false, className, style, ...rest }, ref) {
|
|
10522
|
-
const hasBack = onBack != null;
|
|
10523
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10524
|
-
"header",
|
|
10525
|
-
{
|
|
10526
|
-
ref,
|
|
10527
|
-
className: cn(
|
|
10528
|
-
"relative z-10 box-border flex shrink-0 items-center gap-(--cmp-pageHeader-gap) px-(--cmp-pageHeader-paddingX)",
|
|
10529
|
-
fix ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
|
|
10530
|
-
// 배경은 항상 투명 — 페이지 배경을 따라갈지는 fix 가 정하지 scrolled 가 정하지 않는다.
|
|
10531
|
-
// 스크롤되면 그림자만 더해 콘텐츠 위에 뜬 것처럼 보이게 한다.
|
|
10532
|
-
"bg-transparent pt-(--cmp-pageHeader-plain-paddingTop) pb-(--cmp-pageHeader-plain-paddingBottom)",
|
|
10533
|
-
scrolled && "shadow-floating"
|
|
10534
|
-
),
|
|
10535
|
-
className
|
|
10536
|
-
),
|
|
10537
|
-
style,
|
|
10538
|
-
...rest,
|
|
10539
|
-
children: [
|
|
10540
|
-
hasBack && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10541
|
-
SGhostButton,
|
|
10542
|
-
{
|
|
10543
|
-
icon: "chevronLeft",
|
|
10544
|
-
size: "xs",
|
|
10545
|
-
ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
|
|
10546
|
-
onClick: onBack,
|
|
10547
|
-
className: "shrink-0"
|
|
10548
|
-
}
|
|
10549
|
-
),
|
|
10550
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10551
|
-
"div",
|
|
10552
|
-
{
|
|
10553
|
-
className: cn(
|
|
10554
|
-
"flex min-w-0 flex-1 items-center",
|
|
10555
|
-
fix ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
|
|
10556
|
-
!hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
|
|
10557
|
-
),
|
|
10558
|
-
children: [
|
|
10559
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title }),
|
|
10560
|
-
subText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-default min-w-0 truncate text-(--cmp-pageHeader-subtitle-text)", children: subText })
|
|
10561
|
-
]
|
|
10562
|
-
}
|
|
10563
|
-
),
|
|
10564
|
-
slot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: slot })
|
|
10565
|
-
]
|
|
10566
|
-
}
|
|
10567
|
-
);
|
|
10568
|
-
}),
|
|
10569
|
-
"SPageHeader"
|
|
10570
|
-
);
|
|
10571
|
-
var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
|
|
10572
10566
|
var BACKGROUND_CLASS = {
|
|
10573
10567
|
frame: "bg-[var(--sys-color-bg-frame)]",
|
|
10574
10568
|
neutral: "bg-[var(--sys-color-bg-neutralLight)]",
|
|
10575
10569
|
screen: "bg-[var(--sys-color-bg-screen)]"
|
|
10576
10570
|
};
|
|
10571
|
+
var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
|
|
10577
10572
|
var NATIVE_SCROLLBAR_BACKGROUND_CLASS = {
|
|
10578
10573
|
frame: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
|
|
10579
10574
|
neutral: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
|
|
@@ -10720,7 +10715,6 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10720
10715
|
scrollEndSpacing = false,
|
|
10721
10716
|
overlayScrollbar = false,
|
|
10722
10717
|
contentHeight = "auto",
|
|
10723
|
-
header,
|
|
10724
10718
|
className,
|
|
10725
10719
|
style,
|
|
10726
10720
|
children,
|
|
@@ -10728,7 +10722,8 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10728
10722
|
...rest
|
|
10729
10723
|
}, ref) {
|
|
10730
10724
|
const layout = react.useContext(SLayoutContext);
|
|
10731
|
-
const
|
|
10725
|
+
const column = react.useContext(SPageColumnContext);
|
|
10726
|
+
const gridStyle = layout?.header === "full" && !column ? { gridArea: "page" } : void 0;
|
|
10732
10727
|
const scrollRef = react.useRef(null);
|
|
10733
10728
|
const setMainRef = react.useCallback(
|
|
10734
10729
|
(node) => {
|
|
@@ -10737,10 +10732,10 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10737
10732
|
},
|
|
10738
10733
|
[ref]
|
|
10739
10734
|
);
|
|
10740
|
-
const
|
|
10735
|
+
const setColumnScrolled = column?.setScrolled;
|
|
10741
10736
|
const handleScroll = (e) => {
|
|
10742
10737
|
onScroll?.(e);
|
|
10743
|
-
|
|
10738
|
+
setColumnScrolled?.(e.currentTarget.scrollTop > 0);
|
|
10744
10739
|
};
|
|
10745
10740
|
const fill = contentHeight === "fill";
|
|
10746
10741
|
const main = /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10755,69 +10750,86 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10755
10750
|
BACKGROUND_CLASS[background],
|
|
10756
10751
|
className
|
|
10757
10752
|
),
|
|
10758
|
-
style:
|
|
10753
|
+
style: !overlayScrollbar ? { ...gridStyle, ...style } : style,
|
|
10759
10754
|
onScroll: handleScroll,
|
|
10760
10755
|
...rest,
|
|
10761
10756
|
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(fill && "h-full"), style: { minWidth: MIN_CONTENT_WIDTH }, children })
|
|
10762
10757
|
}
|
|
10763
10758
|
);
|
|
10764
|
-
if (!overlayScrollbar)
|
|
10765
|
-
|
|
10766
|
-
|
|
10767
|
-
|
|
10768
|
-
|
|
10769
|
-
"
|
|
10770
|
-
|
|
10771
|
-
|
|
10772
|
-
|
|
10773
|
-
|
|
10774
|
-
|
|
10775
|
-
|
|
10776
|
-
|
|
10777
|
-
|
|
10778
|
-
|
|
10779
|
-
|
|
10780
|
-
|
|
10781
|
-
|
|
10759
|
+
if (!overlayScrollbar) return main;
|
|
10760
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10761
|
+
"div",
|
|
10762
|
+
{
|
|
10763
|
+
className: cn(
|
|
10764
|
+
"relative min-h-0 min-w-0 flex-1 overflow-hidden",
|
|
10765
|
+
BACKGROUND_CLASS[background]
|
|
10766
|
+
),
|
|
10767
|
+
style: gridStyle,
|
|
10768
|
+
children: [
|
|
10769
|
+
main,
|
|
10770
|
+
/* @__PURE__ */ jsxRuntime.jsx(SPageOverlayScrollbars, { scrollRef })
|
|
10771
|
+
]
|
|
10772
|
+
}
|
|
10773
|
+
);
|
|
10774
|
+
});
|
|
10775
|
+
|
|
10776
|
+
// src/components/SPage/page.config.ts
|
|
10777
|
+
var PAGE_BACKGROUNDS = ["frame", "neutral", "screen"];
|
|
10778
|
+
var PAGE_CONTENT_HEIGHTS = ["auto", "fill"];
|
|
10779
|
+
var SPageHeader = /* @__PURE__ */ withDisplayName(
|
|
10780
|
+
react.forwardRef(function SPageHeader2({ title, subText, fix = false, onBack, slot, scrolled, className, style, ...rest }, ref) {
|
|
10781
|
+
const hasBack = onBack != null;
|
|
10782
|
+
const column = react.useContext(SPageColumnContext);
|
|
10783
|
+
const isScrolled = scrolled ?? column?.scrolled ?? false;
|
|
10782
10784
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10783
|
-
"
|
|
10785
|
+
"header",
|
|
10784
10786
|
{
|
|
10787
|
+
ref,
|
|
10785
10788
|
className: cn(
|
|
10786
|
-
"relative
|
|
10787
|
-
|
|
10789
|
+
"relative z-10 box-border flex shrink-0 items-center gap-(--cmp-pageHeader-gap) px-(--cmp-pageHeader-paddingX)",
|
|
10790
|
+
// 배경은 두 베리에이션이 같은 흰 면이다 — fix 가 가르는 것은 높이·구분선·서브 텍스트 자리다.
|
|
10791
|
+
// plain 에는 전용 배경 토큰이 없어 시스템 흰 표면을 쓴다(토큰이 생기면 그것으로 갈아끼운다).
|
|
10792
|
+
fix ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
|
|
10793
|
+
// 스크롤되면 그림자를 더해 콘텐츠 위에 뜬 것처럼 보이게 한다.
|
|
10794
|
+
"bg-(--sys-color-bg-frame) pt-(--cmp-pageHeader-plain-paddingTop) pb-(--cmp-pageHeader-plain-paddingBottom)",
|
|
10795
|
+
isScrolled && "shadow-floating"
|
|
10796
|
+
),
|
|
10797
|
+
className
|
|
10788
10798
|
),
|
|
10789
|
-
style
|
|
10799
|
+
style,
|
|
10800
|
+
...rest,
|
|
10790
10801
|
children: [
|
|
10791
|
-
|
|
10792
|
-
|
|
10802
|
+
hasBack && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10803
|
+
SGhostButton,
|
|
10804
|
+
{
|
|
10805
|
+
icon: "chevronLeft",
|
|
10806
|
+
size: "xs",
|
|
10807
|
+
ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
|
|
10808
|
+
onClick: onBack,
|
|
10809
|
+
className: "shrink-0"
|
|
10810
|
+
}
|
|
10811
|
+
),
|
|
10812
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10813
|
+
"div",
|
|
10814
|
+
{
|
|
10815
|
+
className: cn(
|
|
10816
|
+
"flex min-w-0 flex-1 items-center",
|
|
10817
|
+
fix ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
|
|
10818
|
+
!hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
|
|
10819
|
+
),
|
|
10820
|
+
children: [
|
|
10821
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title }),
|
|
10822
|
+
subText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-default min-w-0 truncate text-(--cmp-pageHeader-subtitle-text)", children: subText })
|
|
10823
|
+
]
|
|
10824
|
+
}
|
|
10825
|
+
),
|
|
10826
|
+
slot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: slot })
|
|
10793
10827
|
]
|
|
10794
10828
|
}
|
|
10795
10829
|
);
|
|
10796
|
-
}
|
|
10797
|
-
|
|
10798
|
-
|
|
10799
|
-
// 그래서 SPage 의 background 를 main 뿐 아니라 여기에도 칠한다(스크롤바 관련 클래스는
|
|
10800
|
-
// 스크롤 요소가 아닌 여기서는 그냥 무시된다). fix 헤더는 자체 흰 배경이 덮으므로 무관하다.
|
|
10801
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10802
|
-
"div",
|
|
10803
|
-
{
|
|
10804
|
-
className: cn("flex min-h-0 min-w-0 flex-1 flex-col", BACKGROUND_CLASS[background]),
|
|
10805
|
-
style: gridStyle,
|
|
10806
|
-
children: [
|
|
10807
|
-
/* @__PURE__ */ jsxRuntime.jsx(SPageHeader, { ...header, scrolled }),
|
|
10808
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-h-0 min-w-0 flex-1 overflow-hidden", children: [
|
|
10809
|
-
main,
|
|
10810
|
-
/* @__PURE__ */ jsxRuntime.jsx(SPageOverlayScrollbars, { scrollRef })
|
|
10811
|
-
] })
|
|
10812
|
-
]
|
|
10813
|
-
}
|
|
10814
|
-
)
|
|
10815
|
-
);
|
|
10816
|
-
});
|
|
10817
|
-
|
|
10818
|
-
// src/components/SPage/page.config.ts
|
|
10819
|
-
var PAGE_BACKGROUNDS = ["frame", "neutral", "screen"];
|
|
10820
|
-
var PAGE_CONTENT_HEIGHTS = ["auto", "fill"];
|
|
10830
|
+
}),
|
|
10831
|
+
"SPageHeader"
|
|
10832
|
+
);
|
|
10821
10833
|
|
|
10822
10834
|
// src/components/STabs/tabs.config.ts
|
|
10823
10835
|
var TAB_MAIN_SIZE = { height: 36, paddingX: 24 };
|
|
@@ -22569,6 +22581,7 @@ exports.SModal = SModal;
|
|
|
22569
22581
|
exports.SModalOutlet = SModalOutlet;
|
|
22570
22582
|
exports.SNumberInput = SNumberInput;
|
|
22571
22583
|
exports.SPage = SPage;
|
|
22584
|
+
exports.SPageHeader = SPageHeader;
|
|
22572
22585
|
exports.SPagination = SPagination;
|
|
22573
22586
|
exports.SPopover = SPopover;
|
|
22574
22587
|
exports.SPopup = SPopup;
|