sellmate-design-system-react 9.0.0-beta.2 → 9.0.0-beta.4

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.
@@ -28,6 +28,7 @@
28
28
  |------|------|---------|-------------|
29
29
  | `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
30
30
  | `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
31
+ | `contentHeight?` | `SPageContentHeight` | `'auto'` | 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다. `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로 `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />` 구성이 성립한다. `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다. |
31
32
  | `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
32
33
 
33
34
  ## Dependencies
@@ -1,5 +1,5 @@
1
1
  import { type HTMLAttributes } from 'react';
2
- import type { SPageBackground } from './page.config';
2
+ import type { SPageBackground, SPageContentHeight } from './page.config';
3
3
  import { type SPageHeaderProps } from './SPageHeader';
4
4
  export interface SPageProps extends HTMLAttributes<HTMLElement> {
5
5
  /**
@@ -12,6 +12,17 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
12
12
  * 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
13
13
  */
14
14
  scrollEndSpacing?: boolean;
15
+ /**
16
+ * 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다.
17
+ *
18
+ * `fill` 은 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다. 표가 자기 안에서
19
+ * 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용이다. 본문 루트에 `h-full` 이 먹으므로
20
+ * `<div className="flex h-full min-h-0 flex-col">` + `<STable className="min-h-0 flex-1" />`
21
+ * 구성이 성립한다.
22
+ *
23
+ * `fill` 에서는 페이지가 스크롤하지 않으므로 `scrollEndSpacing` 이 무시된다.
24
+ */
25
+ contentHeight?: SPageContentHeight;
15
26
  /**
16
27
  * 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다.
17
28
  * `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다.
@@ -1,3 +1,3 @@
1
1
  export { SPage, type SPageProps } from './SPage';
2
- export { PAGE_BACKGROUNDS, type SPageBackground } from './page.config';
2
+ export { PAGE_BACKGROUNDS, type SPageBackground, PAGE_CONTENT_HEIGHTS, type SPageContentHeight, } from './page.config';
3
3
  export { type SPageHeaderProps } from './SPageHeader';
@@ -6,3 +6,11 @@
6
6
  */
7
7
  export declare const PAGE_BACKGROUNDS: readonly ["frame", "neutral", "screen"];
8
8
  export type SPageBackground = (typeof PAGE_BACKGROUNDS)[number];
9
+ /**
10
+ * 본문 높이 모드 — 페이지가 스크롤할지, 본문이 남은 높이를 채울지.
11
+ * - auto: 콘텐츠가 흐르고, 넘치면 페이지가 스크롤한다
12
+ * - fill: 본문이 남은 높이를 정확히 채우고 페이지는 스크롤하지 않는다.
13
+ * 표가 자기 안에서 스크롤하고 페이지네이션이 하단에 고정되는 목록 화면용.
14
+ */
15
+ export declare const PAGE_CONTENT_HEIGHTS: readonly ["auto", "fill"];
16
+ export type SPageContentHeight = (typeof PAGE_CONTENT_HEIGHTS)[number];
@@ -2,37 +2,24 @@
2
2
 
3
3
  > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
4
 
