@x-plat/design-system 0.5.47 → 0.5.49

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.
@@ -38,6 +38,26 @@ import { Button, Modal, ToastProvider, useToast, ... } from "@x-plat/design-syst
38
38
  import { Layout, Header, SideBar, FullGrid, FullScreen, GapGrid, GridItem } from "@x-plat/design-system/layout";
39
39
  ```
40
40
 
41
+ ### 브랜드 전환 (default 외 다른 브랜드 적용)
42
+
43
+ design-system 은 빌드 시점에 tokens-default 를 임베드한다. 다른 브랜드를 쓰려면 **design-system 의 style.css 를 import 한 뒤** 브랜드 tokens.css 를 추가 import 한다 (CSS 카스케이드: 나중 선언이 이김).
44
+
45
+ ```tsx
46
+ // ✅ 햇빛길 브랜드
47
+ import "@x-plat/design-system/style.css"; // 1) 컴포넌트 스타일 + default 토큰
48
+ import "@x-plat/tokens-haetbitgil/tokens.css"; // 2) 색상/타이포 override
49
+
50
+ // ✅ CBIO 브랜드
51
+ import "@x-plat/design-system/style.css";
52
+ import "@x-plat/tokens-cbio/tokens.css";
53
+
54
+ // ❌ 순서 반대 — design-system 이 default 로 다시 덮어버린다
55
+ import "@x-plat/tokens-haetbitgil/tokens.css";
56
+ import "@x-plat/design-system/style.css"; // 이게 마지막에 로드되어 default 적용
57
+ ```
58
+
59
+ > 브랜드 토큰 단독 import 만으로는 작동 X — 컴포넌트 스타일이 빠진다. 반드시 design-system style.css 를 먼저 로드.
60
+
41
61
  ---
42
62
 
43
63
  ## 앱 최상단 레이아웃 (필수 구조)
@@ -423,6 +443,88 @@ import { ChatInput } from "@x-plat/design-system/components";
423
443
 
424
444
  ---
425
445
 
446
+ ## 안전 가이드 — 자주 누락되는 5가지
447
+
448
+ UI 디자인 결정(레이아웃 폭, 색상 조합, 위계 등)은 **사용자 의도를 존중** 한다. 다만 아래 5가지는 빠지면 **레이아웃이 깨지거나 DS 가 오용되는 영역**이라 반드시 적용.
449
+
450
+ ### 1. 반응형 GridItem 누락 방지
451
+
452
+ `GridItem` 의 `column` 은 default(laptop) 만 주면 **모바일에서 깨진다**. tablet(≤8) / mobile(≤4) 한계를 반드시 확인.
453
+
454
+ ```tsx
455
+ // ❌ default 만 → mobile 에서 6/4 = 1.5 칸이 되어 잘림
456
+ <GridItem column={{ default: 6 }}>...</GridItem>
457
+
458
+ // ✅ 브레이크별 명시
459
+ <GridItem column={{ default: 6, tablet: 4, mobile: 4 }}>...</GridItem>
460
+
461
+ // ✅ 전체 폭이면 명시적으로 12/8/4
462
+ <GridItem column={{ default: 12, tablet: 8, mobile: 4 }}>...</GridItem>
463
+ ```
464
+
465
+ ### 2. 컴포넌트 오용 방지 — 상황별 매칭
466
+
467
+ 비슷해 보이는 컴포넌트가 여러 개일 때 잘못 고르면 UX 가 망가진다.
468
+
469
+ | 상황 | 사용할 컴포넌트 | 쓰지 말 것 |
470
+ |---|---|---|
471
+ | 짧은 알림(3-5초 후 사라짐) | `Toast` | Modal, Alert |
472
+ | 인라인 경고/상태 메시지 | `Alert` | Modal |
473
+ | 추가 설명 1-2줄 (hover) | `Tooltip` | PopOver |
474
+ | 풍부한 부가 정보 + 액션 | `PopOver` | Modal, Tooltip |
475
+ | 전용 작업 흐름 (작성/확인) | `Modal` | Drawer (전화면 시) |
476
+ | 사이드 패널 (긴 흐름) | `Drawer` | Modal |
477
+ | 단일 선택 (2-7개) | `Radio` | Select |
478
+ | 단일 선택 (8개 이상) | `Select` | Radio |
479
+ | 다중 선택 | `CheckBox` 리스트 또는 multi-`Select` | Radio |
480
+ | boolean on/off | `Switch` | CheckBox |
481
+
482
+ ### 3. 상태 처리 3종 — Loading / Empty / Error
483
+
484
+ 데이터를 가져오는 곳(API/비동기)에는 반드시 3개 상태를 모두 처리.
485
+
486
+ ```tsx
487
+ // ✅ 3개 상태 모두 처리
488
+ if (loading) return <Skeleton />; // 또는 <Spinner />
489
+ if (error) return <Alert type="error">오류: {error.message}</Alert>;
490
+ if (data.length === 0) return <EmptyState title="데이터가 없습니다" />;
491
+
492
+ return <Table data={data} />;
493
+ ```
494
+
495
+ 데이터 무관 정적 화면이면 이 패턴 생략 가능.
496
+
497
+ ### 4. 접근성 기본 4개
498
+
499
+ 빠지면 시각/키보드 사용자가 못 씀.
500
+
501
+ | 요소 | 필수 처리 |
502
+ |---|---|
503
+ | 이미지 (`<img>`) | `alt` 속성 (장식이면 `alt=""`) |
504
+ | 아이콘 only 버튼 | `aria-label` (예: `<Button aria-label="삭제"><TrashIcon /></Button>`) |
505
+ | Input / TextArea / Select 등 폼 | `label` prop |
506
+ | Modal / Drawer 등 오버레이 | DS 가 처리하지만 닫기 버튼이 키보드로 접근 가능한지 확인 |
507
+
508
+ ### 5. 콘텐츠 안전
509
+
510
+ ```tsx
511
+ // ❌ 자리 채우기 lorem ipsum
512
+ <p>Lorem ipsum dolor sit amet...</p>
513
+
514
+ // ❌ 한국어 컨텍스트에 영어 placeholder
515
+ <Input placeholder="Enter your name" />
516
+
517
+ // ✅ 의미 있는 / 한국어 placeholder
518
+ <Input placeholder="이름을 입력하세요" />
519
+
520
+ // ✅ 데이터가 없을 때 명시적 처리
521
+ <EmptyState title="등록된 게시글이 없습니다" />
522
+ ```
523
+
524
+ 언어 일관성: 사용자가 한국어로 요청했으면 모든 UI 텍스트(label / placeholder / button / message)도 한국어.
525
+
526
+ ---
527
+
426
528
  ## 컴포넌트 사용 패턴
427
529
 
428
530
  ### ✅ 올바른 사용
@@ -8,6 +8,34 @@
8
8
  import "@x-plat/design-system/style.css";
9
9
  ```
