@noxion/renderer 0.1.1 → 0.2.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 (82) hide show
  1. package/dist/components/DocsBreadcrumb.d.ts +5 -0
  2. package/dist/components/DocsBreadcrumb.d.ts.map +1 -0
  3. package/dist/components/DocsBreadcrumb.js +10 -0
  4. package/dist/components/DocsBreadcrumb.js.map +1 -0
  5. package/dist/components/DocsSidebar.d.ts +5 -0
  6. package/dist/components/DocsSidebar.d.ts.map +1 -0
  7. package/dist/components/DocsSidebar.js +15 -0
  8. package/dist/components/DocsSidebar.js.map +1 -0
  9. package/dist/components/FeaturedPostCard.d.ts +5 -0
  10. package/dist/components/FeaturedPostCard.d.ts.map +1 -0
  11. package/dist/components/FeaturedPostCard.js +19 -0
  12. package/dist/components/FeaturedPostCard.js.map +1 -0
  13. package/dist/components/Header.d.ts +1 -1
  14. package/dist/components/Header.d.ts.map +1 -1
  15. package/dist/components/Header.js +2 -2
  16. package/dist/components/Header.js.map +1 -1
  17. package/dist/components/HeroSection.d.ts +7 -0
  18. package/dist/components/HeroSection.d.ts.map +1 -0
  19. package/dist/components/HeroSection.js +16 -0
  20. package/dist/components/HeroSection.js.map +1 -0
  21. package/dist/components/NoxionLogo.d.ts +5 -0
  22. package/dist/components/NoxionLogo.d.ts.map +1 -0
  23. package/dist/components/NoxionLogo.js +7 -0
  24. package/dist/components/NoxionLogo.js.map +1 -0
  25. package/dist/components/PortfolioFilter.d.ts +5 -0
  26. package/dist/components/PortfolioFilter.d.ts.map +1 -0
  27. package/dist/components/PortfolioFilter.js +20 -0
  28. package/dist/components/PortfolioFilter.js.map +1 -0
  29. package/dist/components/PortfolioProjectCard.d.ts +5 -0
  30. package/dist/components/PortfolioProjectCard.d.ts.map +1 -0
  31. package/dist/components/PortfolioProjectCard.js +13 -0
  32. package/dist/components/PortfolioProjectCard.js.map +1 -0
  33. package/dist/components/PostCard.d.ts.map +1 -1
  34. package/dist/components/PostCard.js +12 -3
  35. package/dist/components/PostCard.js.map +1 -1
  36. package/dist/index.d.ts +14 -2
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +10 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/templates/DocsPage.d.ts +3 -0
  41. package/dist/templates/DocsPage.d.ts.map +1 -0
  42. package/dist/templates/DocsPage.js +13 -0
  43. package/dist/templates/DocsPage.js.map +1 -0
  44. package/dist/templates/HomePage.d.ts.map +1 -1
  45. package/dist/templates/HomePage.js +11 -2
  46. package/dist/templates/HomePage.js.map +1 -1
  47. package/dist/templates/PortfolioGrid.d.ts +3 -0
  48. package/dist/templates/PortfolioGrid.d.ts.map +1 -0
  49. package/dist/templates/PortfolioGrid.js +10 -0
  50. package/dist/templates/PortfolioGrid.js.map +1 -0
  51. package/dist/templates/PortfolioProject.d.ts +3 -0
  52. package/dist/templates/PortfolioProject.d.ts.map +1 -0
  53. package/dist/templates/PortfolioProject.js +12 -0
  54. package/dist/templates/PortfolioProject.js.map +1 -0
  55. package/dist/templates/PostPage.d.ts +10 -0
  56. package/dist/templates/PostPage.d.ts.map +1 -1
  57. package/dist/templates/PostPage.js +24 -2
  58. package/dist/templates/PostPage.js.map +1 -1
  59. package/dist/templates/index.d.ts +3 -0
  60. package/dist/templates/index.d.ts.map +1 -1
  61. package/dist/templates/index.js +3 -0
  62. package/dist/templates/index.js.map +1 -1
  63. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  64. package/dist/theme/ThemeProvider.js +1 -1
  65. package/dist/theme/ThemeProvider.js.map +1 -1
  66. package/dist/theme/define-theme.js +1 -1
  67. package/dist/theme/define-theme.js.map +1 -1
  68. package/dist/theme/extend-theme.d.ts +27 -0
  69. package/dist/theme/extend-theme.d.ts.map +1 -0
  70. package/dist/theme/extend-theme.js +102 -0
  71. package/dist/theme/extend-theme.js.map +1 -0
  72. package/dist/theme/template-resolver.d.ts.map +1 -1
  73. package/dist/theme/template-resolver.js +35 -1
  74. package/dist/theme/template-resolver.js.map +1 -1
  75. package/dist/theme/types.d.ts +55 -0
  76. package/dist/theme/types.d.ts.map +1 -1
  77. package/dist/theme/validate-theme.d.ts +14 -0
  78. package/dist/theme/validate-theme.d.ts.map +1 -0
  79. package/dist/theme/validate-theme.js +235 -0
  80. package/dist/theme/validate-theme.js.map +1 -0
  81. package/package.json +1 -1
  82. package/src/styles/noxion.css +1337 -261
@@ -113,6 +113,8 @@ img {
113
113
  }
114
114
 
