2026-08-06 09:52:04 +08:00
: root {
--paper : #ffffff ;
--text : #20252b ;
--grid : #d9dde1 ;
--current-trajectory : #1769aa ;
--previous-trajectory : #8d959d ;
--handoff : #d87918 ;
--failure : #b42318 ;
2026-08-09 19:17:22 +08:00
--world-coarse-path : #7e8790 ;
--world-smoothed-path : #168b83 ;
--world-active-segment : #3f78a8 ;
--world-em-trajectory : #df6b1f ;
2026-08-06 09:52:04 +08:00
}
* { box-sizing : border-box ; }
body { margin : 0 ; background : var ( -- paper ); color : var ( -- text ); font : 14 px / 1.45 "Microsoft YaHei" , "Noto Sans CJK SC" , sans-serif ; }
header { display : flex ; justify-content : space-between ; align-items : end ; padding : 22 px 30 px 16 px ; border-bottom : 1 px solid var ( -- grid ); }
h1 , h2 , p { margin : 0 ; } h1 { font-size : 22 px ; font-weight : 600 ; letter-spacing : .02 em ; } h2 { font-size : 15 px ; font-weight : 600 ; }
. eyebrow { color : #66707a ; font : 11 px / 1.2 ui-monospace , Consolas , monospace ; letter-spacing : .08 em ; text-transform : uppercase ; }
# live-state { min-width : 170 px ; padding : 5 px 8 px ; border-left : 3 px solid var ( -- current - trajectory ); color : #3f4851 ; text-align : right ; }
nav { display : flex ; gap : 2 px ; padding : 10 px 30 px 0 ; border-bottom : 1 px solid var ( -- grid ); }
nav button { border : 0 ; border-bottom : 2 px solid transparent ; background : transparent ; color : #59636d ; cursor : pointer ; padding : 9 px 12 px 8 px ; font : inherit ; }
nav button [ aria-selected = "true" ] { border-bottom-color : var ( -- current - trajectory ); color : var ( -- text ); font-weight : 600 ; }
main { max-width : 1500 px ; margin : auto ; padding : 22 px 30 px 36 px ; }
. summary-grid { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 130 px , 1 fr )); gap : 7 px 16 px ; margin-bottom : 14 px ; }
. summary-value { border-bottom : 1 px solid var ( -- grid ); padding : 4 px 0 ; } . summary-value small { display : block ; color : #66707a ; }
. world-stack { position : relative ; width : 100 % ; min-height : 520 px ; border : 1 px solid var ( -- grid ); overflow : hidden ; background : #fff ; }
# occupancy-grid , # world-overlay { position : absolute ; inset : 0 ; width : 100 % ; height : 100 % ; } # world-overlay { pointer-events : none ; }
2026-08-07 09:46:51 +08:00
main > section [ hidden ] { display : none !important ; }
# ls-st : not ([ hidden ]), # kinematics : not ([ hidden ]) { display : grid ; grid-template-columns : repeat ( auto - fit , minmax ( 360 px , 1 fr )); gap : 18 px ; }
2026-08-07 10:05:43 +08:00
. chart { position : relative ; min-height : 280 px ; border : 1 px solid var ( -- grid ); padding : 8 px ; } . chart svg { display : block ; width : 100 % ; height : 244 px ; touch-action : none ; }
. chart-tools { position : absolute ; top : 6 px ; right : 6 px ; display : flex ; gap : 6 px ; }
. chart-tools button { width : 26 px ; height : 26 px ; border : 1 px solid var ( -- grid ); background : #fff ; color : #59636d ; cursor : pointer ; font : 12 px / 1 sans-serif ; }
. chart-tools button : hover { border-color : #8d959d ; color : #20252b ; }
. chart-zoom-box { fill : rgba ( 23 , 105 , 170 , .08 ); stroke : #1769aa ; stroke-width : .8 ; }
. chart . is-fullscreen { position : fixed ; inset : 0 ; z-index : 100 ; min-height : 100 vh ; padding : 18 px ; overflow : auto ; background : var ( -- paper ); }
. chart . is-fullscreen svg { height : calc ( 100 vh - 110 px ); min-height : 320 px ; }
2026-08-06 09:52:04 +08:00
. chart-title { font-size : 14 px ; font-weight : 600 ; } . chart-note { min-height : 20 px ; color : #66707a ; font-size : 12 px ; }
. chart-grid { stroke : var ( -- grid ); stroke-width : .55 ; } . chart-axis { stroke : #59636d ; stroke-width : .8 ; } . chart-data { fill : none ; stroke-width : 1.1 ; vector-effect : non-scaling-stroke ; }
. chart-solid { stroke : var ( -- current - trajectory ); } . chart-dashed { stroke : var ( -- previous - trajectory ); stroke-dasharray : 5 4 ; } . chart-limit { stroke : var ( -- failure ); stroke-dasharray : 3 3 ; }
. axis-label { fill : #48515b ; font : 11 px sans-serif ; } . axis-tick { fill : #66707a ; font : 10 px sans-serif ; }
2026-08-07 09:46:51 +08:00
. axis-label-x , . axis-label-y { fill : #48515b ; font : 11 px sans-serif ; } . axis-tick-x , . axis-tick-y { fill : #66707a ; font : 10 px sans-serif ; }
. chart-annotation-line { stroke : var ( -- handoff ); stroke-width : .8 ; stroke-dasharray : 2 2 ; }
. chart-annotation-point { fill : var ( -- handoff ); stroke : #ffffff ; stroke-width : .6 ; }
. chart-annotation-label { fill : var ( -- handoff ); font : 10 px sans-serif ; }
. world-line { fill : none ; vector-effect : non-scaling-stroke ; }
2026-08-09 19:11:56 +08:00
. world-coordinate-grid { stroke : #dfe4e8 ; stroke-opacity : .62 ; stroke-width : .7 ; vector-effect : non-scaling-stroke ; }
. world-axis-zero { stroke : #7c8791 ; stroke-opacity : .72 ; stroke-width : 1.1 ; vector-effect : non-scaling-stroke ; }
. world-axis-tick { fill : #68737d ; font-family : ui-monospace , Consolas , monospace ; }
. world-axis-label { fill : #48535d ; font-family : "Microsoft YaHei" , "Noto Sans CJK SC" , sans-serif ; font-weight : 600 ; }
2026-08-09 19:17:22 +08:00
. world-static { stroke : #8d959d ; stroke-opacity : .38 ; stroke-width : 1.4 ; }
. world-future { stroke : #b6bec6 ; stroke-dasharray : 5 4 ; stroke-width : 1.2 ; }
. world-active { stroke : var ( -- world - active - segment ); stroke-width : 1.5 ; }
. world-previous { stroke : #887493 ; stroke-opacity : .66 ; stroke-dasharray : 7 5 ; stroke-width : 2 ; }
. world-coarse { stroke : var ( -- world - coarse - path ); stroke-opacity : .40 ; stroke-dasharray : 7 5 ; stroke-width : 2 ; }
. world-local-g2 { stroke : var ( -- world - smoothed - path ); stroke-opacity : .65 ; stroke-width : 4 ; }
. world-segment-active { stroke : var ( -- world - active - segment ); stroke-opacity : .50 ; stroke-width : 1.5 ; }
. world-direction-inactive { stroke : #aab2b9 ; stroke-opacity : .30 ; stroke-dasharray : 5 5 ; stroke-width : 1.1 ; }
. world-current { stroke : var ( -- world - em - trajectory ); stroke-opacity : .96 ; stroke-width : 2.4 ; }
. world-marker-shape { vector-effect : non-scaling-stroke ; }
. world-marker-label { fill : #20252b ; font : 11 px / 1.2 "Microsoft YaHei" , "Noto Sans CJK SC" , sans-serif ; paint-order : stroke ; stroke : rgba ( 255 , 255 , 255 , .88 ); stroke-width : 3 px ; stroke-linejoin : round ; }
. world-marker { fill : #d87918 ; stroke : #ffffff ; stroke-width : 1.4 ; }
. marker-vehicle . vehicle-outline { fill : rgba ( 32 , 37 , 43 , .16 ); stroke : #20252b ; stroke-width : 1.5 ; }
. marker-vehicle . vehicle-heading { stroke : #20252b ; stroke-width : 1.5 ; stroke-linecap : round ; vector-effect : non-scaling-stroke ; }
. marker-smooth-start { fill : #2f8f56 ; stroke : #ffffff ; stroke-width : 1.5 ; }
2026-08-09 19:43:47 +08:00
. marker-plan-start { fill : none ; stroke : #2f8f56 ; stroke-width : 2 ; }
2026-08-09 19:17:22 +08:00
. marker-gear-switch { fill : #d87918 ; stroke : #ffffff ; stroke-width : 1.5 ; }
. marker-final-goal { fill : #1769aa ; stroke : #ffffff ; stroke-width : 1.5 ; }
2026-08-09 19:27:23 +08:00
. world-legend { position : absolute ; top : 14 px ; right : 14 px ; z-index : 3 ; display : grid ; gap : 6 px ; min-width : 154 px ; max-width : min ( 260 px , calc ( 100 % - 28 px )); padding : 10 px 12 px ; border : 1 px solid rgba ( 112 , 123 , 133 , .38 ); border-radius : 6 px ; background : rgba ( 255 , 255 , 255 , .88 ); box-shadow : 0 2 px 10 px rgba ( 32 , 37 , 43 , .08 ); color : #36404a ; font-size : 12 px ; pointer-events : none ; backdrop-filter : blur ( 2 px ); }
. world-legend [ hidden ] { display : none ; }
. world-legend-item { display : grid ; grid-template-columns : 30 px minmax ( 0 , 1 fr ); align-items : center ; gap : 8 px ; min-height : 16 px ; }
. world-legend-swatch { display : block ; justify-self : center ; }
. legend-line { width : 28 px ; height : 0 ; border-top-style : solid ; }
. legend-coarse { border-top : 2 px dashed rgba ( 126 , 135 , 144 , .62 ); }
. legend-smooth { border-top : 4 px solid rgba ( 22 , 139 , 131 , .65 ); }
. legend-segment { border-top : 2 px solid rgba ( 63 , 120 , 168 , .50 ); }
. legend-previous { border-top : 2 px dashed rgba ( 136 , 116 , 147 , .72 ); }
. legend-current { border-top : 3 px solid rgba ( 223 , 107 , 31 , .96 ); }
. legend-marker { width : 11 px ; height : 11 px ; border : 1.5 px solid #ffffff ; box-shadow : 0 0 0 1 px rgba ( 32 , 37 , 43 , .22 ); }
. legend-smooth-start { border-radius : 50 % ; background : #2f8f56 ; }
. legend-plan-start { border : 2 px solid #2f8f56 ; border-radius : 50 % ; background : #ffffff ; }
. legend-vehicle { width : 17 px ; height : 9 px ; border : 1.5 px solid #20252b ; border-radius : 2 px ; background : rgba ( 32 , 37 , 43 , .16 ); }
. legend-gear { transform : rotate ( 45 deg ); background : #d87918 ; }
. legend-goal { background : #1769aa ; }
. world-legend-label { overflow : hidden ; text-overflow : ellipsis ; white-space : nowrap ; }
2026-08-09 19:17:22 +08:00
. world-empty-state { fill : #66707a ; font : 14 px / 1.2 "Microsoft YaHei" , "Noto Sans CJK SC" , sans-serif ; }
2026-08-06 09:52:04 +08:00
. history-panel , . configuration-panel { margin-bottom : 26 px ; } # cycle-history { overflow-x : auto ; } table { width : 100 % ; border-collapse : collapse ; font-size : 12 px ; } th , td { padding : 6 px 8 px ; border-bottom : 1 px solid var ( -- grid ); text-align : left ; white-space : nowrap ; } th { color : #59636d ; font-weight : 600 ; }
. config-group { margin : 13 px 0 ; border-top : 1 px solid var ( -- grid ); } . config-group h3 { margin : 8 px 0 ; font-size : 13 px ; } . config-entry { display : grid ; grid-template-columns : minmax ( 110 px , 1 fr ) minmax ( 130 px , 1 fr ) minmax ( 90 px , 1 fr ) 70 px ; gap : 8 px ; padding : 4 px 0 ; border-bottom : 1 px dotted #e5e8eb ; } . raw { color : #66707a ; font-family : ui-monospace , Consolas , monospace ; }
. failure { color : var ( -- failure ); } . notice { color : var ( -- handoff ); }
2026-08-09 19:27:23 +08:00
@ media ( max-width : 720px ) {
header { align-items : start ; flex-direction : column ; gap : 10 px ; }
nav , main , header { padding-left : 14 px ; padding-right : 14 px ; }
. world-stack { min-height : 360 px ; }
. world-legend { top : 8 px ; right : 8 px ; min-width : 138 px ; padding : 8 px 9 px ; font-size : 11 px ; }
. config-entry { grid-template-columns : 1 fr 1 fr ; }
}