:root{--bg: #fff8f1;--surface: #ffffff;--surface-2: #fdf0e4;--text: #241a14;--muted: #7a6a5e;--line: #f0e1d3;--accent: #b83d1a;--accent-bright: #e2552d;--accent-soft: #fde4d9;--on-accent: #ffffff;--ok: #276b43;--ok-bg: #e3f4e9;--warn: #8a5a00;--warn-bg: #fff1c7;--warn-line: #f5c84b;--radius: 18px;--shadow: 0 1px 2px rgba(60,30,10,.05),0 8px 24px rgba(60,30,10,.06);--font: ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}@media (prefers-color-scheme: dark){:root{--bg: #17120f;--surface: #221b17;--surface-2: #2b221d;--text: #f6ece4;--muted: #b3a294;--line: #3a2f28;--accent: #ff7a50;--accent-bright: #ff7a50;--accent-soft: #4a2619;--on-accent: #1d0f08;--ok: #7fd6a0;--ok-bg: #173323;--warn: #ffd166;--warn-bg: #3d2f0c;--warn-line: #8a6a1c;--shadow: 0 1px 2px rgba(0,0,0,.3),0 8px 24px rgba(0,0,0,.25)}}*{box-sizing: border-box}/* QA-007: Firefox skips the focus scroll when a focused element starts less than a pixel below the viewport (its rounding counts it as visible),e.g. the footer diocese links on My parishes at 390x844 (link top 844.02). A bottom scroll-padding makes every focus/scrollIntoView keep 24px clear of the bottom edge,so that boundary can't be hit; anchors (top) unchanged. */
html { -webkit-text-size-adjust: 100%; scroll-padding-bottom: 24px; }
/* Sticky header vs. focus (WCAG 2.4.11, QA-WK1): every focus/scrollIntoView keeps the target below the header.
   --hdr-h is the header's height (app.js keeps it exact with a ResizeObserver;these are the measured fallbacks). Header controls cancel the padding with a matching negative scroll-margin,or focusing a header link while the page is scrolled would make Chromium/WebKit scroll the page to "reveal" a link that is already on screen. */ :root{--hdr-h: 102px}@media (min-width: 561px){:root{--hdr-h: 108px}}@media (min-width: 1024px){:root{--hdr-h: 64px}}html{scroll-padding-top: calc(var(--hdr-h) + 8px)}.site-header :is(a,button,summary,input){scroll-margin-top: calc(-1 * (var(--hdr-h) + 8px))}.rlist :is(a,button,summary),.nnm :is(input,button){scroll-margin-top: 8px}body{margin: 0;background: var(--bg);color: var(--text);font: 17px/1.55 var(--font);-webkit-font-smoothing: antialiased}a{color: inherit}.wrap{max-width: 960px;margin: 0 auto;padding: 0 20px}.skip{position: absolute;left: -999px}.skip:focus{left: 12px;top: 12px;background: var(--surface);padding: 8px 12px;border-radius: 8px;z-index: 10}:focus-visible{outline: 3px solid var(--accent);outline-offset: 2px;border-radius: 8px}.site-header{position: sticky;top: 0;z-index: 5;background: color-mix(in srgb,var(--bg) 88%,transparent);backdrop-filter: saturate(1.4) blur(10px);border-bottom: 1px solid var(--line)}.header-inner{display: flex;align-items: center;justify-content: space-between;gap: 12px;padding-top: 12px;padding-bottom: 12px;flex-wrap: wrap}.brand{display: flex;align-items: center;gap: 10px;text-decoration: none;font-weight: 800;letter-spacing: -.02em;font-size: 1.15rem}.logo-mark{width: 30px;height: 30px;flex: none}.brand-region{font-weight: 600;font-size: .78rem;color: var(--muted);background: var(--surface-2);padding: 3px 9px;border-radius: 99px;letter-spacing: 0}.nav{display: flex;gap: 4px;overflow-x: auto;scrollbar-width: none}.nav a{text-decoration: none;font-weight: 600;font-size: .92rem;padding: 8px 12px;border-radius: 99px;color: var(--muted);white-space: nowrap}.nav a:hover{color: var(--text);background: var(--surface-2)}.nav a[aria-current]{color: var(--accent);background: var(--accent-soft)}@media (max-width: 560px){.header-inner{padding-bottom: 8px}.nav{width: 100%;margin: 0 -6px}.nav a{padding: 7px 10px;font-size: .9rem}}/* Mobile nav: 8 links don't fit at 390px. Fade the right edge so it reads as "scroll for more", and pad the end so
   the last link clears the fade once scrolled. app.js scrolls the current page's link into view. (P2-5) */ @media (max-width: 760px){.nav{padding-right: 36px;scroll-padding-inline: 12px;-webkit-mask-image: linear-gradient(to right,#000 calc(100% - 40px),transparent);mask-image: linear-gradient(to right,#000 calc(100% - 40px),transparent)}.nav.scrolled{-webkit-mask-image: linear-gradient(to right,transparent,#000 32px,#000 calc(100% - 40px),transparent);mask-image: linear-gradient(to right,transparent,#000 32px,#000 calc(100% - 40px),transparent)}.nav.at-end{-webkit-mask-image: none;mask-image: none}.nav.scrolled.at-end{-webkit-mask-image: linear-gradient(to right,transparent,#000 32px);mask-image: linear-gradient(to right,transparent,#000 32px)}}.hero{padding: 40px 0 20px}.hero.small{padding-bottom: 8px}.eyebrow{margin: 0 0 8px;color: var(--accent);font-weight: 700;font-size: .85rem;letter-spacing: .06em;text-transform: uppercase}h1{font-size: clamp(2.1rem,7vw,3.6rem);line-height: 1.04;letter-spacing: -.035em;margin: 0 0 12px;font-weight: 850}h2{letter-spacing: -.02em;line-height: 1.2}.lede{font-size: 1.12rem;color: var(--muted);margin: 0;max-width: 34em}.muted{color: var(--muted)}.small{font-size: .88rem}.tabs{display: grid;grid-template-columns: repeat(3,1fr);gap: 6px;padding: 6px;background: var(--surface-2);border-radius: 99px;margin: 8px 0 16px;max-width: 520px}.tabs button{font: inherit;font-weight: 700;border: 0;background: transparent;color: var(--muted);padding: 11px 8px;border-radius: 99px;cursor: pointer;transition: background .15s,color .15s}.tabs button[aria-selected="true"]{background: var(--accent);color: var(--on-accent);box-shadow: var(--shadow)}.chips{display: flex;gap: 8px;overflow-x: auto;padding: 2px 2px 10px;margin: 0 -20px;padding-left: 20px;padding-right: 20px;scrollbar-width: none}.chips::-webkit-scrollbar,.nav::-webkit-scrollbar{display: none}@media (min-width: 760px){.chips{flex-wrap: wrap;margin: 0;padding-left: 2px}}.chip{font: inherit;font-size: .9rem;font-weight: 600;white-space: nowrap;border: 1.5px solid var(--line);background: var(--surface);color: var(--text);padding: 7px 14px;border-radius: 99px;cursor: pointer;text-decoration: none}.chip[aria-pressed="true"]{border-color: var(--accent);background: var(--accent-soft);color: var(--accent)}.chips.static{margin-top: 18px}.r-head{font-size: 1.05rem;margin: 18px 0 10px;display: flex;align-items: center;gap: 8px}.count{font-size: .8rem;background: var(--surface-2);color: var(--muted);padding: 2px 9px;border-radius: 99px}.rlist{list-style: none;margin: 0;padding: 0;display: grid;gap: 10px}@media (min-width: 760px){.rlist{grid-template-columns: 1fr 1fr;align-items: start}}.r-time .pill{vertical-align: middle}.r-link{display: grid;grid-template-columns: auto 1fr;grid-template-areas: "time status" "main main";gap: 4px 12px;text-decoration: none;background: var(--surface);border: 1px solid var(--line);border-radius: var(--radius);padding: 16px 18px;box-shadow: var(--shadow);transition: transform .12s,border-color .12s}.r:hover{transform: translateY(-1px);border-color: var(--accent)}.r-time{grid-area: time;font-weight: 800;font-size: 1.25rem;letter-spacing: -.02em;font-variant-numeric: tabular-nums}.r-status{grid-area: status;justify-self: end;align-self: center;font-size: .8rem;font-weight: 700;color: var(--accent);background: var(--accent-soft);padding: 3px 10px;border-radius: 99px;white-space: nowrap}.r-main{grid-area: main;display: flex;flex-direction: column}.r-name{font-weight: 700}.r-meta{color: var(--muted);font-size: .92rem}.r-note{font-size: .85rem;color: var(--muted);font-style: italic}.r.now a{border-color: var(--accent)}.r.now .r-status{background: var(--accent);color: var(--on-accent)}.r.past a{box-shadow: none}.r.past .r-name,.r.past .r-time,.r.past .r-meta{color: var(--muted)}.r.past .r-status{background: var(--surface-2);color: var(--muted)}.empty{background: var(--surface);border: 1px dashed var(--line);border-radius: var(--radius);padding: 18px;margin-top: 12px}.empty .big{font-weight: 700;font-size: 1.1rem;margin: 0}.past-wrap{margin-top: 18px}.past-wrap summary{cursor: pointer;font-weight: 700;color: var(--muted);margin-bottom: 10px}.fine{margin-top: 24px}.badge{display: inline-flex;align-items: center;gap: 4px;font-size: .82rem;font-weight: 700;padding: 4px 11px;border-radius: 99px;vertical-align: middle}.badge.sm{font-size: .7rem;padding: 2px 8px;font-weight: 700}.badge-ok{background: var(--ok-bg);color: var(--ok)}.badge-warn{background: var(--warn-bg);color: var(--warn);border: 1px solid var(--warn-line)}.pill{font-size: .7rem;font-weight: 700;background: var(--surface-2);color: var(--muted);padding: 1px 7px;border-radius: 99px}.crumbs{padding-top: 22px;font-size: .9rem;color: var(--muted)}.crumbs a{color: var(--accent);text-decoration: none;font-weight: 600}.parish-head{padding: 14px 0 8px}.parish-head h1{margin-top: 12px;font-size: clamp(2rem,6.5vw,3rem)}.parish-head p{margin: 0}.notice{background: var(--surface);border: 1px solid var(--line);border-radius: var(--radius);padding: 14px 16px;margin: 16px 0;font-size: .95rem}.notice-warn{background: var(--warn-bg);border-color: var(--warn-line);color: var(--text)}.cards{display: grid;grid-template-columns: 1fr;gap: 10px;margin: 18px 0 8px}@media (min-width: 640px){.cards{grid-template-columns: 1fr 1fr}}.card{display: flex;flex-direction: column;gap: 2px;background: var(--surface);border: 1px solid var(--line);border-radius: var(--radius);padding: 14px 16px;text-decoration: none;box-shadow: var(--shadow);min-width: 0}.card:hover{border-color: var(--accent)}.card .k{font-size: .75rem;text-transform: uppercase;letter-spacing: .06em;color: var(--muted);font-weight: 700}.card .v{font-weight: 650;overflow-wrap: anywhere}.card .go{color: var(--accent);font-weight: 700;font-size: .88rem;margin-top: 4px}.sched{margin-top: 26px}.sched h2{font-size: 1.2rem;margin: 0 0 8px}.sched table{width: 100%;border-collapse: collapse;background: var(--surface);border-radius: var(--radius);overflow: hidden;border: 1px solid var(--line)}.sched th,.sched td{text-align: left;padding: 12px 14px;border-bottom: 1px solid var(--line);vertical-align: top}.sched tr:last-child th,.sched tr:last-child td{border-bottom: 0}.sched th{width: 5.5em;font-weight: 700}.sched td.t{white-space: nowrap;font-weight: 650;font-variant-numeric: tabular-nums}.sched td.note{color: var(--muted);font-size: .88rem}@media (max-width: 520px){.sched td.note{display: block;padding-top: 0}.sched tr{display: grid;grid-template-columns: 5em 1fr}.sched td.note{grid-column: 1 / -1;border-bottom: 1px solid var(--line)}.sched th,.sched td.t{border-bottom: 0}.sched td.note:empty{padding: 0}}.sources{margin-top: 30px;padding-top: 14px;border-top: 1px solid var(--line);font-size: .9rem;color: var(--muted)}.sources a{color: var(--accent)}.city h2{font-size: 1.2rem;margin: 28px 0 10px;scroll-margin-top: 8px}.plist{list-style: none;padding: 0;margin: 0;display: grid;gap: 8px}@media (min-width: 760px){.plist{grid-template-columns: 1fr 1fr}}.plist a{display: flex;flex-wrap: wrap;align-items: center;gap: 2px 10px;text-decoration: none;background: var(--surface);border: 1px solid var(--line);border-radius: 14px;padding: 12px 16px}.plist a:hover{border-color: var(--accent)}.pname{font-weight: 700;flex: 1 1 60%}.pmeta{color: var(--muted);font-size: .88rem;order: 3;flex-basis: 100%}.prose{max-width: 40em}.prose h2{margin-top: 34px;font-size: 1.35rem}.button{display: inline-block;background: var(--accent);color: var(--on-accent);font-weight: 700;text-decoration: none;padding: 12px 20px;border-radius: 99px}.button.ghost{background: transparent;color: var(--accent);border: 2px solid var(--accent)}.sponsor{margin: 44px 0 10px;background: var(--accent-soft);border-radius: 24px;padding: 26px 24px;max-width: 40em}.sponsor h2{margin: 0 0 8px}.site-footer{margin-top: 60px;border-top: 1px solid var(--line);padding: 26px 0 40px;color: var(--muted);font-size: .88rem}.site-footer p{margin: 4px 0}.site-footer a{color: var(--accent)}@media (prefers-reduced-motion: reduce){*{transition: none !important}}/* Visually hidden,still read. position:absolute takes .sr out of its row,so its containing block is the nearest positioned ancestor;with none,a .sr inside a sideways-scrolling row (.now-links chips at 390px) escaped the row's
   clip and widened the whole page by ~148px. Every overflow-x row below is position:relative so it contains its .sr
   text; nowrap keeps the text from wrapping into a tall 1px column. */
.sr { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; border: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; }
.nav, .chips, .now-links { position: relative; } /* contain .sr text inside sideways-scrolling rows (see .sr) */
/* Inline SVG icons (pages.mjs icon(), f3cf37a): 1em, currentColor; sit on the text baseline in running text and never
   shrink inside flex rows (badges, chips, .r-act). The saved star fills through aria-pressed, no JS styling. */
.ico { flex: none; vertical-align: -0.125em; }
.fav-btn[aria-pressed="true"] .ico-star { fill: currentColor; }
.fav-star[aria-pressed="true"] .ico-star { fill: currentColor; } /* My parishes card star (app.js) */
.quick { display: flex; gap: 8px; flex-wrap: wrap; margin: 0 0 10px; }
/* Clear filters: a text button (accent, underlined), 44px tall box, shown by app.js only while something is active. */
.chip-clear { font: inherit; font-size: .9rem; font-weight: 600; display: inline-flex; align-items: center; min-height: 44px; min-width: 44px; margin: -4px 0; padding: 0 10px; border: 0; border-radius: 99px; background: transparent; color: var(--accent); text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
.chip-clear:hover { background: var(--accent-soft); }
.chip-clear[hidden] { display: none; }
.chip-strong[aria-pressed="true"], .quick .chip[aria-pressed="true"] { border-color: var(--accent); background: var(--accent); color: var(--on-accent); }
.fcount { display: inline-grid; place-items: center; min-width: 1.3em; height: 1.3em; border-radius: 99px; background: var(--accent); color: var(--on-accent); font-size: .75rem; margin-left: 4px; }
.chip[aria-expanded="true"] { border-color: var(--accent); color: var(--accent); }
.filter-panel { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px 16px 6px; margin: 0 0 12px; box-shadow: var(--shadow); }
.fgroup { margin-bottom: 10px; } .flabel { margin: 0 0 6px; font-size: .78rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
.chips-row { display: flex; flex-wrap: wrap; gap: 6px; }
.geo-msg { margin: 0 0 8px; }
.r-dist { font-weight: 700; color: var(--text); }
.pill-es { background: var(--accent-soft); color: var(--accent); }
.pill-hd { background: var(--ok-bg); color: var(--ok); }
.holyday { margin-top: 18px; display: grid; gap: 8px; }
.hd-banner { display: grid; gap: 2px; text-decoration: none; padding: 14px 18px; border-radius: var(--radius); background: linear-gradient(135deg, var(--accent-soft), var(--surface-2)); border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent); }
.hd-when { font-size: .78rem; font-weight: 800; color: var(--accent); text-transform: uppercase; letter-spacing: .06em; }
.hd-name { font-weight: 800; font-size: 1.2rem; letter-spacing: -.01em; }
.hd-detail { font-size: .92rem; color: var(--muted); } .hd-detail u { color: var(--accent); text-decoration: none; font-weight: 700; white-space: nowrap; }
.hd-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 18px 20px; margin-top: 16px; }
.hd-card.past { opacity: .6; } .hd-card h2 { margin: 0 0 4px; font-size: 1.35rem; } .hd-card .eyebrow { margin-bottom: 4px; }
.hd-list { list-style: none; padding: 0; margin: 10px 0 0; display: grid; gap: 8px; }
.hd-list li { display: flex; flex-wrap: wrap; gap: 2px 8px; padding: 8px 0; border-top: 1px solid var(--line); }
.hd-list a { font-weight: 700; color: var(--text); } .hd-times { flex-basis: 100%; font-size: .92rem; }
.notice-soft { background: var(--surface-2); border-color: var(--line); }
.digest { margin: 40px 0 0; display: grid; gap: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: 24px; padding: 22px; }
@media (min-width: 760px) { .digest { grid-template-columns: 1.2fr 1fr; align-items: center; } }
.digest h2 { margin: 0 0 4px; font-size: 1.25rem; } .digest p { margin: 0; }
.digest-form { display: flex; flex-wrap: wrap; gap: 8px; }
.digest-form input { flex: 1 1 200px; font: inherit; padding: 11px 16px; border-radius: 99px; border: 1.5px solid var(--line); background: var(--bg); color: var(--text); }
.digest-form .button { border: 0; cursor: pointer; font: inherit; font-weight: 700; }
.digest-msg { flex-basis: 100%; color: var(--ok); }
.city-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px; margin-top: 12px; }
.city-card h2 { font-size: 1.15rem; margin: 0 0 2px; } .city-card h2 a { text-decoration: none; } .city-card p { margin: 0 0 8px; }
.mini { display: grid; grid-template-columns: 6.5em 1fr; gap: 4px 10px; margin: 0; font-size: .92rem; }
.mini dt { font-weight: 700; color: var(--muted); } .mini dd { margin: 0; }
.city h2 a { text-decoration: none; } .city h2 a:hover { color: var(--accent); }
.site-footer .cities { margin-top: 10px; line-height: 1.9; } .site-footer .cities a { color: var(--muted); }
[hidden] { display: none !important; }
.holyday { gap: 6px; margin-top: 14px; }
.hd-banner { padding: 10px 14px; grid-template-columns: auto 1fr; align-items: baseline; gap: 0 10px; }
.hd-when { grid-row: 1; } .hd-name { font-size: 1.02rem; grid-row: 1; } .hd-detail { grid-column: 1 / -1; font-size: .85rem; }
.hero { padding-top: 26px; }

/* ---- v3: card actions, parish actions, favorites, a11y ---- */
.r { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); transition: transform .12s, border-color .12s; }
.r .r-link { background: none; border: 0; box-shadow: none; border-radius: var(--radius) var(--radius) 0 0; padding: 16px 18px 8px; transition: none; color: inherit; }
.r-actions { display: flex; flex-wrap: wrap; gap: 8px; padding: 2px 18px 14px; }
.r-act { font: inherit; font-size: .82rem; font-weight: 700; display: inline-flex; align-items: center; gap: 5px; min-height: 34px; border: 1.5px solid var(--line); background: var(--surface-2); color: var(--text); padding: 5px 12px; border-radius: 99px; text-decoration: none; cursor: pointer; }
.r-act:hover { border-color: var(--accent); }
.r-act.icon-only { padding: 5px 9px; }
/* Target size (QA-WK1, WCAG 2.5.8): WebKit doesn't honour display:inline-flex on <summary>,so the calendar summary could shrink below 24px. Explicit min box on every .r-act (34px,no layout change),and an invisible ::after that grows the tap area to 44px tall without moving anything (inset stays inside the 8px row gap). */ .r-act{position: relative;box-sizing: border-box;min-width: 34px;justify-content: center}.cal-menu>summary.r-act{display: inline-flex;min-height: 34px}.r-act::after{content: "";position: absolute;inset: -5px -3px}.r-leave{font-size: .86rem;font-weight: 700;color: var(--ok)}.r-fav{color: var(--accent)}.r-hidden{margin: -4px 0 10px}.fhint{margin: 6px 0 0}.verify-row{display: flex;flex-wrap: wrap;gap: 8px;align-items: center}.mini-btn{display: inline-flex;align-items: center;gap: 5px;font-size: .82rem;font-weight: 700;padding: 4px 12px;border-radius: 99px;border: 1.5px solid var(--line);background: var(--surface);color: var(--text);text-decoration: none;min-height: 30px}.mini-btn:hover{border-color: var(--accent);color: var(--accent)}.parish-actions{display: flex;flex-wrap: wrap;gap: 10px;margin: 14px 0 6px}.parish-actions .button{font: inherit;font-weight: 700;font-size: .95rem;padding: 10px 18px;cursor: pointer;border: 2px solid var(--accent)}.fav-btn[aria-pressed="false"]{background: var(--surface);color: var(--accent)}.fav-btn[aria-pressed="true"]{background: var(--accent);color: var(--on-accent)}.row-report{display: inline-flex;gap: 3px;margin-left: 8px;font-size: .78rem;font-weight: 700;color: var(--accent);text-decoration: none;white-space: nowrap;font-style: normal}.row-report:hover{text-decoration: underline}.sched td.note{overflow-wrap: anywhere}.promise{background: var(--ok-bg);border-radius: 12px;padding: 12px 16px}.hd-detail{color: var(--text)}.logo-mark{color: var(--accent)}.mine-list{display: grid;gap: 14px;margin-top: 8px}@media (min-width: 760px){.mine-list{grid-template-columns: 1fr 1fr;align-items: start}.mine-list .fine{grid-column: 1 / -1}}.m-card{background: var(--surface);border: 1px solid var(--line);border-radius: var(--radius);box-shadow: var(--shadow);padding: 16px 0 0}.m-head{display: flex;justify-content: space-between;gap: 10px;padding: 0 18px}.m-head h2{font-size: 1.15rem;margin: 0}.m-head h2 a{text-decoration: none}.m-head p{margin: 2px 0 0}.fav-star{font: inherit;font-size: 1.4rem;line-height: 1;width: 44px;height: 44px;flex: none;border-radius: 99px;border: 1.5px solid var(--line);background: var(--surface-2);color: var(--accent);cursor: pointer}.m-list{list-style: none;margin: 10px 0 8px;padding: 0 18px}.m-item{display: grid;grid-template-columns: 1fr auto;grid-template-areas: "when act" "kind act";align-items: center;gap: 0 10px;padding: 8px 0;border-top: 1px solid var(--line)}.m-when{grid-area: when;font-variant-numeric: tabular-nums}.m-kind{grid-area: kind;font-size: .88rem;color: var(--muted)}.m-item .r-act{grid-area: act}.m-kind .r-status{font-size: .72rem;padding: 1px 8px;margin-left: 4px}a:focus-visible,button:focus-visible,input:focus-visible,summary:focus-visible{outline: 3px solid var(--accent);outline-offset: 2px}.skip:focus{outline: 3px solid var(--accent)}@media (prefers-reduced-motion: reduce){*{transition: none !important}.r:hover{transform: none}}.now-links{display: flex;flex-wrap: wrap;gap: 8px;margin: 14px 0 0}.now-switch{grid-template-columns: repeat(2,1fr);max-width: 420px}.now-switch a{font-weight: 700;text-align: center;text-decoration: none;color: var(--muted);padding: 11px 8px;border-radius: 99px}.now-switch a:hover{color: var(--text)}.now-switch a[aria-current="page"]{background: var(--accent);color: var(--on-accent);box-shadow: var(--shadow)}.now-results:focus{outline: none}.now-results .r-status{text-align: right;white-space: normal}.cd{font-variant-numeric: tabular-nums}.now-hd{margin-top: 8px}.county-list{list-style: none;padding: 0;margin: 10px 0 0;display: grid;gap: 6px;grid-template-columns: repeat(auto-fill,minmax(11em,1fr))}.county-list li{background: var(--surface);border: 1px solid var(--line);border-radius: 10px;padding: 8px 12px;display: flex;flex-wrap: wrap;gap: 4px 8px;align-items: center}.county-list li.ours{border-color: var(--ok);font-weight: 700}.site-footer .dio-credit{margin-top: 8px}.chip[aria-current="page"]{border-color: var(--accent);background: var(--accent);color: var(--on-accent)}.nyp{margin-top: 10px}.nyp summary{cursor: pointer;font-weight: 650;color: var(--accent);padding: 6px 0}.nyp-list{list-style: none;padding: 0;margin: 6px 0 0;columns: 2 14em;column-gap: 20px;font-size: .92rem}.nyp-list li{break-inside: avoid;padding: 3px 0}.nyp-list a{font-weight: 650;color: var(--text)}.prose ul,.prose ol{padding-left: 1.3em}.prose li{margin: 6px 0}.prose h3{margin: 22px 0 6px;font-size: 1.08rem}.prose .steps li{margin: 10px 0;padding-left: 4px}.prayer{margin: 12px 0;padding: 16px 20px;background: var(--surface);border: 1px solid var(--line);border-left: 4px solid var(--accent);border-radius: var(--radius);font-size: 1.05rem;line-height: 1.6}.prayer p{margin: 0}.prose code{font-size: .9em;background: var(--surface-2);padding: 1px 5px;border-radius: 6px}@media (min-width: 760px){.digest.digest-plain{grid-template-columns: 1fr}}.site-footer .foot-links{display: flex;flex-wrap: wrap;gap: 4px 16px;margin: 10px 0 4px}.site-footer .season-name{color: var(--muted)}.site-footer .season-name::before{content: "· "}.season-dot{display: inline-block;width: .6em;height: .6em;border-radius: 50%;margin-right: .35em;vertical-align: .05em;box-sizing: border-box}.season-dot--ordinary{background: #2f7d32}.season-dot--advent,.season-dot--lent{background: #6a2c91}.season-dot--gaudete,.season-dot--laetare{background: #e57fa8}.season-dot--christmas,.season-dot--easter{background: #ffffff;border: 1.5px solid #b08d3c}.season-dot--holyweek,.season-dot--triduum,.season-dot--pentecost{background: #b21f1f}.map-wrap{margin: 18px 0 8px;border: 1px solid var(--line);border-radius: var(--radius);overflow: hidden;box-shadow: var(--shadow)}.np-map{height: min(68vh,560px);min-height: 340px;background: var(--surface-2)}.np-map:focus-visible{outline: 3px solid var(--accent);outline-offset: -3px}.map-fallback{padding: 20px;margin: 0}.map-help{margin: 6px 0 18px}.map-next{font-weight: 650}.np-pin span{display: block;width: 22px;height: 22px;margin: 1px 3px;background: var(--accent);border: 2px solid var(--on-accent);border-radius: 50% 50% 50% 0;transform: rotate(-45deg);box-shadow: 0 1px 4px rgba(0,0,0,.45)}.np-pin:focus-visible{outline: 3px solid var(--text);outline-offset: 2px;border-radius: 50%}.leaflet-container{font: inherit}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background: var(--surface);color: var(--text);box-shadow: var(--shadow)}.leaflet-popup-content{margin: 12px 16px;font-size: .95rem;line-height: 1.4}.leaflet-popup-content p{margin: 2px 0}.pop-name{font-weight: 800;font-size: 1.05rem}.leaflet-container .leaflet-popup-content a,.leaflet-container .leaflet-control-attribution a{color: var(--accent)}.pop-town,.pop-approx{color: var(--muted)}.leaflet-container a.leaflet-popup-close-button{color: var(--muted)}.leaflet-container .leaflet-control-attribution{background: var(--surface);color: var(--text);font-size: .75rem;padding: 2px 6px}.leaflet-bar a,.leaflet-bar a:hover{background: var(--surface);color: var(--text);border-bottom-color: var(--line)}.leaflet-bar a.leaflet-disabled{background: var(--surface-2);color: var(--muted)}.sched td,.r-time,.r-status,.cd,.m-when,.hd-times,.hd-when,.pop-next,.map-next,#today-label{font-variant-numeric: tabular-nums}.site-footer .copyright{margin-top: 10px;font-size: .82rem}/* Time-zone label after each time ("9:00 AM ET"): smaller,same color as the time (keeps AA),tabular like the time. */ .tz{font-size: .72em;font-weight: 600;letter-spacing: .03em;font-variant-numeric: tabular-nums}.tz-note{margin: 4px 0 12px}/* Guides: print. Nav,footer and buttons never print;"Print the examination" (html.print-exam) prints only the exam,one page. */ .guide-next{margin-top: 28px}.print-only{display: none}@media print{.site-header,.site-footer,.skip,.no-print,.crumbs,.guide-next,.now-links{display: none !important}body{background: #fff;color: #000}a{color: inherit}.print-only{display: block}html.print-exam main>:not(.exam){display: none !important}html.print-exam .exam{font-size: 10.5pt;line-height: 1.3;margin: 0;padding: 0}html.print-exam .exam h2{margin: 0 0 4pt}html.print-exam .exam h3{margin: 8pt 0 2pt;break-after: avoid}html.print-exam .exam ul{margin: 0;padding-left: 16pt}html.print-exam .exam li{margin: 0 0 2pt;break-inside: avoid}@page{margin: 14mm}}.cal-menu{position: relative}.cal-menu>summary{list-style: none}.cal-menu>summary::-webkit-details-marker{display: none}.cal-pop{display: flex;flex-wrap: wrap;gap: 6px;margin-top: 6px}.nnm{margin: 0 0 8px}.nnm-go{border: 0;cursor: pointer;font: inherit;font-weight: 700}.nnm .now-links{align-items: center}.nnm-top{margin: 12px 0 2px;font-variant-numeric: tabular-nums}.nnm-zip{margin: 10px 0}.offline-note{margin: 10px 0 0}/* Mobile home: get the first "Next up" card above the fold at 390x844 (P2-7). The home lede is repeated by the results heading,so it goes (home only,see below);quick links become one swipeable row;banners and spacing tighten. */ @media (max-width: 560px){main .holyday{margin-top: 10px;gap: 6px}main .hd-banner{padding: 8px 12px}main .hd-name{font-size: .98rem}main .hd-detail{font-size: .82rem}main .hero{padding: 14px 0 6px}main .hero h1{font-size: 1.9rem;margin-bottom: 4px}/* Only the finder hero (home,confession-today: today label + quick-link chips) drops its lede,and never a lede that carries a link (404 "Back to…",map "use the list",city "What's next today"). Browsers without :has() keep every lede. (QA-006) */ main .hero:has(>#today-label):has(>.now-links)>.lede:not(:has(a)){display: none}main .hero .now-links{flex-wrap: nowrap;overflow-x: auto;scrollbar-width: none;margin: 10px -20px 0;padding: 2px 20px}main .hero .now-links::-webkit-scrollbar{display: none}main .hero .now-links .chip{flex: none}main .hero::after{margin-top: 12px}main .nnm .now-links{margin-top: 10px}main .tabs{margin: 6px 0 10px}main .tabs button{padding: 9px 8px}main .quick{margin-bottom: 8px}main .r-head{margin: 10px 0 8px}}/* Mobile parish page: contact cards as compact 2-up tiles (P2-6;build.mjs 36506b9 already puts the schedule first). The address tile spans both columns;the "Call"/"Visit" words stay for screen readers. */ @media (max-width: 639px){.parish .cards{grid-template-columns: 1fr 1fr;gap: 8px;margin: 12px 0 6px}.parish .card{padding: 10px 12px}.parish .card:first-child{grid-column: 1 / -1}.parish .card .v{font-size: .95rem}.parish .card .go{position: absolute;width: 1px;height: 1px;overflow: hidden;clip: rect(0 0 0 0)}.parish .parish-actions{gap: 8px;margin: 10px 0 4px}.parish .parish-actions .button{font-size: .9rem;padding: 8px 14px}}/* Bulletin exceptions (build.mjs exceptionRows,530e70a): approved dated changes sit above the weekly rows. Cancelled: the time is struck through and muted,with a liturgical-red "Cancelled" pill. One-off: a "This week only" pill in the ok tones. A gold rule on the left ties both to the theme's hairlines. Text pairs are AA in light and dark. */
.sched tr.ex-cancel th, .sched tr.ex-oneoff th { box-shadow: inset 3px 0 0 var(--gold, var(--line)); }
.sched tr.ex-cancel td.t { color: var(--muted); font-weight: 600; }
.sched tr.ex-cancel td.t s { text-decoration-thickness: 1.5px; }
.sched tr.ex-cancel .pill { background: var(--accent-soft); color: var(--accent); }
.sched tr.ex-oneoff .pill { background: var(--ok-bg); color: var(--ok); }
.sched tr.ex-cancel td.note, .sched tr.ex-oneoff td.note { font-style: italic; }
/* Mobile: "Wednesday, Nov 4" doesn't fit the 5em day column,so the date gets its own line above the time. */ @media (max-width: 520px){.sched tr.ex-cancel th,.sched tr.ex-oneoff th,.sched tr.ex-cancel td.t,.sched tr.ex-oneoff td.t{grid-column: 1 / -1}.sched tr.ex-cancel th,.sched tr.ex-oneoff th{width: auto;padding-bottom: 2px}.sched tr.ex-cancel td.t,.sched tr.ex-oneoff td.t{padding-top: 0;padding-bottom: 6px}}/* ==================== DAY PICKER (Today / Tomorrow / next 5 days;app.js "DAY PICKER" block) ==================== */ .dp{margin: 4px 0 12px;min-width: 0;max-width: 100%}.dp-row{position: relative;display: flex;gap: 8px;overflow-x: auto;overscroll-behavior-x: contain;padding: 6px;margin: 0 -6px;scrollbar-width: thin}.dp .dp-btn{flex: 0 0 auto;min-height: 44px;min-width: 44px;display: inline-flex;align-items: center;justify-content: center;padding: 8px 14px;font-variant-numeric: tabular-nums}.dp .dp-btn[aria-pressed="true"]{border-color: var(--accent);background: var(--accent);color: var(--on-accent)}.dp-note{margin: 2px 0 0}.dp-note:empty{margin: 0}.dp-note a{font-weight: 650}.dayview .dv-next{font-size: 1.05rem;margin: 0 0 6px}.dayview .dv-day{font-size: 1rem;margin: 10px 0 8px}.dayview .dv-empty{margin: 6px 0;font-weight: 650}.dayview tr.dv-past td.t{color: var(--muted);font-weight: 500}/* Day rows are labelled "Confession" / "Adoration",wider than the weekly tables' day names: keep a gap before the time. */
.dayview th { width: 7.5em; }
@media (max-width: 520px) { .dayview tr { grid-template-columns: 7.5em 1fr; } }
/* ==================== /DAY PICKER ==================== */
/* /parishes/ county groups: keep the disclosure marker on the heading's line (h2 is block by default) and make the whole row a 44px tap target. */ details.county>summary{cursor: pointer;min-height: 44px;padding: 8px 0}details.county>summary h2{display: inline;margin: 0}.show-more{display: flex;flex-wrap: wrap;align-items: center;gap: 8px 12px;margin: 14px 0 0}.county-pick{margin: 0 0 8px}.county-pick select{max-width: 100%}@media (max-width: 480px){main .hero{padding: 10px 0 4px}main .hero .eyebrow{margin-bottom: 4px;font-size: .78rem}main .hero h1{font-size: 1.7rem;line-height: 1.08}main .hero .now-links{margin-top: 8px}main .hero .now-links .chip{min-height: 44px;display: inline-flex;align-items: center}main .hero::after{margin-top: 8px}main .nnm .now-links{margin-top: 6px;gap: 8px}main .nnm .nnm-go{min-height: 44px;padding: 10px 16px}main .nnm .chip,main .quick .chip,main .finder .chips .chip,.show-more .chip,.county-pick select{min-height: 44px;display: inline-flex;align-items: center}main .nnm-zip{margin: 8px 0;flex-wrap: nowrap}main .nnm-zip input{flex: 1 1 auto;min-width: 0;min-height: 44px;padding: 8px 14px}main .nnm-zip .button{min-height: 44px;padding: 8px 14px;white-space: nowrap}main .tabs{margin: 4px 0 8px;padding: 4px}main .tabs button{min-height: 44px;padding: 8px 6px}.dp{margin: 0 0 6px}main .quick{margin-bottom: 4px}main .finder .chips{padding-bottom: 6px}main .r-head{margin: 6px 0 6px;font-size: 1rem}.rlist{gap: 8px}.r .r-link{padding: 10px 14px 4px;gap: 2px 10px}.r-time{font-size: 1.12rem;line-height: 1.3}.r-name{line-height: 1.3}.r-meta{font-size: .86rem;line-height: 1.35}.r-note{font-size: .8rem;line-height: 1.35}.r-status{font-size: .76rem;padding: 2px 8px}.r-actions{padding: 2px 14px 8px;gap: 8px}.r-act{font-size: .8rem;min-height: 32px;min-width: 44px;padding: 4px 11px}.r-act::after{inset: -6px -2px}.fav-star{width: 44px;height: 44px}main .finder .chips[data-all-counties="true"]{display: none}main .holyday{margin-top: 8px;gap: 4px}main .hd-banner{padding: 6px 12px}.site-footer .foot-links a{display: inline-flex;align-items: center;min-height: 44px}.site-footer .cities{line-height: 1.6}.site-footer .cities a{display: inline-block;padding: 3px 2px;min-height: 24px}}@media (min-width: 760px){.county-pick{margin: 0 0 6px}.county-pick ~ .chips{flex-wrap: nowrap;overflow-x: auto;padding: 2px 2px 10px;scrollbar-width: thin}.county-pick ~ .chips .chip{flex: none}}@font-face{font-family: "EB Garamond";src: url("/fonts/eb-garamond-latin-600-normal.woff2") format("woff2");font-weight: 600;font-style: normal;font-display: swap}@font-face{font-family: "EB Garamond";src: url("/fonts/eb-garamond-latin-700-normal.woff2") format("woff2");font-weight: 700;font-style: normal;font-display: swap}@font-face{font-family: "Source Sans 3";src: url("/fonts/source-sans-3-latin-400-normal.woff2") format("woff2");font-weight: 400;font-style: normal;font-display: swap}@font-face{font-family: "Source Sans 3";src: url("/fonts/source-sans-3-latin-400-italic.woff2") format("woff2");font-weight: 400;font-style: italic;font-display: swap}@font-face{font-family: "Source Sans 3";src: url("/fonts/source-sans-3-latin-600-normal.woff2") format("woff2");font-weight: 600;font-style: normal;font-display: swap}@font-face{font-family: "Source Sans 3";src: url("/fonts/source-sans-3-latin-700-normal.woff2") format("woff2");font-weight: 700;font-style: normal;font-display: swap}@font-face{font-family: "Source Sans 3 Fallback";src: local("Arial"),local("Arimo"),local("Liberation Sans"),local("Helvetica");size-adjust: 92.5%;ascent-override: 110.3%;descent-override: 43.2%;line-gap-override: 0%}@font-face{font-family: "EB Garamond Fallback";src: local("Times New Roman"),local("Tinos"),local("Liberation Serif"),local("Times");size-adjust: 95.1%;ascent-override: 106.2%;descent-override: 31.6%;line-gap-override: 0%}:root{--bg: #f6efe0;--surface: #fffbf2;--surface-2: #f0e6d2;--text: #2a1d17;--muted: #66533f;--line: #e3d6ba;--accent: #8e1b1b;--accent-bright: #8e1b1b;--accent-soft: #f4e1d8;--on-accent: #fffbf2;--gold: #b08d3c;--ok: #2c6338;--ok-bg: #e5efdc;--warn: #764c00;--warn-bg: #fbedc4;--warn-line: #d4ac52;--radius: 10px;--font-display: "EB Garamond","EB Garamond Fallback",Garamond,"Times New Roman",serif;--font-body: "Source Sans 3","Source Sans 3 Fallback",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;--font: "Source Sans 3","Source Sans 3 Fallback",ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;--shadow: 0 1px 2px rgba(60,40,20,.05),0 6px 18px rgba(60,40,20,.06)}@media (prefers-color-scheme: dark){:root{--bg: #1b1512;--surface: #251d18;--surface-2: #31271f;--text: #f3e9d8;--muted: #c4b49d;--line: #45372b;--accent: #ee9a8c;--accent-bright: #ee9a8c;--accent-soft: #4a211c;--on-accent: #1b1512;--gold: #c9a85a;--ok: #9fd3a5;--ok-bg: #1d3322;--warn: #f2cf72;--warn-bg: #3b2f10;--warn-line: #86692a;--shadow: 0 1px 2px rgba(0,0,0,.3),0 8px 24px rgba(0,0,0,.25)}}body{font-family: var(--font-body)}h1,h2,.brand-name,.hd-name,.r-head,.m-head h2,.city-card h2,.sponsor h2,.digest h2{font-family: var(--font-display)}h1{font-weight: 600;letter-spacing: -.005em;line-height: 1.08}h2,.r-head{font-weight: 600;letter-spacing: 0}.brand-name{font-weight: 600;font-size: 1.3rem;letter-spacing: .01em}.eyebrow{letter-spacing: .12em}.r-time{font-family: var(--font-body)}h1{font-size: clamp(2.3rem,8vw,3.8rem)}.site-header{border-bottom: 1px solid var(--gold)}.hero::after{content: "✠";display: block;text-align: center;color: var(--gold);font-size: 1.05rem;line-height: 1;margin: 22px auto 0;max-width: 360px;background: linear-gradient(var(--gold),var(--gold)) left center / calc(50% - 20px) 1px no-repeat,linear-gradient(var(--gold),var(--gold)) right center / calc(50% - 20px) 1px no-repeat}.site-footer{border-top: 1px solid var(--gold)}.site-footer::before{content: "✠";display: block;text-align: center;color: var(--gold);font-size: 1.05rem;line-height: 1;margin: 22px auto 0;max-width: 360px;background: linear-gradient(var(--gold),var(--gold)) left center / calc(50% - 20px) 1px no-repeat,linear-gradient(var(--gold),var(--gold)) right center / calc(50% - 20px) 1px no-repeat;margin: -34px auto 18px;background-color: var(--bg);width: 56px;background-image: none}.sched h2::before,.r-head::before{content: "✠";color: var(--gold);margin-right: .4em;font-size: .85em}.sched table,.r,.card,.hd-card,.city-card,.m-card,.digest{border-color: var(--line);box-shadow: 0 1px 0 var(--gold),0 6px 18px rgba(80,50,20,.06)}.tabs{border: 1px solid var(--gold)}.eyebrow{font-variant: small-caps;text-transform: none;font-size: 1rem;letter-spacing: .08em}@media (scripting: none){.js-only{display: none !important}}
