/* Reset (minimal) */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
html, body {
  height: 100%;
  overflow: hidden; /* the app shell owns scrolling per-panel */
}
/* Type system: sans for headers/display text, mono for body copy and
   small labels/meta — a deliberate blend rather than one face throughout. */
body {
  margin: 0;
  font-family: var(--font-mono);
  font-size: var(--type-body);
  line-height: var(--line-normal);
  color: var(--color-text-primary);
  background: var(--color-bg);
}
h1, h2, h3 { font-family: var(--font-sans); }
img { max-width: 100%; display: block; }
a { color: inherit; }
h1, h2, h3, p { margin: 0; }
ul { margin: 0; padding: 0; list-style: none; }

.wrap {
  max-width: var(--content-max);
  margin-inline: auto;
  padding-inline: var(--gutter);
}

.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--type-label);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--color-text-secondary);
}

/* ================= App shell ================= */
.app-shell {
  height: 100vh;
  height: 100dvh;
  display: flex;
  flex-direction: column;
}

/* ---- Top bar (persistent chrome, not part of the slide) ---- */
.topbar {
  flex: 0 0 auto;
  height: var(--topbar-h);
  border-bottom: 1px solid var(--color-border);
  background: rgba(255, 255, 255, 0.85);
  backdrop-filter: blur(8px);
  position: relative;
  z-index: 20;
}
.topbar .wrap {
  height: 100%;
  display: flex;
  align-items: center;
  gap: var(--space-06);
}
.back-btn {
  display: none;
  align-items: center;
  gap: var(--space-02);
  background: none;
  border: none;
  padding: 0;
  font-family: var(--font-sans);
  font-size: var(--type-body);
  color: var(--color-text-primary);
  cursor: pointer;
  transition: color var(--duration-fast) var(--ease-productive);
}
.back-btn:hover { color: var(--color-accent); }
.logo {
  font-family: var(--font-mono);
  font-size: var(--type-body);
  font-weight: 500;
  text-decoration: none;
}
.header-contact {
  margin-left: auto;
  font-family: var(--font-sans);
  font-size: var(--type-body);
  text-decoration: none;
  color: var(--color-text-primary);
  transition: color var(--duration-fast) var(--ease-productive);
}
.header-contact:hover { color: var(--color-accent); }

.app-shell:not([data-panel="home"]) .back-btn { display: inline-flex; }
.app-shell:not([data-panel="home"]) .logo { display: none; }

/* ---- Sliding track ---- */
.panel-viewport {
  flex: 1 1 auto;
  min-height: 0;
  overflow: hidden;
  position: relative;
}
.panel-track {
  /* Must match the number of panel sections (and router.js's panels array). */
  --panel-count: 6;
  height: 100%;
  width: calc(var(--panel-count) * 100%);
  display: flex;
  transition: transform var(--duration-moderate) var(--ease-productive);
  will-change: transform;
}
.panel-track.no-transition { transition: none; }

