@dmsej108/design-system 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/dist/components/Badge/Badge.d.ts +13 -0
  2. package/dist/components/Badge/Badge.d.ts.map +1 -0
  3. package/dist/components/Badge/index.d.ts +3 -0
  4. package/dist/components/Badge/index.d.ts.map +1 -0
  5. package/dist/components/BaseButton/BaseButton.d.ts +14 -0
  6. package/dist/components/BaseButton/BaseButton.d.ts.map +1 -0
  7. package/dist/components/BaseButton/index.d.ts +3 -0
  8. package/dist/components/BaseButton/index.d.ts.map +1 -0
  9. package/dist/components/Button/Button.d.ts +14 -0
  10. package/dist/components/Button/Button.d.ts.map +1 -0
  11. package/dist/components/Button/index.d.ts +3 -0
  12. package/dist/components/Button/index.d.ts.map +1 -0
  13. package/dist/components/Card/Card.d.ts +13 -0
  14. package/dist/components/Card/Card.d.ts.map +1 -0
  15. package/dist/components/Card/index.d.ts +3 -0
  16. package/dist/components/Card/index.d.ts.map +1 -0
  17. package/dist/components/Checkbox/Checkbox.d.ts +30 -0
  18. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  19. package/dist/components/Checkbox/index.d.ts +3 -0
  20. package/dist/components/Checkbox/index.d.ts.map +1 -0
  21. package/dist/components/Chip/Chip.d.ts +17 -0
  22. package/dist/components/Chip/Chip.d.ts.map +1 -0
  23. package/dist/components/Chip/index.d.ts +3 -0
  24. package/dist/components/Chip/index.d.ts.map +1 -0
  25. package/dist/components/DatePicker/DatePicker.d.ts +18 -0
  26. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  27. package/dist/components/DatePicker/index.d.ts +3 -0
  28. package/dist/components/DatePicker/index.d.ts.map +1 -0
  29. package/dist/components/FileInput/FileInput.d.ts +19 -0
  30. package/dist/components/FileInput/FileInput.d.ts.map +1 -0
  31. package/dist/components/FileInput/index.d.ts +3 -0
  32. package/dist/components/FileInput/index.d.ts.map +1 -0
  33. package/dist/components/Icon/Icon.d.ts +17 -0
  34. package/dist/components/Icon/Icon.d.ts.map +1 -0
  35. package/dist/components/Icon/index.d.ts +3 -0
  36. package/dist/components/Icon/index.d.ts.map +1 -0
  37. package/dist/components/Input/Input.d.ts +14 -0
  38. package/dist/components/Input/Input.d.ts.map +1 -0
  39. package/dist/components/Input/index.d.ts +3 -0
  40. package/dist/components/Input/index.d.ts.map +1 -0
  41. package/dist/components/Modal/Modal.d.ts +18 -0
  42. package/dist/components/Modal/Modal.d.ts.map +1 -0
  43. package/dist/components/Modal/index.d.ts +3 -0
  44. package/dist/components/Modal/index.d.ts.map +1 -0
  45. package/dist/components/Pagination/Pagination.d.ts +11 -0
  46. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  47. package/dist/components/Pagination/index.d.ts +3 -0
  48. package/dist/components/Pagination/index.d.ts.map +1 -0
  49. package/dist/components/Radio/Radio.d.ts +25 -0
  50. package/dist/components/Radio/Radio.d.ts.map +1 -0
  51. package/dist/components/Radio/index.d.ts +3 -0
  52. package/dist/components/Radio/index.d.ts.map +1 -0
  53. package/dist/components/Select/Select.d.ts +19 -0
  54. package/dist/components/Select/Select.d.ts.map +1 -0
  55. package/dist/components/Select/index.d.ts +3 -0
  56. package/dist/components/Select/index.d.ts.map +1 -0
  57. package/dist/components/Tab/Tab.d.ts +18 -0
  58. package/dist/components/Tab/Tab.d.ts.map +1 -0
  59. package/dist/components/Tab/index.d.ts +3 -0
  60. package/dist/components/Tab/index.d.ts.map +1 -0
  61. package/dist/components/Table/Table.d.ts +23 -0
  62. package/dist/components/Table/Table.d.ts.map +1 -0
  63. package/dist/components/Table/index.d.ts +3 -0
  64. package/dist/components/Table/index.d.ts.map +1 -0
  65. package/dist/components/Textarea/Textarea.d.ts +15 -0
  66. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  67. package/dist/components/Textarea/index.d.ts +3 -0
  68. package/dist/components/Textarea/index.d.ts.map +1 -0
  69. package/dist/components/Toast/Toast.d.ts +32 -0
  70. package/dist/components/Toast/Toast.d.ts.map +1 -0
  71. package/dist/components/Toast/index.d.ts +3 -0
  72. package/dist/components/Toast/index.d.ts.map +1 -0
  73. package/dist/components/Typography/Typography.d.ts +10 -0
  74. package/dist/components/Typography/Typography.d.ts.map +1 -0
  75. package/dist/components/Typography/index.d.ts +3 -0
  76. package/dist/components/Typography/index.d.ts.map +1 -0
  77. package/dist/index.css +1 -0
  78. package/dist/index.d.ts +39 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +1407 -0
  81. package/dist/index.js.map +1 -0
  82. package/package.json +76 -0
  83. package/src/styles/base/common.css +2060 -0
  84. package/src/styles/base/ellipsis.xml +1 -0
  85. package/src/styles/base/fonts.css +39 -0
  86. package/src/styles/base/layout.css +864 -0
  87. package/src/styles/base/reset.css +241 -0
  88. package/src/styles/components/breadcrumb.css +39 -0
  89. package/src/styles/components/button.css +423 -0
  90. package/src/styles/components/dashboard.css +970 -0
  91. package/src/styles/components/ellipsis.xml +1 -0
  92. package/src/styles/components/form.css +744 -0
  93. package/src/styles/components/loading.css +93 -0
  94. package/src/styles/components/login.css +405 -0
  95. package/src/styles/components/modal.css +218 -0
  96. package/src/styles/components/operate.css +85 -0
  97. package/src/styles/components/tab.css +80 -0
  98. package/src/styles/components/table.css +1024 -0
  99. package/src/styles/components/tree.css +284 -0
  100. package/src/styles/img/kb_logo.png +0 -0
  101. package/src/styles/index.css +18 -0
  102. package/src/styles/swiper.min.css +658 -0
  103. package/src/tokens/Tokens.stories.tsx +185 -0
  104. package/src/tokens/index.css +295 -0
