@import url("fonts/nylon-ui.4eeb1a883ef2.css?v=20261024");
@import url("fonts/nylon-reading.486f450e287a.css?v=20261024");
/* Nylon typography roles. Complete variable Unicode fonts are served locally;
   their per-character shards load on demand, including user-provided names. */
/* The Noto Sans SC file only contains verified, fixed heading text. Never use it
   for user-generated titles, article text, navigation, or a whole page. */
@font-face {
  font-family: "Nylon Sans Title";
  src: url("fonts/nylon-sans-title-700.2c2571fee4f3.woff2") format("woff2");
  font-style: normal;
  font-weight: 700;
  font-display: swap;
}

@font-face {
  font-family: "Nylon Code";
  src: url("fonts/nylon-code-jetbrains-regular.30778bb89caf.woff2") format("woff2");
  font-style: normal;
  font-weight: 400;
  font-display: swap;
}

:root {
  /* Keep Chinese, Latin and numbers in one complete interface family before
     falling back; the display subsets remain limited to their audited roles. */
  --nylon-type-ui: "Nylon UI", "Microsoft YaHei UI", "PingFang SC", "Microsoft YaHei",
    "Noto Sans CJK SC", "Hiragino Sans GB", -apple-system,
    BlinkMacSystemFont, "Segoe UI", sans-serif;
  --nylon-type-title: "Nylon Sans Title", "Noto Sans SC",
    "Source Han Sans SC", "Microsoft YaHei UI", "PingFang SC", sans-serif;
  --nylon-type-paper: "Nylon Serif", "Nylon Reading", "Noto Serif SC",
    "Source Han Serif SC", "Songti SC", "SimSun", serif;
  --nylon-type-reading: "Nylon Reading", "Noto Serif CJK SC", "Noto Serif SC",
    "Source Han Serif SC", "Source Han Serif CN", "Songti SC",
    "STSong", "SimSun", serif;
  --nylon-type-code: "Nylon Code", "JetBrains Mono", "Cascadia Mono",
    "SF Mono", Consolas, ui-monospace, monospace;
  --sans: var(--nylon-type-ui);
  --ny-font: var(--nylon-type-ui);
}

/* The action and data layer reads as one family even where page skins differ. */
body {
  font-family: var(--nylon-type-ui);
  font-size: 15px;
  font-weight: 500;
  line-height: 1.65;
}

body :is(button, input, select, textarea),
.site-header :is(a, button),
.ny-subnav a,
.home-section-nav :is(a, button),
.manage-tool-list a {
  font-family: var(--nylon-type-ui);
}

/* UI ink has a firm stroke. Keep the handwritten mark, editorial prose and
   code in their own roles; opacity is never used to establish text hierarchy. */
:root .ny-header .ny-header-links > :is(a, button),
:root .ny-header .ny-menu > summary,
:root .ny-header .ny-menu-panel :is(a, button),
:root .ny-subnav a,
:root .home-section-nav :is(a, button),
:root .manage-tool-list a {
  font-family: var(--nylon-type-ui);
  font-weight: 600;
}
body :is(button, input, select, textarea) { font-weight: 500; }

/* Long-tail functional pages use the complete UI family. These labels are not
   in the fixed display subset; form and account headings must cover any name. */
main h1,
.settings-nav-heading h1,
.contact-intro h1,
.computer-shell h1,
.health-hero-copy h1,
.login-intro h1 {
  font-family: var(--nylon-type-ui);
  font-weight: 650;
  letter-spacing: -.035em;
}

/* Fixed headings audited against the subset. Dynamic headings are intentionally
   outside this list so a missing Han glyph never switches font mid-word. */
body:not(.hx-home-page) #home-heading,
.hero-title,
#material-heading,
#home-resources-heading,
#home-campus-heading,
#home-projects-heading,
.course-catalog .catalog-heading h1,
.faculty-directory #faculty-directory-title,
#faculty-write-title,
.faculty-page > .faculty-header > h1,
.wh-page:not(.wh-page-narrow) .wh-hero-title,
.manage-home .manage-intro h1,
.rq-hero .mc-title,
.rd-hero .mc-title,
.chat-head h1,
#mc-title,
.agent-control .ac-head h1,
.journal-list #journal-heading,
#cs-heading,
.guides-page:not(.resource-editor):not(.resource-detail) .guides-heading h1,
.projects .projects-heading h1,
.campus-heading h1,
.calendar-header h1,
.career-reference-page .intern-browser .career-heading h1,
.resume-shell:not(.resume-private-page) .career-heading h1,
.intern-shell:not(.intern-detail) .intern-head h1 {
  font-family: var(--nylon-type-title);
  font-weight: 700;
  letter-spacing: -0.025em;
  text-wrap: balance;
}