.panel {
  flex: 0 0 calc(100% / var(--panel-count));
  width: calc(100% / var(--panel-count));
  height: 100%;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

/* ================= Home panel ================= */
.panel-home {
  position: relative;
  display: flex;
  flex-direction: column;
  overflow-x: hidden;
}
/* Hero band — a self-contained blue panel behind the eyebrow/headline
   only. Nav CTAs below keep the site's default light/dark treatment. */
.home-intro {
  --color-bg: #0f62fe;
  --color-text-primary: #eef4ff;
  --color-text-secondary: #cfe0ff;
  --color-accent: #ffffff;

  position: relative;
  z-index: 1;
  flex: 0 0 auto;
  overflow: hidden;
  background: var(--color-bg);
  color: var(--color-text-primary);
}
.hero-plasma {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
.home-intro-content {
  position: relative;
  z-index: 1;
  padding-block: var(--space-05) var(--space-05);
}
.home-intro h1 {
  margin-top: var(--space-02);
  /* Sans, per the site's type system (headers sans / body mono) — inherits
     from the global h1,h2,h3 rule. */
  /* Fallback only — headline-rotator.js measures the widest statement and
     sets an explicit px size so every quote fits on a single line with no
     wrap-driven reflow while typing. */
  font-size: clamp(1rem, 0.92rem + 0.7vw, 1.75rem);
  font-weight: 500;
  letter-spacing: -0.01em;
  white-space: nowrap;
  overflow: hidden;
}
.home-intro h1.is-typing::after {
  content: '';
  display: inline-block;
  width: 0.5em;
  height: 1em;
  margin-left: 2px;
  vertical-align: -0.15em;
  background: var(--color-text-primary);
  animation: caret-blink 0.8s step-end infinite;
}
@keyframes caret-blink {
  50% { opacity: 0; }
}
.accent { color: var(--color-accent); }

.home-nav-list {
  position: relative;
  z-index: 1;
  flex: 1 1 auto;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.home-nav-item {
  position: relative;
  isolation: isolate;
  flex: 1 1 0;
  min-height: 84px;
  display: block;
  text-decoration: none;
  color: var(--color-text-primary);
  border-top: 1px solid var(--color-border);
  overflow: hidden;
}
.home-nav-list .home-nav-item:last-child { border-bottom: 1px solid var(--color-border); }

.home-nav-item .sweep {
  position: absolute;
  inset: 0;
  z-index: 0;
  background: var(--color-text-primary);
  transform: scaleX(0);
  transform-origin: var(--origin-x, 0%) 50%;
  transition: transform var(--duration-moderate) var(--ease-productive);
}
.home-nav-item:hover .sweep,
.home-nav-item:focus-visible .sweep { transform: scaleX(1); }

.item-content {
  position: relative;
  z-index: 1;
  height: 100%;
  display: flex;
  align-items: center;
  gap: var(--space-06);
}
.item-content > * {
  transition: color var(--duration-moderate) var(--ease-productive),
              transform var(--duration-moderate) var(--ease-productive);
}
.home-nav-item:hover,
.home-nav-item:focus-visible { color: var(--color-bg); }

.item-index {
  font-family: var(--font-mono);
  font-size: var(--type-label);
  color: var(--color-text-secondary);
  width: 2.5ch;
  flex-shrink: 0;
}
.home-nav-item:hover .item-index,
.home-nav-item:focus-visible .item-index { color: var(--color-accent); }

.item-label {
  flex: 1 1 auto;
  /* Sized down from the original clamp to leave headroom for longer
     multi-word labels (e.g. "Tanzu Design System") without wrapping. */
  font-size: clamp(1.75rem, 1.3rem + 2.4vw, 3.5rem);
  line-height: 1.1;
  font-family: var(--font-sans);
  font-weight: 500;
  letter-spacing: -0.02em;
}

.item-badge {
  flex-shrink: 0;
  font-family: var(--font-mono);
  font-size: var(--type-label);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 0.25em 0.6em;
  border: 1px solid currentColor;
  border-radius: 999px;
  color: var(--color-accent);
}
.home-nav-item:hover .item-badge,
.home-nav-item:focus-visible .item-badge { color: var(--color-accent); }

.item-desc {
  display: none;
  font-family: var(--font-mono);
  font-size: var(--type-label);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-text-secondary);
  flex-shrink: 0;
}
.home-nav-item:hover .item-desc,
.home-nav-item:focus-visible .item-desc { color: var(--color-text-on-inverse-secondary); }

.item-lock {
  flex-shrink: 0;
  font-size: 1.1rem;
  opacity: 0.7;
}
.home-nav-item.is-unlocked .item-lock { display: none; }

.item-arrow {
  flex-shrink: 0;
  font-size: 1.5rem;
  transform: translateX(0);
}
.home-nav-item:hover .item-arrow,
.home-nav-item:focus-visible .item-arrow { transform: translateX(6px); }

@media (min-width: 640px) {
  .item-desc { display: block; }
}

/* ================= Sub panels (Work / About / Contact) ================= */
.panel-sub .panel-inner {
  padding-block: var(--space-10) var(--space-12);
}
.panel-sub h2 {
  margin-top: var(--space-03);
  font-size: var(--type-heading-lg);
  font-weight: 500;
  letter-spacing: -0.01em;
  outline: none; /* focus target on nav, no visible ring needed here */
}

/* ---- Buttons (still used on cards / future CTAs) ---- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-03);
  padding: var(--space-04) var(--space-06);
  font-family: var(--font-sans);
  font-size: var(--type-body);
  text-decoration: none;
  border: 1px solid transparent;
  transition: background var(--duration-fast) var(--ease-productive);
}
.btn-primary {
  background: var(--color-text-primary);
  color: var(--color-bg);
}
.btn-primary:hover { background: var(--color-accent); }
.btn-secondary {
  border-color: var(--color-border-strong);
  color: var(--color-text-primary);
}
.btn-secondary:hover { border-color: var(--color-text-primary); }

/* ---- Experience (resume) ---- */
.panel-experience .panel-inner { padding-block: var(--space-09) var(--space-12); }

.resume-header h1 {
  font-size: var(--type-display);
  font-weight: 600;
  letter-spacing: -0.02em;
}
.resume-title {
  margin-top: var(--space-02);
  font-family: var(--font-sans);
  font-size: var(--type-heading-sm);
  font-weight: 500;
}
.resume-contact {
  margin-top: var(--space-03);
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-03);
  color: var(--color-text-secondary);
}
.resume-contact a { text-decoration: none; }
.resume-contact a:hover { color: var(--color-accent); }
.resume-contact span[aria-hidden] { color: var(--color-border-strong); }

.resume-section {
  margin-top: var(--space-09);
  padding-top: var(--space-06);
  border-top: 1px solid var(--color-border);
}
.resume-section h2 {
  font-size: var(--type-heading-sm);
  font-weight: 500;
}
.resume-section > p {
  margin-top: var(--space-05);
  color: var(--color-text-secondary);
}

.resume-entry { margin-top: var(--space-08); }
.resume-entry:first-of-type { margin-top: var(--space-06); }
.resume-entry-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--space-03);
}
.resume-entry-head h3 {
  font-size: var(--type-body-lg);
  font-weight: 500;
}
.resume-org { font-weight: 400; color: var(--color-text-secondary); }
.resume-dates {
  font-family: var(--font-mono);
  font-size: var(--type-label);
  color: var(--color-accent);
  flex-shrink: 0;
}
.resume-entry ul {
  margin-top: var(--space-04);
  display: grid;
  gap: var(--space-03);
}
.resume-entry li {
  padding-left: var(--space-05);
  position: relative;
  color: var(--color-text-secondary);
}
.resume-entry li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.6em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-border-strong);
}
.resume-entry li strong { color: var(--color-text-primary); font-weight: 500; }

