spectrum-er 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,519 @@
1
+ // Component Styles
2
+ // ================
3
+
4
+ // Buttons
5
+ .btn {
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: 0.5rem;
9
+ padding: 0.75rem 1.5rem;
10
+ font-size: 1rem;
11
+ font-weight: 500;
12
+ text-decoration: none;
13
+ border: none;
14
+ border-radius: var(--radius-md);
15
+ cursor: pointer;
16
+ transition: all var(--transition-fast);
17
+ white-space: nowrap;
18
+
19
+ &:disabled {
20
+ opacity: 0.6;
21
+ cursor: not-allowed;
22
+ }
23
+
24
+ &.btn-primary {
25
+ background-color: var(--primary-color);
26
+ color: white;
27
+
28
+ &:hover:not(:disabled) {
29
+ background-color: var(--primary-hover);
30
+ transform: translateY(-1px);
31
+ box-shadow: 0 4px 12px rgba(52, 152, 219, 0.3);
32
+ }
33
+ }
34
+
35
+ &.btn-secondary {
36
+ background-color: var(--secondary-color);
37
+ color: white;
38
+
39
+ &:hover:not(:disabled) {
40
+ background-color: var(--secondary-hover);
41
+ transform: translateY(-1px);
42
+ box-shadow: 0 4px 12px rgba(44, 62, 80, 0.3);
43
+ }
44
+ }
45
+
46
+ &.btn-outline {
47
+ background-color: transparent;
48
+ color: var(--primary-color);
49
+ border: 2px solid var(--primary-color);
50
+
51
+ &:hover:not(:disabled) {
52
+ background-color: var(--primary-color);
53
+ color: white;
54
+ }
55
+ }
56
+
57
+ &.btn-ghost {
58
+ background-color: transparent;
59
+ color: var(--text-color);
60
+
61
+ &:hover:not(:disabled) {
62
+ background-color: var(--bg-secondary);
63
+ }
64
+ }
65
+
66
+ &.btn-sm {
67
+ padding: 0.5rem 1rem;
68
+ font-size: 0.875rem;
69
+ }
70
+
71
+ &.btn-lg {
72
+ padding: 1rem 2rem;
73
+ font-size: 1.125rem;
74
+ }
75
+ }
76
+
77
+ // Base Card System
78
+ // ================
79
+ // Standardized card styling for consistent width, spacing, and responsive behavior
80
+ // All card variants should extend this base class for consistency
81
+
82
+ .card {
83
+ // Core card properties - ensures consistent behavior across all card types
84
+ background-color: var(--bg-color);
85
+ border: 1px solid var(--border-color);
86
+ border-radius: var(--radius-lg);
87
+ overflow: hidden;
88
+ transition: all var(--transition-normal);
89
+ box-sizing: border-box; // Ensures padding/border included in width calculation
90
+ width: 100%; // Full width within container
91
+
92
+ // Consistent hover effects across all card types
93
+ &:hover {
94
+ box-shadow: 0 8px 25px var(--shadow-light);
95
+ transform: translateY(-2px);
96
+ }
97
+
98
+ // Standardized internal spacing structure
99
+ .card-header {
100
+ padding: 1rem 1.5rem 0;
101
+ }
102
+
103
+ .card-body {
104
+ padding: 1rem 1.5rem;
105
+ }
106
+
107
+ .card-footer {
108
+ padding: 0 1.5rem 1.5rem;
109
+ }
110
+ }
111
+
112
+ // Card utility classes for consistent spacing and layout
113
+ .card-container {
114
+ // Container for multiple cards - ensures consistent spacing
115
+ display: flex;
116
+ flex-direction: column;
117
+ gap: 1.5rem;
118
+
119
+ @media (max-width: 767px) {
120
+ gap: 1rem;
121
+ }
122
+ }
123
+
124
+ .card-grid {
125
+ // Grid layout for cards when needed
126
+ display: grid;
127
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); // 300px → 280px로 감소
128
+ gap: 1.5rem;
129
+
130
+ @media (max-width: 767px) {
131
+ grid-template-columns: 1fr; // 모바일에서 단일 컬럼
132
+ gap: 1rem;
133
+ }
134
+
135
+ // 매우 작은 화면에서 추가 조정
136
+ @media (max-width: 480px) {
137
+ grid-template-columns: 1fr;
138
+ gap: 0.75rem;
139
+ }
140
+ }
141
+
142
+ // Tech Bite Cards - Ultra-Compact and Streamlined Design
143
+ // ======================================================
144
+ // Extends the base .card class with significantly reduced vertical bulk for maximum content density
145
+ // All tech bite cards maintain consistent width while being extremely compact vertically
146
+ // Optimized for wider layout with enhanced content density
147
+
148
+ .tech-bite-card {
149
+ // Inherit all base card styling (width, border, background, hover effects, etc.)
150
+ @extend .card;
151
+
152
+ // Compact padding for maximum content density
153
+ padding: 0.5rem 0.75rem; // Reduced vertical padding, kept horizontal padding
154
+ margin-bottom: 1.5rem; // Consistent spacing between cards
155
+ text-align: left; // Left-align content within cards
156
+
157
+ &:last-child {
158
+ margin-bottom: 0; // Remove bottom margin from last card
159
+ }
160
+
161
+ .card-title {
162
+ margin-bottom: 0.25rem; // Reduced spacing
163
+ border: none; // Ensure no borders on title
164
+
165
+ a {
166
+ color: var(--text-color);
167
+ text-decoration: none;
168
+ font-size: 1.1rem;
169
+ font-weight: 400;
170
+
171
+ &:hover {
172
+ color: var(--primary-color);
173
+ }
174
+ }
175
+ }
176
+
177
+ .card-meta {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 1rem;
181
+ margin-bottom: 0.3rem; // Reduced spacing
182
+ font-size: 0.8rem;
183
+ color: var(--text-secondary);
184
+ border: none; // Ensure no borders on meta
185
+ }
186
+
187
+ .card-excerpt {
188
+ color: var(--text-secondary);
189
+ line-height: 1.4; // Tighter line height
190
+ margin-bottom: 0.3rem; // Reduced spacing
191
+ font-size: 0.9rem;
192
+ border: none; // Ensure no borders on excerpt
193
+ }
194
+
195
+ .card-footer {
196
+ display: flex;
197
+ justify-content: space-between;
198
+ align-items: center;
199
+ margin-top: 0.3rem; // Reduced spacing
200
+ padding-top: 0.3rem; // Reduced spacing
201
+ border: none; // Ensure no borders on footer
202
+ border-top: none; // Explicitly remove any top border
203
+ border-bottom: none; // Explicitly remove any bottom border
204
+
205
+ .read-more {
206
+ color: var(--primary-color);
207
+ font-weight: 400;
208
+ text-decoration: none;
209
+ font-size: 0.9rem;
210
+
211
+ &:hover {
212
+ color: var(--primary-hover);
213
+ }
214
+ }
215
+
216
+ .reading-time {
217
+ font-size: 0.8rem;
218
+ color: var(--text-muted);
219
+ }
220
+ }
221
+ }
222
+
223
+ // Fixed Site Navigation
224
+ .site-navigation {
225
+ position: fixed;
226
+ top: 0;
227
+ left: 0;
228
+ right: 0;
229
+ z-index: 1000;
230
+ background-color: var(--bg-color);
231
+ border-bottom: 1px solid var(--border-light);
232
+ padding: 1rem 0;
233
+
234
+ .nav-container {
235
+ display: flex;
236
+ justify-content: space-between;
237
+ align-items: center;
238
+ max-width: var(--site-max-width);
239
+ margin: 0 auto;
240
+ padding: 0 1rem;
241
+ }
242
+
243
+ .nav-path {
244
+ display: flex;
245
+ align-items: center;
246
+ gap: 0.5rem;
247
+ font-size: 0.875rem;
248
+ color: var(--text-secondary);
249
+
250
+ .nav-home {
251
+ color: var(--text-secondary);
252
+ text-decoration: none;
253
+ transition: color var(--transition-fast);
254
+ font-weight: 500;
255
+
256
+ &:hover {
257
+ color: var(--primary-color);
258
+ text-decoration: underline;
259
+ }
260
+
261
+ &:focus {
262
+ outline: 2px solid var(--primary-color);
263
+ outline-offset: 2px;
264
+ border-radius: var(--radius-sm);
265
+ }
266
+ }
267
+
268
+ .nav-link {
269
+ color: var(--text-secondary);
270
+ text-decoration: none;
271
+ transition: color var(--transition-fast);
272
+ font-weight: 500;
273
+
274
+ &:hover {
275
+ color: var(--primary-color);
276
+ text-decoration: underline;
277
+ }
278
+
279
+ &:focus {
280
+ outline: 2px solid var(--primary-color);
281
+ outline-offset: 2px;
282
+ border-radius: var(--radius-sm);
283
+ }
284
+ }
285
+
286
+ .nav-separator {
287
+ color: var(--text-muted);
288
+ font-weight: 300;
289
+ user-select: none;
290
+ }
291
+
292
+ .nav-current {
293
+ color: var(--text-color);
294
+ font-weight: 500;
295
+ max-width: 300px;
296
+ overflow: hidden;
297
+ text-overflow: ellipsis;
298
+ white-space: nowrap;
299
+ }
300
+ }
301
+
302
+ .nav-social {
303
+ display: flex;
304
+ align-items: center;
305
+ gap: 1rem;
306
+
307
+ .nav-social-link {
308
+ display: inline-flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ color: var(--text-secondary);
312
+ text-decoration: none;
313
+ transition: color var(--transition-fast);
314
+
315
+ &:hover {
316
+ color: var(--primary-color);
317
+ }
318
+
319
+ &:focus {
320
+ outline: 2px solid var(--primary-color);
321
+ outline-offset: 2px;
322
+ border-radius: var(--radius-sm);
323
+ }
324
+
325
+ i {
326
+ font-size: 1.2rem;
327
+ line-height: 1;
328
+ }
329
+ }
330
+ }
331
+ }
332
+
333
+ // Site Footer
334
+ // ===========
335
+ .site-footer {
336
+ background-color: var(--bg-color);
337
+ border-top: 1px solid var(--border-light);
338
+ padding: 0.75rem 0 1rem 0;
339
+ margin-top: 1.5rem;
340
+
341
+ .footer-content {
342
+ max-width: var(--max-width);
343
+ margin: 0 auto;
344
+ padding: 0 1rem;
345
+ text-align: center;
346
+ display: flex;
347
+ flex-direction: column;
348
+ align-items: center;
349
+ gap: 0.375rem;
350
+
351
+ .footer-copyright {
352
+ p {
353
+ margin: 0;
354
+ font-size: 0.85rem;
355
+ color: var(--text-secondary);
356
+ line-height: 1.3;
357
+ }
358
+ }
359
+
360
+ .footer-theme {
361
+ p {
362
+ margin: 0;
363
+ font-size: 0.8rem;
364
+ color: var(--text-muted);
365
+ line-height: 1.3;
366
+
367
+ a {
368
+ color: var(--primary-color);
369
+ text-decoration: none;
370
+ transition: color var(--transition-fast);
371
+
372
+ &:hover {
373
+ color: var(--primary-hover);
374
+ text-decoration: underline;
375
+ }
376
+
377
+ &:focus {
378
+ outline: 2px solid var(--primary-color);
379
+ outline-offset: 2px;
380
+ border-radius: var(--radius-sm);
381
+ }
382
+ }
383
+ }
384
+ }
385
+
386
+ }
387
+ }
388
+
389
+ // Navigation - Removed for minimal design
390
+
391
+ // Mobile Navigation - Removed for minimal design
392
+
393
+
394
+
395
+
396
+ // Responsive adjustments
397
+ @media (max-width: 767px) {
398
+ .site-navigation {
399
+ padding: 0.75rem 0;
400
+
401
+ .nav-container {
402
+ padding: 0 0.75rem;
403
+ }
404
+
405
+ .nav-path {
406
+ font-size: 0.8rem;
407
+ gap: 0.375rem;
408
+
409
+ .nav-current {
410
+ max-width: 150px;
411
+ }
412
+ }
413
+
414
+ .nav-social {
415
+ gap: 0.75rem;
416
+
417
+ .nav-social-link {
418
+ i {
419
+ font-size: 1rem;
420
+ }
421
+ }
422
+ }
423
+ }
424
+
425
+ // Footer responsive adjustments for mobile
426
+ .site-footer {
427
+ padding: 0.5rem 0 0.75rem 0;
428
+ margin-top: 1rem;
429
+
430
+ .footer-content {
431
+ padding: 0 0.75rem;
432
+ gap: 0.3rem;
433
+
434
+ .footer-copyright p {
435
+ font-size: 0.8rem;
436
+ line-height: 1.2;
437
+ }
438
+
439
+ .footer-theme p {
440
+ font-size: 0.75rem;
441
+ line-height: 1.2;
442
+ }
443
+
444
+ }
445
+ }
446
+
447
+ // Standardized card responsive behavior - Mobile (≤767px)
448
+ // =======================================================
449
+ // Ensures all card types have consistent padding and spacing on mobile devices
450
+
451
+
452
+ .card {
453
+ padding: 1rem; // Reduced padding for mobile screens
454
+ margin-bottom: 1rem; // Consistent spacing between cards
455
+ }
456
+
457
+ .tech-bite-card {
458
+ padding: 0.25rem; // Ultra-compact mobile design (4px) for maximum density
459
+ margin-bottom: 1rem; // Match base card spacing for consistency
460
+ }
461
+
462
+
463
+ .slider-info .slider-title {
464
+ font-size: 1.5rem;
465
+ }
466
+
467
+ .slider-info .slider-description {
468
+ font-size: 1rem;
469
+ }
470
+ }
471
+
472
+ // Tablet responsive adjustments
473
+ @media (min-width: 768px) and (max-width: 1023px) {
474
+ .site-navigation {
475
+ .nav-path {
476
+ font-size: 0.85rem;
477
+ gap: 0.4rem;
478
+
479
+ .nav-current {
480
+ max-width: 200px;
481
+ }
482
+ }
483
+
484
+ .nav-social {
485
+ gap: 0.875rem;
486
+
487
+ .nav-social-link {
488
+ i {
489
+ font-size: 1.1rem;
490
+ }
491
+ }
492
+ }
493
+ }
494
+
495
+ // Footer responsive adjustments for tablet
496
+ .site-footer {
497
+ padding: 0.625rem 0 0.875rem 0;
498
+ margin-top: 1.25rem;
499
+
500
+ .footer-content {
501
+ gap: 0.35rem;
502
+
503
+ }
504
+ }
505
+
506
+ // Standardized card tablet behavior - Tablet (768px-1023px)
507
+ // ========================================================
508
+ // Ensures all card types have consistent padding and spacing on tablet devices
509
+
510
+ .card {
511
+ padding: 1.25rem; // Medium padding for tablet screens
512
+ margin-bottom: 1.25rem; // Consistent spacing between cards
513
+ }
514
+
515
+ .tech-bite-card {
516
+ padding: 0.3125rem; // Ultra-compact tablet design (5px) for maximum density
517
+ margin-bottom: 1.25rem; // Match base card spacing for consistency
518
+ }
519
+ }