Files
classroomio/prototypes/learning-paths/landing-theme.css
T
Rotimi Best 2a82abfa21 docs(prd): add learning paths PRD with end-to-end HTML prototypes
Full spec for ordered, sequentially unlocked, bundle-priced learning
paths, plus 16 clickable prototypes (public org site, learner LMS, and
teacher workspace) built on the packages/ui tokens and the minimal
org-landing theme. The prototypes are the UX source of truth; start at
prototypes/learning-paths/index.html. Also adds the write-prd skill
codifying the clarify -> write -> prototype workflow.
2026-08-06 07:35:10 +01:00

948 lines
18 KiB
CSS

/*
* landing-theme.css — public org-site pages for the learning-paths prototypes.
*
* Mirrors packages/ui/src/custom/org-landing-page/ default theme ("minimal"):
* --landing-* CSS vars from theme-vars-base.ts, square-cornered cards
* (--landing-radius-card: 0), no card shadows, pill floating nav, accent
* radial-gradient hero. Accent = the org brand (default ClassroomIO indigo).
*/
:root {
--landing-bg: oklch(1 0 0);
--landing-fg: oklch(0.185 0 0);
--landing-fg-muted: oklch(0.5 0 0);
--landing-border: oklch(0.9 0 0);
--landing-card: oklch(1 0 0);
--landing-card-soft: oklch(0.975 0 0);
--landing-accent: oklch(0.488 0.243 264.376);
--landing-accent-soft: oklch(0.488 0.243 264.376 / 0.08);
--landing-button-primary-bg: oklch(0.488 0.243 264.376);
--landing-button-primary-bg-hover: oklch(0.424 0.199 265.638);
--landing-button-primary-fg: #fff;
--landing-success: oklch(0.596 0.145 163.225);
--landing-radius-card: 0px;
--landing-radius-button: 6px;
}
.dark {
--landing-bg: oklch(0.16 0 0);
--landing-fg: oklch(0.96 0 0);
--landing-fg-muted: oklch(0.68 0 0);
--landing-border: oklch(1 0 0 / 14%);
--landing-card: oklch(0.2 0 0);
--landing-card-soft: oklch(0.24 0 0);
--landing-accent: oklch(0.623 0.214 259.815);
--landing-accent-soft: oklch(0.623 0.214 259.815 / 0.14);
--landing-button-primary-bg: oklch(0.546 0.245 262.881);
--landing-button-primary-bg-hover: oklch(0.623 0.214 259.815);
--landing-success: oklch(0.696 0.17 162.48);
}
* {
box-sizing: border-box;
border-color: var(--landing-border);
}
html {
scroll-behavior: smooth;
}
html,
body {
margin: 0;
padding: 0;
}
body {
font-family:
'Geist',
ui-sans-serif,
system-ui,
-apple-system,
'Segoe UI',
Roboto,
sans-serif;
background: var(--landing-bg);
color: var(--landing-fg);
font-size: 16px;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
a {
color: inherit;
text-decoration: none;
}
button {
font: inherit;
}
.tnum {
font-variant-numeric: tabular-nums;
}
.lp-wrap {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.lp-wrap-narrow {
max-width: 880px;
margin: 0 auto;
padding: 0 20px;
}
/* ===== pill nav (minimal theme) ===== */
.lp-nav-outer {
padding: 20px 20px 0;
max-width: 1240px;
margin: 0 auto;
}
.lp-nav {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
padding: 14px 24px;
border-radius: 999px;
border: 1px solid color-mix(in oklab, var(--landing-border) 60%, transparent);
background: linear-gradient(
135deg,
color-mix(in oklab, var(--landing-accent) 14%, transparent),
color-mix(in oklab, var(--landing-accent) 6%, transparent)
);
backdrop-filter: blur(8px);
}
.lp-nav-brand {
display: flex;
align-items: center;
gap: 10px;
font-weight: 600;
font-size: 19px;
}
.lp-nav-logo {
width: 32px;
height: 32px;
border-radius: 8px;
background: var(--landing-accent);
color: #fff;
display: grid;
place-items: center;
font-weight: 700;
font-size: 15px;
}
.lp-nav-links {
display: flex;
align-items: center;
gap: 28px;
font-size: 14.5px;
}
.lp-nav-links > a {
opacity: 0.72;
}
.lp-nav-links > a:hover,
.lp-nav-links > a.active {
opacity: 1;
}
.lp-nav-auth {
border: 1px solid var(--landing-border);
border-radius: 999px;
padding: 8px 18px;
font-size: 14px;
font-weight: 500;
background: var(--landing-card);
}
.lp-nav-auth:hover {
border-color: var(--landing-fg-muted);
}
@media (max-width: 760px) {
.lp-nav-links > a {
display: none;
}
}
/* ===== hero ===== */
.lp-hero {
position: relative;
padding: 72px 0 80px;
text-align: center;
overflow: hidden;
background:
radial-gradient(60% 90% at 50% -10%, var(--landing-accent-soft) 0%, transparent 70%),
linear-gradient(180deg, transparent, transparent);
}
.lp-hero-dots {
position: absolute;
inset: 0;
opacity: 0.08;
pointer-events: none;
background-image: radial-gradient(circle, var(--landing-fg) 1px, transparent 1.5px);
background-size: 22px 22px;
}
.lp-hero-inner {
position: relative;
max-width: 860px;
margin: 0 auto;
padding: 0 20px;
}
.lp-hero h1 {
font-size: clamp(34px, 6vw, 56px);
font-weight: 600;
letter-spacing: -0.03em;
line-height: 1.08;
margin: 0 0 20px;
text-wrap: balance;
}
.lp-hero .sub {
font-size: 19px;
font-weight: 300;
color: color-mix(in oklab, var(--landing-fg) 72%, transparent);
margin: 0 auto 32px;
max-width: 60ch;
}
.lp-cta-row {
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
flex-wrap: wrap;
}
/* ===== buttons ===== */
.lp-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
border-radius: var(--landing-radius-button);
border: 1px solid transparent;
font-weight: 500;
font-size: 15px;
padding: 10px 22px;
cursor: pointer;
transition:
background 0.12s,
border-color 0.12s;
}
.lp-btn svg {
width: 16px;
height: 16px;
stroke-width: 2;
}
.lp-btn-primary {
background: var(--landing-button-primary-bg);
color: var(--landing-button-primary-fg);
}
.lp-btn-primary:hover {
background: var(--landing-button-primary-bg-hover);
}
.lp-btn-secondary {
background: var(--landing-card);
border-color: var(--landing-border);
color: var(--landing-fg);
}
.lp-btn-secondary:hover {
border-color: var(--landing-fg-muted);
}
.lp-btn-lg {
padding: 13px 28px;
font-size: 16px;
}
.lp-btn-pill {
border-radius: 999px;
}
.lp-btn-block {
width: 100%;
}
/* ===== sections ===== */
.lp-section {
padding: 72px 0;
}
.lp-section + .lp-section {
border-top: 1px solid var(--landing-border);
}
.lp-section h2 {
font-size: 26px;
font-weight: 600;
letter-spacing: -0.02em;
margin: 0 0 8px;
}
.lp-section .lead {
color: var(--landing-fg-muted);
margin: 0 0 32px;
max-width: 62ch;
}
.lp-eyebrow {
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
font-weight: 600;
color: var(--landing-accent);
margin-bottom: 10px;
display: block;
}
/* ===== cards (minimal: square, hairline, no shadow) ===== */
.lp-card {
background: var(--landing-card);
border: 1px solid color-mix(in oklab, var(--landing-border) 60%, transparent);
border-radius: var(--landing-radius-card);
transition: border-color 0.15s;
}
a.lp-card:hover {
border-color: var(--landing-fg-muted);
}
/* course card (minimal shape) */
.lp-course-card {
display: flex;
flex-direction: column;
padding: 32px;
}
.lp-course-card h3 {
font-size: 20px;
font-weight: 400;
margin: 0 0 14px;
letter-spacing: -0.01em;
}
.lp-course-card .desc {
font-size: 15.5px;
line-height: 1.65;
color: var(--landing-fg-muted);
margin: 0 0 30px;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.lp-meta-row {
display: flex;
align-items: center;
gap: 20px;
font-size: 14px;
color: var(--landing-fg-muted);
margin-top: auto;
flex-wrap: wrap;
}
.lp-meta-row .m {
display: flex;
align-items: center;
gap: 6px;
}
.lp-meta-row svg {
width: 15px;
height: 15px;
stroke-width: 1.8;
}
.lp-meta-row .price {
margin-left: auto;
font-weight: 600;
color: var(--landing-fg);
font-size: 15px;
}
.lp-meta-row .price s {
color: var(--landing-fg-muted);
font-weight: 400;
font-size: 13px;
margin-left: 6px;
}
/* path badge + save chip */
.lp-chip {
display: inline-flex;
align-items: center;
gap: 6px;
width: fit-content;
font-size: 12px;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--landing-accent);
background: var(--landing-accent-soft);
padding: 4px 10px;
margin-bottom: 16px;
}
.lp-chip svg {
width: 13px;
height: 13px;
stroke-width: 2.2;
}
.lp-save {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 12.5px;
font-weight: 600;
color: var(--landing-success);
background: color-mix(in oklab, var(--landing-success) 10%, transparent);
padding: 3px 9px;
}
/* ordered course list inside a path card */
.lp-path-courses {
border-top: 1px solid var(--landing-border);
margin: 22px 0;
}
.lp-path-course {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 0;
border-bottom: 1px solid var(--landing-border);
font-size: 14.5px;
}
.lp-path-course .n {
width: 22px;
height: 22px;
border-radius: 999px;
background: var(--landing-accent-soft);
color: var(--landing-accent);
display: grid;
place-items: center;
font-size: 11.5px;
font-weight: 600;
flex-shrink: 0;
}
.lp-path-course .t {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.lp-path-course .d {
font-size: 13px;
color: var(--landing-fg-muted);
flex-shrink: 0;
}
/* ===== stats row (social proof) ===== */
.lp-stats {
display: flex;
justify-content: center;
border-block: 1px solid var(--landing-border);
padding: 28px 0;
flex-wrap: wrap;
}
.lp-stat {
padding: 0 36px;
text-align: center;
border-right: 1px solid var(--landing-border);
}
.lp-stat:last-child {
border-right: none;
}
.lp-stat .v {
font-size: 24px;
font-weight: 600;
letter-spacing: -0.02em;
}
.lp-stat .k {
font-size: 13px;
color: var(--landing-fg-muted);
margin-top: 2px;
}
@media (max-width: 720px) {
.lp-stat {
padding: 10px 20px;
border-right: none;
}
}
/* ===== anchor nav ===== */
.lp-anchor-nav {
position: sticky;
top: 0;
z-index: 50;
background: color-mix(in oklab, var(--landing-bg) 92%, transparent);
backdrop-filter: blur(8px);
border-bottom: 1px solid var(--landing-border);
}
.lp-anchor-nav .in {
display: flex;
gap: 6px;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
overflow-x: auto;
}
.lp-anchor-nav a {
padding: 14px 14px;
font-size: 14.5px;
color: var(--landing-fg-muted);
border-bottom: 2px solid transparent;
white-space: nowrap;
}
.lp-anchor-nav a:hover {
color: var(--landing-fg);
}
.lp-anchor-nav a.active {
color: var(--landing-fg);
border-bottom-color: var(--landing-accent);
font-weight: 500;
}
/* ===== outcomes / bullets ===== */
.lp-outcomes {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px 32px;
}
.lp-outcome {
display: flex;
gap: 12px;
font-size: 15.5px;
line-height: 1.55;
}
.lp-outcome svg {
width: 18px;
height: 18px;
stroke-width: 2.2;
color: var(--landing-accent);
flex-shrink: 0;
margin-top: 3px;
}
@media (max-width: 720px) {
.lp-outcomes {
grid-template-columns: 1fr;
}
}
/* skill tags */
.lp-skills {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.lp-skill {
border: 1px solid var(--landing-border);
padding: 7px 16px;
font-size: 14px;
border-radius: 999px;
color: var(--landing-fg);
}
/* ===== series (sequential course cards) ===== */
.lp-series {
display: flex;
flex-direction: column;
gap: 16px;
}
.lp-series-card {
padding: 26px 28px;
}
.lp-series-head {
display: flex;
align-items: flex-start;
gap: 16px;
}
.lp-series-n {
width: 36px;
height: 36px;
border-radius: 999px;
background: var(--landing-accent-soft);
color: var(--landing-accent);
display: grid;
place-items: center;
font-weight: 600;
font-size: 15px;
flex-shrink: 0;
}
.lp-series-card h3 {
font-size: 18px;
font-weight: 500;
margin: 4px 0 2px;
letter-spacing: -0.01em;
}
.lp-series-sub {
font-size: 13.5px;
color: var(--landing-fg-muted);
}
.lp-series-body {
margin: 16px 0 0 52px;
}
.lp-series-body .lbl {
font-size: 12px;
letter-spacing: 0.1em;
text-transform: uppercase;
font-weight: 600;
color: var(--landing-fg-muted);
margin-bottom: 10px;
}
.lp-series-outcomes {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 8px 24px;
margin-bottom: 4px;
}
.lp-series-outcomes .o {
display: flex;
gap: 9px;
font-size: 14px;
color: var(--landing-fg);
line-height: 1.5;
}
.lp-series-outcomes .o svg {
width: 15px;
height: 15px;
stroke-width: 2.2;
color: var(--landing-accent);
flex-shrink: 0;
margin-top: 3px;
}
.lp-lessons-toggle {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 14px;
font-weight: 500;
color: var(--landing-accent);
background: none;
border: none;
cursor: pointer;
padding: 10px 0 0;
}
.lp-lessons-toggle svg {
width: 15px;
height: 15px;
stroke-width: 2.2;
transition: transform 0.15s;
}
.lp-lessons-toggle.open svg {
transform: rotate(180deg);
}
.lp-lessons {
display: none;
border-top: 1px solid var(--landing-border);
margin-top: 12px;
}
.lp-lessons.open {
display: block;
}
.lp-lesson {
display: flex;
align-items: center;
gap: 12px;
padding: 9px 0;
border-bottom: 1px solid var(--landing-border);
font-size: 14px;
}
.lp-lesson .ix {
font-family: ui-monospace, monospace;
font-size: 12.5px;
color: var(--landing-fg-muted);
min-width: 3ch;
}
.lp-lesson .dur {
margin-left: auto;
font-size: 12.5px;
color: var(--landing-fg-muted);
}
.lp-lesson .prev {
font-size: 12px;
font-weight: 600;
color: var(--landing-accent);
}
@media (max-width: 720px) {
.lp-series-outcomes {
grid-template-columns: 1fr;
}
.lp-series-body {
margin-left: 0;
}
}
/* ===== instructors ===== */
.lp-instructors {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
.lp-instructor {
padding: 24px;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
.lp-instructor .av {
width: 52px;
height: 52px;
border-radius: 999px;
background: var(--landing-accent-soft);
color: var(--landing-accent);
display: grid;
place-items: center;
font-weight: 600;
font-size: 17px;
margin-bottom: 10px;
}
.lp-instructor .nm {
font-size: 15.5px;
font-weight: 600;
}
.lp-instructor .rl {
font-size: 13px;
color: var(--landing-fg-muted);
}
.lp-instructor .bio {
font-size: 13.5px;
color: var(--landing-fg-muted);
margin-top: 8px;
line-height: 1.55;
}
@media (max-width: 760px) {
.lp-instructors {
grid-template-columns: 1fr;
}
}
/* ===== testimonials ===== */
.lp-testimonials {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
}
.lp-testimonial {
padding: 26px;
}
.lp-testimonial .q {
font-size: 15.5px;
line-height: 1.65;
margin: 0 0 16px;
}
.lp-testimonial .who {
display: flex;
align-items: center;
gap: 10px;
font-size: 13.5px;
}
.lp-testimonial .who .av {
width: 34px;
height: 34px;
border-radius: 999px;
background: var(--landing-accent-soft);
color: var(--landing-accent);
display: grid;
place-items: center;
font-weight: 600;
font-size: 12px;
}
.lp-testimonial .who .nm {
font-weight: 600;
}
.lp-testimonial .who .loc {
color: var(--landing-fg-muted);
}
@media (max-width: 720px) {
.lp-testimonials {
grid-template-columns: 1fr;
}
}
/* ===== FAQ accordion ===== */
.lp-faq {
border-top: 1px solid var(--landing-border);
}
.lp-faq-item {
border-bottom: 1px solid var(--landing-border);
}
.lp-faq-q {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 18px 4px;
background: none;
border: none;
cursor: pointer;
text-align: left;
font-size: 15.5px;
font-weight: 500;
color: var(--landing-fg);
}
.lp-faq-q svg {
width: 17px;
height: 17px;
stroke-width: 2;
color: var(--landing-fg-muted);
flex-shrink: 0;
transition: transform 0.15s;
}
.lp-faq-item.open .lp-faq-q svg {
transform: rotate(180deg);
}
.lp-faq-a {
display: none;
padding: 0 4px 18px;
font-size: 14.5px;
color: var(--landing-fg-muted);
line-height: 1.65;
max-width: 68ch;
}
.lp-faq-item.open .lp-faq-a {
display: block;
}
/* ===== pricing card ===== */
.lp-pricing-card {
max-width: 440px;
margin: 0 auto;
padding: 32px;
text-align: center;
}
.lp-pricing-card .eyebrow {
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
font-weight: 600;
color: var(--landing-fg-muted);
margin-bottom: 12px;
}
.lp-price {
font-size: 46px;
font-weight: 600;
letter-spacing: -0.03em;
line-height: 1;
}
.lp-price-was {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
margin: 10px 0 20px;
font-size: 14.5px;
color: var(--landing-fg-muted);
}
.lp-price-was s {
font-size: 16px;
}
.lp-features {
text-align: left;
margin: 0 0 24px;
padding: 0;
list-style: none;
display: flex;
flex-direction: column;
gap: 10px;
}
.lp-features li {
display: flex;
gap: 10px;
font-size: 14.5px;
}
.lp-features svg {
width: 16px;
height: 16px;
stroke-width: 2.2;
color: var(--landing-accent);
flex-shrink: 0;
margin-top: 3px;
}
/* certificate banner */
.lp-cert {
display: flex;
align-items: center;
gap: 22px;
padding: 28px 30px;
}
.lp-cert .frame {
width: 130px;
height: 92px;
border: 1px solid var(--landing-border);
background: var(--landing-card-soft);
position: relative;
flex-shrink: 0;
display: grid;
place-items: center;
}
.lp-cert .frame::before {
content: '';
position: absolute;
inset: 6px;
border: 1px solid color-mix(in oklab, var(--landing-accent) 35%, transparent);
}
.lp-cert .frame svg {
width: 26px;
height: 26px;
stroke-width: 1.8;
color: var(--landing-accent);
}
.lp-cert h3 {
font-size: 18px;
font-weight: 600;
margin: 0 0 4px;
}
.lp-cert p {
font-size: 14.5px;
color: var(--landing-fg-muted);
margin: 0;
max-width: 56ch;
}
/* ===== footer ===== */
.lp-footer {
border-top: 1px solid var(--landing-border);
padding: 48px 0 40px;
margin-top: 24px;
}
.lp-footer-grid {
display: grid;
grid-template-columns: minmax(0, 1.4fr) repeat(auto-fit, minmax(140px, 1fr));
gap: 32px;
}
.lp-footer h4 {
font-size: 13px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--landing-fg-muted);
font-weight: 600;
margin: 0 0 12px;
}
.lp-footer a {
display: block;
font-size: 14px;
color: var(--landing-fg-muted);
padding: 3px 0;
}
.lp-footer a:hover {
color: var(--landing-fg);
}
.lp-footer .brand {
display: flex;
align-items: center;
gap: 8px;
font-weight: 600;
margin-bottom: 10px;
}
.lp-footer .copy {
font-size: 13px;
color: var(--landing-fg-muted);
margin-top: 12px;
}
@media (max-width: 720px) {
.lp-footer-grid {
grid-template-columns: 1fr;
}
}
/* theme toggle button (prototype affordance) */
.lp-theme-btn {
position: fixed;
bottom: 18px;
right: 18px;
z-index: 200;
width: 38px;
height: 38px;
border-radius: 999px;
border: 1px solid var(--landing-border);
background: var(--landing-card);
color: var(--landing-fg-muted);
cursor: pointer;
display: grid;
place-items: center;
box-shadow: 0 2px 8px rgb(0 0 0 / 0.08);
}
.lp-theme-btn svg {
width: 16px;
height: 16px;
stroke-width: 2;
}