@noxion/renderer 0.0.2 → 0.1.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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -0
  3. package/dist/components/EmptyState.d.ts +2 -1
  4. package/dist/components/EmptyState.d.ts.map +1 -1
  5. package/dist/components/EmptyState.js +2 -17
  6. package/dist/components/EmptyState.js.map +1 -1
  7. package/dist/components/Footer.d.ts +3 -1
  8. package/dist/components/Footer.d.ts.map +1 -1
  9. package/dist/components/Footer.js +2 -10
  10. package/dist/components/Footer.js.map +1 -1
  11. package/dist/components/Header.d.ts +3 -1
  12. package/dist/components/Header.d.ts.map +1 -1
  13. package/dist/components/Header.js +2 -18
  14. package/dist/components/Header.js.map +1 -1
  15. package/dist/components/NotionPage.d.ts +1 -4
  16. package/dist/components/NotionPage.d.ts.map +1 -1
  17. package/dist/components/NotionPage.js +31 -16
  18. package/dist/components/NotionPage.js.map +1 -1
  19. package/dist/components/PostCard.d.ts +3 -1
  20. package/dist/components/PostCard.d.ts.map +1 -1
  21. package/dist/components/PostCard.js +5 -41
  22. package/dist/components/PostCard.js.map +1 -1
  23. package/dist/components/PostList.d.ts +3 -1
  24. package/dist/components/PostList.d.ts.map +1 -1
  25. package/dist/components/PostList.js +3 -15
  26. package/dist/components/PostList.js.map +1 -1
  27. package/dist/components/Search.d.ts +3 -1
  28. package/dist/components/Search.d.ts.map +1 -1
  29. package/dist/components/Search.js +2 -23
  30. package/dist/components/Search.js.map +1 -1
  31. package/dist/components/TOC.d.ts +3 -1
  32. package/dist/components/TOC.d.ts.map +1 -1
  33. package/dist/components/TOC.js +2 -19
  34. package/dist/components/TOC.js.map +1 -1
  35. package/dist/components/TagFilter.d.ts +3 -1
  36. package/dist/components/TagFilter.d.ts.map +1 -1
  37. package/dist/components/TagFilter.js +6 -16
  38. package/dist/components/TagFilter.js.map +1 -1
  39. package/dist/components/ThemeToggle.d.ts +3 -1
  40. package/dist/components/ThemeToggle.d.ts.map +1 -1
  41. package/dist/components/ThemeToggle.js +2 -13
  42. package/dist/components/ThemeToggle.js.map +1 -1
  43. package/dist/index.d.ts +7 -3
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +6 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/layouts/BaseLayout.d.ts +3 -0
  48. package/dist/layouts/BaseLayout.d.ts.map +1 -0
  49. package/dist/layouts/BaseLayout.js +11 -0
  50. package/dist/layouts/BaseLayout.js.map +1 -0
  51. package/dist/layouts/BlogLayout.d.ts +3 -0
  52. package/dist/layouts/BlogLayout.d.ts.map +1 -0
  53. package/dist/layouts/BlogLayout.js +6 -0
  54. package/dist/layouts/BlogLayout.js.map +1 -0
  55. package/dist/layouts/DocsLayout.d.ts +3 -0
  56. package/dist/layouts/DocsLayout.d.ts.map +1 -0
  57. package/dist/layouts/DocsLayout.js +11 -0
  58. package/dist/layouts/DocsLayout.js.map +1 -0
  59. package/dist/layouts/MagazineLayout.d.ts +3 -0
  60. package/dist/layouts/MagazineLayout.d.ts.map +1 -0
  61. package/dist/layouts/MagazineLayout.js +11 -0
  62. package/dist/layouts/MagazineLayout.js.map +1 -0
  63. package/dist/layouts/index.d.ts +5 -0
  64. package/dist/layouts/index.d.ts.map +1 -0
  65. package/dist/layouts/index.js +5 -0
  66. package/dist/layouts/index.js.map +1 -0
  67. package/dist/templates/ArchivePage.d.ts +3 -0
  68. package/dist/templates/ArchivePage.d.ts.map +1 -0
  69. package/dist/templates/ArchivePage.js +8 -0
  70. package/dist/templates/ArchivePage.js.map +1 -0
  71. package/dist/templates/HomePage.d.ts +3 -0
  72. package/dist/templates/HomePage.d.ts.map +1 -0
  73. package/dist/templates/HomePage.js +7 -0
  74. package/dist/templates/HomePage.js.map +1 -0
  75. package/dist/templates/PostPage.d.ts +3 -0
  76. package/dist/templates/PostPage.d.ts.map +1 -0
  77. package/dist/templates/PostPage.js +11 -0
  78. package/dist/templates/PostPage.js.map +1 -0
  79. package/dist/templates/TagPage.d.ts +3 -0
  80. package/dist/templates/TagPage.d.ts.map +1 -0
  81. package/dist/templates/TagPage.js +8 -0
  82. package/dist/templates/TagPage.js.map +1 -0
  83. package/dist/templates/index.d.ts +5 -0
  84. package/dist/templates/index.d.ts.map +1 -0
  85. package/dist/templates/index.js +5 -0
  86. package/dist/templates/index.js.map +1 -0
  87. package/dist/theme/ThemeProvider.d.ts +9 -2
  88. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  89. package/dist/theme/ThemeProvider.js +46 -6
  90. package/dist/theme/ThemeProvider.js.map +1 -1
  91. package/dist/theme/css-generator.d.ts +2 -1
  92. package/dist/theme/css-generator.d.ts.map +1 -1
  93. package/dist/theme/css-generator.js +44 -0
  94. package/dist/theme/css-generator.js.map +1 -1
  95. package/dist/theme/define-theme.js +14 -14
  96. package/dist/theme/define-theme.js.map +1 -1
  97. package/dist/theme/slot-resolver.d.ts +3 -0
  98. package/dist/theme/slot-resolver.d.ts.map +1 -0
  99. package/dist/theme/slot-resolver.js +13 -0
  100. package/dist/theme/slot-resolver.js.map +1 -0
  101. package/dist/theme/template-resolver.d.ts +4 -0
  102. package/dist/theme/template-resolver.d.ts.map +1 -0
  103. package/dist/theme/template-resolver.js +4 -0
  104. package/dist/theme/template-resolver.js.map +1 -0
  105. package/dist/theme/types.d.ts +60 -0
  106. package/dist/theme/types.d.ts.map +1 -1
  107. package/package.json +9 -8
  108. package/src/styles/noxion.css +669 -0