5
- ### SSectionHeaderCardBody
6
-
7
- #### Props
8
-
9
- | Prop | Type | Default | Description |
10
- |------|------|---------|-------------|
11
- | `children?` | `SSectionHeaderCardBodyChildren` | — | 바디 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. |
12
- | `padding?` | `SSectionHeaderCardBodyPadding` | `'default'` | 안쪽 여백. 기본은 `default`. 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`. |
13
-
14
- ### SSectionHeaderCardHeader
5
+ ### SSectionHeaderCard
15
6
 
16
7
  #### Props
17
8
 
18
9
  | Prop | Type | Default | Description |
19
10
  |------|------|---------|-------------|
20
- | `title` | `ReactNode` | — | 헤더 제목 |
21
- | `titleSize?` | `SSectionHeaderCardTitleSize` | `'xs'` | 제목 크기 |
22
- | `marker?` | `boolean` | `false` | 제목 앞 점 표시 여부 |
23
- | `required?` | `boolean` | `false` | 제목 뒤 필수 별 표시 여부 |
11
+ | `title?` | `ReactNode` | — | 헤더 제목 |
12
+ | `titleSize?` | `SSectionHeaderCardTitleSize` | | 제목 크기 |
13
+ | `marker?` | `boolean` | | 제목 앞 점 표시 여부 |
14
+ | `required?` | `boolean` | | 제목 뒤 필수 별 표시 여부 |
24
15
  | `helpText?` | `string[]` | — | 도움말 툴팁 메시지 |
25
16
  | `subtitle?` | `ReactNode` | — | 부제 |
26
17
  | `slot?` | `ReactNode` | — | 헤더 우측 슬롯 |
27
- | `thickness?` | `SSectionHeaderCardThickness` | `false` | 상단 border 색상 타입. false면 표시하지 않습니다. |
28
-
29
- ### SSectionHeaderCard
30
-
31
- #### Props
32
-
33
- | Prop | Type | Default | Description |
34
- |------|------|---------|-------------|
35
- | `children?` | `SSectionHeaderCardChildren` | — | SSectionHeaderCard 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. |
18
+ | `thickness?` | `SSectionHeaderCardThickness` | | 상단 border 색상 타입. false면 표시하지 않습니다. |
19
+ | `headerClassName?` | `string` | — | 헤더 영역 클래스 |
20
+ | `padding?` | `SSectionHeaderCardBodyPadding` | — | 바디 안쪽 여백. 기본은 `default`. 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`. |
21
+ | `background?` | `SSectionHeaderCardBodyBackground` | — | 본문 배경. 기본은 `frame` — 카드가 깐 흰 면을 그대로 쓴다. `neutral` 은 바탕을 한 단계 눌러앉혀, 흰 면 덩어리(표·리스트)가 여럿일 때 그것들이 **"면 위에 놓인 객체"로 읽히게** 한다. 위계를 한 단계 더 주고 싶을 때 고르는 선택지이며, **기본값이 틀린 것은 아니다** — 표·리스트는 테두리·라운드·헤더 줄과 간격을 이미 갖고 있어 흰 바탕에서도 경계가 읽힌다. 깔아도 **효과가 없는** 자리가 있다 — 덩어리가 가장자리까지 차는 경우(`padding="none"` 으로 표를 채우면 바탕이 완전히 가려진다), 덩어리에 회색 면이 섞인 경우(그 덩어리가 바탕에 묻힌다), 맨 텍스트나 폼 컨트롤만 있는 본문(떠오를 흰 면이 없다). |
22
+ | `children?` | `SSectionHeaderCardChildren` | — | 바디 콘텐츠. 특정 컴포넌트 타입으로 제한하지 않습니다. |
36
23
 
37
24
  ## Dependencies
38
25
 
@@ -4,9 +4,10 @@ export type SSectionHeaderCardChildren = ReactNode;
4
4
  export type SSectionHeaderCardThickness = false | 'default' | 'accent';
5
5
  export type SSectionHeaderCardTitleSize = 'xs' | 'sm';
6
6
  export type SSectionHeaderCardBodyPadding = 'default' | 'wide' | 'none';