body:not(.hx-home-page) #home-heading {
  font-size: clamp(52px, 6.2vw, 88px);
  line-height: 1.05;
}
.hero-title {
  font-size: clamp(50px, 8vw, 96px);
  line-height: 1.08;
}
.course-catalog .catalog-heading h1,
.wh-page:not(.wh-page-narrow) .wh-hero-title,
.manage-home .manage-intro h1,
.career-reference-page .intern-browser .career-heading h1,
.resume-shell:not(.resume-private-page) .career-heading h1,
.intern-shell:not(.intern-detail) .intern-head h1 { line-height: 1.16; }

/* Editorial entrances retain the station's engraved, literary voice. A large
   title is not automatically an interface label; density and purpose decide. */
body:not(.hx-home-page) #home-heading,
.hero-title,
.wh-page:not(.wh-page-narrow) .wh-hero-title,
.journal-list #journal-heading,
#cs-heading,
.guides-page:not(.resource-editor):not(.resource-detail) .guides-heading h1,
.projects .projects-heading h1,
.reward-heading h1 {
  font-family: var(--nylon-type-paper);
  font-weight: 700;
  letter-spacing: -.012em;
}
.hero-title .thin { font-weight: 700; }

/* Editorial titles and chapter structure retain the existing paper character.
   Article titles and chapter text can be arbitrary, so the existing fallback
   stack remains important beyond the 710-glyph display subset. */
.journal-prose :is(h1, h2, h3, h4, h5, h6),
.journal-article-row h2,
.wh-page .wh-section-head h2,
.pathway-redesign .path-year-heading h3 {
  font-family: var(--nylon-type-paper);
}

.journal-prose,
.journal-reading .journal-prose {
  /* Never use the 700-only Nylon Serif display subset for running text. */
  font-family: var(--nylon-type-reading);
  font-weight: 400;
  font-size: 16.5px;
  line-height: 1.85;
}
.journal-prose :is(h1, h2, h3, h4, h5, h6) { font-weight: 700; }

/* These titles contain database or user-provided names. Keep full Han coverage
   and a stable weight instead of applying either display subset. */
.course-title-row h1,
.course-catalog .catalog-row .catalog-course h3,
.faculty-detail .faculty-heading-line h1,
.faculty-card h2,
.faculty-review-name,
.intern-detail .intern-head h1,
.intern-shell .intern-row h2,
.intern-shell .intern-summary h2,
.intern-shell .intern-links h2,
.intern-shell .intern-empty h2,
.career-reference-page .intern-browser .career-row h2,
.career-reference-page .intern-browser .career-preview .career-company-line h2,
.career-reference-page .intern-browser .career-posting :is(h1, h2, h3),
#path-program-title,
.guides-page.resource-detail .guides-heading h1 {
  font-family: var(--nylon-type-ui);
  font-weight: 600;
}
.journal-post-heading h1,
.journal-reading .journal-post-heading h1 {
  font-family: var(--nylon-type-reading);
  font-weight: 700;
  letter-spacing: -.012em;
  line-height: 1.32;
}
.faculty-section-heading h2 { font-weight: 700; }
.course-catalog .catalog-heading p:last-child,
.course-catalog .catalog-course-meta,
.course-workspace-hero .course-summary,
.career-reference-page .intern-browser .career-posting :is(.career-posting-role, .career-posting-section p) {
  font-family: var(--nylon-type-ui);
}
.wh-page .wh-body { font-size: 16px; line-height: 1.9; }
.intern-shell .intern-row p,
.intern-shell .career-intro { font-size: 14px; }

/* A compact, locally hosted Latin code face; Chinese code comments fall back
   to the system monospace stack. HTML tables stay proportional for legibility. */
.journal-prose code,
.journal-prose pre code,
.catalog-code,
.detail-code,
.path-course-code,
.intern-original,
.intern-shell .intern-meta,
.home-quick-find kbd {
  font-family: var(--nylon-type-code);
  font-variant-numeric: tabular-nums;
}
.journal-prose pre code { font-size: 14px; line-height: 1.65; }
.intern-original { font-variant-ligatures: none; }
.journal-prose table,
.course-catalog .catalog-row,
.intern-shell .intern-row { font-variant-numeric: tabular-nums; }
