/Users/russgoerend/Desktop/Portfolio HTMLs/Social Media Playbook.html

◆ Phase 2 · Content Creation

Content Creation

Create engaging content according to your calendar. Focus on quality, consistency, and audience value.

🎨 Content Creation Checklist

<input type="checkbox" id="con1" onchange="saveState();">Created content that aligns with brand voice

<input type="checkbox" id="con2" onchange="saveState();">Used high-quality visuals and graphics

<input type="checkbox" id="con3" onchange="saveState();">Included compelling captions and hashtags

<input type="checkbox" id="con4" onchange="saveState();">Optimized content for each platform's format

<input type="checkbox" id="con5" onchange="saveState();">Prepared content in advance for scheduled posting

◆ Phase 2 · Content Creation

Content Creation

Create engaging content according to your calendar. Focus on quality, consistency, and audience value.

📐 Platform Format Guide

Every platform has different technical requirements. Posting the wrong size or length is an easy mistake that makes professional work look amateur.

Instagram Feed Post — Square 1:1 (1080×1080) or portrait 4:5 (1080×1350). Captions up to 2,200 characters, but front-load the key message — only the first 1–2 lines show before "more."

Instagram Reel — Vertical 9:16 (1080×1920). Keep it 15–90 seconds for best performance. The hook in the first 3 seconds determines whether people keep watching. Many viewers watch without sound — use text overlays.

Instagram Story — Vertical 9:16 (1080×1920), 15 seconds. Disappears after 24 hours. Great for behind-the-scenes, polls, countdowns, and quick announcements.

TikTok — Vertical 9:16. The first 1–2 seconds are everything. If they don't hook, people scroll. Authenticity and energy beat professional polish on this platform.

Facebook Post — 1:1 or 4:5 images perform best. Keep captions concise — long text gets truncated. Works well for event promotion, link sharing, and community posts.

✍ Writing Captions That Work

A great visual with a weak caption loses engagement. A strong caption can make an average visual perform well.

Lead with the hook. The first sentence determines whether someone keeps reading. Ask a question, make a bold statement, or start with the most interesting thing. Don't start with the client's name.

Keep it scannable. Short paragraphs and line breaks. Dense walls of text get skipped.

End with a specific CTA. "Drop a comment," "Share this with someone who needs it," "Link in bio." Vague posts ("hope you enjoy!") drive no action.

Match the platform's tone. LinkedIn captions are more professional and narrative. TikTok captions can be minimal since the video does the work. Instagram sits in between.

🔖 Hashtag Strategy

Hashtags make your content discoverable to people who don't already follow the account. The goal is relevance, not volume.

Avoid only using giant hashtags. #Love has 2 billion posts — your content disappears in seconds. Go specific.

Use a mix of sizes. 2–3 broad hashtags (100K–1M posts), 5–8 mid-tier (10K–100K), 3–5 niche (under 10K). Niche hashtags reach a smaller but more targeted audience that's actually interested in your topic.

Research before you post. Tap on a hashtag to see how active it is and whether the content quality matches your brand. If the top posts don't look like your content, it's not the right hashtag.

Keep a hashtag bank. Save sets of relevant hashtags for each content pillar so you're not reinventing the list every time.

🎨 Content Creation Checklist

<input type="checkbox" id="con1" onchange="saveState();">Content aligns with brand voice and approved brief

<input type="checkbox" id="con2" onchange="saveState();">Visuals meet platform format and size requirements

<input type="checkbox" id="con3" onchange="saveState();">Captions have a hook, body, and specific CTA

<input type="checkbox" id="con4" onchange="saveState();">Hashtags researched and saved per content pillar

<input type="checkbox" id="con5" onchange="saveState();">Content batch-created and staged for scheduled posting


The file /Users/russgoerend/Desktop/Portfolio HTMLs/Social Media Playbook.html has been updated successfully. (file state is current in your context — no need to Read it back)

◆ Phase 2 · Content Creation

Content Creation

Create engaging content according to your calendar. Focus on quality, consistency, and audience value.

🎨 Content Creation Checklist

<input type="checkbox" id="con1" onchange="saveState();">Created content that aligns with brand voice

<input type="checkbox" id="con2" onchange="saveState();">Used high-quality visuals and graphics

<input type="checkbox" id="con3" onchange="saveState();">Included compelling captions and hashtags

<input type="checkbox" id="con4" onchange="saveState();">Optimized content for each platform's format

<input type="checkbox" id="con5" onchange="saveState();">Prepared content in advance for scheduled posting

◆ Phase 2 · Content Creation

Content Creation

Create engaging content according to your calendar. Focus on quality, consistency, and audience value.

📐 Platform Format Guide

Every platform has different technical requirements. Posting the wrong size or length is an easy mistake that makes professional work look amateur.

Instagram Feed Post — Square 1:1 (1080×1080) or portrait 4:5 (1080×1350). Captions up to 2,200 characters, but front-load the key message — only the first 1–2 lines show before "more."

Instagram Reel — Vertical 9:16 (1080×1920). Keep it 15–90 seconds for best performance. The hook in the first 3 seconds determines whether people keep watching. Many viewers watch without sound — use text overlays.

Instagram Story — Vertical 9:16 (1080×1920), 15 seconds. Disappears after 24 hours. Great for behind-the-scenes, polls, countdowns, and quick announcements.

TikTok — Vertical 9:16. The first 1–2 seconds are everything. If they don't hook, people scroll. Authenticity and energy beat professional polish on this platform.

Facebook Post — 1:1 or 4:5 images perform best. Keep captions concise — long text gets truncated. Works well for event promotion, link sharing, and community posts.

✍ Writing Captions That Work

A great visual with a weak caption loses engagement. A strong caption can make an average visual perform well.

Lead with the hook. The first sentence determines whether someone keeps reading. Ask a question, make a bold statement, or start with the most interesting thing. Don't start with the client's name.

Keep it scannable. Short paragraphs and line breaks. Dense walls of text get skipped.

End with a specific CTA. "Drop a comment," "Share this with someone who needs it," "Link in bio." Vague posts ("hope you enjoy!") drive no action.

Match the platform's tone. LinkedIn captions are more professional and narrative. TikTok captions can be minimal since the video does the work. Instagram sits in between.

🔖 Hashtag Strategy

Hashtags make your content discoverable to people who don't already follow the account. The goal is relevance, not volume.

Avoid only using giant hashtags. #Love has 2 billion posts — your content disappears in seconds. Go specific.

Use a mix of sizes. 2–3 broad hashtags (100K–1M posts), 5–8 mid-tier (10K–100K), 3–5 niche (under 10K). Niche hashtags reach a smaller but more targeted audience that's actually interested in your topic.

Research before you post. Tap on a hashtag to see how active it is and whether the content quality matches your brand. If the top posts don't look like your content, it's not the right hashtag.

Keep a hashtag bank. Save sets of relevant hashtags for each content pillar so you're not reinventing the list every time.

🎨 Content Creation Checklist

<input type="checkbox" id="con1" onchange="saveState();">Content aligns with brand voice and approved brief

<input type="checkbox" id="con2" onchange="saveState();">Visuals meet platform format and size requirements

<input type="checkbox" id="con3" onchange="saveState();">Captions have a hook, body, and specific CTA

<input type="checkbox" id="con4" onchange="saveState();">Hashtags researched and saved per content pillar

<input type="checkbox" id="con5" onchange="saveState();">Content batch-created and staged for scheduled posting

+
Every platform has different technical requirements. Posting the wrong size or length is an easy mistake that makes professional work look amateur.

+                    <ol class="how-to-list">

+
Instagram Feed Post — Square 1:1 (1080×1080) or portrait 4:5 (1080×1350). Captions up to 2,200 characters, but front-load the key message — only the first 1–2 lines show before "more."

+
Instagram Reel — Vertical 9:16 (1080×1920). Keep it 15–90 seconds for best performance. The hook in the first 3 seconds determines whether people keep watching. Many viewers watch without sound — use text overlays.

+
Instagram Story — Vertical 9:16 (1080×1920), 15 seconds. Disappears after 24 hours. Great for behind-the-scenes, polls, countdowns, and quick announcements.

+
TikTok — Vertical 9:16. The first 1–2 seconds are everything. If they don't hook, people scroll. Authenticity and energy beat professional polish on this platform.

+
Facebook Post — 1:1 or 4:5 images perform best. Keep captions concise — long text gets truncated. Works well for event promotion, link sharing, and community posts.

+
A great visual with a weak caption loses engagement. A strong caption can make an average visual perform well.

+
Lead with the hook. The first sentence determines whether someone keeps reading. Ask a question, make a bold statement, or start with the most interesting thing. Don't start with the client's name.

+
Keep it scannable. Short paragraphs and line breaks. Dense walls of text get skipped.

+
End with a specific CTA. "Drop a comment," "Share this with someone who needs it," "Link in bio." Vague posts ("hope you enjoy!") drive no action.

+
Match the platform's tone. LinkedIn captions are more professional and narrative. TikTok captions can be minimal since the video does the work. Instagram sits in between.

+
Hashtags make your content discoverable to people who don't already follow the account. The goal is relevance, not volume.

+
Avoid only using giant hashtags. #Love has 2 billion posts — your content disappears in seconds. Go specific.

+
Use a mix of sizes. 2–3 broad hashtags (100K–1M posts), 5–8 mid-tier (10K–100K), 3–5 niche (under 10K). Niche hashtags reach a smaller but more targeted audience that's actually interested in your topic.

+
Research before you post. Tap on a hashtag to see how active it is and whether the content quality matches your brand. If the top posts don't look like your content, it's not the right hashtag.

+
Keep a hashtag bank. Save sets of relevant hashtags for each content pillar so you're not reinventing the list every time.

-
<input type="checkbox" id="con1" onchange="saveState();">Created content that aligns with brand voice

-
<input type="checkbox" id="con2" onchange="saveState();">Used high-quality visuals and graphics

-
<input type="checkbox" id="con3" onchange="saveState();">Included compelling captions and hashtags

-
<input type="checkbox" id="con4" onchange="saveState();">Optimized content for each platform's format

-
<input type="checkbox" id="con5" onchange="saveState();">Prepared content in advance for scheduled posting

+
<input type="checkbox" id="con1" onchange="saveState();">Content aligns with brand voice and approved brief

+
<input type="checkbox" id="con2" onchange="saveState();">Visuals meet platform format and size requirements

+
<input type="checkbox" id="con3" onchange="saveState();">Captions have a hook, body, and specific CTA