7
- export interface SSectionHeaderCardHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'slot' | 'title'> {
7
+ export type SSectionHeaderCardBodyBackground = 'frame' | 'neutral';
8
+ export interface SSectionHeaderCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'slot' | 'title'> {
8
9
  /** 헤더 제목 */
9
- title: ReactNode;
10
+ title?: ReactNode;
10
11
  /** 제목 크기 */
11
12
  titleSize?: SSectionHeaderCardTitleSize;
12
13
  /** 제목 앞 점 표시 여부 */
@@ -21,21 +22,27 @@ export interface SSectionHeaderCardHeaderProps extends Omit<HTMLAttributes<HTMLD
21
22
  slot?: ReactNode;
22
23
  /** 상단 border 색상 타입. false면 표시하지 않습니다. */
23
24
  thickness?: SSectionHeaderCardThickness;
24
- }
25
- export interface SSectionHeaderCardBodyProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
26
- /** 바디 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. */
27
- children?: SSectionHeaderCardBodyChildren;
25
+ /** 헤더 영역 클래스 */
26
+ headerClassName?: string;
28
27
  /**
29
- * 안쪽 여백. 기본은 `default`.
28
+ * 바디 안쪽 여백. 기본은 `default`.
30
29
  * 성격이 다른 요소가 세 종류 이상 섞인 영역에만 `wide`, 표를 가장자리까지 채울 때만 `none`.
31
30
  */
32
31
  padding?: SSectionHeaderCardBodyPadding;
33
- }
34
- export interface SSectionHeaderCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
35
- /** SSectionHeaderCard 슬롯. 특정 컴포넌트 타입으로 제한하지 않습니다. */
32
+ /**
33
+ * 본문 배경. 기본은 `frame` 카드가 깐 흰 면을 그대로 쓴다.
34
+ *
35
+ * `neutral` 은 바탕을 한 단계 눌러앉혀, 흰 면 덩어리(표·리스트)가 여럿일 때 그것들이
36
+ * **"면 위에 놓인 객체"로 읽히게** 한다. 위계를 한 단계 더 주고 싶을 때 고르는 선택지이며,
37
+ * **기본값이 틀린 것은 아니다** — 표·리스트는 테두리·라운드·헤더 줄과 간격을 이미 갖고 있어
38
+ * 흰 바탕에서도 경계가 읽힌다.
39
+ *
40
+ * 깔아도 **효과가 없는** 자리가 있다 — 덩어리가 가장자리까지 차는 경우(`padding="none"` 으로
41
+ * 표를 채우면 바탕이 완전히 가려진다), 덩어리에 회색 면이 섞인 경우(그 덩어리가 바탕에 묻힌다),
42
+ * 맨 텍스트나 폼 컨트롤만 있는 본문(떠오를 흰 면이 없다).
43
+ */
44
+ background?: SSectionHeaderCardBodyBackground;
45
+ /** 바디 콘텐츠. 특정 컴포넌트 타입으로 제한하지 않습니다. */
36
46
  children?: SSectionHeaderCardChildren;
37
47
  }
38
- export declare const SSectionHeaderCard: import("react").ForwardRefExoticComponent<SSectionHeaderCardProps & import("react").RefAttributes<HTMLDivElement>> & {
39
- Header: import("react").ForwardRefExoticComponent<SSectionHeaderCardHeaderProps & import("react").RefAttributes<HTMLDivElement>>;
40
- Body: import("react").ForwardRefExoticComponent<SSectionHeaderCardBodyProps & import("react").RefAttributes<HTMLDivElement>>;
41
- };
48
+ export declare const SSectionHeaderCard: import("react").ForwardRefExoticComponent<SSectionHeaderCardProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- export { SSectionHeaderCard, type SSectionHeaderCardBodyChildren, type SSectionHeaderCardBodyPadding, type SSectionHeaderCardBodyProps, type SSectionHeaderCardChildren, type SSectionHeaderCardHeaderProps, type SSectionHeaderCardProps, type SSectionHeaderCardThickness, type SSectionHeaderCardTitleSize, } from './SSectionHeaderCard';
1
+ export { SSectionHeaderCard, type SSectionHeaderCardBodyBackground, type SSectionHeaderCardBodyChildren, type SSectionHeaderCardBodyPadding, type SSectionHeaderCardChildren, type SSectionHeaderCardProps, type SSectionHeaderCardThickness, type SSectionHeaderCardTitleSize, } from './SSectionHeaderCard';
@@ -55,6 +55,7 @@
55
55
 
56
56
  ### Used by
57
57
 
58
+ - [SChipFilter](../SChipFilter)
58
59
  - [SKeyValueTable](../SKeyValueTable)
59
60
  - [STable](../STable)
60
61
 
@@ -73,6 +74,7 @@ graph TD;
73
74
  SSelect --> SGhostButton
74
75
  SSelect --> SIcon
