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.
data/_sass/_base.scss ADDED
@@ -0,0 +1,298 @@
1
+ // Base Styles
2
+ // ===========
3
+
4
+ // Reset and normalize
5
+ *,
6
+ *::before,
7
+ *::after {
8
+ box-sizing: border-box;
9
+ margin: 0;
10
+ padding: 0;
11
+ }
12
+
13
+ html {
14
+ font-size: 16px;
15
+ line-height: 1.5;
16
+ -webkit-text-size-adjust: 100%;
17
+ -webkit-font-smoothing: antialiased;
18
+ -moz-osx-font-smoothing: grayscale;
19
+ }
20
+
21
+ body {
22
+ font-family: 'Lato', Verdana, Helvetica, sans-serif;
23
+ font-size: 1rem;
24
+ line-height: 1.6;
25
+ color: var(--text-color, #2c3e50);
26
+ background-color: var(--bg-color, #ffffff);
27
+ transition: color 0.3s ease, background-color 0.3s ease;
28
+ margin: 0;
29
+ padding: 0;
30
+ min-height: 100vh;
31
+ display: flex;
32
+ flex-direction: column;
33
+ }
34
+
35
+ .page-wrapper {
36
+ display: flex;
37
+ flex-direction: column;
38
+ min-height: 100vh;
39
+ max-width: var(--max-width, 1125px); /* Expanded by 25% from 900px for better screen utilization */
40
+ margin: 0 auto;
41
+ padding: var(--nav-height, 6rem) 1rem 0; /* Add top padding for fixed navigation, remove bottom padding */
42
+ }
43
+
44
+ .main-content {
45
+ flex: 1;
46
+ }
47
+
48
+ // Typography
49
+ h1, h2, h3, h4, h5, h6 {
50
+ font-weight: 400;
51
+ line-height: 1.3;
52
+ margin-bottom: 0.75rem;
53
+ margin-top: 1.5rem;
54
+ color: var(--text-color, #2c3e50);
55
+ }
56
+
57
+ h1 {
58
+ font-size: 1.8rem;
59
+ margin-top: 0;
60
+ font-weight: 300;
61
+ }
62
+ h2 { font-size: 1.4rem; }
63
+ h3 { font-size: 1.2rem; }
64
+ h4 { font-size: 1.1rem; }
65
+ h5 { font-size: 1rem; }
66
+ h6 { font-size: 0.95rem; }
67
+
68
+ p {
69
+ margin-bottom: 0.75rem;
70
+ color: var(--text-color, #2c3e50);
71
+ line-height: 1.5;
72
+ }
73
+
74
+ a {
75
+ color: var(--primary-color, #3498db);
76
+ text-decoration: none;
77
+ transition: color 0.2s ease;
78
+
79
+ &:hover {
80
+ color: var(--accent-color, #e74c3c);
81
+ }
82
+ }
83
+
84
+ // Lists
85
+ ul, ol {
86
+ margin-bottom: 1rem;
87
+ padding-left: 2rem;
88
+ }
89
+
90
+ li {
91
+ margin-bottom: 0.5rem;
92
+ }
93
+
94
+ // Code
95
+ code {
96
+ font-family: var(--font-family, 'JetBrains Mono', Monaco, 'Lucida Console', monospace);
97
+ font-size: 0.875rem;
98
+ background-color: var(--border-color, #ecf0f1);
99
+ padding: 0.125rem 0.25rem;
100
+ border-radius: 0.25rem;
101
+ color: var(--accent-color, #e74c3c);
102
+ }
103
+
104
+ pre {
105
+ background-color: var(--border-color, #ecf0f1);
106
+ padding: 1rem;
107
+ border-radius: 0.5rem;
108
+ overflow-x: auto;
109
+ margin-bottom: 1rem;
110
+
111
+ code {
112
+ background: none;
113
+ padding: 0;
114
+ color: var(--text-color, #2c3e50);
115
+ }
116
+ }
117
+
118
+ // Blockquotes
119
+ blockquote {
120
+ border-left: 4px solid var(--primary-color, #3498db);
121
+ padding-left: 1rem;
122
+ margin: 1rem 0;
123
+ font-style: italic;
124
+ color: var(--light-text-color, #7f8c8d);
125
+ }
126
+
127
+ // Tables
128
+ table {
129
+ width: 100%;
130
+ border-collapse: collapse;
131
+ margin-bottom: 1rem;
132
+ }
133
+
134
+ th, td {
135
+ padding: 0.75rem;
136
+ text-align: left;
137
+ border-bottom: 1px solid var(--border-color, #ecf0f1);
138
+ }
139
+
140
+ th {
141
+ font-weight: 600;
142
+ background-color: var(--border-color, #ecf0f1);
143
+ }
144
+
145
+ // Images
146
+ img {
147
+ max-width: 100%;
148
+ height: auto;
149
+ display: block;
150
+ }
151
+
152
+ // Form elements
153
+ input, textarea, select, button {
154
+ font-family: inherit;
155
+ font-size: inherit;
156
+ }
157
+
158
+ button {
159
+ cursor: pointer;
160
+ border: none;
161
+ background: none;
162
+ padding: 0;
163
+ }
164
+
165
+ // Utility classes
166
+ .container {
167
+ max-width: var(--max-width, 1125px); /* Expanded by 25% to match page-wrapper */
168
+ margin: 0 auto;
169
+ padding: 0 1rem;
170
+
171
+ @media (min-width: 768px) {
172
+ padding: 0 2rem;
173
+ }
174
+ }
175
+
176
+ .sr-only {
177
+ position: absolute;
178
+ width: 1px;
179
+ height: 1px;
180
+ padding: 0;
181
+ margin: -1px;
182
+ overflow: hidden;
183
+ clip: rect(0, 0, 0, 0);
184
+ white-space: nowrap;
185
+ border: 0;
186
+ }
187
+
188
+ // Dark mode styles
189
+ .dark-mode {
190
+ --bg-color: #2c3e50;
191
+ --text-color: #ecf0f1;
192
+ --light-text-color: #bdc3c7;
193
+ --border-color: #34495e;
194
+
195
+ code {
196
+ background-color: var(--border-color);
197
+ }
198
+
199
+ pre {
200
+ background-color: var(--border-color);
201
+ }
202
+
203
+ th {
204
+ background-color: var(--border-color);
205
+ }
206
+ }
207
+
208
+ // Animation utilities
209
+ @keyframes fadeIn {
210
+ from { opacity: 0; }
211
+ to { opacity: 1; }
212
+ }
213
+
214
+ @keyframes slideInUp {
215
+ from {
216
+ opacity: 0;
217
+ transform: translateY(20px);
218
+ }
219
+ to {
220
+ opacity: 1;
221
+ transform: translateY(0);
222
+ }
223
+ }
224
+
225
+ @keyframes slideInLeft {
226
+ from {
227
+ opacity: 0;
228
+ transform: translateX(-20px);
229
+ }
230
+ to {
231
+ opacity: 1;
232
+ transform: translateX(0);
233
+ }
234
+ }
235
+
236
+ .animate-fade-in {
237
+ animation: fadeIn 0.5s ease-out;
238
+ }
239
+
240
+ .animate-slide-up {
241
+ animation: slideInUp 0.5s ease-out;
242
+ }
243
+
244
+ .animate-slide-left {
245
+ animation: slideInLeft 0.5s ease-out;
246
+ }
247
+
248
+ // Responsive breakpoints
249
+ @media (max-width: 767px) {
250
+ .page-wrapper {
251
+ padding: var(--nav-height-mobile, 5.5rem) 0.5rem 0; // 0.75rem → 0.5rem
252
+ max-width: 100%; // 최대 너비 100% 보장
253
+ }
254
+
255
+ body {
256
+ font-size: 0.85rem;
257
+ overflow-x: hidden; // 가로 스크롤 방지
258
+ }
259
+
260
+ .container {
261
+ padding: 0 0.5rem; // 패딩 감소
262
+ max-width: 100%;
263
+ }
264
+
265
+ h1 { font-size: 1.5rem; }
266
+ h2 { font-size: 1.3rem; }
267
+ h3 { font-size: 1.1rem; }
268
+ h4 { font-size: 1rem; }
269
+ h5 { font-size: 0.95rem; }
270
+ h6 { font-size: 0.9rem; }
271
+
272
+ p {
273
+ margin-bottom: 0.6rem;
274
+ }
275
+ }
276
+
277
+ // 매우 작은 화면 추가
278
+ @media (max-width: 480px) {
279
+ .page-wrapper {
280
+ padding: var(--nav-height-mobile, 5.5rem) 0.25rem 0;
281
+ }
282
+
283
+ .container {
284
+ padding: 0 0.25rem;
285
+ }
286
+ }
287
+
288
+ @media (min-width: 768px) and (max-width: 1023px) {
289
+ .page-wrapper {
290
+ padding: var(--nav-height-tablet, 5.75rem) 1.5rem 0; /* Add top padding for fixed navigation on tablet, remove bottom padding */
291
+ }
292
+ }
293
+
294
+ @media (min-width: 1024px) {
295
+ .page-wrapper {
296
+ padding: var(--nav-height, 6rem) 2rem 0; /* Add top padding for fixed navigation on desktop, remove bottom padding */
297
+ }
298
+ }
@@ -0,0 +1,262 @@
1
+ // Color Variables and Theme System
2
+ // =================================
3
+
4
+ // CSS Custom Properties for theming
5
+ :root {
6
+ // Primary colors
7
+ --primary-color: #3498db;
8
+ --primary-hover: #2980b9;
9
+ --primary-light: #85c1e9;
10
+ --primary-dark: #1f618d;
11
+
12
+ // Secondary colors
13
+ --secondary-color: #2c3e50;
14
+ --secondary-hover: #1a252f;
15
+ --secondary-light: #566573;
16
+ --secondary-dark: #1b2631;
17
+
18
+ // Accent colors
19
+ --accent-color: #e74c3c;
20
+ --accent-hover: #c0392b;
21
+ --accent-light: #f1948a;
22
+ --accent-dark: #a93226;
23
+
24
+ // Neutral colors
25
+ --white: #ffffff;
26
+ --black: #000000;
27
+ --gray-50: #f8f9fa;
28
+ --gray-100: #e9ecef;
29
+ --gray-200: #dee2e6;
30
+ --gray-300: #ced4da;
31
+ --gray-400: #adb5bd;
32
+ --gray-500: #6c757d;
33
+ --gray-600: #495057;
34
+ --gray-700: #343a40;
35
+ --gray-800: #212529;
36
+ --gray-900: #121416;
37
+
38
+ // Semantic colors
39
+ --success-color: #27ae60;
40
+ --warning-color: #f39c12;
41
+ --error-color: #e74c3c;
42
+ --info-color: #3498db;
43
+
44
+ // Background colors
45
+ --bg-color: #ffffff;
46
+ --bg-secondary: #f8f9fa;
47
+ --bg-tertiary: #e9ecef;
48
+
49
+ // Text colors
50
+ --text-color: #2c3e50;
51
+ --text-secondary: #6c757d;
52
+ --text-muted: #adb5bd;
53
+ --text-light: #ffffff;
54
+
55
+ // Border colors
56
+ --border-color: #dee2e6;
57
+ --border-light: #e9ecef;
58
+ --border-dark: #adb5bd;
59
+
60
+ // Shadow colors
61
+ --shadow-light: rgba(0, 0, 0, 0.1);
62
+ --shadow-medium: rgba(0, 0, 0, 0.15);
63
+ --shadow-dark: rgba(0, 0, 0, 0.25);
64
+
65
+ // Gradient colors
66
+ --gradient-primary: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
67
+ --gradient-secondary: linear-gradient(135deg, var(--secondary-color), var(--secondary-dark));
68
+ --gradient-accent: linear-gradient(135deg, var(--accent-color), var(--accent-dark));
69
+
70
+ // Animation variables
71
+ --transition-fast: 0.15s ease;
72
+ --transition-normal: 0.3s ease;
73
+ --transition-slow: 0.5s ease;
74
+
75
+ // Spacing variables (8px base scale)
76
+ --spacing-xs: 0.25rem; // 4px
77
+ --spacing-sm: 0.5rem; // 8px
78
+ --spacing-md: 1rem; // 16px
79
+ --spacing-lg: 1.5rem; // 24px
80
+ --spacing-xl: 2rem; // 32px
81
+ --spacing-2xl: 3rem; // 48px
82
+ --spacing-3xl: 4rem; // 64px
83
+ --spacing-4xl: 6rem; // 96px
84
+
85
+ // Border radius
86
+ --radius-sm: 0.25rem;
87
+ --radius-md: 0.5rem;
88
+ --radius-lg: 0.75rem;
89
+ --radius-xl: 1rem;
90
+ --radius-full: 9999px;
91
+
92
+ // Layout variables
93
+ --content-max-width: 875px;
94
+ --site-max-width: 1125px;
95
+ --max-width: 1125px;
96
+
97
+ // Navigation height variables
98
+ --nav-height: 6rem;
99
+ --nav-height-mobile: 5.5rem;
100
+ --nav-height-tablet: 5.75rem;
101
+
102
+ // Z-index scale
103
+ --z-dropdown: 1000;
104
+ --z-sticky: 1020;
105
+ --z-fixed: 1030;
106
+ --z-modal-backdrop: 1040;
107
+ --z-modal: 1050;
108
+ --z-popover: 1060;
109
+ --z-tooltip: 1070;
110
+ }
111
+
112
+ // 모바일 반응형 변수
113
+ @media (max-width: 767px) {
114
+ :root {
115
+ --content-max-width: calc(100% - 1rem);
116
+ --site-max-width: 100%;
117
+ --max-width: 100%;
118
+ }
119
+ }
120
+
121
+ @media (max-width: 480px) {
122
+ :root {
123
+ --content-max-width: calc(100% - 0.5rem);
124
+ }
125
+ }
126
+
127
+ // Dark mode color overrides
128
+ .dark-mode {
129
+ // Background colors
130
+ --bg-color: #1a1a1a;
131
+ --bg-secondary: #2d2d2d;
132
+ --bg-tertiary: #404040;
133
+
134
+ // Text colors
135
+ --text-color: #e9ecef;
136
+ --text-secondary: #adb5bd;
137
+ --text-muted: #6c757d;
138
+
139
+ // Border colors
140
+ --border-color: #404040;
141
+ --border-light: #2d2d2d;
142
+ --border-dark: #6c757d;
143
+
144
+ // Shadow colors (lighter for dark mode)
145
+ --shadow-light: rgba(255, 255, 255, 0.1);
146
+ --shadow-medium: rgba(255, 255, 255, 0.15);
147
+ --shadow-dark: rgba(255, 255, 255, 0.25);
148
+ }
149
+
150
+ // Color utility classes
151
+ .text-primary { color: var(--primary-color) !important; }
152
+ .text-secondary { color: var(--secondary-color) !important; }
153
+ .text-accent { color: var(--accent-color) !important; }
154
+ .text-success { color: var(--success-color) !important; }
155
+ .text-warning { color: var(--warning-color) !important; }
156
+ .text-error { color: var(--error-color) !important; }
157
+ .text-muted { color: var(--text-muted) !important; }
158
+
159
+ .bg-primary { background-color: var(--primary-color) !important; }
160
+ .bg-secondary { background-color: var(--secondary-color) !important; }
161
+ .bg-accent { background-color: var(--accent-color) !important; }
162
+ .bg-success { background-color: var(--success-color) !important; }
163
+ .bg-warning { background-color: var(--warning-color) !important; }
164
+ .bg-error { background-color: var(--error-color) !important; }
165
+
166
+ .border-primary { border-color: var(--primary-color) !important; }
167
+ .border-secondary { border-color: var(--secondary-color) !important; }
168
+ .border-accent { border-color: var(--accent-color) !important; }
169
+
170
+ // Gradient utility classes
171
+ .gradient-primary {
172
+ background: var(--gradient-primary);
173
+ }
174
+
175
+ .gradient-secondary {
176
+ background: var(--gradient-secondary);
177
+ }
178
+
179
+ .gradient-accent {
180
+ background: var(--gradient-accent);
181
+ }
182
+
183
+ // Hover effects
184
+ .hover-primary:hover {
185
+ color: var(--primary-color);
186
+ transition: color var(--transition-fast);
187
+ }
188
+
189
+ .hover-bg-primary:hover {
190
+ background-color: var(--primary-color);
191
+ transition: background-color var(--transition-fast);
192
+ }
193
+
194
+ .hover-scale:hover {
195
+ transform: scale(1.05);
196
+ transition: transform var(--transition-fast);
197
+ }
198
+
199
+ .hover-shadow:hover {
200
+ box-shadow: 0 4px 12px var(--shadow-medium);
201
+ transition: box-shadow var(--transition-fast);
202
+ }
203
+
204
+ // Focus styles
205
+ .focus-primary:focus {
206
+ outline: 2px solid var(--primary-color);
207
+ outline-offset: 2px;
208
+ }
209
+
210
+ .focus-ring:focus {
211
+ box-shadow: 0 0 0 3px rgba(52, 152, 219, 0.25);
212
+ }
213
+
214
+ // Animation utilities
215
+ .transition-fast {
216
+ transition: all var(--transition-fast);
217
+ }
218
+
219
+ .transition-normal {
220
+ transition: all var(--transition-normal);
221
+ }
222
+
223
+ .transition-slow {
224
+ transition: all var(--transition-slow);
225
+ }
226
+
227
+ // Spacing utilities
228
+ .p-xs { padding: var(--spacing-xs); }
229
+ .p-sm { padding: var(--spacing-sm); }
230
+ .p-md { padding: var(--spacing-md); }
231
+ .p-lg { padding: var(--spacing-lg); }
232
+ .p-xl { padding: var(--spacing-xl); }
233
+
234
+ .m-xs { margin: var(--spacing-xs); }
235
+ .m-sm { margin: var(--spacing-sm); }
236
+ .m-md { margin: var(--spacing-md); }
237
+ .m-lg { margin: var(--spacing-lg); }
238
+ .m-xl { margin: var(--spacing-xl); }
239
+
240
+ // Border radius utilities
241
+ .rounded-sm { border-radius: var(--radius-sm); }
242
+ .rounded-md { border-radius: var(--radius-md); }
243
+ .rounded-lg { border-radius: var(--radius-lg); }
244
+ .rounded-xl { border-radius: var(--radius-xl); }
245
+ .rounded-full { border-radius: var(--radius-full); }
246
+
247
+ // Shadow utilities
248
+ .shadow-sm {
249
+ box-shadow: 0 1px 3px var(--shadow-light);
250
+ }
251
+
252
+ .shadow-md {
253
+ box-shadow: 0 4px 6px var(--shadow-light);
254
+ }
255
+
256
+ .shadow-lg {
257
+ box-shadow: 0 10px 15px var(--shadow-medium);
258
+ }
259
+
260
+ .shadow-xl {
261
+ box-shadow: 0 20px 25px var(--shadow-dark);
262
+ }