115
115
  .noxion-header__logo {
116
+ display: flex;
117
+ align-items: center;
116
118
  font-size: 0.9375rem;
117
119
  font-weight: 600;
118
120
  color: var(--noxion-foreground);
@@ -121,6 +123,11 @@ img {
121
123
  transition: opacity var(--noxion-transition-fast);
122
124
  }
123
125
 
126
+ .noxion-header__logo svg {
127
+ height: 1.125rem;
128
+ width: auto;
129
+ }
130
+
124
131
  .noxion-header__logo:hover {
125
132
  opacity: 0.6;
126
133
  }
@@ -208,7 +215,8 @@ img {
208
215
  ============================================ */
209
216
 
210
217
  .noxion-post-card {
211
- display: block;
218
+ display: flex;
219
+ flex-direction: column;
212
220
  text-decoration: none;
213
221
  color: inherit;
214
222
  border-radius: var(--noxion-border-radius);
@@ -216,25 +224,19 @@ img {
216
224
  background-color: var(--noxion-card);
217
225
  border: 1px solid var(--noxion-border);
218
226
  transition:
219
- border-color var(--noxion-transition-fast),
220
- box-shadow var(--noxion-transition-fast);
227
+ border-color var(--noxion-transition-normal),
228
+ box-shadow var(--noxion-transition-normal),
229
+ transform var(--noxion-transition-normal);
221
230
  }
222
231
 
223
232
  .noxion-post-card:hover {
224
- border-color: color-mix(in srgb, var(--noxion-foreground) 30%, transparent);
225
- box-shadow: var(--noxion-shadow-md);
226
- }
227
-
228
- .noxion-post-card--text-only {
229
- border: none;
230
- border-bottom: 1px solid var(--noxion-border);
231
- border-radius: 0;
232
- background-color: transparent;
233
+ border-color: color-mix(in srgb, var(--noxion-foreground) 20%, transparent);
234
+ box-shadow: var(--noxion-shadow-lg);
235
+ transform: translateY(-2px);
233
236
  }
234
237
 
235
- .noxion-post-card--text-only:hover {
236
- border-bottom-color: color-mix(in srgb, var(--noxion-foreground) 25%, transparent);
237
- box-shadow: none;
238
+ .noxion-post-card--no-cover .noxion-post-card__cover {
239
+ aspect-ratio: 3 / 1;
238
240
  }
239
241
 
240
242
  .noxion-post-card__cover {
@@ -250,50 +252,71 @@ img {
250
252
  height: 100%;
251
253
  object-fit: cover;
252
254
  object-position: center;
253
- transition: transform var(--noxion-transition-slow);
255
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
254
256
  }
255
257
 
256
258
  .noxion-post-card:hover .noxion-post-card__cover-image {
257
- transform: scale(1.025);
259
+ transform: scale(1.04);
260
+ }
261
+
262
+ .noxion-post-card__cover-overlay {
263
+ position: absolute;
264
+ inset: 0;
265
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.06) 0%, transparent 40%);
266
+ pointer-events: none;
258
267
  }
259
268
 
260
269
  .noxion-post-card__body {
261
- padding: 1.125rem;
270
+ display: flex;
271
+ flex-direction: column;
272
+ flex: 1;
273
+ padding: 1.25rem;
274
+ gap: 0;
262
275
  }
263
276
 
264
- .noxion-post-card--text-only .noxion-post-card__body {
265
- padding: 1.125rem 0;
277
+ .noxion-post-card--no-cover .noxion-post-card__body {
278
+ padding: 1.25rem;
279
+ }
280
+
281
+ .noxion-post-card__header {
282
+ display: flex;
283
+ align-items: center;
284
+ gap: 0.5rem;
285
+ margin-bottom: 0.5rem;
266
286
  }
267
287
 
268
288
  .noxion-post-card__category {
269
289
  display: inline-block;
270
290
  font-size: 0.6875rem;
271
- font-weight: 500;
291
+ font-weight: 600;
272
292
  color: var(--noxion-mutedForeground);
273
293
  letter-spacing: 0.04em;
274
294
  text-transform: uppercase;
275
- margin-bottom: 0.375rem;
276
295
  }
277
296
 
278
297
  .noxion-post-card__title {
279
298
  margin: 0;
280
- font-size: 1rem;
299
+ font-size: 1.0625rem;
281
300
  font-weight: 600;
282
301
  color: var(--noxion-cardForeground);
283
302
  line-height: 1.4;
284
303
  letter-spacing: -0.02em;
304
+ display: -webkit-box;
305
+ -webkit-line-clamp: 2;
306
+ -webkit-box-orient: vertical;
307
+ overflow: hidden;
285
308
  }
286
309
 
287
- .noxion-post-card--text-only .noxion-post-card__title {
288
- font-size: 1.0625rem;
310
+ .noxion-post-card--no-cover .noxion-post-card__title {
311
+ font-size: 1.125rem;
289
312
  letter-spacing: -0.025em;
290
313
  }
291
314
 
292
315
  .noxion-post-card__description {
293
- margin: 0.375rem 0 0;
316
+ margin: 0.5rem 0 0;
294
317
  font-size: 0.8125rem;
295
318
  color: var(--noxion-mutedForeground);
296
- line-height: 1.55;
319
+ line-height: 1.6;
297
320
  display: -webkit-box;
298
321
  -webkit-line-clamp: 2;
299
322
  -webkit-box-orient: vertical;
@@ -303,8 +326,9 @@ img {
303
326
  .noxion-post-card__meta {
304
327
  display: flex;
305
328
  align-items: center;
306
- gap: 0.625rem;
307
- margin-top: 0.875rem;
329
+ gap: 0.5rem;
330
+ margin-top: auto;
331
+ padding-top: 0.875rem;
308
332
  }
309
333
 
310
334
  .noxion-post-card__author {
@@ -315,9 +339,9 @@ img {
315
339
  }
316
340
 
317
341
  .noxion-post-card__author + .noxion-post-card__date::before {
318
- content: "·";
319
- margin-right: 0.5rem;
320
- opacity: 0.4;
342
+ content: "\00b7";
343
+ margin-right: 0.375rem;
344
+ color: var(--noxion-border);
321
345
  }
322
346
 
323
347
  .noxion-post-card__date {
@@ -330,7 +354,8 @@ img {
330
354
  .noxion-post-card__tags {
331
355
  display: flex;
332
356
  flex-wrap: wrap;
333
- gap: 0.3125rem;
357
+ gap: 0.375rem;
358
+ margin-top: 0.75rem;
334
359
  }
335
360
 
336
361
  .noxion-post-card__tag {
@@ -341,11 +366,14 @@ img {
341
366
  background-color: var(--noxion-muted);
342
367
  color: var(--noxion-mutedForeground);
343
368
  letter-spacing: 0;
344
- transition: color var(--noxion-transition-fast);
369
+ transition:
370
+ color var(--noxion-transition-fast),
371
+ background-color var(--noxion-transition-fast);
345
372
  }
346
373
 
347
374
  .noxion-post-card:hover .noxion-post-card__tag {
348
375
  color: var(--noxion-foreground);
376
+ background-color: color-mix(in srgb, var(--noxion-muted) 80%, var(--noxion-foreground) 20%);
349
377
  }
350
378
 
351
379
  /* ============================================
@@ -387,353 +415,1401 @@ img {
387
415
  padding: 1.125rem 0;
388
416
  }
389
417
 
390
- /* ============================================
391
- Search
392
- ============================================ */
418
+ /* ── POST PAGE (article detail) ── */
393
419
 
394
- .noxion-search {
395
- position: relative;
396
- width: 100%;
397
- max-width: 280px;
420
+ .noxion-template-post {
398
421
  display: flex;
422
+ flex-direction: column;
399
423
  align-items: center;
424
+ width: 100%;
400
425
  }
401
426
 
402
- .noxion-search__icon {
403
- position: absolute;
404
- left: 0.625rem;
405
- top: 50%;
406
- transform: translateY(-50%);
407
- color: var(--noxion-mutedForeground);
408
- pointer-events: none;
427
+ .noxion-template-post__cover {
428
+ width: 100%;
429
+ max-height: 480px;
430
+ overflow: hidden;
431
+ background-color: var(--noxion-muted);
432
+ }
433
+
434
+ .noxion-template-post__cover-image {
435
+ display: block;
436
+ width: 100%;
437
+ height: 100%;
438
+ max-height: 480px;
439
+ object-fit: cover;
440
+ object-position: center;
441
+ }
442
+
443
+ .noxion-template-post__header {
409
444
  display: flex;
445
+ flex-direction: column;
446
+ width: 100%;
447
+ max-width: var(--noxion-spacing-content, 720px);
448
+ margin: 0 auto;
449
+ padding: 2.5rem 1.25rem 0;
450
+ }
451
+
452
+ .noxion-template-post__topics {
453
+ display: flex;
454
+ flex-wrap: wrap;
410
455
  align-items: center;
411
- transition: color var(--noxion-transition-fast);
456
+ gap: 0.5rem;
457
+ margin-bottom: 1rem;
412
458
  }
413
459
 
414
- .noxion-search:focus-within .noxion-search__icon {
415
- color: var(--noxion-foreground);
460
+ .noxion-template-post__category {
461
+ display: inline-block;
462
+ font-size: 0.75rem;
463
+ font-weight: 700;
464
+ letter-spacing: 0.06em;
465
+ text-transform: uppercase;
466
+ color: var(--noxion-primary);
416
467
  }
417
468
 
418
- .noxion-search__input {
419
- width: 100%;
420
- padding: 0.4375rem 3rem 0.4375rem 2.125rem;
421
- border-radius: 0.375rem;
422
- border: 1px solid var(--noxion-border);
423
- background-color: var(--noxion-accent);
424
- color: var(--noxion-foreground);
425
- font-size: 0.8125rem;
426
- font-family: inherit;
427
- outline: none;
469
+ .noxion-template-post__tag {
470
+ display: inline-block;
471
+ font-size: 0.6875rem;
472
+ font-weight: 500;
473
+ padding: 0.1875rem 0.625rem;
474
+ border-radius: 9999px;
475
+ background-color: var(--noxion-muted);
476
+ color: var(--noxion-mutedForeground);
477
+ text-decoration: none;
428
478
  transition:
429
- border-color var(--noxion-transition-fast),
430
- background-color var(--noxion-transition-fast),
431
- box-shadow var(--noxion-transition-fast);
479
+ color var(--noxion-transition-fast, 100ms ease),
480
+ background-color var(--noxion-transition-fast, 100ms ease);
432
481
  }
433
482
 
434
- .noxion-search__input::placeholder {
435
- color: var(--noxion-mutedForeground);
483
+ .noxion-template-post__tag:hover {
484
+ color: var(--noxion-foreground);
485
+ background-color: color-mix(in srgb, var(--noxion-muted) 70%, var(--noxion-foreground) 30%);
436
486
  }
437
487
 
438
- .noxion-search__input:hover {
439
- border-color: color-mix(in srgb, var(--noxion-foreground) 30%, transparent);
488
+ .noxion-template-post__title {
489
+ margin: 0;
490
+ font-size: 2.5rem;
491
+ font-weight: 700;
492
+ line-height: 1.15;
493
+ letter-spacing: -0.03em;
494
+ color: var(--noxion-foreground);
495
+ word-break: keep-all;
496
+ overflow-wrap: break-word;
440
497
  }
441
498
 
442
- .noxion-search__input:focus {
443
- border-color: var(--noxion-primary);
444
- background-color: var(--noxion-background);
445
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--noxion-primary) 10%, transparent);
499
+ .noxion-template-post__description {
500
+ margin: 1rem 0 0;
501
+ font-size: 1.1875rem;
502
+ font-weight: 400;
503
+ line-height: 1.55;
504
+ color: var(--noxion-mutedForeground);
505
+ letter-spacing: -0.01em;
446
506
  }
447
507
 
448
- .noxion-search__kbd {
449
- position: absolute;
450
- right: 0.5rem;
451
- top: 50%;
452
- transform: translateY(-50%);
453
- font-family: var(--noxion-font-sans);
454
- font-size: 0.625rem;
455
- font-weight: 500;
456
- padding: 0.125rem 0.3125rem;
457
- border-radius: 0.25rem;
458
- border: 1px solid var(--noxion-border);
459
- background-color: var(--noxion-background);
508
+ .noxion-template-post__meta {
509
+ display: flex;
510
+ align-items: center;
511
+ margin-top: 1.5rem;
512
+ padding-top: 1.25rem;
513
+ border-top: 1px solid var(--noxion-border);
514
+ font-size: 0.875rem;
460
515
  color: var(--noxion-mutedForeground);
461
- pointer-events: none;
462
- line-height: 1.4;
463
- letter-spacing: 0.02em;
464
516
  }
465
517
 
466
- /* ============================================
467
- TagFilter
468
- ============================================ */
518
+ .noxion-template-post__author {
519
+ font-weight: 600;
520
+ color: var(--noxion-foreground);
521
+ }
469
522
 
470
- .noxion-tag-filter {
471
- display: flex;
472
- flex-wrap: wrap;
473
- gap: 0.375rem;
523
+ .noxion-template-post__meta-dot {
524
+ display: inline-block;
525
+ width: 3px;
526
+ height: 3px;
527
+ border-radius: 50%;
528
+ background-color: var(--noxion-mutedForeground);
529
+ margin: 0 0.625rem;
530
+ flex-shrink: 0;
474
531
  }
475
532
 
476
- .noxion-tag-filter__tag {
477
- padding: 0.3125rem 0.75rem;
478
- border-radius: 9999px;
479
- border: 1px solid var(--noxion-border);
480
- background-color: transparent;
533
+ .noxion-template-post__date {
534
+ font-weight: 400;
481
535
  color: var(--noxion-mutedForeground);
482
- font-size: 0.8125rem;
483
- font-weight: 450;
484
- font-family: inherit;
485
- cursor: pointer;
486
536
  letter-spacing: -0.01em;
487
- transition:
488
- color var(--noxion-transition-fast),
489
- border-color var(--noxion-transition-fast),
490
- background-color var(--noxion-transition-fast);
491
- outline: none;
492
537
  }
493
538
 
494
- .noxion-tag-filter__tag:hover {
495
- color: var(--noxion-foreground);
496
- border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
497
- background-color: var(--noxion-accent);
539
+ .noxion-template-post__body {
540
+ width: 100%;
541
+ max-width: var(--noxion-spacing-content, 720px);
542
+ margin: 0 auto;
543
+ padding: 2rem 1.25rem calc(max(10vh, 100px));
498
544
  }
499
545
 
500
- .noxion-tag-filter__tag:focus-visible {
501
- box-shadow: 0 0 0 2px var(--noxion-primary);
546
+ .noxion-template-post__body .noxion-page--inline {
547
+ padding: 0;
502
548
  }
503
549
 
504
- .noxion-tag-filter__tag--selected {
505
- background-color: var(--noxion-foreground);
506
- color: var(--noxion-background);
507
- border-color: var(--noxion-foreground);
550
+ @media (max-width: 768px) {
551
+ .noxion-template-post__header {
552
+ padding: 2rem 1rem 0;
553
+ }
554
+
555
+ .noxion-template-post__title {
556
+ font-size: 1.875rem;
557
+ line-height: 1.2;
558
+ }
559
+
560
+ .noxion-template-post__description {
561
+ font-size: 1.0625rem;
562
+ }
563
+
564
+ .noxion-template-post__meta {
565
+ margin-top: 1.25rem;
566
+ padding-top: 1rem;
567
+ }
568
+
569
+ .noxion-template-post__body {
570
+ padding: 1.5rem 1rem calc(max(8vh, 80px));
571
+ }
572
+
573
+ .noxion-template-post__cover {
574
+ max-height: 320px;
575
+ }
576
+
577
+ .noxion-template-post__cover-image {
578
+ max-height: 320px;
579
+ }
508
580
  }
509
581
 
510
- .noxion-tag-filter__tag--selected:hover {
511
- opacity: 0.82;
512
- color: var(--noxion-background);
513
- border-color: var(--noxion-foreground);
514
- background-color: var(--noxion-foreground);
582
+ @media (max-width: 480px) {
583
+ .noxion-template-post__header {
584
+ padding: 1.5rem 1rem 0;
585
+ }
586
+
587
+ .noxion-template-post__title {
588
+ font-size: 1.625rem;
589
+ }
590
+
591
+ .noxion-template-post__description {
592
+ font-size: 1rem;
593
+ }
594
+
595
+ .noxion-template-post__meta {
596
+ flex-wrap: wrap;
597
+ gap: 0.25rem;
598
+ }
599
+
600
+ .noxion-template-post__cover {
601
+ max-height: 240px;
602
+ }
603
+
604
+ .noxion-template-post__cover-image {
605
+ max-height: 240px;
606
+ }
515
607
  }
516
608
 
517
- .noxion-tag-filter__tag--more {
518
- color: var(--noxion-mutedForeground);
519
- border-style: dashed;
520
- letter-spacing: 0;
609
+ .noxion-template-post .noxion-page__title {
610
+ font-family: var(--noxion-font-sans);
611
+ letter-spacing: -0.02em;
521
612
  }
522
613
 
523
- .noxion-tag-filter__tag--more:hover {
524
- background-color: var(--noxion-accent);
525
- border-style: dashed;
526
- border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
527
- color: var(--noxion-foreground);
614
+ .noxion-template-post .noxion-heading {
615
+ font-family: var(--noxion-font-sans);
528
616
  }
529
617
 
530
- /* ============================================
531
- TOC
532
- ============================================ */
618
+ .noxion-template-post .noxion-quote {
619
+ border-color: var(--noxion-border);
620
+ color: var(--noxion-mutedForeground);
621
+ }
533
622
 
534
- .noxion-toc {
535
- padding: 1rem 0;
536
- font-size: 0.8125rem;
623
+ .noxion-template-post .noxion-divider {
624
+ border-color: var(--noxion-border);
537
625
  }
538
626
 
539
- .noxion-toc__heading {
540
- font-size: 0.625rem;
541
- font-weight: 600;
542
- text-transform: uppercase;
543
- letter-spacing: 0.1em;
544
- color: var(--noxion-mutedForeground);
545
- margin-bottom: 0.75rem;
627
+ .noxion-template-post .noxion-callout {
628
+ border-color: var(--noxion-border);
629
+ background-color: var(--noxion-muted);
546
630
  }
547
631
 
548
- .noxion-toc__list {
549
- list-style: none;
550
- padding: 0;
551
- margin: 0;
552
- border-left: 1px solid var(--noxion-border);
632
+ .noxion-template-post .noxion-code {
633
+ border: 1px solid var(--noxion-border);
553
634
  }
554
635
 
555
- .noxion-toc__item {
556
- margin-bottom: 0;
636
+ .noxion-template-post .noxion-inline-code {
637
+ border-radius: var(--noxion-border-radius, 3px);
557
638
  }
558
639
 
559
- .noxion-toc__link {
640
+ .noxion-template-post .noxion-link {
641
+ border-color: color-mix(in srgb, var(--noxion-primary) 40%, transparent);
642
+ }
643
+
644
+ .noxion-template-post .noxion-link:hover {
645
+ border-color: var(--noxion-primary);
646
+ }
647
+
648
+ /* ============================================
649
+ FeaturedPostCard
650
+ ============================================ */
651
+
652
+ .noxion-featured-card {
560
653
  display: block;
561
- padding: 0.25rem 0 0.25rem 0.875rem;
562
- margin-left: -1px;
563
- border-left: 2px solid transparent;
654
+ position: relative;
655
+ text-decoration: none;
656
+ color: inherit;
657
+ border-radius: var(--noxion-border-radius);
658
+ overflow: hidden;
659
+ min-height: 360px;
660
+ }
661
+
662
+ .noxion-featured-card__cover {
663
+ position: absolute;
664
+ inset: 0;
665
+ overflow: hidden;
666
+ background-color: var(--noxion-foreground);
667
+ }
668
+
669
+ .noxion-featured-card__cover-image {
670
+ width: 100%;
671
+ height: 100%;
672
+ object-fit: cover;
673
+ object-position: center;
674
+ transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
675
+ }
676
+
677
+ .noxion-featured-card:hover .noxion-featured-card__cover-image {
678
+ transform: scale(1.03);
679
+ }
680
+
681
+ .noxion-featured-card__cover-overlay {
682
+ position: absolute;
683
+ inset: 0;
684
+ background: linear-gradient(
685
+ to top,
686
+ rgba(0, 0, 0, 0.7) 0%,
687
+ rgba(0, 0, 0, 0.35) 40%,
688
+ rgba(0, 0, 0, 0.1) 100%
689
+ );
690
+ pointer-events: none;
691
+ }
692
+
693
+ .noxion-featured-card--no-cover .noxion-featured-card__cover {
694
+ background-color: var(--noxion-foreground);
695
+ }
696
+
697
+ .noxion-featured-card__content {
698
+ position: relative;
699
+ z-index: 1;
700
+ display: flex;
701
+ flex-direction: column;
702
+ justify-content: flex-end;
703
+ min-height: 360px;
704
+ padding: 2rem;
705
+ gap: 0.5rem;
706
+ color: #ffffff;
707
+ }
708
+
709
+ .noxion-featured-card__category {
710
+ display: inline-block;
711
+ font-size: 0.6875rem;
712
+ font-weight: 700;
713
+ letter-spacing: 0.06em;
714
+ text-transform: uppercase;
715
+ color: rgba(255, 255, 255, 0.8);
716
+ }
717
+
718
+ .noxion-featured-card__title {
719
+ margin: 0;
720
+ font-size: 1.75rem;
721
+ font-weight: 700;
722
+ line-height: 1.2;
723
+ letter-spacing: -0.025em;
724
+ color: #ffffff;
725
+ }
726
+
727
+ @media (min-width: 769px) {
728
+ .noxion-featured-card__title {
729
+ font-size: 2.25rem;
730
+ }
731
+ }
732
+
733
+ .noxion-featured-card__description {
734
+ margin: 0;
735
+ font-size: 0.9375rem;
736
+ line-height: 1.55;
737
+ color: rgba(255, 255, 255, 0.8);
738
+ display: -webkit-box;
739
+ -webkit-line-clamp: 2;
740
+ -webkit-box-orient: vertical;
741
+ overflow: hidden;
742
+ }
743
+
744
+ .noxion-featured-card__meta {
745
+ display: flex;
746
+ align-items: center;
747
+ gap: 0.5rem;
748
+ margin-top: 0.25rem;
749
+ font-size: 0.8125rem;
750
+ color: rgba(255, 255, 255, 0.6);
751
+ }
752
+
753
+ .noxion-featured-card__author + .noxion-featured-card__date::before {
754
+ content: "\00b7";
755
+ margin-right: 0.5rem;
756
+ }
757
+
758
+ .noxion-featured-card__tags {
759
+ display: flex;
760
+ flex-wrap: wrap;
761
+ gap: 0.375rem;
762
+ margin-top: 0.25rem;
763
+ }
764
+
765
+ .noxion-featured-card__tag {
766
+ font-size: 0.6875rem;
767
+ color: rgba(255, 255, 255, 0.6);
768
+ background-color: rgba(255, 255, 255, 0.15);
769
+ padding: 0.125rem 0.5rem;
770
+ border-radius: 9999px;
771
+ letter-spacing: 0.01em;
772
+ }
773
+
774
+ @media (max-width: 768px) {
775
+ .noxion-featured-card {
776
+ min-height: 280px;
777
+ }
778
+
779
+ .noxion-featured-card__content {
780
+ min-height: 280px;
781
+ padding: 1.5rem;
782
+ }
783
+
784
+ .noxion-featured-card__title {
785
+ font-size: 1.5rem;
786
+ }
787
+
788
+ .noxion-featured-card__description {
789
+ font-size: 0.875rem;
790
+ -webkit-line-clamp: 2;
791
+ }
792
+ }
793
+
794
+ @media (max-width: 640px) {
795
+ .noxion-featured-card {
796
+ min-height: 240px;
797
+ }
798
+
799
+ .noxion-featured-card__content {
800
+ min-height: 240px;
801
+ padding: 1.25rem;
802
+ gap: 0.375rem;
803
+ }
804
+
805
+ .noxion-featured-card__title {
806
+ font-size: 1.25rem;
807
+ }
808
+
809
+ .noxion-featured-card__description {
810
+ font-size: 0.8125rem;
811
+ -webkit-line-clamp: 1;
812
+ }
813
+
814
+ .noxion-featured-card__meta {
815
+ font-size: 0.75rem;
816
+ }
817
+
818
+ .noxion-featured-card__tags {
819
+ display: none;
820
+ }
821
+ }
822
+
823
+ /* ============================================
824
+ Home Page
825
+ ============================================ */
826
+
827
+ .noxion-template-home {
828
+ display: flex;
829
+ flex-direction: column;
830
+ gap: 3rem;
831
+ }
832
+
833
+ .noxion-home-hero {
834
+ display: flex;
835
+ flex-direction: column;
836
+ gap: 1.25rem;
837
+ width: 100vw;
838
+ margin-left: calc(-50vw + 50%);
839
+ padding: 0 1.25rem;
840
+ }
841
+
842
+ @media (max-width: 768px) {
843
+ .noxion-home-hero {
844
+ gap: 1rem;
845
+ padding: 0 1rem;
846
+ }
847
+
848
+ .noxion-home-hero__secondary {
849
+ grid-template-columns: 1fr 1fr;
850
+ }
851
+ }
852
+
853
+ @media (max-width: 640px) {
854
+ .noxion-home-hero {
855
+ gap: 0.75rem;
856
+ padding: 0;
857
+ }
858
+
859
+ .noxion-featured-card {
860
+ border-radius: 0;
861
+ }
862
+
863
+ .noxion-home-hero__secondary {
864
+ grid-template-columns: 1fr;
865
+ gap: 0.75rem;
866
+ padding: 0 0.75rem;
867
+ }
868
+
869
+ .noxion-template-home {
870
+ gap: 2rem;
871
+ }
872
+ }
873
+
874
+ .noxion-home-hero__secondary {
875
+ display: grid;
876
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
877
+ gap: 1.25rem;
878
+ }
879
+
880
+ .noxion-home-feed__title {
881
+ font-size: 0.6875rem;
882
+ font-weight: 600;
883
+ text-transform: uppercase;
884
+ letter-spacing: 0.06em;
885
+ color: var(--noxion-mutedForeground);
886
+ margin: 0 0 1.25rem;
887
+ padding-bottom: 0.75rem;
888
+ border-bottom: 1px solid var(--noxion-border);
889
+ }
890
+
891
+ .noxion-home-feed__toolbar {
892
+ display: flex;
893
+ flex-direction: column;
894
+ gap: 1rem;
895
+ margin-bottom: 2rem;
896
+ }
897
+
898
+ .noxion-loading-spinner {
899
+ display: flex;
900
+ justify-content: center;
901
+ padding: 2rem 0;
902
+ }
903
+
904
+ .noxion-loading-spinner__ring {
905
+ width: 24px;
906
+ height: 24px;
907
+ border: 2px solid var(--noxion-border, #e5e5e5);
908
+ border-top-color: var(--noxion-foreground, #171717);
909
+ border-radius: 50%;
910
+ animation: noxion-spin 0.6s linear infinite;
911
+ }
912
+
913
+ @keyframes noxion-spin {
914
+ to { transform: rotate(360deg); }
915
+ }
916
+
917
+ /* ============================================
918
+ Tag Page Template
919
+ ============================================ */
920
+
921
+ .noxion-template-tag {
922
+ display: flex;
923
+ flex-direction: column;
924
+ gap: 2rem;
925
+ }
926
+
927
+ .noxion-template-tag__title {
928
+ font-size: 1.5rem;
929
+ font-weight: 600;
930
+ letter-spacing: -0.02em;
931
+ color: var(--noxion-mutedForeground);
932
+ }
933
+
934
+ /* ============================================
935
+ Archive Page Template
936
+ ============================================ */
937
+
938
+ .noxion-template-archive {
939
+ display: flex;
940
+ flex-direction: column;
941
+ gap: 2rem;
942
+ }
943
+
944
+ .noxion-template-archive__title {
945
+ font-size: 1.5rem;
946
+ font-weight: 700;
947
+ letter-spacing: -0.02em;
948
+ color: var(--noxion-foreground);
949
+ }
950
+
951
+ /* ============================================
952
+ Search
953
+ ============================================ */
954
+
955
+ .noxion-search {
956
+ position: relative;
957
+ width: 100%;
958
+ max-width: 280px;
959
+ display: flex;
960
+ align-items: center;
961
+ }
962
+
963
+ .noxion-search__icon {
964
+ position: absolute;
965
+ left: 0.625rem;
966
+ top: 50%;
967
+ transform: translateY(-50%);
968
+ color: var(--noxion-mutedForeground);
969
+ pointer-events: none;
970
+ display: flex;
971
+ align-items: center;
972
+ transition: color var(--noxion-transition-fast);
973
+ }
974
+
975
+ .noxion-search:focus-within .noxion-search__icon {
976
+ color: var(--noxion-foreground);
977
+ }
978
+
979
+ .noxion-search__input {
980
+ width: 100%;
981
+ padding: 0.4375rem 3rem 0.4375rem 2.125rem;
982
+ border-radius: 0.375rem;
983
+ border: 1px solid var(--noxion-border);
984
+ background-color: var(--noxion-accent);
985
+ color: var(--noxion-foreground);
986
+ font-size: 0.8125rem;
987
+ font-family: inherit;
988
+ outline: none;
989
+ transition:
990
+ border-color var(--noxion-transition-fast),
991
+ background-color var(--noxion-transition-fast),
992
+ box-shadow var(--noxion-transition-fast);
993
+ }
994
+
995
+ .noxion-search__input::placeholder {
996
+ color: var(--noxion-mutedForeground);
997
+ }
998
+
999
+ .noxion-search__input:hover {
1000
+ border-color: color-mix(in srgb, var(--noxion-foreground) 30%, transparent);
1001
+ }
1002
+
1003
+ .noxion-search__input:focus {
1004
+ border-color: var(--noxion-primary);
1005
+ background-color: var(--noxion-background);
1006
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--noxion-primary) 10%, transparent);
1007
+ }
1008
+
1009
+ .noxion-search__kbd {
1010
+ position: absolute;
1011
+ right: 0.5rem;
1012
+ top: 50%;
1013
+ transform: translateY(-50%);
1014
+ font-family: var(--noxion-font-sans);
1015
+ font-size: 0.625rem;
1016
+ font-weight: 500;
1017
+ padding: 0.125rem 0.3125rem;
1018
+ border-radius: 0.25rem;
1019
+ border: 1px solid var(--noxion-border);
1020
+ background-color: var(--noxion-background);
1021
+ color: var(--noxion-mutedForeground);
1022
+ pointer-events: none;
1023
+ line-height: 1.4;
1024
+ letter-spacing: 0.02em;
1025
+ }
1026
+
1027
+ /* ============================================
1028
+ TagFilter
1029
+ ============================================ */
1030
+
1031
+ .noxion-tag-filter {
1032
+ display: flex;
1033
+ flex-wrap: wrap;
1034
+ gap: 0.375rem;
1035
+ }
1036
+
1037
+ .noxion-tag-filter__tag {
1038
+ padding: 0.3125rem 0.75rem;
1039
+ border-radius: 9999px;
1040
+ border: 1px solid var(--noxion-border);
1041
+ background-color: transparent;
1042
+ color: var(--noxion-mutedForeground);
1043
+ font-size: 0.8125rem;
1044
+ font-weight: 450;
1045
+ font-family: inherit;
1046
+ cursor: pointer;
1047
+ letter-spacing: -0.01em;
1048
+ transition:
1049
+ color var(--noxion-transition-fast),
1050
+ border-color var(--noxion-transition-fast),
1051
+ background-color var(--noxion-transition-fast);
1052
+ outline: none;
1053
+ }
1054
+
1055
+ .noxion-tag-filter__tag:hover {
1056
+ color: var(--noxion-foreground);
1057
+ border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
1058
+ background-color: var(--noxion-accent);
1059
+ }
1060
+
1061
+ .noxion-tag-filter__tag:focus-visible {
1062
+ box-shadow: 0 0 0 2px var(--noxion-primary);
1063
+ }
1064
+
1065
+ .noxion-tag-filter__tag--selected {
1066
+ background-color: var(--noxion-foreground);
1067
+ color: var(--noxion-background);
1068
+ border-color: var(--noxion-foreground);
1069
+ }
1070
+
1071
+ .noxion-tag-filter__tag--selected:hover {
1072
+ opacity: 0.82;
1073
+ color: var(--noxion-background);
1074
+ border-color: var(--noxion-foreground);
1075
+ background-color: var(--noxion-foreground);
1076
+ }
1077
+
1078
+ .noxion-tag-filter__tag--more {
1079
+ color: var(--noxion-mutedForeground);
1080
+ border-style: dashed;
1081
+ letter-spacing: 0;
1082
+ }
1083
+
1084
+ .noxion-tag-filter__tag--more:hover {
1085
+ background-color: var(--noxion-accent);
1086
+ border-style: dashed;
1087
+ border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
1088
+ color: var(--noxion-foreground);
1089
+ }
1090
+
1091
+ /* ============================================
1092
+ TOC
1093
+ ============================================ */
1094
+
1095
+ .noxion-toc {
1096
+ padding: 1rem 0;
1097
+ font-size: 0.8125rem;
1098
+ }
1099
+
1100
+ .noxion-toc__heading {
1101
+ font-size: 0.625rem;
1102
+ font-weight: 600;
1103
+ text-transform: uppercase;
1104
+ letter-spacing: 0.1em;
1105
+ color: var(--noxion-mutedForeground);
1106
+ margin-bottom: 0.75rem;
1107
+ }
1108
+
1109
+ .noxion-toc__list {
1110
+ list-style: none;
1111
+ padding: 0;
1112
+ margin: 0;
1113
+ border-left: 1px solid var(--noxion-border);
1114
+ }
1115
+
1116
+ .noxion-toc__item {
1117
+ margin-bottom: 0;
1118
+ }
1119
+
1120
+ .noxion-toc__link {
1121
+ display: block;
1122
+ padding: 0.25rem 0 0.25rem 0.875rem;
1123
+ margin-left: -1px;
1124
+ border-left: 2px solid transparent;
1125
+ color: var(--noxion-mutedForeground);
1126
+ text-decoration: none;
1127
+ line-height: 1.45;
1128
+ font-size: 0.8125rem;
1129
+ letter-spacing: -0.01em;
1130
+ transition:
1131
+ color var(--noxion-transition-fast),
1132
+ border-color var(--noxion-transition-fast);
1133
+ }
1134
+
1135
+ .noxion-toc__link:hover {
1136
+ color: var(--noxion-foreground);
1137
+ }
1138
+
1139
+ .noxion-toc__item--active > .noxion-toc__link {
1140
+ color: var(--noxion-foreground);
1141
+ border-left-color: var(--noxion-foreground);
1142
+ font-weight: 500;
1143
+ }
1144
+
1145
+ /* ============================================
1146
+ ThemeToggle
1147
+ ============================================ */
1148
+
1149
+ .noxion-theme-toggle {
1150
+ display: inline-flex;
1151
+ align-items: center;
1152
+ justify-content: center;
1153
+ width: 1.875rem;
1154
+ height: 1.875rem;
1155
+ border-radius: 0.375rem;
1156
+ border: none;
1157
+ background-color: transparent;
1158
+ cursor: pointer;
1159
+ color: var(--noxion-mutedForeground);
1160
+ transition:
1161
+ color var(--noxion-transition-fast),
1162
+ background-color var(--noxion-transition-fast);
1163
+ outline: none;
1164
+ padding: 0;
1165
+ }
1166
+
1167
+ .noxion-theme-toggle:hover {
1168
+ color: var(--noxion-foreground);
1169
+ background-color: var(--noxion-muted);
1170
+ }
1171
+
1172
+ .noxion-theme-toggle:focus-visible {
1173
+ box-shadow: 0 0 0 2px var(--noxion-primary);
1174
+ }
1175
+
1176
+ /* ============================================
1177
+ EmptyState
1178
+ ============================================ */
1179
+
1180
+ .noxion-empty-state {
1181
+ display: flex;
1182
+ flex-direction: column;
1183
+ align-items: center;
1184
+ justify-content: center;
1185
+ padding: 5rem 1rem;
1186
+ text-align: center;
1187
+ gap: 0.5rem;
1188
+ }
1189
+
1190
+ .noxion-empty-state__icon {
1191
+ color: var(--noxion-mutedForeground);
1192
+ margin-bottom: 0.75rem;
1193
+ opacity: 0.5;
1194
+ }
1195
+
1196
+ .noxion-empty-state__title {
1197
+ font-size: 1.0625rem;
1198
+ font-weight: 600;
1199
+ color: var(--noxion-foreground);
1200
+ margin: 0;
1201
+ letter-spacing: -0.02em;
1202
+ }
1203
+
1204
+ .noxion-empty-state__message {
1205
+ font-size: 0.875rem;
1206
+ color: var(--noxion-mutedForeground);
1207
+ margin: 0;
1208
+ max-width: 340px;
1209
+ line-height: 1.55;
1210
+ }
1211
+
1212
+ /* ============================================
1213
+ Layout
1214
+ ============================================ */
1215
+
1216
+ .noxion-layout {
1217
+ display: flex;
1218
+ flex-direction: column;
1219
+ min-height: 100vh;
1220
+ background-color: var(--noxion-background);
1221
+ }
1222
+
1223
+ .noxion-layout__header {
1224
+ flex-shrink: 0;
1225
+ }
1226
+
1227
+ .noxion-layout__content {
1228
+ flex: 1;
1229
+ width: 100%;
1230
+ max-width: var(--noxion-spacing-content);
1231
+ margin: 0 auto;
1232
+ padding: 2.5rem 1.25rem;
1233
+ }
1234
+
1235
+ @media (max-width: 640px) {
1236
+ .noxion-layout__content {
1237
+ padding: 1.5rem 1rem;
1238
+ }
1239
+ }
1240
+
1241
+ .noxion-layout__footer {
1242
+ flex-shrink: 0;
1243
+ margin-top: auto;
1244
+ }
1245
+
1246
+ .noxion-layout__sidebar {
1247
+ width: var(--noxion-spacing-sidebar);
1248
+ flex-shrink: 0;
1249
+ padding: 2.5rem 1.5rem;
1250
+ border-right: 1px solid var(--noxion-border);
1251
+ }
1252
+
1253
+ .noxion-layout__hero {
1254
+ width: 100%;
1255
+ }
1256
+
1257
+ .noxion-layout--single-column {
1258
+ flex-direction: column;
1259
+ }
1260
+
1261
+ .noxion-layout--sidebar-left > .noxion-layout__main {
1262
+ display: flex;
1263
+ flex: 1;
1264
+ }
1265
+
1266
+ .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar {
1267
+ order: -1;
1268
+ border-right: 1px solid var(--noxion-border);
1269
+ border-left: none;
1270
+ }
1271
+
1272
+ .noxion-layout--sidebar-right > .noxion-layout__main {
1273
+ display: flex;
1274
+ flex: 1;
1275
+ }
1276
+
1277
+ .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
1278
+ border-left: 1px solid var(--noxion-border);
1279
+ border-right: none;
1280
+ }
1281
+
1282
+ @media (max-width: 768px) {
1283
+ .noxion-layout__sidebar {
1284
+ width: 100%;
1285
+ border-right: none;
1286
+ border-bottom: 1px solid var(--noxion-border);
1287
+ padding: 1.5rem 1rem;
1288
+ }
1289
+
1290
+ .noxion-layout--sidebar-left > .noxion-layout__main,
1291
+ .noxion-layout--sidebar-right > .noxion-layout__main {
1292
+ flex-direction: column;
1293
+ }
1294
+
1295
+ .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar,
1296
+ .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
1297
+ border-left: none;
1298
+ border-right: none;
1299
+ }
1300
+ }
1301
+
1302
+ /* ============================================
1303
+ PortfolioGrid
1304
+ ============================================ */
1305
+
1306
+ .noxion-template-portfolio-grid {
1307
+ width: 100%;
1308
+ }
1309
+
1310
+ .noxion-portfolio-grid {
1311
+ display: grid;
1312
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
1313
+ gap: 1.5rem;
1314
+ width: 100%;
1315
+ }
1316
+
1317
+ @media (max-width: 640px) {
1318
+ .noxion-portfolio-grid {
1319
+ grid-template-columns: 1fr;
1320
+ gap: 1rem;
1321
+ }
1322
+ }
1323
+
1324
+ /* ============================================
1325
+ PortfolioProjectCard
1326
+ ============================================ */
1327
+
1328
+ .noxion-portfolio-card {
1329
+ display: flex;
1330
+ flex-direction: column;
1331
+ border-radius: var(--noxion-border-radius);
1332
+ overflow: hidden;
1333
+ background-color: var(--noxion-card);
1334
+ border: 1px solid var(--noxion-border);
1335
+ transition:
1336
+ border-color var(--noxion-transition-normal),
1337
+ box-shadow var(--noxion-transition-normal),
1338
+ transform var(--noxion-transition-normal);
1339
+ }
1340
+
1341
+ .noxion-portfolio-card:hover {
1342
+ border-color: color-mix(in srgb, var(--noxion-foreground) 20%, transparent);
1343
+ box-shadow: var(--noxion-shadow-lg);
1344
+ transform: translateY(-2px);
1345
+ }
1346
+
1347
+ .noxion-portfolio-card--featured {
1348
+ grid-column: 1 / -1;
1349
+ }
1350
+
1351
+ .noxion-portfolio-card--no-cover .noxion-portfolio-card__cover {
1352
+ aspect-ratio: 3 / 1;
1353
+ }
1354
+
1355
+ @media (min-width: 769px) {
1356
+ .noxion-portfolio-card--featured {
1357
+ flex-direction: row;
1358
+ }
1359
+
1360
+ .noxion-portfolio-card--featured .noxion-portfolio-card__cover {
1361
+ width: 50%;
1362
+ aspect-ratio: auto;
1363
+ min-height: 260px;
1364
+ }
1365
+
1366
+ .noxion-portfolio-card--featured .noxion-portfolio-card__body {
1367
+ flex: 1;
1368
+ justify-content: center;
1369
+ }
1370
+ }
1371
+
1372
+ .noxion-portfolio-card__cover {
1373
+ position: relative;
1374
+ width: 100%;
1375
+ aspect-ratio: 16 / 10;
1376
+ overflow: hidden;
1377
+ background-color: var(--noxion-muted);
1378
+ }
1379
+
1380
+ .noxion-portfolio-card__cover-image {
1381
+ width: 100%;
1382
+ height: 100%;
1383
+ object-fit: cover;
1384
+ object-position: center;
1385
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
1386
+ }
1387
+
1388
+ .noxion-portfolio-card:hover .noxion-portfolio-card__cover-image {
1389
+ transform: scale(1.04);
1390
+ }
1391
+
1392
+ .noxion-portfolio-card__body {
1393
+ display: flex;
1394
+ flex-direction: column;
1395
+ flex: 1;
1396
+ padding: 1.25rem;
1397
+ gap: 0;
1398
+ }
1399
+
1400
+ .noxion-portfolio-card__header {
1401
+ display: flex;
1402
+ align-items: baseline;
1403
+ justify-content: space-between;
1404
+ gap: 0.75rem;
1405
+ margin-bottom: 0.375rem;
1406
+ }
1407
+
1408
+ .noxion-portfolio-card__title-link {
1409
+ text-decoration: none;
1410
+ color: inherit;
1411
+ }
1412
+
1413
+ .noxion-portfolio-card__title {
1414
+ margin: 0;
1415
+ font-size: 1.0625rem;
1416
+ font-weight: 600;
1417
+ color: var(--noxion-cardForeground);
1418
+ line-height: 1.4;
1419
+ letter-spacing: -0.02em;
1420
+ }
1421
+
1422
+ .noxion-portfolio-card__title-link:hover .noxion-portfolio-card__title {
1423
+ color: var(--noxion-primary);
1424
+ }
1425
+
1426
+ .noxion-portfolio-card__year {
1427
+ font-size: 0.75rem;
1428
+ font-weight: 500;
1429
+ color: var(--noxion-mutedForeground);
1430
+ white-space: nowrap;
1431
+ letter-spacing: -0.01em;
1432
+ }
1433
+
1434
+ .noxion-portfolio-card__description {
1435
+ margin: 0.375rem 0 0;
1436
+ font-size: 0.8125rem;
1437
+ color: var(--noxion-mutedForeground);
1438
+ line-height: 1.6;
1439
+ display: -webkit-box;
1440
+ -webkit-line-clamp: 3;
1441
+ -webkit-box-orient: vertical;
1442
+ overflow: hidden;
1443
+ }
1444
+
1445
+ .noxion-portfolio-card__tech {
1446
+ display: flex;
1447
+ flex-wrap: wrap;
1448
+ gap: 0.375rem;
1449
+ margin-top: 0.75rem;
1450
+ }
1451
+
1452
+ .noxion-portfolio-card__tech-tag {
1453
+ font-size: 0.6875rem;
1454
+ font-weight: 500;
1455
+ padding: 0.1875rem 0.5rem;
1456
+ border-radius: 9999px;
1457
+ background-color: var(--noxion-muted);
1458
+ color: var(--noxion-mutedForeground);
1459
+ letter-spacing: 0;
1460
+ transition:
1461
+ color var(--noxion-transition-fast),
1462
+ background-color var(--noxion-transition-fast);
1463
+ }
1464
+
1465
+ .noxion-portfolio-card:hover .noxion-portfolio-card__tech-tag {
1466
+ color: var(--noxion-foreground);
1467
+ background-color: color-mix(in srgb, var(--noxion-muted) 80%, var(--noxion-foreground) 20%);
1468
+ }
1469
+
1470
+ .noxion-portfolio-card__actions {
1471
+ display: flex;
1472
+ align-items: center;
1473
+ gap: 0.75rem;
1474
+ margin-top: auto;
1475
+ padding-top: 1rem;
1476
+ }
1477
+
1478
+ .noxion-portfolio-card__link {
1479
+ font-size: 0.8125rem;
1480
+ font-weight: 500;
1481
+ color: var(--noxion-foreground);
1482
+ text-decoration: none;
1483
+ padding: 0.375rem 0.875rem;
1484
+ border-radius: 0.375rem;
1485
+ border: 1px solid var(--noxion-border);
1486
+ background-color: transparent;
1487
+ transition:
1488
+ color var(--noxion-transition-fast),
1489
+ border-color var(--noxion-transition-fast),
1490
+ background-color var(--noxion-transition-fast);
1491
+ }
1492
+
1493
+ .noxion-portfolio-card__link:hover {
1494
+ background-color: var(--noxion-accent);
1495
+ border-color: color-mix(in srgb, var(--noxion-foreground) 30%, transparent);
1496
+ }
1497
+
1498
+ .noxion-portfolio-card__link--external {
1499
+ background-color: var(--noxion-foreground);
1500
+ color: var(--noxion-background);
1501
+ border-color: var(--noxion-foreground);
1502
+ }
1503
+
1504
+ .noxion-portfolio-card__link--external:hover {
1505
+ opacity: 0.82;
1506
+ background-color: var(--noxion-foreground);
1507
+ color: var(--noxion-background);
1508
+ border-color: var(--noxion-foreground);
1509
+ }
1510
+
1511
+ /* ============================================
1512
+ PortfolioFilter
1513
+ ============================================ */
1514
+
1515
+ .noxion-portfolio-filter {
1516
+ display: flex;
1517
+ flex-wrap: wrap;
1518
+ gap: 0.375rem;
1519
+ }
1520
+
1521
+ .noxion-portfolio-filter__tag {
1522
+ padding: 0.3125rem 0.75rem;
1523
+ border-radius: 9999px;
1524
+ border: 1px solid var(--noxion-border);
1525
+ background-color: transparent;
564
1526
  color: var(--noxion-mutedForeground);
565
- text-decoration: none;
566
- line-height: 1.45;
567
1527
  font-size: 0.8125rem;
1528
+ font-weight: 450;
1529
+ font-family: inherit;
1530
+ cursor: pointer;
568
1531
  letter-spacing: -0.01em;
569
1532
  transition:
570
1533
  color var(--noxion-transition-fast),
571
- border-color var(--noxion-transition-fast);
1534
+ border-color var(--noxion-transition-fast),
1535
+ background-color var(--noxion-transition-fast);
1536
+ outline: none;
572
1537
  }
573
1538
 
574
- .noxion-toc__link:hover {
1539
+ .noxion-portfolio-filter__tag:hover {
575
1540
  color: var(--noxion-foreground);
1541
+ border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
1542
+ background-color: var(--noxion-accent);
576
1543
  }
577
1544
 
578
- .noxion-toc__item--active > .noxion-toc__link {
1545
+ .noxion-portfolio-filter__tag:focus-visible {
1546
+ box-shadow: 0 0 0 2px var(--noxion-primary);
1547
+ }
1548
+
1549
+ .noxion-portfolio-filter__tag--selected {
1550
+ background-color: var(--noxion-foreground);
1551
+ color: var(--noxion-background);
1552
+ border-color: var(--noxion-foreground);
1553
+ }
1554
+
1555
+ .noxion-portfolio-filter__tag--selected:hover {
1556
+ opacity: 0.82;
1557
+ color: var(--noxion-background);
1558
+ border-color: var(--noxion-foreground);
1559
+ background-color: var(--noxion-foreground);
1560
+ }
1561
+
1562
+ .noxion-portfolio-filter__tag--more {
1563
+ color: var(--noxion-mutedForeground);
1564
+ border-style: dashed;
1565
+ letter-spacing: 0;
1566
+ }
1567
+
1568
+ .noxion-portfolio-filter__tag--more:hover {
1569
+ background-color: var(--noxion-accent);
1570
+ border-style: dashed;
1571
+ border-color: color-mix(in srgb, var(--noxion-foreground) 35%, transparent);
579
1572
  color: var(--noxion-foreground);
580
- border-left-color: var(--noxion-foreground);
581
- font-weight: 500;
582
1573
  }
583
1574
 
584
1575
  /* ============================================
585
- ThemeToggle
1576
+ PortfolioProject (detail page)
586
1577
  ============================================ */
587
1578
 
588
- .noxion-theme-toggle {
589
- display: inline-flex;
1579
+ .noxion-template-portfolio-project {
1580
+ width: 100%;
1581
+ }
1582
+
1583
+ .noxion-portfolio-project__header {
1584
+ display: flex;
590
1585
  align-items: center;
591
- justify-content: center;
592
- width: 1.875rem;
593
- height: 1.875rem;
1586
+ justify-content: space-between;
1587
+ gap: 1rem;
1588
+ margin-bottom: 1.5rem;
1589
+ padding-bottom: 1rem;
1590
+ border-bottom: 1px solid var(--noxion-border);
1591
+ }
1592
+
1593
+ @media (max-width: 640px) {
1594
+ .noxion-portfolio-project__header {
1595
+ flex-direction: column;
1596
+ align-items: flex-start;
1597
+ gap: 0.75rem;
1598
+ }
1599
+ }
1600
+
1601
+ .noxion-portfolio-project__tech {
1602
+ display: flex;
1603
+ flex-wrap: wrap;
1604
+ gap: 0.375rem;
1605
+ }
1606
+
1607
+ .noxion-portfolio-project__tech-tag {
1608
+ font-size: 0.6875rem;
1609
+ font-weight: 500;
1610
+ padding: 0.1875rem 0.5rem;
1611
+ border-radius: 9999px;
1612
+ background-color: var(--noxion-muted);
1613
+ color: var(--noxion-mutedForeground);
1614
+ }
1615
+
1616
+ .noxion-portfolio-project__link {
1617
+ font-size: 0.8125rem;
1618
+ font-weight: 500;
1619
+ color: var(--noxion-background);
1620
+ background-color: var(--noxion-foreground);
1621
+ text-decoration: none;
1622
+ padding: 0.4375rem 1rem;
1623
+ border-radius: 0.375rem;
1624
+ white-space: nowrap;
1625
+ transition: opacity var(--noxion-transition-fast);
1626
+ }
1627
+
1628
+ .noxion-portfolio-project__link:hover {
1629
+ opacity: 0.82;
1630
+ }
1631
+
1632
+ /* ============================================
1633
+ DocsSidebar
1634
+ ============================================ */
1635
+
1636
+ .noxion-docs-sidebar {
1637
+ font-size: 0.8125rem;
1638
+ }
1639
+
1640
+ .noxion-docs-sidebar__list {
1641
+ list-style: none;
1642
+ padding: 0;
1643
+ margin: 0;
1644
+ }
1645
+
1646
+ .noxion-docs-sidebar__item {
1647
+ margin: 0;
1648
+ }
1649
+
1650
+ .noxion-docs-sidebar__link {
1651
+ display: block;
1652
+ padding: 0.375rem 0.5rem;
594
1653
  border-radius: 0.375rem;
595
- border: none;
596
- background-color: transparent;
597
- cursor: pointer;
598
1654
  color: var(--noxion-mutedForeground);
1655
+ text-decoration: none;
1656
+ line-height: 1.45;
1657
+ letter-spacing: -0.01em;
599
1658
  transition:
600
1659
  color var(--noxion-transition-fast),
601
1660
  background-color var(--noxion-transition-fast);
602
- outline: none;
603
- padding: 0;
604
1661
  }
605
1662
 
606
- .noxion-theme-toggle:hover {
1663
+ .noxion-docs-sidebar__link:hover {
1664
+ color: var(--noxion-foreground);
1665
+ background-color: var(--noxion-accent);
1666
+ }
1667
+
1668
+ .noxion-docs-sidebar__link--active {
607
1669
  color: var(--noxion-foreground);
1670
+ font-weight: 500;
608
1671
  background-color: var(--noxion-muted);
609
1672
  }
610
1673
 
611
- .noxion-theme-toggle:focus-visible {
612
- box-shadow: 0 0 0 2px var(--noxion-primary);
1674
+ .noxion-docs-sidebar__link--active:hover {
1675
+ background-color: var(--noxion-muted);
613
1676
  }
614
1677
 
615
1678
  /* ============================================
616
- EmptyState
1679
+ DocsNav (prev / next)
617
1680
  ============================================ */
618
1681
 
619
- .noxion-empty-state {
620
- display: flex;
621
- flex-direction: column;
622
- align-items: center;
623
- justify-content: center;
624
- padding: 5rem 1rem;
625
- text-align: center;
626
- gap: 0.5rem;
1682
+ .noxion-docs-nav {
1683
+ display: grid;
1684
+ grid-template-columns: 1fr 1fr;
1685
+ gap: 1rem;
1686
+ margin-top: 3rem;
1687
+ padding-top: 1.5rem;
1688
+ border-top: 1px solid var(--noxion-border);
627
1689
  }
628
1690
 
629
- .noxion-empty-state__icon {
630
- color: var(--noxion-mutedForeground);
631
- margin-bottom: 0.75rem;
632
- opacity: 0.5;
1691
+ @media (max-width: 640px) {
1692
+ .noxion-docs-nav {
1693
+ grid-template-columns: 1fr;
1694
+ gap: 0.75rem;
1695
+ margin-top: 2rem;
1696
+ }
633
1697
  }
634
1698
 
635
- .noxion-empty-state__title {
636
- font-size: 1.0625rem;
637
- font-weight: 600;
638
- color: var(--noxion-foreground);
639
- margin: 0;
640
- letter-spacing: -0.02em;
1699
+ .noxion-docs-nav__prev {
1700
+ display: flex;
641
1701
  }
642
1702
 
643
- .noxion-empty-state__message {
644
- font-size: 0.875rem;
645
- color: var(--noxion-mutedForeground);
646
- margin: 0;
647
- max-width: 340px;
648
- line-height: 1.55;
1703
+ .noxion-docs-nav__next {
1704
+ display: flex;
1705
+ justify-content: flex-end;
649
1706
  }
650
1707
 
651
- /* ============================================
652
- Layout
653
- ============================================ */
1708
+ @media (max-width: 640px) {
1709
+ .noxion-docs-nav__next {
1710
+ justify-content: flex-start;
1711
+ }
1712
+ }
654
1713
 
655
- .noxion-layout {
1714
+ .noxion-docs-nav__link {
656
1715
  display: flex;
657
1716
  flex-direction: column;
658
- min-height: 100vh;
659
- background-color: var(--noxion-background);
1717
+ gap: 0.25rem;
1718
+ padding: 0.75rem 1rem;
1719
+ border-radius: var(--noxion-border-radius);
1720
+ border: 1px solid var(--noxion-border);
1721
+ text-decoration: none;
1722
+ color: inherit;
1723
+ transition:
1724
+ border-color var(--noxion-transition-fast),
1725
+ background-color var(--noxion-transition-fast);
1726
+ min-width: 0;
660
1727
  }
661
1728
 
662
- .noxion-layout__header {
663
- flex-shrink: 0;
1729
+ .noxion-docs-nav__link:hover {
1730
+ border-color: color-mix(in srgb, var(--noxion-foreground) 30%, transparent);
1731
+ background-color: var(--noxion-accent);
664
1732
  }
665
1733
 
666
- .noxion-layout__content {
667
- flex: 1;
668
- width: 100%;
669
- max-width: var(--noxion-spacing-content);
670
- margin: 0 auto;
671
- padding: 2.5rem 1.25rem;
1734
+ .noxion-docs-nav__label {
1735
+ font-size: 0.6875rem;
1736
+ font-weight: 600;
1737
+ text-transform: uppercase;
1738
+ letter-spacing: 0.04em;
1739
+ color: var(--noxion-mutedForeground);
672
1740
  }
673
1741
 
674
- @media (max-width: 640px) {
675
- .noxion-layout__content {
676
- padding: 1.5rem 1rem;
677
- }
1742
+ .noxion-docs-nav__title {
1743
+ font-size: 0.875rem;
1744
+ font-weight: 500;
1745
+ color: var(--noxion-foreground);
1746
+ letter-spacing: -0.01em;
1747
+ overflow: hidden;
1748
+ text-overflow: ellipsis;
1749
+ white-space: nowrap;
678
1750
  }
679
1751
 
680
- .noxion-layout__footer {
681
- flex-shrink: 0;
682
- margin-top: auto;
1752
+ .noxion-docs-nav__next .noxion-docs-nav__link {
1753
+ text-align: right;
1754
+ align-items: flex-end;
683
1755
  }
684
1756
 
685
- .noxion-layout__sidebar {
686
- width: var(--noxion-spacing-sidebar);
687
- flex-shrink: 0;
688
- padding: 2.5rem 1.5rem;
689
- border-right: 1px solid var(--noxion-border);
1757
+ @media (max-width: 640px) {
1758
+ .noxion-docs-nav__next .noxion-docs-nav__link {
1759
+ text-align: left;
1760
+ align-items: flex-start;
1761
+ }
690
1762
  }
691
1763
 
692
- .noxion-layout__hero {
693
- width: 100%;
694
- }
1764
+ /* ============================================
1765
+ DocsBreadcrumb
1766
+ ============================================ */
695
1767
 
696
- .noxion-layout--single-column {
697
- flex-direction: column;
1768
+ .noxion-docs-breadcrumb {
1769
+ font-size: 0.8125rem;
1770
+ margin-bottom: 1.5rem;
698
1771
  }
699
1772
 
700
- .noxion-layout--sidebar-left > .noxion-layout__main {
1773
+ .noxion-docs-breadcrumb__list {
1774
+ list-style: none;
1775
+ padding: 0;
1776
+ margin: 0;
701
1777
  display: flex;
702
- flex: 1;
1778
+ align-items: center;
1779
+ flex-wrap: wrap;
1780
+ gap: 0;
703
1781
  }
704
1782
 
705
- .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar {
706
- order: -1;
707
- border-right: 1px solid var(--noxion-border);
708
- border-left: none;
1783
+ .noxion-docs-breadcrumb__item {
1784
+ display: inline-flex;
1785
+ align-items: center;
709
1786
  }
710
1787
 
711
- .noxion-layout--sidebar-right > .noxion-layout__main {
712
- display: flex;
713
- flex: 1;
1788
+ .noxion-docs-breadcrumb__link {
1789
+ color: var(--noxion-mutedForeground);
1790
+ text-decoration: none;
1791
+ transition: color var(--noxion-transition-fast);
714
1792
  }
715
1793
 
716
- .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
717
- border-left: 1px solid var(--noxion-border);
718
- border-right: none;
1794
+ .noxion-docs-breadcrumb__link:hover {
1795
+ color: var(--noxion-foreground);
719
1796
  }
720
1797
 
721
- @media (max-width: 768px) {
722
- .noxion-layout__sidebar {
723
- width: 100%;
724
- border-right: none;
725
- border-bottom: 1px solid var(--noxion-border);
726
- padding: 1.5rem 1rem;
727
- }
1798
+ .noxion-docs-breadcrumb__current {
1799
+ color: var(--noxion-foreground);
1800
+ font-weight: 500;
1801
+ }
728
1802
 
729
- .noxion-layout--sidebar-left > .noxion-layout__main,
730
- .noxion-layout--sidebar-right > .noxion-layout__main {
731
- flex-direction: column;
732
- }
1803
+ .noxion-docs-breadcrumb__separator {
1804
+ margin: 0 0.375rem;
1805
+ color: var(--noxion-border);
1806
+ font-size: 0.75rem;
1807
+ }
733
1808
 
734
- .noxion-layout--sidebar-left > .noxion-layout__main > .noxion-layout__sidebar,
735
- .noxion-layout--sidebar-right > .noxion-layout__main > .noxion-layout__sidebar {
736
- border-left: none;
737
- border-right: none;
738
- }
1809
+ /* ============================================
1810
+ DocsPage template
1811
+ ============================================ */
1812
+
1813
+ .noxion-template-docs {
1814
+ width: 100%;
739
1815
  }