:root{--canvas: #f5f6f8;--surface-1: #ffffff;--surface-2: #f0f1f5;--surface-3: #e8eaf0;--hairline: #e2e4ea;--hairline-strong: #d0d3dc;--primary: #5e6ad2;--primary-hover: #4a56c4;--primary-focus: #5e69d1;--ink: #0d0e14;--ink-muted: #2d3148;--ink-subtle: #5c6070;--ink-tertiary: #9097aa;--success: #16a34a;--amber: #d97706;--rose: #e11d48;--cyan: #0891b2;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px;--radius-xl: 16px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;overflow:hidden}body{background:var(--canvas);color:var(--ink);font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased}.left-panel::-webkit-scrollbar{width:4px}.left-panel::-webkit-scrollbar-track{background:transparent}.left-panel::-webkit-scrollbar-thumb{background:var(--hairline-strong);border-radius:2px}.panel-header{padding:20px 20px 16px;border-bottom:1px solid var(--hairline);display:flex;align-items:center;gap:10px}.panel-header-icon{color:var(--primary)}.panel-title{font-size:14px;font-weight:600;color:var(--ink);letter-spacing:-.2px}.panel-subtitle{font-size:12px;color:var(--ink-subtle);margin-top:2px}.section{padding:16px 20px;border-bottom:1px solid var(--hairline)}.section:last-child{border-bottom:none}.section-label{font-size:11px;font-weight:500;color:var(--ink-tertiary);letter-spacing:.4px;text-transform:uppercase;margin-bottom:12px;display:flex;align-items:center;gap:6px}.upload-zone{border:1.5px dashed var(--hairline-strong);border-radius:var(--radius-lg);padding:24px 16px;text-align:center;cursor:pointer;transition:border-color .15s,background .15s;background:var(--surface-2)}.upload-zone:hover,.upload-zone.drag-over{border-color:var(--primary);background:#5e6ad20f}.upload-zone-icon{color:var(--ink-subtle);margin:0 auto 10px;display:block}.upload-zone-text{font-size:13px;color:var(--ink-muted);line-height:1.5}.upload-zone-hint{font-size:11px;color:var(--ink-tertiary);margin-top:4px}input[type=file]{display:none}.summary-card{background:var(--surface-2);border:1px solid var(--hairline);border-radius:var(--radius-lg);padding:14px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:4px 0}.summary-row+.summary-row{border-top:1px solid var(--hairline);margin-top:6px;padding-top:10px}.summary-key{font-size:12px;color:var(--ink-subtle)}.summary-val{font-size:12px;color:var(--ink-muted);font-weight:500;text-align:right;max-width:160px;word-break:break-all}.badge{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:500;padding:2px 8px;border-radius:9999px;background:var(--surface-3);color:var(--ink-muted)}.badge-primary{background:#5e6ad226;color:var(--primary)}.badge-success{background:#27a64426;color:var(--success)}.form-group{margin-bottom:12px}.form-group:last-child{margin-bottom:0}.form-label{font-size:12px;color:var(--ink-subtle);margin-bottom:6px;display:flex;align-items:center;gap:5px}.form-input{width:100%;background:var(--surface-2);border:1px solid var(--hairline-strong);border-radius:var(--radius-md);padding:8px 12px;color:var(--ink);font-size:13px;font-family:inherit;outline:none;transition:border-color .15s}.form-input:focus{border-color:var(--primary-focus);box-shadow:0 0 0 2px #5e6ad233}.form-input::placeholder{color:var(--ink-tertiary)}.form-hint{font-size:11px;color:var(--ink-tertiary);margin-top:4px}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;font-size:13px;font-weight:500;font-family:inherit;padding:8px 14px;border-radius:var(--radius-md);border:none;cursor:pointer;transition:background .15s,opacity .15s;width:100%}.btn-primary{background:var(--primary);color:#fff}.btn-primary:hover{background:var(--primary-hover)}.btn-primary:disabled{opacity:.4;cursor:not-allowed}.right-panel::-webkit-scrollbar{width:6px}.right-panel::-webkit-scrollbar-track{background:transparent}.right-panel::-webkit-scrollbar-thumb{background:var(--hairline-strong);border-radius:3px}.charts-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;min-width:720px}.charts-grid .chart-full{grid-column:1 / -1}.chart-card{background:var(--surface-1);border:1px solid var(--hairline);border-radius:var(--radius-xl);padding:20px;display:flex;flex-direction:column}.chart-card-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:16px}.chart-card-title{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;color:var(--ink);letter-spacing:-.2px}.chart-card-title-icon{color:var(--primary)}.chart-card-subtitle{font-size:11px;color:var(--ink-tertiary);margin-top:2px;margin-left:28px}.chart-container{flex:1;min-height:260px}.date-picker{background:var(--surface-2);border:1px solid var(--hairline-strong);border-radius:var(--radius-sm);padding:4px 8px;color:var(--ink-muted);font-size:12px;font-family:inherit;outline:none;cursor:pointer}.date-picker:focus{border-color:var(--primary-focus)}.month-select{background:var(--surface-2);border:1px solid var(--hairline-strong);border-radius:var(--radius-sm);padding:4px 8px;color:var(--ink-muted);font-size:12px;font-family:inherit;outline:none;cursor:pointer}.month-select:focus{border-color:var(--primary-focus)}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--ink-tertiary);min-height:200px;text-align:center}.empty-state-icon{opacity:.4}.empty-state-title{font-size:13px;font-weight:500;color:var(--ink-subtle)}.empty-state-text{font-size:12px}.welcome{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;text-align:center;padding:40px}.welcome-icon{color:var(--primary);opacity:.6}.welcome-title{font-size:20px;font-weight:600;color:var(--ink);letter-spacing:-.4px}.welcome-text{font-size:14px;color:var(--ink-subtle);max-width:360px;line-height:1.6}.spinner-wrap{display:flex;align-items:center;justify-content:center;gap:10px;padding:20px;color:var(--ink-subtle);font-size:13px}@keyframes spin{to{transform:rotate(360deg)}}.spinner{width:16px;height:16px;border:2px solid var(--hairline-strong);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}.error-banner{background:#f43f5e1a;border:1px solid rgba(244,63,94,.3);border-radius:var(--radius-md);padding:10px 14px;font-size:12px;color:var(--rose);margin-top:10px;line-height:1.5}.period-config{display:flex;flex-direction:column;gap:10px}.month-picker{display:flex;flex-direction:column;gap:6px}.month-picker-label{font-size:11px;color:var(--ink-tertiary);font-weight:500}.month-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:4px}.month-btn{font-size:11px;font-family:inherit;font-weight:500;padding:5px 2px;border-radius:var(--radius-sm);border:1px solid var(--hairline);background:var(--surface-2);color:var(--ink-tertiary);cursor:pointer;transition:all .15s;text-align:center}.month-btn:hover{border-color:var(--hairline-strong);color:var(--ink-muted)}.month-btn.active{background:#e11d481a;border-color:#e11d4859;color:#e11d48;font-weight:600}.season-toggle{display:grid;grid-template-columns:1fr 1fr;gap:5px}.season-btn{display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 6px;border-radius:var(--radius-md);border:1.5px solid var(--hairline);background:var(--surface-2);color:var(--ink-subtle);font-size:12px;font-weight:500;font-family:inherit;cursor:pointer;transition:all .15s}.season-btn:hover{border-color:var(--hairline-strong)}.season-btn.active.summer{border-color:#e11d4866;background:#e11d4812;color:#e11d48}.season-btn.active.non-summer{border-color:#d9770666;background:#d9770612;color:#d97706}.season-dot{width:6px;height:6px;border-radius:50%}.summer-dot{background:#e11d48}.non-summer-dot{background:#d97706}.season-month-hint{font-size:10px;opacity:.8;font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.season-editor{display:flex;flex-direction:column;gap:10px}.period-tabs{display:grid;grid-template-columns:repeat(4,1fr);gap:4px}.period-tab{display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 4px;border-radius:var(--radius-md);border:1.5px solid var(--hairline);background:var(--surface-2);cursor:pointer;transition:all .15s;font-family:inherit}.period-tab:hover:not(.flat-tab){border-color:var(--hairline-strong)}.period-tab.active{font-weight:500}.flat-tab{cursor:default;opacity:.6}.tab-label{font-size:14px;font-weight:600}.tab-count{font-size:10px;color:var(--ink-tertiary)}.period-hint{font-size:11px;padding:7px 10px;border-radius:var(--radius-md);border:1px solid;line-height:1.4}.range-list{display:flex;flex-direction:column;gap:6px}.range-row{display:flex;align-items:center;gap:5px;background:var(--surface-2);border:1px solid var(--hairline);border-radius:var(--radius-md);padding:6px 8px}.range-sep{font-size:11px;color:var(--ink-tertiary);flex-shrink:0}.range-delete{margin-left:auto;background:none;border:none;cursor:pointer;color:var(--ink-tertiary);font-size:16px;line-height:1;padding:0 2px;border-radius:4px;transition:color .15s,background .15s}.range-delete:hover{color:var(--rose);background:#e11d4814}.range-empty{font-size:12px;text-align:center;padding:10px}.range-add{font-size:12px;font-weight:500;font-family:inherit;padding:7px 10px;border-radius:var(--radius-md);border:1.5px dashed;background:none;cursor:pointer;transition:opacity .15s;text-align:center}.range-add:hover{opacity:.75}.hour-select{flex:1;min-width:0;background:var(--surface-1);border:1px solid var(--hairline-strong);border-radius:var(--radius-sm);padding:4px 6px;color:var(--ink);font-size:12px;font-family:inherit;outline:none;cursor:pointer}.hour-select:focus{border-color:var(--primary-focus)}.preview-section{display:flex;flex-direction:column;gap:6px}.preview-title{font-size:11px;color:var(--ink-tertiary)}.preview-bar-wrap{position:relative;padding-bottom:16px}.preview-bar{display:flex;height:20px;border-radius:6px;overflow:hidden;gap:1px;background:var(--surface-3)}.preview-bar-cell{flex:1;border-radius:2px;transition:opacity .2s;cursor:default}.preview-bar-labels{position:relative;height:14px;margin-top:3px}.preview-bar-labels span{position:absolute;transform:translate(-50%);font-size:9px;color:var(--ink-tertiary)}.period-legend{display:flex;gap:8px;flex-wrap:wrap}.legend-item{display:flex;align-items:center;gap:4px;font-size:11px}.legend-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}.legend-label{color:var(--ink-subtle)}.legend-count{color:var(--ink-muted);font-weight:500}.left-panel-wrap{position:relative;display:flex;flex-shrink:0;transition:width .25s ease,min-width .25s ease;width:320px;min-width:320px;overflow:visible}.left-panel-wrap.collapsed{width:0;min-width:0;overflow:hidden}.left-panel-wrap.collapsed .left-panel{pointer-events:none}.left-panel{width:320px;min-width:320px;background:var(--surface-1);border-right:1px solid var(--hairline);display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;min-height:0}.panel-toggle-btn{position:fixed;left:320px;top:50%;transform:translateY(-50%);z-index:100;width:16px;height:44px;display:flex;align-items:center;justify-content:center;background:var(--surface-1);border:1px solid var(--hairline-strong);border-left:none;border-radius:0 var(--radius-md) var(--radius-md) 0;cursor:pointer;color:var(--ink-tertiary);transition:left .25s ease,color .15s,background .15s;padding:0}.left-panel-wrap.collapsed .panel-toggle-btn{left:0}.panel-toggle-btn:hover{color:var(--primary);background:var(--surface-2)}.app-shell{display:flex;height:100vh;overflow:hidden;min-height:0}.right-panel{flex:1;overflow-y:auto;overflow-x:auto;background:var(--canvas);padding:20px;min-height:0;min-width:0}.export-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}.export-btn{display:flex;align-items:center;justify-content:center;gap:5px;font-size:12px;font-weight:500;font-family:inherit;padding:8px 10px;border-radius:var(--radius-md);border:1px solid var(--hairline-strong);background:var(--surface-2);color:var(--ink-muted);cursor:pointer;transition:background .15s,border-color .15s,color .15s}.export-btn:hover:not(:disabled){background:var(--surface-3);border-color:var(--primary);color:var(--primary)}.export-btn:disabled{opacity:.4;cursor:not-allowed}