10
10
 
11
+ > `style.css` 는 **컴포넌트 스타일 + tokens-default 의 토큰 값** 을 함께 포함한다. 다른 브랜드를 적용하려면 아래 "브랜드 전환" 섹션 참고.
12
+
13
+ ## 브랜드 전환 (cbio / haetbitgil / daibee-ir 등)
14
+
15
+ design-system 은 tokens-default 를 기본으로 사용한다. 다른 브랜드 토큰을 적용하려면 **design-system 의 style.css 를 import 한 뒤** 해당 브랜드 토큰을 import 한다 (CSS 카스케이드: 나중 선언이 이김).
16
+
17
+ ```tsx
18
+ // ✅ 햇빛길 브랜드 적용
19
+ import "@x-plat/design-system/style.css"; // 1) 컴포넌트 스타일 + default 토큰
20
+ import "@x-plat/tokens-haetbitgil/tokens.css"; // 2) 햇빛길 색상/타이포로 override
21
+ ```
22
+
23
+ ```tsx
24
+ // ✅ CBIO 브랜드 적용
25
+ import "@x-plat/design-system/style.css";
26
+ import "@x-plat/tokens-cbio/tokens.css";
27
+ ```
28
+
29
+ ```tsx
30
+ // ❌ 순서 반대 — design-system 이 다시 default 로 덮음
31
+ import "@x-plat/tokens-haetbitgil/tokens.css";
32
+ import "@x-plat/design-system/style.css";
33
+ ```
34
+
35
+ **기본(default) 브랜드** 만 쓸 거면 design-system style.css 만 import 하면 된다.
36
+
37
+ **브랜드 토큰만** import 하면 컴포넌트 스타일이 빠져서 동작하지 않는다 — 반드시 design-system 의 style.css 를 함께 로드.
38
+
11
39
  ## 컴포넌트 Import
12
40
 
13
41
  ```tsx
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@x-plat/design-system",
3
- "version": "0.5.47",
3
+ "version": "0.5.49",
4
4
  "description": "XPLAT UI Design System",
5
5
  "author": "XPLAT WOONG",
6
6
  "main": "dist/index.cjs",