:root{--color-bg: #faf7f2;--color-surface: #ffffff;--color-text: #201d1a;--color-text-muted: #6b6459;--color-accent: #2f5233;--color-accent-contrast: #ffffff;--color-word: #2f5233;--color-hanja: #8a4b2f;--color-border: #e4ddd1;--color-danger: #a3342a;--node-word-fill: #e6efe6;--node-word-stroke: #4a7a52;--node-word-ink: #234227;--node-hanja-fill: #f4e5dc;--node-hanja-stroke: #b0714f;--node-hanja-ink: #6e3a22;--node-pager-fill: #eee9e0;--node-pager-ink: #6b6459;--node-centre-word-fill: #2f5233;--node-centre-word-ink: #ffffff;--node-centre-hanja-fill: #8a4b2f;--node-centre-hanja-ink: #ffffff;--graph-link: #d8cfc0;--level-beginner: #4a7a52;--level-intermediate: #9c7a2f;--level-advanced: #8a4b2f;--radius-md: 12px;--radius-lg: 20px;--space-1: 4px;--space-2: 8px;--space-3: 16px;--space-4: 24px;--space-5: 32px;--font-sans: system-ui, -apple-system, "Segoe UI", "Noto Sans KR", sans-serif;--font-hangul-hand: "Nanum Myeongjo", serif;--font-hanja-hand: "LXGW WenKai TC", var(--font-sans);--font-hand-combined: "Nanum Myeongjo", "LXGW WenKai TC", serif;color-scheme:light}@media(prefers-color-scheme:dark){:root:not([data-theme=light]){--color-bg: #17181a;--color-surface: #232427;--color-text: #ede9e3;--color-text-muted: #a8a29a;--color-accent: #7fbf8f;--color-accent-contrast: #10240f;--color-word: #8fd39f;--color-hanja: #e0a074;--color-border: #35363a;--color-danger: #e08b83;--node-word-fill: #26382a;--node-word-stroke: #6aa878;--node-word-ink: #cfead4;--node-hanja-fill: #3a2c23;--node-hanja-stroke: #cc9068;--node-hanja-ink: #f0d3bf;--node-pager-fill: #2c2d30;--node-pager-ink: #a8a29a;--node-centre-word-fill: #7fbf8f;--node-centre-word-ink: #10240f;--node-centre-hanja-fill: #e0a074;--node-centre-hanja-ink: #2a1a10;--graph-link: #3d3e42;--level-beginner: #6aa878;--level-intermediate: #cc9f4f;--level-advanced: #cc9068;color-scheme:dark}}:root[data-theme=dark]{--color-bg: #17181a;--color-surface: #232427;--color-text: #ede9e3;--color-text-muted: #a8a29a;--color-accent: #7fbf8f;--color-accent-contrast: #10240f;--color-word: #8fd39f;--color-hanja: #e0a074;--color-border: #35363a;--color-danger: #e08b83;--node-word-fill: #26382a;--node-word-stroke: #6aa878;--node-word-ink: #cfead4;--node-hanja-fill: #3a2c23;--node-hanja-stroke: #cc9068;--node-hanja-ink: #f0d3bf;--node-pager-fill: #2c2d30;--node-pager-ink: #a8a29a;--node-centre-word-fill: #7fbf8f;--node-centre-word-ink: #10240f;--node-centre-hanja-fill: #e0a074;--node-centre-hanja-ink: #2a1a10;--graph-link: #3d3e42;--level-beginner: #6aa878;--level-intermediate: #cc9f4f;--level-advanced: #cc9068;color-scheme:dark}*{box-sizing:border-box}html,body{margin:0;padding:0;height:100%}body{background:var(--color-bg);color:var(--color-text);font-family:var(--font-sans);-webkit-font-smoothing:antialiased}#root{min-height:100dvh;display:flex;flex-direction:column}button{font-family:inherit}.app-shell{display:flex;flex-direction:column;min-height:100dvh}.app-header{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);padding:var(--space-3);border-bottom:1px solid var(--color-border);background:var(--color-surface);position:sticky;top:0;z-index:10}.app-header__title{font-size:1.1rem;font-weight:700;margin:0;letter-spacing:.01em}.app-header__actions{display:flex;gap:var(--space-2)}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);font-size:1.2rem;cursor:pointer;touch-action:manipulation}.icon-button:active{transform:scale(.96)}.icon-button:disabled{opacity:.4;cursor:not-allowed}.app-main{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-4) var(--space-3);gap:var(--space-4)}.explorer{width:100%;max-width:480px;display:flex;flex-direction:column;align-items:center;gap:var(--space-4)}.radial{width:100%}.radial__svg{display:block;width:100%;height:auto;overflow:visible;touch-action:manipulation}.radial__link{stroke:var(--graph-link);stroke-width:1.5}.radial-node{cursor:pointer;outline:none}.radial-node__hit{fill:transparent}.radial-node__shape{stroke-width:1.5;transition:transform .12s ease}.radial-node--word .radial-node__shape{fill:var(--node-word-fill);stroke:var(--node-word-stroke)}.radial-node--hanja .radial-node__shape{fill:var(--node-hanja-fill);stroke:var(--node-hanja-stroke)}.radial-node--pager .radial-node__shape{fill:var(--node-pager-fill);stroke:var(--color-border);stroke-dasharray:3 3}.radial-node--centre.radial-node--word .radial-node__shape{fill:var(--node-centre-word-fill);stroke:none}.radial-node--centre.radial-node--hanja .radial-node__shape{fill:var(--node-centre-hanja-fill);stroke:none}.radial-node text{text-anchor:middle;dominant-baseline:middle;pointer-events:none;-webkit-user-select:none;user-select:none}.radial-node__primary{font-weight:600;font-size:17px}.radial-node--word .radial-node__primary{fill:var(--node-word-ink)}.radial-node--hanja .radial-node__primary{fill:var(--node-hanja-ink)}.radial-node__hint{font-size:9px;fill:var(--color-text-muted)}.radial-node__reading{font-size:11px;font-weight:500;fill:var(--node-hanja-stroke);opacity:.85}.radial-node__secondary{font-size:13px;letter-spacing:.04em}.radial-node__centre-gloss{font-size:11px;fill:var(--color-text-muted)}.radial-node--centre.radial-node--word .radial-node__primary--centre,.radial-node--centre.radial-node--word .radial-node__secondary{fill:var(--node-centre-word-ink)}.radial-node--centre.radial-node--hanja .radial-node__primary--centre,.radial-node--centre.radial-node--hanja .radial-node__secondary{fill:var(--node-centre-hanja-ink)}.radial-node__primary--centre{font-size:30px;font-weight:700}.radial-node--centre .radial-node__secondary{opacity:.85}.radial-node__pager-text{font-size:15px;font-weight:700;fill:var(--node-pager-ink)}.radial-node__pager-sub{font-size:9px;fill:var(--node-pager-ink)}.radial-node:focus-visible .radial-node__shape{stroke:var(--color-accent);stroke-width:3}.radial-node:active .radial-node__shape{transform:scale(.94);transform-box:fill-box;transform-origin:center}.radial__stage{transform-box:fill-box;transform-origin:center;animation:ring-in .25s ease-out}@keyframes ring-in{0%{opacity:0}to{opacity:1}}.radial-node__pop{transform-box:fill-box;transform-origin:center;animation:node-pop .26s cubic-bezier(.34,1.56,.64,1) both;animation-delay:var(--pop-delay, 0ms)}@keyframes node-pop{0%{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}.radial-node__slide{transform-box:fill-box;transform-origin:center}.radial-node__slide--in{animation:slide-to-centre .22s ease-out both}.radial-node__slide--out{animation:slide-from-centre .22s ease-out both}@keyframes slide-to-centre{0%{transform:translate(var(--slide-from-x, 0),var(--slide-from-y, 0))}to{transform:translate(0)}}@keyframes slide-from-centre{0%{opacity:.85;transform:translate(var(--slide-from-x, 0),var(--slide-from-y, 0))}to{opacity:1;transform:translate(0)}}.radial-node__badge-disc{fill:var(--color-accent);opacity:.9}.radial-node__badge-text{fill:var(--color-surface);font-size:10px;font-weight:700;text-anchor:middle;dominant-baseline:middle;pointer-events:none;-webkit-user-select:none;user-select:none}.radial-node__affix-pill{fill:var(--color-bg);stroke:var(--color-border);stroke-width:1}.radial-node__affix-text{fill:var(--color-text-muted);font-size:9px;font-weight:600;text-anchor:middle;dominant-baseline:middle;pointer-events:none;-webkit-user-select:none;user-select:none}.radial-node--dead-end .radial-node__shape{opacity:.55;stroke-dasharray:4 3}.radial-node--dead-end .radial-node__primary,.radial-node--dead-end .radial-node__reading,.radial-node--dead-end .radial-node__hint{opacity:.6}@media(prefers-reduced-motion:reduce){.radial__stage,.radial-node__pop,.radial-node__slide--in,.radial-node__slide--out{animation:none}.radial-node__shape,.radial-node:active .radial-node__shape{transition:none;transform:none}}.splash{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-3);min-height:60vh;text-align:center;color:var(--color-text-muted)}.splash__glyph{font-size:3rem;animation:splash-pulse 1.6s ease-in-out infinite}@keyframes splash-pulse{0%,to{opacity:.4;transform:scale(1)}50%{opacity:1;transform:scale(1.08)}}.error-panel{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);text-align:center;color:var(--color-danger);padding:var(--space-4)}.detail-card{width:100%;max-width:480px;background:var(--color-surface);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3)}.detail-card__headline{display:flex;flex-direction:column;align-items:center;gap:var(--space-1);text-align:center}.detail-card__surface{font-size:2.6rem;font-weight:700;line-height:1.1;color:var(--color-word)}.detail-card__surface--hanja{color:var(--color-hanja)}.detail-card__hanja-spelling{font-size:1.2rem;color:var(--color-text-muted);letter-spacing:.05em}.detail-card__reading{font-size:1.1rem;color:var(--color-text-muted)}.detail-card__gloss{font-size:1.05rem;text-align:center}.detail-card__def{margin:0;font-size:.85rem;color:var(--color-text-muted);text-align:center;max-width:40ch}.level-badge{display:inline-flex;align-items:center;gap:6px;margin-top:var(--space-1);padding:2px 10px;border-radius:999px;border:1px solid var(--color-border);font-size:.75rem;color:var(--color-text-muted);text-transform:capitalize}.level-badge__dot{width:8px;height:8px;border-radius:50%;background:var(--dot-color, var(--color-text-muted))}.level-badge--beginner .level-badge__dot{--dot-color: var(--level-beginner)}.level-badge--intermediate .level-badge__dot{--dot-color: var(--level-intermediate)}.level-badge--advanced .level-badge__dot{--dot-color: var(--level-advanced)}.detail-card__section-title{font-size:.8rem;text-transform:uppercase;letter-spacing:.08em;color:var(--color-text-muted);margin:0}.char-breakdown{display:flex;flex-direction:column;gap:var(--space-2)}.char-breakdown__row{display:flex;align-items:center;gap:var(--space-3);width:100%;padding:var(--space-2);border:1px solid var(--color-border);border-radius:var(--radius-md);background:transparent;color:inherit;cursor:pointer;text-align:left;min-height:44px}.char-breakdown__row:active{background:var(--color-bg)}.char-breakdown__char{font-size:1.6rem;color:var(--color-hanja);min-width:2ch}.char-breakdown__meta{display:flex;flex-direction:column;gap:2px}.char-breakdown__reading{font-weight:600}.char-breakdown__name,.char-breakdown__gloss{font-size:.85rem;color:var(--color-text-muted)}.word-list{display:flex;flex-direction:column;gap:var(--space-2)}.word-list__item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);width:100%;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:transparent;color:inherit;cursor:pointer;text-align:left;min-height:44px}.word-list__item:active{background:var(--color-bg)}.word-list__surface{font-weight:600}.word-list__gloss{font-size:.85rem;color:var(--color-text-muted)}.family-chips{display:flex;flex-wrap:wrap;gap:var(--space-2)}.family-chips__chip{display:inline-flex;align-items:baseline;gap:var(--space-2);padding:var(--space-1) var(--space-3);border:1px solid var(--color-border);border-radius:999px;background:transparent;color:inherit;cursor:pointer;text-align:left;min-height:36px}.family-chips__chip:active{background:var(--color-bg)}.family-chips__surface{font-weight:600}.family-chips__gloss{font-size:.8rem;color:var(--color-text-muted)}.detail-card__count{font-size:.9rem;color:var(--color-text-muted);text-align:center}.search-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--color-bg);z-index:100;display:flex;flex-direction:column;padding:var(--space-3);gap:var(--space-3)}.search-overlay__bar{display:flex;align-items:center;gap:var(--space-2)}.search-overlay__input{flex:1;font-size:1.1rem;padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text);min-height:44px}.search-overlay__results{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:var(--space-2)}.search-result{display:flex;align-items:center;gap:var(--space-3);width:100%;padding:var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);color:inherit;cursor:pointer;text-align:left;min-height:44px}.search-result:active{background:var(--color-bg)}.search-result__glyph{font-size:1.3rem;min-width:2ch;color:var(--color-word)}.search-result__glyph--hanja{color:var(--color-hanja)}.search-result__body{display:flex;flex-direction:column;gap:2px}.search-result__sub{font-size:.85rem;color:var(--color-text-muted)}.search-overlay__empty{color:var(--color-text-muted);text-align:center;padding:var(--space-4)}.sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000059;display:flex;align-items:flex-end;justify-content:center;z-index:30}.sheet{position:relative;width:100%;max-width:480px;max-height:80vh;overflow-y:auto;background:var(--color-surface);border-radius:var(--radius-lg) var(--radius-lg) 0 0;padding:var(--space-3) var(--space-4) var(--space-5);box-shadow:0 -8px 32px #0000002e;animation:sheet-up .22s ease-out}@keyframes sheet-up{0%{transform:translateY(24px);opacity:0}to{transform:translateY(0);opacity:1}}@media(prefers-reduced-motion:reduce){.sheet{animation:none}}.sheet__handle{width:40px;height:4px;border-radius:2px;background:var(--color-border);margin:0 auto var(--space-3)}.sheet__close{position:absolute;top:var(--space-2);right:var(--space-2)}.sheet__title{font-size:1rem;font-weight:600;margin:0 0 var(--space-2)}.dial__readout{margin:0 0 var(--space-2);font-size:.95rem;color:var(--color-text-muted)}.dial__slider{width:100%;accent-color:var(--color-accent);margin:var(--space-2) 0 0}.dial__ticks{position:relative;height:1.2rem;margin:var(--space-1) 0 var(--space-2);font-size:.7rem;color:var(--color-text-muted)}.dial__tick{position:absolute;transform:translate(-50%);white-space:nowrap}.dial__tick:first-child{transform:translate(0)}.dial__tick:last-child{transform:translate(-100%)}.dial__hint{margin:0 0 var(--space-4);font-size:.85rem;color:var(--color-text-muted)}.about p{font-size:.9rem;line-height:1.5;margin:0 0 var(--space-2)}.about__counts{color:var(--color-text-muted);font-size:.85rem}.about__subtitle{font-size:.9rem;font-weight:600;margin:var(--space-3) 0 var(--space-1)}.about__sources{margin:0;padding-left:var(--space-4);font-size:.85rem;line-height:1.7}.about__sources a{color:var(--color-accent)}.about__license{color:var(--color-text-muted)}.cap-chip{align-self:center;margin:var(--space-1) auto 0;display:block;border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);border-radius:999px;padding:2px 12px;font-size:.8rem;cursor:pointer}.first-run-hint{display:flex;align-items:center;justify-content:center;gap:var(--space-2);margin:0;padding:var(--space-1) var(--space-3);font-size:.85rem;color:var(--color-text-muted)}.first-run-hint__dismiss{border:none;background:none;color:var(--color-text-muted);cursor:pointer;font-size:.8rem;padding:2px 6px}.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.settings-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin:0 0 var(--space-3)}.settings-row__label{font-size:.9rem;color:var(--color-text)}.segmented{display:inline-flex;border:1px solid var(--color-border);border-radius:999px;overflow:hidden;background:var(--color-bg)}.segmented__option{border:none;background:none;color:var(--color-text-muted);font-size:.85rem;padding:4px 12px;cursor:pointer}.segmented__option[aria-pressed=true]{background:var(--color-accent);color:var(--color-accent-contrast)}.settings-row--levels{flex-direction:column;align-items:flex-start;gap:var(--space-2)}.level-checkboxes{display:flex;flex-direction:column;gap:var(--space-1)}.level-checkboxes__option{display:flex;align-items:center;gap:var(--space-2);font-size:.9rem;color:var(--color-text);cursor:pointer}:root[data-hangul-lettering=handwritten] .radial-node__reading,:root[data-hangul-lettering=handwritten] .detail-card__reading,:root[data-hangul-lettering=handwritten] .char-breakdown__reading,:root[data-hangul-lettering=handwritten] .char-breakdown__name{font-family:var(--font-hangul-hand)}:root[data-hanja-lettering=handwritten] .detail-card__hanja-spelling,:root[data-hanja-lettering=handwritten] .char-breakdown__char{font-family:var(--font-hanja-hand)}:root[data-hangul-lettering=handwritten][data-hanja-lettering=handwritten] .radial-node__primary,:root[data-hangul-lettering=handwritten][data-hanja-lettering=handwritten] .radial-node__secondary,:root[data-hangul-lettering=handwritten][data-hanja-lettering=handwritten] .detail-card__surface{font-family:var(--font-hand-combined)}:root[data-hangul-lettering=handwritten]:not([data-hanja-lettering=handwritten]) .radial-node__primary,:root[data-hangul-lettering=handwritten]:not([data-hanja-lettering=handwritten]) .radial-node__secondary,:root[data-hangul-lettering=handwritten]:not([data-hanja-lettering=handwritten]) .detail-card__surface{font-family:var(--font-hangul-hand)}:root[data-hanja-lettering=handwritten]:not([data-hangul-lettering=handwritten]) .radial-node__primary,:root[data-hanja-lettering=handwritten]:not([data-hangul-lettering=handwritten]) .radial-node__secondary,:root[data-hanja-lettering=handwritten]:not([data-hangul-lettering=handwritten]) .detail-card__surface{font-family:var(--font-hanja-hand)}:root[data-hangul-lettering=handwritten] .radial-node__primary,:root[data-hanja-lettering=handwritten] .radial-node__primary{font-size:22px}:root[data-hangul-lettering=handwritten] .radial-node--word .radial-node__primary--centre,:root[data-hanja-lettering=handwritten] .radial-node--word .radial-node__primary--centre{font-size:32px}:root[data-hangul-lettering=handwritten] .radial-node--hanja .radial-node__primary--centre,:root[data-hanja-lettering=handwritten] .radial-node--hanja .radial-node__primary--centre{font-size:38px}:root[data-hangul-lettering=handwritten] .radial-node__reading,:root[data-hanja-lettering=handwritten] .radial-node__reading{font-size:14px}:root[data-hangul-lettering=handwritten] .radial-node__secondary,:root[data-hanja-lettering=handwritten] .radial-node__secondary{font-size:17px}:root[data-hangul-lettering=handwritten] .detail-card__surface,:root[data-hanja-lettering=handwritten] .detail-card__surface{font-size:2.6rem}.trail-strip{width:100%;height:28px}.trail-strip__track{height:100%;display:flex;align-items:center;gap:var(--space-2);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;justify-content:flex-end;-webkit-mask-image:linear-gradient(to right,transparent,black 24px);mask-image:linear-gradient(to right,transparent,black 24px)}.trail-strip__track::-webkit-scrollbar{display:none}.trail-strip__chip{flex:0 0 auto;border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);border-radius:999px;padding:2px 10px;font-size:.8rem;line-height:1.4;cursor:pointer;white-space:nowrap}.trail-strip__chip--hanja{color:var(--color-hanja)}.trail-strip__chip:hover{border-color:var(--color-accent);color:var(--color-text)}.install-row__button{border:1px solid var(--color-border);border-radius:999px;background:var(--color-accent);color:var(--color-accent-contrast);font-size:.85rem;padding:4px 14px;cursor:pointer}.install-nudge{display:flex;align-items:center;justify-content:center;gap:var(--space-2);margin:var(--space-1) auto 0}.install-nudge__button{border:1px solid var(--color-border);background:var(--color-surface);color:var(--color-text-muted);border-radius:999px;padding:2px 12px;font-size:.8rem;cursor:pointer}.install-nudge__dismiss{border:none;background:none;color:var(--color-text-muted);cursor:pointer;font-size:.8rem;padding:2px 6px}.install-overlay__steps{margin:0 0 var(--space-3);padding-left:var(--space-4);font-size:.95rem;line-height:1.8;color:var(--color-text)}.install-overlay__glyph{display:inline-flex;vertical-align:middle;color:var(--color-accent);margin-right:var(--space-1)}.install-overlay__pointer{text-align:center;margin:var(--space-2) 0 0;font-size:1.6rem;color:var(--color-accent)}.install-overlay__hint{text-align:center;margin:0;font-size:.85rem;color:var(--color-text-muted)}
