Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions app/ds-dialog.css
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@
padding: var(--dialog-gap);
overflow-y: auto;
overscroll-behavior: contain;
background: rgba(22, 22, 29, 0.55);
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
background: rgba(22, 22, 29, 0.6);
color: var(--ds-ink);
font-family: var(--ds-sans);
font-synthesis: none;
Expand Down
2 changes: 0 additions & 2 deletions app/ds.css
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,7 @@
font-family: var(--ds-mono);
font-size: clamp(11px, 0.9vw, 13px);
font-weight: 600;
letter-spacing: 0.14em;
line-height: 1.5;
text-transform: uppercase;
color: var(--ds-blue);
}
.ds-mono {
Expand Down
12 changes: 6 additions & 6 deletions components/Nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -251,8 +251,8 @@ export default function Nav({
<span className={s.rowText}>
<span className={s.rowLabel}>
{link.label}
{link.tag && <span className={s.rowTag}><span className="ds-sr"> · </span>{link.tag}</span>}
{link.isNew && <span className={s.newTag}><span className="ds-sr"> · </span>New</span>}
{link.tag && <span className={s.rowTag}><span className="ds-sr">, </span>{link.tag}</span>}
{link.isNew && <span className={s.newTag}><span className="ds-sr">, </span>New</span>}
</span>
{link.detail && <small className={s.rowDetail}>{link.detail}</small>}
</span>
Expand Down Expand Up @@ -290,8 +290,8 @@ export default function Nav({
onClick={() => { if (link.href.includes("hall-finder")) track("hall_finder_entry_clicked", { where: "more" }); close(); }}>
<b>
{link.label}
{link.tag && <span className={s.rowTag}><span className="ds-sr"> · </span>{link.tag}</span>}
{link.isNew && <span className={s.newTag}><span className="ds-sr"> · </span>New</span>}
{link.tag && <span className={s.rowTag}><span className="ds-sr">, </span>{link.tag}</span>}
{link.isNew && <span className={s.newTag}><span className="ds-sr">, </span>New</span>}
</b>
{link.detail && <small>{link.detail}</small>}
</Link>
Expand Down Expand Up @@ -355,7 +355,7 @@ export default function Nav({
<Link key={link.key} href={link.href} className={s.link}
aria-current={current === link.key ? "page" : undefined}
onClick={link.key === "hall-finder" ? () => track("hall_finder_entry_clicked", { where: "nav" }) : undefined}>
{link.label}{link.key === "hall-finder" && <span className={s.newTag}><span className="ds-sr"> · </span>New</span>}
{link.label}{link.key === "hall-finder" && <span className={s.newTag}><span className="ds-sr">, </span>New</span>}
</Link>)}
<div className={s.moreWrap}>
<button type="button" className={s.link} data-more aria-expanded={more}
Expand Down Expand Up @@ -407,7 +407,7 @@ export default function Nav({
<Link key={link.key} href={link.href} className={s.sheetBig}
onClick={() => { if (link.key === "hall-finder") track("hall_finder_entry_clicked", { where: "nav" }); close(); }}
aria-current={current === link.key ? "page" : undefined} style={{ "--i": i } as CSSProperties}>
{link.label}{link.key === "hall-finder" && <span className={s.newTag}><span className="ds-sr"> · </span>New</span>}<ArrowRight size={22} />
{link.label}{link.key === "hall-finder" && <span className={s.newTag}><span className="ds-sr">, </span>New</span>}<ArrowRight size={22} />
</Link>
))}
</div>
Expand Down
4 changes: 1 addition & 3 deletions components/account-ui/Dialog.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
padding: clamp(12px, 3vw, 28px);
overflow-y: auto;
overscroll-behavior: contain;
background: rgba(22, 22, 29, 0.55);
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
background: rgba(22, 22, 29, 0.6);
animation: scrimIn 0.22s ease-out both;
}
/* Phone: the upgrade sheet and username claim rise from the bottom edge. */
Expand Down
4 changes: 2 additions & 2 deletions components/ds/Headline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Fragment, type ReactNode } from "react";

export interface HeadlineLine {
text: ReactNode;
/** Fraunces italic (the second voice of every headline) */
/** Fraunces italic, the second voice. Page titles (h1) only; on smaller headings the line is set in Archivo like the rest. */
serif?: boolean;
/** pink/blue riso shadow (display lines only) */
riso?: boolean;
Expand Down Expand Up @@ -45,7 +45,7 @@ export default function Headline({
<span className={`ds-line ${line.className ?? ""}`} style={{ "--l": i } as React.CSSProperties}>
<span
className={[
line.serif ? "ds-serif ds-serif--blue" : "ds-display",
line.serif && Tag === "h1" ? "ds-serif ds-serif--blue" : "ds-display",
line.riso ? "ds-riso" : "",
].join(" ")}
>
Expand Down
4 changes: 1 addition & 3 deletions components/faq/Faq.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -326,9 +326,7 @@
overflow: visible;
margin-inline: calc(var(--ds-gutter) * -1);
padding: 10px var(--ds-gutter);
background: rgba(244, 243, 238, 0.94);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
background: var(--ds-paper);
box-shadow: 0 1px 0 rgba(22, 22, 29, 0.08);
}
.indexLabel { display: none; }
Expand Down
2 changes: 1 addition & 1 deletion components/hall-finder/Entry.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ function EntryLink({ where, href, className, children }: { where: Where; href: s

const New = ({ className = "" }: { className?: string }) => (
<span className={`${css.new} ${className}`}>
<span className="ds-sr"> · </span>New
<span className="ds-sr">, </span>New
</span>
);

Expand Down
6 changes: 3 additions & 3 deletions components/home/BudgetSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ export default function BudgetSection() {
<section id="budget" className={css.budget} data-bg="#f6d0d4" aria-labelledby="budget-title">
<div className={`ds-wrap ${css.bdGrid}`}>
<div className={css.bdCopy}>
<p className="ds-eyebrow" data-rv="">
<p className="ds-eyebrow">
For whoever&apos;s holding the card
</p>
<H2 id="budget-title" s="See the total" f="before anyone swipes." />
<p className={`ds-lede ${css.lede}`} data-rv="">
<p className={`ds-lede ${css.lede}`}>
Set a budget from {usd(ROOM_BUDGET.min)} to {usd(ROOM_BUDGET.max)}. dormscape fills your room with picks priced
to fit it, each with a live Amazon link.
</p>
<p className={css.bdFoot} data-rv="">
<p className={css.bdFoot}>
Plus exports the whole list as a PDF for whoever&apos;s paying.
</p>
</div>
Expand Down
2 changes: 1 addition & 1 deletion components/home/CollegesBand.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import css from "./Home.module.css";
export default function CollegesBand({ names }: { names: string[] }) {
return (
<section id="colleges" className={css.colleges} data-bg="#f4f3ee" aria-labelledby="colleges-title">
<h2 id="colleges-title" className={`ds-eyebrow ${css.collegesTitle}`} data-rv="">
<h2 id="colleges-title" className={`ds-eyebrow ${css.collegesTitle}`}>
Supporting students at {names.length} schools
</h2>
<div className={css.cview} aria-hidden="true" data-rv="" data-anim="">
Expand Down
4 changes: 2 additions & 2 deletions components/home/FinalCta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ export default function FinalCta() {
<section id="start" className={css.final} data-bg="#e8a622" aria-labelledby="final-title">
<div className={`ds-wrap ${css.fnGrid}`}>
<div>
<p className="ds-eyebrow" data-rv="">
<p className="ds-eyebrow">
Your next chapter starts here
</p>
<H2 id="final-title" s="Your room" f="is waiting." riso />
<div className={css.ctaRow} data-rv="">
<div className={css.ctaRow}>
<span className={css.corner} data-anim="">
<Link href="/plan" className="ds-btn ds-btn--ink-yellow ds-btn--lg">
Make room
Expand Down
8 changes: 4 additions & 4 deletions components/home/H2.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import css from "./Home.module.css";

/**
* A homepage section headline: an Archivo display line over a Fraunces italic
* line. With motion on, HomeFlow slides the two in from opposite sides as the
* headline scrolls in (Skiper Horizontal Text Reveal).
* A homepage section headline: two Archivo display lines (the Fraunces italic
* voice is kept for the hero). With motion on, HomeFlow slides the two in from
* opposite sides as the headline scrolls in (Skiper Horizontal Text Reveal).
*/
export default function H2({
id,
Expand All @@ -21,7 +21,7 @@ export default function H2({
return (
<h2 id={id} className={`${css.h2} ${className}`} data-rv="h2">
<span className={`ds-display ${riso ? "ds-riso " : ""}${css.s}`}>{s}</span>{" "}
<span className={`ds-serif ${css.f}`}>{f}</span>
<span className={`ds-display ${css.f}`}>{f}</span>
</h2>
);
}
30 changes: 11 additions & 19 deletions components/home/Home.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

/* ---------- Shared ---------- */
.h2 { margin: 20px 0 0; font-weight: 400; text-wrap: balance; }
.h2 .s { display: block; font-size: clamp(38px, 4.3vw, 62px); line-height: 1.02; }
.h2 .f { display: block; font-size: clamp(46px, 5.3vw, 76px); line-height: 1.05; }
/* Both lines in Archivo at one size; the italic second voice is kept for the hero. */
.h2 .s, .h2 .f { display: block; font-size: clamp(38px, 4.3vw, 62px); line-height: 1.02; }
.lede { margin-top: 20px; max-width: 560px; }
.note { font: 600 12px/1.4 var(--ds-mono); letter-spacing: 0.04em; color: var(--ds-caption); }
.ft { font-family: var(--ds-sans); font-weight: 700; letter-spacing: 0; }
Expand Down Expand Up @@ -101,8 +101,7 @@
}
.wc:hover { background: #fff; transform: translate(-2px, -2px); box-shadow: inset 0 0 0 1.5px var(--ds-ink), 5px 5px 0 var(--ds-ink); }
.wcText { padding: 24px 24px 20px; }
.wcN { display: block; font: 600 11px/1 var(--ds-mono); letter-spacing: 0.1em; color: #2449ff; }
.wcQ { margin: 12px 0 0; font-family: var(--ds-serif); font-style: italic; font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 1; font-size: 28px; line-height: 1.1; color: var(--ds-ink); }
.wcQ { margin: 0; font-family: var(--ds-serif); font-style: italic; font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 1; font-size: 28px; line-height: 1.1; color: var(--ds-ink); }
.wcA { margin: 8px 0 0; font: 600 16px/1.4 var(--ds-sans); color: #3a3a46; }
.wcArt {
position: relative;
Expand Down Expand Up @@ -203,8 +202,7 @@
/* ---------- How it works: card stack ---------- */
.how { --pin: clamp(92px, 13vh, 132px); background: #dce1f5; }
.howGrid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 64px; align-items: center; padding: 104px 0; }
.howHead .h2 .s { font-size: clamp(36px, 3.9vw, 56px); line-height: 1.04; }
.howHead .h2 .f { font-size: clamp(44px, 4.6vw, 66px); line-height: 1.04; }
.howHead .h2 .s, .howHead .h2 .f { font-size: clamp(36px, 3.9vw, 56px); line-height: 1.04; }
.howHead .lede { max-width: 480px; }
.prog { margin-top: 34px; max-width: 420px; }
.progTrack { position: relative; height: 8px; border-radius: 4px; background: rgba(22, 22, 29, 0.08); overflow: hidden; }
Expand Down Expand Up @@ -239,9 +237,7 @@
.scArt img { object-fit: cover; object-position: 50% 60%; }
.badge { display: inline-block; padding: 5px 9px; border-radius: 4px; background: var(--ds-red); color: #fff; font: 700 13px/1 var(--ds-mono); letter-spacing: 0.06em; }
.scText h3 { margin: 16px 0 0; font-weight: 400; line-height: 1.04; }
.scText h3 > span { display: block; }
.scText h3 > span:first-child { font-size: 36px; }
.scText h3 > span:last-child { font-size: 42px; }
.scText h3 > span { display: block; font-size: 36px; }
.scText p { margin: 14px 0 0; font-size: 16px; line-height: 1.5; color: var(--ds-body); }
.live .howGrid { align-items: start; }
.live .howHead { position: sticky; top: var(--pin); }
Expand Down Expand Up @@ -279,7 +275,6 @@
}
.live .hl { animation: none; transform: translate(calc(var(--c, 0) * (100% + 12px)), calc(var(--r, 0) * (100% + 12px))); transition: transform 0.55s cubic-bezier(0.65, 0, 0.35, 1); }
.vibe { position: relative; padding: 14px 14px 16px; border-radius: 14px; }
.vibe::before { content: ""; position: absolute; left: 14px; right: 14px; top: 0; height: 3px; border-radius: 2px; background: var(--rule); }
.vh { display: flex; align-items: center; gap: 8px; margin-top: 6px; }
.dots { display: flex; flex: none; }
.dots i { width: 14px; height: 14px; border-radius: 50%; box-shadow: 0 0 0 1.5px #f6eada, inset 0 0 0 1px rgba(22, 22, 29, 0.15); }
Expand Down Expand Up @@ -412,13 +407,12 @@
.studio[data-manual] { transition: --L 0.9s cubic-bezier(0.65, 0, 0.35, 1); }
.stGrid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr); gap: 64px; align-items: center; padding: 96px 0; }
.stCopy :global(.ds-eyebrow) { color: var(--ds-studio); }
.stCopy .h2 .s { font-size: clamp(48px, 5vw, 72px); line-height: 1; }
.stCopy .h2 .f { font-size: clamp(56px, 6.1vw, 88px); color: var(--ds-studio); }
.stCopy .h2 .s, .stCopy .h2 .f { font-size: clamp(48px, 5vw, 72px); line-height: 1; }
.stCopy .h2 .f { color: var(--ds-studio); }
.stCopy .lede { margin-top: 18px; color: #cfccd9; max-width: 520px; }
.stCopy .ctaRow { margin-top: 30px; }
.sRows { margin: 30px 0 0; padding: 0; list-style: none; border-top: 1px solid rgba(255, 255, 255, 0.12); }
.sRows li { position: relative; display: grid; grid-template-columns: 34px minmax(0, 1fr); padding: 16px 0 18px; border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
.sN { grid-row: span 2; padding-top: 5px; font: 600 11px/1 var(--ds-mono); letter-spacing: 0.1em; color: var(--ds-studio); }
.sRows li { position: relative; padding: 16px 0 18px; border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
.sRows h3 { margin: 0; font: 700 19px/1.25 var(--ds-sans); color: #f4f2ec; }
.sRows p { margin: 4px 0 0; font-size: 15px; line-height: 1.5; color: #cfccd9; }
.sRows li::after { content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--ds-studio); transform-origin: 0 50%; transform: scaleX(var(--f)); }
Expand Down Expand Up @@ -473,7 +467,7 @@
/* ---------- My Room: shared tooltip avatars ---------- */
.together { background: #e5e7f6; overflow: hidden; }
.tgGrid { display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: 48px; align-items: center; padding: 96px 0; }
.tgCopy .h2 .s { font-size: clamp(44px, 5vw, 76px); line-height: 0.98; font-stretch: 86%; letter-spacing: -0.04em; }
.tgCopy .h2 .s, .tgCopy .h2 .f { font-size: clamp(44px, 5vw, 76px); line-height: 0.98; font-stretch: 86%; letter-spacing: -0.04em; }
.chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 24px 0 0; padding: 0; list-style: none; }
.chip { display: inline-flex; align-items: center; height: 26px; padding: 0 11px; border-radius: 999px; background: #fff; font: 700 11px/1 var(--ds-mono); letter-spacing: 0.1em; text-transform: uppercase; }
.chip:first-child { background: var(--ds-yellow); transform: rotate(-1.5deg); }
Expand Down Expand Up @@ -647,8 +641,7 @@
.final { background: #e8a622; }
.fnGrid { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 0.62fr); gap: 56px; align-items: center; padding: 88px 0; }
.final :global(.ds-eyebrow) { color: var(--ds-ink); }
.final .h2 .s { font-size: clamp(56px, 7vw, 104px); line-height: 0.95; }
.final .h2 .f { font-size: clamp(58px, 7.4vw, 108px); line-height: 1.02; color: var(--ds-ink); }
.final .h2 .s, .final .h2 .f { font-size: clamp(56px, 7vw, 104px); line-height: 0.95; }
.final .note { color: var(--ds-ink); }
.corner { position: relative; display: inline-flex; margin: 14px; }
.corner i { position: absolute; width: 14px; height: 14px; border: 0 solid var(--ds-ink); animation: corner 2.4s var(--ds-ease) infinite; }
Expand Down Expand Up @@ -756,8 +749,7 @@
.live .scard { margin-bottom: 30vh; }
.scard { grid-template-columns: minmax(0, 1fr); gap: 14px; padding: 14px 14px 20px; }
.scArt { aspect-ratio: 16 / 10; }
.scText h3 > span:first-child { font-size: 30px; }
.scText h3 > span:last-child { font-size: 34px; }
.scText h3 > span { font-size: 30px; }
.hgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); grid-auto-rows: auto; }
.hl { display: none; }
.vibe { background: rgba(255, 255, 255, 0.55); }
Expand Down
8 changes: 4 additions & 4 deletions components/home/HowSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ export default function HowSection() {
<section id="how-it-works" className={css.how} data-bg="#dce1f5" aria-labelledby="how-title">
<div ref={grid} className={`ds-wrap ${css.howGrid}`}>
<div className={css.howHead}>
<p className="ds-eyebrow" data-rv="">
<p className="ds-eyebrow">
How it works · 3 steps
</p>
<H2 id="how-title" s="From acceptance letter" f="to move-in cart." />
<p className={`ds-lede ${css.lede}`} data-rv="">
<p className={`ds-lede ${css.lede}`}>
Three steps between you and a room that actually works, with one free tool to plan, design and shop your
dorm room.
</p>
Expand All @@ -72,7 +72,7 @@ export default function HowSection() {
<span>03</span>
</div>
</div>
<div className={css.ctaRow} data-rv="">
<div className={css.ctaRow}>
<PlanCta className="ds-btn ds-btn--ink ds-btn--lg" freeLabel="Plan my room for free" icon={<ArrowRight size={20} />} />
<span className={css.note}>No account needed to explore</span>
</div>
Expand All @@ -86,7 +86,7 @@ export default function HowSection() {
<div className={css.scText}>
<span className={css.badge}>0{i + 1}</span>
<h3>
<span className="ds-display">{s.a}</span> <span className="ds-serif ds-serif--blue">{s.b}</span>
<span className="ds-display">{s.a}</span> <span className="ds-display">{s.b}</span>
</h3>
<p>{s.body}</p>
</div>
Expand Down
6 changes: 3 additions & 3 deletions components/home/PricingSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ export default function PricingSection() {
return (
<section id="pricing" className={css.pricing} data-bg="#dce1f5" aria-labelledby="pricing-title">
<div className="ds-wrap">
<p className="ds-eyebrow" data-rv="">
<p className="ds-eyebrow">
Pricing · one-time, no subscription
</p>
<H2 id="pricing-title" s="Start free." f="Upgrade once." />
<p className={`ds-lede ${css.pricingLede}`} data-rv="">
<p className={`ds-lede ${css.pricingLede}`}>
Saving your designs is always free.
</p>
<div className={css.priceGrid}>
Expand Down Expand Up @@ -66,7 +66,7 @@ export default function PricingSection() {
</article>
))}
</div>
<p className={css.faq} data-rv="">
<p className={css.faq}>
Questions about credits or what&apos;s included?{" "}
<Link href="/faq" className="ds-link">
Read the FAQ
Expand Down
Loading