@thewrong/ui 0.1.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.
Files changed (125) hide show
  1. package/README.md +65 -0
  2. package/dist/index.cjs.js +40 -0
  3. package/dist/index.es.js +8066 -0
  4. package/dist/src/components/_shared/form-size-tokens.d.ts +16 -0
  5. package/dist/src/components/action-toast/ActionToast.d.ts +56 -0
  6. package/dist/src/components/action-toast/index.d.ts +2 -0
  7. package/dist/src/components/animated-height/AnimatedHeight.d.ts +30 -0
  8. package/dist/src/components/animated-height/index.d.ts +2 -0
  9. package/dist/src/components/badge/Badge.d.ts +2 -0
  10. package/dist/src/components/badge/index.d.ts +2 -0
  11. package/dist/src/components/badge/types.d.ts +56 -0
  12. package/dist/src/components/badge/utils.d.ts +13 -0
  13. package/dist/src/components/button/Button.d.ts +2 -0
  14. package/dist/src/components/button/index.d.ts +2 -0
  15. package/dist/src/components/button/types.d.ts +22 -0
  16. package/dist/src/components/button/utils.d.ts +6 -0
  17. package/dist/src/components/checkbox/Checkbox.d.ts +33 -0
  18. package/dist/src/components/checkbox/index.d.ts +2 -0
  19. package/dist/src/components/checkbox/types.d.ts +33 -0
  20. package/dist/src/components/checkbox/utils.d.ts +33 -0
  21. package/dist/src/components/collapsible/Collapsible.d.ts +36 -0
  22. package/dist/src/components/collapsible/index.d.ts +2 -0
  23. package/dist/src/components/date-input/DateInput.d.ts +27 -0
  24. package/dist/src/components/date-input/index.d.ts +1 -0
  25. package/dist/src/components/date-picker/date-picker.d.ts +34 -0
  26. package/dist/src/components/date-picker/date-range-picker.d.ts +21 -0
  27. package/dist/src/components/date-picker/index.d.ts +5 -0
  28. package/dist/src/components/date-picker/month-picker.d.ts +25 -0
  29. package/dist/src/components/drawer/Drawer.d.ts +18 -0
  30. package/dist/src/components/drawer/index.d.ts +2 -0
  31. package/dist/src/components/info-tooltip/InfoTooltip.d.ts +11 -0
  32. package/dist/src/components/info-tooltip/index.d.ts +2 -0
  33. package/dist/src/components/input/Input.d.ts +10 -0
  34. package/dist/src/components/input/PasswordInput.d.ts +8 -0
  35. package/dist/src/components/input/format.d.ts +38 -0
  36. package/dist/src/components/input/index.d.ts +4 -0
  37. package/dist/src/components/input/types.d.ts +131 -0
  38. package/dist/src/components/input/utils.d.ts +17 -0
  39. package/dist/src/components/loading-spinner/LoadingSpinner.d.ts +16 -0
  40. package/dist/src/components/loading-spinner/index.d.ts +2 -0
  41. package/dist/src/components/modal/Modal.d.ts +51 -0
  42. package/dist/src/components/modal/ModalSubView.d.ts +61 -0
  43. package/dist/src/components/modal/StandardModal.d.ts +59 -0
  44. package/dist/src/components/modal/index.d.ts +6 -0
  45. package/dist/src/components/page-title/PageTitle.d.ts +17 -0
  46. package/dist/src/components/page-title/index.d.ts +1 -0
  47. package/dist/src/components/popover/Popover.d.ts +28 -0
  48. package/dist/src/components/popover/index.d.ts +2 -0
  49. package/dist/src/components/search-box/ExactMatchToggle.d.ts +14 -0
  50. package/dist/src/components/search-box/SearchBox.d.ts +35 -0
  51. package/dist/src/components/search-box/SearchBoxChips.d.ts +12 -0
  52. package/dist/src/components/search-box/SearchBoxDateRange.d.ts +20 -0
  53. package/dist/src/components/search-box/SearchBoxDateSingle.d.ts +17 -0
  54. package/dist/src/components/search-box/SearchBoxField.d.ts +11 -0
  55. package/dist/src/components/search-box/SearchBoxFloatingInput.d.ts +24 -0
  56. package/dist/src/components/search-box/SearchBoxFloatingSelect.d.ts +19 -0
  57. package/dist/src/components/search-box/SearchBoxMonth.d.ts +14 -0
  58. package/dist/src/components/search-box/SearchBoxMultiSelect.d.ts +25 -0
  59. package/dist/src/components/search-box/SearchBoxSheetContext.d.ts +8 -0
  60. package/dist/src/components/search-box/dateRangePresets.d.ts +10 -0
  61. package/dist/src/components/search-box/index.d.ts +5 -0
  62. package/dist/src/components/search-box/parseDateRange.d.ts +15 -0
  63. package/dist/src/components/search-box/parseSearchValues.d.ts +38 -0
  64. package/dist/src/components/search-box/types.d.ts +67 -0
  65. package/dist/src/components/search-box/useSearchBoxState.d.ts +30 -0
  66. package/dist/src/components/select/MultiSelect.d.ts +69 -0
  67. package/dist/src/components/select/Select.d.ts +81 -0
  68. package/dist/src/components/select/index.d.ts +4 -0
  69. package/dist/src/components/select/loading-dots.d.ts +9 -0
  70. package/dist/src/components/select/types.d.ts +141 -0
  71. package/dist/src/components/select/utils.d.ts +16 -0
  72. package/dist/src/components/switch/Switch.d.ts +17 -0
  73. package/dist/src/components/switch/index.d.ts +2 -0
  74. package/dist/src/components/switch/types.d.ts +10 -0
  75. package/dist/src/components/switch/utils.d.ts +14 -0
  76. package/dist/src/components/table/accordion-table.d.ts +31 -0
  77. package/dist/src/components/table/column-group-utils.d.ts +49 -0
  78. package/dist/src/components/table/components/ColumnPresetSelector.d.ts +36 -0
  79. package/dist/src/components/table/components/ColumnSettingsTable.d.ts +25 -0
  80. package/dist/src/components/table/components/KeyboardNavButton.d.ts +12 -0
  81. package/dist/src/components/table/components/PageJumpInput.d.ts +16 -0
  82. package/dist/src/components/table/components/Pagination.d.ts +38 -0
  83. package/dist/src/components/table/components/PaginationFooter.d.ts +28 -0
  84. package/dist/src/components/table/components/SortableHeaderCell.d.ts +27 -0
  85. package/dist/src/components/table/hooks/useColumnPresets.d.ts +48 -0
  86. package/dist/src/components/table/hooks/useColumnResize.d.ts +99 -0
  87. package/dist/src/components/table/hooks/useFillEmptyRows.d.ts +51 -0
  88. package/dist/src/components/table/hooks/useInfiniteScroll.d.ts +58 -0
  89. package/dist/src/components/table/hooks/useTableColumnState.d.ts +30 -0
  90. package/dist/src/components/table/hooks/useTableDragSelection.d.ts +35 -0
  91. package/dist/src/components/table/hooks/useTableSort.d.ts +47 -0
  92. package/dist/src/components/table/hooks/useVirtualTable.d.ts +49 -0
  93. package/dist/src/components/table/index.d.ts +27 -0
  94. package/dist/src/components/table/mini-table.d.ts +44 -0
  95. package/dist/src/components/table/paginated-mini-table.d.ts +28 -0
  96. package/dist/src/components/table/paginated-table.d.ts +8 -0
  97. package/dist/src/components/table/table.d.ts +10 -0
  98. package/dist/src/components/table/types.d.ts +409 -0
  99. package/dist/src/components/table/utils.d.ts +47 -0
  100. package/dist/src/components/table-checkbox/TableCheckbox.d.ts +16 -0
  101. package/dist/src/components/table-checkbox/index.d.ts +1 -0
  102. package/dist/src/components/table-page-layout/TablePageLayout.d.ts +22 -0
  103. package/dist/src/components/table-page-layout/index.d.ts +1 -0
  104. package/dist/src/components/textarea/Textarea.d.ts +10 -0
  105. package/dist/src/components/textarea/index.d.ts +2 -0
  106. package/dist/src/components/textarea/types.d.ts +38 -0
  107. package/dist/src/components/toast/ToastProvider.d.ts +26 -0
  108. package/dist/src/components/toast/index.d.ts +3 -0
  109. package/dist/src/components/toolbar/Toolbar.d.ts +114 -0
  110. package/dist/src/components/toolbar/index.d.ts +2 -0
  111. package/dist/src/components/tooltip/Tooltip.d.ts +18 -0
  112. package/dist/src/components/tooltip/index.d.ts +2 -0
  113. package/dist/src/hooks/index.d.ts +4 -0
  114. package/dist/src/hooks/useBottomSheetDrag.d.ts +41 -0
  115. package/dist/src/hooks/useClickOutside.d.ts +16 -0
  116. package/dist/src/hooks/useMediaQuery.d.ts +15 -0
  117. package/dist/src/hooks/useScrollLock.d.ts +8 -0
  118. package/dist/src/index.d.ts +27 -0
  119. package/dist/src/lib/Portal.d.ts +12 -0
  120. package/dist/src/lib/column-preset-storage.d.ts +54 -0
  121. package/dist/src/lib/index.d.ts +6 -0
  122. package/dist/src/lib/overlay-stack.d.ts +13 -0
  123. package/dist/src/lib/utils.d.ts +11 -0
  124. package/dist/ui.css +3 -0
  125. package/package.json +128 -0
