*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--primary: #2d5a4a;--primary-dark: #1e4538;--primary-light: #eef2ef;--bg: #f7f5f2;--card: #ffffff;--text: #1e293b;--text-muted: #64748b;--border: #e2e8f0;--danger: #ef4444;--danger-light: #fef2f2;--success: #22c55e;--success-dark: #16a34a;--warning: #f59e0b;--neutral: #9ca3af;--sep: #cbd5e1}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;background:var(--bg);color:var(--text);min-height:100vh;display:flex;flex-direction:column}input[type=checkbox],input[type=radio]{width:auto;padding:0;border:none;border-radius:0;background:none;box-shadow:none}input:not([type=checkbox]):not([type=radio]),select{width:100%;padding:.75rem 1rem;border:1.5px solid var(--border);border-radius:.75rem;font-size:.95rem;color:var(--text);background:#fff;transition:border-color .2s,box-shadow .2s;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}input:not([type=checkbox]):not([type=radio]):focus,select:focus{border-color:var(--primary);box-shadow:0 0 0 3px #2d5a4a26}select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .9rem center;padding-right:2.5rem;cursor:pointer}.navbar{background:var(--primary);border-bottom:1px solid #1e4538;padding:0 1.5rem;height:60px;display:flex;align-items:center;justify-content:flex-start;position:sticky;top:0;z-index:100;box-shadow:0 2px 8px #0000002e;flex-shrink:0}.navbar-brand{display:flex;flex-direction:column;justify-content:center;gap:0;line-height:1}.navbar-brand-text{color:#fff;font-weight:700;font-size:1.1rem}.navbar-brand-tagline{font-size:.58rem;color:#ffffff80;letter-spacing:.14em;text-transform:uppercase;margin-top:2px}.app-layout{display:flex;flex:1;min-height:0;overflow:hidden}.sidebar{width:200px;flex-shrink:0;background:var(--primary-dark);border-right:1px solid #1a3d32;padding:1rem .75rem;display:flex;flex-direction:column;gap:.25rem}.nav-item{display:flex;align-items:center;padding:.55rem .75rem;cursor:pointer;font-size:.875rem;font-weight:400;letter-spacing:.03em;color:#ffffff73;transition:color .2s;position:relative}.nav-item:hover:not(.nav-disabled){color:#ffffffd9}.nav-item.active{color:#fffffff2;font-weight:500}.nav-item.nav-disabled{opacity:.5;cursor:not-allowed}.nav-label{flex:1}#view-container{flex:1;overflow-y:auto;padding:1.75rem 1.5rem}.view-content{max-width:1200px;margin:0 auto}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem 1.5rem;border:none;border-radius:.75rem;font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s;white-space:nowrap}.btn:disabled{opacity:.6;cursor:not-allowed;transform:none!important}.btn-primary{background:var(--primary);color:#fff}.btn-primary:not(:disabled):hover{background:var(--primary-dark);transform:translateY(-1px);box-shadow:0 4px 12px #2d5a4a59}.btn-secondary{background:#fff;color:var(--text);border:1.5px solid var(--border)}.btn-secondary:not(:disabled):hover{background:var(--bg);border-color:#cbd5e1}.btn-success{background:var(--success);color:#fff}.btn-success:not(:disabled):hover{background:var(--success-dark);transform:translateY(-1px);box-shadow:0 4px 12px #22c55e59}.btn-danger{background:var(--danger);color:#fff}.btn-danger:not(:disabled):hover{background:#dc2626;transform:translateY(-1px)}.btn-sm{padding:.45rem .9rem;font-size:.8rem;border-radius:.55rem}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;border:1px solid var(--border);border-radius:.5rem;background:#fff;color:var(--text-muted);cursor:pointer;font-size:.95rem;transition:all .15s}.icon-btn:hover{color:var(--primary);border-color:var(--primary);background:var(--primary-light)}.btn-text{background:transparent;color:var(--text-muted);border:none;padding:.5rem .75rem;font-weight:500;text-decoration:underline;text-underline-offset:3px;text-decoration-color:#64748b66;cursor:pointer}.btn-text:not(:disabled):hover{color:var(--primary);text-decoration-color:var(--primary);background:transparent}.section-card{background:#fff;border-radius:1.25rem;padding:1.75rem;border:none;box-shadow:0 2px 8px #0000000f;margin-bottom:2rem}.section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem}.section-title{font-size:1rem;font-weight:600;color:var(--text);display:flex;align-items:center;gap:.6rem}.device-grid{display:flex;flex-wrap:wrap;gap:.75rem}.device-card{position:relative;border:2px solid var(--border);border-radius:.75rem;padding:.875rem .75rem .75rem;cursor:pointer;transition:all .2s;display:flex;flex-direction:column;align-items:center;gap:0;width:168px;flex:0 0 auto}.device-card:hover{border-color:var(--primary);background:var(--primary-light)}.device-card:focus-visible{outline:3px solid var(--primary);outline-offset:2px}.device-card.selected{border-color:var(--primary);background:var(--primary-light);box-shadow:0 0 0 3px #2d5a4a26}.device-card-frame-box{width:128px;height:128px;flex-shrink:0;display:flex;align-items:flex-start;justify-content:center}.device-card-frame{box-sizing:border-box;position:relative;overflow:hidden;border:2px solid #8a5a2b;background:#d4d4d4;box-shadow:inset 0 0 0 2px #f5f1dc;border-radius:2px}.frame-thumb{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;object-fit:cover;object-position:center}.frame-thumb-rot{inset:auto;left:50%;top:50%;transform:translate(-50%,-50%) rotate(-90deg)}.device-card-frame.is-landscape{width:calc(100% - 12px);height:auto}.device-card-frame.is-portrait{height:calc(100% - 12px);width:auto}.device-card-name{width:100%;text-align:center;font-weight:600;font-size:.92rem;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:auto}.device-card-status{display:flex;align-items:center;justify-content:center;gap:.5rem;margin-top:.3rem;font-size:.74rem;color:var(--text-muted)}.status-online,.status-offline,.status-sleeping,.status-poweroff{display:inline-flex;align-items:center;gap:.3rem}.status-online:before,.status-offline:before,.status-sleeping:before,.status-poweroff:before{content:"";width:7px;height:7px;border-radius:50%}.status-online:before{background:var(--success);box-shadow:0 0 0 2px #34c75938}.status-sleeping{color:var(--warning);font-weight:500}.status-sleeping:before{background:var(--warning);box-shadow:0 0 0 2px #f59e0b38;animation:pulse-sleep 2.4s ease-in-out infinite}@keyframes pulse-sleep{0%,to{opacity:1}50%{opacity:.35}}.status-offline{color:var(--danger);font-weight:600}.status-offline:before{background:var(--danger)}.status-poweroff{color:var(--neutral);font-weight:500}.status-poweroff:before{background:var(--neutral)}.status-sep{color:var(--sep)}.battery{display:inline-flex;align-items:center;gap:.3rem}.battery-icon{position:relative;width:20px;height:10px;border:1.3px solid currentColor;border-radius:2.5px;opacity:.85}.battery-icon:after{content:"";position:absolute;right:-3px;top:50%;transform:translateY(-50%);width:2px;height:4px;background:currentColor;border-radius:0 1px 1px 0}.battery-fill{position:absolute;left:1.3px;right:1.3px;top:1.3px;bottom:1.3px;background:currentColor;border-radius:1px;transform-origin:left center;transition:transform .3s,background .2s}.battery.ok{color:var(--success)}.battery.warn{color:var(--warning)}.battery.danger{color:var(--danger);font-weight:600}.wifi-off-badge,.sleep-badge,.poweroff-badge{position:absolute;top:4px;left:4px;width:18px;height:18px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;box-shadow:0 1px 3px #00000040;pointer-events:none}.wifi-off-badge svg,.sleep-badge svg,.poweroff-badge svg{width:11px;height:11px}.wifi-off-badge{background:var(--danger)}.sleep-badge{background:var(--warning)}.poweroff-badge{background:var(--neutral)}.selected-badge{position:absolute;top:6px;right:6px;width:18px;height:18px;background:var(--primary);border-radius:50%;display:none;align-items:center;justify-content:center}.device-card.selected .selected-badge{display:flex}.selected-badge:after{content:"✓";color:#fff;font-size:.65rem;font-weight:700}.empty-state{text-align:center;padding:2.5rem 2rem;color:var(--text-muted);font-size:.85rem;letter-spacing:.02em}.toast{position:fixed;top:1.25rem;left:50%;transform:translate(-50%);padding:.875rem 1.5rem;border-radius:1rem;font-size:.9rem;font-weight:500;z-index:9999;box-shadow:0 8px 32px #0000002e;animation:toastIn .3s cubic-bezier(.34,1.56,.64,1);white-space:nowrap}@keyframes toastIn{0%{opacity:0;top:0}to{opacity:1;top:1.25rem}}.toast-success{background:#f0fdf4;color:#166534;border:1px solid #86efac}.toast-error{background:#fef2f2;color:#991b1b;border:1px solid #fca5a5}.hidden{display:none!important}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;z-index:1000;display:flex;align-items:center;justify-content:center;padding:1rem}.modal-box{background:#fff;border-radius:1.25rem;padding:2rem;width:100%;max-width:440px;max-height:calc(100vh - 2rem);display:flex;flex-direction:column;box-shadow:0 20px 60px #0003}.modal-title{font-size:1.1rem;font-weight:700;color:var(--text);margin-bottom:1rem;flex-shrink:0}.modal-body{font-size:.9rem;color:var(--text-muted);margin-bottom:1.5rem;line-height:1.5;overflow-y:auto;min-height:0}.modal-footer{display:flex;gap:.75rem;justify-content:flex-end;flex-shrink:0}.app-footer{text-align:center;padding:1rem;font-size:.75rem;color:var(--text-muted);border-top:1px solid var(--border)}.kpi-row{display:flex;gap:1rem;margin-bottom:1.5rem}.kpi-card{flex:1;background:#fff;border-radius:1rem;padding:1.25rem 1rem;box-shadow:0 2px 8px #0000000f;text-align:center}.kpi-value{font-size:1.75rem;font-weight:700;color:var(--text);line-height:1.2}.kpi-label{font-size:.78rem;color:var(--text-muted);margin-top:.25rem;font-weight:500}.kpi-sub{font-size:.7rem;color:var(--text-muted);margin-top:.1rem}.group-region{background:#fff;border-radius:1rem;box-shadow:0 2px 8px #0000000f;margin-bottom:1rem;overflow:hidden}.group-header{display:flex;align-items:center;gap:.75rem;padding:1rem 1.25rem;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .15s}.group-header:hover{background:#2d5a4a08}.group-region>.group-header{background:#2d5a4a0d}.group-chevron{width:20px;height:20px;flex-shrink:0;transition:transform .2s;color:var(--text-muted)}.group-chevron.expanded{transform:rotate(90deg)}.group-name{font-weight:600;font-size:.95rem;color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-store .group-name{font-weight:500;font-size:.9rem}.group-count{font-size:.72rem;background:var(--primary-light);color:var(--primary);padding:.15rem .55rem;border-radius:999px;font-weight:600;flex-shrink:0;white-space:nowrap}.status-bar{flex:1;height:6px;border-radius:3px;overflow:hidden;display:flex;min-width:60px;max-width:200px;background:var(--border)}.status-bar-seg{height:100%;transition:flex-basis .3s}.status-bar-online{background:var(--success)}.status-bar-sleeping{background:var(--warning)}.status-bar-offline{background:var(--danger)}.status-bar-shutdown{background:var(--neutral)}.group-actions{position:relative;flex-shrink:0}.action-trigger{width:28px;height:28px;border:none;background:transparent;cursor:pointer;border-radius:.4rem;display:flex;align-items:center;justify-content:center;color:var(--text-muted);font-size:1.1rem;transition:all .15s}.action-trigger:hover{background:#0000000f;color:var(--text)}.action-menu{position:absolute;right:0;top:calc(100% + 4px);background:#fff;border:1px solid var(--border);border-radius:.6rem;box-shadow:0 8px 24px #0000001f;z-index:50;min-width:180px;padding:.35rem 0}.action-menu.hidden{display:none}.action-menu-item{display:block;width:100%;padding:.5rem 1rem;border:none;background:none;text-align:left;font-size:.85rem;color:var(--text);cursor:pointer;transition:background .1s}.action-menu-item:hover{background:var(--primary-light)}.group-body{padding:0 1.25rem 1rem;max-height:3000px;overflow:hidden;transition:max-height .3s ease,opacity .2s ease,padding-bottom .3s ease,visibility 0s linear 0s}.group-body.hidden{display:block!important;max-height:0!important;opacity:0;padding-bottom:0;visibility:hidden;transition:max-height .3s ease,opacity .2s ease,padding-bottom .3s ease,visibility 0s linear .3s}.group-store{border-top:1px solid var(--border)}.group-store>.group-header{padding-left:.5rem}.group-store-devices{padding:.75rem 0 .75rem .5rem;max-height:2000px;overflow:hidden;transition:max-height .3s ease,opacity .2s ease,padding .3s ease,visibility 0s linear 0s}.group-store-devices.hidden{display:flex!important;max-height:0!important;opacity:0;visibility:hidden;transition:max-height .3s ease,opacity .2s ease,padding .3s ease,visibility 0s linear .3s;padding-top:0;padding-bottom:0}.group-filter{margin-bottom:1.25rem}.group-filter select{max-width:320px}.album-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem;margin-bottom:1.5rem}.album-card{background:#fff;border:1.5px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .2s;position:relative}.album-card:hover{border-color:var(--primary);box-shadow:0 4px 16px #00000014}.album-card.active{border-color:var(--primary);background:var(--primary-light)}.album-card-name{font-weight:600;font-size:.95rem;margin-bottom:.25rem}.album-card-count{font-size:.8rem;color:var(--text-muted)}.album-card-new{border-style:dashed;display:flex;align-items:center;justify-content:center;min-height:80px;color:var(--text-muted);font-weight:500}.album-card-new:hover{color:var(--primary);background:var(--primary-light)}.album-menu-btn{position:absolute;top:.5rem;right:.5rem;opacity:0;border:none;background:none;cursor:pointer;color:var(--text-muted);font-size:1rem;padding:.2rem .4rem;border-radius:.3rem;transition:opacity .15s}.album-card:hover .album-menu-btn{opacity:1}.album-menu-btn:hover{background:#0000000f}.photo-section{margin-top:1rem}.photo-section-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.photo-section-title{font-weight:600;font-size:1rem}.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.75rem}.photo-thumb{aspect-ratio:4/3;border-radius:.5rem;cursor:pointer;transition:transform .15s,box-shadow .15s}.photo-thumb:hover{transform:scale(1.03);box-shadow:0 4px 12px #0000001f}.strategy-card{background:#fff;border:1.5px solid var(--border);border-radius:.75rem;padding:1.25rem;margin-bottom:.75rem;transition:border-color .2s}.strategy-card:hover{border-color:var(--primary)}.strategy-card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.5rem}.strategy-card-name{font-weight:600;font-size:.95rem}.strategy-card-status{font-size:.75rem;font-weight:600;padding:.2rem .6rem;border-radius:999px}.strategy-card-status.active{background:#f0fdf4;color:#166534}.strategy-card-status.inactive{background:#f3f4f6;color:#6b7280}.strategy-card-meta{font-size:.82rem;color:var(--text-muted);line-height:1.7}.strategy-card-actions{display:flex;gap:.5rem;margin-top:.75rem}.canvas-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:1rem;margin-bottom:1.5rem}.canvas-card{background:#fff;border:1.5px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .2s;position:relative}.canvas-card:hover{border-color:var(--primary);box-shadow:0 4px 16px #00000014}.canvas-card-name{font-weight:600;font-size:.95rem;margin-bottom:.35rem}.canvas-card-meta{font-size:.8rem;color:var(--text-muted);line-height:1.6}.canvas-card-new{border-style:dashed;display:flex;align-items:center;justify-content:center;min-height:100px;color:var(--text-muted);font-weight:500}.canvas-card-new:hover{color:var(--primary);background:var(--primary-light)}.canvas-menu-btn{position:absolute;top:.5rem;right:.5rem;opacity:0;border:none;background:none;cursor:pointer;color:var(--text-muted);font-size:1rem;padding:.2rem .4rem;border-radius:.3rem;transition:opacity .15s}.canvas-card:hover .canvas-menu-btn{opacity:1}.canvas-menu-btn:hover{background:#0000000f}.canvas-editor{margin-top:1rem}.canvas-editor-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1rem}.canvas-preview-area{max-width:720px;margin:0 auto}.canvas-preview{width:100%;aspect-ratio:var(--canvas-ratio, 1200/826);background:linear-gradient(135deg,#667eea,#764ba2);border-radius:4px;display:flex;align-items:center;justify-content:center;color:#fff;font-size:1.2rem;font-weight:600;position:relative;overflow:hidden}.canvas-preview-component{position:absolute;background:#ffffff26;border:1px dashed rgba(255,255,255,.4);border-radius:.25rem;display:flex;align-items:center;justify-content:center;font-size:.8rem;color:#fffc;padding:.5rem}.canvas-send-row{display:flex;justify-content:flex-end;margin-top:1rem}.canvas-send-device-list{display:flex;flex-direction:column;gap:.5rem;max-height:320px;overflow-y:auto}.canvas-send-device-item{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.65rem .85rem;border:1.5px solid var(--border);border-radius:.6rem}.canvas-send-device-item.incompatible{opacity:.5}.canvas-send-device-name{font-weight:600;font-size:.85rem;color:var(--text)}.canvas-send-device-meta{font-size:.75rem;color:var(--text-muted);margin-left:auto;margin-right:.5rem}.canvas-send-incompatible-tag{font-size:.7rem;font-weight:600;color:var(--danger);background:var(--danger-light);padding:.15rem .55rem;border-radius:999px;flex-shrink:0}@media(max-width:767px){.app-layout{flex-direction:column}.sidebar{width:100%;flex-direction:row;padding:0;border-right:none;border-bottom:1px solid #1a3d32;gap:0;overflow-x:auto}.nav-item{flex:1;flex-direction:column;justify-content:center;gap:.2rem;padding:.5rem .25rem;border-radius:0;min-width:0}.nav-item.active{border-bottom:2px solid rgba(255,255,255,.6);background:#ffffff21}.nav-label{font-size:.72rem;text-align:center}#view-container{padding:1rem}.kpi-row{flex-wrap:wrap;gap:.75rem}.kpi-card{flex:1 1 calc(50% - .375rem);min-width:0}.kpi-value{font-size:1.4rem}.group-header{flex-wrap:wrap;row-gap:.5rem;padding:.85rem 1rem}.group-name{flex:1 1 auto}.status-bar{order:5;flex-basis:100%;max-width:none;margin-left:calc(20px + .75rem)}.group-body{padding-left:1rem;padding-right:1rem}}@media(max-width:480px){.device-card{width:150px}.device-card-frame-box{width:110px;height:110px}.kpi-card{padding:1rem .75rem}.kpi-value{font-size:1.2rem}.status-bar{max-width:120px}}
