@portosaur/theme 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 (76) hide show
  1. package/README.md +13 -0
  2. package/assets/img/icon-old.png +0 -0
  3. package/assets/img/icon.png +0 -0
  4. package/assets/img/project-blank.png +0 -0
  5. package/assets/img/social-card.jpeg +0 -0
  6. package/assets/img/svg/icon-blog.svg +2 -0
  7. package/assets/img/svg/icon-close.svg +3 -0
  8. package/assets/img/svg/icon-dock.svg +4 -0
  9. package/assets/img/svg/icon-link.svg +5 -0
  10. package/assets/img/svg/icon-note.svg +2 -0
  11. package/assets/img/svg/icon-popup.svg +1 -0
  12. package/assets/img/svg/icon-save.svg +5 -0
  13. package/assets/img/svg/icon.svg +240 -0
  14. package/assets/img/svg/project-blank.svg +140 -0
  15. package/assets/sample-resume.pdf +0 -0
  16. package/package.json +41 -0
  17. package/plugins/README.md +8 -0
  18. package/src/index.d.ts +11 -0
  19. package/src/index.mjs +14 -0
  20. package/src/plugins/theme.mjs +13 -0
  21. package/theme/DocCategoryGeneratedIndexPage/index.jsx +15 -0
  22. package/theme/MDXComponents.jsx +19 -0
  23. package/theme/README.md +9 -0
  24. package/theme/Root.jsx +11 -0
  25. package/theme/components/AboutSection/index.jsx +264 -0
  26. package/theme/components/AboutSection/styles.module.css +309 -0
  27. package/theme/components/ContactSection/index.jsx +188 -0
  28. package/theme/components/ContactSection/styles.module.css +343 -0
  29. package/theme/components/ExperienceSection/index.jsx +119 -0
  30. package/theme/components/ExperienceSection/styles.module.css +183 -0
  31. package/theme/components/HeroSection/index.jsx +198 -0
  32. package/theme/components/HeroSection/styles.module.css +484 -0
  33. package/theme/components/NavArrow/index.jsx +124 -0
  34. package/theme/components/NavArrow/styles.module.css +107 -0
  35. package/theme/components/NoteIndex/index.jsx +182 -0
  36. package/theme/components/NoteIndex/styles.module.css +167 -0
  37. package/theme/components/Preview/components/FeedbackStates.jsx +200 -0
  38. package/theme/components/Preview/components/FileTabs.jsx +41 -0
  39. package/theme/components/Preview/components/PreviewContent.jsx +104 -0
  40. package/theme/components/Preview/components/PreviewHeader.jsx +411 -0
  41. package/theme/components/Preview/components/Triggers/Pv.jsx +253 -0
  42. package/theme/components/Preview/components/Triggers/SrcPv.jsx +55 -0
  43. package/theme/components/Preview/components/Triggers/index.jsx +2 -0
  44. package/theme/components/Preview/components/ViewerWindow.jsx +489 -0
  45. package/theme/components/Preview/hooks/useAdaptiveSizing.jsx +90 -0
  46. package/theme/components/Preview/hooks/useDeepLinkHash.jsx +24 -0
  47. package/theme/components/Preview/hooks/useDockLayout.jsx +86 -0
  48. package/theme/components/Preview/hooks/useFileFetch.jsx +38 -0
  49. package/theme/components/Preview/hooks/useTouchZoom.jsx +98 -0
  50. package/theme/components/Preview/index.jsx +3 -0
  51. package/theme/components/Preview/renderers/CodeRenderer.jsx +124 -0
  52. package/theme/components/Preview/renderers/ImageRenderer.jsx +74 -0
  53. package/theme/components/Preview/renderers/PdfRenderer.jsx +93 -0
  54. package/theme/components/Preview/renderers/WebRenderer.jsx +59 -0
  55. package/theme/components/Preview/state/index.jsx +177 -0
  56. package/theme/components/Preview/styles.module.css +776 -0
  57. package/theme/components/Preview/utils/index.jsx +62 -0
  58. package/theme/components/ProjectsSection/index.jsx +790 -0
  59. package/theme/components/ProjectsSection/styles.module.css +900 -0
  60. package/theme/components/SocialLinks/index.jsx +115 -0
  61. package/theme/components/SocialLinks/styles.module.css +57 -0
  62. package/theme/components/Tooltip/index.jsx +104 -0
  63. package/theme/components/Tooltip/styles.module.css +168 -0
  64. package/theme/config/iconMappings.jsx +427 -0
  65. package/theme/config/prism.jsx +72 -0
  66. package/theme/config/sidebar.jsx +11 -0
  67. package/theme/css/bootstrap.css +5 -0
  68. package/theme/css/catppuccin.css +618 -0
  69. package/theme/css/custom.css +253 -0
  70. package/theme/css/tasks.css +874 -0
  71. package/theme/hooks/useScrollReveal.jsx +20 -0
  72. package/theme/pages/index.jsx +104 -0
  73. package/theme/pages/notes.jsx +131 -0
  74. package/theme/pages/tasks.jsx +989 -0
  75. package/theme/utils/HashNavigation.jsx +185 -0
  76. package/theme/utils/updateTitle.jsx +65 -0
