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.
- checksums.yaml +7 -0
- data/.htaccess +34 -0
- data/LICENSE.txt +21 -0
- data/README.md +330 -0
- data/_config.yml +340 -0
- data/_data/navigation.yml +38 -0
- data/_includes/content-card.html +30 -0
- data/_includes/gallery-track.html +97 -0
- data/_includes/photo-card.html +23 -0
- data/_includes/section-header.html +12 -0
- data/_includes/site-navigation.html +33 -0
- data/_includes/structured-data.html +22 -0
- data/_includes/tech-bite-card.html +52 -0
- data/_layouts/about.html +63 -0
- data/_layouts/default.html +210 -0
- data/_layouts/films-list.html +27 -0
- data/_layouts/tech-bite-list.html +105 -0
- data/_layouts/tech-bite.html +60 -0
- data/_sass/_base.scss +298 -0
- data/_sass/_color-variables.scss +262 -0
- data/_sass/_components.scss +519 -0
- data/_sass/_layouts.scss +820 -0
- data/_sass/_sections.scss +163 -0
- data/_sass/_utilities.scss +301 -0
- data/assets/css/main.scss +21 -0
- data/assets/images/films/IMG_2112.JPG +0 -0
- data/assets/images/films/IMG_8987.jpg +0 -0
- data/assets/images/films/IMG_8998.jpg +0 -0
- data/assets/images/films/IMG_9270.jpg +0 -0
- data/assets/images/films/IMG_9504.jpg +0 -0
- data/assets/images/films/IMG_9570.jpg +0 -0
- data/assets/js/theme-manager.js +271 -0
- metadata +150 -0
@@ -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
|
+
}
|