sellmate-design-system-react 8.0.0 → 9.0.0-beta.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 (51) hide show
  1. package/AGENTS.md +492 -116
  2. package/README.md +38 -8
  3. package/dist/components/SChipFilter/README.md +69 -0
  4. package/dist/components/SChipFilter/SChipFilter.d.ts +160 -0
  5. package/dist/components/SChipFilter/index.d.ts +1 -0
  6. package/dist/components/SDatePicker/README.md +2 -0
  7. package/dist/components/SDateRangePicker/README.md +21 -0
  8. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +16 -0
  9. package/dist/components/SDateRangePicker/index.d.ts +1 -1
  10. package/dist/components/SDraggableItem/README.md +1 -0
  11. package/dist/components/SDraggableItem/SDraggableItem.d.ts +3 -0
  12. package/dist/components/SDrawer/README.md +5 -4
  13. package/dist/components/SDrawer/SDrawer.d.ts +16 -5
  14. package/dist/components/SExpansionItem/README.md +1 -0
  15. package/dist/components/SExpansionItem/SExpansionItem.d.ts +3 -0
  16. package/dist/components/SGhostButton/README.md +4 -0
  17. package/dist/components/SGnb/README.md +3 -0
  18. package/dist/components/SGnb/SGnb.d.ts +15 -0
  19. package/dist/components/SGuide/README.md +1 -1
  20. package/dist/components/SGuide/SGuide.d.ts +1 -1
  21. package/dist/components/SIcon/README.md +2 -0
  22. package/dist/components/SIcon/icons.gen.d.ts +1 -0
  23. package/dist/components/SList/README.md +1 -0
  24. package/dist/components/SList/SList.d.ts +2 -0
  25. package/dist/components/SListItem/README.md +3 -2
  26. package/dist/components/SListItem/SListItem.d.ts +5 -2
  27. package/dist/components/SPage/README.md +21 -0
  28. package/dist/components/SPage/SPage.d.ts +10 -0
  29. package/dist/components/SPage/SPageHeader.d.ts +32 -0
  30. package/dist/components/SPage/index.d.ts +1 -0
  31. package/dist/components/SPortal/README.md +1 -1
  32. package/dist/components/SPortal/SPortal.d.ts +7 -1
  33. package/dist/components/SRadio/README.md +2 -0
  34. package/dist/components/SRadioButton/README.md +13 -0
  35. package/dist/components/SSelect/README.md +2 -2
  36. package/dist/components/SSelect/SSelect.d.ts +2 -2
  37. package/dist/components/STag/README.md +2 -0
  38. package/dist/components/STextLink/README.md +2 -0
  39. package/dist/components/STooltip/README.md +2 -0
  40. package/dist/index.cjs +1750 -232
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +1761 -245
  44. package/dist/index.js.map +1 -1
  45. package/dist/lib/floating-width.d.ts +22 -0
  46. package/dist/llms-full.txt +628 -126
  47. package/dist/llms.txt +498 -118
  48. package/dist/styles.css +249 -22
  49. package/dist/theme.css +36 -10
  50. package/eslint/scale.gen.mjs +1 -1
  51. package/package.json +8 -4
