santycss 1.0.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.
@@ -0,0 +1,680 @@
1
+ /* ═══ SANTY COMPONENTS ═══ */
2
+
3
+ /* ═══════════════════════════════════════════════════════════════
4
+ COMPONENT SHORTCUTS — Higher-level ready-to-use patterns
5
+ ═══════════════════════════════════════════════════════════════ */
6
+
7
+ /* ── Container ── */
8
+ .container {
9
+ width: 100%;
10
+ margin-left: auto;
11
+ margin-right: auto;
12
+ padding-left: 16px;
13
+ padding-right: 16px;
14
+ }
15
+ @media (min-width: 640px) { .container { max-width: 640px; } }
16
+ @media (min-width: 768px) { .container { max-width: 768px; } }
17
+ @media (min-width: 1024px) { .container { max-width: 1024px; } }
18
+ @media (min-width: 1280px) { .container { max-width: 1280px; } }
19
+ @media (min-width: 1536px) { .container { max-width: 1536px; } }
20
+
21
+ /* ── Card ── */
22
+ .card {
23
+ background-color: #ffffff;
24
+ border-radius: 12px;
25
+ box-shadow: var(--santy-shadow);
26
+ overflow: hidden;
27
+ }
28
+ .card-body { padding: 24px; }
29
+ .card-header { padding: 16px 24px; border-bottom: 1px solid #e5e7eb; }
30
+ .card-footer { padding: 16px 24px; border-top: 1px solid #e5e7eb; }
31
+
32
+ /* ── Badge ── */
33
+ .badge {
34
+ display: inline-flex;
35
+ align-items: center;
36
+ padding: 2px 10px;
37
+ font-size: 12px;
38
+ font-weight: 600;
39
+ border-radius: 9999px;
40
+ line-height: 1.5;
41
+ }
42
+
43
+ /* ── Button Base ── */
44
+ .btn {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ padding: 8px 20px;
49
+ font-size: 14px;
50
+ font-weight: 600;
51
+ border-radius: 8px;
52
+ border: none;
53
+ cursor: pointer;
54
+ transition: var(--santy-transition-fast);
55
+ text-decoration: none;
56
+ line-height: 1.5;
57
+ white-space: nowrap;
58
+ }
59
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
60
+ .btn-sm { padding: 4px 12px; font-size: 12px; border-radius: 6px; }
61
+ .btn-lg { padding: 12px 28px; font-size: 16px; border-radius: 10px; }
62
+ .btn-xl { padding: 16px 36px; font-size: 18px; border-radius: 12px; }
63
+ .btn-primary { background-color: #3b82f6; color: #ffffff; }
64
+ .btn-primary:hover { background-color: #2563eb; }
65
+ .btn-secondary { background-color: #6b7280; color: #ffffff; }
66
+ .btn-secondary:hover { background-color: #4b5563; }
67
+ .btn-success { background-color: #22c55e; color: #ffffff; }
68
+ .btn-success:hover { background-color: #16a34a; }
69
+ .btn-danger { background-color: #ef4444; color: #ffffff; }
70
+ .btn-danger:hover { background-color: #dc2626; }
71
+ .btn-warning { background-color: #f59e0b; color: #ffffff; }
72
+ .btn-warning:hover { background-color: #d97706; }
73
+ .btn-outline { background-color: transparent; border: 2px solid currentColor; }
74
+ .btn-ghost { background-color: transparent; }
75
+ .btn-ghost:hover { background-color: rgba(0,0,0,0.05); }
76
+ .btn-full { width: 100%; }
77
+
78
+ /* ── Alert ── */
79
+ .alert {
80
+ padding: 12px 16px;
81
+ border-radius: 8px;
82
+ border-left: 4px solid currentColor;
83
+ margin-bottom: 16px;
84
+ }
85
+ .alert-info { background-color: #eff6ff; color: #1d4ed8; }
86
+ .alert-success { background-color: #f0fdf4; color: #15803d; }
87
+ .alert-warning { background-color: #fffbeb; color: #b45309; }
88
+ .alert-danger { background-color: #fef2f2; color: #b91c1c; }
89
+
90
+ /* ── Input ── */
91
+ .input {
92
+ display: block;
93
+ width: 100%;
94
+ padding: 8px 12px;
95
+ font-size: 14px;
96
+ border: 1px solid #d1d5db;
97
+ border-radius: 6px;
98
+ background-color: #ffffff;
99
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
100
+ outline: none;
101
+ }
102
+ .input:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.2); }
103
+ .input-error { border-color: #ef4444; }
104
+ .input-error:focus { box-shadow: 0 0 0 3px rgba(239,68,68,0.2); }
105
+ .input-lg { padding: 12px 16px; font-size: 16px; border-radius: 8px; }
106
+ .input-sm { padding: 4px 8px; font-size: 12px; }
107
+
108
+ /* ── Divider ── */
109
+ .divider {
110
+ border: none;
111
+ border-top: 1px solid #e5e7eb;
112
+ margin: 16px 0;
113
+ }
114
+ .divider-vertical {
115
+ border: none;
116
+ border-left: 1px solid #e5e7eb;
117
+ align-self: stretch;
118
+ margin: 0 16px;
119
+ }
120
+
121
+ /* ── Overlay ── */
122
+ .overlay {
123
+ position: fixed;
124
+ inset: 0;
125
+ background-color: rgba(0,0,0,0.5);
126
+ z-index: 40;
127
+ }
128
+
129
+ /* ── Avatar ── */
130
+ .avatar {
131
+ display: inline-flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ border-radius: 50%;
135
+ overflow: hidden;
136
+ flex-shrink: 0;
137
+ }
138
+ .avatar-sm { width: 32px; height: 32px; }
139
+ .avatar-md { width: 40px; height: 40px; }
140
+ .avatar-lg { width: 56px; height: 56px; }
141
+ .avatar-xl { width: 80px; height: 80px; }
142
+
143
+ /* ── Spinner ── */
144
+ .spinner {
145
+ border: 3px solid rgba(0,0,0,0.1);
146
+ border-top-color: #3b82f6;
147
+ border-radius: 50%;
148
+ animation: santy-spin 0.7s linear infinite;
149
+ }
150
+ .spinner-sm { width: 16px; height: 16px; }
151
+ .spinner-md { width: 24px; height: 24px; }
152
+ .spinner-lg { width: 40px; height: 40px; }
153
+ .spinner-xl { width: 56px; height: 56px; }
154
+
155
+ /* ── Skeleton (loading placeholder) ── */
156
+ .skeleton {
157
+ background: linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%);
158
+ background-size: 200% 100%;
159
+ animation: santy-skeleton 1.5s ease-in-out infinite;
160
+ border-radius: 4px;
161
+ }
162
+ @keyframes santy-skeleton {
163
+ 0% { background-position: 200% 0; }
164
+ 100% { background-position: -200% 0; }
165
+ }
166
+
167
+ /* ── Progress Bar ── */
168
+ .progress {
169
+ width: 100%;
170
+ height: 8px;
171
+ background-color: #e5e7eb;
172
+ border-radius: 9999px;
173
+ overflow: hidden;
174
+ }
175
+ .progress-bar {
176
+ height: 100%;
177
+ background-color: #3b82f6;
178
+ border-radius: 9999px;
179
+ transition: width 0.3s ease;
180
+ }
181
+
182
+
183
+ /* ── Table ── */
184
+ .table { width: 100%; border-collapse: collapse; font-size: 14px; }
185
+ .table th, .table td { padding: 10px 12px; text-align: left; border-bottom: 1px solid #e5e7eb; }
186
+ .table thead tr { background-color: #f9fafb; }
187
+ .table thead th { font-weight: 600; color: #374151; font-size: 12px; text-transform: uppercase; letter-spacing: 0.05em; }
188
+ .table-striped tbody tr:nth-child(even) { background-color: #f9fafb; }
189
+ .table-bordered { border: 1px solid #e5e7eb; }
190
+ .table-bordered th, .table-bordered td { border: 1px solid #e5e7eb; }
191
+ .table-hover tbody tr:hover { background-color: #f3f4f6; cursor: pointer; }
192
+ .table-compact th, .table-compact td { padding: 6px 10px; font-size: 13px; }
193
+ .table-responsive { overflow-x: auto; -webkit-overflow-scrolling: touch; }
194
+
195
+ /* ── Breadcrumb ── */
196
+ .breadcrumb { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; list-style: none; margin: 0; padding: 0; font-size: 14px; }
197
+ .breadcrumb-item { color: #6b7280; }
198
+ .breadcrumb-item a { color: #3b82f6; text-decoration: none; }
199
+ .breadcrumb-item a:hover { text-decoration: underline; }
200
+ .breadcrumb-item + .breadcrumb-item::before { content: '/'; margin-right: 4px; color: #d1d5db; }
201
+ .breadcrumb-item.active { color: #111827; font-weight: 500; }
202
+ .breadcrumb-dot .breadcrumb-item + .breadcrumb-item::before { content: '·'; }
203
+ .breadcrumb-arrow .breadcrumb-item + .breadcrumb-item::before { content: '›'; font-size: 16px; color: #9ca3af; }
204
+
205
+ /* ── Pagination ── */
206
+ .pagination { display: flex; align-items: center; gap: 4px; list-style: none; margin: 0; padding: 0; flex-wrap: wrap; }
207
+ .page-link { display: inline-flex; align-items: center; justify-content: center; min-width: 36px; height: 36px; padding: 0 10px; font-size: 14px; border: 1px solid #e5e7eb; border-radius: 8px; background-color: #fff; color: #374151; text-decoration: none; cursor: pointer; transition: all 0.15s ease; user-select: none; }
208
+ .page-link:hover { background-color: #f3f4f6; border-color: #d1d5db; }
209
+ .page-item.active .page-link { background-color: #3b82f6; border-color: #3b82f6; color: #fff; }
210
+ .page-item.disabled .page-link { opacity: 0.5; cursor: not-allowed; pointer-events: none; }
211
+ .pagination-sm .page-link { min-width: 28px; height: 28px; font-size: 12px; border-radius: 6px; }
212
+ .pagination-lg .page-link { min-width: 44px; height: 44px; font-size: 16px; border-radius: 10px; }
213
+
214
+ /* ── Chip / Tag ── */
215
+ .chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px; font-size: 13px; font-weight: 500; border-radius: 9999px; background-color: #e5e7eb; color: #374151; cursor: default; transition: background-color 0.15s; }
216
+ .chip:hover { background-color: #d1d5db; }
217
+ .chip-sm { padding: 2px 8px; font-size: 11px; }
218
+ .chip-lg { padding: 6px 16px; font-size: 14px; }
219
+ .chip-blue { background-color: #dbeafe; color: #1d4ed8; }
220
+ .chip-green { background-color: #dcfce7; color: #15803d; }
221
+ .chip-red { background-color: #fee2e2; color: #b91c1c; }
222
+ .chip-yellow { background-color: #fef9c3; color: #854d0e; }
223
+ .chip-purple { background-color: #ede9fe; color: #6d28d9; }
224
+ .chip-orange { background-color: #ffedd5; color: #c2410c; }
225
+ .chip-outline { background-color: transparent; border: 1px solid currentColor; }
226
+
227
+ /* ── List Group ── */
228
+ .list-group { display: flex; flex-direction: column; border-radius: 10px; overflow: hidden; border: 1px solid #e5e7eb; }
229
+ .list-group-item { display: flex; align-items: center; padding: 12px 16px; font-size: 14px; border-bottom: 1px solid #e5e7eb; background-color: #fff; color: #374151; text-decoration: none; transition: background-color 0.15s; }
230
+ .list-group-item:last-child { border-bottom: none; }
231
+ .list-group-item:hover { background-color: #f9fafb; }
232
+ .list-group-item.active { background-color: #3b82f6; color: #fff; border-color: #3b82f6; }
233
+ .list-group-item.disabled { opacity: 0.5; pointer-events: none; }
234
+ .list-group-flush { border: none; border-radius: 0; }
235
+ .list-group-flush .list-group-item { border-left: none; border-right: none; }
236
+ .list-group-numbered .list-group-item { counter-increment: list-group; }
237
+ .list-group-numbered .list-group-item::before { content: counter(list-group) '. '; font-weight: 600; color: #9ca3af; margin-right: 8px; }
238
+
239
+ /* ── Form ── */
240
+ .form-group { display: flex; flex-direction: column; gap: 6px; margin-bottom: 16px; }
241
+ .form-label { font-size: 14px; font-weight: 500; color: #374151; }
242
+ .form-label-required::after { content: ' *'; color: #ef4444; }
243
+ .form-hint { font-size: 12px; color: #6b7280; line-height: 1.4; }
244
+ .form-error-text { font-size: 12px; color: #ef4444; }
245
+ .form-row { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; }
246
+ .form-row-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
247
+
248
+ /* ── Select ── */
249
+ .select { display: block; width: 100%; padding: 8px 36px 8px 12px; font-size: 14px; border: 1px solid #d1d5db; border-radius: 6px; background-color: #fff; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right 10px center; background-size: 16px; outline: none; cursor: pointer; appearance: none; -webkit-appearance: none; transition: border-color 0.15s ease; }
250
+ .select:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.2); }
251
+ .select-error { border-color: #ef4444; }
252
+ .select-sm { padding: 4px 28px 4px 8px; font-size: 12px; border-radius: 4px; }
253
+ .select-lg { padding: 12px 40px 12px 16px; font-size: 16px; border-radius: 8px; }
254
+
255
+ /* ── Textarea ── */
256
+ .textarea { display: block; width: 100%; padding: 8px 12px; font-size: 14px; border: 1px solid #d1d5db; border-radius: 6px; background-color: #fff; transition: border-color 0.15s ease, box-shadow 0.15s ease; outline: none; resize: vertical; min-height: 80px; font-family: inherit; line-height: 1.5; }
257
+ .textarea:focus { border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59,130,246,0.2); }
258
+ .textarea-error { border-color: #ef4444; }
259
+ .textarea-no-resize { resize: none; }
260
+
261
+ /* ── Checkbox & Radio ── */
262
+ .checkbox, .radio-label { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; font-size: 14px; color: #374151; user-select: none; }
263
+ .checkbox input[type="checkbox"], .radio-label input[type="radio"] { width: 16px; height: 16px; accent-color: #3b82f6; cursor: pointer; flex-shrink: 0; }
264
+
265
+ /* ── Toggle / Switch ── */
266
+ .toggle { position: relative; display: inline-block; width: 44px; height: 24px; flex-shrink: 0; }
267
+ .toggle input { opacity: 0; width: 0; height: 0; position: absolute; }
268
+ .toggle-slider { position: absolute; cursor: pointer; inset: 0; background-color: #d1d5db; border-radius: 9999px; transition: background-color 0.2s; }
269
+ .toggle-slider::before { content: ''; position: absolute; width: 20px; height: 20px; left: 2px; top: 2px; background-color: #fff; border-radius: 50%; transition: transform 0.2s; box-shadow: 0 1px 3px rgba(0,0,0,0.2); }
270
+ .toggle input:checked + .toggle-slider { background-color: #3b82f6; }
271
+ .toggle input:checked + .toggle-slider::before { transform: translateX(20px); }
272
+ .toggle input:disabled + .toggle-slider { opacity: 0.5; cursor: not-allowed; }
273
+ .toggle-sm { width: 34px; height: 18px; }
274
+ .toggle-sm .toggle-slider::before { width: 14px; height: 14px; }
275
+ .toggle-sm input:checked + .toggle-slider::before { transform: translateX(16px); }
276
+ .toggle-green input:checked + .toggle-slider { background-color: #22c55e; }
277
+ .toggle-purple input:checked + .toggle-slider { background-color: #8b5cf6; }
278
+
279
+ /* ── Range ── */
280
+ .range { -webkit-appearance: none; width: 100%; height: 4px; border-radius: 9999px; background: #e5e7eb; outline: none; cursor: pointer; }
281
+ .range::-webkit-slider-thumb { -webkit-appearance: none; width: 18px; height: 18px; border-radius: 50%; background: #3b82f6; cursor: pointer; box-shadow: 0 0 0 3px rgba(59,130,246,0.2); }
282
+ .range::-moz-range-thumb { width: 18px; height: 18px; border-radius: 50%; background: #3b82f6; cursor: pointer; border: none; }
283
+
284
+ /* ── Navbar ── */
285
+ .navbar { display: flex; align-items: center; justify-content: space-between; padding: 12px 24px; background-color: #fff; border-bottom: 1px solid #e5e7eb; gap: 16px; }
286
+ .navbar-brand { font-size: 18px; font-weight: 700; color: #111827; text-decoration: none; flex-shrink: 0; }
287
+ .navbar-menu { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
288
+ .navbar-item { padding: 6px 12px; font-size: 14px; color: #6b7280; text-decoration: none; border-radius: 6px; transition: background-color 0.15s, color 0.15s; white-space: nowrap; }
289
+ .navbar-item:hover { background-color: #f3f4f6; color: #111827; }
290
+ .navbar-item.active { color: #3b82f6; background-color: #eff6ff; font-weight: 500; }
291
+ .navbar-dark { background-color: #1e293b; border-bottom-color: #334155; }
292
+ .navbar-dark .navbar-brand { color: #f1f5f9; }
293
+ .navbar-dark .navbar-item { color: #94a3b8; }
294
+ .navbar-dark .navbar-item:hover { background-color: #334155; color: #f1f5f9; }
295
+ .navbar-sticky { position: sticky; top: 0; z-index: 50; }
296
+ .navbar-glass { background-color: rgba(255,255,255,0.8); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); }
297
+ .navbar-dark.navbar-glass { background-color: rgba(15,23,42,0.85); }
298
+
299
+ /* ── Accordion ── */
300
+ .accordion { border: 1px solid #e5e7eb; border-radius: 10px; overflow: hidden; }
301
+ .accordion-flush { border: none; border-radius: 0; }
302
+ .accordion-item { border-bottom: 1px solid #e5e7eb; }
303
+ .accordion-item:last-child { border-bottom: none; }
304
+ .accordion-header { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 14px 18px; font-size: 15px; font-weight: 500; color: #111827; background-color: #fff; cursor: pointer; border: none; text-align: left; transition: background-color 0.15s; }
305
+ .accordion-header:hover { background-color: #f9fafb; }
306
+ .accordion-header[aria-expanded="true"] { background-color: #f9fafb; color: #3b82f6; }
307
+ .accordion-icon { width: 18px; height: 18px; flex-shrink: 0; transition: transform 0.25s ease; }
308
+ .accordion-header[aria-expanded="true"] .accordion-icon { transform: rotate(180deg); }
309
+ .accordion-body { padding: 0 18px; font-size: 14px; color: #6b7280; line-height: 1.6; background-color: #fff; max-height: 0; overflow: hidden; transition: max-height 0.3s ease, padding 0.2s ease; }
310
+ .accordion-body.open { max-height: 2000px; padding: 14px 18px; border-top: 1px solid #f3f4f6; }
311
+
312
+ /* ── Tabs ── */
313
+ .tabs { display: flex; border-bottom: 2px solid #e5e7eb; list-style: none; margin: 0; padding: 0; overflow-x: auto; }
314
+ .tabs-item { padding: 10px 20px; font-size: 14px; font-weight: 500; color: #6b7280; cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; text-decoration: none; transition: color 0.15s, border-color 0.15s; white-space: nowrap; border: none; background: transparent; }
315
+ .tabs-item:hover { color: #374151; }
316
+ .tabs-item.active { color: #3b82f6; border-bottom: 2px solid #3b82f6; }
317
+ .tabs-pill { border-bottom: none; background-color: #f3f4f6; padding: 4px; border-radius: 10px; gap: 4px; }
318
+ .tabs-pill .tabs-item { border-bottom: none; border-radius: 6px; }
319
+ .tabs-pill .tabs-item.active { background-color: #fff; color: #111827; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
320
+ .tabs-underline .tabs-item.active { color: #111827; border-bottom-color: #111827; }
321
+ .tab-panel { display: none; padding: 20px 0; }
322
+ .tab-panel.active { display: block; }
323
+
324
+ /* ── Tooltip (CSS-only) ── */
325
+ .tooltip { position: relative; display: inline-block; }
326
+ .tooltip-content { visibility: hidden; opacity: 0; position: absolute; z-index: 100; background-color: #1f2937; color: #f9fafb; font-size: 12px; padding: 5px 10px; border-radius: 6px; white-space: nowrap; pointer-events: none; transition: opacity 0.15s; line-height: 1.4; }
327
+ .tooltip:hover .tooltip-content { visibility: visible; opacity: 1; }
328
+ .tooltip-top .tooltip-content { bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%); }
329
+ .tooltip-bottom .tooltip-content { top: calc(100% + 8px); left: 50%; transform: translateX(-50%); }
330
+ .tooltip-left .tooltip-content { right: calc(100% + 8px); top: 50%; transform: translateY(-50%); }
331
+ .tooltip-right .tooltip-content { left: calc(100% + 8px); top: 50%; transform: translateY(-50%); }
332
+
333
+ /* ── Notification / Toast ── */
334
+ .notification { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; border-radius: 10px; font-size: 14px; border: 1px solid transparent; line-height: 1.4; }
335
+ .notification-info { background-color: #eff6ff; border-color: #bfdbfe; color: #1d4ed8; }
336
+ .notification-success { background-color: #f0fdf4; border-color: #bbf7d0; color: #15803d; }
337
+ .notification-warning { background-color: #fffbeb; border-color: #fde68a; color: #b45309; }
338
+ .notification-error { background-color: #fef2f2; border-color: #fecaca; color: #b91c1c; }
339
+ .notification-icon { flex-shrink: 0; width: 18px; height: 18px; margin-top: 1px; }
340
+ .notification-title { font-weight: 600; margin-bottom: 2px; }
341
+ .notification-desc { opacity: 0.85; font-size: 13px; }
342
+
343
+ /* ── Steps / Stepper ── */
344
+ .steps { display: flex; align-items: flex-start; list-style: none; margin: 0; padding: 0; }
345
+ .step { display: flex; flex-direction: column; align-items: center; flex: 1; position: relative; }
346
+ .step:not(:last-child)::after { content: ''; position: absolute; top: 15px; left: calc(50% + 16px); right: calc(-50% + 16px); height: 2px; background-color: #e5e7eb; }
347
+ .step.done:not(:last-child)::after { background-color: #22c55e; }
348
+ .step-dot { width: 32px; height: 32px; border-radius: 50%; background-color: #e5e7eb; color: #9ca3af; font-size: 13px; font-weight: 600; display: flex; align-items: center; justify-content: center; flex-shrink: 0; border: 2px solid #e5e7eb; transition: all 0.2s; z-index: 1; }
349
+ .step-label { font-size: 12px; color: #9ca3af; margin-top: 6px; text-align: center; }
350
+ .step.active .step-dot { background-color: #3b82f6; color: #fff; border-color: #3b82f6; box-shadow: 0 0 0 4px rgba(59,130,246,0.15); }
351
+ .step.active .step-label { color: #1d4ed8; font-weight: 500; }
352
+ .step.done .step-dot { background-color: #22c55e; color: #fff; border-color: #22c55e; }
353
+ .step.done .step-label { color: #15803d; }
354
+
355
+ /* ── Modal (CSS-only via :target) ── */
356
+ .modal-overlay { position: fixed; inset: 0; background-color: rgba(0,0,0,0.5); z-index: 200; display: none; align-items: center; justify-content: center; padding: 16px; }
357
+ .modal-overlay:target { display: flex; }
358
+ .modal-box { background-color: #fff; border-radius: 16px; box-shadow: 0 25px 50px -12px rgba(0,0,0,0.25); max-width: 560px; width: 100%; max-height: 90vh; overflow-y: auto; animation: santy-zoom-in 0.25s ease; }
359
+ .modal-header { padding: 20px 24px; border-bottom: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: space-between; }
360
+ .modal-title { font-size: 18px; font-weight: 600; color: #111827; margin: 0; }
361
+ .modal-body { padding: 24px; font-size: 14px; color: #6b7280; line-height: 1.6; }
362
+ .modal-footer { padding: 16px 24px; border-top: 1px solid #e5e7eb; display: flex; justify-content: flex-end; gap: 10px; }
363
+ .modal-sm .modal-box { max-width: 400px; }
364
+ .modal-lg .modal-box { max-width: 768px; }
365
+ .modal-xl .modal-box { max-width: 1024px; }
366
+ .modal-full .modal-box { max-width: 100%; height: 100vh; border-radius: 0; max-height: 100vh; }
367
+ .modal-close { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 6px; border: none; background-color: transparent; cursor: pointer; color: #9ca3af; transition: background-color 0.15s; font-size: 20px; line-height: 1; padding: 0; text-decoration: none; }
368
+ .modal-close:hover { background-color: #f3f4f6; color: #374151; }
369
+ .modal-close::before { content: '×'; }
370
+
371
+ /* ── Drawer / Off-canvas (CSS-only via :target) ── */
372
+ .drawer-overlay { position: fixed; inset: 0; background-color: rgba(0,0,0,0.5); z-index: 200; display: none; }
373
+ .drawer-overlay:target { display: block; }
374
+ .drawer-panel { position: fixed; top: 0; bottom: 0; left: 0; width: 300px; background-color: #fff; z-index: 201; overflow-y: auto; box-shadow: 4px 0 24px rgba(0,0,0,0.12); transform: translateX(-100%); transition: transform 0.3s ease; }
375
+ .drawer-overlay:target .drawer-panel { transform: translateX(0); }
376
+ .drawer-panel-right { left: auto; right: 0; transform: translateX(100%); box-shadow: -4px 0 24px rgba(0,0,0,0.12); }
377
+ .drawer-overlay:target .drawer-panel-right { transform: translateX(0); }
378
+ .drawer-header { padding: 20px 24px; border-bottom: 1px solid #e5e7eb; display: flex; align-items: center; justify-content: space-between; }
379
+ .drawer-body { padding: 20px 24px; }
380
+
381
+ /* ── Media Object ── */
382
+ .media { display: flex; gap: 16px; align-items: flex-start; }
383
+ .media-body { flex: 1; min-width: 0; }
384
+ .media-right { order: 2; }
385
+ .media-sm { gap: 10px; }
386
+ .media-lg { gap: 24px; }
387
+
388
+ /* ── Stat Card ── */
389
+ .stat-card { background-color: #fff; border: 1px solid #e5e7eb; border-radius: 12px; padding: 20px 24px; }
390
+ .stat-label { font-size: 13px; font-weight: 500; color: #6b7280; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px; }
391
+ .stat-value { font-size: 32px; font-weight: 700; color: #111827; line-height: 1; margin-bottom: 8px; }
392
+ .stat-delta { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; font-weight: 500; }
393
+ .stat-delta-up { color: #15803d; }
394
+ .stat-delta-down { color: #b91c1c; }
395
+
396
+ /* ── Kbd ── */
397
+ .kbd { display: inline-block; padding: 2px 7px; font-family: ui-monospace, monospace; font-size: 12px; color: #374151; background-color: #f3f4f6; border: 1px solid #d1d5db; border-bottom-width: 2px; border-radius: 4px; box-shadow: inset 0 -1px 0 #d1d5db; white-space: nowrap; }
398
+
399
+ /* ── Close Button ── */
400
+ .btn-close { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: none; border-radius: 6px; background-color: transparent; cursor: pointer; color: #9ca3af; transition: background-color 0.15s, color 0.15s; font-size: 20px; line-height: 1; padding: 0; }
401
+ .btn-close:hover { background-color: #f3f4f6; color: #374151; }
402
+ .btn-close::before { content: '×'; }
403
+ .btn-close-white { color: rgba(255,255,255,0.7); }
404
+ .btn-close-white:hover { background-color: rgba(255,255,255,0.1); color: #fff; }
405
+
406
+ /* ── Empty State ── */
407
+ .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 24px; text-align: center; }
408
+ .empty-state-icon { font-size: 48px; margin-bottom: 16px; opacity: 0.5; line-height: 1; }
409
+ .empty-state-title { font-size: 18px; font-weight: 600; color: #111827; margin: 0 0 8px; }
410
+ .empty-state-desc { font-size: 14px; color: #6b7280; max-width: 320px; margin: 0 auto 20px; line-height: 1.5; }
411
+
412
+ /* ── Elevation (Material Design levels) ── */
413
+ .elevation-0 { box-shadow: none; }
414
+ .elevation-1 { box-shadow: 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24); }
415
+ .elevation-2 { box-shadow: 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23); }
416
+ .elevation-3 { box-shadow: 0 10px 20px rgba(0,0,0,.19), 0 6px 6px rgba(0,0,0,.23); }
417
+ .elevation-4 { box-shadow: 0 14px 28px rgba(0,0,0,.25), 0 10px 10px rgba(0,0,0,.22); }
418
+ .elevation-5 { box-shadow: 0 19px 38px rgba(0,0,0,.30), 0 15px 12px rgba(0,0,0,.22); }
419
+
420
+ /* ── Screen Reader / Accessibility ── */
421
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border-width: 0; }
422
+ .not-sr-only { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; }
423
+ .sr-only-focusable:focus { position: static; width: auto; height: auto; overflow: visible; clip: auto; white-space: normal; }
424
+ .focus-ring:focus-visible { outline: 2px solid #3b82f6; outline-offset: 2px; }
425
+ .focus-ring-inset:focus-visible { outline: 2px solid #3b82f6; outline-offset: -2px; }
426
+ .focus-none:focus { outline: none; box-shadow: none; }
427
+
428
+ /* ── Pointer Events ── */
429
+ .pointer-events-none { pointer-events: none; }
430
+ .pointer-events-auto { pointer-events: auto; }
431
+
432
+ /* ── User Select ── */
433
+ .select-none { user-select: none; -webkit-user-select: none; }
434
+ .select-text { user-select: text; }
435
+ .select-all { user-select: all; }
436
+ .select-auto { user-select: auto; }
437
+
438
+ /* ── Will-change ── */
439
+ .will-change-auto { will-change: auto; }
440
+ .will-change-scroll { will-change: scroll-position; }
441
+ .will-change-contents { will-change: contents; }
442
+ .will-change-transform { will-change: transform; }
443
+ .will-change-opacity { will-change: opacity; }
444
+
445
+ /* ── Appearance ── */
446
+ .appearance-none { -webkit-appearance: none; appearance: none; }
447
+ .appearance-auto { -webkit-appearance: auto; appearance: auto; }
448
+
449
+ /* ── Caret color ── */
450
+ .caret-blue { caret-color: #3b82f6; }
451
+ .caret-green { caret-color: #22c55e; }
452
+ .caret-red { caret-color: #ef4444; }
453
+ .caret-auto { caret-color: auto; }
454
+ .caret-transparent { caret-color: transparent; }
455
+
456
+ /* ── Touch action ── */
457
+ .touch-none { touch-action: none; }
458
+ .touch-pan-x { touch-action: pan-x; }
459
+ .touch-pan-y { touch-action: pan-y; }
460
+ .touch-manipulation{ touch-action: manipulation; }
461
+ .touch-auto { touch-action: auto; }
462
+
463
+ /* ── Print utilities ── */
464
+ @media print {
465
+ .print-hidden { display: none !important; }
466
+ .print-visible { display: block !important; }
467
+ .print-break-before { page-break-before: always; }
468
+ .print-break-after { page-break-after: always; }
469
+ .print-no-background { background: white !important; color: black !important; }
470
+ .print-border-none { border: none !important; box-shadow: none !important; }
471
+ }
472
+
473
+ /* ── Message / Hero (Bulma-style) ── */
474
+ .message { border: 1px solid #e5e7eb; border-radius: 10px; overflow: hidden; font-size: 14px; }
475
+ .message-header { display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; font-weight: 600; }
476
+ .message-body { padding: 14px 16px; color: #374151; line-height: 1.5; }
477
+ .message-info .message-header { background-color: #3b82f6; color: #fff; }
478
+ .message-info .message-body { background-color: #eff6ff; }
479
+ .message-success .message-header { background-color: #22c55e; color: #fff; }
480
+ .message-success .message-body { background-color: #f0fdf4; }
481
+ .message-warning .message-header { background-color: #f59e0b; color: #fff; }
482
+ .message-warning .message-body { background-color: #fffbeb; }
483
+ .message-danger .message-header { background-color: #ef4444; color: #fff; }
484
+ .message-danger .message-body { background-color: #fef2f2; }
485
+
486
+ /* ── Hero section ── */
487
+ .hero-section { display: flex; align-items: center; justify-content: center; min-height: 400px; padding: 64px 24px; text-align: center; }
488
+ .hero-section-sm { min-height: 200px; padding: 40px 24px; }
489
+ .hero-section-lg { min-height: 600px; }
490
+ .hero-section-full { min-height: 100vh; }
491
+ .hero-content { max-width: 800px; margin: 0 auto; }
492
+
493
+ /* ── Level (Bulma-style horizontal layout) ── */
494
+ .level { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
495
+ .level-left { display: flex; align-items: center; gap: 12px; }
496
+ .level-right { display: flex; align-items: center; gap: 12px; }
497
+ .level-item { flex: 1; text-align: center; }
498
+
499
+ /* ── FAB (Material floating action button) ── */
500
+ .fab { display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 50%; background-color: #3b82f6; color: #fff; border: none; cursor: pointer; box-shadow: 0 6px 10px rgba(0,0,0,.2), 0 2px 4px rgba(0,0,0,.15); transition: box-shadow 0.2s, transform 0.2s; }
501
+ .fab:hover { box-shadow: 0 8px 16px rgba(0,0,0,.25), 0 4px 6px rgba(0,0,0,.15); transform: translateY(-1px); }
502
+ .fab:active { box-shadow: 0 4px 8px rgba(0,0,0,.2); transform: translateY(0); }
503
+ .fab-sm { width: 40px; height: 40px; }
504
+ .fab-lg { width: 72px; height: 72px; }
505
+ .fab-extended { width: auto; border-radius: 9999px; padding: 0 20px; gap: 8px; font-size: 14px; font-weight: 600; }
506
+ .fab-bottom-right { position: fixed; bottom: 24px; right: 24px; z-index: 50; }
507
+ .fab-bottom-left { position: fixed; bottom: 24px; left: 24px; z-index: 50; }
508
+
509
+ /* ── App Bar (Material-style) ── */
510
+ .app-bar { display: flex; align-items: center; gap: 16px; padding: 0 16px; height: 56px; background-color: #fff; border-bottom: 1px solid #e5e7eb; position: relative; z-index: 10; }
511
+ .app-bar-title { font-size: 18px; font-weight: 600; color: #111827; flex: 1; }
512
+ .app-bar-dark { background-color: #1e293b; border-bottom-color: #334155; }
513
+ .app-bar-dark .app-bar-title { color: #f1f5f9; }
514
+ .app-bar-primary { background-color: #3b82f6; border-bottom-color: #2563eb; }
515
+ .app-bar-primary .app-bar-title { color: #fff; }
516
+ .app-bar-sticky { position: sticky; top: 0; z-index: 50; }
517
+
518
+ /* ── Card variants (Bootstrap-style) ── */
519
+ .card-flat { box-shadow: none; border: 1px solid #e5e7eb; }
520
+ .card-raised { box-shadow: 0 10px 25px -5px rgba(0,0,0,.15), 0 4px 10px -4px rgba(0,0,0,.1); }
521
+ .card-outline { box-shadow: none; border: 2px solid #e5e7eb; background-color: transparent; }
522
+ .card-horizontal { display: flex; flex-direction: row; }
523
+ .card-horizontal .card-img { width: 200px; flex-shrink: 0; object-fit: cover; }
524
+ .card-img-top { width: 100%; object-fit: cover; }
525
+ .card-img-bottom { width: 100%; object-fit: cover; }
526
+
527
+ /* ── Button groups ── */
528
+ .btn-group { display: inline-flex; }
529
+ .btn-group .btn { border-radius: 0; border-right-width: 0; }
530
+ .btn-group .btn:first-child { border-radius: 8px 0 0 8px; }
531
+ .btn-group .btn:last-child { border-radius: 0 8px 8px 0; border-right-width: 1px; }
532
+ .btn-group-vertical { display: inline-flex; flex-direction: column; }
533
+ .btn-group-vertical .btn { border-radius: 0; border-bottom-width: 0; }
534
+ .btn-group-vertical .btn:first-child { border-radius: 8px 8px 0 0; }
535
+ .btn-group-vertical .btn:last-child { border-radius: 0 0 8px 8px; border-bottom-width: 1px; }
536
+
537
+ /* ── Input group (Bootstrap-style) ── */
538
+ .input-group { display: flex; }
539
+ .input-group .input { border-radius: 0; border-right-width: 0; flex: 1; }
540
+ .input-group .input:first-child { border-radius: 6px 0 0 6px; }
541
+ .input-group .input:last-child { border-radius: 0 6px 6px 0; border-right-width: 1px; }
542
+ .input-addon { display: flex; align-items: center; padding: 0 12px; background-color: #f3f4f6; border: 1px solid #d1d5db; border-right: none; font-size: 14px; color: #6b7280; white-space: nowrap; }
543
+ .input-addon:first-child { border-radius: 6px 0 0 6px; }
544
+ .input-addon:last-child { border-radius: 0 6px 6px 0; border-left: none; border-right-width: 1px; }
545
+
546
+
547
+ /* ── Dropdown ── */
548
+ .dropdown { position: relative; display: inline-block; }
549
+ .dropdown-toggle { cursor: pointer; }
550
+ .dropdown-menu {
551
+ display: none;
552
+ position: absolute;
553
+ top: calc(100% + 4px);
554
+ left: 0;
555
+ min-width: 180px;
556
+ background-color: #fff;
557
+ border: 1px solid #e5e7eb;
558
+ border-radius: 10px;
559
+ box-shadow: var(--santy-shadow-md);
560
+ z-index: 200;
561
+ padding: 4px;
562
+ animation: santy-zoom-in 0.15s ease;
563
+ }
564
+ .dropdown-menu-right { left: auto; right: 0; }
565
+ .dropdown-menu-top { top: auto; bottom: calc(100% + 4px); }
566
+ .dropdown.open .dropdown-menu,
567
+ .dropdown-toggle:focus + .dropdown-menu,
568
+ .dropdown-menu:target { display: block; }
569
+ .dropdown-item {
570
+ display: flex;
571
+ align-items: center;
572
+ gap: 8px;
573
+ padding: 8px 12px;
574
+ font-size: 14px;
575
+ color: #374151;
576
+ text-decoration: none;
577
+ border-radius: 6px;
578
+ cursor: pointer;
579
+ transition: background-color 0.1s;
580
+ border: none;
581
+ background: transparent;
582
+ width: 100%;
583
+ text-align: left;
584
+ }
585
+ .dropdown-item:hover { background-color: #f3f4f6; color: #111827; }
586
+ .dropdown-item.active { background-color: #eff6ff; color: #2563eb; }
587
+ .dropdown-item.danger { color: #dc2626; }
588
+ .dropdown-item.danger:hover { background-color: #fef2f2; }
589
+ .dropdown-item:disabled, .dropdown-item.disabled { opacity: 0.5; cursor: not-allowed; pointer-events: none; }
590
+ .dropdown-divider { height: 1px; background-color: #e5e7eb; margin: 4px 0; }
591
+ .dropdown-header { padding: 6px 12px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: #9ca3af; }
592
+
593
+ /* ── Dark Mode Component Variants ── */
594
+ @media (prefers-color-scheme: dark) {
595
+ .dark-auto .card { background-color: #1e293b; }
596
+ .dark-auto .card-header { border-color: #334155; }
597
+ .dark-auto .card-footer { border-color: #334155; }
598
+ .dark-auto .btn-outline { border-color: #475569; color: #e2e8f0; }
599
+ .dark-auto .input { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
600
+ .dark-auto .input::placeholder { color: #64748b; }
601
+ .dark-auto .select { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
602
+ }
603
+ /* Manual dark mode via .dark class on html/body */
604
+ .dark .card { background-color: #1e293b; color: #f1f5f9; }
605
+ .dark .card-header { border-color: #334155; }
606
+ .dark .card-footer { border-color: #334155; }
607
+ .dark .card-body { color: #cbd5e1; }
608
+ .dark .input { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
609
+ .dark .input:focus { border-color: #3b82f6; }
610
+ .dark .select { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
611
+ .dark .textarea { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
612
+ .dark .dropdown-menu { background-color: #1e293b; border-color: #334155; }
613
+ .dark .dropdown-item { color: #e2e8f0; }
614
+ .dark .dropdown-item:hover { background-color: #334155; color: #f1f5f9; }
615
+ .dark .list-group-item { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
616
+ .dark .list-group-item:hover { background-color: #334155; }
617
+ .dark .table th, .dark .table td { border-color: #334155; }
618
+ .dark .table thead tr { background-color: #0f172a; }
619
+ .dark .table thead th { color: #94a3b8; }
620
+ .dark .modal-box { background-color: #1e293b; color: #f1f5f9; }
621
+ .dark .modal-header { border-color: #334155; }
622
+ .dark .modal-footer { border-color: #334155; }
623
+ .dark .accordion { border-color: #334155; }
624
+ .dark .accordion-item { border-color: #334155; }
625
+ .dark .accordion-header { background-color: #1e293b; color: #f1f5f9; }
626
+ .dark .accordion-header:hover { background-color: #334155; }
627
+ .dark .accordion-body { background-color: #1e293b; color: #94a3b8; }
628
+ .dark .tabs { border-color: #334155; }
629
+ .dark .tabs-item { color: #94a3b8; }
630
+ .dark .tabs-item:hover { color: #e2e8f0; }
631
+ .dark .tabs-pill { background-color: #0f172a; }
632
+ .dark .tabs-pill .tabs-item.active { background-color: #1e293b; color: #f1f5f9; }
633
+ /* Dark buttons */
634
+ .dark .btn-outline { border-color: #475569; color: #e2e8f0; }
635
+ .dark .btn-outline:hover { background-color: #334155; }
636
+ .dark .btn-ghost { color: #cbd5e1; }
637
+ .dark .btn-ghost:hover { background-color: #334155; }
638
+ .dark .btn-secondary { background-color: #334155; color: #f1f5f9; border-color: #475569; }
639
+ .dark .btn-secondary:hover { background-color: #475569; }
640
+ /* Dark alerts */
641
+ .dark .alert { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
642
+ .dark .alert-info { background-color: #0c1a2e; border-color: #1e3a5f; color: #93c5fd; }
643
+ .dark .alert-success { background-color: #052e16; border-color: #166534; color: #86efac; }
644
+ .dark .alert-warning { background-color: #2d1b00; border-color: #92400e; color: #fcd34d; }
645
+ .dark .alert-danger { background-color: #2d0a0a; border-color: #991b1b; color: #fca5a5; }
646
+ /* Dark badges */
647
+ .dark .badge { background-color: #334155; color: #e2e8f0; }
648
+ /* Dark notifications */
649
+ .dark .notification { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
650
+ .dark .notification-success { background-color: #052e16; border-color: #166534; }
651
+ .dark .notification-error { background-color: #2d0a0a; border-color: #991b1b; }
652
+ .dark .notification-warning { background-color: #2d1b00; border-color: #92400e; }
653
+ /* Dark breadcrumb + pagination */
654
+ .dark .breadcrumb-item { color: #94a3b8; }
655
+ .dark .breadcrumb-item.active { color: #e2e8f0; }
656
+ .dark .page-link { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
657
+ .dark .page-item.active .page-link { background-color: #3b82f6; border-color: #3b82f6; color: #fff; }
658
+ .dark .page-item.disabled .page-link { opacity: 0.4; }
659
+ /* Dark navbar */
660
+ .dark .navbar { background-color: #0f172a; border-color: #1e293b; }
661
+ .dark .navbar-brand { color: #f1f5f9; }
662
+ .dark .navbar-item { color: #94a3b8; }
663
+ .dark .navbar-item:hover { background-color: #1e293b; color: #f1f5f9; }
664
+ /* Dark drawer */
665
+ .dark .drawer-panel { background-color: #1e293b; }
666
+ .dark .drawer-header { border-color: #334155; color: #f1f5f9; }
667
+ .dark .drawer-body { color: #cbd5e1; }
668
+ /* Dark steps */
669
+ .dark .step-dot { background-color: #334155; color: #94a3b8; }
670
+ .dark .step.active .step-dot { background-color: #3b82f6; color: #fff; }
671
+ .dark .step.done .step-dot { background-color: #22c55e; color: #fff; }
672
+ .dark .step-label { color: #94a3b8; }
673
+ .dark .step.active .step-label { color: #f1f5f9; }
674
+
675
+ /* ── Container Queries (modern CSS) ── */
676
+ @container (min-width: 400px) { .cq-sm\:make-flex { display: flex; } .cq-sm\:grid-cols-2 { grid-template-columns: repeat(2,1fr); } }
677
+ @container (min-width: 600px) { .cq-md\:grid-cols-3 { grid-template-columns: repeat(3,1fr); } .cq-md\:make-flex { display: flex; } }
678
+ @container (min-width: 800px) { .cq-lg\:grid-cols-4 { grid-template-columns: repeat(4,1fr); } }
679
+ .container-query { container-type: inline-size; }
680
+ .container-query-size { container-type: size; }