howdy-jekyll-theme 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/AGENTS.md +49 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +21 -0
  5. data/README.md +431 -0
  6. data/_includes/analytics.html +19 -0
  7. data/_includes/blog-pagination.html +31 -0
  8. data/_includes/comments.html +46 -0
  9. data/_includes/dark-mode-toggle.html +18 -0
  10. data/_includes/head.html +137 -0
  11. data/_includes/hero-carousel.html +80 -0
  12. data/_includes/logo.html +5 -0
  13. data/_includes/navigation.html +24 -0
  14. data/_includes/newsletter.html +10 -0
  15. data/_includes/share-buttons.html +70 -0
  16. data/_includes/social-links.html +37 -0
  17. data/_includes/toc.html +29 -0
  18. data/_layouts/autopage_collection.html +43 -0
  19. data/_layouts/blog.html +42 -0
  20. data/_layouts/default.html +86 -0
  21. data/_layouts/home.html +5 -0
  22. data/_layouts/page.html +33 -0
  23. data/_layouts/post.html +76 -0
  24. data/_layouts/project.html +61 -0
  25. data/_plugins/sort_projects.rb +6 -0
  26. data/_plugins/user_colors.rb +68 -0
  27. data/_posts/2026-01-01-beyond-pixels.md +21 -0
  28. data/_posts/2026-01-02-collaboration.md +25 -0
  29. data/_posts/2026-01-03-design-feeling.md +25 -0
  30. data/_posts/2026-01-04-finding-inspiration.md +25 -0
  31. data/_posts/2026-01-05-freebies.md +35 -0
  32. data/_posts/2026-01-06-ux-research-methods.md +25 -0
  33. data/_posts/2026-01-07-color-theory.md +25 -0
  34. data/_posts/2026-01-08-responsive-design.md +25 -0
  35. data/_posts/2026-01-09-web-performance.md +25 -0
  36. data/_posts/2026-01-10-mobile-first.md +25 -0
  37. data/_posts/2026-04-15-crafting-visual-hierarchy.md +27 -0
  38. data/_posts/2026-04-16-building-design-systems.md +27 -0
  39. data/_posts/2026-04-18-accessibility-matters.md +25 -0
  40. data/_posts/2026-04-19-motion-design.md +29 -0
  41. data/_posts/2026-04-20-typography-basics.md +25 -0
  42. data/_posts/2026-04-22-product-design-best-practices.md +239 -0
  43. data/_projects/atlas.md +26 -0
  44. data/_projects/luminous.md +26 -0
  45. data/_projects/nova.md +31 -0
  46. data/_projects/osaka.md +26 -0
  47. data/_sass/_base.scss +181 -0
  48. data/_sass/_components.scss +767 -0
  49. data/_sass/_dark-mode.scss +39 -0
  50. data/_sass/_layout.scss +1033 -0
  51. data/_sass/_typography.scss +394 -0
  52. data/_sass/_user-colors.scss +1 -0
  53. data/_sass/_variables.scss +165 -0
  54. data/about.md +62 -0
  55. data/assets/css/main.scss +10 -0
  56. data/assets/css/swiper-bundle.min.css +13 -0
  57. data/assets/fonts/ChaumontScript-Regular.otf +0 -0
  58. data/assets/fonts/DMSans-Italic-Variable.ttf +0 -0
  59. data/assets/fonts/DMSans-Variable.ttf +0 -0
  60. data/assets/illustrations/analytics.svg +218 -0
  61. data/assets/illustrations/business-strategy.svg +161 -0
  62. data/assets/illustrations/designer.svg +267 -0
  63. data/assets/illustrations/email.svg +123 -0
  64. data/assets/illustrations/friends-taking-selfie.svg +189 -0
  65. data/assets/illustrations/launch.svg +230 -0
  66. data/assets/illustrations/love-animals.svg +83 -0
  67. data/assets/illustrations/meeting.svg +292 -0
  68. data/assets/illustrations/mobile-shopping.svg +113 -0
  69. data/assets/illustrations/online-shopping.svg +148 -0
  70. data/assets/illustrations/oops-something-went-wrong.svg +97 -0
  71. data/assets/illustrations/podcast.svg +199 -0
  72. data/assets/illustrations/presentation.svg +138 -0
  73. data/assets/illustrations/programmer.svg +240 -0
  74. data/assets/illustrations/task-management.svg +174 -0
  75. data/assets/illustrations/tasks-complete.svg +161 -0
  76. data/assets/illustrations/travel-booking-hotel.svg +214 -0
  77. data/assets/illustrations/video-call.svg +178 -0
  78. data/assets/images/apple-touch-icon.png +0 -0
  79. data/assets/images/favicon-dark.png +0 -0
  80. data/assets/images/favicon-light.png +0 -0
  81. data/assets/images/howdy-theme-dark.png +0 -0
  82. data/assets/images/howdy-theme-light.png +0 -0
  83. data/assets/images/og-image.png +0 -0
  84. data/assets/js/hero-carousel.js +36 -0
  85. data/assets/js/mobile-nav.js +62 -0
  86. data/assets/js/swiper-bundle.min.js +13 -0
  87. data/assets/js/swiper-bundle.min.js.map +1 -0
  88. data/assets/js/theme-toggle.js +54 -0
  89. data/assets/resume.pdf +683 -0
  90. data/contact.md +74 -0
  91. data/howdy-jekyll-theme.gemspec +25 -0
  92. data/lib/howdy-jekyll-theme.rb +19 -0
  93. metadata +245 -0