@@ -11,6 +11,7 @@
11
11
  | `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
12
12
  | `useGap?` | `boolean` | `false` | 리스트 아이템 사이 gap 토큰 적용 여부 |
13
13
  | `usePadding?` | `boolean` | `false` | 리스트 컨테이너 padding 토큰 적용 여부 |
14
+ | `separator?` | `boolean` | `false` | 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 |
14
15
 
15
16
  ## Dependencies
16
17
 
@@ -6,5 +6,7 @@ export interface SListProps extends HTMLAttributes<HTMLDivElement> {
6
6
  useGap?: boolean;
7
7
  /** 리스트 컨테이너 padding 토큰 적용 여부 */
8
8
  usePadding?: boolean;
9
+ /** 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 */
10
+ separator?: boolean;
9
11
  }
10
12
  export declare const SList: import("react").ForwardRefExoticComponent<SListProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -15,11 +15,12 @@
15
15
  | `leading?` | `SListItemSlot` | — | 타이틀 앞에 표시할 아이콘/콘텐츠 |
16
16
  | `trailing?` | `SListItemSlot` | — | 타이틀 뒤에 표시할 태그/콘텐츠 |
17
17
  | `bordered?` | `boolean` | `false` | 외곽 테두리 사용 여부 |
18
- | `selected?` | `boolean` | `false` | 선택 상태 여부 |
19
- | `clickable?` | `boolean` | `true` | 클릭 가능 상태 여부 |
18
+ | `selected?` | `boolean` | `false` | 선택 상태 여부. `clickable` 이 false 면 무시된다 |
19
+ | `clickable?` | `boolean` | `false` | 클릭 가능 상태 여부. hover·selected·chevron 등 인터랙션 표현이 여기에 딸린다 |
20
20
  | `interaction?` | `SListItemInteraction` | — | hover/selected 상태에서 적용할 인터랙션 preset |
21
21
  | `accentStripe?` | `boolean` | `false` | 아이템 왼쪽 accent stripe 표시 여부 |
22
22
  | `dense?` | `boolean` | `false` | 조밀한 높이 사용 여부 |
23
+ | `size?` | `SListItemSize` | `'sm'` | 타이포그래피 크기 |
23
24
  | `disabled?` | `boolean` | `false` | 비활성 상태 여부 |
24
25
 
25
26
  ## Dependencies
@@ -7,6 +7,7 @@ export type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;
7
7
  export type SListItemSlot = ReactNode | SListItemRenderProp;
8
8
  export type SListItemInteraction = 'chevron';
9
9
  export type SListItemSupportingTextPosition = 'right' | 'bottom';
10
+ export type SListItemSize = 'sm' | 'md';
10
11
  export interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {
11
12
  /** 리스트 아이템 제목 */
12
13
  title: SListItemSlot;
@@ -22,9 +23,9 @@ export interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
22
23
  trailing?: SListItemSlot;
23
24
  /** 외곽 테두리 사용 여부 */
24
25
  bordered?: boolean;
25
- /** 선택 상태 여부 */
26
+ /** 선택 상태 여부. `clickable` 이 false 면 무시된다 */
26
27
  selected?: boolean;
27
- /** 클릭 가능 상태 여부 */
28
+ /** 클릭 가능 상태 여부. hover·selected·chevron 등 인터랙션 표현이 여기에 딸린다 */
28
29
  clickable?: boolean;
29
30
  /** hover/selected 상태에서 적용할 인터랙션 preset */
30
31
  interaction?: SListItemInteraction;
@@ -32,6 +33,8 @@ export interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
32
33
  accentStripe?: boolean;
33
34
  /** 조밀한 높이 사용 여부 */
34
35
  dense?: boolean;
36
+ /** 타이포그래피 크기 */
37
+ size?: SListItemSize;
35
38
  /** 비활성 상태 여부 */
36
39
  disabled?: boolean;
37
40
  }
@@ -2,6 +2,24 @@
2
2
 
3
3
  > 자동 생성 문서 — `npm run docs:gen`. 소스: 각 컴포넌트의 Props/Handle 인터페이스 + import 의존성.
4
4
 
5
+ ### SPageHeader
6
+
7
+ #### Props
8
+
9
+ | Prop | Type | Default | Description |
10
+ |------|------|---------|-------------|
11
+ | `title` | `string` | — | 타이틀 (필수) |
12
+ | `subText?` | `string` | — | 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. |
13
+ | `fix?` | `boolean` | `false` | true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄. false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경, 서브 텍스트가 타이틀 아래로 내려간다. |
14
+ | `slot?` | `ReactNode` | — | 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. |
15
+ | `scrolled?` | `boolean` | `false` | `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다. fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건 scrolled 가 아니라 fix 다. |
16
+
17
+ #### Events
18
+
19
+ | Event | Type | Description |
20
+ |-------|------|-------------|
21
+ | `onBack` | `() => void` | 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. |
22
+
5
23
  ### SPage
6
24
 
7
25
  #### Props
@@ -10,17 +28,20 @@
10
28
  |------|------|---------|-------------|
11
29
  | `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
12
30
  | `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
31
+ | `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
13
32
 
14
33
  ## Dependencies
15
34
 
16
35
  ### Depends on
17
36
 
37
+ - [SGhostButton](../SGhostButton)
18
38
  - [SLayout](../SLayout)
19
39
 
20
40
  ### Graph
21
41
 
22
42
  ```mermaid