+
<input type="checkbox" id="con4" onchange="saveState();">Hashtags researched and saved per content pillar

+
<input type="checkbox" id="con5" onchange="saveState();">Content batch-created and staged for scheduled posting


Love it. Please evaluate the Social Media Playbook to see if it also needs the type of stuff you just added to the Marketing playbook. And if it does need it, go ahead and do it.


Now expand the Publishing step:


Edit

/Users/russgoerend/Desktop/Portfolio HTMLs/Social Media Playbook.html

◆ Phase 3 · Publishing & Engagement

Publishing

Launch your content according to the calendar. Monitor initial performance and engagement.

🚀 Publishing Checklist

<input type="checkbox" id="pub1" onchange="saveState();">Posted content at optimal times for audience

<input type="checkbox" id="pub2" onchange="saveState();">Used appropriate hashtags and tags

<input type="checkbox" id="pub3" onchange="saveState();">Enabled analytics tracking

<input type="checkbox" id="pub4" onchange="saveState();">Cross-promoted content across platforms

<input type="checkbox" id="pub5" onchange="saveState();">Monitored initial engagement metrics

◆ Phase 3 · Publishing & Engagement

Publishing

Launch your content according to the calendar. The first hour after posting matters more than most people realize — here's what to do.

⏰ When to Post

Posting time affects how much the algorithm distributes your content. General starting-point guidelines:

Instagram: Tuesday–Friday, 9–11am or 5–7pm in your audience's time zone. Avoid posting late at night or early Monday morning.

TikTok: Tuesday–Thursday, 7–9am or 7–9pm. TikTok's algorithm is less sensitive to timing than Instagram's, but early engagement still matters.

Facebook: Wednesday 11am–1pm and Thursday–Friday 1–3pm tend to perform well. Evenings (7–9pm) also work for community-type posts.

The real answer: After a few weeks of posting, check the platform's native analytics for YOUR account's audience activity. Those numbers beat any general guideline.

🚀 The First Hour After Posting

Platforms measure early engagement to decide how broadly to distribute content. What you do in the first 60 minutes matters.

Reply to every comment immediately. Early comments signal to the algorithm that the post is generating conversation. Even a short, genuine reply helps.

Don't edit the post. Editing after posting resets the algorithm's distribution — the post essentially starts over. Proofread before you publish.

Share to Stories. On Instagram, sharing your new feed post to your Story immediately gives it a second push and puts it in front of followers who might have missed it.

Engage with similar content. Spending 10–15 minutes engaging with posts in your niche right after publishing can improve your account's visibility signal on the platform.

🚀 Publishing Checklist

<input type="checkbox" id="pub1" onchange="saveState();">Posted at an optimal time for the audience and platform

<input type="checkbox" id="pub2" onchange="saveState();">Hashtags and tags applied correctly

<input type="checkbox" id="pub3" onchange="saveState();">Shared to Stories (Instagram) or cross-promoted where relevant

<input type="checkbox" id="pub4" onchange="saveState();">Monitored and responded to first-hour comments

<input type="checkbox" id="pub5" onchange="saveState();">Analytics tracking confirmed active for this post


◆ Phase 3 · Publishing & Engagement

Publishing

Launch your content according to the calendar. Monitor initial performance and engagement.

🚀 Publishing Checklist

<input type="checkbox" id="pub1" onchange="saveState();">Posted content at optimal times for audience

<input type="checkbox" id="pub2" onchange="saveState();">Used appropriate hashtags and tags

<input type="checkbox" id="pub3" onchange="saveState();">Enabled analytics tracking

<input type="checkbox" id="pub4" onchange="saveState();">Cross-promoted content across platforms

<input type="checkbox" id="pub5" onchange="saveState();">Monitored initial engagement metrics

◆ Phase 3 · Publishing & Engagement

Publishing

Launch your content according to the calendar. The first hour after posting matters more than most people realize — here's what to do.

⏰ When to Post

Posting time affects how much the algorithm distributes your content. General starting-point guidelines:

Instagram: Tuesday–Friday, 9–11am or 5–7pm in your audience's time zone. Avoid posting late at night or early Monday morning.

TikTok: Tuesday–Thursday, 7–9am or 7–9pm. TikTok's algorithm is less sensitive to timing than Instagram's, but early engagement still matters.

Facebook: Wednesday 11am–1pm and Thursday–Friday 1–3pm tend to perform well. Evenings (7–9pm) also work for community-type posts.

The real answer: After a few weeks of posting, check the platform's native analytics for YOUR account's audience activity. Those numbers beat any general guideline.

🚀 The First Hour After Posting

Platforms measure early engagement to decide how broadly to distribute content. What you do in the first 60 minutes matters.

Reply to every comment immediately. Early comments signal to the algorithm that the post is generating conversation. Even a short, genuine reply helps.

Don't edit the post. Editing after posting resets the algorithm's distribution — the post essentially starts over. Proofread before you publish.

Share to Stories. On Instagram, sharing your new feed post to your Story immediately gives it a second push and puts it in front of followers who might have missed it.

Engage with similar content. Spending 10–15 minutes engaging with posts in your niche right after publishing can improve your account's visibility signal on the platform.

🚀 Publishing Checklist

<input type="checkbox" id="pub1" onchange="saveState();">Posted at an optimal time for the audience and platform

<input type="checkbox" id="pub2" onchange="saveState();">Hashtags and tags applied correctly

<input type="checkbox" id="pub3" onchange="saveState();">Shared to Stories (Instagram) or cross-promoted where relevant

<input type="checkbox" id="pub4" onchange="saveState();">Monitored and responded to first-hour comments

<input type="checkbox" id="pub5" onchange="saveState();">Analytics tracking confirmed active for this post

-
Launch your content according to the calendar. Monitor initial performance and engagement.

+
Launch your content according to the calendar. The first hour after posting matters more than most people realize — here's what to do.

+
Posting time affects how much the algorithm distributes your content. General starting-point guidelines:

+                    <ol class="how-to-list">

+
Instagram: Tuesday–Friday, 9–11am or 5–7pm in your audience's time zone. Avoid posting late at night or early Monday morning.

+
TikTok: Tuesday–Thursday, 7–9am or 7–9pm. TikTok's algorithm is less sensitive to timing than Instagram's, but early engagement still matters.

+
Facebook: Wednesday 11am–1pm and Thursday–Friday 1–3pm tend to perform well. Evenings (7–9pm) also work for community-type posts.

+
The real answer: After a few weeks of posting, check the platform's native analytics for YOUR account's audience activity. Those numbers beat any general guideline.

+
Platforms measure early engagement to decide how broadly to distribute content. What you do in the first 60 minutes matters.

+
Reply to every comment immediately. Early comments signal to the algorithm that the post is generating conversation. Even a short, genuine reply helps.

+
Don't edit the post. Editing after posting resets the algorithm's distribution — the post essentially starts over. Proofread before you publish.

+
Share to Stories. On Instagram, sharing your new feed post to your Story immediately gives it a second push and puts it in front of followers who might have missed it.

+
Engage with similar content. Spending 10–15 minutes engaging with posts in your niche right after publishing can improve your account's visibility signal on the platform.

-
<input type="checkbox" id="pub1" onchange="saveState();">Posted content at optimal times for audience

-
<input type="checkbox" id="pub2" onchange="saveState();">Used appropriate hashtags and tags

-
<input type="checkbox" id="pub3" onchange="saveState();">Enabled analytics tracking

-
<input type="checkbox" id="pub4" onchange="saveState();">Cross-promoted content across platforms

-
<input type="checkbox" id="pub5" onchange="saveState();">Monitored initial engagement metrics

+
<input type="checkbox" id="pub1" onchange="saveState();">Posted at an optimal time for the audience and platform

+
<input type="checkbox" id="pub2" onchange="saveState();">Hashtags and tags applied correctly

+
<input type="checkbox" id="pub3" onchange="saveState();">Shared to Stories (Instagram) or cross-promoted where relevant

+
<input type="checkbox" id="pub4" onchange="saveState();">Monitored and responded to first-hour comments

+
<input type="checkbox" id="pub5" onchange="saveState();">Analytics tracking confirmed active for this post


Finally, add a "What to Measure" card to the Performance Review checkpoint:


/Users/russgoerend/Desktop/Portfolio HTMLs/Social Media Playbook.html

◆ Phase 3 · Publishing & Engagement

Checkpoint: Performance Review

Review campaign performance with Maria & Kayt. Analyze metrics and plan for future improvements.

◆ Phase 3 · Publishing & Engagement

Checkpoint: Performance Review

Review campaign performance with Maria & Kayt. Before the meeting, pull your numbers and know what they mean — don't show up with a raw screenshot.

📊 What to Measure — and What It Means

Pull these metrics from each platform's native analytics before your checkpoint meeting.

Reach — How many unique people saw the content? Compare to the previous campaign or the account's average. Growth here means you're expanding your audience.

Engagement Rate — (Likes + Comments + Shares + Saves) ÷ Reach × 100. Above 3% is solid on Instagram. Below 1% is a signal that content isn't resonating. Saves are especially valuable — they mean someone found the content worth keeping.

Top Performing Post — Which post got the most engagement or reach? What made it different — format, topic, caption style, timing? Document this so you can repeat it.

Follower Growth — Did the campaign grow the account? Net new followers during the campaign period shows whether content attracted new people, not just engaged existing ones.

Story Views / Completion Rate — For Stories, what percentage of viewers watched all the way through? High drop-off early usually means the hook wasn't strong enough.

Link Clicks / Profile Visits — If the goal was to drive traffic (to a website, sign-up form, or event page), this is your most important metric. Engagement without clicks means people liked the content but didn't act on it.


◆ Phase 3 · Publishing & Engagement

Checkpoint: Performance Review

Review campaign performance with Maria & Kayt. Analyze metrics and plan for future improvements.

◆ Phase 3 · Publishing & Engagement

Checkpoint: Performance Review

Review campaign performance with Maria & Kayt. Before the meeting, pull your numbers and know what they mean — don't show up with a raw screenshot.

📊 What to Measure — and What It Means

Pull these metrics from each platform's native analytics before your checkpoint meeting.

Reach — How many unique people saw the content? Compare to the previous campaign or the account's average. Growth here means you're expanding your audience.

Engagement Rate — (Likes + Comments + Shares + Saves) ÷ Reach × 100. Above 3% is solid on Instagram. Below 1% is a signal that content isn't resonating. Saves are especially valuable — they mean someone found the content worth keeping.

Top Performing Post — Which post got the most engagement or reach? What made it different — format, topic, caption style, timing? Document this so you can repeat it.

