:root{--primary:#166aa6;--secondary:#f2b544;--accent:#64b58a;--ink:#17324a;--muted:#64748b;--bg:#f5f8fc;--card:#fff;--danger:#c43d4b;--shadow:0 12px 34px rgba(25,58,91,.11)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;font-family:Arial,"Noto Sans Hebrew",sans-serif;background:var(--bg);color:var(--ink);line-height:1.6}a{text-decoration:none;color:inherit}button,input,select,textarea{font:inherit}.container{width:min(1180px,92%);margin:auto}.topbar{position:sticky;top:0;z-index:20;background:rgba(255,255,255,.96);backdrop-filter:blur(12px);border-bottom:1px solid #e4ecf5}.nav{min-height:76px;display:flex;align-items:center;gap:24px}.brand{display:flex;align-items:center;gap:12px;margin-left:auto}.brand img,.side-brand img,.login-card img,.footer img{width:62px;height:62px;object-fit:contain}.brand strong{font-size:1.12rem}.brand small{display:block;color:var(--muted)}.links{display:flex;gap:20px;font-weight:700}.links a:hover{color:var(--primary)}.btn{border:0;border-radius:14px;padding:11px 18px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:8px;font-weight:800;transition:.2s}.btn:hover{transform:translateY(-1px)}.btn-primary{background:var(--primary);color:#fff}.btn-yellow{background:var(--secondary);color:#4b3500}.btn-green{background:var(--accent);color:#0d3c28}.btn-outline{background:#fff;border:1px solid #c9d8e7;color:var(--ink)}.btn-danger{background:#fee9ec;color:var(--danger)}.hero{padding:58px 0 38px;background:linear-gradient(135deg,#e9f6ff,#fff7df)}.hero-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:34px;align-items:center}.hero-copy h1{font-size:clamp(2.1rem,4vw,4rem);line-height:1.12;margin:0 0 20px}.hero-copy p{font-size:1.16rem;color:#3e5c73;max-width:700px}.actions,.toolbar{display:flex;gap:12px;flex-wrap:wrap}.hero-image{min-height:330px;border-radius:34px;background:linear-gradient(145deg,rgba(22,106,166,.95),rgba(100,181,138,.85)),url('school-logo.png') center/170px no-repeat;box-shadow:var(--shadow);position:relative;overflow:hidden}.hero-image:after{content:'מחברים בין הורים, תומכים בבית הספר, פועלים למען ילדינו.';position:absolute;bottom:24px;right:24px;left:24px;background:rgba(255,255,255,.9);padding:16px;border-radius:18px;font-weight:800}.quick{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:38px}.quick-card,.card,.panel-card,.help-link,.stat{background:var(--card);border:1px solid #e4edf6;border-radius:22px;padding:22px;box-shadow:var(--shadow)}.quick-card span{font-size:1.8rem}.quick-card b{display:block;margin-top:8px}.quick-card p{margin:4px 0;color:var(--muted)}.section{padding:68px 0}.section-title{text-align:center;margin-bottom:28px}.section-title h2{font-size:2.1rem;margin:0}.section-title p{color:var(--muted)}.grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.card h3{margin:0 0 8px;font-size:1.35rem}.card p{color:var(--muted)}.card-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:18px}.events{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}.event-date{font-weight:900;color:var(--primary);font-size:1.08rem}.calendar-wrap{display:grid;grid-template-columns:280px 1fr;gap:18px}.calendar-filters label{display:block;margin:8px 0}.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}.calendar .head{font-weight:800;text-align:center;padding:8px}.day{min-height:110px;background:#fff;border:1px solid #e2eaf2;border-radius:14px;padding:8px}.day.muted{opacity:.45}.day .n{font-weight:800}.event-pill{display:block;background:#e8f3fb;color:#0f5f97;border-radius:8px;padding:3px 6px;font-size:.78rem;margin-top:5px}.footer{background:#17324a;color:#fff;padding:44px 0 18px}.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:30px}.footer a{display:block;margin:8px 0;color:#dceafa}.copyright{border-top:1px solid rgba(255,255,255,.15);margin-top:24px;padding-top:16px;color:#b9c9d6}.modal{display:none;position:fixed;inset:0;background:rgba(17,36,54,.64);z-index:50;padding:22px;align-items:center;justify-content:center}.modal.open{display:flex}.modal-card{background:#fff;border-radius:24px;padding:24px;width:min(720px,100%);max-height:90vh;overflow:auto}.modal-head{display:flex;justify-content:space-between;align-items:center}.close{border:0;background:#eef3f7;border-radius:50%;width:38px;height:38px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.field label{display:block;font-weight:800;margin-bottom:5px}.field input,.field textarea,.field select{width:100%;border:1px solid #cbd9e6;border-radius:12px;padding:11px;background:#fff}.field textarea{min-height:100px}.field.full{grid-column:1/-1}.notice{background:#fff8dc;border:1px solid #f2d57a;padding:12px;border-radius:12px;margin-bottom:14px}.admin-body{background:#edf3f8}.login-wrap{min-height:100vh;display:grid;place-items:center;padding:24px}.login-card{background:#fff;border-radius:28px;padding:34px;width:min(430px,100%);text-align:center;box-shadow:var(--shadow)}.admin-shell{display:none;min-height:100vh}.admin-shell.open{display:grid;grid-template-columns:260px 1fr}.sidebar{background:#17324a;color:#fff;padding:18px;position:sticky;top:0;height:100vh;overflow:auto}.side-brand{text-align:center;padding:8px 0 20px}.side-menu button{display:block;width:100%;text-align:right;background:transparent;color:#eaf4fb;border:0;border-radius:12px;padding:12px;margin:4px 0;cursor:pointer}.side-menu button.active,.side-menu button:hover{background:#28506e}.admin-main{padding:26px;min-width:0}.admin-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:22px}.admin-header h1{margin:0}.panel{display:none}.panel.active{display:block}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:15px;margin-bottom:18px}.stat strong{font-size:2rem;display:block}.stat small{color:var(--muted)}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:18px}.table-wrap{overflow:auto}table{width:100%;border-collapse:collapse}th,td{padding:11px;border-bottom:1px solid #e5edf5;text-align:right;vertical-align:top}th{background:#f3f7fb}.badge{display:inline-block;padding:4px 9px;border-radius:999px;background:#e8f3fb;font-size:.82rem}.badge.warn{background:#fff1c9}.badge.good{background:#dff5e8}.badge.bad{background:#fde5e8}.notification{display:flex;gap:12px;align-items:flex-start;padding:14px;border:1px solid #e0e9f2;border-radius:16px;margin:10px 0;background:#fff}.notification .icon{font-size:1.5rem}.theme-preview{border-radius:20px;padding:22px;background:linear-gradient(135deg,#e9f6ff,#fff7df);margin-top:14px}.code-note{background:#f2f6fa;border-radius:12px;padding:12px;font-family:monospace;direction:ltr;text-align:left}.btn-small{padding:7px 12px;font-size:.85rem;border-radius:10px}.holiday-row .badge{margin-inline-start:8px}.holiday-catalog-table td{vertical-align:middle}.holiday-catalog-table input[type=date]{width:auto;min-width:132px;padding:6px 8px}.catalog-row-status{margin-inline-start:8px;font-size:.8rem;color:var(--muted)}.catalog-row-status.error{color:var(--danger)}.tzaharon-day-grid{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0 12px}.tzaharon-day-toggle{display:flex;align-items:center;gap:6px;background:#f3f7fb;border:1px solid #e0e9f2;border-radius:10px;padding:6px 10px;font-size:.85rem;cursor:pointer;user-select:none}.tzaharon-day-toggle:has(input:checked){background:#dff5e8;border-color:#bfe6cf}.tzaharon-day-toggle input{margin:0}.table-scroll{overflow-x:auto;margin:10px 0}.mini-table{width:100%;border-collapse:collapse;font-size:.86rem}.mini-table th,.mini-table td{padding:7px 9px;border-bottom:1px solid #e5edf5;text-align:right;white-space:nowrap}.mini-table th{background:#f3f7fb}.mini-table tr.row-invalid td{background:#fde5e8;color:#8a1f2b}#holidayImportText{width:100%;border:1px solid #cbd9e6;border-radius:12px;padding:11px;font-family:monospace;direction:ltr;text-align:left}.hidden{display:none!important}@media(max-width:900px){.links{display:none}.hero-grid,.calendar-wrap,.two-col{grid-template-columns:1fr}.quick,.grid,.events,.stats{grid-template-columns:repeat(2,1fr)}.admin-shell.open{grid-template-columns:1fr}.sidebar{position:relative;height:auto}.side-menu{display:grid;grid-template-columns:repeat(2,1fr)}.footer-grid{grid-template-columns:1fr}}@media(max-width:560px){.quick,.grid,.events,.stats{grid-template-columns:1fr}.form-grid{grid-template-columns:1fr}.admin-main{padding:14px}.nav{gap:8px}.brand img{width:50px;height:50px}.btn{padding:10px 12px}}

.content-card img{width:100%;height:190px;object-fit:cover;border-radius:15px;margin-bottom:12px}.content-hero{display:block;margin:0 auto 4px;width:auto;max-width:100%;height:auto;max-height:min(70vh,640px);border-radius:18px}.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:18px}.gallery img{width:100%;height:170px;object-fit:cover;border-radius:12px}.gallery figure{margin:0}.thumb{width:74px;height:60px;object-fit:cover;border-radius:10px}.grow{flex:1}.rich-text{white-space:normal}.panel-card form .btn{margin-top:8px}
.site-status{position:sticky;top:0;z-index:999;background:#fff3cd;color:#664d03;padding:.65rem 1rem;text-align:center;border-bottom:1px solid #ffecb5}

/* Sprint 2 — public site */
.skip-link{position:fixed;top:-80px;right:16px;background:#fff;color:#000;padding:10px 16px;z-index:2000;border-radius:10px}.skip-link:focus{top:12px}.mobile-menu{display:none;border:1px solid #c9d8e7;background:#fff;border-radius:10px;font-size:1.4rem;padding:7px 11px}.eyebrow,.section-kicker{display:inline-block;font-weight:900;color:var(--primary);letter-spacing:.02em;margin-bottom:7px}.hero-visual{min-height:360px;border-radius:34px;background:linear-gradient(145deg,rgba(22,106,166,.96),rgba(100,181,138,.88));box-shadow:var(--shadow);position:relative;overflow:hidden;display:grid;place-items:center}.holiday-symbol{font-size:7rem;filter:drop-shadow(0 12px 15px rgba(0,0,0,.15))}.holiday-symbol:before{content:'🏫'}.hero-message{position:absolute;bottom:24px;right:24px;left:24px;background:rgba(255,255,255,.93);padding:16px;border-radius:18px;font-weight:800;text-align:center}.theme-rosh-hashana{background:linear-gradient(135deg,#fff4d9,#fff,#fbe7d6)}.theme-rosh-hashana .hero-visual{background:radial-gradient(circle at 30% 25%,#fff0b8,transparent 28%),linear-gradient(135deg,#fff7e8,#e8b76a)}.theme-rosh-hashana .holiday-symbol:before{content:'🍎 🍯'}.theme-independence{background:linear-gradient(135deg,#eaf6ff,#fff)}.theme-independence .hero-visual{background:radial-gradient(circle at 25% 20%,#fff,transparent 22%),linear-gradient(145deg,#198dd0,#fff)}.theme-independence .holiday-symbol:before{content:'🇮🇱'}.theme-sukkot{background:linear-gradient(135deg,#eef8df,#fff7d6)}.theme-sukkot .hero-visual{background:radial-gradient(circle at 25% 20%,#fffbdc,transparent 25%),linear-gradient(145deg,#85ad4f,#f0d16f)}.theme-sukkot .holiday-symbol:before{content:'🌿 🍋'}.quick-section{margin-top:-18px;position:relative;z-index:2}.quick-card{transition:.2s}.quick-card:hover{transform:translateY(-4px);border-color:#b8d2e7}.section-soft{background:#edf5fa}.split-title{display:flex;align-items:end;justify-content:space-between;text-align:right}.text-button{border:0;background:none;color:var(--primary);font-weight:900;cursor:pointer;padding:10px}.featured-card{display:grid;grid-template-columns:.9fr 1.1fr;background:#fff;border:1px solid #e4edf6;border-radius:28px;overflow:hidden;box-shadow:var(--shadow);margin-bottom:22px}.featured-visual,.content-thumb{background:linear-gradient(135deg,#dcecf8,#f7e9b9);background-position:center;background-size:cover;display:grid;place-items:center}.featured-visual{min-height:320px}.featured-visual span,.content-thumb span{font-size:4rem}.featured-visual.has-image span{display:none}.featured-copy{padding:34px}.featured-copy h3{font-size:2rem;margin:10px 0}.content-thumb{height:130px;border-radius:14px;margin-bottom:10px}.card-meta,.content-meta{display:flex;gap:10px;align-items:center;flex-wrap:wrap;color:var(--muted);font-size:.9rem}.committee-card{display:flex;flex-direction:column}.committee-icon{width:58px;height:58px;border-radius:18px;background:#edf6fc;display:grid;place-items:center;font-size:1.9rem;margin-bottom:14px}.committee-icon.large{width:88px;height:88px;font-size:3rem;flex:0 0 auto}.committee-card .card-actions{margin-top:auto}.event-card{display:grid;grid-template-columns:70px 1fr;gap:16px}.event-date-box{width:66px;min-height:72px;border-radius:16px;background:#e8f3fb;color:var(--primary);display:grid;place-content:center;text-align:center}.event-date-box strong{font-size:1.3rem;line-height:1}.event-date-box span{font-weight:800}.event-info{display:flex;gap:12px;flex-wrap:wrap;color:var(--muted);font-size:.9rem}.project-mark{font-size:2.2rem;margin-bottom:10px}.optional{font-weight:400;color:var(--muted)}.contact-layout .panel-card{padding:30px}.modal-wide{width:min(980px,100%)}.modal-section{margin-top:28px}.modal-grid{grid-template-columns:repeat(2,1fr)}.modal-events{grid-template-columns:1fr 1fr}.committee-hero{display:flex;gap:20px;align-items:center;background:#f3f8fc;border-radius:20px;padding:22px}.lead{font-size:1.15rem;color:#405c73}.attachments{display:flex;flex-direction:column;gap:8px}.attachment{padding:12px;border:1px solid #dce7f0;border-radius:12px}.filter-row{display:grid;grid-template-columns:2fr 1fr;gap:12px;margin-bottom:18px}.filter-row input,.filter-row select{border:1px solid #cbd9e6;border-radius:12px;padding:11px}.calendar-list{display:grid;gap:12px}.calendar-row{display:grid;grid-template-columns:75px 1fr;gap:16px;border-bottom:1px solid #e5edf5;padding:14px 0}.empty-state{text-align:center;grid-column:1/-1}.empty-state span{font-size:2rem}.empty-state p{max-width:52ch;margin-inline:auto;text-align:center}.toast{position:fixed;bottom:20px;right:20px;max-width:420px;background:#17324a;color:#fff;border-radius:14px;padding:14px 18px;box-shadow:var(--shadow);z-index:1000;opacity:0;transform:translateY(20px);pointer-events:none;transition:.2s}.toast.open{opacity:1;transform:none}.toast.success{background:#17683d}.toast.error{background:#9d2734}.modal-open{overflow:hidden}
@media(max-width:900px){.mobile-menu{display:block}.links{display:none;position:absolute;top:76px;right:4%;left:4%;background:#fff;border:1px solid #e4ecf5;border-radius:16px;padding:12px;box-shadow:var(--shadow);flex-direction:column}.links.open{display:flex}.role-entry{width:100%;margin-top:6px}.featured-card{grid-template-columns:1fr}.featured-visual{min-height:220px}.split-title{align-items:start}.modal-grid,.modal-events{grid-template-columns:1fr}}
@media(max-width:560px){.hero{padding-top:35px}.hero-visual{min-height:260px}.holiday-symbol{font-size:4rem}.featured-copy{padding:22px}.featured-copy h3{font-size:1.55rem}.split-title{display:block}.event-card,.calendar-row{grid-template-columns:58px 1fr}.event-date-box{width:54px}.committee-hero{align-items:flex-start;flex-direction:column}.gallery{grid-template-columns:1fr 1fr}.filter-row{grid-template-columns:1fr}.toast{right:12px;left:12px;bottom:12px}}

/* Prominent participation actions in the public homepage hero */
.hero-message{display:flex;flex-direction:column;gap:12px}
.hero-participation-actions{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.hero-participation-actions .hero-action{min-height:48px;font-size:1rem;box-shadow:0 7px 18px rgba(23,50,74,.14)}
@media(max-width:560px){.hero-participation-actions{grid-template-columns:1fr}.hero-participation-actions .hero-action{min-height:46px}}

/* [project doc §29.59] Full-bleed hero photo -- replaces the old narrow
   "small window with a picture" .hero-visual box. The chairman's uploaded
   hero image (assets/public.js's applyHeroImage(), §29.58) now covers the
   entire top band behind the welcome text, not a separate rounded pane
   beside it. .hero-photo/.hero-photo-overlay are new, dedicated elements
   with no other rules anywhere else in this file, specifically so this
   change doesn't have to thread through the many pre-existing
   .hero-visual/.public-site .hero-visual/theme-* rules scattered through
   this stylesheet -- those are now unused by the hero (still harmless,
   just dead, until a future pass cleans them up). Hidden outright on
   mobile via a plain display:none media query -- deliberately not an
   inline style, so it can never conflict with the JS-set backgroundImage
   inline style on .hero-photo (see the mockup: mobile keeps the plain
   gradient, no photo). */
.hero{position:relative;overflow:hidden;min-height:440px;display:flex;align-items:center}
.hero .container{position:relative;z-index:2;width:min(1180px,92%);margin:auto}
.hero-copy{max-width:640px}
.hero-photo{position:absolute;inset:0;z-index:0;background-position:center;background-size:cover;background-repeat:no-repeat}
.hero-photo-overlay{position:absolute;inset:0;z-index:1;pointer-events:none;opacity:0;background:linear-gradient(to left,rgba(233,246,255,.97) 0%,rgba(196,225,245,.85) 30%,rgba(178,217,240,.55) 52%,rgba(220,239,250,.18) 72%,rgba(220,239,250,0) 92%),linear-gradient(0deg,rgba(11,31,48,.16),transparent 42%)}
.hero.has-hero-photo .hero-photo-overlay{opacity:1}
@media(max-width:900px){.hero-photo,.hero-photo-overlay{display:none}.hero{min-height:0;padding:44px 0 32px}}

/* v1.0.0 unified Parents' Leadership identity */
.brand img,.side-brand img,.login-card img,.footer img{width:96px;height:auto;max-height:110px;object-fit:contain}
.login-card img{width:150px;max-height:none}
.side-brand img{width:118px;max-height:none}
.footer img{width:125px;max-height:none;background:#fff;border-radius:14px;padding:7px}
@media(max-width:560px){.brand img{width:74px;height:auto}}

/* v1.0.0 installation wizard */
.setup-body{background:linear-gradient(135deg,#edf5fb,#fff8e7);min-height:100vh}.setup-shell{width:min(980px,94%);margin:0 auto;padding:32px 0 60px}.setup-header{display:flex;gap:24px;align-items:center;margin-bottom:24px}.setup-header img{width:130px;height:auto}.setup-header h1{font-size:2.2rem;margin:2px 0 6px}.setup-header p{margin:0;color:var(--muted);max-width:720px}.setup-progress{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin:20px 0}.setup-step{border:1px solid #d9e5ef;background:rgba(255,255,255,.78);border-radius:15px;padding:10px 8px;color:var(--muted);font-weight:800}.setup-step span{display:inline-grid;place-items:center;width:28px;height:28px;border-radius:50%;background:#e9f0f6;margin-left:6px}.setup-step.active{border-color:var(--primary);color:var(--primary);background:#fff}.setup-step.active span{background:var(--primary);color:#fff}.setup-step.done{color:#17683d}.setup-step.done span{background:#dff5e8;color:#17683d}.setup-panel{display:none}.setup-panel.active{display:block}.setup-card{background:#fff;border:1px solid #e1ebf3;border-radius:26px;padding:30px;box-shadow:var(--shadow)}.setup-card h2{margin-top:0}.setup-actions{display:flex;gap:10px;justify-content:flex-start;flex-wrap:wrap;margin-top:24px}.prereq-list{display:grid;gap:12px;margin:22px 0}.prereq-list details{border:1px solid #dfe9f2;border-radius:16px;background:#fbfdff;padding:0 16px}.prereq-list summary{cursor:pointer;padding:15px 0;display:flex;justify-content:space-between;gap:12px}.prereq-list summary span{font-size:.8rem;background:#e8f3fb;color:#0f5f97;border-radius:999px;padding:3px 9px}.prereq-list li{margin:8px 0}.confirm-line{display:flex;gap:9px;align-items:flex-start;font-weight:800;padding:14px;border-radius:14px;background:#f3f8fc}.confirm-line input{margin-top:6px}.check-list{display:grid;gap:10px;margin:18px 0}.check-item{display:flex;gap:12px;align-items:flex-start;border:1px solid #dfe8f0;border-radius:15px;padding:14px;background:#fff}.check-item>span{width:30px;height:30px;border-radius:50%;display:grid;place-items:center;font-weight:900;flex:0 0 auto}.check-item small{display:block;color:var(--muted);margin-top:2px}.check-item.ok>span{background:#dff5e8;color:#17683d}.check-item.bad>span{background:#fde5e8;color:#9d2734}.check-item.wait>span{background:#e8f3fb;color:#0f5f97}.committee-choices{display:grid;grid-template-columns:1fr 1fr;gap:10px}.committee-choices label{display:flex;gap:10px;border:1px solid #dfe8f0;border-radius:14px;padding:12px;cursor:pointer}.committee-choices input{margin-top:5px}.committee-choices small{display:block;color:var(--muted);font-weight:400}.summary-box{background:#f3f8fc;border-radius:15px;padding:16px;overflow-wrap:anywhere}.install-progress{display:grid;place-items:center;text-align:center;gap:8px;padding:34px}.install-progress small{color:var(--muted)}.spinner{width:42px;height:42px;border:4px solid #d9e8f3;border-top-color:var(--primary);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.success-banner,.error-banner{display:flex;gap:15px;border-radius:18px;padding:18px;margin-bottom:20px}.success-banner{background:#e8f7ee;border:1px solid #bfe5cc}.success-banner>span{font-size:2rem;color:#17683d}.success-banner h3{margin:0}.success-banner p{margin:4px 0}.error-banner{display:block;background:#fdebed;border:1px solid #efc5ca;color:#85232d}.setup-card code{direction:ltr;display:inline-block}.setup-card .code-note{overflow-wrap:anywhere}.btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
@media(max-width:760px){.setup-header{align-items:flex-start}.setup-header img{width:90px}.setup-progress{grid-template-columns:1fr}.setup-step{display:none}.setup-step.active{display:block}.committee-choices{grid-template-columns:1fr}.setup-card{padding:20px}.setup-header h1{font-size:1.7rem}}

.manual-checklist{display:grid;gap:12px;margin:22px 0}.manual-task{border:1px solid #dfe9f2;border-radius:16px;background:#fbfdff;padding:14px 16px}.manual-task>label{display:flex;gap:12px;align-items:flex-start;cursor:pointer}.manual-task>label input{margin-top:6px;transform:scale(1.15)}.manual-task>label span{display:grid;gap:2px}.manual-task>label small{color:var(--muted);font-weight:400}.manual-task details{margin:10px 31px 0 0;border-top:1px solid #e5edf4;padding-top:9px}.manual-task summary,.inline-guide summary{cursor:pointer;color:var(--primary);font-weight:800}.manual-task li,.inline-guide li{margin:7px 0}.checklist-count{font-weight:900;margin:12px 0;color:var(--primary)}.inline-guide{border:1px solid #dfe8f0;border-radius:14px;padding:12px;background:#fbfdff}.field small{display:block;color:var(--muted);margin-top:5px}.progress-track{width:min(440px,100%);height:10px;background:#e4edf4;border-radius:999px;overflow:hidden;margin-top:8px}.progress-track span{display:block;height:100%;width:0;background:var(--primary);transition:width .5s ease}@media print{body{background:#fff}.setup-header,.setup-progress,.setup-actions,.setup-panel:not([data-panel="5"]),#installBefore,#installProgress{display:none!important}.setup-panel[data-panel="5"],#installReport{display:block!important}.setup-card{box-shadow:none;border:0;padding:0}}

.remember{display:flex!important;gap:8px;align-items:center}.remember input{width:auto}.credential-box code{display:block;direction:ltr;text-align:center;font-size:1.25rem;letter-spacing:.08em;background:#fff;padding:12px;border-radius:10px;margin:10px 0}.login-card .form-grid{margin:18px 0}.login-card .btn.full{width:100%}.modal[data-required="true"] .close{display:none}

.user-toolbar{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px}.user-toolbar h2{margin:0}.user-filters{grid-template-columns:2fr 1fr 1fr}.table-actions{display:flex;gap:6px;flex-wrap:wrap}.table-actions .btn{padding:7px 9px;font-size:.84rem}@media(max-width:900px){.user-toolbar{align-items:flex-start;flex-direction:column}.user-filters{grid-template-columns:1fr}}

/* v1.0.0-dev.7 */
.stat-link{width:100%;text-align:right;border:1px solid #e4edf6;cursor:pointer}.stat-link:hover,.notification-link:hover{transform:translateY(-2px);border-color:#9fc5df}.notification-link{width:100%;text-align:right;color:inherit;cursor:pointer}.inquiry-status{display:block;width:max-content;margin-bottom:7px}.inquiry-row.status-new td:first-child{border-right:4px solid #2f80ed}.inquiry-row.status-progress td:first-child{border-right:4px solid #f2994a}.inquiry-row.status-waiting td:first-child{border-right:4px solid #9b51e0}.inquiry-row.status-closed td:first-child{border-right:4px solid #27ae60}.badge.status-new{background:#dcecff;color:#1557a0}.badge.status-progress{background:#ffead7;color:#9a4f00}.badge.status-waiting{background:#eee2ff;color:#67309a}.badge.status-closed{background:#dff5e8;color:#17683d}.inquiry-row.status-closed{opacity:.82}

/* v1.0.0-dev.7.1 inquiry contact and full-view UX */
.inquiry-filters{grid-template-columns:2fr 1fr}.inquiry-row{cursor:pointer}.inquiry-row:hover{background:#f7fbfe}.inquiry-row:focus{outline:3px solid rgba(47,128,237,.25);outline-offset:-3px}.inquiry-excerpt{max-width:340px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.inquiry-phone{font-weight:800;direction:ltr;display:inline-block}.btn-small{padding:7px 10px;font-size:.84rem;white-space:nowrap}.inquiry-modal-card{max-height:min(88vh,900px);overflow:auto}.inquiry-detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin:10px 0 24px}.inquiry-detail-grid>div{display:flex;flex-direction:column;gap:5px;border:1px solid #e0eaf2;border-radius:14px;padding:14px;background:#fbfdff}.inquiry-detail-grid .full{grid-column:1/-1}.inquiry-detail-grid small{color:var(--muted);font-weight:800}.inquiry-message-box{min-height:180px}.inquiry-message-box .detail-message{white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.75;font-size:1.03rem}.inquiry-detail-grid a{font-weight:800;direction:ltr;text-align:right;overflow-wrap:anywhere}
@media(max-width:760px){.inquiry-filters,.inquiry-detail-grid{grid-template-columns:1fr}.inquiry-detail-grid .full{grid-column:auto}.inquiry-excerpt{max-width:180px}}

.registration-row{cursor:pointer}.registration-row:hover{background:#f7fbfe}.registration-row:focus{outline:3px solid rgba(47,128,237,.25);outline-offset:-3px}


/* v1.0.0-dev.10 committee tabs */
.committee-tabs{display:flex;gap:8px;align-items:center;overflow-x:auto;padding:4px 2px 12px;margin-bottom:14px;scrollbar-width:thin}.committee-tab{border:1px solid #cfdeea;background:#fff;color:var(--text);border-radius:999px;padding:9px 14px;display:inline-flex;align-items:center;gap:8px;white-space:nowrap;cursor:pointer;font:inherit;font-weight:800;transition:.18s ease}.committee-tab:hover{border-color:var(--primary);background:#f4f9fd}.committee-tab.active{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 5px 14px rgba(24,103,155,.18)}.committee-tab b{display:inline-grid;place-items:center;min-width:24px;height:24px;padding:0 6px;border-radius:999px;background:rgba(20,73,108,.10);font-size:.8rem}.committee-tab.active b{background:rgba(255,255,255,.22)}@media(max-width:760px){.committee-tabs{margin-inline:-4px;padding-inline:4px}.committee-tab{padding:8px 12px}}

.tab-controlled-select{background:#fff;color:inherit;cursor:pointer}.tab-controlled-select:disabled{pointer-events:none;background:#f3f7fa;color:#425466;cursor:not-allowed}
.destination-picker{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.destination-option{border:1px solid #bdd0df;background:#fff;color:#17324a;border-radius:999px;padding:8px 13px;font-weight:800;cursor:pointer}.destination-option:hover{border-color:var(--primary);background:#eef7fd}.destination-option.selected{background:var(--primary);border-color:var(--primary);color:#fff}.destination-picker.hidden{display:none!important}

/* Public portal loading and refresh status — normal document flow, never overlays content */
.public-load-bar{position:relative;z-index:1;border-bottom:1px solid #dbe6ef;background:#f4f8fb;color:#26445e;box-shadow:none}
.public-load-inner{min-height:58px;display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:8px;padding-bottom:8px}
.public-load-message-wrap{display:flex;align-items:center;gap:10px;flex:1;min-width:0;flex-wrap:wrap}
.public-load-message-wrap small{color:var(--muted)}
.public-load-spinner{display:none;width:18px;height:18px;flex:0 0 18px;border:2px solid #b9cee0;border-top-color:var(--primary);border-radius:50%}
.public-load-bar.loading .public-load-spinner{display:inline-block;animation:public-spin .8s linear infinite}
.public-load-bar.success{background:#edf8f1;border-bottom-color:#cbe7d4;color:#17683d}
.public-load-bar.warning{background:#fff8df;border-bottom-color:#eadb9a;color:#745c00}
.public-load-bar.error{background:#fff0f1;border-bottom-color:#ecc9ce;color:#8b2633}
.public-refresh-button{white-space:nowrap;background:#fff;min-width:168px;width:168px;flex:0 0 168px;text-align:center;box-sizing:border-box}
.public-refresh-button:disabled{opacity:.72;cursor:wait}
@keyframes public-spin{to{transform:rotate(360deg)}}
@media(max-width:560px){.public-load-inner{align-items:stretch;flex-direction:column}.public-refresh-button{width:100%;min-width:0;flex-basis:auto}.public-load-message-wrap{justify-content:center;text-align:center}}

/* Media upload previews */
.media-field small{color:var(--muted);display:block;margin-top:6px}.media-preview{display:flex;gap:10px;flex-wrap:wrap;margin-top:10px;min-height:42px;align-items:center}.media-preview-grid{display:grid;grid-template-columns:repeat(2,minmax(120px,180px))}.media-thumb{position:relative;border:1px solid #d7e3ed;border-radius:14px;padding:6px;background:#fff}.media-thumb img{display:block;width:150px;height:105px;object-fit:cover;border-radius:10px}.media-thumb.media-cover img{width:220px;height:140px}.media-thumb span{display:block;font-size:.82rem;font-weight:800;margin-top:5px}.media-remove{position:absolute;top:9px;left:9px;width:28px;height:28px;border:0;border-radius:50%;background:#9d2734;color:#fff;font-size:1.2rem;line-height:1;cursor:pointer}.media-empty{color:var(--muted);font-size:.9rem}.event-card.has-image{grid-template-columns:115px 70px 1fr}.event-cover{width:110px;height:95px;object-fit:cover;border-radius:14px}.event-modal-gallery{margin-top:16px}
@media(max-width:560px){.media-preview-grid{grid-template-columns:1fr 1fr}.media-thumb img,.media-thumb.media-cover img{width:100%;height:110px}.event-card.has-image{grid-template-columns:1fr}.event-cover{width:100%;height:170px}}

/* Document attachment chips (project doc §29.49) -- reuses .media-remove/
   .media-empty from the image previews above, but as a flex text-row
   layout instead of a thumbnail overlay (there's no image to overlay a
   remove button onto), so .media-remove is overridden to a normal static
   inline button here rather than the absolutely-positioned circle it is
   in a .media-thumb. */
.attachment-preview{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;min-height:32px;align-items:center}
.attachment-chip{display:flex;align-items:center;gap:8px;border:1px solid #d7e3ed;border-radius:10px;padding:6px 10px;background:#fff;font-size:.85rem;font-weight:700}
.attachment-chip a{color:inherit;text-decoration:none}
.attachment-chip a:hover{text-decoration:underline}
.attachment-chip .media-remove{position:static;width:20px;height:20px;font-size:.9rem;flex-shrink:0}

.media-upload-status{margin-top:8px;padding:11px 13px;border-radius:12px;font-weight:800;background:#eef5fb;color:#31556f;border:1px solid #cfe0ed}.media-upload-status.loading{background:#fff8df;color:#765b00;border-color:#ead98d}.media-upload-status.success{background:#eaf8ef;color:#24643a;border-color:#bfe2ca}.media-upload-status.error{background:#fff0f1;color:#8b2430;border-color:#edc0c5}.media-upload-status.hidden{display:none}.media-upload-status.loading::before{content:'⏳ ';}.media-upload-status.success::before{content:''}.media-upload-status.error::before{content:''}


/* Chair-managed public portal hero image */
.hero-visual.has-custom-image{background-position:center;background-size:cover;background-repeat:no-repeat;position:relative;overflow:hidden}
.hero-visual.has-custom-image:after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(11,31,48,.08),rgba(11,31,48,.55));pointer-events:none}
.hero-visual.has-custom-image .holiday-symbol{display:none}
.hero-visual.has-custom-image .hero-message{position:relative;z-index:1;color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.45);background:rgba(13,42,62,.38);backdrop-filter:blur(3px);border-radius:18px;padding:16px}
.hero-admin-preview{max-width:520px;min-height:210px}
.hero-admin-preview img{width:100%;height:210px;object-fit:cover}

.school-year-display{display:inline-flex;align-items:center;width:auto;max-width:100%;margin:0 0 14px!important;padding:7px 13px;border:1px solid rgba(22,106,166,.2);border-radius:999px;background:rgba(255,255,255,.78);color:#244b68!important;font-size:.96rem!important;font-weight:900;box-shadow:0 5px 16px rgba(23,50,74,.07)}


/* BUG-022: keep mobile navigation above loading/status banners */
@media(max-width:900px){
  body.public-menu-open{overflow:hidden}
  body.public-menu-open .topbar{z-index:130}
  body.public-menu-open .links.open{z-index:140;max-height:calc(100vh - 96px);overflow-y:auto;overscroll-behavior:contain}
  body.public-menu-open .public-load-bar{visibility:hidden;pointer-events:none}
}


/* v1.0.0-dev.11.9 — definitive mobile menu/status-banner isolation */
.public-load-bar.menu-suppressed{display:none!important}
@media(max-width:900px){
  .topbar{z-index:10000}
  /* ...but not over an open dialog. The 10000 above exists to keep the bar
     and its menu clear of the page and the status banner; on a phone it also
     put the bar over every modal, and a modal's close button is the first
     thing under it -- which is how the calendar became impossible to shut.
     While a dialog is open the bar (and the menu inside it, which shares
     this stacking context) drops below the overlay, where page furniture
     belongs. body.modal-open is set by openModal and cleared by closeModal
     only once the LAST dialog closes. */
  body.modal-open .topbar{z-index:5}
  .nav{position:relative}
  .links.open{
    position:fixed!important;
    top:76px!important;
    right:4%!important;
    left:4%!important;
    z-index:10020!important;
    max-height:calc(100dvh - 92px)!important;
    overflow-y:auto!important;
    overscroll-behavior:contain;
    -webkit-overflow-scrolling:touch;
  }
  body.public-menu-open .public-load-bar{display:none!important}
  body.public-menu-open::after{
    content:'';
    position:fixed;
    inset:76px 0 0;
    z-index:10010;
    background:rgba(23,50,74,.18);
    pointer-events:none;
  }
}

/* FEATURE-083 Sprint 1: leadership summary */
.full-width-card{grid-column:1/-1}
.leadership-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:12px 0}
@media (max-width:700px){.leadership-summary{grid-template-columns:1fr}}


/* dev.11.16 — initial management loading progress and committee save feedback */
.admin-loading-overlay{position:fixed;inset:0;z-index:200000;background:rgba(244,248,252,.94);display:grid;place-items:center;padding:24px;backdrop-filter:blur(4px);transition:opacity .28s ease}
.admin-loading-overlay.hidden{display:none}
.admin-loading-card{width:min(520px,94vw);background:#fff;border:1px solid #dce7f0;border-radius:22px;padding:26px;box-shadow:0 20px 55px rgba(36,65,91,.18);text-align:right}
.admin-loading-title{font-size:1.25rem;font-weight:900;color:#183b56;margin-bottom:16px}
.admin-loading-track{height:12px;background:#e4edf5;border-radius:999px;overflow:hidden}
.admin-loading-track span{display:block;height:100%;width:0;background:linear-gradient(90deg,#2f80ed,#56ccf2);border-radius:inherit;transition:width .42s ease;position:relative}
.admin-loading-track span::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent,rgba(255,255,255,.7),transparent);transform:translateX(-100%);animation:admin-progress-shimmer 1.15s linear infinite}
.admin-loading-step{margin-top:12px;color:#536b7d;font-weight:700}
@keyframes admin-progress-shimmer{to{transform:translateX(100%)}}
.card.recently-updated{outline:3px solid rgba(47,128,237,.32);box-shadow:0 0 0 7px rgba(47,128,237,.09),var(--shadow);transition:outline-color .4s ease,box-shadow .4s ease}

/* BUG-039: contextual committee operation feedback */
.notice.error{background:#fde5e8;border-color:#e7a9b1;color:#7d1f2a;white-space:pre-line}
.notice.success{background:#dff5e8;border-color:#9fd5b4;color:#155532}
.notice.loading{background:#e8f3fb;border-color:#a9cde8;color:#154f76}
#committeeDeleteModal .toolbar{margin-top:16px}
#committeeFormStatus,#committeeDeleteStatus{scroll-margin-top:16px}

/* BUG-044: inactive committee reactivation feedback */
button[data-action="restore-committee"].is-loading,
button[data-action="restore-committee"][aria-busy="true"] {
  cursor: wait;
  opacity: .72;
  pointer-events: none;
  min-width: 9.5rem;
}
.committee-card-action-status {
  margin-top: .75rem;
  margin-bottom: .25rem;
}


/* BUG-030: screen-level lazy loading */
.panel-load-state{display:grid;gap:8px;justify-items:stretch;margin:0 0 14px;padding:12px 14px;border:1px solid #dbe7ef;border-radius:12px;background:#fbfdff;color:#36566c}
.panel-load-state.hidden{display:none}.compact-loading-label{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:.86rem;font-weight:600}.compact-loading-label small{font-size:.75rem;font-weight:400;color:#718797}.indeterminate-progress{width:min(460px,100%);height:8px;border-radius:999px;overflow:hidden;background:#e5edf3}.indeterminate-progress.compact{width:100%;height:5px}.indeterminate-progress>span{display:block;width:34%;height:100%;border-radius:inherit;background:currentColor;color:#2f80ed;animation:bug030-progress 1.15s ease-in-out infinite}.panel-inline-loading{display:grid;gap:8px;color:#536b7d}.stat-loading{display:block;width:52px;height:5px;margin:10px auto 8px;border-radius:999px;overflow:hidden;background:#e4ebf0}.stat-loading>span{display:block;width:38%;height:100%;border-radius:inherit;background:currentColor;color:#2f80ed;animation:bug030-progress 1.05s ease-in-out infinite}.stat-load-error{font-size:1.2rem;color:#9a6670}@keyframes bug030-progress{0%{transform:translateX(190%)}100%{transform:translateX(-390%)}}

/* BUG-050: separate system role from committee-head assignments */
.user-committee-head-toggle{display:block;min-width:0}
.user-committee-head-option{display:flex!important;align-items:center;justify-content:flex-start;gap:10px;width:100%;padding:14px 16px;border:1px solid #d5e0ea;border-radius:14px;background:#f8fbfd;font-weight:800;cursor:pointer;direction:rtl;text-align:right}
.user-committee-head-option input{width:20px!important;height:20px;flex:0 0 auto;margin:0}
.user-committee-checklist{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:8px}
.user-committee-choice{display:flex;align-items:flex-start;gap:9px;padding:11px 12px;border:1px solid #d5e0ea;border-radius:12px;background:#fff;min-width:0}
.user-committee-choice input{width:18px!important;height:18px;flex:0 0 auto;margin-top:2px}
.user-committee-choice span{min-width:0}
.user-committee-choice small{display:block;color:var(--muted);font-weight:400}
.user-committee-choice.is-occupied{background:#f3f5f7;color:#6d7882}
@media(max-width:700px){.user-committee-checklist{grid-template-columns:1fr}.user-committee-head-option{width:100%}}

/* BUG-052: leadership class assignment and local class filter */
.user-class-checklist{display:grid;grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:8px;margin-top:6px}
.user-class-choice{display:flex;align-items:center;gap:8px;padding:9px 10px;border:1px solid var(--line,#d8e0e8);border-radius:10px;background:#fff;cursor:pointer}
.user-class-choice input{margin:0;flex:0 0 auto}
.my-classes-filter{display:flex;justify-content:flex-start;margin:8px 0 12px}
.my-classes-filter .segmented-filter{display:inline-flex;gap:4px;padding:4px;border:1px solid var(--line,#d8e0e8);border-radius:12px;background:#fff}
.my-classes-filter button{border:0;background:transparent;padding:7px 12px;border-radius:9px;cursor:pointer}
.my-classes-filter button.active{background:#e9f2fb;font-weight:700}
@media(max-width:640px){.user-class-checklist{grid-template-columns:repeat(3,1fr)}.my-classes-filter .segmented-filter{width:100%}.my-classes-filter button{flex:1}}

/* FEATURE-088 – academic year */
.active-school-year-label{display:inline-block;margin-top:4px;font-size:.82em;font-weight:600;opacity:.9}
#activeSchoolYearSummary{font-size:1.05rem}
#activeClassesText,#nextYearClassesText{min-height:150px;line-height:1.6}
#inquirySchoolYearFilter,#subscriberSchoolYearFilter{min-width:180px}

/* FEATURE-088 annual setup wizard */
.annual-wizard-card{max-width:1050px}
.annual-wizard-progress{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin:8px 0 20px}
.annual-wizard-progress span{display:flex;align-items:center;gap:7px;padding:9px;border-radius:10px;background:#f3f5f7;font-size:.86rem}
.annual-wizard-progress span b{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#d9dee4}
.annual-wizard-progress span.active{font-weight:700;background:#e8f0f7}
.annual-wizard-progress span.done{opacity:.72}
.annual-wizard-body{max-height:62vh;overflow:auto;padding-inline:2px}
.annual-wizard-footer{justify-content:space-between;margin-top:18px}
.wizard-class-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;margin-top:12px}
.wizard-class-card{border:1px solid #dfe4e8;border-radius:12px;padding:12px;background:#fff}
.wizard-rep-list{display:grid;gap:6px;margin-top:10px;max-height:230px;overflow:auto}
.wizard-rep-option{display:flex;align-items:center;gap:8px;padding:7px;border-radius:8px}
.wizard-rep-option:hover{background:#f5f7f9}
.wizard-committee-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}
.wizard-summary{display:grid;gap:10px}
.wizard-summary section{border:1px solid #e1e5e9;border-radius:10px;padding:11px;background:#fafbfc}
.wizard-summary section p{margin:6px 0 0;line-height:1.65}
@media(max-width:760px){.annual-wizard-progress{grid-template-columns:1fr}.annual-wizard-progress span:not(.active){display:none}.annual-wizard-body{max-height:68vh}}

/* BUG-089/090/093 */
.readonly-field{background:#eef1f4!important;color:#5b6470;cursor:not-allowed}
.annual-apply-stages{display:grid;gap:8px;margin:16px 0}.annual-apply-stage{display:grid;grid-template-columns:32px 1fr auto;align-items:center;gap:10px;padding:10px;border:1px solid #e1e5e9;border-radius:10px}.annual-apply-stage b{display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:#e8ebef}.annual-apply-stage.active{font-weight:700}.annual-apply-stage.done{opacity:.72}.annual-apply-stage small{white-space:nowrap}

/* BUG-116: pending approvals uses the standard dashboard-card typography.
   Only the border changes when there is something waiting for review. */
.stat.stat-link.approval-attention{
  border-color:#e86f2d;
  box-shadow:0 0 0 1px #e86f2d inset;
}

/* P0 approval queue UX 130/131 */
.approval-row{transition:opacity .18s ease,background .18s ease}.approval-row-busy{opacity:.72;cursor:wait;pointer-events:none}.approval-row-progress{display:grid;gap:5px;margin-top:8px;max-width:360px;color:#536b7d;font-size:.78rem}.approval-filter-tabs{margin-top:4px}

/* BUG-143 v5: explicit editable 24h hour/minute selectors. */
.event-time-picker{
  display:flex;
  align-items:center;
  gap:8px;
  direction:ltr;
}
.event-time-picker select{
  min-width:76px;
  text-align:center;
  font-variant-numeric:tabular-nums;
}
.event-time-separator{
  font-weight:700;
  font-size:1.1rem;
}

/* FEATURE-145: approved but not yet published */
.approval-row-approved,
.approval-approved-card{
  border:1px solid rgba(43,132,83,.42)!important;
  box-shadow:0 0 0 1px rgba(43,132,83,.06);
}
.approval-approved-badge{
  border:1px solid rgba(43,132,83,.38);
  background:rgba(43,132,83,.08);
  color:#236b45;
}

/* BUG-147: visible progress on previous-year rollback action. */
.button-inline-progress{
  display:inline-block;
  width:14px;
  height:14px;
  border:2px solid currentColor;
  border-inline-end-color:transparent;
  border-radius:50%;
  margin-inline-end:8px;
  vertical-align:-2px;
  animation:button-inline-spin .8s linear infinite;
}
@keyframes button-inline-spin{
  to{transform:rotate(360deg);}
}

/* FEATURE-136 UX: subtle Excel export action. */
.table-export-toolbar{
  justify-content:flex-start;
  margin-block:4px 10px;
}
.table-export-toolbar .btn{
  display:inline-flex;
  align-items:center;
  gap:7px;
  min-height:34px;
  padding:6px 10px;
  font-size:.9rem;
  font-weight:500;
}
.excel-file-icon{
  display:inline-flex;
  width:18px;
  height:18px;
  flex:0 0 18px;
}
.excel-file-icon svg{
  width:100%;
  height:100%;
  fill:none;
  stroke:currentColor;
  stroke-width:1.55;
  stroke-linecap:round;
  stroke-linejoin:round;
  opacity:.78;
}

/* FEATURE-139 P0 — clear public event/post chronology. */
.section-count{
  display:block;
  margin-top:4px;
  opacity:.68;
}
.public-scroll-list{
  max-height:760px;
  overflow-y:auto;
  overscroll-behavior:contain;
  padding-inline-end:6px;
  scrollbar-gutter:stable;
}
.public-scroll-list::-webkit-scrollbar{width:8px}
.public-scroll-list::-webkit-scrollbar-thumb{
  background:rgba(80,90,100,.24);
  border-radius:999px;
}
.content-thumb{
  position:relative;
  overflow:hidden;
}
.content-thumb img{
  width:100%;
  height:100%;
  object-fit:cover;
  display:block;
}
.content-thumb.has-image > span{
  position:absolute;
  inset-inline-end:10px;
  inset-block-end:8px;
}
.content-thumb.no-image{
  display:flex;
  align-items:center;
  justify-content:center;
}
.event-week-grid{
  padding:14px;
  border:1px solid rgba(60,100,80,.16);
  border-radius:18px;
  background:rgba(245,250,247,.72);
}
.week-event{
  border-color:rgba(55,115,75,.22);
}
.event-strip-block{
  margin-top:22px;
}
.event-strip-heading{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:12px;
  margin-bottom:9px;
}
.event-strip-heading h3{margin:0}
.event-strip-heading small{opacity:.68}
.event-strip{
  display:flex;
  gap:12px;
  overflow-x:auto;
  padding:4px 2px 10px;
  scroll-snap-type:x proximity;
  scrollbar-gutter:stable;
  overscroll-behavior-inline:contain;
}
.event-strip::-webkit-scrollbar{height:8px}
.event-strip::-webkit-scrollbar-thumb{
  background:rgba(80,90,100,.24);
  border-radius:999px;
}
.event-strip-card{
  flex:0 0 min(330px,82vw);
  display:flex;
  gap:12px;
  align-items:flex-start;
  padding:14px;
  border:1px solid rgba(90,100,110,.14);
  border-radius:14px;
  background:var(--surface,#fff);
  scroll-snap-align:start;
}
.event-date-box.compact{
  min-width:54px;
}
.event-strip-copy h3{
  margin:3px 0 6px;
  font-size:1rem;
}
.event-strip-copy small{
  display:block;
}
.event-strip-label{
  opacity:.62;
}
.event-strip-empty{
  opacity:.66;
  margin:4px 0;
}
.calendar-group-title{
  margin:4px 0 10px;
}
.calendar-group-title.past-title{
  margin-top:28px;
}
.calendar-row-button{
  width:100%;
  text-align:inherit;
  font:inherit;
  color:inherit;
  cursor:pointer;
}
@media (max-width:700px){
  .public-scroll-list{max-height:640px}
  .event-week-grid{padding:10px}
  .event-strip-heading{
    display:block;
  }
  .event-strip-heading small{
    display:block;
    margin-top:3px;
  }
}


/* FEATURE-139 branded public refresh — Yohannani baseline logo/palette — light blue, yellow, purple, navy */
.public-site{
  --primary:#235A8C;
  --primary-strong:#174875;
  --secondary:#E5B642;
  --accent:#7A5AC8;
  --accent-strong:#5D3FA2;
  --ink:#17324a;
  --bg:#f7faf8;
  --card:#fff;
  --shadow:0 8px 24px rgba(35,90,140,.09);
  background:#fff;
}
.public-site .topbar{border-top:3px solid var(--primary);border-bottom:1px solid #dfe9e3;box-shadow:0 3px 16px rgba(35,90,140,.06)}
.public-site .brand img,.public-site .footer img{object-fit:contain;background:transparent}
.public-site .brand strong{color:var(--primary);font-size:1.28rem}
.public-site .brand small{color:var(--accent-strong);font-weight:800}
.public-site .links a{position:relative;padding:8px 0}
.public-site .links a:hover{color:var(--accent-strong)}
.public-site .links a:after{content:'';position:absolute;right:0;left:0;bottom:0;height:2px;background:var(--accent-strong);transform:scaleX(0);transition:.2s}
.public-site .links a:hover:after{transform:scaleX(1)}
.public-site .hero{padding:34px 0 26px;background:linear-gradient(125deg,#edf5fb 0%,#fff 54%,#f2edfb 100%)}
.public-site .hero-grid{background:#fff;border:1px solid #e7e0f2;border-radius:28px;padding:30px;box-shadow:var(--shadow)}
.public-site .hero-copy h1{font-size:clamp(2rem,4vw,3.35rem);color:#183b62;margin-bottom:12px}
.public-site .hero-copy p{margin-top:8px}
.public-site .school-year-display{display:inline-flex!important;width:auto;padding:7px 14px;border:1px solid #cbdde9;border-radius:12px;background:#fff;color:#244b70;font-weight:800}
.public-site .school-year-display.hidden{display:none!important}
.public-site .hero-visual{min-height:285px;background:linear-gradient(145deg,rgba(35,90,140,.92),rgba(116,184,138,.86)),url('school-logo.png') center/180px no-repeat}
.public-site .hero-message{border:1px solid rgba(35,90,140,.12)}
.public-site .quick-section{margin-top:0;padding:18px 0 4px}
.public-site .quick{gap:14px}
.public-site .quick-card{box-shadow:0 5px 18px rgba(35,90,140,.07);border-color:#e8e2f1;text-align:center;min-height:150px}
.public-site .quick-card:nth-child(1) span{color:var(--accent-strong)}
.public-site .quick-card:nth-child(2) span{color:var(--primary)}
.public-site .quick-card:nth-child(3) span{color:#7b52b5}
.public-site .quick-card:nth-child(4) span{color:var(--accent-strong)}
.public-site .section{padding:48px 0}
.public-site .section-soft{background:#fff}
.public-site .section-title h2{color:#183b62}
.public-site .section-kicker,.public-site .eyebrow{color:var(--accent-strong)}
.public-site #events{background:#fff}
.public-site #eventGrid{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x proximity;padding:4px 2px 14px;scrollbar-width:thin}
.public-site #eventGrid .event-card{flex:0 0 min(360px,86vw);scroll-snap-align:start;border-top:3px solid var(--primary);box-shadow:0 6px 20px rgba(35,90,140,.08)}
.public-site .event-date-box{background:#edf5fb;color:var(--primary);border:1px solid #d5e5f0}
.public-site #newsGrid{display:flex;gap:16px;overflow-x:auto;scroll-snap-type:x proximity;padding:4px 2px 14px}
.public-site #newsGrid .content-card{flex:0 0 min(330px,84vw);scroll-snap-align:start}
.public-site .featured-card{border-top:3px solid var(--accent-strong);box-shadow:0 7px 22px rgba(35,90,140,.08)}
.public-site .committee-card{border-top:3px solid var(--primary);box-shadow:0 5px 18px rgba(35,90,140,.07)}
.public-site .committee-icon{background:#f1ecfb;color:var(--accent-strong)}
.public-site .btn-primary{background:var(--primary)}
.public-site .btn-primary:hover{background:var(--primary-strong)}
.public-site .btn-green{background:var(--accent-strong);color:#fff}
.public-site .btn-yellow{background:var(--secondary);color:#47370c}
.public-site .text-button{color:var(--primary);border:1px solid #cbdde9;border-radius:11px;background:#fff}
.public-site .contact-layout .panel-card{border-top:3px solid var(--accent-strong)}
.public-site .footer{background:linear-gradient(135deg,#183b62,#235A8C);border-bottom:8px solid var(--accent-strong)}
.public-site .footer img{background:#fff;border-radius:16px;padding:5px}
@media(max-width:900px){
  .public-site .nav{min-height:68px}
  .public-site .hero{padding-top:20px}
  .public-site .hero-grid{padding:22px;gap:18px}
  .public-site .hero-visual{min-height:220px}
  .public-site .quick{grid-template-columns:repeat(2,1fr)}
  .public-site .quick-card{min-height:138px;padding:18px 14px}
  .public-site .section{padding:38px 0}
  .public-site .split-title{align-items:center}
}
/* Section titles for the events/publications carousels are centered on
   every screen size, not just mobile -- moved out of the 900px media
   query above, where an earlier edit had accidentally left it trapped
   so it only ever took effect below that width. */
.public-site .split-title{
  flex-direction:column;
  align-items:center;
  justify-content:center;
  text-align:center;
  gap:6px;
}
.public-site .split-title > div{text-align:center}
.public-site .split-title .text-button{margin-top:2px}
@media(max-width:560px){
  .public-site .container{width:min(94%,1180px)}
  .public-site .brand img{width:54px;height:54px}
  .public-site .brand strong{font-size:1.05rem}
  .public-site .brand small{font-size:.78rem}
  .public-site .hero-grid{padding:18px;border-radius:22px}
  .public-site .hero-copy h1{font-size:2rem}
  .public-site .hero-visual{min-height:185px;border-radius:22px}
  .public-site .hero-message{right:12px;left:12px;bottom:12px;padding:12px}
  .public-site .hero-participation-actions{gap:7px}
  .public-site .quick{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .public-site .quick-card{min-height:126px;padding:14px 10px;border-radius:18px}
  .public-site .quick-card span{font-size:1.55rem}
  .public-site .quick-card p{font-size:.86rem}
  .public-site .section-title{margin-bottom:20px}
  .public-site .section-title h2{font-size:1.65rem}
  .public-site #eventGrid .event-card{flex-basis:92%}
  .public-site #newsGrid .content-card{flex-basis:88%}
  .public-site .featured-card{grid-template-columns:1fr}
  .public-site .featured-visual{min-height:190px}
  .public-site .featured-copy{padding:20px}
  .public-site .footer-grid{gap:18px}
}


/* FEATURE-139 v3: explicit Yohannani P0 palette and aesthetic overflow */
.public-site{
  --brand-navy:#173B64;
  --brand-blue:#2C679A;
  --brand-sky:#DCEFFA;
  --brand-yellow:#E8BD4A;
  --brand-purple:#7658B7;
  --brand-purple-dark:#5D3F9C;
  --primary:var(--brand-navy);
  --secondary:var(--brand-yellow);
  --accent:var(--brand-purple);
  --accent-strong:var(--brand-purple-dark);
}
.public-site .hero{
  background:linear-gradient(125deg,var(--brand-sky) 0%,#fff 52%,#f1ebfb 100%);
}
.public-site .hero-visual{
  background:linear-gradient(145deg,rgba(23,59,100,.93),rgba(118,88,183,.82)),url('school-logo.png') center/180px no-repeat;
}
.public-site .section-kicker,.public-site .eyebrow{color:var(--brand-purple-dark)}
.public-site .quick-card:nth-child(1) span{color:var(--brand-blue)}
.public-site .quick-card:nth-child(2) span{color:var(--brand-purple)}
.public-site .quick-card:nth-child(3) span{color:var(--brand-yellow)}
.public-site .quick-card:nth-child(4) span{color:var(--brand-navy)}
.public-site .committee-icon{background:#f0ebfa;color:var(--brand-purple-dark)}
.public-site .btn-green{background:var(--brand-purple);color:#fff}
.public-site .btn-green:hover{background:var(--brand-purple-dark)}
.public-site .footer{background:linear-gradient(135deg,var(--brand-navy),#264f7c);border-bottom:8px solid var(--brand-yellow)}

/* Newest-first news carousel: one clean row, clear continuation, touch-friendly. */
.public-site .carousel-shell{position:relative}
.public-site .aesthetic-scroller{
  display:flex!important;
  gap:16px;
  overflow-x:auto;
  overscroll-behavior-inline:contain;
  scroll-snap-type:x mandatory;
  scroll-behavior:smooth;
  scrollbar-width:thin;
  scrollbar-color:#c8b9e7 #f4f1f9;
  padding:6px 42px 16px;
}
.public-site .aesthetic-scroller::-webkit-scrollbar{height:8px}
.public-site .aesthetic-scroller::-webkit-scrollbar-track{background:#f4f1f9;border-radius:999px}
.public-site .aesthetic-scroller::-webkit-scrollbar-thumb{background:#c8b9e7;border-radius:999px}
.public-site #newsGrid .content-card{
  flex:0 0 calc((100% - 32px)/3);
  min-width:280px;
  max-width:360px;
  scroll-snap-align:start;
}
.public-site .carousel-arrow{
  position:absolute;
  top:50%;
  z-index:4;
  width:38px;
  height:38px;
  border-radius:50%;
  border:1px solid #d7cdec;
  background:rgba(255,255,255,.96);
  color:var(--brand-navy);
  font-size:1.65rem;
  line-height:1;
  cursor:pointer;
  box-shadow:0 5px 18px rgba(23,59,100,.12);
  transform:translateY(-50%);
}
.public-site .carousel-arrow:hover{border-color:var(--brand-purple);color:var(--brand-purple-dark)}
.public-site .carousel-arrow:disabled{opacity:.35;cursor:default}
.public-site .carousel-prev{right:0}
.public-site .carousel-next{left:0}
.public-site .aesthetic-scroller.has-overflow{
  mask-image:linear-gradient(to left,transparent 0,#000 28px,#000 calc(100% - 28px),transparent 100%);
}

/* The upcoming week remains fully visible; heavy weeks get a compact vertical scroll. */
.public-site .event-week-grid{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:16px;
}
.public-site .event-week-grid.week-scroll{
  max-height:620px;
  overflow-y:auto;
  padding-inline-end:8px;
  scrollbar-width:thin;
  scrollbar-color:#b9d9ec #eef7fc;
}
.public-site .event-week-grid.week-scroll::-webkit-scrollbar{width:8px}
.public-site .event-week-grid.week-scroll::-webkit-scrollbar-track{background:#eef7fc;border-radius:999px}
.public-site .event-week-grid.week-scroll::-webkit-scrollbar-thumb{background:#b9d9ec;border-radius:999px}
.public-site .week-event{border-top-color:var(--brand-blue)}
.public-site .week-event:nth-child(4n+2){border-top-color:var(--brand-yellow)}
.public-site .week-event:nth-child(4n+3){border-top-color:var(--brand-purple)}
.public-site .week-event:nth-child(4n){border-top-color:var(--brand-navy)}

/* Later/past events: compact horizontal strips with visible arrows. */
.public-site .compact-carousel-shell .aesthetic-scroller{padding-inline:42px}
.public-site #eventFutureGrid .event-strip-card,
.public-site #eventPastGrid .event-strip-card{
  flex:0 0 min(330px,82vw);
  scroll-snap-align:start;
  border-inline-start:3px solid var(--brand-sky);
}
.public-site #eventFutureGrid .event-strip-card:nth-child(3n+2),
.public-site #eventPastGrid .event-strip-card:nth-child(3n+2){border-inline-start-color:var(--brand-yellow)}
.public-site #eventFutureGrid .event-strip-card:nth-child(3n),
.public-site #eventPastGrid .event-strip-card:nth-child(3n){border-inline-start-color:var(--brand-purple)}

@media(max-width:900px){
  .public-site #newsGrid .content-card{flex-basis:calc((100% - 16px)/2)}
  .public-site .event-week-grid{grid-template-columns:1fr}
  .public-site .event-week-grid.week-scroll{max-height:680px}
}
@media(max-width:560px){
  .public-site .aesthetic-scroller{
    padding-inline:14px;
    scroll-padding-inline:14px;
  }
  .public-site #newsGrid .content-card{
    flex-basis:88%;
    min-width:88%;
  }
  .public-site .carousel-arrow{display:none!important}
  .public-site .aesthetic-scroller.has-overflow{
    mask-image:linear-gradient(to left,transparent 0,#000 12px,#000 calc(100% - 12px),transparent 100%);
  }
  .public-site #eventFutureGrid .event-strip-card,
  .public-site #eventPastGrid .event-strip-card{flex-basis:88%}
}

/* FEATURE-139 v4 — approved composition: sky blue + yellow + soft green; purple only as a small accent */
.public-site{--brand-navy:#173B64;--brand-blue:#2C79B8;--brand-sky:#DDF1FC;--brand-yellow:#F2C84B;--brand-green:#A9CF7A;--brand-green-dark:#679A4C;--brand-purple-soft:#B89AE4;--primary:var(--brand-navy);--secondary:var(--brand-yellow);--accent:var(--brand-blue);--accent-strong:var(--brand-navy)}
.public-site .hero{background:linear-gradient(125deg,#f9fcff 0%,var(--brand-sky) 58%,#fff9df 100%)}
.public-site .hero-visual{background:linear-gradient(145deg,rgba(23,59,100,.88),rgba(44,121,184,.58)),url('school-logo.png') center/180px no-repeat}
.public-site .section-kicker,.public-site .eyebrow{color:var(--brand-blue)}
.public-site .footer{background:linear-gradient(135deg,var(--brand-navy),#285d8e);border-bottom-color:var(--brand-yellow)}
.public-site .btn-green{background:var(--brand-green-dark);color:#fff}
.public-site .public-actions{padding:24px 0 14px;background:#fff}
.public-site .action-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}
.public-site .action-card{display:flex;flex-direction:column;align-items:flex-start;min-height:170px;padding:22px;border-radius:20px;background:#fff;border:1px solid #dbe9f2;box-shadow:0 6px 18px rgba(23,59,100,.07);text-align:right;transition:.18s}
.public-site .action-card:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(23,59,100,.11)}
.public-site .action-card .action-icon{display:grid;place-items:center;width:50px;height:50px;border-radius:50%;font-size:1.4rem;margin-bottom:13px;background:var(--brand-sky);color:var(--brand-blue)}
.public-site .action-card b{font-size:1.05rem;color:var(--brand-navy);margin-bottom:6px}
.public-site .action-card p{font-size:.91rem;line-height:1.55;color:#5b6e7f;margin:0 0 12px}
.public-site .action-card strong{margin-top:auto;font-size:.86rem;color:var(--brand-blue)}
.public-site .action-contact{background:#fff;border-color:#dbe9f2}
.public-site .action-contact .action-icon{background:var(--brand-sky);color:var(--brand-blue)}
.public-site .action-volunteer{background:#fff;border-color:#dbe9f2}
.public-site .action-volunteer .action-icon{background:var(--brand-yellow);color:#6b4a00}
.public-site .action-volunteer strong{color:#a5780a}
.public-site .action-join .action-icon{background:var(--brand-sky);color:var(--brand-blue)}
.public-site #events{background:linear-gradient(180deg,#fff,#f8fcff)}
.public-site #news{background:#fff}
.public-site #committees{background:#fff}
.public-site .week-event:nth-child(4n+1),.public-site .committee-card:nth-child(4n+1){border-top-color:var(--brand-blue)}
.public-site .week-event:nth-child(4n+2),.public-site .committee-card:nth-child(4n+2){border-top-color:var(--brand-yellow)}
.public-site .week-event:nth-child(4n+3),.public-site .committee-card:nth-child(4n+3){border-top-color:var(--brand-green)}
.public-site .week-event:nth-child(4n),.public-site .committee-card:nth-child(4n){border-top-color:var(--brand-purple-soft)}
.public-site .committee-icon{background:var(--brand-sky);color:var(--brand-blue)}
.public-site .carousel-arrow{border-color:#bcdcf0;color:var(--brand-blue)}
.public-site .aesthetic-scroller{scrollbar-color:#a9d9f2 #edf7fc}
.public-site .aesthetic-scroller::-webkit-scrollbar-track{background:#edf7fc}
.public-site .aesthetic-scroller::-webkit-scrollbar-thumb{background:#a9d9f2}
@media(max-width:900px){.public-site .action-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:560px){.public-site .public-actions{padding-top:14px}.public-site .action-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.public-site .action-card{min-height:150px;padding:15px 13px;border-radius:17px}.public-site .action-card .action-icon{width:42px;height:42px;border-radius:50%;font-size:1.15rem;margin-bottom:9px}.public-site .action-card b{font-size:.92rem}.public-site .action-card p{font-size:.8rem}.public-site .action-card strong{font-size:.78rem}}

/* FEATURE-139 v5 — publications are always exactly one horizontal row */
.public-site #featuredContent{display:none!important}
.public-site .news-carousel-shell{width:100%;overflow:hidden}
.public-site #newsGrid{
  display:flex!important;
  flex-direction:row!important;
  flex-wrap:nowrap!important;
  grid-template-columns:none!important;
  width:100%;
  max-width:100%;
  overflow-x:auto!important;
  overflow-y:hidden!important;
  align-items:stretch;
}
.public-site #newsGrid > *{flex-shrink:0!important}
.public-site #newsGrid .content-card{
  width:calc((100% - 32px)/3)!important;
  flex:0 0 calc((100% - 32px)/3)!important;
  min-width:300px;
  max-width:390px;
}
@media(max-width:900px){
  .public-site #newsGrid .content-card{
    width:calc((100% - 16px)/2)!important;
    flex-basis:calc((100% - 16px)/2)!important;
  }
}
@media(max-width:560px){
  .public-site #newsGrid .content-card{
    width:88%!important;
    min-width:88%!important;
    flex-basis:88%!important;
  }
}

/* FEATURE-139 v6 — light-blue ombre on the school image + clear participation landing */
.public-site .hero-visual.has-custom-image{
  background-size:cover,cover!important;
  background-position:center,center!important;
  background-repeat:no-repeat,no-repeat!important;
}
.public-site #subType.participation-highlight{
  outline:3px solid rgba(44,121,184,.22);
  border-color:#7bbce1;
  box-shadow:0 0 0 5px rgba(221,241,252,.7);
  transition:.2s;
}
@media(max-width:560px){
  .public-site [data-public-form="subscriber"]{
    scroll-margin-top:84px;
  }
}

/* FEATURE-139 v7 — cyan hero treatment and event imagery */
.public-site .hero{
  background:linear-gradient(125deg,#f8fdff 0%,#d7f1fc 58%,#eef9fe 100%)!important;
}
.public-site .hero-visual:not(.has-custom-image){
  background:linear-gradient(135deg,#cfeefc,#e7f7fd)!important;
}
.public-site .hero-visual.has-custom-image{
  background-color:#d7f1fc!important;
}
/* Week event image: visible, proportional and clean. */
.public-site .event-card.has-image .event-cover{
  width:100%;
  height:180px;
  object-fit:cover;
  border-radius:16px;
  margin-bottom:14px;
}
/* Future/past strips also expose an attached event image. */
.public-site .event-strip-card.has-image{
  display:block;
  overflow:hidden;
  padding:0!important;
}
.public-site .event-strip-card.has-image > .event-cover{
  display:block;
  width:100%;
  height:128px;
  object-fit:cover;
}
.public-site .event-strip-inner{
  display:flex;
  gap:12px;
  align-items:flex-start;
  padding:16px;
}
.public-site .event-strip-card:not(.has-image) .event-strip-inner{
  padding:0;
}
@media(max-width:560px){
  .public-site .event-card.has-image .event-cover{height:160px}
  .public-site .event-strip-card.has-image > .event-cover{height:120px}
}

/* FEATURE-139 v9 — full events list: soft cyan ombre, optional image, event modal above list */
.public-site #calendarModal .modal-card{
  background:linear-gradient(180deg,#fbfeff 0%,#f2faff 100%);
}
.public-site #calendarModal .calendar-list{
  gap:14px;
}
.public-site #calendarModal .calendar-group-title{
  color:#173B64;
  margin:18px 0 8px;
}
.public-site #calendarModal .calendar-row{
  position:relative;
  display:grid;
  grid-template-columns:auto 76px minmax(0,1fr);
  gap:14px;
  width:100%;
  align-items:center;
  text-align:right;
  border:1px solid #d7eaf5;
  border-radius:18px;
  padding:14px;
  background:linear-gradient(105deg,#fafdff 0%,#eaf7fd 55%,#dff2fb 100%);
  box-shadow:0 4px 14px rgba(44,121,184,.055);
  overflow:hidden;
  transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease;
}
.public-site #calendarModal .calendar-row:hover{
  transform:translateY(-1px);
  border-color:#abd8ee;
  box-shadow:0 8px 20px rgba(44,121,184,.10);
}
.public-site #calendarModal .calendar-row:not(.has-image){
  grid-template-columns:76px minmax(0,1fr);
}
.public-site #calendarModal .calendar-event-thumb{
  width:96px;
  height:76px;
  object-fit:cover;
  border-radius:13px;
  opacity:.9;
  box-shadow:0 3px 10px rgba(23,59,100,.08);
}
.public-site #calendarModal .calendar-row-copy h3{
  margin:0 0 4px;
  color:#173B64;
}
.public-site #calendarModal .calendar-row-copy p{
  margin:0 0 5px;
  color:#5b7182;
  display:-webkit-box;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
  overflow:hidden;
}
.public-site #calendarModal .calendar-row-copy small{color:#47677e}
.public-site #contentModal.modal-above-calendar{
  z-index:80!important;
  background:rgba(17,36,54,.72);
}
.public-site #calendarModal{z-index:60}
@media(max-width:560px){
  .public-site #calendarModal .calendar-row,
  .public-site #calendarModal .calendar-row:not(.has-image){
    grid-template-columns:62px minmax(0,1fr);
    gap:10px;
  }
  .public-site #calendarModal .calendar-row.has-image{
    grid-template-columns:72px 62px minmax(0,1fr);
  }
  .public-site #calendarModal .calendar-event-thumb{
    width:72px;
    height:64px;
    border-radius:11px;
  }
  .public-site #calendarModal .event-date-box{
    width:58px;
    min-height:62px;
  }
}

/* FEATURE-156 */
.backup-management-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px;margin:18px 0}
.backup-management-grid select{width:100%;margin:8px 0 14px}
@media(max-width:900px){.backup-management-grid{grid-template-columns:1fr}}

/* FEATURE-156 v2 */
.backup-row{align-items:center;justify-content:space-between}
.backup-row .btn-danger{flex:0 0 auto}

.backup-progress-track{height:8px;background:#e8eef4;border-radius:999px;overflow:hidden;margin:12px 0}
.backup-progress-bar{height:100%;width:0;background:linear-gradient(90deg,#8fcce8,#4e8fbd);border-radius:999px;transition:width .25s ease}
.storage-usage-item{margin:16px 0}
.storage-usage-header{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:.95em}
.storage-usage-track{height:10px;background:#e8eef4;border-radius:999px;overflow:hidden;margin:6px 0}
.storage-usage-bar{height:100%;width:0;background:linear-gradient(90deg,#8fcce8,#4e8fbd);border-radius:999px;transition:width .25s ease}
.storage-usage-bar.warn{background:linear-gradient(90deg,#f6c667,#e0a83a)}
.storage-usage-bar.danger{background:linear-gradient(90deg,#f0938a,#d9534f)}

/* project doc §29.45 -- storage safety net: the sidebar's storage nav
   item itself turns orange at the 90% warning level and red at the 95%
   block level, applied dynamically by assets/admin.js (openPortal /
   startSessionValidation) from identity.storageWarning.level. Placed
   after .side-menu button/.active/:hover in source order so these win
   at equal specificity even while the storage panel is the active one. */
.side-menu button.storage-warn{background:#7a5210;color:#fff}
.side-menu button.storage-warn:hover{background:#916018}
.side-menu button.storage-danger{background:#7a2222;color:#fff}
.side-menu button.storage-danger:hover{background:#912a2a}

/* BUG-159 — committee tabs must always remain reachable */
.committee-tabs{
  position:relative;
  display:flex;
  flex-wrap:nowrap;
  width:100%;
  max-width:100%;
  min-width:0;
  overflow-x:auto!important;
  overflow-y:hidden;
  -webkit-overflow-scrolling:touch;
  overscroll-behavior-inline:contain;
  scroll-snap-type:x proximity;
  scrollbar-width:none;
  touch-action:pan-x;
}
.committee-tabs::-webkit-scrollbar{display:none}
.committee-tab{flex:0 0 auto;scroll-snap-align:start}
.committee-tabs.has-overflow{
  -webkit-mask-image:linear-gradient(to left,transparent 0,#000 24px,#000 calc(100% - 24px),transparent 100%);
  mask-image:linear-gradient(to left,transparent 0,#000 24px,#000 calc(100% - 24px),transparent 100%);
  padding-inline:18px;
}
.panel,.card,.table-wrap,.admin-main{min-width:0}

/* BUG-159 — all committee tabs visible without horizontal scrolling */
.committee-tabs{
  display:grid!important;
  grid-template-columns:repeat(var(--committee-tab-columns,4),minmax(0,1fr))!important;
  grid-auto-rows:minmax(42px,auto);
  gap:8px;
  width:100%;
  max-width:100%;
  overflow:visible!important;
  padding:4px 2px 12px!important;
  margin-bottom:14px;
  -webkit-mask-image:none!important;
  mask-image:none!important;
}
.committee-tab{
  width:100%;
  min-width:0;
  justify-content:center;
  white-space:normal!important;
  text-align:center;
  line-height:1.2;
  padding:8px 8px!important;
}
.committee-tab span{
  min-width:0;
  overflow-wrap:anywhere;
}
.committee-tabs.has-overflow{padding-inline:2px!important;-webkit-mask-image:none!important;mask-image:none!important}
@media(max-width:760px){
  .committee-tabs{
    gap:6px;
    padding-inline:0!important;
  }
  .committee-tab{
    font-size:.82rem;
    padding:7px 4px!important;
    gap:4px;
  }
  .committee-tab b{
    min-width:20px;
    height:20px;
    padding:0 4px;
    font-size:.72rem;
  }
}


/* BUG-158 final UX */
.transfer-status:empty{display:none}
.transfer-status{margin-top:12px}

/* BUG-173 — show four backups, scroll older entries */
#backupRows{
  display:flex;
  flex-direction:column;
  gap:8px;
}
#backupRows.backup-list-scroll{
  overflow-y:auto;
  overscroll-behavior:contain;
  padding-inline-end:4px;
  scrollbar-gutter:stable;
}


/* BUG-177 — readable committee filters on mobile */
@media(max-width:760px){
  .committee-tabs{
    display:grid!important;
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
    grid-auto-rows:minmax(58px,auto)!important;
    gap:10px!important;
    overflow:visible!important;
    margin-inline:0!important;
    padding:4px 0 12px!important;
    -webkit-mask-image:none!important;
    mask-image:none!important;
  }
  .committee-tab{
    width:100%!important;
    min-width:0!important;
    min-height:58px;
    border-radius:16px!important;
    padding:10px 12px!important;
    display:grid!important;
    grid-template-columns:minmax(0,1fr) auto;
    align-items:center;
    gap:8px!important;
    text-align:right;
    white-space:normal!important;
    line-height:1.25;
  }
  .committee-tab span{
    min-width:0;
    overflow-wrap:normal!important;
    word-break:normal!important;
    hyphens:none;
    white-space:normal!important;
  }
  .committee-tab b{
    flex:0 0 auto;
    justify-self:end;
  }
}

/* BUG-178 — upcoming-week events use one horizontal carousel, like publications */
.public-site .upcoming-week-carousel{
  position:relative;
}
.public-site .event-week-grid{
  display:flex!important;
  flex-wrap:nowrap!important;
  gap:16px;
  overflow-x:auto!important;
  overflow-y:hidden!important;
  scroll-snap-type:x mandatory;
  scroll-behavior:smooth;
  scrollbar-width:none;
  max-height:none!important;
  padding:4px 42px 16px!important;
}
.public-site .event-week-grid::-webkit-scrollbar{display:none}
.public-site .event-week-grid.week-scroll{
  max-height:none!important;
  overflow-x:auto!important;
  overflow-y:hidden!important;
  padding-inline:42px!important;
}
.public-site .event-week-grid .week-event{
  flex:0 0 min(520px,calc((100% - 16px)/2));
  min-width:min(520px,calc((100% - 16px)/2));
  scroll-snap-align:start;
}
@media(max-width:900px){
  .public-site .event-week-grid{
    padding-inline:42px!important;
  }
  .public-site .event-week-grid .week-event{
    flex-basis:min(520px,78vw);
    min-width:min(520px,78vw);
  }
}
@media(max-width:560px){
  .public-site .event-week-grid{
    padding-inline:14px!important;
    scroll-padding-inline:14px;
  }
  .public-site .event-week-grid .week-event{
    flex-basis:88%;
    min-width:88%;
  }
}


/* project doc §29.60: events/publications/footer redesign pass.
   1) #eventWeekGrid never got the modern carousel-card sizing that
      #newsGrid did -- the only rule that ever tried to do it targeted a
      dead "#eventGrid" id that no longer exists in the HTML (the real
      id is #eventWeekGrid). Left the old dead rules alone (harmless,
      unreachable) and added a fresh, !important-guarded block below,
      mirroring the #newsGrid v6 block further up this file, so it wins
      regardless of the historical rule-ordering mess.
   2) Event cards in that carousel now show their date as a floating
      badge over the cover photo instead of a boxed column beside the
      text, matching the reference mockup; cards with no photo fall back
      to the original inline badge so nothing is left unreadable.
   3) Publication/update cards get a colored floating type tag over the
      image (contentCard() now wraps the image+badge in a
      .content-media container -- see public.js) instead of a plain
      badge above the title, plus a relative "לפני X ימים" timestamp via
      the new formatRelativeDate() in public.js.
   4) .quick-section (the 4-icon action row) moved from right under the
      hero to the bottom of the page this pass (see index.html) -- its
      old negative top margin existed only to overlap the hero, so it's
      replaced here with normal footer-style spacing. */

.public-site #eventWeekGrid{
  display:flex!important;
  flex-direction:row!important;
  flex-wrap:nowrap!important;
  grid-template-columns:none!important;
  width:100%;
  max-width:100%;
  overflow-x:auto!important;
  overflow-y:hidden!important;
  align-items:stretch;
}
.public-site #eventWeekGrid > *{flex-shrink:0!important}
.public-site #eventWeekGrid .event-card{
  width:calc((100% - 32px)/3)!important;
  flex:0 0 calc((100% - 32px)/3)!important;
  min-width:300px;
  max-width:390px;
  display:flex!important;
  flex-direction:row!important;
  align-items:stretch;
  position:relative;
  height:190px;
  padding:0!important;
  overflow:hidden;
  border-top:none;
  box-shadow:0 6px 20px rgba(35,90,140,.08);
  scroll-snap-align:start;
}
.public-site #eventWeekGrid .event-card .event-cover{
  width:160px;
  flex:0 0 160px;
  min-width:0;
  height:190px;
  min-height:0;
  max-height:none;
  border-radius:0;
  margin:0;
  display:block;
  object-fit:cover;
}
.public-site #eventWeekGrid .event-card > div:last-of-type{
  flex:1;
  min-width:0;
  display:flex;
  flex-direction:column;
  justify-content:center;
  gap:5px;
  padding:12px 16px;
}
/* Mockup event cards show only the title, time/place and a button --
   no committee-name line or description paragraph. */
.public-site #eventWeekGrid .event-card > div:last-of-type > small:first-child,
.public-site #eventWeekGrid .event-card > div:last-of-type > p{display:none}
.public-site #eventWeekGrid .event-card h3{font-size:1rem;margin:0}
.public-site #eventWeekGrid .event-card .event-info{font-size:.78rem;gap:6px 12px;color:var(--muted)}
.public-site #eventWeekGrid .event-card .card-actions{margin-top:4px}
.public-site #eventWeekGrid .event-card .card-actions .btn{padding:6px 12px;font-size:.78rem}
.public-site #eventWeekGrid .event-card .event-date-box{
  position:absolute;
  bottom:10px;
  inset-inline-start:10px;
  z-index:2;
  width:44px;
  min-height:44px;
  background:#fff;
  box-shadow:0 4px 12px rgba(23,59,100,.22);
  border-radius:11px;
}
.public-site #eventWeekGrid .event-card .event-date-box strong{font-size:1.05rem}
.public-site #eventWeekGrid .event-card .event-date-box span{font-size:.66rem}
.public-site #eventWeekGrid .event-card:not(.has-image){height:auto;min-height:100px}
.public-site #eventWeekGrid .event-card:not(.has-image) .event-date-box{
  position:static;
  box-shadow:none;
  background:#e8f3fb;
  flex:0 0 auto;
  align-self:center;
  margin-inline-start:12px;
}
@media(max-width:900px){
  .public-site #eventWeekGrid .event-card{width:calc((100% - 16px)/2)!important;flex-basis:calc((100% - 16px)/2)!important}
}
@media(max-width:560px){
  .public-site #eventWeekGrid .event-card{width:92%!important;min-width:0;flex-basis:92%!important;height:160px}
  .public-site #eventWeekGrid .event-card .event-cover{width:120px;flex-basis:120px}
}

.public-site #newsGrid .content-card{padding:14px}
.public-site .content-media{position:relative}
.public-site .event-week-grid{border:none;background:none;border-radius:0}
.public-site .content-media .badge{
  position:absolute;
  top:10px;
  inset-inline-start:10px;
  background:#fff;
  box-shadow:0 3px 10px rgba(23,59,100,.16);
  font-weight:700;
}
.public-site .badge.type-news{background:var(--brand-sky);color:var(--brand-blue)}
.public-site .badge.type-update{background:var(--brand-sky);color:var(--brand-blue)}
.public-site .badge.type-event{background:var(--brand-sky);color:var(--brand-navy)}
.public-site .badge.type-announcement{background:var(--brand-yellow);color:#6b4a00}
.public-site .badge.type-project{background:var(--brand-yellow);color:#6b4a00}
.public-site .content-card .content-date{font-size:.86rem}

.public-site .quick-section{margin-top:0;padding:48px 0 56px}


/* project doc §29.61: color-scheme + density pass, matching the
   reference mockup more closely and fitting more cards on a desktop
   screen without scrolling.
   1) Publication badges collapsed from a 5-color mix (only ever seen
      in this codebase, never in the mockup) down to the mockup's own
      2-color system: light blue by default, gold reserved for the
      standout "announcement" tag -- see the type-* rules edited above.
   2) #events now carries a visible light-blue wash near the top,
      fading to white, continuing the hero's gradient instead of
      dropping straight to near-white right under it.
   3) Event/publication cards go from 3 to 4 across on desktop (see the
      width/flex edits above) and get smaller cover photos, a smaller
      floating date chip, tighter card padding, and clamped
      title/body text so a shorter card doesn't grow tall on a longer
      publication -- all scoped to just these two carousels so it
      doesn't affect committee/project cards elsewhere that reuse
      .card/.content-card base classes. */

.public-site #events{background:#fff}

.public-site #eventWeekGrid .event-card h3,
.public-site #newsGrid .content-card h3{
  font-size:1.05rem;
  margin:0 0 5px;
  line-height:1.3;
}
.public-site #eventWeekGrid .event-card p,
.public-site #newsGrid .content-card p{
  font-size:.86rem;
  margin:0 0 8px;
  display:-webkit-box;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
  overflow:hidden;
}
.public-site #eventWeekGrid .event-card small,
.public-site #newsGrid .content-card small{font-size:.78rem}
.public-site #eventWeekGrid .event-card .event-info{font-size:.8rem;gap:8px}
.public-site #eventWeekGrid .event-card .card-actions,
.public-site #newsGrid .content-card .card-actions{margin-top:8px}
.public-site #newsGrid .content-card .card-meta{margin-bottom:2px}



/* project doc §29.62: replace the full-width "data loaded / refresh"
   banner -- a colored strip spanning the whole page (bright green on
   success, amber on warning, red on error) that sat between the header
   and the hero -- with a small icon+timestamp control folded directly
   into the header itself, next to the login button. Nothing about the
   underlying loading/refresh/error behavior changed, only how it's
   presented: the old .public-load-bar/.public-load-inner/
   .public-refresh-button/.public-load-spinner rules above are now
   unused. Left in place rather than hunted down across this large,
   partly-duplicated stylesheet -- same reasoning as leaving
   .hero-visual dead in §29.59.3. */

.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}

.public-status{display:flex;align-items:center}
.public-status-btn{
  position:relative;
  display:flex;
  align-items:center;
  gap:7px;
  border:1px solid #c9d8e7;
  background:#fff;
  border-radius:999px;
  padding:7px 13px;
  cursor:pointer;
  color:var(--ink);
  font:inherit;
  transition:.15s;
}
.public-status-btn:hover{border-color:var(--primary);color:var(--primary)}
.public-status-btn:disabled{cursor:wait;opacity:.75}
.public-status-icon{display:inline-block;font-size:.95rem;line-height:1}
.public-status.loading .public-status-icon{animation:public-spin .8s linear infinite}
.public-status-time{color:var(--muted);font-size:.8rem;white-space:nowrap;font-weight:600}
.public-status.warning .public-status-btn::after,
.public-status.error .public-status-btn::after{
  content:'';
  position:absolute;
  top:-1px;
  inset-inline-end:-1px;
  width:9px;
  height:9px;
  border-radius:50%;
  border:2px solid #fff;
}
.public-status.warning .public-status-btn::after{background:#d99a2b}
.public-status.error .public-status-btn::after{background:#c23b4a}
@media(max-width:560px){
  .public-status-time{display:none}
  .public-status-btn{padding:8px}
}


/* project doc §29.64: fix the event-week photo overflowing its card
   (a classic flexbox gotcha -- a flex item's automatic minimum size
   defaults to its content's intrinsic size unless overridden, so the
   .event-cover <img> was refusing to shrink below its natural pixel
   size no matter what width/object-fit said), and make the events,
   publications and past/future event-strip card rows all share the
   same per-card width instead of each row using its own formula. */
.public-site #eventFutureGrid .event-strip-card,
.public-site #eventPastGrid .event-strip-card{
  flex:0 0 calc((100% - 32px)/3);
  min-width:300px;
  max-width:390px;
}


/* [project doc §29.65] Three follow-up fixes from live feedback after
   §29.64's landscape event-card rebuild:
   1. The blue-tinted body/#committees/#projects washes (a leftover
      whole-page gradient and the .section-soft lavender wash) were
      showing through the near-white sections below the hero, reading
      as "blue everywhere" against the mockup where only the hero photo
      itself carries the blue tone. Both were flattened to plain white
      above (the .public-site{} body rule and .section-soft{}).
   2. "אירועים קודמים"/"בהמשך" (past/future event strips) use a
      different heading markup (.event-strip-heading) than the
      #events/#news carousels (.split-title), so the centering fix that
      landed for .split-title in §29.64 never reached these -- adding
      the same centered treatment here, scoped to .event-strip-heading
      specifically so it doesn't disturb any other consumer of that
      class if one exists.
   3. Row-height mismatch: #newsGrid .content-card (publications) was
      still the original portrait/stacked layout (image on top, full
      excerpt below) while #eventWeekGrid .event-card was rebuilt to a
      fixed-height landscape split card in §29.63. Rebuilding
      .content-card the same way (image column + a wrapping
      .content-copy text column, mirroring event-card's structure) so
      both rows are visually uniform at the same 150px height. Requires
      a matching markup change in contentCard() in public.js to add the
      .content-copy wrapper div -- the event/publication card shapes are
      now structurally identical, just fed different fields.
   NOT yet touched: .event-strip-card (the compact past/future cards)
   keep their own smaller, content-driven height -- they are a secondary
   tier below the main carousels in the mockup, not the same row type,
   so "uniform height" is applied within each tier rather than across
   all three card types. Still unverified from this session -- needs
   the owner's own eyes once deployed. */

.public-site .event-strip-heading{
  flex-direction:column;
  align-items:center;
  justify-content:center;
  text-align:center;
  gap:4px;
}
.public-site .event-strip-heading h3,
.public-site .event-strip-heading small{text-align:center}

.public-site #newsGrid .content-card{
  display:flex!important;
  flex-direction:row!important;
  align-items:stretch;
  height:190px;
  padding:0!important;
  overflow:hidden;
}
.public-site #newsGrid .content-card .content-media{
  width:160px;
  flex:0 0 160px;
  min-width:0;
  min-height:0;
  height:190px;
  margin:0;
  position:relative;
}
.public-site #newsGrid .content-card .content-thumb{
  width:100%;
  height:100%;
  border-radius:0;
  margin:0;
}
.public-site #newsGrid .content-card .content-copy{
  flex:1;
  min-width:0;
  display:flex;
  flex-direction:column;
  justify-content:center;
  gap:5px;
  padding:12px 16px;
}
.public-site #newsGrid .content-card .content-copy p,
.public-site #newsGrid .content-card .content-copy > small{display:none}
.public-site #newsGrid .content-card .content-copy .card-meta{margin:0}
.public-site #newsGrid .content-card h3{font-size:1rem;margin:0;line-height:1.3}
.public-site #newsGrid .content-card .content-date{font-size:.78rem;color:var(--muted)}
.public-site #newsGrid .content-card .card-actions{margin-top:4px}
.public-site #newsGrid .content-card .card-actions .btn{padding:6px 12px;font-size:.78rem}
@media(max-width:560px){
  .public-site #newsGrid .content-card{height:160px}
  .public-site #newsGrid .content-card .content-media{width:120px;flex-basis:120px;height:160px}
}


/* [project doc §29.68] Owner sent two precise close-up crops of the
   mockup (one event card, one publication card), which correct §29.67:
   these are NOT portrait cards with a badge floating over a photo
   corner. They're a two-column landscape layout -- photo on the
   physical right (in RTL, first-DOM-child-renders-right), text on the
   physical left -- and for events, the date badge sits BELOW the photo
   as its own separate block in the same column, not overlapping it at
   all. Rebuilding both card types again to match; this replaces the
   §29.67 block in place (editing rather than appending another override
   layer, since these exact selectors have now been rewritten four times
   in one session -- easier to keep one current version than to trace
   through a growing stack of superseded overrides).

   Event card: eventCard()'s markup is still shared with the
   committee-detail modal, so this stays CSS-only. CSS Grid replaces the
   display:contents/flex-order trick from §29.67 -- much simpler here,
   because the desired left-column reading order (title, then
   time/place, then button) already matches the DOM order inside the
   card's trailing wrapper <div>, so that div can just be treated as a
   single grid item spanning both rows instead of needing to be
   unwrapped. grid-template-columns puts column 1 at the *inline-start*
   edge, which is the right in RTL -- so a plain "narrow-column,
   wide-column" declaration order naturally lands the photo column on
   the right without any RTL-specific overrides. event-cover -> row 1 of
   that column, event-date-box -> row 2 (a normal, non-overlapping grid
   item now, not position:absolute/negative-margin), the wrapper div ->
   column 2, spanning both rows.

   Not matched exactly yet: the reference shows the event's day name
   next to its time ("רביעי | 18:00", no clock icon) where the site
   currently shows a clock emoji + time only (no day name) -- that's a
   small JS text-formatting change in the shared eventCard(), left out
   of this pass to avoid touching shared-modal text formatting in the
   same pass as the layout rework; flagged in the checklist as a
   follow-up if wanted.

   Publication card: contentCard() is NOT shared with anything else (the
   featured-card variant builds its own markup independently), so this
   one got an actual JS restructure instead of a CSS-only workaround --
   the badge moved from overlapping the image (inside .content-media) to
   being a normal first line of the text column (inside .content-copy),
   matching the reference, and the .content-media wrapper was dropped
   since nothing needs it as a positioning context anymore. The excerpt
   <p>, hidden in every card iteration since §29.63, is shown again here
   (line-clamped to 3 lines) since the reference crop shows real body
   text, not just a title. */

.public-site #eventWeekGrid .event-card{
  display:grid!important;
  grid-template-columns:140px 1fr;
  grid-template-rows:auto auto;
  column-gap:14px;
  row-gap:8px;
  align-items:start;
  height:auto!important;
  min-height:0;
  padding:14px!important;
  overflow:visible;
}
.public-site #eventWeekGrid .event-card > .event-cover{
  grid-column:1;
  grid-row:1;
  width:100%;
  height:110px;
  min-width:0;
  min-height:0;
  max-height:none;
  border-radius:14px;
  object-fit:cover;
  display:block;
  margin:0;
}
.public-site #eventWeekGrid .event-card > .event-date-box{
  grid-column:1;
  grid-row:2;
  position:static;
  width:64px;
  min-height:56px;
  justify-self:center;
  margin:0;
}
.public-site #eventWeekGrid .event-card:not(.has-image) > .event-date-box{
  grid-column:1;
  grid-row:1/3;
  background:#e8f3fb;
  box-shadow:none;
  align-self:center;
}
.public-site #eventWeekGrid .event-card > div:last-of-type{
  grid-column:2;
  grid-row:1/3;
  display:flex;
  flex-direction:column;
  justify-content:flex-start;
  gap:7px;
  min-width:0;
}
.public-site #eventWeekGrid .event-card small,
.public-site #eventWeekGrid .event-card p{display:none}
.public-site #eventWeekGrid .event-card h3{font-size:1rem;margin:0;line-height:1.3}
.public-site #eventWeekGrid .event-card .event-info{
  display:flex;
  flex-direction:column;
  gap:4px;
  font-size:.8rem;
  color:var(--muted);
}
.public-site #eventWeekGrid .event-card .card-actions{margin-top:auto}
.public-site #eventWeekGrid .event-card .card-actions .btn{padding:7px 14px;font-size:.8rem}
@media(max-width:560px){
  .public-site #eventWeekGrid .event-card{grid-template-columns:110px 1fr}
  .public-site #eventWeekGrid .event-card > .event-cover{height:90px}
  .public-site #eventWeekGrid .event-card > .event-date-box{width:54px;min-height:48px}
}

.public-site #newsGrid .content-card{
  display:grid!important;
  grid-template-columns:140px 1fr;
  column-gap:14px;
  align-items:stretch;
  height:auto!important;
  padding:14px!important;
}
.public-site #newsGrid .content-card > .content-thumb{
  grid-column:1;
  grid-row:1;
  width:100%;
  height:100%;
  min-height:110px;
  border-radius:14px;
  margin:0;
}
.public-site #newsGrid .content-card .content-copy{
  grid-column:2;
  grid-row:1;
  display:flex;
  flex-direction:column;
  gap:6px;
  padding:0;
  min-width:0;
}
.public-site #newsGrid .content-card .content-copy .badge{
  position:static;
  box-shadow:none;
  align-self:flex-start;
}
.public-site #newsGrid .content-card .content-copy h3{margin:0;font-size:1rem;line-height:1.3}
.public-site #newsGrid .content-card .content-copy p{
  display:-webkit-box;
  -webkit-line-clamp:3;
  -webkit-box-orient:vertical;
  overflow:hidden;
  font-size:.82rem;
  color:var(--muted);
  margin:0;
}
.public-site #newsGrid .content-card .content-copy small{display:none}
.public-site #newsGrid .content-card .content-copy .content-date{
  font-size:.76rem;
  color:var(--muted);
  margin-top:auto;
}
.public-site #newsGrid .content-card .content-copy .card-actions{margin-top:2px}
.public-site #newsGrid .content-card .content-copy .card-actions .btn{padding:7px 14px;font-size:.8rem}
@media(max-width:560px){
  .public-site #newsGrid .content-card{grid-template-columns:110px 1fr}
  .public-site #newsGrid .content-card > .content-thumb{min-height:90px}
}

/* Tighter vertical rhythm site-wide -- "all lines are close to each
   other, no big empty spaces between areas" was the owner's direct
   description of the mockup vs. the live site. */
.public-site .section{padding:28px 0}
.public-site .section-title{margin-bottom:14px}
.event-strip-block{margin-top:14px}


/* [project doc §29.69] Month-grid calendar for "לוח אירועים" (opened by
   the "כל האירועים"/openCalendar button), built to match the owner's
   reference mockup: a mini hero banner, a list/month view toggle, month
   navigation, a 7-column day grid with color-coded event pills, and an
   upcoming-events sidebar. Lives entirely inside the existing
   #calendarModal (no new page/route) -- the modal is simply widened.
   Colors are assigned per event via eventColor() in public.js (a fixed
   palette cycled by the event's committee), not hard-coded here, so the
   CSS below only defines the pill/dot shapes and reads each one's color
   from an inline style set at render time. */

.public-site #calendarModal .modal-card{width:min(1120px,96vw);padding:0;overflow-y:auto;overflow-x:hidden}
.public-site #calendarModal #calendarBody{padding:0 20px 20px}

.public-site .calendar-hero{
  background:linear-gradient(125deg,#edf5fb,#fef8e9);
  border-radius:18px;
  padding:16px 22px;
  margin:4px 0 16px;
}
.public-site .calendar-hero p{margin:0;color:var(--muted,#5b7182);font-size:.88rem}
.public-site #calendarModal .modal-head{padding:16px 20px 0;margin-bottom:0}
.public-site #calendarModal .modal-head h2{font-size:1.3rem;color:var(--brand-navy,#173B64)}

.public-site .calendar-toolbar{
  display:flex;
  align-items:center;
  justify-content:space-between;
  flex-wrap:wrap;
  gap:10px;
  margin-bottom:16px;
}
.public-site .calendar-view-toggle{display:flex;gap:8px}
.public-site .calendar-mode-btn{
  border:1px solid #d7e3ec;
  background:#fff;
  color:var(--brand-navy,#173B64);
  border-radius:11px;
  padding:9px 16px;
  font-size:.85rem;
  font-weight:700;
  cursor:pointer;
}
.public-site .calendar-mode-btn.active{background:var(--brand-yellow);border-color:var(--brand-yellow);color:#47370c}
.public-site .calendar-nav{display:flex;align-items:center;gap:8px}
.public-site .calendar-nav .carousel-arrow{position:static;transform:none;box-shadow:none;border:1px solid #d7e3ec;width:34px;height:34px;font-size:1.3rem}
.public-site .calendar-month-select{
  border:1px solid #d7e3ec;
  border-radius:11px;
  background:#fff;
  padding:8px 12px;
  font:inherit;
  font-weight:700;
  color:var(--brand-navy,#173B64);
  cursor:pointer;
}
.public-site .calendar-today-btn{padding:8px 14px;font-size:.82rem}

.public-site .calendar-grid-wrap{display:flex;align-items:flex-start;gap:20px}
.public-site .month-grid-shell{flex:2.3;min-width:0;border:1px solid #e5edf5;border-radius:16px;overflow:hidden}
.public-site .month-grid-head{display:grid;grid-template-columns:repeat(7,1fr);background:#f7fafd;border-bottom:1px solid #e5edf5}
.public-site .month-grid-head-cell{padding:9px 4px;text-align:center;font-size:.78rem;font-weight:700;color:var(--muted,#5b7182)}
.public-site .month-grid{display:grid;grid-template-columns:repeat(7,1fr)}
.public-site .month-cell{
  height:96px;
  padding:6px;
  border-inline-start:1px solid #eef2f6;
  border-top:1px solid #eef2f6;
  display:flex;
  flex-direction:column;
  gap:3px;
  overflow:hidden;
}
.public-site .month-cell:nth-child(7n+1){border-inline-start:none}
.public-site .month-cell-day{
  align-self:flex-end;
  font-size:.82rem;
  font-weight:700;
  color:var(--brand-navy,#173B64);
  width:24px;
  height:24px;
  display:flex;
  align-items:center;
  justify-content:center;
  border-radius:50%;
}
.public-site .month-cell.out-month .month-cell-day{color:#c4ccd3;font-weight:600}.public-site .month-cell-hebrew{align-self:flex-end;font-size:.6rem;color:var(--muted,#5b7185);line-height:1}.public-site .month-cell.out-month .month-cell-hebrew{color:#c4ccd3}.public-site .month-cell-holiday-label{font-size:.64rem;font-weight:700;color:var(--brand-navy,#173B64);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.public-site .month-cell.has-holiday{border-radius:8px}.public-site .calendar-hebrew-subtitle{font-size:.8rem;color:var(--muted,#5b7185);margin-inline-start:6px}.public-site .calendar-legend{display:flex;flex-wrap:wrap;gap:14px;padding:0 4px 10px}.public-site .calendar-legend-item{display:flex;align-items:center;gap:6px;font-size:.8rem;color:var(--muted,#5b7185)}.public-site .calendar-legend-dot{width:10px;height:10px;border-radius:50%;display:inline-block}
.public-site .month-cell.is-today .month-cell-day{background:var(--brand-navy,#173B64);color:#fff}
.public-site .month-cell-events{display:flex;flex-direction:column;gap:2px;min-width:0}
.public-site .month-pill{
  display:flex;
  align-items:center;
  gap:4px;
  border:0;
  border-radius:6px;
  padding:2px 5px;
  font-size:.66rem;
  font-weight:600;
  line-height:1.3;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  cursor:pointer;
  width:100%;
  text-align:right;
}
.public-site .month-pill-dot{width:6px;height:6px;border-radius:50%;flex:0 0 auto}
.public-site .month-pill-more{font-size:.64rem;color:var(--muted,#5b7182);padding-inline-start:2px}
.public-site .month-cell-dots{display:none}
.public-site .month-cell-dot{
  width:8px;
  height:8px;
  min-width:8px;
  padding:5px;
  margin:-5px;
  border:0;
  border-radius:50%;
  background-clip:content-box;
  cursor:pointer;
}

.public-site .calendar-sidebar{
  flex:1;
  min-width:270px;
  background:#fff;
  border:1px solid #e5edf5;
  border-radius:16px;
  padding:16px;
}
.public-site .calendar-sidebar-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.public-site .calendar-sidebar-head h3{margin:0;font-size:1.02rem;color:var(--brand-navy,#173B64)}
.public-site .upcoming-row{
  display:flex;
  align-items:center;
  gap:10px;
  width:100%;
  border:0;
  background:none;
  padding:10px 0;
  border-bottom:1px solid #eef2f6;
  cursor:pointer;
  text-align:right;
  font:inherit;
}
.public-site .upcoming-row:last-of-type{border-bottom:0}
.public-site .upcoming-dot{width:9px;height:9px;border-radius:50%;flex:0 0 auto}
.public-site .upcoming-copy{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.public-site .upcoming-copy strong{font-size:.88rem;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.public-site .upcoming-copy small{font-size:.74rem;color:var(--muted,#5b7182)}
.public-site .upcoming-date-box{
  flex:0 0 auto;
  width:52px;
  text-align:center;
  background:#eef5fb;
  border-radius:11px;
  padding:5px 4px;
  color:var(--brand-navy,#173B64);
}
.public-site .upcoming-date-box strong{display:block;font-size:1rem}
.public-site .upcoming-date-box span{display:block;font-size:.66rem}
.public-site .calendar-all-btn{width:100%;margin-top:12px;justify-content:center;gap:8px;display:flex;align-items:center}

@media(max-width:860px){
  .public-site .calendar-grid-wrap{flex-direction:column}
  .public-site .calendar-sidebar{width:100%;min-width:0}
  .public-site .calendar-view-toggle{width:100%}
  .public-site .calendar-mode-btn{flex:1}
  .public-site .month-cell{height:70px;padding:4px}
  .public-site .month-pill{font-size:.6rem}
}
@media(max-width:560px){
  .public-site #calendarModal .modal-card{padding:0}
  .public-site .calendar-hero{padding:14px 16px;border-radius:0}
  .public-site #calendarModal #calendarBody{padding:0 12px 16px}
  .public-site .month-cell{height:56px}
  .public-site .month-cell-events{display:none}
  .public-site .month-cell-dots{display:flex;flex-wrap:wrap;gap:2px;justify-content:flex-end}
  .public-site .month-cell.is-today .month-cell-day,
  .public-site .month-cell.has-events .month-cell-day{box-shadow:0 0 0 2px var(--brand-yellow)}
}

/* project doc §29.77: tzaharon day-picker moved from its own top-level
   panel into the relevant committee's card in ועדות. */
.badge.accent{background:#e1eef5;color:#164047}

/* project doc §29.78: tzaharon-active-day marker on the public month
   calendar, alongside the existing holiday shading. */
.public-site .month-cell{position:relative}
.public-site .month-cell-tzaharon-badge{position:absolute;top:4px;inset-inline-start:4px;font-size:.72rem;line-height:1}

/* project doc §29.8x: generalized calendar-update support -- the event
   form's optional end-time picker and calendar_only checkbox, and the
   approval queue's list/calendar view toggle for the אירועים tab. */
.checkbox-label{display:flex;align-items:center;gap:8px;font-weight:700}
.checkbox-label input{width:auto}
#eventEndTimePicker .btn{margin-inline-start:8px}
.approval-view-toggle{margin:10px 0}
.approval-view-toggle .btn.active{background:var(--primary);color:#fff;border-color:var(--primary)}
.approval-calendar-view{margin-top:10px}
.approval-cal-nav{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.approval-cal-legend{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:12px;font-size:.82rem;color:var(--muted)}
.approval-cal-legend span{display:flex;align-items:center;gap:6px}
.approval-cal-legend .approval-cal-pill.sample{padding:2px 8px}
.approval-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}
.approval-cal-cell{height:86px;background:#fff;border:1px solid #e2eaf2;border-radius:12px;padding:6px;display:flex;flex-direction:column;gap:4px;overflow:hidden}
.approval-cal-cell.out-month{background:transparent;border-color:transparent}
.approval-cal-cell.has-proposed{border-color:#f2b23a}
.approval-cal-daynum{font-weight:800;font-size:.82rem}
.approval-cal-pills{display:flex;flex-direction:column;gap:3px;min-width:0}
.approval-cal-pill{display:block;border-radius:7px;padding:2px 6px;font-size:.68rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}
.approval-cal-pill.live{background:#e8f3fb;color:#0f5f97}
.approval-cal-pill.proposed{background:#fff6e5;color:#8a5a00;border:1px dashed #f2b23a;cursor:pointer}
.approval-cal-pill.proposed.calendar-only{background:#f0e9fb;color:#4b2a8a;border-color:#b79bef}
@media(max-width:900px){.approval-cal-grid{grid-template-columns:repeat(7,minmax(0,1fr));font-size:.85rem}.approval-cal-cell{height:66px;padding:4px}.approval-cal-pill{font-size:.6rem}}.events-cal-header{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px}.events-cal-nav{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.events-cal-legend{display:flex;flex-wrap:wrap;gap:14px;margin-bottom:12px;font-size:.82rem;color:var(--muted)}.events-cal-legend span{display:flex;align-items:center;gap:6px}.events-cal-legend .events-cal-pill.sample{padding:2px 8px}.events-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}.events-cal-cell{height:86px;background:#fff;border:1px solid #e2eaf2;border-radius:12px;padding:6px;display:flex;flex-direction:column;gap:4px;cursor:pointer;overflow:hidden}.events-cal-cell:hover{border-color:var(--primary)}.events-cal-cell.out-month{background:transparent;border-color:transparent;cursor:default}.events-cal-daynum{font-weight:800;font-size:.82rem}.events-cal-pills{display:flex;flex-direction:column;gap:3px;min-width:0}.events-cal-pill{display:block;border-radius:7px;padding:2px 6px;font-size:.68rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.events-cal-pill.published{background:#e8f3fb;color:#0f5f97}.events-cal-pill.pending{background:#fff6e5;color:#8a5a00;border:1px dashed #f2b23a}.events-cal-pill.calendar-only{background:#f0e9fb;color:#4b2a8a;border-color:#b79bef}.events-cal-cell.has-holiday{border-radius:8px}.events-cal-holiday-label{display:block;font-size:.6rem;font-weight:700;color:var(--brand-navy,#173B64);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.events-cal-holiday-dot{width:10px;height:10px;border-radius:50%;display:inline-block}#contentList,#eventRows{max-height:720px;overflow-y:auto;padding-inline-end:4px}@media(max-width:900px){.events-cal-grid{grid-template-columns:repeat(7,minmax(0,1fr));font-size:.85rem}.events-cal-cell{height:66px;padding:4px}.events-cal-pill{font-size:.6rem}}#eventFormModal .modal-card{position:relative;padding-top:56px}.event-modal-close{position:absolute;top:16px;left:16px}

/* project doc §29.8x: range/gap-safety display for events (public site) --
   the "⚠️ specific active days" note shown whenever a ranged event has
   gaps, so a parent never reads just the overall range and assumes every
   day in it applies; and a light visual marker for calendar_only pills
   on the month view (still a real, clickable event -- just one that
   didn't generate a public announcement). */
.event-schedule-note{color:#8a5a00;font-size:.82rem;font-weight:700;margin:4px 0 0}
.public-site .month-pill-calendar-only{border:1px dashed currentColor}


/* Parent access gate: the leadership "which view am I seeing" strip
   (assets/public.js renderViewerBar). Deliberately plain and full-width at
   the very top of the page -- it is a status indicator, not chrome, and it
   must be impossible to mistake for part of the site's own design. */
.viewer-mode-bar{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap;padding:8px 16px;background:#eef2ff;color:#1e3a8a;font-size:.9rem;border-bottom:1px solid #c7d2fe}
.viewer-mode-bar.is-preview{background:#fef3c7;color:#92400e;border-bottom-color:#fde68a}
.viewer-mode-bar .btn{white-space:nowrap}
.viewer-mode-bar .btn.is-active{background:#1e3a8a;color:#fff;border-color:#1e3a8a}
.viewer-mode-bar.is-preview .btn.is-active{background:#92400e;border-color:#92400e}
.viewer-mode-bar small{opacity:.85}



/* Parent access modal (assets/public.js). */
.parent-access-tabs{display:flex;gap:8px;margin-bottom:16px}
.parent-access-tabs .btn.is-active{background:#2563eb;color:#fff;border-color:#2563eb}
.parent-class-checklist{display:flex;flex-wrap:wrap;gap:8px 16px}
.parent-class-option{display:flex;align-items:center;gap:6px;white-space:nowrap}
.notice-error{background:#fef2f2;border-color:#fecaca;color:#991b1b}
.notice-strong{background:#ecfdf5;border-color:#a7f3d0;color:#065f46}
/* The issued password is shown exactly once and has to be copied by hand or
   by eye, so it gets a monospaced, well-spaced, selectable treatment rather
   than being buried in body text. */
.parent-credential{display:flex;align-items:center;gap:10px;margin:10px 0}
.parent-credential-label{flex:0 0 auto;font-weight:800;min-width:6.5em}
.parent-credential .parent-password{flex:1;margin:0}
.parent-password{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:1.25rem;letter-spacing:.06em;background:#fff;border:1px dashed #065f46;border-radius:8px;padding:10px 14px;margin:10px 0;user-select:all;direction:ltr;text-align:center}

/* Sub-tabs under the page title, for nav entries that cover more than one
   screen (publishing = content + events; users = leadership + parents).
   Same pill language as .committee-tab, one level down in the hierarchy. */
.panel-group-tabs{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}
.panel-group-tabs button{border:1px solid #cfdeea;background:#fff;color:var(--text);border-radius:999px;padding:8px 14px;font:inherit;font-weight:800;cursor:pointer;transition:.18s ease}
.panel-group-tabs button:hover{border-color:var(--primary);background:#f4f9fd}
.panel-group-tabs button.active{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 5px 14px rgba(24,103,155,.18)}
.panel-group-tabs button.storage-warn{background:#7a5210;border-color:#7a5210;color:#fff}
.panel-group-tabs button.storage-danger{background:#7a2222;border-color:#7a2222;color:#fff}
@media(max-width:640px){.panel-group-tabs button{flex:1;padding:8px 10px}}

/* Standalone-backup panel: two buttons, everything else behind
   "הגדרות מתקדמות" (14 Sep 2026). The <details> is deliberately quiet --
   a chair who never opens it should not feel they are missing a step. */
.backup-advanced{margin:12px 0}
.backup-advanced>summary{font-weight:800;color:var(--muted)}
.backup-advanced[open]>summary{color:var(--primary);margin-bottom:8px}
.backup-advanced .field{margin-top:10px}
.backup-advanced select{width:100%}

/* One card, two operations on the same subject (14 Sep 2026): the year
   rows and the year restore were separate cards, which hid that restore
   is simply the inverse of purge. The h4s carry the split now. */
.panel-card h4{margin:18px 0 6px;font-size:1rem}
.panel-card h4:first-of-type{margin-top:14px}

/* A scheduled backup that has never run is the one status on this screen
   worth alarming about -- it is what a missing cron worker looks like. */
.notice.warn{background:#fde5e8;border-color:#efc5ca;color:#85232d;font-weight:800}