@@ -0,0 +1,767 @@
1
+ // Howdy Jekyll Theme - Component Styles
2
+
3
+ @use "variables" as *;
4
+
5
+ // Buttons
6
+ .btn {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--howdy-spacing-sm);
10
+ padding: 12px 24px;
11
+ border-radius: var(--howdy-radius-full);
12
+ font-family: var(--howdy-font-primary);
13
+ font-weight: 600;
14
+ font-size: 15px;
15
+ letter-spacing: 0.02em; // Required for UI labels/buttons
16
+ text-decoration: none;
17
+ cursor: pointer;
18
+ transition: var(--howdy-transition);
19
+ border: 2px solid transparent;
20
+ min-height: 44px;
21
+
22
+ &.btn-primary {
23
+ background-color: var(--howdy-text-primary);
24
+ color: var(--howdy-bg-white);
25
+
26
+ &:hover {
27
+ background-color: var(--howdy-accent-green);
28
+ color: var(--howdy-bg-white);
29
+ }
30
+ }
31
+
32
+ &.btn-secondary {
33
+ background-color: transparent;
34
+ color: var(--howdy-text-primary);
35
+ border-color: var(--howdy-border);
36
+
37
+ &:hover {
38
+ border-color: var(--howdy-accent-green);
39
+ color: var(--howdy-accent-green);
40
+ }
41
+ }
42
+
43
+ svg {
44
+ width: 18px;
45
+ height: 18px;
46
+ transition: transform 0.2s ease;
47
+ flex-shrink: 0;
48
+
49
+ @media (max-width: $howdy-lg) {
50
+ width: 16px;
51
+ height: 16px;
52
+ }
53
+ }
54
+
55
+ &:hover svg {
56
+ transform: translateX(-3px);
57
+ }
58
+
59
+ &.post-nav-next svg {
60
+ transform: translateX(0);
61
+ }
62
+
63
+ &.post-nav-next:hover svg {
64
+ transform: translateX(3px);
65
+ }
66
+
67
+ @media (max-width: $howdy-lg) {
68
+ padding: 10px 20px;
69
+ font-size: 14px;
70
+ min-height: 40px;
71
+ }
72
+
73
+ @media (max-width: $howdy-sm) {
74
+ width: 100%;
75
+ justify-content: center;
76
+ padding: 12px 20px;
77
+ font-size: 13px;
78
+ }
79
+ }
80
+
81
+ // Project card
82
+ .project-card {
83
+ @extend .post-card;
84
+
85
+ .project-image {
86
+ width: 100%;
87
+ height: 200px;
88
+ object-fit: cover;
89
+ border-radius: var(--howdy-radius-md);
90
+ background-color: var(--howdy-bg-light-gray);
91
+ transition: transform 0.3s ease;
92
+
93
+ @media (max-width: $howdy-sm) {
94
+ height: 160px;
95
+ }
96
+
97
+ @media (max-width: $howdy-xs) {
98
+ height: 140px;
99
+ }
100
+ }
101
+
102
+ &:hover {
103
+ border-color: var(--howdy-accent-green);
104
+ }
105
+
106
+ &:hover .project-image {
107
+ transform: scale(1.02);
108
+ }
109
+
110
+ .project-title {
111
+ font-family: var(--howdy-font-primary);
112
+ font-weight: 600;
113
+ font-size: 18px;
114
+ color: var(--howdy-text-primary);
115
+ transition: var(--howdy-transition);
116
+ }
117
+
118
+ .project-excerpt {
119
+ @extend .body-regular !optional;
120
+ margin: 0;
121
+ }
122
+ }
123
+
124
+ // Project category badge
125
+ .project-category {
126
+ display: inline-flex;
127
+ align-items: center;
128
+ padding: 4px 12px;
129
+ background-color: var(--howdy-bg-green-tint);
130
+ color: var(--howdy-accent-green);
131
+ border-radius: var(--howdy-radius-full);
132
+ font-size: 12px;
133
+ letter-spacing: 0.01em;
134
+ font-weight: 500;
135
+ transition: var(--howdy-transition);
136
+ width: fit-content;
137
+ }
138
+
139
+ // Post card (blog)
140
+ .post-card {
141
+ display: flex;
142
+ flex-direction: column;
143
+ gap: var(--howdy-spacing-md);
144
+ padding: var(--howdy-spacing-md);
145
+ border-radius: var(--howdy-radius-lg);
146
+ background-color: var(--howdy-bg-white);
147
+ border: 1px solid var(--howdy-border);
148
+ transition: var(--howdy-transition);
149
+ text-decoration: none;
150
+ color: inherit;
151
+
152
+ &:hover {
153
+ transform: translateY(-2px);
154
+ border-color: var(--howdy-accent-green);
155
+ background-color: var(--howdy-bg-light-gray);
156
+ }
157
+
158
+ &:hover .post-image {
159
+ transform: scale(1.02);
160
+ }
161
+
162
+ .post-image {
163
+ width: 100%;
164
+ height: 200px;
165
+ object-fit: cover;
166
+ border-radius: var(--howdy-radius-md);
167
+ background-color: var(--howdy-bg-light-gray);
168
+ transition: transform 0.3s ease;
169
+
170
+ @media (max-width: $howdy-sm) {
171
+ height: 160px;
172
+ }
173
+
174
+ @media (max-width: $howdy-xs) {
175
+ height: 140px;
176
+ }
177
+ }
178
+
179
+ .post-title {
180
+ font-family: var(--howdy-font-primary);
181
+ font-weight: 600;
182
+ font-size: 18px;
183
+ color: var(--howdy-text-primary);
184
+ transition: var(--howdy-transition);
185
+ }
186
+
187
+ .post-excerpt {
188
+ @extend .body-regular !optional;
189
+ margin: 0;
190
+ }
191
+
192
+ .post-date {
193
+ @extend .small-text !optional;
194
+ color: var(--howdy-text-muted);
195
+ }
196
+ }
197
+
198
+ // Post category badge
199
+ .post-category {
200
+ display: inline-flex;
201
+ align-items: center;
202
+ padding: 4px 12px;
203
+ border-radius: var(--howdy-radius-full);
204
+ font-size: 12px;
205
+ letter-spacing: 0.01em;
206
+ font-weight: 500;
207
+ transition: var(--howdy-transition);
208
+ width: fit-content;
209
+
210
+ &.category-tutorials {
211
+ background-color: var(--howdy-bg-blue-tint);
212
+ color: var(--howdy-accent-blue);
213
+ }
214
+
215
+ &.category-inspiration {
216
+ background-color: var(--howdy-bg-orange-tint);
217
+ color: var(--howdy-accent-orange);
218
+ }
219
+
220
+ &.category-freebies {
221
+ background-color: var(--howdy-bg-green-tint);
222
+ color: var(--howdy-accent-green);
223
+ }
224
+
225
+ &.category-interviews {
226
+ background-color: var(--howdy-bg-purple-tint);
227
+ color: var(--howdy-accent-purple);
228
+ }
229
+ }
230
+
231
+ // Grid layouts
232
+ .projects-grid {
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: var(--howdy-spacing-lg);
236
+ }
237
+
238
+ .posts-grid {
239
+ display: flex;
240
+ flex-direction: column;
241
+ gap: var(--howdy-spacing-lg);
242
+ }
243
+
244
+ .post-card,
245
+ .project-card {
246
+ width: 100%;
247
+ }
248
+
249
+ // Pagination
250
+ .pagination {
251
+ display: flex;
252
+ justify-content: center;
253
+ align-items: center;
254
+ gap: var(--howdy-spacing-sm);
255
+ margin-top: var(--howdy-spacing-48);
256
+ flex-wrap: wrap;
257
+ }
258
+
259
+ .pagination-page {
260
+ display: inline-flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ min-width: 40px;
264
+ height: 44px;
265
+ padding: 0 12px;
266
+ border: 1px solid var(--howdy-border);
267
+ border-radius: var(--howdy-radius-md);
268
+ font-family: var(--howdy-font-primary);
269
+ font-weight: 500;
270
+ font-size: 15px;
271
+ color: var(--howdy-text-primary);
272
+ text-decoration: none;
273
+ cursor: pointer;
274
+ transition: var(--howdy-transition);
275
+
276
+ &:hover {
277
+ border-color: var(--howdy-accent-green);
278
+ color: var(--howdy-accent-green);
279
+ }
280
+
281
+ &.active {
282
+ background-color: var(--howdy-text-primary);
283
+ color: var(--howdy-bg-white);
284
+ border-color: transparent;
285
+ }
286
+ }
287
+
288
+ // Contact page
289
+ .contact-intro {
290
+ font-size: 18px;
291
+ color: var(--howdy-text-secondary);
292
+ max-width: 50ch;
293
+ line-height: 1.6;
294
+ }
295
+
296
+ .contact-response-time {
297
+ margin-top: var(--howdy-spacing-md);
298
+ font-size: 14px;
299
+ color: var(--howdy-text-muted);
300
+ }
301
+
302
+ .contact-form-wrapper {
303
+ margin-top: var(--howdy-spacing-xl);
304
+ padding-top: var(--howdy-spacing-xl);
305
+ border-top: 1px solid var(--howdy-border);
306
+ }
307
+
308
+ .contact-form-title {
309
+ font-family: var(--howdy-font-primary);
310
+ font-size: 24px;
311
+ font-weight: 600;
312
+ color: var(--howdy-text-primary);
313
+ margin-bottom: var(--howdy-spacing-md);
314
+ }
315
+
316
+ .contact-form {
317
+ max-width: 100%;
318
+
319
+ .form-row {
320
+ display: flex;
321
+ gap: var(--howdy-spacing-md);
322
+
323
+ @media (max-width: $howdy-sm) {
324
+ flex-direction: column;
325
+ }
326
+ }
327
+
328
+ .form-group {
329
+ flex: 1;
330
+ margin-bottom: var(--howdy-spacing-md);
331
+
332
+ input,
333
+ textarea {
334
+ width: 100%;
335
+ padding: 12px 16px;
336
+ border: 1px solid var(--howdy-border);
337
+ border-radius: var(--howdy-radius-md);
338
+ font-family: var(--howdy-font-primary);
339
+ font-size: 15px;
340
+ color: var(--howdy-text-primary);
341
+ background: transparent;
342
+ transition: border-color 0.2s ease;
343
+
344
+ &::placeholder {
345
+ color: var(--howdy-text-muted);
346
+ }
347
+
348
+ &:focus-visible {
349
+ outline: 2px solid var(--howdy-accent-green);
350
+ outline-offset: 0;
351
+ border-color: var(--howdy-accent-green);
352
+ }
353
+ }
354
+
355
+ textarea {
356
+ resize: vertical;
357
+ min-height: 120px;
358
+ }
359
+ }
360
+
361
+ .btn {
362
+ margin-top: var(--howdy-spacing-sm);
363
+ }
364
+ }
365
+
366
+ .contact-faq {
367
+ margin-top: var(--howdy-spacing-xl);
368
+ padding-top: var(--howdy-spacing-xl);
369
+ border-top: 1px solid var(--howdy-border);
370
+ }
371
+
372
+ .contact-faq-title {
373
+ font-family: var(--howdy-font-primary);
374
+ font-size: 24px;
375
+ font-weight: 600;
376
+ color: var(--howdy-text-primary);
377
+ margin-bottom: var(--howdy-spacing-lg);
378
+ }
379
+
380
+ .faq-item {
381
+ border-bottom: 1px solid var(--howdy-border);
382
+
383
+ &:last-child {
384
+ border-bottom: none;
385
+ }
386
+ }
387
+
388
+ .faq-question {
389
+ font-family: var(--howdy-font-primary);
390
+ font-size: 16px;
391
+ font-weight: 500;
392
+ color: var(--howdy-text-primary);
393
+ padding: 16px 0;
394
+ cursor: pointer;
395
+ list-style: none;
396
+ display: flex;
397
+ justify-content: space-between;
398
+ align-items: center;
399
+
400
+ &::-webkit-details-marker {
401
+ display: none;
402
+ }
403
+
404
+ &::after {
405
+ content: "";
406
+ flex-shrink: 0;
407
+ width: 20px;
408
+ height: 20px;
409
+ margin-left: 16px;
410
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23797d85' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
411
+ background-size: contain;
412
+ background-repeat: no-repeat;
413
+ transition: transform 0.2s var(--howdy-ease-out);
414
+ }
415
+
416
+ [open] > &::after {
417
+ transform: rotate(180deg);
418
+ }
419
+ }
420
+
421
+ .faq-answer {
422
+ padding-bottom: 16px;
423
+ font-size: 15px;
424
+ color: var(--howdy-text-secondary);
425
+ line-height: 1.6;
426
+ }
427
+
428
+ .sr-only {
429
+ position: absolute;
430
+ width: 1px;
431
+ height: 1px;
432
+ padding: 0;
433
+ margin: -1px;
434
+ overflow: hidden;
435
+ clip: rect(0, 0, 0, 0);
436
+ white-space: nowrap;
437
+ border: 0;
438
+ }
439
+
440
+ // Contact info
441
+ .contact-info {
442
+ display: flex;
443
+ flex-direction: column;
444
+ gap: var(--howdy-spacing-lg);
445
+
446
+ .contact-item {
447
+ display: flex;
448
+ flex-direction: column;
449
+ gap: var(--howdy-spacing-xs);
450
+
451
+ .contact-label {
452
+ @extend .small-text !optional;
453
+ color: var(--howdy-text-muted);
454
+ text-transform: uppercase;
455
+ letter-spacing: 1px;
456
+ }
457
+
458
+ .contact-value {
459
+ @extend .body-large !optional;
460
+ color: var(--howdy-text-primary);
461
+
462
+ a {
463
+ color: inherit;
464
+ text-decoration: none;
465
+
466
+ &:hover {
467
+ color: var(--howdy-accent-green);
468
+ }
469
+ }
470
+
471
+ .contact-arrow {
472
+ display: inline-block;
473
+ vertical-align: middle;
474
+ margin-left: 4px;
475
+ transition: transform 0.2s var(--howdy-ease-out);
476
+ }
477
+
478
+ a:hover .contact-arrow {
479
+ transform: translateX(2px);
480
+ }
481
+ }
482
+ }
483
+ }
484
+
485
+ // Dark mode toggle
486
+ .theme-toggle {
487
+ background: none;
488
+ border: 1px solid var(--howdy-border);
489
+ border-radius: var(--howdy-radius-full);
490
+ width: 44px;
491
+ height: 44px;
492
+ display: flex;
493
+ align-items: center;
494
+ justify-content: center;
495
+ cursor: pointer;
496
+ transition: var(--howdy-transition);
497
+ color: var(--howdy-text-primary);
498
+
499
+ &:hover {
500
+ border-color: var(--howdy-accent-green);
501
+ color: var(--howdy-accent-green);
502
+ }
503
+
504
+ svg {
505
+ width: 20px;
506
+ height: 20px;
507
+ }
508
+ }
509
+
510
+ // Social links
511
+ .social-links {
512
+ display: flex;
513
+ flex-wrap: wrap;
514
+ gap: var(--howdy-spacing-md);
515
+ margin-top: var(--howdy-spacing-lg);
516
+
517
+ a {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ width: 44px;
522
+ height: 44px;
523
+ color: var(--howdy-text-muted);
524
+ transition: var(--howdy-transition);
525
+
526
+ &:hover {
527
+ color: var(--howdy-accent-green);
528
+ }
529
+
530
+ svg {
531
+ width: 20px;
532
+ height: 20px;
533
+ }
534
+ }
535
+ }
536
+
537
+ // Table of contents
538
+ .toc {
539
+ margin: var(--howdy-spacing-md) 0 var(--howdy-spacing-lg);
540
+ padding: var(--howdy-spacing-md) var(--howdy-spacing-lg);
541
+ background-color: var(--howdy-bg-light-gray);
542
+ border-radius: var(--howdy-radius-md);
543
+ display: flex;
544
+ flex-direction: column;
545
+ gap: var(--howdy-spacing-sm);
546
+
547
+ .toc-title {
548
+ font-weight: 600;
549
+ font-size: 14px;
550
+ text-transform: uppercase;
551
+ letter-spacing: 0.05em;
552
+ color: var(--howdy-text-muted);
553
+ margin-bottom: var(--howdy-spacing-xs);
554
+ }
555
+
556
+ a {
557
+ color: var(--howdy-text-secondary);
558
+ text-decoration: none;
559
+ font-size: 14px;
560
+ font-weight: 500;
561
+ padding: 4px 0;
562
+ transition: var(--howdy-transition);
563
+
564
+ &:hover {
565
+ color: var(--howdy-accent-green);
566
+ }
567
+
568
+ &[style*="padding-left: 16px"],
569
+ &[style*="padding-left:16px"],
570
+ &[style*="padding-left: 24px"],
571
+ &[style*="padding-left:24px"],
572
+ &[style*="padding-left: 32px"],
573
+ &[style*="padding-left:32px"] {
574
+ &::before {
575
+ content: "– ";
576
+ color: var(--howdy-text-muted);
577
+ margin-right: 4px;
578
+ }
579
+ }
580
+ }
581
+
582
+ ul {
583
+ list-style: none;
584
+ margin: 0;
585
+ padding: 0;
586
+ display: flex;
587
+ flex-direction: column;
588
+ gap: var(--howdy-spacing-xs);
589
+
590
+ ul {
591
+ margin-top: var(--howdy-spacing-xs);
592
+ padding-left: 16px;
593
+ }
594
+ }
595
+ }
596
+
597
+ // Share buttons
598
+ .share-buttons {
599
+ display: flex;
600
+ align-items: center;
601
+ gap: var(--howdy-spacing-sm);
602
+ margin: var(--howdy-spacing-xl) 0;
603
+
604
+ .share-label {
605
+ font-size: 14px;
606
+ font-weight: 600;
607
+ color: var(--howdy-text-muted);
608
+ margin-right: var(--howdy-spacing-xs);
609
+ }
610
+
611
+ .share-btn {
612
+ display: inline-flex;
613
+ align-items: center;
614
+ justify-content: center;
615
+ width: 44px;
616
+ height: 44px;
617
+ border-radius: var(--howdy-radius-full);
618
+ border: 1px solid var(--howdy-border);
619
+ background: transparent;
620
+ color: var(--howdy-text-secondary);
621
+ cursor: pointer;
622
+ transition: var(--howdy-transition);
623
+ text-decoration: none;
624
+ padding: 0;
625
+
626
+ svg {
627
+ width: 16px;
628
+ height: 16px;
629
+ }
630
+
631
+ &:hover {
632
+ border-color: var(--howdy-accent-green);
633
+ color: var(--howdy-accent-green);
634
+ }
635
+ }
636
+ }
637
+
638
+ // Newsletter
639
+ .newsletter {
640
+ margin: var(--howdy-spacing-xl) 0;
641
+ padding: var(--howdy-spacing-lg);
642
+ background-color: var(--howdy-bg-green-tint);
643
+ border-radius: var(--howdy-radius-lg);
644
+
645
+ h3 {
646
+ margin: 0 0 var(--howdy-spacing-xs);
647
+ font-size: 18px;
648
+ font-weight: 600;
649
+ color: var(--howdy-text-primary);
650
+ }
651
+
652
+ p {
653
+ margin: 0 0 var(--howdy-spacing-md);
654
+ font-size: 14px;
655
+ color: var(--howdy-text-secondary);
656
+ }
657
+
658
+ .newsletter-form {
659
+ display: flex;
660
+ gap: var(--howdy-spacing-sm);
661
+
662
+ input[type="email"] {
663
+ flex: 1;
664
+ padding: 10px 16px;
665
+ border: 1px solid var(--howdy-border);
666
+ border-radius: var(--howdy-radius-full);
667
+ font-family: var(--howdy-font-primary);
668
+ font-size: 14px;
669
+ background-color: var(--howdy-bg-white);
670
+ color: var(--howdy-text-primary);
671
+ transition: var(--howdy-transition);
672
+ min-height: 44px;
673
+
674
+ &:focus-visible {
675
+ outline: 2px solid var(--howdy-accent-green);
676
+ outline-offset: 0;
677
+ border-color: var(--howdy-accent-green);
678
+ }
679
+ }
680
+
681
+ button {
682
+ padding: 10px 20px;
683
+ border: none;
684
+ border-radius: var(--howdy-radius-full);
685
+ background-color: var(--howdy-accent-green);
686
+ color: var(--howdy-bg-white);
687
+ font-family: var(--howdy-font-primary);
688
+ font-weight: 600;
689
+ font-size: 14px;
690
+ cursor: pointer;
691
+ transition: var(--howdy-transition);
692
+ min-height: 44px;
693
+
694
+ &:hover {
695
+ opacity: 0.9;
696
+ }
697
+ }
698
+
699
+ @media (max-width: $howdy-sm) {
700
+ flex-direction: column;
701
+ }
702
+ }
703
+ }
704
+
705
+ // Comments
706
+ .comments {
707
+ margin: var(--howdy-spacing-xl) 0;
708
+ padding-top: var(--howdy-spacing-lg);
709
+ border-top: 1px solid var(--howdy-border);
710
+ }
711
+
712
+ // About page
713
+ .about-intro {
714
+ margin-top: 12px;
715
+ color: var(--howdy-text-secondary);
716
+ max-width: 50ch;
717
+ }
718
+
719
+ .about-body {
720
+ color: var(--howdy-text-secondary);
721
+ max-width: 50ch;
722
+ }
723
+
724
+ .about-body-muted {
725
+ color: var(--howdy-text-muted);
726
+ max-width: 50ch;
727
+ }
728
+
729
+ .about-resume-wrapper {
730
+ margin-top: 24px;
731
+ }
732
+
733
+ .about-testimonials {
734
+ margin-top: 48px;
735
+
736
+ .about-testimonials-heading {
737
+ font-size: 14px;
738
+ font-weight: 600;
739
+ text-transform: uppercase;
740
+ letter-spacing: 0.08em;
741
+ color: var(--howdy-text-muted);
742
+ margin-bottom: 24px;
743
+ }
744
+
745
+ .about-testimonial {
746
+ margin-bottom: 24px;
747
+
748
+ .about-testimonial-quote {
749
+ margin-bottom: 4px;
750
+ }
751
+
752
+ .about-testimonial-attribution {
753
+ font-size: 14px;
754
+ color: var(--howdy-text-muted);
755
+ cite {
756
+ font-style: normal;
757
+ }
758
+ }
759
+ }
760
+ }
761
+
762
+ // Reading time badge
763
+ .detail-read-time {
764
+ font-size: 13px;
765
+ color: var(--howdy-text-muted);
766
+ font-weight: 500;
767
+ }