sellmate-design-system-react 9.0.0-beta.91 → 9.0.0-beta.92

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 CHANGED
@@ -1888,6 +1888,13 @@ useEffect(() => {
1888
1888
 
1889
1889
  **`SKeyValueTable` 안에서는 필드마다 `maxWidth` 를 주지 않는다.** 표 안에서 이 상한이 거슬리는 이유는 대개 "같은 행의 다른 필드와 오른쪽 끝이 어긋난다" 이고, 그건 표 전체의 문제다. 표의 `fieldWidth="fill"` 로 한 번에 정한다 (§4-3). 그 표에서 한 필드만 예외로 둘 때만 `options.maxWidth` 를 쓴다.
1890
1890
 
1891
+ ##### 시간 피커 — 분 간격은 `minuteStep`, 범위 순서는 `rangeOrder`
1892
+
1893
+ `STimePicker`·`STimeRangePicker` 는 `[오전/오후] | 시 | 분` 리스트에서 고른다 (직접 타이핑하지 않는다).
1894
+
1895
+ - **분 간격은 `minuteStep` 으로 정한다.** 분 리스트에 그 간격의 분만 나열되므로, 고른 값을 앱에서 다시 반올림하거나 `rules` 로 간격을 검사하지 않는다.
1896
+ - **`STimeRangePicker` 의 "종료가 시작보다 이르면 안 된다" 는 앱이 검증하지 않는다.** 기본 `rangeOrder="strict"` 가 종료 리스트에서 그 시각을 비활성으로 막는다. 자정을 넘는 범위(야간 근무 22:00~02:00 등)를 받아야 할 때만 `rangeOrder="allow-cross-day"` 를 준다.
1897
+
1891
1898
  ##### 값을 지울 수 있게 하려면 `clearable`
1892
1899
 
1893
1900
  `SSelect` · `SDatePicker` · `SDateRangePicker` · `STimePicker` · `STimeRangePicker` 가 같은 규칙으로 갖는다. 값이 있을 때만 지우기 버튼이 나타나고, 누르면 **`onValueChange` 로 `null` 이 온다** (빈 문자열이 아니다). 받는 쪽 상태도 `null` 을 담을 수 있어야 한다.
@@ -52,7 +52,7 @@ export interface SGnbSystemAlert {
52
52
  /** 라벨 텍스트. 기본 `'알림'` */
53
53
  label?: string;
54
54
  /**
55
- * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수가 붙는다.
55
+ * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수 배지가 붙는다.
56
56
  * 개수를 적을 가로가 모자란 자리(접힌 레일 · 기본 폭보다 좁게 줄인 판)에서는 점 배지로 바뀐다.
57
57
  * 표기는 컴포넌트가 맡는다 — 세 자리마다 콤마를 넣어 그리므로 앱이 포맷한 문자열을 넘기지 않는다.
58
58
  */
@@ -154,7 +154,9 @@ export interface SGnbSystemAccount {
154
154
  * 타이포그래피는 CSS 변수가 아니라 `.typo-*` 프리셋으로 나온다.
155
155
  * domainTag.typography → typo-body-sm-medium (12/500/20)
156
156
  * item.label.typography → typo-body-sm-semibold (12/600/20)
157
- * alertButton.count → typo-body-md-bold (13/700/22)
157
+ *
158
+ * 알림 개수는 글자가 아니라 배지(`STag` xs · deep)로 그린다 — 배경·글자색·치수는 태그 토큰
159
+ * (`--cmp-tag-*`)이 쥔다.
158
160
  */
159
161
 
160
162
  /** 색상(표면). light = 흰 면, dark = 오션블루 면. GNB 의 color 를 그대로 따라간다 */
@@ -170,6 +172,7 @@ export const GNB_SYSTEM_COLORS = ['light', 'dark'] as const;
170
172
  - [SIcon](../SIcon)
171
173
  - [SPortal](../SPortal)
172
174
  - [SSystemActionButton](../SSystemActionButton)
175
+ - [STag](../STag)
173
176
  - [STooltip](../STooltip)
174
177
 
175
178
  ### Graph
@@ -181,6 +184,7 @@ graph TD;
181
184
  SGnbSystem --> SIcon
182
185
  SGnbSystem --> SPortal
183
186
  SGnbSystem --> SSystemActionButton
187
+ SGnbSystem --> STag
184
188
  SGnbSystem --> STooltip
185
189
  style SGnbSystem fill:#f9f,stroke:#333,stroke-width:4px
186
190
  ```
@@ -23,7 +23,7 @@ export interface SGnbSystemAlert {
23
23
  /** 라벨 텍스트. 기본 `'알림'` */
24
24
  label?: string;
25
25
  /**
26
- * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수가 붙는다.
26
+ * 읽지 않은 알림 개수. 1 이상이면 벨이 울리는 아이콘·강조색으로 바뀌고 개수 배지가 붙는다.
27
27
  * 개수를 적을 가로가 모자란 자리(접힌 레일 · 기본 폭보다 좁게 줄인 판)에서는 점 배지로 바뀐다.
28
28
  * 표기는 컴포넌트가 맡는다 — 세 자리마다 콤마를 넣어 그리므로 앱이 포맷한 문자열을 넘기지 않는다.
29
29
  */
@@ -156,8 +156,8 @@ export interface SGnbSystemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'c
156
156
  * 접힌 패널은 렌더되지 않으므로, 접힌 상태에서도 닿아야 하는 것은 SGnb 의 `foldedTop`·`foldedFooter` 에 둔다.
157
157
  * 상단바는 접어도 남으므로 `top` 에는 접힘 형태가 없다.
158
158
  *
159
- * `alert.count` 가 1 이상이면 벨이 울리는 아이콘(`bellRinging`)과 강조색으로 바뀐다 — light 는 파랑,
160
- * 어두운 면은 노랑(토큰이 정한다). 0 이거나 없으면 조용한 벨(`bell`)에 기본 색이다.
159
+ * `alert.count` 가 1 이상이면 벨이 울리는 아이콘(`bellRinging`)과 강조색으로 바뀌고 개수 배지가 붙는다 —
160
+ * light 는 파랑 배지에 흰 글자, 어두운 면은 노랑 배지에 검은 글자(토큰이 정한다). 0 이거나 없으면 조용한 벨(`bell`)에 기본 색이다.
161
161
  *
162
162
  * 안내 툴팁(`alert.tooltip`)은 문구를 받은 동안 떠 있다가 알림을 누르거나 커서를 빼면 닫힌다.
163
163
  * 다시 띄우는 신호는 문구가 **없음 → 있음** 으로 바뀌는 것이라, 같은 문구도 비웠다 다시 넘기면
@@ -13,7 +13,9 @@ import type { SSystemActionButtonColor } from '../SSystemActionButton';
13
13
  * 타이포그래피는 CSS 변수가 아니라 `.typo-*` 프리셋으로 나온다.
14
14
  * domainTag.typography → typo-body-sm-medium (12/500/20)
15
15
  * item.label.typography → typo-body-sm-semibold (12/600/20)
16
- * alertButton.count → typo-body-md-bold (13/700/22)
16
+ *
17
+ * 알림 개수는 글자가 아니라 배지(`STag` xs · deep)로 그린다 — 배경·글자색·치수는 태그 토큰
18
+ * (`--cmp-tag-*`)이 쥔다.
17
19
  */
18
20
  /** 색상(표면). light = 흰 면, dark = 오션블루 면. GNB 의 color 를 그대로 따라간다 */
19
21
  export declare const GNB_SYSTEM_COLORS: readonly ["light", "dark"];
@@ -48,7 +50,7 @@ export interface GnbSystemColorTokens {
48
50
  domainText: string;
49
51
  /** 알림이 있을 때의 벨 글리프색 */
50
52
  alertIcon: string;
51
- /** 알림 개수(펼침) · 점 배지(접힘) 색 */
53
+ /** 점 배지(접힘·좁은 판) 색 */
52
54
  alertCount: string;
53
55
  /** 알림이 있을 때의 hover 배경. 없으면 행 기본 hover 를 쓴다 */
54
56
  alertHoverBg?: string;
@@ -73,7 +75,7 @@ export interface GnbSystemTopColorTokens {
73
75
  domainText: string;
74
76
  /** 알림이 있을 때의 벨 글리프색 */
75
77
  alertIcon: string;
76
- /** 알림 개수 색 */
78
+ /** 점 배지 색 (상단바는 점 배지를 쓰지 않지만 색표를 패널과 맞춰 둔다) */
77
79
  alertCount: string;
78
80
  /** 알림이 있을 때의 hover 배경. 없으면 행 기본 hover 를 쓴다 */
79
81
  alertHoverBg?: string;
@@ -15,7 +15,7 @@
15
15
  | `disabled?` | `boolean` | `false` | |
16
16
  | `clearable?` | `boolean` | `false` | |
17
17
  | `showMeridiem?` | `boolean` | — | 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. |
18
- | `minuteStep?` | `number` | `1` | |
18
+ | `minuteStep?` | `number` | `1` | 분 리스트에 나열할 간격(분). 10 이면 `00 10 20 30 40 50` 만 고를 수 있다 |
19
19
  | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
20
20
  | `maxWidth?` | `SFieldWidth` | — | 컨트롤 최대 너비 — 폭 등급 · 숫자=px · CSS 길이. 지정하지 않으면 값 길이(`HH:mm`)에 맞춘 내장 상한(`size='md'` → `lg`, `'sm'` → `md`)이 걸려, `width="100%"` 를 받아도 행 전체로 늘어나지 않는다. 팝오버처럼 폭이 이미 좁게 정해진 자리에서 그 폭을 그대로 채워야 하면 `width="100%"` 와 함께 `maxWidth="100%"` 를 준다. `0` 은 상한을 아예 걸지 않는다 — 부모보다 넓어지는 것까지 허용해야 할 때만 쓴다. |
21
21
  | `name?` | `string` | — | |
@@ -7,6 +7,7 @@ import { type STooltipProps } from '../STooltip';
7
7
  import { type STimePickerSize, type STimePickerType } from './timepicker.config';
8
8
  import { type SFieldWidth } from '../../lib/field-width';
9
9
  export type { STimePickerSize, STimePickerType } from './timepicker.config';
10
+ export { TimeListbox } from './TimeListbox';
10
11
  export interface STimePickerProps {
11
12
  /** 선택 시간 (HH:mm) */
12
13
  value?: string | null;
@@ -22,6 +23,7 @@ export interface STimePickerProps {
22
23
  clearable?: boolean;
23
24
  /** 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. */
24
25
  showMeridiem?: boolean;
26
+ /** 분 리스트에 나열할 간격(분). 10 이면 `00 10 20 30 40 50` 만 고를 수 있다 */
25
27
  minuteStep?: number;
26
28
  /**
27
29
  * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.
@@ -70,11 +72,5 @@ export interface STimePickerProps {
70
72
  className?: string;
71
73
  style?: CSSProperties;
72
74
  }
73
- export declare function TimeSelector({ value, showMeridiem, minuteStep, onChange, }: {
74
- value?: string | null;
75
- showMeridiem: boolean;
76
- minuteStep: number;
77
- onChange: (time: string) => void;
78
- }): import("react").JSX.Element;
79
- /** STimePicker — sd-time-picker 포팅. SField + Popover(TimeSelector). */
75
+ /** STimePicker — sd-time-picker 포팅. SField + Popover(TimeListbox). */
80
76
  export declare function STimePicker({ value, onValueChange, onOpenChange, type, size, placeholder, disabled, clearable, showMeridiem, minuteStep, width, maxWidth, name, rules, status, label, labelPosition, subLabel, labelWidth, icon, iconColor, labelTooltip, labelTooltipProps, addonLabel, addonAlign, hint, error, errorMessage, className, style, }: STimePickerProps): import("react").JSX.Element;
@@ -0,0 +1,21 @@
1
+ /** 리스트에서 고른 열 — STimePicker 는 분을 고르면 팝오버를 닫는다 */
2
+ export type TimeListboxPart = 'meridiem' | 'hour' | 'minute';
3
+ interface TimeListboxProps {
4
+ /** 선택 시간 (HH:mm). 비어 있으면 아무것도 선택되지 않은 채 열린다 */
5
+ value?: string | null;
6
+ showMeridiem: boolean;
7
+ /** 분 열에 나열할 간격 (분) */
8
+ minuteStep: number;
9
+ /** 고를 수 없는 시각 — 자정부터 센 분(0~1439)을 받는다. 시·오전/오후 항목은 그 안의 모든
10
+ * 분을 고를 수 없을 때만 비활성이 된다 */
11
+ isDisabled?: (minutes: number) => boolean;
12
+ onChange: (time: string, part: TimeListboxPart) => void;
13
+ /** 열 접근성 레이블 앞에 붙는 말 — STimeRangePicker 의 "시작"·"종료" */
14
+ labelPrefix?: string;
15
+ /** 그림자·모서리를 두른 떠 있는 상자로 그린다. 다른 상자 안에 넣을 때는 끈다 */
16
+ elevated?: boolean;
17
+ }
18
+ /** TimeListbox — `[오전/오후] | 시 | 분` 을 세로 리스트에서 고르는 시간 선택 조각.
19
+ * SDatePickerMonthListbox(연 | 월)와 같은 스펙이며, STimePicker·STimeRangePicker 팝오버가 쓴다. */
20
+ export declare function TimeListbox({ value, showMeridiem, minuteStep, isDisabled, onChange, labelPrefix, elevated, }: TimeListboxProps): import("react").JSX.Element;
21
+ export {};
@@ -15,8 +15,8 @@
15
15
  | `disabled?` | `boolean` | `false` | |
16
16
  | `clearable?` | `boolean` | `false` | |
17
17
  | `showMeridiem?` | `boolean` | — | 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. |
18
- | `minuteStep?` | `number` | `1` | |
19
- | `rangeOrder?` | `STimeRangePickerRangeOrder` | `'strict'` | 범위 순서 정책. strict는 시작 시간이 종료 시간보다 늦어지지 않도록 보정합니다. |
18
+ | `minuteStep?` | `number` | `1` | 분 리스트에 나열할 간격(분). 10 이면 `00 10 20 30 40 50` 만 고를 수 있다 |
19
+ | `rangeOrder?` | `STimeRangePickerRangeOrder` | `'strict'` | 범위 순서 정책. `strict` 는 종료 리스트에서 시작보다 이른 시각을 비활성으로 막고, 시작을 종료 뒤로 옮기면 종료가 따라온다. `allow-cross-day` 는 제약 없이 고른다(자정을 넘는 범위). |
20
20
  | `width?` | `SFieldWidth` | — | 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이. 등급은 `--cmp-field-width-*` 토큰으로 풀리므로 토큰이 바뀌면 화면이 따라간다. 값 길이에 상한이 없으면 `"100%"` 로 두어 행 전체를 쓴다. |
21
21
  | `maxWidth?` | `SFieldWidth` | — | 컨트롤 최대 너비 — 폭 등급 · 숫자=px · CSS 길이. 지정하지 않으면 값 길이(`HH:mm ~ HH:mm`)에 맞춘 내장 상한이 걸려, `width="100%"` 를 받아도 행 전체로 늘어나지 않는다. 팝오버처럼 폭이 이미 좁게 정해진 자리에서 그 폭을 그대로 채워야 하면 `width="100%"` 와 함께 `maxWidth="100%"` 를 준다. `0` 은 상한을 아예 걸지 않는다 — 부모보다 넓어지는 것까지 허용해야 할 때만 쓴다. |
22
22
  | `name?` | `string` | — | |
@@ -22,8 +22,12 @@ export interface STimeRangePickerProps {
22
22
  clearable?: boolean;
23
23
  /** 오전/오후 선택 표시 여부. 지정하지 않으면 type="midday"일 때만 켜집니다. */
24
24
  showMeridiem?: boolean;
25
+ /** 분 리스트에 나열할 간격(분). 10 이면 `00 10 20 30 40 50` 만 고를 수 있다 */
25
26
  minuteStep?: number;
26
- /** 범위 순서 정책. strict는 시작 시간이 종료 시간보다 늦어지지 않도록 보정합니다. */
27
+ /**
28
+ * 범위 순서 정책. `strict` 는 종료 리스트에서 시작보다 이른 시각을 비활성으로 막고,
29
+ * 시작을 종료 뒤로 옮기면 종료가 따라온다. `allow-cross-day` 는 제약 없이 고른다(자정을 넘는 범위).
30
+ */
27
31
  rangeOrder?: STimeRangePickerRangeOrder;
28
32
  /**
29
33
  * 컨트롤 너비 — 폭 등급(`'xs' | 'sm' | 'md' | 'lg' | 'xl'`) · 숫자=px · CSS 길이.