23
43
  graph TD;
44
+ SPage --> SGhostButton
24
45
  SPage --> SLayout
25
46
  style SPage fill:#f9f,stroke:#333,stroke-width:4px
26
47
  ```
@@ -1,5 +1,6 @@
1
1
  import { type HTMLAttributes } from 'react';
2
2
  import type { SPageBackground } from './page.config';
3
+ import { type SPageHeaderProps } from './SPageHeader';
3
4
  export interface SPageProps extends HTMLAttributes<HTMLElement> {
4
5
  /**
5
6
  * 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕.
@@ -11,6 +12,11 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
11
12
  * 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
12
13
  */
13
14
  scrollEndSpacing?: boolean;
15
+ /**
16
+ * 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다.
17
+ * `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다.
18
+ */
19
+ header?: SPageHeaderProps;
14
20
  }
15
21
  /**
16
22
  * SPage — SLayout 안에서 남은 공간을 채우는 스크롤 콘텐츠 영역.
@@ -21,5 +27,9 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
21
27
  * - header="fix": flex 자식으로 남은 가로 공간을 채운다.
22
28
  * - header="full": SLayout 이 깐 grid 의 "page" 영역 = 상단바 아래·메뉴 오른쪽 자리를 차지한다.
23
29
  * 좌표가 아니라 이름으로 잡으므로 프레임의 열·행 구성이 바뀌어도 여기는 그대로다.
30
+ *
31
+ * **`header` prop 을 주면** 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다(fix 베리에이션이
32
+ * 늘 보이는 높이 56 바가 되도록). 주지 않으면 이전과 동일하게 동작한다 — ref·className·style·
33
+ * 나머지 속성이 전부 스크롤 영역 자체(`<main>`)에 그대로 붙는다.
24
34
  */
25
35
  export declare const SPage: import("react").ForwardRefExoticComponent<SPageProps & import("react").RefAttributes<HTMLElement>>;
@@ -0,0 +1,32 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export interface SPageHeaderProps extends Omit<HTMLAttributes<HTMLElement>, 'slot' | 'title'> {
3
+ /** 타이틀 (필수) */
4
+ title: string;
5
+ /** 서브 텍스트. fix=true 면 타이틀 오른쪽에, fix=false(기본) 면 타이틀 아래에 놓인다. */
6
+ subText?: string;
7
+ /**
8
+ * true: 높이 56 고정 + 흰 배경 + 하단 구분선, 서브 텍스트가 타이틀과 같은 줄.
9
+ * false(기본): 최소 높이 66(상하 패딩 20/16 안에서 타이틀 한 줄 높이로 결정) + 투명 배경,
10
+ * 서브 텍스트가 타이틀 아래로 내려간다.
11
+ */
12
+ fix?: boolean;
13
+ /** 뒤로가기 클릭 핸들러. 지정하면 왼쪽에 뒤로가기 버튼이 나타난다. */
14
+ onBack?: () => void;
15
+ /** 오른쪽 끝 커스텀 슬롯. 가이드 링크·액션 버튼 등 페이지마다 다른 것이 온다. */
16
+ slot?: ReactNode;
17
+ /**
18
+ * `<SPage>` 가 스크롤 여부를 보고 자동으로 넣어준다 — 직접 주지 않는다.
19
+ * fix=false 일 때만 의미가 있다: 스크롤이 시작되면 그림자(floating)가 들어가 스크롤되는
20
+ * 콘텐츠 위에 뜬 것처럼 보인다. 배경은 그대로 페이지 배경을 따라간다 — 배경을 바꾸는 건
21
+ * scrolled 가 아니라 fix 다.
22
+ * @nodemo SPage 가 스크롤 이벤트로 넣어준다 — 사용자가 직접 시연할 값이 아니다.
23
+ */
24
+ scrolled?: boolean;
25
+ }
26
+ /**
27
+ * SPage 위에 얹는 페이지 타이틀 영역(pageHeader 포팅). `SPage` 가 `header` prop 값으로
28
+ * 내부적으로만 렌더한다 — 직접 임포트해 쓰지 않는다 (SPage.tsx 참고).
29
+ * fix 로 bar(높이 고정·흰 배경) / plain(투명·최소 높이) 두 베리에이션을 고른다.
30
+ * 뒤로가기 버튼은 onBack 유무로 나타나며, 없을 때는 타이틀 쪽에 4px 여백이 대신 들어간다.
31
+ */
32
+ export declare const SPageHeader: import("react").ForwardRefExoticComponent<SPageHeaderProps & import("react").RefAttributes<HTMLElement>>;
@@ -1,2 +1,3 @@
1
1
  export { SPage, type SPageProps } from './SPage';
