/* ============================================================
   PAGES — /craft and /archive
   Layered on top of site.css. Uses the same tokens throughout.
   ============================================================ */

/* subpages have no preloader and no hero, so the nav needs breathing room */
.page {
  padding: 9rem var(--gutter) var(--section);
}
@media (max-width: 640px) { .page { padding-top: 7rem; } }

/* ---------- page masthead ---------- */
.page-head {
  border-bottom: 1px solid var(--line);
  padding-bottom: 2.5rem;
}
.page-title {
  margin-top: 1.5rem;
  font-family: var(--font-display);
  text-transform: uppercase;
  line-height: 0.95;
  letter-spacing: -0.01em;
  font-size: var(--fs-h1);
}
@media (min-width: 640px) { .page-title { font-size: var(--fs-display); } }

/* the one line that stops "Craft" and "Archive" having to carry their own meaning */
.page-what {
  margin-top: 1.75rem;
  max-width: 52ch;
  font-size: var(--fs-lead);
  line-height: var(--lh-lead);
  color: var(--muted);
}
.page-what strong { color: var(--foreground); font-weight: 500; }

.page-count {
  margin-top: 1.5rem;
  font-family: var(--font-sans);
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: 0.22em;
  color: var(--muted);
}

/* ---------- the shelf (/craft) ---------- */
.shelf { margin-top: 3.5rem; border-top: 1px solid var(--line); }

.shelf-item {
  display: grid;
  grid-template-columns: 4.5rem 1fr;
  gap: 0 1.5rem;
  align-items: baseline;
  border-bottom: 1px solid var(--line);
  padding: 1.6rem 0;
  transition: background-color 340ms ease-out;
}
@media (min-width: 768px) {
  .shelf-item { grid-template-columns: 4.5rem 1fr 9rem; }
}
.shelf-item:hover { background-color: rgba(243, 241, 234, 0.02); }

.shelf-n {
  font-family: var(--font-mono, var(--font-sans));
  font-size: var(--fs-eyebrow);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.14em;
  color: var(--muted);
}
.shelf-item:hover .shelf-n { color: var(--accent); }

.shelf-title {
  font-family: var(--font-sans);
  font-size: var(--fs-h3);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.2;
}
.shelf-desc {
  margin-top: 0.4rem;
  max-width: 62ch;
  font-size: var(--fs-body);
  color: var(--muted);
}
.shelf-meta {
  margin-top: 0.6rem;
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--muted);
}
@media (min-width: 768px) {
  .shelf-meta { margin-top: 0; text-align: right; align-self: baseline; }
}
.shelf-meta .tag { color: var(--accent); }

/* ---------- archive ---------- */
.arc { margin-top: 3.5rem; }

.arc-block {
  border-top: 1px solid var(--line-strong);
  padding: 2.5rem 0 0.5rem;
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
}
@media (min-width: 1024px) {
  .arc-block { grid-template-columns: 20rem 1fr; gap: var(--gutter); }
}

.arc-when {
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--muted);
}
.arc-where {
  margin-top: 0.5rem;
  font-family: var(--font-display);
  text-transform: uppercase;
  font-size: var(--fs-h2);
  line-height: 1;
  letter-spacing: -0.01em;
}
.arc-role {
  margin-top: 0.65rem;
  font-size: var(--fs-body);
  color: var(--muted);
}

.arc-list { margin: 0; }
.arc-list li {
  border-bottom: 1px solid var(--line);
  padding: 0 0 1.5rem;
  margin-bottom: 1.5rem;
}
.arc-list li:last-child { border-bottom: 0; margin-bottom: 0; padding-bottom: 0; }
.arc-h {
  font-family: var(--font-sans);
  font-size: var(--fs-h3);
  font-weight: 600;
  letter-spacing: -0.01em;
  line-height: 1.2;
}
.arc-p {
  margin-top: 0.6rem;
  max-width: 60ch;
  font-size: var(--fs-body);
  color: var(--muted);
}
.arc-note {
  margin-top: 0.75rem;
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--accent);
}

/* ---------- archive: AccordionGallery (React Bits port) ----------
   Stacked is the default: phones, touch screens, narrow windows, and the
   moment before the script runs. .is-accordion switches the row on. */