Follower Growth — Did the campaign grow the account? Net new followers during the campaign period shows whether content attracted new people, not just engaged existing ones.

Story Views / Completion Rate — For Stories, what percentage of viewers watched all the way through? High drop-off early usually means the hook wasn't strong enough.

Link Clicks / Profile Visits — If the goal was to drive traffic (to a website, sign-up form, or event page), this is your most important metric. Engagement without clicks means people liked the content but didn't act on it.

-
Review campaign performance with Maria & Kayt. Analyze metrics and plan for future improvements.

+
Review campaign performance with Maria & Kayt. Before the meeting, pull your numbers and know what they mean — don't show up with a raw screenshot.

+
Pull these metrics from each platform's native analytics before your checkpoint meeting.

+
Reach — How many unique people saw the content? Compare to the previous campaign or the account's average. Growth here means you're expanding your audience.

+
Engagement Rate — (Likes + Comments + Shares + Saves) ÷ Reach × 100. Above 3% is solid on Instagram. Below 1% is a signal that content isn't resonating. Saves are especially valuable — they mean someone found the content worth keeping.

+
Top Performing Post — Which post got the most engagement or reach? What made it different — format, topic, caption style, timing? Document this so you can repeat it.

+
Follower Growth — Did the campaign grow the account? Net new followers during the campaign period shows whether content attracted new people, not just engaged existing ones.

+
Story Views / Completion Rate — For Stories, what percentage of viewers watched all the way through? High drop-off early usually means the hook wasn't strong enough.

+
Link Clicks / Profile Visits — If the goal was to drive traffic (to a website, sign-up form, or event page), this is your most important metric. Engagement without clicks means people liked the content but didn't act on it.


Quick verification:


Bash

grep -n "step-orientation\|nav-orientation\|glossary-term\|how-to-list\|platform-grid\|STEPS\s*=" "/Users/russgoerend/Desktop/Portfolio HTMLs/Social Media Playbook.html"

Verify all changes landed correctly


