:root{--color-brand: #2F5D50;--color-brand-deep: #21453B;--color-background: #F7F3E8;--color-surface: #FFFDF8;--color-text: #1F2A26;--color-muted: #5F6B65;--color-line: #E3DDCD;--color-danger: #A33A2C;--color-warn-bg: #FFF4DF;--color-warn-line: #E6C27A;--color-ink: #121816;--radius-lg: 20px;--radius: 14px;--shadow-sm: 0 1px 2px rgba(31, 42, 38, .06), 0 2px 8px rgba(31, 42, 38, .06);--shadow-md: 0 6px 24px rgba(31, 42, 38, .12);--font-serif: "Noto Serif KR", "Batang", "바탕", "Songti SC", serif;--font-sans: system-ui, -apple-system, "Segoe UI", "Malgun Gothic", "Apple SD Gothic Neo", sans-serif;--page-wide: 1240px;--page-narrow: 760px;--season-accent: #6E8B3D;--season-soft: #EEF3E2;--season-gradient: linear-gradient(160deg, #e4f0cf 0%, #9cc584 50%, #2f5d50 100%)}.season-spring{--season-accent: #5E7F2E;--season-soft: #EEF3E2;--season-gradient: linear-gradient(160deg, #e4f0cf 0%, #9cc584 50%, #2f5d50 100%)}.season-summer{--season-accent: #1F6E4B;--season-soft: #E2F0E7;--season-gradient: linear-gradient(160deg, #a8dbc0 0%, #3f8a64 50%, #1f4a3c 100%)}.season-autumn{--season-accent: #A0521C;--season-soft: #F6E8DA;--season-gradient: linear-gradient(160deg, #f0c48f 0%, #b86e34 50%, #5a3a24 100%)}.season-winter{--season-accent: #45657D;--season-soft: #E6EDF2;--season-gradient: linear-gradient(160deg, #eef3f7 0%, #9fb4c5 50%, #3d566b 100%)}*,*:before,*:after{box-sizing:border-box}html{-webkit-text-size-adjust:100%}body{margin:0;background:var(--color-background);color:var(--color-text);font-family:var(--font-sans);font-size:16px;line-height:1.6;word-break:keep-all;overflow-wrap:anywhere;-webkit-font-smoothing:antialiased}img{max-width:100%;display:block}a{color:var(--color-brand);text-underline-offset:2px}button,input,textarea{font:inherit;color:inherit}:focus-visible{outline:3px solid var(--season-accent);outline-offset:2px}.small{font-size:.85rem}.muted{color:var(--color-muted)}.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}.app{min-height:100vh;display:flex;flex-direction:column}main{flex:1}.page{width:100%;max-width:var(--page-narrow);margin:0 auto;padding:16px 16px 32px}.page--home,.page--memories{max-width:var(--page-wide)}.topbar{position:sticky;top:0;z-index:20;display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px max(16px,calc((100% - var(--page-wide)) / 2 + 16px));background:#f7f3e8eb;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid rgba(227,221,205,.8)}.topbar__brand{display:inline-flex;align-items:center;gap:8px;border:0;background:none;padding:6px 0;font-family:var(--font-serif);font-weight:700;font-size:1.08rem;color:var(--color-brand);cursor:pointer}.topbar__brand img{width:26px;height:26px}.topbar__links{display:flex;gap:2px}.topbar__link{border:0;background:none;padding:8px 14px;border-radius:999px;cursor:pointer;color:var(--color-text);font-weight:600}.topbar__link[aria-current=page]{background:var(--color-brand);color:#fff}.banners{max-width:var(--page-wide);margin:0 auto;width:100%;padding:0 16px}.banners:empty{display:none}.footer{padding:28px 16px 36px;color:var(--color-muted);font-size:.82rem;text-align:center}.footer p{margin:2px 0}.section{margin-top:36px}.section__head{display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap;margin-bottom:12px}.section__title{margin:0;font-family:var(--font-serif);font-size:1.25rem;color:var(--color-text)}.page-head{margin-bottom:12px}.page-title{margin:4px 0;font-family:var(--font-serif);font-size:1.6rem;line-height:1.35}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:44px;padding:8px 18px;border-radius:999px;border:1.5px solid var(--color-brand);background:var(--color-surface);color:var(--color-brand);font-weight:700;cursor:pointer;text-align:center}.btn:disabled{opacity:.45;cursor:not-allowed}.btn--primary{background:var(--color-brand);color:#fff}.btn--primary:not(:disabled):hover{background:var(--color-brand-deep)}.btn--ghost{border-color:var(--color-line);color:var(--color-text)}.btn--ghost-dark{border-color:#ffffff59;background:transparent;color:#fff}.btn--danger{background:var(--color-danger);border-color:var(--color-danger);color:#fff}.btn--danger-ghost{border-color:#e3b8b1;color:var(--color-danger)}.btn--small{min-height:38px;padding:4px 14px;font-size:.9rem}.btn--lg{min-height:54px;padding:10px 24px;font-size:1.05rem}.btn--on-photo{background:#ffffffeb;border-color:transparent;color:var(--color-brand)}.btn-row{display:flex;gap:8px;align-items:center;margin-top:8px}.btn-row--wrap{flex-wrap:wrap}.icon-btn{width:40px;height:40px;border-radius:50%;border:0;background:#1f2a260f;cursor:pointer;font-size:1rem;flex:none}.link-btn{border:0;background:none;padding:6px 0;color:var(--color-brand);font-weight:600;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.link-btn:disabled{opacity:.45;cursor:not-allowed}.chip-row{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0}.chip-row--sticky{position:sticky;top:57px;z-index:5;background:var(--color-background);padding:8px 0}.chip{min-height:36px;padding:4px 14px;border-radius:999px;border:1.5px solid var(--color-line);background:var(--color-surface);cursor:pointer;font-size:.92rem}.chip[aria-pressed=true]{background:var(--color-text);border-color:var(--color-text);color:#fff;font-weight:700}.chip--small{min-height:34px;padding:4px 12px;font-size:.86rem}.chip:disabled{opacity:.55}.season-chip,.status-chip{display:inline-block;padding:1px 10px;border-radius:999px;font-size:.78rem;font-weight:700}.season-chip{background:var(--season-soft);color:var(--season-accent)}.status-chip{background:#edeae0;color:var(--color-muted)}.status-chip--done{background:var(--color-brand);color:#fff}.status-chip--warn{background:var(--color-warn-bg);color:#8a5a00}.count-pill{margin:0;color:var(--color-muted)}.count-pill strong{color:var(--color-brand);font-size:1.2rem}.page--home{padding-top:14px}.intro__slogan{margin:0;font-size:.85rem;color:var(--season-accent);font-weight:700;letter-spacing:.02em}.intro__title{margin:2px 0 4px;font-family:var(--font-serif);font-size:1.65rem;line-height:1.3;letter-spacing:-.01em}.intro__meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;margin:0;font-size:.88rem;color:var(--color-muted)}.intro__names{border:0;background:none;padding:2px 0;color:var(--color-text);font-weight:700;cursor:pointer;text-decoration:underline;text-decoration-color:var(--color-line);text-underline-offset:3px}.intro__names-edit{font-weight:500;color:var(--color-muted)}.filters{margin:12px 0 4px;display:grid;gap:6px}.filter-row{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.filter-row__label{width:3em;font-size:.78rem;font-weight:700;color:var(--color-muted)}.gallery{margin-top:8px}.gallery__notice{margin:4px 0 10px;font-size:.8rem;color:var(--color-muted)}.gallery__grid{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:1fr;gap:18px}.gallery__item{min-width:0}.gallery__frame{position:relative;display:block;width:100%;aspect-ratio:4 / 3;padding:0;border:0;border-radius:var(--radius-lg);overflow:hidden;background:#ddd6c4;cursor:zoom-in;box-shadow:var(--shadow-sm)}.gallery__frame img{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.gallery__frame:hover img{transform:scale(1.03)}.gallery__zoom{position:absolute;right:12px;bottom:12px;padding:4px 12px;border-radius:999px;background:#1218169e;color:#fff;font-size:.8rem;font-weight:700;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.gallery__fallback{display:grid;place-items:center;width:100%;height:100%;color:#fff;font-size:.9rem}.gallery__message{padding:22px 18px;border-radius:var(--radius-lg);background:var(--color-surface);border:1px dashed var(--color-line);color:var(--color-muted);text-align:center}.gallery__message--error{color:#fff;border:0;text-shadow:0 1px 2px rgba(0,0,0,.35)}.gallery__message p{margin:0 0 6px}.gallery__pager{display:flex;justify-content:center;align-items:center;gap:12px;margin-top:18px}.gallery__page{min-width:3.5em;text-align:center;font-variant-numeric:tabular-nums;color:var(--color-muted);font-size:.9rem}.gallery__meta{margin:6px 0 0;text-align:center;font-size:.78rem;color:var(--color-muted);min-height:1.2em}.skeleton{background:linear-gradient(100deg,#e7e1d2 30%,#f1ecdf,#e7e1d2 70%);background-size:300% 100%;animation:shimmer 1.4s ease-in-out infinite}.skeleton--line{height:12px;width:60%;margin-top:8px;border-radius:6px}@keyframes shimmer{0%{background-position:100% 0}to{background-position:0 0}}.alt-actions{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:4px 10px;margin:18px 0 0}.photo-credit{margin:6px 0 0;font-size:.8rem;color:var(--color-muted)}.photo-credit--tiny{font-size:.76rem;margin-top:6px}.photo-credit--on-dark{color:#ffffffc7}.photo-credit--on-dark a{color:#fff}.ref-note{font-size:.74rem;color:var(--color-muted)}.on-top{position:relative;z-index:2}.storage-notice,.notice-inline{margin:12px 0 0;padding:8px 12px;border-radius:10px;border:1px dashed var(--color-line);color:var(--color-muted);font-size:.82rem;background:transparent}.storage-notice{margin-top:36px;text-align:center}.season-gradient{background:var(--season-gradient)}.today-quote{margin:40px auto 0;max-width:620px;text-align:center}.quote-card{margin:0;padding:18px 20px;background:var(--color-surface);border-radius:var(--radius);border-left:4px solid var(--season-accent);box-shadow:var(--shadow-sm)}.quote-card--quiet{background:none;border:0;box-shadow:none;padding:18px 0 8px;border-top:1px solid var(--color-line)}.quote-card__label{margin:0 0 6px;font-size:.8rem;font-weight:700;color:var(--season-accent);letter-spacing:.04em}.quote-card__hanja,.hanja{margin:0;font-family:var(--font-serif);font-size:1.35rem;line-height:1.6;letter-spacing:.04em;color:var(--color-text)}.quote-card--quiet .quote-card__hanja{font-size:1.5rem}.quote-card--compact .quote-card__hanja{font-size:1.2rem}.quote-card__reading{margin:4px 0 0;color:var(--color-muted);font-size:.9rem}.quote-card__meaning{margin:6px 0 0}.quote-card__source{margin-top:8px;font-size:.8rem;color:var(--color-muted)}.quote-list{list-style:none;padding:0;margin:8px 0 16px;display:grid;gap:12px}.quote-list li{position:relative}.quote-num{position:absolute;top:10px;right:12px;font-size:.75rem;color:var(--color-muted)}.card-grid{display:grid;grid-template-columns:1fr;gap:20px}.goal-card{position:relative;display:flex;flex-direction:column;background:var(--color-surface);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);overflow:hidden;transition:box-shadow .2s}.goal-card:hover{box-shadow:var(--shadow-md)}.goal-card__media{position:relative}.goal-card__img{width:100%;aspect-ratio:4 / 3;object-fit:cover}.goal-card__img--empty{display:grid;place-items:center;color:#ffffffe6;font-family:var(--font-serif);font-size:1.4rem}.goal-card__badge{position:absolute;left:12px;top:12px;padding:2px 12px;border-radius:999px;background:#fffdf8eb;color:var(--color-brand);font-size:.78rem;font-weight:800}.goal-card__credit{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:0 8px;padding:0 14px}.goal-card__credit .photo-credit{margin-top:6px}.goal-card__body{padding:8px 14px 16px}.goal-card__meta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0;font-size:.84rem;color:var(--color-muted)}.goal-card__title{margin:4px 0 8px;font-family:var(--font-serif);font-size:1.2rem}.goal-card__memo{margin:0;color:var(--color-muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.goal-card__voices{list-style:none;margin:0;padding:0;display:grid;gap:6px}.voice{display:grid;gap:0;padding:6px 10px;border-radius:12px;background:var(--color-background);font-size:.9rem}.voice--2{background:var(--season-soft)}.voice__name{font-size:.76rem;font-weight:800;color:var(--color-brand)}.voice__text{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.stretched{border:0;background:none;padding:0;font:inherit;text-align:left;cursor:pointer;color:var(--color-text)}.stretched:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}.photo-fallback{display:flex;align-items:center;justify-content:center;aspect-ratio:4 / 3;width:100%;background:#e7e2d4;color:var(--color-muted);font-size:.85rem;text-align:center;padding:8px}.empty{padding:22px 16px;text-align:center;color:var(--color-muted);background:var(--color-surface);border-radius:var(--radius);border:1px dashed var(--color-line);margin:0}.empty .btn{margin-top:8px}.plain-list{list-style:none;padding:0;margin:12px 0 0}.plain-list li{padding:6px 0;border-bottom:1px solid var(--color-line)}.cover{margin-bottom:18px}.cover__frame{position:relative;border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-sm)}.cover__img{width:100%;aspect-ratio:4 / 3;object-fit:cover}.cover__img--empty{display:grid;place-items:center;color:#ffffffeb;font-size:.9rem;padding:16px;text-align:center}.cover__heading{position:absolute;inset:auto 0 0 0;padding:48px 16px 14px;background:linear-gradient(180deg,transparent,rgba(12,18,16,.72));color:#fff;text-shadow:0 1px 3px rgba(0,0,0,.45)}.cover__heading .page-title{margin:2px 0 0;font-size:1.45rem}.cover__eyebrow{margin:0;font-size:.85rem;font-weight:700}.cover__credit{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:0 8px}.cover__actions{margin-top:6px}.form{display:grid;gap:14px}.field{display:grid;gap:4px;border:0;padding:0;margin:0;min-width:0}.field__label{font-weight:700;font-size:.92rem;padding:0}.field input,.field textarea{width:100%;padding:10px 12px;border-radius:12px;border:1.5px solid var(--color-line);background:#fff;min-height:46px}.field input:focus,.field textarea:focus{border-color:var(--season-accent)}.field input[aria-invalid=true],.field textarea[aria-invalid=true]{border-color:var(--color-danger)}.field__error{color:var(--color-danger);font-size:.85rem}.form__actions{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap}.form__actions .btn{flex:1 1 140px}.sr-status{margin:0;min-height:1.2em;font-size:.9rem;color:var(--color-muted)}.reflections{display:grid;gap:12px}.reflection-box{border:1.5px solid var(--color-line);border-radius:var(--radius);padding:12px 14px 14px;background:var(--color-surface);display:grid;gap:10px;min-width:0}.reflection-box legend{font-weight:800;padding:0 6px}.order-tag{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:50%;background:var(--color-brand);color:#fff;font-size:.75rem;vertical-align:1px}.reflection-box--2 .order-tag,.profile-fields .field:nth-child(2) .order-tag{background:var(--season-accent)}.detail__img{width:100%;aspect-ratio:4 / 3;object-fit:cover;border-radius:var(--radius-lg);box-shadow:var(--shadow-sm)}.detail__credit{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:0 8px}.detail .goal-card__meta{margin-top:14px}.detail__memo{background:var(--color-surface);padding:12px 14px;border-radius:var(--radius)}.bubbles{display:grid;gap:12px}.bubble{position:relative;padding:12px 16px;border-radius:18px;background:var(--color-surface);box-shadow:var(--shadow-sm)}.bubble--1{border-bottom-left-radius:4px;margin-right:12%}.bubble--2{border-bottom-right-radius:4px;margin-left:12%;background:var(--season-soft)}.bubble__name{margin:0;font-weight:800;color:var(--color-brand);font-size:.88rem}.bubble__note{margin:4px 0 0;white-space:pre-wrap}.bubble__growth{margin:6px 0 0;font-size:.85rem;color:var(--season-accent)}.completion{margin-bottom:16px;padding:16px;border-radius:var(--radius);background:var(--season-soft);border:1.5px solid var(--season-accent)}.completion__title{margin:0 0 10px;font-weight:800;font-size:1.05rem}.completion--badge{background:#fff6e3;border-color:#d9a441}.badge-grid{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:1fr 1fr;gap:10px;align-items:start}.badge{padding:14px 12px;border-radius:var(--radius);background:#efece3;color:var(--color-muted);text-align:center}.badge__emoji{font-size:1.8rem;filter:grayscale(1);opacity:.5}.badge--earned{background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-sm);border:1.5px solid var(--season-accent)}.badge--earned .badge__emoji{filter:none;opacity:1}.badge__name{margin:4px 0 0;font-weight:800}.badge__cond{margin:2px 0 0;font-size:.8rem}.badge__quote{margin:8px 0 0;text-align:left}.badge__quote .hanja{font-size:1rem}.alert{margin:12px 0;padding:12px 14px;border-radius:12px;border:1.5px solid var(--color-warn-line);background:var(--color-warn-bg);color:var(--color-text)}.alert p{margin:0 0 6px}.alert--soft{border-style:dashed;background:var(--color-surface);border-color:var(--color-line);font-size:.88rem}.raw-view{width:100%;margin-top:8px;font-family:ui-monospace,Consolas,monospace;font-size:.8rem}.dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#1218168c;display:flex;align-items:flex-end;justify-content:center}.dialog{width:100%;max-width:640px;max-height:92vh;overflow-y:auto;background:var(--color-background);border-radius:22px 22px 0 0;padding:18px 16px 22px;box-shadow:0 -4px 24px #0003}.dialog--confirm{max-width:440px}.dialog__head,.picker__head{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:6px}.dialog__title{margin:0;font-family:var(--font-serif);font-size:1.2rem}.dialog__text{margin:6px 0 12px;color:var(--color-muted)}.dialog__actions{display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap;margin-top:14px}.dialog__actions .btn{flex:1 1 140px}.profile-fields{display:grid;gap:10px}.dialog--preview{max-width:none;height:100%;max-height:none;border-radius:0;padding:0;background:var(--color-ink);color:#fff}.dialog-backdrop:has(.dialog--preview){background:#080c0adb}.preview{display:flex;flex-direction:column;min-height:100%}.preview__stage{position:relative;flex:1 1 auto;min-height:52vh;display:grid;place-items:center;background:#0b0f0d}.preview__stage img{width:100%;height:100%;max-height:68vh;object-fit:contain;opacity:0;transition:opacity .3s}.preview__stage img.is-loaded{opacity:1}.preview__fallback{width:100%;height:100%;min-height:52vh;display:grid;place-items:center}.preview__close{position:absolute;top:12px;right:12px;width:44px;height:44px;border-radius:50%;border:0;background:#0000008c;color:#fff;font-size:1.1rem;cursor:pointer}.preview__panel{padding:16px 18px 22px}.preview__title{margin:0;font-family:var(--font-serif);font-size:1.3rem}.preview__note{margin:4px 0 0;font-size:.8rem;color:#ffffffb3}.preview__alert{color:var(--color-text)}.preview__blocked{margin:10px 0 0;font-size:.88rem;color:#ffd9a0}.preview__actions{display:grid;gap:10px;margin-top:16px}.picker__status p{margin:8px 0}.picker__grid{list-style:none;padding:0;margin:8px 0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.picker__tile{display:block;width:100%;padding:0;border:3px solid transparent;border-radius:12px;overflow:hidden;background:#e7e2d4;cursor:pointer}.picker__tile[aria-pressed=true]{border-color:var(--season-accent);box-shadow:0 0 0 3px #0000001a}.picker__img{width:100%;aspect-ratio:4 / 3;object-fit:cover}.picker__meta{display:flex;justify-content:space-between;flex-wrap:wrap;gap:6px;font-size:.82rem;color:var(--color-muted)}@media(max-width:639px){.filters .chip{min-height:36px;padding:4px 11px;font-size:.88rem}.filter-row{gap:5px}}@media(min-width:640px){.page{padding:24px 24px 40px}.intro__title{font-size:2.1rem}.dialog-backdrop{align-items:center;padding:16px}.dialog{border-radius:22px;padding:22px 24px}.badge-grid{grid-template-columns:repeat(4,1fr)}}@media(min-width:768px){.gallery__grid,.card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.page--editor .card-grid,.page--detail .card-grid{grid-template-columns:1fr}.dialog--preview{width:min(1120px,94vw);height:auto;max-height:94vh;border-radius:22px;overflow:hidden auto}.preview{flex-direction:row;min-height:0}.preview__stage{flex:1 1 64%;min-height:60vh}.preview__stage img{max-height:86vh}.preview__panel{flex:0 0 320px;display:flex;flex-direction:column;justify-content:flex-end;padding:28px 24px}.picker__grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:1200px){.intro__title{font-size:2.5rem}.gallery__grid,.page--memories .card-grid,.page--home .card-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(prefers-reduced-motion:reduce){.skeleton{animation:none}.gallery__frame img,.preview__stage img{transition:none}}
