sellmate-design-system-react 9.0.0-beta.103 → 9.0.0-beta.104

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 (52) hide show
  1. package/AGENTS.md +4 -2
  2. package/dist/components/SAccountListBox/accountListBox.config.d.ts +4 -1
  3. package/dist/components/SBarcodeInput/README.md +1 -1
  4. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +1 -0
  5. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +1 -1
  6. package/dist/components/SCalendarBoard/README.md +1 -1
  7. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +1 -1
  8. package/dist/components/SChatInput/README.md +1 -1
  9. package/dist/components/SChatInput/SChatInput.d.ts +1 -1
  10. package/dist/components/SConfirmModal/README.md +1 -1
  11. package/dist/components/SConfirmModal/SConfirmModal.d.ts +2 -2
  12. package/dist/components/SEditor/README.md +1 -1
  13. package/dist/components/SEditor/SEditor.d.ts +1 -1
  14. package/dist/components/SEditor/editor.config.d.ts +8 -1
  15. package/dist/components/SFooter/README.md +1 -1
  16. package/dist/components/SFooter/SFooter.d.ts +1 -1
  17. package/dist/components/SGnbSystem/gnbSystem.config.d.ts +0 -4
  18. package/dist/components/SGuide/README.md +1 -1
  19. package/dist/components/SGuide/SGuide.d.ts +1 -1
  20. package/dist/components/SIcon/README.md +1 -1
  21. package/dist/components/SIcon/SIcon.d.ts +5 -1
  22. package/dist/components/SIcon/icons.gen.d.ts +3 -1
  23. package/dist/components/SMeatballButton/README.md +2 -2
  24. package/dist/components/SMeatballButton/SMeatballButton.d.ts +5 -2
  25. package/dist/components/SModalContainer/README.md +1 -1
  26. package/dist/components/SModalContainer/SModalContainer.d.ts +5 -2
  27. package/dist/components/SNumberInput/README.md +1 -1
  28. package/dist/components/SSearchInput/README.md +1 -1
  29. package/dist/components/SSearchInput/SSearchInput.d.ts +1 -1
  30. package/dist/components/SStepper/README.md +1 -1
  31. package/dist/components/SStepper/SStepper.d.ts +2 -2
  32. package/dist/components/STable/README.md +3 -3
  33. package/dist/components/STable/STable.d.ts +3 -1
  34. package/dist/components/STableBar/README.md +1 -1
  35. package/dist/components/STableBar/STableBar.d.ts +1 -1
  36. package/dist/components/STimePicker/timepicker.config.d.ts +2 -1
  37. package/dist/components/STimeRangePicker/time-range-picker.config.d.ts +2 -1
  38. package/dist/components/STimeline/README.md +1 -1
  39. package/dist/components/STimeline/STimeline.d.ts +1 -0
  40. package/dist/index.cjs +1492 -478
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.js +1492 -478
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/chart/radial.d.ts +2 -2
  45. package/dist/lib/date.d.ts +9 -5
  46. package/dist/lib/form.d.ts +5 -2
  47. package/dist/lib/locale.d.ts +274 -0
  48. package/dist/lib/tree-row.d.ts +1 -1
  49. package/dist/llms-full.txt +23 -21
  50. package/dist/llms.txt +4 -2
  51. package/dist/styles.css +3 -0
  52. package/package.json +1 -1
package/AGENTS.md CHANGED
@@ -51,6 +51,7 @@
51
51
  | **오버레이** | `STooltip` `SPopover` `SPopup` `SDrawer` `SPortal` |
52
52
  | **모달** | `SModal.confirm()` `SModal.create()` + `SActionModal` `SConfirmModal` `SModalOutlet`(앱 루트 1회) |
53
53
  | **알림** | `SToast` `SToastContainer` |
54
+ | **국제화** | `SLocaleProvider`(컴포넌트 내장 문구의 언어 — 앱 루트 1회) `useLocale` |
54
55
 
55
56
  표에 없는 UI 를 만들어야 할 때만 `div` 로 직접 조립하고, 그때도 §1-2 · §2 의 토큰 규칙을 지킨다.
56
57
 
@@ -675,6 +676,7 @@ Tailwind 유틸리티는 **토큰 스케일에 있는 값만** 사용한다.
675
676
  | --- | --- | --- |
676
677
  | `SModal.*` 로 띄운 모달이 그려질 자리를 만든다 | `SModalOutlet` | §4-1 |
677
678
  | `SToast` 가 그려질 자리를 만든다 | `SToastContainer` | §4-1 |
679
+ | 컴포넌트 내장 문구(aria-label·placeholder·"전체" 등)를 사용자 언어로 바꾼다 (국제화) | `SLocaleProvider` | §4-1 |
678
680
 
679
681
  ### 3-1. 라벨/표시류 — STag vs SBadge vs SChip
680
682
 
