sellmate-design-system-react 9.0.0-beta.6 → 9.0.0-beta.7
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/README.md +63 -0
- package/dist/components/SList/README.md +0 -1
- package/dist/components/SList/SList.d.ts +0 -2
- package/dist/components/SPage/README.md +1 -0
- package/dist/components/SPage/SPage.d.ts +5 -0
- package/dist/components/STree/README.md +2 -0
- package/dist/components/STree/STree.d.ts +6 -0
- package/dist/components/STree/index.d.ts +1 -1
- package/dist/index.cjs +394 -85
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +393 -84
- package/dist/index.js.map +1 -1
- package/dist/lib/truncated-value-tooltip.d.ts +18 -0
- package/dist/llms-full.txt +3 -1
- package/dist/styles.css +59 -4
- package/dist/theme.css +5 -1
- package/eslint/index.mjs +5 -0
- package/eslint/rules/field-width-grade.d.mts +41 -0
- package/eslint/rules/field-width-grade.mjs +294 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -186,6 +186,7 @@ export default [
|
|
|
186
186
|
| `sellmate/component-group-gap` | warn | 같은 컴포넌트를 나열할 때의 그룹 간격 — 배열 방향에 따라 값이 다르다(체크박스 가로 24 / 세로 8) |
|
|
187
187
|
| `sellmate/table-numeric-align` | warn | 수량 컬럼(금액·수량 등)에 `align: 'right'` 누락 — **`--fix` 로 자동 교정** |
|
|
188
188
|
| `sellmate/require-locale-number` | warn | 수량 컬럼의 `toLocaleString()` 누락 — 세 자리 콤마 |
|
|
189
|
+
| `sellmate/field-width-grade` | warn | 필드 폭이 `maxLength`(스키마 상한)와 어긋남 — 등급 미지정 · 등급 밖 폭 · 상한 대비 과부족 |
|
|
189
190
|
| `sellmate/no-arbitrary-class` | **off** | 토큰이 있는 속성(색·타이포·간격·모서리)의 임의 값 — `text-[14px]`, `bg-[#eee]`. 앱 고유 화면에는 정당한 사용이 많아 기본값은 끕니다 |
|
|
190
191
|
|
|
191
192
|
`className` 뿐 아니라 `cn()`/`clsx()` 인자, 템플릿 리터럴, 객체 키 안까지 검사합니다.
|
|
@@ -237,6 +238,68 @@ export default [
|
|
|
237
238
|
'sellmate/table-numeric-align': ['error', { allow: ['rank'] }],
|
|
238
239
|
```
|
|
239
240
|
|
|
241
|
+
### 필드 폭 등급 (`field-width-grade`)
|
|
242
|
+
|
|
243
|
+
필드 너비는 **`maxLength`(= 스키마 상한)로 정합니다.** 상한이 등급 안에 들어오면 그 등급으로 고정하고,
|
|
244
|
+
등급 상한(`xl`)을 넘거나 상한이 아예 없으면 행 전체(`width="100%"` 또는 생략)로 둡니다.
|
|
245
|
+
|
|
246
|
+
| 등급 | 폭 | |
|
|
247
|
+
| ---- | ----- | ------------------------ |
|
|
248
|
+
| `xs` | 80px | 숫자 필드 전용 |
|
|
249
|
+
| `sm` | 120px | |
|
|
250
|
+
| `md` | 160px | |
|
|
251
|
+
| `lg` | 240px | |
|
|
252
|
+
| `xl` | 480px | 정책상 상한 |
|
|
253
|
+
|
|
254
|
+
```tsx
|
|
255
|
+
// 상한이 등급 안에 들어온다 → 그 등급으로 고정
|
|
256
|
+
<SInput name="code" label="코드" maxLength={10} width={160} />
|
|
257
|
+
|
|
258
|
+
// 상한이 xl 로도 안 담긴다 → 행 전체
|
|
259
|
+
<SInput name="desc" label="설명" maxLength={100} width="100%" />
|
|
260
|
+
|
|
261
|
+
// 숫자 필드의 상한은 maxLength 가 아니라 max 다 (천단위 콤마도 폭을 먹는다)
|
|
262
|
+
<SNumberInput name="qty" label="수량" max={99} width={80} />
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
대상은 `SInput` · `SNumberInput` · `SBarcodeInput` 입니다. `STextarea` 는 여러 줄로 접혀 상한이 폭을
|
|
266
|
+
정하지 않고, 셀렉트 계열은 상한 개념이 없어 목록 최장값으로 폭을 정하며, 날짜·시간 계열은 컴포넌트가
|
|
267
|
+
자체 상한을 갖습니다.
|
|
268
|
+
|
|
269
|
+
**상한도 폭도 변수로 넘기면 검사하지 않습니다.** 정적으로 알 수 없는 것을 위반으로 보고하지 않습니다.
|
|
270
|
+
|
|
271
|
+
```tsx
|
|
272
|
+
<SInput maxLength={LIMIT} width={fieldWidth} /> // 통과
|
|
273
|
+
<SInput maxLength={10} {...rest} /> // 통과 (spread 안에 width 가 있을 수 있다)
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
#### 글자수 환산
|
|
277
|
+
|
|
278
|
+
등급이 몇 글자를 담는지는 토큰 값(글꼴 크기 · 좌우 패딩 · 테두리 · 스테퍼)에서 계산합니다.
|
|
279
|
+
한글은 전각이라 영숫자의 약 두 배를 먹으므로 **두 기준 사이에는 아무것도 보고하지 않습니다** —
|
|
280
|
+
영숫자로 채워도 넘칠 때만 "좁다", 한글로 채워도 남을 때만 "넓다" 로 판정합니다.
|
|
281
|
+
|
|
282
|
+
| 등급 | `SInput` (sm) | `SInput` (md) | `SNumberInput` (sm) | `SNumberInput` (sm, `useButton`) |
|
|
283
|
+
| ---- | ------------- | ------------- | ------------------- | -------------------------------- |
|
|
284
|
+
| `xs` | — | — | 영숫자 8 | 영숫자 2 |
|
|
285
|
+
| `sm` | 영숫자 14 / 한글 7 | 영숫자 11 / 한글 6 | 영숫자 14 | 영숫자 8 |
|
|
286
|
+
| `md` | 영숫자 20 / 한글 11 | 영숫자 16 / 한글 9 | 영숫자 20 | 영숫자 14 |
|
|
287
|
+
| `lg` | 영숫자 32 / 한글 17 | 영숫자 26 / 한글 14 | 영숫자 32 | 영숫자 26 |
|
|
288
|
+
| `xl` | 영숫자 68 / 한글 37 | 영숫자 57 / 한글 31 | 영숫자 68 | 영숫자 62 |
|
|
289
|
+
|
|
290
|
+
`SNumberInput` 은 `useButton` 여부로 글자 자리가 크게 갈립니다 — 스테퍼가 없으면 좌우 패딩이
|
|
291
|
+
두 배가 되고(기본값), 있으면 버튼 두 개와 간격이 폭을 먹습니다. 규칙은 JSX 의 `useButton` 을 읽어
|
|
292
|
+
둘을 구분합니다.
|
|
293
|
+
|
|
294
|
+
값이 팀 기준과 다르면 옵션으로 덮습니다.
|
|
295
|
+
|
|
296
|
+
```js
|
|
297
|
+
'sellmate/field-width-grade': ['warn', {
|
|
298
|
+
grades: { sm: 120, md: 160, lg: 240, xl: 480 },
|
|
299
|
+
charRatio: { narrow: 0.55, wide: 1 },
|
|
300
|
+
}],
|
|
301
|
+
```
|
|
302
|
+
|
|
240
303
|
### 더 엄격하게 / 더 느슨하게
|
|
241
304
|
|
|
242
305
|
`configs.strict` 는 전 규칙을 error 로 올리고, `<ul>` `<ol>` `<li>` `<svg>` `<label>` 까지 검사하며, 간격 유틸리티에 `sd-` 접두를 강제합니다(`requirePrefix`). 디자인 시스템 규칙을 처음부터 전면 적용하는 신규 프로젝트용입니다.
|
|
@@ -11,7 +11,6 @@
|
|
|
11
11
|
| `children?` | `ReactNode` | — | 리스트 컨테이너 내부에 렌더링할 내용 |
|
|
12
12
|
| `useGap?` | `boolean` | `false` | 리스트 아이템 사이 gap 토큰 적용 여부 |
|
|
13
13
|
| `usePadding?` | `boolean` | `false` | 리스트 컨테이너 padding 토큰 적용 여부 |
|
|
14
|
-
| `separator?` | `boolean` | `false` | 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 |
|
|
15
14
|
|
|
16
15
|
## Dependencies
|
|
17
16
|
|
|
@@ -6,7 +6,5 @@ export interface SListProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
6
6
|
useGap?: boolean;
|
|
7
7
|
/** 리스트 컨테이너 padding 토큰 적용 여부 */
|
|
8
8
|
usePadding?: boolean;
|
|
9
|
-
/** 아이템 하단 구분선 표시 여부. 테두리를 가진 아이템(`bordered`)에는 쓰지 않는다 */
|
|
10
|
-
separator?: boolean;
|
|
11
9
|
}
|
|
12
10
|
export declare const SList: import("react").ForwardRefExoticComponent<SListProps & import("react").RefAttributes<HTMLDivElement>>;
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
|------|------|---------|-------------|
|
|
29
29
|
| `background?` | `SPageBackground` | `'frame'` | 페이지 배경 표면. frame=흰 콘텐츠 면, neutral=옅은 회색 면, screen=앱 바탕. 스크롤바 처리도 여기 묶여 있다 — 셋 다 구분선+트랙 배경이고, 트랙 색만 neutral 에서 흰색이 된다. |
|
|
30
30
|
| `scrollEndSpacing?` | `boolean` | `true` | 스크롤 끝 여백. 마지막 항목이 창 하단에 붙어 "여기서 끝"이 안 읽히는 것을 막는다. 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지). |
|
|
31
|
+
| `overlayScrollbar?` | `boolean` | `false` | true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다. 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다. |
|
|
31
32
|
| `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` 이 무시된다. |
|
|
32
33
|
| `header?` | `SPageHeaderProps` | — | 페이지 타이틀 영역(pageHeader 포팅). 주면 스크롤·페이지 패딩 밖으로 빼내 상단에 고정 배치한다. `children` 은 항상 본문이다 — header 유무와 무관하게 같은 자리에 같은 뜻으로 들어간다. |
|
|
33
34
|
|
|
@@ -12,6 +12,11 @@ export interface SPageProps extends HTMLAttributes<HTMLElement> {
|
|
|
12
12
|
* 기본으로 켜져 있고, 페이지네이션처럼 끝을 알려주는 것이 이미 있으면 끈다(목록 페이지).
|
|
13
13
|
*/
|
|
14
14
|
scrollEndSpacing?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* true면 네이티브 스크롤바를 숨기고 SPage 위에 오버레이 스크롤바를 얹는다.
|
|
17
|
+
* 스크롤바가 레이아웃 폭을 차지하지 않아 내부 콘텐츠 폭이 줄어들지 않는다.
|
|
18
|
+
*/
|
|
19
|
+
overlayScrollbar?: boolean;
|
|
15
20
|
/**
|
|
16
21
|
* 본문 높이 모드. 기본은 `auto` — 콘텐츠가 흐르고 넘치면 페이지가 스크롤한다.
|
|
17
22
|
*
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
| `border?` | `boolean` | `true` | 아이템 하단 border 표시 여부 |
|
|
19
19
|
| `indeterminate?` | `boolean` | `false` | 일부 선택 상태 |
|
|
20
20
|
| `selectable?` | `boolean` | `true` | 체크박스 표시 여부 |
|
|
21
|
+
| `size?` | `STreeSize` | `'sm'` | 타이포그래피 크기 |
|
|
21
22
|
| `leading?` | `ReactNode \| ((state: STreeItemRenderState) => ReactNode)` | — | 사용자 지정 leading 콘텐츠 |
|
|
22
23
|
| `trailing?` | `ReactNode \| ((state: STreeItemRenderState) => ReactNode)` | — | 사용자 지정 trailing 콘텐츠 |
|
|
23
24
|
|
|
@@ -40,6 +41,7 @@
|
|
|
40
41
|
| `expandedIds?` | `string[]` | — | 펼쳐진 노드 ID 목록 |
|
|
41
42
|
| `defaultExpandedIds?` | `string[]` | — | 비제어 펼침 초기값 |
|
|
42
43
|
| `selectable?` | `boolean` | `true` | 체크박스 표시 여부 |
|
|
44
|
+
| `size?` | `STreeSize` | `'sm'` | 타이포그래피 크기 |
|
|
43
45
|
| `useAll?` | `boolean` | `false` | 체크박스 사용 시 최상단 전체 선택 아이템 표시 여부 |
|
|
44
46
|
| `guideline?` | `boolean` | `true` | depth 연결선 표시 여부 |
|
|
45
47
|
| `border?` | `boolean` | `true` | 아이템 하단 border 표시 여부 |
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
|
|
2
|
+
export type STreeSize = 'sm' | 'md';
|
|
2
3
|
export interface STreeNode {
|
|
3
4
|
/** 노드 고유 ID */
|
|
4
5
|
id: string;
|
|
@@ -12,6 +13,7 @@ export interface STreeNode {
|
|
|
12
13
|
export interface STreeItemRenderState {
|
|
13
14
|
node: STreeNode;
|
|
14
15
|
depth: number;
|
|
16
|
+
size: STreeSize;
|
|
15
17
|
expanded: boolean;
|
|
16
18
|
selected: boolean;
|
|
17
19
|
indeterminate: boolean;
|
|
@@ -39,6 +41,8 @@ export interface STreeItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'ch
|
|
|
39
41
|
indeterminate?: boolean;
|
|
40
42
|
/** 체크박스 표시 여부 */
|
|
41
43
|
selectable?: boolean;
|
|
44
|
+
/** 타이포그래피 크기 */
|
|
45
|
+
size?: STreeSize;
|
|
42
46
|
/** 사용자 지정 leading 콘텐츠 */
|
|
43
47
|
leading?: ReactNode | ((state: STreeItemRenderState) => ReactNode);
|
|
44
48
|
/** 사용자 지정 trailing 콘텐츠 */
|
|
@@ -61,6 +65,8 @@ export interface STreeProps extends Omit<HTMLAttributes<HTMLDivElement>, 'childr
|
|
|
61
65
|
defaultExpandedIds?: string[];
|
|
62
66
|
/** 체크박스 표시 여부 */
|
|
63
67
|
selectable?: boolean;
|
|
68
|
+
/** 타이포그래피 크기 */
|
|
69
|
+
size?: STreeSize;
|
|
64
70
|
/** 체크박스 사용 시 최상단 전체 선택 아이템 표시 여부 */
|
|
65
71
|
useAll?: boolean;
|
|
66
72
|
/** depth 연결선 표시 여부 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { STree, STreeItem, type STreeItemProps, type STreeItemRenderState, type STreeNode, type STreeProps, } from './STree';
|
|
1
|
+
export { STree, STreeItem, type STreeItemProps, type STreeItemRenderState, type STreeNode, type STreeProps, type STreeSize, } from './STree';
|