2
2
  export { PAGE_BACKGROUNDS, type SPageBackground } from './page.config';
3
+ export { type SPageHeaderProps } from './SPageHeader';
@@ -18,7 +18,7 @@
18
18
  | `maxHeight?` | `number` | — | 콘텐츠 최대 높이 px. 넘치면 세로 스크롤. |
19
19
  | `autoClose?` | `boolean` | `false` | 콘텐츠 내부를 클릭하면 자동으로 닫는다. |
20
20
  | `persistent?` | `boolean` | `false` | 외부 클릭 · ESC 로 닫히지 않게 한다. |
21
- | `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). |
21
+ | `viewportPadding?` | `number` | `0` | 뷰포트 경계 여백 px (충돌 회피 패딩). 콘텐츠 폭은 항상 `창 폭 - viewportPadding*2` 를 넘지 않게 잘린다. |
22
22
  | `children?` | `ReactNode` | — | 본문 내용 (콘텐츠 자유). |
23
23
  | `className?` | `string` | — | |
24
24
  | `style?` | `CSSProperties` | — | |
@@ -29,7 +29,10 @@ export interface SPortalProps {
29
29
  autoClose?: boolean;
30
30
  /** 외부 클릭 · ESC 로 닫히지 않게 한다. */
31
31
  persistent?: boolean;
32
- /** 뷰포트 경계 여백 px (충돌 회피 패딩). */
32
+ /**
33
+ * 뷰포트 경계 여백 px (충돌 회피 패딩).
34
+ * 콘텐츠 폭은 항상 `창 폭 - viewportPadding*2` 를 넘지 않게 잘린다.
35
+ */
33
36
  viewportPadding?: number;
34
37
  /** 열릴 때 포커스 이동 처리 (기본은 Radix가 콘텐츠로 포커스를 옮김). e.preventDefault()로 막을 수 있다. */
35
38
  onOpenAutoFocus?: (event: Event) => void;
@@ -49,5 +52,8 @@ export interface SPortalProps {
49
52
  * 트리거를 감싸지 않고 `anchorRef` 로 임의의 엘리먼트에 붙는다(=sd-portal `parentRef`).
50
53
  * open/onClose 로 외부에서 제어하며, flip·collision·스크롤 재배치·외부클릭·ESC·모달 포털은
51
54
  * Radix 가 처리한다. 콘텐츠는 children 으로 완전히 자유롭다.
55
+ *
56
+ * 콘텐츠가 창보다 넓으면 창 폭에 맞춰 줄어든다(sd-portal 과 동일). `style` 로 준
57
+ * width·minWidth·maxWidth 도 이 상한 안으로 가둬지므로 화면 밖으로 나가지 않는다.
52
58
  */
53
59
  export declare function SPortal({ open, onClose, onOpenChange, anchorRef, placement, align, offset, alignOffset, fit, maxHeight, autoClose, persistent, viewportPadding, onOpenAutoFocus, onCloseAutoFocus, onPointerDownOutside, children, className, style, ariaLabel, }: SPortalProps): import("react").JSX.Element;
@@ -46,12 +46,14 @@
46
46
 
47
47
  ### Used by
48
48
 
49
+ - [SChipFilter](../SChipFilter)
49
50
  - [SKeyValueTable](../SKeyValueTable)
50
51
 
51
52
  ### Graph
52
53
 
53
54
  ```mermaid
54
55
  graph TD;
56
+ SChipFilter --> SRadio
55
57
  SKeyValueTable --> SRadio
56
58
  style SRadio fill:#f9f,stroke:#333,stroke-width:4px
