.toast-stack{position:fixed;right:var(--space-6);bottom:var(--space-6);z-index:200;display:flex;flex-direction:column;gap:var(--space-2);pointer-events:none}.toast{display:flex;align-items:center;gap:var(--space-3);min-width:240px;max-width:min(420px,calc(100vw - 32px));padding:var(--space-3) var(--space-3) var(--space-3) var(--space-4);border-radius:var(--radius-md);border-left:3px solid var(--color-success);background:var(--color-surface);box-shadow:var(--shadow-md);font-size:var(--text-sm);line-height:1.5;pointer-events:auto}.toast span{flex:1}.toast-error{border-left-color:var(--color-danger)}.toast-info{border-left-color:var(--color-primary)}.toast-close{border:none;background:none;color:var(--color-text-muted);font-size:18px;line-height:1;cursor:pointer;padding:2px 6px}@media(max-width:767px){.toast-stack{right:50%;transform:translate(50%);bottom:var(--space-4);align-items:center}}.modal{width:min(420px,calc(100vw - 32px));padding:var(--space-6);border:none;border-radius:var(--radius-lg);background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-md)}.modal[open]{animation:modalIn var(--dur-slow) var(--ease-out-soft)}.modal::backdrop{background:var(--color-dim)}@keyframes modalIn{0%{opacity:0;transform:translateY(8px) scale(.98)}}.modal-title{font-size:var(--text-h3);line-height:1.4}.modal-message{margin-top:var(--space-2);color:var(--color-text-muted);font-size:var(--text-sm);white-space:pre-line}.modal-actions{display:flex;justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-6)}.public-layout{display:flex;flex-direction:column;min-height:100vh}.site-header{position:sticky;top:0;z-index:50;height:var(--header-h);border-bottom:1px solid var(--color-border);background:color-mix(in srgb,var(--color-bg) 88%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.site-header-inner{display:flex;align-items:center;gap:var(--space-2);height:100%;padding:0 var(--space-6)}.site-logo{display:flex;align-items:center;gap:var(--space-2);font-weight:700;font-size:17px;letter-spacing:-.01em}.site-logo-mark{display:grid;place-items:center;width:30px;height:26px;border-radius:7px;background:var(--color-primary);color:var(--color-on-primary);font-family:var(--font-mono);font-size:11px;font-weight:700}.site-header-actions{display:flex;align-items:center;gap:var(--space-1);margin-left:auto}.site-body{display:flex;flex:1}.site-sidebar{position:sticky;top:var(--header-h);flex:0 0 var(--sidebar-w);align-self:flex-start;height:calc(100vh - var(--header-h));overflow-y:auto;padding:var(--space-6) var(--space-3);border-right:1px solid var(--color-border);background:var(--color-bg-subtle);font-size:var(--text-sm);overscroll-behavior:contain}.site-sidebar.is-drawer{position:fixed;top:0;left:0;z-index:80;width:280px;height:100vh;border-right:none;background:var(--color-surface);box-shadow:var(--shadow-md);transform:translate(-100%);visibility:hidden;transition:transform var(--dur-slow) var(--ease-out-soft),visibility var(--dur-slow)}.site-sidebar.is-drawer.is-open{transform:none;visibility:visible}.drawer-dim{position:fixed;inset:0;z-index:70;background:var(--color-dim);animation:fadeIn var(--dur-slow) ease-out}.drawer-head{display:flex;align-items:center;justify-content:space-between;margin:calc(var(--space-2) * -1) 0 var(--space-3) var(--space-2);font-weight:700}.sidebar-all{display:flex;align-items:center;min-height:36px;margin-bottom:var(--space-1);padding:0 var(--space-3) 0 calc(var(--space-3) + 24px);border-radius:var(--radius-md);color:var(--color-text-muted);transition:background var(--dur-fast),color var(--dur-fast)}.sidebar-all:hover{background:var(--color-bg);color:var(--color-text)}.sidebar-all.is-active{background:var(--color-primary-subtle);color:var(--color-primary);font-weight:600;box-shadow:inset 3px 0 0 var(--color-primary)}.sidebar-skeleton{padding:var(--space-2) var(--space-3)}.sidebar-heading{margin:0 0 var(--space-2);padding:0 var(--space-3);font-size:var(--text-xs);font-weight:600;color:var(--color-text-muted);letter-spacing:.04em}.sidebar-tags{margin-top:var(--space-8)}.sidebar-tags .tag-list{padding:0 var(--space-3)}.site-sidebar .tag-chip{background:var(--color-bg)}.site-sidebar.is-drawer .tag-chip{background:var(--color-bg-subtle)}.site-main{flex:1;min-width:0;padding:var(--space-8) var(--space-8) var(--space-12)}.site-main:focus{outline:none}.site-footer{display:flex;flex-wrap:wrap;justify-content:space-between;gap:var(--space-2);padding:var(--space-6);border-top:1px solid var(--color-border);color:var(--color-text-muted);font-size:var(--text-sm)}.site-footer-links{display:flex;gap:var(--space-2)}.site-footer a:hover{color:var(--color-primary)}@media(max-width:767px){.site-header-inner{padding:0 var(--space-2) 0 var(--space-1)}.site-main{padding:var(--space-6) var(--space-4) var(--space-12)}.site-footer{padding:var(--space-4)}}.tree-list{margin:0;padding:0;list-style:none}.tree-row{display:flex;align-items:center;margin-bottom:2px;padding-left:calc(var(--depth) * 16px);border-radius:var(--radius-md);color:var(--color-text-muted);transition:background var(--dur-fast),color var(--dur-fast)}.tree-row:hover{background:var(--color-bg);color:var(--color-text)}.site-sidebar.is-drawer .tree-row:hover{background:var(--color-bg-subtle)}.tree-row.is-path{color:var(--color-text)}.tree-row.is-active,.tree-row.is-active:hover{background:var(--color-primary-subtle);color:var(--color-primary);font-weight:600;box-shadow:inset 3px 0 0 var(--color-primary)}.tree-toggle{flex:0 0 24px;display:grid;place-items:center;height:24px;margin-left:var(--space-1);padding:0;border:none;border-radius:var(--radius-sm);background:none;color:inherit;cursor:pointer}button.tree-toggle:hover{background:color-mix(in srgb,var(--color-text) 8%,transparent)}.tree-toggle svg{transition:transform var(--dur-base) ease-out}.tree-toggle svg.rotated{transform:rotate(90deg)}.tree-link{flex:1;display:flex;align-items:center;gap:var(--space-2);min-width:0;min-height:36px;padding:0 var(--space-3) 0 var(--space-1)}.tree-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tree-count{font-size:var(--text-xs);font-weight:400;color:var(--color-text-muted)}@media(pointer:coarse){.tree-toggle{flex-basis:36px;height:44px}.tree-link{min-height:44px}}.tree-children{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--dur-base) ease-out}.tree-children[data-open=true]{grid-template-rows:1fr}.tree-children-inner{overflow:hidden}.list-page{max-width:var(--content-w);margin:0 auto}.list-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);margin-bottom:var(--space-6);padding-bottom:var(--space-4);border-bottom:1px solid var(--color-border)}.list-title{display:flex;align-items:baseline;gap:var(--space-2);min-height:1.4em;font-size:var(--text-h1);line-height:1.4;letter-spacing:-.02em}.list-count{font-size:var(--text-sm);font-weight:500;color:var(--color-text-muted)}.list-sort .select{width:auto;min-height:34px;padding-right:var(--space-6)}.list-controls{display:flex;align-items:center;gap:var(--space-2);flex-shrink:0}.view-switch{display:inline-flex;padding:2px;border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle)}.view-switch-btn{display:inline-flex;align-items:center;gap:var(--space-1);height:28px;padding:0 var(--space-2);border:none;border-radius:var(--radius-sm);background:none;color:var(--color-text-muted);font-size:var(--text-xs);font-weight:600;cursor:pointer;transition:background var(--dur-fast),color var(--dur-fast)}.view-switch-btn:hover{color:var(--color-text)}.view-switch-btn.is-active{background:var(--color-surface);color:var(--color-primary);box-shadow:var(--shadow-sm)}@media(max-width:767px){.view-switch-label{display:none}.view-switch-btn{width:32px;justify-content:center;padding:0}}.list-filter{display:flex;align-items:center;gap:var(--space-2);margin:calc(var(--space-2) * -1) 0 var(--space-4);font-size:var(--text-sm);color:var(--color-text-muted)}.list-more{display:flex;justify-content:center;margin-top:var(--space-8)}.list-more .btn{min-width:160px}.detail-page{display:grid;grid-template-columns:minmax(0,var(--content-w));justify-content:center;gap:var(--space-12)}.detail-page.has-toc{grid-template-columns:minmax(0,var(--content-w)) var(--toc-w)}.reading-progress{position:fixed;top:var(--header-h);left:0;right:0;z-index:49;height:2px;background:var(--color-primary);transform-origin:left;pointer-events:none}.detail-article{display:flex;flex-direction:column;min-width:0}.detail-header{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-3);margin-bottom:var(--space-8);padding-bottom:var(--space-6);border-bottom:1px solid var(--color-border)}.breadcrumb{font-size:var(--text-sm);color:var(--color-text-muted)}.breadcrumb a:hover{color:var(--color-primary)}.breadcrumb-sep{margin:0 var(--space-2)}.detail-title{font-size:var(--text-display);line-height:1.3;letter-spacing:-.02em;word-break:keep-all}.detail-badge{margin-left:var(--space-2);vertical-align:middle}.detail-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-3);font-size:var(--text-sm);color:var(--color-text-muted)}.detail-project-btn{margin-top:var(--space-2)}.detail-toc{position:relative}.detail-toc>.toc-scroll{position:sticky;top:calc(var(--header-h) + var(--space-8));max-height:calc(100vh - var(--header-h) - 120px);overflow-y:auto;overscroll-behavior:contain}.toc-heading{margin-bottom:var(--space-3);font-size:var(--text-xs);font-weight:600;color:var(--color-text-muted);letter-spacing:.04em}.toc-top{position:sticky;top:calc(100vh - 80px);margin-top:var(--space-4)}.toc-inline{margin-bottom:var(--space-8);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle)}.toc-inline-toggle{display:flex;align-items:center;gap:var(--space-2);width:100%;min-height:44px;padding:0 var(--space-4);border:none;background:none;font-size:var(--text-sm);font-weight:600;cursor:pointer}.toc-inline-toggle svg:last-child{margin-left:auto;transition:transform var(--dur-base)}.rotated-180{transform:rotate(180deg)}.toc-inline-body{display:grid;grid-template-rows:0fr;transition:grid-template-rows var(--dur-base) ease-out}.toc-inline-body[data-open=true]{grid-template-rows:1fr}.toc-inline-inner{overflow:hidden}.toc-inline .toc{padding:0 var(--space-4) var(--space-4)}.current-section-bar{position:fixed;top:var(--header-h);left:0;right:0;z-index:48;display:flex;align-items:center;gap:var(--space-2);height:40px;padding:0 var(--space-4);border:none;border-bottom:1px solid var(--color-border);background:color-mix(in srgb,var(--color-bg) 94%,transparent);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);color:var(--color-text);font-size:var(--text-sm);font-weight:600;text-align:left;cursor:pointer}.current-section-bar span{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media(min-width:768px)and (max-width:1199px){.current-section-bar{left:var(--sidebar-w)}}.toc-sheet{position:fixed;inset:auto 0 0;width:100%;max-width:100%;max-height:70vh;margin:0;padding:var(--space-4);border:none;border-radius:var(--radius-lg) var(--radius-lg) 0 0;background:var(--color-surface);color:var(--color-text);box-shadow:var(--shadow-md)}.toc-sheet[open]{display:flex;flex-direction:column;animation:sheetUp var(--dur-slow) var(--ease-out-soft)}.toc-sheet::backdrop{background:var(--color-dim)}.toc-sheet .toc-scroll{overflow-y:auto}.toc-sheet .toc-link{padding-top:10px;padding-bottom:10px}.toc-sheet-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-2);font-weight:700}@keyframes sheetUp{0%{transform:translateY(100%)}}.detail-pager{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4);margin-top:var(--space-12);padding-top:var(--space-6);border-top:1px solid var(--color-border)}.pager-link{display:flex;flex-direction:column;gap:var(--space-1);padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);transition:border-color var(--dur-fast),background var(--dur-fast)}.pager-link:hover{border-color:var(--color-primary);background:var(--color-bg-subtle)}.pager-link.next{text-align:right;align-items:flex-end;grid-column:2}.pager-label{display:inline-flex;align-items:center;gap:var(--space-1);font-size:var(--text-xs);color:var(--color-text-muted)}.pager-title{font-weight:600;font-size:var(--text-sm)}@media(max-width:767px){.detail-pager{grid-template-columns:1fr}.pager-link.next{grid-column:1}}.back-to-top{position:fixed;right:var(--space-6);bottom:var(--space-6);z-index:40;display:grid;place-items:center;width:44px;height:44px;border:1px solid var(--color-border);border-radius:50%;background:var(--color-surface);box-shadow:var(--shadow-md);color:var(--color-text-muted);cursor:pointer}.back-to-top:hover{color:var(--color-primary)}@media(min-width:1200px){.back-to-top{display:none}}.not-found{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);padding:var(--space-12) var(--space-4);text-align:center}.not-found.standalone{min-height:100vh;justify-content:center}.not-found-code{font-size:64px;font-weight:800;line-height:1;color:var(--color-primary);opacity:.85}.not-found-title{font-size:var(--text-h2)}.not-found-desc{color:var(--color-text-muted);font-size:var(--text-sm)}.not-found-actions{display:flex;gap:var(--space-2);margin-top:var(--space-4)}@media(max-width:767px){.list-head{flex-wrap:wrap}}.post-card-list{display:flex;flex-direction:column;gap:var(--space-4)}.post-card{position:relative;display:flex;gap:var(--space-6);padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);box-shadow:var(--shadow-sm);transition:box-shadow .3s,border-color var(--dur-fast)}.post-card-thumb{position:relative;flex:0 0 200px;aspect-ratio:16 / 9;overflow:hidden;border-radius:var(--radius-md);background:var(--color-bg-subtle)}.post-card-thumb img{width:100%;height:100%;object-fit:cover;transition:transform .3s}.post-card-thumb-fallback{display:grid;place-items:center;height:100%;background:linear-gradient(135deg,var(--color-primary-subtle),var(--color-bg-subtle));color:var(--color-primary);font-size:32px;font-weight:700;opacity:.8}.post-card-body{display:flex;flex-direction:column;gap:var(--space-2);min-width:0;flex:1}.post-card-title{font-size:var(--text-h3);line-height:1.4}.post-card-badge{margin-left:var(--space-2);vertical-align:middle}.post-card-link:after{content:"";position:absolute;inset:0;border-radius:var(--radius-md)}.post-card-link:focus-visible{outline:none}.post-card:has(.post-card-link:focus-visible){outline:2px solid var(--color-primary);outline-offset:2px}.post-card-summary{color:var(--color-text-muted);font-size:var(--text-sm);line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.post-card-meta{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3);margin-top:auto}.post-card-tag{z-index:1}.post-card-info{font-size:var(--text-xs);color:var(--color-text-muted)}@media(hover:hover){.post-card:hover{box-shadow:var(--shadow-md);border-color:color-mix(in srgb,var(--color-primary) 30%,var(--color-border))}.post-card:hover .post-card-thumb img{transform:scale(1.03)}.post-card:hover .post-card-title{color:var(--color-primary)}}@media(max-width:767px){.post-card{flex-direction:column;gap:var(--space-3);padding:var(--space-3)}.post-card-thumb{flex-basis:auto}}.post-card.is-text{padding:var(--space-4) var(--space-6)}.post-card.is-text .post-card-meta{margin-top:var(--space-1)}.post-card-list.view-title{gap:0}.post-card.is-title{flex-direction:row;align-items:baseline;gap:var(--space-4);padding:var(--space-3) var(--space-2);border:none;border-bottom:1px solid var(--color-border);border-radius:0;box-shadow:none;background:none}.post-card.is-title .post-card-title{flex:1;min-width:0;font-size:var(--text-body);font-weight:500}.post-card.is-title .post-card-info{flex-shrink:0}@media(hover:hover){.post-card.is-title:hover{box-shadow:none;background:var(--color-bg-subtle)}}@media(max-width:767px){.post-card.is-text{padding:var(--space-3) var(--space-4)}.post-card.is-title{flex-direction:column;gap:2px;padding:var(--space-3) var(--space-1)}}.toc{font-size:var(--text-sm);line-height:1.5}.toc-list{position:relative;margin:0;padding:0;list-style:none;border-left:1px solid var(--color-border)}.toc-indicator{position:absolute;top:0;left:-1px;width:2px;background:var(--color-primary);border-radius:2px;transition:transform var(--dur-fast) ease-out,height var(--dur-fast) ease-out}.toc-link{display:block;padding:5px var(--space-2) 5px calc(var(--space-3) + var(--toc-depth) * 12px);color:var(--color-text-muted);transition:color var(--dur-fast)}.toc-link:hover{color:var(--color-text)}.toc-link.is-active{color:var(--color-primary);font-weight:600}.post-content{font-size:var(--text-body);line-height:1.75;word-break:keep-all;overflow-wrap:anywhere}.post-content>*+*{margin-top:1em}.post-content h1,.post-content h2,.post-content h3{position:relative;margin-top:2em;margin-bottom:.75em;letter-spacing:-.01em}.post-content h1{font-size:var(--text-h1);line-height:1.4}.post-content h2{font-size:var(--text-h2);line-height:1.4;padding-bottom:var(--space-2);border-bottom:1px solid var(--color-border)}.post-content h3{font-size:var(--text-h3);line-height:1.5}.post-content>:first-child{margin-top:0}.heading-anchor{position:absolute;left:-1.1em;padding-right:.3em;color:var(--color-text-muted);font-weight:400;opacity:0;transition:opacity var(--dur-fast)}.post-content :is(h1,h2,h3):hover .heading-anchor,.heading-anchor:focus-visible{opacity:1}.heading-anchor:hover{color:var(--color-primary)}@media(max-width:767px){.heading-anchor{display:none}}.post-content p{margin-bottom:0}.post-content a{color:var(--color-primary);text-decoration:underline;text-underline-offset:3px}.post-content .heading-anchor{text-decoration:none}.post-content ul,.post-content ol{padding-left:1.5em}.post-content li+li{margin-top:.25em}.post-content blockquote{margin-left:0;margin-right:0;padding:var(--space-3) var(--space-4);border-left:3px solid var(--color-primary);border-radius:0 var(--radius-md) var(--radius-md) 0;background:var(--color-bg-subtle);color:var(--color-text-muted)}.post-content code{padding:.15em .4em;border-radius:var(--radius-sm);background:var(--color-bg-subtle);font-family:var(--font-mono);font-size:.875em}.post-content pre{overflow-x:auto;padding:var(--space-4);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-subtle);line-height:1.6}.post-content pre code{padding:0;background:none;font-size:var(--text-sm)}.post-content img{display:block;height:auto;margin-left:auto;margin-right:auto;border-radius:var(--radius-md)}.post-content hr{border:none;border-top:1px solid var(--color-border);margin:2em 0}:root{color-scheme:light;--color-bg: #ffffff;--color-bg-subtle: #f7f8fa;--color-surface: #ffffff;--color-border: #e5e7eb;--color-text: #1f2328;--color-text-muted: #656d76;--color-primary: #2563eb;--color-primary-subtle: #eff4ff;--color-on-primary: #ffffff;--color-success: #16a34a;--color-danger: #dc2626;--color-warning: #b45309;--color-dim: rgb(0 0 0 / .4);--font-sans: Pretendard, -apple-system, BlinkMacSystemFont, "Segoe UI", "Malgun Gothic", sans-serif;--font-mono: "JetBrains Mono", Consolas, "D2Coding", monospace;--text-display: 32px;--text-h1: 26px;--text-h2: 22px;--text-h3: 18px;--text-body: 16px;--text-sm: 14px;--text-xs: 12px;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-6: 24px;--space-8: 32px;--space-12: 48px;--radius-sm: 4px;--radius-md: 8px;--radius-lg: 12px;--shadow-sm: 0 1px 2px rgb(0 0 0 / .06);--shadow-md: 0 4px 16px rgb(0 0 0 / .1);--header-h: 60px;--sidebar-w: 240px;--toc-w: 220px;--content-w: 760px;--dur-fast: .15s;--dur-base: .2s;--dur-slow: .25s;--ease-out-soft: cubic-bezier(.2, .8, .2, 1)}:root[data-theme=dark]{color-scheme:dark;--color-bg: #0f1115;--color-bg-subtle: #161920;--color-surface: #1c1f27;--color-border: #2a2e38;--color-text: #e6e8eb;--color-text-muted: #9198a1;--color-primary: #60a5fa;--color-primary-subtle: #1e2a44;--color-on-primary: #0f1115;--color-success: #4ade80;--color-danger: #f87171;--color-warning: #fbbf24;--color-dim: rgb(0 0 0 / .6);--shadow-sm: 0 1px 2px rgb(0 0 0 / .4);--shadow-md: 0 4px 16px rgb(0 0 0 / .5)}@media(max-width:1199px){:root{--sidebar-w: 220px}}@media(max-width:767px){:root{--header-h: 56px;--text-display: 26px;--text-h1: 22px;--text-h2: 20px}}@media(prefers-reduced-motion:reduce){:root{--dur-fast: 0ms;--dur-base: 0ms;--dur-slow: 0ms}}*,*:before,*:after{box-sizing:border-box}html{scroll-padding-top:calc(var(--header-h) + 24px)}body{margin:0;background:var(--color-bg);color:var(--color-text);font-family:var(--font-sans);font-size:var(--text-body);line-height:1.75;-webkit-font-smoothing:antialiased;transition:background var(--dur-base),color var(--dur-base)}body.scroll-locked{overflow:hidden}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit}img{max-width:100%}h1,h2,h3,p{margin:0}:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:var(--radius-sm)}.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.skip-link{position:fixed;top:-60px;left:var(--space-4);z-index:100;padding:var(--space-2) var(--space-4);border-radius:var(--radius-md);background:var(--color-primary);color:var(--color-on-primary);font-size:var(--text-sm);font-weight:600;transition:top var(--dur-fast)}.skip-link:focus{top:var(--space-2)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);min-height:38px;padding:0 var(--space-4);border:1px solid transparent;border-radius:var(--radius-md);background:none;font-size:var(--text-sm);font-weight:600;line-height:1;white-space:nowrap;cursor:pointer;transition:background var(--dur-fast),border-color var(--dur-fast),color var(--dur-fast),opacity var(--dur-fast)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--color-primary);color:var(--color-on-primary)}.btn-primary:not(:disabled):hover{background:color-mix(in srgb,var(--color-primary) 85%,#000)}.btn-outline{border-color:var(--color-border);background:var(--color-surface)}.btn-outline:not(:disabled):hover{background:var(--color-bg-subtle)}.btn-ghost{color:var(--color-text-muted)}.btn-ghost:not(:disabled):hover{background:var(--color-bg-subtle);color:var(--color-text)}.btn-danger{background:var(--color-danger);color:#fff}.btn-danger:not(:disabled):hover{background:color-mix(in srgb,var(--color-danger) 85%,#000)}.btn-sm{min-height:30px;padding:0 var(--space-3);font-size:var(--text-xs)}.icon-btn{display:inline-grid;place-items:center;width:36px;height:36px;padding:0;border:none;border-radius:var(--radius-md);background:none;color:var(--color-text-muted);cursor:pointer;transition:background var(--dur-fast),color var(--dur-fast)}.icon-btn:hover{background:var(--color-bg-subtle);color:var(--color-text)}.icon-btn-sm{width:28px;height:28px}.icon-btn.danger:hover{color:var(--color-danger)}@media(pointer:coarse){.icon-btn{width:44px;height:44px}}.spinner{width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.field{display:flex;flex-direction:column;gap:var(--space-1)}.field-label{font-size:var(--text-sm);font-weight:600}.field-label .required{color:var(--color-danger);margin-left:2px}.field-hint{font-size:var(--text-xs);color:var(--color-text-muted)}.field-error{font-size:var(--text-xs);color:var(--color-danger)}.input,.select,.textarea{width:100%;min-height:40px;padding:var(--space-2) var(--space-3);border:1px solid var(--color-border);border-radius:var(--radius-md);background:var(--color-surface);color:var(--color-text);font:inherit;font-size:var(--text-sm);line-height:1.5;transition:border-color var(--dur-fast),box-shadow var(--dur-fast)}.input:focus,.select:focus,.textarea:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px var(--color-primary-subtle)}.input[aria-invalid=true],.select[aria-invalid=true]{border-color:var(--color-danger)}.radio-group{display:flex;gap:var(--space-4);font-size:var(--text-sm);min-height:40px;align-items:center}.radio-group label{display:inline-flex;align-items:center;gap:var(--space-1);cursor:pointer}.switch{position:relative;width:40px;height:22px;padding:0;border:none;border-radius:999px;background:var(--color-border);cursor:pointer;transition:background var(--dur-fast)}.switch:after{content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:var(--shadow-sm);transition:transform var(--dur-fast)}.switch[aria-checked=true]{background:var(--color-success)}.switch[aria-checked=true]:after{transform:translate(18px)}.switch:disabled{opacity:.6;cursor:wait}.badge{display:inline-flex;align-items:center;padding:1px var(--space-2);border-radius:var(--radius-sm);font-size:var(--text-xs);font-weight:500;line-height:1.6;white-space:nowrap}.badge-muted{background:var(--color-bg-subtle);color:var(--color-text-muted);border:1px solid var(--color-border)}.badge-warning{background:color-mix(in srgb,var(--color-warning) 14%,transparent);color:var(--color-warning)}.badge-success{background:color-mix(in srgb,var(--color-success) 14%,transparent);color:var(--color-success)}.tag-chip{position:relative;display:inline-flex;align-items:center;padding:2px var(--space-2);border-radius:var(--radius-sm);background:var(--color-bg-subtle);color:var(--color-text-muted);font-size:var(--text-xs);font-weight:500;line-height:1.6;transition:color var(--dur-fast),background var(--dur-fast)}a.tag-chip:hover{color:var(--color-primary);background:var(--color-primary-subtle)}.tag-list{display:flex;flex-wrap:wrap;gap:var(--space-1);padding:0;margin:0;list-style:none}.skeleton{display:block;border-radius:var(--radius-sm);background:linear-gradient(90deg,var(--color-bg-subtle) 25%,var(--color-border) 50%,var(--color-bg-subtle) 75%);background-size:200% 100%;animation:shimmer 1.5s infinite}@keyframes shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media(prefers-reduced-motion:reduce){.skeleton{animation:none}}.state-box{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);padding:var(--space-12) var(--space-4);text-align:center;color:var(--color-text-muted);font-size:var(--text-sm)}.state-box svg{color:var(--color-text-muted);opacity:.7}.state-box.error{color:var(--color-danger)}.fade-in{animation:fadeIn var(--dur-base) ease-out both}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
