:root{--md-sys-color-primary: #497193;--md-sys-color-primary-shell: #243849;--md-sys-color-on-primary: #FFFFFF;--md-sys-color-primary-container: #ABBAC6;--md-sys-color-on-primary-container: #152E42;--md-sys-color-secondary: #627C91;--md-sys-color-on-secondary: #FFFFFF;--md-sys-color-secondary-container: #BAC0C6;--md-sys-color-on-secondary-container: #162734;--md-sys-color-tertiary: #62A17B;--md-sys-color-on-tertiary: #FFFFFF;--md-sys-color-tertiary-container: #9EBAA8;--md-sys-color-on-tertiary-container: #153B25;--md-sys-color-error: #A04242;--md-sys-color-on-error: #FFFFFF;--md-sys-color-error-container: #C49E9E;--md-sys-color-on-error-container: #620D0D;--md-sys-color-warning: #C49A00;--md-sys-color-warning-container: #FFF8CC;--md-sys-color-on-warning: #FFFFFF;--md-sys-color-surface: #FFFFFF;--md-sys-color-on-surface: #233240;--md-sys-color-surface-variant: #B8CCE0;--md-sys-color-on-surface-variant: #56626E;--md-sys-color-background: #FFFFFF;--md-sys-color-on-background: #233240;--md-sys-color-outline: #8FA4BA;--md-sys-color-outline-variant: #B1B6BA;--md-sys-color-neutral: #7E8892;--md-sys-color-neutral-variant: #B1B6BA;--color-primary: var(--md-sys-color-primary);--color-primary-shell: var(--md-sys-color-primary-shell);--color-primary-light: var(--md-sys-color-primary-container);--color-primary-dark: var(--md-sys-color-on-primary-container);--color-danger: var(--md-sys-color-error);--color-danger-light: var(--md-sys-color-error-container);--color-danger-dark: var(--md-sys-color-on-error-container);--color-success: var(--md-sys-color-tertiary);--color-success-light: var(--md-sys-color-tertiary-container);--color-warning: var(--md-sys-color-warning);--color-warning-light: var(--md-sys-color-warning-container);--color-neutral: var(--md-sys-color-neutral);--color-neutral-light: var(--md-sys-color-neutral-variant);--color-bg: var(--md-sys-color-background);--color-bg-panel: var(--md-sys-color-surface-variant);--color-border: var(--md-sys-color-outline);--color-text: var(--md-sys-color-on-background);--color-text-muted: var(--md-sys-color-on-surface-variant);--font-family: "Noto Sans KR", "Noto Sans", sans-serif;--font-size-base: 14px;--font-weight-normal: 400;--font-weight-medium: 500}@font-face{font-family:Noto Sans KR;font-style:normal;font-weight:400;src:url(/assets/NotoSansKR-Medium-D06yvloL.woff2) format("woff2")}@font-face{font-family:Noto Sans KR;font-style:normal;font-weight:500;src:url(/assets/NotoSansKR-Medium-D06yvloL.woff2) format("woff2")}@font-face{font-family:Noto Sans;font-style:normal;font-weight:400;src:url(/assets/NotoSans-Medium-BYSzYMf3.woff2) format("woff2")}@font-face{font-family:Noto Sans;font-style:normal;font-weight:500;src:url(/assets/NotoSans-Medium-BYSzYMf3.woff2) format("woff2")}.btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 24px;height:40px;border-radius:4px;font-family:var(--font-family);font-size:14px;font-weight:var(--font-weight-medium);cursor:pointer;border:none;transition:background-color .2s,box-shadow .2s,opacity .2s;white-space:nowrap}.btn-primary{background-color:var(--color-primary);color:#fff}.btn-primary:hover{background-color:var(--color-primary-dark)}.btn-secondary{background-color:var(--color-primary-light);color:var(--color-primary-dark);border:1px solid var(--color-border)}.btn-secondary:hover{background-color:var(--color-primary-light)}.btn-danger{background-color:var(--color-danger);color:#fff}.btn-danger:hover{background-color:var(--color-danger-dark)}.btn-danger-outlined{background-color:transparent;color:var(--color-danger);border:1px solid var(--color-danger)}.btn-danger-outlined:hover{background-color:var(--color-danger-light)}.btn-text{background-color:transparent;color:var(--color-primary);padding:0 12px}.btn-text:hover{background-color:var(--color-primary-light)}.btn-sm{height:32px;padding:0 16px;font-size:13px}.btn-lg{height:48px;padding:0 32px;font-size:15px}.btn:disabled{opacity:.38;cursor:not-allowed;pointer-events:none}.field{display:flex;flex-direction:column;gap:4px}.field-label{font-family:var(--font-family);font-size:13px;font-weight:var(--font-weight-medium);color:var(--color-text)}.field-input{height:40px;padding:0 12px;font-family:var(--font-family);font-size:14px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;outline:none;transition:border-color .2s}.field-input::placeholder{color:var(--color-neutral)}.field-input:focus{border-color:var(--color-primary);border-width:2px}.field-input:disabled{background-color:var(--color-bg-panel);color:var(--color-neutral);cursor:not-allowed}.field.error .field-input{border-color:var(--color-danger)}.field.error .field-label{color:var(--color-danger)}.field-hint{font-size:12px;color:var(--color-text-muted)}.field-error{font-size:12px;color:var(--color-danger);display:none}.field.error .field-error{display:block}.field-textarea{padding:10px 12px;height:auto;min-height:80px;resize:vertical;font-family:var(--font-family);font-size:14px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;outline:none;transition:border-color .2s}.field-textarea:focus{border-color:var(--color-primary);border-width:2px}.field-select{height:40px;padding:0 36px 0 12px;font-family:var(--font-family);font-size:14px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;outline:none;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' height='20' viewBox='0 -960 960 960' width='20' fill='%23497193'%3E%3Cpath d='M480-360 280-560h400L480-360Z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;transition:border-color .2s}.field-select:focus{border-color:var(--color-primary);border-width:2px}.field-select:disabled{background-color:var(--color-bg-panel);color:var(--color-neutral);cursor:not-allowed}.field.error .field-select{border-color:var(--color-danger)}.checkbox{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.checkbox-input{display:none}.checkbox-box{width:18px;height:18px;border:2px solid var(--color-neutral);border-radius:2px;background-color:var(--color-bg);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background-color .2s,border-color .2s}.checkbox-input:checked+.checkbox-box{background-color:var(--color-primary);border-color:var(--color-primary)}.checkbox-input:checked+.checkbox-box:after{content:"";width:5px;height:9px;border:2px solid #ffffff;border-top:none;border-left:none;transform:rotate(45deg) translateY(-1px)}.checkbox-input:disabled+.checkbox-box{border-color:var(--color-neutral-light);background-color:var(--color-bg-panel);cursor:not-allowed}.checkbox:has(.checkbox-input:disabled){color:var(--color-neutral);cursor:not-allowed}.radio{display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.radio-input{display:none}.radio-circle{width:18px;height:18px;border:2px solid var(--color-neutral);border-radius:50%;background-color:var(--color-bg);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:border-color .2s}.radio-input:checked+.radio-circle{border-color:var(--color-primary)}.radio-input:checked+.radio-circle:after{content:"";width:8px;height:8px;border-radius:50%;background-color:var(--color-primary)}.radio-input:disabled+.radio-circle{border-color:var(--color-neutral-light);cursor:not-allowed}.radio:has(.radio-input:disabled){color:var(--color-neutral);cursor:not-allowed}.toggle{display:inline-flex;align-items:center;gap:10px;cursor:pointer;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.toggle-input{display:none}.toggle-track{position:relative;width:52px;height:32px;border-radius:16px;background-color:var(--color-neutral-light);border:2px solid var(--color-neutral);transition:background-color .2s,border-color .2s;flex-shrink:0}.toggle-thumb{position:absolute;top:50%;left:4px;transform:translateY(-50%);width:16px;height:16px;border-radius:50%;background-color:var(--color-neutral);transition:left .2s,width .2s,background-color .2s}.toggle-input:checked+.toggle-track{background-color:var(--color-primary);border-color:var(--color-primary)}.toggle-input:checked+.toggle-track .toggle-thumb{left:calc(100% - 20px);background-color:#fff;width:24px;top:50%;transform:translate(-4px,-50%)}.toggle-input:disabled+.toggle-track{opacity:.38;cursor:not-allowed}.toggle:has(.toggle-input:disabled){color:var(--color-neutral);cursor:not-allowed}.search{display:flex;align-items:center;gap:8px;height:40px;padding:0 12px;background-color:var(--color-bg-panel);border:1px solid var(--color-border);border-radius:4px;transition:border-color .2s,box-shadow .2s}.search:focus-within{border-color:var(--color-primary);background-color:var(--color-bg);box-shadow:0 0 0 2px var(--color-primary-light)}.search-icon{flex-shrink:0;color:var(--color-neutral);width:20px;height:20px}.search:focus-within .search-icon{color:var(--color-primary)}.search-input{flex:1;border:none;outline:none;background:transparent;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.search-input::placeholder{color:var(--color-neutral)}.search-clear{flex-shrink:0;width:20px;height:20px;border:none;background:transparent;color:var(--color-neutral);cursor:pointer;font-size:14px;display:flex;align-items:center;justify-content:center;border-radius:50%;padding:0}.search-clear:hover{background-color:var(--color-neutral-light);color:var(--color-text)}.date-picker{position:relative;display:inline-block}.date-picker-input{position:relative;display:flex;align-items:center}.date-picker-input .field-input{padding-right:40px;cursor:pointer}.date-picker-trigger{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:24px;height:24px;border:none;background:transparent;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;color:var(--color-primary)}.date-picker-trigger:hover{color:var(--color-primary-dark)}.calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:100;width:280px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:8px;box-shadow:0 4px 16px #0000001f;overflow:hidden;font-family:var(--font-family)}.calendar.hidden{display:none}.cal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 8px;background-color:var(--color-bg-panel);border-bottom:1px solid var(--color-border)}.cal-title{font-size:14px;font-weight:var(--font-weight-medium);color:var(--color-text)}.cal-nav-btn{width:32px;height:32px;border:none;background:transparent;cursor:pointer;border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--color-primary);transition:background-color .2s}.cal-nav-btn:hover{background-color:var(--color-primary-light)}.cal-grid{padding:8px}.cal-day-names{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:4px}.cal-day-names span{height:32px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:var(--font-weight-medium);color:var(--color-text-muted)}.cal-dates{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.cal-date{height:36px;width:100%;border:none;background:transparent;cursor:pointer;border-radius:50%;font-family:var(--font-family);font-size:13px;color:var(--color-text);display:flex;align-items:center;justify-content:center;transition:background-color .2s,color .2s}.cal-date:hover{background-color:var(--color-primary-light);color:var(--color-primary-dark)}.cal-date.today{border:1px solid var(--color-primary);color:var(--color-primary);font-weight:var(--font-weight-medium)}.cal-date.selected{background-color:var(--color-primary);color:#fff;font-weight:var(--font-weight-medium)}.cal-date.selected:hover{background-color:var(--color-primary-dark)}.cal-date.other-month{color:var(--color-neutral)}.cal-date:disabled{color:var(--color-neutral-light);cursor:not-allowed;background:transparent}.toast-container{position:fixed;bottom:24px;right:24px;display:flex;flex-direction:column;gap:8px;z-index:1000}.toast{display:flex;align-items:center;justify-content:space-between;gap:12px;min-width:280px;max-width:480px;padding:12px 16px;border-radius:4px;border-left:4px solid transparent;background-color:var(--color-bg);box-shadow:0 2px 8px #0000001f;font-family:var(--font-family);font-size:14px;color:var(--color-text);animation:toast-in .2s ease}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.toast-message{flex:1;line-height:1.5}.toast-close{flex-shrink:0;width:20px;height:20px;border:none;background:transparent;cursor:pointer;font-size:13px;color:var(--color-text-muted);display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0}.toast-close:hover{background-color:var(--color-neutral-light);color:var(--color-text)}.toast-success{border-left-color:var(--color-success);background-color:var(--color-success-light)}.toast-error{border-left-color:var(--color-danger);background-color:var(--color-danger-light)}.toast-info{border-left-color:var(--color-primary);background-color:var(--color-primary-light)}.toast-warning{border-left-color:var(--color-warning);background-color:var(--color-warning-light)}.alert{display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-radius:4px;border-left:4px solid transparent;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.alert-icon{flex-shrink:0;width:20px;height:20px;margin-top:1px}.alert-body{flex:1;display:flex;flex-direction:column;gap:2px}.alert-title{font-size:14px;font-weight:var(--font-weight-medium)}.alert-message{font-size:13px;color:var(--color-text-muted);line-height:1.5;margin:0}.alert-close{flex-shrink:0;width:20px;height:20px;border:none;background:transparent;cursor:pointer;font-size:13px;color:var(--color-text-muted);display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0}.alert-close:hover{background-color:var(--color-neutral-light);color:var(--color-text)}.alert-info{background-color:var(--color-primary-light);border-left-color:var(--color-primary)}.alert-info .alert-icon{color:var(--color-primary)}.alert-success{background-color:var(--color-success-light);border-left-color:var(--color-success)}.alert-success .alert-icon{color:var(--color-success)}.alert-error{background-color:var(--color-danger-light);border-left-color:var(--color-danger)}.alert-error .alert-icon{color:var(--color-danger)}.alert-warning{background-color:var(--color-warning-light);border-left-color:var(--color-warning)}.alert-warning .alert-icon{color:var(--color-warning)}.spinner{width:24px;height:24px;border:2px solid var(--color-neutral-light);border-top-color:var(--color-primary);border-radius:50%;animation:spin .7s linear infinite;flex-shrink:0}.spinner-sm{width:16px;height:16px;border-width:2px}.spinner-lg{width:40px;height:40px;border-width:3px}@keyframes spin{to{transform:rotate(360deg)}}.loading-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#ffffffb3;display:flex;align-items:center;justify-content:center;z-index:900}.loading-inline{display:flex;align-items:center;justify-content:center;gap:8px;padding:24px;color:var(--color-text-muted);font-family:var(--font-family);font-size:14px}.progress-wrap{display:flex;flex-direction:column;gap:4px}.progress-label{display:flex;justify-content:space-between;font-family:var(--font-family);font-size:12px;color:var(--color-text-muted)}.progress{width:100%;height:6px;background-color:var(--color-neutral-light);border-radius:4px;overflow:hidden}.progress-bar{height:100%;background-color:var(--color-primary);border-radius:4px;transition:width .3s ease}.progress-sm .progress{height:4px}.progress-lg .progress{height:10px}.progress-bar-success{background-color:var(--color-success)}.progress-bar-danger{background-color:var(--color-danger)}.progress-indeterminate{width:40%!important;animation:progress-slide 1.2s ease-in-out infinite}@keyframes progress-slide{0%{transform:translate(-100%)}to{transform:translate(350%)}}.modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:800;animation:modal-overlay-in .2s ease}@keyframes modal-overlay-in{0%{opacity:0}to{opacity:1}}.modal{display:flex;flex-direction:column;width:560px;max-width:calc(100vw - 48px);max-height:calc(100vh - 80px);background-color:var(--color-bg);border-radius:4px;box-shadow:0 4px 16px #00000029;animation:modal-in .2s ease}@keyframes modal-in{0%{opacity:0;transform:translateY(-12px)}to{opacity:1;transform:translateY(0)}}.modal-sm{width:360px}.modal-lg{width:800px}.modal-xl{width:1100px}.modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;background-color:var(--color-primary);border-bottom:1px solid var(--color-primary-dark);border-radius:4px 4px 0 0;flex-shrink:0}.modal-title{flex:1;text-align:center;font-family:var(--font-family);font-size:17px;font-weight:var(--font-weight-medium);color:#fff}.modal-close{width:28px;height:28px;border:none;background:transparent;cursor:pointer;font-size:16px;color:#fff;display:flex;align-items:center;justify-content:center;border-radius:4px;padding:0}.modal-close:hover{background-color:var(--color-primary-dark);color:#fff}.modal-body{flex:1;overflow-y:auto;padding:20px}.modal-confirm-message{font-family:var(--font-family);font-size:14px;color:var(--color-text);line-height:1.6;margin:0}.modal-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:12px 20px;background-color:var(--color-primary);border-top:1px solid var(--color-primary-dark);border-radius:0 0 4px 4px;flex-shrink:0}.modal-overlay.modal-draggable{background-color:transparent;pointer-events:none;align-items:flex-start;justify-content:flex-end;padding:80px 20px 0 0}.modal-overlay.modal-draggable .modal{pointer-events:auto;position:fixed;margin:0}.modal-overlay.modal-draggable .modal-header{cursor:move;-webkit-user-select:none;user-select:none}.modal-footer .btn-primary,.modal-footer .btn-secondary{background-color:var(--color-bg-panel);color:var(--color-text-muted);font-weight:700;border:1px solid var(--color-primary-light)}.modal-footer .btn-primary:hover,.modal-footer .btn-secondary:hover{background-color:var(--color-bg);color:var(--color-primary-dark)}.tab-bar{display:flex;border-bottom:1px solid var(--color-border);gap:0}.tab{display:inline-flex;align-items:center;justify-content:center;padding:0 20px;height:40px;font-family:var(--font-family);font-size:14px;font-weight:var(--font-weight-normal);color:var(--color-text-muted);background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color .2s,border-color .2s;white-space:nowrap;margin-bottom:-1px}.tab:hover{color:var(--color-primary);background-color:var(--color-primary-light)}.tab.active{color:var(--color-primary);font-weight:var(--font-weight-medium);border-bottom-color:var(--color-primary)}.tab:disabled{color:var(--color-neutral-light);cursor:not-allowed}.tab-panel{display:none;padding:16px 0}.tab-panel.active{display:block}.breadcrumb{display:flex;align-items:center;gap:4px;font-family:var(--font-family);font-size:13px}.breadcrumb-item{color:var(--color-text-muted);text-decoration:none;transition:color .2s}.breadcrumb-item:hover{color:var(--color-primary)}.breadcrumb-item.active{color:var(--color-text);font-weight:var(--font-weight-medium);pointer-events:none}.breadcrumb-sep{color:var(--color-neutral);font-size:12px;-webkit-user-select:none;user-select:none}.pagination{display:flex;align-items:center;justify-content:center;gap:4px;font-family:var(--font-family)}.page-btn{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;padding:0 6px;border:1px solid var(--color-border);border-radius:4px;background-color:var(--color-bg);font-family:var(--font-family);font-size:13px;color:var(--color-text);cursor:pointer;transition:background-color .2s,color .2s,border-color .2s}.page-btn:hover{background-color:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-primary)}.page-btn.active{background-color:var(--color-primary);border-color:var(--color-primary);color:#fff;font-weight:var(--font-weight-medium);pointer-events:none}.page-btn:disabled{color:var(--color-neutral-light);border-color:var(--color-neutral-light);cursor:not-allowed;background-color:var(--color-bg)}.page-ellipsis{display:inline-flex;align-items:center;justify-content:center;min-width:32px;height:32px;font-size:13px;color:var(--color-text-muted);-webkit-user-select:none;user-select:none}.badge{display:inline-flex;align-items:center;justify-content:center;padding:0 8px;height:22px;border-radius:4px;font-family:var(--font-family);font-size:12px;font-weight:var(--font-weight-medium);white-space:nowrap;background-color:var(--color-neutral-light);color:var(--color-text-muted)}.badge-primary{background-color:var(--color-primary-light);color:var(--color-primary-dark)}.badge-success{background-color:var(--color-success-light);color:var(--color-success)}.badge-danger{background-color:var(--color-danger-light);color:var(--color-danger-dark)}.badge-warning{background-color:var(--color-warning-light);color:var(--color-warning)}.badge-neutral{background-color:var(--color-neutral-light);color:var(--color-text-muted)}.card{background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;overflow:hidden}.card-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--color-border);background-color:var(--color-bg-panel)}.card-title{font-family:var(--font-family);font-size:14px;font-weight:var(--font-weight-medium);color:var(--color-text)}.card-action{font-family:var(--font-family);font-size:13px;color:var(--color-primary);cursor:pointer;text-decoration:none}.card-action:hover{color:var(--color-primary-dark)}.card-body{padding:16px;font-family:var(--font-family);font-size:14px;color:var(--color-text)}.card-footer{padding:10px 16px;border-top:1px solid var(--color-border);background-color:var(--color-bg-panel);font-family:var(--font-family);font-size:13px;color:var(--color-text-muted)}.tooltip-wrap{position:relative;display:inline-flex}.tooltip{position:absolute;bottom:calc(100% + 6px);left:50%;transform:translate(-50%);background-color:var(--color-text);color:#fff;font-family:var(--font-family);font-size:12px;padding:4px 8px;border-radius:4px;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .2s;z-index:700}.tooltip-wrap:hover .tooltip{opacity:1}.tooltip-bottom{bottom:auto;top:calc(100% + 6px)}.tooltip-left{bottom:auto;left:auto;right:calc(100% + 6px);top:50%;transform:translateY(-50%)}.tooltip-right{bottom:auto;left:calc(100% + 6px);top:50%;transform:translateY(-50%)}*{box-sizing:border-box;margin:0;padding:0}html,body,#app{height:100%;color:var(--color-text);font-family:var(--font-family);font-size:var(--font-size-base)}#app{display:flex;flex-direction:column;background-color:var(--color-bg)}#layout-header{flex-shrink:0;height:58px;background-color:var(--color-primary-shell);border-bottom:none;overflow:visible;position:relative;z-index:100}.layout-main{flex:1;position:relative;min-height:0;isolation:isolate;--top-height: 48px;--left-width: 200px;--right-width: 200px;--bottom-height: 96px}#layout-main{flex:1;min-height:0}#layout-body{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;background-color:var(--color-bg);z-index:1}#layout-body-content{position:relative;height:100%;overflow:auto;z-index:2}#layout-body-content.map-active{pointer-events:none;background:transparent;overflow:visible}#layout-map{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;display:none;background-color:var(--color-bg-panel)}#layout-map.active{display:block}.body-inner{height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.layout-top{position:absolute;top:0;left:0;right:0;height:var(--top-height);border-bottom:1px solid var(--color-border);background-color:var(--color-bg);overflow:visible;z-index:19;transition:height .25s ease}.layout-main.top-inactive>.layout-top{display:none}.layout-top.collapsed{height:0;overflow:hidden;border-bottom:none}.panel-inner{width:100%;height:100%}.panel-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted);font-size:13px}.layout-left{position:absolute;left:0;top:0;bottom:0;width:var(--left-width);border-right:1px solid var(--color-border);background-color:var(--color-bg);overflow:hidden;z-index:20;transition:width .25s ease}.layout-main.left-inactive>.layout-left{display:none}.layout-left.collapsed{width:0;border-right:none}.layout-right{position:absolute;right:0;top:0;bottom:0;width:var(--right-width);border-left:1px solid var(--color-border);background-color:var(--color-bg);overflow:hidden;z-index:20;transition:width .25s ease}.layout-main.right-inactive>.layout-right{display:none}.layout-right.collapsed{width:0;border-left:none}.layout-bottom{position:absolute;bottom:0;left:0;right:0;height:var(--bottom-height);border-top:1px solid var(--color-border);background-color:var(--color-bg);overflow:hidden;z-index:20;transition:height .25s ease}.layout-main.bottom-inactive>.layout-bottom{display:none}.layout-bottom.collapsed{height:0;border-top:none}.panel-toggle{position:absolute;width:24px;height:24px;background:transparent;border:none;padding:0;cursor:pointer;z-index:30}.toggle-left,.toggle-right{top:50%;transform:translateY(-50%)}.toggle-left{left:var(--left-width);transition:left .25s ease}.layout-main.left-inactive>.toggle-left{display:none}.layout-main.left-collapsed>.toggle-left{left:0}.toggle-right{right:var(--right-width);transition:right .25s ease}.layout-main.right-inactive>.toggle-right{display:none}.layout-main.right-collapsed>.toggle-right{right:0}.toggle-top,.toggle-bottom{left:50%;transform:translate(-50%)}.toggle-top{top:var(--top-height);transition:top .25s ease}.layout-main.top-inactive>.toggle-top{display:none}.layout-main.top-collapsed>.toggle-top{top:0}.toggle-bottom{bottom:var(--bottom-height);transition:bottom .25s ease}.layout-main.bottom-inactive>.toggle-bottom{display:none}.layout-main.bottom-collapsed>.toggle-bottom{bottom:0}.toggle-icon{position:absolute;top:0;left:0;width:24px;height:24px;border-radius:50%;background-color:var(--color-bg);border:2px solid var(--color-primary);color:var(--color-primary);display:flex;align-items:center;justify-content:center}.toggle-icon svg{display:block}.toggle-icon--expand{display:none}.toggle-icon--collapse,.panel-toggle.expanded .toggle-icon--expand{display:flex}.panel-toggle.expanded .toggle-icon--collapse{display:none}.panel-toggle:disabled{cursor:not-allowed;pointer-events:none}.panel-toggle:disabled .toggle-icon{border-color:var(--color-neutral-light);color:var(--color-neutral);background-color:var(--color-bg)}#modal-root{position:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:800}#modal-root>*{pointer-events:auto}#layout-footer{flex-shrink:0;background-color:var(--color-primary-shell);border-top:none}.footer-inner{display:flex;justify-content:space-between;align-items:center;padding:12px 24px;font-size:12px;color:#ffffffbf}#footer-coords{font-family:var(--font-family);font-size:12px;color:#ffffffbf;letter-spacing:.03em}.map-bottom-bar{position:absolute;bottom:8px;right:28px;z-index:10;display:flex;align-items:flex-end;gap:8px;pointer-events:none}.map-coords-overlay:empty{display:none}.map-coords-overlay{padding:3px 8px;background:#00000073;color:#ffffffe0;font-family:var(--font-family);font-size:11px;letter-spacing:.03em;border-radius:4px;white-space:nowrap}.map-bottom-bar .ol-scale-line{position:static;background:transparent;padding:2px 4px 4px}.map-bottom-bar .ol-scale-line-inner{border:2px solid #000000;border-top:none;font-family:var(--font-family);font-size:11px;font-weight:700;color:#000;text-align:center;text-shadow:-1px -1px 0 #ffffff,1px -1px 0 #ffffff,-1px 1px 0 #ffffff,1px 1px 0 #ffffff}.header-inner{display:flex;align-items:center;height:58px;padding:0 24px;background-color:var(--color-primary-shell);gap:32px}.header-logo{display:flex;align-items:baseline;gap:6px;flex-shrink:0;text-decoration:none;cursor:default}.header-logo-mark{font-size:18px;font-weight:700;color:#fff;letter-spacing:.02em}.header-logo-text{font-size:15px;font-weight:500;color:#ffffffd9}.header-nav{flex:1;display:flex;align-items:center;justify-content:center;gap:4px}.header-nav-item{display:inline-flex;align-items:center;height:36px;padding:0 16px;font-size:14px;font-weight:500;color:#ffffffe6;text-decoration:none;border-radius:4px;cursor:pointer;transition:background-color .2s,color .2s;white-space:nowrap}.header-nav-item:hover{background-color:#ffffff26;color:#fff}.header-nav-item.active{color:#fff;font-weight:600;border-bottom:2px solid rgba(255,255,255,.8);border-radius:0}.header-nav-item.open{background-color:#ffffff26}.header-nav-item--disabled{color:#fff6;cursor:not-allowed;pointer-events:none}.header-nav-item--disabled:hover{background-color:transparent;color:#fff6}.header-nav-dropdown-wrap{position:relative}.header-nav-dropdown{position:absolute;top:calc(100% + 8px);left:0;width:180px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 8px #00000026;z-index:200;overflow:hidden}.header-nav-dropdown-item{display:block;width:100%;padding:10px 16px;font-family:var(--font-family);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);color:var(--color-text);text-decoration:none;cursor:pointer;transition:background-color .2s,color .2s}.header-nav-dropdown-item+.header-nav-dropdown-item{border-top:1px solid var(--color-border)}.header-nav-dropdown-item:hover{background-color:var(--color-primary-light);color:var(--color-primary-dark)}.header-nav-dropdown-item.active{color:var(--color-primary-dark);font-weight:600;background-color:var(--color-primary-light)}.header-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}.header-user{font-size:13px;color:#ffffffd9;margin-right:4px}.header-action-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background:transparent;border:none;border-radius:4px;cursor:pointer;transition:background-color .2s}.btn-profile{color:#ffffffd9}.btn-profile:hover{background-color:#ffffff26}.btn-logout{color:#ffffffd9}.btn-logout:hover{background-color:#ffffff26}.header-ai-wrap{position:relative;transform:translate(-50%)}.header-ai-btn{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 14px;font-size:13px;font-weight:500;font-family:var(--font-family);color:#ffffffd9;background:#ffffff1a;border:1px solid rgba(255,255,255,.25);border-radius:4px;transition:background-color .2s,border-color .2s,color .2s}.header-ai-btn:hover{background:#ffffff2e}.header-ai-toggle{display:inline-flex;align-items:center;cursor:pointer}.header-ai-toggle .checkbox-input{display:none}.header-ai-toggle .checkbox-box{width:16px;height:16px;border:2px solid rgba(255,255,255,.5);border-radius:2px;background-color:transparent;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background-color .2s,border-color .2s}.header-ai-toggle .checkbox-input:checked+.checkbox-box{background-color:#ffb84d;border-color:#ffb84d}.header-ai-toggle .checkbox-input:checked+.checkbox-box:after{content:"";width:4px;height:8px;border:2px solid #1a1a1a;border-top:none;border-left:none;transform:rotate(45deg) translateY(-1px)}.header-ai-btn-inner{display:inline-flex;align-items:center;gap:6px;margin:0;padding:0;background:transparent;border:none;color:inherit;font:inherit;cursor:pointer}.header-ai-btn.active{background:#ffa02833;border-color:#ffa02880;color:#ffb84d}.ai-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;font-size:11px;font-weight:700;color:#fff;background-color:#e53935;border-radius:9px}.ai-panel{position:absolute;top:calc(100% + 8px);right:0;width:340px;max-height:420px;display:flex;flex-direction:column;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 8px #00000026;z-index:200;overflow:hidden}.ai-panel-head{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;font-size:14px;font-weight:600;color:var(--color-text);border-bottom:1px solid var(--color-border);flex-shrink:0}.ai-panel-close{background:transparent;border:none;color:var(--color-neutral);cursor:pointer;font-size:13px}.ai-panel-body{overflow-y:auto;padding:4px 0}.ai-panel-empty{padding:24px 14px;text-align:center;font-size:13px;color:var(--color-neutral)}.ai-detect-item{display:flex;align-items:flex-start;gap:8px;padding:10px 14px;cursor:pointer;transition:background-color .2s;border-bottom:1px solid var(--color-border)}.ai-detect-item:last-child{border-bottom:none}.ai-detect-item:hover{background-color:var(--color-primary-light)}.ai-detect-item.viewed{opacity:1;background-color:#e539351f;border-left:3px solid rgba(229,57,53,1);padding-left:11px}.ai-detect-icon{flex-shrink:0;font-size:12px;line-height:1.6}.ai-detect-body{flex:1;min-width:0}.ai-detect-confirm{flex-shrink:0;align-self:flex-start;padding:3px 10px;font-size:11px;font-weight:600;font-family:var(--font-family);color:var(--color-primary);background:transparent;border:1px solid var(--color-primary);border-radius:4px;cursor:pointer;transition:background-color .15s,color .15s;white-space:nowrap;margin-top:1px}.ai-detect-confirm:hover{background-color:var(--color-primary);color:#fff}.ai-detect-title{font-size:13px;font-weight:600;color:var(--color-text);margin-bottom:2px}.ai-detect-facts,.ai-detect-cause{list-style:none;margin:0;padding:0;font-size:12px;font-weight:500;line-height:1.5;color:var(--color-text)}.ai-detect-facts li,.ai-detect-cause li{position:relative;padding-left:10px}.ai-detect-facts li:before,.ai-detect-cause li:before{content:"·";position:absolute;left:0}.ai-detect-cause{margin-top:6px}.th-row{display:flex;align-items:center;gap:8px;flex-wrap:nowrap}.th-label-group{display:flex;align-items:center;gap:5px;flex-shrink:0}.th-label-icon{color:var(--color-text-muted);flex-shrink:0}.th-label{font-size:12px;color:var(--color-text);white-space:nowrap;flex-shrink:0}.th-input{height:26px;padding:0 8px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);font-family:var(--font-family);font-size:12px;outline:none;transition:border-color .15s;flex-shrink:0;cursor:pointer}.th-input:focus{border-color:var(--color-primary)}.th-from-input,.th-to-input{width:130px}.th-hour-select{width:64px}.th-indicator-select{width:90px;cursor:pointer}.th-range-sep{font-size:12px;color:var(--color-text-muted);flex-shrink:0}.th-legend-btn{height:28px;padding:0 12px;background-color:var(--color-bg-panel, #f5f7f9);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);font-family:var(--font-family);font-size:12px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s,border-color .15s}.th-legend-btn:hover{background-color:var(--color-primary-light);border-color:var(--color-primary)}.th-legend-btn.active{background-color:var(--color-primary, #497193);border-color:var(--color-primary, #497193);color:#fff}.th-search-btn{height:28px;padding:0 18px;background-color:var(--color-primary, #497193);border:none;border-radius:4px;color:#fff;font-family:var(--font-family);font-size:12px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s}.th-search-btn:hover{background-color:#5a8aaf}.th-search-btn:active{background-color:#3a6180}.th-reset-btn{height:28px;padding:0 14px;margin-left:6px;background-color:var(--color-warning, #c49a00);border:none;border-radius:4px;color:#fff;font-family:var(--font-family);font-size:12px;cursor:pointer;white-space:nowrap;flex-shrink:0;transition:background-color .15s}.th-reset-btn:hover{background-color:#a98200}.th-reset-btn:active{background-color:#8f6d00}.th-frame-area{display:flex;align-items:center;gap:8px;margin-left:auto;flex-shrink:0;padding-left:12px;border-left:1px solid var(--color-border)}.th-status-msg{font-size:12px;color:var(--color-text-muted);white-space:nowrap}.th-status-msg.th-status-error{color:var(--color-danger, #e57373)}.th-frame-btn{height:24px;min-width:30px;padding:0 6px;background-color:var(--color-bg-panel, #f5f7f9);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);font-size:11px;cursor:pointer;flex-shrink:0;transition:background-color .12s}.th-frame-btn:hover:not(:disabled){background-color:var(--color-primary-light)}.th-frame-btn:disabled{opacity:.35;cursor:not-allowed}.th-play-btn.playing{background-color:var(--color-primary-light);border-color:var(--color-primary);color:var(--color-primary-dark, var(--color-primary))}.th-frame-label{min-width:160px;text-align:center;font-size:12px;font-weight:600;color:var(--color-text);flex-shrink:0}.th-frame-slider{flex:1;min-width:320px;max-width:1280px;accent-color:var(--color-primary, #497193);cursor:pointer}.th-frame-slider:disabled{opacity:.35;cursor:not-allowed}.th-frame-count{font-size:11px;color:var(--color-text);flex-shrink:0;min-width:52px;text-align:right;margin-left:-7px;margin-right:8px}.th-bottom-panel{display:flex;flex-direction:column;height:100%;background-color:#182530}.th-bottom-header{display:flex;align-items:center;gap:12px;padding:0 16px;height:36px;background-color:#1a2d3d;border-bottom:1px solid rgba(255,255,255,.1);flex-shrink:0}.th-bottom-title{font-size:12px;font-weight:600;color:#ffffffa6;white-space:nowrap}.th-bottom-linkid{font-size:12px;color:#ffffff73}.th-bottom-body{flex:1;position:relative;min-height:0}.th-bottom-chart{width:100%;height:100%}.th-bottom-status{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:12px;color:#fff6;pointer-events:none;text-align:center;padding:0 20px;white-space:nowrap}#traffichistory-layer-overlay{position:absolute;z-index:500;width:248px;border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 6px #00000038;overflow:hidden;font-family:var(--font-family);font-size:12px}#traffichistory-layer-overlay.collapsed{width:auto;border:none;box-shadow:none;overflow:visible}#traffichistory-map-overlay{position:absolute;z-index:500;display:flex;flex-direction:column;gap:6px;font-family:var(--font-family);font-size:12px}#layout-map.th-selection-mode .ol-viewport{cursor:grab}#layout-map.th-selection-mode .ol-viewport:active{cursor:grabbing}.cctv-map-popup{position:relative;display:flex;flex-direction:column;width:340px;background:#0f1c28;border:1px solid rgba(255,255,255,.22);border-radius:4px;box-shadow:0 4px 16px #0000008c;overflow:hidden;pointer-events:auto}.cctv-resize-handle{position:absolute;z-index:10}.cctv-resize-handle[data-resize=n]{top:0;left:8px;right:8px;height:5px;cursor:n-resize}.cctv-resize-handle[data-resize=s]{bottom:0;left:8px;right:8px;height:5px;cursor:s-resize}.cctv-resize-handle[data-resize=e]{right:0;top:8px;bottom:8px;width:5px;cursor:e-resize}.cctv-resize-handle[data-resize=w]{left:0;top:8px;bottom:8px;width:5px;cursor:w-resize}.cctv-resize-handle[data-resize=ne]{top:0;right:0;width:10px;height:10px;cursor:ne-resize}.cctv-resize-handle[data-resize=nw]{top:0;left:0;width:10px;height:10px;cursor:nw-resize}.cctv-resize-handle[data-resize=se]{bottom:0;right:0;width:10px;height:10px;cursor:se-resize}.cctv-resize-handle[data-resize=sw]{bottom:0;left:0;width:10px;height:10px;cursor:sw-resize}.cctv-map-popup-header{display:flex;align-items:center;justify-content:space-between;height:32px;min-height:32px;padding:0 10px;background-color:#1a2d3d;border-bottom:1px solid rgba(255,255,255,.12);flex-shrink:0;cursor:grab;-webkit-user-select:none;user-select:none}.cctv-map-popup-header.dragging{cursor:grabbing}.cctv-map-popup-title{flex:1;font-size:12px;font-weight:600;color:#ffffffe6}.cctv-map-popup--readonly .cctv-map-popup-header{cursor:default}.cctv-map-popup-close{width:20px;height:20px;background:transparent;border:none;color:#ffffff8c;font-size:14px;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:2px;padding:0;line-height:1;transition:color .12s,background-color .12s}.cctv-map-popup-close:hover{color:#fff;background-color:#ffffff1a}.cctv-map-popup-body{flex:1;min-height:0;overflow:hidden}.cctv-map-popup-video{display:block;width:100%;height:100%;background:#000;object-fit:contain}.cctv-map-popup-nodata{display:flex;align-items:center;justify-content:center;height:100%;font-size:13px;color:#ffffff59}.map-controls-panel{position:absolute;bottom:52px;right:32px;display:flex;flex-direction:column;align-items:flex-end;gap:6px;pointer-events:none}.district-control-wrapper{display:flex;flex-direction:row-reverse;align-items:flex-start;gap:4px;pointer-events:auto}.map-district-control{display:flex;flex-direction:row;align-items:center;gap:5px;padding:7px 9px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;overflow:hidden;max-width:700px;opacity:1;transition:max-width .3s ease,opacity .2s ease,padding .3s ease}.district-control-wrapper.collapsed .map-district-control{max-width:0;opacity:0;padding-left:0;padding-right:0;border-color:transparent;pointer-events:none}.district-control-wrapper.collapsed{gap:0}.district-select{width:119px;height:29px;padding:0 5px;font-family:var(--font-family);font-size:12px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;cursor:pointer}.district-select:disabled{color:var(--color-text-muted);cursor:not-allowed}.district-move-btn{width:47px;height:29px;flex-shrink:0;font-size:12px}.district-toggle-btn{width:43px;height:43px;flex-shrink:0;padding:0;display:flex;align-items:center;justify-content:center;color:#fff;background-color:var(--color-primary);border:none;border-radius:4px;cursor:pointer}.district-toggle-btn:hover{background-color:var(--color-primary-dark)}.district-toggle-btn svg{display:block}.geocode-control-wrapper{display:flex;flex-direction:row-reverse;align-items:flex-start;gap:4px;pointer-events:auto}.geocode-control-wrapper.collapsed{gap:0}.geocode-control{position:relative;display:flex;justify-content:flex-end}.geocode-content{overflow:hidden;max-width:700px;opacity:1;transition:max-width .3s ease,opacity .2s ease}.geocode-control-wrapper.collapsed .geocode-content{max-width:0;opacity:0;pointer-events:none}.geocode-control-wrapper.collapsed .geocode-result-list{display:none}.geocode-fields{display:flex;flex-direction:row;align-items:center;gap:5px;padding:7px 9px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;width:585px;box-sizing:border-box}.geocode-filter-select{width:119px;height:29px;padding:0 4px;font-family:var(--font-family);font-size:11px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;cursor:pointer;flex-shrink:0}.geocode-filter-select:disabled{color:var(--color-text-muted);cursor:not-allowed}.geocode-input{flex:1;min-width:0;height:29px;padding:0 8px;font-family:var(--font-family);font-size:12px;color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;box-sizing:border-box;outline:none;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.geocode-input:focus{border-color:var(--color-primary)}.geocode-search-btn{width:47px;height:29px;flex-shrink:0;font-size:12px}.geocode-result-list{display:none;position:absolute;top:calc(100% + 2px);left:0;min-width:100%;height:240px;overflow-y:scroll;margin:0;padding:2px 0;list-style:none;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 6px #0000001f;z-index:1000}.geocode-result-list.visible{display:block}.geocode-result-item{padding:6px 10px;font-family:var(--font-family);font-size:12px;color:var(--color-text);cursor:pointer;white-space:nowrap}.geocode-result-item:hover{background-color:var(--color-bg-panel)}.geocode-type-badge{display:inline-block;padding:1px 5px;margin-right:6px;font-size:10px;border-radius:4px;vertical-align:middle;flex-shrink:0;pointer-events:none}.geocode-type-address{background-color:var(--color-primary-light);color:var(--color-primary-dark)}.geocode-type-place{background-color:var(--color-success-light);color:var(--color-success)}.basemap-control-wrapper{display:flex;flex-direction:row-reverse;align-items:flex-start;gap:4px;pointer-events:auto}.basemap-control-wrapper.collapsed{gap:0}.basemap-control{display:flex;flex-direction:row;align-items:center;gap:5px;padding:7px 9px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;overflow:hidden;max-width:700px;opacity:1;transition:max-width .3s ease,opacity .2s ease,padding .3s ease}.basemap-control-wrapper.collapsed .basemap-control{max-width:0;opacity:0;padding-left:0;padding-right:0;border-color:transparent;pointer-events:none}.basemap-btn{height:29px;padding:0 10px;font-size:12px;flex-shrink:0;white-space:nowrap}.basemap-btn.active{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.zoom-control-group{display:flex;flex-direction:column;align-items:flex-end;gap:0}.zoom-btn{width:43px;height:23px;display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:300;line-height:1;padding:0;color:#000000bf;background-color:#fff;border:1px solid var(--color-border);border-radius:4px;cursor:pointer}.zoom-btn:hover{background-color:var(--color-bg-panel)}.zoom-level-display{display:flex;align-items:center;justify-content:center;width:43px;height:22px;font-family:var(--font-family);font-size:12px;font-weight:var(--font-weight-medium);color:var(--color-text);background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;margin:2px 0;box-sizing:border-box;pointer-events:none;-webkit-user-select:none;user-select:none}.controls-toggle-btn{width:43px;height:28px;flex-shrink:0;padding:0;display:flex;align-items:center;justify-content:center;color:#fff;background-color:var(--color-primary);border:none;border-radius:4px;cursor:pointer;pointer-events:auto}.controls-toggle-btn:hover{background-color:var(--color-primary-dark)}.controls-toggle-btn svg{display:block;transition:transform .2s ease}.map-controls-panel.collapsed>*:not(.controls-toggle-btn){display:none}.map-controls-panel.collapsed .controls-toggle-btn svg{transform:rotate(180deg)}.measure-control-group{display:flex;flex-direction:column;align-items:flex-end;gap:4px;pointer-events:auto}.measure-btn{width:43px;height:52px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:0;color:#fff;background-color:var(--color-primary);border:none;border-radius:4px;cursor:pointer;flex-shrink:0}.measure-btn:hover{background-color:var(--color-primary-dark)}.measure-btn.active{background-color:var(--color-primary-dark);box-shadow:inset 0 0 0 2px #fff6}.measure-btn svg{display:block}.measure-btn-label{font-family:var(--font-family);font-size:10px;line-height:1}.measure-tooltip{position:relative;background:#000000a6;border-radius:4px;color:#fff;padding:4px 8px;font-family:var(--font-family);font-size:12px;white-space:nowrap;pointer-events:none;-webkit-user-select:none;user-select:none}.measure-tooltip:after{content:"";position:absolute;bottom:-6px;left:50%;transform:translate(-50%);border:6px solid transparent;border-top-color:#000000a6;border-bottom:0}.measure-tooltip-static{background:#fffffff2;color:var(--color-text);border:1px solid var(--color-border)}.measure-tooltip-static:after{border-top-color:var(--color-border)}.marker-close-btn{width:18px;height:18px;padding:0;display:flex;align-items:center;justify-content:center;font-size:13px;line-height:1;color:#fff;background-color:#c00;border:none;border-radius:50%;cursor:pointer;pointer-events:auto}.marker-close-btn:hover{background-color:#900}.measure-tooltip-static .marker-close-btn{position:absolute;top:-9px;right:-9px}.map-clock{position:absolute;bottom:24px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:7px 18px;background-color:var(--color-primary);border-radius:4px;color:#fff;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap}.map-clock-dot{width:8px;height:8px;border-radius:50%;background-color:#ff5050;flex-shrink:0;animation:clock-dot-blink 1.2s ease-in-out infinite}@keyframes clock-dot-blink{0%,to{opacity:1}50%{opacity:.25}}.map-clock-label{font-size:13px;font-weight:600;font-family:var(--font-family)}.map-clock-divider{font-size:13px;opacity:.6;font-family:var(--font-family)}.map-clock-time{font-size:15px;font-weight:700;font-family:var(--font-family);letter-spacing:.04em}.map-clock-date{font-size:13px;font-weight:500;font-family:var(--font-family)}:root,:host{--ol-background-color: white;--ol-accent-background-color: #F5F5F5;--ol-subtle-background-color: rgba(128, 128, 128, .25);--ol-partial-background-color: rgba(255, 255, 255, .75);--ol-foreground-color: #333333;--ol-subtle-foreground-color: #666666;--ol-brand-color: #00AAFF}.ol-box{box-sizing:border-box;border-radius:2px;border:1.5px solid var(--ol-background-color);background-color:var(--ol-partial-background-color)}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;text-align:center;margin:1px;will-change:contents,width;transition:all .25s}.ol-scale-bar{position:absolute;bottom:8px;left:8px}.ol-scale-bar-inner{display:flex}.ol-scale-step-marker{width:1px;height:15px;background-color:var(--ol-foreground-color);float:right;z-index:10}.ol-scale-step-text{position:absolute;bottom:-5px;font-size:10px;z-index:11;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-text{position:absolute;font-size:12px;text-align:center;bottom:25px;color:var(--ol-foreground-color);text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.ol-scale-singlebar{position:relative;height:10px;z-index:9;box-sizing:border-box;border:1px solid var(--ol-foreground-color)}.ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.ol-unsupported{display:none}.ol-viewport,.ol-unselectable{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-viewport canvas{all:unset;overflow:hidden}.ol-viewport{touch-action:pan-x pan-y}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;user-select:text}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:var(--ol-subtle-background-color);border-radius:4px}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}.ol-control button{display:block;margin:1px;padding:0;color:var(--ol-subtle-foreground-color);font-weight:700;text-decoration:none;font-size:inherit;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:var(--ol-background-color);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:hover,.ol-control button:focus{text-decoration:none;outline:1px solid var(--ol-subtle-foreground-color);color:var(--ol-foreground-color)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em);display:flex;flex-flow:row-reverse;align-items:center}.ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.ol-attribution ul{margin:0;padding:1px .5em;color:var(--ol-foreground-color);text-shadow:0 0 2px var(--ol-background-color);font-size:12px}.ol-attribution li{display:inline;list-style:none}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button{flex-shrink:0}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:block}.ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.ol-overviewmap-box{border:1.5px dotted var(--ol-subtle-foreground-color)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move}.ol-overviewmap .ol-viewport:hover{cursor:pointer}.th-history-clock{position:absolute;bottom:24px;left:50%;transform:translate(-50%);z-index:500;display:flex;align-items:center;gap:8px;padding:7px 18px;background-color:var(--color-primary);border-radius:4px;color:#fff;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap}.th-history-clock-icon{display:flex;align-items:center;flex-shrink:0;width:16px;height:16px;color:#ffb300;pointer-events:auto;cursor:pointer}.th-history-clock-icon svg{width:100%;height:100%}.th-history-clock-divider{font-size:13px;opacity:.6;font-family:var(--font-family)}.th-history-clock-time{font-size:15px;font-weight:700;font-family:var(--font-family);letter-spacing:.04em}.th-history-clock-date{font-size:13px;font-weight:500;font-family:var(--font-family)}.gis-float-panel{width:248px;border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 6px #00000038;overflow:hidden}.gis-float-panel--collapsed{width:auto;border:none;box-shadow:none;overflow:visible}.gis-traffic-panel-header{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;background:var(--color-primary);color:#fff;font-size:12px;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.gis-traffic-panel-header-left{display:flex;align-items:center;gap:6px}.gis-traffic-panel-checkbox{display:none}.gis-traffic-panel-title{font-size:12px;font-weight:600}.gis-traffic-panel-header-right{display:flex;align-items:center;gap:5px}.gis-traffic-panel-body{display:flex;flex-direction:column;gap:5px;padding:8px 10px;background:#fffffff2;border-top:1px solid var(--color-border)}.gis-traffic-panel-body.hidden{display:none}.gis-traffic-panel-row{display:flex;align-items:center;gap:6px}.gis-traffic-panel-field-label{font-size:12px;color:var(--color-text-muted);white-space:nowrap;min-width:58px}.gis-traffic-panel-value{font-size:12px;color:var(--color-text)}.gis-traffic-vehicle-row{border-bottom:1px solid var(--color-border);padding-bottom:5px;margin-left:-10px;margin-right:-10px;padding-left:10px;padding-right:10px}.gis-traffic-vehicle-label{font-size:12px;color:var(--color-text-muted);font-weight:500;white-space:nowrap;margin-right:2px}.gis-traffic-vehicle-item{display:flex;align-items:center;gap:3px;font-size:12px;color:var(--color-text);cursor:pointer;white-space:nowrap}.gis-traffic-vehicle-item input[type=checkbox],.gis-traffic-vehicle-item input[type=radio]{width:13px;height:13px;margin:0;cursor:pointer;flex-shrink:0;accent-color:var(--color-primary)}.gis-traffic-indicator-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border);margin-left:-10px;margin-right:-10px;padding:8px 10px}.gis-traffic-indicator-item{display:flex;align-items:center;gap:10px;padding:3px 6px;border:1px solid var(--color-border);border-radius:4px;background:#fff;min-width:0}.gis-traffic-indicator-check{width:14px;height:14px;margin:0;cursor:pointer;flex-shrink:0;accent-color:var(--color-primary)}.gis-traffic-indicator-name{flex:1;font-size:12px;color:var(--color-text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.gis-traffic-indicator-item--disabled{opacity:.45;cursor:not-allowed}.gis-traffic-indicator-item--disabled .gis-traffic-indicator-check{cursor:not-allowed}.gis-traffic-indicator-item--disabled .gis-traffic-indicator-name{color:var(--color-neutral)}.gis-traffic-legend{border-top:1px solid var(--color-border);margin-left:-10px;margin-right:-10px;padding:6px 10px 2px;background:var(--color-bg-panel, #f5f7f9)}.gis-traffic-legend-group{padding-bottom:5px;margin-bottom:5px;border-bottom:1px solid var(--color-border)}.gis-traffic-legend-group:last-child{border-bottom:none;margin-bottom:0;padding-bottom:2px}.gis-traffic-legend-title{display:block;font-size:11px;font-weight:600;color:var(--color-text-muted);margin-bottom:4px}.gis-traffic-legend-list{display:grid;grid-template-columns:1fr 1fr;gap:2px 6px}.gis-traffic-legend-list--inline{display:flex;flex-wrap:nowrap;gap:8px}.gis-traffic-legend-item{display:flex;align-items:center;gap:5px}.gis-traffic-legend-swatch{display:inline-block;width:22px;height:5px;border-radius:2px;flex-shrink:0}.gis-traffic-legend-swatch--circle{width:12px;height:12px;border-radius:50%}.gis-traffic-legend-label{font-size:11px;color:var(--color-text);white-space:nowrap}.gis-dp-header{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;background:var(--color-primary);color:#fff;font-size:12px;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.gis-dp-header-right{display:flex;align-items:center;gap:6px}.gis-dp-action-btns{display:flex;align-items:center;gap:4px}.gis-dp-icon-btn{display:flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;border:1px solid rgba(255,255,255,.5);border-radius:4px;background:transparent;color:#fff;cursor:pointer;flex-shrink:0}.gis-dp-icon-btn:hover{background:#fff3}.gis-dp-icon-btn--active{background:#ffffff4d;border-color:#fff}.gis-dp-body{padding:8px 10px;background:#fff;border-top:1px solid var(--color-border);display:flex;flex-direction:column;gap:0}.gis-dp-kpi-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px;margin-bottom:8px}.gis-dp-kpi-cell{background:var(--color-bg-panel, #f5f7f9);border:1px solid var(--color-border);border-radius:4px;padding:5px 8px 6px}.gis-dp-kpi-label{font-size:10px;font-weight:600;color:#33404b;margin-bottom:3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gis-dp-kpi-value{font-size:15px;font-weight:700;color:var(--color-text);line-height:1.1}.gis-dp-kpi-unit{font-size:11px;font-weight:500;color:#4b5563;letter-spacing:.2px;margin-left:3px}.gis-dp-info-row{display:flex;align-items:center;justify-content:space-between;padding:6px 0;border-top:1px solid var(--color-border)}.gis-dp-info-key{font-size:12px;color:var(--color-text-muted)}.gis-dp-info-val{font-size:12px;font-weight:600;color:var(--color-text)}.gis-dp-turn-section{border-top:1px solid var(--color-border);padding-top:7px;display:flex;flex-direction:column;gap:0}.gis-dp-turn-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:5px}.gis-dp-turn-header-left{display:flex;align-items:center;gap:4px}.gis-dp-turn-title{font-size:12px;font-weight:600;color:var(--color-text)}.gis-dp-turn-toggle{background:none;border:none;padding:0 2px;cursor:pointer;font-size:20px;color:var(--color-text-secondary, #666);line-height:1}.gis-dp-turn-toggle:hover{color:var(--color-primary)}.gis-dp-metric-select{font-size:11px;font-family:var(--font-family);padding:2px 20px 2px 6px;border:1px solid var(--color-border);border-radius:4px;background:#fff;color:var(--color-text);cursor:pointer;-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}.gis-dp-turn-rows{display:flex;flex-direction:column;gap:4px;max-height:220px;overflow-y:auto}.gis-dp-turn-rows.hidden{display:none}.gis-dp-turn-group+.gis-dp-turn-group{margin-top:4px}.gis-dp-turn-group-header{display:flex;align-items:center;gap:3px;padding:2px 4px;border-radius:3px;cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease}.gis-dp-turn-group-header:hover{background-color:#1565c029}.gis-dp-turn-group-chevron{font-size:13px;line-height:1;color:var(--color-text-secondary, #666);width:12px;flex-shrink:0}.gis-dp-turn-group-title{font-size:13px;font-weight:600;color:var(--color-text)}.gis-dp-turn-group-rows{display:flex;flex-direction:column;gap:4px;padding-left:15px}.gis-dp-turn-group-rows.hidden{display:none}.gis-dp-turn-row{display:flex;align-items:center;gap:5px;min-height:18px}.gis-dp-turn-check{width:12px;height:12px;margin:0;flex-shrink:0;cursor:pointer;accent-color:var(--color-primary)}.gis-dp-turn-label{font-size:11px;color:var(--color-text);width:84px;flex-shrink:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gis-dp-turn-type{display:inline-block;width:36px}.gis-dp-turn-id{font-variant-numeric:tabular-nums}.gis-dp-bar-wrap{flex:1;min-width:0;height:5px;background:#e9ecef;border-radius:3px;overflow:hidden}.gis-dp-bar{height:100%;border-radius:3px;transition:width .35s ease}.gis-dp-turn-val{font-size:11px;font-weight:600;min-width:34px;text-align:right;flex-shrink:0;white-space:nowrap}.gis-dp-footer{padding:7px 10px 8px;background:#fff;border-top:1px solid var(--color-border)}.gis-dp-graph-btn{width:100%;padding:6px 0;font-size:12px;font-family:var(--font-family);font-weight:600;letter-spacing:.3px;border:none;border-radius:5px;background:var(--color-primary);color:#fff;cursor:pointer}.gis-dp-graph-btn:hover{opacity:.88}.gis-dp-loading{font-size:12px;color:var(--color-text-muted);text-align:center;padding:10px 0}.gis-dp-placeholder{font-size:12px;color:var(--color-text-muted);text-align:center;padding:16px 10px;background:#fff;border-top:1px solid var(--color-border)}.gis-ts-panel-header{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;background:var(--color-primary);color:#fff;font-size:12px;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.gis-ts-panel-body{background:#fff;border-top:1px solid var(--color-border);padding:8px 10px}.gis-ts-placeholder{display:flex;align-items:center;justify-content:center;height:67px;font-size:12px;color:var(--color-text-muted);background:var(--color-bg-panel, #f5f7f9);border:1px dashed var(--color-border);border-radius:4px}.gis-panel-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px}.gis-panel-chevron svg{width:16px;height:16px}.gis-panel-icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background:var(--color-primary);color:#fff;border-radius:4px;cursor:pointer;flex-shrink:0}.gis-panel-icon-btn svg{width:20px;height:20px}.gis-bg-panel-header{display:flex;align-items:center;justify-content:space-between;padding:7px 10px;background:var(--color-primary);color:#fff;font-size:12px;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.gis-bg-panel-header-left{display:flex;align-items:center;gap:6px}.gis-bg-panel-checkbox{display:none}.gis-bg-panel-title{font-size:12px;font-weight:600}.gis-bg-panel-header-right{display:flex;align-items:center;gap:5px}.gis-bg-panel-body{padding:0;gap:0;background:var(--color-bg-panel, #f5f7f9)}.gis-bg-panel-body.hidden{display:none}.gis-bg-layer-row{display:flex;align-items:center;gap:6px;padding:5px 10px;border-bottom:1px solid var(--color-border)}.gis-bg-layer-row:last-child{border-bottom:none}.gis-bg-layer-row--active{background:#fff}.gis-bg-layer-row--active.drag-over{border-top:2px solid var(--color-primary)}.gis-bg-layer-check{width:13px;height:13px;margin:0;cursor:pointer;flex-shrink:0;accent-color:var(--color-primary)}.gis-bg-layer-name{flex:1;font-size:12px;color:var(--color-text)}.gis-bg-layer-btn{margin-left:auto;width:22px;height:22px;display:flex;align-items:center;justify-content:center;padding:0;color:var(--color-primary);background:none;border:1px solid var(--color-primary);border-radius:4px;cursor:pointer;flex-shrink:0}.gis-bg-layer-btn:hover{background-color:var(--color-primary);color:#fff}.gis-bg-layer-btn--remove{color:var(--color-danger);border-color:var(--color-danger)}.gis-bg-layer-btn--remove:hover{background-color:var(--color-danger);color:#fff}.gis-bg-legend-btn{width:auto;padding:0 6px;font-size:11px;font-family:var(--font-family)}#traffichistory-search-panel{position:absolute;top:12px;right:12px;z-index:500;display:flex;flex-direction:row-reverse;align-items:stretch;font-family:var(--font-family);font-size:12px;box-shadow:0 2px 6px #00000038}.gis-panel-chevron{font-size:15px;line-height:1;transition:transform .15s ease;display:inline-block}.gis-panel-chevron.collapsed{transform:rotate(-90deg)}.th-search-header{display:flex;align-items:center;gap:6px;padding:7px 10px;background:var(--color-primary);color:#fff;font-size:12px;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0;border:1px solid var(--color-border);border-radius:4px}.th-search-header--joined{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.th-search-title{font-size:12px;font-weight:600}.th-search-body{display:flex;align-items:center;padding:6px 10px;background:#fffffff2;border:1px solid var(--color-border);border-right:none;border-top-left-radius:4px;border-bottom-left-radius:4px;flex-shrink:0}#route-timespace-layer-overlay{position:absolute;z-index:500;width:248px;border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 6px #00000038;overflow:hidden;font-family:var(--font-family);font-size:12px}#route-timespace-layer-overlay.collapsed{width:auto;border:none;box-shadow:none;overflow:visible}#route-timespace-map-overlay{position:absolute;z-index:500;display:flex;flex-direction:column;gap:6px;font-family:var(--font-family);font-size:12px}#route-timespace-traffic-panel-wrap{display:none!important}#layout-map.rts-selection-mode .ol-viewport{cursor:grab}#layout-map.rts-selection-mode .ol-viewport:active{cursor:grabbing}.gis-float-panel.rts-ts-panel{width:280px}.rts-ts-chip-list{display:flex;gap:10px;margin-bottom:8px;min-height:28px}.rts-ts-chip{display:flex;flex:1;align-items:center;justify-content:center;gap:2px;height:28px;padding:0 4px;background:var(--color-primary);color:#fff;font-size:12px;border-radius:4px;box-sizing:border-box}.rts-ts-chip-order{font-weight:700}.rts-ts-chip--placeholder{background:var(--color-neutral-light);color:var(--color-text-muted)}.rts-ts-row{display:flex;align-items:center;gap:10px;margin-bottom:8px;flex-wrap:nowrap}.rts-input--ts-from,.rts-input--ts-to{flex:none;width:115px;padding:0 4px}.rts-ts-actions{display:flex;gap:6px}.rts-ts-open-btn{flex:1;padding:6px 0;font-size:12px;font-weight:600;color:#fff;background:var(--color-primary);border:none;border-radius:4px;cursor:pointer}.rts-ts-open-btn:disabled{background:var(--color-neutral);cursor:not-allowed}.rts-input{height:26px;padding:0 8px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);font-family:var(--font-family);font-size:12px}.rts-input:focus{border-color:var(--color-primary)}.rts-hour-select{width:115px}.rts-range-sep{width:10px;font-size:12px;color:var(--color-text-muted);text-align:center;flex-shrink:0}.rts-reset-btn{flex:none;width:100px;height:28px;padding:0 14px;background-color:var(--color-warning, #c49a00);border:none;border-radius:4px;color:#fff;font-family:var(--font-family);font-size:12px;cursor:pointer}.rts-reset-btn:hover{background-color:#a98200}.rts-reset-btn:active{background-color:#8f6d00}#group-flow-panel{position:absolute;z-index:500;font-family:var(--font-family);font-size:12px}.gis-float-panel.gf-panel{width:300px}.gf-section-title{margin:10px 0 6px;font-size:12px;font-weight:700;color:var(--color-text)}.gf-section-title:first-child{margin-top:0}.gf-empty{padding:10px;font-size:12px;color:var(--color-text-muted);text-align:center;background:var(--color-bg-panel, #f5f7f9);border:1px dashed var(--color-border);border-radius:4px}.gf-node-table{width:100%;border-collapse:collapse;font-size:11px}.gf-node-table th,.gf-node-table td{padding:4px 6px;text-align:left;border-bottom:1px solid var(--color-border)}.gf-node-table th{color:var(--color-text-muted);font-weight:600}.gf-node-remove{width:18px;height:18px;padding:0;border:none;border-radius:3px;background:transparent;color:var(--color-text-muted);cursor:pointer;font-size:13px;line-height:1}.gf-node-remove:hover{background:#00000014;color:var(--color-danger, #c62828)}.gf-actions{display:flex;justify-content:flex-end;margin-top:6px}.gf-reset-btn{padding:0 14px;height:26px;background-color:var(--color-warning, #c49a00);border:none;border-radius:4px;color:#fff;font-family:var(--font-family);font-size:12px;cursor:pointer}.gf-reset-btn:hover{background-color:#a98200}.gf-reset-btn:active{background-color:#8f6d00}.gf-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}.gf-input{height:26px;padding:0 8px;background-color:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text);font-family:var(--font-family);font-size:12px}.gf-input:focus{border-color:var(--color-primary)}.gf-input--date,.gf-hour-select{flex:1;min-width:0}.gf-range-sep{width:10px;font-size:12px;color:var(--color-text-muted);text-align:center;flex-shrink:0}.gf-weekday-row{display:flex;gap:4px;margin-bottom:8px}.gf-weekday-btn{flex:1;height:24px;padding:0;background:var(--color-bg);border:1px solid var(--color-border);border-radius:4px;color:var(--color-text-muted);font-family:var(--font-family);font-size:11px;cursor:pointer}.gf-weekday-btn.active{background:var(--color-primary);border-color:var(--color-primary);color:#fff;font-weight:600}.gf-analyze-btn{width:100%;padding:7px 0;font-size:12px;font-weight:600;color:#fff;background:var(--color-primary);border:none;border-radius:4px;cursor:pointer}.gf-analyze-btn:disabled{background:var(--color-neutral);cursor:not-allowed}#layout-map.gf-selection-mode .ol-viewport{cursor:grab}#layout-map.gf-selection-mode .ol-viewport:active{cursor:grabbing}#realtimeinfo-map-overlay{position:absolute;z-index:500;display:flex;flex-direction:column;gap:6px;overflow:visible;font-family:var(--font-family);font-size:12px}#realtimeinfo-layer-overlay{position:absolute;z-index:500;width:248px;border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 6px #00000038;overflow:visible;font-family:var(--font-family);font-size:12px}#realtimeinfo-layer-overlay.collapsed{width:auto;border:none;box-shadow:none}.realtimeinfo-overlay-custom-select{position:relative;display:inline-flex;align-items:center;gap:4px;padding:2px 6px 2px 5px;border:1px solid var(--color-border);border-radius:4px;background:#fff;cursor:pointer;font-size:12px;font-family:var(--font-family);color:var(--color-text);-webkit-user-select:none;user-select:none;min-width:72px}.realtimeinfo-overlay-custom-chevron{font-size:9px;margin-left:auto;transition:transform .12s ease;display:inline-block}.realtimeinfo-overlay-custom-select.open .realtimeinfo-overlay-custom-chevron{transform:rotate(180deg)}.realtimeinfo-overlay-custom-dropdown{display:none;position:absolute;top:calc(100% + 1px);left:-1px;right:-1px;background:#fff;border:1px solid var(--color-border);border-radius:0 0 4px 4px;z-index:600;box-shadow:0 2px 6px #0000002e}.realtimeinfo-overlay-custom-select.open .realtimeinfo-overlay-custom-dropdown{display:block}.realtimeinfo-overlay-custom-option{padding:4px 6px;cursor:pointer;font-size:12px}.realtimeinfo-overlay-custom-option:hover{background:var(--color-surface-variant, #f0f0f0)}.realtimeinfo-overlay-custom-option.active{color:var(--color-primary);font-weight:600}.realtimeinfo-event-view-btn{font-size:11px;font-family:var(--font-family);padding:3px 8px;border:1px solid var(--color-primary);border-radius:4px;background:transparent;color:var(--color-primary);cursor:pointer;white-space:nowrap}.realtimeinfo-event-view-btn:hover{background:var(--color-primary);color:#fff}#layout-map.rti-selection-mode .ol-viewport{cursor:grab}#layout-map.rti-selection-mode .ol-viewport:active{cursor:grabbing}#realtimeinfo-selection-control{position:absolute;z-index:600;pointer-events:auto;display:flex;align-items:center;gap:4px;padding:5px 6px;background:#fffffff7;border:1px solid var(--color-border);border-radius:4px;box-shadow:0 2px 8px #00000038;font-family:var(--font-family)}.realtimeinfo-sc-btn{padding:4px 10px;border:1px solid var(--color-border);border-radius:4px;background:transparent;color:var(--color-text);font-size:12px;font-family:var(--font-family);cursor:pointer;white-space:nowrap;line-height:1.4}.realtimeinfo-sc-btn:hover{background:#0000000d}.realtimeinfo-sc-btn-primary{background:var(--color-primary);border-color:var(--color-primary);color:#fff}.realtimeinfo-sc-btn-primary:hover{background:var(--color-primary-dark);border-color:var(--color-primary-dark)}.realtimeinfo-sc-btn-muted{color:var(--color-text-muted)}.rti-top{display:flex;align-items:center;gap:12px;height:100%;padding:0 16px;background-color:#182530;border-top:2px solid rgba(255,255,255,.3)}.rti-top-title{font-size:13px;font-weight:600;color:#ffffffe6;white-space:nowrap;flex-shrink:0}.rti-top-divider{width:1px;height:24px;background-color:#fff3;flex-shrink:0}.rti-top-frame-area{display:flex;align-items:center;gap:8px;flex:1}.rti-frame-btn{height:24px;min-width:30px;padding:0 6px;background-color:#ffffff14;border:1px solid rgba(255,255,255,.2);border-radius:4px;color:#ffffffbf;font-size:11px;font-family:var(--font-family);cursor:pointer;flex-shrink:0;transition:background-color .12s}.rti-frame-btn:hover{background-color:#ffffff29}.rti-play-btn.playing{background-color:#49719359;border-color:#497193b3;color:#a8c7e0}.rti-frame-label{min-width:165px;text-align:center;font-size:12px;font-weight:600;color:#cdd6e3;flex-shrink:0}.rti-frame-slider{flex:1;min-width:200px;max-width:800px;accent-color:var(--color-primary, #497193);cursor:pointer}.rti-frame-count{font-size:11px;color:#ffffffe6;flex-shrink:0;min-width:52px;text-align:right;margin-right:8px}.gisedit-toolbar-container{position:absolute;top:12px;left:12px;z-index:500;display:flex;flex-direction:column;gap:6px}.gisedit-toolbar{display:flex;align-items:center;gap:4px;background:#121212e6;padding:6px 8px;border-radius:6px;box-shadow:0 2px 10px #00000080;-webkit-user-select:none;user-select:none}.gisedit-btn{padding:5px 12px;border:1px solid #444;border-radius:4px;background:#2c2c2c;color:#d0d0d0;cursor:pointer;font-size:12px;white-space:nowrap;transition:background .12s,border-color .12s}.gisedit-btn:hover:not(.active):not(.active-hole):not(.active-delete):not(.active-delete-hole):not(.active-cctv):not(.active-station):not(:disabled){background:#3a3a3a;border-color:#666}.gisedit-btn.active{background:#1971c2;border-color:#1971c2;color:#fff}.gisedit-btn.active-hole{background:#e67700;border-color:#e67700;color:#fff}.gisedit-btn.active-delete{background:#c92a2a;border-color:#c92a2a;color:#fff}.gisedit-btn.active-delete-hole{background:#862e9c;border-color:#862e9c;color:#fff}.gisedit-btn.active-cctv{background:#e03131;border-color:#e03131;color:#fff}.gisedit-btn.active-station{background:#1971c2;border-color:#1971c2;color:#fff}.gisedit-btn:disabled{opacity:.38;cursor:not-allowed}.gisedit-sep{width:1px;height:20px;background:#444;margin:0 2px;flex-shrink:0}.gisedit-hint{font-size:11px;color:#888;padding-left:4px;white-space:nowrap}.gisedit-layer-toggle{display:flex;align-items:center;gap:5px;color:#d0d0d0;font-size:12px;cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none}.gisedit-layer-toggle input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:#1971c2}#layout-map.gisedit-draw .ol-viewport,#layout-map.gisedit-hole .ol-viewport,#layout-map.gisedit-cctv-add .ol-viewport,#layout-map.gisedit-station-add .ol-viewport{cursor:crosshair!important}#layout-map.gisedit-delete .ol-viewport,#layout-map.gisedit-delete-hole .ol-viewport,#layout-map.gisedit-cctv-delete .ol-viewport,#layout-map.gisedit-station-delete .ol-viewport{cursor:pointer!important}#layout-map.gisedit-cctv-modify .ol-viewport,#layout-map.gisedit-station-modify .ol-viewport{cursor:move!important}.layout-main.wallmap-control-active>.layout-right{background-color:#101c2af7;border-left-color:#ffffff14}.layout-main.wallmap-control-active>#layout-body{right:calc(var(--right-width) - 1px);transition:right .25s ease}.layout-main.wallmap-control-active>.toggle-right{display:none!important}.layout-main.wallmap-control-active .wm-cctv-grid-item{cursor:pointer;border-radius:4px;transition:background-color .12s}.layout-main.wallmap-control-active .wm-cctv-grid-item:hover{background-color:#ffffff0f}#wallmap-control-panel{position:absolute;left:12px;top:12px;z-index:500;display:flex;flex-direction:column;gap:8px}.wmc-status-bar{display:flex;align-items:center;gap:8px;padding:8px 12px;background-color:var(--color-bg-panel, #f5f7f9);border:1px solid var(--color-border);border-radius:4px;font-size:12.5px;color:var(--color-text-muted)}.wmc-conn-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.wmc-conn-dot--waiting{background-color:var(--color-neutral)}.wmc-conn-dot--connected{background-color:var(--color-success)}.wmc-conn-dot--disconnected{background-color:var(--color-danger)}.wmc-top-bar{position:absolute;top:12px;left:50%;transform:translate(-50%);z-index:500;display:flex;align-items:center;gap:10px}.wmc-top-bar .wmc-send-btn{padding:8px 22px;border:none;border-radius:4px;background-color:var(--color-warning);color:#fff;font-size:13px;font-weight:700;font-family:var(--font-family);letter-spacing:.02em;cursor:pointer;box-shadow:0 2px 8px #00000059;transition:background-color .15s,filter .15s}.wmc-top-bar .wmc-send-btn:hover{filter:brightness(1.1)}.wmc-top-bar .wmc-send-btn:active{filter:brightness(.92)}.wmc-top-bar .wmc-status-bar{border-width:1px;border-style:solid;box-shadow:0 2px 8px #00000059;font-weight:600;transition:background-color .15s,border-color .15s,color .15s}.wmc-top-bar .wmc-status-bar--waiting{background-color:var(--color-neutral);border-color:var(--color-neutral);color:#fff}.wmc-top-bar .wmc-status-bar--connected{background-color:var(--color-success);border-color:var(--color-success);color:#fff}.wmc-top-bar .wmc-status-bar--disconnected{background-color:var(--color-danger);border-color:var(--color-danger);color:#fff}#layout-map.wmc-cctv-expanded>#wallmap-control-panel{display:none}.wm-cctv-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;height:100%;padding:12px;overflow-y:auto;align-content:start}.wm-cctv-item{display:flex;flex-direction:column;gap:8px}.wm-cctv-grid-item .wm-cctv-item-label{font-size:11px}.wm-cctv-item-label{font-size:12px;font-weight:600;color:#fffc;font-family:var(--font-family)}.wm-cctv-video{display:block;width:100%;aspect-ratio:16 / 9;background:#000;object-fit:contain;border-radius:4px}.wm-cctv-nodata{display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:16 / 9;background:#0000004d;border-radius:4px;font-size:12px;color:#ffffff59;font-family:var(--font-family)}.wmc-cctv-expand{position:absolute;top:0;right:0;bottom:0;left:0;z-index:400;background-color:#000}.wmc-cctv-expand-body{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.wmc-cctv-expand-video{width:100%;height:100%;object-fit:contain}.wmc-cctv-expand-label{position:absolute;top:12px;left:12px;padding:6px 12px;border-radius:4px;background-color:#0000008c;color:#ffffffeb;font-size:13px;font-weight:600;font-family:var(--font-family)}.wmc-cctv-expand-close{position:absolute;top:12px;right:12px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.25);border-radius:4px;background-color:#0000008c;color:#ffffffe6;font-size:14px;cursor:pointer;transition:background-color .12s}.wmc-cctv-expand-close:hover{background-color:#fff3}.login-page{display:flex;flex-direction:column;background-color:var(--color-bg)}.login-hero{min-height:100vh;position:relative;display:flex;align-items:center;justify-content:center;padding:40px 16px;background:linear-gradient(135deg,var(--color-primary-light) 0%,var(--color-bg) 60%)}.scroll-hint{position:absolute;bottom:32px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;gap:8px}.scroll-mouse{width:24px;height:38px;border:2px solid var(--color-primary);border-radius:12px;display:flex;justify-content:center;padding-top:6px}.scroll-wheel{width:4px;height:8px;background-color:var(--color-primary);border-radius:2px;animation:scroll-bounce 1.4s ease-in-out infinite}@keyframes scroll-bounce{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(10px)}}.scroll-hint-text{font-size:11px;font-weight:500;color:var(--color-primary);letter-spacing:.1em}.login-section{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 40px;border-top:1px solid var(--color-border)}.login-section-title{font-size:20px;font-weight:600;color:var(--color-text);margin-bottom:16px;letter-spacing:.05em}.login-section-desc{font-size:14px;color:var(--color-text-muted)}.login-nav{position:absolute;top:20px;left:24px;display:flex;gap:24px;z-index:10}.login-nav-item{font-size:15px;font-weight:500;color:var(--color-text-muted);text-decoration:none;letter-spacing:.04em;cursor:pointer;transition:color .2s}.login-nav-item:hover{color:var(--color-primary)}.login-card{width:100%;max-width:400px;background-color:var(--color-bg-panel);border:1px solid var(--color-border);border-radius:4px;padding:48px 40px}.login-header{text-align:center;margin-bottom:32px}.login-title{font-size:22px;font-weight:600;color:var(--color-primary-dark);margin-bottom:6px}.login-subtitle{font-size:13px;color:var(--color-text-muted)}.login-form{display:flex;flex-direction:column;gap:12px}.login-field{position:relative;display:flex;align-items:center}.login-field-icon{position:absolute;left:10px;display:flex;align-items:center;color:var(--color-text-muted);pointer-events:none}.login-input{width:100%;height:42px;padding:0 12px 0 36px;border:1px solid var(--color-border);border-radius:4px;background-color:var(--color-bg);font-family:var(--font-family);font-size:14px;color:var(--color-text);outline:none;transition:border-color .2s}.login-input:focus{border-color:var(--color-primary)}.login-input::placeholder{color:var(--color-text-muted)}.login-error{min-height:18px;font-size:13px;color:var(--color-danger)}.btn-login{height:42px;background-color:var(--color-primary);color:#fff;border:none;border-radius:4px;font-family:var(--font-family);font-size:15px;font-weight:500;cursor:pointer;transition:background-color .2s;margin-top:4px}.btn-login:hover{background-color:var(--color-primary-dark)}.btn-login:disabled{background-color:var(--color-neutral);cursor:not-allowed}.login-find-links{margin-top:12px;text-align:center;font-size:14px;color:var(--color-primary-dark);display:flex;align-items:center;justify-content:center;gap:8px}.login-find-links span{cursor:pointer;color:var(--color-primary-dark);font-weight:500;transition:color .2s}.login-find-links span:hover{color:var(--color-primary)}.login-find-divider{cursor:default!important;font-weight:400}.login-find-divider:hover{color:var(--color-primary-dark)!important}.find-result{padding:10px 12px;background-color:var(--color-primary-light);border-radius:4px;font-size:15px;font-weight:600;color:var(--color-primary-dark);text-align:center;word-break:keep-all;line-height:1.6}.login-signup-link{margin-top:16px;text-align:center;font-size:14px;color:var(--color-primary-dark);font-weight:500}.login-signup-link span{color:var(--color-primary-dark);font-weight:600;cursor:pointer;margin-left:8px}.login-signup-link span:hover{text-decoration:underline}.signup-form{display:flex;flex-direction:column;gap:16px}.field-check-row{display:flex;gap:8px}.field-check-row .field-input{flex:1}.check-result{font-size:12px;margin-top:2px}.check-ok{color:var(--color-success)}.check-ng{color:var(--color-danger)}.signup-form .field-required{color:var(--color-danger);font-weight:600}.signup-error{min-height:18px;font-size:13px;color:var(--color-danger);margin:0}.rt-spot-time-axis{flex:1;display:flex;justify-content:space-between;font-size:12px;color:#90a4ae}.rt-vol-type-select{font-size:12.5px;border:1px solid #e0e0e0;border-radius:3px;padding:5px 10px;color:#546e7a;background:#fff;cursor:pointer;font-family:inherit;outline:none}.rt-vol-type-select:focus{border-color:#1a237e}#cctv-root{display:flex;flex-direction:column;height:100vh;background:#000}.cctv-toolbar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;background:var(--color-bg);border-bottom:1px solid var(--color-border);flex-shrink:0}.cctv-toolbar-title{font-size:14px;font-weight:600;color:var(--color-text)}.cctv-toolbar-close{background:transparent;border:none;color:var(--color-neutral);font-size:14px;cursor:pointer;padding:2px 6px;border-radius:4px;font-family:var(--font-family);transition:background-color .15s}.cctv-toolbar-close:hover{background-color:var(--color-primary-light);color:var(--color-primary-dark)}.cctv-grid{flex:1;display:grid;gap:2px;background:#111;overflow:hidden}.cctv-grid-1{grid-template-columns:1fr}.cctv-grid-2,.cctv-grid-4{grid-template-columns:1fr 1fr}.cctv-grid--max{grid-template-rows:1fr}.cctv-grid--max .cctv-cell{aspect-ratio:unset}.cctv-cell{position:relative;background:#000;overflow:hidden;aspect-ratio:16 / 9;cursor:pointer}.cctv-video{width:100%;height:100%;object-fit:cover;display:block}.cctv-number{position:absolute;top:6px;left:6px;font-size:11px;font-weight:600;color:#fff;background:#0000008c;padding:2px 7px;border-radius:4px;font-family:var(--font-family)}.cctv-label{position:absolute;bottom:6px;left:6px;font-size:11px;font-weight:500;color:#fff;background:#0000008c;padding:2px 7px;border-radius:4px;font-family:var(--font-family)}.cctv-cell--selected{outline:3px solid #f44336;outline-offset:-3px}.cctv-empty{grid-column:1 / -1;display:flex;align-items:center;justify-content:center;height:100%;font-size:13px;color:var(--color-neutral);background:var(--color-bg)}#g-header{position:relative;background:#1a237e;padding:0 16px;height:52px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.gh-left{display:flex;align-items:center;gap:12px}.gh-right{display:flex;align-items:center;gap:36px}.gh-title{font-size:14px;font-weight:700;color:#fff}.gh-center{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:15px;font-weight:700;color:#fff;white-space:nowrap;pointer-events:none}.gh-close{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background:#e53935cc;border:none;border-radius:4px;color:#fff;cursor:pointer;transition:background-color .2s}.gh-close svg{width:22px;height:22px}.gh-close:hover{background-color:#c62828e6}.gh-download-btn{background:#00838f;border:none;border-radius:4px;color:#fff;font-size:12px;font-weight:700;padding:7px 17px;cursor:pointer;font-family:inherit}.gh-download-btn:hover{background:#1a237e}.gh-download-btn:disabled{background:#78909c;cursor:default}.gh-node-id{font-size:14px;font-weight:700;color:#90caf9}#ctrl-bar{position:relative;background:#fff;border-bottom:1px solid #e0e0e0;padding:0 16px;height:53px;display:flex;align-items:center;gap:16px;flex-shrink:0}.cb-label{font-size:12px;font-weight:600;color:#78909c}.cb-label--past{color:#283593}.cb-label--future{color:#607d8b}.cb-sep{width:1px;height:22px;background:#cfd8dc}.time-range{display:flex;gap:4px;background:#f5f7f9;border-radius:6px;padding:3px}.tr-btn{padding:5px 12px;border:1px solid transparent;border-radius:3px;font-size:11px;color:#546e7a;background:transparent;cursor:pointer;font-family:inherit}.tr-btn:not(.active):hover{border-color:#283593;color:#283593}.tr-btn.active{background:#283593;border-color:#283593;color:#fff}.time-range[data-range=future] .tr-btn.active{background:#607d8b;border-color:#607d8b}.time-range[data-range=future] .tr-btn:not(.active):hover{border-color:#607d8b;color:#607d8b}.cb-now-time{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);font-size:22px;font-weight:700;color:#1565c0}#view-switch{display:flex;gap:6px}.fill-toggle{display:flex;gap:2px;flex-shrink:0;margin-left:6px}.ft-btn{padding:4px 10px;border:1px solid #e0e0e0;border-radius:3px;font-size:12px;color:#546e7a;background:transparent;cursor:pointer;font-family:inherit}.ft-btn:not(.active):hover{border-color:#283593;color:#283593}.ft-btn.active{background:#283593;border-color:#283593;color:#fff}.vs-btn{padding:5px 12px;border:1px solid #e0e0e0;border-radius:3px;font-size:11px;color:#546e7a;background:transparent;cursor:pointer;font-family:inherit}.vs-btn:not(.active):hover{border-color:#37474f;color:#37474f}.vs-btn.active{background:#37474f;border-color:#37474f;color:#fff}#chart-scroll{flex:1;min-height:0;overflow-y:auto;padding:10px}#chart-scroll>*+*{margin-top:10px}#chart-grid{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:calc((100vh - 515px)/2);gap:10px}#chart-grid.node-grid{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;grid-auto-rows:unset;height:calc(100vh - 125px)}#chart-grid.vol-only-grid{grid-template-columns:1fr 1fr;grid-auto-rows:calc((100vh - 125px)/2)}#chart-grid.link-grid{grid-template-columns:repeat(6,1fr);grid-template-rows:40fr 48fr;grid-auto-rows:unset;height:calc(100vh - 135px)}#chart-grid.link-grid>.chart-card:nth-child(-n+3){grid-column:span 2}#chart-grid.link-grid>.chart-card:nth-child(n+4){grid-column:span 3}.chart-card{background:#fff;border-radius:8px;box-shadow:0 1px 4px #00000017;padding:10px 12px;display:flex;flex-direction:column;overflow:hidden}.cc-header{display:flex;align-items:center;margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid #eceff1;flex-shrink:0;gap:6px}.cc-title{font-size:13px;font-weight:700;color:#37474f;flex-shrink:0}.cc-val{font-size:15px;font-weight:700;color:#1a237e;margin-left:auto;flex-shrink:0}.chart-legend{flex:1;display:flex;flex-wrap:wrap;gap:3px 10px;align-items:center;justify-content:center}.cl-item{display:flex;align-items:center;gap:5px;font-size:14px;color:#546e7a;white-space:nowrap}.cl-check{width:14px;height:14px;margin:0;cursor:pointer;accent-color:#37474f;flex-shrink:0}.cl-line{display:inline-block;width:14px;height:14px;border-radius:2px;flex-shrink:0}.chart-wrap{flex:1;position:relative;min-height:0}#spot-card{flex-shrink:0}#queue-heatmap-wrap{display:none;flex:1;flex-direction:column;min-height:0}#queue-heatmap-wrap.visible{display:flex}.chart-card:has(#queue-heatmap-wrap.visible) .chart-legend{display:none}.spot-body{flex:1;display:flex;gap:6px;min-height:0}.spot-y-axis{flex-shrink:0;width:56px;position:relative;font-size:12px;color:#78909c;text-align:right}.spot-canvas-col{flex:1;display:flex;min-width:0;min-height:0}.spot-wrap{flex:1;min-height:0}.spot-time-row{display:flex;gap:6px;flex-shrink:0;padding-top:3px}.spot-time-spacer{width:56px;flex-shrink:0}.spot-time-end-spacer{width:48px;flex-shrink:0}.spot-time-axis{flex:1;display:flex;justify-content:space-between;font-size:12px;color:#90a4ae}.spot-sl-axis{flex-shrink:0;width:48px;position:relative;font-size:12px;color:#1565c0;font-weight:700}.spot-legend{display:flex;gap:10px}.sl-item{display:flex;align-items:center;gap:5px;font-size:13px;color:#78909c}.sl-dot{width:12px;height:12px;border-radius:50%;display:inline-block}#turn-detail-area{grid-template-columns:1fr 1fr;grid-auto-rows:calc((100vh - 125px)/2);gap:10px;flex-shrink:0}#turn-chart-area{display:none;grid-template-columns:1fr 1fr;grid-auto-rows:336px;gap:10px;flex-shrink:0}#turn-chart-area.visible{display:grid}#turn-controls{display:none;background:#fafafa;border-bottom:1px solid #e0e0e0;padding:0 16px;height:48px;align-items:center;gap:10px;flex-shrink:0}#turn-controls.visible{display:flex}.tc-label{font-size:11px;color:#78909c}.tc-select{font-size:11px;border:1px solid #e0e0e0;border-radius:3px;padding:4px 8px;color:#546e7a;background:#fff;cursor:pointer;font-family:inherit;outline:none}.tc-select:focus{border-color:#1a237e}.vol-type-select{font-size:12.5px;border:1px solid #e0e0e0;border-radius:3px;padding:5px 10px;color:#546e7a;background:#fff;cursor:pointer;font-family:inherit;outline:none}.vol-type-select:focus{border-color:#1a237e}.tc-add-btn{padding:5px 14px;border:none;border-radius:3px;font-size:11px;color:#fff;background:#1a237e;cursor:pointer;font-family:inherit}.tc-add-btn:hover{background:#283593}#tc-tags{display:flex;flex-wrap:wrap;gap:6px;align-items:center}.tc-tag{display:flex;align-items:center;gap:5px;background:#e3f2fd;border:1px solid #90caf9;border-radius:4px;padding:2px 10px;font-size:11px;color:#1565c0;white-space:nowrap}.tc-tag-close{cursor:pointer;font-size:10px;font-weight:700;line-height:1;color:#fff;width:15px;height:15px;border-radius:50%;background:#1565c0;border:1.5px solid #1565c0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.tc-tag-close:hover{background:#e53935;border-color:#e53935}.detail-btn{padding:4px 10px;border:1px solid #1a237e;border-radius:3px;font-size:12px;color:#1a237e;background:transparent;cursor:pointer;font-family:inherit;flex-shrink:0}.detail-btn:hover{background:#1a237e;color:#fff}.detail-btn.download-btn{background:#00838f;border-color:#00838f;color:#fff}.detail-btn.download-btn:hover{background:#1a237e;border-color:#1a237e}.ts-page{display:flex;flex-direction:column;height:100vh;overflow:hidden;font-family:var(--font-family, "Noto Sans KR", sans-serif)}.ts-header{display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 16px;background:#1a237e;flex-shrink:0}.ts-title{font-size:17px;font-weight:700;color:#fff}.ts-header-right{display:flex;align-items:center;gap:16px;white-space:nowrap}.ts-direction-bar{display:flex;justify-content:center;padding:14px 16px 10px;flex-shrink:0}.ts-direction-bar .ts-view-switch-label{color:#607d8b;font-size:15px}.ts-direction-bar .ts-view-switch-label--active{color:#1a237e}.ts-signal-legend{display:flex;align-items:center;gap:8px}.ts-signal-swatch{display:inline-block;width:34px;height:16px;border-radius:4px}.ts-signal-swatch--green{background:#43a047;border:1px solid #43a047}.ts-signal-swatch--red{background:red;border:1px solid #ff0000}.ts-signal-label{font-size:14px;color:#cfd8dc}.ts-anim-toggle-btn{background:#90a4ae;border:none;border-radius:4px;color:#fff;font-size:13px;font-weight:600;padding:7px 18px;cursor:pointer;font-family:inherit;white-space:nowrap}.ts-anim-toggle-btn:hover{background:#a7bcc7}.ts-anim-toggle-btn--active{background:#ffc107;color:#1a237e}.ts-anim-toggle-btn--active:hover{background:#ffca28}.ts-view-switch-group{display:flex;align-items:center;gap:10px}.ts-view-switch-label{font-size:13px;color:#90a4ae;cursor:default;white-space:nowrap;transition:color .15s ease}.ts-view-switch-label--active{color:#fff;font-weight:600}.ts-view-switch{position:relative;display:inline-block;width:42px;height:24px;flex-shrink:0}.ts-view-switch input{position:absolute;width:100%;height:100%;margin:0;opacity:0;cursor:pointer;z-index:1}.ts-view-switch-track{position:absolute;top:0;right:0;bottom:0;left:0;background:#37474f;border-radius:12px;transition:background .15s ease}.ts-view-switch-track:before{content:"";position:absolute;top:3px;left:3px;width:18px;height:18px;border-radius:50%;background:#fff;transition:transform .15s ease}.ts-view-switch input:checked+.ts-view-switch-track{background:#607d8b}.ts-view-switch input:checked+.ts-view-switch-track:before{transform:translate(18px)}.ts-close-btn{background:#37474f;border:none;border-radius:4px;color:#cfd8dc;font-size:13px;padding:7px 18px;cursor:pointer;font-family:inherit}.ts-close-btn:hover{background:#546e7a}.ts-body{flex:1;min-height:0;padding:16px;overflow:hidden;display:flex;gap:8px}.ts-anim-container{width:84px;flex-shrink:0;background:#fff;border:1px solid #e0e0e0;border-radius:4px;box-sizing:border-box;position:relative;overflow:hidden}.ts-anim-container canvas{display:block}.ts-chart-container{flex:1;min-width:0;height:100%;background:#fff;border:1px solid #e0e0e0;border-radius:4px;box-sizing:border-box}.ts-chart-container canvas{width:100%!important;height:100%!important}.ts-status{display:flex;align-items:center;justify-content:center;height:100%;font-size:13px;color:#56626e}.ts-status--error{color:#c62828}body{background:#f0f2f5;height:100vh;overflow:hidden}#app{height:100vh;display:flex;flex-direction:column;overflow:hidden}.gfr-page{display:flex;flex-direction:column;height:100vh;overflow:hidden;font-family:var(--font-family, "Noto Sans KR", sans-serif)}.gfr-header{display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 16px;background:#1a237e;flex-shrink:0}.gfr-title{font-size:17px;font-weight:700;color:#fff}.gfr-close-btn{width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:#fff;font-size:14px;cursor:pointer}.gfr-close-btn:hover{background:#ffffff26}.gfr-body{flex:1;display:flex;flex-direction:column;overflow:auto;padding:20px}.gfr-period{display:flex;gap:18px;font-size:13px;color:var(--color-text);margin-bottom:16px}.gfr-corridor-wrap{flex:1;min-height:0;display:flex;align-items:stretch;justify-content:center;gap:24px;margin-bottom:16px}.gfr-corridor{box-sizing:border-box;display:flex;flex-direction:column;align-items:center;max-width:620px}.gfr-node-row{position:relative;display:flex;align-items:center;justify-content:center;gap:14px;width:100%}.gfr-side-table{flex-shrink:0;width:140px;background:#fff;border:1px solid var(--color-border);border-radius:4px;padding:6px 8px;font-size:11px}.gfr-side-row{display:flex;justify-content:space-between;padding:2px 0;color:var(--color-text)}.gfr-side-row--total{font-weight:700;border-top:1px solid var(--color-border);margin-top:2px;padding-top:4px}.gfr-side-road{margin-top:4px;padding-top:4px;border-top:1px dashed var(--color-border);font-size:10px;color:var(--color-text-muted);white-space:nowrap}.gfr-node-box{flex-shrink:0;width:130px;display:flex;flex-direction:column;align-items:center;gap:6px}.gfr-node-road{width:18px;height:18px;background:#4b5563;border-radius:50%}.gfr-node-name{font-size:12px;font-weight:700;color:var(--color-text);white-space:nowrap}.gfr-node-id{font-size:11px;color:var(--color-text-muted)}.gfr-connector{position:relative;width:100%;flex-shrink:0;min-height:20px;margin:2px 0}.gfr-connector-line{position:absolute;left:50%;top:0;bottom:0;width:2px;transform:translate(-50%);background:var(--color-border)}.gfr-connector-dist{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:#f0f2f5;padding:0 6px;font-size:11px;color:var(--color-text-muted);white-space:nowrap}.gfr-ruler-overlay{position:relative;flex-shrink:0;width:60px}.gfr-ruler-dot{position:absolute;left:7px;width:14px;height:1px;background:#000;transform:translateY(-50%)}.gfr-ruler-dist{position:absolute;left:25px;transform:translateY(-50%);font-size:11px;color:var(--color-text);white-space:nowrap}.gfr-ruler-seg{position:absolute;left:6.5px;width:1px;background:#000}.gfr-ruler-overlay--left .gfr-ruler-dot{left:auto;right:7px}.gfr-ruler-overlay--left .gfr-ruler-seg{left:auto;right:6.5px}.gfr-ruler-overlay--left .gfr-ruler-dist{left:auto;right:25px;text-align:right}.gfr-side-chart-wrap{flex-shrink:0;width:255px;display:flex;flex-direction:column;gap:6px}.gfr-side-chart-title{font-size:14px;font-weight:600;line-height:1.3;text-align:center}.gfr-side-chart-wrap--out .gfr-side-chart-title,.gfr-side-chart-wrap--in .gfr-side-chart-title{color:#1565c0}.gfr-side-chart-canvas-wrap{flex:1;min-height:0;position:relative;background:#fff;border:1px solid var(--color-border);border-radius:4px}.gfr-side-chart-canvas-wrap canvas{position:absolute;top:0;right:0;bottom:0;left:0}.gfr-status{display:flex;align-items:center;justify-content:center;height:120px;font-size:13px;color:var(--color-text-muted);background:#fff;border:1px dashed var(--color-border);border-radius:6px}.gfr-status--error{color:var(--color-danger, #c62828)}.profile-page{max-width:1000px;margin:40px auto;padding:0 24px;display:flex;flex-direction:row;align-items:stretch;gap:24px}.profile-card{flex:1;background-color:var(--color-bg);border:1px solid var(--color-primary-dark);border-radius:4px;display:flex;flex-direction:column;box-shadow:0 2px 8px #00000014;overflow:hidden}.profile-card-title{font-size:15px;font-weight:600;color:var(--color-primary-dark);background-color:var(--color-primary-light);border-bottom:1px solid var(--color-border);padding:14px 24px;letter-spacing:.02em}.profile-form{display:flex;flex-direction:column;justify-content:space-between;gap:16px;flex:1;padding:24px}.profile-field{display:flex;flex-direction:column;gap:6px}.profile-label{font-size:13px;font-weight:500;color:var(--color-text)}.profile-input{width:100%;height:38px;padding:0 12px;border:1px solid var(--color-border);border-radius:4px;background-color:var(--color-bg);font-family:var(--font-family);font-size:14px;color:var(--color-text);outline:none;transition:border-color .2s}.profile-input:focus{border-color:var(--color-primary)}.profile-input::placeholder{color:var(--color-neutral-light)}.profile-field-row{display:flex;gap:12px}.profile-field-row .profile-field{flex:1;min-width:0}.profile-check-row{display:flex;gap:8px;align-items:center}.profile-check-row .profile-input{flex:1}.profile-check-row .btn{height:38px;white-space:nowrap}.profile-actions{display:flex;align-items:center;justify-content:space-between;gap:12px}.profile-actions .btn{height:40px}.profile-message{font-size:13px;min-height:18px;flex:1}.profile-message.is-success{color:var(--color-success)}.profile-message.is-error{color:var(--color-danger)}.profile-nav{display:flex;justify-content:center;margin-top:16px}.profile-status-msg{font-size:14px;color:var(--color-text-muted)}.profile-status-error{color:var(--color-danger)}.layout-main.wallmap-active>.layout-top{background-color:transparent;border-bottom-color:#ffffff1f}.layout-main.wallmap-active>.layout-bottom{background-color:transparent;border-top-color:#ffffff1f}.layout-main.wallmap-active>#layout-body{right:calc(var(--right-width) - 1px);transition:right .25s ease}.wallmap-header{--wm-bg: rgba(20, 34, 48, .95);--wm-border: rgba(255, 255, 255, .12);--wm-text: rgba(255, 255, 255, .92);--wm-text-dim: rgba(255, 255, 255, .55);--wm-hover: rgba(255, 255, 255, .1);height:100%;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background-color:var(--wm-bg);gap:16px}.wallmap-header-mode{display:flex;align-items:center;gap:8px;flex-shrink:0;min-width:140px}.wallmap-mode-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.wallmap-mode-dot--live{background-color:var(--color-success)}.wallmap-mode-label{font-size:13px;color:var(--wm-text-dim);white-space:nowrap}.wallmap-header-title{flex:1;text-align:center;font-size:16px;font-weight:600;color:var(--wm-text);letter-spacing:.04em;white-space:nowrap;font-family:var(--font-family)}.wallmap-header-clock{display:flex;flex-direction:column;align-items:flex-end}#wallmap-time{font-size:18px;font-weight:600;color:var(--wm-text);font-family:var(--font-family);letter-spacing:.06em;line-height:1.2}#wallmap-date{font-size:11px;color:var(--wm-text-dim);letter-spacing:.03em}.wallmap-status-bar{--wm-bg: rgba(20, 34, 48, .95);--wm-text-dim: rgba(255, 255, 255, .55);--wm-border: rgba(255, 255, 255, .12);height:100%;display:flex;align-items:center;padding:0 16px;gap:12px;background-color:var(--wm-bg)}.wallmap-status-item{font-size:12px;color:var(--wm-text-dim);font-family:var(--font-family)}.wallmap-status-conn--waiting{color:var(--wm-text-dim)}.wallmap-status-conn--connected{color:var(--color-success)}.wallmap-status-conn--disconnected{color:var(--color-danger)}.wallmap-status-sep{font-size:12px;color:var(--wm-border)}.wm-active-panel{border-bottom:1px solid rgba(255,255,255,.1);background:#0a1420fa}.wm-active-header{display:flex;align-items:center;gap:6px;padding:8px 12px 6px}.wm-active-title{font-size:11px;font-weight:600;letter-spacing:.06em;color:#ffffff73;font-family:var(--font-family)}.wm-active-count{background:var(--color-primary);color:#fff;font-size:10px;font-weight:600;padding:1px 5px;border-radius:3px;line-height:1.4}.wm-active-list{display:flex;flex-direction:column}.wm-active-row{display:flex;align-items:center;gap:6px;padding:5px 10px 5px 12px;border-bottom:1px solid rgba(255,255,255,.04)}.wm-active-row:hover{background:#ffffff0a}.wm-active-row.legend-active{background:rgba(var(--color-primary-rgb, 59, 130, 246),.08)}.wm-active-name{flex:1;font-size:12px;color:#fffc;font-family:var(--font-family);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.wm-active-move-btn{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.18);border-radius:3px;background:none;color:#ffffff80;font-size:9px;cursor:pointer;transition:background .15s,color .15s}.wm-active-move-btn:hover:not(:disabled){background:#ffffff1a;color:#ffffffe0}.wm-active-move-btn.disabled,.wm-active-move-btn:disabled{border-color:#ffffff14;color:#ffffff2e;cursor:default}.wm-active-legend-btn{flex-shrink:0;padding:2px 6px;border:1px solid rgba(255,255,255,.18);border-radius:3px;background:none;color:#ffffff80;font-size:10px;font-family:var(--font-family);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.wm-active-legend-btn:hover{background:#ffffff1a;color:#ffffffe0}.wm-active-legend-btn.active{border-color:var(--color-primary);color:var(--color-primary);background:#3b82f61f}.layout-main.wallmap-active>.layout-right{background-color:#101c2af7;border-left-color:#ffffff14;top:var(--top-height);bottom:var(--bottom-height)}.wm-legend-panel{display:flex;flex-direction:column;height:100%}.wm-legend-header{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid rgba(255,255,255,.08);background:#1c3046f2}.wm-legend-title{flex:1;font-size:12px;font-weight:600;color:#ffffffe0;font-family:var(--font-family);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wm-legend-close{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(255,255,255,.18);border-radius:3px;background:none;color:#ffffff80;font-size:11px;cursor:pointer;transition:background .15s,color .15s}.wm-legend-close:hover{background:#ffffff1a;color:#ffffffe0}.wm-legend-body{padding:12px;display:flex;flex-direction:column;gap:8px}.wm-legend-row{display:flex;align-items:center;gap:10px}.wm-legend-swatch{flex-shrink:0;width:28px;height:14px;border-radius:2px;display:block}.wm-legend-label{font-size:11px;color:#fff9;font-family:var(--font-family)}.layout-main.wallmap-active>.toggle-left{background-color:#142230eb!important;color:#ffffffbf!important;border:1px solid rgba(255,255,255,.14)!important}.layout-main.wallmap-active>.toggle-left:hover{background-color:#23374bfa!important;color:#ffffffeb!important}.layout-main.wallmap-active #layout-body-content .map-controls-panel{top:60px!important;gap:4px!important}.layout-main.wallmap-active #layout-body-content .geocode-control-wrapper,.layout-main.wallmap-active #layout-body-content .basemap-control-wrapper{margin-top:-3.6px!important}.layout-main.wallmap-active #layout-body-content .measure-btn+.measure-btn{margin-top:-3.6px!important}.layout-main.wallmap-active #layout-body-content .map-district-control,.layout-main.wallmap-active #layout-body-content .geocode-fields,.layout-main.wallmap-active #layout-body-content .basemap-control{background-color:#142230eb!important;border-color:#ffffff24!important}.layout-main.wallmap-active #layout-body-content .district-select,.layout-main.wallmap-active #layout-body-content .geocode-filter-select,.layout-main.wallmap-active #layout-body-content .geocode-input{background-color:#0e1a26f2!important;color:#ffffffd9!important;border-color:#ffffff24!important}.layout-main.wallmap-active #layout-body-content .basemap-btn:not(.active){background-color:#0e1a26f2!important;color:#ffffffb3!important;border-color:#ffffff24!important}.layout-main.wallmap-active .ol-scale-line-inner{border-color:#fffc!important;color:#fffc!important;text-shadow:none!important}.layout-main.wallmap-active>.toggle-top{display:none!important}.layout-main.wallmap-active #layout-body-content .controls-toggle-btn,.layout-main.wallmap-active #layout-body-content .district-toggle-btn,.layout-main.wallmap-active #layout-body-content .geocode-toggle-btn,.layout-main.wallmap-active #layout-body-content .basemap-toggle-btn,.layout-main.wallmap-active #layout-body-content .zoom-btn,.layout-main.wallmap-active #layout-body-content .measure-btn{background-color:#142230eb!important;color:#fffc!important;border:1px solid rgba(255,255,255,.14)!important}.layout-main.wallmap-active #layout-body-content .controls-toggle-btn:hover,.layout-main.wallmap-active #layout-body-content .district-toggle-btn:hover,.layout-main.wallmap-active #layout-body-content .geocode-toggle-btn:hover,.layout-main.wallmap-active #layout-body-content .basemap-toggle-btn:hover,.layout-main.wallmap-active #layout-body-content .zoom-btn:hover,.layout-main.wallmap-active #layout-body-content .measure-btn:hover{background-color:#23374bfa!important}.layout-main.wallmap-active #layout-body-content .zoom-level-display{background-color:#142230eb!important;color:#fffc!important;border-color:#ffffff24!important}#wallmap-legend{position:absolute;left:16px;bottom:16px;z-index:500}#wallmap-legend.gis-float-panel{border-color:#ffffff1f}#wallmap-legend .gis-traffic-panel-body,#wallmap-legend .gis-traffic-legend{background:#142230f2;border-color:#ffffff1f}#wallmap-legend .gis-traffic-legend-group{border-color:#ffffff1f}#wallmap-legend .gis-traffic-legend-title,#wallmap-legend .gis-traffic-legend-label{color:#fffc}.layout-main.wallmap-active #layout-body-content .measure-btn.active{background-color:#284664fa!important;box-shadow:inset 0 0 0 2px #ffffff40!important}.layout-main.wallmap-active>.toggle-right{display:none!important}#layout-map.wm-cctv-expanded>#wallmap-legend{display:none}.layout-main.wallmap-active #wm-cctv-expand{top:var(--top-height);bottom:var(--bottom-height)}
