/* Shared opponent name/year header: copied from the verified Eaton component. */
.ob-sheet .ob-name,.ob-sheet .ob-yr{-webkit-text-size-adjust:100%;text-size-adjust:100%}
.ob-sheet .ob-name{height:10.5pt;display:flex;align-items:center;white-space:nowrap;color:var(--ob-team-color);font:600 12pt/1 'OB Avenir','Avenir Next Condensed',sans-serif;margin-top:4px}
.ob-sheet .ob-yr,.ob-sheet .ob-who:has(.ob-hand) .ob-yr{transform:translateY(1.8pt);padding-right:0;font-size:8.5pt;gap:1.6pt;height:12.5pt;flex-wrap:nowrap}
.ob-sheet .ob-yr>span,.ob-sheet .ob-yr>i,.ob-sheet .ob-profile-tags{display:flex;align-items:center;height:100%;flex:none}
.ob-sheet .ob-profile-tags .ob-tag{padding-top:0;flex:none}

/* Slight rounding for every opponent card, including its border overlay. */
.ob-sheet .ob-card{border-radius:3pt}
.ob-sheet .ob-card::after{border-radius:inherit}

/* Six readable chronological AB slots; newer ABs extend to the right. */
.ob-sheet .ob-history{grid-template-columns:none;grid-auto-flow:column;grid-auto-columns:calc((100% - 2.5pt)/6);overflow-x:auto;overflow-y:hidden;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none}
.ob-sheet .ob-history::-webkit-scrollbar{display:none;height:0}
/* Desktop result rows drag horizontally; touch keeps native scrolling. */
@media screen and (hover:hover) and (pointer:fine){.ob-sheet .ob-card[data-ob-history-overflow="true"] .ob-history{cursor:grab}}
.ob-sheet .ob-card .ob-history[data-ob-dragging="true"]{cursor:grabbing;user-select:none;scroll-snap-type:none}
.ob-sheet .ob-history::-webkit-scrollbar-thumb{background:#aaa;border-radius:3px}
.ob-sheet .ob-history>.ob-ab{height:100%;grid-template-rows:13.314pt minmax(0,1fr);scroll-snap-align:start}
.ob-sheet .ob-fp>.ob-fp-label,.ob-sheet .ob-discipline{flex-shrink:0}
.ob-sheet .ob-fp-dots{min-width:0;flex:0 1 auto;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
.ob-sheet .ob-fp-dots::-webkit-scrollbar{height:0}
@media screen and (max-width:600px){.ob-sheet .ob-history{scrollbar-width:none}.ob-sheet .ob-history::-webkit-scrollbar{height:0}}
@media screen{.ob-sheet .ob-fp-dots>[data-ob-history-offscreen="true"]{display:none}}
@media print{
 .ob-sheet .ob-history{grid-template-columns:repeat(6,minmax(0,1fr));grid-auto-flow:row;grid-auto-columns:auto;overflow:hidden;scroll-snap-type:none;scrollbar-width:none}
 .ob-sheet .ob-history::-webkit-scrollbar{display:none}
 .ob-sheet .ob-history>.ob-ab{grid-template-rows:13.314pt 19.005pt}
 .ob-sheet .ob-history>.ob-ab:nth-last-child(n+7),.ob-sheet .ob-fp-dots>[data-ob-history-old="true"]{display:none}
 /* recent-left documents (newest game first): print keeps the FIRST six. */
 [data-ob-history-order="recent-left"] .ob-sheet .ob-history>.ob-ab:nth-last-child(n+7){display:grid}
 [data-ob-history-order="recent-left"] .ob-sheet .ob-history>.ob-ab:nth-child(n+7){display:none}
}
/* Prior-season at-bats (older games to the right): slightly darker result cell, Craig 2026-10-20. */
.ob-sheet .ob-history>.ob-ab[data-ob-prior-season]>.ob-ab-result{background:#d9d9d9}

/* Shared first-pitch states: orange swing, hollow orange looking, dotted gray ball. */
.ob-sheet.ob-falcon-v7 .ob-fp b.ob-sw{border:.5pt solid #ff9400;background:#ff9400}
.ob-sheet.ob-falcon-v7 .ob-fp b.ob-fp-looking{border:.5pt solid #ff9400;background:#fff}
.ob-sheet.ob-falcon-v7 .ob-fp b.ob-fp-ball{border:.5pt dotted #808184;background:#fff}
/* First-pitch markers are circles without exception (Craig 2026-10-20): width = height, never stretched or shrunk.
   2026-10-21: 8.25pt = exactly 11 CSS px. Chrome pixel-snaps a box in the card's own (unscaled) space before the 1.5625
   screen scale, so the old 9.538pt (12.72px) dot snapped to 12 or 13px per axis by position and rendered 18.75 x 20.31
   on screen: the ovals Craig saw. A whole-pixel size snaps the same on both axes. 17.19px on screen (was 19.87). */
.ob-sheet .ob-fp .ob-fp-dots>b:not(.ob-fp-unknown){flex:0 0 8.25pt;width:8.25pt;height:8.25pt;min-width:8.25pt;min-height:8.25pt;max-width:8.25pt;max-height:8.25pt;aspect-ratio:1/1;box-sizing:border-box;border-radius:50%}
/* Neutral directions stay available for handwritten circles. */
.ob-sheet.ob-falcon-v7 .ob-distribution-empty{justify-content:flex-start;align-items:center;background:#ebebeb;color:#999;font-weight:400}
.ob-sheet.ob-falcon-v7 .ob-distribution-empty .ob-distribution-label{width:18pt;box-sizing:border-box;order:0;font-weight:400;flex-shrink:0}
.ob-sheet.ob-falcon-v7 .ob-direction-options,.ob-sheet.ob-falcon-v7 .ob-distribution-empty:not(:has(.ob-direction-options))::after{display:flex;align-items:center;font-weight:400;white-space:nowrap}
.ob-sheet.ob-falcon-v7 .ob-distribution-empty:not(:has(.ob-direction-options))::after{content:"EXT PULL | PULL | SPRAY | OPPO"}
/* Existing table notes keep a visible card location above the empty field. */
.ob-sheet.ob-falcon-v7 .ob-source-note{position:absolute;top:38pt;left:3pt;right:3pt;max-height:30pt;overflow:auto;color:#666;font:400 6.5pt/1.1 'OB Avenir','Avenir Next Condensed',sans-serif;z-index:2}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-notes="true"] .ob-chart-viewport{top:70pt;transform:scale(.6)}
.ob-sheet.ob-falcon-v7 .ob-approach-pitch .pitch-owner{font-size:65%;font-weight:400;margin-right:1pt}
@media print{.ob-sheet.ob-falcon-v7 .ob-source-note{overflow:visible}}
/* Craig's hit-distribution brown palette, 2026-10-19. */
.ob-sheet.ob-falcon-v7 .ob-distribution-ground{--ob-dist-left:#cd8f47;--ob-dist-center:#b25218;--ob-dist-right:#561e05}
.ob-sheet.ob-falcon-v7 .ob-distribution-ground[data-ob-batting-side="L"]{--ob-dist-left:#561e05;--ob-dist-right:#cd8f47}
.ob-sheet.ob-falcon-v7 .ob-distribution-fly{--ob-dist-left:#00cb00;--ob-dist-center:#006d00;--ob-dist-right:#033000}
.ob-sheet.ob-falcon-v7 .ob-distribution-fly[data-ob-batting-side="L"]{--ob-dist-left:#033000;--ob-dist-right:#00cb00}
/* Unselected printed choices stay available for circling without competing with data. */
.ob-sheet.ob-falcon-v7 .ob-direction-options,.ob-sheet.ob-falcon-v7 .ob-distribution-empty:not(:has(.ob-direction-options))::after{opacity:.2}
.ob-sheet.ob-falcon-v7 .ob-distribution-scope{font:400 5.5pt/1 'OB Avenir','Avenir Next Condensed',sans-serif;align-self:flex-end;padding:0 0 1pt 2pt;white-space:nowrap}
/* HF BIP overlays: outcome controls the ring, trajectory controls the center. */
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub{width:9.3pt;height:9.3pt;border-width:1.32pt;font-size:0;color:transparent;background:#333}
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub.ob-hit{border-color:#00d682}
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub.ob-out{border-color:#b90018}
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub[data-ob-contact-trajectory="ground"]{background:#000}
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub[data-ob-contact-trajectory="air"]{background:#fff}
/* Keep the complete strikeout rail inside the printed card. */
.ob-sheet.ob-falcon-v7 .ob-chart .ob-strikeouts{top:137pt}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-identity-note="true"] .ob-source-note{max-height:45pt}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-identity-note="true"] .ob-chart-viewport{top:85pt;transform:scale(.5)}
.ob-sheet.ob-falcon-v7 .ob-chart .ob-bub[data-ob-contact-trajectory="air"]{border-width:1.8pt}
.ob-sheet.ob-falcon-v7 .ob-chart:has(.ob-spray[data-ob-blank="true"]) .ob-strikeouts{top:137pt}
/* Strikeouts sit behind the plate, with the same rendered diameter as HF BIPs. */
.ob-sheet.ob-falcon-v7 .ob-chart{--ob-result-scale:.83;--ob-home-x:50%}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-notes="true"]{--ob-result-scale:.6;--ob-home-x:73.931255pt}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-identity-note="true"]{--ob-result-scale:.5;--ob-home-x:65.318105pt}
.ob-sheet.ob-falcon-v7 .ob-chart>.ob-strikeouts,.ob-sheet.ob-falcon-v7 .ob-chart:has(.ob-spray[data-ob-blank="true"])>.ob-strikeouts{left:var(--ob-home-x);top:auto;bottom:1pt;height:9.3pt;gap:.8pt;transform:translateX(-50%) scale(var(--ob-result-scale));transform-origin:center bottom}
.ob-sheet.ob-falcon-v7 .ob-chart>.ob-strikeouts .ob-k-symbol{box-sizing:border-box;width:9.3pt;height:9.3pt;border:1.8pt solid #b90018;background:rgba(185,0,24,.5);font-size:0;color:transparent;padding:0}
.ob-sheet.ob-falcon-v7 .ob-chart>.ob-strikeouts .ob-k-label{color:#b90018}

/* Craig 2026-10-21 layout pass. His px are screen px at the 1.5625 desktop card scale: 12px = 5.76pt in this pt master. */
/* 1) Y and N/C approach rows 12px shorter each; the 1st-pitch row below takes the 24px they free for its calls (3). */
.ob-sheet.ob-falcon-v7 .ob-pitch-table{height:38.6397pt}
.ob-sheet.ob-falcon-v7 .ob-pitch-table tr:first-child{height:18.4903pt}
.ob-sheet.ob-falcon-v7 .ob-pitch-table tr:last-child{height:20.1494pt}
.ob-sheet.ob-falcon-v7 .ob-fp{top:98.231pt;height:34.7422pt}
/* 3) The coach's call on pitch 1 of that AB (data-ob-fp-call, set by opp-card-history.js from #ob-pitch-evidence), small
   black, centered under its circle. Circle + call center on the row as one item; the padding is the call's room
   (overflow-y clips at the padding edge) and the 1pt side padding keeps an end call from being clipped.
   2026-10-21 Craig, twice: +1px and one weight lighter each time (now 7.46pt / 400), +5px gap each time (now 10px = 4.8pt). */
.ob-sheet.ob-falcon-v7 .ob-fp .ob-fp-dots:has(>b[data-ob-fp-call]){padding:0 1pt 12.26pt;margin:0 -1pt}
.ob-sheet.ob-falcon-v7 .ob-fp .ob-fp-dots>b[data-ob-fp-call]:not(.ob-fp-unknown){position:relative}
.ob-sheet.ob-falcon-v7 .ob-fp .ob-fp-dots>b[data-ob-fp-call]:not(.ob-fp-unknown)::after{content:attr(data-ob-fp-call);position:absolute;left:50%;top:100%;margin-top:4.8pt;transform:translateX(-50%);color:#000;font:400 7.46pt/1 'OB Avenir','Avenir Next Condensed',sans-serif;white-space:nowrap;pointer-events:none}
/* 4) OF and IF bars 12px taller each; the field plane, notes and BUNT move down with them (the card grows, 6). */
.ob-sheet.ob-falcon-v7 .ob-distribution{height:17.76pt}
.ob-sheet.ob-falcon-v7 .ob-distribution-bottom{top:29.26pt}
.ob-sheet.ob-falcon-v7 .ob-chart{height:187.2563pt}
.ob-sheet.ob-falcon-v7 .ob-chart-viewport{top:52.65155pt}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-notes="true"] .ob-chart-viewport{top:81.52pt}
.ob-sheet.ob-falcon-v7 .ob-chart[data-ob-identity-note="true"] .ob-chart-viewport{top:96.52pt}
.ob-sheet.ob-falcon-v7 .ob-source-note{top:49.52pt}
.ob-sheet.ob-falcon-v7 .ob-bunt{top:166.966912pt}
/* 5) Bar colors by field side: OF pull bright blue / center bright green / oppo mid green (#006d00, the old center); IF
   pull bright red / middle light brown / oppo mid brown (#b25218, the old center) -- Craig 2026-10-21 second pass
   (pull = left for R, right for L, as before). A 2px white seam (.96pt) wherever one color
   meets the next, including the label end (R: label left, pull-colored; L and unknown hand: label right); a 0% group
   is a sliver (below). An inset shadow, not a border: Chrome floors a 1.28px border to 1px, which renders 1.56px. */
.ob-sheet.ob-falcon-v7 .ob-distribution-fly{--ob-dist-left:#1e90ff;--ob-dist-center:#00cb00;--ob-dist-right:#006d00}
.ob-sheet.ob-falcon-v7 .ob-distribution-fly[data-ob-batting-side="L"]{--ob-dist-left:#006d00;--ob-dist-right:#1e90ff}
.ob-sheet.ob-falcon-v7 .ob-distribution-ground{--ob-dist-left:#ea0a2a;--ob-dist-center:#cd8f47;--ob-dist-right:#b25218}
.ob-sheet.ob-falcon-v7 .ob-distribution-ground[data-ob-batting-side="L"]{--ob-dist-left:#b25218;--ob-dist-right:#ea0a2a}
.ob-sheet.ob-falcon-v7 .ob-distribution[data-ob-batting-side="R"] .ob-distribution-stack i:not(:first-child){box-shadow:inset .96pt 0 0 #fff}
.ob-sheet.ob-falcon-v7 .ob-distribution:not([data-ob-batting-side="R"]) .ob-distribution-stack i:not(:last-child){box-shadow:inset -.96pt 0 0 #fff}
/* Craig 2026-10-21: "when any group is 0, show at least 4px and the white edge border" -- an empty field reads at a glance
   (a 0% middle is a double white line). The 0% group keeps 4px (1.92pt) of its color, plus its own 2px seam where it
   has one; the other groups shrink in proportion so the bar still fills the row. The % overlay (spans) takes the same
   widths so every number and word stays on its segment; a 0% number stays hidden. */
.ob-sheet.ob-falcon-v7 .ob-distribution-stack>i,.ob-sheet.ob-falcon-v7 .ob-distribution-numbers>span{flex:0 1 auto;min-width:0}
.ob-sheet.ob-falcon-v7 .ob-distribution[data-ob-batting-side="R"] :is(.ob-distribution-stack>i,.ob-distribution-numbers>span)[style="width:0%"]{flex:0 0 2.88pt}
.ob-sheet.ob-falcon-v7 .ob-distribution[data-ob-batting-side="R"] :is(.ob-distribution-stack>i,.ob-distribution-numbers>span)[style="width:0%"]:first-child{flex:0 0 1.92pt}
.ob-sheet.ob-falcon-v7 .ob-distribution:not([data-ob-batting-side="R"]) :is(.ob-distribution-stack>i,.ob-distribution-numbers>span)[style="width:0%"]{flex:0 0 2.88pt}
.ob-sheet.ob-falcon-v7 .ob-distribution:not([data-ob-batting-side="R"]) :is(.ob-distribution-stack>i,.ob-distribution-numbers>span)[style="width:0%"]:last-child{flex:0 0 1.92pt}
/* The tendency word inside its own segment (opp-card-history.js placeTendency), Craig 2026-10-21: outer end of the segment
   (left for R, right for L, as the label sat before), vertically centered; the segment's % stays at the other end. Visible
   even in a 0% segment (SPRAY then still starts the bar). */
.ob-sheet.ob-falcon-v7 .ob-distribution-numbers span>.ob-distribution-label{position:absolute;top:0;bottom:0;display:flex;align-items:center;padding:0 3pt;white-space:nowrap;font-weight:500;width:auto;order:0;visibility:visible}
.ob-sheet.ob-falcon-v7 .ob-distribution[data-ob-batting-side="R"] .ob-distribution-numbers span>.ob-distribution-label{left:0;transform-origin:left center}
.ob-sheet.ob-falcon-v7 .ob-distribution[data-ob-batting-side="L"] .ob-distribution-numbers span>.ob-distribution-label{right:0;transform-origin:right center}
/* 6) Card 24px taller (11.52pt); on screen the gap under the team name gives up the same 24px. On paper the title's ink
   already ends 6pt above the cards, so the two taller rows fit by printing the grid at 97.8% (was 99%): bottom frames stay
   18.6pt in from the edge (quarter-inch rule; at 99% they would sit 9.9pt in). */
.ob-sheet.ob-falcon-v7 .ob-card{height:353.32pt}
.ob-sheet.ob-falcon-v7>.ob-grid{grid-auto-rows:353.32pt}
@media print{.ob-sheet.ob-falcon-v7>.ob-grid{transform:scale(.978)}}
@media screen{
 .ob-falcon-document.ob-falcon-document{grid-auto-rows:calc(353.32pt * var(--ob-web-card-scale,1.5625))}
 .ob-falcon-document.ob-falcon-document>.ob-web-team{margin-bottom:-24px}
}
/* 7) Team logo before the seed and name (opp-card-history.js: the GameImpact opp-marks.js resolver, same files). */
/* 1em square (every opp-marks file is 140x140): spans the title's cap + parenthesis ink, and is sized before the image
   loads. margin:0 beats the site-wide img{margin:0 auto} in t_tlc-styles.css, which centered it in a 57px gutter. */
.ob-team-logo{display:block;flex:none;width:1em;height:1em;margin:0;object-fit:contain}
/* Ball counts + play types above GC's own Hit/Out legend (opp-card-history.js bipKey), Craig 2026-10-21: "really small,
   exactly like GC's default". Measured in the field art's own px (the same plane as the legend, so it scales with it):
   legend circle right edge 10.78, legend text left 15.45, cap height 5.77 (Open Sans 8.08px), line pitch 13.69, ink
   #35373D. Values right-align on the circle column, names left-align on the Hit/Out text; the last row sits one pitch
   above Hit. */
.ob-sheet .ob-chart-art .ob-bip-key{position:absolute;left:0;right:0;bottom:30.24px;height:0;pointer-events:none;color:#35373D;font:400 8.08px/13.69px 'Open Sans',Arial,sans-serif;letter-spacing:0;text-transform:none;white-space:nowrap}
.ob-sheet .ob-chart-art .ob-bip-key>div{position:absolute;bottom:0;display:flex;flex-direction:column}
.ob-sheet .ob-chart-art .ob-bip-values{right:calc(100% - 10.78px);align-items:flex-end}
.ob-sheet .ob-chart-art .ob-bip-names{left:15.45px;align-items:flex-start}
/* 8) An opponent we have never played (Palisade), Craig 2026-10-21: opp-card-history.js sets html[data-ob-unplayed] when
   EVERY card on the page has data-ob-matchup-pa="0". No first pitch and no result exists to show, and no C notes are
   written before a first meeting, so the 1st P Swing and result rows go, the MaxPreps K / BB move from the 1st-pitch row
   into the C cell of the N row (same boxes, same right inset), and the field plane moves up under the N row by the two
   rows (166.0637 - 98.231 = 67.8327pt): card 353.32 - 67.8327 = 285.4873pt. A page with any played card is untouched. */
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7 :is(.ob-fp,.ob-history){display:none}
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7 .ob-chart{top:98.231pt}
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7 .ob-c-cell{background:#fff}
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7 .ob-c-cell>.ob-discipline{display:flex;justify-content:flex-end;align-items:center;margin:0}
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7 .ob-card{height:285.4873pt}
html[data-ob-unplayed] .ob-sheet.ob-falcon-v7>.ob-grid{grid-auto-rows:285.4873pt}
@media screen{html[data-ob-unplayed] .ob-falcon-document.ob-falcon-document{grid-auto-rows:calc(285.4873pt * var(--ob-web-card-scale,1.5625))}}
/* Top-right tools (opp-card-history.js oppTools), Craig 2026-10-21: red "Sync MaxPreps" btn-xxs inline with a gold "Game
   Impact" btn-xxs; neither prints. The buttons are the site's own style-guide classes (t_tlc-styles.css loads here);
   this only places the row. Declared differences from the guide: white-space:nowrap (the 6% side padding of a btn-xxs
   in a corner row wraps "SYNC MAXPREPS" to two lines otherwise) and, when the title would run under it (long name or a
   narrow screen; opp-card-history.js measures), the row sits above the team name instead of over it. The row is 320px
   wide in both places so the guide's 6% side padding resolves the same everywhere (19.2px) and both labels fit. */
#ob-tools{position:absolute;top:8px;right:24px;z-index:5;width:320px;display:flex;align-items:center;justify-content:flex-end}
#ob-tools .btn{white-space:nowrap}
#ob-tools.ob-tools-stacked{position:static;max-width:100%;margin:0 0 6px auto}
@media print{#ob-tools{display:none!important}}
/* Craig 2026-10-21: the "Updated ... (N games)" note wraps under the team name at every width (as it already did on
   phones), and the team name is 15% smaller: clamp(34px,6vw,61.477334px) -> clamp(28.9px,5.1vw,52.255734px), phones
   clamp(16px,5.333vw,20px) -> clamp(13.6px,4.533vw,17px). The fixed 74.63px header height gives way to the second line.
   The logo is 1em, so it follows the name. Printed sheet titles are unchanged. */
@media screen{
 .ob-falcon-document.ob-falcon-document>.ob-web-team{flex-wrap:wrap;align-content:center;height:auto;min-height:74.63px;row-gap:0}
 .ob-falcon-document.ob-falcon-document>.ob-web-team .ob-updated{flex-basis:100%}
 /* Only the note wraps: the name keeps its line beside the logo and seed (it overflows a narrow header as before). */
 .ob-falcon-document.ob-falcon-document>.ob-web-team .ob-team-name{flex:1 1 0;min-width:0}
}
@media screen and (min-width:576px){.ob-falcon-document.ob-falcon-document>.ob-web-team{font-size:clamp(28.9px,5.1vw,52.255734px)}}
@media screen and (max-width:575.98px){.ob-falcon-document.ob-falcon-document>.ob-web-team{font-size:clamp(13.6px,4.533vw,17px)}}