@@ -0,0 +1,185 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ const meta: Meta = {
4
+ title: 'Foundation/Design Tokens',
5
+ tags: ['autodocs'],
6
+ parameters: { layout: 'fullscreen' },
7
+ };
8
+ export default meta;
9
+ type Story = StoryObj;
10
+
11
+ /* ── Color Swatch ── */
12
+ function Swatch({ name, cssVar }: { name: string; cssVar: string }) {
13
+ return (
14
+ <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 6, minWidth: 64 }}>
15
+ <div
16
+ style={{
17
+ width: 48,
18
+ height: 48,
19
+ borderRadius: 8,
20
+ backgroundColor: `var(${cssVar})`,
21
+ border: '1px solid rgba(0,0,0,0.08)',
22
+ boxShadow: '0 1px 3px rgba(0,0,0,0.08)',
23
+ }}
24
+ />
25
+ <span style={{ fontSize: 11, color: 'var(--color-neutral-500)', textAlign: 'center' }}>{name}</span>
26
+ </div>
27
+ );
28
+ }
29
+
30
+ function ColorRow({ label, prefix, shades }: { label: string; prefix: string; shades: string[] }) {
31
+ return (
32
+ <div style={{ marginBottom: 32 }}>
33
+ <p style={{ margin: '0 0 12px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>
34
+ {label}
35
+ </p>
36
+ <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>
37
+ {shades.map((shade) => (
38
+ <Swatch key={shade} name={shade} cssVar={`--color-${prefix}-${shade}`} />
39
+ ))}
40
+ </div>
41
+ </div>
42
+ );
43
+ }
44
+
45
+ export const Colors: Story = {
46
+ name: '색상',
47
+ render: () => {
48
+ const shades = ['50','100','200','300','400','500','600','700','800','900'];
49
+ return (
50
+ <div style={{ padding: 32, fontFamily: 'var(--font-family-base)' }}>
51
+ <ColorRow label="Primary / KB Yellow" prefix="primary" shades={shades} />
52
+ <ColorRow label="Secondary / KB Gray" prefix="secondary" shades={shades} />
53
+ <ColorRow label="Neutral" prefix="neutral" shades={shades} />
54
+
55
+ <div style={{ marginBottom: 32 }}>
56
+ <p style={{ margin: '0 0 12px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>KB Brand</p>
57
+ <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>
58
+ <Swatch name="yellow-positive" cssVar="--color-brand-yellow-positive" />
59
+ <Swatch name="yellow-negative" cssVar="--color-brand-yellow-negative" />
60
+ <Swatch name="gray" cssVar="--color-brand-gray" />
61
+ <Swatch name="dark-gray" cssVar="--color-brand-dark-gray" />
62
+ <Swatch name="gold" cssVar="--color-brand-gold" />
63
+ <Swatch name="silver" cssVar="--color-brand-silver" />
64
+ </div>
65
+ </div>
66
+
67
+ <div style={{ marginBottom: 32 }}>
68
+ <p style={{ margin: '0 0 12px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>Semantic</p>
69
+ <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>
70
+ <Swatch name="success" cssVar="--color-success" />
71
+ <Swatch name="success-light" cssVar="--color-success-light" />
72
+ <Swatch name="warning" cssVar="--color-warning" />
73
+ <Swatch name="warning-light" cssVar="--color-warning-light" />
74
+ <Swatch name="error" cssVar="--color-error" />
75
+ <Swatch name="error-light" cssVar="--color-error-light" />
76
+ <Swatch name="info" cssVar="--color-info" />
77
+ <Swatch name="info-light" cssVar="--color-info-light" />
78
+ </div>
79
+ </div>
80
+ </div>
81
+ );
82
+ },
83
+ };
84
+
85
+ export const Typography: Story = {
86
+ name: '타이포그래피',
87
+ render: () => (
88
+ <div style={{ padding: 32, fontFamily: 'var(--font-family-base)' }}>
89
+ <p style={{ margin: '0 0 24px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>Font Size</p>
90
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 12, marginBottom: 40 }}>
91
+ {[
92
+ ['xs', '12px'], ['sm', '14px'], ['md', '16px'], ['lg', '18px'],
93
+ ['xl', '20px'], ['2xl', '24px'], ['3xl', '30px'], ['4xl', '36px'],
94
+ ].map(([key, px]) => (
95
+ <div key={key} style={{ display: 'flex', alignItems: 'baseline', gap: 16 }}>
96
+ <span style={{ fontSize: 'var(--font-size-' + key + ')', color: 'var(--ds-text)', lineHeight: 1.3 }}>
97
+ StarBanking
98
+ </span>
99
+ <span style={{ fontSize: 11, color: 'var(--ds-text-muted)' }}>{key} / {px}</span>
100
+ </div>
101
+ ))}
102
+ </div>
103
+
104
+ <p style={{ margin: '0 0 16px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>Font Weight</p>
105
+ <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap', marginBottom: 40 }}>
106
+ {[
107
+ ['Regular (400)', '400'], ['Medium (500)', '500'],
108
+ ['Semibold (600)', '600'], ['Bold (700)', '700'],
109
+ ].map(([label, weight]) => (
110
+ <div key={weight} style={{ fontWeight: weight, fontSize: 16, color: 'var(--ds-text)' }}>{label}</div>
111
+ ))}
112
+ </div>
113
+ </div>
114
+ ),
115
+ };
116
+
117
+ export const Spacing: Story = {
118
+ name: '스페이싱',
119
+ render: () => (
120
+ <div style={{ padding: 32, fontFamily: 'var(--font-family-base)' }}>
121
+ <p style={{ margin: '0 0 24px', fontSize: 12, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.06em', color: 'var(--color-neutral-500)' }}>Spacing Scale</p>
122
+ <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
123
+ {[
124
+ ['--space-1', '4px'], ['--space-2', '8px'], ['--space-3', '12px'],
125
+ ['--space-4', '16px'], ['--space-5', '20px'], ['--space-6', '24px'],
126
+ ['--space-8', '32px'], ['--space-10', '40px'], ['--space-12', '48px'],
127
+ ['--space-16', '64px'],
128
+ ].map(([token, px]) => (
129
+ <div key={token} style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
130
+ <div style={{ width: `var(${token})`, height: 20, backgroundColor: 'var(--color-primary-400)', borderRadius: 3, flexShrink: 0 }} />
131
+ <span style={{ fontSize: 12, color: 'var(--color-neutral-500)', whiteSpace: 'nowrap' }}>
132
+ {token} · {px}
133
+ </span>
134
+ </div>
135
+ ))}
136
+ </div>
137
+ </div>
138
+ ),
139
+ };
140
+
141
+ export const Shadows: Story = {
142
+ name: '그림자',
143
+ render: () => (
144
+ <div style={{ padding: 32, fontFamily: 'var(--font-family-base)' }}>
145
+ <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>
146
+ {['xs','sm','md','lg','xl'].map((s) => (
147
+ <div key={s} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 12 }}>
148
+ <div style={{
149
+ width: 80, height: 80, borderRadius: 12,
150
+ backgroundColor: '#fff',
151
+ boxShadow: `var(--shadow-${s})`,
152
+ border: '1px solid var(--color-neutral-100)',
153
+ }} />
154
+ <span style={{ fontSize: 12, color: 'var(--color-neutral-500)' }}>shadow-{s}</span>
155
+ </div>
156
+ ))}
157
+ </div>
158
+ </div>
159
+ ),
160
+ };
161
+
162
+ export const BorderRadius: Story = {
163
+ name: '테두리 반경',
164
+ render: () => (
165
+ <div style={{ padding: 32, fontFamily: 'var(--font-family-base)' }}>
166
+ <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap', alignItems: 'flex-end' }}>
167
+ {[
168
+ ['sm', '4px'], ['md', '8px'], ['lg', '12px'], ['xl', '16px'], ['full', '9999px'],
169
+ ].map(([key, px]) => (
170
+ <div key={key} style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: 12 }}>
171
+ <div style={{
172
+ width: 64, height: 64,
173
+ backgroundColor: 'var(--color-primary-100)',
174
+ border: '2px solid var(--color-primary-400)',
175
+ borderRadius: `var(--radius-${key})`,
176
+ }} />
177
+ <span style={{ fontSize: 12, color: 'var(--color-neutral-500)', textAlign: 'center' }}>
178
+ radius-{key}<br />{px}
179
+ </span>
180
+ </div>
181
+ ))}
182
+ </div>
183
+ </div>
184
+ ),
185
+ };
@@ -0,0 +1,295 @@
1
+ :root {
2
+ /* ── Colors ── */
3
+ /* Primary / KB Yellow */
4
+ --color-primary-50: #FFF9E6;
5
+ --color-primary-100: #FFEDB3;
6
+ --color-primary-200: #FFE080;
7
+ --color-primary-300: #FFD54D;
8
+ --color-primary-400: #FFCC00; /* KB Yellow Negative */
9
+ --color-primary-500: #FFBC00; /* KB Yellow Positive */
10
+ --color-primary-600: #CC9600;
11
+ --color-primary-700: #997000;
12
+ --color-primary-800: #664B00;
13
+ --color-primary-900: #332500;
14
+
15
+ /* Secondary / KB Gray */
16
+ --color-secondary-50: #F7F5F2;
17
+ --color-secondary-100: #EDEAE5;
18
+ --color-secondary-200: #D8D2CA;
19
+ --color-secondary-300: #BCB3A8;
20
+ --color-secondary-400: #9A9186;
21
+ --color-secondary-500: #7D7468;
22
+ --color-secondary-600: #60584C; /* KB Gray */
23
+ --color-secondary-700: #545045; /* KB Dark Gray */
24
+ --color-secondary-800: #3C3730;
25
+ --color-secondary-900: #261F19;
26
+
27
+ /* Neutral */
28
+ --color-neutral-0: #ffffff;
29
+ --color-neutral-50: #f7f8fa;
30
+ --color-neutral-100: #f1f3f5;
31
+ --color-neutral-200: #e4e7ec;
32
+ --color-neutral-300: #d0d5dd;
33
+ --color-neutral-400: #98a2b3;
34
+ --color-neutral-500: #667085;
35
+ --color-neutral-600: #475467;
36
+ --color-neutral-700: #344054;
37
+ --color-neutral-800: #1d2939;
38
+ --color-neutral-900: #101828;
39
+
40
+ /* Semantic */
41
+ --color-success-light: #d1fae5;
42
+ --color-success: #36b37e;
43
+ --color-success-dark: #1d7a57;
44
+
45
+ --color-warning-light: #fff3cd;
46
+ --color-warning: #ff8b00;
47
+ --color-warning-dark: #b85e00;
48
+
49
+ --color-error-light: #fee2e2;
50
+ --color-error: #ff5630;
51
+ --color-error-dark: #b91c1c;
52
+
53
+ --color-info-light: #dbeafe;
54
+ --color-info: #2563eb;
55
+ --color-info-dark: #1e40af;
56
+
57
+ /* ── Typography ── */
58
+ --font-family-base: 'Pretendard', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
59
+ --font-family-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
60
+
61
+ --font-size-xs: 0.75rem; /* 12px */
62
+ --font-size-sm: 0.875rem; /* 14px */
63
+ --font-size-md: 1rem; /* 16px */
64
+ --font-size-lg: 1.125rem; /* 18px */
65
+ --font-size-xl: 1.25rem; /* 20px */
66
+ --font-size-2xl: 1.5rem; /* 24px */
67
+ --font-size-3xl: 1.875rem; /* 30px */
68
+ --font-size-4xl: 2.25rem; /* 36px */
69
+
70
+ --font-weight-regular: 400;
71
+ --font-weight-medium: 500;
72
+ --font-weight-semibold: 600;
73
+ --font-weight-bold: 700;
74
+
75
+ --line-height-tight: 1.25;
76
+ --line-height-snug: 1.375;
77
+ --line-height-normal: 1.5;
78
+ --line-height-relaxed: 1.625;
79
+
80
+ /* ── Spacing ── */
81
+ --space-1: 0.25rem; /* 4px */
82
+ --space-2: 0.5rem; /* 8px */
83
+ --space-3: 0.75rem; /* 12px */
84
+ --space-4: 1rem; /* 16px */
85
+ --space-5: 1.25rem; /* 20px */
86
+ --space-6: 1.5rem; /* 24px */
87
+ --space-8: 2rem; /* 32px */
88
+ --space-10: 2.5rem; /* 40px */
89
+ --space-12: 3rem; /* 48px */
90
+ --space-16: 4rem; /* 64px */
91
+
92
+ /* ── Border Radius ── */
93
+ --radius-sm: 4px;
94
+ --radius-md: 8px;
95
+ --radius-lg: 12px;
96
+ --radius-xl: 16px;
97
+ --radius-full: 9999px;
98
+
99
+ /* ── Shadows ── */
100
+ --shadow-xs: 0 1px 2px rgba(16, 24, 40, 0.05);
101
+ --shadow-sm: 0 1px 3px rgba(16, 24, 40, 0.1), 0 1px 2px rgba(16, 24, 40, 0.06);
102
+ --shadow-md: 0 4px 8px rgba(16, 24, 40, 0.08), 0 2px 4px rgba(16, 24, 40, 0.04);
103
+ --shadow-lg: 0 12px 24px rgba(16, 24, 40, 0.1), 0 4px 8px rgba(16, 24, 40, 0.04);
104
+ --shadow-xl: 0 24px 48px rgba(16, 24, 40, 0.12);
105
+
106
+ /* ── Transitions ── */
107
+ --transition-fast: 100ms ease;
108
+ --transition-normal: 200ms ease;
109
+ --transition-slow: 300ms ease;
110
+
111
+ /* ── KB Brand ── */
112
+ --color-brand-yellow-positive: #FFBC00; /* KB Yellow Positive (Pantone 130 C) */
113
+ --color-brand-yellow-negative: #FFCC00; /* KB Yellow Negative (Pantone 1235 C) */
114
+ --color-brand-gray: #60584C; /* KB Gray (Pantone 404 C) */
115
+ --color-brand-dark-gray: #545045; /* KB Dark Gray (Pantone 411C) */
116
+ --color-brand-gold: #C5A028; /* KB Gold (Pantone 872 C) */
117
+ --color-brand-silver: #A8AAAD; /* KB Silver (Pantone 877 C) */
118
+
119
+ /* ── Legacy variable aliases (maps css/ folder variables to design tokens) ── */
120
+ --base-txt-color: var(--color-neutral-600);
121
+ --strong-txt-color: var(--color-neutral-900);
122
+ --primary-txt-color: #ffbc00;
123
+ --point-txt-color: #287eff;
124
+ --error-txt-color: #ff3232;
125
+ --placeholder-txt-color: var(--color-neutral-400);
126
+ --base-bg-color: var(--color-neutral-50);
127
+ --base-bd-color: var(--color-neutral-300);
128
+ --bd1-color: var(--color-neutral-300);
129
+ --bd2-color: var(--color-neutral-200);
130
+
131
+ /* ── Semantic design system tokens (dark-mode aware) ── */
132
+ --ds-surface: #ffffff;
133
+ --ds-surface-hover: #f2f2f2;
134
+ --ds-surface-disabled: #f2f2f2;
135
+ --ds-surface-nav: #253349;
136
+ --ds-surface-nav-hover:#464646;
137
+ --ds-surface-primary: var(--color-primary-500); /* #FFBC00 KB Yellow Positive */
138
+ --ds-surface-primary-hover: var(--color-primary-600); /* #CC9600 */
139
+ --ds-surface-secondary: var(--ds-surface-nav); /* #253349 dark navy */
140
+ --ds-surface-secondary-hover: var(--ds-surface-nav-hover);/* #464646 */
141
+
142
+ --ds-text: #222222;
143
+ --ds-text-2: #444444;
144
+ --ds-text-muted: #767676;
145
+ --ds-text-placeholder: #999999;
146
+ --ds-text-disabled: #ababab;
147
+ --ds-text-on-dark: #ffffff;
148
+ --ds-text-error: #ff3232;
149
+
150
+ --ds-border: #d2d2d2;
151
+ --ds-border-light: #ebebeb;
152
+ --ds-border-strong: #444444;
153
+ --ds-border-focus: #999999;
154
+ --ds-border-error: #ff3232;
155
+
156
+ --ds-danger: #ff3232;
157
+ --ds-danger-hover: #cc0000;
158
+
159
+ /* badge variants */
160
+ --ds-badge-success-bg: #d1fae5;
161
+ --ds-badge-success-text: #1d7a57;
162
+ --ds-badge-warning-bg: #fff3cd;
163
+ --ds-badge-warning-text: #b85e00;
164
+ --ds-badge-error-bg: #fee2e2;
165
+ --ds-badge-error-text: #b91c1c;
166
+ --ds-badge-info-bg: #dbeafe;
167
+ --ds-badge-info-text: #1e40af;
168
+ }
169
+
170
+ /* ── Dark mode overrides ── */
171
+ /* Applied via data-theme="dark" on <html> (manual toggle) */
172
+ :root[data-theme="dark"] {
173
+ /* Neutral scale (flipped for dark) */
174
+ --color-neutral-0: #1c1f28;
175
+ --color-neutral-50: #13151c;
176
+ --color-neutral-100: #1e2130;
177
+ --color-neutral-200: #2c3044;
178
+ --color-neutral-300: #3c4055;
179
+ --color-neutral-400: #6b6e82;
180
+ --color-neutral-500: #9295a8;
181
+ --color-neutral-600: #b8bace;
182
+ --color-neutral-700: #d0d2e0;
183
+ --color-neutral-800: #e4e6f2;
184
+ --color-neutral-900: #f2f3f8;
185
+
186
+ /* Semantic status (dark-friendly) */
187
+ --color-success-light: #0a2e1c;
188
+ --color-success: #34d980;
189
+ --color-success-dark: #86efac;
190
+ --color-warning-light: #2e1d00;
191
+ --color-warning: #fbbf24;
192
+ --color-warning-dark: #fde68a;
193
+ --color-error-light: #2e0909;
194
+ --color-error: #f87171;
195
+ --color-error-dark: #fca5a5;
196
+ --color-info-light: #08163a;
197
+ --color-info: #60a5fa;
198
+ --color-info-dark: #93c5fd;
199
+
200
+ /* Semantic ds tokens (dark) */
201
+ --ds-surface: #1c1f28;
202
+ --ds-surface-hover: #252830;
203
+ --ds-surface-disabled: #1e2130;
204
+ --ds-surface-nav: #121924;
205
+ --ds-surface-nav-hover:#2a3548;
206
+
207
+ --ds-text: #f0f0f4;
208
+ --ds-text-2: #c8cad8;
209
+ --ds-text-muted: #8a8d9e;
210
+ --ds-text-placeholder: #5c5f70;
211
+ --ds-text-disabled: #44475a;
212
+ --ds-text-on-dark: #f0f0f4;
213
+ --ds-text-error: #ff6b6b;
214
+
215
+ --ds-border: #353848;
216
+ --ds-border-light: #272a38;
217
+ --ds-border-strong: #8a8d9e;
218
+ --ds-border-focus: #6b6e82;
219
+ --ds-border-error: #ff6b6b;
220
+
221
+ --ds-danger: #ff5252;
222
+ --ds-danger-hover: #d32f2f;
223
+
224
+ /* badge variants (dark) */
225
+ --ds-badge-success-bg: #0a2e1c;
226
+ --ds-badge-success-text: #34d980;
227
+ --ds-badge-warning-bg: #2e1d00;
228
+ --ds-badge-warning-text: #fbbf24;
229
+ --ds-badge-error-bg: #2e0909;
230
+ --ds-badge-error-text: #f87171;
231
+ --ds-badge-info-bg: #08163a;
232
+ --ds-badge-info-text: #60a5fa;
233
+ }
234
+
235
+ /* Applied via OS-level dark preference */
236
+ /* @media (prefers-color-scheme: dark) {
237
+ :root:not([data-theme="light"]) {
238
+ --color-neutral-0: #1c1f28;
239
+ --color-neutral-50: #13151c;
240
+ --color-neutral-100: #1e2130;
241
+ --color-neutral-200: #2c3044;
242
+ --color-neutral-300: #3c4055;
243
+ --color-neutral-400: #6b6e82;
244
+ --color-neutral-500: #9295a8;
245
+ --color-neutral-600: #b8bace;
246
+ --color-neutral-700: #d0d2e0;
247
+ --color-neutral-800: #e4e6f2;
248
+ --color-neutral-900: #f2f3f8;
249
+
250
+ --color-success-light: #0a2e1c;
251
+ --color-success: #34d980;
252
+ --color-success-dark: #86efac;
253
+ --color-warning-light: #2e1d00;
254
+ --color-warning: #fbbf24;
255
+ --color-warning-dark: #fde68a;
256
+ --color-error-light: #2e0909;
257
+ --color-error: #f87171;
258
+ --color-error-dark: #fca5a5;
259
+ --color-info-light: #08163a;
260
+ --color-info: #60a5fa;
261
+ --color-info-dark: #93c5fd;
262
+
263
+ --ds-surface: #1c1f28;
264
+ --ds-surface-hover: #252830;
265
+ --ds-surface-disabled: #1e2130;
266
+ --ds-surface-nav: #121924;
267
+ --ds-surface-nav-hover:#2a3548;
268
+
269
+ --ds-text: #f0f0f4;
270
+ --ds-text-2: #c8cad8;
271
+ --ds-text-muted: #8a8d9e;
272
+ --ds-text-placeholder: #5c5f70;
273
+ --ds-text-disabled: #44475a;
274
+ --ds-text-on-dark: #f0f0f4;
275
+ --ds-text-error: #ff6b6b;
276
+
277
+ --ds-border: #353848;
278
+ --ds-border-light: #272a38;
279
+ --ds-border-strong: #8a8d9e;
280
+ --ds-border-focus: #6b6e82;
281
+ --ds-border-error: #ff6b6b;
282
+
283
+ --ds-danger: #ff5252;
284
+ --ds-danger-hover: #d32f2f;
285
+
286
+ --ds-badge-success-bg: #0a2e1c;
287
+ --ds-badge-success-text: #34d980;
288
+ --ds-badge-warning-bg: #2e1d00;
289
+ --ds-badge-warning-text: #fbbf24;
290
+ --ds-badge-error-bg: #2e0909;
291
+ --ds-badge-error-text: #f87171;
292
+ --ds-badge-info-bg: #08163a;
293
+ --ds-badge-info-text: #60a5fa;
294
+ }
295
+ } */