/* ---- Printable resume ----
   Sized in pt with fixed values (not the screen type scale) so the whole
   resume reliably fits a single page regardless of the browser's default
   print font-size handling. */
@media print {
  .topbar { display: none !important; }
  .app-shell, .panel-viewport, .panel-track { height: auto !important; overflow: visible !important; }
  .panel-track { transform: none !important; width: auto !important; display: block !important; }
  .panel { width: auto !important; height: auto !important; overflow: visible !important; }
  .panel:not(#panel-experience) { display: none !important; }

  .panel-experience .panel-inner { padding: 0 !important; max-width: none !important; }
  body { font-size: 9pt; line-height: 1.3; }

  .resume-header h1 { font-size: 22pt; }
  .resume-title { font-size: 11pt; margin-top: 2pt; }
  .resume-contact { font-size: 8.5pt; gap: 5pt; margin-top: 4pt; }

  .resume-section { margin-top: 9pt; padding-top: 5pt; break-inside: avoid; }
  .resume-section h2 { font-size: 11pt; }
  .resume-section > p { font-size: 9pt; margin-top: 4pt; max-width: none; }

  .resume-entry { margin-top: 6pt; break-inside: avoid; }
  .resume-entry:first-of-type { margin-top: 4pt; }
  .resume-entry-head h3 { font-size: 9.5pt; }
  .resume-dates { font-size: 8pt; }
  .resume-entry ul { margin-top: 2pt; gap: 2pt; }
  .resume-entry li { padding-left: 9pt; }

  a { color: inherit !important; text-decoration: none !important; }
}
@page { size: letter; margin: 0.5in; }

/* ---- Contact ---- */
.contact h2 {
  font-size: var(--type-display);
  font-weight: 500;
  letter-spacing: -0.02em;
  max-width: 14ch;
}
.contact .email-link {
  display: inline-block;
  margin-top: var(--space-07);
  font-family: var(--font-mono);
  font-size: var(--type-heading-sm);
  text-decoration: none;
  border-bottom: 1px solid var(--color-border-strong);
  padding-bottom: var(--space-02);
  transition: border-color var(--duration-fast) var(--ease-productive), color var(--duration-fast) var(--ease-productive);
}
.contact .email-link:hover { color: var(--color-accent); border-color: var(--color-accent); }
.contact-links {
  margin-top: var(--space-10);
  display: flex;
  gap: var(--space-06);
}
.contact-links a {
  text-decoration: none;
  font-size: var(--type-label);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-text-secondary);
  transition: color var(--duration-fast) var(--ease-productive);
}
.contact-links a:hover { color: var(--color-text-primary); }