358:        .glossary-term { font-weight: 800; color: #500778; }
361:        .how-to-list { list-style: none; padding: 0; margin: 10px 0 0 0; counter-reset: how-to; }
362:        .how-to-list li { counter-increment: how-to; display: flex; gap: 14px; align-items: flex-start; padding: 10px 0; border-bottom: 1px solid #F3F4F6; font-size: 0.92rem; line-height: 1.5; color: #374151; }
363:        .how-to-list li:last-child { border-bottom: none; }
364:        .how-to-list li::before { content: counter(how-to); background: #500778; color: white; border-radius: 50%; width: 22px; height: 22px; display: flex; align-items: center; justify-content: center; font-size: 0.72rem; font-weight: 800; flex-shrink: 0; margin-top: 1px; }
365:        .platform-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-top: 10px; }
369:        @media (max-width: 680px) { .platform-grid { grid-template-columns: 1fr; } }
709:                <button class="step-btn active" id="nav-orientation" onclick="goTo('orientation')">
798:

811:
Reach — The number of unique people who saw your content. If 500 different people saw a post, the reach is 500. This is your primary measure of how many people your content touched.

812:
Impressions — Total number of times your content was displayed, including repeat views. One person seeing a post 3 times = 3 impressions but 1 reach. High impressions with low reach means you're showing content to the same people repeatedly.

813:
Engagement Rate — Percentage of people who interacted with content (likes, comments, shares, saves) out of those who saw it. Formula: Engagements ÷ Reach × 100. Above 3% is considered strong on most platforms.

814:
Organic — Content that reaches people through the algorithm without paid promotion. Your regular posts are organic. Organic reach has declined on most platforms over the last several years, which is why strategy matters more than ever.

815:
Paid / Boosted — Content you pay to show to a broader or more targeted audience. Boosting a post can significantly expand reach but requires a budget and a clear goal.

816:
Content Pillars — The 3–5 recurring themes your account posts about consistently. Example pillars: Behind the Scenes, Education, Client Stories, Community Highlights, Promotion. Pillars keep an account cohesive and make planning easier.

817:
CTA (Call to Action) — The specific action you want the audience to take: "Click the link in bio," "Share this with someone," "Comment below." Every post should have one. Vague posts get vague results.

818:
Algorithm — The platform's system for deciding which content to show which users. On Instagram, saves and shares signal the algorithm to push content to more people. On TikTok, watch time and replays matter most. Understanding what each platform rewards helps you create content that actually gets seen.

819:
UGC (User-Generated Content) — Content created by your audience or community, not by you. Reposting a customer photo or a student's story is UGC. It builds community and trust because it's not the brand talking about itself.

820:
Hashtag — A keyword preceded by # that makes content discoverable. Using very popular hashtags (#love, #instagood) means your post gets buried instantly. A mix of mid-sized and niche-specific hashtags typically reaches a more relevant audience.

825:

1187:

1199:

1210:

1277:

1288:

1345:
Reach — How many unique people saw the content? Compare to the previous campaign or the account's average. Growth here means you're expanding your audience.

1346:
Engagement Rate — (Likes + Comments + Shares + Saves) ÷ Reach × 100. Above 3% is solid on Instagram. Below 1% is a signal that content isn't resonating. Saves are especially valuable — they mean someone found the content worth keeping.

1347:
Top Performing Post — Which post got the most engagement or reach? What made it different — format, topic, caption style, timing? Document this so you can repeat it.

1348:
Follower Growth — Did the campaign grow the account? Net new followers during the campaign period shows whether content attracted new people, not just engaged existing ones.

1349:
Story Views / Completion Rate — For Stories, what percentage of viewers watched all the way through? High drop-off early usually means the hook wasn't strong enough.

1350:
Link Clicks / Profile Visits — If the goal was to drive traffic (to a website, sign-up form, or event page), this is your most important metric. Engagement without clicks means people liked the content but didn't act on it.

1475:        const STEPS = ['orientation','setup','discovery','brief','cp1a','audience','calendar','cp1','cp2a','content','cp2','publish','engage','cp3','review'];


All clean. Here's a summary of what changed and why for each addition:

**Phase 0 — "Before You Start"** (same treatment as Marketing Analytics)
- Reframes the work: professional social media ≠ personal posting
- 10-term glossary: Reach, Impressions, Engagement Rate, Organic, Paid, Content Pillars, CTA, Algorithm, UGC, Hashtag
- Platform grid: Instagram, TikTok, Facebook, LinkedIn — what each is actually for
- Also fixed a bug: `.callout-yellow` and `.callout-blue` were used throughout but not defined in CSS, so they were all rendering green

**Content Creation** — went from a 5-item checklist to three teaching cards:
- Platform format guide (exact dimensions and lengths for each platform)
- Caption writing framework (hook → body → CTA)
- Hashtag strategy (mixing sizes, researching relevance)

**Publishing** — went from a checklist to actual guidance:
- General posting time benchmarks by platform, with the honest note that native analytics beats any guideline
- First-hour playbook (respond fast, don't edit, share to Stories, engage nearby content)

**Performance Review checkpoint** — added a "What to Measure" card defining Reach, Engagement Rate, Top Post, Follower Growth, Story Completion Rate, and Link Clicks — so students arrive to the mentor meeting knowing their numbers, not just holding a screenshot.


<ide_opened_file>The user opened the file /Users/russgoerend/Desktop/Portfolio HTMLs/Standard3.html in the IDE. This may or may not be related to the current task.</ide_opened_file>

Great work.

Now, I've pulled up Standard3. Could you redesign Standard3 to use the sidebar navigation UI/UX from the playbooks?

I don't want to lose *any* of the content of Standard3. I really like how it flows right now. I just want to mirror the sidebar from the playbooks.


The user wants me to redesign Standard3.html to use the sidebar navigation UI/UX from the playbooks, while preserving all content. Let me first read Standard3.html to understand its current structure and content, then look at one of the playbooks for reference on the sidebar pattern.


Let me read Standard3 in full first, then reference the sidebar pattern from the playbooks.


wc -l "/Users/russgoerend/Desktop/Portfolio HTMLs/Standard3.html"

Get line count of Standard3


477 /Users/russgoerend/Desktop/Portfolio HTMLs/Standard3.html


1	<!DOCTYPE html>
2
3
4	    <meta charset="UTF-8">
5	    <meta name="viewport" content="width=device-width, initial-scale=1.0">
6	    <title>Waukee APEX Career Launchpad</title>
7	    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
8
156
157
158
159
160

161
162
163
164

165	            Dashboard
166	            S1
167	            S2
168	            S3
169	            S4
170	            S5
171

172

173
174
175

176
177
Waukee APEXCareer Launchpad

178	        <button onclick="showSection('discovery')" id="btn-discovery" class="active">1. Discovery</button>
179	        <button onclick="showSection('thesis')" id="btn-thesis">2. Career Thesis</button>
180	        <button onclick="showSection('research')" id="btn-research">3. Deep Dive</button>
181	        <button onclick="showSection('outreach')" id="btn-outreach">4. Local Connections</button>
182
<button class="btn-reset" onclick="clearData()">Clear All Data</button>

183
184
185
186

187
Phase 1: Discovery

188
189

190

1. Self-Discovery

Map your Work Values, Activity Interests, and Skill Levels. Reflection here is the fuel for the rest of the process.

191

2. AI Synthesis

Translate your DNA into 10-15 specific career paths using deep-linked AI prompts. Refine these results with Russ.

192

3. Career Deep Dive

Validate your ideas by researching "Day-in-the-Life" profiles and macro industry trends for your top choices.

193

4. Making Connections

Move from theory to reality by finding 5 local professionals in Des Moines for shadows or interviews.

194

195
196

197
❤ Work Values

198
Identify the core motivations that drive your career satisfaction. What matters most to you in a job? (Select up to 3)

199

200	                <textarea id="ref-values" rows="2" placeholder="Why did you choose these top 3 values? Give an example of why they matter to you." oninput="autoSave()"></textarea>
201

202
203

204
🎨 Activity Interests

205
Think about the types of tasks you genuinely enjoy doing. What activities leave you feeling energized rather than drained? (Select up to 3)

206

207	                <textarea id="ref-interests" rows="2" placeholder="Describe a time when you felt energized doing one of these activities." oninput="autoSave()"></textarea>
208

209
210

211
🛠 Skills Confidence

212
Assess your current comfort level with essential professional skills. Honesty here helps identify growth opportunities.

213

214	                <textarea id="ref-skills" rows="3" placeholder="Highlight one 'High' and one 'Low' growth area. Why are you confident in your strengths?" oninput="autoSave()"></textarea>
215

216
217

218	                🚀
219
Next Step: We will take your values, skills, and reflections above and put them into a Career Consultation AI prompt in Phase 2. This turns your personal data into a list of real-world career matches.

220

221
222

223	                <button class="btn-action btn-purple" style="background: #3b82f6;" onclick="showSection('thesis')">GENERATE CAREER THESIS</button>
224

225

226
227

228
Phase 2: Career Thesis

229
230

231	                📩
232
Ready to Synthesize: Your selections and reflections from Phase 1 are ready to be added to the AI Career Consultant prompt below.

233

234
235

236
Step A: The AI Consultant

237
Click below to build the custom DNA prompt for ChatGPT.

238	                <button class="btn-action btn-gold" onclick="generateDetailedPrompt()">BUILD AI PROMPT</button>
239

240

241	                    <button class="btn-action btn-purple" onclick="copyAndOpen()">CLICK HERE TO AUTO-FILL CHATGPT & START YOUR CONSULTATION</button>
242

243

244
245

246	                🤝
247
Checkpoint: Reflect with Russ
Sit down with Russ to discuss which 2-3 job titles from your AI results actually "click" before starting research.

248

249
250

251
Coming Up in Phase 3: You will transform those job titles into a "Day-in-the-Life" profile and an Industry Deep Dive.

252	                <button class="btn-action btn-gold" style="background: #ef4444; color: white;" onclick="showSection('research')">START DEEP DIVE RESEARCH</button>
253

254

255
256

257
Phase 3: Deep Dive

258
259

260	                🔍
261
Reality Check: Use LinkedIn, news articles, or professional association sites to see what the daily tasks and tools look like for your chosen role.

262

263
264

265
Deliverable 1: Day-in-the-Life Profile

266
Open a New Google Doc. Create a snapshot of actual tasks, tools, and challenges.

267	                <button class="btn-toggle" onclick="toggleEx('ex-profile')">Show/Hide Deeper Example</button>
268

269	                    Software Engineer Day-in-the-Life:
270
Morning
 8:30 AM: Coffee and "Stand-up" meeting. Team discusses what we coded yesterday and bugs we found.
271
Mid Day
 10:30 AM - 2:00 PM: "Deep Work" session. Writing code for a new login screen.
272
Afternoon
 3:00 PM: Pair programming. Working with a senior dev to find why the app is crashing on iPhones.
273
Tools
 VS Code, GitHub, Jira, Slack.
274
Challenges
 Dealing with "Legacy Code" (old code someone else wrote) and meeting tight sprint deadlines.
275

276

277
278

279
Deliverable 2: Industry Deep Dive

280
Open a New Google Doc. Research a major trend changing this specific field.

281	                <button class="btn-toggle" onclick="toggleEx('ex-dive')">Show/Hide Deeper Example</button>
282

283	                    Trend: AI in Healthcare Diagnostics
284
The Trend
 AI models are now analyzing 10,000+ X-rays per minute to flag potential pneumonia before a doctor even sees them.
285
The Impact
 Radiologists spend less time "scanning" and more time consulting with patients on complex cases.
286
The Future Skill
 You don't just need to know medicine; you need to know how to "verify" and "audit" the AI's suggestions to ensure they are accurate.
287
Tools
 EHR Systems, AI-imaging software, Data visualization dashboards.
288

289

290
291

292	                🤝
293
Checkpoint: Reflect with Russ
Share your Google Docs with Russ. Discuss the "Challenges" you found—is this still a path you want to pursue?

294

295
296	            <button class="btn-action btn-gold" style="background: #8bc34a; color: white;" onclick="showSection('outreach')">FIND LOCAL CONNECTIONS</button>
297

298
299

300
Phase 4: Local Connections

301
302

303	                🤝
304
Making it Real: Research is great, but talking to humans is better. Use LinkedIn or the Waukee Chamber to find local pros.

305

306
307

308
🔍 Local Networking List

309

310

Name	Company	Notes/Role

311

312
<input type="text" placeholder="Name...">	<input type="text" placeholder="Company...">	<input type="text" placeholder="Notes/Role...">

313
<input type="text">	<input type="text">	<input type="text">

314
<input type="text">	<input type="text">	<input type="text">

315

316

317

318
319

320	                🤝
321
Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

322

323

324
325

326
327
477
478

<!DOCTYPE html>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Waukee APEX Career Launchpad</title>
    <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">

            Dashboard
            S1
            S2
            S3
            S4
            S5

Waukee APEXCareer Launchpad

        <button onclick="showSection('discovery')" id="btn-discovery" class="active">1. Discovery</button>
        <button onclick="showSection('thesis')" id="btn-thesis">2. Career Thesis</button>
        <button onclick="showSection('research')" id="btn-research">3. Deep Dive</button>
        <button onclick="showSection('outreach')" id="btn-outreach">4. Local Connections</button>

<button class="btn-reset" onclick="clearData()">Clear All Data</button>

Phase 1: Discovery

1. Self-Discovery

Map your Work Values, Activity Interests, and Skill Levels. Reflection here is the fuel for the rest of the process.

2. AI Synthesis

Translate your DNA into 10-15 specific career paths using deep-linked AI prompts. Refine these results with Russ.

3. Career Deep Dive

Validate your ideas by researching "Day-in-the-Life" profiles and macro industry trends for your top choices.

4. Making Connections

Move from theory to reality by finding 5 local professionals in Des Moines for shadows or interviews.

❤ Work Values

Identify the core motivations that drive your career satisfaction. What matters most to you in a job? (Select up to 3)

                <textarea id="ref-values" rows="2" placeholder="Why did you choose these top 3 values? Give an example of why they matter to you." oninput="autoSave()"></textarea>

🎨 Activity Interests

Think about the types of tasks you genuinely enjoy doing. What activities leave you feeling energized rather than drained? (Select up to 3)

                <textarea id="ref-interests" rows="2" placeholder="Describe a time when you felt energized doing one of these activities." oninput="autoSave()"></textarea>

🛠 Skills Confidence

Assess your current comfort level with essential professional skills. Honesty here helps identify growth opportunities.

                <textarea id="ref-skills" rows="3" placeholder="Highlight one 'High' and one 'Low' growth area. Why are you confident in your strengths?" oninput="autoSave()"></textarea>

                🚀

Next Step: We will take your values, skills, and reflections above and put them into a Career Consultation AI prompt in Phase 2. This turns your personal data into a list of real-world career matches.

                <button class="btn-action btn-purple" style="background: #3b82f6;" onclick="showSection('thesis')">GENERATE CAREER THESIS</button>

Phase 2: Career Thesis

                📩

Ready to Synthesize: Your selections and reflections from Phase 1 are ready to be added to the AI Career Consultant prompt below.

Step A: The AI Consultant

Click below to build the custom DNA prompt for ChatGPT.

                <button class="btn-action btn-gold" onclick="generateDetailedPrompt()">BUILD AI PROMPT</button>

                    <button class="btn-action btn-purple" onclick="copyAndOpen()">CLICK HERE TO AUTO-FILL CHATGPT & START YOUR CONSULTATION</button>

                🤝

Checkpoint: Reflect with Russ
Sit down with Russ to discuss which 2-3 job titles from your AI results actually "click" before starting research.

Coming Up in Phase 3: You will transform those job titles into a "Day-in-the-Life" profile and an Industry Deep Dive.

                <button class="btn-action btn-gold" style="background: #ef4444; color: white;" onclick="showSection('research')">START DEEP DIVE RESEARCH</button>

Phase 3: Deep Dive

                🔍

Reality Check: Use LinkedIn, news articles, or professional association sites to see what the daily tasks and tools look like for your chosen role.

Deliverable 1: Day-in-the-Life Profile

Open a New Google Doc. Create a snapshot of actual tasks, tools, and challenges.

                <button class="btn-toggle" onclick="toggleEx('ex-profile')">Show/Hide Deeper Example</button>

                    Software Engineer Day-in-the-Life:

Morning
 8:30 AM: Coffee and "Stand-up" meeting. Team discusses what we coded yesterday and bugs we found.

Mid Day
 10:30 AM - 2:00 PM: "Deep Work" session. Writing code for a new login screen.

Afternoon
 3:00 PM: Pair programming. Working with a senior dev to find why the app is crashing on iPhones.

Tools
 VS Code, GitHub, Jira, Slack.

Challenges
 Dealing with "Legacy Code" (old code someone else wrote) and meeting tight sprint deadlines.

Deliverable 2: Industry Deep Dive

Open a New Google Doc. Research a major trend changing this specific field.

                <button class="btn-toggle" onclick="toggleEx('ex-dive')">Show/Hide Deeper Example</button>

                    Trend: AI in Healthcare Diagnostics

The Trend
 AI models are now analyzing 10,000+ X-rays per minute to flag potential pneumonia before a doctor even sees them.

The Impact
 Radiologists spend less time "scanning" and more time consulting with patients on complex cases.

The Future Skill
 You don't just need to know medicine; you need to know how to "verify" and "audit" the AI's suggestions to ensure they are accurate.

Tools
 EHR Systems, AI-imaging software, Data visualization dashboards.

                🤝

Checkpoint: Reflect with Russ
Share your Google Docs with Russ. Discuss the "Challenges" you found—is this still a path you want to pursue?

            <button class="btn-action btn-gold" style="background: #8bc34a; color: white;" onclick="showSection('outreach')">FIND LOCAL CONNECTIONS</button>

Phase 4: Local Connections

                🤝

Making it Real: Research is great, but talking to humans is better. Use LinkedIn or the Waukee Chamber to find local pros.

🔍 Local Networking List

Name	Company	Notes/Role

<input type="text" placeholder="Name...">	<input type="text" placeholder="Company...">	<input type="text" placeholder="Notes/Role...">

<input type="text">	<input type="text">	<input type="text">

<input type="text">	<input type="text">	<input type="text">

                🤝

Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.


Great work.   Now, I've pulled up Standard3. Could you redesign Standard3 to use the sidebar navigation UI/UX from the playbooks?   I don't want to lose *any* of the content of Standard3. I really lik…


Now I have a full picture of Standard3.html. Let me understand:

**Current structure:**
- Navy sidebar (dark blue `#0A192F`) with simple text buttons
- 4 sections: Discovery, Career Thesis, Deep Dive, Local Connections
- Each section has cards, callouts, forms, etc.
- Sidebar nav: dark background, colored text, border-left active indicator

**Playbook sidebar pattern (from Video/Social Media/Marketing Analytics):**
- White background sidebar
- Purple (`#500778`) header text
- Project manager (dropdown + buttons) — NOT needed here since Standard3 doesn't have projects

- Progress bar with phase groups and colored phase labels, step buttons with circular checkboxes, and a sticky sidebar that scrolls independently with a task board button at the footer

I need to figure out how to adapt the playbook's progress tracking and phase structure to Standard3's dark sidebar and four-step navigation system, keeping the visual hierarchy but respecting the existing color scheme and interaction patterns. boxes/completion state tracking (no "done" state per section)
5. No project manager needed

**What to mirror from the playbooks:**
- White sidebar background
- `sidebar-header` with title
- Phase group labels
- `step-btn` style (with or without step-check circles)
- Purple accent colors matching the brand
- Sticky positioning
- Progress tracking (could add simple completion tracking)

**What to keep from Standard3:**
- All content exactly as-is
- The `showSection()` navigation logic (just need to rename the CSS selectors to match)
- localStorage save/load
- All the interactive elements (pills, skills rating, textarea, etc.)

**My approach:**
1. Replace the CSS for the sidebar to match the playbook style (white bg, phase groups, step-btn style)
2. Update the sidebar HTML to use the new structure with phase group divs and step-btn buttons with step-check circles
3. Add progress tracking (mark sections as visited/complete) — this would be a nice addition that fits the playbook pattern
4. Keep all main content completely unchanged
5. Update JavaScript to handle the new sidebar structure (update active state on nav buttons correctly)

Now I'm mapping the Standard3 sections into the playbook's phase structure. I'll organize the four sections as Discovery, Career Synthesis, Research, and then a final phase, each with their corresponding step buttons and completion indicators. The sidebar will have that clean white background with phase groupings and the purple accent styling, while the core navigation and content logic stays exactly the same. I'm deciding between keeping it simple with just visual visited states using localStorage, or adding explicit completion tracking — the playbooks do have completion state with checkmarks, so I'll add basic visited tracking to the sidebar without changing the content flow. Now I'm planning the CSS and HTML changes: I'll swap out the sidebar navigation styles for the playbook pattern with phase groups and step buttons, keep the main content untouched, and restructure the sidebar HTML to match the new layout.

For the sidebar header, I'll display "Standard 3" with the subtitle "Critical Thinking & Problem Solving" and show progress as "X of 4 phases complete" instead of including a project manager section. Each phase gets its own group with labeled step buttons for the sections.

Building the sidebar structure... Writing sidebar styles... Still writing styles... Writing the reset button styles and sidebar structure... Building the phase navigation interface... Still writing the progress tracking... I'm implementing the save and load functions to persist the visited sections in localStorage alongside the existing data, then I'll update the sidebar CSS, HTML, and the showSection function to tie everything together. Adjusting the app-shell CSS to use `position: sticky` on the sidebar instead of `overflow: hidden`, which lets the main content scroll naturally while keeping the sidebar fixed at the top offset. I'm comparing the current Standard3 layout structure with the playbook approach — the key difference is switching from overflow-hidden on app-shell to using sticky positioning on the sidebar with body padding instead. Let me update the CSS to match the playbook pattern and see how the scroll behavior changes.

Now I need to make the actual edits across CSS, HTML, and JavaScript. I'll start by replacing the sidebar navigation styles and updating the body/app-shell rules, then move on to the HTML structure and the JavaScript functions that handle section visibility and progress tracking. I'm reviewing the current CSS structure more carefully — the app-shell already has the right flex layout with fixed height and overflow hidden, so I can keep that as-is and just swap out the sidebar-nav styles for the new sidebar implementation.

But wait, sticky positioning won't work inside an overflow-hidden container since it needs a scrolling ancestor, so I'll need to adjust the app-shell to use normal overflow and add padding-top to the body instead. Then I can keep main's flex-grow and padding, remove the overflow-y since the body will handle scrolling, and leave the section styles unchanged.

Actually, I'll keep overflow-y on main just to be safe. Now let me think through the exact CSS changes I need to make—I'll update the body with padding-top, change app-shell to use flex with min-height instead of height and overflow, give the sidebar sticky positioning with its own overflow-y, and keep main flexible with padding. Still writing sidebar styles... I'm organizing the CSS edits into two main changes—one for the body and app-shell styling, another for the sidebar—then moving on to update the HTML structure and JavaScript functions. I need to make sure the `showSection()` function targets the right button class and that the heading styles work with the new layout.

One thing to watch: removing `overflow-y: auto` from the main element since the body will handle scrolling now, which prevents conflicting scroll behaviors.


I have everything I need. Standard3 currently has a dark navy sidebar that's completely custom. I'll replace just the sidebar structure and CSS to match the playbook style — white background, phase groups, step-check circles, progress bar — while leaving every line of main content untouched.

The four sections map cleanly to four phase groups. I'll also wire up visited-state tracking so the progress bar fills as students move through the phases.


Edit

        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; }

        .app-shell { display: flex; height: calc(100vh - var(--nav-height)); overflow: hidden; margin-top: var(--nav-height); }

        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; padding-top: var(--nav-height); }

        .app-shell { display: flex; min-height: calc(100vh - var(--nav-height)); }


The file /Users/russgoerend/Desktop/Portfolio HTMLs/Standard3.html has been updated successfully. (file state is current in your context — no need to Read it back)

        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; }

        .app-shell { display: flex; height: calc(100vh - var(--nav-height)); overflow: hidden; margin-top: var(--nav-height); }

        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; padding-top: var(--nav-height); }

        .app-shell { display: flex; min-height: calc(100vh - var(--nav-height)); }

