/* ─────────────────────────────────────────────────────────────────────────────
   DM in the PM — composition layer over the Claude Design export.

   EVERY RULE HERE NEEDS !important. The export carries an inline style="" on
   essentially every element, and an inline declaration beats any stylesheet
   rule that is not marked. This is not defensive habit: an unmarked
   display:none once lost to an element's own display:flex and collapsed a nav
   to 0px wide - pixel-identical in a screenshot, with four links still in the
   tab order pointing at things nobody could see.

   Assert the COMPUTED value in a browser after changing anything here.
   ───────────────────────────────────────────────────────────────────────────── */

/* ── always on ─────────────────────────────────────────────────────────────── */

/* The disclosure panels carry inline display:flex, so [hidden] alone loses. */
[hidden] { display: none !important; }

/* COLOUR BACK IN THE PHOTOGRAPHS. VJ, 15 Sep 2026: "make all the photos more colorful, bring the
   color back". The export washed every plate with grayscale(.55-.8) plus sepia on half of them, so
   Dan's red light and the blue painting read as brown. This replaces the whole inline filter
   rather than adding to it: a touch of contrast keeps the after-dark punch, saturate lifts the
   real colour. The inline `transition: filter 1s` still applies. */
picture img { filter: saturate(1.15) contrast(1.08) !important; }

/* Pages that do not exist yet: present, legible, plainly not a link. */
[data-pending] { opacity: .5 !important; cursor: default !important; }

/* Nothing in the export acknowledged a press, and on a phone there is no
   hover to fall back on - silence between tap and response reads as "it did
   not register". Transform and opacity only. */
/* THE !important IS LOAD-BEARING AND WAS MISSING. 94 elements carry an inline `transition`,
   in a dozen combinations, and an unmarked rule loses to every one of them: the Book Dan pill
   computed `background, color 0.3s` and the :active scale would have snapped, or crawled at
   the 0.4-1s some of them declare. Measured, not assumed - the computed transitionProperty
   said `background, color` while this file said `transform`.

   The property list keeps what these controls actually animate (background, colour, border)
   and adds a fast transform, so nothing the export intended is flattened. Plates carry their
   own `filter 1s, transform 1s` and are not controls, so they are untouched. */
a, button, [role="button"] {
  transition: transform .16s cubic-bezier(.2, .8, .3, 1),
              background .3s, color .3s, border-color .3s !important;
}
a:active, button:active, [role="button"]:active { transform: scale(.97) !important; }

/* KEYBOARD FOCUS. Measured 12 Sep 2026: the site had ZERO :focus rules of any kind, across 48
   controls - so a keyboard visitor had no idea where they were. WCAG 2.4.7. The ring is the
   accent already in the palette rather than the browser default blue, offset so it reads on both
   the ink ground and the light Book Dan panel, and :focus-visible so a mouse press does not
   leave it behind. */
a:focus-visible, button:focus-visible, [role="button"]:focus-visible,
input:focus-visible, select:focus-visible, textarea:focus-visible {
  outline: 2px solid #FFC400 !important;
  outline-offset: 3px !important;
  border-radius: 2px;
}
/* Some controls sit on the gold pill itself, where gold-on-gold would vanish. */
[data-nav-cta]:focus-visible, [data-booking-send]:focus-visible {
  outline-color: #060509 !important;
}
@media (prefers-reduced-motion: reduce) {
  a, button, [role="button"] { transition: none !important; }
  a:active, button:active, [role="button"]:active { transform: none !important; }

  /* THE EXPORT'S REDUCED-MOTION RULE DOES NOT REACH THE REVEALS, and measuring is the only way
     to find that. It sets animation-duration to .001ms, which correctly stops all 34 infinite
     loops - the pulses, the marquee, the flicker, the equaliser. But 31 elements here animate on
     `animation-timeline: view()`, and a SCROLL timeline ignores duration entirely: progress comes
     from scroll position, not time. So a motion-sensitive visitor still got 31 elements sliding
     and scaling past them.

     Handing the timeline back to time is what fixes it: with `auto`, the export's own .001ms
     duration finally applies, and `animation-fill-mode: both` lands each element on its `to`
     state immediately. Content is present, nothing moves. Measured both ways afterwards. */
  * { animation-timeline: auto !important; }
}

