@bigtablet/design-system 1.21.0 β†’ 1.22.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.
package/README.md CHANGED
@@ -8,7 +8,6 @@
8
8
  [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
9
9
  [![Test Coverage](https://img.shields.io/badge/coverage-86%25-brightgreen.svg)](https://github.com/Bigtablet/bigtablet-design-system/actions)
10
10
  [![CI](https://github.com/Bigtablet/bigtablet-design-system/actions/workflows/ci.yml/badge.svg)](https://github.com/Bigtablet/bigtablet-design-system/actions/workflows/ci.yml)
11
- [![Storybook](https://img.shields.io/badge/Storybook-FF4785?logo=storybook&logoColor=white)](https://bigtablet.github.io/bigtablet-design-system)
12
11
 
13
12
  [πŸ‡°πŸ‡· ν•œκ΅­μ–΄](./README_KR.md) Β· πŸ‡ΊπŸ‡Έ English
14
13
 
@@ -17,7 +16,7 @@ The official design system of Bigtablet β€” a unified UI library composed of Fou
17
16
  > **Note**: This is Bigtablet's in-house design system, open-sourced for community reference.
18
17
  > External use is welcome, but minor versions may include breaking changes without prior notice.
19
18
 
20
- [GitHub](https://github.com/Bigtablet/bigtablet-design-system) Β· [NPM](https://www.npmjs.com/package/@bigtablet/design-system) Β· [Storybook](https://bigtablet.github.io/bigtablet-design-system)
19
+ [GitHub](https://github.com/Bigtablet/bigtablet-design-system) Β· [NPM](https://www.npmjs.com/package/@bigtablet/design-system)
21
20
 
22
21
  </div>
23
22
 
@@ -34,28 +33,32 @@ The official design system of Bigtablet β€” a unified UI library composed of Fou
34
33
  | 🎨 **Design Tokens** | Consistent token-based system for colors, typography, spacing |
35
34
  | β™Ώ **Accessibility** | Keyboard navigation, screen reader support, full ARIA attributes |
36
35
  | πŸ§ͺ **86% Coverage** | Stable test coverage powered by Vitest |
37
- | 🎭 **Storybook** | Interactive documentation for all components |
36
+ | 🎭 **Storybook** | Interactive component documentation (run locally via `pnpm storybook`) |
38
37
  | 🎯 **Zero Dependencies** | No bundled runtime dependencies β€” peer deps only |
39
38
 
40
39
  ---
41
40
 
42
41
  ## Installation
43
42
 
44
- ```bash
45
- # npm
46
- npm install @bigtablet/design-system
43
+ ### One-line setup (recommended)
47
44
 
48
- # yarn
49
- yarn add @bigtablet/design-system
45
+ Auto-detects your package manager (npm / yarn / pnpm / bun) and environment (React / Next.js), installs the package + peer deps, and prints CSS/Provider setup instructions.
50
46
 
51
- # pnpm
52
- pnpm add @bigtablet/design-system
47
+ ```bash
48
+ curl -fsSL https://raw.githubusercontent.com/Bigtablet/bigtablet-design-system/main/scripts/setup.sh | sh
53
49
  ```
54
50
 
55
- **Peer Dependencies**
51
+ ### Manual
56
52
 
57
53
  ```bash
58
- npm install react@^19 react-dom@^19 "lucide-react@>=0.552.0"
54
+ # npm
55
+ npm install @bigtablet/design-system react@^19 react-dom@^19 lucide-react
56
+
57
+ # yarn
58
+ yarn add @bigtablet/design-system react@^19 react-dom@^19 lucide-react
59
+
60
+ # pnpm
61
+ pnpm add @bigtablet/design-system react@^19 react-dom@^19 lucide-react
59
62
  ```
60
63
 
61
64
  > Requires **React 19** and **lucide-react β‰₯ 0.552.0**. Compatible with **Next.js 13+**.
@@ -315,6 +318,6 @@ pnpm test:coverage # Coverage report
315
318
 
316
319
  <div align="center">
317
320
 
318
- [GitHub](https://github.com/Bigtablet/bigtablet-design-system) Β· [NPM](https://www.npmjs.com/package/@bigtablet/design-system) Β· [Storybook](https://bigtablet.github.io/bigtablet-design-system) Β· [Issues](https://github.com/Bigtablet/bigtablet-design-system/issues)
321
+ [GitHub](https://github.com/Bigtablet/bigtablet-design-system) Β· [NPM](https://www.npmjs.com/package/@bigtablet/design-system) Β· [Issues](https://github.com/Bigtablet/bigtablet-design-system/issues)
319
322
 
320
323
  </div>
package/dist/index.css CHANGED
@@ -1,4 +1,12 @@
1
1
  /* src/ui/display/card/style.scss */
2
+ @keyframes skeleton_loading {
3
+ 0% {
4
+ background-position: 100% 0;
5
+ }
6
+ 100% {
7
+ background-position: 0 0;
8
+ }
9
+ }
2
10
  .card {
3
11
  background: #ffffff;
4
12
  border-radius: 12px;
@@ -42,6 +50,14 @@
42
50
  }
43
51
 
44
52
  /* src/ui/feedback/alert/style.scss */
53
+ @keyframes skeleton_loading {
54
+ 0% {
55
+ background-position: 100% 0;
56
+ }
57
+ 100% {
58
+ background-position: 0 0;
59
+ }
60
+ }
45
61
  @keyframes alert_fade_in {
46
62
  from {
47
63
  opacity: 0;
@@ -192,6 +208,14 @@
192
208
  }
193
209
 
194
210
  /* src/ui/feedback/spinner/style.scss */
211
+ @keyframes skeleton_loading {
212
+ 0% {
213
+ background-position: 100% 0;
214
+ }
215
+ 100% {
216
+ background-position: 0 0;
217
+ }
218
+ }
195
219
  @keyframes spinner_spin {
196
220
  to {
197
221
  transform: rotate(360deg);
@@ -207,6 +231,14 @@
207
231
  }
208
232
 
209
233
  /* src/ui/feedback/top-loading/style.scss */
234
+ @keyframes skeleton_loading {
235
+ 0% {
236
+ background-position: 100% 0;
237
+ }
238
+ 100% {
239
+ background-position: 0 0;
240
+ }
241
+ }
210
242
  .top_loading {
211
243
  position: fixed;
212
244
  top: 0;
@@ -235,6 +267,14 @@
235
267
  }
236
268
 
237
269
  /* src/ui/feedback/toast/style.scss */
270
+ @keyframes skeleton_loading {
271
+ 0% {
272
+ background-position: 100% 0;
273
+ }
274
+ 100% {
275
+ background-position: 0 0;
276
+ }
277
+ }
238
278
  @keyframes toast_slide_in {
239
279
  from {
240
280
  opacity: 0;
@@ -370,6 +410,14 @@
370
410
  }
371
411
 
372
412
  /* src/ui/general/button/style.scss */
413
+ @keyframes skeleton_loading {
414
+ 0% {
415
+ background-position: 100% 0;
416
+ }
417
+ 100% {
418
+ background-position: 0 0;
419
+ }
420
+ }
373
421
  .button {
374
422
  display: inline-flex;
375
423
  align-items: center;
@@ -450,6 +498,14 @@
450
498
  }
451
499
 
452
500
  /* src/ui/form/checkbox/style.scss */
501
+ @keyframes skeleton_loading {
502
+ 0% {
503
+ background-position: 100% 0;
504
+ }
505
+ 100% {
506
+ background-position: 0 0;
507
+ }
508
+ }
453
509
  .checkbox {
454
510
  display: inline-flex;
455
511
  align-items: center;
@@ -562,10 +618,19 @@
562
618
  }
563
619
 
564
620
  /* src/ui/form/file/style.scss */
621
+ @keyframes skeleton_loading {
622
+ 0% {
623
+ background-position: 100% 0;
624
+ }
625
+ 100% {
626
+ background-position: 0 0;
627
+ }
628
+ }
565
629
  .file_input {
566
630
  position: relative;
567
631
  display: inline-flex;
568
- align-items: center;
632
+ flex-direction: column;
633
+ align-items: flex-start;
569
634
  cursor: pointer;
570
635
  }
571
636
  .file_input:hover .file_input_label {
@@ -595,6 +660,13 @@
595
660
  box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.08);
596
661
  border-color: #000000;
597
662
  }
663
+ .file_input_helper {
664
+ display: block;
665
+ margin-top: 0.25rem;
666
+ font-size: 0.875rem;
667
+ line-height: 1.5;
668
+ color: #666666;
669
+ }
598
670
  .file_input_disabled {
599
671
  cursor: not-allowed;
600
672
  }
@@ -610,6 +682,14 @@
610
682
  }
611
683
 
612
684
  /* src/ui/form/radio/style.scss */
685
+ @keyframes skeleton_loading {
686
+ 0% {
687
+ background-position: 100% 0;
688
+ }
689
+ 100% {
690
+ background-position: 0 0;
691
+ }
692
+ }
613
693
  .radio {
614
694
  position: relative;
615
695
  display: inline-flex;
@@ -689,6 +769,14 @@
689
769
  }
690
770
 
691
771
  /* src/ui/general/select/style.scss */
772
+ @keyframes skeleton_loading {
773
+ 0% {
774
+ background-position: 100% 0;
775
+ }
776
+ 100% {
777
+ background-position: 0 0;
778
+ }
779
+ }
692
780
  .select {
693
781
  position: relative;
694
782
  display: inline-flex;
@@ -863,6 +951,14 @@
863
951
  }
864
952
 
865
953
  /* src/ui/form/switch/style.scss */
954
+ @keyframes skeleton_loading {
955
+ 0% {
956
+ background-position: 100% 0;
957
+ }
958
+ 100% {
959
+ background-position: 0 0;
960
+ }
961
+ }
866
962
  .switch {
867
963
  position: relative;
868
964
  display: inline-flex;
@@ -923,6 +1019,14 @@
923
1019
  }
924
1020
 
925
1021
  /* src/ui/form/textfield/style.scss */
1022
+ @keyframes skeleton_loading {
1023
+ 0% {
1024
+ background-position: 100% 0;
1025
+ }
1026
+ 100% {
1027
+ background-position: 0 0;
1028
+ }
1029
+ }
926
1030
  .text_field {
927
1031
  display: flex;
928
1032
  flex-direction: column;
@@ -1059,6 +1163,14 @@
1059
1163
  }
1060
1164
 
1061
1165
  /* src/ui/form/date-picker/style.scss */
1166
+ @keyframes skeleton_loading {
1167
+ 0% {
1168
+ background-position: 100% 0;
1169
+ }
1170
+ 100% {
1171
+ background-position: 0 0;
1172
+ }
1173
+ }
1062
1174
  .date_picker {
1063
1175
  display: flex;
1064
1176
  flex-direction: column;
@@ -1152,8 +1264,27 @@
1152
1264
  .date_picker_disabled .date_picker_label {
1153
1265
  color: #9ca3af;
1154
1266
  }
1267
+ .date_picker_sr_only {
1268
+ position: absolute;
1269
+ width: 1px;
1270
+ height: 1px;
1271
+ padding: 0;
1272
+ margin: -1px;
1273
+ overflow: hidden;
1274
+ clip: rect(0, 0, 0, 0);
1275
+ white-space: nowrap;
1276
+ border: 0;
1277
+ }
1155
1278
 
1156
1279
  /* src/ui/navigation/pagination/style.scss */
1280
+ @keyframes skeleton_loading {
1281
+ 0% {
1282
+ background-position: 100% 0;
1283
+ }
1284
+ 100% {
1285
+ background-position: 0 0;
1286
+ }
1287
+ }
1157
1288
  .pagination {
1158
1289
  display: flex;
1159
1290
  align-items: center;
@@ -1219,6 +1350,14 @@
1219
1350
  }
1220
1351
 
1221
1352
  /* src/ui/overlay/modal/style.scss */
1353
+ @keyframes skeleton_loading {
1354
+ 0% {
1355
+ background-position: 100% 0;
1356
+ }
1357
+ 100% {
1358
+ background-position: 0 0;
1359
+ }
1360
+ }
1222
1361
  .modal {
1223
1362
  position: fixed;
1224
1363
  inset: 0;
package/dist/index.d.ts CHANGED
@@ -1,9 +1,162 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
 
4
+ declare const colors: {
5
+ readonly primary: "#000000";
6
+ readonly primaryHover: "#333333";
7
+ readonly background: "#ffffff";
8
+ readonly backgroundSecondary: "#fafafa";
9
+ readonly backgroundNeutral: "#f3f3f3";
10
+ readonly backgroundMuted: "#f0f0f0";
11
+ readonly textPrimary: "#1a1a1a";
12
+ readonly textSecondary: "#666666";
13
+ readonly textTertiary: "#999999";
14
+ readonly border: "#e5e5e5";
15
+ readonly borderLight: "rgba(0, 0, 0, 0.08)";
16
+ readonly success: "#10b981";
17
+ readonly error: "#ef4444";
18
+ readonly warning: "#f59e0b";
19
+ readonly info: "#3b82f6";
20
+ readonly overlay: "rgba(0, 0, 0, 0.5)";
21
+ readonly hoverSubtle: "rgba(0, 0, 0, 0.03)";
22
+ readonly hoverLight: "rgba(0, 0, 0, 0.05)";
23
+ readonly textStrong: "#1F2937";
24
+ readonly textNormal: "#3B3B3B";
25
+ readonly textSubtle: "#6B7280";
26
+ readonly textDisabled: "#9CA3AF";
27
+ readonly textInverse: "#FFFFFF";
28
+ };
29
+
30
+ declare const spacing: {
31
+ readonly xs: "0.25rem";
32
+ readonly sm: "0.5rem";
33
+ readonly md: "0.75rem";
34
+ readonly lg: "1rem";
35
+ readonly xl: "1.25rem";
36
+ readonly "2xl": "1.5rem";
37
+ readonly "3xl": "2rem";
38
+ readonly "4xl": "2.5rem";
39
+ readonly "5xl": "3rem";
40
+ };
41
+
42
+ declare const typography: {
43
+ readonly fontFamily: {
44
+ readonly primary: "'Pretendard', sans-serif";
45
+ };
46
+ readonly fontSize: {
47
+ readonly xs: "0.75rem";
48
+ readonly sm: "0.875rem";
49
+ readonly base: "0.9375rem";
50
+ readonly md: "1rem";
51
+ readonly lg: "1.125rem";
52
+ readonly xl: "1.25rem";
53
+ readonly "2xl": "1.5rem";
54
+ readonly "3xl": "2rem";
55
+ readonly "4xl": "2.5rem";
56
+ };
57
+ readonly fontWeight: {
58
+ readonly thin: 100;
59
+ readonly extralight: 200;
60
+ readonly light: 300;
61
+ readonly regular: 400;
62
+ readonly medium: 500;
63
+ readonly semibold: 600;
64
+ readonly bold: 700;
65
+ readonly extrabold: 800;
66
+ readonly black: 900;
67
+ };
68
+ readonly lineHeight: {
69
+ readonly tight: 1.25;
70
+ readonly snug: 1.3;
71
+ readonly normal: 1.5;
72
+ readonly relaxed: 1.75;
73
+ };
74
+ readonly letterSpacing: {
75
+ readonly tight: "-0.02em";
76
+ readonly normal: "0";
77
+ readonly wide: "0.02em";
78
+ };
79
+ };
80
+
81
+ declare const radius: {
82
+ readonly sm: "6px";
83
+ readonly md: "8px";
84
+ readonly lg: "12px";
85
+ readonly xl: "16px";
86
+ readonly full: "9999px";
87
+ };
88
+
89
+ declare const shadows: {
90
+ readonly sm: "0 2px 4px rgba(0, 0, 0, 0.04)";
91
+ readonly md: "0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04)";
92
+ readonly lg: "0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06)";
93
+ readonly xl: "0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)";
94
+ };
95
+
96
+ declare const motion: {
97
+ readonly transition: {
98
+ readonly fast: "0.1s ease-in-out";
99
+ readonly base: "0.2s ease-in-out";
100
+ readonly slow: "0.3s ease-in-out";
101
+ readonly emphasized: "0.25s cubic-bezier(0.4, 0, 0.2, 1)";
102
+ readonly bounce: "0.3s cubic-bezier(0.16, 1, 0.3, 1)";
103
+ readonly fade: "0.15s ease-in-out";
104
+ readonly slide: "0.25s ease-in-out";
105
+ readonly scale: "0.2s cubic-bezier(0.2, 0.8, 0.2, 1)";
106
+ readonly state: "0.18s ease-in-out";
107
+ };
108
+ };
109
+
110
+ declare const skeleton: {
111
+ readonly color: {
112
+ readonly base: "#f3f3f3";
113
+ readonly wave: "#f0f0f0";
114
+ readonly highlight: "#fafafa";
115
+ };
116
+ readonly gradient: "linear-gradient(90deg, #f3f3f3 25%, #fafafa 37%, #f0f0f0 63%)";
117
+ readonly radius: {
118
+ readonly sm: "6px";
119
+ readonly md: "8px";
120
+ readonly lg: "12px";
121
+ };
122
+ readonly height: {
123
+ readonly xs: "0.25rem";
124
+ readonly sm: "0.5rem";
125
+ readonly md: "0.75rem";
126
+ readonly lg: "1rem";
127
+ readonly xl: "1.25rem";
128
+ };
129
+ readonly animation: {
130
+ readonly duration: "1.4s";
131
+ readonly timing: "ease-in-out";
132
+ };
133
+ };
134
+
135
+ declare const breakpoints: {
136
+ readonly mobile: 0;
137
+ readonly tablet: 768;
138
+ readonly laptop: 1024;
139
+ readonly desktop: 1440;
140
+ };
141
+
142
+ declare const zIndex: {
143
+ readonly loading: 9999;
144
+ readonly modal: 10000;
145
+ readonly toast: 10001;
146
+ };
147
+
148
+ declare const a11y: {
149
+ readonly focusRing: "0 0 0 3px rgba(0, 0, 0, 0.15)";
150
+ readonly focusRingError: "0 0 0 3px rgba(239, 68, 68, 0.15)";
151
+ readonly focusRingSuccess: "0 0 0 3px rgba(16, 185, 129, 0.15)";
152
+ readonly tapMinSize: "44px";
153
+ };
154
+
4
155
  interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
5
156
  /** μΉ΄λ“œ 상단에 ν‘œμ‹œν•  제λͺ© */
6
157
  heading?: React.ReactNode;
158
+ /** 제λͺ©μ— μ‚¬μš©ν•  μ‹œλ§¨ν‹± ν—€λ”© νƒœκ·Έ (κΈ°λ³Έκ°’: "h3"). μŠ€ν¬λ¦°λ¦¬λ” outline에 λ°˜μ˜λ©λ‹ˆλ‹€. */
159
+ headingAs?: "h2" | "h3" | "h4" | "h5" | "h6";
7
160
  /** μΉ΄λ“œ 그림자 크기 (κΈ°λ³Έκ°’: "sm") */
8
161
  shadow?: "none" | "sm" | "md" | "lg";
9
162
  /** μΉ΄λ“œ λ‚΄λΆ€ μ—¬λ°± (κΈ°λ³Έκ°’: "md") */
@@ -17,7 +170,7 @@ interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
17
170
  * @param props μΉ΄λ“œ 속성
18
171
  * @returns λ Œλ”λ§λœ μΉ΄λ“œ UI
19
172
  */
20
- declare const Card: ({ heading, shadow, padding, bordered, className, children, ...props }: CardProps) => react_jsx_runtime.JSX.Element;
173
+ declare const Card: ({ heading, headingAs: HeadingTag, shadow, padding, bordered, className, children, ...props }: CardProps) => react_jsx_runtime.JSX.Element;
21
174
 
22
175
  type AlertVariant = "info" | "success" | "warning" | "error";
23
176
  type AlertActionsAlign = "left" | "center" | "right";
@@ -167,10 +320,12 @@ interface CheckboxProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>
167
320
  declare const Checkbox: React.ForwardRefExoticComponent<CheckboxProps & React.RefAttributes<HTMLInputElement>>;
168
321
 
169
322
  interface FileInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
170
- /** 파일 선택 λ²„νŠΌ 라벨 ν…μŠ€νŠΈ (κΈ°λ³Έκ°’: "파일 선택") */
323
+ /** 파일 선택 λ²„νŠΌ 라벨 ν…μŠ€νŠΈ (κΈ°λ³Έκ°’: "Choose file") */
171
324
  label?: string;
172
325
  /** 파일 선택 μ‹œ ν˜ΈμΆœλ˜λŠ” 콜백 */
173
326
  onFiles?: (files: FileList | null) => void;
327
+ /** ν—ˆμš© 파일 ν˜•μ‹ μ•ˆλ‚΄ ν…μŠ€νŠΈ. μŠ€ν¬λ¦°λ¦¬λ”μ—κ²Œ μ „λ‹¬λ©λ‹ˆλ‹€. (예: "PDF, DOC 파일만 μ—…λ‘œλ“œ κ°€λŠ₯ν•©λ‹ˆλ‹€") */
328
+ helperText?: string;
174
329
  }
175
330
  /**
176
331
  * 파일 μž…λ ₯ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•œλ‹€.
@@ -178,7 +333,7 @@ interface FileInputProps extends React.InputHTMLAttributes<HTMLInputElement> {
178
333
  * @param props 파일 μž…λ ₯ 속성
179
334
  * @returns λ Œλ”λ§λœ 파일 μž…λ ₯ UI
180
335
  */
181
- declare const FileInput: ({ label, onFiles, className, disabled, ...props }: FileInputProps) => react_jsx_runtime.JSX.Element;
336
+ declare const FileInput: ({ label, onFiles, helperText, className, disabled, ...props }: FileInputProps) => react_jsx_runtime.JSX.Element;
182
337
 
183
338
  interface RadioProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, "size"> {
184
339
  /** λΌλ””μ˜€ λ²„νŠΌ μ˜†μ— ν‘œμ‹œν•  라벨 */
@@ -334,6 +489,16 @@ interface DatePickerProps {
334
489
  monthLabel?: string;
335
490
  /** 일 select의 aria-label 및 빈 μ˜΅μ…˜ ν…μŠ€νŠΈ (κΈ°λ³Έκ°’: "Day") */
336
491
  dayLabel?: string;
492
+ /**
493
+ * minDate μ„€μ • μ‹œ μŠ€ν¬λ¦°λ¦¬λ”μ— 전달할 μ•ˆλ‚΄ 문ꡬ 포맷.
494
+ * `{date}` μžλ¦¬μ— minDate 값이 μΉ˜ν™˜λ©λ‹ˆλ‹€. (κΈ°λ³Έκ°’: "Minimum date: {date}")
495
+ */
496
+ minDateSrFormat?: string;
497
+ /**
498
+ * selectableRange="until-today" μ„€μ • μ‹œ μŠ€ν¬λ¦°λ¦¬λ”μ— 전달할 μ•ˆλ‚΄ 문ꡬ.
499
+ * (κΈ°λ³Έκ°’: "Selectable up to today")
500
+ */
501
+ selectableRangeUntilTodaySrText?: string;
337
502
  }
338
503
  /**
339
504
  * μ—°/μ›”/일 μ„ νƒν˜• 데이트 피컀λ₯Ό λ Œλ”λ§ν•œλ‹€.
@@ -341,7 +506,7 @@ interface DatePickerProps {
341
506
  * @param props 데이트 피컀 속성
342
507
  * @returns λ Œλ”λ§λœ 데이트 피컀 UI
343
508
  */
344
- declare const DatePicker: ({ label, value, onChange, mode, startYear, endYear, minDate, selectableRange, disabled, fullWidth, width, yearLabel, monthLabel, dayLabel, }: DatePickerProps) => react_jsx_runtime.JSX.Element;
509
+ declare const DatePicker: ({ label, value, onChange, mode, startYear, endYear, minDate, selectableRange, disabled, fullWidth, width, yearLabel, monthLabel, dayLabel, minDateSrFormat, selectableRangeUntilTodaySrText, }: DatePickerProps) => react_jsx_runtime.JSX.Element;
345
510
 
346
511
  interface PaginationProps {
347
512
  /** ν˜„μž¬ νŽ˜μ΄μ§€ 번호 (1-based) */
@@ -385,4 +550,4 @@ interface ModalProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title">
385
550
  */
386
551
  declare const Modal: ({ open, onClose, closeOnOverlay, width, title, children, className, ariaLabel, ...props }: ModalProps) => react_jsx_runtime.JSX.Element | null;
387
552
 
388
- export { AlertProvider, Button, Card, Checkbox, DatePicker, FileInput, Modal, Pagination, Radio, Select, type SelectOption, Spinner, Switch, TextField, ToastProvider, TopLoading, useAlert, useToast };
553
+ export { AlertProvider, Button, Card, Checkbox, DatePicker, FileInput, Modal, Pagination, Radio, Select, type SelectOption, Spinner, Switch, TextField, ToastProvider, TopLoading, a11y, breakpoints, colors, motion, radius, shadows, skeleton, spacing, typography, useAlert, useToast, zIndex };
package/dist/index.js CHANGED
@@ -6,6 +6,180 @@ import { jsxs, jsx } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
7
7
  import { ChevronDown, Check, X, Bell, Info, AlertTriangle, XCircle, CheckCircle2 } from 'lucide-react';
8
8
 
9
+ // src/styles/ts/colors.ts
10
+ var colors = {
11
+ primary: "#000000",
12
+ primaryHover: "#333333",
13
+ background: "#ffffff",
14
+ backgroundSecondary: "#fafafa",
15
+ backgroundNeutral: "#f3f3f3",
16
+ backgroundMuted: "#f0f0f0",
17
+ textPrimary: "#1a1a1a",
18
+ textSecondary: "#666666",
19
+ textTertiary: "#999999",
20
+ border: "#e5e5e5",
21
+ borderLight: "rgba(0, 0, 0, 0.08)",
22
+ success: "#10b981",
23
+ error: "#ef4444",
24
+ warning: "#f59e0b",
25
+ info: "#3b82f6",
26
+ overlay: "rgba(0, 0, 0, 0.5)",
27
+ hoverSubtle: "rgba(0, 0, 0, 0.03)",
28
+ hoverLight: "rgba(0, 0, 0, 0.05)",
29
+ textStrong: "#1F2937",
30
+ textNormal: "#3B3B3B",
31
+ textSubtle: "#6B7280",
32
+ textDisabled: "#9CA3AF",
33
+ textInverse: "#FFFFFF"
34
+ };
35
+
36
+ // src/styles/ts/spacing.ts
37
+ var spacing = {
38
+ xs: "0.25rem",
39
+ // 4px
40
+ sm: "0.5rem",
41
+ // 8px
42
+ md: "0.75rem",
43
+ // 12px
44
+ lg: "1rem",
45
+ // 16px
46
+ xl: "1.25rem",
47
+ // 20px
48
+ "2xl": "1.5rem",
49
+ // 24px
50
+ "3xl": "2rem",
51
+ // 32px
52
+ "4xl": "2.5rem",
53
+ // 40px
54
+ "5xl": "3rem"
55
+ // 48px
56
+ };
57
+
58
+ // src/styles/ts/typography.ts
59
+ var typography = {
60
+ fontFamily: {
61
+ primary: "'Pretendard', sans-serif"
62
+ },
63
+ fontSize: {
64
+ xs: "0.75rem",
65
+ sm: "0.875rem",
66
+ base: "0.9375rem",
67
+ md: "1rem",
68
+ lg: "1.125rem",
69
+ xl: "1.25rem",
70
+ "2xl": "1.5rem",
71
+ "3xl": "2rem",
72
+ "4xl": "2.5rem"
73
+ },
74
+ fontWeight: {
75
+ thin: 100,
76
+ extralight: 200,
77
+ light: 300,
78
+ regular: 400,
79
+ medium: 500,
80
+ semibold: 600,
81
+ bold: 700,
82
+ extrabold: 800,
83
+ black: 900
84
+ },
85
+ lineHeight: {
86
+ tight: 1.25,
87
+ snug: 1.3,
88
+ normal: 1.5,
89
+ relaxed: 1.75
90
+ },
91
+ letterSpacing: {
92
+ tight: "-0.02em",
93
+ normal: "0",
94
+ wide: "0.02em"
95
+ }
96
+ };
97
+
98
+ // src/styles/ts/radius.ts
99
+ var radius = {
100
+ sm: "6px",
101
+ md: "8px",
102
+ lg: "12px",
103
+ xl: "16px",
104
+ full: "9999px"
105
+ };
106
+
107
+ // src/styles/ts/shadows.ts
108
+ var shadows = {
109
+ sm: "0 2px 4px rgba(0, 0, 0, 0.04)",
110
+ md: "0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04)",
111
+ lg: "0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06)",
112
+ xl: "0 20px 25px -5px rgba(0,0,0,0.1), 0 10px 10px -5px rgba(0,0,0,0.04)"
113
+ };
114
+
115
+ // src/styles/ts/motion.ts
116
+ var motion = {
117
+ transition: {
118
+ fast: "0.1s ease-in-out",
119
+ base: "0.2s ease-in-out",
120
+ slow: "0.3s ease-in-out",
121
+ emphasized: "0.25s cubic-bezier(0.4, 0, 0.2, 1)",
122
+ bounce: "0.3s cubic-bezier(0.16, 1, 0.3, 1)",
123
+ fade: "0.15s ease-in-out",
124
+ slide: "0.25s ease-in-out",
125
+ scale: "0.2s cubic-bezier(0.2, 0.8, 0.2, 1)",
126
+ state: "0.18s ease-in-out"
127
+ }
128
+ };
129
+
130
+ // src/styles/ts/skeleton.ts
131
+ var skeleton = {
132
+ color: {
133
+ base: colors.backgroundNeutral,
134
+ wave: colors.backgroundMuted,
135
+ highlight: colors.backgroundSecondary
136
+ },
137
+ gradient: `linear-gradient(90deg, ${colors.backgroundNeutral} 25%, ${colors.backgroundSecondary} 37%, ${colors.backgroundMuted} 63%)`,
138
+ radius: {
139
+ sm: radius.sm,
140
+ md: radius.md,
141
+ lg: radius.lg
142
+ },
143
+ height: {
144
+ xs: spacing.xs,
145
+ sm: spacing.sm,
146
+ md: spacing.md,
147
+ lg: spacing.lg,
148
+ xl: spacing.xl
149
+ },
150
+ animation: {
151
+ duration: "1.4s",
152
+ timing: "ease-in-out"
153
+ }
154
+ };
155
+
156
+ // src/styles/ts/breakpoints.ts
157
+ var breakpoints = {
158
+ mobile: 0,
159
+ // ~767
160
+ tablet: 768,
161
+ // 768 ~ 1023
162
+ laptop: 1024,
163
+ // 1024 ~ 1439
164
+ desktop: 1440
165
+ // 1440+
166
+ };
167
+
168
+ // src/styles/ts/z-index.ts
169
+ var zIndex = {
170
+ loading: 9999,
171
+ modal: 1e4,
172
+ toast: 10001
173
+ };
174
+
175
+ // src/styles/ts/a11y.ts
176
+ var a11y = {
177
+ focusRing: "0 0 0 3px rgba(0, 0, 0, 0.15)",
178
+ focusRingError: "0 0 0 3px rgba(239, 68, 68, 0.15)",
179
+ focusRingSuccess: "0 0 0 3px rgba(16, 185, 129, 0.15)",
180
+ tapMinSize: "44px"
181
+ };
182
+
9
183
  // src/utils/cn.ts
10
184
  var cn = (...classes) => {
11
185
  const classNames = [];
@@ -90,6 +264,7 @@ function useFocusTrap(containerRef, isActive) {
90
264
  }
91
265
  var Card = ({
92
266
  heading,
267
+ headingAs: HeadingTag = "h3",
93
268
  shadow = "sm",
94
269
  padding = "md",
95
270
  bordered = false,
@@ -105,7 +280,7 @@ var Card = ({
105
280
  className
106
281
  );
107
282
  return /* @__PURE__ */ jsxs("div", { className: cardClassName, ...props, children: [
108
- heading ? /* @__PURE__ */ jsx("div", { className: "card_title", children: heading }) : null,
283
+ heading ? /* @__PURE__ */ jsx(HeadingTag, { className: "card_title", children: heading }) : null,
109
284
  /* @__PURE__ */ jsx("div", { className: "card_body", children })
110
285
  ] });
111
286
  };
@@ -431,11 +606,13 @@ Checkbox.displayName = "Checkbox";
431
606
  var FileInput = ({
432
607
  label = "Choose file",
433
608
  onFiles,
609
+ helperText,
434
610
  className,
435
611
  disabled,
436
612
  ...props
437
613
  }) => {
438
614
  const inputId = React7.useId();
615
+ const helperId = React7.useId();
439
616
  const rootClassName = [
440
617
  "file_input",
441
618
  disabled && "file_input_disabled",
@@ -449,11 +626,13 @@ var FileInput = ({
449
626
  type: "file",
450
627
  className: "file_input_control",
451
628
  disabled,
629
+ "aria-describedby": helperText ? helperId : void 0,
452
630
  onChange: (e) => onFiles?.(e.currentTarget.files),
453
631
  ...props
454
632
  }
455
633
  ),
456
- /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "file_input_label", children: label })
634
+ /* @__PURE__ */ jsx("label", { htmlFor: inputId, className: "file_input_label", children: label }),
635
+ helperText && /* @__PURE__ */ jsx("span", { id: helperId, className: "file_input_helper", children: helperText })
457
636
  ] });
458
637
  };
459
638
  var Radio = React7.forwardRef(
@@ -823,9 +1002,12 @@ var DatePicker = ({
823
1002
  width,
824
1003
  yearLabel = "Year",
825
1004
  monthLabel = "Month",
826
- dayLabel = "Day"
1005
+ dayLabel = "Day",
1006
+ minDateSrFormat = "Minimum date: {date}",
1007
+ selectableRangeUntilTodaySrText = "Selectable up to today"
827
1008
  }) => {
828
1009
  const groupId = React7.useId();
1010
+ const constraintId = React7.useId();
829
1011
  const today = /* @__PURE__ */ new Date();
830
1012
  const todayYear = today.getFullYear();
831
1013
  const todayMonth = today.getMonth() + 1;
@@ -852,14 +1034,20 @@ var DatePicker = ({
852
1034
  };
853
1035
  const containerStyle = width ? { width: normalizeWidth(width) } : void 0;
854
1036
  const rootClassName = cn("date_picker", { date_picker_full_width: fullWidth && !width });
1037
+ const constraintParts = [];
1038
+ if (minDate) constraintParts.push(minDateSrFormat.replace("{date}", minDate));
1039
+ if (selectableRange === "until-today") constraintParts.push(selectableRangeUntilTodaySrText);
1040
+ const constraintDesc = constraintParts.join(". ");
855
1041
  return /* @__PURE__ */ jsxs("div", { className: rootClassName, style: containerStyle, children: [
856
1042
  label && /* @__PURE__ */ jsx("label", { className: "date_picker_label", id: groupId, children: label }),
1043
+ constraintDesc && /* @__PURE__ */ jsx("span", { id: constraintId, className: "date_picker_sr_only", children: constraintDesc }),
857
1044
  /* @__PURE__ */ jsxs(
858
1045
  "div",
859
1046
  {
860
1047
  className: "date_picker_fields",
861
1048
  role: "group",
862
1049
  "aria-labelledby": label ? groupId : void 0,
1050
+ "aria-describedby": constraintDesc ? constraintId : void 0,
863
1051
  children: [
864
1052
  /* @__PURE__ */ jsxs(
865
1053
  "select",
@@ -953,6 +1141,7 @@ var Pagination = ({ page, totalPages, onChange, prevLabel = "Previous page", nex
953
1141
  /* @__PURE__ */ jsx(
954
1142
  "button",
955
1143
  {
1144
+ type: "button",
956
1145
  className: "pagination_item",
957
1146
  onClick: () => onChange(page - 1),
958
1147
  disabled: prevDisabled,
@@ -983,6 +1172,7 @@ var Pagination = ({ page, totalPages, onChange, prevLabel = "Previous page", nex
983
1172
  /* @__PURE__ */ jsx(
984
1173
  "button",
985
1174
  {
1175
+ type: "button",
986
1176
  className: "pagination_item",
987
1177
  onClick: () => onChange(page + 1),
988
1178
  disabled: nextDisabled,
@@ -1065,4 +1255,4 @@ var Modal = ({
1065
1255
  );
1066
1256
  };
1067
1257
 
1068
- export { AlertProvider, Button, Card, Checkbox, DatePicker, FileInput, Modal, Pagination, Radio, Select, Spinner, Switch, TextField, ToastProvider, TopLoading, useAlert, useToast };
1258
+ export { AlertProvider, Button, Card, Checkbox, DatePicker, FileInput, Modal, Pagination, Radio, Select, Spinner, Switch, TextField, ToastProvider, TopLoading, a11y, breakpoints, colors, motion, radius, shadows, skeleton, spacing, typography, useAlert, useToast, zIndex };
package/dist/next.css CHANGED
@@ -1,4 +1,12 @@
1
1
  /* src/ui/navigation/sidebar/style.scss */
2
+ @keyframes skeleton_loading {
3
+ 0% {
4
+ background-position: 100% 0;
5
+ }
6
+ 100% {
7
+ background-position: 0 0;
8
+ }
9
+ }
2
10
  .sidebar {
3
11
  display: flex;
4
12
  flex-direction: column;
package/dist/next.js CHANGED
@@ -94,6 +94,7 @@ var Sidebar = ({
94
94
  "sidebar_chevron",
95
95
  open && "sidebar_chevron_open"
96
96
  ].filter(Boolean).join(" ");
97
+ const subId = `sidebar_sub_${item.id}`;
97
98
  return /* @__PURE__ */ jsxs("div", { className: "sidebar_group", children: [
98
99
  /* @__PURE__ */ jsxs(
99
100
  "button",
@@ -101,6 +102,7 @@ var Sidebar = ({
101
102
  type: "button",
102
103
  className: "sidebar_item",
103
104
  "aria-expanded": open,
105
+ "aria-controls": subId,
104
106
  onClick: () => toggleGroup(item.id),
105
107
  children: [
106
108
  /* @__PURE__ */ jsxs("div", { className: "sidebar_item_left", children: [
@@ -117,7 +119,7 @@ var Sidebar = ({
117
119
  ]
118
120
  }
119
121
  ),
120
- /* @__PURE__ */ jsx("div", { className: subClassName, children: item.children.map((child) => {
122
+ /* @__PURE__ */ jsx("div", { id: subId, className: subClassName, children: item.children.map((child) => {
121
123
  const active2 = isActive(
122
124
  child.href
123
125
  );
@@ -131,6 +133,7 @@ var Sidebar = ({
131
133
  href: child.href,
132
134
  className: subItemClassName,
133
135
  "aria-current": active2 ? "page" : void 0,
136
+ tabIndex: open ? void 0 : -1,
134
137
  onClick: () => onItemSelect?.(
135
138
  child.href
136
139
  ),
@@ -1,8 +1,9 @@
1
- @use "src/styles/scss/token" as token;
1
+ // Standalone skeleton tokens β€” no external @use so consumers can import
2
+ // this file directly without needing the design system's src/ in their loadPaths.
2
3
 
3
- $color_skeleton_base: token.$color_background_neutral;
4
- $color_skeleton_wave: token.$color_background_muted;
5
- $color_skeleton_highlight: token.$color_background_secondary;
4
+ $color_skeleton_base: #F3F3F3;
5
+ $color_skeleton_wave: #f0f0f0;
6
+ $color_skeleton_highlight: #fafafa;
6
7
 
7
8
  $skeleton_gradient: linear-gradient(
8
9
  90deg,
@@ -11,15 +12,15 @@ $skeleton_gradient: linear-gradient(
11
12
  $color_skeleton_wave 63%
12
13
  );
13
14
 
14
- $skeleton_radius_sm: token.$radius_sm;
15
- $skeleton_radius_md: token.$radius_md;
16
- $skeleton_radius_lg: token.$radius_lg;
15
+ $skeleton_radius_sm: 6px;
16
+ $skeleton_radius_md: 8px;
17
+ $skeleton_radius_lg: 12px;
17
18
 
18
- $skeleton_height_xs: token.$spacing_xs;
19
- $skeleton_height_sm: token.$spacing_sm;
20
- $skeleton_height_md: token.$spacing_md;
21
- $skeleton_height_lg: token.$spacing_lg;
22
- $skeleton_height_xl: token.$spacing_xl;
19
+ $skeleton_height_xs: 0.25rem; // 4px
20
+ $skeleton_height_sm: 0.5rem; // 8px
21
+ $skeleton_height_md: 0.75rem; // 12px
22
+ $skeleton_height_lg: 1rem; // 16px
23
+ $skeleton_height_xl: 1.25rem; // 20px
23
24
 
24
25
  $skeleton_animation_duration: 1.4s;
25
26
  $skeleton_animation_timing: ease-in-out;
@@ -48,13 +49,13 @@ $skeleton_animation_timing: ease-in-out;
48
49
  @include skeleton(100%, $skeleton_height_xl);
49
50
  }
50
51
 
51
- @mixin skeleton_avatar($size: token.$spacing_6xl) {
52
+ @mixin skeleton_avatar($size: 2.5rem) {
52
53
  @include skeleton($size, $size, $skeleton_radius_lg);
53
54
  }
54
55
 
55
56
  @mixin skeleton_rect(
56
57
  $width: 100%,
57
- $height: token.$spacing_8xl
58
+ $height: 5rem
58
59
  ) {
59
60
  @include skeleton($width, $height, $skeleton_radius_md);
60
61
  }
@@ -66,4 +67,4 @@ $skeleton_animation_timing: ease-in-out;
66
67
  100% {
67
68
  background-position: 0 0;
68
69
  }
69
- }
70
+ }
@@ -5,6 +5,7 @@
5
5
  @forward "motion";
6
6
  @forward "radius";
7
7
  @forward "shadows";
8
+ @forward "skeleton";
8
9
  @forward "spacing";
9
10
  @forward "typography";
10
11
  @forward "z-index";
@@ -1 +1 @@
1
- :root{--bt-color-primary: #000000;--bt-color-primary-hover: #333333;--bt-color-background: #ffffff;--bt-color-background-secondary: #fafafa;--bt-color-background-neutral: #F3F3F3;--bt-color-background-muted: #f0f0f0;--bt-color-text-primary: #1a1a1a;--bt-color-text-secondary: #666666;--bt-color-text-tertiary: #999999;--bt-text-inverse: #ffffff;--bt-text-disabled: #9ca3af;--bt-color-border: #e5e5e5;--bt-color-border-light: rgba(0, 0, 0, 0.08);--bt-color-success: #10b981;--bt-color-error: #ef4444;--bt-color-warning: #f59e0b;--bt-color-info: #3b82f6;--bt-color-overlay: rgba(0, 0, 0, 0.5);--bt-spacing-xs: 0.25rem;--bt-spacing-sm: 0.5rem;--bt-spacing-md: 0.75rem;--bt-spacing-lg: 1rem;--bt-spacing-xl: 1.25rem;--bt-spacing-2xl: 1.5rem;--bt-spacing-3xl: 1.75rem;--bt-font-family: Pretendard, sans-serif;--bt-font-size-xs: 0.75rem;--bt-font-size-sm: 0.875rem;--bt-font-size-base: 0.9375rem;--bt-font-size-md: 1rem;--bt-font-size-lg: 1.125rem;--bt-font-size-xl: 1.25rem;--bt-font-weight-regular: 400;--bt-font-weight-medium: 500;--bt-font-weight-semibold: 600;--bt-font-weight-bold: 700;--bt-line-height-normal: 1.5;--bt-radius-sm: 6px;--bt-radius-md: 8px;--bt-radius-lg: 12px;--bt-radius-full: 9999px;--bt-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.04);--bt-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);--bt-shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06);--bt-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);--bt-transition-fast: 0.1s ease-in-out;--bt-transition-base: 0.2s ease-in-out;--bt-transition-slow: 0.3s ease-in-out;--bt-z-modal: 10000;--bt-z-toast: 10001}.bt-button{display:inline-flex;align-items:center;justify-content:center;gap:var(--bt-spacing-sm);border-radius:var(--bt-radius-md);border:none;cursor:pointer;font-family:var(--bt-font-family);font-weight:var(--bt-font-weight-medium);transition:background var(--bt-transition-base),color var(--bt-transition-base),box-shadow var(--bt-transition-base),transform var(--bt-transition-base)}.bt-button:disabled{cursor:not-allowed;opacity:.6}.bt-button--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-button--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-button--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-button--primary{background:var(--bt-color-primary);color:var(--bt-color-background)}.bt-button--primary:hover:not(:disabled){background:var(--bt-color-primary-hover)}.bt-button--primary:active:not(:disabled){transform:scale(0.98)}.bt-button--secondary{background:rgba(0,0,0,0);border:1px solid var(--bt-color-border);color:var(--bt-color-text-primary)}.bt-button--secondary:hover:not(:disabled){background:var(--bt-color-background-secondary)}.bt-button--secondary:active:not(:disabled){transform:scale(0.98)}.bt-button--ghost{background:rgba(0,0,0,0);color:var(--bt-color-text-primary)}.bt-button--ghost:hover:not(:disabled){background:rgba(0,0,0,.05)}.bt-button--ghost:active:not(:disabled){transform:scale(0.96)}.bt-button--danger{background:var(--bt-color-error);color:var(--bt-color-background)}.bt-button--danger:hover:not(:disabled){background:rgb(235.7842364532, 30.4157635468, 30.4157635468)}.bt-button--danger:active:not(:disabled){transform:scale(0.98)}.bt-button--full-width{width:100%}.bt-text-field{display:flex;flex-direction:column}.bt-text-field--full-width{width:100%}.bt-text-field__label{margin-bottom:var(--bt-spacing-xs);color:var(--bt-color-text-primary);font-size:var(--bt-font-size-sm);font-weight:var(--bt-font-weight-medium);line-height:var(--bt-line-height-normal)}.bt-text-field__wrap{position:relative;display:inline-flex;width:100%;align-items:center}.bt-text-field__input{width:100%;border-radius:var(--bt-radius-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary);background:var(--bt-color-background);transition:border-color var(--bt-transition-base),box-shadow var(--bt-transition-base),background var(--bt-transition-base)}.bt-text-field__input::placeholder{color:var(--bt-color-text-tertiary)}.bt-text-field__input:disabled{cursor:not-allowed;background:var(--bt-color-background-secondary);color:var(--bt-color-text-tertiary);opacity:.7}.bt-text-field__input--outline{border:1px solid var(--bt-color-border)}.bt-text-field__input--outline:hover:not(:disabled){border-color:var(--bt-color-border-light)}.bt-text-field__input--outline:focus-visible{outline:none;border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-text-field__input--filled{background:var(--bt-color-background-secondary);border:1px solid rgba(0,0,0,0)}.bt-text-field__input--filled:focus-visible{outline:none;border-color:var(--bt-color-primary);background:var(--bt-color-background);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-text-field__input--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-text-field__input--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-text-field__input--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-text-field__input--error{border-color:var(--bt-color-error) !important;box-shadow:0 0 0 3px rgba(239,68,68,.15) !important}.bt-text-field__input--success{border-color:var(--bt-color-success) !important;box-shadow:0 0 0 3px rgba(16,185,129,.15) !important}.bt-text-field__helper{margin-top:var(--bt-spacing-xs);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-secondary)}.bt-text-field__helper--error{color:var(--bt-color-error)}.bt-text-field__helper--success{color:var(--bt-color-success)}.bt-text-field__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;color:var(--bt-color-text-secondary)}.bt-text-field__icon--left{left:var(--bt-spacing-md)}.bt-text-field__icon--right{right:var(--bt-spacing-md)}.bt-checkbox{display:inline-flex;align-items:center;gap:var(--bt-spacing-sm);cursor:pointer;user-select:none;position:relative}.bt-checkbox__input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.bt-checkbox__box{width:1.125rem;height:1.125rem;box-sizing:border-box;border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-sm);background:var(--bt-color-background);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base);display:inline-block;position:relative}.bt-checkbox__label{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-checkbox--sm .bt-checkbox__box{width:1rem;height:1rem}.bt-checkbox--sm .bt-checkbox__label{font-size:var(--bt-font-size-sm)}.bt-checkbox--lg .bt-checkbox__box{width:1.25rem;height:1.25rem}.bt-checkbox--lg .bt-checkbox__label{font-size:var(--bt-font-size-md)}.bt-checkbox__input:focus-visible+.bt-checkbox__box{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-checkbox__input:disabled+.bt-checkbox__box,.bt-checkbox__input:disabled~.bt-checkbox__label{opacity:.6;cursor:not-allowed}.bt-checkbox__input:checked+.bt-checkbox__box{background:var(--bt-color-primary);border-color:var(--bt-color-primary)}.bt-checkbox__input:checked+.bt-checkbox__box::after{content:"";position:absolute;left:50%;top:50%;width:.28rem;height:.55rem;border:2px solid var(--bt-color-background);border-top:0;border-left:0;transform:translate(-50%, -58%) rotate(45deg)}.bt-radio{position:relative;display:inline-flex;align-items:center;gap:var(--bt-spacing-sm);cursor:pointer;user-select:none}.bt-radio__input{position:absolute;inset:0;opacity:0;cursor:pointer;margin:0}.bt-radio__dot{width:1.125rem;height:1.125rem;box-sizing:border-box;border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-full);background:var(--bt-color-background);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base);position:relative;display:inline-block}.bt-radio__label{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-radio--sm .bt-radio__dot{width:1rem;height:1rem}.bt-radio--sm .bt-radio__label{font-size:var(--bt-font-size-sm)}.bt-radio--lg .bt-radio__dot{width:1.25rem;height:1.25rem}.bt-radio--lg .bt-radio__label{font-size:var(--bt-font-size-md)}.bt-radio__input:focus-visible+.bt-radio__dot{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-radio__input:checked+.bt-radio__dot{border-color:var(--bt-color-primary)}.bt-radio__input:checked+.bt-radio__dot::after{content:"";position:absolute;left:50%;top:50%;width:60%;height:60%;transform:translate(-50%, -50%);background:var(--bt-color-primary);border-radius:9999px}.bt-radio__input:disabled+.bt-radio__dot,.bt-radio__input:disabled~.bt-radio__label{opacity:.6;cursor:not-allowed}.bt-switch{position:relative;display:inline-flex;align-items:center;width:40px;height:22px;padding:2px;border-radius:var(--bt-radius-full);background:var(--bt-color-border);transition:background var(--bt-transition-base);cursor:pointer;border:none}.bt-switch__thumb{width:18px;height:18px;background:var(--bt-color-background);border-radius:var(--bt-radius-full);transition:transform var(--bt-transition-base);transform:translateX(0)}.bt-switch--on{background:var(--bt-color-primary)}.bt-switch--on .bt-switch__thumb{transform:translateX(18px)}.bt-switch--sm{width:34px;height:18px}.bt-switch--sm .bt-switch__thumb{width:14px;height:14px}.bt-switch--sm.bt-switch--on .bt-switch__thumb{transform:translateX(16px)}.bt-switch--lg{width:48px;height:26px}.bt-switch--lg .bt-switch__thumb{width:22px;height:22px}.bt-switch--lg.bt-switch--on .bt-switch__thumb{transform:translateX(22px)}.bt-switch--disabled{opacity:.6;cursor:not-allowed}.bt-select{position:relative;display:inline-flex;flex-direction:column;width:100%;gap:var(--bt-spacing-xs);font-family:var(--bt-font-family)}.bt-select__label{font-size:var(--bt-font-size-sm);font-weight:var(--bt-font-weight-medium);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-select__control{width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--bt-spacing-sm);cursor:pointer;color:var(--bt-color-text-primary);background:var(--bt-color-background);border-radius:var(--bt-radius-md);transition:border-color var(--bt-transition-base),box-shadow var(--bt-transition-base),background var(--bt-transition-base);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);border:none;text-align:left}.bt-select__control:disabled,.bt-select__control.is-disabled{cursor:not-allowed;opacity:.7;background:var(--bt-color-background-secondary);color:var(--bt-color-text-tertiary)}.bt-select__control--outline{border:1px solid var(--bt-color-border)}.bt-select__control--outline:hover:not(.is-disabled){border-color:var(--bt-color-border-light)}.bt-select__control--outline.is-open{border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-select__control--filled{background:var(--bt-color-background-secondary);border:1px solid rgba(0,0,0,0)}.bt-select__control--filled.is-open{background:var(--bt-color-background);border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-select__control--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-select__control--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-select__control--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-select__value{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bt-select__placeholder{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--bt-color-text-tertiary)}.bt-select__icon{display:inline-flex;align-items:center;justify-content:center;color:var(--bt-color-text-secondary);transition:transform var(--bt-transition-base)}.bt-select__icon.is-open{transform:rotate(180deg)}.bt-select__list{position:absolute;z-index:var(--bt-z-modal);top:100%;left:0;width:100%;min-width:100%;box-sizing:border-box;margin-top:var(--bt-spacing-xs);background:var(--bt-color-background);border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-md);box-shadow:var(--bt-shadow-md);max-height:18rem;overflow-y:auto;overflow-x:hidden;padding:var(--bt-spacing-xs) 0;list-style:none;margin:var(--bt-spacing-xs) 0 0 0}.bt-select__list--up{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bt-spacing-xs)}.bt-select__option{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:var(--bt-spacing-sm);padding:var(--bt-spacing-sm) var(--bt-spacing-lg);cursor:pointer;color:var(--bt-color-text-primary);background:rgba(0,0,0,0);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal)}.bt-select__option:hover,.bt-select__option.is-active{background:var(--bt-color-background-secondary)}.bt-select__option.is-selected{font-weight:var(--bt-font-weight-medium)}.bt-select__option.is-disabled{cursor:not-allowed;color:var(--bt-color-text-tertiary)}.bt-modal{position:fixed;inset:0;display:none;place-items:center;background:var(--bt-color-overlay);z-index:var(--bt-z-modal)}.bt-modal.is-open{display:grid}.bt-modal__panel{background:var(--bt-color-background);border-radius:var(--bt-radius-lg);box-shadow:var(--bt-shadow-lg);max-width:calc(100% - 32px);overflow:hidden}.bt-modal__header{padding:var(--bt-spacing-lg);border-bottom:1px solid var(--bt-color-border);color:var(--bt-color-text-primary);font-size:var(--bt-font-size-xl);font-weight:var(--bt-font-weight-semibold);line-height:1.3}.bt-modal__body{padding:var(--bt-spacing-lg)}.bt-modal__footer{padding:var(--bt-spacing-lg);border-top:1px solid var(--bt-color-border);display:flex;justify-content:flex-end;gap:var(--bt-spacing-sm)}@keyframes bt-alert-fade-in{from{opacity:0}to{opacity:1}}@keyframes bt-alert-slide-up{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.bt-alert__overlay{position:fixed;inset:0;background:var(--bt-color-overlay);display:none;align-items:center;justify-content:center;z-index:var(--bt-z-modal);animation:bt-alert-fade-in var(--bt-transition-base)}.bt-alert__overlay.is-open{display:flex}.bt-alert__modal{background:var(--bt-color-background);border-radius:var(--bt-radius-lg);min-width:320px;max-width:480px;box-shadow:var(--bt-shadow-xl);animation:bt-alert-slide-up var(--bt-transition-slow);overflow:hidden}.bt-alert__title{font-size:var(--bt-font-size-lg);font-weight:var(--bt-font-weight-semibold);line-height:var(--bt-line-height-normal);color:var(--bt-color-info);padding:var(--bt-spacing-md) var(--bt-spacing-xl) var(--bt-spacing-xs)}.bt-alert__message{font-size:var(--bt-font-size-base);color:var(--bt-color-text-secondary);padding:var(--bt-spacing-xl);line-height:1.75}.bt-alert__actions{display:flex;gap:var(--bt-spacing-sm);align-items:center;padding:0 var(--bt-spacing-xl) var(--bt-spacing-xl);justify-content:flex-end}.bt-alert--info .bt-alert__title{color:var(--bt-color-info)}.bt-alert--success .bt-alert__title{color:var(--bt-color-success)}.bt-alert--warning .bt-alert__title{color:var(--bt-color-warning)}.bt-alert--error .bt-alert__title{color:var(--bt-color-error)}.bt-card{background:var(--bt-color-background);border-radius:var(--bt-radius-lg)}.bt-card--bordered{border:1px solid var(--bt-color-border)}.bt-card--shadow-sm{box-shadow:var(--bt-shadow-sm)}.bt-card--shadow-md{box-shadow:var(--bt-shadow-md)}.bt-card--shadow-lg{box-shadow:var(--bt-shadow-lg)}.bt-card--p-sm{padding:var(--bt-spacing-sm)}.bt-card--p-md{padding:var(--bt-spacing-lg)}.bt-card--p-lg{padding:var(--bt-spacing-2xl)}.bt-card__title{font-size:var(--bt-font-size-xl);font-weight:var(--bt-font-weight-semibold);line-height:1.3;margin-bottom:var(--bt-spacing-md);color:var(--bt-color-text-primary)}@keyframes bt-spinner-spin{to{transform:rotate(360deg)}}.bt-spinner{display:inline-block;box-sizing:border-box;border-radius:50%;border:2px solid var(--bt-color-border);border-top-color:var(--bt-color-primary);animation:bt-spinner-spin .8s linear infinite}.bt-spinner--sm{width:16px;height:16px}.bt-spinner--md{width:24px;height:24px}.bt-spinner--lg{width:32px;height:32px}.bt-spinner--xl{width:48px;height:48px}.bt-pagination{display:flex;align-items:center;justify-content:center;gap:var(--bt-spacing-sm);margin-top:var(--bt-spacing-3xl)}.bt-pagination__item{border:1px solid var(--bt-color-border);background:var(--bt-color-background);border-radius:var(--bt-radius-md);padding:6px 10px;min-width:36px;font-family:var(--bt-font-family);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-primary);cursor:pointer;transition:background var(--bt-transition-base),border-color var(--bt-transition-base)}.bt-pagination__item:hover:not(:disabled){background:var(--bt-color-background-secondary)}.bt-pagination__item:disabled{opacity:.5;cursor:not-allowed}.bt-pagination__pages{display:flex;align-items:center;gap:6px}.bt-pagination__page{border:0;background:rgba(0,0,0,0);min-width:36px;height:36px;border-radius:var(--bt-radius-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-secondary);cursor:pointer;transition:background var(--bt-transition-base),color var(--bt-transition-base)}.bt-pagination__page:hover{background:var(--bt-color-background-secondary);color:var(--bt-color-text-primary)}.bt-pagination__page--active{color:var(--bt-color-text-primary);font-weight:var(--bt-font-weight-semibold)}.bt-pagination__ellipsis{min-width:20px;text-align:center;font-size:var(--bt-font-size-sm);color:var(--bt-color-text-tertiary)}.bt-date-picker{display:flex;flex-direction:column;gap:var(--bt-spacing-xs)}.bt-date-picker__label{color:var(--bt-color-text-primary);margin-bottom:var(--bt-spacing-xs);font-weight:var(--bt-font-weight-medium);font-size:var(--bt-font-size-sm);line-height:var(--bt-line-height-normal)}.bt-date-picker__label-required{margin-left:var(--bt-spacing-xs);color:var(--bt-color-error)}.bt-date-picker__fields{display:flex;gap:var(--bt-spacing-sm)}.bt-date-picker__select{min-width:88px;height:44px;padding:0 var(--bt-spacing-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);color:var(--bt-color-text-primary);background-color:var(--bt-color-background);border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-sm);cursor:pointer;transition:border-color var(--bt-transition-fast),box-shadow var(--bt-transition-fast),background-color var(--bt-transition-fast);appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--bt-color-text-secondary) 50%),linear-gradient(135deg, var(--bt-color-text-secondary) 50%, transparent 50%);background-position:calc(100% - 16px) calc(50% - 3px),calc(100% - 11px) calc(50% - 3px);background-size:5px 5px;background-repeat:no-repeat}.bt-date-picker__select:hover:not(:disabled){border-color:var(--bt-color-primary);background-color:var(--bt-color-background-secondary)}.bt-date-picker__select:focus-visible{outline:none;border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-date-picker__select:disabled{cursor:not-allowed;color:var(--bt-text-disabled);background-color:var(--bt-color-background-secondary);border-color:var(--bt-color-border-light)}.bt-date-picker--full-width{width:100%}.bt-date-picker--full-width .bt-date-picker__fields{width:100%}.bt-date-picker--full-width .bt-date-picker__select{flex:1;min-width:0}.bt-file-input{position:relative;display:inline-flex;align-items:center}.bt-file-input:hover .bt-file-input__label{border-color:var(--bt-color-border-light)}.bt-file-input__control{position:absolute;inset:0;opacity:0;cursor:pointer}.bt-file-input__label{border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-md);background:var(--bt-color-background);padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);color:var(--bt-color-text-primary);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base)}.bt-file-input__control:focus-visible+.bt-file-input__label{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-file-input--disabled{cursor:not-allowed}.bt-file-input--disabled .bt-file-input__control{cursor:not-allowed}.bt-file-input--disabled .bt-file-input__label{opacity:.6;cursor:not-allowed}.bt-file-input--disabled:hover .bt-file-input__label{border-color:var(--bt-color-border)}.bt-toast{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);border-radius:var(--bt-radius-md);box-shadow:var(--bt-shadow-lg)}.bt-hidden{display:none !important}.bt-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}
1
+ @keyframes skeleton_loading{0%{background-position:100% 0}100%{background-position:0 0}}:root{--bt-color-primary: #000000;--bt-color-primary-hover: #333333;--bt-color-background: #ffffff;--bt-color-background-secondary: #fafafa;--bt-color-background-neutral: #F3F3F3;--bt-color-background-muted: #f0f0f0;--bt-color-text-primary: #1a1a1a;--bt-color-text-secondary: #666666;--bt-color-text-tertiary: #999999;--bt-text-inverse: #ffffff;--bt-text-disabled: #9ca3af;--bt-color-border: #e5e5e5;--bt-color-border-light: rgba(0, 0, 0, 0.08);--bt-color-success: #10b981;--bt-color-error: #ef4444;--bt-color-warning: #f59e0b;--bt-color-info: #3b82f6;--bt-color-overlay: rgba(0, 0, 0, 0.5);--bt-spacing-xs: 0.25rem;--bt-spacing-sm: 0.5rem;--bt-spacing-md: 0.75rem;--bt-spacing-lg: 1rem;--bt-spacing-xl: 1.25rem;--bt-spacing-2xl: 1.5rem;--bt-spacing-3xl: 1.75rem;--bt-font-family: Pretendard, sans-serif;--bt-font-size-xs: 0.75rem;--bt-font-size-sm: 0.875rem;--bt-font-size-base: 0.9375rem;--bt-font-size-md: 1rem;--bt-font-size-lg: 1.125rem;--bt-font-size-xl: 1.25rem;--bt-font-weight-regular: 400;--bt-font-weight-medium: 500;--bt-font-weight-semibold: 600;--bt-font-weight-bold: 700;--bt-line-height-normal: 1.5;--bt-radius-sm: 6px;--bt-radius-md: 8px;--bt-radius-lg: 12px;--bt-radius-full: 9999px;--bt-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.04);--bt-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);--bt-shadow-lg: 0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06);--bt-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);--bt-transition-fast: 0.1s ease-in-out;--bt-transition-base: 0.2s ease-in-out;--bt-transition-slow: 0.3s ease-in-out;--bt-z-modal: 10000;--bt-z-toast: 10001}.bt-button{display:inline-flex;align-items:center;justify-content:center;gap:var(--bt-spacing-sm);border-radius:var(--bt-radius-md);border:none;cursor:pointer;font-family:var(--bt-font-family);font-weight:var(--bt-font-weight-medium);transition:background var(--bt-transition-base),color var(--bt-transition-base),box-shadow var(--bt-transition-base),transform var(--bt-transition-base)}.bt-button:disabled{cursor:not-allowed;opacity:.6}.bt-button--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-button--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-button--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-button--primary{background:var(--bt-color-primary);color:var(--bt-color-background)}.bt-button--primary:hover:not(:disabled){background:var(--bt-color-primary-hover)}.bt-button--primary:active:not(:disabled){transform:scale(0.98)}.bt-button--secondary{background:rgba(0,0,0,0);border:1px solid var(--bt-color-border);color:var(--bt-color-text-primary)}.bt-button--secondary:hover:not(:disabled){background:var(--bt-color-background-secondary)}.bt-button--secondary:active:not(:disabled){transform:scale(0.98)}.bt-button--ghost{background:rgba(0,0,0,0);color:var(--bt-color-text-primary)}.bt-button--ghost:hover:not(:disabled){background:rgba(0,0,0,.05)}.bt-button--ghost:active:not(:disabled){transform:scale(0.96)}.bt-button--danger{background:var(--bt-color-error);color:var(--bt-color-background)}.bt-button--danger:hover:not(:disabled){background:rgb(235.7842364532, 30.4157635468, 30.4157635468)}.bt-button--danger:active:not(:disabled){transform:scale(0.98)}.bt-button--full-width{width:100%}.bt-text-field{display:flex;flex-direction:column}.bt-text-field--full-width{width:100%}.bt-text-field__label{margin-bottom:var(--bt-spacing-xs);color:var(--bt-color-text-primary);font-size:var(--bt-font-size-sm);font-weight:var(--bt-font-weight-medium);line-height:var(--bt-line-height-normal)}.bt-text-field__wrap{position:relative;display:inline-flex;width:100%;align-items:center}.bt-text-field__input{width:100%;border-radius:var(--bt-radius-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary);background:var(--bt-color-background);transition:border-color var(--bt-transition-base),box-shadow var(--bt-transition-base),background var(--bt-transition-base)}.bt-text-field__input::placeholder{color:var(--bt-color-text-tertiary)}.bt-text-field__input:disabled{cursor:not-allowed;background:var(--bt-color-background-secondary);color:var(--bt-color-text-tertiary);opacity:.7}.bt-text-field__input--outline{border:1px solid var(--bt-color-border)}.bt-text-field__input--outline:hover:not(:disabled){border-color:var(--bt-color-border-light)}.bt-text-field__input--outline:focus-visible{outline:none;border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-text-field__input--filled{background:var(--bt-color-background-secondary);border:1px solid rgba(0,0,0,0)}.bt-text-field__input--filled:focus-visible{outline:none;border-color:var(--bt-color-primary);background:var(--bt-color-background);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-text-field__input--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-text-field__input--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-text-field__input--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-text-field__input--error{border-color:var(--bt-color-error) !important;box-shadow:0 0 0 3px rgba(239,68,68,.15) !important}.bt-text-field__input--success{border-color:var(--bt-color-success) !important;box-shadow:0 0 0 3px rgba(16,185,129,.15) !important}.bt-text-field__helper{margin-top:var(--bt-spacing-xs);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-secondary)}.bt-text-field__helper--error{color:var(--bt-color-error)}.bt-text-field__helper--success{color:var(--bt-color-success)}.bt-text-field__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;color:var(--bt-color-text-secondary)}.bt-text-field__icon--left{left:var(--bt-spacing-md)}.bt-text-field__icon--right{right:var(--bt-spacing-md)}.bt-checkbox{display:inline-flex;align-items:center;gap:var(--bt-spacing-sm);cursor:pointer;user-select:none;position:relative}.bt-checkbox__input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap}.bt-checkbox__box{width:1.125rem;height:1.125rem;box-sizing:border-box;border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-sm);background:var(--bt-color-background);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base);display:inline-block;position:relative}.bt-checkbox__label{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-checkbox--sm .bt-checkbox__box{width:1rem;height:1rem}.bt-checkbox--sm .bt-checkbox__label{font-size:var(--bt-font-size-sm)}.bt-checkbox--lg .bt-checkbox__box{width:1.25rem;height:1.25rem}.bt-checkbox--lg .bt-checkbox__label{font-size:var(--bt-font-size-md)}.bt-checkbox__input:focus-visible+.bt-checkbox__box{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-checkbox__input:disabled+.bt-checkbox__box,.bt-checkbox__input:disabled~.bt-checkbox__label{opacity:.6;cursor:not-allowed}.bt-checkbox__input:checked+.bt-checkbox__box{background:var(--bt-color-primary);border-color:var(--bt-color-primary)}.bt-checkbox__input:checked+.bt-checkbox__box::after{content:"";position:absolute;left:50%;top:50%;width:.28rem;height:.55rem;border:2px solid var(--bt-color-background);border-top:0;border-left:0;transform:translate(-50%, -58%) rotate(45deg)}.bt-radio{position:relative;display:inline-flex;align-items:center;gap:var(--bt-spacing-sm);cursor:pointer;user-select:none}.bt-radio__input{position:absolute;inset:0;opacity:0;cursor:pointer;margin:0}.bt-radio__dot{width:1.125rem;height:1.125rem;box-sizing:border-box;border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-full);background:var(--bt-color-background);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base);position:relative;display:inline-block}.bt-radio__label{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-radio--sm .bt-radio__dot{width:1rem;height:1rem}.bt-radio--sm .bt-radio__label{font-size:var(--bt-font-size-sm)}.bt-radio--lg .bt-radio__dot{width:1.25rem;height:1.25rem}.bt-radio--lg .bt-radio__label{font-size:var(--bt-font-size-md)}.bt-radio__input:focus-visible+.bt-radio__dot{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-radio__input:checked+.bt-radio__dot{border-color:var(--bt-color-primary)}.bt-radio__input:checked+.bt-radio__dot::after{content:"";position:absolute;left:50%;top:50%;width:60%;height:60%;transform:translate(-50%, -50%);background:var(--bt-color-primary);border-radius:9999px}.bt-radio__input:disabled+.bt-radio__dot,.bt-radio__input:disabled~.bt-radio__label{opacity:.6;cursor:not-allowed}.bt-switch{position:relative;display:inline-flex;align-items:center;width:40px;height:22px;padding:2px;border-radius:var(--bt-radius-full);background:var(--bt-color-border);transition:background var(--bt-transition-base);cursor:pointer;border:none}.bt-switch__thumb{width:18px;height:18px;background:var(--bt-color-background);border-radius:var(--bt-radius-full);transition:transform var(--bt-transition-base);transform:translateX(0)}.bt-switch--on{background:var(--bt-color-primary)}.bt-switch--on .bt-switch__thumb{transform:translateX(18px)}.bt-switch--sm{width:34px;height:18px}.bt-switch--sm .bt-switch__thumb{width:14px;height:14px}.bt-switch--sm.bt-switch--on .bt-switch__thumb{transform:translateX(16px)}.bt-switch--lg{width:48px;height:26px}.bt-switch--lg .bt-switch__thumb{width:22px;height:22px}.bt-switch--lg.bt-switch--on .bt-switch__thumb{transform:translateX(22px)}.bt-switch--disabled{opacity:.6;cursor:not-allowed}.bt-select{position:relative;display:inline-flex;flex-direction:column;width:100%;gap:var(--bt-spacing-xs);font-family:var(--bt-font-family)}.bt-select__label{font-size:var(--bt-font-size-sm);font-weight:var(--bt-font-weight-medium);line-height:var(--bt-line-height-normal);color:var(--bt-color-text-primary)}.bt-select__control{width:100%;display:inline-flex;align-items:center;justify-content:space-between;gap:var(--bt-spacing-sm);cursor:pointer;color:var(--bt-color-text-primary);background:var(--bt-color-background);border-radius:var(--bt-radius-md);transition:border-color var(--bt-transition-base),box-shadow var(--bt-transition-base),background var(--bt-transition-base);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal);border:none;text-align:left}.bt-select__control:disabled,.bt-select__control.is-disabled{cursor:not-allowed;opacity:.7;background:var(--bt-color-background-secondary);color:var(--bt-color-text-tertiary)}.bt-select__control--outline{border:1px solid var(--bt-color-border)}.bt-select__control--outline:hover:not(.is-disabled){border-color:var(--bt-color-border-light)}.bt-select__control--outline.is-open{border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-select__control--filled{background:var(--bt-color-background-secondary);border:1px solid rgba(0,0,0,0)}.bt-select__control--filled.is-open{background:var(--bt-color-background);border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-select__control--sm{padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-size:var(--bt-font-size-sm)}.bt-select__control--md{padding:var(--bt-spacing-md) var(--bt-spacing-xl);font-size:var(--bt-font-size-base)}.bt-select__control--lg{padding:var(--bt-spacing-lg) var(--bt-spacing-2xl);font-size:var(--bt-font-size-md)}.bt-select__value{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bt-select__placeholder{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--bt-color-text-tertiary)}.bt-select__icon{display:inline-flex;align-items:center;justify-content:center;color:var(--bt-color-text-secondary);transition:transform var(--bt-transition-base)}.bt-select__icon.is-open{transform:rotate(180deg)}.bt-select__list{position:absolute;z-index:var(--bt-z-modal);top:100%;left:0;width:100%;min-width:100%;box-sizing:border-box;margin-top:var(--bt-spacing-xs);background:var(--bt-color-background);border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-md);box-shadow:var(--bt-shadow-md);max-height:18rem;overflow-y:auto;overflow-x:hidden;padding:var(--bt-spacing-xs) 0;list-style:none;margin:var(--bt-spacing-xs) 0 0 0}.bt-select__list--up{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bt-spacing-xs)}.bt-select__option{width:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:var(--bt-spacing-sm);padding:var(--bt-spacing-sm) var(--bt-spacing-lg);cursor:pointer;color:var(--bt-color-text-primary);background:rgba(0,0,0,0);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);line-height:var(--bt-line-height-normal)}.bt-select__option:hover,.bt-select__option.is-active{background:var(--bt-color-background-secondary)}.bt-select__option.is-selected{font-weight:var(--bt-font-weight-medium)}.bt-select__option.is-disabled{cursor:not-allowed;color:var(--bt-color-text-tertiary)}.bt-modal{position:fixed;inset:0;display:none;place-items:center;background:var(--bt-color-overlay);z-index:var(--bt-z-modal)}.bt-modal.is-open{display:grid}.bt-modal__panel{background:var(--bt-color-background);border-radius:var(--bt-radius-lg);box-shadow:var(--bt-shadow-lg);max-width:calc(100% - 32px);overflow:hidden}.bt-modal__header{padding:var(--bt-spacing-lg);border-bottom:1px solid var(--bt-color-border);color:var(--bt-color-text-primary);font-size:var(--bt-font-size-xl);font-weight:var(--bt-font-weight-semibold);line-height:1.3}.bt-modal__body{padding:var(--bt-spacing-lg)}.bt-modal__footer{padding:var(--bt-spacing-lg);border-top:1px solid var(--bt-color-border);display:flex;justify-content:flex-end;gap:var(--bt-spacing-sm)}@keyframes bt-alert-fade-in{from{opacity:0}to{opacity:1}}@keyframes bt-alert-slide-up{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.bt-alert__overlay{position:fixed;inset:0;background:var(--bt-color-overlay);display:none;align-items:center;justify-content:center;z-index:var(--bt-z-modal);animation:bt-alert-fade-in var(--bt-transition-base)}.bt-alert__overlay.is-open{display:flex}.bt-alert__modal{background:var(--bt-color-background);border-radius:var(--bt-radius-lg);min-width:320px;max-width:480px;box-shadow:var(--bt-shadow-xl);animation:bt-alert-slide-up var(--bt-transition-slow);overflow:hidden}.bt-alert__title{font-size:var(--bt-font-size-lg);font-weight:var(--bt-font-weight-semibold);line-height:var(--bt-line-height-normal);color:var(--bt-color-info);padding:var(--bt-spacing-md) var(--bt-spacing-xl) var(--bt-spacing-xs)}.bt-alert__message{font-size:var(--bt-font-size-base);color:var(--bt-color-text-secondary);padding:var(--bt-spacing-xl);line-height:1.75}.bt-alert__actions{display:flex;gap:var(--bt-spacing-sm);align-items:center;padding:0 var(--bt-spacing-xl) var(--bt-spacing-xl);justify-content:flex-end}.bt-alert--info .bt-alert__title{color:var(--bt-color-info)}.bt-alert--success .bt-alert__title{color:var(--bt-color-success)}.bt-alert--warning .bt-alert__title{color:var(--bt-color-warning)}.bt-alert--error .bt-alert__title{color:var(--bt-color-error)}.bt-card{background:var(--bt-color-background);border-radius:var(--bt-radius-lg)}.bt-card--bordered{border:1px solid var(--bt-color-border)}.bt-card--shadow-sm{box-shadow:var(--bt-shadow-sm)}.bt-card--shadow-md{box-shadow:var(--bt-shadow-md)}.bt-card--shadow-lg{box-shadow:var(--bt-shadow-lg)}.bt-card--p-sm{padding:var(--bt-spacing-sm)}.bt-card--p-md{padding:var(--bt-spacing-lg)}.bt-card--p-lg{padding:var(--bt-spacing-2xl)}.bt-card__title{font-size:var(--bt-font-size-xl);font-weight:var(--bt-font-weight-semibold);line-height:1.3;margin-bottom:var(--bt-spacing-md);color:var(--bt-color-text-primary)}@keyframes bt-spinner-spin{to{transform:rotate(360deg)}}.bt-spinner{display:inline-block;box-sizing:border-box;border-radius:50%;border:2px solid var(--bt-color-border);border-top-color:var(--bt-color-primary);animation:bt-spinner-spin .8s linear infinite}.bt-spinner--sm{width:16px;height:16px}.bt-spinner--md{width:24px;height:24px}.bt-spinner--lg{width:32px;height:32px}.bt-spinner--xl{width:48px;height:48px}.bt-pagination{display:flex;align-items:center;justify-content:center;gap:var(--bt-spacing-sm);margin-top:var(--bt-spacing-3xl)}.bt-pagination__item{border:1px solid var(--bt-color-border);background:var(--bt-color-background);border-radius:var(--bt-radius-md);padding:6px 10px;min-width:36px;font-family:var(--bt-font-family);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-primary);cursor:pointer;transition:background var(--bt-transition-base),border-color var(--bt-transition-base)}.bt-pagination__item:hover:not(:disabled){background:var(--bt-color-background-secondary)}.bt-pagination__item:disabled{opacity:.5;cursor:not-allowed}.bt-pagination__pages{display:flex;align-items:center;gap:6px}.bt-pagination__page{border:0;background:rgba(0,0,0,0);min-width:36px;height:36px;border-radius:var(--bt-radius-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-sm);color:var(--bt-color-text-secondary);cursor:pointer;transition:background var(--bt-transition-base),color var(--bt-transition-base)}.bt-pagination__page:hover{background:var(--bt-color-background-secondary);color:var(--bt-color-text-primary)}.bt-pagination__page--active{color:var(--bt-color-text-primary);font-weight:var(--bt-font-weight-semibold)}.bt-pagination__ellipsis{min-width:20px;text-align:center;font-size:var(--bt-font-size-sm);color:var(--bt-color-text-tertiary)}.bt-date-picker{display:flex;flex-direction:column;gap:var(--bt-spacing-xs)}.bt-date-picker__label{color:var(--bt-color-text-primary);margin-bottom:var(--bt-spacing-xs);font-weight:var(--bt-font-weight-medium);font-size:var(--bt-font-size-sm);line-height:var(--bt-line-height-normal)}.bt-date-picker__label-required{margin-left:var(--bt-spacing-xs);color:var(--bt-color-error)}.bt-date-picker__fields{display:flex;gap:var(--bt-spacing-sm)}.bt-date-picker__select{min-width:88px;height:44px;padding:0 var(--bt-spacing-md);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);color:var(--bt-color-text-primary);background-color:var(--bt-color-background);border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-sm);cursor:pointer;transition:border-color var(--bt-transition-fast),box-shadow var(--bt-transition-fast),background-color var(--bt-transition-fast);appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--bt-color-text-secondary) 50%),linear-gradient(135deg, var(--bt-color-text-secondary) 50%, transparent 50%);background-position:calc(100% - 16px) calc(50% - 3px),calc(100% - 11px) calc(50% - 3px);background-size:5px 5px;background-repeat:no-repeat}.bt-date-picker__select:hover:not(:disabled){border-color:var(--bt-color-primary);background-color:var(--bt-color-background-secondary)}.bt-date-picker__select:focus-visible{outline:none;border-color:var(--bt-color-primary);box-shadow:0 0 0 3px rgba(0,0,0,.15)}.bt-date-picker__select:disabled{cursor:not-allowed;color:var(--bt-text-disabled);background-color:var(--bt-color-background-secondary);border-color:var(--bt-color-border-light)}.bt-date-picker--full-width{width:100%}.bt-date-picker--full-width .bt-date-picker__fields{width:100%}.bt-date-picker--full-width .bt-date-picker__select{flex:1;min-width:0}.bt-file-input{position:relative;display:inline-flex;align-items:center}.bt-file-input:hover .bt-file-input__label{border-color:var(--bt-color-border-light)}.bt-file-input__control{position:absolute;inset:0;opacity:0;cursor:pointer}.bt-file-input__label{border:1px solid var(--bt-color-border);border-radius:var(--bt-radius-md);background:var(--bt-color-background);padding:var(--bt-spacing-sm) var(--bt-spacing-lg);font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);color:var(--bt-color-text-primary);transition:background var(--bt-transition-base),border-color var(--bt-transition-base),box-shadow var(--bt-transition-base)}.bt-file-input__control:focus-visible+.bt-file-input__label{box-shadow:0 0 0 3px var(--bt-color-border-light);border-color:var(--bt-color-primary)}.bt-file-input--disabled{cursor:not-allowed}.bt-file-input--disabled .bt-file-input__control{cursor:not-allowed}.bt-file-input--disabled .bt-file-input__label{opacity:.6;cursor:not-allowed}.bt-file-input--disabled:hover .bt-file-input__label{border-color:var(--bt-color-border)}.bt-toast{font-family:var(--bt-font-family);font-size:var(--bt-font-size-base);border-radius:var(--bt-radius-md);box-shadow:var(--bt-shadow-lg)}.bt-hidden{display:none !important}.bt-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigtablet/design-system",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "description": "Bigtablet Design System UI Components",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -42,8 +42,8 @@
42
42
  ],
43
43
  "scripts": {
44
44
  "build": "tsup && pnpm run copy:scss && pnpm run build:vanilla",
45
- "build:vanilla": "node scripts/build-vanilla.mjs",
46
- "copy:scss": "node scripts/copy-scss.mjs",
45
+ "build:vanilla": "sh scripts/build-vanilla.sh",
46
+ "copy:scss": "sh scripts/copy-scss.sh",
47
47
  "dev": "tsup --watch",
48
48
  "storybook": "storybook dev -p 6006",
49
49
  "build:sb": "storybook build",
@@ -51,10 +51,10 @@
51
51
  "test:watch": "vitest --project unit",
52
52
  "test:coverage": "vitest run --project unit --coverage",
53
53
  "chromatic": "npx chromatic --project-token=$CHROMATIC_TOKEN --build-script-name=build:sb",
54
- "figma:test": "node scripts/figma-connect.mjs",
55
- "figma:snapshot": "node scripts/figma-snapshot.mjs",
56
- "figma:diff": "node scripts/figma-diff.mjs",
57
- "figma:apply": "node scripts/figma-apply.mjs",
54
+ "figma:test": "tsx scripts/figma-connect.ts",
55
+ "figma:snapshot": "tsx scripts/figma-snapshot.ts",
56
+ "figma:diff": "tsx scripts/figma-diff.ts",
57
+ "figma:apply": "tsx scripts/figma-apply.ts",
58
58
  "size": "size-limit",
59
59
  "prepare": "husky"
60
60
  },
@@ -106,16 +106,17 @@
106
106
  "esbuild-sass-plugin": "^3",
107
107
  "husky": "^9.1.7",
108
108
  "jsdom": "^28.0.0",
109
- "lucide-react": "^0.552.0",
110
- "next": "16.1.5",
109
+ "lucide-react": "^0.577.0",
110
+ "next": "16.1.6",
111
111
  "playwright": "^1.57.0",
112
112
  "react": "19.2.0",
113
113
  "react-dom": "19.2.0",
114
114
  "sass-embedded": "^1.93.3",
115
115
  "semantic-release": "^25.0.1",
116
116
  "size-limit": "^12.0.1",
117
- "storybook": "10.2.17",
117
+ "storybook": "10.2.19",
118
118
  "tsup": "^8.5.0",
119
+ "tsx": "^4.21.0",
119
120
  "typescript": "^5",
120
121
  "vite": "^5",
121
122
  "vitest": "^4.0.17"