Skip to content
Start My 3 Free Days $0 today · cancel anytime
Brand & Site Kit · Version 3.0 · Fun & interactive

Have fun teaching,
on brand every time.

A warm, playful design system for Have Fun Teaching — built for the pre‑K–6th grade teachers and homeschool moms (women 20–45) who use us every day. Built around the new pinwheel brandmark: four sails, four subjects, one motion. Every color in this kit is sampled straight out of the logo.

✨ Fun & interactive (v3) 🎨 Warm, playful, trustworthy 🍩 Pill‑first UI ♿ WCAG‑AA 2M+ teachers & families
✨ See the v3 page systemAssets & logos
★ New in v3.0 · October 2026 00 — The fun & interactive page system

Every new page, post and email feels like this.

Our newest pages set the look for everything we build next: warm cream backgrounds, big rounded cards, chunky Fredoka headlines, real resource covers fanned out like a deck of cards, and playful stickers that bob and tilt. It feels like opening a fresh pack of classroom supplies. Use this section as the rulebook for new blog posts, landing pages, emails and site elements. Where an older section below disagrees, this one wins. Buttons and the buy box for every product and viewer are in 04 and 04B.

The five rules

Fun on the surface. Disciplined underneath.

Every v3 page follows these five rules. If a design breaks one, fix it before you publish.

1Offer first, above the fold

The visitor sees the main offer and can act on it without scrolling: free bundle first, membership second.

2Real products are the art

Fanned resource covers, gallery tiles and video thumbnails. Never stock photos or clip art.

3One accent per page

Pick one accent (a grade colour or pink). It drives the eyebrows, pill, chips, number badges and the tinted bands.

4Playful, never messy

Small tilts (±1° cards, up to ±12° covers), soft blobs, and no more than two stickers per hero. Keep plenty of white space.

5One pink action

Pink is only for the main action. Secondary actions are navy-outline ghosts. Every CTA says exactly what you get.

Page anatomy

The 7-band recipe

Each band has one job and its own background, so the page reads in clear, colourful chapters. Every section opens with the same head: eyebrow (accent, caps) → Fredoka H2 → one-line sub, centred.

  1. Hero. Pill → kicker (the dream) → H1 with one highlighted word → mix line → the form or main CTA → trust line. Fanned covers + stickers on the right.
  2. What’s inside. Big real covers on 4:5 white tiles, numbered badges, subject · format tag, then one CTA under the grid.
  3. Imagine this. Three solid colour “dream” cards (accent / navy / green) that sell the outcome, not the product.
  4. How it works. Three white step cards with a tinted icon tile and a big faded number. Headline formula: “Three steps. Zero prep.”
  5. Membership. Navy band, yellow eyebrow, yellow check list, Yearly card raised with a yellow ring and “Most teachers pick Yearly” badge. Always add “$0 today · cancel anytime”.
  6. Guarantee + FAQ. 100% HAPPY seal card, then rounded <details> cards that get an accent border when open.
  7. Final CTA. One big Fredoka line, one sentence, one pink button. Nothing else.
Live component · Hero

The hero, exactly as it should look