57
59
  ```
@@ -22,3 +22,16 @@
22
22
  |-------|------|-------------|
23
23
  | `onValueChange` | `(value: string \| number) => void` | 변경 (sdUpdate) |
24
24
 
25
+ ## Dependencies
26
+
27
+ ### Used by
28
+
29
+ - [SChipFilter](../SChipFilter)
30
+
31
+ ### Graph
32
+
33
+ ```mermaid
34
+ graph TD;
35
+ SChipFilter --> SRadioButton
36
+ style SRadioButton fill:#f9f,stroke:#333,stroke-width:4px
37
+ ```
@@ -22,8 +22,8 @@
22
22
  | `rules?` | `Rule[]` | — | 유효성 규칙 — 닫힐 때 자동 검증 |
23
23
  | `labelTooltipProps?` | `Partial<STooltipProps>` | — | 레이블 툴팁 상세 옵션 |
24
24
  | `dropdownHeight?` | `string` | `'260px'` | 드롭다운 최대 높이 |
25
- | `dropdownWidth?` | `string` | — | 드롭다운 너비 (없으면 트리거 너비) |
26
- | `maxDropdownWidth?` | `string` | `'640px'` | 드롭다운 최대 너비 |
25
+ | `dropdownWidth?` | `string` | — | 드롭다운 너비 (없으면 트리거 너비). 창보다 넓게 줘도 창 폭까지만 벌어진다. |
26
+ | `maxDropdownWidth?` | `string` | `'640px'` | 드롭다운 최대 너비. 창이 이보다 좁으면 창 폭이 상한이 된다. |
27
27
  | `label?` | `string` | — | |
28
28
  | `labelWidth?` | `number \| string` | — | |
29
29
  | `icon?` | `SIconName` | — | 레이블 영역 아이콘 |
@@ -45,9 +45,9 @@ export interface SSelectProps {
45
45
  labelTooltipProps?: Partial<STooltipProps>;
46
46
  /** 드롭다운 최대 높이 */
47
47
  dropdownHeight?: string;
48
- /** 드롭다운 너비 (없으면 트리거 너비) */
48
+ /** 드롭다운 너비 (없으면 트리거 너비). 창보다 넓게 줘도 창 폭까지만 벌어진다. */
49
49
  dropdownWidth?: string;
50
- /** 드롭다운 최대 너비 */
50
+ /** 드롭다운 최대 너비. 창이 이보다 좁으면 창 폭이 상한이 된다. */
51
51
  maxDropdownWidth?: string;
52
52
  label?: string;
53
53
  labelWidth?: number | string;
@@ -20,6 +20,7 @@
20
20
 
21
21
  ### Used by
22
22
 
23
+ - [SChipFilter](../SChipFilter)
23
24
  - [SConfirmModal](../SConfirmModal)
24
25
  - [SGhostButton](../SGhostButton)
25
26
  - [SGnb](../SGnb)
@@ -35,6 +36,7 @@
35
36
  ```mermaid
36
37
  graph TD;
37
38
  STag --> SIcon
39
+ SChipFilter --> STag
38
40
  SConfirmModal --> STag
39
41
  SGhostButton --> STag
40
42
  SGnb --> STag
@@ -28,6 +28,7 @@
28
28
 
29
29
  ### Used by
30
30
 
31
+ - [SChipFilter](../SChipFilter)
31
32
  - [SChipInput](../SChipInput)
32
33
  - [SPopover](../SPopover)
33
34
 
@@ -42,6 +43,7 @@
42
43
  graph TD;
43
44
  STextLink --> SIcon
44
45
  STextLink --> STag
46
+ SChipFilter --> STextLink
45
47
  SChipInput --> STextLink
46
48
  SPopover --> STextLink
47
49
  style STextLink fill:#f9f,stroke:#333,stroke-width:4px
@@ -44,6 +44,7 @@
44
44
 
45
45
  ### Used by
46
46
 
47
+ - [SChipFilter](../SChipFilter)
47
48
  - [SField](../SField)
48
49
  - [SKeyValueTable](../SKeyValueTable)
49
50
  - [SSectionHeaderCard](../SSectionHeaderCard)
@@ -60,6 +61,7 @@
60
61
  graph TD;
61
62
  STooltip --> SGhostButton
62
63
  STooltip --> SIcon
64
+ SChipFilter --> STooltip
63
65
  SField --> STooltip
64
66
  SKeyValueTable --> STooltip
65
67
  SSectionHeaderCard --> STooltip