santycss 1.0.0 → 1.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.
@@ -1,680 +1,900 @@
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; }
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
+ /* ── Component Variant System ──────────────────────────────────────────── */
594
+ /* Usage: make-button style-success size-large shape-pill */
595
+
596
+ /* make-button */
597
+ .make-button {
598
+ display:inline-flex; align-items:center; justify-content:center;
599
+ gap:8px; padding:9px 20px; font-size:14px; font-weight:600;
600
+ border-radius:8px; border:2px solid transparent; cursor:pointer;
601
+ text-decoration:none; transition:all 0.2s; line-height:1.25; white-space:nowrap;
602
+ }
603
+ .make-button:disabled { opacity:.5; cursor:not-allowed; }
604
+ .make-button.style-primary { background:#3b82f6; color:#fff; border-color:#3b82f6; }
605
+ .make-button.style-primary:hover { background:#2563eb; border-color:#2563eb; }
606
+ .make-button.style-secondary { background:#6b7280; color:#fff; border-color:#6b7280; }
607
+ .make-button.style-secondary:hover { background:#4b5563; border-color:#4b5563; }
608
+ .make-button.style-success { background:#22c55e; color:#fff; border-color:#22c55e; }
609
+ .make-button.style-success:hover { background:#16a34a; border-color:#16a34a; }
610
+ .make-button.style-danger { background:#ef4444; color:#fff; border-color:#ef4444; }
611
+ .make-button.style-danger:hover { background:#dc2626; border-color:#dc2626; }
612
+ .make-button.style-warning { background:#f59e0b; color:#fff; border-color:#f59e0b; }
613
+ .make-button.style-warning:hover { background:#d97706; border-color:#d97706; }
614
+ .make-button.style-info { background:#06b6d4; color:#fff; border-color:#06b6d4; }
615
+ .make-button.style-info:hover { background:#0891b2; border-color:#0891b2; }
616
+ .make-button.style-outline { background:transparent; border-color:currentColor; }
617
+ .make-button.style-outline:hover { background:rgba(0,0,0,.05); }
618
+ .make-button.style-ghost { background:transparent; border-color:transparent; }
619
+ .make-button.style-ghost:hover { background:rgba(0,0,0,.05); }
620
+ .make-button.style-dark { background:#1e293b; color:#f1f5f9; border-color:#1e293b; }
621
+ .make-button.style-dark:hover { background:#0f172a; border-color:#0f172a; }
622
+ .make-button.style-light { background:#f3f4f6; color:#374151; border-color:#e5e7eb; }
623
+ .make-button.style-light:hover { background:#e5e7eb; }
624
+ .make-button.size-tiny { padding:2px 8px; font-size:11px; border-radius:4px; }
625
+ .make-button.size-small { padding:5px 14px; font-size:12px; border-radius:6px; }
626
+ .make-button.size-large { padding:12px 28px; font-size:16px; border-radius:10px; }
627
+ .make-button.size-xl { padding:16px 36px; font-size:18px; border-radius:12px; }
628
+ .make-button.size-full { width:100%; justify-content:center; }
629
+ .make-button.shape-pill { border-radius:9999px; }
630
+ .make-button.shape-square { border-radius:0; }
631
+ .make-button.shape-rounded { border-radius:14px; }
632
+
633
+ /* make-card */
634
+ .make-card { background:#fff; border-radius:12px; box-shadow:var(--santy-shadow); overflow:hidden; }
635
+ .make-card.style-bordered { border:1px solid #e5e7eb; box-shadow:none; }
636
+ .make-card.style-elevated { box-shadow:0 10px 40px -8px rgba(0,0,0,.15); }
637
+ .make-card.style-flat { box-shadow:none; }
638
+ .make-card.style-dark { background:#1e293b; color:#f1f5f9; }
639
+ .make-card.shape-pill { border-radius:9999px; }
640
+ .make-card.shape-square { border-radius:0; }
641
+ .make-card.shape-rounded { border-radius:20px; }
642
+ .make-card.size-small { border-radius:8px; }
643
+ .make-card.size-large { border-radius:20px; }
644
+
645
+ /* make-badge */
646
+ .make-badge { display:inline-flex; align-items:center; gap:4px; padding:3px 10px; font-size:12px; font-weight:600; border-radius:9999px; line-height:1.4; }
647
+ .make-badge.style-primary { background:#dbeafe; color:#1d4ed8; }
648
+ .make-badge.style-secondary { background:#f3f4f6; color:#374151; }
649
+ .make-badge.style-success { background:#dcfce7; color:#15803d; }
650
+ .make-badge.style-danger { background:#fee2e2; color:#b91c1c; }
651
+ .make-badge.style-warning { background:#fef3c7; color:#b45309; }
652
+ .make-badge.style-info { background:#cffafe; color:#0e7490; }
653
+ .make-badge.style-dark { background:#1e293b; color:#f1f5f9; }
654
+ .make-badge.style-outline { background:transparent; border:1.5px solid currentColor; }
655
+ .make-badge.size-small { padding:1px 7px; font-size:10px; }
656
+ .make-badge.size-large { padding:5px 14px; font-size:14px; }
657
+ .make-badge.shape-square { border-radius:4px; }
658
+ .make-badge.shape-rounded { border-radius:6px; }
659
+
660
+ /* make-alert */
661
+ .make-alert { display:flex; align-items:flex-start; gap:12px; padding:14px 16px; border-radius:10px; font-size:14px; border:1px solid transparent; line-height:1.5; }
662
+ .make-alert.style-info { background:#eff6ff; border-color:#bfdbfe; color:#1d4ed8; }
663
+ .make-alert.style-success { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; }
664
+ .make-alert.style-warning { background:#fffbeb; border-color:#fde68a; color:#b45309; }
665
+ .make-alert.style-danger { background:#fef2f2; border-color:#fecaca; color:#b91c1c; }
666
+ .make-alert.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
667
+ .make-alert.size-small { padding:10px 12px; font-size:13px; border-radius:8px; }
668
+ .make-alert.size-large { padding:20px; font-size:16px; border-radius:12px; }
669
+ .make-alert.shape-square { border-radius:0; }
670
+ .make-alert.shape-pill { border-radius:9999px; padding-left:24px; }
671
+
672
+ /* make-input */
673
+ .make-input { display:block; width:100%; padding:9px 12px; font-size:14px; font-family:inherit; color:#111827; background:#fff; border:1.5px solid #d1d5db; border-radius:8px; transition:border-color .15s,box-shadow .15s; outline:none; line-height:1.5; }
674
+ .make-input:focus { border-color:#3b82f6; box-shadow:0 0 0 3px rgba(59,130,246,.2); }
675
+ .make-input.style-error { border-color:#ef4444; }
676
+ .make-input.style-error:focus { box-shadow:0 0 0 3px rgba(239,68,68,.2); }
677
+ .make-input.style-success { border-color:#22c55e; }
678
+ .make-input.size-small { padding:4px 8px; font-size:12px; border-radius:6px; }
679
+ .make-input.size-large { padding:12px 16px; font-size:16px; border-radius:10px; }
680
+ .make-input.shape-pill { border-radius:9999px; padding-left:20px; }
681
+ .make-input.shape-square { border-radius:0; }
682
+
683
+ /* make-avatar */
684
+ .make-avatar { display:inline-flex; align-items:center; justify-content:center; width:40px; height:40px; border-radius:50%; background:#e5e7eb; color:#374151; font-weight:600; font-size:14px; overflow:hidden; flex-shrink:0; }
685
+ .make-avatar img { width:100%; height:100%; object-fit:cover; }
686
+ .make-avatar.size-tiny { width:24px; height:24px; font-size:10px; }
687
+ .make-avatar.size-small { width:32px; height:32px; font-size:12px; }
688
+ .make-avatar.size-large { width:56px; height:56px; font-size:18px; }
689
+ .make-avatar.size-xl { width:80px; height:80px; font-size:24px; }
690
+ .make-avatar.shape-square { border-radius:8px; }
691
+ .make-avatar.shape-rounded { border-radius:12px; }
692
+ .make-avatar.style-primary { background:#dbeafe; color:#1d4ed8; }
693
+ .make-avatar.style-success { background:#dcfce7; color:#15803d; }
694
+ .make-avatar.style-danger { background:#fee2e2; color:#b91c1c; }
695
+ .make-avatar.style-warning { background:#fef3c7; color:#b45309; }
696
+ .make-avatar.style-dark { background:#1e293b; color:#f1f5f9; }
697
+
698
+ /* make-spinner */
699
+ .make-spinner { display:inline-block; width:24px; height:24px; border:3px solid #e5e7eb; border-top-color:#3b82f6; border-radius:50%; animation:santy-spin .75s linear infinite; }
700
+ .make-spinner.size-tiny { width:14px; height:14px; border-width:2px; }
701
+ .make-spinner.size-small { width:18px; height:18px; border-width:2px; }
702
+ .make-spinner.size-large { width:40px; height:40px; border-width:4px; }
703
+ .make-spinner.size-xl { width:56px; height:56px; border-width:5px; }
704
+ .make-spinner.style-success { border-top-color:#22c55e; }
705
+ .make-spinner.style-danger { border-top-color:#ef4444; }
706
+ .make-spinner.style-warning { border-top-color:#f59e0b; }
707
+ .make-spinner.style-dark { border-color:#334155; border-top-color:#f1f5f9; }
708
+
709
+ /* make-skeleton */
710
+ .make-skeleton { background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0 50%,#f0f0f0 75%); background-size:200% 100%; animation:santy-shimmer 1.5s infinite; border-radius:6px; }
711
+ .make-skeleton.shape-circle { border-radius:50%; }
712
+ .make-skeleton.shape-pill { border-radius:9999px; }
713
+ .make-skeleton.shape-square { border-radius:0; }
714
+ .make-skeleton.size-small { height:12px; }
715
+ .make-skeleton.size-large { height:24px; }
716
+
717
+ /* make-progress */
718
+ .make-progress { width:100%; background:#e5e7eb; border-radius:9999px; overflow:hidden; }
719
+ .make-progress > .bar { height:8px; background:#3b82f6; border-radius:9999px; transition:width .4s ease; }
720
+ .make-progress.style-success > .bar { background:#22c55e; }
721
+ .make-progress.style-danger > .bar { background:#ef4444; }
722
+ .make-progress.style-warning > .bar { background:#f59e0b; }
723
+ .make-progress.style-dark > .bar { background:#1e293b; }
724
+ .make-progress.size-small > .bar { height:4px; }
725
+ .make-progress.size-large > .bar { height:14px; }
726
+ .make-progress.shape-square { border-radius:0; }
727
+ .make-progress.shape-square > .bar { border-radius:0; }
728
+
729
+ /* make-table */
730
+ .make-table { width:100%; border-collapse:collapse; font-size:14px; }
731
+ .make-table th,.make-table td { padding:10px 12px; text-align:left; border-bottom:1px solid #e5e7eb; }
732
+ .make-table thead tr { background:#f9fafb; }
733
+ .make-table thead th { font-weight:600; color:#374151; font-size:12px; text-transform:uppercase; letter-spacing:.05em; }
734
+ .make-table.style-striped tbody tr:nth-child(even) { background:#f9fafb; }
735
+ .make-table.style-bordered { border:1px solid #e5e7eb; }
736
+ .make-table.style-bordered th,.make-table.style-bordered td { border:1px solid #e5e7eb; }
737
+ .make-table.style-hover tbody tr:hover { background:#f3f4f6; cursor:pointer; }
738
+ .make-table.style-dark { background:#1e293b; color:#f1f5f9; }
739
+ .make-table.style-dark th,.make-table.style-dark td { border-color:#334155; }
740
+ .make-table.style-dark thead tr { background:#0f172a; }
741
+ .make-table.size-small th,.make-table.size-small td { padding:6px 10px; font-size:13px; }
742
+ .make-table.size-large th,.make-table.size-large td { padding:14px 16px; font-size:15px; }
743
+
744
+ /* make-navbar */
745
+ .make-navbar { display:flex; align-items:center; justify-content:space-between; padding:12px 24px; background:#fff; border-bottom:1px solid #e5e7eb; gap:16px; }
746
+ .make-navbar.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
747
+ .make-navbar.style-glass { background:rgba(255,255,255,.8); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); }
748
+ .make-navbar.style-transparent { background:transparent; border-color:transparent; }
749
+ .make-navbar.style-dark.style-glass { background:rgba(15,23,42,.85); }
750
+ .make-navbar.size-small { padding:8px 16px; }
751
+ .make-navbar.size-large { padding:20px 32px; }
752
+ .make-navbar.shape-sticky { position:sticky; top:0; z-index:50; }
753
+
754
+ /* make-tooltip */
755
+ .make-tooltip { position:relative; display:inline-block; }
756
+ .make-tooltip .tip { visibility:hidden; opacity:0; position:absolute; z-index:100; background:#1f2937; color:#f9fafb; font-size:12px; padding:5px 10px; border-radius:6px; white-space:nowrap; pointer-events:none; transition:opacity .15s; line-height:1.4; }
757
+ .make-tooltip:hover .tip { visibility:visible; opacity:1; }
758
+ .make-tooltip.style-top .tip { bottom:calc(100% + 8px); left:50%; transform:translateX(-50%); }
759
+ .make-tooltip.style-bottom .tip { top:calc(100% + 8px); left:50%; transform:translateX(-50%); }
760
+ .make-tooltip.style-left .tip { right:calc(100% + 8px); top:50%; transform:translateY(-50%); }
761
+ .make-tooltip.style-right .tip { left:calc(100% + 8px); top:50%; transform:translateY(-50%); }
762
+ .make-tooltip.style-light .tip { background:#fff; color:#111827; box-shadow:0 4px 12px rgba(0,0,0,.15); }
763
+
764
+ /* make-notification */
765
+ .make-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; }
766
+ .make-notification.style-info { background:#eff6ff; border-color:#bfdbfe; color:#1d4ed8; }
767
+ .make-notification.style-success { background:#f0fdf4; border-color:#bbf7d0; color:#15803d; }
768
+ .make-notification.style-warning { background:#fffbeb; border-color:#fde68a; color:#b45309; }
769
+ .make-notification.style-danger { background:#fef2f2; border-color:#fecaca; color:#b91c1c; }
770
+ .make-notification.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
771
+ .make-notification.size-small { padding:10px 12px; font-size:13px; }
772
+ .make-notification.size-large { padding:20px; font-size:15px; }
773
+
774
+ /* make-modal */
775
+ .make-modal { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:200; display:none; align-items:center; justify-content:center; padding:16px; }
776
+ .make-modal:target { display:flex; }
777
+ .make-modal > .box { background:#fff; border-radius:16px; box-shadow:0 25px 50px -12px rgba(0,0,0,.25); max-width:560px; width:100%; max-height:90vh; overflow-y:auto; animation:santy-zoom-in .25s ease; }
778
+ .make-modal.size-small > .box { max-width:400px; }
779
+ .make-modal.size-large > .box { max-width:768px; }
780
+ .make-modal.size-xl > .box { max-width:1024px; }
781
+ .make-modal.size-full > .box { max-width:100%; height:100vh; border-radius:0; max-height:100vh; }
782
+ .make-modal.shape-square > .box { border-radius:0; }
783
+ .make-modal.style-dark > .box { background:#1e293b; color:#f1f5f9; }
784
+
785
+ /* make-drawer */
786
+ .make-drawer { position:fixed; inset:0; background:rgba(0,0,0,.5); z-index:200; display:none; }
787
+ .make-drawer:target { display:block; }
788
+ .make-drawer > .panel { position:fixed; top:0; bottom:0; left:0; width:300px; background:#fff; z-index:201; overflow-y:auto; box-shadow:4px 0 24px rgba(0,0,0,.12); transform:translateX(-100%); transition:transform .3s ease; }
789
+ .make-drawer:target > .panel { transform:translateX(0); }
790
+ .make-drawer.style-right > .panel { left:auto; right:0; transform:translateX(100%); box-shadow:-4px 0 24px rgba(0,0,0,.12); }
791
+ .make-drawer:target.style-right > .panel { transform:translateX(0); }
792
+ .make-drawer.style-dark > .panel { background:#1e293b; color:#f1f5f9; }
793
+ .make-drawer.size-small > .panel { width:220px; }
794
+ .make-drawer.size-large > .panel { width:420px; }
795
+
796
+ /* make-accordion */
797
+ .make-accordion { border:1px solid #e5e7eb; border-radius:10px; overflow:hidden; }
798
+ .make-accordion.style-flush { border:none; border-radius:0; }
799
+ .make-accordion.style-dark { background:#1e293b; border-color:#334155; color:#f1f5f9; }
800
+ .make-accordion.shape-square { border-radius:0; }
801
+ .make-accordion.shape-rounded { border-radius:16px; }
802
+
803
+ /* make-dropdown */
804
+ .make-dropdown { position:relative; display:inline-block; }
805
+ .make-dropdown > .menu { display:none; position:absolute; top:calc(100% + 4px); left:0; min-width:180px; background:#fff; border:1px solid #e5e7eb; border-radius:10px; box-shadow:0 8px 24px rgba(0,0,0,.1); z-index:100; overflow:hidden; padding:4px; }
806
+ .make-dropdown.open > .menu { display:block; }
807
+ .make-dropdown.style-right > .menu { left:auto; right:0; }
808
+ .make-dropdown.style-top > .menu { top:auto; bottom:calc(100% + 4px); }
809
+ .make-dropdown.style-dark > .menu { background:#1e293b; border-color:#334155; }
810
+ .make-dropdown.size-small > .menu { min-width:140px; font-size:13px; }
811
+ .make-dropdown.size-large > .menu { min-width:240px; font-size:15px; }
812
+
813
+ /* ── Dark Mode Component Variants ── */
814
+ @media (prefers-color-scheme: dark) {
815
+ .dark-auto .card { background-color: #1e293b; }
816
+ .dark-auto .card-header { border-color: #334155; }
817
+ .dark-auto .card-footer { border-color: #334155; }
818
+ .dark-auto .btn-outline { border-color: #475569; color: #e2e8f0; }
819
+ .dark-auto .input { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
820
+ .dark-auto .input::placeholder { color: #64748b; }
821
+ .dark-auto .select { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
822
+ }
823
+ /* Manual dark mode via .dark class on html/body */
824
+ .dark .card { background-color: #1e293b; color: #f1f5f9; }
825
+ .dark .card-header { border-color: #334155; }
826
+ .dark .card-footer { border-color: #334155; }
827
+ .dark .card-body { color: #cbd5e1; }
828
+ .dark .input { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
829
+ .dark .input:focus { border-color: #3b82f6; }
830
+ .dark .select { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
831
+ .dark .textarea { background-color: #1e293b; border-color: #334155; color: #f1f5f9; }
832
+ .dark .dropdown-menu { background-color: #1e293b; border-color: #334155; }
833
+ .dark .dropdown-item { color: #e2e8f0; }
834
+ .dark .dropdown-item:hover { background-color: #334155; color: #f1f5f9; }
835
+ .dark .list-group-item { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
836
+ .dark .list-group-item:hover { background-color: #334155; }
837
+ .dark .table th, .dark .table td { border-color: #334155; }
838
+ .dark .table thead tr { background-color: #0f172a; }
839
+ .dark .table thead th { color: #94a3b8; }
840
+ .dark .modal-box { background-color: #1e293b; color: #f1f5f9; }
841
+ .dark .modal-header { border-color: #334155; }
842
+ .dark .modal-footer { border-color: #334155; }
843
+ .dark .accordion { border-color: #334155; }
844
+ .dark .accordion-item { border-color: #334155; }
845
+ .dark .accordion-header { background-color: #1e293b; color: #f1f5f9; }
846
+ .dark .accordion-header:hover { background-color: #334155; }
847
+ .dark .accordion-body { background-color: #1e293b; color: #94a3b8; }
848
+ .dark .tabs { border-color: #334155; }
849
+ .dark .tabs-item { color: #94a3b8; }
850
+ .dark .tabs-item:hover { color: #e2e8f0; }
851
+ .dark .tabs-pill { background-color: #0f172a; }
852
+ .dark .tabs-pill .tabs-item.active { background-color: #1e293b; color: #f1f5f9; }
853
+ /* Dark buttons */
854
+ .dark .btn-outline { border-color: #475569; color: #e2e8f0; }
855
+ .dark .btn-outline:hover { background-color: #334155; }
856
+ .dark .btn-ghost { color: #cbd5e1; }
857
+ .dark .btn-ghost:hover { background-color: #334155; }
858
+ .dark .btn-secondary { background-color: #334155; color: #f1f5f9; border-color: #475569; }
859
+ .dark .btn-secondary:hover { background-color: #475569; }
860
+ /* Dark alerts */
861
+ .dark .alert { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
862
+ .dark .alert-info { background-color: #0c1a2e; border-color: #1e3a5f; color: #93c5fd; }
863
+ .dark .alert-success { background-color: #052e16; border-color: #166534; color: #86efac; }
864
+ .dark .alert-warning { background-color: #2d1b00; border-color: #92400e; color: #fcd34d; }
865
+ .dark .alert-danger { background-color: #2d0a0a; border-color: #991b1b; color: #fca5a5; }
866
+ /* Dark badges */
867
+ .dark .badge { background-color: #334155; color: #e2e8f0; }
868
+ /* Dark notifications */
869
+ .dark .notification { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
870
+ .dark .notification-success { background-color: #052e16; border-color: #166534; }
871
+ .dark .notification-error { background-color: #2d0a0a; border-color: #991b1b; }
872
+ .dark .notification-warning { background-color: #2d1b00; border-color: #92400e; }
873
+ /* Dark breadcrumb + pagination */
874
+ .dark .breadcrumb-item { color: #94a3b8; }
875
+ .dark .breadcrumb-item.active { color: #e2e8f0; }
876
+ .dark .page-link { background-color: #1e293b; border-color: #334155; color: #e2e8f0; }
877
+ .dark .page-item.active .page-link { background-color: #3b82f6; border-color: #3b82f6; color: #fff; }
878
+ .dark .page-item.disabled .page-link { opacity: 0.4; }
879
+ /* Dark navbar */
880
+ .dark .navbar { background-color: #0f172a; border-color: #1e293b; }
881
+ .dark .navbar-brand { color: #f1f5f9; }
882
+ .dark .navbar-item { color: #94a3b8; }
883
+ .dark .navbar-item:hover { background-color: #1e293b; color: #f1f5f9; }
884
+ /* Dark drawer */
885
+ .dark .drawer-panel { background-color: #1e293b; }
886
+ .dark .drawer-header { border-color: #334155; color: #f1f5f9; }
887
+ .dark .drawer-body { color: #cbd5e1; }
888
+ /* Dark steps */
889
+ .dark .step-dot { background-color: #334155; color: #94a3b8; }
890
+ .dark .step.active .step-dot { background-color: #3b82f6; color: #fff; }
891
+ .dark .step.done .step-dot { background-color: #22c55e; color: #fff; }
892
+ .dark .step-label { color: #94a3b8; }
893
+ .dark .step.active .step-label { color: #f1f5f9; }
894
+
895
+ /* ── Container Queries (modern CSS) ── */
896
+ @container (min-width: 400px) { .cq-sm\:make-flex { display: flex; } .cq-sm\:grid-cols-2 { grid-template-columns: repeat(2,1fr); } }
897
+ @container (min-width: 600px) { .cq-md\:grid-cols-3 { grid-template-columns: repeat(3,1fr); } .cq-md\:make-flex { display: flex; } }
898
+ @container (min-width: 800px) { .cq-lg\:grid-cols-4 { grid-template-columns: repeat(4,1fr); } }
899
+ .container-query { container-type: inline-size; }
900
+ .container-query-size { container-type: size; }