*,:after,:before{box-sizing:border-box;margin:0;padding:0}:root{--color-bg:#f8fafc;--color-surface:#fff;--color-text:#0f172a;--color-text-muted:#64748b;--color-primary:#3b82f6;--color-primary-hover:#2563eb;--color-primary-subtle:#eff6ff;--color-danger:#ef4444;--color-danger-hover:#dc2626;--color-border:#e2e8f0;--color-success-bg:#f0fdf4;--color-success-text:#16a34a;--color-error-bg:#fef2f2;--color-error-text:#dc2626;--radius-sm:6px;--radius:10px;--radius-lg:16px;--shadow-sm:0 1px 2px rgba(0,0,0,.05);--shadow:0 1px 3px rgba(0,0,0,.08),0 1px 2px rgba(0,0,0,.04);--shadow-md:0 4px 6px -1px rgba(0,0,0,.08),0 2px 4px -2px rgba(0,0,0,.05);--shadow-lg:0 10px 15px -3px rgba(0,0,0,.08),0 4px 6px -4px rgba(0,0,0,.04);--transition:0.2s cubic-bezier(0.4,0,0.2,1);--container-max:1440px;--nav-height:3.5rem}body{background:var(--color-bg);color:var(--color-text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Inter,Roboto,sans-serif;line-height:1.6;-webkit-font-smoothing:antialiased}.main-nav{backdrop-filter:blur(12px);background:var(--color-surface);background:hsla(0,0%,100%,.9);border-bottom:1px solid var(--color-border);position:sticky;top:0;z-index:100}.nav-container{align-items:center;display:flex;gap:.5rem;margin:0 auto;max-width:var(--container-max);min-height:var(--nav-height);padding:0 1.25rem}.nav-brand{font-weight:700;margin-right:auto;text-decoration:none;white-space:nowrap}.nav-brand,.nav-toggle{color:var(--color-text);font-size:1.1rem}.nav-toggle{background:none;border:1px solid var(--color-border);border-radius:var(--radius-sm);cursor:pointer;display:none;padding:.4rem .6rem}.nav-links{align-items:center;display:flex;gap:.15rem;list-style:none}.nav-links a{border-radius:var(--radius-sm);color:var(--color-text-muted);display:block;font-size:.875rem;font-weight:500;padding:.4rem .75rem;text-decoration:none;transition:background var(--transition),color var(--transition);white-space:nowrap}.nav-links a:hover{background:var(--color-bg);color:var(--color-text)}.nav-links a.active{background:var(--color-primary);color:#fff}.nav-separator{background:var(--color-border);height:1.25rem;margin:0 .4rem;width:1px}.container{margin:0 auto;max-width:var(--container-max);padding:2rem 1.25rem}.flash{align-items:center;border-radius:var(--radius-sm);display:flex;font-size:.875rem;font-weight:500;gap:.5rem;margin-bottom:1.25rem;padding:.75rem 1rem}.flash-success{background:var(--color-success-bg);border:1px solid #bbf7d0;color:var(--color-success-text)}.flash-error{background:var(--color-error-bg);border:1px solid #fecaca;color:var(--color-error-text)}.gallery-header{align-items:baseline;display:flex;gap:.75rem;margin-bottom:2rem}.gallery-header h1{font-size:1.75rem;font-weight:800;letter-spacing:-.02em}.photo-count{color:var(--color-text-muted);font-size:.875rem;font-weight:500}.day-group{margin-bottom:2.5rem}.day-header{border-bottom:2px solid var(--color-border);color:var(--color-text-muted);font-size:.9rem;font-weight:700;letter-spacing:.04em;margin-bottom:.75rem;padding-bottom:.6rem;text-transform:uppercase}.photo-grid{display:grid;gap:.75rem;grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}.photo-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);box-shadow:var(--shadow-sm);overflow:hidden;transition:transform var(--transition),box-shadow var(--transition)}.photo-card:hover{box-shadow:var(--shadow-md);transform:translateY(-3px)}.photo-link{aspect-ratio:4/3;display:block;overflow:hidden}.photo-link img{height:100%;object-fit:cover;transition:transform .4s cubic-bezier(.4,0,.2,1);width:100%}.photo-card:hover .photo-link img{transform:scale(1.06)}.photo-info{align-items:center;display:flex;gap:.25rem;justify-content:space-between;min-height:2rem;padding:.5rem .6rem}.photo-tags{display:flex;flex-wrap:wrap;gap:.3rem}.tag-badge{background:var(--color-primary-subtle);border-radius:999px;color:var(--color-primary);display:inline-block;font-size:.72rem;font-weight:600;padding:.15rem .55rem;text-decoration:none;transition:background var(--transition),color var(--transition)}.tag-badge:hover{background:var(--color-primary);color:#fff}.photo-edit-link{flex-shrink:0;font-size:.8rem;opacity:0;text-decoration:none;transition:opacity var(--transition)}.photo-card:hover .photo-edit-link{opacity:.7}.photo-edit-link:hover{opacity:1!important}.gallery-loader{align-items:center;color:var(--color-text-muted);display:flex;flex-direction:column;gap:.75rem;padding:2.5rem}.spinner{animation:spin .7s linear infinite;border:3px solid var(--color-border);border-radius:50%;border-top-color:var(--color-primary);height:28px;width:28px}@keyframes spin{to{transform:rotate(1turn)}}.scroll-sentinel{height:1px}.lightbox{background:rgba(0,0,0,.94);inset:0;position:fixed;z-index:1000}.lightbox,.lightbox-content{align-items:center;display:flex;justify-content:center}.lightbox-content{max-height:90vh;max-width:95vw}.lightbox-content img{border-radius:var(--radius);max-height:90vh;max-width:100%;object-fit:contain}.lightbox-close,.lightbox-next,.lightbox-prev{background:none;border:none;color:#fff;cursor:pointer;font-size:2rem;opacity:.6;padding:1rem;position:absolute;transition:opacity var(--transition),transform var(--transition);z-index:1001}.lightbox-close:hover,.lightbox-next:hover,.lightbox-prev:hover{opacity:1}.lightbox-prev:hover{transform:translateY(-50%) translateX(-2px)}.lightbox-next:hover{transform:translateY(-50%) translateX(2px)}.lightbox-close{font-size:2.5rem;right:.5rem;top:.5rem}.lightbox-prev{left:.5rem}.lightbox-next,.lightbox-prev{top:50%;transform:translateY(-50%)}.lightbox-next{right:.5rem}.lightbox-counter{bottom:1.5rem;color:hsla(0,0%,100%,.6);font-size:.85rem;font-weight:500;left:50%;position:absolute;transform:translateX(-50%)}.form-group{margin-bottom:1.25rem}.form-group label,.form-group>legend{color:var(--color-text);display:block;font-size:.875rem;font-weight:600;margin-bottom:.4rem}.form-control{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:.95rem;padding:.6rem .85rem;transition:border-color var(--transition),box-shadow var(--transition);width:100%}.form-control:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px rgba(59,130,246,.12);outline:none}.form-help{color:var(--color-text-muted);display:block;font-size:.8rem;margin-top:.3rem}.checkbox-group{display:flex;flex-wrap:wrap;gap:.5rem}.checkbox-group label,.tag-checkbox{align-items:center;background:var(--color-surface);border:1px solid var(--color-border);border-radius:999px;cursor:pointer;display:inline-flex;font-size:.875rem;font-weight:400;gap:.35rem;padding:.35rem .7rem;transition:all var(--transition);user-select:none}.checkbox-group label:hover,.tag-checkbox:hover{background:var(--color-primary-subtle);border-color:var(--color-primary)}.checkbox-group label:has(input:checked),.tag-checkbox:has(input:checked){background:var(--color-primary-subtle);border-color:var(--color-primary);color:var(--color-primary);font-weight:600}.checkbox-group input[type=checkbox]{height:0;opacity:0;pointer-events:none;position:absolute;width:0}.btn{align-items:center;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);color:var(--color-text);cursor:pointer;display:inline-flex;font-size:.875rem;font-weight:500;gap:.4rem;justify-content:center;padding:.55rem 1.1rem;text-decoration:none;transition:all var(--transition);white-space:nowrap}.btn:hover{background:var(--color-bg);border-color:#cbd5e1}.btn-primary{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.btn-primary:hover{background:var(--color-primary-hover);border-color:var(--color-primary-hover)}.btn-danger{background:var(--color-danger);border-color:var(--color-danger);color:#fff}.btn-danger:hover{background:var(--color-danger-hover);border-color:var(--color-danger-hover)}.btn-small{font-size:.8rem;padding:.3rem .65rem}.table{background:var(--color-surface);border:1px solid var(--color-border);border-collapse:collapse;border-radius:var(--radius);overflow:hidden;width:100%}.table td,.table th{border-bottom:1px solid var(--color-border);padding:.75rem 1rem;text-align:left}.table th{background:var(--color-bg);color:var(--color-text-muted);font-size:.75rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.table td{font-size:.9rem}.table .actions{white-space:nowrap}.table .actions .btn{margin-right:.25rem}.page-header{align-items:center;display:flex;justify-content:space-between;margin-bottom:1.75rem}.page-header h1{font-size:1.5rem;font-weight:800;letter-spacing:-.02em}.empty-state{color:var(--color-text-muted);padding:4rem 1rem;text-align:center}.empty-state p{font-size:1rem;margin-bottom:1rem}.empty-state .btn{margin-top:.5rem}.upload-dropzone{background:var(--color-surface);border:2px dashed var(--color-border);border-radius:var(--radius-lg);margin-bottom:1.5rem;padding:3rem 1.5rem;text-align:center;transition:border-color var(--transition),background var(--transition)}.upload-dropzone:hover{background:var(--color-primary-subtle);border-color:var(--color-primary)}.upload-dropzone p{font-size:1.1rem;font-weight:500;margin-bottom:.75rem}.upload-dropzone .form-help{display:block;margin-top:.75rem}.upload-preview{display:flex;flex-direction:column;gap:.75rem;margin-bottom:1.5rem}.upload-card{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);display:flex;gap:1.25rem;padding:1rem;position:relative;transition:border-color var(--transition),opacity var(--transition)}.upload-card-image{border-radius:var(--radius-sm);flex:0 0 140px;height:140px;overflow:hidden}.upload-card-image img{height:100%;object-fit:cover;width:100%}.upload-card-meta{flex:1;min-width:0}.upload-card-name{color:var(--color-text-muted);font-size:.85rem;font-weight:600;margin-bottom:.5rem;word-break:break-all}.upload-card-done{border-color:var(--color-success-text);opacity:.5}.upload-card-done:after{align-items:center;background:var(--color-success-text);border-radius:50%;color:#fff;content:"✓";display:flex;font-size:.85rem;font-weight:700;height:1.6rem;justify-content:center;position:absolute;right:.75rem;top:.75rem;width:1.6rem}.upload-card-error{background:var(--color-error-bg);border-color:var(--color-danger)}.upload-actions{display:flex;gap:.5rem;margin-bottom:2rem}.bulk-header{display:flex;justify-content:flex-end;margin-bottom:1rem}.bulk-toolbar{background:var(--color-surface);border-bottom:1px solid var(--color-border);box-shadow:var(--shadow-sm);margin:-.5rem -1.25rem 1.5rem;padding:.75rem 1rem;position:sticky;top:var(--nav-height);z-index:90}.bulk-toolbar-inner{align-items:center;display:flex;flex-wrap:wrap;gap:.6rem;margin:0 auto;max-width:var(--container-max)}.bulk-count{color:var(--color-text-muted);font-size:.875rem;margin-right:.5rem}.bulk-actions{border:1px solid var(--color-border);border-radius:var(--radius-sm);display:flex;gap:.25rem;padding:.15rem}.bulk-actions .btn{background:transparent;border:none;border-radius:4px;padding:.3rem .6rem}.bulk-actions .btn.active{background:var(--color-primary);color:#fff}.bulk-tag-select{font-size:.85rem;min-width:150px;padding:.35rem .6rem;width:auto}.bulk-mode .photo-card{cursor:pointer;position:relative}.bulk-mode .photo-card:before{background:rgba(0,0,0,.3);border:2px solid hsla(0,0%,100%,.8);border-radius:50%;content:"";height:1.5rem;left:.5rem;position:absolute;top:.5rem;transition:all var(--transition);width:1.5rem;z-index:5}.bulk-mode .photo-card.selected:before{align-items:center;background:var(--color-primary);border-color:var(--color-primary);color:#fff;content:"✓";display:flex;font-size:.8rem;font-weight:700;justify-content:center}.bulk-mode .photo-card.selected{outline:3px solid var(--color-primary);outline-offset:-3px}.bulk-mode .photo-edit-link,.bulk-mode .photo-link,.bulk-mode .tag-badge{pointer-events:none}.photo-edit-layout{align-items:start;display:grid;gap:2.5rem;grid-template-columns:1fr 1fr;max-width:1000px}.photo-edit-preview img{border-radius:var(--radius);box-shadow:var(--shadow-md);width:100%}.photo-edit-form{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);padding:1.75rem}.photo-edit-form hr{border:none;border-top:1px solid var(--color-border);margin:1.75rem 0}.tag-form{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius);max-width:480px;padding:1.75rem}.form-actions{display:flex;gap:.5rem;margin-top:.5rem}.is-invalid{border-color:var(--color-danger)!important;box-shadow:0 0 0 3px rgba(239,68,68,.1)!important}.login-container{background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);margin:6rem auto 2rem;max-width:380px;padding:2.5rem 2rem;text-align:center}.login-container h1{font-size:1.5rem;font-weight:800;margin-bottom:.5rem}.login-info{color:var(--color-text-muted);font-size:.875rem;margin-bottom:2rem}.login-form .form-group{margin-bottom:1.5rem;text-align:left}.login-form label{display:block;font-size:.875rem;font-weight:600;margin-bottom:.4rem}.login-form .form-input{border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:1rem;padding:.7rem 1rem;transition:border-color var(--transition),box-shadow var(--transition);width:100%}.login-form .form-input:focus{border-color:var(--color-primary);box-shadow:0 0 0 3px rgba(59,130,246,.12);outline:none}.login-form .btn-primary{background:var(--color-primary);border:none;border-radius:var(--radius-sm);color:#fff;cursor:pointer;font-size:1rem;font-weight:600;padding:.75rem;transition:background var(--transition);width:100%}.login-form .btn-primary:hover{background:var(--color-primary-hover)}@media (max-width:640px){:root{--nav-height:3.25rem}.nav-toggle{display:block}.nav-links{display:none;flex-direction:column;gap:.1rem;padding:.5rem 0 .75rem;width:100%}.nav-links.open{display:flex}.nav-separator{display:none}.nav-links a{font-size:.9rem;padding:.6rem .75rem;width:100%}.nav-container{flex-wrap:wrap}.container{padding:1.25rem 1rem}.gallery-header{flex-direction:column;gap:.25rem;margin-bottom:1.25rem}.gallery-header h1{font-size:1.3rem}.photo-grid{gap:.5rem;grid-template-columns:repeat(2,1fr)}.photo-card{border-radius:var(--radius-sm)}.photo-info{padding:.3rem .4rem}.tag-badge{font-size:.65rem;padding:.1rem .4rem}.photo-edit-link{font-size:.7rem}.day-header{font-size:.8rem}.upload-card{flex-direction:column;gap:.75rem}.upload-card-image{flex:0 0 auto;height:180px;width:100%}.photo-edit-layout{gap:1.5rem;grid-template-columns:1fr}.photo-edit-form{padding:1.25rem}.page-header{align-items:flex-start;flex-direction:column;gap:.75rem}.lightbox-next,.lightbox-prev{font-size:1.5rem;padding:.75rem}.lightbox-close{font-size:2rem}.login-container{margin:3rem 1rem;padding:1.75rem 1.25rem}.table{font-size:.85rem}.table td,.table th{padding:.6rem .7rem}.tag-form{padding:1.25rem}.bulk-toolbar{margin:-.5rem -1rem 1rem;padding:.6rem .75rem}.bulk-toolbar-inner{gap:.4rem}.bulk-tag-select{min-width:120px}.bulk-count{font-size:.8rem}}@media (min-width:641px) and (max-width:1024px){.photo-grid{grid-template-columns:repeat(auto-fill,minmax(180px,1fr))}.photo-edit-layout{gap:1.75rem;grid-template-columns:1fr 1.2fr}}@media (min-width:1025px) and (max-width:1399px){.photo-grid{grid-template-columns:repeat(auto-fill,minmax(200px,1fr))}}@media (min-width:1400px){.photo-grid{grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}}