@cashdoc/cashdoc-cms-design-system 2.0.2 → 2.2.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.
@@ -177,13 +177,9 @@ export type TableHeadProps = {
177
177
  sortDirection?: "asc" | "desc" | null;
178
178
  /** 정렬 클릭 핸들러 */
179
179
  onSort?: () => void;
180
- } & React.ThHTMLAttributes<HTMLTableCellElement>;
181
- /**
182
- * 테이블의 헤더 셀을 정의하는 컴포넌트입니다.
183
- *
184
- * `<th>` 태그를 렌더링하며, 열의 제목을 표시합니다.
185
- * 정렬 기능(`sortable`)을 지원하며, 정렬 방향에 따라 아이콘을 표시할 수 있습니다.
186
- */
180
+ /** 텍스트 정렬 방식 (default: "left") */
181
+ align?: "left" | "center" | "right";
182
+ } & Omit<React.ThHTMLAttributes<HTMLTableCellElement>, "align">;
187
183
  export declare const TableHead: React.ForwardRefExoticComponent<{
188
184
  /** 정렬 가능 여부 */
189
185
  sortable?: boolean;
@@ -191,7 +187,9 @@ export declare const TableHead: React.ForwardRefExoticComponent<{
191
187
  sortDirection?: "asc" | "desc" | null;
192
188
  /** 정렬 클릭 핸들러 */
193
189
  onSort?: () => void;
194
- } & React.ThHTMLAttributes<HTMLTableCellElement> & React.RefAttributes<HTMLTableCellElement>>;
190
+ /** 텍스트 정렬 방식 (default: "left") */
191
+ align?: "left" | "center" | "right";
192
+ } & Omit<React.ThHTMLAttributes<HTMLTableCellElement>, "align"> & React.RefAttributes<HTMLTableCellElement>>;
195
193
  declare const tableCellVariants: (props?: ({
196
194
  align?: "left" | "center" | "right" | null | undefined;
197
195
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
@@ -0,0 +1,79 @@
1
+ import { default as React } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { tagVariants } from './variants';
4
+
5
+ export type TagColor = NonNullable<VariantProps<typeof tagVariants>["color"]>;
6
+ export type TagSize = NonNullable<VariantProps<typeof tagVariants>["size"]>;
7
+ type TagOwnProps = {
8
+ /** 태그 색상. 디자인 시스템 팔레트 기반. */
9
+ color?: TagColor;
10
+ /** 태그 크기. */
11
+ size?: TagSize;
12
+ /** 좌측 아이콘 — 12~14px 권장. */
13
+ leftIcon?: React.ReactNode;
14
+ /** 제거 버튼 노출 여부. true이면 우측에 X 버튼이 추가됩니다. */
15
+ removable?: boolean;
16
+ /** 제거 버튼 클릭 핸들러. removable과 함께 사용합니다. */
17
+ onRemove?: (event: React.MouseEvent<HTMLButtonElement>) => void;
18
+ /** 제거 버튼의 aria-label (기본: "제거"). */
19
+ removeLabel?: string;
20
+ };
21
+ export type TagProps = TagOwnProps & Omit<React.HTMLAttributes<HTMLSpanElement>, "color" | "prefix">;
22
+ /**
23
+ * 짧은 메타데이터(상태, 분류, 라벨)를 시각적으로 표시하는 컴포넌트입니다.
24
+ *
25
+ * {@link Tag}는 비인터랙티브 라벨이 기본이며, `onClick`이 지정되면 자동으로
26
+ * 키보드 접근 가능한 버튼 의미를 가집니다. `removable={true}`로 우측에 제거
27
+ * 버튼을 노출할 수 있고, `leftIcon`으로 아이콘 prefix를 받을 수 있습니다.
28
+ *
29
+ * ## When (언제 사용해야 하는가)
30
+ *
31
+ * **사용해야 하는 경우:**
32
+ * - **상태 라벨**: "신규", "완료", "보류" 등 짧은 상태 표시
33
+ * - **카테고리/태그**: 컨텐츠 분류, 필터 키워드
34
+ * - **메타 정보**: 사용자 역할, 권한, 그룹 등 컴팩트한 정보 표시
35
+ *
36
+ * **사용하지 말아야 하는 경우:**
37
+ * - **주요 액션**: 클릭이 주요 액션이라면 `Button`을 사용하세요.
38
+ * - **선택 가능한 옵션**: 다중 선택이 필요하면 `FilterToggleGroup`/`CountFilterChips`를 검토하세요.
39
+ *
40
+ * ## Layout behavior
41
+ *
42
+ * - `inline-flex` 기반이므로 텍스트 흐름 안에 자연스럽게 배치됩니다.
43
+ * - 기본 size는 `sm`(h-5)로, table cell이나 list row 내부에 적합합니다.
44
+ * - `removable`이면 좌측 라벨 우측에 size-3 X 버튼이 붙고, 클릭 시 `onRemove`가 호출됩니다.
45
+ *
46
+ * ## Example
47
+ *
48
+ * {@tool snippet}
49
+ * 기본 사용:
50
+ *
51
+ * ```tsx
52
+ * <Tag>대기</Tag>
53
+ * <Tag color="blue">신규</Tag>
54
+ * <Tag color="green" size="md">완료</Tag>
55
+ * ```
56
+ * {@end-tool}
57
+ *
58
+ * {@tool snippet}
59
+ * 제거 가능한 태그:
60
+ *
61
+ * ```tsx
62
+ * <Tag
63
+ * color="red"
64
+ * removable
65
+ * onRemove={() => removeTag("VIP")}
66
+ * >
67
+ * VIP
68
+ * </Tag>
69
+ * ```
70
+ * {@end-tool}
71
+ *
72
+ * See also:
73
+ *
74
+ * - {@link Button}, 주요 액션이 필요한 경우
75
+ * - {@link CountFilterChips}, 카운트가 함께 보이는 선택형 칩
76
+ * - {@link FilterToggleGroup}, 토글 가능한 필터 그룹
77
+ */
78
+ export declare const Tag: React.ForwardRefExoticComponent<TagOwnProps & Omit<React.HTMLAttributes<HTMLSpanElement>, "prefix" | "color"> & React.RefAttributes<HTMLSpanElement>>;
79
+ export {};
@@ -0,0 +1,2 @@
1
+ export { Tag } from './Tag';
2
+ export type { TagProps, TagColor, TagSize } from './Tag';
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Tag 컴포넌트의 색상/크기 variant 정의.
3
+ *
4
+ * 스타일은 subtle(옅은 배경 + 짙은 텍스트) 단일 톤으로 통일합니다.
5
+ * 색상 팔레트의 명도 차이는 디자인 토큰 자체에서 흡수되며, 각 컬러는
6
+ * 같은 의미 가중치(label 톤)를 가지도록 매핑됩니다.
7
+ *
8
+ * @color gray - 기본 (중립 라벨)
9
+ * @color blue - 정보/신규
10
+ * @color green - 성공/완료
11
+ * @color red - 위험/오류/강조
12
+ * @color orange - 주의/경고
13
+ * @color yellow - 브랜드 강조 (내부적으로 cms-primary 토큰 사용)
14
+ * @color pink - 강조 라벨
15
+ *
16
+ * @size sm - 컴팩트 (h-5, 11px)
17
+ * @size md - 일반 (h-6, 12px)
18
+ */
19
+ export declare const tagVariants: (props?: ({
20
+ color?: "green" | "blue" | "red" | "gray" | "orange" | "pink" | "yellow" | null | undefined;
21
+ size?: "sm" | "md" | null | undefined;
22
+ interactive?: boolean | null | undefined;
23
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
@@ -0,0 +1,85 @@
1
+ import { default as React } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+
4
+ /**
5
+ * Toast 컴포넌트의 톤/intent variant 정의.
6
+ *
7
+ * 두 축으로 구성:
8
+ * - **intent**: 의미 (success / info / warning / error) — 좌측 아이콘 색만 결정
9
+ * - **theme**: light(기본) / dark — 배경·텍스트 톤 결정
10
+ *
11
+ * 두 축은 독립적이므로 `intent="warning" theme="light"` 같은 조합이 자유롭게 가능합니다.
12
+ */
13
+ declare const toastVariants: (props?: ({
14
+ theme?: "dark" | "light" | null | undefined;
15
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
16
+ declare const intentIcon: {
17
+ readonly success: React.ForwardRefExoticComponent<Omit<import('..').IconProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
18
+ readonly info: React.ForwardRefExoticComponent<Omit<import('..').IconProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
19
+ readonly warning: React.ForwardRefExoticComponent<Omit<import('..').IconProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
20
+ readonly error: React.ForwardRefExoticComponent<Omit<import('..').IconProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
21
+ };
22
+ export type ToastIntent = keyof typeof intentIcon;
23
+ type ToastVariantProps = VariantProps<typeof toastVariants>;
24
+ export type ToastTheme = NonNullable<ToastVariantProps["theme"]>;
25
+ export type ToastProps = {
26
+ /** intent — 좌측 아이콘 모양/컬러 결정. 생략 시 아이콘 미노출 */
27
+ intent?: ToastIntent;
28
+ /** 라이트/다크 톤 (default: "light") */
29
+ theme?: ToastTheme;
30
+ /** 헤더 라인 */
31
+ title: React.ReactNode;
32
+ /** 보조 설명 */
33
+ description?: React.ReactNode;
34
+ /** 우측 X 버튼 핸들러 — 제공 시에만 X 노출 */
35
+ onClose?: () => void;
36
+ /** 우측 X 버튼 aria-label (default: "닫기") */
37
+ closeLabel?: string;
38
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "title">;
39
+ /**
40
+ * 정적으로 렌더링되는 토스트 카드 컴포넌트입니다.
41
+ *
42
+ * 런타임 알림은 {@link Toaster} + `toast()`를 사용하고, 이 컴포넌트는 디자인
43
+ * 시스템 문서(스토리), 인라인 알림 배너, 또는 sonner의 `toast.custom`과 함께
44
+ * 정적 마크업이 필요한 곳에서 사용합니다.
45
+ *
46
+ * ## When (언제 사용해야 하는가)
47
+ *
48
+ * - **디자인 문서**: 다양한 intent/theme을 한 화면에 시각화할 때
49
+ * - **인라인 배너**: 페이지 본문에 토스트 톤의 메시지가 필요할 때
50
+ * - **`toast.custom`**: sonner를 통해 띄우되 마크업을 완전 제어하고 싶을 때
51
+ *
52
+ * ## Example
53
+ *
54
+ * ```tsx
55
+ * <Toast
56
+ * intent="success"
57
+ * title="캠페인이 발행되었습니다"
58
+ * description="4분 전 · 12,481명에게 알림 전송"
59
+ * onClose={() => dismiss()}
60
+ * />
61
+ *
62
+ * <Toast
63
+ * intent="warning"
64
+ * theme="light"
65
+ * title="발송 시간이 야간(22:00 이후)입니다"
66
+ * description="예약 시간을 다시 확인해 주세요."
67
+ * onClose={() => dismiss()}
68
+ * />
69
+ * ```
70
+ */
71
+ export declare const Toast: React.ForwardRefExoticComponent<{
72
+ /** intent — 좌측 아이콘 모양/컬러 결정. 생략 시 아이콘 미노출 */
73
+ intent?: ToastIntent;
74
+ /** 라이트/다크 톤 (default: "light") */
75
+ theme?: ToastTheme;
76
+ /** 헤더 라인 */
77
+ title: React.ReactNode;
78
+ /** 보조 설명 */
79
+ description?: React.ReactNode;
80
+ /** 우측 X 버튼 핸들러 — 제공 시에만 X 노출 */
81
+ onClose?: () => void;
82
+ /** 우측 X 버튼 aria-label (default: "닫기") */
83
+ closeLabel?: string;
84
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "title"> & React.RefAttributes<HTMLDivElement>>;
85
+ export {};
@@ -0,0 +1,38 @@
1
+ import { default as React } from 'react';
2
+ import { ExternalToast } from 'sonner';
3
+ import { ToastTheme } from './Toast';
4
+
5
+ /**
6
+ * 정적 {@link Toast} 컴포넌트와 sonner를 연결하는 래퍼.
7
+ *
8
+ * sonner의 자체 스타일/아이콘 시스템 대신 디자인 시스템의 `Toast`를
9
+ * `toast.custom`을 통해 렌더링합니다. 호출 시그니처는 sonner와 유사하지만
10
+ * `description`/`theme`/`closeButton` 옵션을 디자인 시스템 의도에 맞춰
11
+ * 좁혔습니다. `action`/`cancel` 등 sonner 고유 슬롯은 현재 미지원입니다.
12
+ */
13
+ export type ToastInput = {
14
+ /** 보조 설명 */
15
+ description?: React.ReactNode;
16
+ /** 배경 톤 (default: "light") */
17
+ theme?: ToastTheme;
18
+ /** 우측 X 닫기 버튼 노출 여부 (default: true) */
19
+ closeButton?: boolean;
20
+ } & Omit<ExternalToast, "description" | "icon" | "action" | "cancel" | "actionButtonStyle">;
21
+ /**
22
+ * CCDS 디자인 시스템에 맞춰 sonner를 감싼 toast 함수.
23
+ *
24
+ * - `toast(title, opts?)` — intent 없는 plain 토스트
25
+ * - `toast.success/info/warning/error(title, opts?)` — intent별 컬러 아이콘
26
+ * - `toast.dismiss(id?)` / `toast.promise(...)` / `toast.custom(...)` — sonner passthrough
27
+ *
28
+ * 모든 호출은 내부적으로 `sonner.toast.custom(<Toast />)`을 사용하므로
29
+ * 디자인 시스템의 `Toast` 마크업이 실제 런타임에서도 그대로 보입니다.
30
+ */
31
+ export declare const toast: ((title: React.ReactNode, opts?: ToastInput) => string | number) & {
32
+ success: (title: React.ReactNode, opts?: ToastInput) => string | number;
33
+ info: (title: React.ReactNode, opts?: ToastInput) => string | number;
34
+ warning: (title: React.ReactNode, opts?: ToastInput) => string | number;
35
+ error: (title: React.ReactNode, opts?: ToastInput) => string | number;
36
+ dismiss: (id?: number | string) => string | number;
37
+ custom: (jsx: (id: number | string) => React.ReactElement, data?: ExternalToast) => string | number;
38
+ };
@@ -1,4 +1,5 @@
1
- import { toast } from 'sonner';
2
-
3
1
  export { Toaster } from './Toaster';
4
- export { toast };
2
+ export { Toast } from './Toast';
3
+ export type { ToastProps, ToastIntent, ToastTheme } from './Toast';
4
+ export { toast } from './createToast';
5
+ export type { ToastInput } from './createToast';
@@ -29,6 +29,7 @@ export * from './SegmentedControls';
29
29
  export * from './Tabs';
30
30
  export * from './FilterToggleGroup';
31
31
  export * from './CountFilterChips';
32
+ export * from './Tag';
32
33
  export * from './BarChart';
33
34
  export * from './Layout';
34
35
  export * from './ContentArea';