@@ -0,0 +1,28 @@
1
+ import { MiniTableProps } from './mini-table';
2
+ export interface PaginatedMiniTableProps<T> extends MiniTableProps<T> {
3
+ /** 1-base. */
4
+ currentPage: number;
5
+ totalPages: number;
6
+ onPageChange: (page: number) => void;
7
+ pageSize?: number;
8
+ pageSizeOptions?: number[];
9
+ onPageSizeChange?: (size: number) => void;
10
+ hasPreviousPage?: boolean;
11
+ hasNextPage?: boolean;
12
+ totalElements?: number;
13
+ /** "총 N건" 노출 여부. 통계 카드 디폴트는 노출 안 함. @default false */
14
+ showTotalCount?: boolean;
15
+ /** 페이지 점프 입력 + 키보드 가이드. 통계 카드 디폴트는 노출 안 함. @default false */
16
+ enablePageJump?: boolean;
17
+ /** Alt + ←/→ 네비게이션. 통계 카드 디폴트는 비활성. @default false */
18
+ enableKeyboardPagination?: boolean;
19
+ }
20
+ /**
21
+ * PaginatedMiniTable — MiniTable + PaginationFooter.
22
+ *
23
+ * 통계/요약 카드용 — 페이지네이션 바만 깔끔히 보이도록 footer 옵션의 디폴트가 모두 false.
24
+ * 필요 시 prop으로 켤 수 있음.
25
+ */
26
+ export declare const PaginatedMiniTable: <T>(props: PaginatedMiniTableProps<T> & {
27
+ ref?: React.ForwardedRef<HTMLDivElement>;
28
+ }) => React.ReactElement;
@@ -0,0 +1,8 @@
1
+ import { PaginatedTableProps } from './types';
2
+ /**
3
+ * PaginatedTable — Table 코어를 래핑해 페이지네이션 footer를 추가한 변형.
4
+ * Table 본체 로직(헤더 정렬·리사이즈·grip, 본문 스트라이프·선택·sticky, 컬럼 프리셋)은 Table에 그대로 위임한다.
5
+ */
6
+ export declare const PaginatedTable: <T>(props: PaginatedTableProps<T> & {
7
+ ref?: React.ForwardedRef<HTMLDivElement>;
8
+ }) => React.ReactElement;
@@ -0,0 +1,10 @@
1
+ import { TableProps } from './types';
2
+ /**
3
+ * Table — 코어 테이블. 헤더(정렬/리사이즈/grip 드래그) + 본문(스트라이프/선택/sticky) + 컬럼 프리셋.
4
+ *
5
+ * 페이지네이션이 없는 조회 API 또는 페이지네이션 영역을 별도로 렌더하는 경우 사용.
6
+ * PaginatedTable은 이 컴포넌트를 wrap해서 footer(Pagination/PageJump/PageSize)를 추가.
7
+ */
8
+ export declare const Table: <T>(props: TableProps<T> & {
9
+ ref?: React.ForwardedRef<HTMLDivElement>;
10
+ }) => React.ReactElement;
@@ -0,0 +1,409 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ /**
3
+ * Table 컴포넌트의 스타일 변형 타입
4
+ */
5
+ export type TableVariant = "default" | "bordered" | "striped";
6
+ /**
7
+ * Table 컴포넌트의 크기 타입
8
+ */
9
+ export type TableSize = "small" | "medium" | "large";
10
+ /**
11
+ * 컬럼 정렬 방향 타입
12
+ */
13
+ export type SortDirection = "asc" | "desc" | null;
14
+ /**
15
+ * 컬럼 정렬 정보
16
+ */
17
+ export interface ColumnSort {
18
+ key: string;
19
+ direction: SortDirection;
20
+ }
21
+ /**
22
+ * Table에 외부에서 주입하는 controlled 컬럼 상태.
23
+ *
24
+ * 순서/숨김/너비를 한 묶음으로 받는다. Table은 이 객체를 통해서만 컬럼 상태를 다루며,
25
+ * 데이터 소스(useColumnPresets 등)에 대해서는 모른다.
26
+ */
27
+ export interface TableColumnState {
28
+ /** 헤더에 실제로 그릴 순서. excludeFromPreset 컬럼은 columns 정의 위치 기준으로 외부에서 끼워넣어야 한다. */
29
+ columnOrder: string[];
30
+ /** 화면에서 숨길 컬럼 키. */
31
+ hiddenColumns: string[];
32
+ /** 컬럼 키 → 픽셀 너비. 누락 키는 자동 계산값/컬럼 정의 사용. */
33
+ columnWidths: Record<string, number>;
34
+ /** 헤더 DnD 후 호출. 새 순서를 외부 store에 반영한다. */
35
+ onColumnOrderChange: (next: string[]) => void;
36
+ /** 헤더 리사이즈/드롭다운 너비 조정 후 호출. */
37
+ onColumnWidthsChange: (widths: Record<string, number>) => void;
38
+ }
39
+ /**
40
+ * Table 컬럼 정의
41
+ */
42
+ export interface TableColumn<T> {
43
+ /**
44
+ * 컬럼의 고유 키
45
+ */
46
+ key: string;
47
+ /**
48
+ * 컬럼 헤더 텍스트 또는 컴포넌트
49
+ */
50
+ header: string | ReactNode;
51
+ /**
52
+ * 행 데이터에서 값을 추출하는 함수
53
+ * @param row 행 데이터
54
+ * @returns 렌더링할 ReactNode
55
+ */
56
+ accessor?: (row: T) => ReactNode;
57
+ /**
58
+ * 정렬 가능 여부
59
+ * @default false
60
+ */
61
+ sortable?: boolean;
62
+ /**
63
+ * 컬럼 정렬 방향
64
+ * @default null
65
+ */
66
+ sortDirection?: SortDirection;
67
+ /**
68
+ * 컬럼 정렬 변경 콜백
69
+ */
70
+ onSort?: (direction: SortDirection) => void;
71
+ /**
72
+ * 컬럼 정렬 정렬
73
+ * @default 'left'
74
+ */
75
+ align?: "left" | "center" | "right";
76
+ /**
77
+ * 컬럼 너비 (CSS 값 또는 숫자)
78
+ */
79
+ width?: string | number;
80
+ /**
81
+ * 컬럼 최소 너비 (px)
82
+ */
83
+ minWidth?: number;
84
+ /**
85
+ * 스티키 컬럼 여부 (좌측 고정)
86
+ * @default false
87
+ */
88
+ sticky?: boolean;
89
+ /**
90
+ * 모바일에서 숨기기 여부
91
+ * @default false
92
+ */
93
+ hideOnMobile?: boolean;
94
+ /**
95
+ * 컬럼 숨기기 여부
96
+ * @default false
97
+ */
98
+ hidden?: boolean;
99
+ /**
100
+ * 프리셋(순서 변경/숨김) 대상에서 제외 여부
101
+ * 시스템 컬럼(선택, 액션 등)에 사용해요.
102
+ * @default false
103
+ */
104
+ excludeFromPreset?: boolean;
105
+ }
106
+ /**
107
+ * 컬럼 그룹 메타 — `Table`이 thead 상단에 그룹 헤더를 그리기 위해 받는 메타데이터.
108
+ *
109
+ * 옵션 2 정책:
110
+ * - 그룹은 "묶음 고정". 하위 컬럼들이 항상 함께 표시되고 함께 숨겨진다.
111
+ * - 그룹 자체는 단일 슬롯처럼 취급 — 그룹 단위로 순서 이동/숨김.
112
+ * - 그룹 내부 컬럼은 사용자가 순서·너비를 조정할 수 없다 (정의 시점에 박힘).
113
+ *
114
+ * 사용 방법:
115
+ * 1. `columns`는 평면 `TableColumn[]`로 정의 (기존과 동일).
116
+ * 2. 그룹화하고 싶은 컬럼들의 key를 모아 `columnGroups: [{ key, header, columnKeys: [...] }]`로 전달.
117
+ * 3. `columns` 배열 안에서 같은 그룹의 컬럼들은 인접한 순서로 두어야 한다 (그룹 단위로 함께 이동).
118
+ */
119
+ export interface TableColumnGroupMeta {
120
+ /** 그룹 슬롯 키 — columnOrder/hiddenColumns에서 그룹을 식별. */
121
+ key: string;
122
+ /** 그룹 헤더 (thead 상단 row에 colSpan으로 표시) */
123
+ header: string | ReactNode;
124
+ /** 그룹에 속한 하위 컬럼 key 목록. 표시 순서대로. */
125
+ columnKeys: string[];
126
+ /** 모바일에서 그룹 전체 숨기기. */
127
+ hideOnMobile?: boolean;
128
+ }
129
+ /**
130
+ * Table 컴포넌트의 공통 Props
131
+ */
132
+ export interface TableCommonProps<T> {
133
+ /**
134
+ * 테이블에 표시할 데이터 배열
135
+ */
136
+ data: T[];
137
+ /**
138
+ * 컬럼 정의 배열. 평면 `TableColumn`만 받는다(legacy/accordion 호환).
139
+ * 컬럼 그룹은 `Table` 컴포넌트에 `columnGroups` prop으로 별도 전달.
140
+ */
141
+ columns: TableColumn<T>[];
142
+ /**
143
+ * 가상화 사용 여부 (자동 감지 시 undefined)
144
+ * @default undefined (자동 감지)
145
+ */
146
+ virtualized?: boolean;
147
+ /**
148
+ * 가상화 자동 감지 임계값 (이 개수 이상일 때 자동 가상화)
149
+ * @default 100
150
+ */
151
+ virtualizedThreshold?: number;
152
+ /**
153
+ * 예상 행 높이 (px, 가상화용)
154
+ * @default 50
155
+ */
156
+ estimatedRowHeight?: number;
157
+ /**
158
+ * 행 높이 (px, 일반 테이블용)
159
+ */
160
+ rowHeight?: number;
161
+ /**
162
+ * 로딩 상태 — 본문 전체를 스피너로 대체. 첫 fetch에 사용.
163
+ * @default false
164
+ */
165
+ loading?: boolean;
166
+ /**
167
+ * 백그라운드 재조회 중 — 기존 데이터를 유지한 채 dim + 스피너 오버레이.
168
+ * placeholderData 패턴에서 검색/페이지 이동 중 시각적 시그널 용도.
169
+ * @default false
170
+ */
171
+ isFetching?: boolean;
172
+ /**
173
+ * 빈 상태 메시지
174
+ * @default "데이터가 없어요"
175
+ */
176
+ emptyMessage?: string;
177
+ /**
178
+ * 행 클릭 핸들러
179
+ */
180
+ onRowClick?: (row: T, index: number) => void;
181
+ /**
182
+ * 선택된 행 배열
183
+ */
184
+ selectedRows?: T[];
185
+ /**
186
+ * 행 선택 변경 핸들러
187
+ */
188
+ onRowSelect?: (row: T, selected: boolean) => void;
189
+ /**
190
+ * 행 선택 사용 여부
191
+ * @default false
192
+ */
193
+ enableRowSelection?: boolean;
194
+ /**
195
+ * 전체 선택 사용 여부
196
+ * @default false
197
+ */
198
+ enableSelectAll?: boolean;
199
+ /**
200
+ * 행 비교 함수 (선택된 행 확인용)
201
+ */
202
+ rowCompare?: (row1: T, row2: T) => boolean;
203
+ /**
204
+ * 행의 안정 식별자. 드래그 다중 선택에서 ID 추적에 사용된다.
205
+ * 미지정 시 드래그 선택은 row index 기반으로 동작하며, 데이터 변경 시 어긋날 수 있다.
206
+ */
207
+ getRowId?: (row: T) => string | number;
208
+ /**
209
+ * 정렬 사용 여부 (클라이언트 사이드 정렬)
210
+ * @default false
211
+ */
212
+ enableSorting?: boolean;
213
+ /**
214
+ * 서버 사이드 정렬 사용 여부
215
+ * @default false
216
+ */
217
+ serverSideSorting?: boolean;
218
+ /**
219
+ * 정렬 변경 핸들러 (서버 사이드 정렬 시)
220
+ */
221
+ onSortChange?: (sort: ColumnSort | null) => void;
222
+ /**
223
+ * 초기 정렬 상태
224
+ */
225
+ initialSort?: ColumnSort;
226
+ /**
227
+ * 테이블 스타일 변형
228
+ * @default 'default'
229
+ */
230
+ variant?: TableVariant;
231
+ /**
232
+ * 테이블 크기
233
+ * @default 'medium'
234
+ */
235
+ size?: TableSize;
236
+ /**
237
+ * 스티키 헤더 여부
238
+ * @default false
239
+ */
240
+ stickyHeader?: boolean;
241
+ /**
242
+ * 테이블 높이 (가상화 시 필수)
243
+ */
244
+ height?: string | number;
245
+ /**
246
+ * 테이블 최대 높이
247
+ */
248
+ maxHeight?: string | number;
249
+ /**
250
+ * 테스트 ID (data-testid)
251
+ */
252
+ "data-testid"?: string;
253
+ /**
254
+ * 추가 클래스명
255
+ */
256
+ className?: string;
257
+ /**
258
+ * 페이지네이션 모드
259
+ * - 'none': 페이지네이션 없음
260
+ * - 'pagination': 페이지네이션 버튼 표시
261
+ * - 'infinite': 무한스크롤
262
+ * @default 'none'
263
+ */
264
+ paginationMode?: "none" | "pagination" | "infinite";
265
+ /**
266
+ * 현재 페이지 (페이지네이션 모드)
267
+ */
268
+ currentPage?: number;
269
+ /**
270
+ * 전체 페이지 수 (페이지네이션 모드)
271
+ */
272
+ totalPages?: number;
273
+ /**
274
+ * 페이지 변경 핸들러 (페이지네이션 모드)
275
+ */
276
+ onPageChange?: (page: number) => void;
277
+ /**
278
+ * 다음 페이지 로드 함수 (무한스크롤 모드)
279
+ */
280
+ fetchNextPage?: () => void;
281
+ /**
282
+ * 다음 페이지 존재 여부 (무한스크롤 모드)
283
+ */
284
+ hasNextPage?: boolean;
285
+ /**
286
+ * 다음 페이지 로딩 중 여부 (무한스크롤 모드)
287
+ */
288
+ isFetchingNextPage?: boolean;
289
+ /**
290
+ * 전체 데이터 개수 (무한스크롤 모드)
291
+ */
292
+ totalElements?: number;
293
+ /**
294
+ * 컬럼 너비 저장 키 (localStorage 키, 저장 기능 활성화).
295
+ * `columnState`가 주어지면 무시된다.
296
+ */
297
+ storageKey?: string;
298
+ /**
299
+ * 외부에서 제어하는 컬럼 상태 묶음(순서/숨김/너비 + 변경 핸들러).
300
+ * 주어지면 Table은 자체 상태를 만들지 않고 이 객체의 값을 사용한다.
301
+ *
302
+ * Table은 "프리셋"이라는 개념을 모르고, 컬럼 상태의 소스(useColumnPresets, URL state 등)는
303
+ * 외부가 관리한다. ColumnPresetSelector를 사용하려면 외부에서 같은 객체를 셀렉터에도 주입한다.
304
+ */
305
+ columnState?: TableColumnState;
306
+ /**
307
+ * 데이터가 적어 컨테이너가 비어 보일 때 빈 행으로 채워 높이를 유지한다.
308
+ * 비가상화 분기에서만 적용된다.
309
+ * @default true
310
+ */
311
+ fillEmptyRows?: boolean;
312
+ }
313
+ /**
314
+ * 레거시 테이블 props — 가상화 / 무한스크롤 / 모바일 카드 분기를 모두 한 컴포넌트에 담은 구버전.
315
+ * 신규 페이지는 `Table`(단순) 또는 `PaginatedTable`을 사용하고, 이 prop은 기존 사용처가 점진
316
+ * 마이그레이션 끝나면 제거 예정.
317
+ */
318
+ export interface LegacyTableProps<T> extends Omit<ComponentPropsWithoutRef<"div">, "children">, TableCommonProps<T> {
319
+ }
320
+ /**
321
+ * Table 코어 props — 페이지네이션 없는 단순 테이블.
322
+ * PaginatedTable은 이 베이스에 페이지네이션 props를 더한 형태.
323
+ */
324
+ export interface TableProps<T> extends Omit<ComponentPropsWithoutRef<"div">, "children">, Omit<TableCommonProps<T>, "virtualized" | "virtualizedThreshold" | "estimatedRowHeight" | "paginationMode" | "fetchNextPage" | "hasNextPage" | "isFetchingNextPage" | "currentPage" | "totalPages" | "onPageChange"> {
325
+ /**
326
+ * 마지막 페이지 등 행이 부족할 때 빈 행으로 채워서 테이블 높이 유지
327
+ * @default true
328
+ */
329
+ fillEmptyRows?: boolean;
330
+ /**
331
+ * 총 항목 수 — 본문 아래 우하단에 "총 N건" 자동 표기.
332
+ * `footerSlot`이 함께 주어지면 footerSlot이 우선되고 이 값은 무시된다.
333
+ */
334
+ totalElements?: number;
335
+ /**
336
+ * 테이블 본문 아래에 렌더링할 추가 영역. PaginatedTable이 페이지네이션 footer를 주입할 때 사용.
337
+ * 주어지면 `totalElements` 기반 기본 footer는 그려지지 않는다.
338
+ */
339
+ footerSlot?: ReactNode;
340
+ /**
341
+ * 컬럼 그룹 메타 — thead 상단에 그룹 헤더(colSpan)를 그리고, 컬럼 프리셋이 그룹 단위로
342
+ * 순서/숨김을 다루게 한다. 옵션 2 정책: 그룹은 묶음 고정(내부 컬럼 customization 불가).
343
+ */
344
+ columnGroups?: TableColumnGroupMeta[];
345
+ }
346
+ /**
347
+ * PaginatedTable 전용 Props — Table 베이스 + 페이지네이션 영역.
348
+ *
349
+ * 무한스크롤/가상화는 지원하지 않고 페이지네이션 전용이에요.
350
+ * 페이지 사이즈 셀렉터 UI도 함께 제공해요.
351
+ */
352
+ export interface PaginatedTableProps<T> extends TableProps<T> {
353
+ /**
354
+ * 현재 페이지 (1-base)
355
+ */
356
+ currentPage: number;
357
+ /**
358
+ * 전체 페이지 수
359
+ */
360
+ totalPages: number;
361
+ /**
362
+ * 페이지 변경 핸들러
363
+ */
364
+ onPageChange: (page: number) => void;
365
+ /**
366
+ * 현재 페이지 사이즈
367
+ */
368
+ pageSize?: number;
369
+ /**
370
+ * 선택 가능한 페이지 사이즈 옵션
371
+ * @default [30, 50, 100]
372
+ */
373
+ pageSizeOptions?: number[];
374
+ /**
375
+ * 페이지 사이즈 변경 핸들러 (값이 있어야 셀렉터 노출)
376
+ */
377
+ onPageSizeChange?: (pageSize: number) => void;
378
+ /**
379
+ * 총 항목 수 — footer에 "총 N건" 표기.
380
+ */
381
+ totalElements?: number;
382
+ /**
383
+ * 이전 페이지 존재 여부 (백엔드 메타필드 `hasPrevious`).
384
+ * 미지정 시 `currentPage > 1`로 자동 판정.
385
+ */
386
+ hasPreviousPage?: boolean;
387
+ /**
388
+ * 다음 페이지 존재 여부 (백엔드 메타필드 `hasNext`).
389
+ * 미지정 시 `currentPage < totalPages`로 자동 판정.
390
+ */
391
+ hasNextPage?: boolean;
392
+ /**
393
+ * Alt(Option) + ←/→로 이전/다음 페이지 네비게이션 활성화
394
+ * 실수 방지를 위해 modifier 키를 강제하고, 인풋/편집 요소 안에서는 무시해요.
395
+ * @default true
396
+ */
397
+ enableKeyboardPagination?: boolean;
398
+ /**
399
+ * footer 좌측 "총 N건" 표시. 대시보드 류 미리보기 카드에서 노이즈를 줄이고 싶을 때 false.
400
+ * @default true
401
+ */
402
+ showTotalCount?: boolean;
403
+ /**
404
+ * 페이지 점프 입력(특정 페이지로 바로 이동) + 키보드 가이드 노출.
405
+ * false면 페이지네이션 바만 남아 가장 가벼운 UI가 됨 (대시보드 류 미리보기에 적합).
406
+ * @default true
407
+ */
408
+ enablePageJump?: boolean;
409
+ }
@@ -0,0 +1,47 @@
1
+ import { TableVariant, TableSize } from './types';
2
+ /**
3
+ * Table의 기본 클래스 (공통 스타일)
4
+ */
5
+ export declare const getTableBaseClasses: () => string;
6
+ /**
7
+ * Table 스타일 변형에 따른 Tailwind 클래스 매핑
8
+ */
9
+ export declare const getTableVariantClasses: (variant?: TableVariant) => string;
10
+ /**
11
+ * Table 크기에 따른 Tailwind 클래스 매핑
12
+ */
13
+ export declare const getTableSizeClasses: (size?: TableSize) => string;
14
+ /**
15
+ * 컬럼 정렬에 따른 Tailwind 클래스 매핑
16
+ */
17
+ export declare const getColumnAlignClasses: (align?: "left" | "center" | "right") => string;
18
+ /**
19
+ * 테이블 헤더 기본 클래스
20
+ */
21
+ export declare const getTableHeaderClasses: () => string;
22
+ /**
23
+ * 테이블 헤더 셀 클래스 (패딩 최소화). 우측 보더로 컬럼 구분선.
24
+ */
25
+ export declare const getTableHeaderCellClasses: () => string;
26
+ /**
27
+ * 테이블 셀 기본 클래스
28
+ */
29
+ export declare const getTableCellClasses: () => string;
30
+ /**
31
+ * 셀 잘림 없이 표시 — overflow-hidden/text-ellipsis 제거 버전.
32
+ * MiniTable처럼 가로 스크롤로 컨텐츠 다 보여주는 컨텍스트용.
33
+ */
34
+ export declare const getTableCellClassesNoTruncate: () => string;
35
+ /**
36
+ * 스트라이프 행 스타일
37
+ * 첫 번째(index 0): 회색, 두 번째(index 1): 흰색
38
+ */
39
+ export declare const getStripedRowClasses: (index: number) => string;
40
+ /**
41
+ * 선택된 행 스타일
42
+ */
43
+ export declare const getSelectedRowClasses: () => string;
44
+ /**
45
+ * 호버 가능한 행 스타일
46
+ */
47
+ export declare const getHoverableRowClasses: () => string;
@@ -0,0 +1,16 @@
1
+ interface Props {
2
+ checked: boolean;
3
+ /** 일부만 선택된 상태(전체선택 헤더용). true이면 가로선 아이콘 표시. */
4
+ indeterminate?: boolean;
5
+ disabled?: boolean;
6
+ onChange?: (checked: boolean) => void;
7
+ /** 드래그 선택 등 부모가 클릭을 가로챌 때 hit-test를 비활성화한다. */
8
+ pointerEventsNone?: boolean;
9
+ ariaLabel?: string;
10
+ }
11
+ /**
12
+ * 테이블 전용 체크박스. 시각용 box를 label로 감싸 클릭/접근성을 확보하고, 드래그 선택 모드에선
13
+ * pointerEventsNone로 부모가 마우스를 가로챌 수 있게 한다.
14
+ */
15
+ export declare const TableCheckbox: import('react').ForwardRefExoticComponent<Props & import('react').RefAttributes<HTMLInputElement>>;
16
+ export {};
@@ -0,0 +1 @@
1
+ export { TableCheckbox } from './TableCheckbox';
@@ -0,0 +1,22 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * 페이지 헤더/툴바의 액션 버튼 크기 — 모바일은 mini, 그 외 small.
4
+ * 헤더 자체는 폰트/패딩이 Tailwind 반응형으로 줄어들지만 Button size prop은
5
+ * 클래스 토글이 아니라서 별도 훅으로 제공.
6
+ */
7
+ export declare function useHeaderButtonSize(): "mini" | "small";
8
+ interface TablePageLayoutProps {
9
+ children: ReactNode;
10
+ }
11
+ interface PageHeaderProps {
12
+ title: ReactNode;
13
+ /** 우측 액션 영역(버튼 등). 비우면 우측이 비워진 채 헤더만 렌더된다. */
14
+ children?: ReactNode;
15
+ }
16
+ interface TableCardProps {
17
+ children: ReactNode;
18
+ }
19
+ export declare function TablePageLayout({ children }: TablePageLayoutProps): import("react").JSX.Element;
20
+ export declare function PageHeader({ title, children }: PageHeaderProps): import("react").JSX.Element;
21
+ export declare function TableCard({ children }: TableCardProps): import("react").JSX.Element;
22
+ export {};
@@ -0,0 +1 @@
1
+ export { TablePageLayout, PageHeader, TableCard, useHeaderButtonSize, } from './TablePageLayout';
@@ -0,0 +1,10 @@
1
+ import { TextareaProps } from './types';
2
+ /**
3
+ * Textarea 컴포넌트.
4
+ *
5
+ * @example
6
+ * <Textarea label="메모" placeholder="내용을 입력하세요" rows={4} />
7
+ * <Textarea hasError help="필수 항목이에요" />
8
+ * <Textarea maxLength={200} showCount />
9
+ */
10
+ export declare const Textarea: import('react').ForwardRefExoticComponent<TextareaProps & import('react').RefAttributes<HTMLTextAreaElement>>;
@@ -0,0 +1,2 @@
1
+ export { Textarea } from './Textarea';
2
+ export type { TextareaProps, TextareaSize } from './types';
@@ -0,0 +1,38 @@
1
+ import { ComponentPropsWithoutRef, ReactNode } from 'react';
2
+ /**
3
+ * Textarea 사이즈. Button/Input/Select와 정렬된 토큰 — 같은 size에서 동일 rounded/horizontal padding.
4
+ * height는 가변이라 정렬 대상 아님(rows로 결정).
5
+ * - mini: 모바일/매우 좁은 영역
6
+ * - small: 다건 입력/표 형식 기본
7
+ * - medium: 폼 단독 입력 기본
8
+ * - large: 메인 페이지의 강조 입력
9
+ */
10
+ export type TextareaSize = "mini" | "small" | "medium" | "large";
11
+ export interface TextareaProps extends Omit<ComponentPropsWithoutRef<"textarea">, "size"> {
12
+ /**
13
+ * 사이즈 — Button/Input/Select와 정렬.
14
+ * @default 'medium'
15
+ */
16
+ textareaSize?: TextareaSize;
17
+ /** 상단 라벨 */
18
+ label?: string;
19
+ /** 하단 도움말 */
20
+ help?: ReactNode;
21
+ /** 에러 상태 */
22
+ hasError?: boolean;
23
+ /**
24
+ * 글자 수 카운터 표시 여부.
25
+ * maxLength prop이 있어야 의미가 있음 (예: `12 / 200`).
26
+ * @default false
27
+ */
28
+ showCount?: boolean;
29
+ /**
30
+ * 사용자가 크기 조절 가능 여부.
31
+ * 기본은 false — 모달/드로어/고정 레이아웃 안에서 UI 깨짐 방지.
32
+ * 자유 메모처럼 늘려쓸 필요가 있는 곳에서만 true.
33
+ * @default false
34
+ */
35
+ resize?: boolean;
36
+ /** 컨테이너 추가 클래스 */
37
+ containerClassName?: string;
38
+ }
@@ -0,0 +1,26 @@
1
+ export interface ToastProviderProps {
2
+ children?: React.ReactNode;
3
+ }
4
+ /**
5
+ * ToastProvider — 토스트 디자인이 적용된 react-hot-toast Toaster 래퍼.
6
+ *
7
+ * 앱 루트(또는 Storybook preview)에 한 번 마운트하면, 이후 `toast.success()` / `toast.error()` /
8
+ * `toast.loading()` / `toast()`(blank=info) 호출이 이 디자인으로 렌더된다.
9
+ * ActionToast(`showActionToast`)도 같은 Toaster를 공유한다.
10
+ *
11
+ * - 데스크탑: bottom-center / 모바일: top-center (safe-area-inset-top 반영)
12
+ * - 다크 그레이 배경 + lucide 아이콘 + 닫기 버튼
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * // 앱 루트
17
+ * <ToastProvider>
18
+ * <App />
19
+ * </ToastProvider>
20
+ *
21
+ * // 어디서든
22
+ * import toast from "react-hot-toast";
23
+ * toast.success("저장됐어요");
24
+ * ```
25
+ */
26
+ export declare function ToastProvider({ children }: ToastProviderProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ export { ToastProvider } from './ToastProvider';
2
+ export type { ToastProviderProps } from './ToastProvider';
3
+ export { default as toast } from 'react-hot-toast';