/* ---- Small screens ---- */
@media (max-width: 640px) {
  .topbar .wrap { gap: var(--space-04); }
  .home-nav-item { min-height: 72px; }
  .item-content { gap: var(--space-04); }
}

/* ---- Password modal (lock-gate.js) ---- */
.lock-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--space-06);
  background: rgba(22, 22, 22, 0.6);
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--duration-moderate) var(--ease-productive);
}
.lock-modal-overlay.is-open {
  opacity: 1;
  pointer-events: auto;
}
.lock-modal {
  width: 100%;
  max-width: 22rem;
  background: var(--color-bg);
  border: 1px solid var(--color-border-strong);
  border-top: 3px solid var(--color-accent);
  padding: var(--space-07) var(--space-06);
  transform: translateY(8px);
  transition: transform var(--duration-moderate) var(--ease-productive);
}
.lock-modal-overlay.is-open .lock-modal { transform: translateY(0); }
.lock-modal-eyebrow {
  font-family: var(--font-mono);
  font-size: var(--type-label);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--color-accent);
}
.lock-modal-title {
  margin-top: var(--space-02);
  font-size: var(--type-heading-sm);
  font-weight: 500;
}
.lock-modal-desc {
  margin-top: var(--space-03);
  font-size: var(--type-body);
  color: var(--color-text-secondary);
}
.lock-modal-form { margin-top: var(--space-06); }
.lock-modal-label {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--type-label);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--color-text-secondary);
  margin-bottom: var(--space-02);
}
.lock-modal-input {
  width: 100%;
  font-family: var(--font-mono);
  font-size: var(--type-body);
  color: var(--color-text-primary);
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--color-border-strong);
  padding: var(--space-03) 0;
  outline: none;
  transition: border-color var(--duration-fast) var(--ease-productive);
}
.lock-modal-input:focus { border-color: var(--color-accent); }
.lock-modal-error {
  margin-top: var(--space-03);
  font-family: var(--font-mono);
  font-size: var(--type-label);
  color: #da1e28;
}
.lock-modal-actions {
  margin-top: var(--space-07);
  display: flex;
  justify-content: flex-end;
  gap: var(--space-04);
}
.lock-modal-btn {
  font-family: var(--font-sans);
  font-size: var(--type-body);
  padding: var(--space-03) var(--space-06);
  border: 1px solid transparent;
  cursor: pointer;
  transition: background var(--duration-fast) var(--ease-productive),
              color var(--duration-fast) var(--ease-productive),
              border-color var(--duration-fast) var(--ease-productive);
}
.lock-modal-btn-ghost {
  background: none;
  color: var(--color-text-primary);
  border-color: var(--color-border-strong);
}
.lock-modal-btn-ghost:hover { border-color: var(--color-text-primary); }
.lock-modal-btn-primary {
  background: var(--color-accent);
  color: #ffffff;
}
.lock-modal-btn-primary:hover { background: var(--color-accent-hover); }

@keyframes lock-modal-shake {
  10%, 90% { transform: translateX(-1px); }
  20%, 80% { transform: translateX(2px); }
  30%, 50%, 70% { transform: translateX(-4px); }
  40%, 60% { transform: translateX(4px); }
}
.lock-modal.is-shake { animation: lock-modal-shake 400ms var(--ease-productive); }

/* ---- Reduced motion ---- */
@media (prefers-reduced-motion: reduce) {
  .panel-track { transition: none; }
  .home-nav-item .sweep,
  .item-arrow,
  .back-btn { transition: none; }
  .home-intro h1.is-typing::after { animation: none; }
  .lock-modal-overlay,
  .lock-modal { transition: none; }
  .lock-modal.is-shake { animation: none; }
}
