Skip to content

Commit 15006d9

Browse files
calderbuildclaude
andcommitted
perf: expand critical CSS for homepage components
- Add inline critical CSS for featured-section, core-topics, topic-tag - Convert Bootstrap and jason-blog.min.css to async loading - Prevent FOUC (Flash of Unstyled Content) for above-the-fold content - Target: reduce FCP from 4.8s to <2.5s Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 148942e commit 15006d9

File tree

1 file changed

+82
-4
lines changed

1 file changed

+82
-4
lines changed

_includes/head.html

Lines changed: 82 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,86 @@
175175
img{max-width:100%;height:auto;display:block}
176176
/* Font display */
177177
@font-face{font-family:'FontAwesome';font-display:swap}
178+
/* Homepage featured section - prevent FOUC */
179+
.featured-section{
180+
background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);
181+
border-radius:16px;
182+
padding:32px;
183+
margin-bottom:40px;
184+
position:relative;
185+
overflow:hidden;
186+
}
187+
@media(min-width:768px){.featured-section{padding:48px;border-radius:20px}}
188+
.featured-section__title{
189+
display:flex;
190+
align-items:center;
191+
gap:12px;
192+
color:#fff;
193+
font-size:24px;
194+
font-weight:700;
195+
margin-bottom:24px;
196+
}
197+
.featured-section__grid{
198+
display:grid;
199+
grid-template-columns:1fr;
200+
gap:20px;
201+
}
202+
@media(min-width:768px){.featured-section__grid{grid-template-columns:repeat(2,1fr);gap:24px}}
203+
.featured-card{
204+
background:rgba(255,255,255,0.95);
205+
backdrop-filter:blur(10px);
206+
border-radius:12px;
207+
padding:20px;
208+
border:1px solid rgba(255,255,255,0.2);
209+
}
210+
@media(min-width:768px){.featured-card{padding:24px;border-radius:16px}}
211+
.featured-card__title{font-size:18px;font-weight:600;color:#1f2937;margin:0 0 8px}
212+
.featured-card__excerpt{font-size:14px;color:#6b7280;margin:0 0 12px;line-height:1.5}
213+
.featured-card__meta{font-size:12px;color:#9ca3af}
214+
/* Core topics section */
215+
.core-topics{
216+
background:#fff;
217+
border-radius:16px;
218+
padding:24px;
219+
margin-bottom:32px;
220+
border:1px solid rgba(0,0,0,0.05);
221+
box-shadow:0 4px 20px rgba(0,0,0,0.06);
222+
}
223+
@media(min-width:768px){.core-topics{padding:32px}}
224+
.core-topics__header{
225+
display:flex;
226+
align-items:center;
227+
gap:10px;
228+
margin-bottom:20px;
229+
}
230+
.core-topics__title{font-size:20px;font-weight:700;color:#1f2937;margin:0}
231+
.core-topics__tags{display:flex;flex-wrap:wrap;gap:12px}
232+
/* Topic tags */
233+
.topic-tag{
234+
display:inline-flex;
235+
align-items:center;
236+
gap:8px;
237+
padding:10px 20px;
238+
border-radius:100px;
239+
font-size:14px;
240+
font-weight:500;
241+
text-decoration:none;
242+
transition:transform 0.2s,box-shadow 0.2s;
243+
}
244+
.topic-tag--ai{background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);color:#fff}
245+
.topic-tag--dev{background:linear-gradient(135deg,#11998e 0%,#38ef7d 100%);color:#fff}
246+
.topic-tag--product{background:linear-gradient(135deg,#f093fb 0%,#f5576c 100%);color:#fff}
247+
.topic-tag--career{background:linear-gradient(135deg,#4facfe 0%,#00f2fe 100%);color:#fff}
248+
.topic-tag--life{background:linear-gradient(135deg,#fa709a 0%,#fee140 100%);color:#fff}
249+
/* Animation visibility (no keyframes - just initial state) */
250+
.animate-on-scroll{opacity:1;transform:translateY(0)}
251+
.fade-in-up{opacity:1;transform:translateY(0)}
178252
</style>
179253

180-
<!-- Bootstrap CSS - MUST load synchronously for layout -->
181-
<link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}">
254+
<!-- Bootstrap CSS - Load async (critical grid styles already inlined above) -->
255+
<link rel="preload" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}" as="style">
256+
<link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;">
257+
<noscript><link rel="stylesheet" href="{{ "/css/bootstrap.min.css" | prepend: site.baseurl }}"></noscript>
182258

183259
<!-- Font Awesome - Async load (icons don't affect layout) -->
184260
<link rel="preload" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.6.3/css/font-awesome.min.css" as="style">
@@ -318,8 +394,10 @@
318394
}
319395
</script>
320396

321-
<!-- Custom Blog Styles - Synchronous to prevent CLS -->
322-
<link rel="stylesheet" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}">
397+
<!-- Custom Blog Styles - Load async (critical styles already inlined above) -->
398+
<link rel="preload" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}" as="style">
399+
<link rel="stylesheet" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;">
400+
<noscript><link rel="stylesheet" href="{{ "/css/jason-blog.min.css" | prepend: site.baseurl }}"></noscript>
323401

324402
<!-- Async tail styles (low priority, non-layout) -->
325403
<link rel="stylesheet" href="{{ "/css/async.css" | prepend: site.baseurl }}" media="print" onload="this.media='all';this.onload=null;">

0 commit comments

Comments
 (0)