*{box-sizing:border-box}:root{--bg: #fbf8f3;--bg-2: #f0eae0;--panel: #ffffff;--panel-2: #f4efe6;--panel-3: #e8dfd0;--border: #e0d5bf;--border-strong: #c2b69e;--text: #2a1f18;--text-2: #4a3a2c;--text-dim: #75614f;--text-muted: #a89682;--accent: #b8253d;--accent-strong: #d63b53;--accent-fg: #ffffff;--accent-bg: rgba(184, 37, 61, .1);--accent-border: rgba(184, 37, 61, .45);--warn: #b8924e;--warn-bg: rgba(184, 146, 78, .18);--warn-border: rgba(184, 146, 78, .5);--success: #2d7a3f;--success-fg: #ffffff;--success-bg: rgba(45, 122, 63, .12);--success-border: rgba(45, 122, 63, .4);--danger: #b8253d;--danger-bg: rgba(184, 37, 61, .1);--danger-border: rgba(184, 37, 61, .4);--radius: 6px;--radius-lg: 8px;--shadow-sm: 0 1px 2px rgba(40, 30, 20, .06);--shadow-md: 0 4px 16px rgba(40, 30, 20, .14)}html,body,#root{height:100%;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang TC,Microsoft JhengHei,sans-serif;background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}a{color:var(--accent-strong);text-decoration:none}a:hover{text-decoration:underline}.btn{display:inline-flex;align-items:center;gap:6px;font:inherit;font-size:13px;font-weight:500;background:var(--panel-2);color:var(--text-2);border:1px solid var(--border);padding:6px 12px;border-radius:var(--radius);cursor:pointer;transition:background .1s,border-color .1s,color .1s;white-space:nowrap;text-decoration:none}.btn:hover:not(:disabled){background:var(--panel-3);border-color:var(--border-strong);color:var(--text);text-decoration:none}.btn:disabled{opacity:.45;cursor:not-allowed}.btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-fg);font-weight:600}.btn.primary:hover:not(:disabled){background:var(--accent-strong);border-color:var(--accent-strong)}.btn.success{background:var(--success);border-color:var(--success);color:var(--success-fg);font-weight:600;box-shadow:0 0 0 1px #2d7a3f59,0 4px 14px #2d7a3f38}.btn.success:hover:not(:disabled){filter:brightness(1.08)}.btn.pulse{animation:btn-pulse .9s ease-out 3}@keyframes btn-pulse{0%{box-shadow:0 0 #2d7a3f99,0 0 0 1px #2d7a3f66,0 4px 14px #2d7a3f40;transform:scale(1)}60%{box-shadow:0 0 0 12px #2d7a3f00,0 0 0 1px #2d7a3f66,0 4px 14px #2d7a3f40;transform:scale(1.04)}to{box-shadow:0 0 #2d7a3f00,0 0 0 1px #2d7a3f59,0 4px 14px #2d7a3f38;transform:scale(1)}}.btn.danger{color:var(--danger);border-color:var(--border)}.btn.danger:hover:not(:disabled){background:var(--danger-bg);border-color:var(--danger-border);color:var(--danger)}.btn.ghost{background:transparent;border-color:transparent}.btn.ghost:hover:not(:disabled){background:var(--panel-2);border-color:var(--border)}.btn.sm{padding:4px 8px;font-size:12px;gap:4px}.btn.lg{padding:8px 16px;font-size:14px}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;background:transparent;color:var(--text-dim);border:1px solid transparent;border-radius:var(--radius);cursor:pointer;transition:background .1s,color .1s,border-color .1s;font-size:14px;line-height:1}.btn-icon:hover:not(:disabled){background:var(--panel-2);color:var(--text);border-color:var(--border)}.btn-icon.danger:hover:not(:disabled){color:var(--danger);border-color:var(--danger-border);background:var(--danger-bg)}.btn-icon:disabled{opacity:.4;cursor:not-allowed}input,textarea,select{font:inherit;background:var(--bg-2);color:var(--text);border:1px solid var(--border);border-radius:var(--radius);padding:6px 10px;width:100%}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}input::placeholder{color:var(--text-muted)}.app{display:flex;flex-direction:column;height:100vh;min-height:0}.appbar{display:flex;align-items:center;gap:12px;padding:0 16px;height:44px;flex-shrink:0;border-bottom:1px solid var(--border);background:var(--panel)}.appbar .logo{display:inline-flex;align-items:center;gap:8px;font-weight:700;font-size:14px;color:var(--text);letter-spacing:-.01em;text-decoration:none}.appbar .logo:hover{text-decoration:none;color:var(--accent-strong)}.appbar .crumb{display:flex;align-items:center;gap:6px;color:var(--text-dim);font-size:13px}.appbar .crumb .sep{color:var(--text-muted)}.appbar .spacer{flex:1}.main{flex:1;min-height:0;overflow:hidden}.login-shell{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px;background:var(--bg, transparent)}.site-list{padding:32px 24px;max-width:960px;margin:0 auto}.site-list-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px}.site-list-head h1{font-size:22px;font-weight:700;margin:0;letter-spacing:-.01em}.cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}.site-card{display:flex;flex-direction:column;gap:10px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px;transition:border-color .1s,transform .1s}.site-card:hover{border-color:var(--accent-border)}.site-card .name{font-weight:600;font-size:15px;color:var(--text);letter-spacing:-.01em}.site-card .meta{color:var(--text-dim);font-size:12px}.site-card .actions{display:flex;gap:6px;margin-top:4px}.site-card .actions .btn{flex:1;justify-content:center}.create-form{display:flex;gap:8px;background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:12px;margin-bottom:14px}.create-form input{flex:1}.editor-shell{display:grid;grid-template-columns:260px minmax(0,1fr) 340px;grid-template-rows:1fr;height:100%;min-height:0}.sidebar{background:var(--panel);border-right:1px solid var(--border);overflow-y:auto;display:flex;flex-direction:column}.sidebar-section{border-bottom:1px solid var(--border);padding:10px 0}.sidebar-section:last-child{border-bottom:none}.sidebar-head{display:flex;align-items:center;justify-content:space-between;padding:4px 12px 8px}.sidebar-head h3{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:0;font-weight:600}.sidebar-head .count{color:var(--text-muted);font-size:11px;font-weight:400}.sidebar-list{list-style:none;padding:0 6px;margin:0}.sidebar-row{display:flex;align-items:center;gap:6px;padding:6px 8px;border-radius:5px;cursor:pointer;font-size:13px;color:var(--text-2);transition:background .08s;min-height:32px}.sidebar-row:hover{background:var(--panel-2)}.sidebar-row.active{background:var(--accent-bg);color:var(--accent-strong)}.sidebar-row .label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-row .label-sub{display:block;color:var(--text-muted);font-size:11px;line-height:1.3}.sidebar-row.active .label-sub{color:var(--accent);opacity:.8}.sidebar-row .row-actions{display:flex;gap:2px;opacity:.7}.sidebar-row:hover .row-actions{opacity:1}.tag{display:inline-block;font-size:10px;font-weight:600;padding:1px 5px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}.tag-warn{background:var(--warn-bg);color:var(--warn)}.sidebar-form{padding:4px 12px 8px;display:flex;gap:4px}.sidebar-form input{font-size:12px;padding:4px 8px}.sidebar-search{padding:4px 12px 8px;position:relative}.sidebar-search input{font-size:12px;padding:5px 10px 5px 26px;width:100%}.sidebar-search:before{content:"";position:absolute;left:20px;top:50%;width:11px;height:11px;margin-top:-7px;border:1.5px solid var(--text-muted);border-radius:50%;pointer-events:none}.sidebar-search:after{content:"";position:absolute;left:28px;top:50%;width:5px;height:1.5px;margin-top:4px;background:var(--text-muted);transform:rotate(45deg);transform-origin:0 0;pointer-events:none}.sidebar-search input:focus~.search-clear,.sidebar-search .search-clear{position:absolute;right:18px;top:50%;transform:translateY(-50%)}.sidebar-pager{display:flex;align-items:center;gap:6px;padding:6px 12px 4px;border-top:1px solid var(--border);margin-top:4px;font-size:11px;color:var(--text-dim)}.sidebar-pager .btn-icon{width:22px;height:22px;font-size:11px}.sidebar-pager .pager-label{font-variant-numeric:tabular-nums;font-weight:500;color:var(--text-2);min-width:40px;text-align:center}.sidebar-pager .pager-count{margin-left:auto;color:var(--text-muted);font-variant-numeric:tabular-nums}.sidebar-empty{padding:8px 14px;color:var(--text-muted);font-size:12px;font-style:italic}.sidebar-dropzone{margin:6px 12px 4px;padding:14px;border:1px dashed var(--border-strong);border-radius:var(--radius);text-align:center;font-size:12px;color:var(--text-dim);cursor:pointer;transition:border-color .1s,background .1s}.sidebar-dropzone:hover,.sidebar-dropzone.active{border-color:var(--accent);background:var(--accent-bg);color:var(--accent-strong)}.editor-main{display:flex;flex-direction:column;min-height:0;background:var(--bg)}.editor-toolbar{display:flex;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--border);background:var(--panel);flex-shrink:0}.editor-toolbar .title{font-weight:600;font-size:14px;color:var(--text)}.editor-toolbar .file-meta{color:var(--text-muted);font-size:12px;font-family:ui-monospace,SF Mono,Menlo,monospace}.editor-toolbar .grow{flex:1}.editor-toolbar .actions{display:flex;gap:6px}.editor-panes{flex:1;display:flex;flex-direction:row;min-height:0;position:relative}.editor-panes.dropzone-active:after{content:"放開以上傳圖片";position:absolute;top:12px;right:12px;bottom:12px;left:12px;border:2px dashed var(--accent);border-radius:var(--radius-lg);background:var(--accent-bg);color:var(--accent-strong);font-size:16px;font-weight:600;display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:5}.pane{display:flex;flex-direction:column;min-height:0}.pane-body{flex:1;min-width:0;min-height:0}.fm-host{border-top:1px solid var(--border);background:var(--bg)}.pane-body .pane-split{flex:1;display:flex;min-height:0}.pane-body .pane-cm{flex:1 1 0;min-width:0;border-right:1px solid var(--border)}.pane-body .pane-preview{flex:1 1 0;min-width:0;overflow-y:auto;padding:18px 24px;background:var(--bg);font-size:14px;line-height:1.7;color:var(--text-2)}.markdown-preview-empty{color:var(--text-muted);font-size:13px;font-style:italic}.markdown-preview>*:first-child{margin-top:0}.markdown-preview>*:last-child{margin-bottom:0}.markdown-preview h1{font-size:24px;font-weight:700;line-height:1.3;margin:0 0 14px;color:var(--text);border-bottom:1px solid var(--border);padding-bottom:8px}.markdown-preview h2{font-size:19px;font-weight:600;line-height:1.35;margin:24px 0 10px;color:var(--text)}.markdown-preview h3{font-size:16px;font-weight:600;line-height:1.4;margin:20px 0 8px;color:var(--text)}.markdown-preview p{margin:0 0 12px}.markdown-preview a{color:var(--accent-strong);text-decoration:underline;text-underline-offset:2px}.markdown-preview ul,.markdown-preview ol{margin:0 0 12px;padding-left:24px}.markdown-preview li{margin:4px 0}.markdown-preview img{max-width:100%;height:auto;border-radius:var(--radius);display:block;margin:14px 0;background:var(--panel-2)}.markdown-preview code{background:var(--panel-2);padding:1px 6px;border-radius:3px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:12.5px;color:var(--accent-strong)}.markdown-preview pre{background:var(--bg-2);border:1px solid var(--border);padding:12px;border-radius:var(--radius);overflow-x:auto;margin:0 0 12px}.markdown-preview pre code{background:transparent;padding:0;color:var(--text-2)}.markdown-preview blockquote{border-left:3px solid var(--accent);padding:4px 12px;color:var(--text-dim);margin:12px 0}.markdown-preview hr{border:none;border-top:1px solid var(--border);margin:24px 0}.markdown-preview table{border-collapse:collapse;margin:12px 0;font-size:13px}.markdown-preview th,.markdown-preview td{padding:6px 12px;border:1px solid var(--border);text-align:left}.markdown-preview th{background:var(--panel-2);font-weight:600;color:var(--text)}.markdown-preview strong{color:var(--text);font-weight:600}.pane-label{display:flex;align-items:center;gap:6px;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-dim);padding:6px 16px;background:var(--panel);border-bottom:1px solid var(--border);font-weight:600}.pane-label .hint{font-weight:400;text-transform:none;letter-spacing:0;color:var(--text-muted);margin-left:auto}.pane-cm{flex:1;overflow:auto}.pane-cm .cm-editor{height:100%}.editor-statusbar{display:flex;align-items:center;gap:12px;padding:6px 16px;border-top:1px solid var(--border);background:var(--panel);font-size:12px;color:var(--text-dim);flex-shrink:0}.editor-statusbar .dot{width:6px;height:6px;border-radius:50%;background:var(--text-muted);display:inline-block}.editor-statusbar.dirty .dot{background:var(--warn)}.editor-statusbar.saving .dot{background:var(--accent);animation:pulse 1s ease-in-out infinite}.editor-statusbar.saved .dot{background:var(--success)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.4}}.right-panel{background:var(--panel);border-left:1px solid var(--border);overflow-y:auto;display:flex;flex-direction:column}.right-section{border-bottom:1px solid var(--border)}.right-section:last-child{border-bottom:none}.right-section-head{padding:10px 16px 6px;display:flex;align-items:center;justify-content:space-between}.right-section-head h3{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-dim);margin:0;font-weight:600}.right-section-body{padding:0 12px 14px}.build-actions{display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap}.build-actions .btn{flex:1;justify-content:center;min-width:0}.deploy-url-link{display:block;padding:8px 10px;margin:8px 0;background:var(--success-bg);border:1px solid var(--success-border);border-radius:var(--radius);color:var(--success);font-size:12px;font-family:ui-monospace,SF Mono,Menlo,monospace;word-break:break-all;text-decoration:none}.deploy-url-link:hover{text-decoration:underline;background:#2d7a3f2e}.build-status-row{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-dim);margin-bottom:6px}.build-log{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:11px;line-height:1.4;white-space:pre-wrap;max-height:200px;overflow-y:auto;color:var(--text-2)}.build-empty{color:var(--text-muted);font-size:12px;padding:4px 0}.status-pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:500;border:1px solid transparent}.status-pill.running{background:var(--warn-bg);color:var(--warn);border-color:var(--warn-border)}.status-pill.success{background:var(--success-bg);color:var(--success);border-color:var(--success-border)}.status-pill.error{background:var(--danger-bg);color:var(--danger);border-color:var(--danger-border)}.status-pill:before{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:currentColor}.status-pill.running:before{animation:pulse 1.2s ease-in-out infinite}.history-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px}.history-item{padding:10px;border-radius:var(--radius);border:1px solid var(--border);background:var(--bg)}.history-item.current{border-color:var(--accent-border);background:var(--accent-bg)}.history-item .when{font-weight:500;font-size:13px;color:var(--text);margin-bottom:2px}.history-item.current .when{color:var(--accent-strong)}.history-item .when .badge{display:inline-block;font-size:10px;font-weight:700;padding:1px 6px;border-radius:3px;background:var(--accent);color:var(--accent-fg);margin-left:6px;text-transform:uppercase;letter-spacing:.04em}.history-item .timestamp{color:var(--text-muted);font-size:11px;font-family:ui-monospace,monospace}.history-item .actions{display:flex;gap:6px;margin-top:8px}.history-item .actions .btn{flex:1;justify-content:center}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:100;padding:24px}.modal{background:var(--panel);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-md);max-width:720px;width:100%;max-height:80vh;display:flex;flex-direction:column}.modal-head{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border)}.modal-head h3{margin:0;font-size:15px;font-weight:600}.modal-body{padding:16px 18px;overflow-y:auto;flex:1}.modal-foot{display:flex;justify-content:flex-end;gap:8px;padding:12px 18px;border-top:1px solid var(--border)}.modal pre{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;font-size:12px;white-space:pre-wrap;word-break:break-word;margin:0}.modal .pane-label{padding:0;background:transparent;border:none;margin-bottom:4px}.empty-state{padding:60px 20px;text-align:center;color:var(--text-dim);display:flex;flex-direction:column;align-items:center;gap:4px}.empty-state .icon{margin-bottom:8px;opacity:.55}.empty-state .title{font-size:14px;color:var(--text-2);font-weight:500}.empty-state .hint{font-size:12px;color:var(--text-muted)}.asset-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:5px;font-size:12px;color:var(--text-2);cursor:pointer;min-height:32px}.asset-row:hover{background:var(--panel-2)}.asset-row .thumb{width:22px;height:22px;background:var(--panel-3);border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--text-dim);flex-shrink:0;overflow:hidden}.asset-row .thumb img{width:100%;height:100%;object-fit:cover}.asset-row .name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,monospace;font-size:11px}.asset-row .row-actions{display:flex;gap:2px}.cm-editor.cm-focused{outline:none}.cm-gutters{background:var(--panel)!important;border-right:1px solid var(--border)!important}.cm-content{caret-color:var(--text)}.toast{position:fixed;bottom:24px;left:50%;transform:translate(-50%);background:var(--panel-2);border:1px solid var(--border-strong);color:var(--text);padding:8px 14px;border-radius:var(--radius);font-size:13px;box-shadow:var(--shadow-md);z-index:200;animation:toast-in .15s ease}@keyframes toast-in{0%{opacity:0;transform:translate(-50%,8px)}to{opacity:1;transform:translate(-50%)}}.fm-form{display:flex;flex-direction:column;gap:10px;padding:8px 10px 12px;font-size:12px}.fm-form .fm-field{display:flex;flex-direction:column;gap:4px}.fm-form .fm-label{color:var(--text-dim);font-size:11px;letter-spacing:.04em;text-transform:uppercase}.fm-form input[type=text],.fm-form input[type=date],.fm-form input:not([type]),.fm-form textarea{width:100%;padding:5px 8px;font-size:12px;background:var(--bg-2);color:var(--text);border:1px solid var(--border);border-radius:4px;font-family:ui-monospace,SF Mono,Menlo,monospace}.fm-form textarea{resize:vertical;min-height:36px;line-height:1.5}.fm-form input:focus,.fm-form textarea:focus{outline:2px solid var(--accent);outline-offset:-1px;border-color:var(--accent)}.fm-form input[type=checkbox]{width:auto;padding:0;margin:0;flex:0 0 auto}.fm-form .fm-checkbox{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--text-2);cursor:pointer}.fm-form .fm-group{margin:4px 0 0;border:1px solid var(--border);border-radius:6px}.fm-form .fm-group>summary{padding:8px 10px;font-size:11px;color:var(--text-dim);letter-spacing:.04em;text-transform:uppercase;cursor:pointer;-webkit-user-select:none;user-select:none;list-style-position:outside}.fm-form .fm-group[open]>summary{border-bottom:1px solid var(--border)}.fm-form .fm-group-body{padding:8px 10px 10px;display:flex;flex-direction:column;gap:8px}.fm-form .fm-faq-row{display:flex;flex-direction:column;gap:4px;padding:8px;border:1px solid var(--border);border-radius:4px;background:var(--bg)}.fm-form .fm-faq-head{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--text-dim)}.redirects-panel{display:flex;flex-direction:column;gap:8px}.redirects-help{font-size:11px;color:var(--text-dim);line-height:1.6}.redirects-help code{font-size:11px;background:var(--bg-2);padding:1px 4px;border-radius:3px}.redirects-editor{border:1px solid var(--border);border-radius:4px;background:var(--bg-2);overflow:hidden}.redirects-err{color:var(--danger);font-size:11px;background:var(--danger-bg, rgba(220, 38, 38, .06));padding:6px 8px;border-radius:4px}.redirects-actions{display:flex;justify-content:flex-end}