@@ -0,0 +1,669 @@
1
+ :root {
2
+ --noxion-primary: #2563eb;
3
+ --noxion-primaryForeground: #ffffff;
4
+ --noxion-background: #ffffff;
5
+ --noxion-foreground: #171717;
6
+ --noxion-muted: #f5f5f5;
7
+ --noxion-mutedForeground: #737373;
8
+ --noxion-border: #e5e5e5;
9
+ --noxion-accent: #f5f5f5;
10
+ --noxion-accentForeground: #171717;
11
+ --noxion-card: #ffffff;
12
+ --noxion-cardForeground: #171717;
13
+
14
+ --noxion-font-sans: "Inter", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
15
+ --noxion-font-serif: Georgia, "Times New Roman", serif;
16
+ --noxion-font-mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace;
17
+
18
+ --noxion-spacing-content: 720px;
19
+ --noxion-spacing-sidebar: 260px;
20
+ --noxion-border-radius: 0.5rem;
21
+
22
+ --noxion-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04);
23
+ --noxion-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.06);
24
+ --noxion-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.08);
25
+
26
+ --noxion-transition-fast: 120ms ease;
27
+ --noxion-transition-normal: 200ms ease;
28
+ --noxion-transition-slow: 300ms ease;
29
+
30
+ --noxion-breakpoint-sm: 640px;
31
+ --noxion-breakpoint-md: 768px;
32
+ --noxion-breakpoint-lg: 1024px;
33
+ --noxion-breakpoint-xl: 1280px;
34
+ }
35
+
36
+ [data-theme="dark"] {
37
+ --noxion-primary: #3b82f6;
38
+ --noxion-primaryForeground: #ffffff;
39
+ --noxion-background: #0a0a0a;
40
+ --noxion-foreground: #ededed;
41
+ --noxion-muted: #1a1a1a;
42
+ --noxion-mutedForeground: #888888;
43
+ --noxion-border: #1f1f1f;
44
+ --noxion-accent: #1a1a1a;
45
+ --noxion-accentForeground: #ededed;
46
+ --noxion-card: #111111;
47
+ --noxion-cardForeground: #ededed;
48
+
49
+ --noxion-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
50
+ --noxion-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.3);
51
+ --noxion-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.4);
52
+ }
53
+
54
+ *,
55
+ *::before,
56
+ *::after {
57
+ box-sizing: border-box;
58
+ }
59
+
60
+ body {
61
+ margin: 0;
62
+ font-family: var(--noxion-font-sans);
63
+ color: var(--noxion-foreground);
64
+ background-color: var(--noxion-background);
65
+ line-height: 1.6;
66
+ -webkit-font-smoothing: antialiased;
67
+ -moz-osx-font-smoothing: grayscale;
68
+ text-rendering: optimizeLegibility;
69
+ }
70
+
71
+ ::selection {
72
+ background-color: var(--noxion-primary);
73
+ color: var(--noxion-primaryForeground);
74
+ }
75
+
76
+ a {
77
+ color: inherit;
78
+ text-decoration: none;
79
+ }
80
+
81
+ img {
82
+ max-width: 100%;
83
+ height: auto;
84
+ display: block;
85
+ }
86
+
87
+ /* ============================================
88
+ Header
89
+ ============================================ */
90
+
91
+ .noxion-header {
92
+ position: sticky;
93
+ top: 0;
94
+ z-index: 100;
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: space-between;
98
+ height: 64px;
99
+ padding: 0 1.5rem;
100
+ border-bottom: 1px solid var(--noxion-border);
101
+ background-color: color-mix(in srgb, var(--noxion-background) 80%, transparent);
102
+ backdrop-filter: blur(12px);
103
+ -webkit-backdrop-filter: blur(12px);
104
+ }
105
+
106
+ @media (max-width: 640px) {
107
+ .noxion-header {
108
+ height: 56px;
109
+ padding: 0 1rem;
110
+ }
111
+ }
112
+
113
+ .noxion-header__logo {
114
+ font-size: 1.125rem;
115
+ font-weight: 600;
116
+ color: var(--noxion-foreground);
117
+ text-decoration: none;
118
+ letter-spacing: -0.02em;
119
+ transition: opacity var(--noxion-transition-fast);
120
+ }
121
+
122
+ .noxion-header__logo:hover {
123
+ opacity: 0.7;
124
+ }
125
+
126
+ .noxion-header__nav {
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 2rem;
130
+ }
131
+
132
+ @media (max-width: 640px) {
133
+ .noxion-header__nav {
134
+ gap: 1.25rem;
135
+ }
136
+ }
137
+
138
+ .noxion-header__nav-link {
139
+ position: relative;
140
+ font-size: 0.875rem;
141
+ color: var(--noxion-mutedForeground);
142
+ text-decoration: none;
143
+ transition: color var(--noxion-transition-fast);
144
+ }
145
+
146
+ .noxion-header__nav-link:hover {
147
+ color: var(--noxion-foreground);
148
+ }
149
+
150
+ .noxion-header__actions {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 0.5rem;
154
+ }
155
+
156
+ /* ============================================
157
+ Footer
158
+ ============================================ */
159
+
160
+ .noxion-footer {
161
+ display: flex;
162
+ align-items: center;
163
+ justify-content: space-between;
164
+ padding: 2rem 1.5rem;
165
+ border-top: 1px solid var(--noxion-border);
166
+ font-size: 0.8125rem;
167
+ color: var(--noxion-mutedForeground);
168
+ }
169
+
170
+ @media (max-width: 640px) {
171
+ .noxion-footer {
172
+ flex-direction: column;
173
+ gap: 0.5rem;
174
+ text-align: center;
175
+ padding: 1.5rem 1rem;
176
+ }
177
+ }
178
+
179
+ .noxion-footer__copyright {
180
+ color: inherit;
181
+ }
182
+
183
+ .noxion-footer__powered-by {
184
+ color: var(--noxion-mutedForeground);
185
+ text-decoration: none;
186
+ transition: color var(--noxion-transition-fast);
187
+ }
188
+
189
+ .noxion-footer__powered-by:hover {
190
+ color: var(--noxion-foreground);
191
+ }
192
+
193
+ /* ============================================
194
+ PostCard
195
+ ============================================ */
196
+
197
+ .noxion-post-card {
198
+ display: block;
199
+ text-decoration: none;
200
+ color: inherit;
201
+ border-radius: var(--noxion-border-radius);
202
+ overflow: hidden;
203
+ background-color: var(--noxion-card);
204
+ border: 1px solid var(--noxion-border);
205
+ transition:
206
+ border-color var(--noxion-transition-normal),
207
+ box-shadow var(--noxion-transition-normal),
208
+ transform var(--noxion-transition-normal);
209
+ }
210
+
211
+ .noxion-post-card:hover {
212
+ border-color: var(--noxion-mutedForeground);
213
+ box-shadow: var(--noxion-shadow-md);
214
+ transform: translateY(-2px);
215
+ }
216
+
217
+ .noxion-post-card--text-only {
218
+ border: none;
219
+ border-bottom: 1px solid var(--noxion-border);
220
+ border-radius: 0;
221
+ background-color: transparent;
222
+ }
223
+
224
+ .noxion-post-card--text-only:hover {
225
+ border-color: var(--noxion-mutedForeground);
226
+ box-shadow: none;
227
+ transform: none;
228
+ }
229
+
230
+ .noxion-post-card__cover {
231
+ position: relative;
232
+ width: 100%;
233
+ aspect-ratio: 16 / 9;
234
+ overflow: hidden;
235
+ background-color: var(--noxion-muted);
236
+ }
237
+
238
+ .noxion-post-card__cover-image {
239
+ width: 100%;
240
+ height: 100%;
241
+ object-fit: cover;
242
+ object-position: center;
243
+ transition: transform var(--noxion-transition-slow);
244
+ }
245
+
246
+ .noxion-post-card:hover .noxion-post-card__cover-image {
247
+ transform: scale(1.03);
248
+ }
249
+
250
+ .noxion-post-card__body {
251
+ padding: 1.25rem;
252
+ }
253
+
254
+ .noxion-post-card--text-only .noxion-post-card__body {
255
+ padding: 1.25rem 0;
256
+ }
257
+
258
+ .noxion-post-card__category {
259
+ display: inline-block;
260
+ font-size: 0.75rem;
261
+ font-weight: 500;
262
+ color: var(--noxion-primary);
263
+ text-transform: uppercase;
264
+ letter-spacing: 0.05em;
265
+ margin-bottom: 0.375rem;
266
+ }
267
+
268
+ .noxion-post-card__title {
269
+ margin: 0;
270
+ font-size: 1.125rem;
271
+ font-weight: 600;
272
+ color: var(--noxion-cardForeground);
273
+ line-height: 1.4;
274
+ letter-spacing: -0.01em;
275
+ }
276
+
277
+ .noxion-post-card--text-only .noxion-post-card__title {
278
+ font-size: 1.25rem;
279
+ letter-spacing: -0.02em;
280
+ }
281
+
282
+ .noxion-post-card__description {
283
+ margin: 0.5rem 0 0;
284
+ font-size: 0.875rem;
285
+ color: var(--noxion-mutedForeground);
286
+ line-height: 1.5;
287
+ display: -webkit-box;
288
+ -webkit-line-clamp: 2;
289
+ -webkit-box-orient: vertical;
290
+ overflow: hidden;
291
+ }
292
+
293
+ .noxion-post-card__meta {
294
+ display: flex;
295
+ align-items: center;
296
+ gap: 0.75rem;
297
+ margin-top: 0.75rem;
298
+ }
299
+
300
+ .noxion-post-card__date {
301
+ font-size: 0.8125rem;
302
+ color: var(--noxion-mutedForeground);
303
+ }
304
+
305
+ .noxion-post-card__tags {
306
+ display: flex;
307
+ flex-wrap: wrap;
308
+ gap: 0.375rem;
309
+ }
310
+
311
+ .noxion-post-card__tag {
312
+ font-size: 0.6875rem;
313
+ padding: 0.125rem 0.5rem;
314
+ border-radius: 9999px;
315
+ background-color: var(--noxion-muted);
316
+ color: var(--noxion-mutedForeground);
317
+ transition: color var(--noxion-transition-fast);
318
+ }
319
+
320
+ .noxion-post-card:hover .noxion-post-card__tag {
321
+ color: var(--noxion-foreground);
322
+ }
323
+
324
+ /* ============================================
325
+ PostList
326
+ ============================================ */
327
+
328
+ .noxion-post-list {
329
+ display: grid;
330
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
331
+ gap: 1.5rem;
332
+ width: 100%;
333
+ }
334
+
335
+ @media (max-width: 640px) {
336
+ .noxion-post-list {
337
+ grid-template-columns: 1fr;
338
+ gap: 0;
339
+ }
340
+ }
341
+
342
+ .noxion-post-list--list {
343
+ grid-template-columns: 1fr;
344
+ gap: 0;
345
+ }
346
+
347
+ .noxion-post-list--list .noxion-post-card {
348
+ border: none;
349
+ border-bottom: 1px solid var(--noxion-border);
350
+ border-radius: 0;
351
+ background-color: transparent;
352
+ }
353
+
354
+ .noxion-post-list--list .noxion-post-card:hover {
355
+ box-shadow: none;
356
+ transform: none;
357
+ border-color: var(--noxion-mutedForeground);
358
+ }
359
+
360
+ .noxion-post-list--list .noxion-post-card__body {
361
+ padding: 1.25rem 0;
362
+ }
363
+
364
+ /* ============================================
365
+ Search
366
+ ============================================ */
367
+
368
+ .noxion-search {
369
+ position: relative;
370
+ width: 100%;
371
+ max-width: 320px;
372
+ }
373
+
374
+ .noxion-search__input {
375
+ width: 100%;
376
+ padding: 0.5rem 0.875rem;
377
+ padding-right: 3.5rem;
378
+ border-radius: var(--noxion-border-radius);
379
+ border: 1px solid var(--noxion-border);
380
+ background-color: var(--noxion-muted);
381
+ color: var(--noxion-foreground);
382
+ font-size: 0.875rem;
383
+ font-family: inherit;
384
+ outline: none;
385
+ transition:
386
+ border-color var(--noxion-transition-fast),
387
+ background-color var(--noxion-transition-fast),
388
+ box-shadow var(--noxion-transition-fast);
389
+ }
390
+
391
+ .noxion-search__input::placeholder {
392
+ color: var(--noxion-mutedForeground);
393
+ }
394
+
395
+ .noxion-search__input:hover {
396
+ border-color: var(--noxion-mutedForeground);
397
+ }
398
+
399
+ .noxion-search__input:focus {
400
+ border-color: var(--noxion-primary);
401
+ background-color: var(--noxion-background);
402
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--noxion-primary) 15%, transparent);
403
+ }
404
+
405
+ .noxion-search__kbd {
406
+ position: absolute;
407
+ right: 0.5rem;
408
+ top: 50%;
409
+ transform: translateY(-50%);
410
+ font-family: var(--noxion-font-sans);
411
+ font-size: 0.6875rem;
412
+ padding: 0.125rem 0.375rem;
413
+ border-radius: 0.25rem;
414
+ border: 1px solid var(--noxion-border);
415
+ background-color: var(--noxion-background);
416
+ color: var(--noxion-mutedForeground);
417
+ pointer-events: none;
418
+ line-height: 1;
419
+ }
420
+
421
+ /* ============================================
422
+ TagFilter
423
+ ============================================ */
424
+
425
+ .noxion-tag-filter {
426
+ display: flex;
427
+ flex-wrap: wrap;
428
+ gap: 0.5rem;
429
+ }
430
+
431
+ .noxion-tag-filter__tag {
432
+ padding: 0.3125rem 0.75rem;
433
+ border-radius: 9999px;
434
+ border: 1px solid var(--noxion-border);
435
+ background-color: transparent;
436
+ color: var(--noxion-mutedForeground);
437
+ font-size: 0.8125rem;
438
+ font-family: inherit;
439
+ cursor: pointer;
440
+ transition:
441
+ color var(--noxion-transition-fast),
442
+ border-color var(--noxion-transition-fast),
443
+ background-color var(--noxion-transition-fast);
444
+ outline: none;
445
+ }
446
+
447
+ .noxion-tag-filter__tag:hover {
448
+ color: var(--noxion-foreground);
449
+ border-color: var(--noxion-foreground);
450
+ }
451
+
452
+ .noxion-tag-filter__tag:focus-visible {
453
+ box-shadow: 0 0 0 2px var(--noxion-primary);
454
+ }
455
+
456
+ .noxion-tag-filter__tag--selected {
457
+ background-color: var(--noxion-foreground);
458
+ color: var(--noxion-background);
459
+ border-color: var(--noxion-foreground);
460
+ }
461
+
462
+ .noxion-tag-filter__tag--selected:hover {
463
+ opacity: 0.85;
464
+ color: var(--noxion-background);
465
+ border-color: var(--noxion-foreground);
466
+ }
467
+
468
+ /* ============================================
469
+ TOC
470
+ ============================================ */
471
+
472
+ .noxion-toc {
473
+ padding: 1rem 0;
474
+ font-size: 0.8125rem;
475
+ }
476
+
477
+ .noxion-toc__heading {
478
+ font-size: 0.6875rem;
479
+ font-weight: 600;
480
+ text-transform: uppercase;
481
+ letter-spacing: 0.08em;
482
+ color: var(--noxion-mutedForeground);
483
+ margin-bottom: 0.875rem;
484
+ }
485
+
486
+ .noxion-toc__list {
487
+ list-style: none;
488
+ padding: 0;
489
+ margin: 0;
490
+ border-left: 1px solid var(--noxion-border);
491
+ }
492
+
493
+ .noxion-toc__item {
494
+ margin-bottom: 0.125rem;
495
+ }
496
+
497
+ .noxion-toc__link {
498
+ display: block;
499
+ padding: 0.25rem 0 0.25rem 0.875rem;
500
+ margin-left: -1px;
501
+ border-left: 2px solid transparent;
502
+ color: var(--noxion-mutedForeground);
503
+ text-decoration: none;
504
+ line-height: 1.4;
505
+ transition:
506
+ color var(--noxion-transition-fast),
507
+ border-color var(--noxion-transition-fast);
508
+ }
509
+
510
+ .noxion-toc__link:hover {
511
+ color: var(--noxion-foreground);
512
+ }
513
+
514
+ .noxion-toc__item--active > .noxion-toc__link {
515
+ color: var(--noxion-foreground);
516
+ border-left-color: var(--noxion-foreground);
517
+ font-weight: 500;
518
+ }
519
+
520
+ /* ============================================
521
+ ThemeToggle
522
+ ============================================ */
523
+
524
+ .noxion-theme-toggle {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ justify-content: center;
528
+ width: 2rem;
529
+ height: 2rem;
530
+ border-radius: var(--noxion-border-radius);
531
+ border: 1px solid var(--noxion-border);
532
+ background-color: transparent;
533
+ cursor: pointer;
534
+ font-size: 0.875rem;
535
+ color: var(--noxion-mutedForeground);
536
+ transition:
537
+ color var(--noxion-transition-fast),
538
+ border-color var(--noxion-transition-fast),
539
+ background-color var(--noxion-transition-fast);
540
+ outline: none;
541
+ }
542
+
543
+ .noxion-theme-toggle:hover {
544
+ color: var(--noxion-foreground);
545
+ border-color: var(--noxion-foreground);
546
+ background-color: var(--noxion-muted);
547
+ }
548
+
549
+ .noxion-theme-toggle:focus-visible {
550
+ box-shadow: 0 0 0 2px var(--noxion-primary);
551
+ }
552
+
553
+ /* ============================================
554
+ EmptyState
555
+ ============================================ */
556
+
557
+ .noxion-empty-state {
558
+ display: flex;
559
+ flex-direction: column;
560
+ align-items: center;
561
+ justify-content: center;
562
+ padding: 5rem 1rem;
563
+ text-align: center;
564
+ }
565
+
566
+ .noxion-empty-state__title {
567
+ font-size: 1.25rem;
568
+ font-weight: 600;
569
+ color: var(--noxion-foreground);
570
+ margin: 0 0 0.375rem;
571
+ letter-spacing: -0.01em;
572
+ }
573
+
574
+ .noxion-empty-state__message {
575
+ font-size: 0.9375rem;
576
+ color: var(--noxion-mutedForeground);
577
+ margin: 0;
578
+ max-width: 360px;
579
+ }
580
+
581
+ /* ============================================
582
+ Layout
583
+ ============================================ */
584
+
585
+ .noxion-layout {
586
+ display: flex;
587
+ flex-direction: column;
588
+ min-height: 100vh;
589
+ background-color: var(--noxion-background);
590
+ }
591
+
592
+ .noxion-layout__header {
593
+ flex-shrink: 0;
594
+ }
595
+
596
+ .noxion-layout__content {
597
+ flex: 1;
598
+ width: 100%;
599
+ max-width: var(--noxion-spacing-content);
600
+ margin: 0 auto;
601
+ padding: 2.5rem 1.5rem;
602
+ }
603
+
604
+ @media (max-width: 640px) {
605
+ .noxion-layout__content {
606
+ padding: 1.5rem 1rem;
607
+ }
608
+ }
609
+
610
+ .noxion-layout__footer {
611
+ flex-shrink: 0;
612
+ margin-top: auto;
613
+ }
614
+
615
+ .noxion-layout__sidebar {
616
+ width: var(--noxion-spacing-sidebar);
617
+ flex-shrink: 0;
618
+ padding: 2.5rem 1.5rem;
619
+ border-right: 1px solid var(--noxion-border);
620
+ }
621
+
622
+ .noxion-layout__hero {
623
+ width: 100%;
624
+ }
625
+
626
+ .noxion-layout--single-column {
627
+ flex-direction: column;
628
+ }
629
+
630
+ .noxion-layout--sidebar-left > .noxion-layout__main {
631
+ display: flex;
632
+ flex: 1;
633
+ }
634
+
635
+ .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar {
636
+ order: -1;
637
+ border-right: 1px solid var(--noxion-border);
638
+ border-left: none;
639
+ }
640
+
641
+ .noxion-layout--sidebar-right > .noxion-layout__main {
642
+ display: flex;
643
+ flex: 1;
644
+ }
645
+
646
+ .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
647
+ border-left: 1px solid var(--noxion-border);
648
+ border-right: none;
649
+ }
650
+
651
+ @media (max-width: 768px) {
652
+ .noxion-layout__sidebar {
653
+ width: 100%;
654
+ border-right: none;
655
+ border-bottom: 1px solid var(--noxion-border);
656
+ padding: 1.5rem 1rem;
657
+ }
658
+
659
+ .noxion-layout--sidebar-left > .noxion-layout__main,
660
+ .noxion-layout--sidebar-right > .noxion-layout__main {
661
+ flex-direction: column;
662
+ }
663
+
664
+ .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar,
665
+ .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
666
+ border-left: none;
667
+ border-right: none;
668
+ }
669
+ }