@@ -0,0 +1,900 @@
1
+ /* Animations */
2
+ @keyframes fadeIn {
3
+ from {
4
+ opacity: 0;
5
+ }
6
+ to {
7
+ opacity: 1;
8
+ }
9
+ }
10
+
11
+ @keyframes slideUp {
12
+ from {
13
+ opacity: 0;
14
+ transform: translateY(30px);
15
+ }
16
+ to {
17
+ opacity: 1;
18
+ transform: translateY(0);
19
+ }
20
+ }
21
+
22
+ .projectsSection {
23
+ scroll-margin-top: var(--ifm-scroll-margin-top);
24
+ min-height: calc(100vh - 60px);
25
+ margin-bottom: 0;
26
+ width: 100%;
27
+ padding: 3rem 0 7rem;
28
+ position: relative;
29
+ overflow: visible !important;
30
+ z-index: 100;
31
+ background-color: var(--ifm-background-color) !important;
32
+ box-shadow: none !important;
33
+ border: none !important;
34
+ }
35
+
36
+ .projectsContainer {
37
+ max-width: 1200px;
38
+ margin: 0 auto;
39
+ padding: 0 1.5rem 2rem;
40
+ overflow: visible !important;
41
+ }
42
+
43
+ .projectsCarousel {
44
+ width: 100%;
45
+ margin: 0;
46
+ padding: 0;
47
+ }
48
+
49
+ .projectsHeader {
50
+ text-align: center;
51
+ margin-bottom: 3.5rem;
52
+ }
53
+
54
+ .projectsTitle {
55
+ font-size: 2.5rem;
56
+ font-weight: 600;
57
+ color: var(--ifm-color-primary);
58
+ margin-bottom: 0.6rem;
59
+ opacity: 0;
60
+ position: relative;
61
+ display: inline-block;
62
+ }
63
+
64
+ :global(.is-visible) .projectsTitle::after {
65
+ width: 60px;
66
+ transition: width 0.4s ease-out 0.2s;
67
+ }
68
+
69
+ :global(.is-visible) .projectsTitle {
70
+ animation: slideUp 0.4s ease-out forwards;
71
+ }
72
+
73
+ .projectsSubtitle {
74
+ font-size: 0.95rem;
75
+ color: var(--ifm-font-color-tertiary);
76
+ max-width: 600px;
77
+ margin: 0.4rem auto 0;
78
+ opacity: 0;
79
+ }
80
+
81
+ :global(.is-visible) .projectsSubtitle {
82
+ animation: slideUp 0.4s ease-out 0.1s forwards;
83
+ }
84
+
85
+ /* Carousel Styles */
86
+ .carouselContainer {
87
+ position: relative;
88
+ display: flex;
89
+ align-items: center;
90
+ justify-content: center;
91
+ gap: 2rem;
92
+ width: 100%;
93
+ }
94
+
95
+ .carouselWrapper {
96
+ flex: 1;
97
+ min-width: 0;
98
+ overflow: hidden;
99
+ position: relative;
100
+ padding: 1rem 0;
101
+ }
102
+
103
+ .carouselControl {
104
+ background: var(--ifm-color-primary);
105
+ border: none;
106
+ border-radius: 50%;
107
+ width: 44px;
108
+ height: 44px;
109
+ display: flex;
110
+ align-items: center;
111
+ justify-content: center;
112
+ cursor: pointer;
113
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
114
+ color: var(--ifm-color-emphasis-900);
115
+ box-shadow: var(--ifm-global-shadow-md);
116
+ z-index: 10;
117
+ flex-shrink: 0;
118
+ position: relative;
119
+ }
120
+
121
+ .carouselControl:hover:not(:disabled) {
122
+ background: var(--ifm-color-primary-darker);
123
+ color: var(--ifm-color-emphasis-900);
124
+ transform: scale(1.1);
125
+ box-shadow: var(--ifm-global-shadow-lw);
126
+ }
127
+
128
+ .carouselControl:disabled {
129
+ opacity: 0.3;
130
+ cursor: not-allowed;
131
+ }
132
+
133
+ .projectsCarousel {
134
+ width: 100%;
135
+ margin: 0;
136
+ padding: 0;
137
+ }
138
+
139
+ .projectsCarousel :global(.slick-list) {
140
+ margin: 0 !important;
141
+ }
142
+
143
+ .carouselArrow {
144
+ position: absolute;
145
+ top: 50%;
146
+ transform: translateY(-50%);
147
+ z-index: 1000;
148
+ cursor: pointer;
149
+ border: none;
150
+ background: none;
151
+ }
152
+
153
+ .prevArrow {
154
+ left: -40px !important;
155
+ }
156
+
157
+ .nextArrow {
158
+ right: -40px !important;
159
+ }
160
+
161
+ .carouselSlide {
162
+ padding: 10px 12px;
163
+ height: 100%;
164
+ position: relative;
165
+ z-index: 1;
166
+ }
167
+
168
+ .carouselSlide:hover {
169
+ z-index: 999;
170
+ }
171
+
172
+ .carouselCard {
173
+ position: relative;
174
+ display: flex;
175
+ flex-direction: column;
176
+ background-color: var(--ifm-card-background-color);
177
+ border-radius: var(--ifm-card-border-radius);
178
+ overflow: hidden;
179
+ box-shadow: var(--ifm-global-shadow-md);
180
+ opacity: 0;
181
+ height: 100%;
182
+ transition:
183
+ transform 0.3s ease,
184
+ box-shadow 0.3s ease,
185
+ border-color 0.3s ease;
186
+ border: 1px solid var(--ifm-shadow-color);
187
+ width: 100%;
188
+ transform: translate3d(0, 0, 0);
189
+ }
190
+
191
+ :global(.is-visible) .carouselCard {
192
+ animation: slideUp 0.8s ease-out forwards;
193
+ animation-delay: calc(0.3s + (var(--card-index) * 0.1s));
194
+ }
195
+
196
+ .carouselSlide:hover .carouselCard {
197
+ transform: scale(1.02) translate3d(0, 0, 0);
198
+ }
199
+
200
+ .featuredCard {
201
+ /* Just the star is enough now */
202
+ box-shadow: var(--ifm-global-shadow-md);
203
+ }
204
+
205
+ .featuredBadge {
206
+ position: absolute;
207
+ bottom: 10px;
208
+ right: 10px;
209
+ background-color: var(--ifm-color-primary);
210
+ color: var(--ifm-color-emphasis-900);
211
+ width: 24px;
212
+ height: 24px;
213
+ border-radius: 50%;
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ font-size: 0.75rem;
218
+ z-index: 5;
219
+ box-shadow: var(--ifm-global-shadow-lw);
220
+ }
221
+
222
+ .featuredBadge svg {
223
+ font-size: 10px;
224
+ }
225
+
226
+ .carouselCard:hover {
227
+ transform: scale(1.02) translate3d(0, 0, 0);
228
+ border: 2px solid var(--ifm-color-primary);
229
+ z-index: 999;
230
+ }
231
+
232
+ .projectImageContainer {
233
+ position: relative;
234
+ width: 100%;
235
+ padding-top: 62%;
236
+ overflow: hidden;
237
+ background-color: rgba(var(--ifm-color-primary-rgb), 0.05);
238
+ border-top-left-radius: var(--ifm-card-border-radius);
239
+ border-top-right-radius: var(--ifm-card-border-radius);
240
+ clip-path: inset(
241
+ 0 round var(--ifm-card-border-radius) var(--ifm-card-border-radius) 0 0
242
+ );
243
+ border-bottom: 1px solid var(--ifm-hr-border-color);
244
+ }
245
+
246
+ .projectImage {
247
+ position: absolute;
248
+ top: 1rem;
249
+ left: 1rem;
250
+ right: 1rem;
251
+ bottom: 1rem;
252
+ width: calc(100% - 2rem);
253
+ height: calc(100% - 2rem);
254
+ object-fit: contain;
255
+ object-position: center;
256
+ transform: scale(1.05) translate3d(0, 0, 0);
257
+ transition: transform 0.5s ease;
258
+ color: transparent;
259
+ font-size: 0;
260
+ text-indent: -9999px;
261
+ backface-visibility: hidden;
262
+ }
263
+
264
+ .carouselSlide:hover .projectImage {
265
+ transform: scale(1.12) translate3d(0, 0, 0);
266
+ }
267
+
268
+ /* Card content styling */
269
+ .projectContent {
270
+ padding: 1.2rem 1.5rem 0.5rem;
271
+ flex: 1;
272
+ display: flex;
273
+ flex-direction: column;
274
+ align-items: center;
275
+ text-align: center;
276
+ }
277
+
278
+ .projectStateBadge {
279
+ position: absolute;
280
+ top: 10px;
281
+ right: 10px;
282
+ z-index: 5;
283
+ display: flex;
284
+ align-items: center;
285
+ }
286
+
287
+ .projectStateLabel {
288
+ font-size: 0.65rem;
289
+ font-weight: 500;
290
+ padding: 1px 4px;
291
+ border-radius: var(--ifm-global-radius);
292
+ text-transform: uppercase;
293
+ letter-spacing: 0.5px;
294
+ color: var(--ifm-color-white);
295
+ }
296
+
297
+ /* Status colors */
298
+ .stateActive {
299
+ background-color: var(--ifm-color-green);
300
+ color: var(--ifm-color-black);
301
+ }
302
+
303
+ .stateCompleted {
304
+ background-color: var(--ifm-color-blue);
305
+ color: var(--ifm-color-black);
306
+ }
307
+
308
+ .stateMaintenance {
309
+ background-color: var(--ifm-color-yellow);
310
+ color: var(--ifm-color-text);
311
+ }
312
+
313
+ .statePaused {
314
+ background-color: var(--ifm-color-orange);
315
+ color: var(--ifm-color-black);
316
+ }
317
+
318
+ .stateArchived {
319
+ background-color: var(--ifm-color-gray);
320
+ }
321
+
322
+ .stateNA {
323
+ background-color: var(--ifm-color-info-dark);
324
+ color: var(--ifm-color-black);
325
+ }
326
+
327
+ .statePlanned {
328
+ background-color: var(--ifm-color-purple);
329
+ color: var(--ifm-color-black);
330
+ }
331
+
332
+ .projectTitle {
333
+ font-size: 1.7rem;
334
+ margin-bottom: 0.4rem;
335
+ color: var(--ifm-color-primary);
336
+ font-weight: 600;
337
+ line-height: 1.2;
338
+ }
339
+
340
+ .projectDescription {
341
+ color: var(--ifm-font-color-tertiary);
342
+ margin: 0.4rem 0;
343
+ font-size: 0.9rem;
344
+ line-height: 1.4;
345
+ }
346
+
347
+ .projectTags {
348
+ position: absolute;
349
+ bottom: 10px;
350
+ left: 10px;
351
+ z-index: 5;
352
+ display: flex;
353
+ flex-direction: row;
354
+ flex-wrap: wrap;
355
+ gap: 4px;
356
+ align-items: center;
357
+ }
358
+
359
+ .projectTag {
360
+ background-color: var(--ifm-background-surface-color);
361
+ backdrop-filter: blur(12px);
362
+ color: var(--ifm-font-color-tertiary);
363
+ padding: 0px 1px 1px 2px;
364
+ border-radius: 3px;
365
+ font-size: 0.5rem;
366
+ font-weight: 700;
367
+ text-transform: capitalize;
368
+ letter-spacing: 0.8px;
369
+ border: 1px solid var(--ifm-card-background-color);
370
+ box-shadow: var(--ifm-global-shadow-lw);
371
+ }
372
+
373
+ .extraTagBtn {
374
+ background-color: var(--ifm-color-primary) !important;
375
+ color: var(--ifm-color-emphasis-900) !important;
376
+ border: 0.1px solid var(--ifm-color-primary) !important;
377
+ cursor: help;
378
+ opacity: 0.7;
379
+ }
380
+
381
+ /* Links styling */
382
+ .projectLinks {
383
+ display: flex;
384
+ justify-content: center;
385
+ padding: 1.2rem 1.5rem 1.8rem;
386
+ gap: 1rem;
387
+ margin-top: auto;
388
+ }
389
+
390
+ .projectLink {
391
+ display: flex;
392
+ align-items: center;
393
+ gap: 0.35rem;
394
+ color: var(--ifm-font-color-tertiary);
395
+ text-decoration: none;
396
+ font-size: 0.8rem;
397
+ transition: all 0.2s ease;
398
+ padding: 0.35rem 0.7rem;
399
+ border-radius: var(--ifm-global-radius);
400
+ border: 1px solid var(--ifm-color-gray-500);
401
+ background-color: var(--ifm-shadow-color);
402
+ font-weight: 500;
403
+ white-space: nowrap;
404
+ box-shadow: var(--ifm-global-shadow-lw);
405
+ }
406
+
407
+ .projectLink:hover {
408
+ color: var(--ifm-color-primary);
409
+ background-color: var(--ifm-card-background-color);
410
+ transform: translateY(-2px);
411
+ box-shadow: var(--ifm-global-shadow-md);
412
+ border-color: var(--ifm-color-primary);
413
+ text-decoration: none;
414
+ }
415
+
416
+ .projectLink:active {
417
+ transform: translateY(-1px);
418
+ box-shadow: var(--ifm-global-shadow-lw);
419
+ }
420
+
421
+ .projectLink svg {
422
+ font-size: 0.95rem;
423
+ transition: transform 0.2s ease;
424
+ color: var(--ifm-font-color-secondary);
425
+ }
426
+
427
+ .projectLink:hover svg {
428
+ transform: scale(1.08);
429
+ color: var(--ifm-color-primary);
430
+ }
431
+
432
+ .noProjects {
433
+ text-align: center;
434
+ padding: 2rem;
435
+ color: var(--ifm-font-color-tertiary);
436
+ background-color: var(--ifm-shadow-color);
437
+ border-radius: var(--ifm-card-border-radius);
438
+ margin: 1rem 0;
439
+ }
440
+
441
+ :global(.slick-track) {
442
+ display: flex !important;
443
+ justify-content: center !important;
444
+ margin: 0 auto !important;
445
+ }
446
+
447
+ :global(.slick-slide) {
448
+ height: inherit !important;
449
+ float: none !important;
450
+ }
451
+
452
+ :global(.slick-slide > div) {
453
+ height: 100%;
454
+ margin: 0 0.2rem;
455
+ }
456
+
457
+ /* Hide default slick dots */
458
+ :global(.slick-dots) {
459
+ display: none !important;
460
+ }
461
+
462
+ /* Custom navigation dots styling */
463
+ .navDotsContainer {
464
+ display: flex;
465
+ align-items: center;
466
+ margin: 0;
467
+ padding: 0;
468
+ width: auto;
469
+ min-width: fit-content;
470
+ }
471
+
472
+ .dotsScrollContainer {
473
+ flex: 1;
474
+ overflow-x: auto;
475
+ overflow-y: hidden;
476
+ -webkit-overflow-scrolling: touch;
477
+ scrollbar-width: none;
478
+ -ms-overflow-style: none;
479
+ display: flex;
480
+ justify-content: center;
481
+ padding: 0.8rem 0;
482
+ max-width: 60vw;
483
+ scroll-padding: 0 20px;
484
+ margin: 0 5px;
485
+ position: relative;
486
+ }
487
+
488
+ .dotsScrollContainer::-webkit-scrollbar {
489
+ display: none;
490
+ }
491
+
492
+ .navDot {
493
+ width: 9px;
494
+ height: 9px;
495
+ border-radius: 50%;
496
+ background-color: var(--ifm-color-gray-500);
497
+ border: none;
498
+ margin: 0 6px;
499
+ cursor: pointer;
500
+ padding: 0;
501
+ transition: all 0.3s ease;
502
+ opacity: 0.7;
503
+ flex-shrink: 0;
504
+ min-width: 9px;
505
+ min-height: 9px;
506
+ }
507
+
508
+ .navDot:hover {
509
+ opacity: 1;
510
+ background-color: var(--ifm-color-primary-dark);
511
+ }
512
+
513
+ .activeDot {
514
+ background-color: var(--ifm-color-primary);
515
+ transform: scale(1.5);
516
+ opacity: 1;
517
+ box-shadow: 0 0 0 3px rgba(var(--ifm-color-primary-rgb), 0.4);
518
+ z-index: 5; /* Ensure active dot appears above others */
519
+ }
520
+
521
+ .dotsScrollContainer .navDot {
522
+ opacity: 0.8;
523
+ }
524
+
525
+ /* Center alignment for dots */
526
+ .centerDots {
527
+ display: flex !important;
528
+ justify-content: center !important;
529
+ text-align: center !important;
530
+ margin: 0 auto;
531
+ }
532
+
533
+ .scrollDots {
534
+ justify-content: flex-start;
535
+ flex-wrap: nowrap;
536
+ margin: 0;
537
+ }
538
+
539
+ .navigationControls {
540
+ display: flex;
541
+ justify-content: center;
542
+ align-items: center;
543
+ margin: 20px auto 10px;
544
+ width: 100%;
545
+ gap: 15px;
546
+ }
547
+
548
+ .desktopDotsContainer {
549
+ display: flex;
550
+ justify-content: center;
551
+ align-items: center;
552
+ margin: 15px 0 10px;
553
+ padding: 5px 0;
554
+ width: 100%;
555
+ }
556
+
557
+ /* Mobile bottom navigation - hidden on desktop */
558
+ .mobileNavigationControls {
559
+ display: none;
560
+ justify-content: space-between;
561
+ align-items: center;
562
+ margin: 20px auto 10px;
563
+ width: 100%;
564
+ gap: 5px;
565
+ }
566
+
567
+ /* Add a spacer to center the navigation buttons */
568
+ .mobileControlsSpacer {
569
+ flex: 1;
570
+ }
571
+
572
+ /* Responsive styles */
573
+ @media (max-width: 768px) {
574
+ .projectsSection {
575
+ scroll-margin-top: 70px;
576
+ min-height: calc(100vh);
577
+ padding: 1.5rem 0 4rem;
578
+ }
579
+
580
+ .projectsTitle {
581
+ font-size: 2.2rem;
582
+ }
583
+
584
+ .projectsSubtitle {
585
+ font-size: 0.9rem;
586
+ }
587
+
588
+ .projectsHeader {
589
+ margin-bottom: 2rem;
590
+ }
591
+
592
+ .carouselContainer {
593
+ padding: 0 0.5rem;
594
+ display: block;
595
+ }
596
+
597
+ .carouselControl {
598
+ width: 40px;
599
+ height: 40px;
600
+ }
601
+
602
+ .carouselControl svg {
603
+ width: 18px;
604
+ height: 18px;
605
+ }
606
+
607
+ .projectContent {
608
+ padding: 1.3rem 1.1rem 0rem;
609
+ }
610
+
611
+ .projectLinks {
612
+ padding: 0.8rem 1.1rem 1.3rem;
613
+ gap: 0.7rem;
614
+ flex-wrap: wrap;
615
+ justify-content: center;
616
+ }
617
+
618
+ .projectLink {
619
+ padding: 0.35rem 0.6rem;
620
+ font-size: 0.75rem;
621
+ min-width: 80px;
622
+ justify-content: center;
623
+ }
624
+
625
+ .prevButton {
626
+ left: -20px;
627
+ }
628
+
629
+ .nextButton {
630
+ right: -20px;
631
+ }
632
+
633
+ :global(.slick-slide > div) {
634
+ margin: 0 0.3rem;
635
+ }
636
+
637
+ /* Hide desktop side buttons */
638
+ .desktopOnly {
639
+ display: none;
640
+ }
641
+
642
+ /* Hide desktop dots */
643
+ .desktopDotsContainer {
644
+ display: none;
645
+ }
646
+
647
+ /* Show mobile navigation */
648
+ .mobileNavigationControls {
649
+ display: flex;
650
+ justify-content: space-between;
651
+ align-items: center;
652
+ width: 100%;
653
+ }
654
+
655
+ .mobileNavigationControls .dotsScrollContainer {
656
+ display: flex;
657
+ justify-content: center;
658
+ }
659
+
660
+ .mobileNavigationControls .centerDots {
661
+ margin: 0 auto;
662
+ }
663
+
664
+ .mobileNavigationControls .carouselControl {
665
+ position: relative;
666
+ top: auto;
667
+ transform: none;
668
+ width: 40px;
669
+ height: 40px;
670
+ flex-shrink: 0;
671
+ z-index: 10;
672
+ }
673
+
674
+ .mobileNavigationControls .carouselControl:hover {
675
+ opacity: 1;
676
+ transform: none;
677
+ }
678
+
679
+ .mobileNavigationControls .disabledButton:hover {
680
+ opacity: 0.6;
681
+ transform: none;
682
+ }
683
+
684
+ .mobileNavigationControls .prevButton,
685
+ .mobileNavigationControls .nextButton {
686
+ left: auto;
687
+ right: auto;
688
+ }
689
+
690
+ .projectStateBadge {
691
+ top: 8px;
692
+ right: 8px;
693
+ }
694
+
695
+ .projectStateLabel {
696
+ font-size: 0.6rem;
697
+ padding: 1px 3px;
698
+ }
699
+
700
+ .mobileNavigationControls .dotsScrollContainer {
701
+ justify-content: flex-start;
702
+ padding-left: 10px;
703
+ min-height: 40px;
704
+ align-items: center;
705
+ }
706
+
707
+ .mobileNavigationControls .centerDots {
708
+ justify-content: center !important;
709
+ padding-left: 0;
710
+ }
711
+
712
+ .mobileNavigationControls .navDot:first-child {
713
+ margin-left: 2px;
714
+ }
715
+
716
+ .mobileNavigationControls .activeDot {
717
+ transform: scale(1.6);
718
+ opacity: 1;
719
+ box-shadow: 0 0 0 2px rgba(var(--ifm-color-primary-rgb), 0.5);
720
+ }
721
+ }
722
+
723
+ @media (max-width: 480px) {
724
+ .projectsSection {
725
+ scroll-margin-top: var(--ifm-scroll-margin-top-mobile);
726
+ padding: 1rem 0 3rem;
727
+ }
728
+
729
+ .projectsContainer {
730
+ padding-left: 1rem;
731
+ padding-right: 1rem;
732
+ }
733
+
734
+ .projectsTitle {
735
+ font-size: 1.9rem;
736
+ }
737
+
738
+ .projectsSubtitle {
739
+ font-size: 0.9rem;
740
+ max-width: 90%;
741
+ }
742
+
743
+ .projectsHeader {
744
+ margin-bottom: 1.5rem;
745
+ }
746
+
747
+ .carouselContainer {
748
+ padding: 0 0.1rem;
749
+ max-width: 100%;
750
+ }
751
+
752
+ .projectImageContainer {
753
+ padding-top: 62%;
754
+ }
755
+
756
+ .carouselControl {
757
+ width: 36px;
758
+ height: 36px;
759
+ }
760
+
761
+ .carouselControl svg {
762
+ width: 16px;
763
+ height: 16px;
764
+ }
765
+
766
+ .projectTitle {
767
+ font-size: 1.5rem;
768
+ }
769
+
770
+ .projectDescription {
771
+ font-size: 0.9rem;
772
+ margin-bottom: 0.4rem;
773
+ }
774
+
775
+ .projectContent {
776
+ padding: 1.2rem 1rem 0rem;
777
+ }
778
+
779
+ .projectLinks {
780
+ padding: 0.8rem 1rem 1.2rem;
781
+ flex-wrap: wrap;
782
+ justify-content: center;
783
+ gap: 0.6rem;
784
+ }
785
+
786
+ .projectTags {
787
+ margin: 0.2rem 0 0.5rem;
788
+ gap: 0.15rem;
789
+ }
790
+
791
+ .projectTag {
792
+ padding: 0.01rem 0.25rem;
793
+ font-size: 0.55rem;
794
+ }
795
+
796
+ .projectLinks {
797
+ padding: 0.8rem 1rem 1.2rem;
798
+ flex-wrap: wrap;
799
+ justify-content: center;
800
+ gap: 0.6rem;
801
+ }
802
+
803
+ .projectLink {
804
+ padding: 0.32rem 0.65rem;
805
+ font-size: 0.75rem;
806
+ flex: 0 1 auto;
807
+ justify-content: center;
808
+ min-width: 85px;
809
+ }
810
+
811
+ :global(.slick-slide) {
812
+ width: 100vw !important;
813
+ max-width: 550px;
814
+ margin: 0 auto;
815
+ }
816
+
817
+ :global(.slick-slide > div) {
818
+ margin: 0;
819
+ width: 100%;
820
+ }
821
+
822
+ :global(.slick-track) {
823
+ display: flex !important;
824
+ justify-content: center;
825
+ }
826
+
827
+ .carouselWrapper {
828
+ margin-bottom: 25px;
829
+ overflow: visible;
830
+ }
831
+
832
+ .prevButton {
833
+ left: -8px;
834
+ }
835
+
836
+ .nextButton {
837
+ right: -8px;
838
+ }
839
+
840
+ .dotsScrollContainer {
841
+ max-width: 45vw;
842
+ padding: 0.6rem 0;
843
+ }
844
+
845
+ .navDot {
846
+ width: 10px;
847
+ height: 10px;
848
+ min-width: 10px;
849
+ min-height: 10px;
850
+ margin: 0 5px;
851
+ }
852
+
853
+ .mobileNavigationControls .carouselControl {
854
+ width: 32px;
855
+ height: 32px;
856
+ min-width: 32px;
857
+ }
858
+
859
+ .projectStateBadge {
860
+ top: 6px;
861
+ right: 6px;
862
+ }
863
+
864
+ .projectStateLabel {
865
+ font-size: 0.55rem;
866
+ padding: 0px 3px;
867
+ letter-spacing: 0.3px;
868
+ }
869
+
870
+ .mobileNavigationControls .activeDot {
871
+ box-shadow: 0 0 0 1.5px rgba(var(--ifm-color-primary-rgb), 0.4);
872
+ transform: scale(1.5);
873
+ }
874
+ }
875
+
876
+ /* Accessibility */
877
+ @media (prefers-reduced-motion: reduce) {
878
+ .projectsTitle,
879
+ .projectsSubtitle {
880
+ animation: none !important;
881
+ transition: none !important;
882
+ }
883
+
884
+ .navDot,
885
+ .activeDot,
886
+ .carouselCard,
887
+ .projectImage,
888
+ .projectLink,
889
+ .carouselControl {
890
+ transition: none;
891
+ }
892
+
893
+ .carouselCard {
894
+ animation: none;
895
+ }
896
+
897
+ .projectStateLabel {
898
+ transition: none !important;
899
+ }
900
+ }