Hover the covers, they fan out. The “10 FREE” sticker bobs on a 5-second loop. This demo uses the Kindergarten accent (#D2470B / tint #FDEBDD).

🎁 Free for kindergarten teachers & parents

The year they learn to read. Make it magical.

Get 10 free Kindergarten resources

7 worksheets · 2 activities · 1 video, hand-picked by teachers and ready to print tonight. Free, no credit card.

2M+ teachers & families20+ years of teacher-made resourcesMade for ages 5–6
10FREE
My Pet Pig worksheet
Addition Facts to 5 worksheet
Things that come in 5s worksheet
Seasons Song video▶
Ready to print!
Live component · Buttons

Pressable, shiny, impossible to miss

The main button looks like a real button: pink, with a darker pink bottom edge. On hover it darkens; on click it presses 3px into the page. Trial buttons also get a light shine that sweeps across. Try it.

Main · pink#D6337B, bottom edge 0 4px 0 #A4235C. Hover darkens to #B62A67 and never moves; a click presses it 3px down. Shine (.hft-shine) only on trial buttons. Nunito Sans 800.
One size52px tall, 16px text, everywhere. Header & phone drawer 44px, tables 40px, kids’ /class/ page 64px. Pill radius 999px. On a phone, buttons go full-width and stack.
Secondary · outlineWhite, 2px navy outline, navy text, flat. Fills navy on hover. Save, Compare plans, Assign in Classroom. Try buttons add a pink ▶. Yellow is only Buy on Amazon.
LabelsSay exactly what you get: “Send me my 10 free Preschool resources”. End with → for forward actions. No ▶ emoji on email buttons.
Live component · Stickers & badges

The little bits of joy

Stickers are the “fun” in fun and interactive. Each one has a white border, a soft drop shadow and a slight tilt. Use up to two per hero and one per card.

10FREE
Count sticker · accent circle, −12°, bobs
3DAYS FREE
Trial sticker · pink (pricing)
Ready to print!
Promise pill · sail yellow, −4°
Yearly is just$3.33/month
Price tag · navy card, +7°
100%HAPPY
Guarantee seal · yellow, dashed ring
★ Most teachers pick Yearly
Best-value badge · sits on the card edge
1
Number badge · gallery tiles & steps
NEW
NEW pill · pink, −6°
Live component · Gallery tiles

Show the real thing, big

Covers sit on white 4:5 tiles that alternate ±1.2° and straighten when you hover. Above each title is a small caps “Subject · Format” tag in the accent colour. Sits on the accent tint band.

1
Math · WorksheetThings that come in 5s
2
Reading · WorksheetMy Pet Pig Reading Comprehension
3
Math · WorksheetAdding Facts to 5
4
Language Arts · WorksheetVerb Opposites
Live component · Dream cards

Sell the feeling, then the product

⭐Sounds turn into words

Phonics pages that make that “I read it myself!” moment happen sooner.

💛Numbers finally click

Counting and number sense through pages that feel like play.

⚡Your evenings stay yours

No more late nights hunting for the right worksheet. It’s already here.

Order: accent → navy → green. If the accent is green or navy, swap that card for purple #7A3FA8.

Live component · Steps

Three steps. Zero prep.

1🎓We picked Kindergarten

Your bundle is already matched to your grade.

2✉️Tell us where to send it

Name, email and a password. No credit card, ever.

3🖨️Print and teach tonight

All 10 open instantly and stay in your account.

Live component · Feature cards

Tilted cards, coloured icon tiles

Use these for “what you get” lists. White cards alternate ±1°, each with a solid icon tile and a faint matching circle in the corner. They sit on a soft pink band (#FCE4EF).

🖨️Printables & worksheets

Unlimited downloads, ready to print.

▶Songs & videos

The catchy songs kids ask for again.

⚡Games

Practice that feels like play.

🎓Every grade & subject

Preschool–6th, added daily. Ad-free.

Live component · Membership band

The second offer, always in navy

Want even more?

Unlock every resource, in every grade.

  • Entire library & unlimited downloads
  • Printables, games, songs & videos
  • Use with your class or your kids at home
★ Most teachers pick YearlyYearly
$3.33/month

You save $79.67 every year

Start My 3 Free Days

$0 today · cancel anytime

Monthly
$9.97/month

Flexible, month to month

Start My 3 Free Days

$0 today · cancel anytime

Prices shown are today’s. On live pages, always pull them from hft_pricing_config(). Never type prices by hand.

Live component · FAQ

Good to know

Is it really free?

Yes. All 10 resources are free to download and keep. No credit card, no trial, nothing to cancel.

Can I use them in my classroom and at home?

Absolutely. Every resource works for teachers and for families at the kitchen table.

Will you email me?

Only helpful things: new free resources and teaching ideas. Unsubscribe anytime.

Colour · One accent per page

Landing-page accents

Each page uses one accent and its light tint. Grade pages use their grade accent. Hub, pricing and general pages use pink. Blog posts use the grade accent when the post is for one grade, otherwise pink. Click a swatch to copy it. Note: these are page accents. Catalog card tags still use the colours in 02b.

General / Hub / Pricing
#D6337B
tint #FDE7F0
Preschool
#E4478C
tint #FDE7F0
Kindergarten
#D2470B
tint #FDEBDD
1st Grade
#1F8551
tint #E1F4E9
2nd Grade
#0758A1
tint #E0EEFB
3rd Grade
#7A3FA8
tint #EFE5F8
4th Grade
#0F7F86
tint #DDF3F4
5th Grade
#CC2E2E
tint #FBE3E3
6th Grade
#1B437D
tint #E2EAF6

Fixed on every page whatever the accent: navy #1B437D headings, pink #D6337B main buttons, sail yellow #FBB915 highlights & checks, cream #FBF5EC / #FFFCF6 backgrounds, line #E9E0D4, slate #5A6B7D fine print, body text #3d4a57.

Tokens

The numbers behind the fun

TokenValueUsed for
H1Fredoka 700 · clamp(40px, 5.6vw, 72px) · line 1.02 · −0.02emOne per page. One <em> word in the accent with a yellow highlighter swash (−1.5°).
H2Fredoka 700 · clamp(30px, 3.6vw, 46px) · line 1.08Section headlines, centred, balanced wrap
EyebrowFredoka 600 · 15px · caps · 0.08emAccent colour (yellow on navy)
KickerFredoka 600 · 20–26px · accentThe emotional “dream” line above the H1
BodyNunito Sans · 17–21px lede · 15–17px cards · 1.55 lineBody copy #3d4a57. Bold words in navy.
RadiusCovers 16–18 · FAQ 20 · cards 24–28 · bands 30 · buttons 999Everything is rounded. No sharp corners anywhere.
Shadow0 18px 40px −18px rgba(27,67,125,.35), 0 4px 10px rgba(27,67,125,.06)Cards, covers, plans. Navy-tinted, never grey.
WidthWrap 1240px (gallery 1380px) · text max ~42emSection padding clamp(64px, 8vw, 120px)
MotionCards & tiles lift 6px on hover · buttons never move on hover, they press 3px on click · stickers bob 5s · trial buttons shine every 5sTurn every animation off for prefers-reduced-motion
TiltCards ±1–1.2° · covers −11°…+9° · stickers −12°…+7°Tilted items straighten when you hover them
Building it

Same look on pages, posts and emails

Same components, three homes. Never invent a new colour, button or card. Reuse what’s already here.

WhereHow to build itClass family
New landing pageTheme template that loads hft-free.css. Copy the /free/<grade>/ structure and set --fb-accent / --fb-tint on <main>..hft-fb-* (+ .hft-pr-* for pricing parts)
Blog postBlog POST-TEMPLATE v2 (“Free Bundle” style) in the Code editor. Its inline <style> mirrors these tokens. Hero art shows only what the post is about. Keep the “On this page” box..hft-bp .bp-*
EmailHand-built to look like the post: cream bg, Fredoka heads, one pink button. Buttons stack full-width on mobile, never squeezed side by side.Email template (inline styles)
Small site elementPill, sticker or card on an existing page. Use the tokens above and the shine class on trial buttons..hft-shine, brand vars in hft-brand-2026.css

Map: hero .hft-fb-hero ↔ .bp-hero · pill .hft-fb-pill ↔ .bp-pill · kicker ↔ .bp-kicker · swash ↔ .bp-swash · stickers .hft-fb-sticker ↔ .bp-sticker · gallery ↔ .bp-gallery · steps ↔ .bp-steps · plans ↔ .bp-plans · buttons .hft-fb-btn ↔ .bp-btn.

Copy voice

Warm, short, specific

Write to teachers and parents. Sell the dream first, then make the offer concrete. Only use claims the site already makes: 10,000+ resources, 2M+ teachers & families, 20+ years, Preschool–6th, 3 days free. Never make up testimonials or numbers.

Pill🎁 Free for preschool teachers & parentsWho it’s for. White, accent text.
KickerLittle hands. Big discoveries.The dream, in five words or fewer.
H1Get 10 free Preschool resourcesA concrete offer with one highlighted word.
Section H2Three steps. Zero prep.Short, rhythmic, confident.
ButtonSend me my 10 free resources →First person, says exactly what you get.
Fine print$0 today · cancel anytimeSlate, small, middle-dot separators.
Quick check before you publish

Do this. Not that.

Do
  • Put the main offer and its button above the fold
  • Use real resource covers and video thumbnails as the art
  • Pick one accent and use it everywhere on the page
  • Give each band its own background (cream, tint, navy, white)
  • Make CTAs state-aware: visitor → free offer, claimed → membership, member → My Library
  • Check the page on a phone. Buttons stack and nothing scrolls sideways.
Don’t
  • Fall back to a plain wall-of-text layout (that’s only for legal pages)
  • Use stock photos, clip art or worksheets the page isn’t about
  • Mix two accents, or use pink for anything except the main action
  • Use more than two stickers in a hero, or tilt things more than 12°
  • Make up prices, stats, quotes or reviews
  • Show member wording (“Go to My Library”) to a visitor
Make every page feel like the first day of school.

Start from the Free Kindergarten page. It has every v3 piece in one place.

Open the master template →
00 — Who we design for

Designed for the teacher who does it all

Our audience is women aged 20–45 who teach little kids — Pre‑K through 6th grade: classroom teachers and homeschool moms, often juggling many students, lesson plans and limited time. She wants resources that feel warm, joyful and reassuring — colorful enough to delight her kids, simple enough to use at 9pm. v3 leans into rounded shapes, warm cream, generous whitespace, and one obvious next step on every screen. Trust cues (2M+ teachers, 20+ years, free samples) sit on the call‑to‑action, not near it — see 05b — Conversion patterns, which is where this audience actually gets served.

Pre‑K–6th teachers Homeschool moms Women 20–45 Time‑poor, heart‑rich
00b — The grade-span system

How the brand grows up

There is one brand, not three. But the same ingredients — color, shape, type, tone — are dialed by grade band. Younger runs warmer, rounder and more colorful; older runs cooler, tighter and more editorial. The house default is the Elementary setting — warm, rounded and friendly — because that’s where most of what we make lives (Pre-K–5th). Push cooler and tighter only as the grades climb.

Elementary School House default
Pre-K – 5th
Letter B Tracing Fun!
View Resource
Color: full sail brights
Shape: round, pill buttons
Type: Fredoka leads
Voice: playful, friendly
Middle School
6th – 8th
Cell Structure Lab & Worksheet
View Resource
Color: navy-forward, thin accents
Shape: 8px, tags stay pills
Type: Source Serif headlines
Voice: plain, respectful
High School
9th – 12th
Argumentative Essay Rubric
View Resource
Color: navy / ink / cream
Shape: 6px, minimal
Type: Source Serif, tight
CTA stays pink — every band
Warmer · more color · rounderCooler · less color · tighter
The mark never changes. The pinwheel, wordmark and favicon are identical in every band — that’s what holds a Pre-K printable and an AP study guide together as one brand. Only the world around the logo shifts.
Color intensity is the loudest dial. Elementary leans on the bright sails as fields; High School uses the exact same hexes as hairline accents on navy and cream. Same palette, opposite volume.
Shape carries age. Full pills read youngest. As the grade climbs, the corner radius tightens from 999px pills to a calm 6px — soft, but not bouncy.
Type does the quiet work. Fredoka signals play, so it recedes as grades rise; Source Serif 4 signals rigor, so it leads. Both stay in every band — the ratio is what moves.
02 — Color

Color system

Every brand color is now sampled straight out of the logo. Navy #1B437D is the anchor (it’s the wordmark). The four pinwheel sails — yellow, green, blue, pink — are the whole accent system and map one‑to‑one onto the four core subjects. Warm cream neutrals keep it friendly, never clinical. Orange is a category colour (Summer School, the Kindergarten accent), never a button. Pink #D6337B is the only button colour, and sail yellow is used only for Buy on Amazon. Click any swatch to copy its hex.

Anchor — navy & blue
Navy 900
#12305A
Footers, hero depth.
Navy · PRIMARY
#1B437D
The wordmark. Headings, nav, bands.
Blue · sail
#0758A1
Links, buttons, math / STEM.
Blue 400
#5A93DA
Focus rings, interactive.
Blue 100
#D5E4F5
Tints, icon tiles.
Blue 50
#EFF4FB
Cool section wash.
The four sails (accents & curriculum categories)
Yellow · sail
#FBB915
Writing / phonics. Badges, stars (dark text).
Green · sail
#34B26A
Reading. Success, “free” tags.
Blue · sail
#0758A1
Math / STEM. Links.
Coral · display
#F26E5F
Ink text only. White fails at 2.9 : 1.
Pink · sail
#F0619E
Social studies, illustration & tints. Signature accent.
Pink 600
#D64C86
Pink hover / active.
Extended surfaces — not in the logo, all white‑text safe
CTA Pink · THE button
#D6337B
The one big button. White text, always.
CTA Pink 600
#B62A67
CTA hover / active.
Purple
#7A3FA8
Music & sound — Songs. Playful, never a warning.
Purple 700
#633389
Purple hover / active.
Arcade Teal
#007C89
Games — play & interactive. White text 4.9 : 1.
Red
#CC2E2E
Watch & play — Videos. Not an error color.
Red 700
#A82525
Red hover / active.
Orange
#D2470B
Summer School, urgency, warning. White text.
Orange 600
#B03C09
Orange hover / active.
Green 600
#2A9358
Green hover / active.

Red and purple are full brand colors, not one‑offs. Purple #7A3FA8 (6.8 : 1 on white) is the music & sound family — it lets Songs be joyful again instead of the bronze compromise. Red #CC2E2E (5.3 : 1) is watch & play — Videos. Two rules keep them honest: red is never the error color (error stays the softer #C9584E, and errors are always paired with an icon + text), and neither one ever becomes a CTA — pink is the only button.

Coral & Orange — one color, two weights
Coral · display
Ink text on coral
5.6 : 1 ✓ AA

#F26E5F — tints, illustration, section washes, badges and flags with dark text. It is the warm, friendly, not-burnt face of the brand.

✕ Never white text. 2.9 : 1 — fails AA text (4.5) and the 3.0 floor for large text and UI. Not a button. Not a tag.

Orange · surface
White text on orange
4.5 : 1 ✓ AA

#D2470B — buttons, tags, bands, the Summer School format, warning states. Hover #B03C09 (6.0 : 1).

This is the brightest orange that exists at 4.5 : 1. Anything more vivid cannot carry white text — and anything darker stops being orange and turns brown. It sits exactly on the wall.

Why not one color? Because white text and “bright orange” are mutually exclusive — the same wall that made yellow impossible. Rather than compromise the color or break the contrast rule, we keep both: coral is the look, orange is the surface. Same hue family, so they read as one brand color at two weights. Retired in the process: burnt orange #B85C10 (brown, not orange) and #C0410E (5° from the new orange — indistinguishable).
Clean neutrals & backgrounds
Ink
#231F20
Body & headings text.
Slate
#5A6B7D
Secondary text.
Muted
#93A0AD
Meta, captions.
Cream 50
#FFFCF6
Card / stage background.
Cream 100
#FBF5EC
Soft page background.
Cream 200
#EEE6DA
Borders, section fills.
Semantic (feedback states)
Success
#2A9358
Saved, confirmed. (Sail green, darkened for AA.)
Warning
#FBB915
Attention needed (dark text).
Error
#C9584E
Problems, required fields.
Info
#0758A1
Tips & neutral notices. (Sail blue.)
02b — Category Product ID Tags

Category Product ID Tags

The little uppercase pill on every product card — Worksheet, Video, Song — is the fastest way a teacher scans /resources/. It’s also the card’s top border and its grade label, so each format owns one color end to end.

This is the canonical set. Every one of the 19 formats in the live Format filter owns exactly one color — no defaults, no fallbacks, no two formats sharing a hue. The colors sit in seven families, so she learns six or seven ideas, not nineteen. Click any hex to copy.

One rule: white text, always. Every tag on this page is dark enough to carry white at 11px — minimum 4.5 : 1, no exceptions, no per‑tag overrides. That’s what makes the system predictable: a new format needs one color, not a color and a text decision.
Media has its own two colors. Songs is brand purple #7A3FA8 (6.8 : 1) and Videos is brand red #CC2E2E (5.3 : 1). Sound and screen are the two things on this site she plays rather than prints, and they are the only purple and the only red on the grid — spotted in a single pass. Burnt orange stays warm-adjacent for Summer School, the one format that means “hurry.”
Red is a category color, not an alarm. Error stays the softer #C9584E and never appears as a tag; red never appears as a message. Neither purple nor red is ever a button — pink is the only CTA on the site.
Green family — printable practice
The green sail. What she prints and hands out.
FormatTagHexWhite text
WorksheetsWorksheet#1F85514.6 : 1 ✓
Graphic OrganizersOrganizer#0F7A635.3 : 1 ✓
Blue family — check & screen
The blue sail. Measuring learning, and anything that lives on a device.
FormatTagHexWhite text
AssessmentsAssessment#0758A17.2 : 1 ✓
Digital LearningDigital#2A72B55.0 : 1 ✓
Google ClassroomClassroom#1D6A945.9 : 1 ✓
Navy family — the big purchases
The wordmark navy. Substantial, multi-resource buys — this is where the money is, so it looks like it.
FormatTagHexWhite text
WorkbooksWorkbook#1B437D9.8 : 1 ✓
CurriculumCurriculum#12305A13.2 : 1 ✓
BundlesBundle#3F6FB55.1 : 1 ✓
Pink family — hands-on & quick
The pink sail, deepened until white text holds. The fun stuff — and the loudest tag on the grid.
FormatTagHexWhite text
ActivitiesActivity#D6337B4.6 : 1 ✓
Micro LessonsMicro Lesson#9E3C746.3 : 1 ✓
Purple family — music & sound
Brand purple. Anything she plays out loud. Purple is new to the brand and owns this family alone — nothing else on the grid is purple, so a song is spotted in one pass.
FormatTagHexWhite text
SongsSong#7A3FA86.8 : 1 ✓
Teal family — games & play
Arcade Teal, added 2026-09-30 for Games. The only teal on the grid, so a game is spotted in one pass — and it sits apart from Songs purple and the pink buttons.
FormatTagHexWhite text
GamesGame#007C894.9 : 1 ✓
Warm family — watch & hurry
Brand red for screen media; burnt orange for the one format that means “the clock is ticking.”
FormatTagHexWhite text
VideosVideo#CC2E2E5.3 : 1 ✓
Summer SchoolSummer#D2470B5.3 : 1 ✓
Slate family — utility & planning
Deliberately quiet. These are tools, not treats — they shouldn’t out-shout a song or an activity.
FormatTagHexWhite text
Flash CardsFlash Card#5A6B7D5.5 : 1 ✓
Lesson PlansLesson Plan#3E4C5A8.8 : 1 ✓
Common Core LessonsCommon Core#6174884.8 : 1 ✓
InteractiveInteractive#7A64595.5 : 1 ✓
Relief Packs (being phased out; Interactive took over this colour on 2026-10-02)Relief Pack#7A64595.5 : 1 ✓
One color, three places — the pill background, the card’s 3px top border, and the grade label above the title all use the same --accent. Set it once per category.
Every format has a tag now — nothing falls back to a default. New format? Give it a color inside one of the seven families, dark enough for white text. Never a brand-new hue.
Six families, not nineteen colors — she isn’t learning a 17-color legend. She’s learning “green = printable, navy = the big one, pink = fun.” The hue does the work; the label does the rest.

The tags on real cards live in one place now. This section defines the nineteen colours; 05d — HFT Search and Filter is where they get used, on the grid and list cards a teacher actually meets.

CSS — drop-in replacement
Resource card + category tag CSS307 lines · click to expand
/* =========================================================================
   HFT Resource Card + Category ID Tags — Brand Kit V2.1 (Pinwheel)
   Card anatomy is unchanged from the live /resources/ card:
   full-bleed header band > thumbnail > title > price > full-width button.
   Only the colors, fonts and button are new.
   RULE: white text on every band and every button. No exceptions.
   ========================================================================= */
:root{
  /* Category accents — all clear 4.5:1 against #fff at 11px */
  --cat-worksheets:            #1F8551;
  --cat-graphic-organizers:    #0F7A63;
  --cat-assessments:           #0758A1;
  --cat-digital-learning:      #2A72B5;
  --cat-google-classroom:      #1D6A94;
  --cat-workbooks:             #1B437D;
  --cat-curriculum:            #12305A;
  --cat-bundles:               #3F6FB5;
  --cat-activities:            #D6337B;
  --cat-micro-lessons:         #9E3C74;
  --cat-songs:                 #7A3FA8;
  --cat-games:                 #007C89;
  --cat-videos:                #CC2E2E;
  --cat-summer-school:         #D2470B;
  --cat-flash-cards:           #5A6B7D;
  --cat-lesson-plans:          #3E4C5A;
  --cat-common-core-lessons:   #617488;
  --cat-relief-packs:          #7A6459;

  /* Card + CTA */
  --cta:#D6337B; --cta-hover:#B62A67;
  --navy:#1B437D; --ink:#231F20; --cream-50:#FFFCF6; --cream-200:#EEE6DA;
  --font-display:'Fredoka',sans-serif;
  --font-body:'Nunito Sans',sans-serif;
  --font-serif:'Source Serif 4',Georgia,serif;
}

/* ---- Per-category: one variable + one label ---- */
li.product.product_cat-worksheets          { --accent:var(--cat-worksheets); }
li.product.product_cat-worksheets           a.woocommerce-loop-product__link::before{ content:"Worksheet"; }
li.product.product_cat-graphic-organizers  { --accent:var(--cat-graphic-organizers); }
li.product.product_cat-graphic-organizers   a.woocommerce-loop-product__link::before{ content:"Organizer"; }
li.product.product_cat-assessments         { --accent:var(--cat-assessments); }
li.product.product_cat-assessments          a.woocommerce-loop-product__link::before{ content:"Assessment"; }
li.product.product_cat-digital-learning    { --accent:var(--cat-digital-learning); }
li.product.product_cat-digital-learning     a.woocommerce-loop-product__link::before{ content:"Digital"; }
li.product.product_cat-google-classroom    { --accent:var(--cat-google-classroom); }
li.product.product_cat-google-classroom     a.woocommerce-loop-product__link::before{ content:"Classroom"; }
li.product.product_cat-workbooks           { --accent:var(--cat-workbooks); }
li.product.product_cat-workbooks            a.woocommerce-loop-product__link::before{ content:"Workbook"; }
li.product.product_cat-curriculum          { --accent:var(--cat-curriculum); }
li.product.product_cat-curriculum           a.woocommerce-loop-product__link::before{ content:"Curriculum"; }
li.product.product_cat-bundles             { --accent:var(--cat-bundles); }
li.product.product_cat-bundles              a.woocommerce-loop-product__link::before{ content:"Bundle"; }
li.product.product_cat-activities          { --accent:var(--cat-activities); }
li.product.product_cat-activities           a.woocommerce-loop-product__link::before{ content:"Activity"; }
li.product.product_cat-micro-lessons       { --accent:var(--cat-micro-lessons); }
li.product.product_cat-micro-lessons        a.woocommerce-loop-product__link::before{ content:"Micro Lesson"; }
li.product.product_cat-songs               { --accent:var(--cat-songs); }
li.product.product_cat-songs                a.woocommerce-loop-product__link::before{ content:"Song"; }
li.product.product_cat-games               { --accent:var(--cat-games); }
li.product.product_cat-games                a.woocommerce-loop-product__link::before{ content:"Game"; }
li.product.product_cat-videos              { --accent:var(--cat-videos); }
li.product.product_cat-videos               a.woocommerce-loop-product__link::before{ content:"Video"; }
li.product.product_cat-summer-school       { --accent:var(--cat-summer-school); }
li.product.product_cat-summer-school        a.woocommerce-loop-product__link::before{ content:"Summer"; }
li.product.product_cat-flash-cards         { --accent:var(--cat-flash-cards); }
li.product.product_cat-flash-cards          a.woocommerce-loop-product__link::before{ content:"Flash Card"; }
li.product.product_cat-lesson-plans        { --accent:var(--cat-lesson-plans); }
li.product.product_cat-lesson-plans         a.woocommerce-loop-product__link::before{ content:"Lesson Plan"; }
li.product.product_cat-common-core-lessons { --accent:var(--cat-common-core-lessons); }
li.product.product_cat-common-core-lessons  a.woocommerce-loop-product__link::before{ content:"Common Core"; }
li.product.product_cat-relief-packs        { --accent:var(--cat-relief-packs); }
li.product.product_cat-relief-packs         a.woocommerce-loop-product__link::before{ content:"Relief Pack"; }

/* ---- The card ----
   Quiet at rest, accent on hover. The hairline is only there to give a white
   worksheet an edge against a white card; the band carries the colour. Same 1px
   in both states so the grid never reflows on hover. */
li.product{
  background:#fff !important;
  border:1px solid var(--cream-200) !important;
  border-radius:18px !important;
  overflow:hidden !important;
  display:flex !important; flex-direction:column !important;
  padding:0 !important;
  box-shadow:0 2px 10px -6px rgba(31,42,68,.35);
  transition:transform .2s cubic-bezier(.2,.8,.3,1), box-shadow .2s, border-color .2s;
}
/* Hover: lift + the accent border + the page pushes in + the title goes pink. */
li.product:hover{
  transform:translateY(-6px);
  box-shadow:0 24px 44px -22px rgba(18,48,90,.5);
  border-color:var(--accent) !important;
}
li.product:hover img{ transform:scale(1.035); }
li.product:hover .woocommerce-loop-product__title{ color:var(--cta) !important; }

/* 1 · Header band — full-bleed, NOT a floating pill */
li.product a.woocommerce-loop-product__link::before{
  display:block;
  background:var(--accent);
  color:#fff;                       /* always. every category. */
  font-family:var(--font-body);
  font-size:12px; font-weight:800;
  letter-spacing:.09em; text-transform:uppercase;
  padding:13px 18px;
  margin:0;
}

/* 2 · The page — the whole sheet, not a letterbox.
   8.5/11 is US letter. Our product images all measure 0.772–0.773 against
   letter's 0.7727, so this crops nothing and stretches nothing.
   height:auto is required: it makes aspect-ratio authoritative and neutralizes
   the width/height attributes WordPress welds onto every . */
li.product img{
  width:100% !important; height:auto !important;
  aspect-ratio:8.5/11 !important;
  object-fit:cover !important; object-position:top center !important;
  margin:0 !important; border-radius:0 !important;
  border-bottom:1px solid var(--cream-200);
  transition:transform .45s cubic-bezier(.2,.8,.3,1);
}

/* 2b · Media exception — Songs and Videos are 16:9 stills, not pages.
   The box stays 8.5:11 so the grid keeps one card height; `contain` fits the
   frame inside it whole and the accent fills the rest. Never `cover` here —
   cropping a 768×432 still to 8.5:11 throws away ~65% of it. */
li.product.product_cat-songs img,
li.product.product_cat-videos img{
  object-fit:contain !important;
  object-position:center !important;
  background:var(--accent);
  border-bottom-color:var(--accent);
}

/* 3 · Grade + title */
li.product .hft-grade{
  font-family:var(--font-body); font-size:10.5px; font-weight:800;
  letter-spacing:.06em; text-transform:uppercase;
  color:var(--accent); padding:16px 18px 0;
}
li.product .woocommerce-loop-product__title{
  font-family:var(--font-serif) !important; font-weight:600 !important;
  font-size:16px !important; line-height:1.32 !important;
  color:var(--navy) !important;
  padding:4px 18px 0 !important;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
  transition:color .18s;
}

/* 4 · Price */
li.product .price{
  font-family:var(--font-body) !important; font-weight:900 !important;
  font-size:19px !important; color:var(--ink) !important;
  padding:9px 18px 0 !important;
}
li.product .price .free{ color:#1F8551 !important; }

/* 5 · Button — full-width pink pill, white text (hft-buttons.css adds the #A4235C edge + 52px) */
li.product a.button, li.product a.button.custom-button{
  display:block !important; width:calc(100% - 36px) !important;
  margin:14px 18px 18px !important;
  text-align:center !important;
  background:var(--cta) !important; color:#fff !important;
  font-family:var(--font-body) !important; font-weight:800 !important;
  font-size:15px !important;
  padding:13px 20px !important; min-height:44px !important;
  border:none !important; border-radius:30px !important;
  transition:background .18s;
}
li.product a.button:hover{ background:var(--cta-hover) !important; }
li.product a.button:focus-visible{
  outline:none !important;
  box-shadow:0 0 0 3px #fff, 0 0 0 6px #5A93DA !important;
}
li.product .added_to_cart{ display:none !important; }   /* hide WooCommerce "View cart" */
/* =========================================================================
   FAVORITES — the heart. Secondary action. Lives in the header band.
   Markup (inject into the band, after the label):
     <button class="hft-fav" aria-pressed="false" aria-label="Save to favorites">
       <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 20.3 4.6 13a4.6 4.6 0
         0 1 6.5-6.5l.9.9.9-.9A4.6 4.6 0 1 1 19.4 13z"/></svg>
     </button>
   ========================================================================= */
li.product a.woocommerce-loop-product__link::before{
  /* band is now a flex row so the heart can sit at its right edge */
  display:flex; align-items:center; justify-content:space-between;
}
.hft-fav{
  flex:none;
  width:44px; height:44px;              /* full thumb target... */
  margin:-13px -12px -13px 0;           /* ...without growing the band */
  display:flex; align-items:center; justify-content:center;
  background:none; border:none; padding:0; cursor:pointer;
  border-radius:50%;
  transition:background .15s;
}
.hft-fav svg{ width:21px; height:21px; display:block;
  transition:transform .18s cubic-bezier(.3,1.6,.5,1); }
.hft-fav svg path{ fill:none; stroke:#fff; stroke-width:2; opacity:.85; }
.hft-fav:hover{ background:rgba(255,255,255,.16); }
.hft-fav:hover svg{ transform:scale(1.12); }
.hft-fav:active svg{ transform:scale(.92); }
.hft-fav:focus-visible{ outline:none; box-shadow:0 0 0 2px var(--accent), 0 0 0 4px #fff; }

/* Saved. Shape change, not just color — survives colorblindness + grayscale. */
.hft-fav[aria-pressed="true"] svg path{ fill:#fff; stroke:#fff; opacity:1; }
.hft-fav[aria-pressed="true"] svg{ animation:hft-favpop .34s cubic-bezier(.3,1.6,.5,1); }
@keyframes hft-favpop{ 0%{transform:scale(1)} 45%{transform:scale(1.3)} 100%{transform:scale(1)} }

@media (prefers-reduced-motion:reduce){
  .hft-fav svg, .hft-fav[aria-pressed="true"] svg{ transition:none; animation:none; }
}

/* =========================================================================
   FAVORITE CONFIRMATION TOAST
   Markup (once, before </body>):
     <div class="hft-toast" id="hft-favtoast" role="status" aria-live="polite">
       <span class="ic"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 20.3
         4.6 13a4.6 4.6 0 0 1 6.5-6.5l.9.9.9-.9A4.6 4.6 0 1 1 19.4 13z"/></svg></span>
       <span class="msg" id="hft-favmsg">Saved to favorites</span>
       <button class="undo" id="hft-favundo">Undo</button>
     </div>
   ========================================================================= */
.hft-toast{
  position:fixed; left:50%; bottom:26px;
  transform:translateX(-50%) translateY(14px);
  display:flex; align-items:center; gap:12px;
  background:#1B437D; color:#fff;                 /* brand navy. never blends in. */
  font-family:var(--font-body); font-weight:800; font-size:14.5px;
  padding:12px 14px 12px 18px;
  border-radius:16px;                 /* SURFACE radius — not a pill. */
  box-shadow:0 18px 40px -16px rgba(18,48,90,.6);
  opacity:0; pointer-events:none;
  transition:opacity .18s ease, transform .22s cubic-bezier(.3,1.4,.5,1);
  z-index:9999; max-width:calc(100vw - 32px);
}
.hft-toast.show{ opacity:1; transform:translateX(-50%) translateY(0); pointer-events:auto; }

/* Echo the icon she just tapped — not a generic check. */
.hft-toast .ic{ flex:none; width:22px; height:22px; border-radius:50%; background:#fff;
  display:flex; align-items:center; justify-content:center; }
.hft-toast .ic svg{ width:13px; height:13px; }
.hft-toast .ic svg path{ fill:var(--cta); stroke:var(--cta); }

.hft-toast .msg{ white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* Undo, not "OK". */
.hft-toast .undo{
  flex:none; background:rgba(255,255,255,.14); color:#fff; border:none; cursor:pointer;
  font-family:var(--font-body); font-weight:800; font-size:13px;
  padding:8px 16px; min-height:36px; border-radius:30px;
  transition:background .15s;
}
.hft-toast .undo:hover{ background:rgba(255,255,255,.26); }
.hft-toast .undo:focus-visible{ outline:none; box-shadow:0 0 0 2px #1B437D, 0 0 0 4px #fff; }

/* Mobile: full-width at the bottom, where her thumb already is. */
@media(max-width:520px){
  .hft-toast{ left:16px; right:16px; bottom:16px; transform:translateY(14px); max-width:none; }
  .hft-toast.show{ transform:translateY(0); }
}
@media(prefers-reduced-motion:reduce){ .hft-toast{ transition:opacity .12s; } }

/* -------------------------------------------------------------------------
   JS — one toast, replaced not queued. Undo reverts the heart.
   Focus NEVER moves into the toast.
   -------------------------------------------------------------------------
(function(){
  var el=document.getElementById('hft-favtoast'),
      msg=document.getElementById('hft-favmsg'),
      undo=document.getElementById('hft-favundo'),
      timer=null, last=null;

  function show(btn, saved){
    last=btn;
    msg.textContent = saved ? 'Saved to favorites' : 'Removed from favorites';
    el.classList.add('show');
    clearTimeout(timer);
    timer=setTimeout(function(){ el.classList.remove('show'); }, 4000);
  }

  undo.addEventListener('click', function(){
    if(!last) return;
    var on = last.getAttribute('aria-pressed')==='true';
    setFav(last, !on, false);            // revert, and don't re-toast
    el.classList.remove('show');
    clearTimeout(timer);
  });

  function setFav(btn, on, toast){
    btn.setAttribute('aria-pressed', String(on));
    btn.setAttribute('aria-label', on ? 'Remove from favorites' : 'Save to favorites');
    // Optimistic: paint first, persist after. On failure, revert quietly — never a modal.
    persist(btn.dataset.productId, on).catch(function(){ 
      btn.setAttribute('aria-pressed', String(!on));
    });
    if(toast) show(btn, on);
  }

  document.addEventListener('click', function(e){
    var btn = e.target.closest('.hft-fav');
    if(!btn) return;
    // Logged out? Let her tap anyway. Fill the heart, save the intent,
    // THEN ask for an account. Never block the tap behind a login wall.
    setFav(btn, btn.getAttribute('aria-pressed')!=='true', true);
  });
})();
------------------------------------------------------------------------- */
Simpler than the live CSS, not more complex: the pill hard-codes color:#fff once and the Songs one-off override goes away entirely.
03 — Typography

Typography

Fredoka leads — it is the logo. The wordmark is Fredoka SemiBold, so every heading on the site is drawn from the same well. Rounded and warm without being childish; the counters stay open at weight. Nunito Sans handles body copy and all UI — soft, highly legible for busy readers on phones. Source Serif 4 is the third voice: it carries product titles, testimonials and long-form reading.

Why Source Serif 4 replaced Fraunces. Fraunces italic is a boutique cue — coffee roasters and wedding stationery. It said “artisanal,” not “trusted for 20 years,” and it earned its place through prettiness rather than a job. Source Serif is a reading face built for screens: sturdy at 14px on a product card, comfortable across a 900-word blog post, and quietly credible under a testimonial. It never competes with Fredoka, because it isn’t trying to be fun. That’s the point — Fredoka is the personality, Source Serif is the proof.
Wordmark spec: Fredoka SemiBold (600), lowercase, tracking −12/1000 em (−1.2%), all navy #1B437D. Fredoka is SIL Open Font License 1.1 — free for commercial use, modifiable, redistributable with OFL.txt. Ship the wordmark as outlines in print; use live text only where Fredoka is installed. Never apply negative tracking to body copy — it hurts legibility below 24px.
Fredoka 700 · Display / hero — clamp 34–50px
Have fun teaching, every day.
Fredoka 600 · Section heading — 30px
Everything you need to teach
Source Serif 4 600 · Product titles & quotes — 24px
“Finally, my evenings back.”
Fredoka 500 · Sub‑heading — 20px
Worksheets, songs, videos & lesson plans
Nunito Sans 400 · Body — 17px / 1.6
Save hours of prep with ready‑to‑teach resources loved by 2 million teachers and homeschool families. Download, print, and teach — no login required to browse.
Type scale
AaDisplay · Fredoka 700 · clamp(34–50)
AaH1 · Fredoka 700 · 34px
AaH2 · Fredoka 600 · 30px
AaSerif · Source Serif 4 · 24px
The quick brown foxBody · Nunito 400 · 17px
UPDATED 2 DAYS AGOMeta · Nunito 800 · 13px
04 — Buttons · updated Oct 2026 (theme 1.0.322+)

One pink button. Everything else steps back.

Every button is a true pill (999px). There are five roles. The main action is always pink: Add to cart, Download, Play, Watch, Open and Start My 3 Free Days all use it. The old yellow “Buy” role was retired in theme 1.0.322 (Mark #173). Its --buy tokens now point to the pink, and sail yellow is used only for Buy on Amazon. Source of truth: assets/css/hft-buttons.css, loaded last on every page.

1 · Main

Pink #D6337B, white text, darker-pink bottom edge 0 4px 0 #A4235C. One per box. Free Download · Add to cart · Download the PDF · Play the Game · Watch Now · Open Interactive Workbook · View Resource · Checkout · Place order.

1b · Main + shine (trial)

The same pink button plus a light sweep every 5 s (.hft-shine). Only for the free trial: Start My 3 Free Days, the header’s Start free, plan cards. On hover it turns #B62A67 like every main button (white text 6:1, passes AA), keeps the shine and the edge, and adds a soft pink halo. It never lifts; a click presses it 3px. (Theme 1.0.430 — the old #E4488E hover was 3.7:1 and failed AA.)

2 · Secondary

White, 2px navy outline, navy text, flat. Fills navy on hover. Save ♡ · Download PDF (row 2) · Assign in Classroom · Compare plans · Monthly plan · View cart.

3 · Try free

White, 2px navy outline, navy text, pink ▶ icon, flat. For “try it” links under the product image and in Test Prep. (Play Free Now and Watch Free are now the pink main button for visitors.)

4 · Amazon

Sail yellow #FBB915, navy text. Only “Buy on Amazon” (paperbacks). It is the one button that is not white-on-colour or an outline.

5 · Link

Text only, no box. Pink or navy on light backgrounds, sail yellow on navy. Read our guarantee →, See plans, Log in, Clear all.

Hover never moves a button. The fill darkens (pink → #B62A67, outline → navy fill) and that’s all. Cards and tiles may lift; buttons don’t.
A click presses it in. The main button drops 3px and its edge shrinks to 0 1px 0, in 60ms. Outline and Try buttons stay flat.
Focus is a navy ring. outline: 3px solid #1B437D; outline-offset: 3px, on every button and link button.
Disabled = 55% opacity and no bottom edge. Never grey it out by changing the colour.

One height, four places it changes

WhereHeightTypeWhy
Everywhere52pxNunito Sans 800 · 16pxOne size for every page, buy box, card and form (Mark #178). The ♡ Save pill beside the main button is exactly 52px too (border-box, 2px navy outline included) and lines up with its top; the main button’s 4px edge hangs below (theme 1.0.430).
Header bar & phone drawer44pxNunito Sans 800Keeps the header slim. 44px is still the touch minimum.
Inside tables, rows & notices40pxNunito Sans 800 · 14pxMy Account Downloads, cart notices: lists stay compact.
Kids’ class page /class/64pxBigger typeSmall hands, big targets.

Retired: the yellow Buy role, the navy filled secondary, the Small / Medium / Large scale, hover lift, and the 97% press shrink. If you find one of these on a page, it’s a bug.

04B — The buy box · every format × every viewer

Same places, every product.

The product page always lays out the box the same way. Row 1 is the pink main button with ♡ Save on its right. Row 2 holds the white outline buttons. The small line comes last. When a visitor joins, her main button stays in the same spot and only its words change. Captured from the live site (theme 1.0.396, Oct 7 2026). Open a format to see each viewer.

Main pinkSecondary outline♡ SaveBuy on Amazon ↗See plans link join box
Printables (PDF)Worksheets 4,568 · Activities 874 · Assessments 835 · Lessons · Flash Cards · Organizers · Workbooks · Bundles
Visitor first visit
Free Download♡ Save

Free teacher account · no credit card

No price shown. Tapping opens the sign-up popup: one free resource per teacher or family, on products up to $7.00.

Visitor used her free one

$6.97

Add to cart♡ Save
Want this one free too?Start my 3 free days →See plans
Signed in not a member

Same as “used her free one”. Every signed-in non-member shares one cached copy of the page.

Membership ended expired · paused

Same as signed in.

Bought it not a member

Same as signed in. Her file is in My Account → Downloads.

Member
Download the PDF♡ Save

Included in your membership.

Free ($0) resources: everyone gets Download in place of Add to cart. Download labels say what you get: “Download the PDF”, “Download the Video”, “Download for PC & Mac”. Anything else keeps plain “Download”.

GameMembership-only. No price, no cart, no download.
Visitor first visit or used free one
▶ Play Free Now♡ Save
★ MembershipGet every game, song, & printable
  • Every game, played online
  • 10,000+ printables
  • Assign in Classroom
Start my 3 free days →

Then $39.97/year · cancel anytime · See plans

Already a member? Log in

Signed in not a member

Same as visitor, without the Log in line.

Membership ended
▶ Play Free Now♡
Rejoin Have Fun Teaching →

Goes to her renew page (or /pricing/).

Bought it

Games can’t be bought, so she sees the signed-in box.

Member
▶ Play the Game♡ Save
Assign in Classroom

Included with your membership

The join box follows the v3 design: cream card, 6px plum top edge, ★ Membership pill, Fredoka headline with a yellow swash, yellow checks, a bobbing pink “Play it all!” sticker, one pink button. Prices are read live from the Yearly plan.

Worksheet + GameTwo products, linked both ways (Game Products v2). Replaces the retired "Worksheet + Interactive".
▶ Game Play onlinePrintable PDF Print at home

Format switch at the top of BOTH buy boxes: 2px plum #5A2385 frame, radius 14px, two equal halves, Nunito Sans 800 15px with an 11.5px line under each name. The half for this page is solid plum with white text; the other half is a link to the paired product (worksheet _hft_game_product ↔ game _hft_game_worksheet). Same order on both pages: Game, then Printable PDF. Each is its own product with its own page and Format (Worksheets / Games). Shown: the worksheet page.

Visitor worksheet page
Free Download♡ Save

First visit. After the free one is used, signed in, or ended: price + Add to cart + Save, same as Printables. The join box ("Start my 3 free days →") sits under the buttons.

Visitor game page

Same as the Game box above: Play Free Now, Assign in HFT Classroom (non-members get the join popup), then the join box. No price, no cart.

Bought the PDF
Download the PDF♡ Save

Worksheet page. The game page stays the visitor game box (games are membership-only).

Member worksheet page
Download the PDF♡ Save
Assign in HFT Classroom
Member game page
Play the Game♡ Save
Assign in HFT Classroom

Retired 2026-10-10: "Interactive Worksheet" is gone. Interactive Worksheets are now Games; /worksheet/<slug>/ 301s to the linked /play/ game (or to the worksheet page until its game ships). Never label a card "Interactive". The Interactive Workbook edition in Test Prep is a different thing and stays.

Songs, videos & micro-lessonsSongs 362 · Videos 366 · Micro-Lessons 4
Visitor first visit
▶ Watch Free♡ Save
Free Download

Free teacher account · no credit card

Watch plays the video right on the page (on a phone it scrolls up to the player). Free Download opens the sign-up popup.

Used free one · Signed in · Ended · Bought
▶ Watch Free♡ Save

$6.97

Add to cart
Want this one free too?Start my 3 free days →
Member
▶ Watch Now♡ Save
Download the Video

Included in your membership.

Free ($0) songs: everyone gets Download in place of Add to cart. The /watch/ page is only for students on an assignment link.

Test Prep workbookThe design every other box copies.
Visitor · Signed in · Ended
Printable PDFInteractive✓ BundleSchool LicensePaperback
Add to Cart · $9.99♡ Save

See plans

Format cards: white with a cream border; the picked card gets a blue #0758A1 border and a light blue tint. Bundle is picked first. The Paperback card swaps the button for Buy on Amazon ↗ (yellow).

Bought it owner box
Open Interactive Workbook
Download PDFAssign in Classroom

Bought the Interactive only: row 2 reads Add PDF to Cart · $6.97.

Member
Open Interactive Workbook♡
Download the PDFAssign in Classroom

Included in your membership.

Add the School License · $49.97

Buy on Amazon ↗
Things we shipMusic CDs 8 · Video DVDs 4 · printed paperbacks
Everyone member or visitor

Price

Add to cart♡ Save

A membership doesn’t post anything, so there’s no “Included” line.

Paperback sold only on Amazon
Buy on Amazon ↗
Memberships & pricingTeacher / Family · School & Co-op
Teacher / Family
Start My 3 Free Days

Free for 3 days · Cancel anytime

Yearly is the picked plan (pink border, “★ Most teachers pick Yearly” badge). The Monthly card uses the outline button.

Free Starter
Start Free — No Card Needed
School & Co-op
Sign Up My School

100% money-back guarantee

StudentsArriving on a Classroom link

Students never see a buy box. A class link (/class/<code>/) opens the assigned game, worksheet or workbook directly, with 64px kid-size buttons and no prices, sign-ups or Save.

One pink per box. The join card’s “Start my 3 free days” is the only exception, because it sits in its own card below the box.
Never show member words to a visitor. “Included in your membership”, “Play the Game” and “Download the PDF” (free) only appear for members.
The cached page decides. Visitors share one copy, and signed-in non-members share another. The member and owner boxes are filled in on the page itself.
Prices are never typed by hand. They come from the product and from the plans (hft_pricing_config()).
05 — Components

Core components

The pieces that show up everywhere and belong to no single page. The resource card — the one component that carries the store — now lives with the search and filter UI it appears inside: 05d — HFT Search and Filter.

Category pills
Reading Math Writing Songs Science New
Testimonial · form · status
★★★★★

“I saved my whole Sunday. My kindergartners are obsessed with the songs and I actually got my evening back.”

J
Jessie L.Kindergarten teacher
Start free — no card needed
Status tags
Active member Save 33% New this week
Component principles
One primary action per view — reduce decision fatigue for busy teachers.
Soft elevation, not hard borders — cards feel approachable and tactile.
Warmth through accents — coral, gold & curriculum colors add joy without losing trust.
Generous whitespace — calm, uncluttered, easy to scan on a phone.
Trust cues stay visible — stars, “2M+ teachers”, free samples near every CTA.
Pills everywhere — buttons, tags and toggles share one rounded language.
05a — Across the span

One card, three grade bands

The same product card, shown as it should feel at three points on the dial. Same structure, same logo, same palette — the color intensity, corner radius, and headline face shift with the audience. The first card (Elementary) is the house default.

Worksheet♥
✍️
Elementary · Kindergarten

Letter B Tracing & Coloring Fun!

FREE
View Resource
Assessment♥
🔬
Middle · 7th Grade

Cell Structure Lab & Worksheet

$6.97
View Resource
Lesson Plan♥
📝
High · 11th Grade

Argumentative Essay Rubric & Checklist

$8.97
View Resource
Left to right: Elementary (house default; sail green, pill button, Fredoka title) → Middle → High (near-square button, serif title, navy accents). The pink View Resource button stays the same in every band; only the radius, headline face and color intensity move. The catalog can mix all three on one page and still read as one store.
05b — Conversion patterns

The five moments that decide the sale

Everything above this section is about the brand. This section is about her — a teacher or homeschool mom, 20–45, on a phone, at 9pm, with tomorrow’s lesson unplanned. She is not browsing. She is solving a problem before she can go to bed. A brand kit that stops at logos and swatches leaves the actual money on the table, so these are the five screens where the decision really happens.

1

The card, at 375px

The product card is the whole store. She meets it 24 at a time, thumb‑scrolling. Tag pill first, then the thumbnail, then a title she can read at 14px. Grade visible without tapping; the price waits on the product page.

Why: every tap she has to make to learn something basic is a place she leaves.
2

Proof sits on the button, not near it

The hesitation (“is this actually good?”) happens in the half‑second before the tap. Reassurance placed below the fold, or in a testimonial section further down, arrives after the decision is made.

Why: proof is only useful where the doubt is.
3

Price framed against her real alternative

$39.97/yr competes with “I’ll just make it myself at 11pm.” Frame it in her currency — hours, not dollars. Anchor against the à la carte price she already saw ($6.97 per resource).

Why: she doesn’t compare us to competitors. She compares us to her own free labor.
4

The free path is a door, not a demo

She should be able to hold a real, printable, classroom‑ready resource in her hand before she pays anything. Not a watermarked sample. Not a preview. The actual thing.

Why: the product is the sales pitch. Nothing we write beats her using one tomorrow.
5

Risk gets named and killed

Card required? Auto‑renew? Can I cancel? These are the questions she’s actually asking. Answer them at the button, in plain language, in 12px — never buried in a policy page.

Why: unanswered risk isn’t neutral. It’s a no.
★

The one‑line test

Every screen answers one question: “What do I do next, and what happens if I do?” If a page can’t answer both in under three seconds, it isn’t finished.

Why: a page that fails this test doesn’t need better copy — it needs the next step named. Apply it to any page before it ships.
Price presentation
Yearly Membership
$39.97
per year · about $3.33 a month
That’s 6 worksheets — for 10,000+.
★★★★★ Trusted by 2M+ teachers
Free for 3 days · cancel anytime · no card charged today
What’s doing the work here
  • ✓ $3.33 a month — the real number is annual, but the felt number is monthly.
  • ✓ 6 worksheets vs 6,600 — anchors against the price she already saw, not against a competitor.
  • ✓ Proof under the button, where the doubt lives — not in a carousel 800px down.
  • ✓ “No card charged today” — names the fear out loud instead of hoping she won’t think of it.
  • ✓ One pink button. Nothing else on the card is allowed to be pink.
Copy: what we say vs. what she hears
✕ Brand-centred

“Explore our comprehensive library of standards‑aligned educational resources.”

Describes us. Makes her do the translation work into her own life. “Comprehensive” and “library” are words she has to browse, and she has no time to browse.

✓ Her-centred

“Tomorrow’s lesson, ready in five minutes.”

Describes her outcome. Names the deadline she’s actually up against. She doesn’t want a library — she wants to be done and go to sleep.

✕ Feature

“Unlimited downloads & printing”

True, but it’s a spec. It asks her to imagine the benefit herself.

✓ Consequence

“Print it for all 26 kids. Then print it again next year.”

Same fact, but she can see it. Specific numbers beat the word “unlimited” every time.

Write to one person, not a market. “Teachers and homeschool families” is a segment. She is a third‑grade teacher with 26 kids and a laminator that’s out of pouches. Write to her.
Never use urgency we don’t have. Fake countdowns and “only 3 left” on a digital download insult her. She’s been teaching for years; she can smell it. Our urgency is real and it’s hers: the lesson is tomorrow.
Respect the 9pm brain. Short sentences. One decision per screen. No jargon, no cleverness that needs a second read.
Everything here is a hypothesis. This section is design judgment, not evidence. The pink‑vs‑orange CTA, the monthly‑equivalent price, the on‑button proof — each is worth an A/B test, and the test wins over anything written on this page, including this sentence.
05d — HFT Search and Filter

HFT Search and Filter

This is the store. A teacher lands on /resources/ with three or four words in her head, types them, narrows once or twice, and decides — usually inside forty seconds. Everything here serves that: a field, a rail, and a result.

Live implementation: the HFT SAF plugin, rebranded in place. Search is .hft-saf-search, the results wrapper is .hft-cards.hft-view-grid / .hft-view-list, and the view toggle is button.hft-saf-view. Out-of-stock and hidden products drop out of this index automatically.

One card spec, one place. The resource card is defined here and nowhere else on this page. Two copies of a component means two truths, and the second one is always the one someone builds from.
Search first, filter second. She arrives with words, not with a taxonomy. The field is the primary; the rail is the recovery. Never make her build a query out of checkboxes when she could just type it.
Colour carries the taxonomy. Format owns the band (19 colours, 02b), grade owns the grade pill (14 colours), subject owns the subject chip (6 colours). Three axes, three colour families, no overlap.
Search — the field she arrives with

One field, one placeholder written in her words, one pink submit. The placeholder names the three things she actually types — a grade, a subject, or a topic — because “Search…” alone makes her guess what the box will accept.

Search (grade, subject, or topic)
As she types “add”
Adding 8 Song (Lyric Music Video)Song
Two Digit Addition WorksheetWorksheet
Addition Song — DoublesVideo
See all 412 results for “add”→
The submit is the navy magnifier inside the field. Typing is the action here, so the field stays calm. Each card below carries one pink View Resource button, and that is its only job.
Suggestions carry their format tag. A row without a tag is a string; a row with one is a decision. She can tell a printable from a video before she commits a click.
Never a dead end. The last row is always “See all N results”. Zero results gets a rephrase suggestion and a “tell us what you need” — those queries are the content roadmap. Full behaviour in 05c.
44px submit, 44px rows. She is on a phone, one-handed, often standing up.
Filter — the rail that narrows

The rail is for the second move, not the first. Grade, then subject, then format — that is the order she thinks in, so that is the order of the groups. Counts sit on every row: depth is the product, and she should feel it before she clicks.

Grade −
Subject −
Format +
Price +
318 resources 1st Grade × Math × Clear all
Active filters are chips, and the chip is the taxonomy’s colour. “1st Grade” is grade green, “Math” is subject blue — the same colours the cards below use. She learns the legend by using it, not by reading it.
Every chip carries its own ×. Removing one filter must never cost her the other three. “Clear all” sits beside them, quiet and underlined, for when it does.
The count is the first thing on the bar. “318 resources” tells her whether to narrow again or start scanning. A rail with no count is a rail she has to guess at.
The view toggle sits at the far right of the bar and remembers her choice. Grid is the default — she is usually judging by the page, not by the words.
Results — the grid card, five across

She meets this card 24 at a time on a phone, so it does one job: say what this is, show it, and give her one button. The thumbnail is the whole sheet. Not a letterbox crop of the top ~40%, which on a worksheet is the header and the “Name / Date” line — the part that is identical on every worksheet and tells her nothing. It is the whole page at its true 8.5:11. Order, colors, fonts and button are otherwise as they were.

1 · Header bandFull‑bleed, solid category color, white uppercase label. Not a floating pill — the band is the color coding, and it’s the first thing the eye lands on.
2 · The page · newaspect-ratio: 8.5/11. The product image is the whole sheet, uncropped — our images all measure 0.772–0.773 against letter’s 0.7727, so they are pages. She can tell what a worksheet is before she clicks it. That is the entire point of the card.
3 · BorderA quiet cream hairline at rest — it exists to give a white sheet an edge on a white card, nothing more. The band already carries the category colour; the outline doesn’t repeat it. The accent arrives on hover, at the same 1px, so nothing reflows.
4 · HoverFour things, one gesture: the card lifts 6px, the border takes the category colour, the page pushes in 3.5% behind its frame, and the title goes CTA pink. Slow and slight — the card breathing, not a zoom.
5 · TitleSource Serif 4 600, navy, clamped to 2 lines, with a 2‑line floor so rows align. The serif is the “this is a real teaching resource” signal.
6 · No priceNo price on result cards, for anyone (Mark #179). She decides on the page, and the price waits on the product page, where the buy box frames it.
7 · ButtonFull‑width pink pill, white text, darker-pink bottom edge, 52px. One per card, and it says View Resource for everyone. The buy decision happens in the buy box (04B).
8 · Media exceptionSongs and Videos are 16:9 stills with no page to fill. Cropping a 768×432 frame to 8.5:11 would throw away ~65% of it, so .is-media floats the still at its true ratio on the accent panel. The card keeps its shape; the frame keeps its content.
✕ Rejected — words on the art

Title, price and CTA laid over a gradient scrim on the image, poster‑style. It looks good on a demo grid of hand‑picked worksheets and it fails on the real catalog: white type over unpredictable art, and a scrim that has to be QA’d against the darkest thumbnails forever. Same rule as the heart — the thumbnail is the product, so nothing sits on it.

✕ Rejected — price behind a hover

Revealing price and CTA on hover buys back the height the full page costs. It also hides the two things she’s deciding on, and it means nothing on a phone — where she is. Height is the cheaper thing to spend.

✓ Chosen — page above, words below

Every word sits on white where its contrast is a known token pair. Nothing depends on hover, nothing depends on the image being light enough. Cost, stated plainly: the card is ~37% taller than the 180px version, so roughly 1.9 rows land above a 900px fold instead of ~2.5. That is the trade, and it was made on purpose.

Assessment
Justin Bieber Biography Reading Comprehension Worksheet

Justin Bieber Biography Reading Comprehension Worksheet

$6.97
Worksheet
Third Grade Multiplication and Division Test Practice Worksheet

Third Grade Multiplication and Division Test Practice Worksheet

$6.97
Organizer
Story Map Graphic Organizer

Story Map Graphic Organizer

$6.97
Video
Hexagon Song (Original Music Video)

Hexagon Song (Original Music Video)

$6.97
Song
Adding 8 Song (Lyric Music Video)

Adding 8 Song (Lyric Music Video)

FREE
Results — the list view

The same catalogue, for the other question. Grid answers “which of these looks right?”; list answers “which of these IS right?” — it trades the big page for a description and the full taxonomy on every row. She switches to it once she has already narrowed and is comparing four near-identical worksheets.

Justin Bieber Biography Reading Comprehension Worksheet
Assessment

Justin Bieber Biography Reading Comprehension Worksheet

A one-page biography with five comprehension questions — read it, answer it, done.

5th GradeReading · WritingBiographies
$6.97
Third Grade Multiplication and Division Test Practice Worksheet
Worksheet

Third Grade Multiplication and Division Test Practice Worksheet

Mixed multiplication and division practice in the test format they will actually see.

3rd GradeMathDivision
$6.97
Story Map Graphic Organizer
Organizer

Story Map Graphic Organizer

Beginning, middle, end — the map they fill in after any read-aloud.

PreschoolELA · HolidaysStory Elements
$6.97
Hexagon Song (Original Music Video)
Video

Hexagon Song (Original Music Video)

Two minutes of shapes, sung. Play it twice and they have it.

1st GradeMathShapes
$6.97
Adding 8 Song (Lyric Music Video)
Song

Adding 8 Song (Lyric Music Video)

The +8 facts as a chorus. Free, so she can try one before she buys ten.

KindergartenMathAddition
FREE
Left border is the format accent; chips run grade → subject → skill. Same pink View Resource button, no price, and the same 2-line title rule as the grid.
Three chips, one order, every row. Grade, subject, skill. A fixed order means she scans down a column instead of hunting across a row.
Grade and subject are coloured; skill is not. Skill is a 900-value long tail — colouring it would mean inventing 900 colours and teaching none of them. The outline chip says “detail, not axis.”
Chips are links, and they filter. Tapping “Math” on a row adds Math to the rail. The card is a filter surface, not just a result.
The description is two lines, hard. It exists to break a tie between similar titles, not to be read. Three lines and the row stops being scannable.
Subject colours — the 6

The subject axis is deliberately short. Six colours is a legend she can hold; fourteen would just be the grade map again in a different order.

SubjectChipSource hexChip hexWhite textNote
Phonics (incl. Alphabet)Phonics (incl. Alphabet)#CC2E2E#CC2E2E4.71 : 1 ✓source
Reading · WritingReading · Writing#7A3FA8#7A3FA85.66 : 1 ✓source
ELA · HolidaysELA · Holidays#34B26A#247A494.54 : 1 ✓deepened — 2.7 : 1 at source
MathMath#0758A1#0758A16.02 : 1 ✓source
ScienceScience#D2470B#C3420A4.51 : 1 ✓nudged for the alpha
Social Studies (+ Specials)Social Studies (+ Specials)#F0619E#B047744.52 : 1 ✓deepened — 3.0 : 1 at source
Why 92% and not 100%. At full strength the grade pill sat at the same weight as the format band directly above it, and the card read as two competing labels. Backing it off one notch puts format first, grade second — the order she scans in — without giving up a filled pill.
White text, no exceptions. Same rule as the format tags in 02b. A new grade or subject needs a colour dark enough for white at 10px. If it isn’t, deepen it — never switch one pill’s text to navy.
The template is the source. If a worksheet template’s accent changes, the pill follows it. That is the whole point of using the template colours: the pill on the card and the ink on the page are the same decision.
Favorites — the heart

Every card gets one. But a favorite is a secondary, low-commitment action — it must never argue with “View Resource.” So it is small, and it lives in the header band — never a 44px outline sitting beside the button at equal weight, which reads as two buttons and no answer.

Worksheet
DefaultWhite outline, 85% opacity. Present, quiet, obviously tappable.
Worksheet
SavedSolid white fill, 100%. Springs on tap — one 340ms pop, no confetti.
Assessment
Any accentWhite works on all 19 bands — same rule as the label.
Song
Game
Even purpleNo per-category heart color to maintain. Ever.
Why the band, and not the thumbnail
✕ Rejected — overlay on the image

The Pinterest/Etsy convention, and wrong here. Our thumbnail is the product. She judges a worksheet by reading it — the top-right corner is where the “Name / Date” fields live. A floating heart chip covers the very thing she’s evaluating, and on a light worksheet scan a white heart disappears entirely.

✕ Rejected — beside the button

It steals horizontal space from the CTA, forcing “Download” to shrink. And at equal size it reads as an equal choice — two buttons, no answer to “what do I do next?”

✓ Chosen — right of the header band

The band’s right side is dead space. The heart is always in the same place across a 24-card scroll, contrasts hard against every accent, never occludes the resource, and gives the CTA its full width back. It costs zero vertical height.

21px icon, 44px target. The visual is small; the tap area is not. Negative margins eat the band padding so the hit box stays full-size without changing the layout. She’s tapping one-handed.
Optimistic, instant, reversible. Fill on tap, no spinner, no page jump. If the save fails, revert quietly. Never a modal — a modal for a favorite is a punishment for engaging.
Logged-out? Let her tap it anyway. Save the intent, fill the heart, then ask for an account — “Save this to your favorites” is the softest account-creation prompt we have, and it arrives at the moment she’s already decided she wants something. Blocking the tap behind a login wall throws that away. See 05b.
Never a number. No “saved 1.2k times” — social proof belongs on the CTA, not on a personal bookmark. This heart means mine, not popular.
Not color alone. Outline vs. fill is a shape change, not just a color change — it survives colorblindness and grayscale print. Backed by aria-pressed and a label that flips to “Remove from favorites.”
Favorite confirmation toast

Tap any heart above — the real thing fires at the bottom of your screen. The toast has one job: confirm the save, and offer the way back. It is brand navy, pinned bottom-centre, and it always offers Undo.

Note the corners. The toast is a 16px rounded rectangle, not a pill — see 06 — Radius encodes function. A pill container wrapping a pill Undo button is two identical shapes nested, and the whole toast starts to look pressable. It isn’t. Surface = 16px, action = pill.

✕ Rejected — the generic toast

Generic dark slate — not a brand color. Floating over the middle of the page, covering the headline she was reading. No undo, so a fat-finger tap is permanent. And “Added to favorites” is passive — it describes the system, not her.

✓ Chosen — the HFT toast

Brand navy pill, Nunito 800, pinned bottom-center where nothing lives. White circle + pink heart — the same heart she just tapped, so the confirmation looks like the action. And an Undo that actually reverts the card.

Saved to favorites
Navy on any background, always. It’s the one element that must never blend in — she needs to find it in her peripheral vision without leaving the card she’s looking at.
Bottom-center, never mid-page. The bottom edge is empty on every screen we own. Mid-page overlays cover the exact content she’s evaluating — and on mobile, the bottom is also where her thumb already is.
Undo, not “OK”. A confirmation she has to dismiss is a tax. A confirmation that offers a way back is a service. Undo restores the heart and closes the toast — no page reload, no navigation.
Echo the icon. The white circle holds the same heart in CTA pink. A green check would say “task complete”; the heart says “this is yours now.” Confirm the thing, not the transaction.
One toast, replaced — never stacked. She’ll favorite six worksheets in a row. Six queued toasts is a wall. Each tap resets the same toast and its 4-second timer.
4 seconds, then gone. Long enough to read and reach Undo, short enough not to nag. It never blocks a tap: the card underneath stays live.
role="status" + aria-live="polite". A screen reader announces the save without stealing focus mid-scroll. Focus stays on the heart she tapped — never move focus into the toast.
It says “Saved,” not “Added.” “Added to favorites” narrates the database. “Saved to favorites” is what she just did. Removing says “Removed from favorites” — same pill, same Undo.
06 — Global tokens

Radius, spacing & elevation

Radius encodes function. In this system a shape is a promise: a pill can be tapped, a rounded rectangle cannot. Everything interactive — buttons, tags, toggles, the Undo — is a full pill. Everything that holds things — cards, panels, the toast — takes the 16px surface radius. Follow that one rule and she never has to learn our UI; she can feel where to press.

Corner radius
10px · sm (inputs, chips)
16px · md · SURFACES
18px · resource card
pill · ACTIONS
This is why the favorites toast is not a pill. A pill container holding a pill Undo button is two identical shapes nested, so the whole toast reads as something you can press. It isn’t. The toast is a surface (16px); the Undo inside it is the action (pill). Same fix applies anywhere a container wraps a button.
Elevation
sm
md
lg
Baseline globals
Content width1080px
Base font17px
Line height1.6
Display fontFredoka
Serif / readingSource Serif 4
Body fontNunito Sans
Card radius16px
Button radiuspill / 999px
Spacing base4pt scale
07 — Accessibility

Built to WCAG AA

Most of our audience browses on a phone, often tired, often at night. Every filled button and every tag carries white text. The only exceptions are outline buttons (navy on white) and Buy on Amazon (navy on sail yellow). That means every interactive color has to be dark enough to earn it.

White on Navy · 9.8 : 1 ✓ AAA
White on Blue · 7.2 : 1 ✓ AAA
White on CTA Pink · 4.6 : 1 ✓ AA
White on CTA Pink hover · 6.0 : 1 ✓ AA
White on Deep Green · 4.6 : 1 ✓ AA
White on Purple · 6.8 : 1 ✓ AAA
White on Arcade Teal · 4.9 : 1 ✓ AA
White on Red · 5.3 : 1 ✓ AA
White on Orange · 4.5 : 1 ✓ AA
Ink on Coral · 5.6 : 1 ✓ AA
White on Slate · 5.5 : 1 ✓ AA
Ink on White · 16.3 : 1 ✓ AAA
The bright sails — and coral — are decoration, not surfaces. Pink #F0619E, yellow #FBB915, green #34B26A and coral #F26E5F are for illustration, tints and the logo. They are never a button or a tag background — white text fails on all four (3.0, 1.7, 2.7 and 2.9 : 1). Use their deepened forms.
Coral and orange are one color at two weights. Coral #F26E5F is the bright face you see in illustration and tints; orange #D2470B is the same color deep enough to put white words on. Never white text on coral. Never coral on a button.
Yellow pays the highest price. Dark enough for white text, yellow stops being yellow — which is exactly why Songs is now purple rather than a darkened gold. If a surface must look yellow, it can’t have text on it.
Never rely on color alone — pair every status and category color with a label. The pill has words on it for a reason.
Keep the focus ring on all interactive elements; minimum touch target 44×44px. She’s tapping with one hand and a kid on her hip.
08 — Developer handoff

CSS variables (copy & paste)

Drop these into the theme, Elementor custom CSS, or global settings to roll out v3 consistently. Note the split between display colors (the bright sails — decoration only) and surface colors (deep enough to carry white text). Mixing them up is the one way to break accessibility here.

Design token CSS72 lines · click to expand
/* Have Fun Teaching — Design Tokens v3 (Fun & Interactive) · Oct 2026
   Live sources: hft-brand-2026.css (colours, type, radius) · hft-buttons.css (buttons, loaded last)
   · hft-free.css (.hft-fb-* page components). */
:root{
  /* ---- SURFACES: anything with white text on it ---- */
  --navy-900:#12305A;  --navy:#1B437D;      /* PRIMARY — the wordmark */
  --blue:#0758A1;
  --cta:#D6337B;       --cta-hover:#B62A67; /* THE button colour */
  --cta-edge:#A4235C;                       /* pressable bottom edge */
  --cta-trial-hover:#B62A67;                /* .hft-shine trial buttons — same as --cta-hover since 1.0.430 */
  --green-deep:#1F8551;
  --purple:#7A3FA8;    --purple-700:#633389;/* music & sound — Songs */
  --plum:#5A2385;                           /* Game | Printable PDF switch, join-box edge */
  --arcade-teal:#007C89;                    /* Games */
  --interactive:#7A6459;                    /* Interactive format */
  --red:#CC2E2E;       --red-700:#A82525;   /* watch & play — Videos. NOT the error colour */
  --orange:#D2470B;    --orange-600:#B03C09;
  --slate:#5A6B7D;

  /* ---- DISPLAY: illustration, tints, highlights. NEVER white text on these ---- */
  --sail-yellow:#FBB915;  /* swash, checks, stickers, Buy on Amazon (navy text) */
  --sail-green:#34B26A;
  --sail-pink:#F0619E;
  --coral:#F26E5F;        /* ink text only */

  /* ---- Neutrals ---- */
  --ink:#231F20; --body:#3d4a57; --muted:#93A0AD;
  --cream-50:#FFFCF6; --cream:#FBF5EC; --cream-200:#EEE6DA; --line:#E9E0D4;

  /* ---- Type ---- */
  --font-display:'Fredoka',system-ui,sans-serif;       /* headings, kickers, stickers */
  --font-body:'Nunito Sans',system-ui,sans-serif;      /* body + every button */
  --font-serif:'Source Serif 4',Georgia,serif;         /* product titles, quotes, long reads */

  /* ---- Shape & depth ---- */
  --r-sm:10px; --r-md:16px; --r-card:24px; --r-band:30px;
  --r-pill:999px;                                      /* a TRUE pill, never 30px */
  --shadow:0 18px 40px -18px rgba(27,67,125,.35),0 4px 10px rgba(27,67,125,.06);

  /* ---- Buttons ---- */
  --btn-h:52px;            /* everywhere · header & drawer 44 · tables 40 · kids 64 */
  --buy:#D6337B;           /* RETIRED role — now the main pink */
}

/* MAIN — pink, white, pressable edge. Hover darkens, never moves. */
.btn-main{
  display:inline-flex; align-items:center; justify-content:center; gap:8px;
  min-height:var(--btn-h); padding:0 28px; border:0; border-radius:var(--r-pill);
  background:var(--cta); color:#fff; font:800 16px/1.15 var(--font-body);
  box-shadow:0 4px 0 var(--cta-edge);
  transition:transform .1s ease, box-shadow .1s ease, background-color .15s ease;
}
.btn-main:hover{ background:var(--cta-hover); }
.btn-main:active{ transform:translateY(3px); box-shadow:0 1px 0 var(--cta-edge); }
.btn-main:disabled{ opacity:.55; box-shadow:none; }

/* SECONDARY — white, navy outline, flat */
.btn-sec{
  min-height:var(--btn-h); padding:0 26px; border-radius:var(--r-pill);
  background:#fff; color:var(--navy); border:2px solid var(--navy); box-shadow:none;
  font:800 16px/1.15 var(--font-body);
}
.btn-sec:hover{ background:var(--navy); color:#fff; }

/* TRY FREE — the secondary look with a pink ▶ icon */
.btn-try svg{ color:var(--cta); fill:var(--cta); }

/* AMAZON — the only yellow button */
.btn-amazon{ background:var(--sail-yellow); color:var(--navy); border-radius:var(--r-pill); min-height:var(--btn-h); }

/* Focus, everywhere */
:is(.btn-main,.btn-sec,.btn-amazon):focus-visible{ outline:3px solid var(--navy); outline-offset:3px; }
09 — Downloads & assets

Logos & fonts in one place

Every version of the Have Fun Teaching logo and pinwheel, as clean SVG traced from the approved master (no fonts needed to render it) plus transparent PNGs. Right‑click → Save, or use the links. Want everything? The logo kit zip has every version of both logos in SVG, PDF, PNG and JPG at every size, the full favicon set, social images and a README.

Pinwheel

Icon only — avatars, stickers, corners. SVG.

⬇ Full color ⬇ No sticker edge ⬇ Grayscale ⬇ Black ⬇ White ⬇ Black & white

Favicon & app icons

Tab‑tuned pinwheel. Full set (ico, manifest, head snippet) in the zip.

⬇ Favicon SVG ⬇ 32px PNG ⬇ Apple touch 180px ⬇ Site Icon 512px

Raster (PNG)

Transparent, 2400px wide, for decks & docs.

⬇ Sticker logo ⬇ Full color ⬇ White ⬇ Black ⬇ Pinwheel 1024px

Fonts

Wordmark & headings = Fredoka (OFL) · Body & UI = Nunito Sans · Reading = Source Serif 4. Three fonts, three jobs.

⬇ Fredoka⬇ Nunito Sans⬇ Source Serif 4
10 — Take it with you

One file. The whole brand.

Exports this page — every rule, color, token and component — as a single self-contained HTML file you can email to a designer, a freelancer or a printer. No fonts to install, no assets to zip, no login. It opens in any browser and it is always in sync with this page, because it is this page.

Self-contained HTML · Always current · This page is the source of truth
Have Fun Teaching — Brand & Site Kit V2.1 · Pinwheel identity · Warm, playful, WCAG‑AA · Every color sampled from the logo
Copied!
Saved to favorites