@charset "UTF-8";.pwa-prompts[data-v-f1dd52df]{position:fixed;z-index:9999;pointer-events:none}.pwa-banner[data-v-f1dd52df]{position:fixed;left:50%;transform:translate(-50%);max-width:600px;width:calc(100% - 32px);margin:0 16px;padding:16px 20px;background:var(--ui-surface-raised);border-radius:12px;box-shadow:var(--ui-shadow-overlay);display:flex;align-items:center;justify-content:space-between;gap:16px;pointer-events:auto}@media (max-width: 640px){.pwa-banner[data-v-f1dd52df]{flex-direction:column;align-items:flex-start}}.offline-banner[data-v-f1dd52df]{top:16px;background:var(--ui-status-danger);color:var(--ui-on-danger)}.install-banner[data-v-f1dd52df],.update-banner[data-v-f1dd52df]{bottom:16px}.update-banner[data-v-f1dd52df]{background:var(--ui-action);color:var(--ui-on-action)}.banner-content[data-v-f1dd52df]{display:flex;align-items:center;gap:12px;flex:1}.icon[data-v-f1dd52df]{width:24px;height:24px;flex-shrink:0}.banner-text[data-v-f1dd52df]{display:flex;flex-direction:column;gap:2px}.banner-text strong[data-v-f1dd52df]{font-size:14px;font-weight:600}.banner-text span[data-v-f1dd52df]{font-size:13px;opacity:.9}.banner-actions[data-v-f1dd52df]{display:flex;gap:8px;flex-shrink:0}@media (max-width: 640px){.banner-actions[data-v-f1dd52df]{width:100%}.banner-actions .btn[data-v-f1dd52df]{flex:1}}.btn[data-v-f1dd52df]{padding:8px 16px;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s ease}.btn[data-v-f1dd52df]:active{transform:scale(.98)}.btn-primary[data-v-f1dd52df]{background:var(--ui-surface-raised);color:var(--ui-action)}.install-banner .btn-primary[data-v-f1dd52df],.update-banner .btn-primary[data-v-f1dd52df]{background:color-mix(in srgb,var(--ui-on-action) 20%,transparent);color:var(--ui-on-action);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.install-banner .btn-primary[data-v-f1dd52df]:hover,.update-banner .btn-primary[data-v-f1dd52df]:hover{background:color-mix(in srgb,var(--ui-on-action) 30%,transparent)}.btn-primary[data-v-f1dd52df]:hover{background:var(--ui-surface-muted)}.btn-ghost[data-v-f1dd52df]{background:transparent;color:var(--ui-on-action)}.btn-ghost[data-v-f1dd52df]:hover{background:color-mix(in srgb,var(--ui-on-action) 10%,transparent)}.slide-down-enter-active[data-v-f1dd52df],.slide-down-leave-active[data-v-f1dd52df]{transition:all .3s ease}.slide-down-enter-from[data-v-f1dd52df],.slide-down-leave-to[data-v-f1dd52df]{opacity:0;transform:translate(-50%) translateY(-20px)}.slide-up-enter-active[data-v-f1dd52df],.slide-up-leave-active[data-v-f1dd52df]{transition:all .3s ease}.slide-up-enter-from[data-v-f1dd52df],.slide-up-leave-to[data-v-f1dd52df]{opacity:0;transform:translate(-50%) translateY(20px)}html,body{width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.app-shell{width:100%;min-height:100vh}:root{--color-primary: var(--ui-action);--color-primary-dark: var(--ui-action-hover);--color-primary-light: var(--ui-link);--color-success: var(--ui-status-success);--color-warning: var(--ui-status-warning);--color-danger: var(--ui-status-danger);--color-info: var(--ui-status-info);--text-color-primary: var(--ui-text-primary);--text-color-regular: var(--ui-text-regular);--text-color-secondary: var(--ui-text-secondary);--text-color-placeholder: var(--ui-text-muted);--bg-color: var(--ui-surface);--bg-color-page: var(--ui-canvas);--bg-color-secondary: var(--ui-surface-muted);--bg-color-overlay: var(--ui-surface-raised);--border-color: var(--ui-border-strong);--border-color-light: var(--ui-border);--border-color-lighter: var(--ui-surface-muted);--border-color-extra-light: var(--ui-canvas);--spacing-xs: 4px;--spacing-sm: 8px;--spacing-md: 16px;--spacing-lg: 24px;--spacing-xl: 32px;--font-size-xs: 12px;--font-size-sm: 14px;--font-size-md: 16px;--font-size-lg: 18px;--font-size-xl: 20px;--font-size-xxl: 24px;--border-radius-sm: 4px;--border-radius-md: 8px;--border-radius-lg: 12px;--box-shadow-sm: var(--ui-shadow-surface);--box-shadow-md: var(--ui-shadow-overlay);--box-shadow-lg: var(--ui-shadow-overlay)}:root{--ui-control-height: 40px;--ui-touch-height: 44px;--ui-focus-ring: 0 0 0 3px var(--ui-focus-ring-color);--ui-content-measure: 72ch;--ui-page-gutter: clamp(16px, 3vw, 40px);--ui-radius-control: 8px;--ui-radius-surface: 8px;--ui-space-1: 4px;--ui-space-2: 8px;--ui-space-3: 12px;--ui-space-4: 16px;--ui-space-5: 24px;--ui-space-6: 32px;--ui-space-7: 48px;--ui-shadow-surface: 0 1px 2px rgb(15 23 42 / .06);--ui-shadow-overlay: 0 18px 42px rgb(15 23 42 / .16);--ui-on-danger: var(--ui-on-action);--ui-skeleton-base: var(--ui-surface-muted);--ui-skeleton-highlight: var(--ui-surface-raised)}::selection{background:var(--ui-selection-bg);color:var(--ui-selection-text);text-shadow:none}::-moz-selection{background:var(--ui-selection-bg);color:var(--ui-selection-text);text-shadow:none}.blog-content{color:var(--ui-text-regular)}.blog-content :where(code:not(pre code)){padding:.12em .34em;border:1px solid var(--ui-code-border);border-radius:4px;background:var(--ui-code-inline-surface);color:var(--ui-code-inline-text)}.blog-content :where(pre,.blog-mermaid){border:1px solid var(--ui-code-border);background:var(--ui-code-surface);color:var(--ui-code-text)}.blog-content :where(.blog-mermaid){background:var(--ui-diagram-surface);color:var(--ui-text-regular)}.blog-content .blog-render-error{color:var(--ui-status-danger)}[data-theme=dark]{--text-color-primary: var(--ui-text-primary);--text-color-regular: var(--ui-text-regular);--text-color-secondary: var(--ui-text-secondary);--text-color-placeholder: var(--ui-text-muted);--bg-color: var(--ui-surface);--bg-color-page: var(--ui-canvas);--bg-color-overlay: var(--ui-surface-raised);--border-color: var(--ui-border-strong);--border-color-light: var(--ui-border);--border-color-lighter: var(--ui-surface-muted);--border-color-extra-light: var(--ui-canvas)}*{margin:0;padding:0;box-sizing:border-box}html{font-size:16px;color-scheme:light;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}html[data-theme=dark]{color-scheme:dark}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;color:var(--text-color-primary);background-color:var(--bg-color-page);line-height:1.6}a{color:var(--color-primary);text-decoration:none;transition:color .3s ease}a:hover{color:var(--color-primary-dark)}img{max-width:100%;height:auto;display:block}.container{max-width:1200px;margin:0 auto;padding:0 var(--spacing-md)}.text-center{text-align:center}.mt-sm{margin-top:var(--spacing-sm)}.mt-md{margin-top:var(--spacing-md)}.mt-lg{margin-top:var(--spacing-lg)}.mb-sm{margin-bottom:var(--spacing-sm)}.mb-md{margin-bottom:var(--spacing-md)}.mb-lg{margin-bottom:var(--spacing-lg)}button,input,textarea,select{font:inherit}button,a{-webkit-tap-highlight-color:transparent}:focus-visible{outline:3px solid var(--ui-focus-ring-color);outline-offset:3px}.theme-default,.theme-tech-blog{min-height:100vh;color:var(--ui-text-primary);background:var(--ui-canvas)}.theme-default .page-shell,.theme-tech-blog .page-shell{width:100%;min-width:0;max-width:100%}.theme-default .page-hero,.theme-tech-blog .page-hero{display:grid;gap:14px;padding:8px 0 26px;border-bottom:1px solid var(--ui-border);margin-bottom:24px;min-width:0;max-width:100%}.theme-default .page-kicker,.theme-tech-blog .page-kicker{color:var(--ui-accent);font-size:12px;font-weight:800;letter-spacing:0;text-transform:uppercase}.theme-default .page-title,.theme-tech-blog .page-title{color:var(--ui-text-primary);font-size:36px;line-height:1.08;font-weight:850;letter-spacing:0;margin:0;max-width:820px;overflow-wrap:anywhere;word-break:break-word}.theme-default .page-description,.theme-tech-blog .page-description{color:var(--ui-text-secondary);font-size:17px;line-height:1.7;max-width:720px;margin:0;overflow-wrap:anywhere;word-break:break-word}.theme-default .page-metrics,.theme-tech-blog .page-metrics{display:flex;flex-wrap:wrap;gap:8px;list-style:none;margin:4px 0 0;padding:0;min-width:0;max-width:100%}.theme-default .page-metrics li,.theme-default .metric-chip,.theme-tech-blog .page-metrics li,.theme-tech-blog .metric-chip{display:inline-flex;align-items:center;min-height:32px;padding:6px 10px;border:1px solid var(--ui-border);border-radius:8px;background:var(--ui-surface);color:var(--ui-text-secondary);font-size:13px;font-weight:700;min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.theme-default .content-list,.theme-tech-blog .content-list{display:grid;gap:16px;min-width:0;max-width:100%}.theme-default .post-card,.theme-tech-blog .post-card{display:grid;grid-template-columns:minmax(0,240px) minmax(0,1fr);gap:20px;min-width:0;padding:16px;border:1px solid var(--ui-border);border-radius:8px;background:var(--ui-surface);box-shadow:var(--ui-shadow-surface);transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease;max-width:100%}.theme-default .post-card:hover,.theme-tech-blog .post-card:hover{border-color:var(--ui-border-strong);box-shadow:var(--ui-shadow-overlay)}.theme-default .post-card__media,.theme-tech-blog .post-card__media{position:relative;display:block;overflow:hidden;min-width:0;max-width:100%;min-height:170px;aspect-ratio:4/3;border-radius:8px;border:1px solid var(--ui-border);background:var(--ui-surface-muted)}.theme-default .post-card__media img,.theme-tech-blog .post-card__media img{width:100%;height:100%;object-fit:cover;transition:transform .26s ease,opacity .18s ease}.theme-default .post-card:hover .post-card__media img,.theme-tech-blog .post-card:hover .post-card__media img{transform:scale(1.025)}.theme-default .post-card__placeholder,.theme-tech-blog .post-card__placeholder{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;color:var(--ui-text-muted)}.theme-default .post-card__body,.theme-tech-blog .post-card__body{display:grid;align-content:start;gap:10px;min-width:0}.theme-default .post-title,.theme-tech-blog .post-title{margin:0;color:var(--ui-text-primary);font-size:24px;line-height:1.22;font-weight:830;letter-spacing:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.theme-default .post-title a,.theme-tech-blog .post-title a{color:inherit;text-decoration:none;overflow-wrap:anywhere;word-break:break-word}.theme-default .post-title a:hover,.theme-tech-blog .post-title a:hover{color:var(--ui-action)}.theme-default .post-meta,.theme-tech-blog .post-meta{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;color:var(--ui-text-secondary);font-size:13px;font-weight:700;min-width:0;max-width:100%;overflow-wrap:anywhere;word-break:break-word}.theme-default .post-excerpt,.theme-tech-blog .post-excerpt{color:var(--ui-text-regular);line-height:1.74;margin:0;overflow-wrap:anywhere;word-break:break-word;max-width:100%}.theme-default .read-more,.theme-tech-blog .read-more{display:inline-flex;align-items:center;gap:8px;width:fit-content;min-height:var(--ui-touch-height);color:var(--ui-action);font-size:14px;font-weight:800;text-decoration:none}.theme-default .read-more svg,.theme-tech-blog .read-more svg{width:16px;height:16px;transition:transform .16s ease}.theme-default .read-more:hover svg,.theme-tech-blog .read-more:hover svg{transform:translate(3px)}.theme-default .pagination,.theme-tech-blog .pagination{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:24px;padding-top:8px}.theme-default .page-btn,.theme-default .pagination-btn,.theme-default .pagination-page,.theme-tech-blog .page-btn,.theme-tech-blog .pagination-btn,.theme-tech-blog .pagination-page{display:inline-flex;align-items:center;justify-content:center;min-width:40px;min-height:40px;padding:0 12px;border:1px solid var(--ui-border);border-radius:8px;background:var(--ui-surface);color:var(--ui-text-primary);cursor:pointer;font-weight:800;transition:border-color .18s ease,color .18s ease,background-color .18s ease}.theme-default .pagination a,.theme-tech-blog .pagination a{min-width:40px;min-height:var(--ui-touch-height)}.theme-default .page-btn:hover:not(:disabled):not(.active),.theme-default .pagination-btn:hover:not(:disabled),.theme-default .pagination-page:hover:not(:disabled):not(.active),.theme-tech-blog .page-btn:hover:not(:disabled):not(.active),.theme-tech-blog .pagination-btn:hover:not(:disabled),.theme-tech-blog .pagination-page:hover:not(:disabled):not(.active){border-color:var(--ui-action);color:var(--ui-action)}.theme-default .page-btn.active,.theme-default .pagination-page.active,.theme-tech-blog .page-btn.active,.theme-tech-blog .pagination-page.active{background:var(--ui-action);border-color:var(--ui-action);color:var(--ui-on-action)}.theme-default .state-panel,.theme-tech-blog .state-panel{display:grid;place-items:center;min-height:220px;padding:32px;border:1px dashed var(--ui-border-strong);border-radius:8px;background:var(--ui-surface);color:var(--ui-text-secondary);text-align:center}.theme-default .search-panel,.theme-tech-blog .search-panel{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;margin-bottom:22px;padding:12px;border:1px solid var(--ui-border);border-radius:8px;background:var(--ui-surface)}.theme-default .search-panel input,.theme-tech-blog .search-panel input{min-width:0;min-height:44px;border:1px solid var(--ui-border-strong);border-radius:8px;padding:0 14px;color:var(--ui-text-primary);background:var(--ui-surface-muted)}.theme-default .search-panel button,.theme-default .primary-action,.theme-tech-blog .search-panel button,.theme-tech-blog .primary-action{min-height:44px;border:1px solid var(--ui-action);border-radius:8px;padding:0 16px;background:var(--ui-action);color:var(--ui-on-action);cursor:pointer;font-weight:850}.theme-default .article-detail,.theme-tech-blog .article-detail{width:100%;max-width:860px;margin:0 auto;border:1px solid var(--ui-border);border-radius:8px;background:var(--ui-surface);box-shadow:var(--ui-shadow-surface)}.theme-default .article-content,.theme-tech-blog .article-content{color:var(--ui-text-regular);font-size:17px;line-height:1.86;overflow-wrap:anywhere}.theme-default .article-content :where(h1,h2,h3,h4,h5,h6),.theme-tech-blog .article-content :where(h1,h2,h3,h4,h5,h6){color:var(--ui-text-primary);line-height:1.22;letter-spacing:0}.theme-default .article-content :where(p,ul,ol,blockquote,pre,table,figure),.theme-tech-blog .article-content :where(p,ul,ol,blockquote,pre,table,figure){margin-top:0;margin-bottom:18px}.theme-default .article-content :where(img,video,iframe),.theme-tech-blog .article-content :where(img,video,iframe){max-width:100%}.theme-default .article-content :where(pre),.theme-tech-blog .article-content :where(pre){overflow-x:auto;border-radius:8px}@media (max-width: 820px){.theme-default .page-title,.theme-tech-blog .page-title{font-size:30px}.theme-default .page-description,.theme-tech-blog .page-description{font-size:16px}.theme-default .post-card,.theme-tech-blog .post-card{grid-template-columns:1fr;padding:12px;gap:14px}.theme-default .post-card__media,.theme-tech-blog .post-card__media{min-height:190px}.theme-default .post-title,.theme-tech-blog .post-title{font-size:22px}.theme-default .search-panel,.theme-tech-blog .search-panel{grid-template-columns:1fr}}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}