75
76
  SSelect --> SPortal
77
+ SChipFilter --> SSelect
76
78
  SKeyValueTable --> SSelect
77
79
  STable --> SSelect
78
80
  style SSelect fill:#f9f,stroke:#333,stroke-width:4px
@@ -19,6 +19,7 @@
19
19
  | `stickyHeader?` | `boolean` | — | |
20
20
  | `stickyColumn?` | `STableStickyColumn` | — | 고정할 좌/우 컬럼 수 |
21
21
  | `radius?` | `'default' \| 'useTop' \| 'full'` | `'default'` | border-radius 제어 |
22
+ | `bordered?` | `boolean` | `true` | 바깥 테두리. 기본은 `true`. `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 — 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다. 페이지네이션 바의 테두리와 1px 겹침(`-mt-px`)도 함께 꺼진다. 본문 테두리가 없으면 겹칠 대상이 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다. |
22
23
  | `noDataLabel?` | `string` | `'데이터가 없습니다.'` | |
23
24
  | `noDataSlot?` | `ReactNode` | — | 데이터가 없을 때 body 영역 전체를 대체하는 슬롯. 지정하면 `noDataLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다. |
24
25
  | `isLoading?` | `boolean` | `false` | |
@@ -38,6 +38,16 @@ export interface STableColumn {
38
38
  icon?: SIconName;
39
39
  /** 헤더 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상 */
40
40
  iconColor?: SColor;
41
+ /**
42
+ * 셀에 무엇이 들어가는지. 좌우 여백이 여기서 갈린다 — 기본은 `text`(넓게).
43
+ *
44
+ * 자기 폭을 가진 컨트롤(`SInput`·`SNumberInput`·`SSelect` 등)이 들어가는 열은 `control` 로 준다.
45
+ * 텍스트와 같은 넓은 여백을 두면 컨트롤이 쓸 폭이 그만큼 줄어 같은 열 폭에서도 좁아 보인다.
46
+ *
47
+ * `SKeyValueTable` 은 `field.type` 으로 이 판정을 스스로 하지만, `STable` 의 셀은 소비 앱이 넘긴
48
+ * 임의의 `render` 결과라 컴포넌트가 알 수 없다. 그래서 열 단위로 받는다.
49
+ */
50
+ contentType?: 'text' | 'control';
41
51
  /** 셀 커스텀 렌더 (React 확장) — `<td>` 안쪽 내용만 교체한다 */
42
52
  render?: (row: SRow, value: any) => ReactNode;
43
53
  /**
@@ -109,6 +119,16 @@ export interface STableProps {
109
119
  stickyColumn?: STableStickyColumn;
110
120
  /** border-radius 제어 */
111
121
  radius?: 'default' | 'useTop' | 'full';
122
+ /**
123
+ * 바깥 테두리. 기본은 `true`.
124
+ *
125
+ * `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 —
126
+ * 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다.
127
+ *
128
+ * 페이지네이션 바의 테두리와 1px 겹침(`-mt-px`)도 함께 꺼진다. 본문 테두리가 없으면 겹칠 대상이
129
+ * 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다.
130
+ */
131
+ bordered?: boolean;
112
132
  noDataLabel?: string;
113
133
  /**
114
134
  * 데이터가 없을 때 body 영역 전체를 대체하는 슬롯.
@@ -12,6 +12,11 @@ export declare const TIMEPICKER_SIZE_CONFIG: Record<STimePickerSize, {
12
12
  lineHeight: number;
13
13
  minWidth: number;
14
14
  fieldMinWidth: number;
15
+ /**
16
+ * 필드 상한. 값 길이가 HH:mm 으로 정해져 있어, width="100%" 를 받아도 행 전체로
17
+ * 늘어나지 않게 막는다 (SKeyValueTable 이 모든 컨트롤에 100% 를 넘긴다).
18
+ */
19
+ fieldMaxWidth: number;
15
20
  }>;
16
21
  export declare function clampTimePart(value: number, min: number, max: number): number;
17
22
  export declare function padTimePart(value: number): string;