/* HOVER IS NOT A THING A FINGER DOES. The export ships `a:hover{color:#C9A24B}` and no
   `(hover: hover)` guard anywhere, and on a touch screen :hover LATCHES after a tap - so
   tapping any link on this page left it gold until you tapped something else. It reads as a
   selection state the site never meant to have, and nothing measures it: the colour is
   correct, the contrast is fine, the target is 44px. It is only wrong to a thumb.

   `:active` already carries the press feedback (scale .97 at 160ms), which is the state a
   finger should get. So on touch, hover simply stops existing. */
@media (hover: none), (pointer: coarse) {
  a:hover { color: inherit !important; }
  [data-band-item]:hover, [data-nav-link]:hover, [data-footer] a:hover { color: inherit !important; }
}

/* An <img> with no bitmap paints its alt text/* An <img> with no bitmap paints its alt text - a wall of words where the
   photographs should be. Give it the page's ink and hide only the visual
   fallback; the alt attribute stays in the accessibility tree. */
img { background-color: #0b0910; color: transparent; }

/* ── safe areas ────────────────────────────────────────────────────────────────
   The nav is sticky at top:0 and two layers are fixed. Without these the nav
   sits under the Dynamic Island, and the footer under the home indicator. No
   media query fires for a hardware cutout, so no emulator will show this -
   it needs the real Simulator. */
nav {
  padding-top: calc(15px + env(safe-area-inset-top)) !important;
  padding-left: calc(clamp(14px, 3.5vw, 52px) + env(safe-area-inset-left)) !important;
  padding-right: calc(clamp(14px, 3.5vw, 52px) + env(safe-area-inset-right)) !important;
}
[data-band] {
  padding-left: calc(16px + env(safe-area-inset-left)) !important;
  padding-right: calc(16px + env(safe-area-inset-right)) !important;
}
[data-footer] {
  padding-bottom: calc(22px + env(safe-area-inset-bottom)) !important;
  padding-left: calc(clamp(18px, 3.5vw, 52px) + env(safe-area-inset-left)) !important;
  padding-right: calc(clamp(18px, 3.5vw, 52px) + env(safe-area-inset-right)) !important;
}

/* LANDSCAPE IS THE ORIENTATION THIS RULE EXISTS FOR. With viewport-fit=cover the page is
   edge to edge, and in landscape the Dynamic Island is on a SIDE - so the hero's own copy and
   the privacy notice's text column need the horizontal insets, not just the chrome. A top-inset
   rule alone would read as correct on every emulator and put the headline under the cutout on a
   real phone held sideways. */
header[data-screen-label="Hero"] > div:last-of-type,
main[data-prose] {
  /* ADD to the padding that is already there. NEVER REPLACE IT. The first version of this rule
     set padding-left to env(safe-area-inset-left) alone - and in PORTRAIT that inset is zero, so
     an !important rule meant to protect content from a cutout instead deleted the hero's
     18-52px of horizontal padding and the privacy notice's text column inset. "AFTER DARK" and
     "DAN" sat flush against the glass.

     Nothing in the numeric sweep saw it: it clips no control and overflows no text, so
     mobile-audit read 0/0/0 at every width. A real iPhone showed it in one frame. The value
     below is the export's own clamp, which both surfaces already used. */
  padding-left: calc(clamp(18px, 3.5vw, 52px) + env(safe-area-inset-left)) !important;
  padding-right: calc(clamp(18px, 3.5vw, 52px) + env(safe-area-inset-right)) !important;
}
main[data-prose] { padding-bottom: calc(clamp(60px, 10vh, 130px) + env(safe-area-inset-bottom)) !important; }

/* NOT on <main> itself on the home page. That element is a STRUCTURAL wrapper added for the
   landmark, and it contains the full-bleed hero: horizontal padding on it inset the entire
   photograph, leaving a black gutter down the left of the image and bleeding it off the right.
   The first fix for the missing hero padding created that, which is why the rule is scoped to
   the PROSE column now. A safe-area inset belongs on the block that holds the words, never on
   a wrapper that also holds something meant to touch the glass. */

/* ── tap targets ───────────────────────────────────────────────────────────────
   35 of 48 controls measured under 44px, most of them 11px tall. Every one is
   a standalone control rather than a link inside a sentence, so growing them
   is safe - checked before writing this, not assumed. */
/* WIDTH ALONE CANNOT SEE A PHONE IN LANDSCAPE. An iPhone on its side is 844px wide - past
   every mobile breakpoint - and still a thumb on glass. So this block asks about the INPUT as
   well as the width: (pointer: coarse) is true on phones and tablets in any orientation and
   false on a mouse-driven desktop, which is the distinction the 44px rule actually cares
   about. Verified under CDP touch emulation at 844x390, not assumed from the query text. */
@media (max-width: 820px), (pointer: coarse) {
  [data-band-item],
  [data-footer] a,
  [data-nav-cta],
  [data-nav-link],
  [data-row] a,
  [data-chip],
  #work a,
  #dates a,
  [data-toggle],
  #listen a,
  header a {
    min-height: 44px !important;
    display: inline-flex !important;
    align-items: center !important;
  }
  /* The booking form ships COLLAPSED, so its ten controls were in no earlier measurement and
     sat at 42px - two under the floor, and invisible until the audit learned to open the
     disclosures first. The textarea is excluded: it is four rows tall already. */
  [data-booking-form] input,
  [data-booking-form] select { min-height: 44px !important; }

  /* PROSE LINKS ARE THE ONE CASE min-height CANNOT FIX. A link inside a sentence is an inline
     box: min-height does nothing to it, and turning it inline-flex would break the line. Vertical
     padding DOES enlarge an inline element's hit box without changing line layout, which is what
     a thumb needs. Three of these are mine - the privacy link under "Send inquiry" and the two
     inside the notice itself - and they measured 20-27px tall. */
  main p a, main li a, [data-booking-form] ~ p a, [data-booking-send] ~ p a {
    padding-block: 11px !important;
    /* the hit box grows upward and downward; the text does not move */
  }

  /* The credit line is a cross-site signature at a fixed size. Never grown. */  /* The credit line is a cross-site signature at a fixed size. Never grown. */
  [data-sc-name="Pchol Kollektiv Credit"] * { min-height: 0 !important; }

  /* THE BAND COMPACTS AT THE SAME BREAKPOINT AS THE TAP TARGETS, and that pairing is the
     whole point: growing its items to 44px while they were still allowed to wrap sent 768
     to 227px of chrome - worse than the fault being fixed. A touch-size rule and the layout
     that has to absorb it belong in one block. */
  [data-band] {
    gap: 14px !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    font-size: 9.5px !important;
    letter-spacing: .16em !important;
    flex-wrap: nowrap !important;
    overflow-x: auto !important;
    justify-content: flex-start !important;
    scrollbar-width: none;
  }
  [data-band]::-webkit-scrollbar { display: none; }
  [data-band-item] { white-space: nowrap !important; flex: 0 0 auto !important; }
  [data-band-item] [data-tail] { display: none !important; }

  /* Same reason: the nav must not wrap once its children are 44px tall - and the rule has to
     reach the INNER box, because flex-wrap on <nav> governs only its own direct children. */
  nav {
    flex-wrap: nowrap !important;
    gap: 12px !important;
    padding-top: calc(9px + env(safe-area-inset-top)) !important;
    padding-bottom: 9px !important;
  }
  [data-nav-links] { flex-wrap: nowrap !important; gap: clamp(10px, 2vw, 24px) !important; }

  /* 44px is the WHOLE control, never 44 plus the padding it already carries. The pill kept
     its inline 9px 20px and came out 62px tall, which is what held the nav at 93px on tablet
     after the same fix had already been made one breakpoint down. Fix it once, here. */
  [data-nav-cta] { padding-top: 0 !important; padding-bottom: 0 !important; }
}

/* ── phone composition ─────────────────────────────────────────────────────────
   The export had one breakpoint, at 820px, and all it did was change grid
   columns. Below that, narrow widths were whatever flexbox happened to do:
   205px of chrome above the first content pixel at 320, on a 568px screen. */
@media (max-width: 520px) {

  /* Identity and the one action that matters. The three section links go: this
     is a single scroll, the hero already offers "Next show", and at 320 the
     wordmark plus the Book Dan pill is genuinely all that fits on one line. */
  /* Identity and the one action that matters. The wordmark was breaking to "DM IN THE / PM",
     which reads as an accident rather than a lockup. */
  [data-nav-link] { display: none !important; }
  nav > div:first-of-type { white-space: nowrap !important; }

  /* Holding the wordmark on one line made it 177px wide, and 177 + 12 + a 114px pill is
     303 inside a 292px budget - so the fix for the lockup pushed BOOK DAN off the edge at
     320. It was the overflow column, added one step earlier, that caught it. Shrink the
     wordmark rather than the only conversion control in the header. */
  nav > div:first-of-type { font-size: 12px !important; letter-spacing: .12em !important; }
  [data-nav-cta] { padding-left: 16px !important; padding-right: 16px !important; font-size: 10px !important; white-space: nowrap !important; }

  /* Date and archive rows: a three-column grid needing 290px inside 250px,
     which clipped four CTAs at 320 behind an overflow-x:hidden that meant the
     page never scrolled sideways to admit it. Stack, and let the control span. */
  [data-row] {
    grid-template-columns: 1fr !important;
    gap: 8px !important;
    padding: 16px 2px !important;
  }
  [data-row] a {
    justify-content: center !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }

  /* Booking chips and the form: one column, full-width controls. */
  [data-chip] { width: 100% !important; justify-content: center !important; }
  [data-booking-form] input,
  [data-booking-form] select,
  [data-booking-form] textarea { width: 100% !important; box-sizing: border-box !important; }
}

/* ── the hero name must not be cut in half ────────────────────────────────────
   The H1 is clamp(54px, 12.5vw, 220px). Below about 430px the 54px FLOOR wins over
   the viewport term, and at 320 "Magay." measures 333px inside a 302px column - so the
   page clipped the artist's own surname, silently, because the body carries
   overflow-x: hidden and nothing scrolled sideways to admit it.

   No probe caught this: the overflow checks in this project look at CONTROLS, and a
   heading is not a control. A contact sheet caught it. That is the whole argument for
   opening the frames rather than reading the green line.
   ──────────────────────────────────────────────────────────────────────────── */
@media (max-width: 380px) {
  header h1 { font-size: clamp(40px, 14.5vw, 54px) !important; }
}

/* And headings generally: never wider than the column that holds them, and allowed to break
   a long word rather than run past the edge. Closes a consistent 3px overhang on
   "The bands - past & present." seen at 360-390 under 2x mobile emulation but not in the
   desktop pane - a disagreement between two instruments that is cheaper to make impossible
   than to adjudicate. */
@media (max-width: 820px), (pointer: coarse) {
  h1, h2, h3 { max-width: 100% !important; overflow-wrap: break-word !important; }
}

/* ── the credit line: the house component (web-toolkit/tools/dc-port/PcholCredit.css) ─────────────
   Keyframes verbatim from pchol-productions/pchol-kollektiv-credit.dc.html. A bee on a surface WALKS - small
   steps, brief pauses, slight pivots; the amplitudes are tiny on purpose. That is the subtlety VJ asked for on
   15 Sep 2026, "like it is in www.pcholproductions.com". */
@keyframes pkcStep{0%{transform:translate(0,0) rotate(0deg)}11%{transform:translate(.34px,-.05px) rotate(-.22deg)}22%{transform:translate(.34px,-.05px) rotate(-.22deg)}33%{transform:translate(.72px,.06px) rotate(.12deg)}47%{transform:translate(.72px,.06px) rotate(.12deg)}58%{transform:translate(1.05px,-.07px) rotate(.3deg)}72%{transform:translate(1.05px,-.07px) rotate(.3deg)}84%{transform:translate(.5px,.05px) rotate(-.16deg)}93%{transform:translate(.5px,.05px) rotate(-.16deg)}100%{transform:translate(0,0) rotate(0deg)}}
@keyframes pkcGait{0%,100%{transform:translateY(0)}50%{transform:translateY(-.5px)}}
@keyframes pkcBreathe{0%,100%{transform:scale(1)}43%{transform:scale(1.012)}}
@keyframes pkcWingL{0%,70%,100%{transform:rotate(0deg)}73%{transform:rotate(-6deg)}77%{transform:rotate(-1.5deg)}81%{transform:rotate(0deg)}}
@keyframes pkcWingR{0%,54%,100%{transform:rotate(0deg)}57%{transform:rotate(5.5deg)}61%{transform:rotate(1deg)}66%{transform:rotate(0deg)}}
@keyframes pkcLegL{0%,100%{transform:rotate(0deg)}38%{transform:rotate(-4deg)}62%{transform:rotate(1.5deg)}}
@keyframes pkcLegR{0%,100%{transform:rotate(0deg)}46%{transform:rotate(3.6deg)}72%{transform:rotate(-1.2deg)}}
@keyframes pkcAntL{0%,80%,100%{transform:rotate(0deg)}83%{transform:rotate(-9deg)}87%{transform:rotate(-3deg)}91%{transform:rotate(-7deg)}96%{transform:rotate(0deg)}}
@keyframes pkcAntR{0%,62%,100%{transform:rotate(0deg)}65%{transform:rotate(8deg)}70%{transform:rotate(2deg)}75%{transform:rotate(6deg)}80%{transform:rotate(0deg)}}

/* The credit keeps its own face and size, deliberately NOT the host's. text-transform and letter-spacing are
   reset because the footer sets uppercase and .2em tracking on everything inside it. */
.pkc { display: inline-flex; align-items: center; gap: 8px; line-height: 1; font-family: 'Archivo', system-ui, sans-serif;
  font-weight: 400; font-size: 11.5px; letter-spacing: .03em; text-transform: none; opacity: .86; text-decoration: none; }
.pkc--cream { color: #F2EEE3; }
.pkc--right { flex-direction: row-reverse; }
.pkc:hover { opacity: 1; }
.pkc:focus-visible { outline-offset: 4px; }
.pkc-bee { flex: none; display: block; margin: -8px 0; align-self: center; transform: rotate(-11deg); }
/* !important: the head's anti-alt-flash rule paints an ink ground on EVERY img, which on stacked bee layers
   would draw a dark box over each layer beneath it. */
.pkc-bee img { position: absolute; inset: 0; width: 100%; height: 100%; background: none !important; }
.pkc-text { line-height: 1; }
.pkc-prefix { opacity: .8; }
@media (prefers-reduced-motion: reduce) { .pkc *, .pkc { animation: none !important; transition: none !important; } }

/* THE CREDIT STAYS IN THE RIGHT-HAND CORNER WHEN THE FOOTER WRAPS. On a phone the footer's three groups stack,
   and the credit, now alone on its row, fell to the LEFT edge while still reading words-then-bee - the wrong way
   round for a left corner (house rule: the bee is always on the outside of the phrase). margin-left:auto keeps it
   right-aligned at every width, so one layout holds everywhere. Measured 15 Sep 2026 at 390: credit left 18px. */
[data-footer] > [data-sc-name="Pchol Kollektiv Credit"] { margin-left: auto !important; }
/* "☀ DM in the AM" broke across two lines at 390. Each footer item stays whole; the GROUP wraps instead. */
[data-footer] > div:nth-child(2) { flex-wrap: wrap !important; row-gap: 4px !important; }
[data-footer] > div:nth-child(2) > * { white-space: nowrap !important; }

/* "What happens to it", the privacy link under Send inquiry, measured 41px tall with the disclosures open at 320, 414,
   768 and wider (mobile-audit OPEN=1, 15 Sep 2026) - 11px of padding on a 19px line box. 12.5px each side is 44. */
@media (max-width: 820px), (pointer: coarse) {
  [data-booking-form] ~ p a, [data-booking-send] ~ p a { padding-block: 12.5px !important; }
}
