softleader-nuxt-core 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,662 @@
1
+ /**
2
+ * Framework-Agnostic Layout System
3
+ * 框架無關的 Layout 樣式系統
4
+ */
5
+
6
+ /* ========================================
7
+ CSS Variables (設計令牌)
8
+ ======================================== */
9
+ :root {
10
+ /* Colors */
11
+ --color-primary: #1976d2;
12
+ --color-primary-dark: #1565c0;
13
+ --color-primary-light: #42a5f5;
14
+ --color-success: #4caf50;
15
+ --color-warning: #ff9800;
16
+ --color-error: #f44336;
17
+ --color-info: #2196f3;
18
+
19
+ /* Grayscale */
20
+ --color-white: #ffffff;
21
+ --color-black: #000000;
22
+ --color-gray-50: #fafafa;
23
+ --color-gray-100: #f5f5f5;
24
+ --color-gray-200: #eeeeee;
25
+ --color-gray-300: #e0e0e0;
26
+ --color-gray-400: #bdbdbd;
27
+ --color-gray-500: #9e9e9e;
28
+ --color-gray-600: #757575;
29
+ --color-gray-700: #616161;
30
+ --color-gray-800: #424242;
31
+ --color-gray-900: #212121;
32
+
33
+ /* Spacing */
34
+ --spacing-1: 0.25rem; /* 4px */
35
+ --spacing-2: 0.5rem; /* 8px */
36
+ --spacing-3: 0.75rem; /* 12px */
37
+ --spacing-4: 1rem; /* 16px */
38
+ --spacing-5: 1.25rem; /* 20px */
39
+ --spacing-6: 1.5rem; /* 24px */
40
+ --spacing-8: 2rem; /* 32px */
41
+ --spacing-10: 2.5rem; /* 40px */
42
+ --spacing-12: 3rem; /* 48px */
43
+
44
+ /* Layout Dimensions */
45
+ --header-height: 64px;
46
+ --sidebar-width: 280px;
47
+ --footer-height: 60px;
48
+ --container-max-width: 1280px;
49
+
50
+ /* Border Radius */
51
+ --radius-sm: 4px;
52
+ --radius-md: 8px;
53
+ --radius-lg: 12px;
54
+ --radius-xl: 16px;
55
+ --radius-full: 9999px;
56
+
57
+ /* Shadows */
58
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
59
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
60
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
61
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
62
+
63
+ /* Z-index */
64
+ --z-dropdown: 1000;
65
+ --z-sticky: 1020;
66
+ --z-fixed: 1030;
67
+ --z-modal-backdrop: 1040;
68
+ --z-modal: 1050;
69
+ --z-popover: 1060;
70
+ --z-tooltip: 1070;
71
+
72
+ /* Transitions */
73
+ --transition-fast: 150ms ease-in-out;
74
+ --transition-base: 250ms ease-in-out;
75
+ --transition-slow: 350ms ease-in-out;
76
+
77
+ /* Breakpoints (for reference in JS) */
78
+ --breakpoint-sm: 640px;
79
+ --breakpoint-md: 768px;
80
+ --breakpoint-lg: 1024px;
81
+ --breakpoint-xl: 1280px;
82
+
83
+ /* Compatibility Tokens (Tailwind-like) */
84
+ --color-primary-600: var(--color-primary);
85
+ --spacing-sm: var(--spacing-2);
86
+ --spacing-md: var(--spacing-4);
87
+ --spacing-lg: var(--spacing-6);
88
+ --spacing-xl: var(--spacing-8);
89
+ --spacing-2xl: var(--spacing-10);
90
+ --font-size-sm: 0.875rem;
91
+ --font-size-base: 1rem;
92
+ --font-size-lg: 1.125rem;
93
+ --font-size-xl: 1.25rem;
94
+ --font-size-2xl: 1.5rem;
95
+ --font-size-3xl: 1.875rem;
96
+ --font-size-4xl: 2.25rem;
97
+ }
98
+
99
+ /* ========================================
100
+ Reset & Base Styles
101
+ ======================================== */
102
+ * {
103
+ box-sizing: border-box;
104
+ }
105
+
106
+ body {
107
+ margin: 0;
108
+ font-family:
109
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
110
+ line-height: 1.5;
111
+ color: var(--color-gray-900);
112
+ background-color: var(--color-gray-100);
113
+ }
114
+
115
+ /* ========================================
116
+ Utility Classes
117
+ ======================================== */
118
+
119
+ /* Container */
120
+ .container {
121
+ width: 100%;
122
+ max-width: var(--container-max-width);
123
+ margin-left: auto;
124
+ margin-right: auto;
125
+ padding-left: var(--spacing-6);
126
+ padding-right: var(--spacing-6);
127
+ }
128
+
129
+ .container-fluid {
130
+ width: 100%;
131
+ padding-left: var(--spacing-6);
132
+ padding-right: var(--spacing-6);
133
+ }
134
+
135
+ /* Flexbox Utilities */
136
+ .flex {
137
+ display: flex;
138
+ }
139
+
140
+ .flex-col {
141
+ flex-direction: column;
142
+ }
143
+
144
+ .items-center {
145
+ align-items: center;
146
+ }
147
+
148
+ .justify-center {
149
+ justify-content: center;
150
+ }
151
+
152
+ .justify-between {
153
+ justify-content: space-between;
154
+ }
155
+
156
+ .flex-1 {
157
+ flex: 1;
158
+ }
159
+
160
+ .gap-2 {
161
+ gap: var(--spacing-2);
162
+ }
163
+
164
+ .gap-4 {
165
+ gap: var(--spacing-4);
166
+ }
167
+
168
+ /* Margin Utilities */
169
+ .mt-sm { margin-top: var(--spacing-sm); }
170
+ .mt-md { margin-top: var(--spacing-md); }
171
+ .mt-lg { margin-top: var(--spacing-lg); }
172
+ .mt-xl { margin-top: var(--spacing-xl); }
173
+ .mt-2xl { margin-top: var(--spacing-2xl); }
174
+
175
+ .mb-sm { margin-bottom: var(--spacing-sm); }
176
+ .mb-md { margin-bottom: var(--spacing-md); }
177
+ .mb-lg { margin-bottom: var(--spacing-lg); }
178
+ .mb-xl { margin-bottom: var(--spacing-xl); }
179
+ .mb-2xl { margin-bottom: var(--spacing-2xl); }
180
+
181
+ /* Padding Utilities */
182
+ .pt-sm { padding-top: var(--spacing-sm); }
183
+ .pt-md { padding-top: var(--spacing-md); }
184
+ .pt-lg { padding-top: var(--spacing-lg); }
185
+ .pt-xl { padding-top: var(--spacing-xl); }
186
+
187
+ .pb-sm { padding-bottom: var(--spacing-sm); }
188
+ .pb-md { padding-bottom: var(--spacing-md); }
189
+ .pb-lg { padding-bottom: var(--spacing-lg); }
190
+ .pb-xl { padding-bottom: var(--spacing-xl); }
191
+
192
+ /* Responsive Utilities */
193
+ .hidden {
194
+ display: none !important;
195
+ }
196
+
197
+ @media (max-width: 767px) {
198
+ .hidden-mobile {
199
+ display: none !important;
200
+ }
201
+ }
202
+
203
+ @media (min-width: 768px) {
204
+ .hidden-desktop {
205
+ display: none !important;
206
+ }
207
+ }
208
+
209
+ /* ========================================
210
+ Layout Components
211
+ ======================================== */
212
+
213
+ /* App Layout */
214
+ .app-layout {
215
+ min-height: 100vh;
216
+ display: flex;
217
+ flex-direction: column;
218
+ }
219
+
220
+ .app-layout.has-sidebar {
221
+ display: grid;
222
+ grid-template-areas:
223
+ 'header header'
224
+ 'sidebar main'
225
+ 'sidebar footer';
226
+ grid-template-columns: var(--sidebar-width) 1fr;
227
+ grid-template-rows: var(--header-height) 1fr auto;
228
+ }
229
+
230
+ @media (max-width: 767px) {
231
+ .app-layout.has-sidebar {
232
+ grid-template-areas:
233
+ 'header'
234
+ 'main'
235
+ 'footer';
236
+ grid-template-columns: 1fr;
237
+ }
238
+ }
239
+
240
+ /* Header */
241
+ .app-header {
242
+ grid-area: header;
243
+ height: var(--header-height);
244
+ background-color: var(--color-white);
245
+ border-bottom: 1px solid var(--color-gray-200);
246
+ display: flex;
247
+ align-items: center;
248
+ padding: 0 var(--spacing-6);
249
+ position: sticky;
250
+ top: 0;
251
+ z-index: var(--z-sticky);
252
+ box-shadow: var(--shadow-sm);
253
+ }
254
+
255
+ .header-nav-toggle {
256
+ display: none;
257
+ background: none;
258
+ border: none;
259
+ cursor: pointer;
260
+ padding: var(--spacing-2);
261
+ margin-right: var(--spacing-4);
262
+ color: var(--color-gray-700);
263
+ }
264
+
265
+ .header-nav-toggle:hover {
266
+ color: var(--color-gray-900);
267
+ }
268
+
269
+ @media (max-width: 767px) {
270
+ .header-nav-toggle {
271
+ display: block;
272
+ }
273
+ }
274
+
275
+ .header-content {
276
+ display: flex;
277
+ align-items: center;
278
+ width: 100%;
279
+ gap: var(--spacing-4);
280
+ }
281
+
282
+ .header-spacer {
283
+ flex: 1;
284
+ }
285
+
286
+ /* Sidebar */
287
+ .app-sidebar {
288
+ grid-area: sidebar;
289
+ background-color: var(--color-gray-900);
290
+ color: var(--color-white);
291
+ overflow-y: auto;
292
+ transition: transform var(--transition-base);
293
+ }
294
+
295
+ @media (max-width: 767px) {
296
+ .app-sidebar {
297
+ position: fixed;
298
+ top: var(--header-height);
299
+ left: 0;
300
+ bottom: 0;
301
+ width: var(--sidebar-width);
302
+ z-index: var(--z-fixed);
303
+ transform: translateX(-100%);
304
+ }
305
+
306
+ .app-sidebar.is-open {
307
+ transform: translateX(0);
308
+ }
309
+ }
310
+
311
+ .sidebar-brand {
312
+ padding: var(--spacing-6);
313
+ display: flex;
314
+ align-items: center;
315
+ gap: var(--spacing-3);
316
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
317
+ }
318
+
319
+ .sidebar-brand-icon {
320
+ width: 40px;
321
+ height: 40px;
322
+ background-color: var(--color-primary);
323
+ border-radius: var(--radius-lg);
324
+ display: flex;
325
+ align-items: center;
326
+ justify-content: center;
327
+ flex-shrink: 0;
328
+ }
329
+
330
+ .sidebar-brand-text {
331
+ flex: 1;
332
+ }
333
+
334
+ .sidebar-brand-title {
335
+ font-size: 1.125rem;
336
+ font-weight: 700;
337
+ line-height: 1.2;
338
+ margin: 0;
339
+ }
340
+
341
+ .sidebar-brand-subtitle {
342
+ font-size: 0.75rem;
343
+ color: var(--color-gray-400);
344
+ margin: 0;
345
+ }
346
+
347
+ .sidebar-nav {
348
+ padding: var(--spacing-3);
349
+ }
350
+
351
+ .sidebar-nav-title {
352
+ font-size: 0.75rem;
353
+ font-weight: 700;
354
+ color: var(--color-gray-500);
355
+ padding: var(--spacing-2) var(--spacing-2);
356
+ margin: var(--spacing-2) 0;
357
+ text-transform: uppercase;
358
+ letter-spacing: 0.05em;
359
+ }
360
+
361
+ .sidebar-nav-item {
362
+ display: flex;
363
+ align-items: center;
364
+ padding: var(--spacing-3) var(--spacing-4);
365
+ margin-bottom: var(--spacing-1);
366
+ border-radius: var(--radius-lg);
367
+ color: var(--color-gray-300);
368
+ text-decoration: none;
369
+ transition: all var(--transition-fast);
370
+ cursor: pointer;
371
+ }
372
+
373
+ .sidebar-nav-item:hover {
374
+ background-color: rgba(255, 255, 255, 0.05);
375
+ color: var(--color-white);
376
+ }
377
+
378
+ .sidebar-nav-item.is-active {
379
+ background-color: var(--color-primary);
380
+ color: var(--color-white);
381
+ }
382
+
383
+ .sidebar-nav-item.is-disabled {
384
+ opacity: 0.5;
385
+ cursor: not-allowed;
386
+ }
387
+
388
+ .sidebar-nav-icon {
389
+ width: 20px;
390
+ height: 20px;
391
+ margin-right: var(--spacing-3);
392
+ flex-shrink: 0;
393
+ }
394
+
395
+ /* Main Content */
396
+ .app-main {
397
+ grid-area: main;
398
+ padding: var(--spacing-6);
399
+ min-height: calc(100vh - var(--header-height) - var(--footer-height));
400
+ }
401
+
402
+ /* Footer */
403
+ .app-footer {
404
+ grid-area: footer;
405
+ background-color: var(--color-gray-100);
406
+ border-top: 1px solid var(--color-gray-200);
407
+ padding: var(--spacing-4) var(--spacing-6);
408
+ text-align: center;
409
+ color: var(--color-gray-600);
410
+ font-size: 0.875rem;
411
+ }
412
+
413
+ /* ========================================
414
+ Component Styles
415
+ ======================================== */
416
+
417
+ /* Breadcrumbs */
418
+ .breadcrumbs {
419
+ display: flex;
420
+ align-items: center;
421
+ list-style: none;
422
+ margin: 0;
423
+ padding: 0;
424
+ font-size: 0.875rem;
425
+ }
426
+
427
+ .breadcrumb-item {
428
+ display: flex;
429
+ align-items: center;
430
+ }
431
+
432
+ .breadcrumb-item a {
433
+ color: var(--color-gray-600);
434
+ text-decoration: none;
435
+ transition: color var(--transition-fast);
436
+ }
437
+
438
+ .breadcrumb-item a:hover {
439
+ color: var(--color-primary);
440
+ }
441
+
442
+ .breadcrumb-item.is-active {
443
+ color: var(--color-gray-900);
444
+ font-weight: 500;
445
+ }
446
+
447
+ .breadcrumb-divider {
448
+ margin: 0 var(--spacing-2);
449
+ color: var(--color-gray-400);
450
+ }
451
+
452
+ /* Dropdown Menu */
453
+ .dropdown {
454
+ position: relative;
455
+ display: inline-block;
456
+ }
457
+
458
+ .dropdown-toggle {
459
+ background: none;
460
+ border: none;
461
+ cursor: pointer;
462
+ padding: var(--spacing-2);
463
+ display: flex;
464
+ align-items: center;
465
+ gap: var(--spacing-2);
466
+ color: var(--color-gray-700);
467
+ transition: color var(--transition-fast);
468
+ }
469
+
470
+ .dropdown-toggle:hover {
471
+ color: var(--color-gray-900);
472
+ }
473
+
474
+ .dropdown-menu {
475
+ position: absolute;
476
+ top: 100%;
477
+ right: 0;
478
+ margin-top: var(--spacing-2);
479
+ background-color: var(--color-white);
480
+ border-radius: var(--radius-lg);
481
+ box-shadow: var(--shadow-lg);
482
+ min-width: 200px;
483
+ z-index: var(--z-dropdown);
484
+ opacity: 0;
485
+ visibility: hidden;
486
+ transform: translateY(-10px);
487
+ transition: all var(--transition-fast);
488
+ }
489
+
490
+ .dropdown.is-open .dropdown-menu {
491
+ opacity: 1;
492
+ visibility: visible;
493
+ transform: translateY(0);
494
+ }
495
+
496
+ .dropdown-menu-item {
497
+ display: flex;
498
+ align-items: center;
499
+ padding: var(--spacing-3) var(--spacing-4);
500
+ color: var(--color-gray-700);
501
+ text-decoration: none;
502
+ transition: background-color var(--transition-fast);
503
+ cursor: pointer;
504
+ }
505
+
506
+ .dropdown-menu-item:hover {
507
+ background-color: var(--color-gray-100);
508
+ }
509
+
510
+ .dropdown-menu-divider {
511
+ height: 1px;
512
+ background-color: var(--color-gray-200);
513
+ margin: var(--spacing-2) 0;
514
+ }
515
+
516
+ /* Button */
517
+ .btn {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ padding: var(--spacing-2) var(--spacing-4);
522
+ border: none;
523
+ border-radius: var(--radius-md);
524
+ font-size: 0.875rem;
525
+ font-weight: 500;
526
+ cursor: pointer;
527
+ transition: all var(--transition-fast);
528
+ text-decoration: none;
529
+ gap: var(--spacing-2);
530
+ }
531
+
532
+ .btn-icon {
533
+ padding: var(--spacing-2);
534
+ border-radius: var(--radius-full);
535
+ }
536
+
537
+ .btn-primary {
538
+ background-color: var(--color-primary);
539
+ color: var(--color-white);
540
+ }
541
+
542
+ .btn-primary:hover {
543
+ background-color: var(--color-primary-dark);
544
+ }
545
+
546
+ /* Badge */
547
+ .badge {
548
+ display: inline-flex;
549
+ align-items: center;
550
+ justify-content: center;
551
+ min-width: 20px;
552
+ height: 20px;
553
+ padding: 0 var(--spacing-2);
554
+ background-color: var(--color-error);
555
+ color: var(--color-white);
556
+ border-radius: var(--radius-full);
557
+ font-size: 0.75rem;
558
+ font-weight: 600;
559
+ }
560
+
561
+ .badge-dot {
562
+ width: 8px;
563
+ height: 8px;
564
+ min-width: 8px;
565
+ padding: 0;
566
+ border-radius: var(--radius-full);
567
+ }
568
+
569
+ /* Toast/Snackbar */
570
+ .toast-container {
571
+ position: fixed;
572
+ top: var(--spacing-6);
573
+ right: var(--spacing-6);
574
+ z-index: var(--z-tooltip);
575
+ display: flex;
576
+ flex-direction: column;
577
+ gap: var(--spacing-3);
578
+ }
579
+
580
+ .toast {
581
+ background-color: var(--color-gray-900);
582
+ color: var(--color-white);
583
+ padding: var(--spacing-4) var(--spacing-6);
584
+ border-radius: var(--radius-lg);
585
+ box-shadow: var(--shadow-xl);
586
+ display: flex;
587
+ align-items: center;
588
+ gap: var(--spacing-4);
589
+ min-width: 300px;
590
+ animation: slideInRight var(--transition-base);
591
+ }
592
+
593
+ .toast.is-success {
594
+ background-color: var(--color-success);
595
+ }
596
+
597
+ .toast.is-error {
598
+ background-color: var(--color-error);
599
+ }
600
+
601
+ .toast.is-warning {
602
+ background-color: var(--color-warning);
603
+ }
604
+
605
+ .toast.is-info {
606
+ background-color: var(--color-info);
607
+ }
608
+
609
+ .toast-message {
610
+ flex: 1;
611
+ }
612
+
613
+ .toast-close {
614
+ background: none;
615
+ border: none;
616
+ color: inherit;
617
+ cursor: pointer;
618
+ padding: var(--spacing-1);
619
+ opacity: 0.8;
620
+ transition: opacity var(--transition-fast);
621
+ }
622
+
623
+ .toast-close:hover {
624
+ opacity: 1;
625
+ }
626
+
627
+ @keyframes slideInRight {
628
+ from {
629
+ transform: translateX(100%);
630
+ opacity: 0;
631
+ }
632
+ to {
633
+ transform: translateX(0);
634
+ opacity: 1;
635
+ }
636
+ }
637
+
638
+ /* Backdrop (for mobile sidebar) */
639
+ .backdrop {
640
+ display: none;
641
+ }
642
+
643
+ @media (max-width: 767px) {
644
+ .backdrop {
645
+ display: block;
646
+ position: fixed;
647
+ top: var(--header-height);
648
+ left: 0;
649
+ right: 0;
650
+ bottom: 0;
651
+ background-color: rgba(0, 0, 0, 0.5);
652
+ z-index: calc(var(--z-fixed) - 1);
653
+ opacity: 0;
654
+ visibility: hidden;
655
+ transition: all var(--transition-base);
656
+ }
657
+
658
+ .backdrop.is-visible {
659
+ opacity: 1;
660
+ visibility: visible;
661
+ }
662
+ }
@@ -0,0 +1,78 @@
1
+ /* Framework-Agnostic Layout System */
2
+ @import './layout.css';
3
+
4
+ /* Custom Styles */
5
+ :root {
6
+ /* Corporate Trust Color Palette */
7
+ --color-primary-50: #eef2ff;
8
+ --color-primary-100: #e0e7ff;
9
+ --color-primary-200: #c7d2fe;
10
+ --color-primary-300: #a5b4fc;
11
+ --color-primary-400: #818cf8;
12
+ --color-primary-500: #6366f1;
13
+ --color-primary-600: #4f46e5;
14
+ --color-primary-700: #4338ca;
15
+ --color-primary-800: #3730a3;
16
+ --color-primary-900: #312e81;
17
+
18
+ --color-gray-50: #f8fafc;
19
+ --color-gray-100: #f1f5f9;
20
+ --color-gray-200: #e2e8f0;
21
+ --color-gray-300: #cbd5e1;
22
+ --color-gray-400: #94a3b8;
23
+ --color-gray-500: #64748b;
24
+ --color-gray-600: #475569;
25
+ --color-gray-700: #334155;
26
+ --color-gray-800: #1e293b;
27
+ --color-gray-900: #0f172a;
28
+
29
+ /* Spacing */
30
+ --spacing-1: 0.25rem;
31
+ --spacing-2: 0.5rem;
32
+ --spacing-3: 0.75rem;
33
+ --spacing-4: 1rem;
34
+ --spacing-5: 1.25rem;
35
+ --spacing-6: 1.5rem;
36
+ --spacing-8: 2rem;
37
+ --spacing-12: 3rem;
38
+
39
+ /* Typography */
40
+ --font-family-base: 'Plus Jakarta Sans', 'Inter', sans-serif;
41
+ --font-size-sm: 0.875rem;
42
+ --font-size-base: 1rem;
43
+ --font-size-lg: 1.125rem;
44
+ --font-size-xl: 1.25rem;
45
+ --font-size-2xl: 1.5rem;
46
+ --font-size-3xl: 1.875rem;
47
+ --font-size-4xl: 2.25rem;
48
+ }
49
+
50
+ body {
51
+ font-family: var(--font-family-base);
52
+ color: var(--color-gray-900);
53
+ background-color: var(--color-gray-50);
54
+ }
55
+
56
+ textarea {
57
+ width: 100%;
58
+ height: 200px;
59
+ background-color: #252526;
60
+ color: #d4d4d4;
61
+ border: none;
62
+ border-radius: 6px;
63
+ padding: 24px 4px;
64
+ font-family: monospace;
65
+ font-size: 14px;
66
+ resize: vertical;
67
+ box-sizing: border-box;
68
+ }
69
+ pre {
70
+ color: #d4d4d4;
71
+ background-color: #252526;
72
+ border-radius: 6px;
73
+ padding: 12px;
74
+ white-space: pre-wrap;
75
+ word-wrap: break-word;
76
+ margin-top: 20px;
77
+ overflow-x: auto;
78
+ }