.accordion-gallery {
  --ag-accent: #ffffff;
  --ag-overlay: #060010;
  --ag-text: #ffffff;
  --ag-gap: 10px;
  --ag-radius: 16px;
  --ag-media-size: 320px;
  --ag-height: 460px;

  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 2.75rem;
  width: 100%; max-width: 100%;
}
.ag-panel {
  position: relative; display: block; outline: none;
  -webkit-tap-highlight-color: transparent;
}
.ag-panel:focus-visible { box-shadow: 0 0 0 2px var(--ag-accent); }
.ag-panel__frame {
  position: relative; display: block; overflow: hidden;
  aspect-ratio: 3 / 2; border-radius: var(--ag-radius); background: var(--surface-2);
}
.ag-panel__media { position: absolute; inset: 0; display: block; }
.ag-panel__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  user-select: none; -webkit-user-drag: none;
}
.ag-panel__overlay { display: none; }
.ag-panel__label { display: flex; align-items: flex-start; gap: 0.9rem; margin-top: 1.25rem; }
.ag-panel__bar {
  flex: 0 0 auto; width: 3px; height: 1.6rem; margin-top: 0.3rem;
  border-radius: 3px; background: var(--ag-accent);
}
.ag-panel__text { min-width: 0; }
.ag-panel__text .arc-p { max-width: 60ch; }

/* stacked panels: only the ones that open something look clickable */
.ag-panel[data-project] { cursor: pointer; }
.ag-panel__text .arc-h .pd-trigger { color: inherit; }

/* ---- the row ---- */
.accordion-gallery.is-accordion {
  flex-direction: row; gap: var(--ag-gap);
  height: var(--ag-height);
  perspective: 1400px; perspective-origin: 50% 50%;
}
.accordion-gallery.is-accordion.accordion-gallery--vertical { flex-direction: column; }
.is-accordion .ag-panel {
  --ag-dim: 0.35;
  flex: 1 1 0; min-width: 0; min-height: 0; overflow: hidden;
  border-radius: var(--ag-radius); cursor: pointer;
  transform-style: preserve-3d; transform-origin: center center;
  background: var(--surface);
  box-shadow: 0 10px 30px -18px rgba(0, 0, 0, 0.8);
  will-change: flex-grow, transform;
}
/* tilt the end panels about their outer edge, so the row stays inside the grid lines */
.is-accordion:not(.accordion-gallery--vertical) .ag-panel:first-child { transform-origin: left center; }
.is-accordion:not(.accordion-gallery--vertical) .ag-panel:last-child  { transform-origin: right center; }
.is-accordion .ag-panel:focus-visible {
  box-shadow: 0 0 0 2px var(--ag-accent), 0 10px 30px -18px rgba(0, 0, 0, 0.8);
}
.is-accordion .ag-panel__frame { position: absolute; inset: 0; aspect-ratio: auto; border-radius: inherit; }
.is-accordion .ag-panel__media {
  --ag-gray: 1;
  inset: auto; top: 50%; left: 50%;
  width: var(--ag-media-size); height: 100%;
  filter: grayscale(var(--ag-gray));
  will-change: transform, filter;
}
.is-accordion.accordion-gallery--vertical .ag-panel__media { width: 100%; height: var(--ag-media-size); }
.is-accordion .ag-panel__overlay {
  display: block; position: absolute; inset: 0; pointer-events: none;
  background:
    linear-gradient(180deg, transparent 22%, color-mix(in srgb, var(--ag-overlay) 72%, transparent) 58%,
                    color-mix(in srgb, var(--ag-overlay) 94%, transparent) 100%),
    color-mix(in srgb, var(--ag-overlay) calc(var(--ag-dim, 0.35) * 100%), transparent);
}
.is-accordion .ag-panel__label {
  position: absolute; left: 1.75rem; bottom: 1.75rem; margin: 0; z-index: 2;
  /* fixed at the open panel's width, so copy never reflows while a panel grows */
  width: calc(var(--ag-media-size) / 1.22 - 3.5rem);
  pointer-events: none;
}
.is-accordion .ag-panel__bar { height: 26px; margin-top: 0.2rem; opacity: 0; }
.is-accordion .ag-panel__text { opacity: 0; color: var(--ag-text); }
.is-accordion .ag-panel__text .arc-h { text-shadow: 0 2px 14px rgba(0, 0, 0, 0.55); }
.is-accordion .ag-panel__text .arc-p { max-width: 46ch; color: rgba(243, 241, 234, 0.8); }