@@ -1915,7 +1917,7 @@ useEffect(() => {
1915
1917
  | `STimePicker` | md | lg |
1916
1918
  | `STimeRangePicker` | md | lg (오전/오후 표시는 두 사이즈 모두 lg) |
1917
1919
 
1918
- `SDatePicker`·`SDateRangePicker` 에 `showWeekday` 를 켜면 날짜 뒤에 요일이 붙어(`2026-10-19 월요일`) 붙는 글자(띄어쓰기 + 요일 3자) 폭만큼 위 표의 하한·상한이 넓어진다 — 등급이 바뀌는 것이 아니다. 늘어난 폭은 컴포넌트가 스스로 잡으므로 요일 때문에 `width` 를 따로 주지 않는다. 표시만 바뀌고 값 형식은 그대로라, **요일을 붙이려고 값을 가공하거나 `hint` 에 요일을 따로 적지 않는다.**
1920
+ `SDatePicker`·`SDateRangePicker` 에 `showWeekday` 를 켜면 날짜 뒤에 요일이 붙어(`2026-10-19 월요일`) 붙는 글자(띄어쓰기 + 요일) 폭만큼 위 표의 하한·상한이 넓어진다 — 등급이 바뀌는 것이 아니다. 늘어난 폭은 컴포넌트가 스스로 잡으므로(요일 문구는 `SLocaleProvider` 로케일을 따라 `2026-10-19 Monday` 처럼 바뀌고, 폭도 그에 맞춰 잡힌다) 요일 때문에 `width` 를 따로 주지 않는다. 표시만 바뀌고 값 형식은 그대로라, **요일을 붙이려고 값을 가공하거나 `hint` 에 요일을 따로 적지 않는다.**
1919
1921
 
1920
1922
  `SDateRangePicker` 가 한 등급씩 위인 것은 값이 `YYYY-MM-DD ~ YYYY-MM-DD` 로 두 배가 넘기 때문이다. 같은 이유로 `STimeRangePicker` 의 오전/오후 모드도 sm 에서 한 등급 위를 쓴다 — 그 모드의 최소 폭이 md 등급을 이미 넘어, 그대로 두면 하한이 상한을 넘어 상한이 무력해진다.
1921
1923
 
@@ -2475,7 +2477,7 @@ import { SLocaleProvider, SModalOutlet } from 'sellmate-design-system-react';
2475
2477
  - **`ja`·`zh` 문구는 원어민 검수 전 초안이다.** 사용자에게 노출하기 전에 검수한다.
2476
2478
  - 일부 문구만 바꾸려면 `messages` 로 덮어쓴다 — 나머지는 로케일 문구를 유지한다. `messages` 는 모듈 상수나 `useMemo` 로 안정시킨다(렌더마다 새 객체를 만들면 하위 컴포넌트가 매번 다시 그려진다).
2477
2479
  - 개별 prop(`placeholder` 등)을 직접 주면 로케일 문구보다 prop 이 우선한다. **내장 문구를 앱이 직접 번역해 prop 으로 넘기지 않는다** — Provider 가 이미 처리한다.
2478
- - 아직 로케일을 따르는 컴포넌트는 `SPagination`·`SSelect` 뿐이고, 나머지는 순차로 옮기는 중이다. 로케일을 바꿔도 그 밖의 컴포넌트 문구는 한국어로 남는다.
2480
+ - 컴포넌트가 사용자에게 보여 주는 내장 문구는 모두 로케일을 따른다 — 날짜·시간 컴포넌트의 요일·월·오전/오후 라벨, `SEditor` 툴바, `rules` 의 기본 오류 문구(`false` 를 돌려줄 때)까지 포함한다. **날짜 값의 형식(`YYYY-MM-DD`)은 그대로다.** 개발자에게 던지는 예외·콘솔 메시지는 한국어로 남는다. 예외는 앱이 정하는 데이터다 — 서비스 이름 목록(`SLauncherListBox`)과 `rules` 가 직접 돌려준 오류 문구, 앱이 넘긴 `label`·`options` 는 Provider 가 바꾸지 않는다.
2479
2481
 
2480
2482
  **최소 너비는 `SLayout` 이 보장한다 — 앱이 `min-w-*` 를 직접 주지 않는다.** 창이 최소 너비(`SLAYOUT_MIN_WIDTH`, GNB 포함한 전체 기준)보다 좁아지면 GNB·상단바는 제자리에 남고 **`SPage` 안에만 가로 스크롤이 생긴다.** 문서(브라우저 창)에는 가로 스크롤이 생기지 않는다. 그래서 셸을 감싸는 요소에 `min-width` 나 `overflow-x` 를 걸지 않는다 — 걸면 창 전체가 스크롤되어 GNB 가 화면 밖으로 밀린다.
2481
2483
 
@@ -7,7 +7,10 @@ export declare const ACCOUNT_LIST_BOX_ICONS: {
7
7
  readonly language: "global";
8
8
  readonly logout: "logout";
9
9
  };
10
- /** 행 라벨 기본값 — 시안 문구. 앱이 바꿀 수 있다 */
10
+ /**
11
+ * 행 라벨의 한국어 시안 문구. 컴포넌트는 이 값이 아니라 `SLocaleProvider` 로케일(`accountListBox.*`)을 따른다 —
12
+ * 앱이 `label` 로 직접 주면 그 값이 우선한다. 시안 문구를 참조하는 소비 앱을 위해 남겨 둔다.
13
+ */
11
14
  export declare const ACCOUNT_LIST_BOX_LABELS: {
12
15
  readonly accountSetting: "계정 설정";
13
16
  readonly language: "언어 변경";
@@ -13,7 +13,7 @@
13
13
  | `clearable?` | `boolean` | `false` | |
14
14
  | `autoFocus?` | `boolean` | — | |
15
15
  | `name?` | `string` | — | |
16
- | `placeholder?` | `string` | `'입력해 주세요.'` | |
16
+ | `placeholder?` | `string` | — | 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "입력해 주세요.")를 쓴다 |
17
17
  | `disabled?` | `boolean` | `false` | |
18
18
  | `readOnly?` | `boolean` | `false` | |
19
19
  | `rules?` | `Rule[]` | — | |
@@ -16,6 +16,7 @@ export interface SBarcodeInputProps {
16
16
  clearable?: boolean;
17
17
  autoFocus?: boolean;
18
18
  name?: string;
19
+ /** 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "입력해 주세요.")를 쓴다 */
19
20
  placeholder?: string;
20
21
  disabled?: boolean;
21
22
  readOnly?: boolean;
@@ -6,7 +6,7 @@ import type { SCalendarBoardEvent } from './types';
6
6
  * 칸에서 자라난 것처럼 보이게 하기 위함이다. 위치와 최소 높이는 SCalendarBoard 가 정하고,
7
7
  * 그보다 내용이 길면 자라다 상한에서 멈춘다.
8
8
  */
9
- export declare function CalendarDayEventListBox({ date, events, onEventClick, minWidth, minHeight, onClose, closeLabel, }: {
9
+ export declare function CalendarDayEventListBox({ date, events, onEventClick, minWidth, minHeight, onClose, closeLabel: closeLabelProp, }: {
10
10
  /** YYYY-MM-DD */
11
11
  date: string;
12
12
  /**
@@ -18,7 +18,7 @@
18
18
  | `dayColors?` | `Record<string, SCalendarBoardDayColor>` | — | 날짜별 칸 배경. 키는 `YYYY-MM-DD`, 없는 날짜는 `'default'` 다. 그날의 성격(마감·완료·휴무 등)을 칸 전체로 알릴 때 쓴다 — 일정 하나의 색은 `events[].color` 다. |
19
19
  | `dayContent?` | `Record<string, ReactNode>` | — | 날짜별 칸 본문. 키는 `YYYY-MM-DD`, 준 날짜는 **일정 자리를 통째로 이 내용이 차지한다** — 그날의 `events` 는 그리지 않고 목록 판도 열리지 않는다. 일정으로 표현되지 않는 것(재고 현황· 매출 요약 같은 그날치 요약)을 칸에 그대로 얹을 때 쓴다. |
20
20
  | `focusedEventId?` | `string \| null` | — | 집중할 일정의 `id`. 그 일정만 또렷하게 남고 **나머지 일정과 "N개 더보기" 는 흐려진다** — 판 밖의 무언가(목록의 행 등)에 손이 닿았을 때 판에서 그에 대응하는 일정을 짚어 주는 데 쓴다. 그 일정이 칸에 담기는 줄 수를 넘겨 **"N개 더보기" 에 접혀 있으면, 그 "더보기" 자리에 대신 그려져** 집중하는 동안만 드러난다. 이미 보이고 있으면 자리는 그대로다 — 어느 쪽이든 다른 일정의 줄 배정은 달라지지 않으므로, 집중이 오가도 판이 출렁이지 않는다. 자리를 내준 칸은 그 동안 "더보기" 를 그리지 않는다(한 줄에 둘을 넣을 수 없다). 거기 남은 일정은 칸을 눌러 목록 판으로 본다. `id` 가 없는 일정은 지목할 수 없다. |
21
- | `todayLabel?` | `string` | `'오늘'` | 헤더 오른쪽 "오늘" 버튼 레이블. 빈 문자열이면 버튼을 그리지 않는다 |
21
+ | `todayLabel?` | `string` | — | 헤더 오른쪽 "오늘" 버튼 레이블. 빈 문자열이면 버튼을 그리지 않는다 |
22
22
  | `moreLabel?` | `string` | — | "N개" 뒤에 붙는 말 |
23
23
  | `headerRight?` | `ReactNode` | — | 헤더 오른쪽 끝에 붙일 추가 컨트롤 |
24
24
  | `className?` | `string` | — | |
@@ -80,4 +80,4 @@ export interface SCalendarBoardProps {
80
80
  * 보일지" 를 정한다 — 그래서 놓는 자리에 높이를 주어야 한다 (`<div className="h-[640px]">` ·
81
81
  * `SPage` 본문의 남은 높이 등). 높이를 주지 않으면 칸이 `dayCard.minHeight` 로 주저앉는다.
82
82
  */
83
- export declare function SCalendarBoard({ year, month, defaultYear, defaultMonth, onViewChange, selectable, value, onValueChange, events, dayColors, dayContent, focusedEventId, onEventClick, onMoreClick, todayLabel, moreLabel, headerRight, className, style, }: SCalendarBoardProps): import("react").JSX.Element;
83
+ export declare function SCalendarBoard({ year, month, defaultYear, defaultMonth, onViewChange, selectable, value, onValueChange, events, dayColors, dayContent, focusedEventId, onEventClick, onMoreClick, todayLabel: todayLabelProp, moreLabel, headerRight, className, style, }: SCalendarBoardProps): import("react").JSX.Element;
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `value?` | `string` | `''` | 입력값 (제어) |
12
- | `placeholder?` | `string` | `DEFAULT_PLACEHOLDER` | 안내 문구. 세 제품이 같은 말로 서도록 기본값을 쥐고 있다 |
12
+ | `placeholder?` | `string` | — | 안내 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "메시지를 입력해 주세요...")를 쓴다 |
13
13
  | `disabled?` | `boolean` | `false` | 비활성 |
14
14
  | `hasAttachments?` | `boolean` | `false` | 보낼 첨부가 쌓여 있는지. 켜면 글이 비어도 전송 버튼이 열린다 — 파일·이미지만 보낼 수 있다. 첨부 목록은 앱이 쥐므로 입력창은 그 유무만 받는다. 첨부를 받는 대화면 쌓인 첨부 수로 켠다. |
15
15
  | `attachAccept?` | `string` | — | 파일 선택 창에서 고를 수 있는 형식 (`<input accept>` 와 같다). 예: `'image/*,.pdf'` |
@@ -8,7 +8,7 @@ export interface SChatInputProps extends Omit<TextareaHTMLAttributes<HTMLTextAre
8
8
  value?: string;
9
9
  /** 값 변경 */
10
10
  onValueChange?: (value: string) => void;
11
- /** 안내 문구. 세 제품이 같은 말로 서도록 기본값을 쥐고 있다 */
11
+ /** 안내 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "메시지를 입력해 주세요...")를 쓴다 */
12
12
  placeholder?: string;
13
13
  /** 비활성 */
14
14
  disabled?: boolean;
@@ -23,7 +23,7 @@
23
23
  | `tagSlot?` | `ReactNode` | — | 콘텐츠 박스 tag 위치 커스텀 콘텐츠 (미지정 시 tagLabel 기반 STag) |
24
24
  | `optionSlot?` | `ReactNode` | — | 콘텐츠 박스에서 태그 오른쪽 커스텀 콘텐츠 (미지정 시 slotLabel 텍스트) |
25
25
  | `contentSlot?` | `ReactNode` | — | 콘텐츠 박스 바로 아래에 통으로 들어가는 커스텀 콘텐츠 (전체 폭) |
26
- | `mainButtonLabel?` | `string` | `'확인'` | 메인(확인) 버튼에 찍히는 글자 |
26
+ | `mainButtonLabel?` | `string` | — | 메인(확인) 버튼에 찍히는 글자. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "확인")를 쓴다 |
27
27
  | `mainButtonOutline?` | `boolean` | — | 메인 버튼을 아웃라인(테두리)으로 세울지. 지정하지 않으면 `type` 이 정한다 — positive·negative 는 채운 버튼, default 는 아웃라인. **색은 여기서 고르지 않는다.** `type` 이 정한다(positive=primary / negative=danger / default=neutral) — 아이콘·제목이 말하는 것과 버튼 색이 어긋나면 읽는 사람이 헷갈리므로 그 조합은 타입에서 막는다. 글자는 `mainButtonLabel` 이다. `type="default"` 에 `false` 를 주면 테두리 없는 흰 버튼이 된다(neutral 은 solid·outline 이 같은 흰 면이고 테두리 유무만 다르다). 확인 버튼이 눌러야 할 것으로 안 읽히므로 권하지 않는다. |
28
28
  | `mainButtonDisabled?` | `boolean` | `false` | 메인 버튼을 눌리지 않게 한다. **기본값 `false`.** 모달 안에서 **아직 확정할 수 없을 때** 쓴다 — 동의 체크를 아직 안 했거나, `contentSlot` 의 입력이 덜 찼거나, 확인 뒤에 나갈 요청이 이미 나가는 중일 때. **왜 못 누르는지는 화면이 말해야 한다.** 흐려진 버튼만 남으면 사용자는 고장으로 읽는다 — 못 채운 것을 `bottomMessage` 나 `contentSlot` 안에서 함께 보인다. 서브(취소) 버튼은 따라 잠기지 않는다. 확정하지 못하는 상태일수록 **나가는 길은 열려 있어야** 하기 때문이다. 그래서 서브 버튼을 막는 prop 은 두지 않는다. |
29
29
  | `subButtonLabel?` | `string` | — | 서브 버튼에 찍히는 글자. **주지 않는 것이 기본이다** — 비어 있으면 버튼이 아예 서지 않고 확인 하나만 남는다. **`onCancel` 이 닫는 것 말고 따로 할 일이 있을 때만 준다.** 눌러도 창만 닫힌다면 X 버튼이 이미 그 일을 하므로(X 는 늘 서 있고, `persistent` 를 켜지 않았으면 백드롭·ESC 로도 닫힌다) 같은 일을 하는 버튼을 하나 더 세우지 않는다. 되묻는 모달이라고 해서 예외가 아니다 — "삭제할까요?" 에 답하지 않고 나가는 것은 X 로 충분하다. 그래서 서브 버튼이 설 자리는 **확인과 대등한 두 번째 선택지**다. 그때 글자는 `취소`·`닫기` 가 아니라 그 버튼이 하는 일의 이름이 된다. ```tsx ✅ { mainButtonLabel: '자동 취소', subButtonLabel: '수동 처리' } // 두 갈래를 고르게 한다 ❌ { mainButtonLabel: '삭제', subButtonLabel: '취소' } // X 가 이미 하는 일 ``` |
@@ -29,7 +29,7 @@ export interface SConfirmModalProps {
29
29
  optionSlot?: ReactNode;
30
30
  /** 콘텐츠 박스 바로 아래에 통으로 들어가는 커스텀 콘텐츠 (전체 폭) */
31
31
  contentSlot?: ReactNode;
32
- /** 메인(확인) 버튼에 찍히는 글자 */
32
+ /** 메인(확인) 버튼에 찍히는 글자. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "확인")를 쓴다 */
33
33
  mainButtonLabel?: string;
34
34
  /**
35
35
  * 메인 버튼을 아웃라인(테두리)으로 세울지. 지정하지 않으면 `type` 이 정한다 —
@@ -81,4 +81,4 @@ export interface SConfirmModalProps {
81
81
  onClose?: () => void;
82
82
  }
83
83
  /** SConfirmModal — sd-confirm-modal 포팅. 아이콘+제목+메시지+태그+확인/취소 버튼. */
84
- export declare function SConfirmModal({ open, onOpenChange, persistent, type, modalTitle, titleClassName, topMessage, bottomMessage, tagLabel, tagShape, tagSize, tagColor, slotLabel, tagSlot, optionSlot, contentSlot, mainButtonLabel, mainButtonOutline, mainButtonDisabled, subButtonLabel, onOk, onCancel, onClose, }: SConfirmModalProps): import("react").JSX.Element;
84
+ export declare function SConfirmModal({ open, onOpenChange, persistent, type, modalTitle, titleClassName, topMessage, bottomMessage, tagLabel, tagShape, tagSize, tagColor, slotLabel, tagSlot, optionSlot, contentSlot, mainButtonLabel: mainButtonLabelProp, mainButtonOutline, mainButtonDisabled, subButtonLabel, onOk, onCancel, onClose, }: SConfirmModalProps): import("react").JSX.Element;
@@ -59,7 +59,7 @@
59
59
  |------|------|---------|-------------|
60
60
  | `value?` | `string` | — | 값 (제어) — HTML 문자열 |
61
61
  | `defaultValue?` | `string` | — | 초기값 (비제어) — HTML 문자열 |
62
- | `placeholder?` | `string` | `'내용을 입력해 주세요.'` | 빈 문서에 보일 안내 문구 |
62
+ | `placeholder?` | `string` | — | 빈 문서에 보일 안내 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "내용을 입력해 주세요.")를 쓴다 |
63
63
  | `minHeight?` | `number \| string` | `200` | 편집 영역 최소 높이 (숫자=px) |
64
64
  | `maxHeight?` | `number \| string` | — | 편집 영역 최대 높이 (숫자=px). 넘으면 편집 영역 안에서만 스크롤한다 |
65
65
  | `simple?` | `boolean` | `false` | **글자에 거는 서식만** 남긴다 — 목록·정렬·인용·코드·링크·이미지·구분선이 빠진다. 막대와 버블 메뉴 양쪽에 함께 걸린다 (한쪽에만 남으면 아무것도 막지 못한다). 받은 글의 문단 구조까지 작성자를 따라가면 곤란한 자리 — 좁은 칸의 메모·사유·짧은 안내문 — 에 쓴다. 반대로 서식이 아예 필요 없다면 `SEditor` 가 아니라 `STextarea` 다. |
@@ -30,7 +30,7 @@ export interface SEditorProps {
30
30
  defaultValue?: string;
31
31
  /** 값 변경 (sdUpdate) — 빈 문서면 빈 문자열을 준다 */
32
32
  onValueChange?: (html: string) => void;
33
- /** 빈 문서에 보일 안내 문구 */
33
+ /** 빈 문서에 보일 안내 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "내용을 입력해 주세요.")를 쓴다 */
34
34
  placeholder?: string;
35
35
  /** 편집 영역 최소 높이 (숫자=px) */
36
36
  minHeight?: number | string;
@@ -47,6 +47,10 @@ export declare const SEDITOR_SIMPLE_BUBBLE_MENU: SEditorToolbarItem[];
47
47
  /** 제목 단계 — 본문 12px 위로 14 / 16 / 18 (DS 타이포 heading sm·md·lg) */
48
48
  export declare const SEDITOR_HEADING_LEVELS: readonly [1, 2, 3];
49
49
  export type SEditorHeadingLevel = (typeof SEDITOR_HEADING_LEVELS)[number];
50
+ /**
51
+ * 저장된 HTML 을 읽는 화면이 제목 단계를 부를 때 쓰는 한국어 기본 라벨이다.
52
+ * 에디터 툴바는 이 값이 아니라 `SLocaleProvider` 로케일(`editor.heading`·`editor.headingBody`)을 따른다.
53
+ */
50
54
  export declare const SEDITOR_HEADING_LABELS: Record<SEditorHeadingLevel | 0, string>;
51
55
  /**
52
56
  * 글자 크기 선택지 (px) — 워드프로세서의 눈금과 같은 단계다.
@@ -78,7 +82,10 @@ export interface SEditorColorOption {
78
82
  * 이미 저장된 글도 따라간다. 대신 **DS `theme.css` 가 없는 환경(메일 본문 등)으로 그대로
79
83
  * 내보내면 색이 풀린다** — 그런 반출이 필요하면 내보내는 쪽에서 토큰을 실제 색으로 푼다.
80
84
  */
81
- export declare const SEDITOR_DEFAULT_COLORS: SEditorColorOption[];
85
+ export declare const SEDITOR_DEFAULT_COLORS: (SEditorColorOption & {
86
+ /** 로케일 메시지(`editor.*`)에서 라벨을 찾는 키 — `label` 은 한국어 기본값이다 */
87
+ key: 'colorDefault' | 'colorSecondary' | 'colorMuted' | 'colorAccent' | 'colorBrand' | 'colorSuccess' | 'colorWarning' | 'colorDanger';
88
+ })[];
82
89
  /**
83
90
  * ProseMirror 가 만드는 요소에 붙는 클래스 — 자식 선택자의 기준점이 된다.
84
91
  *
@@ -50,7 +50,7 @@ export type SFooterSize = 'sm' | 'md';
50
50
  * **`size` 만 뺀다.** 버튼 크기는 놓이는 위치가 정하므로 footer 의 `size` 가 정한다
51
51
  * (AGENTS.md §3-5-2) — 버튼이 자기 크기를 따로 주장할 자리가 아니다.
52
52
  *
53
- * `label`·`color` 는 주지 않으면 footer 가 주 액션 기본값(`'확인'`·`'primary'`)으로 잡는다.
53
+ * `label`·`color` 는 주지 않으면 footer 가 주 액션 기본값(로케일의 "확인"·`'primary'`)으로 잡는다.
54
54
  * 파괴적 액션이라 `danger` 가 필요한 경우는 열어 둔다 (§3-5-3).
55
55
  */
56
56
  export type SFooterButton = Omit<SButtonProps, 'size'>;
@@ -18,7 +18,7 @@ export type SFooterSize = 'sm' | 'md';
18
18
  * **`size` 만 뺀다.** 버튼 크기는 놓이는 위치가 정하므로 footer 의 `size` 가 정한다
19
19
  * (AGENTS.md §3-5-2) — 버튼이 자기 크기를 따로 주장할 자리가 아니다.
20
20
  *
21
- * `label`·`color` 는 주지 않으면 footer 가 주 액션 기본값(`'확인'`·`'primary'`)으로 잡는다.
21
+ * `label`·`color` 는 주지 않으면 footer 가 주 액션 기본값(로케일의 "확인"·`'primary'`)으로 잡는다.
22
22
  * 파괴적 액션이라 `danger` 가 필요한 경우는 열어 둔다 (§3-5-3).
23
23
  */
24
24
  export type SFooterButton = Omit<SButtonProps, 'size'>;
@@ -118,7 +118,3 @@ export declare const GNB_SYSTEM_LAYOUT: {
118
118
  * 전용 토큰이 없어 시안 값을 상수로 둔다.
119
119
  */
120
120
  export declare const GNB_SYSTEM_ALERT_DOT_SIZE = 6;
121
- /** 알림 버튼 기본 라벨 */
122
- export declare const GNB_SYSTEM_ALERT_LABEL = "\uC54C\uB9BC";
123
- /** 설정 버튼 기본 라벨 */
124
- export declare const GNB_SYSTEM_SETTING_LABEL = "\uC124\uC815";
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `type?` | `SGuideType` | `'tip'` | 가이드 타입 (tip: 팝업, notion: 외부 링크) |
12
- | `label?` | `string` | `''` | 버튼 레이블 (없으면 type 기본값) |
12
+ | `label?` | `string` | `''` | 버튼 레이블. 생략하면 type 별 기본 문구(tip: "활용 TIP", notion: "사용법 안내" — `SLocaleProvider` 로케일을 따른다) |
13
13
  | `message?` | `SGuideMessage` | `''` | 팝업 메시지 (배열이면 리스트, 중첩 배열이면 depth 표현) |
14
14
  | `url?` | `string` | `''` | notion 타입 클릭 시 이동 URL |
15
15
  | `popupTitle?` | `string` | `''` | 팝업 제목 (없으면 type 기본값) |
@@ -5,7 +5,7 @@ export type SGuideMessage = string | SGuideMessage[];
5
5
  export interface SGuideProps {
6
6
  /** 가이드 타입 (tip: 팝업, notion: 외부 링크) */
7
7
  type?: SGuideType;
8
- /** 버튼 레이블 (없으면 type 기본값) */
8
+ /** 버튼 레이블. 생략하면 type 별 기본 문구(tip: "활용 TIP", notion: "사용법 안내" — `SLocaleProvider` 로케일을 따른다) */
9
9
  label?: string;
10
10
  /** 팝업 메시지 (배열이면 리스트, 중첩 배열이면 depth 표현) */
11
11
  message?: SGuideMessage;
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `name` | `SIconName` | — | 아이콘명 |
12
- | `size?` | `number \| string` | `24` | 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다 |
12
+ | `size?` | `number \| string` | `24` | 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다. 8 · 10 · 12 · 16 · 20 · 24 · 32 에서는 stroke 아이콘의 선 두께가 화면 px 로 고정돼 작게 줄여도 선이 흐려지지 않는다. 그 밖의 크기와 CSS 길이는 선 두께가 크기에 비례해 줄어든다 |
13
13
  | `color?` | `SColor` | — | 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상. 미지정 시 currentColor 상속 |
14
14
  | `rotate?` | `0 \| 90 \| 180 \| 270` | — | 회전 각도 |
15
15
  | `label?` | `string` | — | 접근성 라벨. 없으면 aria-hidden 처리 |
@@ -4,7 +4,11 @@ import { type SIconName } from './icons.gen';
4
4
  export interface SIconProps {
5
5
  /** 아이콘명 */
6
6
  name: SIconName;
7
- /** 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다 */
7
+ /**
8
+ * 아이콘 크기(px 또는 CSS 길이). 토큰 크기 `var(--cmp-…)` 도 그대로 넘긴다.
9
+ * 8 · 10 · 12 · 16 · 20 · 24 · 32 에서는 stroke 아이콘의 선 두께가 화면 px 로 고정돼 작게 줄여도
10
+ * 선이 흐려지지 않는다. 그 밖의 크기와 CSS 길이는 선 두께가 크기에 비례해 줄어든다
11
+ */
8
12
  size?: number | string;
9
13
  /** 아이콘 색상. 팔레트 키(`grey_65`, `red_95` …) 또는 임의 CSS 색상. 미지정 시 currentColor 상속 */
10
14
  color?: SColor;
@@ -1,7 +1,9 @@
1
1
  import type { SVGProps } from 'react';
2
2
  export type IconRenderProps = {
3
3
  size?: number | string;
4
- } & SVGProps<SVGSVGElement>;
4
+ /** stroke 아이콘의 선 두께(화면 px). 주면 크기와 무관하게 고정되고, 없으면 24 격자 기준 1.5 로 함께 축소된다 */
5
+ strokeWidth?: number;
6
+ } & Omit<SVGProps<SVGSVGElement>, 'strokeWidth'>;
5
7
  export declare const ICONS: {
6
8
  readonly account: (p: IconRenderProps) => import("react").JSX.Element;
7
9
  readonly add: (p: IconRenderProps) => import("react").JSX.Element;
@@ -11,8 +11,8 @@
11
11
  | `size?` | `SMeatballButtonSize` | `'sm'` | 버튼 크기 |
12
12
  | `intent?` | `SMeatballButtonIntent` | `'default'` | 색상 의도. 어두운 배경 위에서는 inverse |
13
13
  | `items?` | `SMeatballButtonItem[]` | `[]` | 메뉴 항목 목록 |
14
- | `tooltipText?` | `string` | `'기능 더 보기'` | 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. |
15
- | `ariaLabel?` | `string` | — | 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 '기능 더 보기' |
14
+ | `tooltipText?` | `string` | — | 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "기능 더 보기")를 쓴다. |
15
+ | `ariaLabel?` | `string` | — | 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 로케일의 기본 문구(ko: '기능 더 보기') |
16
16
  | `disabled?` | `boolean` | `false` | 비활성 |
17
17
  | `className?` | `string` | — | 버튼을 감싸는 요소의 클래스. 위치 조정(absolute 배치 등)용 |
18
18
  | `style?` | `CSSProperties` | — | 버튼을 감싸는 요소의 스타일. 위치 조정용 |
@@ -18,9 +18,12 @@ export interface SMeatballButtonProps {
18
18
  intent?: SMeatballButtonIntent;
19
19
  /** 메뉴 항목 목록 */
20
20
  items?: SMeatballButtonItem[];
21
- /** 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다. */
21
+ /**
22
+ * 호버 시 표시할 툴팁 텍스트. 빈 문자열이면 툴팁을 띄우지 않는다. 메뉴가 열려 있는 동안은 숨는다.
23
+ * 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "기능 더 보기")를 쓴다.
24
+ */
22
25
  tooltipText?: string;
23
- /** 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 '기능 더 보기' */
26
+ /** 스크린리더용 접근성 레이블. 미지정 시 tooltipText, 그것도 비면 로케일의 기본 문구(ko: '기능 더 보기') */
24
27
  ariaLabel?: string;
25
28
  /** 비활성 */
26
29
  disabled?: boolean;
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `open?` | `boolean` | — | 표시 여부 (제어) |
12
- | `ariaTitle?` | `string` | `'모달'` | 접근성 제목 (스크린리더용). 시각 제목은 children이 담당 |
12
+ | `ariaTitle?` | `string` | — | 접근성 제목 (스크린리더용). 시각 제목은 children이 담당. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "모달")를 쓴다. |
13
13
  | `showClose?` | `boolean` | `false` | 우측 상단 닫기 버튼 |
14
14
  | `persistent?` | `boolean` | `true` | 백드롭 클릭·ESC로 닫히지 않고 흔들림(shake) 애니메이션 (sd-modal-container persistent). **기본값 true** — 모달은 작성 중인 내용을 잃지 않도록 임의 닫힘을 막는 것이 기본이다. 닫기 경로는 X 버튼과 모달 안의 버튼뿐이다. false로 주면 백드롭·ESC 닫기가 열린다. |
15
15
  | `width?` | `number \| string` | — | 너비/높이 |
@@ -9,7 +9,10 @@ export interface SModalContainerProps {
9
9
  open?: boolean;
10
10
  /** 표시 상태 변경 */
11
11
  onOpenChange?: (open: boolean) => void;
12
- /** 접근성 제목 (스크린리더용). 시각 제목은 children이 담당 */
12
+ /**
13
+ * 접근성 제목 (스크린리더용). 시각 제목은 children이 담당.
14
+ * 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "모달")를 쓴다.
15
+ */
13
16
  ariaTitle?: string;
14
17
  /** 우측 상단 닫기 버튼 */
15
18
  showClose?: boolean;
@@ -38,4 +41,4 @@ export interface SModalContainerProps {
38
41
  * 소비자는 직접 import 할 수 없고, SConfirmModal/SActionModal/SLoadingModal 세 모달의
39
42
  * 공통 컨테이너로만 조합해 쓴다. barrel(src/index.ts)에 다시 추가하지 말 것.
40
43
  */
41
- export declare function SModalContainer({ open, onOpenChange, ariaTitle, showClose, onClose, persistent, width, height, children, className, style, }: SModalContainerProps): import("react").JSX.Element;
44
+ export declare function SModalContainer({ open, onOpenChange, ariaTitle: ariaTitleProp, showClose, onClose, persistent, width, height, children, className, style, }: SModalContainerProps): import("react").JSX.Element;
@@ -23,7 +23,7 @@
23
23
  | `inputStyle?` | `CSSProperties` | — | 네이티브 input style |
24
24
  | `autoFocus?` | `boolean` | — | 마운트 시 자동 포커스 |
25
25
  | `name?` | `string` | — | 폼 연동 name |
26
- | `placeholder?` | `string` | `'입력해 주세요.'` | |
26
+ | `placeholder?` | `string` | — | |
27
27
  | `disabled?` | `boolean` | `false` | |
28
28
  | `readOnly?` | `boolean` | `false` | |
29
29
  | `rules?` | `Rule[]` | — | 유효성 규칙 — blur 시 검증 |
@@ -10,7 +10,7 @@
10
10
  |------|------|---------|-------------|
11
11
  | `value?` | `string \| number` | — | 값 (제어) |
12
12
  | `size?` | `SSearchInputSize` | `'sm'` | 크기 |
13
- | `placeholder?` | `string` | `'결과 내 검색'` | 플레이스홀더 |
13
+ | `placeholder?` | `string` | — | 플레이스홀더. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "결과 내 검색")를 쓴다 |
14
14
  | `clearable?` | `boolean` | `false` | 지우기 버튼 — 값이 있을 때만 나타난다 |
15
15
  | `disabled?` | `boolean` | `false` | 비활성 |
16
16
  | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. 미지정 시 부모 폭을 채운다. |
@@ -16,7 +16,7 @@ export interface SSearchInputProps extends Omit<InputHTMLAttributes<HTMLInputEle
16
16
  onSearch?: (value: string) => void;
17
17
  /** 크기 */
18
18
  size?: SSearchInputSize;
19
- /** 플레이스홀더 */
19
+ /** 플레이스홀더. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "결과 내 검색")를 쓴다 */
20
20
  placeholder?: string;
21
21
  /** 지우기 버튼 — 값이 있을 때만 나타난다 */
22
22
  clearable?: boolean;
@@ -13,7 +13,7 @@
13
13
  | `size?` | `SStepperSize` | `'sm'` | 크기 |
14
14
  | `vertical?` | `boolean` | `false` | 세로형 여부 |
15
15
  | `clickable?` | `boolean` | — | 단계 클릭 가능 여부. 미지정 시 가로형=false, 세로형=true |
16
- | `ariaLabel?` | `string` | `'진행 단계'` | 접근성 레이블 |
16
+ | `ariaLabel?` | `string` | — | 접근성 레이블. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "진행 단계")를 쓴다 |
17
17
  | `className?` | `string` | — | |
18
18
  | `style?` | `CSSProperties` | — | |
19
19
 
@@ -13,7 +13,7 @@ export interface SStepperProps {
13
13
  clickable?: boolean;
14
14
  /** 단계 선택 시 호출 */
15
15
  onValueChange?: (value: string, item: SStepperItem, index: number) => void;
16
- /** 접근성 레이블 */
16
+ /** 접근성 레이블. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "진행 단계")를 쓴다 */
17
17
  ariaLabel?: string;
18
18
  className?: string;
19
19
  style?: CSSProperties;
@@ -22,7 +22,7 @@ export interface SStepperProps {
22
22
  * ref 로 노출되는 커스텀 툴팁 제어 API. 세로형 전용 — items 중 error 가 true 인 첫 번째
23
23
  * 아이템의 텍스트+뱃지 영역에 표시된다.
24
24
  *
25
- * 지금은 대상(첫 번째 error 아이템 하나)·문구·스타일이 hover 툴팁(ERROR_TOOLTIP_MESSAGE, danger)과
25
+ * 지금은 대상(첫 번째 error 아이템 하나)·문구·스타일이 hover 툴팁(로케일의 stepper.errorTooltip, danger)과
26
26
  * 동일하게 고정되어 있다 — 열고 닫는 타이밍만 소비자가 제어한다. 대상 아이템을 지정하거나
27
27
  * content·type 을 커스터마이즈하는 기능은 필요해지면 추가한다(지금은 만들지 않음).
28
28
  */
@@ -14,7 +14,7 @@
14
14
  | `rowKey?` | `string` | `'id'` | 행 식별 필드 |
15
15
  | `selectable?` | `boolean` | `false` | 행 선택 체크박스 |
16
16
  | `rowSelectLabel?` | `(row: TRow) => string` | — | 행 선택 체크박스의 접근성 이름 — 화면 낭독기가 어느 행의 체크박스인지 읽게 한다. 그 행을 가리키는 글자(주문번호·상품명 등)로 만든다: `row => \`${row.orderNo} 선택\``. 주지 않으면 모든 행이 `행 선택` 으로 읽혀 행끼리 구분되지 않는다. |
17
- | `selectAllLabel?` | `string` | `'전체 선택'` | 헤더 전체 선택 체크박스의 접근성 이름 |
17
+ | `selectAllLabel?` | `string` | — | 헤더 전체 선택 체크박스의 접근성 이름. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "전체 선택")를 쓴다 |
18
18
  | `dragSelectable?` | `boolean` | `false` | 행을 드래그해서 고른다. 기본 `false`. 고르는 수단만 다를 뿐 `selectable` 과 같은 선택이다 — `selected` · `onSelectedChange` · `isRowSelectable` 을 그대로 쓴다. 체크박스 열은 생기지 않고, 대신 고른 구간이 배경색과 바깥 테두리로 표시된다. **`selectable` 과 함께 켜면 `selectable` 이 이긴다** — 체크박스가 있는 표에서 드래그까지 걸리면 글자를 긁으려던 손이 선택을 갈아치운다. 둘 다 필요해 보이면 체크박스 쪽만 남긴다. 누른 자리가 구간의 기준점이고, 끌어간 자리까지가 구간이다. **새로 끌면 이전 선택은 풀린다** — 기존 선택에 더하려면 `Ctrl`(macOS 는 `Cmd`)을 짚고 끈다. 잠긴 행(`isRowSelectable`)은 구간 안에 있어도 그냥 지나간다. **켜 두면 셀 안의 글자를 긁어 복사할 수 없다** — 끌기가 곧 선택이라 글자 선택과 같은 손짓을 두고 다툰다. 값을 복사해 가는 표에는 켜지 않는다. 셀 안의 버튼·입력은 그대로 눌린다. |
19
19
  | `contextMenuItems?` | `STableContextMenuItem[]` | — | 드래그 선택에서 **행을 오른쪽 클릭했을 때** 커서 자리에 뜨는 메뉴의 항목. 주지 않거나 비면 메뉴가 뜨지 않고 브라우저 기본 메뉴가 나온다. **`dragSelectable` 에서만 동작한다** — 체크박스 모드에서는 무시된다. 고르지 않은 행에서 누르면 **그 행만 고른 뒤** 열린다. 메뉴가 다룰 대상과 화면에 칠해진 것이 어긋나지 않게 하기 위함이다. 잠긴 행(`isRowSelectable`) 위에서는 열리지 않는다 — 고를 수 없는 행을 대상으로 삼을 수 없기 때문이다. |
20
20
  | `isRowSelectable?` | `(row: TRow) => boolean` | — | 이 행을 고를 수 있는가. 주지 않으면 모든 행을 고를 수 있다. 고를 수 없는 행은 체크박스가 잠기고, **전체 선택·Shift 구간 선택의 셈에서도 빠진다** — 잠긴 행이 셈에 남으면 "전부 선택됨"에 닿지 못해 헤더 체크박스가 해제 방향으로 가지 못한다. 목록에서 지워 버리는 것과 다르다. 실패 0건인 차수처럼 **자리는 보여야 하지만 대상이 될 수는 없는 행**에 쓴다. 아예 대상이 아니라면 `rows` 에서 거르는 편이 낫다. 잠금은 그리기 시점의 판정일 뿐이라, 이미 `selected` 에 든 행이 나중에 잠겨도 DS 가 빼지 않는다(제어 상태를 말없이 바꾸지 않는다). 다만 헤더의 전체 해제로는 걷어낼 수 있다. |
@@ -28,7 +28,7 @@
28
28
  | `stickyColumn?` | `STableStickyColumn` | — | 고정할 좌/우 컬럼 수 |
29
29
  | `radius?` | `'default' \| 'useTop' \| 'full'` | `'default'` | border-radius 제어 |
30
30
  | `bordered?` | `boolean` | `true` | 바깥 테두리. 기본은 `true`. `SSectionHeaderCard` 의 `padding="none"` 안에 넣어 카드 가장자리까지 채울 때 `false` 로 끈다 — 카드가 이미 바깥 테두리를 그리므로, 켜 두면 1px 두 개가 나란히 놓여 그 변만 2px 로 보인다. 페이지네이션 바의 테두리와 1px 겹침(`-mt-px`)도 함께 꺼진다. 본문 테두리가 없으면 겹칠 대상이 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다. |
31
- | `emptyLabel?` | `string` | `'데이터가 없습니다.'` | |
31
+ | `emptyLabel?` | `string` | — | 데이터가 없을 때 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "데이터가 없습니다.")를 쓴다 |
32
32
  | `emptySlot?` | `ReactNode` | — | 데이터가 없을 때 body 영역 전체를 대체하는 슬롯. 지정하면 `emptyLabel` 대신 이 콘텐츠가 헤더 아래 영역을 채우며, 버튼 등 인터랙션도 동작한다. |
33
33
  | `loading?` | `boolean` | `false` | |
34
34
  | `dense?` | `boolean` | `false` | 행 높이를 좁게 (세로 여백만 줄인다 — 좌우 패딩은 그대로). **시작 밀도이자 밀도 토글의 스위치다.** 켜면 하단 바 우측에 `좁게 보기` · `넓게 보기` 토글이 붙는다 — 페이지네이션이 없으면 이 바를 토글만 담아 그린다. 누른 뒤의 밀도는 테이블이 내부 상태로 들고 가므로 `onDenseChange` 를 받지 않아도 토글은 동작하고, 넓게 본 뒤에도 토글은 그대로 남는다(붙일지는 이 prop 이 정한다). 이 prop 값이 바뀌면 내부 밀도도 그 값으로 맞춰진다. |
@@ -36,7 +36,7 @@
36
36
  | `pagination?` | `STablePagination` | — | 페이지네이션 (있으면 하단 표시) |
37
37
  | `internalPagination?` | `boolean` | `false` | 테이블 내부에서 페이지네이션을 직접 관리 (rows를 내부 슬라이싱) |
38
38
  | `showRowsPerPageSelect?` | `boolean` | `false` | 페이지당 행 수 셀렉트 표시 |
39
- | `rowsPerPageOption?` | `SSelectOption[]` | `DEFAULT_ROWS_PER_PAGE_OPTION` | |
39
+ | `rowsPerPageOption?` | `SSelectOption[]` | — | 페이지당 행 수 선택지. 생략하면 10·25·50·100 을 `SLocaleProvider` 로케일 문구(ko: "10개씩 보기")로 보여 준다 |
40
40
  | `virtualScroll?` | `boolean` | `false` | 가상 스크롤 |
41
41
  | `rowHeight?` | `number` | — | 행 높이의 **출발점**(px). 미지정이면 밀도에 따라 44 / 32. 행마다 높이가 달라도 된다 — 화면에 나온 행은 실제 높이를 재서 덮으므로, 이 값은 **아직 안 그려진 행의 추정치**이자 행의 최소 높이일 뿐이다. 실측이 쌓일수록 뒤쪽 추정도 그 평균으로 수렴한다. 그래서 높이가 제각각인 표에서 "가장 흔한 높이"를 넣어 두면 충분하다. 값이 실제와 멀수록 아직 안 그려진 구간의 스크롤바 길이만 덜 정확할 뿐, 그리는 위치는 어긋나지 않는다. |
42
42
  | `virtualBuffer?` | `number` | `5` | |
@@ -259,7 +259,7 @@ export interface STableProps<TRow extends SRow = SRow> {
259
259
  * 주지 않으면 모든 행이 `행 선택` 으로 읽혀 행끼리 구분되지 않는다.
260
260
  */
261
261
  rowSelectLabel?: (row: TRow) => string;
262
- /** 헤더 전체 선택 체크박스의 접근성 이름 */
262
+ /** 헤더 전체 선택 체크박스의 접근성 이름. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "전체 선택")를 쓴다 */
263
263
  selectAllLabel?: string;
264
264
  /**
265
265
  * 행을 드래그해서 고른다. 기본 `false`.
@@ -363,6 +363,7 @@ export interface STableProps<TRow extends SRow = SRow> {
363
363
  * 없어, 그대로 두면 페이지네이션만 테두리를 갖고 1px 어긋난다.
364
364
  */
365
365
  bordered?: boolean;
366
+ /** 데이터가 없을 때 문구. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "데이터가 없습니다.")를 쓴다 */
366
367
  emptyLabel?: string;
367
368
  /**
368
369
  * 데이터가 없을 때 body 영역 전체를 대체하는 슬롯.
@@ -395,6 +396,7 @@ export interface STableProps<TRow extends SRow = SRow> {
395
396
  internalPagination?: boolean;
396
397
  /** 페이지당 행 수 셀렉트 표시 */
397
398
  showRowsPerPageSelect?: boolean;
399
+ /** 페이지당 행 수 선택지. 생략하면 10·25·50·100 을 `SLocaleProvider` 로케일 문구(ko: "10개씩 보기")로 보여 준다 */
398
400
  rowsPerPageOption?: SSelectOption[];
399
401
  onRowsPerPageChange?: (perPage: number) => void;
400
402
  /** 가상 스크롤 */
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `title?` | `ReactNode` | — | 건수 앞에 서는 제목 슬롯. 이 바가 무엇의 목록인지 말한다. 문자열을 주면 바의 기본 타이포로 그린다. 다른 모양이 필요하면 요소를 통째로 넘긴다 — 슬롯이라 안에 무엇이 오든 자리만 잡아 준다. |
12
- | `total?` | `number` | — | 전체 건수. 지정하면 "총 N 건" 을 표시한다 (천단위 구분 자동) |
12
+ | `total?` | `number` | — | 전체 건수. 지정하면 "총 N 건" 을 표시한다 (천단위 구분 자동, 문구는 `SLocaleProvider` 로케일을 따른다) |
13
13
  | `selected?` | `number` | — | 선택 건수. 지정하면 "N건 선택" 을 표시한다 |
14
14
  | `actions?` | `ReactNode` | — | 구분선 오른쪽 좌측 액션 영역 |
15
15
  | `rightActions?` | `ReactNode` | — | 우측 정렬 액션 영역 |
@@ -7,7 +7,7 @@ export interface STableBarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
7
7
  * 슬롯이라 안에 무엇이 오든 자리만 잡아 준다.
8
8
  */
9
9
  title?: ReactNode;
10
- /** 전체 건수. 지정하면 "총 N 건" 을 표시한다 (천단위 구분 자동) */
10
+ /** 전체 건수. 지정하면 "총 N 건" 을 표시한다 (천단위 구분 자동, 문구는 `SLocaleProvider` 로케일을 따른다) */
11
11
  total?: number;
12
12
  /** 선택 건수. 지정하면 "N건 선택" 을 표시한다 */
13
13
  selected?: number;
@@ -1,3 +1,4 @@
1
+ import { type SLocaleMessages } from '../../lib/locale';
1
2
  import { type SFieldWidthGrade } from '../../lib/field-width';
2
3
  export type STimePickerSize = 'sm' | 'md';
3
4
  export type STimePickerType = 'default' | 'midday';
@@ -30,4 +31,4 @@ export declare function parseTimeValue(value: string | null | undefined): {
30
31
  minute: number;
31
32
  };
32
33
  export declare function formatTimeValue(hour: number, minute: number): string;
33
- export declare function formatTimeDisplay(value: string | null | undefined, type: STimePickerType): string;
34
+ export declare function formatTimeDisplay(value: string | null | undefined, type: STimePickerType, t: SLocaleMessages['date']): string;
@@ -1,3 +1,4 @@
1
+ import { type SLocaleMessages } from '../../lib/locale';
1
2
  import { TIMEPICKER_SIZE_CONFIG, clampTimePart, formatTimeDisplay, formatTimeValue, parseTimeValue, type STimePickerMeridiem, type STimePickerSize, type STimePickerType } from '../STimePicker/timepicker.config';
2
3
  export type STimeRangePickerSize = STimePickerSize;
3
4
  export type STimeRangePickerType = STimePickerType;
@@ -6,4 +7,4 @@ export type STimeRangePickerRangeOrder = 'strict' | 'allow-cross-day';
6
7
  export type STimeRangeValue = [string, string] | null;
7
8
  export { TIMEPICKER_SIZE_CONFIG as TIME_RANGE_PICKER_SIZE_CONFIG, clampTimePart, formatTimeDisplay, formatTimeValue, parseTimeValue, };
8
9
  export declare function normalizeTimeRangeValue(value: STimeRangeValue, rangeOrder?: STimeRangePickerRangeOrder): STimeRangeValue;
9
- export declare function formatTimeRangeDisplay(value: STimeRangeValue, type: STimeRangePickerType): string;
10
+ export declare function formatTimeRangeDisplay(value: STimeRangeValue, type: STimeRangePickerType, t: SLocaleMessages['date']): string;
@@ -9,7 +9,7 @@
9
9
  | Prop | Type | Default | Description |
10
10
  |------|------|---------|-------------|
11
11
  | `groups` | `STimelineGroup[]` | — | 머리글로 묶은 항목 목록. 순서 그대로 그린다 |
12
- | `emptyText?` | `ReactNode` | `'내역이 없습니다.'` | 항목이 하나도 없을 때 가운데 띄우는 안내. 불러오는 중에는 `null` 을 넘겨 빈 안내가 먼저 깜빡이지 않게 한다. |
12
+ | `emptyText?` | `ReactNode` | — | 항목이 하나도 없을 때 가운데 띄우는 안내. 불러오는 중에는 `null` 을 넘겨 빈 안내가 먼저 깜빡이지 않게 한다. 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "내역이 없습니다.")를 쓴다. |
13
13
 
14
14
  ## Types
15
15
 
@@ -21,6 +21,7 @@ export interface STimelineProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
21
21
  /**
22
22
  * 항목이 하나도 없을 때 가운데 띄우는 안내.
23
23
  * 불러오는 중에는 `null` 을 넘겨 빈 안내가 먼저 깜빡이지 않게 한다.
24
+ * 생략하면 `SLocaleProvider` 로케일의 기본 문구(ko: "내역이 없습니다.")를 쓴다.
24
25
  */
25
26
  emptyText?: ReactNode;
26
27
  }