-        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; }

+        body { font-family: 'Inter', sans-serif; margin: 0; background-color: var(--light-bg); color: #333; padding-top: var(--nav-height); }

-        .app-shell { display: flex; height: calc(100vh - var(--nav-height)); overflow: hidden; margin-top: var(--nav-height); }

+        .app-shell { display: flex; min-height: calc(100vh - var(--nav-height)); }


        /* Sidebar Navigation */
        .sidebar-nav { width: 280px; background: var(--apex-navy); color: white; display: flex; flex-direction: column; padding: 40px 0; flex-shrink: 0; box-shadow: 4px 0 15px rgba(0,0,0,0.2); }
        .sidebar-nav h1 { padding: 0 30px; font-size: 1.4rem; margin-bottom: 50px; line-height: 1.2; }
        .sidebar-nav h1 span { color: var(--waukee-gold); font-weight: 800; text-transform: uppercase; font-size: 0.85rem; display: block; margin-bottom: 5px; }
        .sidebar-nav button { background: none; border: none; color: rgba(255,255,255,0.6); padding: 18px 30px; text-align: left; font-size: 1rem; cursor: pointer; transition: 0.3s; border-left: 5px solid transparent; font-weight: 500; }
        .sidebar-nav button.active { color: white; background: rgba(255,255,255,0.1); border-left: 5px solid var(--waukee-gold); font-weight: 700; }
        .nav-footer { margin-top: auto; padding: 20px; }
        .btn-reset { color: #ffab91; background: none; border: 1px solid #ffab91; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 0.8rem; width: 100%; }

        /* Main Content */
        main { flex-grow: 1; padding: 60px; overflow-y: auto; }

        /* ── SIDEBAR ── */
        .sidebar {
            width: 280px;
            min-width: 280px;
            background: white;
            border-right: 1px solid #E5E7EB;
            position: sticky;
            top: var(--nav-height);
            height: calc(100vh - var(--nav-height));
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            flex-shrink: 0;
        }
        .sidebar-header { padding: 20px 18px 16px; border-bottom: 1px solid #E5E7EB; }
        .sidebar-std-label { font-size: 0.68rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; color: #6B7280; margin-bottom: 4px; }
        .sidebar-std-title { font-size: 1rem; font-weight: 800; color: var(--primary); line-height: 1.3; margin-bottom: 14px; }
        .progress-bar-wrap { background: #E5E7EB; border-radius: 4px; height: 6px; overflow: hidden; margin-bottom: 6px; }
        .progress-bar-fill { height: 100%; background: var(--secondary); border-radius: 4px; transition: width 0.4s; }
        .progress-label { font-size: 0.72rem; color: #6B7280; }
        .phase-group { padding: 8px 0; border-bottom: 1px solid #F3F4F6; }
        .sidebar-phase-label {
            font-size: 0.68rem;
            font-weight: 800;
            text-transform: uppercase;
            letter-spacing: 0.1em;
            padding: 6px 18px 4px;
            color: var(--primary);
            display: block;
            opacity: 0.6;
        }
        .step-btn {
            display: flex;
            align-items: center;
            gap: 10px;
            width: 100%;
            padding: 10px 18px;
            background: none;
            border: none;
            cursor: pointer;
            text-align: left;
            font-family: inherit;
            font-size: 0.84rem;
            color: #374151;
            border-left: 3px solid transparent;
            transition: all 0.15s;
            font-weight: 500;
        }
        .step-btn:hover { background: #F9FAFB; }
        .step-btn.active { background: #FBF5FF; border-left-color: var(--primary); color: var(--primary); font-weight: 700; }
        .step-btn.done .step-check { background: #10B981; border-color: #10B981; }
        .step-btn.done .step-check::after { content: '✓'; }
        .step-check {
            width: 18px; height: 18px;
            border-radius: 50%;
            border: 2px solid #D1D5DB;
            flex-shrink: 0;
            display: flex; align-items: center; justify-content: center;
            font-size: 0.6rem;
            color: white;
            transition: all 0.2s;
        }
        .step-name { flex: 1; line-height: 1.3; }
        .sidebar-footer { margin-top: auto; padding: 14px 16px; border-top: 1px solid #E5E7EB; }
        .btn-reset {
            width: 100%;
            padding: 9px;
            background: none;
            border: 1px solid #FCA5A5;
            color: #DC2626;
            border-radius: 8px;
            font-family: inherit;
            font-size: 0.78rem;
            font-weight: 700;
            cursor: pointer;
            transition: all 0.2s;
        }
        .btn-reset:hover { background: #FEE2E2; }

        /* Main Content */
        main { flex-grow: 1; padding: 60px; }


        /* Sidebar Navigation */
        .sidebar-nav { width: 280px; background: var(--apex-navy); color: white; display: flex; flex-direction: column; padding: 40px 0; flex-shrink: 0; box-shadow: 4px 0 15px rgba(0,0,0,0.2); }
        .sidebar-nav h1 { padding: 0 30px; font-size: 1.4rem; margin-bottom: 50px; line-height: 1.2; }
        .sidebar-nav h1 span { color: var(--waukee-gold); font-weight: 800; text-transform: uppercase; font-size: 0.85rem; display: block; margin-bottom: 5px; }
        .sidebar-nav button { background: none; border: none; color: rgba(255,255,255,0.6); padding: 18px 30px; text-align: left; font-size: 1rem; cursor: pointer; transition: 0.3s; border-left: 5px solid transparent; font-weight: 500; }
        .sidebar-nav button.active { color: white; background: rgba(255,255,255,0.1); border-left: 5px solid var(--waukee-gold); font-weight: 700; }
        .nav-footer { margin-top: auto; padding: 20px; }
        .btn-reset { color: #ffab91; background: none; border: 1px solid #ffab91; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 0.8rem; width: 100%; }

        /* Main Content */
        main { flex-grow: 1; padding: 60px; overflow-y: auto; }

        /* ── SIDEBAR ── */
        .sidebar {
            width: 280px;
            min-width: 280px;
            background: white;
            border-right: 1px solid #E5E7EB;
            position: sticky;
            top: var(--nav-height);
            height: calc(100vh - var(--nav-height));
            overflow-y: auto;
            display: flex;
            flex-direction: column;
            flex-shrink: 0;
        }
        .sidebar-header { padding: 20px 18px 16px; border-bottom: 1px solid #E5E7EB; }
        .sidebar-std-label { font-size: 0.68rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; color: #6B7280; margin-bottom: 4px; }
        .sidebar-std-title { font-size: 1rem; font-weight: 800; color: var(--primary); line-height: 1.3; margin-bottom: 14px; }
        .progress-bar-wrap { background: #E5E7EB; border-radius: 4px; height: 6px; overflow: hidden; margin-bottom: 6px; }
        .progress-bar-fill { height: 100%; background: var(--secondary); border-radius: 4px; transition: width 0.4s; }
        .progress-label { font-size: 0.72rem; color: #6B7280; }
        .phase-group { padding: 8px 0; border-bottom: 1px solid #F3F4F6; }
        .sidebar-phase-label {
            font-size: 0.68rem;
            font-weight: 800;
            text-transform: uppercase;
            letter-spacing: 0.1em;
            padding: 6px 18px 4px;
            color: var(--primary);
            display: block;
            opacity: 0.6;
        }
        .step-btn {
            display: flex;
            align-items: center;
            gap: 10px;
            width: 100%;
            padding: 10px 18px;
            background: none;
            border: none;
            cursor: pointer;
            text-align: left;
            font-family: inherit;
            font-size: 0.84rem;
            color: #374151;
            border-left: 3px solid transparent;
            transition: all 0.15s;
            font-weight: 500;
        }
        .step-btn:hover { background: #F9FAFB; }
        .step-btn.active { background: #FBF5FF; border-left-color: var(--primary); color: var(--primary); font-weight: 700; }
        .step-btn.done .step-check { background: #10B981; border-color: #10B981; }
        .step-btn.done .step-check::after { content: '✓'; }
        .step-check {
            width: 18px; height: 18px;
            border-radius: 50%;
            border: 2px solid #D1D5DB;
            flex-shrink: 0;
            display: flex; align-items: center; justify-content: center;
            font-size: 0.6rem;
            color: white;
            transition: all 0.2s;
        }
        .step-name { flex: 1; line-height: 1.3; }
        .sidebar-footer { margin-top: auto; padding: 14px 16px; border-top: 1px solid #E5E7EB; }
        .btn-reset {
            width: 100%;
            padding: 9px;
            background: none;
            border: 1px solid #FCA5A5;
            color: #DC2626;
            border-radius: 8px;
            font-family: inherit;
            font-size: 0.78rem;
            font-weight: 700;
            cursor: pointer;
            transition: all 0.2s;
        }
        .btn-reset:hover { background: #FEE2E2; }

        /* Main Content */
        main { flex-grow: 1; padding: 60px; }

.nav-links a:hover { color: var(--secondary); background: rgba(255,255,255,0.1); }

.nav-links a.active { background: var(--secondary); color: var(--primary); }

-        .sidebar-nav { width: 280px; background: var(--apex-navy); color: white; display: flex; flex-direction: column; padding: 40px 0; flex-shrink: 0; box-shadow: 4px 0 15px rgba(0,0,0,0.2); }

-        .sidebar-nav h1 { padding: 0 30px; font-size: 1.4rem; margin-bottom: 50px; line-height: 1.2; }

-        .sidebar-nav h1 span { color: var(--waukee-gold); font-weight: 800; text-transform: uppercase; font-size: 0.85rem; display: block; margin-bottom: 5px; }

-        .sidebar-nav button { background: none; border: none; color: rgba(255,255,255,0.6); padding: 18px 30px; text-align: left; font-size: 1rem; cursor: pointer; transition: 0.3s; border-left: 5px solid transparent; font-weight: 500; }

-        .sidebar-nav button.active { color: white; background: rgba(255,255,255,0.1); border-left: 5px solid var(--waukee-gold); font-weight: 700; }

-        .nav-footer { margin-top: auto; padding: 20px; }

-        .btn-reset { color: #ffab91; background: none; border: 1px solid #ffab91; padding: 8px 15px; border-radius: 4px; cursor: pointer; font-size: 0.8rem; width: 100%; }

+            border-right: 1px solid #E5E7EB;

+            height: calc(100vh - var(--nav-height));

+        .sidebar-header { padding: 20px 18px 16px; border-bottom: 1px solid #E5E7EB; }

+        .sidebar-std-label { font-size: 0.68rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; color: #6B7280; margin-bottom: 4px; }

+        .sidebar-std-title { font-size: 1rem; font-weight: 800; color: var(--primary); line-height: 1.3; margin-bottom: 14px; }

+        .progress-bar-wrap { background: #E5E7EB; border-radius: 4px; height: 6px; overflow: hidden; margin-bottom: 6px; }

+        .progress-bar-fill { height: 100%; background: var(--secondary); border-radius: 4px; transition: width 0.4s; }

+        .progress-label { font-size: 0.72rem; color: #6B7280; }

+        .phase-group { padding: 8px 0; border-bottom: 1px solid #F3F4F6; }

+            border-left: 3px solid transparent;

+        .step-btn:hover { background: #F9FAFB; }

+        .step-btn.active { background: #FBF5FF; border-left-color: var(--primary); color: var(--primary); font-weight: 700; }

+        .step-btn.done .step-check { background: #10B981; border-color: #10B981; }

+        .step-btn.done .step-check::after { content: '✓'; }

+            display: flex; align-items: center; justify-content: center;

+        .step-name { flex: 1; line-height: 1.3; }

+        .sidebar-footer { margin-top: auto; padding: 14px 16px; border-top: 1px solid #E5E7EB; }

+        .btn-reset:hover { background: #FEE2E2; }

-        main { flex-grow: 1; padding: 60px; overflow-y: auto; }

+        main { flex-grow: 1; padding: 60px; }

.section { display: none; max-width: 1000px; animation: fadeIn 0.3s ease-out; }

@keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }


Now replace the sidebar HTML:


Waukee APEXCareer Launchpad

        <button onclick="showSection('discovery')" id="btn-discovery" class="active">1. Discovery</button>
        <button onclick="showSection('thesis')" id="btn-thesis">2. Career Thesis</button>
        <button onclick="showSection('research')" id="btn-research">3. Deep Dive</button>
        <button onclick="showSection('outreach')" id="btn-outreach">4. Local Connections</button>

<button class="btn-reset" onclick="clearData()">Clear All Data</button>

Waukee APEX · Standard 3

Critical Thinking & Problem Solving

0 of 4 phases complete

            Phase 1 · Self-Discovery
            <button class="step-btn active" id="btn-discovery" onclick="showSection('discovery')">

                🔍 Discovery
            </button>

            Phase 2 · Synthesis
            <button class="step-btn" id="btn-thesis" onclick="showSection('thesis')">

                🎯 Career Thesis
            </button>

            Phase 3 · Research
            <button class="step-btn" id="btn-research" onclick="showSection('research')">

                📊 Deep Dive
            </button>

            Phase 4 · Networking
            <button class="step-btn" id="btn-outreach" onclick="showSection('outreach')">

                🤝 Local Connections
            </button>

            <button class="btn-reset" onclick="clearData()">Clear All Data</button>


Waukee APEXCareer Launchpad

        <button onclick="showSection('discovery')" id="btn-discovery" class="active">1. Discovery</button>
        <button onclick="showSection('thesis')" id="btn-thesis">2. Career Thesis</button>
        <button onclick="showSection('research')" id="btn-research">3. Deep Dive</button>
        <button onclick="showSection('outreach')" id="btn-outreach">4. Local Connections</button>

<button class="btn-reset" onclick="clearData()">Clear All Data</button>

Waukee APEX · Standard 3

Critical Thinking & Problem Solving

0 of 4 phases complete

            Phase 1 · Self-Discovery
            <button class="step-btn active" id="btn-discovery" onclick="showSection('discovery')">

                🔍 Discovery
            </button>

            Phase 2 · Synthesis
            <button class="step-btn" id="btn-thesis" onclick="showSection('thesis')">

                🎯 Career Thesis
            </button>

            Phase 3 · Research
            <button class="step-btn" id="btn-research" onclick="showSection('research')">

                📊 Deep Dive
            </button>

            Phase 4 · Networking
            <button class="step-btn" id="btn-outreach" onclick="showSection('outreach')">

                🤝 Local Connections
            </button>

            <button class="btn-reset" onclick="clearData()">Clear All Data</button>

-        <button onclick="showSection('discovery')" id="btn-discovery" class="active">1. Discovery</button>

-        <button onclick="showSection('thesis')" id="btn-thesis">2. Career Thesis</button>

-        <button onclick="showSection('research')" id="btn-research">3. Deep Dive</button>

-        <button onclick="showSection('outreach')" id="btn-outreach">4. Local Connections</button>

-
<button class="btn-reset" onclick="clearData()">Clear All Data</button>

+            <div class="progress-bar-wrap">

+            <button class="step-btn active" id="btn-discovery" onclick="showSection('discovery')">

+            <button class="step-btn" id="btn-thesis" onclick="showSection('thesis')">

+            <button class="step-btn" id="btn-research" onclick="showSection('research')">

+            <button class="step-btn" id="btn-outreach" onclick="showSection('outreach')">

+            <button class="btn-reset" onclick="clearData()">Clear All Data</button>

<div id="discovery" class="section active">


Now update the JavaScript:


        function showSection(id) {
            document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
            document.querySelectorAll('nav button').forEach(b => b.classList.remove('active'));
            document.getElementById(id).classList.add('active');
            document.getElementById('btn-' + id).classList.add('active');
            window.scrollTo(0,0);
        }

        const PHASES = ['discovery', 'thesis', 'research', 'outreach'];

        function showSection(id) {
            document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
            document.querySelectorAll('.step-btn').forEach(b => b.classList.remove('active'));
            document.getElementById(id).classList.add('active');
            document.getElementById('btn-' + id).classList.add('active');
            window.scrollTo(0, 0);
            markVisited(id);
        }

        function markVisited(id) {
            const btn = document.getElementById('btn-' + id);
            if (btn) btn.classList.add('done');
            updateProgress();
            autoSave();
        }

        function updateProgress() {
            const done = PHASES.filter(id => {
                const btn = document.getElementById('btn-' + id);
                return btn && btn.classList.contains('done');
            }).length;
            const pct = Math.round((done / PHASES.length) * 100);
            const fill = document.getElementById('progress-fill');
            const label = document.getElementById('progress-label');
            if (fill) fill.style.width = pct + '%';
            if (label) label.textContent = done + ' of 4 phases complete';
        }


        function showSection(id) {
            document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
            document.querySelectorAll('nav button').forEach(b => b.classList.remove('active'));
            document.getElementById(id).classList.add('active');
            document.getElementById('btn-' + id).classList.add('active');
            window.scrollTo(0,0);
        }

        const PHASES = ['discovery', 'thesis', 'research', 'outreach'];

        function showSection(id) {
            document.querySelectorAll('.section').forEach(s => s.classList.remove('active'));
            document.querySelectorAll('.step-btn').forEach(b => b.classList.remove('active'));
            document.getElementById(id).classList.add('active');
            document.getElementById('btn-' + id).classList.add('active');
            window.scrollTo(0, 0);
            markVisited(id);
        }

        function markVisited(id) {
            const btn = document.getElementById('btn-' + id);
            if (btn) btn.classList.add('done');
            updateProgress();
            autoSave();
        }

        function updateProgress() {
            const done = PHASES.filter(id => {
                const btn = document.getElementById('btn-' + id);
                return btn && btn.classList.contains('done');
            }).length;
            const pct = Math.round((done / PHASES.length) * 100);
            const fill = document.getElementById('progress-fill');
            const label = document.getElementById('progress-label');
            if (fill) fill.style.width = pct + '%';
            if (label) label.textContent = done + ' of 4 phases complete';
        }

+        const PHASES = ['discovery', 'thesis', 'research', 'outreach'];

-            document.querySelectorAll('nav button').forEach(b => b.classList.remove('active'));

+            document.querySelectorAll('.step-btn').forEach(b => b.classList.remove('active'));

+            const btn = document.getElementById('btn-' + id);

+            if (btn) btn.classList.add('done');

+            const done = PHASES.filter(id => {

+                return btn && btn.classList.contains('done');

+            const pct = Math.round((done / PHASES.length) * 100);

+            const fill = document.getElementById('progress-fill');

+            const label = document.getElementById('progress-label');

+            if (fill) fill.style.width = pct + '%';

+            if (label) label.textContent = done + ' of 4 phases complete';

const data = { selections, v: document.getElementById('ref-values').value, i: document.getElementById('ref-interests').value, s: document.getElementById('ref-skills').value };


Now update `autoSave` and `load` to persist visited state:


        function autoSave() {
            const data = { selections, v: document.getElementById('ref-values').value, i: document.getElementById('ref-interests').value, s: document.getElementById('ref-skills').value };
            localStorage.setItem('apex_v37', JSON.stringify(data));
        }

        function load() {
            const saved = localStorage.getItem('apex_v37'); if (!saved) return;
            const data = JSON.parse(saved); selections = data.selections;
            document.getElementById('ref-values').value = data.v || "";
            document.getElementById('ref-interests').value = data.i || "";
            document.getElementById('ref-skills').value = data.s || "";
            document.querySelectorAll('.pill').forEach(p => {
                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');
            });
            Object.keys(selections.skills).forEach(s => {
                const lvl = selections.skills[s];
                document.querySelectorAll('.skill-row').forEach(row => {
                    if (row.querySelector('.skill-name').innerText === s) {
                        const btn = row.querySelector(`.rate-btn[onclick*="${lvl}"]`);
                        if (btn) btn.classList.add('active-' + lvl.toLowerCase());
                    }
                });
            });
        }

        function autoSave() {
            const visited = PHASES.filter(id => {
                const btn = document.getElementById('btn-' + id);
                return btn && btn.classList.contains('done');
            });
            const data = {
                selections,
                v: document.getElementById('ref-values').value,
                i: document.getElementById('ref-interests').value,
                s: document.getElementById('ref-skills').value,
                visited
            };
            localStorage.setItem('apex_v37', JSON.stringify(data));
        }

        function load() {
            const saved = localStorage.getItem('apex_v37'); if (!saved) return;
            const data = JSON.parse(saved); selections = data.selections;
            document.getElementById('ref-values').value = data.v || "";
            document.getElementById('ref-interests').value = data.i || "";
            document.getElementById('ref-skills').value = data.s || "";
            document.querySelectorAll('.pill').forEach(p => {
                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');
            });
            Object.keys(selections.skills).forEach(s => {
                const lvl = selections.skills[s];
                document.querySelectorAll('.skill-row').forEach(row => {
                    if (row.querySelector('.skill-name').innerText === s) {
                        const btn = row.querySelector(`.rate-btn[onclick*="${lvl}"]`);
                        if (btn) btn.classList.add('active-' + lvl.toLowerCase());
                    }
                });
            });
            (data.visited || []).forEach(id => {
                const btn = document.getElementById('btn-' + id);
                if (btn) btn.classList.add('done');
            });
            updateProgress();
        }


        function autoSave() {
            const data = { selections, v: document.getElementById('ref-values').value, i: document.getElementById('ref-interests').value, s: document.getElementById('ref-skills').value };
            localStorage.setItem('apex_v37', JSON.stringify(data));
        }

        function load() {
            const saved = localStorage.getItem('apex_v37'); if (!saved) return;
            const data = JSON.parse(saved); selections = data.selections;
            document.getElementById('ref-values').value = data.v || "";
            document.getElementById('ref-interests').value = data.i || "";
            document.getElementById('ref-skills').value = data.s || "";
            document.querySelectorAll('.pill').forEach(p => {
                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');
            });
            Object.keys(selections.skills).forEach(s => {
                const lvl = selections.skills[s];
                document.querySelectorAll('.skill-row').forEach(row => {
                    if (row.querySelector('.skill-name').innerText === s) {
                        const btn = row.querySelector(`.rate-btn[onclick*="${lvl}"]`);
                        if (btn) btn.classList.add('active-' + lvl.toLowerCase());
                    }
                });
            });
        }

        function autoSave() {
            const visited = PHASES.filter(id => {
                const btn = document.getElementById('btn-' + id);
                return btn && btn.classList.contains('done');
            });
            const data = {
                selections,
                v: document.getElementById('ref-values').value,
                i: document.getElementById('ref-interests').value,
                s: document.getElementById('ref-skills').value,
                visited
            };
            localStorage.setItem('apex_v37', JSON.stringify(data));
        }

        function load() {
            const saved = localStorage.getItem('apex_v37'); if (!saved) return;
            const data = JSON.parse(saved); selections = data.selections;
            document.getElementById('ref-values').value = data.v || "";
            document.getElementById('ref-interests').value = data.i || "";
            document.getElementById('ref-skills').value = data.s || "";
            document.querySelectorAll('.pill').forEach(p => {
                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');
            });
            Object.keys(selections.skills).forEach(s => {
                const lvl = selections.skills[s];
                document.querySelectorAll('.skill-row').forEach(row => {
                    if (row.querySelector('.skill-name').innerText === s) {
                        const btn = row.querySelector(`.rate-btn[onclick*="${lvl}"]`);
                        if (btn) btn.classList.add('active-' + lvl.toLowerCase());
                    }
                });
            });
            (data.visited || []).forEach(id => {
                const btn = document.getElementById('btn-' + id);
                if (btn) btn.classList.add('done');
            });
            updateProgress();
        }

-            const data = { selections, v: document.getElementById('ref-values').value, i: document.getElementById('ref-interests').value, s: document.getElementById('ref-skills').value };

+            const visited = PHASES.filter(id => {

+                v: document.getElementById('ref-values').value,

+                i: document.getElementById('ref-interests').value,

+                s: document.getElementById('ref-skills').value,

-            document.querySelectorAll('.pill').forEach(p => {

-                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');

+            document.querySelectorAll('.pill').forEach(p => {

+                if (selections.values.includes(p.innerText) || selections.interests.includes(p.innerText)) p.classList.add('selected');

+            (data.visited || []).forEach(id => {

+                const btn = document.getElementById('btn-' + id);

+                if (btn) btn.classList.add('done');

function clearData() { if (confirm("Clear all data?")) { localStorage.clear(); location.reload(); } }


Quick sanity check:


Bash

Verify all old sidebar references replaced and new ones present


71:        .sidebar {
84:        .sidebar-header { padding: 20px 18px 16px; border-bottom: 1px solid #E5E7EB; }
85:        .sidebar-std-label { font-size: 0.68rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.12em; color: #6B7280; margin-bottom: 4px; }
86:        .sidebar-std-title { font-size: 1rem; font-weight: 800; color: var(--primary); line-height: 1.3; margin-bottom: 14px; }
91:        .sidebar-phase-label {
101:        .step-btn {
118:        .step-btn:hover { background: #F9FAFB; }
119:        .step-btn.active { background: #FBF5FF; border-left-color: var(--primary); color: var(--primary); font-weight: 700; }
120:        .step-btn.done .step-check { background: #10B981; border-color: #10B981; }
121:        .step-btn.done .step-check::after { content: '✓'; }
122:        .step-check {
133:        .sidebar-footer { margin-top: auto; padding: 14px 16px; border-top: 1px solid #E5E7EB; }
251:

258:            <button class="step-btn active" id="btn-discovery" onclick="showSection('discovery')">
259:

266:            <button class="step-btn" id="btn-thesis" onclick="showSection('thesis')">
267:

274:            <button class="step-btn" id="btn-research" onclick="showSection('research')">
275:

282:            <button class="step-btn" id="btn-outreach" onclick="showSection('outreach')">
283:

288:

528:        const PHASES = ['discovery', 'thesis', 'research', 'outreach'];
532:            document.querySelectorAll('.step-btn').forEach(b => b.classList.remove('active'));
536:            markVisited(id);
539:        function markVisited(id) {
542:            updateProgress();
546:        function updateProgress() {
547:            const done = PHASES.filter(id => {
551:            const pct = Math.round((done / PHASES.length) * 100);
552:            const fill = document.getElementById('progress-fill');
559:            const visited = PHASES.filter(id => {
595:            updateProgress();


No references to `sidebar-nav` remaining. All the new sidebar CSS, HTML, and JS are in place. Here's what changed:

**Visual:** The dark navy sidebar is replaced with the same white sidebar used in all three playbooks — white background, subtle right border, purple accent on the active item, left-border highlight strip.

**Structure:** Four phase groups (Self-Discovery, Synthesis, Research, Networking) each with a phase label and a step button with a circular check icon — identical to the playbook pattern.

**Progress tracking:** The progress bar and "X of 4 phases complete" label fill as students visit each phase. Visited state persists in localStorage so the progress bar survives page reloads.

**Content:** Zero content changes — every card, form, callout, AI prompt builder, and table is exactly as it was.


I only want the checkboxes in the sidebar to fill when they've clicked the bottom button on each phase (Generate Career Thesis, Start Deep Dive Research, Find Local Connections). Essentially, the phase circle should get checked when they've *finished* that phase, not when they've visited it. I don't want them to peek ahead and then that phase gets checked off when they were only being curious.


The user wants the sidebar checkboxes to only fill when the student clicks the "completion" button at the bottom of each phase, not when they simply navigate to that phase. Let me look at which buttons those are:

1. **Discovery** → completion button is "GENERATE CAREER THESIS" (which calls `showSection('thesis')`)
2. **Thesis** → completion button is "START DEEP DIVE RESEARCH" (which calls `showSection('research')`)
3. **Research** → completion button is "FIND LOCAL CONNECTIONS" (which calls `showSection('outreach')`)

4. **Outreach** → the final phase without a navigation button, so it should probably get checked when the student reaches it or completes some final action.

Looking at the button structure, each section transitions to the next via onclick handlers that call `showSection()`. The Discovery button triggers the thesis view, the thesis button triggers research, and the research button triggers outreach. So I need to decouple the section navigation from the progress tracking—instead of marking visited inside `showSection()`, I should add explicit `markVisited()` calls to each button's onclick handler so that Discovery gets marked when "GENERATE CAREER THESIS" is clicked, Thesis when "START DEEP DIVE RESEARCH" is clicked, and Research when "FIND LOCAL CONNECTIONS" is clicked. the "START DEEP DIVE RESEARCH" button
4. Add `markVisited('research')` to the onclick of the "FIND LOCAL CONNECTIONS" button
5. For outreach (Phase 4), since there's no completion button, maybe we leave it unchecked or add a simple way to complete it. The user didn't mention it, so I'll leave it as-is for now. Maybe I should mention it to the user.

Actually, let me re-read what the user said: "the phase circle should get checked when they've finished that phase" — they specifically mentioned "Generate Career Thesis, Start Deep Dive Research, Find Local Connections." No mention of a button for Local Connections phase completion. So I'll just handle those three and leave the outreach phase without auto-completion (or maybe add a small "Mark Complete" button to it).

Wait, actually "Find Local Connections" is the button that opens the outreach phase - it completes the Research (Phase 3) phase. So the mapping is: "Generate Career Thesis" checks off Discovery, "Start Deep Dive Research" checks off Career Thesis, and "Find Local Connections" checks off Deep Dive Research. Phase 4 has no completion button, so I'll either leave it unchecked or add a small "Mark Complete" button and mention this to the user.

For the implementation, I need to remove the `markVisited(id)` call from `showSection()` and instead add it directly to each button's onclick handler so they call both `showSection()` for the next phase and `markVisited()` for the current phase. Let me check the exact button onclicks I need to modify.

Updating the onclick handlers...

Still updating button handlers... Now I'm locating the three button elements in the HTML that need updating—the ones for generating the thesis, starting research, and finding connections—to add the `markVisited()` calls directly to their onclick handlers instead of relying on `showSection()` to do it.


Simple fix — remove `markVisited` from `showSection` and wire it explicitly onto each completion button instead.


Edit

            window.scrollTo(0, 0);
            markVisited(id);
        }

            window.scrollTo(0, 0);
        }


I only want the checkboxes in the sidebar to fill when they've clicked the bottom button on each phase (Generate Career Thesis, Start Deep Dive Research, Find Local Connections). Essentially, the phas…


            window.scrollTo(0, 0);
            markVisited(id);
        }

            window.scrollTo(0, 0);
        }


onclick="markVisited('discovery'); showSection('thesis');">GENERATE CAREER THESIS</button>


-                <button class="btn-action btn-purple" style="background: #3b82f6;" onclick="showSection('thesis')">GENERATE CAREER THESIS</button>

+                <button class="btn-action btn-purple" style="background: #3b82f6;" onclick="markVisited('discovery'); showSection('thesis');">GENERATE CAREER THESIS</button>


onclick="showSection('research')">START DEEP DIVE RESEARCH</button>

onclick="markVisited('thesis'); showSection('research');">START DEEP DIVE RESEARCH</button>


Coming Up in Phase 3: You will transform those job titles into a "Day-in-the-Life" profile and an Industry Deep Dive.

-                <button class="btn-action btn-gold" style="background: #ef4444; color: white;" onclick="showSection('research')">START DEEP DIVE RESEARCH</button>

+                <button class="btn-action btn-gold" style="background: #ef4444; color: white;" onclick="markVisited('thesis'); showSection('research');">START DEEP DIVE RESEARCH</button>


onclick="markVisited('research'); showSection('outreach');">FIND LOCAL CONNECTIONS</button>


Checkpoint: Reflect with Russ
Share your Google Docs with Russ. Discuss the "Challenges" you found—is this still a path you want to pursue?

-            <button class="btn-action btn-gold" style="background: #8bc34a; color: white;" onclick="showSection('outreach')">FIND LOCAL CONNECTIONS</button>

+            <button class="btn-action btn-gold" style="background: #8bc34a; color: white;" onclick="markVisited('research'); showSection('outreach');">FIND LOCAL CONNECTIONS</button>


Done. Phases 1–3 now only check off when the student clicks the completion button at the bottom. Peeking ahead via the sidebar just navigates without marking anything.

One thing worth noting: Phase 4 (Local Connections) has no completion button, so its circle will never fill. You may want to add a "Mark Complete" button at the bottom of that phase at some point — but I left it alone since you didn't mention it.


Yeah I was thinking about Phase 4. The box should be a Check with Russ box


The user wants Phase 4 (Local Connections/Outreach) to have a "Check with Russ" completion mechanism. Let me look at what's currently at the bottom of the outreach section to understand what to add.

From the original file content I read earlier, the outreach section ends with:
```html
<div class="callout callout-yellow" style="margin-top: 30px;">
    <span>🤝</span>
    <div><strong>Checkpoint: Reflect with Russ</strong><br>Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.</div>

```

There's no button after this. The user wants a "Check with Russ" button that marks Phase 4 as complete. This is consistent with the pattern in the playbooks where there are checkpoint steps with mentor review.

I need to add a button at the bottom of the outreach section that calls `markVisited('outreach')`. I'll style it to look like a checkpoint/mentor button, consistent with the existing callout that's already there.


Let me read the current end of the outreach section.


Bash

grep -n "Reflect with Russ\|outreach\|networking list\|clearData\|app-shell" "/Users/russgoerend/Desktop/Portfolio HTMLs/Standard3.html" | tail -20

Find the end of the outreach section


23:        .app-shell { display: flex; min-height: calc(100vh - var(--nav-height)); }
245:

282:            <button class="step-btn" id="btn-outreach" onclick="showSection('outreach')">
283:

289:            <button class="btn-reset" onclick="clearData()">Clear All Data</button>
355:
Checkpoint: Reflect with Russ
Sit down with Russ to discuss which 2-3 job titles from your AI results actually "click" before starting research.

401:
Checkpoint: Reflect with Russ
Share your Google Docs with Russ. Discuss the "Challenges" you found—is this still a path you want to pursue?

404:            <button class="btn-action btn-gold" style="background: #8bc34a; color: white;" onclick="markVisited('research'); showSection('outreach');">FIND LOCAL CONNECTIONS</button>
407:

429:
Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

433:

528:        const PHASES = ['discovery', 'thesis', 'research', 'outreach'];
597:        function clearData() { if (confirm("Clear all data?")) { localStorage.clear(); location.reload(); } }


407

408
Phase 4: Local Connections

409
410

411	                🤝
412
Making it Real: Research is great, but talking to humans is better. Use LinkedIn or the Waukee Chamber to find local pros.

413

414
415

416
🔍 Local Networking List

417

418

Name	Company	Notes/Role

419

420
<input type="text" placeholder="Name...">	<input type="text" placeholder="Company...">	<input type="text" placeholder="Notes/Role...">

421
<input type="text">	<input type="text">	<input type="text">

422
<input type="text">	<input type="text">	<input type="text">

423

424

425

426
427

428	                🤝
429
Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

430

431

432
433

434

Phase 4: Local Connections

                🤝

Making it Real: Research is great, but talking to humans is better. Use LinkedIn or the Waukee Chamber to find local pros.

🔍 Local Networking List

Name	Company	Notes/Role

<input type="text" placeholder="Name...">	<input type="text" placeholder="Company...">	<input type="text" placeholder="Notes/Role...">

<input type="text">	<input type="text">	<input type="text">

<input type="text">	<input type="text">	<input type="text">

                🤝

Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.


Edit

                🤝

Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

                🤝

Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

            <button class="btn-action btn-gold" onclick="markVisited('outreach');" style="margin-top: 10px;">✓ CHECKED IN WITH RUSS</button>


                🤝

Checkpoint: Reflect with Russ
Review your networking list with Russ. He may have direct contacts at these companies to help you get a foot in the door.

            <button class="btn-action btn-gold" onclick="markVisited('outreach');" style="margin-top: 10px;">✓ CHECKED IN WITH RUSS</button>

+            <button class="btn-action btn-gold" onclick="markVisited('outreach');" style="margin-top: 10px;">✓ CHECKED IN WITH RUSS</button>


Done. The "Checked In With Russ" button sits directly below the checkpoint callout on Phase 4, matching the completion pattern of the other three phases — click it after the meeting and the circle fills.


There we go! Good work.


Thanks! This has been a productive session — the playbooks are in much better shape for students coming in cold, and Standard 3 now feels like it belongs to the same system as everything else. Let me save a few notes about what we've built.