@media (prefers-reduced-motion: reduce) {
  .is-accordion .ag-panel, .is-accordion .ag-panel__media { will-change: auto; }
}

/* ---------- shared page footer ---------- */
.page-foot {
  margin-top: var(--section);
  border-top: 1px solid var(--line);
  padding-top: 2.5rem;
  display: flex;
  flex-wrap: wrap;
  gap: 1rem 2.5rem;
  align-items: baseline;
  justify-content: space-between;
}
.page-foot a {
  font-family: var(--font-sans);
  font-size: var(--fs-h3);
  font-weight: 600;
  letter-spacing: -0.01em;
  transition: color 340ms ease-out, transform 340ms ease-out;
  display: inline-block;
}
.page-foot a:hover, .page-foot a:focus-visible { color: var(--accent); transform: translateX(10px); }
.page-foot .copyright {
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--muted);
}

/* ============================================================
   CRAFT — card grid with generated visuals
   Every card draws itself from its own numbers. No screenshots,
   no client data, and the page demonstrates the claim it makes.
   ============================================================ */
.shelf-grid{
  margin-top:3.5rem;
  display:grid; grid-template-columns:1fr; gap:2.5rem var(--gutter);
}
@media (min-width:700px){ .shelf-grid{ grid-template-columns:repeat(2,1fr); } }
@media (min-width:1200px){ .shelf-grid{ grid-template-columns:repeat(3,1fr); } }

.card{ display:flex; flex-direction:column; }

.viz{
  position:relative; aspect-ratio:4/3; width:100%;
  border:1px solid var(--line); border-radius:0.125rem;
  background:linear-gradient(160deg, var(--surface-2), var(--background));
  overflow:hidden; display:grid; place-items:center;
  transition:border-color 340ms ease-out;
}
.card:hover .viz{ border-color:var(--line-strong); }
.viz svg{ width:100%; height:100%; }
.viz-txt{ font-family:var(--font-mono, var(--font-sans)); }

.card-head{
  margin-top:1.1rem; display:flex; align-items:baseline;
  justify-content:space-between; gap:1rem;
  border-top:1px solid var(--line); padding-top:0.85rem;
}
.card-n{
  font-size:var(--fs-eyebrow); font-variant-numeric:tabular-nums;
  letter-spacing:0.14em; color:var(--muted); flex:none;
}
.card:hover .card-n{ color:var(--accent); }
.card-title{
  font-family:var(--font-sans); font-size:1.0625rem; font-weight:600;
  letter-spacing:-0.01em; line-height:1.25;
}
.card-desc{
  margin-top:0.5rem; font-size:0.9375rem; line-height:1.55; color:var(--muted);
}
.card-meta{
  margin-top:0.75rem; display:flex; gap:0.75rem; align-items:center;
  font-size:var(--fs-eyebrow); text-transform:uppercase; letter-spacing:0.18em;
  color:var(--muted);
}
.card-meta .tag{ color:var(--accent); }
.card-meta .dot{ width:3px; height:3px; border-radius:9999px; background:var(--rule-firm); flex:none; }

/* the live conic-gradient CTA, rebuilt — this one is not a drawing, it runs */
.cta-demo{
  position:relative; display:inline-flex; align-items:center; justify-content:center;
  padding:0.85rem 1.9rem; border-radius:9999px;
  background:var(--surface); color:var(--foreground);
  font-family:var(--font-sans); font-size:0.9rem; font-weight:600; letter-spacing:-0.01em;
  isolation:isolate;
}
.cta-demo::before{
  content:""; position:absolute; inset:0; border-radius:inherit; padding:1.5px;
  background:conic-gradient(from var(--a), transparent 0deg, var(--accent) 70deg, var(--accent-2) 110deg, transparent 180deg, transparent 360deg);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor; mask-composite:exclude;
  animation:cta-spin 6s linear infinite;
}
@property --a{ syntax:'<angle>'; initial-value:0deg; inherits:false; }
@keyframes cta-spin{ to{ --a:360deg; } }
.viz:hover .cta-demo::before{ animation-duration:3s; }
@media (prefers-reduced-motion:reduce){ .cta-demo::before{ animation:none; } }
