:root{color-scheme:light;--ink:#202126;--muted:#777a82;--line:#e7e7eb;--paper:#fff;--surface:#f6f7f9;--accent:#ed633e;--accent-dark:#c53f1d;--accent-pale:#fff0ea;--radius:12px;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;color:var(--ink);background:var(--paper);font-synthesis:none;font-size:16px;line-height:1.6}
*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}button,a{touch-action:manipulation}button{cursor:pointer}button:disabled{cursor:not-allowed;opacity:.48}a{color:inherit;text-decoration:none}button,input,select,textarea{border-radius:8px}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:3px solid #ed633e70;outline-offset:4px}h1,h2,h3,p{margin:0}img{max-width:100%;display:block}input,textarea,select{color:var(--ink);background:#fff;border:1px solid var(--line);padding:10px 12px}select{max-width:100%;padding-right:30px}label{display:block;font-size:.875rem;font-weight:600;margin-bottom:8px}input,textarea{width:100%}textarea{resize:vertical}small{font-size:.8125rem}[hidden]{display:none!important}.icon{display:inline-flex;flex:none;align-items:center;justify-content:center}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.muted{color:var(--muted)}.site-header{height:88px;max-width:1600px;margin:auto;padding:0 5%;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;gap:20px}.brand{display:flex;gap:11px;align-items:center;font-size:1.0625rem;font-weight:700;letter-spacing:.08em;line-height:1.3}.brand small{display:block;font-size:.625rem;letter-spacing:.17em;color:var(--muted);margin-top:4px}.site-header nav{display:flex;align-items:center;gap:24px}.quiet-link{font-size:.875rem;color:var(--muted);transition:color .2s}.quiet-link:hover{color:var(--ink)}.button{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:42px;padding:9px 17px;border:1px solid var(--line);background:#fff;color:var(--ink);font-size:.875rem;font-weight:550;white-space:nowrap;transition:background .2s,border-color .2s}.button:hover{background:#f4f4f6;border-color:#cfd0d5}.button.primary{background:var(--accent);border-color:var(--accent);color:white}.button.primary:hover{background:var(--accent-dark);border-color:var(--accent-dark)}.button.subtle{background:transparent;border-color:transparent}.button.subtle:hover{background:var(--surface)}.button.small{min-height:34px;padding:5px 12px}.button.danger{background:#bd3737;border-color:#bd3737;color:#fff}.text-button{padding:8px 0;border:0;background:transparent;color:var(--muted);font-size:.875rem}.text-button:hover{color:var(--accent-dark)}.full-width{width:100%}.icon-button{display:flex;align-items:center;justify-content:center;border:0;background:transparent;color:inherit;width:40px;height:40px;flex:none;font-size:1.7rem}.eyebrow{display:flex;align-items:center;gap:12px;color:var(--muted);font-size:.75rem;letter-spacing:.15em;font-weight:650;line-height:1.5}.live-badge{display:inline-flex;gap:6px;align-items:center;padding:4px 8px;border-radius:5px;background:var(--surface);color:var(--muted);font-size:.75rem;letter-spacing:.02em}.live-badge.connected{background:var(--accent-pale);color:var(--accent-dark)}.live-badge.connected::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--accent)}
.gallery-shell{max-width:1600px;margin:auto;padding:44px 5% 0}.album-heading{display:flex;justify-content:space-between;align-items:center;gap:32px;margin-bottom:40px}.album-heading h1{font-family:"Songti SC","Noto Serif SC",serif;font-size:2.9rem;font-weight:650;letter-spacing:.02em;line-height:1.3;margin:14px 0 12px;overflow-wrap:anywhere}.album-heading .muted{font-size:.9375rem;max-width:700px;white-space:pre-line}.album-meta{display:flex;align-items:flex-end;flex-direction:column;gap:12px;flex:none}.photo-total{display:flex;align-items:baseline;gap:10px}.photo-total strong{font-weight:450;font-size:2.5rem;letter-spacing:-.06em;font-variant-numeric:tabular-nums;line-height:1.25}.photo-total span{font-size:.8125rem;color:var(--muted)}.gallery-toolbar{position:sticky;top:0;background:#ffffffed;backdrop-filter:blur(15px);z-index:5;display:flex;justify-content:space-between;align-items:center;gap:12px;padding:16px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}.toolbar-left,.toolbar-right{display:flex;align-items:center;gap:14px;min-width:0}.toolbar-left select:first-child{max-width:240px}.gallery-toolbar select{border:0;background:transparent;font-size:.875rem;padding-left:0;min-height:42px}.toolbar-divider{height:20px;width:1px;background:var(--line)}.gallery-content{min-height:330px}.date-group{padding-top:28px}.date-heading{display:flex;align-items:baseline;gap:12px;margin-bottom:18px}.date-heading h2{font-size:1rem;font-weight:600}.date-year{font-size:.75rem;color:#92959d}.photo-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}.photo-card{border-radius:10px;overflow:hidden;background:var(--surface);position:relative;aspect-ratio:4/3;isolation:isolate}.photo-open{display:block;width:100%;height:100%;border:0;border-radius:0;padding:0;background:transparent}.photo-open img{height:100%;width:100%;object-fit:cover;transition:transform .4s}.photo-open:hover img{transform:scale(1.035)}.photo-caption{position:absolute;bottom:0;left:0;right:0;display:flex;justify-content:space-between;gap:8px;color:#fff;background:linear-gradient(transparent,#0009);padding:30px 14px 11px;font-size:.75rem;pointer-events:none;opacity:0;transition:opacity .2s}.photo-caption span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.photo-caption time{flex:none}.photo-card:hover .photo-caption,.photo-card:focus-within .photo-caption{opacity:1}.photo-select{position:absolute;top:12px;right:12px;width:30px;height:30px;border-radius:50%;border:1.5px solid #fff;background:#0004;color:transparent;display:flex;align-items:center;justify-content:center;padding:0;opacity:0;box-shadow:0 2px 7px #0002}.photo-card:hover .photo-select,.photo-card:focus-within .photo-select,.photo-card.selecting .photo-select,.photo-card.selected .photo-select{opacity:1}.photo-card.selected{outline:3px solid var(--accent);outline-offset:-3px}.photo-card.selected .photo-select{background:var(--accent);color:#fff;border-color:var(--accent)}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;min-height:340px;padding:54px 24px;gap:10px}.empty-state>.icon{color:#b1b4bc;margin-bottom:6px}.empty-state h2{font-size:1.125rem;font-weight:550}.empty-state p{font-size:.875rem;color:var(--muted);max-width:400px}.empty-state .button{margin-top:10px}.loading-state{min-height:300px;display:flex;align-items:center;justify-content:center;color:var(--muted)}.load-more-wrap{display:flex;justify-content:center;margin:28px 0}.gallery-footer{margin-top:36px;border-top:1px solid var(--line);padding:24px 0;display:flex;justify-content:space-between;gap:12px;font-size:.8125rem;color:var(--muted)}.new-photos{text-align:center;padding:18px 0 0}.new-photos .button{color:var(--accent-dark);background:var(--accent-pale);border-color:#f8d3c7}.selection-bar{position:fixed;z-index:10;bottom:24px;left:50%;transform:translateX(-50%);width:min(560px,calc(100% - 32px));display:flex;align-items:center;justify-content:space-between;gap:20px;border:1px solid var(--line);border-radius:14px;background:#fff;padding:14px 18px;box-shadow:0 10px 45px #171b2420}.selection-bar>div{display:flex;align-items:center;gap:20px;font-size:.875rem}.has-selection{padding-bottom:100px}.toast{position:fixed;z-index:1000;bottom:110px;left:50%;transform:translateX(-50%);max-width:calc(100% - 32px);background:#22252e;color:white;border-radius:10px;padding:12px 20px;font-size:.875rem;box-shadow:0 5px 25px #0002;overflow-wrap:anywhere}.toast.is-error{background:#922f29}
.lightbox{background:#121419;color:#fff;width:100vw;max-width:100vw;height:100dvh;max-height:100dvh;margin:0;padding:0;border:0;border-radius:0}.lightbox[open]{display:flex;flex-direction:column}.lightbox::backdrop{background:#101216}.lightbox-top{display:flex;justify-content:space-between;align-items:center;gap:20px;padding:14px 28px;color:#aeb2bd;font-size:.875rem;flex:none}.lightbox-stage{min-height:0;flex:1;display:flex;align-items:center;justify-content:space-between;gap:14px;padding:0 24px}.lightbox-stage img{max-width:calc(100% - 108px);max-height:100%;width:auto;height:auto;object-fit:contain;min-height:0}.photo-arrow{background:#ffffff0d;border-radius:50%;height:46px;width:46px}.lightbox-bottom{padding:24px 32px;display:flex;align-items:center;justify-content:space-between;gap:24px;flex:none}.lightbox-bottom>div:first-child{min-width:0}.lightbox-bottom strong{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:.9375rem}.lightbox-bottom p{font-size:.8125rem;color:#999eaa;margin-top:4px}.lightbox-actions{display:flex;gap:10px;flex:none}.lightbox-actions .button:not(.primary){background:#25282f;border-color:#383c46;color:#fff}
.admin-body{background:var(--surface)}.admin-body .site-header{max-width:none;background:white;padding:0 40px}.admin-shell{display:grid;grid-template-columns:250px minmax(0,1fr);min-height:calc(100dvh - 88px)}.admin-sidebar{background:#fff;border-right:1px solid var(--line);padding:34px 24px;display:flex;flex-direction:column;align-items:stretch;gap:12px}.admin-sidebar h1{font-size:1.375rem;letter-spacing:-.03em;line-height:1.4;margin:0 0 28px}.admin-sidebar label{margin-bottom:0;color:var(--muted);font-weight:400}.admin-sidebar select{width:100%;font-size:.875rem}.sidebar-note{margin-top:26px;padding-top:24px;border-top:1px solid var(--line)}.sidebar-note strong{font-size:.875rem;font-weight:550}.sidebar-note p{font-size:.8125rem;line-height:1.9;color:var(--muted);margin-top:8px}.sidebar-bottom{margin-top:auto;padding-top:44px;font-size:.75rem;color:#90939b;line-height:1.8}.mini-mark{display:block;width:28px;height:3px;background:var(--accent);margin-bottom:16px}.admin-main{padding:36px 5% 60px;max-width:1400px;width:100%;margin:auto}.admin-heading{display:flex;justify-content:space-between;align-items:center;gap:24px;margin-bottom:28px}.admin-heading h2{font-size:1.7rem;font-weight:600;margin-top:7px;overflow-wrap:anywhere}.heading-actions{display:flex;align-items:center;gap:8px;flex:none}.stats-row{display:grid;grid-template-columns:1fr 1fr 1fr;background:#fff;border:1px solid var(--line);border-radius:var(--radius);margin-bottom:24px;padding:23px 0}.stats-row>div{padding:0 26px;display:flex;flex-direction:column;gap:8px}.stats-row>div+div{border-left:1px solid var(--line)}.stats-row span{font-size:.8125rem;color:var(--muted)}.stats-row strong{font-size:1.5rem;font-weight:550;font-variant-numeric:tabular-nums;line-height:1.35}.stats-row small{font-size:.875rem;color:var(--muted);font-weight:400}.stats-row>div:last-child strong{font-size:1rem;margin-top:5px}.drop-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;background:#fff;border:1.5px dashed #cbd0d8;border-radius:var(--radius);padding:36px 20px 28px;transition:background .15s,border-color .15s;text-align:center;min-height:304px}.drop-zone.drag-over{background:var(--accent-pale);border-color:var(--accent)}.upload-symbol{display:flex;align-items:center;justify-content:center;color:var(--accent);background:var(--accent-pale);width:62px;height:62px;border-radius:18px;margin-bottom:16px}.drop-zone h3{font-size:1.25rem;font-weight:550}.drop-zone p{font-size:.875rem;color:var(--muted);margin:6px 0 20px}.drop-zone small{color:#92959d;margin-top:17px;font-size:.75rem}.drop-zone .button{min-width:135px}.section-heading{display:flex;justify-content:space-between;align-items:center;gap:16px;margin-bottom:16px}.section-heading h3{font-size:1rem;font-weight:550;display:flex;align-items:center;gap:9px}.section-heading>div{display:flex;gap:20px}.published-section{margin-top:32px}.count-pill{background:#e9eaee;color:var(--muted);padding:1px 7px;border-radius:5px;font-size:.75rem}.admin-photo-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}.admin-photo{border:1px solid var(--line);background:#fff;border-radius:10px;overflow:hidden;position:relative}.admin-photo-preview{aspect-ratio:4/3;display:block;overflow:hidden;background:#eceef2}.admin-photo img{height:100%;width:100%;object-fit:cover}.admin-photo-details{padding:12px 14px}.admin-photo-details strong{display:block;font-size:.8125rem;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.admin-photo-details span{font-size:.75rem;color:var(--muted)}.remove-photo{position:absolute;top:8px;right:8px;background:#ffffffee;border:1px solid #ffffff66;border-radius:7px;width:34px;height:34px;opacity:0}.admin-photo:hover .remove-photo,.admin-photo:focus-within .remove-photo{opacity:1}.remove-photo:hover{color:#bf3c31}.published-section .empty-state{background:#fff;border:1px solid var(--line);border-radius:var(--radius);min-height:240px}.queue-panel{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:20px;margin-top:24px}.queue-list{max-height:360px;overflow:auto}.queue-item{display:flex;gap:14px;align-items:center;padding:12px 0;border-top:1px solid var(--line)}.queue-item img{height:46px;width:56px;object-fit:cover;border-radius:5px;background:var(--surface)}.queue-info{flex:1;min-width:0}.queue-info strong{display:block;font-size:.8125rem;font-weight:500;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.queue-status{font-size:.75rem;color:var(--muted)}.queue-info progress{width:100%;height:5px;display:block;margin-top:7px;accent-color:var(--accent)}.queue-error .queue-status{color:#bd3737}.queue-done .queue-status{color:#377760}.login-panel{background:#fff;border:1px solid var(--line);max-width:440px;margin:70px auto;padding:36px;border-radius:16px;box-shadow:0 12px 60px #20212606}.login-panel .login-mark{color:var(--accent);font-size:3rem;line-height:1;margin-bottom:24px}.login-panel h1{font-size:1.65rem;line-height:1.5;margin:10px 0}.login-panel .muted{font-size:.875rem;line-height:1.8}.login-panel form{margin:28px 0 22px}.login-panel .button{width:100%}.form-error{color:#b82f2f;font-size:.875rem;min-height:24px;margin:8px 0}.form-dialog{width:min(480px,calc(100% - 32px));border:1px solid var(--line);border-radius:16px;padding:28px;box-shadow:0 20px 90px #0002}.form-dialog::backdrop{background:#14182080;backdrop-filter:blur(3px)}.form-dialog h2{font-size:1.25rem;font-weight:600}.form-dialog label:not(:first-child){margin-top:18px}.form-dialog .muted{font-size:.9375rem;margin:14px 0;line-height:1.8}.dialog-actions{display:flex;justify-content:flex-end;gap:12px;margin-top:24px}.file-name{font-size:.875rem;overflow-wrap:anywhere;background:var(--surface);border-radius:8px;padding:12px}
@media(min-width:1600px){.photo-grid{grid-template-columns:repeat(5,minmax(0,1fr))}}@media(max-width:1100px){.photo-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.admin-shell{grid-template-columns:220px minmax(0,1fr)}.admin-main{padding:28px}.admin-heading{align-items:flex-start;flex-direction:column;gap:16px}.stats-row>div{padding:0 18px}.admin-photo-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.stats-row strong{font-size:1.2rem}}@media(max-width:760px){.site-header{height:74px;padding:0 6%}.gallery-shell{padding:30px 6% 0}.album-heading{align-items:flex-start;margin-bottom:26px;gap:16px}.album-heading h1{font-size:2.1rem;margin:12px 0}.album-heading .muted{font-size:.875rem}.album-meta{padding-top:2px;gap:18px}.photo-total{align-items:flex-end;flex-direction:column;gap:0}.photo-total strong{font-size:2rem}.photo-total span{font-size:.75rem}.album-meta .button{font-size:.75rem;padding:6px 0;min-height:30px}.gallery-toolbar{flex-wrap:wrap;gap:7px;padding:10px 0}.toolbar-left{width:100%;gap:10px}.toolbar-left select:first-child{max-width:45%;flex:1}.toolbar-right{width:100%;justify-content:space-between;gap:10px}.toolbar-right .button{padding:7px 14px;min-height:38px}.gallery-toolbar select{min-height:36px;padding-top:4px;padding-bottom:4px}.photo-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.photo-card{border-radius:6px;aspect-ratio:3/4}.photo-select{opacity:1;width:29px;height:29px;top:9px;right:9px}.photo-caption{opacity:1;padding:22px 8px 7px;font-size:.75rem}.photo-caption span{display:none}.date-heading{margin-bottom:12px}.date-group{padding-top:23px}.gallery-footer{flex-direction:column;gap:4px;font-size:.75rem}.selection-bar{bottom:12px;padding:12px;gap:12px}.selection-bar>div{gap:12px}.selection-bar .button{padding:8px 12px}.lightbox-top{padding:12px 16px}.lightbox-stage{padding:0;gap:0;position:relative;justify-content:center}.lightbox-stage img{max-width:100%}.photo-arrow{position:absolute;z-index:1;top:50%;width:34px;height:44px;background:#0005}.photo-arrow:first-child{left:6px}.photo-arrow:last-child{right:6px}.lightbox-bottom{padding:18px;align-items:stretch;flex-direction:column;gap:14px}.lightbox-actions{justify-content:flex-end}.lightbox-bottom p{line-height:1.7}.admin-body .site-header{padding:0 20px;gap:12px}.site-header nav{gap:16px}.admin-shell{display:block}.admin-sidebar{padding:24px 20px;border-right:0;border-bottom:1px solid var(--line);display:grid;grid-template-columns:1fr auto;gap:12px}.admin-sidebar>.eyebrow{display:none}.admin-sidebar h1{grid-column:1/-1;margin:0 0 2px;font-size:1.25rem}.admin-sidebar label{display:none}.sidebar-note,.sidebar-bottom{display:none}.admin-main{padding:24px 20px 40px}.admin-heading{gap:15px}.admin-heading h2{font-size:1.5rem}.heading-actions{width:100%;justify-content:flex-end}.stats-row{padding:18px 0}.stats-row>div{padding:0 12px}.stats-row>div:last-child strong{font-size:.8125rem}.stats-row span{font-size:.75rem}.stats-row strong{font-size:1.15rem}.drop-zone{padding:26px 16px;min-height:280px}.drop-zone p{font-size:.8125rem}.admin-photo-grid{gap:10px}.admin-photo-details{padding:10px}.remove-photo{opacity:1}.queue-panel{padding:16px}.queue-panel .section-heading{align-items:flex-start;flex-direction:column;gap:8px}.login-panel{margin:36px 20px;padding:28px;max-width:none}.login-panel h1{font-size:1.5rem}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{transition:none!important;scroll-behavior:auto!important}}@media(min-width:761px) and (pointer:coarse){.photo-select,.remove-photo{opacity:1}}
