/* Grafton Class Hub — front-end. Uses theme tokens when present, falls back otherwise. */
:root{--gch-ink:var(--g-ink,#1b2434);--gch-brand:var(--g-navy,#1b2a49);--gch-accent:var(--g-gold,#c9a227);--gch-paper:var(--g-paper,#fff);--gch-muted:var(--g-muted,#66707f);--gch-line:var(--g-line,#e3e6ea);--gch-radius:10px}
.gch-card{background:var(--gch-paper);border:1px solid var(--gch-line);border-radius:var(--gch-radius);padding:1.5rem;margin-bottom:1.5rem}
.gch-narrow{max-width:560px}
.gch-btn{display:inline-block;background:var(--gch-brand);color:#fff!important;padding:.7rem 1.25rem;border-radius:6px;border:2px solid var(--gch-brand);text-decoration:none!important;font-weight:600;cursor:pointer;line-height:1.2;font-size:1rem}
.gch-btn:hover{filter:brightness(1.15)}.gch-btn-outline{background:transparent;color:var(--gch-brand)!important}.gch-btn-lg{padding:.95rem 1.75rem;font-size:1.1rem}.gch-btn-small{padding:.45rem .9rem;font-size:.9rem}
.gch-btn[disabled]{opacity:.5;cursor:wait}.gch-link{background:none;border:0;color:var(--gch-brand);text-decoration:underline;cursor:pointer;padding:0}
.gch-form label{display:block;margin:0 0 1rem;font-weight:600}.gch-form input:not([type=radio]):not([type=checkbox]),.gch-form textarea,.gch-form select,.gch-checkout input:not([type=radio]):not([type=checkbox]),.gch-checkout select,.gch-filters input,.gch-filters select,.gch-composer textarea{width:100%;padding:.7rem .8rem;border:1px solid var(--gch-line);border-radius:6px;font:inherit;margin-top:.3rem;background:#fff}
.gch-form fieldset{border:0;padding:0;margin:0 0 1rem}.gch-form legend{font-weight:600;margin-bottom:.4rem}.gch-inline{display:inline-block!important;margin:0 1rem .5rem 0!important;font-weight:400!important}
.gch-cols{display:grid;grid-template-columns:1fr 1fr;gap:0 1rem}@media(max-width:600px){.gch-cols{grid-template-columns:1fr}}
.gch-hp{position:absolute;left:-9999px}
.gch-notice{padding:.85rem 1rem;border-radius:6px;background:#eef2f8;margin:0 0 1rem;border-left:4px solid var(--gch-brand)}.gch-notice-ok{background:#e8f6ee;border-color:#1e8449}.gch-notice-error{background:#fdecec;border-color:#c0392b}
.gch-gate{background:var(--gch-paper);border:1px dashed var(--gch-line);border-radius:var(--gch-radius);padding:2rem;text-align:center;max-width:520px;margin:2rem auto}
.gch-muted{color:var(--gch-muted);font-size:.92rem}.gch-lead{font-size:1.15rem;max-width:64ch}.gch-empty{padding:2.5rem 1rem;text-align:center;color:var(--gch-muted);border:1px dashed var(--gch-line);border-radius:var(--gch-radius)}
.gch-avatar{border-radius:50%;object-fit:cover;display:inline-flex;align-items:center;justify-content:center;background:var(--gch-brand);color:#fff;font-weight:700;flex:0 0 auto;vertical-align:middle}
.gch-avatar-row{list-style:none;padding:0;margin:0 0 .5rem;display:flex;flex-wrap:wrap}.gch-avatar-row li{margin:0 -6px 6px 0}.gch-avatar-row .gch-avatar{border:2px solid var(--gch-paper);font-size:.75rem}
.gch-tag{display:inline-block;font-size:.75rem;padding:.15rem .55rem;border-radius:999px;background:#eef2f8;color:var(--gch-brand);font-weight:600;vertical-align:middle}.gch-tag-yes{background:#e8f6ee;color:#1e8449}
/* Profile */
.gch-profile-layout{display:grid;grid-template-columns:260px 1fr;gap:1.5rem;align-items:start}@media(max-width:760px){.gch-profile-layout{grid-template-columns:1fr}}
.gch-profile-side{text-align:center}.gch-profile-side .gch-avatar{width:160px;height:160px;font-size:3rem;margin:0 auto 1rem}.gch-profile-status{margin:1rem 0}
/* Directory */
.gch-filters{display:grid;grid-template-columns:1fr auto auto;gap:.6rem;margin-bottom:1rem}@media(max-width:600px){.gch-filters{grid-template-columns:1fr}}
.gch-map{height:340px;border-radius:var(--gch-radius);margin-bottom:1.25rem;border:1px solid var(--gch-line)}
.gch-people-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}
.gch-person{display:flex;gap:1rem;padding:1.1rem;border:1px solid var(--gch-line);border-radius:var(--gch-radius);background:var(--gch-paper)}.gch-person .gch-avatar{width:88px;height:88px;font-size:1.6rem}.gch-person h3{margin:0 0 .2rem;font-size:1.1rem}.gch-person p{margin:0 0 .3rem}.gch-bio{font-size:.92rem}.gch-person-links a{margin-right:.75rem;font-size:.9rem}
/* Feed */
.gch-feed{max-width:680px}.gch-composer-top{display:flex;gap:.75rem;align-items:flex-start}.gch-composer textarea{resize:vertical;min-height:60px}.gch-composer-actions{display:flex;flex-wrap:wrap;gap:.75rem;align-items:center;margin-top:.75rem}.gch-composer-actions .gch-btn:last-child{margin-left:auto}
.gch-chip{display:inline-block;background:#eef2f8;border-radius:999px;padding:.2rem .7rem;font-size:.8rem;margin:.5rem .4rem 0 0}
.gch-update{background:var(--gch-paper);border:1px solid var(--gch-line);border-radius:var(--gch-radius);margin-bottom:1.25rem;overflow:hidden}.gch-update header{display:flex;gap:.75rem;align-items:center;padding:1rem 1.25rem .5rem}.gch-update header time{color:var(--gch-muted);font-size:.85rem}.gch-update header .gch-icon-btn{margin-left:auto;background:none;border:0;color:var(--gch-muted);cursor:pointer;font-size:1rem}
.gch-update.is-throwback{border-color:var(--gch-accent)}.gch-update-text{padding:0 1.25rem .75rem}.gch-update-text p{margin:0 0 .6rem}
.gch-media{display:grid;gap:3px}.gch-media-2,.gch-media-4{grid-template-columns:1fr 1fr}.gch-media-3{grid-template-columns:2fr 1fr}.gch-media-3 a:first-child{grid-row:span 2}.gch-media img,.gch-media video{width:100%;height:100%;object-fit:cover;display:block;max-height:520px;background:#000}
.gch-update footer{display:flex;gap:.5rem;padding:.6rem 1rem}.gch-update footer button{background:none;border:1px solid var(--gch-line);border-radius:999px;padding:.35rem .9rem;cursor:pointer;font:inherit;color:var(--gch-ink)}.gch-like.is-on{border-color:#c0392b;color:#c0392b}.gch-like.is-on .gch-heart{color:#c0392b}
.gch-comments{padding:.5rem 1.25rem 1rem;border-top:1px solid var(--gch-line)}.gch-comment{display:flex;gap:.6rem;margin:.6rem 0}.gch-comment .gch-avatar{width:32px;height:32px;font-size:.7rem}.gch-comment p{margin:.1rem 0 0;font-size:.95rem}.gch-comment time{color:var(--gch-muted);font-size:.8rem;margin-left:.4rem}
.gch-comment-form{display:flex;gap:.5rem;margin-top:.5rem}.gch-comment-form input{flex:1;padding:.55rem .8rem;border:1px solid var(--gch-line);border-radius:999px;font:inherit}
.gch-pager{display:flex;justify-content:space-between}
/* Gallery */
.gch-masonry{columns:3 220px;column-gap:.6rem}.gch-masonry-item{display:block;break-inside:avoid;margin-bottom:.6rem;border-radius:6px;overflow:hidden}.gch-masonry-item img{width:100%;display:block}
.gch-lb{position:fixed;inset:0;background:rgba(10,14,22,.94);z-index:9999;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1rem}.gch-lb img{max-width:100%;max-height:85vh;border-radius:4px}.gch-lb p{color:#fff;margin:.75rem 0 0;text-align:center}.gch-lb-close{position:absolute;top:1rem;right:1rem;background:none;border:0;color:#fff;font-size:1.6rem;cursor:pointer}
/* Checkout */
.gch-checkout h2{margin-top:0}.gch-tiers-list{margin-bottom:1rem}.gch-tier{display:grid;grid-template-columns:auto 1fr auto;grid-template-areas:"r n p" "r m p";gap:0 .8rem;align-items:center;padding:.9rem 1rem;border:1px solid var(--gch-line);border-radius:8px;margin-bottom:.5rem;cursor:pointer}.gch-tier:has(input:checked){border-color:var(--gch-brand);box-shadow:0 0 0 2px var(--gch-brand) inset}.gch-tier.is-disabled{opacity:.5;cursor:not-allowed}.gch-tier input{grid-area:r}.gch-tier-name{grid-area:n;font-weight:600}.gch-tier-name small{font-weight:400;color:var(--gch-muted)}.gch-tier-meta{grid-area:m;font-size:.85rem;color:var(--gch-muted)}.gch-tier-price{grid-area:p;font-weight:700;font-size:1.1rem}
.gch-checkout label{display:block;margin-bottom:.9rem;font-weight:600}.gch-total{font-size:1.25rem;margin:.5rem 0 1rem;text-align:right}#gch-paypal-buttons{max-width:420px}
.gch-amounts{display:grid;grid-template-columns:repeat(auto-fit,minmax(90px,1fr));gap:.5rem;margin-bottom:1rem}.gch-amount{position:relative;text-align:center}.gch-amount input{position:absolute;opacity:0}.gch-amount span{display:block;padding:.8rem .4rem;border:1px solid var(--gch-line);border-radius:8px;font-weight:700;cursor:pointer}.gch-amount input:checked+span{border-color:var(--gch-brand);background:var(--gch-brand);color:#fff}
.gch-donors ul{list-style:none;padding:0}.gch-donors li{padding:.6rem 0;border-bottom:1px solid var(--gch-line)}
.gch-progress-bar{height:14px;background:#eef2f8;border-radius:999px;overflow:hidden}.gch-progress-bar span{display:block;height:100%;background:var(--gch-accent);border-radius:999px;transition:width .6s}.gch-progress-meta{margin-top:.4rem}
.gch-thanks h2{font-size:2.2rem;margin-top:0}
/* Community */
.gch-missing-grid,.gch-committee-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem;margin-bottom:1.5rem}.gch-missing strong{display:block;font-size:1.1rem}.gch-missing .gch-muted{display:block;margin-bottom:.6rem}.gch-tip-form{display:flex;gap:.4rem}.gch-tip-form input{flex:1;padding:.5rem .7rem;border:1px solid var(--gch-line);border-radius:6px;font:inherit;min-width:0}
.gch-committee h3{margin-top:0}.gch-poll-options{display:flex;flex-direction:column;gap:.5rem;margin:.75rem 0}.gch-poll-options .gch-btn{text-align:left}
.gch-poll-bar{position:relative;padding:.6rem .9rem;margin:.4rem 0;border-radius:6px;background:#eef2f8;overflow:hidden;display:flex;justify-content:space-between}.gch-poll-bar span{position:absolute;left:0;top:0;bottom:0;background:rgba(201,162,39,.35)}.gch-poll-bar em,.gch-poll-bar b{position:relative;font-style:normal}.gch-poll-bar.is-mine{outline:2px solid var(--gch-brand)}
.gch-memorial-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1.25rem}.gch-memorial-card{text-align:center;text-decoration:none;color:inherit}.gch-memorial-card img,.gch-memorial-placeholder{width:140px;height:140px;border-radius:50%;object-fit:cover;display:block;margin:0 auto .6rem;background:#dfe3e8;filter:grayscale(1)}.gch-memorial-card strong{display:block}.gch-memorial-card span{color:var(--gch-muted);font-size:.9rem}
/* Next event / countdown */
.gch-next-event h2{margin:0 0 .25rem}.gch-when{font-size:1.1rem;margin:0 0 1.25rem}.gch-countdown{display:flex;gap:1.5rem;margin:0 0 1.5rem}.gch-countdown div{text-align:center;font-size:.8rem;text-transform:lowercase;letter-spacing:.02em}.gch-countdown b{display:block;font-size:2.6rem;line-height:1;font-variant-numeric:tabular-nums}
.gch-attending p{margin:.25rem 0 0}

/* Profile: avatar upload + completeness + stats + modal */
.gch-avatar-upload{display:block;position:relative;width:160px;margin:0 auto 1rem;cursor:pointer;border-radius:50%}.gch-avatar-upload .gch-avatar{width:160px;height:160px;font-size:3rem;display:flex}.gch-avatar-edit{position:absolute;left:0;right:0;bottom:0;background:rgba(17,75,47,.85);color:#fff;font-size:.8rem;text-align:center;padding:.35rem 0;border-radius:0 0 80px 80px;opacity:0;transition:opacity .15s}.gch-avatar-upload:hover .gch-avatar-edit,.gch-avatar-upload:focus-within .gch-avatar-edit{opacity:1}
.gch-file-label input[type=file]{margin-top:.4rem}#gch-photo-status{display:block;margin-top:.3rem;font-weight:400}
.gch-complete{margin:1rem 0}.gch-complete .gch-progress-bar{height:8px}.gch-complete p{margin:.4rem 0 0;font-size:.85rem}
.gch-profile-stats{display:grid;grid-template-columns:1fr 1fr 1fr;gap:.5rem;text-align:center}.gch-profile-stats>div b{display:block;font-size:1.5rem;line-height:1.1}.gch-profile-stats>div span{font-size:.8rem;color:var(--gch-muted)}.gch-profile-stats>p{grid-column:1/-1;text-align:left;margin:.5rem 0 0;font-size:.9rem}
.gch-form-actions{display:flex;gap:1rem;align-items:center}
.gch-person{cursor:pointer;transition:border-color .15s,transform .15s}.gch-person:hover,.gch-person:focus-visible{border-color:var(--gch-brand)}
.gch-profile-modal{align-items:center}.gch-profile-modal-card{position:relative;max-width:620px;width:100%;max-height:88vh;overflow:auto;margin:0}.gch-profile-modal .gch-lb-close{color:var(--gch-ink);top:.6rem;right:.6rem}
.gch-pm-head{display:flex;gap:1rem;align-items:center;margin-bottom:1rem}.gch-pm-head .gch-avatar{width:120px;height:120px;font-size:2rem}.gch-pm-head h2{margin:0 0 .2rem}.gch-pm-head p{margin:0}
.gch-pm-row{display:grid;grid-template-columns:90px 1fr;gap:.75rem;padding:.6rem 0;border-top:1px solid var(--gch-line)}.gch-pm-row dt{font-size:.8rem;font-weight:700;color:var(--gch-muted)}.gch-pm-row dd{margin:0}
