/* ──────── /vendor/maplibre-gl/dist/maplibre-gl.css ──────── */
.maplibregl-map{font:12px/20px Helvetica Neue,Arial,Helvetica,sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgb(0 0 0/0)}.maplibregl-canvas{position:absolute;left:0;top:0}.maplibregl-map:fullscreen{width:100%;height:100%}.maplibregl-ctrl-group button.maplibregl-ctrl-compass{touch-action:none}.maplibregl-canvas-container.maplibregl-interactive,.maplibregl-ctrl-group button.maplibregl-ctrl-compass{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active,.maplibregl-ctrl-group button.maplibregl-ctrl-compass:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures,.maplibregl-canvas-container.maplibregl-touch-drag-pan.maplibregl-cooperative-gestures .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-ctrl-bottom-left,.maplibregl-ctrl-bottom-right,.maplibregl-ctrl-top-left,.maplibregl-ctrl-top-right{position:absolute;pointer-events:none;z-index:2}.maplibregl-ctrl-top-left{top:0;left:0}.maplibregl-ctrl-top-right{top:0;right:0}.maplibregl-ctrl-bottom-left{bottom:0;left:0}.maplibregl-ctrl-bottom-right{right:0;bottom:0}.maplibregl-ctrl{clear:both;pointer-events:auto;transform:translate(0)}.maplibregl-ctrl-top-left .maplibregl-ctrl{margin:10px 0 0 10px;float:left}.maplibregl-ctrl-top-right .maplibregl-ctrl{margin:10px 10px 0 0;float:right}.maplibregl-ctrl-bottom-left .maplibregl-ctrl{margin:0 0 10px 10px;float:left}.maplibregl-ctrl-bottom-right .maplibregl-ctrl{margin:0 10px 10px 0;float:right}.maplibregl-ctrl-group{border-radius:4px;background:#fff}.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (forced-colors:active){.maplibregl-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}}.maplibregl-ctrl-group button{width:29px;height:29px;display:block;padding:0;outline:none;border:0;box-sizing:border-box;background-color:transparent;cursor:pointer}.maplibregl-ctrl-group button+button{border-top:1px solid #ddd}.maplibregl-ctrl button .maplibregl-ctrl-icon{display:block;width:100%;height:100%;background-repeat:no-repeat;background-position:50%}@media (forced-colors:active){.maplibregl-ctrl-icon{background-color:transparent}.maplibregl-ctrl-group button+button{border-top:1px solid ButtonText}}.maplibregl-ctrl button::-moz-focus-inner{border:0;padding:0}.maplibregl-ctrl-attrib-button:focus,.maplibregl-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl button:disabled{cursor:not-allowed}.maplibregl-ctrl button:disabled .maplibregl-ctrl-icon{opacity:.25}@media (hover:hover){.maplibregl-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}}.maplibregl-ctrl button:not(:disabled):active{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.maplibregl-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.maplibregl-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.maplibregl-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.maplibregl-ctrl-group button:focus:only-child{border-radius:inherit}.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-zoom-out .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-zoom-in .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E%3C/svg%3E")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E%3C/svg%3E")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-fullscreen .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M24 16v5.5c0 1.75-.75 2.5-2.5 2.5H16v-1l3-1.5-4-5.5 1-1 5.5 4 1.5-3zM6 16l1.5 3 5.5-4 1 1-4 5.5 3 1.5v1H7.5C5.75 24 5 23.25 5 21.5V16zm7-11v1l-3 1.5 4 5.5-1 1-5.5-4L6 13H5V7.5C5 5.75 5.75 5 7.5 5zm11 2.5c0-1.75-.75-2.5-2.5-2.5H16v1l3 1.5-4 5.5 1 1 5.5-4 1.5 3h1z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-shrink .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M18.5 16c-1.75 0-2.5.75-2.5 2.5V24h1l1.5-3 5.5 4 1-1-4-5.5 3-1.5v-1zM13 18.5c0-1.75-.75-2.5-2.5-2.5H5v1l3 1.5L4 24l1 1 5.5-4 1.5 3h1zm3-8c0 1.75.75 2.5 2.5 2.5H24v-1l-3-1.5L25 5l-1-1-5.5 4L17 5h-1zM10.5 13c1.75 0 2.5-.75 2.5-2.5V5h-1l-1.5 3L5 4 4 5l4 5.5L5 12v1z'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23333' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E%3C/svg%3E")}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E%3C/svg%3E")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-compass .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='m10.5 14 4-8 4 8z'/%3E%3Cpath fill='%23ccc' d='m10.5 16 4 8 4-8z'/%3E%3C/svg%3E")}}.maplibregl-ctrl button.maplibregl-ctrl-globe .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' stroke='%23333' viewBox='0 0 22 22'%3E%3Ccircle cx='11' cy='11' r='8.5'/%3E%3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E%3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517s-.461-.118-.775-.517c-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11s.331-4.64.853-6.206c.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517s.461.118.775.517c.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E%3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.3 1.3 0 0 1-.224-.138q.07-.058.224-.138c.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5s3.622.166 4.845.428c.616.132 1.08.283 1.379.434.105.053.177.1.224.138q-.07.058-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.3 1.3 0 0 1-.224-.138 1.3 1.3 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5s3.622.166 4.845.428c.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.3 1.3 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.5 1.5 0 0 1-.39-.272.3.3 0 0 1-.047-.064.3.3 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.3.3 0 0 1 .047.064.3.3 0 0 1-.048.064 1.4 1.4 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002zm0 .018v.002zm17.002.002v-.002zm0-.018v-.002z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-globe-enabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='none' stroke='%2333b5e5' viewBox='0 0 22 22'%3E%3Ccircle cx='11' cy='11' r='8.5'/%3E%3Cpath d='M17.5 11c0 4.819-3.02 8.5-6.5 8.5S4.5 15.819 4.5 11 7.52 2.5 11 2.5s6.5 3.681 6.5 8.5Z'/%3E%3Cpath d='M13.5 11c0 2.447-.331 4.64-.853 6.206-.262.785-.562 1.384-.872 1.777-.314.399-.58.517-.775.517s-.461-.118-.775-.517c-.31-.393-.61-.992-.872-1.777C8.831 15.64 8.5 13.446 8.5 11s.331-4.64.853-6.206c.262-.785.562-1.384.872-1.777.314-.399.58-.517.775-.517s.461.118.775.517c.31.393.61.992.872 1.777.522 1.565.853 3.76.853 6.206Z'/%3E%3Cpath d='M11 7.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.3 1.3 0 0 1-.224-.138q.07-.058.224-.138c.299-.151.763-.302 1.379-.434C7.378 5.666 9.091 5.5 11 5.5s3.622.166 4.845.428c.616.132 1.08.283 1.379.434.105.053.177.1.224.138q-.07.058-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428ZM4.486 6.436ZM11 16.5c-1.909 0-3.622-.166-4.845-.428-.616-.132-1.08-.283-1.379-.434a1.3 1.3 0 0 1-.224-.138 1.3 1.3 0 0 1 .224-.138c.299-.151.763-.302 1.379-.434C7.378 14.666 9.091 14.5 11 14.5s3.622.166 4.845.428c.616.132 1.08.283 1.379.434.105.053.177.1.224.138a1.3 1.3 0 0 1-.224.138c-.299.151-.763.302-1.379.434-1.223.262-2.936.428-4.845.428Zm-6.514-1.064ZM11 12.5c-2.46 0-4.672-.222-6.255-.574-.796-.177-1.406-.38-1.805-.59a1.5 1.5 0 0 1-.39-.272.3.3 0 0 1-.047-.064.3.3 0 0 1 .048-.064c.066-.073.189-.167.389-.272.399-.21 1.009-.413 1.805-.59C6.328 9.722 8.54 9.5 11 9.5s4.672.222 6.256.574c.795.177 1.405.38 1.804.59.2.105.323.2.39.272a.3.3 0 0 1 .047.064.3.3 0 0 1-.048.064 1.4 1.4 0 0 1-.389.272c-.399.21-1.009.413-1.804.59-1.584.352-3.796.574-6.256.574Zm-8.501-1.51v.002zm0 .018v.002zm17.002.002v-.002zm0-.018v-.002z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-terrain .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='%23333' viewBox='0 0 22 22'%3E%3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-terrain-enabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='22' height='22' fill='%2333b5e5' viewBox='0 0 22 22'%3E%3Cpath d='m1.754 13.406 4.453-4.851 3.09 3.09 3.281 3.277.969-.969-3.309-3.312 3.844-4.121 6.148 6.886h1.082v-.855l-7.207-8.07-4.84 5.187L6.169 6.57l-5.48 5.965v.871ZM.688 16.844h20.625v1.375H.688Zm0 0'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23333' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23aaa' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-waiting .maplibregl-ctrl-icon{animation:maplibregl-spin 2s linear infinite}@media (forced-colors:active){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23fff' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23999' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1z'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-active-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23e58978' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%2333b5e5' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate.maplibregl-ctrl-geolocate-background-error .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23e54e33' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3C/svg%3E")}}@media (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl button.maplibregl-ctrl-geolocate .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3C/svg%3E")}.maplibregl-ctrl button.maplibregl-ctrl-geolocate:disabled .maplibregl-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' fill='%23666' viewBox='0 0 20 20'%3E%3Cpath d='M10 4C9 4 9 5 9 5v.1A5 5 0 0 0 5.1 9H5s-1 0-1 1 1 1 1 1h.1A5 5 0 0 0 9 14.9v.1s0 1 1 1 1-1 1-1v-.1a5 5 0 0 0 3.9-3.9h.1s1 0 1-1-1-1-1-1h-.1A5 5 0 0 0 11 5.1V5s0-1-1-1m0 2.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 1 1 0-7'/%3E%3Ccircle cx='10' cy='10' r='2'/%3E%3Cpath fill='red' d='m14 5 1 1-9 9-1-1z'/%3E%3C/svg%3E")}}@keyframes maplibregl-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}a.maplibregl-ctrl-logo{width:88px;height:23px;margin:0 0 -4px -4px;display:block;background-repeat:no-repeat;cursor:pointer;overflow:hidden;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E%3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E%3Cg style='stroke-width:1.12603545'%3E%3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3C/g%3E%3C/svg%3E")}a.maplibregl-ctrl-logo.maplibregl-compact{width:14px}@media (forced-colors:active){a.maplibregl-ctrl-logo{background-color:transparent;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E%3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E%3Cg style='stroke-width:1.12603545'%3E%3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3C/g%3E%3C/svg%3E")}}@media (forced-colors:active) and (prefers-color-scheme:light){a.maplibregl-ctrl-logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='88' height='23' fill='none'%3E%3Cpath fill='%23000' fill-opacity='.4' fill-rule='evenodd' d='M17.408 16.796h-1.827l2.501-12.095h.198l3.324 6.533.988 2.19.988-2.19 3.258-6.533h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.929 5.644h-.098l-2.914-5.644-.757-1.71-.345 1.71zm1.958-3.42-.726 3.663a1.255 1.255 0 0 1-1.232 1.011h-1.827a1.255 1.255 0 0 1-1.229-1.509l2.501-12.095a1.255 1.255 0 0 1 1.23-1.001h.197a1.25 1.25 0 0 1 1.12.685l3.19 6.273 3.125-6.263a1.25 1.25 0 0 1 1.123-.695h.181a1.255 1.255 0 0 1 1.227.991l1.443 6.71a5 5 0 0 1 .314-.787l.009-.016a4.6 4.6 0 0 1 1.777-1.887c.782-.46 1.668-.667 2.611-.667a4.6 4.6 0 0 1 1.7.32l.306.134c.21-.16.474-.256.759-.256h1.694a1.255 1.255 0 0 1 1.212.925 1.255 1.255 0 0 1 1.212-.925h1.711c.284 0 .545.094.755.252.613-.3 1.312-.45 2.075-.45 1.356 0 2.557.445 3.482 1.4q.47.48.763 1.064V4.701a1.255 1.255 0 0 1 1.255-1.255h1.86A1.255 1.255 0 0 1 54.44 4.7v9.194h2.217c.19 0 .37.043.532.118v-4.77c0-.356.147-.678.385-.906a2.42 2.42 0 0 1-.682-1.71c0-.665.267-1.253.735-1.7a2.45 2.45 0 0 1 1.722-.674 2.43 2.43 0 0 1 1.705.675q.318.302.504.683V4.7a1.255 1.255 0 0 1 1.255-1.255h1.744A1.255 1.255 0 0 1 65.812 4.7v3.335a4.8 4.8 0 0 1 1.526-.246c.938 0 1.817.214 2.59.69a4.47 4.47 0 0 1 1.67 1.743v-.98a1.255 1.255 0 0 1 1.256-1.256h1.777c.233 0 .451.064.639.174a3.4 3.4 0 0 1 1.567-.372c.346 0 .861.02 1.285.232a1.25 1.25 0 0 1 .689 1.004 4.7 4.7 0 0 1 .853-.588c.795-.44 1.675-.647 2.61-.647 1.385 0 2.65.39 3.525 1.396.836.938 1.168 2.173 1.168 3.528q-.001.515-.056 1.051a1.255 1.255 0 0 1-.947 1.09l.408.952a1.255 1.255 0 0 1-.477 1.552c-.418.268-.92.463-1.458.612-.613.171-1.304.244-2.049.244-1.06 0-2.043-.207-2.886-.698l-.015-.008c-.798-.48-1.419-1.135-1.818-1.963l-.004-.008a5.8 5.8 0 0 1-.548-2.512q0-.429.053-.843a1.3 1.3 0 0 1-.333-.086l-.166-.004c-.223 0-.426.062-.643.228-.03.024-.142.139-.142.59v3.883a1.255 1.255 0 0 1-1.256 1.256h-1.777a1.255 1.255 0 0 1-1.256-1.256V15.69l-.032.057a4.8 4.8 0 0 1-1.86 1.833 5.04 5.04 0 0 1-2.484.634 4.5 4.5 0 0 1-1.935-.424 1.25 1.25 0 0 1-.764.258h-1.71a1.255 1.255 0 0 1-1.256-1.255V7.687a2.4 2.4 0 0 1-.428.625c.253.23.412.561.412.93v7.553a1.255 1.255 0 0 1-1.256 1.255h-1.843a1.25 1.25 0 0 1-.894-.373c-.228.23-.544.373-.894.373H51.32a1.255 1.255 0 0 1-1.256-1.255v-1.251l-.061.117a4.7 4.7 0 0 1-1.782 1.884 4.77 4.77 0 0 1-2.485.67 5.6 5.6 0 0 1-1.485-.188l.009 2.764a1.255 1.255 0 0 1-1.255 1.259h-1.729a1.255 1.255 0 0 1-1.255-1.255v-3.537a1.255 1.255 0 0 1-1.167.793h-1.679a1.25 1.25 0 0 1-.77-.263 4.5 4.5 0 0 1-1.945.429c-.885 0-1.724-.21-2.495-.632l-.017-.01a5 5 0 0 1-1.081-.836 1.255 1.255 0 0 1-1.254 1.312h-1.81a1.255 1.255 0 0 1-1.228-.99l-.782-3.625-2.044 3.939a1.25 1.25 0 0 1-1.115.676h-.098a1.25 1.25 0 0 1-1.116-.68l-2.061-3.994zM35.92 16.63l.207-.114.223-.15q.493-.356.735-.785l.061-.118.033 1.332h1.678V9.242h-1.694l-.033 1.267q-.133-.329-.526-.658l-.032-.028a3.2 3.2 0 0 0-.668-.428l-.27-.12a3.3 3.3 0 0 0-1.235-.23q-1.136-.001-1.974.493a3.36 3.36 0 0 0-1.3 1.382q-.445.89-.444 2.074 0 1.2.51 2.107a3.8 3.8 0 0 0 1.382 1.381 3.9 3.9 0 0 0 1.893.477q.795 0 1.455-.33zm-2.789-5.38q-.576.675-.575 1.762 0 1.102.559 1.794.576.675 1.645.675a2.25 2.25 0 0 0 .934-.19 2.2 2.2 0 0 0 .468-.29l.178-.161a2.2 2.2 0 0 0 .397-.561q.244-.5.244-1.15v-.115q0-.708-.296-1.267l-.043-.077a2.2 2.2 0 0 0-.633-.709l-.13-.086-.047-.028a2.1 2.1 0 0 0-1.073-.285q-1.052 0-1.629.692zm2.316 2.706c.163-.17.28-.407.28-.83v-.114c0-.292-.06-.508-.15-.68a.96.96 0 0 0-.353-.389.85.85 0 0 0-.464-.127c-.4 0-.56.114-.664.239l-.01.012c-.148.174-.275.45-.275.945 0 .506.122.801.27.99.097.11.266.224.68.224.303 0 .504-.09.687-.269zm7.545 1.705a2.6 2.6 0 0 0 .331.423q.319.33.755.548l.173.074q.65.255 1.49.255 1.02 0 1.844-.493a3.45 3.45 0 0 0 1.316-1.4q.493-.904.493-2.089 0-1.909-.988-2.913-.988-1.02-2.584-1.02-.898 0-1.575.347a3 3 0 0 0-.415.262l-.199.166a3.4 3.4 0 0 0-.64.82V9.242h-1.712v11.553h1.729l-.017-5.134zm.53-1.138q.206.29.48.5l.155.11.053.034q.51.296 1.119.297 1.07 0 1.645-.675.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.435 0-.835.16a2 2 0 0 0-.284.136 2 2 0 0 0-.363.254 2.2 2.2 0 0 0-.46.569l-.082.162a2.6 2.6 0 0 0-.213 1.072v.115q0 .707.296 1.267l.135.211zm.964-.818a1.1 1.1 0 0 0 .367.385.94.94 0 0 0 .476.118c.423 0 .59-.117.687-.23.159-.194.28-.478.28-.95 0-.53-.133-.8-.266-.952l-.021-.025c-.078-.094-.231-.221-.68-.221a1 1 0 0 0-.503.135l-.012.007a.86.86 0 0 0-.335.343c-.073.133-.132.324-.132.614v.115a1.4 1.4 0 0 0 .14.66zm15.7-6.222q.347-.346.346-.856a1.05 1.05 0 0 0-.345-.79 1.18 1.18 0 0 0-.84-.329q-.51 0-.855.33a1.05 1.05 0 0 0-.346.79q0 .51.346.855.345.346.856.346.51 0 .839-.346zm4.337 9.314.033-1.332q.191.403.59.747l.098.081a4 4 0 0 0 .316.224l.223.122a3.2 3.2 0 0 0 1.44.322 3.8 3.8 0 0 0 1.875-.477 3.5 3.5 0 0 0 1.382-1.366q.527-.89.526-2.09 0-1.184-.444-2.073a3.24 3.24 0 0 0-1.283-1.399q-.823-.51-1.942-.51a3.5 3.5 0 0 0-1.527.344l-.086.043-.165.09a3 3 0 0 0-.33.214q-.432.315-.656.707a2 2 0 0 0-.099.198l.082-1.283V4.701h-1.744v12.095zm.473-2.509a2.5 2.5 0 0 0 .566.7q.117.098.245.18l.144.08a2.1 2.1 0 0 0 .975.232q1.07 0 1.645-.675.576-.69.576-1.778 0-1.102-.576-1.777-.56-.691-1.645-.692a2.2 2.2 0 0 0-1.015.235q-.22.113-.415.282l-.15.142a2.1 2.1 0 0 0-.42.594q-.223.479-.223 1.1v.115q0 .705.293 1.26zm2.616-.293c.157-.191.28-.479.28-.967 0-.51-.13-.79-.276-.961l-.021-.026c-.082-.1-.232-.225-.67-.225a.87.87 0 0 0-.681.279l-.012.011c-.154.155-.274.38-.274.807v.115c0 .285.057.499.144.669a1.1 1.1 0 0 0 .367.405c.137.082.28.123.455.123.423 0 .59-.118.686-.23zm8.266-3.013q.345-.13.724-.14l.069-.002q.493 0 .642.099l.247-1.794q-.196-.099-.717-.099a2.3 2.3 0 0 0-.545.063 2 2 0 0 0-.411.148 2.2 2.2 0 0 0-.4.249 2.5 2.5 0 0 0-.485.499 2.7 2.7 0 0 0-.32.581l-.05.137v-1.48h-1.778v7.553h1.777v-3.884q0-.546.159-.943a1.5 1.5 0 0 1 .466-.636 2.5 2.5 0 0 1 .399-.253 2 2 0 0 1 .224-.099zm9.784 2.656.05-.922q0-1.743-.856-2.698-.838-.97-2.584-.97-1.119-.001-2.007.493a3.46 3.46 0 0 0-1.4 1.382q-.493.906-.493 2.106 0 1.07.428 1.975.428.89 1.332 1.432.906.526 2.255.526.973 0 1.668-.185l.044-.012.135-.04q.613-.184.984-.421l-.542-1.267q-.3.162-.642.274l-.297.087q-.51.131-1.3.131-.954 0-1.497-.444a1.6 1.6 0 0 1-.192-.193q-.366-.44-.512-1.234l-.004-.021zm-5.427-1.256-.003.022h3.752v-.138q-.011-.727-.288-1.118a1 1 0 0 0-.156-.176q-.46-.428-1.316-.428-.986 0-1.494.604-.379.45-.494 1.234zm-27.053 2.77V4.7h-1.86v12.095h5.333V15.15zm7.103-5.908v7.553h-1.843V9.242h1.843z'/%3E%3Cpath fill='%23fff' d='m19.63 11.151-.757-1.71-.345 1.71-1.12 5.644h-1.827L18.083 4.7h.197l3.325 6.533.988 2.19.988-2.19L26.839 4.7h.181l2.6 12.095h-1.81l-1.218-5.644-.362-1.71-.658 1.71-2.93 5.644h-.098l-2.913-5.644zm14.836 5.81q-1.02 0-1.893-.478a3.8 3.8 0 0 1-1.381-1.382q-.51-.906-.51-2.106 0-1.185.444-2.074a3.36 3.36 0 0 1 1.3-1.382q.839-.494 1.974-.494a3.3 3.3 0 0 1 1.234.231 3.3 3.3 0 0 1 .97.575q.396.33.527.659l.033-1.267h1.694v7.553H37.18l-.033-1.332q-.279.593-1.02 1.053a3.17 3.17 0 0 1-1.662.444zm.296-1.482q.938 0 1.58-.642.642-.66.642-1.711v-.115q0-.708-.296-1.267a2.2 2.2 0 0 0-.807-.872 2.1 2.1 0 0 0-1.119-.313q-1.053 0-1.629.692-.575.675-.575 1.76 0 1.103.559 1.795.577.675 1.645.675zm6.521-6.237h1.711v1.4q.906-1.597 2.83-1.597 1.596 0 2.584 1.02.988 1.005.988 2.914 0 1.185-.493 2.09a3.46 3.46 0 0 1-1.316 1.399 3.5 3.5 0 0 1-1.844.493q-.954 0-1.662-.329a2.67 2.67 0 0 1-1.086-.97l.017 5.134h-1.728zm4.048 6.22q1.07 0 1.645-.674.577-.69.576-1.762 0-1.119-.576-1.777-.558-.675-1.645-.675-.592 0-1.12.296-.51.28-.822.823-.296.527-.296 1.234v.115q0 .708.296 1.267.313.543.823.855.51.296 1.119.297z'/%3E%3Cpath fill='%23e1e3e9' d='M51.325 4.7h1.86v10.45h3.473v1.646h-5.333zm7.12 4.542h1.843v7.553h-1.843zm.905-1.415a1.16 1.16 0 0 1-.856-.346 1.17 1.17 0 0 1-.346-.856 1.05 1.05 0 0 1 .346-.79q.346-.329.856-.329.494 0 .839.33a1.05 1.05 0 0 1 .345.79 1.16 1.16 0 0 1-.345.855q-.33.346-.84.346zm7.875 9.133a3.17 3.17 0 0 1-1.662-.444q-.723-.46-1.004-1.053l-.033 1.332h-1.71V4.701h1.743v4.657l-.082 1.283q.279-.658 1.086-1.119a3.5 3.5 0 0 1 1.778-.477q1.119 0 1.942.51a3.24 3.24 0 0 1 1.283 1.4q.445.888.444 2.072 0 1.201-.526 2.09a3.5 3.5 0 0 1-1.382 1.366 3.8 3.8 0 0 1-1.876.477zm-.296-1.481q1.069 0 1.645-.675.577-.69.577-1.778 0-1.102-.577-1.776-.56-.691-1.645-.692a2.12 2.12 0 0 0-1.58.659q-.642.641-.642 1.694v.115q0 .71.296 1.267a2.4 2.4 0 0 0 .807.872 2.1 2.1 0 0 0 1.119.313zm5.927-6.237h1.777v1.481q.263-.757.856-1.217a2.14 2.14 0 0 1 1.349-.46q.527 0 .724.098l-.247 1.794q-.149-.099-.642-.099-.774 0-1.416.494-.626.493-.626 1.58v3.883h-1.777V9.242zm9.534 7.718q-1.35 0-2.255-.526-.904-.543-1.332-1.432a4.6 4.6 0 0 1-.428-1.975q0-1.2.493-2.106a3.46 3.46 0 0 1 1.4-1.382q.889-.495 2.007-.494 1.744 0 2.584.97.855.956.856 2.7 0 .444-.05.92h-5.43q.18 1.005.708 1.45.542.443 1.497.443.79 0 1.3-.131a4 4 0 0 0 .938-.362l.542 1.267q-.411.263-1.119.46-.708.198-1.711.197zm1.596-4.558q.016-1.02-.444-1.432-.46-.428-1.316-.428-1.728 0-1.991 1.86z'/%3E%3Cpath d='M5.074 15.948a.484.657 0 0 0-.486.659v1.84a.484.657 0 0 0 .486.659h4.101a.484.657 0 0 0 .486-.659v-1.84a.484.657 0 0 0-.486-.659zm3.56 1.16H5.617v.838h3.017z' style='fill:%23fff;fill-rule:evenodd;stroke-width:1.03600001'/%3E%3Cg style='stroke-width:1.12603545'%3E%3Cpath d='M-9.408-1.416c-3.833-.025-7.056 2.912-7.08 6.615-.02 3.08 1.653 4.832 3.107 6.268.903.892 1.721 1.74 2.32 2.902l-.525-.004c-.543-.003-.992.304-1.24.639a1.87 1.87 0 0 0-.362 1.121l-.011 1.877c-.003.402.104.787.347 1.125.244.338.688.653 1.23.656l4.142.028c.542.003.99-.306 1.238-.641a1.87 1.87 0 0 0 .363-1.121l.012-1.875a1.87 1.87 0 0 0-.348-1.127c-.243-.338-.688-.653-1.23-.656l-.518-.004c.597-1.145 1.425-1.983 2.348-2.87 1.473-1.414 3.18-3.149 3.2-6.226-.016-3.59-2.923-6.684-6.993-6.707m-.006 1.1v.002c3.274.02 5.92 2.532 5.9 5.6-.017 2.706-1.39 4.026-2.863 5.44-1.034.994-2.118 2.033-2.814 3.633-.018.041-.052.055-.075.065q-.013.004-.02.01a.34.34 0 0 1-.226.084.34.34 0 0 1-.224-.086l-.092-.077c-.699-1.615-1.768-2.669-2.781-3.67-1.454-1.435-2.797-2.762-2.78-5.478.02-3.067 2.7-5.545 5.975-5.523m-.02 2.826c-1.62-.01-2.944 1.315-2.955 2.96-.01 1.646 1.295 2.988 2.916 2.999h.002c1.621.01 2.943-1.316 2.953-2.961.011-1.646-1.294-2.988-2.916-2.998m-.005 1.1c1.017.006 1.829.83 1.822 1.89s-.83 1.874-1.848 1.867c-1.018-.006-1.829-.83-1.822-1.89s.83-1.874 1.848-1.868m-2.155 11.857 4.14.025c.271.002.49.305.487.676l-.013 1.875c-.003.37-.224.67-.495.668l-4.14-.025c-.27-.002-.487-.306-.485-.676l.012-1.875c.003-.37.224-.67.494-.668' style='color:%23000;font-style:normal;font-variant:normal;font-weight:400;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:%23000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:evenodd;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:%23000;solid-opacity:1;vector-effect:none;fill:%23000;fill-opacity:.4;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-9.415-.316C-12.69-.338-15.37 2.14-15.39 5.207c-.017 2.716 1.326 4.041 2.78 5.477 1.013 1 2.081 2.055 2.78 3.67l.092.076a.34.34 0 0 0 .225.086.34.34 0 0 0 .227-.083l.019-.01c.022-.009.057-.024.074-.064.697-1.6 1.78-2.64 2.814-3.634 1.473-1.414 2.847-2.733 2.864-5.44.02-3.067-2.627-5.58-5.901-5.601m-.057 8.784c1.621.011 2.944-1.315 2.955-2.96.01-1.646-1.295-2.988-2.916-2.999-1.622-.01-2.945 1.315-2.955 2.96s1.295 2.989 2.916 3' style='clip-rule:evenodd;fill:%23e1e3e9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3Cpath d='M-11.594 15.465c-.27-.002-.492.297-.494.668l-.012 1.876c-.003.371.214.673.485.675l4.14.027c.271.002.492-.298.495-.668l.012-1.877c.003-.37-.215-.672-.485-.674z' style='clip-rule:evenodd;fill:%23fff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2.47727823;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:.4' transform='translate(15.553 2.85)scale(.88807)'/%3E%3C/g%3E%3C/svg%3E")}}.maplibregl-ctrl.maplibregl-ctrl-attrib{padding:0 5px;background-color:hsla(0,0%,100%,.5);margin:0}@media screen{.maplibregl-ctrl-attrib.maplibregl-compact{min-height:20px;padding:2px 24px 2px 0;margin:10px;position:relative;background-color:#fff;color:#000;border-radius:12px;box-sizing:content-box}.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 28px 2px 8px;visibility:visible}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact-show,.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact-show{padding:2px 8px 2px 28px;border-radius:12px}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-inner{display:none}.maplibregl-ctrl-attrib-button{display:none;cursor:pointer;position:absolute;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E");background-color:hsla(0,0%,100%,.5);width:24px;height:24px;box-sizing:border-box;border-radius:12px;outline:none;top:0;right:0;border:0}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;list-style:none}.maplibregl-ctrl-attrib summary.maplibregl-ctrl-attrib-button::-webkit-details-marker{display:none}.maplibregl-ctrl-bottom-left .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-top-left .maplibregl-ctrl-attrib-button{left:0}.maplibregl-ctrl-attrib.maplibregl-compact .maplibregl-ctrl-attrib-button,.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-inner{display:block}.maplibregl-ctrl-attrib.maplibregl-compact-show .maplibregl-ctrl-attrib-button{background-color:rgba(0,0,0,.05)}.maplibregl-ctrl-bottom-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;right:0}.maplibregl-ctrl-top-right>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;right:0}.maplibregl-ctrl-top-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{top:0;left:0}.maplibregl-ctrl-bottom-left>.maplibregl-ctrl-attrib.maplibregl-compact:after{bottom:0;left:0}}@media screen and (forced-colors:active){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='%23fff' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}@media screen and (forced-colors:active) and (prefers-color-scheme:light){.maplibregl-ctrl-attrib.maplibregl-compact:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill-rule='evenodd' viewBox='0 0 20 20'%3E%3Cpath d='M4 10a6 6 0 1 0 12 0 6 6 0 1 0-12 0m5-3a1 1 0 1 0 2 0 1 1 0 1 0-2 0m0 3a1 1 0 1 1 2 0v3a1 1 0 1 1-2 0'/%3E%3C/svg%3E")}}.maplibregl-ctrl-attrib a{color:rgba(0,0,0,.75);text-decoration:none}.maplibregl-ctrl-attrib a:hover{color:inherit;text-decoration:underline}.maplibregl-attrib-empty{display:none}.maplibregl-ctrl-scale{background-color:hsla(0,0%,100%,.75);font-size:10px;white-space:nowrap;border:2px solid #333;border-top:#333;padding:0 5px;color:#333;box-sizing:border-box}.maplibregl-popup{position:absolute;top:0;left:0;display:flex;will-change:transform;pointer-events:none}.maplibregl-popup-anchor-top,.maplibregl-popup-anchor-top-left,.maplibregl-popup-anchor-top-right{flex-direction:column}.maplibregl-popup-anchor-bottom,.maplibregl-popup-anchor-bottom-left,.maplibregl-popup-anchor-bottom-right{flex-direction:column-reverse}.maplibregl-popup-anchor-left{flex-direction:row}.maplibregl-popup-anchor-right{flex-direction:row-reverse}.maplibregl-popup-tip{width:0;height:0;border:10px solid transparent;z-index:1}.maplibregl-popup-anchor-top .maplibregl-popup-tip{align-self:center;border-top:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-start;border-top:none;border-left:none;border-bottom-color:#fff}.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-end;border-top:none;border-right:none;border-bottom-color:#fff}.maplibregl-popup-anchor-bottom .maplibregl-popup-tip{align-self:center;border-bottom:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-start;border-bottom:none;border-left:none;border-top-color:#fff}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-end;border-bottom:none;border-right:none;border-top-color:#fff}.maplibregl-popup-anchor-left .maplibregl-popup-tip{align-self:center;border-left:none;border-right-color:#fff}.maplibregl-popup-anchor-right .maplibregl-popup-tip{align-self:center;border-right:none;border-left-color:#fff}[dir=rtl] .maplibregl-popup-anchor-left{flex-direction:row-reverse}[dir=rtl] .maplibregl-popup-anchor-right{flex-direction:row}[dir=rtl] .maplibregl-popup-anchor-top-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-top-right .maplibregl-popup-tip{align-self:flex-start}[dir=rtl] .maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip{align-self:flex-end}[dir=rtl] .maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{align-self:flex-start}.maplibregl-popup-close-button{position:absolute;right:0;top:0;border:0;border-radius:0 3px 0 0;cursor:pointer;background-color:transparent}.maplibregl-popup-close-button:hover{background-color:rgba(0,0,0,.05)}.maplibregl-popup-content{position:relative;background:#fff;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.1);padding:15px 10px;pointer-events:auto}.maplibregl-popup-anchor-top-left .maplibregl-popup-content{border-top-left-radius:0}.maplibregl-popup-anchor-top-right .maplibregl-popup-content{border-top-right-radius:0}.maplibregl-popup-anchor-bottom-left .maplibregl-popup-content{border-bottom-left-radius:0}.maplibregl-popup-anchor-bottom-right .maplibregl-popup-content{border-bottom-right-radius:0}.maplibregl-popup-track-pointer{display:none}.maplibregl-popup-track-pointer *{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.maplibregl-map:hover .maplibregl-popup-track-pointer{display:flex}.maplibregl-map:active .maplibregl-popup-track-pointer{display:none}.maplibregl-marker{position:absolute;top:0;left:0;will-change:transform;transition:opacity .2s}.maplibregl-marker-draggable{cursor:grab}.maplibregl-user-location-dot,.maplibregl-user-location-dot:before{background-color:#1da1f2;width:15px;height:15px;border-radius:50%}.maplibregl-user-location-dot:before{content:"";position:absolute;animation:maplibregl-user-location-dot-pulse 2s infinite}.maplibregl-user-location-dot:after{border-radius:50%;border:2px solid #fff;content:"";height:19px;left:-2px;position:absolute;top:-2px;width:19px;box-sizing:border-box;box-shadow:0 0 3px rgba(0,0,0,.35)}@media (prefers-reduced-motion:reduce){.maplibregl-user-location-dot:before{animation:none}}@keyframes maplibregl-user-location-dot-pulse{0%{transform:scale(1);opacity:1}70%{transform:scale(3);opacity:0}to{transform:scale(1);opacity:0}}.maplibregl-user-location-dot-stale{background-color:#aaa}.maplibregl-user-location-dot-stale:after{display:none}.maplibregl-user-location-accuracy-circle{background-color:#1da1f233;width:1px;height:1px;border-radius:100%}.maplibregl-crosshair,.maplibregl-crosshair .maplibregl-interactive,.maplibregl-crosshair .maplibregl-interactive:active{cursor:crosshair}.maplibregl-boxzoom{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border:2px dotted #202020;opacity:.5}.maplibregl-cooperative-gesture-screen{background:rgba(0,0,0,.4);position:absolute;inset:0;display:flex;justify-content:center;align-items:center;color:#fff;padding:1rem;font-size:1.4em;line-height:1.2;opacity:0;pointer-events:none;transition:opacity 1s ease 1s;z-index:99999}.maplibregl-cooperative-gesture-screen.maplibregl-show{opacity:1;transition:opacity .05s}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:none}@media (hover:none),(pointer:coarse){.maplibregl-cooperative-gesture-screen .maplibregl-desktop-message{display:none}.maplibregl-cooperative-gesture-screen .maplibregl-mobile-message{display:block}}.maplibregl-pseudo-fullscreen{position:fixed!important;width:100%!important;height:100%!important;top:0!important;left:0!important;z-index:99999}
/* ──────── /fonts/faces.css ──────── */
/* THE TYPE CAST — self-hosted film faces, SIL OFL 1.1. Generated by scripts/fetch-type-faces.mjs.
   Before this file existed, style.css NAMED these faces and shipped none of them, so every
   screening and every phone rendered the film in Times. Licences: public/fonts/LICENCES.md */
@font-face { font-family: 'Playfair Display'; font-style: italic; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-italic-400-0.woff2') format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Playfair Display'; font-style: italic; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-italic-400-1.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Playfair Display'; font-style: italic; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-italic-400-2.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Playfair Display'; font-style: italic; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-italic-400-3.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Playfair Display'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-normal-400-4.woff2') format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Playfair Display'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-normal-400-5.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Playfair Display'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-normal-400-6.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Playfair Display'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/playfair-400-normal-400-7.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/spacemono-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/spacemono-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/spacemono-400-normal-400-2.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/spacemono-400-normal-700-3.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/spacemono-400-normal-700-4.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Space Mono'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/spacemono-400-normal-700-5.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/archivo-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/archivo-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Archivo'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/archivo-400-normal-400-2.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Courier Prime'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/courierprime-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Courier Prime'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/courierprime-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Courier Prime'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/courierprime-400-normal-700-2.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Courier Prime'; font-style: normal; font-weight: 700; font-display: swap; src: url('/fonts/courierprime-400-normal-700-3.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-2.woff2') format('woff2'); unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-3.woff2') format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-4.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Source Serif 4'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/sourceserif-400-normal-400-5.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Noto Sans Telugu'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/nototeluguel-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0951-0952, U+0964-0965, U+0C00-0C7F, U+1CDA, U+1CF2, U+200C-200D, U+25CC; }
@font-face { font-family: 'Noto Sans Telugu'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/nototeluguel-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Noto Sans Telugu'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/nototeluguel-400-normal-400-2.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }
@font-face { font-family: 'Noto Sans Devanagari'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/notodevanagari-400-normal-400-0.woff2') format('woff2'); unicode-range: U+0900-097F, U+1CD0-1CF9, U+200C-200D, U+20A8, U+20B9, U+20F0, U+25CC, U+A830-A839, U+A8E0-A8FF, U+11B00-11B09; }
@font-face { font-family: 'Noto Sans Devanagari'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/notodevanagari-400-normal-400-1.woff2') format('woff2'); unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: 'Noto Sans Devanagari'; font-style: normal; font-weight: 400; font-display: swap; src: url('/fonts/notodevanagari-400-normal-400-2.woff2') format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }

/* ──────── /map.css ──────── */
/* THE MAP STACK LAB — house dress per STYLE-GUIDE: film ground, cool ink, ONE gold,
   square corners everywhere (the film-print signature — no border-radius in this file). */
:root {
  --bg: #06080c;
  --ink: #ecf0f5;
  --ink-soft: rgba(218, 225, 234, 0.62);
  --ink-faint: rgba(218, 225, 234, 0.38);
  --bright: #f7f9fc;
  --amber: #f5c469;
  --hair: rgba(218, 225, 234, 0.14);
  --panel: rgba(6, 8, 12, 0.82);
  /* THE METRONOME, hoisted (luna carries no tokens.css): exits on the half beat, entrances on
     the fast beat, one chrome easing. Every chrome surface in this file rides these three. */
  --beat-half: 120ms; --beat-fast: 240ms;
  --ease-chrome: cubic-bezier(0.22, 1, 0.36, 1);
  /* THE CORNER BAND — the height the bottom-right corner instrument (the mic's foot plus the
     compact desk above it) is allowed to occupy. js/balloon.js place() solves the rail's seat
     against THIS, never against the live panel: the desk's real height breathes every turn and
     a seat derived from it would jump mid-answer. */
  --desk-band: 330px;
  --mic-foot: 84px;   /* the corner reserved for the mic itself; the desk sits directly above */
}
* { box-sizing: border-box; border-radius: 0 !important; }
html, body { margin: 0; height: 100%; background: var(--bg); color: var(--ink);
  font: 14px/1.45 -apple-system, "Helvetica Neue", sans-serif; overflow: hidden; }
#starfield { position: fixed; inset: 0; z-index: 0; }
#map { position: fixed; inset: 0; z-index: 1; background: transparent; }
#map canvas { background: transparent; }
.mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 11px; }

#masthead { position: fixed; top: 14px; left: 18px; z-index: 10; pointer-events: none; }
#masthead .wordmark { color: var(--amber); font-weight: 600; letter-spacing: 0.22em; font-size: 12px; }
#masthead .sub { color: var(--ink-faint); font-size: 11px; letter-spacing: 0.06em; margin-top: 2px; }
#rung-badge { color: var(--ink-soft); text-transform: uppercase; }

/* THE RIGHT EDGE BELONGS TO THE INSTRUMENTS (2026-08-12): the balloon rail owns a 48px lane at
   right:16 for its whole height, and at short viewports the rail's top rides up into what used
   to be the HUD's corner. The lab's own overlay yields the lane — it is dev chrome, and the
   rail is the product. */
#hud { position: fixed; top: 14px; right: 76px; z-index: 10; width: 300px;
  background: var(--panel); border: 1px solid var(--hair); padding: 10px 12px;
  backdrop-filter: blur(6px); }
.hud-title { color: var(--ink-faint); font-size: 10px; letter-spacing: 0.18em; margin-bottom: 8px; }
#hud-body { white-space: pre; color: var(--ink-soft); }
#hud-body .live { color: var(--amber); }
#hud-log { margin-top: 8px; color: var(--ink-faint); white-space: pre-wrap; max-height: 120px; overflow-y: auto; }
.hud-actions { display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap; }
button { background: none; border: 1px solid var(--hair); color: var(--ink-soft);
  font: 11px ui-monospace, Menlo, monospace; padding: 4px 8px; cursor: pointer; letter-spacing: 0.04em; }
button:hover { color: var(--bright); border-color: var(--ink-faint); }
button.active { color: var(--amber); border-color: var(--amber); }

#dials { position: fixed; left: 0; top: 80px; bottom: 80px; z-index: 10; display: flex; align-items: flex-start; }
#dials-toggle, #bench-toggle { writing-mode: vertical-rl; padding: 10px 4px; background: var(--panel); }
#dials #dials-body { width: 320px; height: 100%; overflow-y: auto; background: var(--panel);
  border: 1px solid var(--hair); padding: 10px 14px; backdrop-filter: blur(6px); }
#dials.closed #dials-body { display: none; }
.dial-group { margin: 10px 0 4px; color: var(--ink-faint); font-size: 10px; letter-spacing: 0.16em; }
.dial { display: grid; grid-template-columns: 118px 1fr 52px; gap: 6px; align-items: center; margin: 3px 0; }
.dial label { color: var(--ink-soft); font-size: 11px; }
.dial input[type="range"] { width: 100%; accent-color: var(--amber); }
.dial input[type="color"] { width: 40px; height: 18px; border: 1px solid var(--hair); background: none; padding: 0; }
.dial .val { color: var(--ink-faint); font-family: ui-monospace, Menlo, monospace; font-size: 10px; text-align: right; }
.dial input[type="checkbox"] { accent-color: var(--amber); justify-self: start; }
.dial select { background: var(--bg); color: var(--ink-soft); border: 1px solid var(--hair); font-size: 11px; }

#bench { position: fixed; bottom: 0; left: 50%; transform: translateX(-50%); z-index: 10;
  display: flex; flex-direction: column; align-items: center; max-width: 92vw; }
#bench-toggle { writing-mode: horizontal-tb; }
#bench-body { background: var(--panel); border: 1px solid var(--hair); padding: 10px 14px;
  max-height: 46vh; overflow: auto; backdrop-filter: blur(6px); }
#bench.closed #bench-body { display: none; }
#bench table { border-collapse: collapse; font: 10px ui-monospace, Menlo, monospace; color: var(--ink-soft); }
#bench th, #bench td { border: 1px solid var(--hair); padding: 3px 7px; text-align: right; }
#bench th { color: var(--ink-faint); font-weight: 400; letter-spacing: 0.06em; }
#bench td.slow { color: #f5c469; } /* gold = the cell that is ALIVE as a problem */
#bench-status { margin: 6px 0; color: var(--ink-faint); }

/* THE CREDIT STANDS DOWN FOR NOW (founder 2026-08-12: "just lose it for now. we'll add it
   back later") — it sat exactly where the mic is moving. Attribution data still loads;

/* per-organ sheet law (THE PLANES §4): this file is the MAP organ's dress only —
   lines 1-80 of the quarry style.css verbatim (root vars, base, masthead, hud, dials, bench).
   Other organs bring their own sheets when they immigrate. */

/* ──────── /css/film.css ──────── */
/* ══ THE FILM LANE — carved VERBATIM from the quarry public/style.css (regions 213–679 +
   910–1047 at checkpoint 8dfb2fbe) per THE PLANES §4 (per-organ sheets). Two carve notes:
   (1) CINEMA MODE + P6 rules reference desk/balloon chrome (.luna-panel, .brail, .talkmic)
   that has not immigrated — dead selectors today, live the day the chrome row lands;
   (2) nothing here styles the map organ; map.css is untouched. — F5 */
/* ══ THE FILM DOOR (?film=) — the SLIDE register + the film furniture ═══════════════════ */
/* THE FILM PLATE STOCK (STYLE-GUIDE §2.4c serialized in edl/constants.mjs): one stock,
   1.15s dissolves both edges (opacity driven per-frame by the organ's envelope — no CSS
   transition fighting the clock), soft melt edges, no border, credit takes the measure. */
/* ══ THE FILM'S Z-LADDER, WRITTEN DOWN (founder frame-by-frame 2026-09-02) ═══════════════════
   Nine fixed surfaces had grown up over a year sharing four z values, and three of them were
   only in the right order because of the order film.js happens to append them to <body>. That
   is not an order, it is a coincidence — and the screening asked the question a coincidence
   cannot answer: "why is the April 4 card not on the frame?" The ladder is now explicit and
   there is one rule at the top of it: NO VEIL, GRADE OR PICTURE MAY EVER STAND OVER A CARD.
       1  #map            the Earth
       22 #film-air       the per-cue haze (the pre-world-clock veil)
       23 #film-night     the night veil + its backdrop grade  ── the world's grades
       24 #film-dim       the plate/card under-dim + the dawn veil
       25 #film-plate · #film-seq                               ── the record
       26 #film-cut       the earned cut (over the footage, under every word)
       27 #film-locator   the map's own word
       28 #film-caption   THE ONE TEXT BAND                     ── the type
       29 #film-rail      the ledger / the credit roll
       30 #film-card      THE CARD — the beat itself, above everything the world can paint
       32 #film-bar       the hairline player (the hand)
       40 #film-index     the door out                                                        */
#film-dim { position: fixed; inset: 0; background: #04060a; opacity: 0; pointer-events: none; z-index: 24; }
/* ══ THE PLATE GRAMMAR — REGISTERS AS BANDS OF THE LONG AXIS (founder-ratified 2026-09-02) ══
   P3 THE LONG AXIS: a register is a share of the STAGE'S LONG AXIS, not a screen fraction, so
   ONE authored register projects to a right rail on a landscape frame and a top band on a
   portrait one. Desktop's long axis is horizontal, a phone's is vertical; `body.film-portrait`
   (set by film.js off the live viewport, ONE source of truth — never a media query that can
   disagree with the projector) is the switch. The 2026-08-17 geometry was desktop screen-
   fractions all the way down: at 390px the side rail became a 148px stamp and `full` amputated
   landscape archival photographs into 9:19.5. Vocabulary + mapping: edl/stage.mjs.
       MARGIN  ~⅓ of the long axis, trailing end   ·  COUNTERPOINT  record ⅔ / Earth ⅓
       STAGE   the record full-frame, COMPOSED     ·  GHOST  the blend, aspect-free            */
#film-plate { position: fixed; z-index: 25; opacity: 0; pointer-events: none; }
/* `--fp-band` — the record's share of the long axis, written by film.js per register
   (STAGE.GRAMMAR.BAND; a row's own `size` still overrides it in the margin). It is declared on
   the ROOT, not here, because the text band reads it too: on a portrait counterpoint the band
   has to find the seam, and a custom property declared on #film-plate could never reach it. */
:root { --fp-band: .33; }
/* THE WINDOW (2026-08-21): clips the picture surfaces so in-picture motion (the crop scale)
   pans INSIDE the vignetted box instead of outgrowing it. line-height:0 kills the inline-img
   baseline gap. The cite no longer lives here at all — ONE TEXT BAND owns it (P4). */
#film-plate .fp-window { overflow: hidden; line-height: 0; }

/* ── MARGIN — the glancing citation ────────────────────────────────────────────────────────
   Landscape: the right rail, entered from the frame edge (film.js drives the travel off the
   envelope's own edge progress — no CSS transition fighting the clock).
   Portrait: a TOP BAND ABOVE THE MAP. Never a floating stamp over it: a 148px card dropped on
   a phone's satellite frame is the offense the grammar was written against. */
#film-plate.fp-margin { right: 6vw; top: 44%; transform: translateY(-50%);
  max-width: calc(var(--fp-band) * 100vw); }
#film-plate.fp-margin img, #film-plate.fp-margin video {
  display: block; max-width: 100%; max-height: 56vh; margin: 0 auto;
  filter: grayscale(0.55) sepia(0.08) contrast(1.18) brightness(0.95);
  border: none; border-radius: 3px; box-shadow: 0 0 44px 18px rgba(4,6,10,.55); }
#film-plate.fp-margin.fp-travel img { box-shadow: -18px 0 60px 10px rgba(4,6,10,.6); }
body.film-portrait #film-plate.fp-margin { right: auto; left: 0; top: 0; width: 100vw;
  max-width: none; transform: none;
  padding-top: max(env(safe-area-inset-top, 0px), 8px); }
body.film-portrait #film-plate.fp-margin .fp-window {
  height: calc(var(--fp-band) * 100vh); display: flex; align-items: center; justify-content: center; }
body.film-portrait #film-plate.fp-margin img, body.film-portrait #film-plate.fp-margin video {
  width: auto; height: auto; max-width: 92vw; max-height: 100%;
  box-shadow: 0 18px 60px 10px rgba(4,6,10,.6); }

/* ── COUNTERPOINT — the record two-thirds, the Earth still alive on the rest ────────────────
   The 2026-08-17 `split`, generalized off the long axis. The inner edge is feathered so it
   reads as a composition, not as a browser frame; film.js keeps the locators in the live half. */
#film-plate.fp-counterpoint, #film-plate.fp-stage, #film-plate.fp-ghost {
  inset: 0; right: 0; top: 0; max-width: none; transform: none; }
#film-plate.fp-counterpoint .fp-window { position: absolute; top: 0; height: 100vh;
  width: calc(var(--fp-band) * 100vw); }
#film-plate.fp-counterpoint.fp-record-right .fp-window { right: 0; left: auto;
  -webkit-mask-image: linear-gradient(to right, rgba(0,0,0,0) 0, #000 7%);
  mask-image: linear-gradient(to right, rgba(0,0,0,0) 0, #000 7%); }
#film-plate.fp-counterpoint:not(.fp-record-right) .fp-window { left: 0; right: auto;
  -webkit-mask-image: linear-gradient(to left, rgba(0,0,0,0) 0, #000 7%);
  mask-image: linear-gradient(to left, rgba(0,0,0,0) 0, #000 7%); }
#film-plate.fp-counterpoint img, #film-plate.fp-counterpoint video {
  width: 100%; height: 100%; max-width: none; max-height: none; object-fit: cover;
  border-radius: 0; box-shadow: none; filter: grayscale(.28) sepia(.05) contrast(1.12); }
/* portrait: STACKED — the record is the top band, the Earth the bottom, and ONE TEXT BAND
   rides the seam (film.js lifts it; see #film-caption below). */
body.film-portrait #film-plate.fp-counterpoint .fp-window {
  inset: 0 0 auto 0; width: 100vw; height: calc(var(--fp-band) * 100vh);
  -webkit-mask-image: linear-gradient(to bottom, #000 90%, rgba(0,0,0,0));
  mask-image: linear-gradient(to bottom, #000 90%, rgba(0,0,0,0)); }

/* ── STAGE — the record takes the frame, COMPOSED INTO IT ──────────────────────────────────
   THE ASPECT LAW (P3): the picture is composed into the frame and LETTERBOXED against the
   vignette when the aspects fight — never cover-crop-amputated. A landscape 1948 photograph in
   a 9:19.5 window is not a close-up, it is a mutilation, and it was what the phone shipped.
   film.js measures the two aspects and adds .fp-letterbox only when they genuinely fight; a
   trim stays a trim (THE FOOD PLATE REGISTER's full-bleed cover-fill survives untouched). */
#film-plate.fp-stage .fp-window, #film-plate.fp-ghost .fp-window { display: contents; }
#film-plate.fp-stage img, #film-plate.fp-stage video,
#film-plate.fp-ghost img, #film-plate.fp-ghost video {
  width: 100%; height: 100%; max-width: none; max-height: none; object-fit: cover;
  border-radius: 0; box-shadow: none; transform-origin: 50% 45%;
  filter: grayscale(.08) sepia(.03) contrast(1.12) brightness(1.02); }
/* LETTERBOXED AGAINST THE VIGNETTE, and the words are exact: the bands beside a composed
   picture are not dead black, they are the stage's own deep ground with the dimmed Earth still
   faintly under it — the film's other footage, holding its pose for the return. A flat black
   bar would make the phone's stage a picture in a box; this makes it a picture on a stage. */
#film-plate.fp-letterbox { background:
  radial-gradient(140% 90% at 50% 45%, rgba(3,5,9,.72) 0%, rgba(3,5,9,.88) 62%, rgba(3,5,9,.96) 100%); }
#film-plate.fp-letterbox img, #film-plate.fp-letterbox video { object-fit: contain; }
/* the designed vignette: the corners fall away so the text band reads against any picture */
#film-plate.fp-stage::after { content: ''; position: absolute; inset: 0; pointer-events: none;
  z-index: 1; background:
    radial-gradient(120% 85% at 50% 42%, rgba(0,0,0,0) 42%, rgba(3,5,9,.30) 74%, rgba(3,5,9,.66) 100%),
    linear-gradient(to top, rgba(3,5,9,.62) 0%, rgba(3,5,9,0) 34%); }
/* GHOST keeps the blend's own dress (the ghost variants below paint it) and never letterboxes:
   a blend has no edges to letterbox against — P3, "the blend is aspect-free". */
#film-plate.fp-ghost img, #film-plate.fp-ghost video {
  filter: grayscale(0.2) sepia(0.05) contrast(1.08); }
/* THE GHOST MIRROR (2026-09-02): fills #film-plate exactly like the picture above it, painted
   FIRST so variant b's mix-blend-mode has real ground to read from inside this same stacking
   context (js/film.js drawGhostMirror() — see the note on plate.innerHTML). Never itself
   blended, never itself visible on its own: the picture is full-bleed and always paints over
   it whole; this is backdrop only. */
.fp-mirror { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
/* ══ ONE SCALE FOR THE THREE CARD VOICES (instrument pass 4, 2026-08-19, item 7) ═══════════
   Founder, 2026-08-19: "the heavy black border behind the counts is a bit excessive. I think
   the typography needs another pass."
   The well was lightened and the count's weight dropped in the same hour; this finishes the
   job. THE DEFECT WAS TWO SCALES: the base rule sized the number at clamp(30px, 7.2vw, 80px)
   and the film-mode rule re-sized the SAME element at clamp(34px, 8.6vw, 96px) — so the count
   grew when a film declared a typeface and the three voices no longer belonged to one system.
   Now every size on the card is ONE token, declared once here; film mode changes the FAMILY
   and multiplies the whole scale by --type-scale, and changes nothing else. Restraint is the
   point (the doctrine's "few, large, slow"): three sizes, one tracking, one footnote. */
#film-card { position: fixed; left: 50%; top: 34%; transform: translate(-50%,-50%); z-index: 30;
  text-align: center; opacity: 0; pointer-events: none; isolation: isolate;
  --fc-scale: 1;
  --fc-title:   clamp(29px, 4.9vw, 46px);   /* the chapter's own name */
  --fc-number:  clamp(34px, 8.2vw, 88px);   /* the figure AT the count moment */
  --fc-quote:   clamp(22px, 3.3vw, 31px);   /* an attributed line */
  --fc-intertitle: clamp(23px, 3.4vw, 34px); /* the silent-film sentence (B2) */
  --fc-eyebrow: clamp(10.5px, 1.05vw, 12px);
  --fc-attr:    clamp(9.5px, .95vw, 10.5px);
  --fc-track:   .30em;                      /* one whisper tracking for eyebrow AND attribution */
}
/* ══ TEXT ZONE EXCLUSIVITY (instrument pass 2, 2026-08-18) ═════════════════════════════════
   THE CARD CARRIES ITS OWN SCRIM. A card is the one claim on the frame, and it has to read
   over ANY ground — the founder's Absurdia frame set a cream serif quote over sunlit white
   rooftops at z18. A soft radial well behind the type (never a box: the edges fall to nothing)
   buys the contrast without putting a panel on the stage. Mirrored in edl/stage.mjs
   STAGE.TEXT_ZONES — the law, the door and the gate change together or not at all. */
#film-card::before { content: ''; position: absolute; left: 50%; top: 50%; z-index: -1;
  width: calc(100% + 200px); height: calc(100% + 130px); transform: translate(-50%,-50%);
  pointer-events: none;
  background: radial-gradient(60% 58% at 50% 50%, rgba(4,6,10,.78) 0%, rgba(4,6,10,.60) 46%,
    rgba(4,6,10,.28) 74%, rgba(4,6,10,0) 100%); }
/* THE SENTENCE CAPTION IS THE ONLY SURFACE ALLOWED BESIDE A CARD, and the two never share a
   zone: while a card is up its box is CAPPED so it can never descend into the caption band.
   (The caption does not move DOWN to make room — a first cut dropped it to bottom 64 and the
   after-frame showed it running under the transport bar at bottom 26. The band's own floor is
   the clear line.) Everything else — cite block, locator, light label — is hidden outright. */
/* ══ THE HEAVY BLACK BORDER, FOUND (instrument pass 4, 2026-08-19) ═════════════════════════
   Founder: "the heavy black border behind the counts is a bit excessive." It was never a
   border, and it was never the gradient's colour — it was THIS LINE. `overflow: hidden` (added
   to keep a tall card out of the caption band) clipped the card's own scrim, a 980×442 soft
   radial, down to the 640×222 text box: a gradient with its falloff cut away is a rectangle
   with hard edges, and every attempt to fix it by lightening the colour only made a lighter
   rectangle. Measured live at t=123.7s before touching anything.
   `overflow: clip` + a clip margin caps the CONTENT exactly as before and lets the scrim's
   falloff out. Where the margin is not supported the well matters more than the cap — the type
   zone gate already refuses a card tall enough to need it. */
body.film-card-up #film-card { max-height: calc(100vh - 320px); overflow: clip; overflow-clip-margin: 260px; }
@supports not (overflow-clip-margin: 1px) {
  body.film-card-up #film-card { overflow: visible; }
}
/* THE CARD IS THE ONE CLAIM (P1: "text gets the stage alone; both footages dim; no competing
   plate"). The cite hides with the locator — and film.js now dims the map AND fades any live
   plate under the card, which the 2026-08-18 pass never did: the founder's phone frame at 2:27
   set $360,000 over a live satellite close with the caption band and the ledger both printing
   underneath it. STAGE.GRAMMAR.CARD_DIM carries the depth; §5 leaves black-vs-vignette open. */
body.film-card-up #film-caption .fc-cite,
body.film-card-up #film-locator, body.film-card-up #film-leader { visibility: hidden; }
/* THE EYEBROW is a whisper with a spine: 500, not 400 — at .3em tracking in gold a 400 mono
   dissolves into the ground it is supposed to sit above, and bolder than 500 competes with the
   count itself. One size for all three voices; the number no longer gets its own. */
#film-card .fc-eyebrow { font: 500 calc(var(--fc-eyebrow) * var(--fc-scale))/1.2 'Space Mono', monospace;
  letter-spacing: var(--fc-track); text-transform: uppercase; color: #f5c469; margin-bottom: 14px; }
#film-card .fc-title { font: 400 calc(var(--fc-title) * var(--fc-scale))/1.15 'Playfair Display', serif;
  color: #f2ead8; text-shadow: 0 2px 18px rgba(0,0,0,.7); }
/* THE ATTRIBUTION LINE is the footnote register, and it says so by being quieter than the
   eyebrow in every channel: smaller, un-gold, tracked the same. It is a source, not a claim. */
#film-card .fc-attr { font: 400 calc(var(--fc-attr) * var(--fc-scale))/1.5 'Space Mono', monospace;
  letter-spacing: var(--fc-track); text-transform: uppercase; color: rgba(218,225,234,.52);
  margin-top: 18px; }
#film-card .fc-attr:empty { display: none; }
/* ══ TYPOGRAPHIC BEATS (the director's instrument, 2026-08-17) ═════════════════════════════
   NUMBER — the figure AT the count moment. The chapter stops to count; the number is the
   frame's subject, not a subtitle under it. Mono, tight, big enough to be read as a fact.
   QUOTE — an attributed line: the words in the serif register, the source in the slug one.
   Absent `kind` = the shipped title card, unchanged. */
/* the figure fits the FRAME, not the desktop (phone screening 2026-08-17: "20,000 FAMILIES"
   ran off both edges of a 390px cut). Scales with the viewport, caps at the desktop size. */
#film-card.fc-number { top: 44%; max-width: 92vw; }
#film-card.fc-number .fc-title { font: 400 calc(var(--fc-number) * var(--fc-scale))/1.08 'Space Mono', monospace;
  letter-spacing: .04em; color: #f5e7c8; text-shadow: 0 2px 24px rgba(0,0,0,.75);
  overflow-wrap: anywhere; }
/* THE COUNT'S WELL IS LIGHT (founder 2026-08-19: "the heavy black border behind the counts is a
   bit excessive"): a number sits in a faint well, not a black box — the figure is the subject,
   the world stays visible behind it. The quote keeps the deeper scrim (a line of serif over a
   bright ground needs it). */
/* the well reaches FURTHER and lands SOFTER: the same contrast under the glyphs, no edge
   anywhere near the figure. A well you can find the border of is a box. */
#film-card.fc-number::before { width: calc(100% + 340px); height: calc(100% + 220px);
  background: radial-gradient(66% 64% at 50% 50%, rgba(4,6,10,.46) 0%, rgba(4,6,10,.30) 44%,
    rgba(4,6,10,.11) 72%, rgba(4,6,10,0) 100%); }
#film-card.fc-number .fc-eyebrow { margin-bottom: 18px; color: rgba(245,196,105,.9); }
#film-card.fc-quote { top: 42%; max-width: min(62vw, 760px); }
#film-card.fc-quote .fc-title { font: italic 400 calc(var(--fc-quote) * var(--fc-scale))/1.45 'Playfair Display', serif;
  color: #f2ead8; }
#film-card.fc-quote .fc-eyebrow { margin-bottom: 16px; }
/* ══ THE INTERTITLE (THE BALLAD FILM B2, rewritten 2026-09-03 after the B7 verdict) ════════
   The whisper law — "a name and a date, almost never a sentence" — optimised reverence over
   comprehension and the film came back "no cogent narrative". The silent-film answer is a
   SEQUENCE of terse declarative sentences, and a sentence needs a register of its own: the
   plaque's mono uppercase is for names and dates, and setting a sentence in it would turn the
   telling into a monument. So the intertitle is UPRIGHT SERIF — the storybook voice, the
   register the title card already speaks in — sized down from the chapter's own name (a
   sentence is not a title) and given the one thing the base card never needed: a measure.
   An unbounded 46px line ran the width of the body; text wants a column.
   Sits lower than the title because it is read, not announced, and it never carries an
   eyebrow: an intertitle is the whole claim, with nothing above it.
   ── `width: max-content` IS WHAT MAKES THE MEASURE REAL, AT EVERY VIEWPORT ────────────────
   MEASURED, both viewports: the box came back 640px at 1280 and 195px at 390 — exactly half
   the frame each time, whatever `max-width` said. `#film-card` is `position: fixed; left: 50%`
   with NO `right`, so for a `width: auto` box the shrink-to-fit AVAILABLE width is the
   containing block minus the left offset — half the viewport, always. The transform re-centres
   the box afterwards, which is why nobody saw it: the card looks centred, it is just
   permanently half as wide as the frame, and `min(68vw, 820px)` could never bind.
   `width: max-content` restores shrink-to-fit against the real cap, so the authored measure is
   the one that renders. Phone narrows the cap to 86vw below (a 68vw column on a 390px frame is
   a ribbon); nothing else about the card moves.
   SCOPED TO THE INTERTITLE ON PURPOSE. The same geometry caps `number` and `quote` at 50vw,
   and the plaque's 92vw has never actually applied — but those registers are on the founder's
   own screened frames and re-wrapping "450 MULBERRY STREET" is a taste change, not a bug fix.
   Filed for the filmmaker lane; the register introduced today gets it right from the start. */
#film-card.fc-intertitle { top: 41%; width: max-content; max-width: min(68vw, 820px); }
#film-card.fc-intertitle .fc-title { font: 400 calc(var(--fc-intertitle) * var(--fc-scale))/1.34 'Playfair Display', serif;
  color: #f2ead8; letter-spacing: .005em; text-shadow: 0 2px 20px rgba(0,0,0,.78); }
#film-card.fc-intertitle .fc-eyebrow:empty { display: none; }
/* the sentence's well reaches wider than the title's — a two-line measure needs ground under
   all of it, and the falloff still lands at nothing (never a box: instrument pass 4). */
#film-card.fc-intertitle::before { width: calc(100% + 260px); height: calc(100% + 170px);
  background: radial-gradient(64% 60% at 50% 50%, rgba(4,6,10,.74) 0%, rgba(4,6,10,.56) 46%,
    rgba(4,6,10,.24) 74%, rgba(4,6,10,0) 100%); }
/* ══ ONE TEXT BAND (THE PLATE GRAMMAR P4, founder-ratified 2026-09-02) ═════════════════════
   ALL running type lives here: the narration caption, then the plate's cite line
   (caption · credit, never truncated to make room for chrome). The locator owns the top edge;
   the number card is the sole surface allowed to print over footage, because it IS the beat.
   What this kills: the fixed bottom:206/188 cite column (which needed a compile gate to keep
   it off the caption), the corner credit that collided with the film bar, and the standing
   attribution rail that read as a plate credit for a plate that was not on screen.
   The band's floor clears the hairline; it LIFTS (transform, never a reflow) while the awake
   player row is up, and rides the SEAM on a portrait counterpoint. */
#film-caption { position: fixed; left: 50%; bottom: 96px; transform: translateX(-50%); z-index: 28;
  max-width: 76%; text-align: center; font: 14px/1.5 'Playfair Display', serif;
  color: rgba(236,240,245,.95); text-shadow: 0 1px 6px #000, 0 0 22px rgba(0,0,0,.7);
  opacity: 0; transition: opacity .5s ease, bottom .3s ease; pointer-events: none; }
/* THE CITE RIDES ITS PICTURE (P5): this element is written ONLY by showPicture(), on the same
   frame the bitmap mounts, and cleared on the same frame it leaves. No credit without its
   exhibit. It wraps rather than ellipsizes — a truncated attribution is not an attribution. */
#film-caption .fc-cite { margin-top: 9px; font: italic 12.5px/1.5 'Playfair Display', serif;
  color: rgba(236,240,245,.8); text-wrap: pretty; }
#film-caption .fc-cite:empty { display: none; }
#film-caption .fc-cite .fc-cred { font: 9px/1.4 'Space Mono', monospace; letter-spacing: .12em;
  text-transform: uppercase; color: rgba(218,225,234,.6); }
/* the band lifts clear of the awake player row (which is a hairline plus one text row, never
   a box — SPEC-PREAUTHORED §8b; nothing here becomes furniture) */
body:has(#film-bar.awake) #film-caption { bottom: 130px; }
/* THE CITE RIDES ITS PLATE, EVEN IN THE MARGIN (founder 2026-09-09): a MARGIN plate (the
   glancing citation, ~⅓-width, docked at the right rail — see fp-margin above) is a small
   picture standing at the frame's edge, not a record filling it — so ONE TEXT BAND's usual
   dead-centre bottom position put its own credit under bare Earth, a full third of the frame
   away from the photograph it was crediting (the founder's "mid-screen instead of under the
   plate on the right"). Scoped to when the band is carrying ONLY the plate's cite — no
   narration sharing it (:not(:has(.fc-text:not(:empty))), STAGE/COUNTERPOINT/GHOST already
   fill enough of the frame that centred reads fine and is left alone): the band borrows the
   plate's own right edge and width, so the credit sits directly under the picture that earned
   it — the SLIDE caption-bar idiom, same idiom pins.js already keeps for a pinned photograph's
   own cite (.fp-pin-cite). */
body:not(.film-portrait):has(#film-plate.fp-margin) #film-caption:not(:has(.fc-text:not(:empty))) {
  left: auto; right: 6vw; transform: none; text-align: right;
  max-width: calc(var(--fp-band) * 100vw);
}
/* PORTRAIT: the band sits above the phone's own safe area, and on a stacked COUNTERPOINT it
   rides the seam between the record's band and the Earth's — one band, at the joint. */
body.film-portrait #film-caption { bottom: max(env(safe-area-inset-bottom, 0px), 12px);
  bottom: calc(76px + env(safe-area-inset-bottom, 0px)); max-width: 86%; }
body.film-portrait:has(#film-bar.awake) #film-caption { bottom: calc(112px + env(safe-area-inset-bottom, 0px)); }
body.film-portrait.film-reg-counterpoint #film-caption { bottom: calc((1 - var(--fp-band, .66)) * 100vh + 10px); }
/* CAPTION DISCIPLINE (STAGE LAWS: the subtitle law, founder's Hearst 0:58 exhibit) — chunk
   mode: ≤2 lines of ~30 chars (width mirrors STAGE.CAPTION LINE_CHARS × TYPE_ZONES charPx),
   two stacked spans crossfaded pure-f(t) by film.js (no CSS transition fighting the clock);
   the speaker eyebrow (letters films) rides the first chunk of a turn only.
   THE CAPTION TIGHTENS (founder ruling 2026-09-02): full transcript kept, wall killed —
   17px→14px type, .18s→.12s show/hide fade (the house 120ms step; the chunk-to-chunk
   crossfade itself is driven pure-f(t) in film.js off STAGE.CAPTION.FADE_S, also 0.12). */
#film-caption.fc-chunks { max-width: min(76%, 400px); transition: opacity .12s ease; }
/* the BAND fades as a whole; the caption ROW keeps its own fade so a cite can stand while the
   sentence between two chunks is momentarily nothing (P4: one band, two rows, two envelopes) */
#film-caption .fc-text { transition: opacity .5s ease; }
#film-caption.fc-chunks .fc-text { transition: none; }   /* chunk fades are pure f(t) in film.js */
#film-caption.fc-chunks .fc-stack { display: grid; justify-items: center; align-items: end; }
#film-caption.fc-chunks .fc-stack > span { grid-area: 1 / 1; opacity: 0; }
#film-caption .fc-speaker { font: 10.5px 'Space Mono', monospace; letter-spacing: .28em;
  text-transform: uppercase; color: #f5c469; margin-bottom: 6px; opacity: 0;
  text-shadow: 0 1px 4px #000; }
/* THE LOCATOR + THE LIGHT LABEL (founder 2026-08-09) — the eyebrow register, on the map:
   Space Mono caps, house gold, small; perched above the kindled geometry / named subject.
   Opacity is driven per-frame by the organ's envelope — no CSS transition fighting it. */
#film-locator { position: fixed; z-index: 27; transform: translate(-50%, -100%);
  font: 10.5px 'Space Mono', monospace; letter-spacing: .28em; text-transform: uppercase;
  color: #f5c469; text-shadow: 0 1px 4px #000, 0 0 14px rgba(0,0,0,.75);
  white-space: nowrap; opacity: 0; pointer-events: none; padding-bottom: 7px; }
/* DOTS DIE (STAGE LAWS 2026-08-14): the locator anchors by TYPOGRAPHY at the place — no dot,
   no pin. A small tick is permitted ONLY at globe scale (.fl-globe, set by film.js under
   STAGE.LOCATOR_TICK_MAX_Z); ambiguity earns the hairline leader (#film-leader) instead. */
/* LIGHT WEIGHT (2026-08-17): `style.label_size` on a light row — the slug register at three
   weights. Absent = the house 10.5px eyebrow, unchanged. */
#film-locator.fl-s { font-size: 9px; letter-spacing: .24em; }
#film-locator.fl-m { font-size: 13px; letter-spacing: .3em; }
#film-locator.fl-l { font-size: 18px; letter-spacing: .34em; font-weight: 700; }
#film-locator.fl-globe::after { content: ''; position: absolute; left: 50%; bottom: 2px;
  width: 1px; height: 7px; margin-left: -0.5px;
  background: rgba(245,196,105,.85); box-shadow: 0 0 5px rgba(245,196,105,.5); }
#film-leader { position: fixed; z-index: 27; width: 1px; opacity: 0; pointer-events: none;
  background: linear-gradient(to bottom, rgba(245,196,105,.8), rgba(245,196,105,.15));
  transform-origin: top center; }
/* ══ THE HAIRLINE PLAYER (founder 2026-08-24: the bar was the one element behaving like a
   website). IDLE: a 2px full-bleed gold progress line at the frame's bottom edge — nothing
   else. AWAKE (.awake, pointer intent / paused): the line thickens, the thumb appears, one
   unboxed text row fades in over a breath of scrim. No card, no pill, no border. ═════════ */
#film-bar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 32;
  display: flex; flex-direction: column; align-items: stretch; gap: 0; padding: 0; }
#film-bar::before { /* the breath of scrim under the awake row — never a box */
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 92px;
  background: linear-gradient(to top, rgba(4,6,10,.52), rgba(4,6,10,0));
  opacity: 0; transition: opacity .45s ease; pointer-events: none; }
#film-bar.awake::before { opacity: 1; }
#film-bar-row { display: flex; align-items: baseline; gap: 14px; padding: 0 18px 10px;
  opacity: 0; transform: translateY(4px); transition: opacity .35s ease, transform .35s ease;
  pointer-events: none; position: relative; }
#film-bar.awake #film-bar-row { opacity: 1; transform: none; pointer-events: auto; }
#film-bar button { background: none; border: none; color: rgba(245,196,105,.92); font-size: 13px;
  cursor: pointer; padding: 10px 6px; line-height: 1; text-shadow: 0 1px 4px rgba(0,0,0,.7); }
#film-bar #film-quit { margin-left: auto; color: rgba(218,225,234,.55); font-size: 12px; }
#film-bar #film-quit:hover { color: rgba(218,225,234,.9); }
#film-bar #film-time { font: 10px 'Space Mono', monospace; letter-spacing: .08em;
  color: rgba(218,225,234,.62); text-shadow: 0 1px 4px rgba(0,0,0,.7); }
#film-bar #film-title { font: italic 13px 'Playfair Display', serif;
  color: rgba(236,240,245,.88); text-shadow: 0 1px 5px rgba(0,0,0,.75); }
/* ══ ONE BAND OWNS THE EYEBROW (founder screenshot, 2026-09-09, Ulsoor) ═══════════════════════
   Neither the hairline's title nor the caption band's eyebrow paints an opaque backing, so
   waking the hairline while THE ONE BAND (2026-09-08) was speaking interleaved two texts
   letter-for-letter — "NOW PLAYING — ULSOOR ANGLO-INDIAN QUARTER" printed under the hairline's
   own italic "Ulsoor Anglo-Indian Quarter", and the hairline's clock ("0:09 / 7:08") bled its
   digits through the eyebrow's own word. The band is the one place a chapter's identity is
   spoken while it plays — the hairline keeps every control (play/pause, scrub, quit) but stops
   naming the film a second time, and the whole row lifts clear of the band's footprint so its
   clock and its icons never share a pixel with the band's letters either. The running
   attribution ledger (#film-rail, also awake-gated) rests for the same reason: a credit line
   has no business under the band's own prose. */
body:has(#caption-band.cap-on) #film-bar #film-title { display: none; }
body:has(#caption-band.cap-on):has(#film-bar.awake) #film-bar-row { transform: translateY(-96px); }
body:has(#caption-band.cap-on):has(#film-bar.awake) #film-rail { opacity: 0; }
/* the line itself: full-bleed range, restyled to a hairline; thumb only when awake */
#film-bar input[type=range] { -webkit-appearance: none; appearance: none; width: 100%;
  height: 2px; margin: 0; background: transparent; cursor: pointer; display: block; }
#film-bar input[type=range]::-webkit-slider-runnable-track { height: 2px;
  background: linear-gradient(to right,
    rgba(245,196,105,.85) var(--film-progress, 0%), rgba(218,225,234,.16) var(--film-progress, 0%)); }
#film-bar.awake input[type=range]::-webkit-slider-runnable-track { height: 4px; }
#film-bar input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 0; height: 0; }
#film-bar.awake input[type=range]::-webkit-slider-thumb { width: 11px; height: 11px;
  border-radius: 50%; background: #f5c469; box-shadow: 0 0 6px rgba(245,196,105,.55);
  margin-top: -3.5px; }
#film-bar input[type=range]::-moz-range-track { height: 2px; background: rgba(218,225,234,.16); }
#film-bar input[type=range]::-moz-range-progress { height: 2px; background: rgba(245,196,105,.85); }
#film-bar.awake input[type=range]::-moz-range-track,
#film-bar.awake input[type=range]::-moz-range-progress { height: 4px; }
#film-bar input[type=range]::-moz-range-thumb { width: 0; height: 0; border: none; background: transparent; }
#film-bar.awake input[type=range]::-moz-range-thumb { width: 11px; height: 11px;
  border-radius: 50%; background: #f5c469; border: none; box-shadow: 0 0 6px rgba(245,196,105,.55); }
/* generous touch target despite the thin visual */
#film-bar input[type=range] { padding: 14px 0 6px; background-clip: content-box; }
/* ══ THE ATTRIBUTION LEDGER STOPS RUNNING (THE PLATE GRAMMAR P5, 2026-09-02) ═══════════════
   This element is the "credit printed with no picture" the grammar convicted: the film's WHOLE
   attribution list, joined and ellipsized, standing bottom-left for the entire chapter in the
   same mono smallcaps a plate credit wears. On harbor-01 it printed the National Archives and
   the Ravenna credit together while neither photograph was on screen — a citation with no
   exhibit, which is the one class of defect this lane exists to prevent.
   It is NOT deleted (spec §6: the rail renders from sidecars, and grounds and cues have no
   picture to ride). It stops being a RUNNING surface: it comes up with the hand, when the
   player row is awake and the viewer is asking what they are looking at, and it prints at the
   film's end. Every plate's own credit now rides its own picture, in the text band. */
#film-rail { position: fixed; left: 14px; bottom: 24px; z-index: 29; max-width: 46vw;
  opacity: 0; transition: opacity .35s ease; pointer-events: none; }
#film-rail .fr-line { font: 8.5px/1.5 'Space Mono', monospace; letter-spacing: .08em;
  text-transform: uppercase; color: rgba(218,225,234,.38);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
#film-rail .fr-roll { display: none; }
body:has(#film-bar.awake) #film-rail { opacity: 1; }
/* ══ THE CREDIT ROLL (founder frame-by-frame 2026-09-02) ══════════════════════════════════════
   The rights DUTY is why this surface exists: every source prints at the end, in full. The FORM
   was the defect. `white-space: normal` on a 72vw joined string turned ten citations into a
   fifteen-line grey wall that ran up through the end title and out over the world (t309/t315).
   A credit roll is a COLUMN: one source per row, set small and measured, centred under the
   title, with the film's own dark held behind it (film.js holds the night veil past the last
   frame — a roll happens on the film's ground, not the world's). If a film has more sources
   than the frame has room, the column scrolls; nothing is dropped, and nothing is ellipsized. */
body.film-ended #film-rail { opacity: 1; left: 50%; right: auto; transform: translateX(-50%);
  bottom: 66px; width: min(660px, 82vw); max-width: none; pointer-events: auto; }
body.film-ended #film-rail .fr-line { display: none; }
body.film-ended #film-rail .fr-roll { display: block; max-height: 46vh; overflow-y: auto;
  overscroll-behavior: contain; text-align: center;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 14px, #000 calc(100% - 14px), transparent 100%);
  mask-image: linear-gradient(to bottom, transparent 0, #000 14px, #000 calc(100% - 14px), transparent 100%); }
#film-rail .fr-head { font: 9px 'Space Mono', monospace; letter-spacing: .34em;
  text-transform: uppercase; color: rgba(245,196,105,.72); margin-bottom: 13px; }
#film-rail .fr-row { font: 9.5px/1.75 'Space Mono', monospace; letter-spacing: .06em;
  color: rgba(218,225,234,.5); text-wrap: pretty; padding: 3px 0; }
body.film-portrait.film-ended #film-rail { width: 88vw; bottom: calc(56px + env(safe-area-inset-bottom, 0px)); }
/* ══ JALEBI EXPERIMENT (2026-08-13) — THE SEQUENCE SURFACE + THE GHOST CUTOUT ═══════════ */
/* THE SEQUENCE (the Boyle cut) is a STAGE that snap-cuts — same geometry, same aspect law, the
   cut instead of the dissolve. Its cite rides ONE TEXT BAND like every other picture's. */
#film-seq { position: fixed; inset: 0; z-index: 25; opacity: 0; pointer-events: none; overflow: hidden; }
#film-seq img, #film-seq video { width: 100vw; height: 100vh; object-fit: cover; display: block;
  filter: grayscale(0.12) sepia(0.04) contrast(1.06); transform-origin: 50% 45%; }
#film-seq.fp-letterbox { background:
  radial-gradient(140% 90% at 50% 45%, rgba(3,5,9,.72) 0%, rgba(3,5,9,.88) 62%, rgba(3,5,9,.96) 100%); }
#film-seq.fp-letterbox img, #film-seq.fp-letterbox video { object-fit: contain; }
/* THE GHOST CUTOUT — full-bleed as a DESIGNED composite (founder: "retain the cutout style
   ghostly overlay feel instead of straight up opaque picture — lean retro futuristic, not
   web 1.0"). The house anchors: mono locator type + gold accents — every variant carries a
   gold hairline so the cover reads as the house's own instrument, not a pasted photo.
   Captions/credits ride z-index:1 above the scrim. */
/* variant a — the edge scrim: the image floats inside a dark frame over the darkened map */
.fp-ghost-a::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;
  background:
    linear-gradient(to right, rgba(4,6,10,.85), transparent 9%, transparent 91%, rgba(4,6,10,.85)),
    linear-gradient(to bottom, rgba(4,6,10,.78), transparent 12%, transparent 86%, rgba(4,6,10,.9));
  box-shadow: inset 0 0 0 1px rgba(245,196,105,.22), inset 0 0 120px 30px rgba(2,3,10,.5); }
/* variant b — luminosity ghost: the map surfaces only through the image's shadow regions
   (per-channel lighten; film.js drives the IMAGE's opacity so the blend never isolates) */
.fp-ghost-b img, .fp-ghost-b video { mix-blend-mode: lighten; }
.fp-ghost-b::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;
  box-shadow: inset 0 0 0 1px rgba(245,196,105,.16); }
/* variant c — duotone plate (ink + house gold) over the dimmed map. Selectors carry the
   id so they outweigh the surfaces' own #-scoped base filters. */
#film-seq.fp-ghost-c img, #film-plate.fp-ghost-c.fp-ghost img, #film-plate.fp-ghost-c.fp-stage img {
  filter: grayscale(1) sepia(.6) hue-rotate(-10deg) saturate(1.5) contrast(1.08) brightness(.96); }
#film-seq.fp-ghost-c video, #film-plate.fp-ghost-c.fp-ghost video, #film-plate.fp-ghost-c.fp-stage video {
  filter: grayscale(1) sepia(.55) hue-rotate(-10deg) saturate(1.5) contrast(1.06); }
.fp-ghost-c::after { content: ''; position: absolute; inset: 0; pointer-events: none; z-index: 0;
  background: radial-gradient(ellipse at center, transparent 55%, rgba(2,3,10,.5));
  box-shadow: inset 0 0 0 1px rgba(245,196,105,.25); }

/* the film owns its stage — corpus DOM labels stand down behind the door */
body.film-mode .lbl-city, body.film-mode .lbl-hood { display: none; }
/* ══ CINEMA MODE (STAGE LAWS 2026-08-14, founder-ruled — supersedes the 08-12 mic dismissal):
   during film playback the concierge COLLAPSES BEHIND THE MIC — desk text, INSTRUMENTS, DIALS
   and the suggestion rail all leave the stage. WHAT PERSISTS: the balloon (always grabbable —
   the hand law's own instrument), THE MIC (its tap now pauses the clock and opens the desk),
   and the scrub bar. Full-bleed stage, nothing but the film's own type. */
body.film-mode #concierge {
  opacity: 0; transform: scale(0.94);
  transition-duration: var(--beat-half), var(--beat-half);
}
body.film-mode #concierge > * { pointer-events: none; }
body.film-mode #hud, body.film-mode #dials, body.film-mode #bench,
body.film-mode #masthead, body.film-mode #plate-card { display: none !important; }
/* THE MIC-TAP PAUSE: film-desk re-seats the concierge over the HELD frame (the clock is
   paused); the play button collapses it again and glides the camera home. */
body.film-mode.film-desk #concierge {
  opacity: 1; transform: scale(1);
  transition-duration: var(--beat-fast), var(--beat-fast);
}
body.film-mode.film-desk #concierge > * { pointer-events: auto; }

/* ══ THE MIXTAPE TAKES THE FRAME — the house chrome stands back (2026-09-11) ══════════════════
   While the pressed offline tape owns the frame (`film-tape-up`, set by film.js's `tape` verb
   for exactly the length of its window) the beat must read as a listener's own phone showing
   the mixtape — a desk leaf printing across the cassette is the house talking over it. The
   film's OWN surfaces stay: the caption band and the card are the film speaking, and the
   pitch's "NO SIGNAL NEEDED" card is authored to land on the tape. This is a refinement of the
   leaf's mid-film furniture ruling for a ~10 s beat, not an overturn — it lasts as long as the
   window and not one frame longer.
   THE FADE ITSELF IS NOT DECLARED HERE, ON PURPOSE: film.js drives these surfaces' opacity from
   the tape's own 1.4 s envelope, so the chrome leaves and returns on the crossfade itself and a
   PAUSED SEEK into the window lands it at the right opacity — the door's night-veil law (never
   a CSS transition fighting the clock), and the leaf's own (1,4,1) seat rule owns the
   `transition` shorthand, which a declared fade would have to seize (killing the leaf's
   bottom-glide as it tracks the caption lane). What CSS owns here is the TAPS. */
body.film-tape-up #concierge,
body.film-tape-up .brail { pointer-events: none !important; }

/* ══ MAP_GRADE PROTOTYPES (STAGE LAWS 2026-08-14 — for the founder's eye, NOT defaulted) ═════
   The era-veil lever applied TO THE MAP so the ground belongs to the same film as the graded
   plates. Two strengths, set by film.js from treatments.map_grade (?grade= overrides):
   · whisper — 5-10% desat + a breath of the plate stock's tone (retro, barely-there)
   · signature — strong duotone ground (ink + house gold), the ghost-c dress on the world */
body.film-grade-whisper #map canvas {
  filter: saturate(0.9) sepia(0.07) contrast(1.04) brightness(0.97); }
body.film-grade-signature #map canvas {
  filter: grayscale(1) sepia(0.62) hue-rotate(-9deg) saturate(1.45) contrast(1.06) brightness(0.9); }

/* ── THE FILM INDEX (founder 2026-08-14: "a list of available films with a simple string
   search box") — the landing card. House dress: film ground, Playfair titles, Space Mono
   eyebrow, gold only for what is alive (the తెలుగు tag, a row under the hand). It sits
   over the map but UNDER the desk band's corner — the concierge stays reachable. */
#film-index { position: fixed; inset: 0; z-index: 40; display: flex; align-items: center;
  justify-content: center; pointer-events: none; }
.fi-panel { pointer-events: auto; width: min(560px, calc(100vw - 32px));
  max-height: min(72vh, 640px); display: flex; flex-direction: column;
  background: var(--panel); border: 1px solid var(--hair); backdrop-filter: blur(10px);
  padding: 22px 24px 16px; }
.fi-close { position: absolute; transform: translate(243px, -8px); align-self: center;
  border: none; font-size: 16px; line-height: 1; padding: 6px 8px; color: var(--ink-faint); }
.fi-close:hover { color: var(--bright); }
.fi-eyebrow { font-family: 'Space Mono', monospace; font-size: 10px; letter-spacing: 0.22em;
  color: var(--ink-faint); margin-bottom: 14px; }
.fi-search { background: none; border: none; border-bottom: 1px solid var(--hair);
  color: var(--ink); font: 16px 'Playfair Display', Georgia, serif; padding: 4px 0 8px;
  outline: none; width: 100%; }
.fi-search::placeholder { color: var(--ink-faint); font-style: italic; }
.fi-search:focus { border-bottom-color: var(--ink-faint); }
.fi-list { overflow-y: auto; margin-top: 6px; flex: 1; }
.fi-row { display: flex; align-items: baseline; justify-content: space-between; gap: 16px;
  padding: 10px 2px; border-bottom: 1px solid var(--hair); text-decoration: none; }
.fi-row:last-child { border-bottom: none; }
.fi-title { font: 17px 'Playfair Display', Georgia, serif; color: var(--ink); }
.fi-row:hover .fi-title { color: var(--amber); }
.fi-lang { font: 11px -apple-system, sans-serif; color: var(--amber); margin-left: 6px; }
.fi-meta { font-family: ui-monospace, Menlo, monospace; font-size: 10.5px;
  color: var(--ink-faint); white-space: nowrap; }
.fi-none { color: var(--ink-faint); font-style: italic; padding: 12px 2px; }
.fi-foot { font-family: 'Space Mono', monospace; font-size: 9.5px; letter-spacing: 0.08em;
  color: var(--ink-faint); margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--hair); }
.fi-search::-webkit-search-cancel-button { -webkit-appearance: none; } /* the blue OS × broke the ONE-gold rule */

/* ══ THE PINNED PHOTOGRAPH (instrument pass 3, 2026-08-18) — a picture standing in the world ══
   Doctrine #2. The card is a 1×1 px element that a projective matrix3d (public/js/pins.js)
   stretches onto the four screen points of a real world-space quad, so it has TRUE perspective
   and sits at the place, bearing and size the plate row authored. Everything below is the
   card's DRESS: a photograph in the world is a physical object — it has an edge, a mount, a
   shadow that says it stands somewhere, and it is lit by the same hour as the world it stands
   in. The one thing it must never look like is a UI panel (philosophy 2.4: "framed portrait
   pasted at 35% in the centre — never"). */
#film-pins { contain: strict; }
#film-pins .fp-pin { position: absolute; left: 0; top: 0; width: 1px; height: 1px;
  transform-origin: 0 0; opacity: 0; transition: opacity 420ms ease; will-change: transform, opacity; }
#film-pins .fp-pin-face { position: absolute; left: 0; top: 0; width: 1px; height: 1px;
  background: #0b0e14; overflow: hidden;
  /* the mount: a hairline of paper-white around the picture, and a drop that puts it in space */
  box-shadow: 0 0 0 0.018px rgba(238,232,220,.85), 0 0.05px 0.14px rgba(0,0,0,.62); }
#film-pins .fp-pin-face img { display: block; width: 1px; height: 1px; object-fit: cover;
  filter: grayscale(.14) sepia(.05) contrast(1.1) brightness(1.03); }
#film-pins .fp-pin-hair { stroke: #f5c469; stroke-width: 1; stroke-dasharray: 3 4; stroke-opacity: 0; }
#film-pins .fp-pin-cite { position: absolute; width: 240px; text-align: right; opacity: 0;
  transition: opacity 420ms ease; }
#film-pins .fp-pin-cap { font: italic 12.5px/1.35 'Playfair Display', Georgia, serif; color: #ece6da;
  text-shadow: 0 1px 6px rgba(0,0,0,.9); }
#film-pins .fp-pin-cred { font: 9px/1.4 'Space Mono', ui-monospace, monospace; letter-spacing: .09em;
  text-transform: uppercase; color: rgba(214,206,192,.62); text-shadow: 0 1px 5px rgba(0,0,0,.9);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* a card is silent while a CARD owns the frame — the type law reaches every surface */
body.film-card-up #film-pins .fp-pin-cite { visibility: hidden; }

/* ══ THE TYPE SYSTEM (instrument pass 3, 2026-08-18) — one designed system, three voices ══════
   Doctrine #6. Until now the film's words were three unrelated CSS rules that happened to use
   the same two font names. This is the system:

     WHISPER    the locator, the light label, the plate credit, the pin footnote.
                Small caps, wide tracking, never a sentence, never a headline.
     STATEMENT  the number card, the quote card. Big, alone, held for the count.
     TITLE      the title card. The film saying its own name.

   Three things make it a system rather than three rules: (1) every size is derived from ONE
   scale variable, so a film can be cast louder or quieter in one line; (2) every voice has an
   entrance and an exit of the same shape, so nothing ever pops; (3) the PHONE FLOOR is a floor,
   not a scale — a whisper on a 390px screen is still 10.5px, because below that it is decoration
   rather than information.

   CASTING is per film: `treatment.type: {face_set, voice_scale}` in the score puts a class on
   <body> and the faces change together. The sets are the cast in public/fonts/LICENCES.md. */
:root {
  --type-scale: 1;
  --type-serif: 'Playfair Display', Georgia, serif;
  --type-mono: 'Space Mono', ui-monospace, Menlo, monospace;
  --type-sans: 'Archivo', system-ui, sans-serif;
  --type-whisper-track: .22em;
}
/* THE CAST — one line per film, and the whole frame changes voice */
body.type-municipal { --type-serif: 'Archivo', system-ui, sans-serif; --type-whisper-track: .18em; }
body.type-record    { --type-serif: 'Courier Prime', ui-monospace, monospace; --type-mono: 'Courier Prime', ui-monospace, monospace; }
body.type-document  { --type-serif: 'Source Serif 4', Georgia, serif; }
body.type-telugu    { --type-serif: 'Noto Sans Telugu', 'Playfair Display', serif; }
body.type-devanagari{ --type-serif: 'Noto Sans Devanagari', 'Playfair Display', serif; }
/* THE THREE VOICES, ALL DERIVED FROM THE ONE SCALE — and now that is literally true: film mode
   sets the scale multiplier and the families, and never re-declares a size (instrument pass 4).
   A second clamp here is what made the count grow whenever a film named a typeface. */
body.film-mode #film-card { --fc-scale: var(--type-scale, 1); --fc-track: var(--type-whisper-track); }
body.film-mode #film-card .fc-title { font-family: var(--type-serif); }
body.film-mode #film-card.fc-number .fc-title { font-family: var(--type-mono); }
body.film-mode #film-card.fc-quote .fc-title { font-family: var(--type-serif); }
body.film-mode #film-card .fc-eyebrow, body.film-mode #film-card .fc-attr {
  font-family: var(--type-mono); }
body.film-mode #film-caption { font-family: var(--type-serif);
  font-size: max(12.5px, calc(14px * var(--type-scale))); }
body.film-mode #film-locator { font-family: var(--type-mono);
  letter-spacing: var(--type-whisper-track); }
body.film-mode #film-caption .fc-cite { font-family: var(--type-serif); }
body.film-mode #film-caption .fc-cite .fc-cred, body.film-mode #film-pins .fp-pin-cred {
  font-family: var(--type-mono); letter-spacing: calc(var(--type-whisper-track) * .45); }
body.film-mode #film-pins .fp-pin-cap { font-family: var(--type-serif); }
/* THE PHONE FLOOR — a size floor, never a scale-down. Below these a word is decoration. */
@media (max-width: 520px) {
  body.film-mode #film-caption { font-size: max(13px, calc(14px * var(--type-scale))); }
  body.film-mode #film-locator { font-size: max(10.5px, 11px); letter-spacing: .16em; }
  body.film-mode #film-caption .fc-cite { font-size: max(12px, 12.5px); }
  body.film-mode #film-caption .fc-cite .fc-cred, body.film-mode #film-pins .fp-pin-cred { font-size: max(9px, 9px); }
  /* THE PHONE FLOOR for the card's whisper registers — a floor, never a scale-down, and the
     tracking loosens as the size falls so the letters keep their air. */
  body.film-mode #film-card { --fc-eyebrow: 11px; --fc-attr: 9.5px; --fc-track: .20em; }
  /* THE INTERTITLE TAKES THE PHONE'S SHORT AXIS (P3, 2026-09-03). `width: max-content` is on
     the base register (it is not a phone bug — see the measure note there); this line only
     widens the CAP, because a 68vw column on a 390px frame is a ribbon and the long axis a
     phone has to spend is the vertical one. */
  #film-card.fc-intertitle { max-width: 86vw; }
}
/* ══ P6 · THE CHROME STANDS BACK ═══════════════════════════════════════════════════════════
   The balloon is a MAP instrument (js/balloon.js: the altitude rail, the hand law's own
   handle), and it is the last piece of desk chrome cinema mode keeps. At STAGE and at GHOST
   there is no map for it to instrument, so it goes; at COUNTERPOINT it yields to the Earth
   band — on a phone that band is the bottom of the frame, so the rail comes down to it. It is
   never destroyed and never loses its touch target, it steps out of the composition.
   (The film-reg-* classes are written by film.js off the live register — one source of truth
   with the band geometry above.) */
   The OPACITY half of this law is written inline by film.js (yieldChrome) — the rail is
   mounted and re-seated by js/balloon.js, and a cascade rule that has to win a race with
   another module's own writes is a rule that holds on most frames, not every one. What stays
   here is the SEAT: on a portrait counterpoint the Earth is the bottom band, so the rail comes
   down to it rather than floating over the record. */
body.film-portrait.film-reg-counterpoint .brail { top: auto !important; bottom: 8vh; transform: none; }

/* ──────── /css/desk.css ──────── */
/* ══ F8 THE DESK SPLIT — desk + mic dress, carved VERBATIM from quarry public/style.css
   (talkingmaps@luna-standalone 8dfb2fbe): the concierge panel + reveal dress (lines 90–212)
   and THE RING-AND-SPRING MIC (799–909). Per-organ sheets, THE PLANES §4. Selectors that
   reference organs not yet immigrated (balloon seat) are dead here and noted, not pruned. */
/* ══ LUNA — the concierge panel + reveal dress ══════════════════════════════════════════════ */
#hud.closed #hud-inner { display: none; }
#hud-toggle { position: absolute; top: 0; right: 0; background: var(--panel); border: 1px solid rgba(245,196,105,0.35); color: var(--amber); font: 10px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.22em; padding: 4px 8px; border-radius: 0; cursor: pointer; } /* ── 07 ── one gold, house mono, square (the 4px was dead under the global anyway) */
#hud.closed { width: auto; background: transparent; border: none; box-shadow: none; }

.lbl-rec { color: #f5c469; font-size: 12px; letter-spacing: 0.1em; text-transform: uppercase; opacity: 0.85; }
.lbl-rec-spot { font-size: 13.5px; opacity: 1; text-shadow: 0 0 12px rgba(245,196,105,0.55), 0 1px 4px rgba(0,0,0,0.9); }

/* ══ THE DESK — house language (founder 2026-08-07: "copy the styles of the real app…
   floating chat with a vignetted sidebar, just the last turn visible… minimalistic").
   Constitution: vignette not boxes · border-radius 0 everywhere (the film-print signature) ·
   Playfair = the editorial voice · Space Mono eyebrows at .22em · gold = alive right now,
   never decoration · no solid-filled accents (active states are gold TEXT). */
/* THE CORNER INSTRUMENT (founder 2026-08-12): "make the desk panel more compact". The desk is
   no longer a 440px COLUMN down the right edge — it is a compact panel that GROWS FROM THE
   BOTTOM-RIGHT CORNER, standing directly on the mic that opens it (the mic's 84px foot below).
   Narrower (380), tighter (gap 10, say 15.5px, a slimmer row), and origin-anchored to its own
   bottom-right so the entrance unfurls from the door rather than sliding in as a slab. */
#concierge { position: fixed; right: 0; bottom: var(--mic-foot); z-index: 12; width: 380px; max-width: 94vw;
  padding: 30px 22px 14px 34px; display: flex; flex-direction: column; gap: 10px;
  /* THE VIGNETTE HOLDS ON BRIGHT GROUND (founder screenshot, Bengaluru satellite 2026-08-11:
     the whole desk drowned — mic invisible, chips lost). Tuned on dark maps, it needed to
     carry daylight satellite too. Still a vignette, never a box. */
  background: linear-gradient(to left, rgba(6,8,12,.78), rgba(6,8,12,.46) 62%, rgba(6,8,12,0));
  /* THE DESK IS GLASS, NOT A WALL (2026-08-11): the column spans 440px of map, and its
     transparent vignette was eating every gesture over it — the globe refused the hand
     wherever the desk's empty air happened to be. The container passes the hand through;
     only the desk's actual instruments catch it. */
  pointer-events: none;
  /* THE DESK IS A PANEL WITH A DOOR (founder 2026-08-12): the mic TAPS it open and shut, so it
     must arrive and leave like every other chrome surface — never a pop. It GROWS FROM THE
     CORNER it stands in: transform-origin is its own bottom-right, one hair of scale under the
     opacity, entrances on the fast beat and exits on the half. */
  transform-origin: 100% 100%;
  opacity: 1; transform: scale(1);
  transition: opacity var(--beat-fast) var(--ease-chrome), transform var(--beat-fast) var(--ease-chrome);
}
#concierge > * { pointer-events: auto; }
/* THE DESK YIELDS TO THE HAND — raised by the balloon only on TIGHT layouts (a viewport too
   short to seat the whole voice column above the desk). A grip is a hand on the camera; the
   desk gives it the frame the same way the map does, and takes it back on release. */
body.desk-yield #concierge { opacity: 0.3; }
body.desk-yield #concierge > * { pointer-events: none; }
/* THE DOOR IS SHUT — the mic's tap verb. Voice keeps working; only the desk is away. It
   collapses back INTO the corner it grew from. */
body.desk-down #concierge {
  opacity: 0; transform: scale(0.94);
  transition-duration: var(--beat-half), var(--beat-half);
}
body.desk-down #concierge > * { pointer-events: none; }
.c-pager { display: flex; align-items: center; gap: 10px; justify-content: flex-end; }
.c-pg { background: none; border: none; padding: 0 4px; cursor: pointer;
  color: rgba(218,225,234,.38); font: 16px/1 'Space Mono', monospace; }
.c-pg:hover { color: #ecf0f5; }
.c-pg:disabled { opacity: .25; cursor: default; }
.c-pos { color: rgba(218,225,234,.38); font: 10px 'Space Mono', monospace;
  letter-spacing: .22em; font-variant-numeric: tabular-nums; }
.c-you { color: rgba(218,225,234,.62); font: 300 12.5px/1.5 'Inter', system-ui, sans-serif;
  text-align: right;
  /* EVERY-DETAIL (founder's forensic, panel collisions): the echo line rode the panel's top
     edge into the balloon's corner and the chip header. The rail's corner is RESERVED — the
     echo wraps short of it — and long asks wrap instead of colliding. */
  max-width: calc(100% - 56px); margin-left: auto; overflow-wrap: break-word; }
/* EVERY-DETAIL: a long exchange grows DOWN into scroll, never UP into the balloon — the
   panel interior gets the same collision discipline the film transport ladder has. */
#c-transcript { max-height: 46vh; overflow-y: auto; scrollbar-width: none; }
#c-transcript::-webkit-scrollbar { display: none; }
/* FIX-MIDPLAY-PAN (founder live db74a8a: "dragging and panning the map during playback is not
   working"). During film playback the desk panel is a FAINT READOUT laid over the movie's map,
   but its boxes carry default pointer-events, so the transcript text (.c-you/.c-say/.c-eyebrow)
   AND #c-status silently ate every drag across the map center before MapLibre's dragPan ever
   saw it (hit-test proof: .c-say/#c-status caught the pointer from y560 to y660). The readout
   is not interactive — the hand belongs to the map under it (s8-hand-wins). So #concierge
   passes the pointer THROUGH during film, and only the genuinely interactive regions re-earn
   it: the rail (#c-tray chips), the book (#c-book figures/plates), the ask line (#c-form),
   the transcript's pager, and the resume chip. Scoped to film so the desk's own focused use
   (scrollable history) is untouched, and the chrome seat's chip redesign (desk-dress.mjs) is
   not in this file. */
/* Two ids (#concierge #c-…) so this outranks the guidebook dress's own
   `body.chrome-a.gb-live:not(.book-open) #concierge > *{pointer-events:auto}` (one id) on
   id-count regardless of its classes — the readout must yield the drag under every dress. */
body.film-mode #concierge #c-transcript,
body.film-mode #concierge #c-status { pointer-events: none; }
body.film-mode #concierge #c-transcript .c-pager { pointer-events: auto; }
/* #c-tray (rail chips), #c-book (figures) and #c-form (ask line) keep their base
   interactivity — only the pure text readout yields the drag to the map. */
.c-eyebrow { color: rgba(218,225,234,.38); font: 10px 'Space Mono', monospace;
  text-transform: uppercase; letter-spacing: .22em; transition: color .6s ease; }
.c-eyebrow.live { color: #f5c469; } /* alive right now — the one thing gold means */
/* the editorial voice, compact — the corner instrument reads at 15.5px, not the column's 17 */
.c-say { color: #ecf0f5; font: 400 15.5px/1.5 'Playfair Display', serif; min-height: 2.4em; }
/* ── THE LIVING CHIPS — one rail, three registers (founder 2026-08-11) ────────────────────────
   THE RAIL BREATHES, IT NEVER SNAPS. The registers change size every turn (a pruned tray, a
   shelf that empties over open country, an offer row that is legally absent), and the desk is
   bottom-anchored, so an un-animated rail would hop the transcript on every turn. The height is
   MEASURED and driven — two chip rows always reserved, the rest eased on the same metronome as
   the crossfade: half-beat out, fast-beat in. */
#c-tray { display: flex; flex-wrap: wrap; align-content: flex-start; gap: 5px 6px;
  justify-content: flex-start; min-height: 44px; overflow: hidden;
  opacity: 1;
  transition: opacity 240ms cubic-bezier(0.22, 1, 0.36, 1), height 240ms cubic-bezier(0.22, 1, 0.36, 1); }
#c-tray.fading { opacity: 0; transition-duration: 120ms; }
.c-chip { background: none; border: 1px solid rgba(218,225,234,.16); border-radius: 0;
  color: rgba(218,225,234,.62); font: 10.5px 'Space Mono', monospace; letter-spacing: .06em;
  padding: 5px 10px; cursor: pointer; }
.c-chip:hover { color: #ecf0f5; border-color: rgba(218,225,234,.34); }
.c-chip-live { color: #f5c469; border-color: rgba(245,196,105,.45); } /* gold TEXT, no fill */
.c-chip-zone { border-style: dashed; border-color: rgba(218,225,234,.14);
  color: rgba(218,225,234,.38); cursor: default; }
/* THE SHELF — a recorded chapter within reach. Gold TEXT is the catalog's claim; the hairline
   stays house-neutral, so the one gold BORDER on the rail remains the spotlit thing (alive now
   is gold's other, older meaning and it keeps its mark). */
.c-chip-shelf { color: rgba(245,196,105,.82); border-color: rgba(245,196,105,.20);
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.c-chip-shelf:hover { color: #f5c469; border-color: rgba(245,196,105,.42); }
/* THE OFFERS — the desk's own next moves, in the listener's words. Ink, lowercase: a verb
   phrase, typographically unmistakable against the proper nouns it sits beside. */
.c-chip-offer { color: rgba(218,225,234,.48); border-color: rgba(218,225,234,.12);
  text-transform: lowercase; font-style: normal; }
.c-chip-offer:hover { color: #ecf0f5; border-color: rgba(218,225,234,.30); }
#c-status { color: rgba(218,225,234,.38); font: 10px 'Space Mono', monospace;
  letter-spacing: .12em; min-height: 14px; }
#c-status.err { color: rgba(218,225,234,.62); }
/* THE SLIM ROW — send only. The mic left for the corner (2026-08-12) and the SPEAKER DIED with
   it: the founder removed the mute affordance outright, because the hold's own barge is how you
   silence Wyatt. There is deliberately no silent hush any more. */
#c-form { display: flex; gap: 8px; align-items: center; }
#c-input { flex: 1; background: none; border: none; border-radius: 0;
  border-bottom: 1px solid rgba(218,225,234,.18);
  color: #ecf0f5; font: 300 12.5px/1.4 'Inter', system-ui, sans-serif;
  padding: 5px 2px; outline: none; caret-color: #f5c469; }
#c-input::placeholder { color: rgba(218,225,234,.30); }
#c-input:focus { border-bottom-color: rgba(245,196,105,.55); }
#c-send { background: none; border: none; border-radius: 0; padding: 3px 5px;
  cursor: pointer; color: rgba(218,225,234,.62); font: 14px 'Space Mono', monospace; }
#c-send:hover { color: #ecf0f5; }

/* THE PLATE CARD — corpus stills dressing the orbit (garnish; credits always visible) */
#plate-card { position: fixed; left: 18px; bottom: 18px; width: 300px; height: 224px; z-index: 30;
  opacity: 0; transform: translateY(10px); transition: opacity .7s ease, transform .7s ease; pointer-events: none; }
#plate-card.on { opacity: 1; transform: none; }
#plate-card .pc-img { position: absolute; top: 0; left: 0; width: 100%; height: 200px; object-fit: cover;
  border-radius: 0; border: 1px solid rgba(218,225,234,.14); box-shadow: 0 8px 28px rgba(0, 0, 0, .45);
  opacity: 0; transition: opacity 1.4s ease; }
#plate-card .pc-img.live { opacity: 1; }
#plate-card .pc-credit { position: absolute; top: 204px; left: 2px; right: 2px;
  font: 9px/1.4 'Space Mono', monospace; letter-spacing: .1em; text-transform: uppercase;
  color: rgba(218, 225, 234, .72); text-shadow: 0 1px 3px #000;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ══ THE RING-AND-SPRING MIC — the voice door (js/talkmic.js owns its constitution) ══════════
   Ported from the shipping app's TalkMic (founder-final). THE VOICE COLUMN: the mic is FIXED at
   a CONSTANT offset below the balloon's rail, on the balloon's OWN centre axis (40px off the
   right edge) — the founder's standing "i just dont like the idea of the mic jumping around
   screen". The seat comes from js/balloon.js place(), published once per layout as
   --voice-column-top; nothing here measures any other surface. */
.tmic-wrap {
  /* THE CONVERSATION'S CORNER (founder 2026-08-12, superseding prod's shared-axis rail
     composition for luna): the mic is pinned in the bottom-right corner at thumb reach, and it
     deliberately does NOT ride the balloon's 40px axis — right-centre is the camera's, this
     corner is the conversation's, and the two instruments never sit adjacent again. The desk
     grows from directly above it. */
  position: fixed;
  right: 24px; bottom: 16px;
  width: 48px; z-index: 20;
  display: flex; flex-direction: column; align-items: center; gap: 5px;
  pointer-events: none;                          /* only the instrument itself catches the hand */
  opacity: 1; transform: none;
  transition: opacity var(--beat-fast) var(--ease-chrome), transform var(--beat-fast) var(--ease-chrome);
}
.tmic {
  position: relative; width: 44px; height: 52px;
  display: flex; align-items: center; justify-content: center;
  background: none; border: 0; padding: 0; margin: 0;
  cursor: pointer; pointer-events: auto; touch-action: none;
  -webkit-tap-highlight-color: transparent; user-select: none; -webkit-user-select: none;
}
/* THE GENEROUS TARGET (founder 2026-08-12: "generous tap area") — an invisible 64×64 square
   centred on the button; still 22px clear of the balloon handle's lowest possible box. */
.tmic-target { position: absolute; top: 50%; left: 50%; width: 64px; height: 64px; transform: translate(-50%,-50%); }
/* THE GLYPH — the balloon's own two-layer ink drop-shadow (legibility over bright satellite) */
.tmic-glyph {
  display: block;
  filter: drop-shadow(0 1px 2px rgba(6,8,12,.75)) drop-shadow(0 4px 11px rgba(6,8,12,.5));
  opacity: .6;                                   /* REST — the balloon's own dim register */
  transform: scale(1); transform-origin: 50% 50%;
  transition: opacity .5s cubic-bezier(.4,0,.2,1), transform var(--beat-half) var(--ease-chrome), filter .24s;
}
.tmic:hover .tmic-glyph { opacity: .85; transform: scale(1.03); }
/* THE SAG — the capsule drops against its springs the INSTANT a finger lands (contact, not the
   confirmed hold: the depression is the tactile contract). The back-out ease overshoots a hair
   both ways — the tiny tremble. The spring endpoints ride into the bezel, so the 2px travel
   never opens a gap. */
.tmic-capsule { transform: translateY(0); transition: transform .34s cubic-bezier(.34,1.56,.64,1); }
.tmic.held .tmic-capsule { transform: translateY(2px); transition: transform .28s cubic-bezier(.34,1.56,.64,1); }
/* the rest breath — the capsule floats sub-pixel on its springs (the mic's idle bob) */
.tmic-capsule-inner { animation: tmic-capsule-breath 5.2s ease-in-out infinite; }
.tmic.held .tmic-capsule-inner { animation: none; }
@keyframes tmic-capsule-breath {
  0%, 100% { transform: translateY(0.3px); } 50% { transform: translateY(-0.5px); }
}
/* THE VALVE EMBER — the filament breathing at rest: powered, waiting. */
.tmic-core {
  opacity: .14; transform-box: fill-box; transform-origin: center;
  transition: opacity .24s ease, transform .24s var(--ease-chrome);
  animation: tmic-ember 5.6s ease-in-out infinite;
}
@keyframes tmic-ember { 0%, 100% { opacity: .1; } 50% { opacity: .22; } }
.tmic-wash, .tmic-mesh-glow { opacity: 0; transition: opacity .2s ease; }
/* THE RING'S LIGHT — dark hardware until his voice is on the air */
.tmic-ring-glow, .tmic-ring-bloom { opacity: 0; transition: opacity var(--beat-fast) var(--ease-chrome); }
/* CONTACT, NOT YET THE CHANNEL: a press sags and clunks immediately, but the gold is reserved
   for a channel that is actually open — so a tap (the desk's door) never once implies it was
   listening. The instrument only WAKES on contact. */
.tmic.held .tmic-glyph { opacity: .82; }
/* CONCIERGE ON AIR — THE HALO IS HARDWARE: the ring itself lights and blooms (breathing on the
   house restraint) while the capsule mesh stays DIM — the ring is his air, the mesh is your
   channel. Declared BEFORE .live so a barge-hold's mesh wins the eye. */
.tmic.onair .tmic-glyph { opacity: .92; }
.tmic.onair .tmic-ring-glow { opacity: .85; }
.tmic.onair .tmic-ring-bloom { opacity: .4; animation: tmic-ring-breathe 4.4s ease-in-out infinite; }
@keyframes tmic-ring-breathe { 0%, 100% { opacity: .26; } 50% { opacity: .46; } }
/* LIVE — the channel is open: the mesh lights from within (core, wash and weave waking gold)
   and the glyph blooms. USER SPEAKING rides the SAME state: all three glow layers breathe with
   --tmic-level (mic RMS 0..1); unwired they hold a steady lit read. */
.tmic.live .tmic-glyph {
  opacity: 1;
  filter: drop-shadow(0 1px 2px rgba(6,8,12,.75)) drop-shadow(0 4px 11px rgba(6,8,12,.5))
    drop-shadow(0 0 6px rgba(245,196,105,.6)) drop-shadow(0 0 14px rgba(245,196,105,.35));
}
.tmic.live .tmic-core {
  animation: none;
  opacity: calc(.7 + var(--tmic-level, 0) * .3);
  transform: scale(calc(1 + var(--tmic-level, 0) * .35));
}
.tmic.live .tmic-wash { opacity: calc(.16 + var(--tmic-level, 0) * .5); }
.tmic.live .tmic-mesh-glow { opacity: calc(.55 + var(--tmic-level, 0) * .45); }
/* ── FIX-MIC-HANDOFF · REQUESTING THE LINE — the browser's mic prompt is up and the gesture's
   intent survives it: the existing warm dress at half-light (no new elements, the mic
   constitution stands). The full gold arrives only when the line actually opens. */
.tmic.requesting .tmic-glyph {
  opacity: .92;
  filter: drop-shadow(0 1px 2px rgba(6,8,12,.75)) drop-shadow(0 4px 11px rgba(6,8,12,.5))
    drop-shadow(0 0 8px rgba(245,196,105,.35));
}
.tmic.requesting .tmic-core { opacity: .75; }
.tmic.requesting .tmic-mesh-glow { opacity: .3; }
.tmic.requesting .tmic-wash { opacity: .1; }
/* ── THE HONEST MISS — the instrument's own acknowledgement (js/talkmic.js raises .missed) ─────
   A turn that yielded nothing gets ONE small flinch: 3px of travel, over in 420ms, on the
   BUTTON rather than the glyph so the hover scale and the ON AIR bloom survive it untouched. No
   colour changes, nothing is added to the corner, no error badge — this house does not own a red.
   It is the instrument saying "that landed on me and came back empty", and the WORDS are the
   throat's (throat.css). Never a lock: the mic is already re-armed when this plays. */
.tmic.missed { animation: tmic-miss 420ms var(--ease-chrome); }
@keyframes tmic-miss {
  0%   { transform: translateX(0); }
  24%  { transform: translateX(-1.7px); }
  52%  { transform: translateX(1.5px); }
  78%  { transform: translateX(-0.8px); }
  100% { transform: translateX(0); }
}
.tmic:focus-visible { outline: 1px solid rgba(242,231,208,.5); outline-offset: 10px; }
/* THE TEXT LADDER's one slot — three truths stacked, crossfading, never reflowing. */
.tmic-cap-slot { display: grid; justify-items: center; }
.tmic-cap-slot > * {
  grid-area: 1 / 1;
  font-family: 'Space Mono', monospace; font-size: .42rem; letter-spacing: .18em;
  text-transform: uppercase; text-shadow: 0 1px 6px rgba(0,0,0,.9); white-space: nowrap;
  opacity: 0; pointer-events: none;
  transition: opacity var(--beat-fast) var(--ease-chrome);
}
/* the persistent invitation — clearly readable but still quiet; the instruction stays a step
   BRIGHTER (the hierarchy: focus outranks idle) */
.tmic-invite { color: rgba(218,225,234,.62); }
.tmic-caption { color: rgba(236,240,245,.9); }
.tmic-onair { color: rgba(245,196,105,.9); letter-spacing: .22em; }
.tmic-invite.on, .tmic-caption.on, .tmic-onair.on { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .tmic-glyph, .tmic-core, .tmic-wash, .tmic-mesh-glow, .tmic-ring-glow, .tmic-ring-bloom,
  .tmic-capsule, .tmic-invite, .tmic-caption, .tmic-onair { transition: none; animation: none; }
  .tmic-capsule-inner, .tmic.onair .tmic-ring-bloom { animation: none; }
  .tmic:hover .tmic-glyph { transform: none; }
  .tmic.held .tmic-capsule { transform: none; }
  /* THE MISS COLLAPSES TO A STATE, NOT A MOTION: the flinch is decorative and dies here — the
     glyph simply WAKES for the same half-second instead of travelling. Nothing that carried
     meaning is lost, because the meaning was always the line's words (throat.css), and those
     do not move in any dress. */
  .tmic.missed { animation: none; transform: none; }
  .tmic.missed .tmic-glyph { opacity: .88; }
}


/* ── 06 THE DESK PLAYS · dressed by 07 THE CHROME ── THE DOWNLOAD ROW.
   D2's law: pending, ready and failed states, none of them a spinner — the metronome breathes
   the pending row. The GOLD LAW retires the green accent: the tape's own color (--tape-accent,
   minted per tape) survives only as the small square SWATCH — the cassette's material identity,
   never a UI accent. Pill-glass ground, house mono, ink register; the save link is gold because
   a ready tape is the actionable now. */
#tape-row {
  position: fixed; left: 50%; bottom: 56px; transform: translateX(-50%);
  z-index: 34; max-width: min(86vw, 480px);
  padding: 7px 14px 7px 12px; border: 1px solid var(--hair);
  background: rgba(12, 14, 20, 0.72); backdrop-filter: blur(12px);
  color: var(--ink-soft);
  font: 10.5px/1.6 'Space Mono', ui-monospace, monospace; letter-spacing: 0.06em;
  text-transform: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#tape-row::before { /* the swatch: the tape's own color as object, not accent */
  content: ''; display: inline-block; width: 8px; height: 8px; margin-right: 9px;
  background: var(--tape-accent, #8fb996); vertical-align: 0;
}
#tape-row:not(:has(a)) { /* pending/failed: text-only states breathe on the metronome */
  animation: tape-breath 1600ms ease-in-out infinite;
}
@keyframes tape-breath { 0%, 100% { opacity: 0.72; } 50% { opacity: 1; } }
#tape-row a { color: #f5c469; text-decoration: none; }
#tape-row a:hover { text-shadow: 0 0 10px rgba(245, 196, 105, 0.4); }
#tape-row[hidden] { display: none; }
/* ── end 06 THE DESK PLAYS ── */

/* ── CONCIERGE-FORWARD · THE BOTTOM-CENTER DESK (?chrome=a|b; absent = the standing dress) ──
   Founder 2026-09-05: the mic leaves the buried corner for a bottom-middle rectangle —
   TALK TO ME at rest, HOLD TO SPEAK engaged — that expands when the desk is active (A) or
   stands as the talk door alone (B). The chip ADOPTS the mic and the resume ticket
   (desk-dress.mjs); ids and state classes are the law's, only the clothes are new. */
/* ── THE BOTTOM DOCK — one owner for bottom-center furniture (founder: "what is this pileup
   of elements at the bottom?"). The dock is the ONLY fixed element; the flip board, the
   resume ticket (the chip's slim line), and the chip stack as children with house spacing —
   no overlap in any combination. All positional state (film clearance, the sheet's shoulder,
   the split's map-half) lands on the dock; organs keep only their clothes. */
#bottom-dock {
  position: fixed; left: 50%; bottom: 16px; transform: translateX(-50%);
  z-index: 40; display: flex; flex-direction: column; align-items: center; gap: 9px;
  pointer-events: none; /* only the instruments catch the hand (the desk-glass law) */
}
#bottom-dock #deck-resume { position: static; left: auto; bottom: auto; transform: none; z-index: auto; }
#desk-chip {
  position: static; transform: none;
  display: flex; flex-direction: column; align-items: center; gap: 0;
  pointer-events: none; /* only the instruments catch the hand (the desk-glass law) */
}
/* THE INSTRUMENT, NOT A BUTTON (founder 2026-09-08: the bordered rectangle read chintzy).
   The glyph carries the presence; the label is the state's eyebrow; the ground is the house
   vignette — a floor, never a box. Gold means alive right now: the guide speaking (INTERRUPT
   ME) breathes gold; a film's verb (TALK OVER ME) is quiet, not absent; rest is quiet ink. */
#desk-chip .chip-main {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 14px; min-height: 52px; position: relative;
  border: none; border-radius: 0;
  background: none;
  pointer-events: auto; cursor: pointer;
}
/* FOUNDER ADDITION (2026-09-08 verbatim): "the talk to me should have a transparent
   background. Barely visible but obvious." No plate, no floor — the ink-shadow idiom
   (the wordmark/tagline family) carries the type over any ground; presence is the verb
   and the glyph's breath. Active verbs firm slightly — they do floor-affordance duty. */
#desk-chip .chip-label {
  font: 10px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.24em;
  color: rgba(236, 240, 245, 0.62); white-space: nowrap; pointer-events: none;
  /* the ink carries any ground: a tight dark halo + a soft one (the wordmark idiom firmed
     for bright daylight satellite — founder's 'barely visible but obvious' on both grounds) */
  text-shadow: 0 0 2px rgba(6, 8, 12, 0.98), 0 1px 5px rgba(6, 8, 12, 0.95), 0 0 16px rgba(6, 8, 12, 0.7);
  transition: color var(--beat-fast) var(--ease-chrome), opacity var(--beat-fast) var(--ease-chrome);
}
#desk-chip:hover .chip-label { color: rgba(236, 240, 245, 0.92); }
#desk-chip.engaged .chip-label { color: #f5c469; }
/* the guide is speaking — the floor is yours to take: gold, breathing on the slow beat */
#desk-chip[data-state="onair"] .chip-label { color: #f5c469; animation: chip-breath 2600ms ease-in-out infinite; }
/* a film plays — the verb whispers (primacy means quiet, never absent) */
#desk-chip[data-state="film"] .chip-label { color: rgba(236, 240, 245, 0.48); }
@keyframes chip-breath { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } }
/* the composed turn — the label arrives on the fast beat, never a pop */
#desk-chip .chip-label.turn { animation: chip-turn 240ms var(--ease-chrome); }
#desk-chip[data-state="onair"] .chip-label.turn { animation: chip-turn 240ms var(--ease-chrome), chip-breath 2600ms ease-in-out 240ms infinite; }
@keyframes chip-turn { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } }
/* the adopted mic: same instrument, seated in the row; its own caption ladder yields to the
   chip label (one text truth), and its fixed-corner frame becomes a row seat */
body.chrome-bc .tmic-wrap { position: static; width: auto; right: auto; bottom: auto; }
body.chrome-bc .tmic-cap-slot { display: none; }
/* THE WHOLE RECTANGLE IS THE INSTRUMENT — the generous target grows to the chip's footprint,
   so a hold anywhere on the rectangle is a hold on the mic (talkmic's own button catches it) */
body.chrome-bc .tmic-target { width: 240px; height: 64px; }
/* the resume ticket, died into the chip: a slim line standing ON the rectangle */
#desk-chip .chip-resume-slot { pointer-events: none; align-self: stretch; display: flex; justify-content: center; }
#desk-chip .chip-resume-slot #deck-resume {
  position: static; left: auto; bottom: auto; transform: none; pointer-events: auto;
  font-size: 9px; letter-spacing: 0.18em; padding: 5px 12px;
  border-bottom: none; background: rgba(12, 14, 20, 0.6);
  border-color: rgba(245, 196, 105, 0.25); max-width: 74vw;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#desk-chip .chip-resume-slot #deck-resume:hover { border-color: rgba(245, 196, 105, 0.7); }
/* ZERO BUTTONS OVER THE CEREMONY — while the broadcast performs, the rectangle and its label
   stand down; the bare glyph rides in place (the mic stays the one talk door, unlabeled) */
body.broadcast-live #desk-chip .chip-main { border-color: transparent; background: transparent; backdrop-filter: none; }
body.broadcast-live #desk-chip .chip-label { opacity: 0; width: 0; overflow: hidden; } /* zero width too — a hidden label held its span and shoved the bare glyph off-center */
body.broadcast-live #desk-chip .chip-resume-slot { display: none; }
/* THE TICKER YIELDS THE CENTER (headed eye, this pass): the idle Solari row and the chip
   both claimed bottom-center — tiles ran behind the rectangle. The idle ticker steps ABOVE
   the chip; while the desk stands OPEN in variant A the ticker hides whole (the conversation
   owns the stage; the call-and-response belongs to the broadcast, which strips the chip to
   the bare glyph anyway and keeps its own layout). */
/* (BOTTOM DOCK: the board's 92px stilt died — the dock seats it above the chip in flow) */
/* (station clock: the desk-open fade died with the bottom board — the clock is masthead
   furniture now and stands through conversation like the wordmark and dial) */
/* ONE INSTRUMENT, ONE MESSAGE: under the chip dress the band's floor line stands down —
   INTERRUPT ME on the chip carries the floor's whole duty (founder 2026-09-08). */
body.chrome-bc #c-status.c-floor { display: none; }
/* collisions: the film transport owns the bottom edge; the chip steps above it. The tape row
   (bottom 56 center) steps above the chip. */
body.film-mode #bottom-dock { bottom: 74px; } /* clears the transport ROW (controls-on-intent), not just the hairline — the 60px cut grazed it by 7px at ≤700w */
body.chrome-bc #tape-row { bottom: 132px; }
/* VARIANT A — THE ANSWER EXPANDS FROM THE CHIP: the corner panel re-homed to bottom-center,
   growing UP from the rectangle (same element, same organs, transform-origin at its foot). */
body.chrome-a #concierge {
  /* FIX-CHIP-OPENS: the panel steps ABOVE the throat line (the ask line seats at 84px on the
     chip's shoulder now that throat.css immigrated) — chip, then the line, then the answer */
  right: auto; left: 50%; bottom: 120px; transform: translateX(-50%) scale(1);
  width: 480px; max-width: 94vw;
  padding: 26px 24px 12px;
  background: linear-gradient(to top, rgba(6, 8, 12, 0.82), rgba(6, 8, 12, 0.5) 58%, rgba(6, 8, 12, 0));
  transform-origin: 50% 100%;
}
body.chrome-a.desk-down #concierge { transform: translateX(-50%) scale(0.94); }
body.chrome-a.film-mode #concierge { bottom: 178px; } /* FIX-CHIP-OPENS: above the film-mode line */
@media (max-width: 640px) {
  #bottom-dock { bottom: 12px; }
  #desk-chip .chip-main { min-height: 46px; padding-right: 14px; }
  body.chrome-bc .tmic-target { width: 200px; height: 56px; }
  body.film-mode #bottom-dock { bottom: calc(70px + env(safe-area-inset-bottom, 0px)); }
  body.chrome-a #concierge { width: 94vw; bottom: 104px; } /* FIX-CHIP-OPENS: over the 72px line */
  body.chrome-a.film-mode #concierge { bottom: 170px; }
}
/* ── end CONCIERGE-FORWARD ── */

/* ══ THE TURN CHOREOGRAPHY (design §4.3/§4.4, founder-ruled 2026-09-07) ══════════════════════
   THE COMPOSING DRAFT — the say as it streams from the desk: whole, dim, readable ahead of
   the voice (the paper is complete before the voice is). The spoken reveal restores full ink. */
.c-say.c-composing { color: rgba(236, 240, 245, 0.55); }

/* THE FLOOR AFFORDANCE — R1's ruled clause: while the desk speaks, a standing, subtle line
   says the floor is takeable. House register: lowercase mono, dim gold, a slow breath. */
#c-status.c-floor {
  color: rgba(245, 196, 105, 0.55);
  animation: c-floor-breathe 3.2s ease-in-out infinite;
}
@keyframes c-floor-breathe {
  0%, 100% { opacity: 0.55; }
  50% { opacity: 0.95; }
}

/* ──────── /css/guidebook.css ──────── */
/* ══ THE PRESSED GUIDEBOOK — THE PAPER (SPEC-23, dress pass 2) ════════════════════════════════
   The founder's verdict on dress 1: "how is this a guidebook — it looks like the old chat desk."
   Ruling absorbed: the page is a MATERIAL OBJECT. This file ports prod's Reader register
   (client/src/components/reader/Reader.svelte + core/guidebook/coverArt.ts COVER_TOKENS) to
   sidebar scale: one CREAM SHEET floating over the map — paper #f5f1e8, ink #211c15, ink-soft
   #6b6254, gold-on-cream #c8942f (prod's own cream-ground gold; #f5c469 remains the dark-ground
   gold and never prints on paper), Playfair prose in Kinfolk air, Space Mono marginalia, square
   corners (the reset owns them), drop caps on day-openers. The press mechanics, the model, the
   wire and THE LATENCY LAW are untouched — this file is only the dress.
   The metronome: exits on the half-beat (120ms), entrances on the fast beat (240ms). */

:root {
  --gb-paper: #f5f1e8;               /* prod --paper */
  --gb-ink: #211c15;                 /* prod --ink */
  --gb-ink-soft: #6b6254;            /* prod --ink-soft */
  --gb-gold: #c8942f;                /* prod --gold: THE gold on cream (Reader ▸/drop caps) */
  --gb-hair: rgba(33, 28, 21, 0.08); /* prod row hairline */
  --gb-rule: rgba(33, 28, 21, 0.16); /* prod .rule / hair token */
}

/* the book holds the sidebar only once a page exists (the takeover is earned) */
#c-book { display: none; }
body.gb-live #c-book { display: flex; flex-direction: column; gap: 12px;
  opacity: 1; transition: opacity 240ms cubic-bezier(0.22, 1, 0.36, 1); }
#c-book.fading { opacity: 0; transition-duration: 120ms; }
/* the raw transcript survives BEHIND the book (§2) — thin register, summoned by long-press;
   the raw view keeps the DESK's dark dress (the paper block below excludes .gb-raw) */
body.gb-live:not(.gb-raw) #c-transcript { display: none; }

/* a back page (or the raw view) wears its OWN pressed margin — the live rail stands down.
   Height eases on the rail's existing transition: the bottom-anchored desk never hops. */
body.gb-back #c-tray { height: 0 !important; min-height: 0; opacity: 0;
  margin: 0; padding: 0; pointer-events: none; }

/* ── THE SHEET — the desk becomes paper while a page is open ───────────────────────────────────
   One solid cream object at sidebar scale, floated off the right edge so the map reads AROUND
   it (this is also the fix for map labels bleeding through the prose). The sheet is matter, not
   glass: it catches the hand (prod's paper does not pass a drag to the map beneath). The
   page-edge shadow is the Reader's shadow ink (rgba(33,28,21,…)) cast onto the map, plus the
   deep lift a floating sheet needs over a dark ground. The mic-foot seat, the door (desk-down),
   film-mode standdown and desk-yield all ride #concierge's own laws, untouched. */
body.gb-live:not(.gb-raw) #concierge {
  /* right: 72px clears the instrument lane whole (the balloon's 48px lane at right:16 —
     "the right edge belongs to the instruments"): the balloon rides the MAP beside the
     sheet, never on the paper (the first cut put the prose under the balloon). */
  right: 72px; width: 388px; max-width: calc(100vw - 96px);
  padding: 20px 26px 16px;
  gap: 12px;
  background: var(--gb-paper);
  pointer-events: auto;
  box-shadow:
    0 1px 3px rgba(33, 28, 21, 0.4),
    0 12px 34px rgba(4, 6, 10, 0.45),
    0 30px 70px -18px rgba(4, 6, 10, 0.6);
}
/* the hand law, on paper: while the balloon's panel is open (a grip, or its tap window) the
   rail's tier names land where the sheet now sits — the paper yields the frame the way the
   desk yields on tight layouts, and takes it back on release (the desk's own metronome). */
body.gb-live:not(.gb-raw):has(.brail.pan) #concierge { opacity: 0.22; }

/* ── the head: page furniture PRINTED on the sheet ─────────────────────────────────────────────
   Left-aligned base (the panel's top-right corner is under the balloon's lane). Base register
   is the desk's (the raw view still uses it); the paper scope re-inks it below. */
.gb-head { display: flex; align-items: center; gap: 10px; justify-content: flex-start; }
.gb-pg { background: none; border: none; padding: 0 4px; cursor: pointer;
  color: rgba(218,225,234,.38); font: 16px/1 'Space Mono', monospace; }
.gb-pg:hover { color: #ecf0f5; }
.gb-pg:disabled { opacity: .25; cursor: default; }
.gb-pos { background: none; border: none; padding: 0; cursor: pointer;
  color: rgba(218,225,234,.38); font: 10px 'Space Mono', monospace;
  letter-spacing: .22em; font-variant-numeric: tabular-nums; text-transform: uppercase; }
.gb-pos:hover { color: rgba(218,225,234,.62); }

/* the printed head: a hairline rules the furniture band off the page (prod's chrome bar) */
body.gb-live:not(.gb-raw) .gb-head { border-bottom: 1px solid var(--gb-hair); padding-bottom: 9px; }
body.gb-live:not(.gb-raw) .gb-pg { color: var(--gb-ink-soft); }
body.gb-live:not(.gb-raw) .gb-pg:hover { color: var(--gb-gold); }
body.gb-live:not(.gb-raw) .gb-pos { color: var(--gb-ink-soft); }
body.gb-live:not(.gb-raw) .gb-pos:hover { color: var(--gb-ink); }

/* ── the page (§3) — one field note ON PAPER, sidebar scale ────────────────────────────────────
   These rules render only inside the sheet (the raw view shows no page), so they ARE the paper
   register — dark ink on cream, no scoping needed. */
/* the day divider = prod's .day register; with one page visible it IS the page's header
   (no-word-twice: the eyebrow itself stands down beneath a divider) */
.gb-divider { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  letter-spacing: .4em; text-transform: uppercase; }
.gb-page { display: flex; flex-direction: column; gap: 10px; }
.gb-eyebrow { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  text-transform: uppercase; letter-spacing: .32em; line-height: 1.7; }
.gb-title { color: var(--gb-ink); font: 400 22px/1.18 'Playfair Display', serif; }
.gb-body { display: flex; flex-direction: column; gap: 10px;
  max-height: 36vh; overflow-y: auto; scrollbar-width: none; }
.gb-body::-webkit-scrollbar { display: none; }
/* the prose column — prod .sect p (0.95rem/1.92) at sidebar measure */
.gb-thesis p { color: var(--gb-ink); font: 400 15px/1.75 'Playfair Display', serif; margin: 0; }
.gb-thesis p + p { margin-top: .6em; }
/* THE DROP CAP — prod's .sect.first::first-letter, day-openers only at this scale
   (a cap on every page at 388px reads as a tic; the day's first words earn it) */
.gb-divider + .gb-page .gb-thesis > p:first-child::first-letter {
  font-size: 3.2em; float: left; line-height: 0.8; padding: 5px 10px 0 0; color: var(--gb-gold);
}

/* THE WITNESS IN COLOR (founder 2026-08-15: "picture within the paper but color" — the
   floating projection was tried for a day and retired, git holds it at 3bdd4eec). The page's
   plates print IN the sheet, tiled; FULL COLOR — the grayscale print grade deadened every
   photograph. Crop ban (natural aspect, never cover); captions in the mono band. */
.gb-witness { display: flex; flex-direction: column; gap: 6px; }
.gb-witness.n2 { flex-direction: row; }
.gb-witness.n2 .gb-tile { flex: 1; min-width: 0; }
.gb-witness.n3 { flex-direction: row; flex-wrap: wrap; }
.gb-witness.n3 .gb-tile { flex: 1 1 28%; min-width: 0; }
.gb-witness.n3 .gb-tile.lead { flex: 1 1 100%; }
.gb-tile { margin: 0; position: relative; cursor: pointer; outline: none; }
.gb-tile img { display: block; width: auto; height: auto; max-width: 100%; max-height: 200px;
  margin: 0 auto; border: 1px solid var(--gb-rule);
  transition: transform .15s ease, border-color .15s ease, box-shadow .15s ease; }
/* THE WITNESS FLIES — the picture reads as a door without new chrome: a hairline lift + the
   cream-ground gold waking on hover/focus, a tiny mono corner mark. Print stays clean at rest. */
.gb-tile:hover img, .gb-tile:focus-visible img {
  transform: translateY(-2px);
  border-color: rgba(200, 148, 47, 0.55);
  box-shadow: 0 6px 16px rgba(33, 28, 21, 0.16);
}
.gb-tile::after {
  content: '⌖'; position: absolute; top: 3px; right: 3px; color: var(--gb-gold);
  font: 10px 'Space Mono', monospace; opacity: 0; transition: opacity .15s ease; pointer-events: none;
}
.gb-tile:hover::after, .gb-tile:focus-visible::after { opacity: .9; }
.gb-tile figcaption { color: var(--gb-ink-soft); font: 8.5px/1.5 'Space Mono', monospace;
  letter-spacing: .1em; text-transform: uppercase; padding-top: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* a page led by its witness gives the prose column back the frame it borrowed */
.gb-page:has(.gb-witness) .gb-body { max-height: 24vh; }

/* THE PRINTED PLAN (founder 2026-08-12: "nicer formatting for lists — day-wise plans etc.") —
   prod's front-matter list register at sidebar scale: hairline-ruled rows, mono numerals,
   serif names, mono facts right-shored. Numbers and hairlines, never bullet glyphs. */
/* the list carries a printer's gutter — a hanging indent the numerals sit inside, and the room
   the row's hover mark needs. It has to live INSIDE the plan's own box: .gb-body is a scroll
   region, so it clips on BOTH axes, and a mark hung in the sheet's outer margin is simply cut
   off (the first cut lost it entirely). */
.gb-plan { display: flex; flex-direction: column; padding-left: 14px; }
.gb-plan-day { color: var(--gb-ink-soft); font: 9px 'Space Mono', monospace;
  letter-spacing: .4em; text-transform: uppercase; margin: 10px 0 1px; }
.gb-plan-day:first-child { margin-top: 0; }
.gb-row { display: flex; align-items: baseline; gap: 9px; padding: 6px 0;
  border-bottom: 1px solid var(--gb-hair); }
.gb-row-n { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  font-variant-numeric: tabular-nums; transition: color .15s ease; }
.gb-row-t { flex: 1; min-width: 0; color: var(--gb-ink);
  font: 400 13.5px/1.3 'Playfair Display', serif;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  transition: color .15s ease; }
.gb-row-m { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', monospace;
  letter-spacing: .12em; text-transform: uppercase; white-space: nowrap; }

/* ══ THE CLICKABLE PAGE (founder 2026-08-14) — "what if the list and the prose were clickable
   instead? would save a ton of space." The print IS the interface; the duplicate rail below it
   retires. Dress vocabulary shared with THE WITNESS FLIES, one page-wide grammar of doors:
   a hairline lift, the cream-ground gold waking, a small mono mark in the margin. NOTHING
   PERMANENT — at rest the page is print, and prints do not wear buttons. ══════════════════ */

/* THE ROW IS THE DOOR — it fires exactly what its chip fired (`show me <name> up close`) */
.gb-row.tap { position: relative; cursor: pointer; outline: none;
  transition: border-color .15s ease, transform .15s ease; }
.gb-row.tap:hover, .gb-row.tap:focus-visible {
  border-bottom-color: rgba(200, 148, 47, 0.5);
  transform: translateY(-1px);
}
.gb-row.tap:hover .gb-row-t, .gb-row.tap:focus-visible .gb-row-t,
.gb-row.tap:hover .gb-row-n, .gb-row.tap:focus-visible .gb-row-n { color: var(--gb-gold); }
/* the mark rides the list's own gutter, ahead of the numeral — the same ▸ the page's foot uses,
   because it promises the same thing: the camera ends up there. Never in the measure. */
.gb-row.tap::after {
  content: '▸'; position: absolute; left: -13px; top: 50%; transform: translateY(-50%);
  color: var(--gb-gold); font: 9px 'Space Mono', monospace;
  opacity: 0; transition: opacity .15s ease; pointer-events: none;
}
.gb-row.tap:hover::after, .gb-row.tap:focus-visible::after { opacity: .9; }
/* THE PLAY DOOR SHOWS ITSELF (founder drive 2026-09-06): a row whose chapter the HEAD has
   PROVEN playable wears the gutter ▸ at rest — dim, gold, the same mark — so a playable
   story never reads as a plaque. Hover still brightens it like any door. */
.gb-row.tap.gb-playable::after { opacity: .45; }
.gb-row.tap.gb-playable:hover::after, .gb-row.tap.gb-playable:focus-visible::after { opacity: .9; }
/* THE HAND IS ACKNOWLEDGED within a breath: one gold pulse on press, while the door answers */
@keyframes gb-row-engage { 0% { background: rgba(200, 148, 47, 0.18); } 100% { background: transparent; } }
.gb-row.tap.engaged { animation: gb-row-engage 1.1s ease-out 1; }
.gb-row.tap.engaged::after { opacity: .9; }

/* THE PROSE IS CLICKABLE at the names the desk has actually staged. The quietest door on the
   page: an ink hairline under the words, in the prose's own colour, waking to gold under the
   hand. No box, no chip, no colour at rest — you find it by reading, which is the point. */
.gb-name { cursor: pointer; outline: none; color: inherit;
  border-bottom: 1px solid rgba(33, 28, 21, 0.28);
  transition: color .15s ease, border-color .15s ease; }
.gb-name:hover, .gb-name:focus-visible {
  color: var(--gb-gold); border-bottom-color: rgba(200, 148, 47, 0.65);
}

/* THE OFFERS SHED THEIR BOXES — one mono margin line at the page's foot, dots between, no
   borders. The offer register keeps its lowercase voice; it was always a margin note. */
.gb-offers { color: rgba(33, 28, 21, 0.42); font: 9.5px/1.7 'Space Mono', monospace;
  letter-spacing: .1em; text-transform: lowercase; }
.gb-offer { cursor: pointer; outline: none; color: var(--gb-ink-soft);
  border-bottom: 1px solid transparent; transition: color .15s ease, border-color .15s ease; }
.gb-offer:hover, .gb-offer:focus-visible {
  color: var(--gb-gold); border-bottom-color: rgba(200, 148, 47, 0.55);
}

/* THE RAIL STANDS DOWN where the page already prints it. Same door body.gb-back uses — the
   rail's own eased height — so the bottom-anchored desk settles instead of hopping. */
body.gb-printed #c-tray { height: 0 !important; min-height: 0; opacity: 0;
  margin: 0; padding: 0; pointer-events: none;
  /* THE GHOST RAIL (coordinator drive 2026-09-06): height:0 alone left the retired rows
     overflowing invisibly with full hit-test geometry — a rig (or a screen reader) read live
     doors where a person saw blank paper. A retired rail has NO geometry, honestly. */
  overflow: hidden; visibility: hidden; }
body.gb-printed #c-tray > * { display: none; }

/* THE MARGIN (§3.4) — mono facts, the page's own chips, the aside. Never in the prose column. */
.gb-margin { display: flex; flex-direction: column; gap: 8px; }
.gb-facts { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  letter-spacing: .26em; text-transform: uppercase; }
.gb-chips { display: flex; flex-wrap: wrap; gap: 5px 6px; }
/* the aside — a footnote of the sheet, printed in the margin register (never floating) */
.gb-aside { color: var(--gb-ink-soft); font: italic 400 12.5px/1.55 'Playfair Display', serif;
  border-left: 1px solid var(--gb-rule); padding-left: 10px; }
/* THE SPEAKER EYEBROW (founder 2026-08-23, with the panel's marginalia ruling): an aside is
   somebody TALKING, unlike the page around it — so it names who. The house's small-caps: mono,
   uppercase, wide, and the quietest ink on the sheet. Base register here so the default layout
   never renders it undressed; panel.css takes it smaller and grayer still inside the column. */
.gb-aside-eb { color: rgba(33, 28, 21, 0.42); font: 9px/1.5 'Space Mono', monospace;
  font-style: normal; letter-spacing: .32em; text-transform: uppercase; padding-bottom: 3px; }
/* ── THE LOOSE LEAF (founder 2026-08-23: "wait what? why would the column be empty?") ─────────
   An unbound sheet of the same cream, holding the asides of a conversation that has not pressed
   a page yet. It is scratch paper: no title, no pager, no ▸ — just a hairline dateline and the
   marginalia register beneath it, and it is gone the moment a real page takes its words into a
   margin of its own. The asides inside it are `.gb-aside`, unchanged — the register IS the
   claim (this is marginalia, it is simply not in the margin of anything yet). */
.gb-leaf { display: flex; flex-direction: column; gap: 12px; }
.gb-leaf-line { color: rgba(33, 28, 21, 0.42); font: 8.5px/1.5 'Space Mono', monospace;
  letter-spacing: .34em; text-transform: uppercase;
  padding-bottom: 9px; border-bottom: 1px solid var(--gb-hair); }

/* THE BREADCRUMB (founder 2026-08-12) — the links the desk checked, printed in the margin's
   own mono band: one line per source, tappable, quiet ink waking to gold under the hand */
.gb-srcs { display: flex; flex-direction: column; gap: 3px; }
.gb-aside .gb-srcs { margin-top: 6px; }
.gb-src { color: var(--gb-ink-soft); font: 8.5px/1.6 'Space Mono', monospace;
  letter-spacing: .18em; text-transform: uppercase; text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; transition: color .12s; }
.gb-src:hover { color: var(--gb-gold); }

/* ── the foot: THE PAGE DRIVES THE CAMERA — gold is ▸, and only ▸ (prod's gold-on-cream) ─────── */
.gb-foot { display: flex; align-items: baseline; gap: 16px; }
.gb-fly { background: none; border: none; padding: 0; cursor: pointer;
  color: var(--gb-gold); font: 10px 'Space Mono', monospace; letter-spacing: .22em;
  text-transform: uppercase; transition: text-shadow .12s; }
.gb-fly:hover { text-shadow: 0 0 10px rgba(200, 148, 47, 0.5); }
.gb-save { background: none; border: 1px solid var(--gb-rule); padding: 4px 9px;
  cursor: pointer; color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  letter-spacing: .14em; text-transform: uppercase; }
.gb-save:hover { color: var(--gb-ink); border-color: rgba(33, 28, 21, 0.34); }
/* the head's compact SAVE — quiet, right-shored, borderless (the head is furniture) */
.gb-save-head { margin-left: auto; border: none; padding: 0 2px;
  letter-spacing: .22em; font-size: 9px; }
body.gb-live.gb-raw .gb-save-head { color: rgba(218,225,234,.38); }
body.gb-live.gb-raw .gb-save-head:hover { color: rgba(218,225,234,.62); }

/* ── the cover (§4) — coverArt's own gold-on-cream at sidebar scale ──────────────────────────── */
.gb-ribbon { width: 100%; height: auto; }
.gb-ribbon polyline { fill: none; stroke: var(--gb-gold); stroke-width: 1.6; }
.gb-dot.o { fill: var(--gb-ink-soft); }
.gb-dot.l { fill: var(--gb-ink); }
.gb-dotlbl { fill: var(--gb-ink-soft); font: 8px 'Space Mono', monospace; letter-spacing: .1em; }

/* ── the sheet's own instruments: the live rail, the status line, the input row ────────────────
   The desk's working parts sit ON the paper while the book is open — the input row composes
   with the sheet's foot (dark ink on cream), never a floating overlay. Registers unchanged:
   shelf/live keep gold's claim (in the cream-ground gold), offers stay lowercase ink. */
body.gb-live:not(.gb-raw) #concierge .c-chip {
  color: var(--gb-ink-soft); border-color: rgba(33, 28, 21, 0.18); }
body.gb-live:not(.gb-raw) #concierge .c-chip:hover {
  color: var(--gb-ink); border-color: rgba(33, 28, 21, 0.38); }
body.gb-live:not(.gb-raw) #concierge .c-chip-live {
  color: var(--gb-gold); border-color: rgba(200, 148, 47, 0.5); }
body.gb-live:not(.gb-raw) #concierge .c-chip-zone {
  border-style: dashed; border-color: rgba(33, 28, 21, 0.14); color: rgba(33, 28, 21, 0.4); }
body.gb-live:not(.gb-raw) #concierge .c-chip-shelf {
  color: rgba(200, 148, 47, 0.9); border-color: rgba(200, 148, 47, 0.28); }
body.gb-live:not(.gb-raw) #concierge .c-chip-shelf:hover {
  color: var(--gb-gold); border-color: rgba(200, 148, 47, 0.5); }
body.gb-live:not(.gb-raw) #concierge .c-chip-offer {
  color: rgba(33, 28, 21, 0.52); border-color: rgba(33, 28, 21, 0.12); }
body.gb-live:not(.gb-raw) #concierge .c-chip-offer:hover {
  color: var(--gb-ink); border-color: rgba(33, 28, 21, 0.3); }
body.gb-live:not(.gb-raw) #c-status { color: var(--gb-ink-soft); }
body.gb-live:not(.gb-raw) #c-status.err { color: var(--gb-ink); }
body.gb-live:not(.gb-raw) #c-input { color: var(--gb-ink);
  border-bottom-color: rgba(33, 28, 21, 0.28); caret-color: var(--gb-gold); }
body.gb-live:not(.gb-raw) #c-input::placeholder { color: rgba(33, 28, 21, 0.35); }
body.gb-live:not(.gb-raw) #c-input:focus { border-bottom-color: rgba(200, 148, 47, 0.65); }
body.gb-live:not(.gb-raw) #c-send { color: var(--gb-ink-soft); }
body.gb-live:not(.gb-raw) #c-send:hover { color: var(--gb-ink); }

/* ── THE SHELF row (§5) — thin, above the input; only offered while the book is unopened,
   so it always sits on the DARK desk (its dress is the desk's, unchanged) ─────────────────── */
#gb-shelf { display: none; }
#gb-shelf.on { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.gb-shelf-label { color: rgba(218,225,234,.38); font: 9px 'Space Mono', monospace;
  letter-spacing: .3em; text-transform: uppercase; }
.gb-shelf-chip { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ══ THE SEAM (founder 2026-08-14, RE-RULED 2026-08-24) ═══════════════════════════════════
   `body.film-stood-down` is RETIRED with its rules. It hid the film's surfaces in place while
   the door stayed open — a paused movie under a conversation. The founder's 2026-08-24 ruling
   ("I would expect it to exit film mode and bring up the regular UI") replaced hiding with
   LEAVING: the seam now drives the film door's own quit(), which removes every film-* surface
   outright, so there is nothing left for a class to hide. The RETURN TICKET below is the half
   that survives — it is the only thing on screen that remembers the film. */
/* ══ THE MIC IS NEVER UNREACHABLE (founder 2026-08-24, live on prod: "the sidebar never comes
   up when I tap on the concierge during movie playback") ═══════════════════════════════════
   MEASURED, not guessed: `document.elementsFromPoint` at the mic's own centre, 3 s / 13 s /
   23 s / 33 s into a film, returned `DIV#film-bar` every time. The transport bar is fixed to
   bottom:0, full width, z-index 27 — and while its two CHILDREN carefully declare
   `pointer-events: none` (the scrim) and re-enable only when awake (the row), the bar's own
   container box never did. So it stood over the mic's corner as a silent touch wall, at
   z-index 27 against the mic's 20, and every tap on the concierge during a film landed on
   nothing at all. The desk could not open because the door was never knocked on.
   Two lines, no film.js edit, nothing moved on screen: the container stops catching hands it
   has no use for, and the mic's corner outranks the bar in film mode so even the AWAKE row
   (which reaches the full width, ✕ and all) can never re-cover it. */
body.film-mode #film-bar { pointer-events: none; }
body.film-mode #film-bar.awake #film-bar-row { pointer-events: auto; }
body.film-mode .tmic-wrap { z-index: 30; }

#film-ticket { position: fixed; left: 18px; bottom: 16px; z-index: 30; display: none;
  background: rgba(6, 8, 12, 0.82); border: 1px solid rgba(245, 196, 105, 0.4);
  color: #f5c469; font: 10px 'Space Mono', monospace; letter-spacing: 0.12em;
  padding: 7px 12px; cursor: pointer; opacity: 0;
  transition: opacity 240ms cubic-bezier(0.22, 1, 0.36, 1); }
#film-ticket.on { display: block; opacity: 1; }
#film-ticket:hover { border-color: #f5c469; color: #f7f9fc; }

/* THE CAPTIONS STOP WITH THE FILM (founder 2026-08-14): cinema mode keeps the paused frame
   and the transport (the film seat's resume door) — but a caption is SPEECH, and paused
   speech on screen reads as a stuck performance. Additive over their body.film-desk. */
body.film-desk #film-caption { opacity: 0 !important;
  transition: opacity 120ms cubic-bezier(0.22, 1, 0.36, 1); }

/* ══ THE RAIL PRINTS (founder 2026-08-14: "the chip treatment still reads very app like…
   use the more print native lists with clickable entities" + "not very compact"). The rail's
   three registers leave their bordered boxes — dark-ground chrome stranded on cream — and
   take the plan's own print vocabulary. Rows reuse .gb-row whole (one list register on the
   whole paper); this block only reshapes the container and claims the two golds. ═════════ */
#c-tray { display: block; min-height: 30px; }
.c-rail-zone { color: var(--gb-ink-soft); font: 9px 'Space Mono', monospace;
  letter-spacing: .32em; text-transform: uppercase; padding: 1px 0 3px; }
#c-tray .gb-row { padding: 4px 0; }              /* the corner instrument is denser than the page */
/* alive now — the spotlit row's name takes the cream-ground gold (the border's old claim) */
.c-rail-live .gb-row-t, .c-rail-live .gb-row-n { color: var(--gb-gold); }
/* the catalog's claim — a recorded chapter within reach prints its name in gold */
.c-rail-shelf .gb-row-t { color: var(--gb-gold); font-style: italic; }
#c-tray .gb-offers { padding-top: 5px; }

/* ══ THE TRIP PAGE (founder 2026-08-23: "all tell no show") ════════════════════════════════════
   Verbatim: "What I am concerned about is an incoherent concierge panel. Doesn't show me plates
   or info on any of the stops being recommended." The cover stops being front matter and becomes
   THE PLAN: cover line, lede, then DAY after DAY of stop rows — each with its measured distance,
   one line of the corpus's own prose, its tip, its light, and its picture.

   THE PAGE GETS THE ROOM. A trip page is a document, not a card: it takes the sheet's whole
   reading height (the 36vh cap is right for a one-subject page and wrong for a five-day plan)
   and scrolls inside its own box, so the panel frame never grows and never clips. */
.gb-cover .gb-body { max-height: 58vh; }
.gb-cover:has(.gb-days) .gb-body { max-height: 62vh; }

/* the cover line — "5 DAYS · SPRINGDALE & CEDAR CITY", the mono band under the ribbon */
.gb-coverline { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', monospace;
  letter-spacing: .26em; text-transform: uppercase; }

.gb-days { display: flex; flex-direction: column; gap: 2px; }

/* THE DAY DIVIDER carries the day, the base and its own ▸ — the day is a film you can fly */
.gb-day-h { display: flex; align-items: baseline; gap: 8px;
  margin: 12px 0 2px; padding-bottom: 4px; border-bottom: 1px solid var(--gb-rule); }
.gb-day:first-child .gb-day-h { margin-top: 2px; }
.gb-day-n { color: var(--gb-ink); font: 9.5px 'Space Mono', monospace;
  letter-spacing: .42em; text-transform: uppercase; }
.gb-day-base { flex: 1; min-width: 0; color: var(--gb-ink-soft);
  font: 400 12px/1.2 'Playfair Display', serif; font-style: italic;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.gb-day-fly { background: none; border: 0; padding: 0 2px; cursor: pointer; outline: none;
  color: var(--gb-ink-soft); font: 11px 'Space Mono', monospace; opacity: .55;
  transition: color .15s ease, opacity .15s ease; }
.gb-day-fly:hover, .gb-day-fly:focus-visible { color: var(--gb-gold); opacity: 1; }
.gb-day-bare { color: var(--gb-ink-soft); font: 9px 'Space Mono', monospace;
  letter-spacing: .2em; text-transform: uppercase; padding: 6px 0; }

/* ── THE STOP ROW IS TEXT-FIRST (founder 2026-08-23: "Bad idea to put the plates on the left in
   the concierge panel"). The left-hand thumbnail is retired. Every row is `N · Title … km · min`
   over ONE FLUSH LEFT EDGE, the corpus's own why-line under it, the notes and the tip beneath —
   and where a picture is printed it lands BELOW the row across the full measure. Nothing is ever
   drawn to the left of the words, so the numerals scan down the page in a straight line whether
   or not a stop has a plate. The whole row is the door; the figure inside it is its own door to
   the flyover. */
.gb-stop { display: flex; flex-direction: column; gap: 7px; padding: 8px 0 9px;
  border-bottom: 1px solid var(--gb-hair); position: relative; cursor: pointer; outline: none;
  transition: background .15s ease, padding-left .15s ease; }
.gb-stop:last-child { border-bottom: 0; }
.gb-stop-body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.gb-stop-head { display: flex; align-items: baseline; gap: 8px; }
.gb-stop .gb-row-t { white-space: normal; }
.gb-stop-why { margin: 0; color: var(--gb-ink); font: 400 12.5px/1.55 'Playfair Display', serif; }
.gb-stop-notes { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', monospace;
  letter-spacing: .12em; text-transform: uppercase; }
/* the insider tip is MARGINALIA — the corpus's own aside, ruled off in the mono register */
.gb-stop-tip { color: var(--gb-ink-soft); font: 400 11.5px/1.5 'Playfair Display', serif;
  font-style: italic; padding-left: 8px; border-left: 1px solid var(--gb-rule); }

/* the hover dress is the page's one grammar of doors: a hairline lift, the gold waking */
.gb-stop:hover, .gb-stop:focus-visible {
  background: linear-gradient(90deg, rgba(200, 148, 47, 0.07), rgba(200, 148, 47, 0)); }
.gb-stop:hover .gb-row-t, .gb-stop:focus-visible .gb-row-t,
.gb-stop:hover .gb-row-n, .gb-stop:focus-visible .gb-row-n { color: var(--gb-gold); }

/* ── THE PAGE'S FIGURE. A plate prints BELOW its row across the sheet's FULL MEASURE, at its own
   aspect — the guidebook figure, and the WITNESS IN COLOR register (a plate is a photograph and
   prints as one; it is the one thing on this sheet that is not ink). The crop ban holds at both
   ends: never cover-cropped, and never upscaled past its own pixels — guidebook.js reads the
   decoded width off the image and caps the figure there.
   A FIGURE THAT IS NOT YET A PICTURE IS NOT DRAWN. The frame used to appear the moment the row
   was built, so a slow plate showed an empty well and a dead one showed it until onerror fired
   (the broken frames prod has been carrying). It is hidden until the image decodes and removed
   outright if it never does — a missing plate costs the page nothing at all. */
.gb-rowplate { margin: 2px 0 0; display: none; width: 100%; }
.gb-rowplate.gb-fig-on { display: block; }
.gb-rowplate img { display: block; width: 100%; height: auto; border: 0; background: none;
  transition: filter .15s ease; }
.gb-rowplate figcaption { color: var(--gb-ink-soft); font: 8px/1.5 'Space Mono', monospace;
  letter-spacing: .1em; text-transform: uppercase; padding-top: 5px; }
.gb-rowplate:hover img, .gb-rowplate:focus-visible img { filter: brightness(1.04) saturate(1.05); }
.gb-rowplate:focus-visible { outline: 1px solid var(--gb-gold); outline-offset: 3px; }

/* the bases, at the foot — a trip with one base says so in a line, never a table */
.gb-bases { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', monospace;
  letter-spacing: .14em; text-transform: uppercase; padding-top: 6px;
  border-top: 1px solid var(--gb-hair); }

/* WITHIN REACH — the atlas counsel, printed. The desk's own neighbourhood with measured
   distances: three rows, catalog register, each a door into the conversation. */
.gb-reach { display: flex; flex-direction: column; padding-top: 8px; margin-top: 4px;
  border-top: 1px solid var(--gb-rule); }
.gb-reach-h { color: var(--gb-ink-soft); font: 9px 'Space Mono', monospace;
  letter-spacing: .42em; text-transform: uppercase; padding-bottom: 3px; }
.gb-reach-row { display: flex; align-items: baseline; gap: 9px; padding: 4px 0;
  cursor: pointer; outline: none; transition: color .15s ease; }
.gb-reach-t { flex: 1; min-width: 0; color: var(--gb-ink);
  font: 400 12.5px/1.3 'Playfair Display', serif;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; transition: color .15s ease; }
.gb-reach-row:hover .gb-reach-t, .gb-reach-row:focus-visible .gb-reach-t { color: var(--gb-gold); }

/* the unmeasured mark's own footnote — printed once, at the foot, where it belongs */
.gb-footnote { color: var(--gb-ink-soft); font: 8px 'Space Mono', monospace;
  letter-spacing: .1em; text-transform: uppercase; padding-top: 4px; }

/* ── FIX-PLATE-VERB (founder 2026-09-06): THE WITNESS STRIP — asked-for photographs pressed
   into #c-book, the guidebook's reserved slot, while THE PROJECTION itself is un-immigrated.
   The rail is a dark vignette over the map, so the strip wears the DARK register (the paper
   tokens above belong to gb-live, which is not on): full color figures (the witness-in-color
   law), caption + credit in the footnote register, the one gold #f5c469 only where a hand
   can act. Shows ONLY for on_request frames — pushed plates still just count. */
#c-book.witness-on { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 6px; }
.wit-head { display: flex; align-items: baseline; justify-content: space-between; }
.wit-title { color: rgba(235, 228, 215, 0.55); font: 9.5px 'Space Mono', monospace;
  letter-spacing: 0.14em; text-transform: uppercase; }
.wit-x { background: none; border: 0; color: rgba(235, 228, 215, 0.45);
  font: 11px 'Space Mono', monospace; cursor: pointer; padding: 0 2px; }
.wit-x:hover, .wit-x:focus-visible { color: #f5c469; }
.wit-fig { margin: 0; }
.wit-fig img { display: block; width: 100%; height: auto; border-radius: 2px;
  background: rgba(0, 0, 0, 0.25); }
.wit-fig figcaption { color: rgba(235, 228, 215, 0.5); font: 8px/1.5 'Space Mono', monospace;
  letter-spacing: 0.06em; margin-top: 2px; }

/* ──────── /css/throat.css ──────── */
/* ══ THE ONE THROAT — the line and the mic are one instrument ═════════════════════════════════
   Founder, 2026-08-14 (the Kullu page): "think the chat input/stt preview could be better
   integrated with the microphone."

   THE READING OF IT. Until now the desk had TWO mouths in two places: a text row buried at the
   bottom of the sheet's stack, and — 84px below it, in the corner, on its own — the ring-and-
   spring. The STT preview was already landing in that text row (concierge.js beginListening()
   writes interims into #c-input), but nothing on screen said so: you held an instrument in one
   corner and your words appeared inside a different object's furniture. One channel, drawn as
   two things.

   THE RULING BUILT. There is ONE THROAT and it is at the corner: a single line whose RIGHT-HAND
   ANCHOR IS THE MIC. The mic's flared foot stands ON the line — the line is the ground the
   instrument stands on, and it runs beneath the foot and out to the corner. The line is the
   sheet's foot and the corner band's floor at once.
     · TYPED  — Inter, the listener's own hand, an ink hairline under it.
     · HEARD  — while a hold's channel is live, the SAME line becomes the live transcript: the
                register shifts to Space Mono in full ink and the hairline goes gold. Mono is
                the machine's readback; gold is the house's one meaning, ALIVE RIGHT NOW. You
                can see you are being HEARD, not typing.
     · Release commits exactly what the line shows (concierge.js's existing hold-commit path —
       untouched). Typing works as before when no hold is live.

   THE INSTRUMENT IS LAW. sag / mesh / ember / on-air are not touched by one rule in this file:
   the mic is seated WITH, never altered. js/talkmic.js publishes --throat-bottom by measuring
   its own drawn foot, so the line lands on the stand at any viewport instead of guessing.

   THE COMPOSITION IT RESPECTS. --mic-foot is the corner reserved for the instrument and the
   desk sits directly above it; the throat now lives INSIDE that reserve (it always did, as the
   sheet's last row — it has simply come down to the floor), so balloon.js's declared
   CORNER_BAND is unchanged and the rail's seat never moves. The balloon's own 48px lane at
   right:16 is right-CENTRE; this is the corner, and the two never touch.

   THE THROAT IS INSTRUMENT CHROME, ALWAYS. It leaves the sheet, so it stops wearing the sheet's
   register: the paper's ink-on-cream belongs to the PAGE, and the line belongs to the MIC —
   dark ground, house ink, the dark-ground gold #f5c469 the instrument itself is drawn in.
   (The paper pass inked #c-input for a row that sat on cream; those rules are answered below,
   at equal specificity, because this file loads after guidebook.css.)

   Loaded after style.css + guidebook.css. Every rule is gated on body.throat-on, raised by
   js/talkmic.js only once the line is actually seated — an unseated throat inherits the old
   dress whole and nothing here fires. */

body.throat-on #c-form {
  /* the corner band's floor. Fixed to the VIEWPORT (the form is re-parented to <body> by
     seatThroat, out of #concierge's transform — a transformed ancestor is a containing block
     for fixed children, and the sheet slides to right:72px while a page is open: the line must
     not slide with it, because it belongs to the mic now). */
  position: fixed;
  left: auto;
  /* the line runs UNDER the mic and out to the corner — the stand grounds on it */
  right: 18px;
  bottom: var(--throat-bottom, 32px);
  /* the sheet's own measure: with a page open, the line runs the width of the prose column and
     underlines it — the foot of the page, and the floor of the corner, drawn once */
  width: min(408px, calc(100vw - 92px));
  z-index: 13;                       /* over the desk's vignette (12), under the mic (20) */
  display: flex; align-items: baseline; gap: 8px;
  padding: 0 0 6px;
  transition: opacity var(--beat-fast) var(--ease-chrome);
  /* the band is a line, not a wall: only the writing parts catch the hand, so the mic's
     generous 64px target and the map underneath both keep every gesture that isn't the line's */
  pointer-events: none;
}
/* THE LINE ITSELF — its own 1px element, never a border on a box. A rule with a box-shadow
   around FOUR sides is a box, and this house draws vignettes; a 1px child glows as a LINE. It
   fades in from the left the way the desk's vignette does, so it reads as an edge the corner
   was always standing on rather than an underline that starts somewhere for no reason. */
body.throat-on #c-form::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: linear-gradient(to right,
    rgba(218, 225, 234, 0), rgba(218, 225, 234, .30) 16%, rgba(218, 225, 234, .30));
  pointer-events: none;
  transition: background var(--beat-fast) var(--ease-chrome),
              box-shadow var(--beat-fast) var(--ease-chrome);
}
body.throat-on #c-input,
body.throat-on #c-send { pointer-events: auto; }

body.throat-on #c-input {
  flex: 1; min-width: 0;
  background: none; border: none;          /* the FORM carries the line now, not the box */
  color: var(--ink);
  font: 300 13px/1.5 'Inter', system-ui, sans-serif;
  padding: 0 0 2px;
  outline: none;
  caret-color: var(--amber);
  /* legible over bare satellite: the line hangs off the sheet's vignette onto live map */
  text-shadow: 0 1px 6px rgba(6, 8, 12, .95), 0 0 14px rgba(6, 8, 12, .8);
  transition: color var(--beat-fast) var(--ease-chrome),
              font-size var(--beat-fast) var(--ease-chrome);
}
/* THE PLACEHOLDER STAYS QUIET — it names the two verbs the corner offers and then gets out of
   the way. It is the quietest ink on screen, and it is gone the moment anything is in the line. */
body.throat-on #c-input::placeholder {
  color: rgba(218, 225, 234, .28);
  font-style: normal;
}
body.throat-on #c-input:focus { outline: none; }
body.throat-on #c-form:focus-within::after {
  background: linear-gradient(to right,
    rgba(245, 196, 105, 0), rgba(245, 196, 105, .5) 16%, rgba(245, 196, 105, .5));
}

/* the send mark, right-shored at the line's end, just clear of the stand */
body.throat-on #c-send {
  background: none; border: none; padding: 0;
  margin-right: 58px;                      /* the stand's own room — text never runs under it */
  cursor: pointer;
  color: rgba(218, 225, 234, .5);
  font: 13px 'Space Mono', monospace;
  text-shadow: 0 1px 6px rgba(6, 8, 12, .9);
  transition: color var(--beat-fast) var(--ease-chrome), opacity var(--beat-fast) var(--ease-chrome);
}
body.throat-on #c-send:hover { color: var(--bright); }

/* ── HEARD: the same line becomes the live transcript ──────────────────────────────────────────
   The register shift IS the feedback — no second surface, no preview box, nothing added to the
   corner. Mono + full ink + the gold line: being heard, not typed. */
body.throat-on.mic-hold #c-form::after {
  background: linear-gradient(to right,
    rgba(245, 196, 105, 0), rgba(245, 196, 105, .85) 16%, rgba(245, 196, 105, .85));
  box-shadow: 0 0 9px rgba(245, 196, 105, .5);   /* a 1px element: the LINE glows, not a box */
}
body.throat-on.mic-hold #c-input {
  color: var(--ink);
  font: 400 12px/1.5 'Space Mono', monospace;
  letter-spacing: .045em;
}
body.throat-on.mic-hold #c-input::placeholder { color: rgba(245, 196, 105, .34); }
/* the arrow has nothing to do while a finger owns the turn — the RELEASE commits */
body.throat-on.mic-hold #c-send { opacity: .18; }

/* ── THE HONEST MISS: the channel closed with nothing in it, and the line says so ───────────────
   Founder-level cruelty, fixed: you held, the mesh lit gold, you spoke, and the desk answered
   with silence. The cue is THE PLACEHOLDER — the line's own quietest voice, the one thing it can
   say when it has nothing to show — for four seconds, then the standing invitation returns.
   (js/talkmic.js owns the words and the clock; concierge.js owns whether it was a real hold.)

   NO GOLD. The hairline stays the standing ink weight and the register stays Inter: gold is this
   house's one meaning, ALIVE RIGHT NOW, and a miss is the opposite of alive. Nothing moves,
   nothing is added to the corner; only the INK steps.

   THE WORDS ARE THE CUE; THE INK ONLY HAS TO LET THEM BE READ. The two sentences are nothing
   alike ("— didn't catch that…" against "prefer typing? use this space") and the glyph flinches
   on the same frame — so the ink is not carrying the meaning, only the legibility. Which means
   it is load-bearing in exactly the dresses that draw the placeholder as a .28 WHISPER (the
   corner throat, and the paper pass's gb-live answer): a whisper is legible enough to ignore
   and not legible enough to READ, and this line has to be read once. The dresses that already
   firmed the placeholder for bright ground (the chip's .46, the leaf foot's .72) need a step,
   not a rescue, and get one.

   EACH IS MET AT ITS OWN WEIGHT, NAMED. surface.css and guidebook.css both load after this file
   and both ink this pseudo-element; a plain two-class selector would have been silently dead in
   the DEFAULT dress — the exact trap this file's own history records. And :not(.mic-hold) keeps
   the cue off the one frame where the two states overlap: the open-mic carve misses by
   end-of-speech BEFORE the release, and while a channel is still live the line's words are
   HEARD's, not the miss's. */
body.throat-on.mic-missed:not(.mic-hold) #c-input::placeholder,
body.throat-on.mic-missed:not(.mic-hold).gb-live:not(.gb-raw) #c-input::placeholder {
  color: rgba(218, 225, 234, .58);
}
body.chrome-bc.throat-on.mic-missed:not(.mic-hold) #c-input::placeholder,
body.chrome-bc.throat-on.mic-missed:not(.mic-hold).gb-live:not(.gb-raw) #c-input::placeholder {
  color: rgba(218, 225, 234, .72);
}
/* the leaf foot (the DEFAULT dress) — surface.css's own daylight firming, one step further */
body.surface-leaf.throat-on.mic-missed:not(.mic-hold) #leaf-foot #c-input::placeholder,
body.surface-leaf.mic-missed:not(.mic-hold) #concierge:not(.paper) #c-input::placeholder {
  color: rgba(232, 237, 243, .88);
  text-shadow: 0 1px 3px rgba(6, 8, 12, .95);
}

/* ── the desk's own laws, re-declared for a line that has left the desk's box ───────────────────
   #c-form used to inherit all of these from #concierge. Re-parented, it must still obey them —
   the throat is the desk's mouth wherever it is drawn. Same transitions, same metronome. */
body.throat-on.desk-down #c-form,
body.throat-on.film-mode:not(.film-desk) #c-form {
  opacity: 0; pointer-events: none;
  transition-duration: var(--beat-half);
}
body.throat-on.desk-down #c-input, body.throat-on.desk-down #c-send,
body.throat-on.film-mode:not(.film-desk) #c-input,
body.throat-on.film-mode:not(.film-desk) #c-send { pointer-events: none; }
/* THE DESK YIELDS TO THE HAND — a grip on the balloon takes the frame; the line dims with it */
body.throat-on.desk-yield #c-form { opacity: .3; }
body.throat-on.desk-yield #c-input, body.throat-on.desk-yield #c-send { pointer-events: none; }

/* ── the paper pass's row-on-cream inking, answered ─────────────────────────────────────────────
   guidebook.css inks #c-input dark-on-cream because the row sat ON the sheet. It no longer
   does: the sheet ends at --mic-foot and the throat is below it, on the instrument's own dark
   ground. Same specificity, later file. */
body.throat-on.gb-live:not(.gb-raw) #c-input {
  color: var(--ink);
  border-bottom-color: transparent;
  caret-color: var(--amber);
}
body.throat-on.gb-live:not(.gb-raw) #c-input::placeholder { color: rgba(218, 225, 234, .28); }
body.throat-on.gb-live:not(.gb-raw) #c-input:focus { border-bottom-color: transparent; }
body.throat-on.gb-live:not(.gb-raw) #c-send { color: rgba(218, 225, 234, .5); }
body.throat-on.gb-live:not(.gb-raw) #c-send:hover { color: var(--bright); }

/* --mic-foot IS NOT THIS FILE'S TO RECLAIM. The first cut dropped it to 62px to bring the sheet
   down over the space the row had vacated — and the chrome acts caught it immediately: 84px is
   not padding, it is THE CLEARANCE that keeps the desk's box off the mic's, solved at 900/800/
   700px and asserted three times over ("nor the mic, and the desk stands clear of the mic too").
   The mic's top sits 82px off the bottom edge, so there was never any room there to take. The
   throat lives INSIDE the reserve the corner already had, and the desk keeps its ruled seat. */

@media (prefers-reduced-motion: reduce) {
  body.throat-on #c-form, body.throat-on #c-input, body.throat-on #c-send { transition: none; }
}

/* ══ FIX-CHIP-OPENS · THE THROAT MOVES TO THE CHIP (?chrome=a|b) ══════════════════════════════
   HISTORY, plainly: this file NEVER IMMIGRATED with talkmic — the JS half (re-parent to body,
   publish --throat-bottom, raise body.throat-on) crossed at F8 and the dress stayed in the
   quarry, so the ask line rendered at viewport 0,0 in EVERY dress, corner included. That was
   the true mechanism under the adversary's "no ask line ever mounts" (second sitting, blocker).
   The corner rules above restore variant C verbatim; this chapter seats the line for the
   bottom-center chip (chrome-bc adopts the mic, so the line follows its instrument home).
   Same-specificity overrides, later in the file — the file stays the throat's one owner. */
body.chrome-bc.throat-on #c-form {
  left: 50%; right: auto; transform: translateX(-50%);
  width: min(440px, 92vw);
  bottom: 84px;                    /* on the chip's shoulder (chip 16 + main ~52 + breath) */
}
body.chrome-bc.throat-on #c-send { margin-right: 0; }  /* no corner stand to clear */
body.chrome-bc.throat-on.film-mode #c-form { bottom: 142px; }  /* the chip steps over the transport; the line rides it */
/* film-mode hides the throat unless the desk stands (rule above) — under the chip dress the
   desk-open state is the engagement itself, so the line shows whenever the desk is up */
body.chrome-bc.throat-on.film-mode.film-desk #c-form,
body.chrome-bc.throat-on.film-mode:not(.desk-down) #c-form { opacity: 1; pointer-events: none; }
body.chrome-bc.throat-on.film-mode:not(.desk-down) #c-input,
body.chrome-bc.throat-on.film-mode:not(.desk-down) #c-send { pointer-events: auto; }
@media (max-width: 640px) {
  body.chrome-bc.throat-on #c-form { bottom: 72px; width: 90vw; }
  body.chrome-bc.throat-on.film-mode #c-form { bottom: calc(138px + env(safe-area-inset-bottom, 0px)); }
}

/* ══ THE LINE READS ON ANY GROUND (default-dress seat, 2026-09-07) ═══════════════════════════
   The corner throat always stood on the sheet's own vignette; the chip's throat (chrome-bc)
   stands on LIVE MAP — and over bright daylight satellite the .28 placeholder drowned (the
   founder's ask-line conviction, recreated at the sheet's top edge). The fix is the house's
   own answer: the desk vignette under the line — a floor, not a wall — and a firmer quiet
   ink for the placeholder only while the line stands on the film. */
body.chrome-bc.throat-on #c-form::before {
  content: ''; position: absolute; inset: -12px -16px -8px; z-index: -1;
  background: radial-gradient(ellipse at 50% 100%, rgba(6, 8, 12, 0.55), rgba(6, 8, 12, 0) 76%);
  pointer-events: none;
}
body.chrome-bc.throat-on #c-input::placeholder { color: rgba(218, 225, 234, 0.46); }

/* ══ THE PRECISE FIX (founder 2026-09-03/07) ════════════════════════════════════════════════
   Two quiet doors, never a boot prompt: the offered chip (#c-locate-line rides the rail's
   own offer register) and the volunteer's ⌖ in the throat. Dim gold — an instrument, not a
   banner; gone for the session on deny, gone for good on grant. */
#c-locate-line .gb-offer { color: rgba(212, 175, 96, 0.75); }
#c-locate-line .gb-offer:hover, #c-locate-line .gb-offer:focus { color: rgba(232, 200, 130, 1); }
#c-locate-glyph {
  background: none; border: none; cursor: pointer; padding: 0 6px;
  font-size: 15px; line-height: 1; color: rgba(212, 175, 96, 0.4);
  transition: color 240ms ease;
}
#c-locate-glyph:hover, #c-locate-glyph:focus { color: rgba(232, 200, 130, 0.95); }

/* THE OFFER LIVES AS LONG AS ITS ASK (fourteenth sitting): the chip's home is the throat —
   floated just above the ask line, outside every tray wipe. */
#c-locate-line {
  position: absolute; bottom: calc(100% + 10px); left: 0;
  pointer-events: auto; white-space: nowrap;
}

/* ──────── /css/deck.css ──────── */
/* ── 05 THE DECK ── the deck's own two surfaces: THE MARQUEE and the resume chip.
   Minimal by law — brief 07 dresses; these are the behaviour's testable clothes.
   The transport is film.js's hairline (#film-bar); the deck mounts NO bar, ever. */

#deck-marquee {
  position: fixed; inset: 0; z-index: 60;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 22px; background: rgba(4, 6, 10, 0.55);
  cursor: pointer; user-select: none;
  opacity: 1; transition: opacity 240ms ease;
}
#deck-marquee.gone { opacity: 0; pointer-events: none; }
#deck-marquee #dm-title {
  font-family: 'Playfair Display', Georgia, serif;
  font-size: 30px; letter-spacing: 0.04em; color: #ecf0f5;
  text-shadow: 0 1px 12px rgba(0, 0, 0, 0.7);
}
#deck-marquee #dm-tri {
  width: 72px; height: 72px;
  /* stroke only, NO seal/circle behind it (the ink-mic ruling); the breath is the signal.
     ── 07 THE CHROME ── the breath is ONE metronome cycle (1600ms, 0→50→100), matching the
     quarry's landed film-marquee and the arrival's gate hint — `alternate` doubled the period
     and the house breathes together. */
  animation: dm-breath 1600ms ease-in-out infinite;
  filter: drop-shadow(0 0 14px rgba(245, 196, 105, 0.3));
}
#deck-marquee #dm-tri path {
  /* ── 07 THE CHROME ── the stroke wore a second gold; the GOLD LAW (STYLE-GUIDE §2.2)
     unifies every accent to the one dot gold. */
  fill: none; stroke: #f5c469; stroke-width: 2.5; stroke-linejoin: round;
}
@keyframes dm-breath { 0%, 100% { opacity: 0.65; } 50% { opacity: 1; } }
#deck-marquee #dm-hint {
  /* ── 07 THE CHROME ── the house mono is Space Mono; tracking stays 0.34em (the landed
     film-marquee's own line register — prod parity beats harmonization here). */
  font-family: 'Space Mono', ui-monospace, monospace;
  font-size: 10.5px; letter-spacing: 0.34em; text-indent: 0.34em; color: rgba(236, 240, 245, 0.78);
}

#deck-resume {
  /* ── 07 THE CHROME ── one gold (§2.2), house mono, eyebrow tracking (the .22em register). */
  position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%); z-index: 55;
  font-family: 'Space Mono', ui-monospace, monospace; font-size: 10.5px; letter-spacing: 0.22em;
  color: #f5c469; background: rgba(12, 14, 20, 0.72); backdrop-filter: blur(12px);
  border: 1px solid rgba(245, 196, 105, 0.45); border-radius: 0; /* square corners, house law */
  padding: 9px 14px; cursor: pointer;
  transition: border-color var(--beat-half) var(--ease-chrome);
}
#deck-resume:hover { border-color: #f5c469; }

/* ── 05 THE DECK ── L11's door must be reachable: the film bar (z 32, full-width) was a touch
   wall over the mic (wrap z 20) — the checkpoint baseline's known seam red (wingman: "the mic
   tap never reaches"), reproduced here by elementFromPoint. During a film the mic rides ABOVE
   the transport so the mic tap exists at all; brief 07 owns the collision's final dress. */
body.film-mode .tmic-wrap { z-index: 40; }

/* ──────── /css/arrival.css ──────── */
/* ── 10 THE ARRIVAL ── the sign-on chrome (minimal register — 07 dresses).
   Ink #ecf0f5, gold #f5c469 reserved, square corners, type bare on the vignette (no boxes).
   ZERO BUTTONS: no door chips exist here — the lamp line is the one replay door. */

@font-face {
  font-family: 'Codystar';
  src: url('/fonts/codystar.woff2') format('woff2');
  font-display: swap;
}

body.arrival-stands #masthead { display: none; } /* the arrival masthead IS the wordmark */

#arrival { position: fixed; inset: 0; pointer-events: none; z-index: 24; color: #ecf0f5; }

#arr-masthead { position: absolute; top: 18px; left: 20px; }
#arr-wordmark { font-family: 'Codystar', monospace; font-size: 2.3rem; letter-spacing: 0.12em; color: #f5c469;
  position: relative; }
/* THE STAGE, NOT THE ACTOR (founder 2026-09-08: the Codystar face is brand-sacred; only its
   ground may be dressed). The quarry's hard-won recipe verbatim (tokens.css .wm-text::before,
   STYLE-GUIDE §"copy it, don't reinvent it"): a frosted-blur patch with a long radial feather —
   it blurs busy satellite behind the dots so the gold reads, and is invisible over the dark
   globe. This closes the standing bright-ground washout without touching the face. */
#arr-wordmark::before { content: ''; position: absolute; inset: -6px -18px; z-index: -1;
  pointer-events: none;
  /* the ground dressing, strengthened for tan/busy terrain (founder f01 washout): heavier
     blur + a feathered dark scrim so the gold reads on ANY ground; the scrim feathers to
     nothing, so it stays invisible over the dark globe (the face is never touched) */
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  background: radial-gradient(120% 165% at 50% 50%, rgba(6, 8, 12, 0.5) 8%, rgba(6, 8, 12, 0.28) 42%, transparent 78%);
  -webkit-mask-image: radial-gradient(130% 175% at 50% 50%, #000 20%, transparent 86%);
  mask-image: radial-gradient(130% 175% at 50% 50%, #000 20%, transparent 86%); }
/* THE MARQUEE GLINT — the census dial's heir: one bulb of the lit sign swells and settles.
   Gold-law clean (the wordmark is on the gold list; glint means alive).
   THE COLD OPEN seats the GATE's lockup from the same bulbs (cold-open.mjs seatBulbs/armGlint,
   one body): a held ceremony has to stay ALIVE, and the glint is the aliveness. */
#arr-wordmark .wm-l, #arr-gate-word .wm-l { display: inline-block; }
#arr-wordmark .wm-l.glint, #arr-gate-word .wm-l.glint { animation: wm-glint 1.2s ease-in-out; }
@keyframes wm-glint {
  0%, 100% { color: #f5c469; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4); }
  45% { color: #ffe9b8; text-shadow: 0 0 12px rgba(245, 196, 105, 0.85), 0 1px 2px rgba(0, 0, 0, 0.4); } }
@media (prefers-reduced-motion: reduce) { #arr-wordmark .wm-l.glint, #arr-gate-word .wm-l.glint { animation: none; } }
#arr-tagline { font-family: 'Space Mono', monospace; font-size: 0.62rem; letter-spacing: 0.34em; opacity: 0.72; margin-top: 2px; }

/* THE COMPOSED MASTHEAD (founder 2026-09-08): one left edge, hierarchy by scale, tight
   vertical rhythm — a station ident, not a sidebar. wordmark → tagline → dial → clock →
   program line, each subordinate to the one above. */
/* THE PLANET FACT (founder 2026-09-08, amended): the census reads at globe altitude and
   retires on descent — a composed fade on the metronome; the seam's hysteresis lives in JS. */
#arr-dial { margin-top: 10px; display: flex; gap: 8px; align-items: baseline;
  transition: opacity 600ms var(--ease-chrome), transform 600ms var(--ease-chrome); }
#arr-dial-n { font-family: 'Codystar', monospace; font-size: 1.9rem; color: #f5c469; min-width: 3.2ch; }
#arr-dial-label { font-family: 'Space Mono', monospace; font-size: 0.6rem; letter-spacing: 0.22em; line-height: 1.5; opacity: 0.72; }
#arrival.dial-built #arr-dial { animation: none; opacity: 1; } /* post-build, the class rules the fade */
#arrival.dial-off #arr-dial { opacity: 0 !important; transform: translateY(-4px); pointer-events: none; }

/* THE IDENT QUIETS FOR CINEMA: during a film the station drops to a whisper (the movie owns
   the frame); a glance restores it. The clock keeps its own quiet at the corner. */
body.film-mode #arr-masthead { opacity: 0.55; transition: opacity 600ms var(--ease-chrome); }
body.film-mode #arr-masthead:hover { opacity: 1; }
body.film-mode #arrival #arr-ticker { opacity: 0.75 !important; } /* !important beats the build animation's fill — the dial-off precedent */
#arrival.ticker-built #arr-ticker { animation: none; opacity: 1; } /* post-build, state rules own the fade */
/* THE CLOCK YIELDS TO CAPTIONS: the lower-third caption (#caption-band.cap-on) shares the
   bottom band — idle furniture steps aside for performance text, on the metronome. */
#arr-ticker { transition: opacity 400ms var(--ease-chrome); }
body:has(#caption-band.cap-on) #arrival #arr-ticker { opacity: 0 !important; pointer-events: none; }

#arr-lamp { margin-top: 9px; font-family: 'Space Mono', monospace; font-size: 0.62rem; letter-spacing: 0.22em; /* ── 07 ── the one tracking register */
  opacity: 0.8; pointer-events: auto; cursor: pointer; user-select: none; }
#arr-lamp .jewel { display: inline-block; width: 7px; height: 7px; border-radius: 50%; background: #f5c469;
  box-shadow: 0 0 8px 2px rgba(245, 196, 105, 0.55); vertical-align: 1px; animation: arr-jewel 1.6s ease-in-out infinite; }
@keyframes arr-jewel { 0%, 100% { opacity: 1; } 50% { opacity: 0.45; } }

#arr-captions { position: absolute; left: 20px; bottom: 92px; max-width: min(46ch, 68vw);
  font-family: 'Playfair Display', serif; font-style: italic; font-size: 1.14rem; line-height: 1.5;
  text-shadow: 0 1px 8px rgba(0, 0, 0, 0.8); opacity: 0; transition: opacity 240ms var(--ease-chrome); } /* ── 07 ── --beat-fast */
#arr-captions.on { opacity: 1; }

/* THE STATION CLOCK (founder 2026-09-07): the board is broadcast identity — it sits in the
   masthead column beneath the dial, at station-clock scale (smaller tiles than the old
   bottom marquee). The masthead's own film/boot behavior governs it whole. */
/* THE STATION CLOCK AT THE CORNER (founder 2026-09-08: "the flipclocks can now live at the
   bottom of the screen now that the concierge has moved to the right") — bottom-left is the
   open corner: captions/talk own center, credit rail owns right, the leaf owns the right wall.
   Solari tiles carry their own dark ground, so the corner needs no scrim on any fabric. */
#arr-ticker { position: fixed; left: 20px; bottom: 18px; z-index: 30; display: flex; gap: 2px; }
#arr-ticker .sb-tile { width: 11px; height: 17px; background: #0b0e13; border: 1px solid #1a1f29;
  font-family: 'Space Mono', monospace; font-size: 8px; line-height: 14px; text-align: center;
  color: rgba(236, 240, 245, 0.5); }  /* a clock in the ident's corner, not a departure board */
#arr-ticker .sb-tile { font-size: 9px; line-height: 15px; }
#arr-ticker.live .sb-tile { color: #fff; }
#arr-ticker .sb-tile.blank { background: transparent; border-color: transparent; color: transparent; } /* left-set board: trailing blanks are invisible, not leader-dot debris */
#arr-ticker .sb-tile.flip { animation: arr-flip 120ms ease-in; } /* ── 07 ── snapped to --beat-half */
@keyframes arr-flip { 0% { transform: scaleY(1); } 50% { transform: scaleY(0.12); } 100% { transform: scaleY(1); } }

#arr-flare { position: absolute; left: 0; top: 0; pointer-events: none; }
#arr-flare .ring { width: 26px; height: 26px; margin: -13px 0 0 -13px; border: 1.5px solid #f5c469;
  border-radius: 50%; animation: arr-ring 1.6s ease-out infinite; }
@keyframes arr-ring { 0% { transform: scale(0.55); opacity: 0.9; } 100% { transform: scale(1.5); opacity: 0; } }
#arr-flare .nm { position: absolute; left: 16px; top: -7px; font-family: 'Space Mono', monospace;
  font-size: 0.6rem; letter-spacing: 0.22em; color: #f5c469; white-space: nowrap;
  text-shadow: 0 1px 6px rgba(0, 0, 0, 0.9); }

/* the gate — the lockup is the boot card AND (first visit) the gesture-catcher */
#arr-gate { position: fixed; inset: 0; z-index: 60; background: #04060a;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  transition: opacity 240ms ease; }
#arr-gate.gone { opacity: 0; pointer-events: none; }
#arr-gate-word { font-family: 'Codystar', monospace; font-size: clamp(2.2rem, 7vw, 4.4rem);
  letter-spacing: 0.14em; color: #f5c469; }
#arr-gate-tag { font-family: 'Space Mono', monospace; font-size: 0.68rem; letter-spacing: 0.4em;
  color: rgba(236, 240, 245, 0.75); }
/* THE INVITATION IS NOT A CAPTION (founder-caught 2026-09-10, HIGH: he sat on the wordmark for
   an HOUR). This line shipped at 0.62rem — and the house root is `font: 14px/1.45`, so that is
   EIGHT POINT SIX EIGHT PIXELS of 85%-opacity gold alone on a black screen. The one instruction
   that starts the entire product was a whisper, and the marquee's glint next to it read as
   "flashing", which read as stuck. It is the front door: it gets the front door's weight.
     · SIZE sits in the ident's own scale, not a magic number: the lockup is clamp(2.2rem, 7vw,
       4.4rem) and this is the same shape one order down — ~13px on a phone, ~17px at 1440,
       roughly a quarter of the wordmark at every width. Second-loudest thing on the screen.
     · GOLD at full strength. Gold-law clean: this IS the invitation, the same amber as the sign.
     · THE PULSE READS LIVE, NOT BROKEN. The old arr-breathe swung 0.35→1 every 1.6s — at 9px
       that is a flicker. arr-invite breathes 0.78→1 over 2.4s with a soft gold swell behind it:
       alive, unhurried, unmistakably a thing you may press. Reduced motion holds it steady lit.
   It stands from the gate's first paint (cold-open.mjs mounts it with the tap door that actually
   works) and retires only when the gesture is given — so through the whole slow-connection hold,
   for as long as a tap is what the house is waiting for, the invitation is on screen. */
#arr-gate-hint { margin-top: 40px; font-family: 'Space Mono', monospace;
  font-size: clamp(0.95rem, 1.25vw, 1.2rem); font-weight: 700; letter-spacing: 0.26em;
  text-indent: 0.26em; /* the tracking's trailing gap, given back so the line reads centred */
  color: #f5c469; /* (the pulse itself is armed with the gate's stagger, further down) */ }
@keyframes arr-invite {
  0%, 100% { opacity: 0.78; text-shadow: none; }
  50% { opacity: 1; text-shadow: 0 0 14px rgba(245, 196, 105, 0.42); } }
@keyframes arr-breathe { 0%, 100% { opacity: 0.35; } 50% { opacity: 1; } }

/* THE SLOW CEREMONY HOLDS (founder 2026-09-10, THE COLD OPEN): on a measurably slow pipe the
   ident EXTENDS rather than cutting to a dark globe — the lockup stays, the marquee keeps
   glinting, and ONE quiet line breathes in below the tagline. Not the hint's gold and not its
   size: this line is the house talking to itself, dim and mono, lower-case where the ceremony
   is upper. No spinner, no percentage, nothing app-like — the dark reads as intended theatre,
   never as a hang. It leaves the moment sound starts (cold-open.mjs tuneDown).
   (Sized off the same lesson as the hint above: 0.6rem here would be 8.4px, the very whisper
   the founder could not see. Quiet is a matter of weight and colour, not of being too small
   to read — this is ~11px at full width, plainly legible and plainly subordinate.) */
#arr-gate-tune { margin-top: 14px; font-family: 'Space Mono', monospace; font-size: 0.78rem;
  letter-spacing: 0.26em; color: rgba(236, 240, 245, 0.46);
  opacity: 0; animation: arr-up 0.8s ease forwards, arr-breathe 2600ms ease-in-out 0.8s infinite;
  transition: opacity 200ms ease; }
#arr-gate-tune.gone { animation: none; opacity: 0; }
#arr-gate-hint.gone { animation: none; opacity: 0; transition: opacity 200ms ease; }
@media (prefers-reduced-motion: reduce) {
  #arr-gate-tune { animation: none; opacity: 0.55; } }
/* (the invitation's still variant lives with its stagger rule further down — a media query adds
   no specificity, so it has to be the LAST word on #arr-gate-hint's animation, not the first.) */

/* THE CURTAIN IS RETIRED (founder 2026-09-09 amendment, live-prod forensic: "nearly
   invisible… miss it and the concierge never speaks"). #arr-curtain was one quiet
   0.62rem line over the lit globe for a blocked RETURN boot — too subtle to trust with
   the one job of getting a tap. arrival.js's holdTheGate() now re-raises the actual
   #arr-gate (wordmark + tagline, never dropped for this branch) and grows the SAME
   #arr-gate-hint above at full gate prominence instead. No CSS of its own to carry. */

/* THE SOUND OFFER — the skeletal returner's light curtain: the welcome-back line already
   printed as the one-line silent film, so the cue is small and patient (never a hold).
   Seats in the leaf's seed when the leaf stands (a plain in-flow chip, the seed's own
   contrast carries it); falls back to a quiet fixed line over the bare world otherwise —
   THE CUE MUST SURVIVE THE FALLBACK (founder 2026-09-09: leaf-seed may not be mounted
   yet) — so the fixed case gets its own scrim pill: legible over map, strip, or ticker
   alike, never resting on text-shadow alone. Gold = a live offer. */
#arr-soundcue { position: fixed; left: 50%; bottom: 21vh; transform: translateX(-50%);
  z-index: 40; font-family: 'Space Mono', monospace; font-size: 0.6rem; letter-spacing: 0.3em;
  color: rgba(245, 196, 105, 0.92); text-shadow: 0 1px 8px rgba(4, 6, 10, 0.9);
  background: rgba(4, 6, 10, 0.55); padding: 7px 16px; border-radius: 999px;
  animation: arr-breathe 1600ms ease-in-out infinite; transition: opacity 240ms ease; pointer-events: none; }
#leaf-seed #arr-soundcue { position: static; transform: none; align-self: center;
  padding: 3px 0 1px; text-shadow: none; background: none; border-radius: 0; }
#arr-soundcue.gone { opacity: 0; animation: none; }

@media (max-width: 640px) { /* the portrait stack: masthead shrinks, the corner clock tucks */
  #arr-wordmark { font-size: 1.6rem; }
  #arr-dial-n { font-size: 1.5rem; }
  #arr-ticker { left: 12px; bottom: calc(12px + env(safe-area-inset-bottom, 0px)); }
  #arr-ticker .sb-tile { width: 10px; height: 15px; font-size: 8px; line-height: 13px; }
  #arr-captions { bottom: 168px; font-size: 1rem; }
}

/* (THE HALO retired 2026-09-08 — see arrival.js tombstone: a modeled limb lied at scale) */

/* ── FIX-FIRST-FIVE (adversary D, phone-memphis-03): at phone widths the live ticker and the
   desk's resting hint shared the lower band — two instruments, one shelf. While the broadcast
   is ON AIR the hint yields (the broadcast IS the pitch); it returns the moment the lamp goes
   quiet. Desktop keeps both — the band is wide enough there. ── */
@media (max-width: 480px) {
  body.broadcast-live #c-status { opacity: 0; pointer-events: none; transition: opacity 240ms ease; }
}

/* ══ IGNITION-PLAYS (founder: "no dawn, none of the choreography… brighten and dim in place") ══ */

/* THE VEIL — the still-dark scene the promise glimmers through. Above the canvas and the halo,
   below every piece of chrome (#arrival is z24, the gate z60). Driven per-frame by arrival.js
   (deterministic keyframes, the BROKEN BULB guard) — no CSS transition of its own. */
#arr-dark { position: fixed; inset: 0; z-index: 20; background: #04060a; opacity: 0; pointer-events: none; }

/* THE WORDMARK SEQUENCE (prototype globe-signon.html:48-62, ported): the masthead BUILDS —
   each element rises 12px and fades on its own beat. Runs once, when the gate drops. */
@keyframes arr-up { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
#arrival #arr-wordmark, #arrival #arr-tagline, #arrival #arr-dial, #arrival #arr-ticker, #arrival #arr-lamp { opacity: 0; }
#arrival.built #arr-wordmark { animation: arr-up 0.9s ease 0.45s forwards; }
#arrival.built #arr-tagline { animation: arr-up 0.8s ease 0.75s forwards; }
#arrival.built #arr-dial { animation: arr-up 0.9s ease 1.05s forwards; }
#arrival.built #arr-lamp { animation: arr-up 0.8s ease 1.35s forwards; }
#arrival.built #arr-ticker { animation: arr-up 0.8s ease 1.6s forwards; }

/* THE ARCHIVAL STRIP (founder 2026-07-20): the stop's photograph as LETTERBOXING along the
   bottom edge — 38vh dress, the solari ticker living inside it (the ticker's own fixed seat
   at bottom:40px lands within the band; z-order keeps it on top). Rises after the name lands,
   leaves as the next run-up begins; .strike kills it instantly (STRIKE THE SET, 07-31). */
#arr-strip { position: fixed; left: 0; right: 0; bottom: 0; height: 38vh; z-index: 22;
  transform: translateY(102%); transition: transform 700ms cubic-bezier(0.22, 0.8, 0.24, 1);
  pointer-events: none; overflow: hidden;
  background: linear-gradient(to top, rgba(4, 6, 10, 0.92), rgba(4, 6, 10, 0.55) 70%, rgba(4, 6, 10, 0)); }
#arr-strip img { width: 100%; height: 100%; object-fit: cover; display: block;
  opacity: 0.88; mask-image: linear-gradient(to top, rgba(0,0,0,1) 78%, rgba(0,0,0,0)); 
  -webkit-mask-image: linear-gradient(to top, rgba(0,0,0,1) 78%, rgba(0,0,0,0)); }
#arr-strip img:not([src]) { visibility: hidden; }
#arr-strip.on { transform: translateY(0); }
#arr-strip.strike { transition: none; }
@media (prefers-reduced-motion: reduce) { #arr-strip { transition: opacity 240ms ease; transform: none; opacity: 0; } #arr-strip.on { opacity: 1; } }

/* the gate's own lines build on the same stagger (the wordmark assembles over black) */
#arr-gate-word { opacity: 0; animation: arr-up 0.9s ease 0.45s forwards; }
#arr-gate-tag { opacity: 0; animation: arr-up 0.8s ease 0.75s forwards; }
/* THE INVITATION RISES LAST AND THEN BREATHES. This rule used to end at `arr-up … forwards`,
   which — being the later `animation` declaration — silently cancelled the pulse defined with
   the hint's dress above. Both run: the stagger seats it a beat after the tagline (the eye
   arrives at wordmark → tagline → the thing you press), and arr-invite takes over from there
   and never stops while a tap is what the house is waiting for. The gate's door now works from
   its first paint (cold-open.mjs), so the invitation no longer waits on mountArrival to be true. */
#arr-gate-hint { opacity: 0;
  animation: arr-up 0.8s ease 0.9s forwards, arr-invite 2400ms ease-in-out 1.7s infinite; }
/* …and the still variant has to sit AFTER that rule, not with its siblings above: a media query
   adds no specificity, so the earlier reduced-motion block would simply lose to this one. */
@media (prefers-reduced-motion: reduce) { #arr-gate-hint { animation: none; opacity: 1; } }

/* ── THE TICKET IN THE MASTHEAD (founder 2026-09-08: "the resume chip should replace the
   replay line on top left"). The parked ticket takes the REPLAY line's slot — the column
   shows the most relevant program action; resume outranks replay. Station register. */
#arr-masthead #deck-resume { position: static; left: auto; bottom: auto; transform: none;
  display: block; margin-top: 9px; padding: 0;
  border: none; background: none; backdrop-filter: none;
  font-size: 10px; letter-spacing: 0.2em; z-index: auto;
  color: #f5c469;
  text-shadow: 0 0 2px rgba(6, 8, 12, 0.98), 0 1px 5px rgba(6, 8, 12, 0.95), 0 0 16px rgba(6, 8, 12, 0.7);
  transition: color 240ms cubic-bezier(0.22, 1, 0.36, 1); }
#arr-masthead #deck-resume:hover { color: #ffd98a; }
#arr-masthead:has(#deck-resume) #arr-lamp { display: none; }
/* the ticket is an INSTRUMENT on the arrival glass — it catches the hand itself (the
   arrival root is pointer-events:none; the book-tab lesson, applied at adoption time) */
#arr-masthead #deck-resume { pointer-events: auto; cursor: pointer; }

/* ──────── /css/chrome.css ──────── */
/* ── 07 THE CHROME ── the shared register sheet: cross-organ dress that belongs to the system,
   not to one organ. Constitution: STYLE-GUIDE §2 (one gold #f5c469 = alive right now), §3
   (five faces; eyebrows at .22em), §5.1 (the metronome — every breath is one 1600ms cycle,
   everything that breathes breathes together), square corners on every BOX (map.css enforces
   the film-print signature globally). */

/* THE DRAWN CIRCLES EXEMPTION — the global `border-radius: 0 !important` (the film-print
   signature) is a law about boxes and panels. A drawn instrument that IS a circle — the ON AIR
   jewel, the aim's flare ring, the scrub thumb — was rendering square (measured: computed
   radius 0px on the flare ring). These are objects, not chrome boxes; they keep their geometry. */
#arr-lamp .jewel { border-radius: 50% !important; }
#arr-flare .ring { border-radius: 50% !important; }
#ember-hover .eh-ring { border-radius: 50% !important; } /* the hover reveal's gold-capped ring — a drawn object, not a box */
#film-bar.awake input[type=range]::-webkit-slider-thumb { border-radius: 50% !important; }
#film-bar.awake input[type=range]::-moz-range-thumb { border-radius: 50% !important; }

/* THE HAIRLINE IS THE ONLY TRANSPORT — belt over braces: if any future surface mounts a
   persistent transport band, it does not get to look like one. (The deck mounts NO bar by law;
   #film-bar asleep is a 2px line. This rule documents the law where the sheets meet.) */
/* (no selector — the law lives in deck.css's header and PLAYBACK-SPEC; acts enforce it) */

/* THE INK CARRIES ITS OWN NIGHT (adversary, sixth sitting: wordmark, dial and the ON AIR
   line washed out over daylight satellite at close zoom — the demolished hour-dress used to
   darken the world under them, and chrome that borrowed the world's darkness owned none of
   its own). Standing chrome TEXT guarantees its own legibility on any ground: the
   instrument's two-layer ink shadow (.tmic-glyph's idiom), never a re-tint of the world
   (the grading demolition is founder law). Subtle by construction — on the dark globe these
   shadows vanish into the ground; over daylight they are the difference between chrome and
   nothing. */
#arr-wordmark, #arr-tagline, #arr-dial-n, #arr-dial-label, #arr-lamp,
#masthead .wordmark, #masthead .sub,
body.broadcast-live #desk-chip .chip-label {
  text-shadow: 0 1px 2px rgba(6, 8, 12, 0.85), 0 2px 10px rgba(6, 8, 12, 0.6), 0 0 18px rgba(6, 8, 12, 0.45);
}
#arr-lamp .jewel { box-shadow: 0 1px 3px rgba(6, 8, 12, 0.7); }

/* EVERY-DETAIL: the bottom-center board and the throat share an edge in the corner dress —
   while the listener is TYPING, the ask line owns the bottom; the board yields for exactly
   that long (variant A already rules this via the desk's own expansion). */
/* (station clock: the input-focus fade died with the bottom board — typing no longer
   shares a corner with the clock) */

/* ── THE CREDIT RAIL — one home for every credit-shaped line (the credit law's dress;
   founder frame: the monument cite printed stranded raw at the bottom-left edge). Credits
   dock with the imagery attribution in the bottom-right register — small, quiet,
   right-shored, stacked just above the map's own line. A credit joins the rail or it
   doesn't print; nothing credit-shaped floats loose again. */
#credit-rail { position: fixed; right: 12px; bottom: 30px; z-index: 17; display: flex;
  flex-direction: column; align-items: flex-end; gap: 3px; pointer-events: none; }
#credit-rail .credit-line { font: 9.5px ui-monospace, monospace; letter-spacing: 0.14em;
  color: rgba(238, 241, 246, 0.55); text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
  text-transform: uppercase; }
body.film-mode #credit-rail { bottom: 64px; } /* the transport owns the bottom edge */

/* ── THE SEED LINE — one shared number for the bottom instruments' resting centerline
   (founder 2026-09-08: "at street level [the balloon] should line up with the talk to me
   panel"). TWO ORGANS REFERENCE THIS: the talk seed (surface-paradigm — bottom-right
   anchored, growing upward) rests its centerline here; the balloon rail (balloon.js) holds
   its STREET stop's centerline here and grows upward — bookends at the same line. Change
   it in one place or not at all. */
:root { --seed-line: 44px; }

/* the house attribution: the rail's ⓘ (always visible, quiet) + the line it peeks open.
   Same family as the monument cite — furniture, never a vendor sticker. */
#attrib-row { display: flex; align-items: center; gap: 6px; pointer-events: none; }
#attrib-info { background: none; border: none; padding: 2px 4px; cursor: pointer;
  pointer-events: auto; font: 11px ui-monospace, monospace;
  color: rgba(238, 241, 246, 0.4); text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);
  transition: color 240ms cubic-bezier(0.22, 1, 0.36, 1); }
#attrib-info:hover { color: rgba(238, 241, 246, 0.8); }

/* ──────── /css/balloon.css ──────── */
/* THE BALLOON — carved verbatim from quarry style.css 680–797 at 8dfb2fbe lineage (the
   import-balloon seat, 2026-09-04). Laws in js/balloon.js. The film-mode seat rule and
   desk-yield crossed earlier with film.css/desk.css (dead selectors now live). */
/* ══ THE BALLOON — the altitude instrument, THE THREE-LAYER MODEL ═══════════════════════════
   Laws in js/balloon.js's header (founder-final, inherited from the shipping app). Two opacity
   layers on ONE geometry: the PANEL (hairline + named stops) fades as a group, the BALLOON
   (always touchable) has its own dim/bright register. House chrome only — the balloon wears no
   claim color. The metronome, local (luna carries no tokens.css): exits half-beat 120ms,
   entrances fast-beat 240ms, one chrome easing. */
.brail {
  --balloon-rest: 0.5;                       /* between --ink-faint .38 and --ink-soft .62 */
  /* THE EDGE LAW (founder ruling 2026-09-08): LEFT = the station + the world's instruments;
     RIGHT = the conversation + the book; BOTTOM = captions + the talk instrument. The
     balloon is a world instrument — it lives on the LEFT edge, mid-band below the masthead
     column, at a FIXED home (the glide-away-from-panels behavior is retired: the rail
     dodges nothing; muscle memory over choreography). Geometry mirrors the old right seat:
     16px off the edge, 9px side padding, the hairline 40px off the edge, the balloon riding
     its own line. */
  position: fixed; left: 16px; z-index: 14;
  top: 50%;                                   /* the seat js/balloon.js place() overwrites */
  transform: translateY(-50%);
  pointer-events: none;                       /* never a touch wall — each layer re-enables */
  padding: 12px 9px;
}
/* THE FILM CAPTION CLEARANCE (founder 2026-09-09): js/balloon.js seats the rail off the shared
   --seed-line (chrome.css) — 44px, the bookend the talk-seed panel keeps on the right, tuned
   for an EMPTY frame. THE ONE BAND's own captions (2026-09-08) can run up to ~95px tall
   (eyebrow + a two-line prose row) and swallow the balloon glyph — the rail's always-visible
   lowest element — whole. The two laws were never reconciled. Captions win: this is a CSS-only
   nudge on top of the JS seat (no re-seat, no resize dependency — :has() reacts the instant the
   band's own cap-on class does), so the resting seed line and the talk-seed bookend are
   untouched everywhere the band is not actually speaking. A SECOND, taller nudge covers the
   rarer case where the hairline is ALSO awake: THE ONE BAND OWNS THE EYEBROW (film.css) already
   lifts the hairline's own transport row clear of the caption band, and that lifted row would
   otherwise land squarely on the balloon glyph — the balloon rides higher still so the two
   pieces of chrome never trade places. */
body.film-mode:has(#caption-band.cap-on) .brail {
  transform: translateY(calc(-50% - 48px));
}
body.film-mode:has(#caption-band.cap-on):has(#film-bar.awake) .brail {
  transform: translateY(calc(-50% - 140px));
}
/* the film gradient rides a ::before so the PANEL can fade without touching the glyph */
.brail::before {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(to right, rgba(4,6,9,.5), rgba(4,6,9,.22) 60%, transparent);
  opacity: 0; transition: opacity var(--beat-half) var(--ease-chrome);
}
.brail.pan::before { opacity: 1; transition: opacity var(--beat-fast) var(--ease-chrome); }
.brail-track { position: relative; width: 150px; }

/* THE PANEL LAYER — invisible AND untouchable until a grip or the tap window */
.brail-line {
  position: absolute; left: 15px; top: 0; bottom: 0; width: 1px;
  background: rgba(218,225,234,.42);
  opacity: 0; transition: opacity var(--beat-half) var(--ease-chrome);
}
.brail.pan .brail-line { opacity: 1; transition: opacity var(--beat-fast) var(--ease-chrome); }
/* the cloud bank waiting above the Globe stop — prod's own rail sky, panel-layer furniture */
/* the drift only runs while the bank is ON SCREEN — an animation behind opacity 0 is frames
   spent on a picture nobody sees, and this rail shares its budget with the globe */
.brail-railclouds {
  position: absolute; left: 0; top: -26px; opacity: 0;
  transition: opacity var(--beat-half) var(--ease-chrome);
}
.brail.pan .brail-railclouds {
  opacity: .5; transition: opacity var(--beat-fast) var(--ease-chrome);
  animation: brail-cloud-drift 7s ease-in-out infinite alternate;
}
@keyframes brail-cloud-drift { from { transform: translateX(0); } to { transform: translateX(3px); } }
.brail-stop {
  position: absolute; left: 0; height: 22px; width: 100%;
  transform: translateY(-50%);
  /* mirrored: the tick stands nearest the line (now on the left), the name reads rightward */
  display: flex; flex-direction: row-reverse; align-items: center; justify-content: flex-end; gap: 9px;
  padding: 0; background: none; border: 0; cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  opacity: 0; pointer-events: none;
  transition: opacity var(--beat-half) var(--ease-chrome), filter .15s ease;
}
.brail.pan .brail-stop {
  opacity: 1; pointer-events: auto;
  transition: opacity var(--beat-fast) var(--ease-chrome), filter .15s ease;
}
.brail-stop:hover { filter: brightness(1.18); }
/* prod's own tier register: mono caps at .58rem in CREAM (not ink-bright), 9px to the tick,
   an 11px tick standing 16px off the line */
.brail-name {
  font-family: 'Space Mono', monospace; font-size: .58rem;
  letter-spacing: .18em; text-transform: uppercase;
  color: rgba(242,231,208,.92); white-space: nowrap;
  max-width: 120px; overflow: hidden; text-overflow: ellipsis;
  text-shadow: 0 1px 4px rgba(0,0,0,.9), 0 0 14px rgba(0,0,0,.7);
}
.brail-tick { flex: none; width: 11px; height: 1px; margin-left: 16px; background: rgba(218,225,234,.42); }

/* THE BALLOON LAYER — always present, always touchable; dim at rest, full while active */
.brail-handle {
  /* prod's own desktop handle: 48×60 on the 40px axis (right:-9 pulls it out of the 9px-padded
     track so its centre lands exactly on the hairline) — well past the ruled ≥44px target */
  position: absolute; left: -9px; width: 48px; height: 60px;
  transform: translateY(-50%);
  display: flex; align-items: center; justify-content: center;
  cursor: grab; touch-action: none; pointer-events: auto;
  -webkit-tap-highlight-color: transparent;
  opacity: var(--balloon-rest);
  transition: opacity var(--beat-half) var(--ease-chrome);
}
.brail.bal .brail-handle, .brail-handle.grip {
  opacity: 1; transition: opacity var(--beat-fast) var(--ease-chrome);
}
.brail-handle:active { cursor: grabbing; }
/* THE GLYPH — a bare mark on the film: prod's two-layer ink drop-shadow at its own depth does
   the legibility work over bright satellite (never a glass puck). */
.brail-glyph {
  display: block; overflow: visible;
  filter: drop-shadow(0 1px 2px rgba(6,8,12,.75)) drop-shadow(0 5px 14px rgba(6,8,12,.5));
  transform: scale(1);
  transform-origin: 50% 56%;
  transition: transform var(--beat-half) var(--ease-chrome);
}
.brail-handle:hover .brail-glyph { transform: scale(1.06); }
.brail-handle.grip .brail-glyph { transform: scale(1.15); }
/* the release settle — the swell collapses with one small overshoot; the balloon LANDS */
.brail-handle.settling .brail-glyph { animation: brail-settle 420ms var(--ease-chrome); }
@keyframes brail-settle {
  0% { transform: scale(1.15); } 45% { transform: scale(0.96); }
  75% { transform: scale(1.03); } 100% { transform: scale(1); }
}
.brail-clouds { transition: opacity .5s ease; }   /* the wisps thin out with the descent */
.brail-rig { animation: brail-float 4.6s ease-in-out infinite; }   /* the grabbable cue */
.brail-handle.grip .brail-rig, .brail-handle.settling .brail-rig { animation: none; }
@keyframes brail-float {
  0%, 100% { transform: translateY(0.8px) rotate(-1deg); }
  50% { transform: translateY(-1.8px) rotate(1.1deg); }
}
@media (prefers-reduced-motion: reduce) {
  .brail-rig, .brail-railclouds, .brail-handle.settling .brail-glyph { animation: none; }
  .brail-clouds { transition: none; }
  .brail-glyph, .brail-handle:hover .brail-glyph, .brail-handle.grip .brail-glyph {
    transition: none; transform: none;
  }
}

/* ──────── /css/book.css ──────── */
/* ══ THE BOOK DRESS — placement of the pressed guidebook (guidebook-chrome seat) ══════════════
   js/book-dress.mjs owns the classes; this sheet owns the clothes. Three candidates, three
   honestly different answers to what the movie yields for the record's room:
     .book-side   THE SPLIT (founder's sketch)  — width: map left, full-height book leaf right.
     .book-sheet  THE LAP BOOK                  — height: full-width bottom sheet, film above.
     .book-full   THE LOBBY                     — everything: a takeover you step out into.
   Portrait/narrow always wears the takeover (.book-full-now, applied at open by the dress).
   Loads LAST: its job is to out-rank guidebook.css's corner-sheet geometry and desk.css's
   widget dress exactly where the state says so, and nowhere else. The metronome is the law:
   out on the half-beat (120ms), in on the fast beat (240ms). */

/* ── the tab: the book's one door, on the chip (earned — hidden until a page exists) ────────── */
#book-tab { display: none; background: none; border: none; cursor: pointer;
  /* the chip is pointer-events:none glass (desk.css); the tab is an INSTRUMENT — it catches
     the hand itself. Without this a real click fell through to the map canvas (found by
     elementFromPoint in the default-dress drive; programmatic .click() had masked it). */
  pointer-events: auto;
  padding: 5px 10px 2px; color: rgba(236, 240, 245, 0.55);
  font: 9px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.3em;
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9);
  transition: color var(--beat-fast) var(--ease-chrome); }
body.gb-live #book-tab { display: block; }
body.book-open #book-tab, body.broadcast-live #book-tab { display: none; }
#book-tab:hover { color: #ecf0f5; }
/* gold = alive right now: a fresh press the listener has not seen yet; dies on open */
#book-tab.pulse { color: #f5c469; animation: book-tab-breath 1600ms ease-in-out 2; }
@keyframes book-tab-breath { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } }

/* the takeover's way back */
#book-return { display: none; position: fixed; top: max(14px, env(safe-area-inset-top, 0px));
  right: 16px; z-index: 62; background: none; border: 1px solid var(--gb-rule); cursor: pointer;
  padding: 6px 12px; color: var(--gb-ink-soft);
  font: 9.5px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.24em;
  transition: color 0.15s ease, border-color 0.15s ease; }
#book-return:hover { color: var(--gb-gold); border-color: rgba(200, 148, 47, 0.5); }
body.book-open.book-full-now #book-return { display: block; }

/* ── the morph: the state change breathes on the metronome, never a jump cut ────────────────── */
body.book-morph #concierge, body.book-morph #c-book, body.book-morph #desk-chip {
  opacity: 0 !important; transition: opacity 120ms var(--ease-chrome) !important; }
body.book-open #concierge { animation: book-enter 240ms cubic-bezier(0.22, 1, 0.36, 1); }
@keyframes book-enter { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; } }

/* ══ COMPACT (book closed) — the paper stands down; the dark bottom-center widget holds the
   live turn. These out-rank guidebook.css's gb-live corner-sheet rules by load order. ═══════ */
body.chrome-a:not(.book-open) #c-book { display: none !important; }
body.chrome-a.gb-live:not(.book-open) #c-transcript { display: block; }
/* THE COMPACT WALL IS DEMOLISHED (founder final 2026-09-08, QUESTION ONE): the bottom-center
   say panel died as a rendering surface — ONE SAY HOME, the band. git holds the clothes. */
body.chrome-a.gb-live:not(.book-open) #c-status { color: rgba(218, 225, 234, 0.38); }
body.chrome-a.gb-live:not(.book-open) #c-status.err { color: rgba(218, 225, 234, 0.62); }

/* the rail on the DARK widget wears the desk's own ink — guidebook.css's cream inks belong to
   the paper (unscoped there because the quarry's rail always sat on a sheet; ours does not) */
body.chrome-a:not(.book-open) #c-tray .gb-row { border-bottom-color: rgba(218, 225, 234, 0.1); }
body.chrome-a:not(.book-open) #c-tray .gb-row-t { color: #ecf0f5; }
body.chrome-a:not(.book-open) #c-tray .gb-row-n,
body.chrome-a:not(.book-open) #c-tray .gb-row-m { color: rgba(218, 225, 234, 0.45); }
body.chrome-a:not(.book-open) .c-rail-zone { color: rgba(218, 225, 234, 0.38); }
body.chrome-a:not(.book-open) #c-tray .c-rail-live .gb-row-t,
body.chrome-a:not(.book-open) #c-tray .c-rail-live .gb-row-n { color: #f5c469; }
body.chrome-a:not(.book-open) #c-tray .c-rail-shelf .gb-row-t { color: rgba(245, 196, 105, 0.85); font-style: normal; }
body.chrome-a:not(.book-open) #c-tray .gb-row.tap:hover .gb-row-t,
body.chrome-a:not(.book-open) #c-tray .gb-row.tap:focus-visible .gb-row-t { color: #f5c469; }
body.chrome-a:not(.book-open) #c-tray .gb-offers { color: rgba(218, 225, 234, 0.4); }
body.chrome-a:not(.book-open) #c-tray .gb-offer { color: rgba(218, 225, 234, 0.55); border-bottom-color: transparent; }
body.chrome-a:not(.book-open) #c-tray .gb-offer:hover { color: #ecf0f5; }

/* ══ EXPANDED — shared laws ═════════════════════════════════════════════════════════════════ */
body.chrome-a.book-open #concierge { pointer-events: auto; z-index: 45; }
body.chrome-a.book-open #concierge > * { pointer-events: auto; }
/* one instrument, one claim: the idle board yields while the book owns part of the frame */
body.book-open #arr-ticker { opacity: 0; pointer-events: none; }
/* the record gets the room its height allows (guidebook.css caps for the corner sheet) */
body.chrome-a.book-open .gb-body { max-height: calc(100vh - 300px); }
body.chrome-a.book-open .gb-cover .gb-body,
body.chrome-a.book-open .gb-cover:has(.gb-days) .gb-body { max-height: calc(100vh - 280px); }

/* ── .book-side · THE SPLIT: map left, the book a full-height leaf on the right ─────────────── */
body.chrome-a.book-open.book-side:not(.book-full-now) #concierge {
  left: auto; right: 0; top: 0; bottom: 0; transform: none;
  width: min(440px, 38vw); max-width: 92vw; height: auto;
  padding: 26px 28px 100px; gap: 12px;
  background: var(--gb-paper);
  box-shadow: -1px 0 3px rgba(33, 28, 21, 0.35), -18px 0 44px rgba(4, 6, 10, 0.5);
}
/* the talk chip and the throat recenter over the MAP half — the conversation stays on the film */
body.chrome-a.book-open.book-side:not(.book-full-now) #bottom-dock {
  left: calc((100vw - min(440px, 38vw)) / 2); }
body.chrome-a.book-open.book-side:not(.book-full-now).throat-on #c-form {
  left: calc((100vw - min(440px, 38vw)) / 2); }
/* the altitude rail is a MAP instrument — it rides the visible map's edge, never the paper */
/* (the balloon lives on the LEFT edge now — THE EDGE LAW; the rail dodges nothing) */

/* ── .book-sheet · THE LAP BOOK: full-width bottom sheet, the film keeps its widescreen ─────── */
body.chrome-a.book-open.book-sheet:not(.book-full-now) #concierge {
  left: 0; right: 0; top: auto; bottom: 0; transform: none;
  width: auto; max-width: none; height: min(56vh, 520px);
  padding: 22px clamp(24px, 8vw, 120px) 16px; gap: 12px;
  background: var(--gb-paper);
  box-shadow: 0 -1px 3px rgba(33, 28, 21, 0.35), 0 -18px 44px rgba(4, 6, 10, 0.5);
  align-items: center;
}
body.chrome-a.book-open.book-sheet:not(.book-full-now) #concierge > * { width: min(680px, 100%); }
body.chrome-a.book-open.book-sheet:not(.book-full-now) .gb-body,
body.chrome-a.book-open.book-sheet:not(.book-full-now) .gb-cover .gb-body,
body.chrome-a.book-open.book-sheet:not(.book-full-now) .gb-cover:has(.gb-days) .gb-body {
  max-height: calc(min(56vh, 520px) - 190px); }
/* chip + throat step onto the film, just above the sheet's top edge */
body.chrome-a.book-open.book-sheet:not(.book-full-now) #bottom-dock {
  bottom: calc(min(56vh, 520px) + 14px); }
body.chrome-a.book-open.book-sheet:not(.book-full-now).throat-on #c-form {
  bottom: calc(min(56vh, 520px) + 84px); }
/* (sheet dodge retired with the left move — fixed home) */

/* ── .book-full-now · THE LOBBY (and every portrait/narrow book): the page owns the viewport ── */
body.chrome-a.book-open.book-full-now #concierge {
  left: 0; right: 0; top: 0; bottom: 0; transform: none;
  width: auto; max-width: none; height: auto;
  padding: max(48px, env(safe-area-inset-top, 0px)) clamp(20px, 6vw, 64px) 120px;
  gap: 12px;
  background: var(--gb-paper);
  box-shadow: none;
  align-items: center;
}
body.chrome-a.book-open.book-full-now #concierge > * { width: min(680px, 100%); }
body.chrome-a.book-open.book-full-now #bottom-dock { display: none; } /* the lobby: map behind paper — the whole dock rests */
body.book-open.book-full-now .brail { opacity: 0; pointer-events: none; }
body.chrome-a.book-open.book-full-now .gb-body,
body.chrome-a.book-open.book-full-now .gb-cover .gb-body,
body.chrome-a.book-open.book-full-now .gb-cover:has(.gb-days) .gb-body {
  max-height: calc(100vh - 320px); }
/* the throat rides ON the cream in the takeover — re-inked for paper (throat.css assumed the
   line always hangs over dark map; here it hangs over the sheet) */
body.book-open.book-full-now.throat-on #c-form { z-index: 61; }
body.book-open.book-full-now.throat-on #c-input {
  color: var(--gb-ink); text-shadow: none; caret-color: var(--gb-gold); }
body.book-open.book-full-now.throat-on #c-input::placeholder { color: rgba(33, 28, 21, 0.35); }
body.book-open.book-full-now.throat-on #c-send { color: var(--gb-ink-soft); text-shadow: none; }
body.book-open.book-full-now.throat-on #c-form::after {
  background: linear-gradient(to right, rgba(33, 28, 21, 0), rgba(33, 28, 21, 0.3) 16%, rgba(33, 28, 21, 0.3)); }

/* the raw transcript behind the book keeps its dark register wherever the book is seated */
body.chrome-a.book-open.gb-raw #concierge { background: rgba(6, 8, 12, 0.92); box-shadow: none; }

/* a conversation with NO pressed page yet shows its transcript ON the paper — re-inked for
   cream (the dailies caught the dark dress's near-white say printing invisible on the sheet) */
body.chrome-a.book-open:not(.gb-raw) .c-say { color: var(--gb-ink); }
body.chrome-a.book-open:not(.gb-raw) .c-you { color: var(--gb-ink-soft); }
body.chrome-a.book-open:not(.gb-raw) .c-eyebrow { color: rgba(33, 28, 21, 0.42); }
body.chrome-a.book-open:not(.gb-raw) .c-eyebrow.live { color: var(--gb-gold); }
body.chrome-a.book-open:not(.gb-raw) .c-pg { color: var(--gb-ink-soft); }
body.chrome-a.book-open:not(.gb-raw) .c-pg:hover { color: var(--gb-gold); }
body.chrome-a.book-open:not(.gb-raw) .c-pos { color: var(--gb-ink-soft); }
body.chrome-a.book-open:not(.gb-raw) #c-status { color: var(--gb-ink-soft); }
body.chrome-a.book-open:not(.gb-raw) #c-status.err { color: var(--gb-ink); }

/* ── THE WITNESS STRIP, ABSORBED (plate-verb's surface, re-homed to its own slot) ─────────────
   #witness-strip carries the wit-* children guidebook.css already dresses; only the container
   moved out of #c-book (the organ owns that host now). Dark register in compact; on paper it
   re-inks. The subject line never wraps the head (the plate-verb seat's own named watch). */
#witness-strip { display: none; }
#witness-strip.witness-on { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 6px; }
#witness-strip .wit-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
/* on the open book's paper, the strip wears the sheet's ink (it sits above the pages) */
body.book-open #witness-strip .wit-title { color: var(--gb-ink-soft); }
body.book-open #witness-strip .wit-fig figcaption { color: var(--gb-ink-soft); }
body.book-open #witness-strip .wit-x { color: var(--gb-ink-soft); }
body.book-open #witness-strip .wit-fig img { border: 1px solid var(--gb-rule); }

@media (prefers-reduced-motion: reduce) {
  body.book-open #concierge, #book-tab.pulse { animation: none; }
  body.book-morph #concierge, body.book-morph #c-book, body.book-morph #desk-chip { transition: none !important; }
}

/* ──────── /css/surface.css ──────── */
/* ══ THE SURFACE PARADIGM — two candidate homes for the conversation (surface-paradigm seat)
   Founder conviction 2026-09-07: "wall of text that covers the map, or an ultra tall panel
   that covers it… landscape needs a proper splitscreen… I was hoping your redesign would
   land on a better paradigm." Both standing states are convicted; these are the two honest
   answers left (docs/THE-SURFACE-PARADIGM.md):
     ?surface=split  THE STUDY — one paper room on the right holds ALL text (turn at its
                     head, record beneath); the map never carries floating text again.
     ?surface=band   THE BROADCAST — the turn is a lower-third subtitle band (a rolling
                     two-line window, never accumulation); the rail is a horizontal strip;
                     the record lives only in the book's leaf.
   Absent ?surface = the standing dress, byte-identical (no default change without the
   founder's pick — decision-instruments law). js/surface-dress.mjs owns the classes and
   the small machinery; this sheet owns the clothes. Loads LAST — it out-ranks book.css
   and desk.css exactly where body.surface-* says so, and nowhere else. */

/* ═══════════════════ A · THE STUDY (?surface=split) ═══════════════════ */

/* the room: the side leaf's own geometry, generalized from book-open to the WHOLE engaged
   lifecycle — the panel IS the concierge's body, present whenever it is engaged */
body.surface-split.gb-live:not(.desk-down):not(.book-full-now) #concierge {
  left: auto; right: 0; top: 0; bottom: 0; transform: none;
  width: min(440px, 36vw); max-width: 92vw; height: auto;
  padding: 40px 26px 96px; gap: 12px;
  background: var(--gb-paper);
  box-shadow: -1px 0 3px rgba(33, 28, 21, 0.35), -18px 0 44px rgba(4, 6, 10, 0.5);
  pointer-events: auto; z-index: 45;
  opacity: 1; animation: surface-enter 240ms cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes surface-enter { from { opacity: 0; transform: translateX(14px); } to { opacity: 1; transform: none; } }
body.surface-split.gb-live:not(.desk-down) #concierge > * { pointer-events: auto; }

/* the record is ALWAYS part of the room — the compact display:none is out-ranked here */
body.surface-split.gb-live:not(.desk-down) #c-book { display: block !important; }

/* the turn is the room's head: clamped, its own quiet scroll — a paragraph, never a wall */
body.surface-split.gb-live:not(.desk-down) #c-transcript {
  max-height: 36vh; overflow-y: auto; overscroll-behavior: contain; flex: 0 0 auto; }

/* ONE TEXT, ONE HOME — the wall's ghost exorcised: when a printed page stands, the record
   carries the words and the transcript's say yields to it (the eyebrow, the you-echo and
   the status stay — the voice paces the audio; the paper is the reading copy). Words-only
   turns (no page) keep their say. */
body.surface-split.gb-printed.gb-live:not(.desk-down) #c-transcript .c-say { display: none; }

/* paper ink for the turn whether or not the book is "open" (book.css only re-inks book-open) */
body.surface-split:not(.desk-down) .c-say { color: var(--gb-ink); }
body.surface-split:not(.desk-down) .c-you { color: var(--gb-ink-soft); }
body.surface-split:not(.desk-down) .c-eyebrow { color: rgba(33, 28, 21, 0.42); }
body.surface-split:not(.desk-down) .c-eyebrow.live { color: var(--gb-gold); }
body.surface-split:not(.desk-down) .c-pg { color: var(--gb-ink-soft); }
body.surface-split:not(.desk-down) #c-status { color: var(--gb-ink-soft); }
body.surface-split:not(.desk-down) #c-status.err { color: var(--gb-ink); }
/* the rail on paper wears the paper's own inks (guidebook.css's cream rules apply; undo
   book.css's dark-widget overrides by restating the paper values) */
body.surface-split:not(.desk-down) #c-tray .gb-row-t { color: var(--gb-ink); }
body.surface-split:not(.desk-down) #c-tray .gb-row-n,
body.surface-split:not(.desk-down) #c-tray .gb-row-m { color: var(--gb-ink-soft); }
body.surface-split:not(.desk-down) .c-rail-zone { color: var(--gb-ink-soft); }
body.surface-split:not(.desk-down) #c-tray .c-rail-live .gb-row-t,
body.surface-split:not(.desk-down) #c-tray .c-rail-live .gb-row-n { color: var(--gb-gold); }
body.surface-split:not(.desk-down) #c-tray .gb-row.tap:hover .gb-row-t { color: var(--gb-gold); }

/* the chip and the throat recenter over the MAP pane — the conversation's furniture stays
   on the film; only paper lives in the room (the side-leaf law, generalized) */
body.surface-split.gb-live:not(.desk-down):not(.book-full-now) #desk-chip {
  left: calc((100vw - min(440px, 36vw)) / 2); }
body.surface-split.gb-live:not(.desk-down):not(.book-full-now).throat-on #c-form {
  left: calc((100vw - min(440px, 36vw)) / 2); }
body.surface-split.gb-live:not(.desk-down):not(.book-full-now) .brail {
  right: calc(min(440px, 36vw) + 16px); }

/* the room's own way out */
#surface-close { display: none; position: absolute; top: 10px; right: 12px; z-index: 3;
  background: none; border: none; cursor: pointer; color: var(--gb-ink-soft);
  font: 12px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.1em; padding: 6px; }
#surface-close:hover { color: var(--gb-gold); }
body.surface-split.gb-live:not(.desk-down) #surface-close { display: block; }

/* PLAYING: the movie owns the frame — surface-dress contracts the room on film start; if
   the person reopens it mid-film, it stands (their intent, their frame) and declares
   itself to the fit like any furniture */

/* ═══════════════════ B · THE BROADCAST (?surface=band) ═══════════════════ */

/* the lower third: a caption's height, never a panel's */
body.band-on.chrome-a.gb-on.gb-live #concierge {
  left: 0; right: 0; top: auto; bottom: 0; transform: none;
  width: auto; max-width: none; height: auto; max-height: 216px;
  padding: 14px 200px 12px 28px; gap: 8px;
  display: flex; flex-direction: column; justify-content: flex-end;
  background: linear-gradient(to top, rgba(6, 8, 12, 0.88), rgba(6, 8, 12, 0.5) 62%, rgba(6, 8, 12, 0));
  box-shadow: none; pointer-events: none; z-index: 40;
  opacity: 1; animation: band-enter 240ms cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes band-enter { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
body.band-on.chrome-a.gb-on.gb-live #concierge > * { pointer-events: auto; }

/* the subtitle discipline: ONLY the current turn — history lives in the book, not the sky.
   The say is a rolling two-line window; surface-dress pins its scroll to the newest words. */
body.band-on #c-transcript { max-height: none; overflow: visible; }
body.band-on #c-transcript .c-pg,
body.band-on #c-transcript .c-you,
body.band-on #c-transcript .c-eyebrow { display: none; }
/* the CURRENT eyebrow is marked by surface-dress (all transcript children are divs, so
   .c-eyebrow:last-of-type can never match — the say always follows it) */
body.band-on #c-transcript .c-eyebrow.band-cur {
  display: block; margin-bottom: 2px; }
body.band-on #c-transcript .c-say { display: none; }
body.band-on #c-transcript .c-say:last-of-type {
  display: block; max-height: 3.15em; overflow: hidden;
  font-size: 16.5px; line-height: 1.5; color: #ecf0f5;
  text-shadow: 0 1px 8px rgba(6, 8, 12, 0.9); }

/* the ROW under a printed page: the tray un-retires for exactly the row's members —
   lit chips (their own rule outranks), the eyebrow, the +N; unlit rows stay dark */
body.band-on.gb-printed #c-tray { height: auto !important; min-height: 0; opacity: 1;
  visibility: visible; pointer-events: auto; overflow-x: auto; }
body.band-on.gb-printed #c-tray .c-rail-zone { display: block; }
body.band-on.gb-printed #c-tray #row-plus { display: inline-flex; }
body.band-on #c-tray .gb-offers { display: none; } /* the offers ride the room, not the row */

/* the record never grows out of the band — the book's leaf is the reading room */
body.surface-band:not(.book-open) #c-book { display: none !important; }
body.surface-band:not(.book-open) #witness-strip { display: none !important; }

/* THE DOCK SEATS AT THE BAND'S RIGHT END (one bottom grammar — the dock stays the only
   fixed bottom-center element everywhere else; in band posture it becomes the band's
   right-end cluster, above the credit rail/attribution line; no pileup) */
body.band-on #bottom-dock {
  left: auto; right: 18px; bottom: 40px; transform: none; align-items: flex-end; }
/* the record room open: the dock steps clear of the leaf */
body.surface-hybrid.book-open #bottom-dock { right: calc(min(440px, 36vw) + 18px); }

/* PLAYING: the band yields whole to the film's furniture unless a live reveal stands
   (a mid-play answer is exactly a subtitle) — surface-dress stamps body.band-live */
body.band-on.film-mode:not(.band-live) #concierge {
  opacity: 0; pointer-events: none !important; }
body.band-on.film-mode:not(.band-live) #concierge > * { pointer-events: none !important; }

@media (prefers-reduced-motion: reduce) {
  body.surface-split #concierge, body.surface-band #concierge { animation: none; }
}

/* PORTRAIT / NARROW: the conviction was landscape's ("landscape needs a proper splitscreen");
   a phone has no second pane worth having. The study stands down and the standing compact
   dress rules — the book's own portrait takeover (book-full-now) is unchanged. */
@media (orientation: portrait), (max-width: 640px) {
  body.surface-split.gb-live:not(.desk-down):not(.book-full-now) #concierge {
    left: 50%; right: auto; top: auto; bottom: 120px; transform: translateX(-50%);
    width: 480px; max-width: 94vw; height: auto; padding: 26px 24px 12px;
    background: linear-gradient(to top, rgba(6, 8, 12, 0.82), rgba(6, 8, 12, 0.5) 58%, rgba(6, 8, 12, 0));
    box-shadow: none; animation: none; }
  body.surface-split.gb-live:not(.desk-down) #c-book { display: none !important; }
  body.surface-split.gb-live:not(.desk-down) #surface-close { display: none; }
  body.surface-split.gb-live:not(.desk-down):not(.book-full-now) #bottom-dock { left: 50%; }
  body.surface-split.gb-live:not(.desk-down):not(.book-full-now).throat-on #c-form { left: 50%; }
  body.surface-split:not(.desk-down) .c-say { color: #ecf0f5; display: block; }
  body.surface-split:not(.desk-down) .c-eyebrow { color: rgba(218, 225, 234, 0.45); }
  body.surface-split:not(.desk-down) .c-eyebrow.live { color: #f5c469; }
}

/* THE LINE READS IN THE STUDY TOO (founder conviction 2026-09-07: the recentered ask line a
   ghost over bright ground). The throat's own floor idiom, firmed for the map pane — same
   vignette, more ink; the placeholder steps up with it. */
body.surface-split.throat-on #c-form::before {
  background: radial-gradient(ellipse at 50% 100%, rgba(6, 8, 12, 0.72), rgba(6, 8, 12, 0) 80%);
  inset: -16px -22px -10px;
}
body.surface-split.throat-on #c-input::placeholder { color: rgba(218, 225, 234, 0.58); }
/* the line itself wears the chrome's ink shadow (the sixth-sitting idiom) — the floor is a
   vignette, the letters carry their own plate */
body.surface-split.throat-on #c-input,
body.surface-split.throat-on #c-input::placeholder {
  text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95), 0 1px 8px rgba(6, 8, 12, 0.8); }
body.surface-split.throat-on #c-input::placeholder { color: rgba(224, 230, 238, 0.72); }

/* ═══════════════════ A+B · THE HYBRID (?surface=hybrid) ═══════════════════
   Founder killed the center wall; the §5 hybrid, built: THE TURN LIVES IN THE BAND (the
   broadcast's rolling subtitle + card strip — body.band-on carries the whole dress), THE
   RECORD LIVES IN THE STUDY (#record-room, the right paper leaf) and opens ONLY on record
   intent: GUIDEBOOK, a staged page press, plates on request, SAVE. Escape/✕/map-tap close
   it back to the band. The camera gets the nearly-whole frame in band posture; the room
   declares through the book-dress pad it already rides. */
#record-room { display: none; }
body.surface-hybrid.book-open:not(.book-full-now) #record-room {
  display: flex; flex-direction: column; gap: 12px;
  position: fixed; right: 0; top: 0; bottom: 0; z-index: 45;
  width: min(440px, 36vw); max-width: 92vw;
  padding: 40px 26px 150px; overflow-y: auto; overscroll-behavior: contain;
  background: var(--gb-paper);
  box-shadow: -1px 0 3px rgba(33, 28, 21, 0.35), -18px 0 44px rgba(4, 6, 10, 0.5);
  animation: surface-enter 240ms cubic-bezier(0.22, 1, 0.36, 1);
}
/* the room's paper carries the record's own inks (the band outside stays dark chrome) */
body.surface-hybrid.book-open #record-room #c-book { display: block !important; }
body.surface-hybrid #record-room #surface-close { display: none; }
body.surface-hybrid.book-open:not(.book-full-now) #record-room #surface-close { display: block; }
/* the band never prints the record's furniture; the room owns it (adopted at dress time) */
body.surface-hybrid:not(.book-open) #record-room { display: none; }
/* hybrid book-open portrait: the organ's own takeover rules stand (book-full-now on
   #concierge is wrong here — the room takes the viewport instead) */
body.surface-hybrid.book-open.book-full-now #record-room {
  display: flex; flex-direction: column; gap: 12px;
  position: fixed; inset: 0; z-index: 62;
  padding: max(48px, env(safe-area-inset-top, 0px)) clamp(20px, 6vw, 64px) 120px;
  overflow-y: auto; background: var(--gb-paper);
}
/* the study's neutralized double: in hybrid, book-open must NOT re-dress the band panel as
   a leaf (book.css book-side rules) — the band-on stack out-ranks it; belt for the morph */
body.surface-hybrid.book-open #concierge { animation: none; }

/* the band steps clear of the open room (the strip never runs under the paper's edge) */
body.surface-hybrid.book-open.band-on.chrome-a.gb-on.gb-live #concierge {
  padding-right: calc(min(440px, 36vw) + 40px); }
/* the zone is the ROW's eyebrow — seated deliberately at its left, one quiet line */
body.band-on .c-rail-zone { display: block; flex: 0 1 auto; align-self: center;
  max-width: 210px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  color: rgba(218, 225, 234, 0.4); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.18em; margin-right: 4px; }

/* ═══ ONE BAND — the chapter's own captions (founder ruling 2026-09-08) ═══════════════════════
   The playing chapter speaks in the band: rolling two-line captions in the band's own
   register, NOW PLAYING eyebrow, the floor line still true. The desk borrowing the band
   (band-live) hides them; an authored card or plaque (film-card-up) holds them silent —
   one voice at a time; pause freezes the audio clock and the held line stands. */
#caption-band { display: none; }
body.surface-band #caption-band.cap-on, body.surface-hybrid #caption-band.cap-on,
body.surface-legacy #caption-band.cap-on, body.surface-leaf #caption-band.cap-on {
  display: flex; flex-direction: column; justify-content: flex-end; gap: 3px;
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 39;
  padding: 14px 200px 12px 28px; max-height: 160px;
  background: linear-gradient(to top, rgba(6, 8, 12, 0.88), rgba(6, 8, 12, 0.5) 62%, rgba(6, 8, 12, 0));
  pointer-events: none;
}
#cap-eyebrow { color: #f5c469; font: 9.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
#cap-line { font-family: 'Playfair Display', georgia, serif; font-size: 16.5px; line-height: 1.5;
  max-height: 3.15em; overflow: hidden; color: #ecf0f5;
  text-shadow: 0 1px 8px rgba(6, 8, 12, 0.9); }
#cap-floor { color: rgba(212, 175, 96, 0.55); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.24em; }
/* one voice at a time: the desk's borrowed turn and the film's own cards outrank */
body.band-live #caption-band, body.film-card-up #caption-band { opacity: 0; transition: opacity 240ms ease; }

/* ═══ TWO BOOKS IN THE ROOM (founder-ratified 2026-09-08) ═════════════════════════════════════
   TRANSCRIPT | GUIDEBOOK registers under one head; the edge bookmark is the room's one
   always-present door; the weather block is the first living block. */
#tb-head { display: flex; gap: 4px; align-items: baseline; margin: -6px 0 4px; }
#tb-head button { background: none; border: none; cursor: pointer; padding: 6px 10px 5px;
  color: rgba(33, 28, 21, 0.4); font: 9.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.28em; border-bottom: 1px solid transparent; }
#tb-head button.on { color: var(--gb-ink); border-bottom-color: var(--gb-gold); }
#tb-head button:hover { color: var(--gb-gold); }
#register-transcript { display: none; }
body.tb-transcript #register-transcript { display: block; overflow-y: auto; }
body.tb-transcript #register-guidebook { display: none; }
#register-guidebook { display: block; min-height: 0; }

/* the faithful log's dress — chronological, quiet, the paper's own inks */
#register-transcript .tb-you { color: var(--gb-ink-soft); font: 10px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.12em; margin: 14px 0 2px; }
#register-transcript .tb-eyebrow { color: rgba(33, 28, 21, 0.42); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.26em; margin-top: 10px; }
#register-transcript .tb-say { color: var(--gb-ink); font-family: 'Playfair Display', georgia, serif;
  font-size: 14.5px; line-height: 1.55; margin: 2px 0 8px; }
#register-transcript .tb-played { color: var(--gb-gold); font: 9.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.2em; margin: 6px 0; }
#register-transcript .tb-plates { display: flex; gap: 8px; margin: 6px 0 10px; }
#register-transcript .tb-plates figure { margin: 0; max-width: 120px; }
#register-transcript .tb-plates img { width: 100%; border: 1px solid var(--gb-rule); }
#register-transcript .tb-plates figcaption { color: var(--gb-ink-soft); font: 8px 'Space Mono', monospace;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#register-transcript .tb-empty { color: var(--gb-ink-soft); font-style: italic; margin-top: 20px; }

/* the editor's stub pages ride the organ's own page dress; the living block is a card */
.tb-stub .tb-stub-say { color: var(--gb-ink); font-family: 'Playfair Display', georgia, serif;
  font-size: 14px; line-height: 1.5; margin-top: 8px; }
.tb-note { color: var(--gb-ink); font-family: 'Playfair Display', georgia, serif;
  font-size: 13.5px; line-height: 1.5; margin: 8px 0; padding-left: 10px;
  border-left: 2px solid var(--gb-rule); }
.tb-block { display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px;
  margin: 8px 0 2px; padding: 12px 14px; border: 1px solid var(--gb-rule); }
.tb-wx-temp { font-family: 'Playfair Display', georgia, serif; font-size: 26px; color: var(--gb-ink); }
.tb-wx-word { color: var(--gb-ink); font: 11px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.2em;
  text-transform: uppercase; }
.tb-wx-meta { flex-basis: 100%; color: var(--gb-ink-soft); font: 10px 'Space Mono', monospace; }
.tb-wx-at { flex-basis: 100%; color: rgba(33, 28, 21, 0.4); font: 8.5px 'Space Mono', monospace;
  letter-spacing: 0.14em; }
.tb-block.tb-stale .tb-wx-at { color: var(--gb-gold); }

/* THE EDGE TAB — the bookmark at the right edge, mid-height, always present in the hybrid;
   gold breath when the guidebook gains pages the reader hasn't seen; dim under a film */
#edge-tab { display: none; }
body.surface-hybrid #edge-tab {
  display: block; position: fixed; right: 0; top: 50%; transform: translateY(-50%);
  z-index: 46; writing-mode: vertical-rl; padding: 14px 5px 14px 6px;
  background: rgba(12, 14, 20, 0.72); border: 1px solid rgba(245, 196, 105, 0.35);
  border-right: none; cursor: pointer;
  color: rgba(236, 240, 245, 0.6); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.34em; text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9);
  transition: color 240ms ease, opacity 240ms ease; }
body.surface-hybrid #edge-tab:hover { color: #f5c469; }
body.surface-hybrid #edge-tab.pulse { color: #f5c469; animation: book-tab-breath 1600ms ease-in-out 2; }
body.surface-hybrid.film-mode #edge-tab { opacity: 0.35; }
body.surface-hybrid.film-mode #edge-tab:hover { opacity: 1; }
body.surface-hybrid.book-open #edge-tab { right: min(440px, 36vw); color: var(--gb-gold); }
body.surface-hybrid.book-open.book-full-now #edge-tab { display: none; }
/* the chip's old tab yields to the bookmark — one door */
body.surface-hybrid #book-tab { display: none !important; }

/* ═══ THE RAIL COMPACTS (founder 2026-09-08, walk-sync ratified) ══════════════════════════════
   The card strip dies; ONE compact chip row seats at the band's bottom in the help line's
   old slot — number · name · distance, ▸ where proven. A chip is INVISIBLE until the voice
   names it (walk-sync; say-end lights any remainder). The help text dies with the strip —
   the row IS the floor affordance; TALK TO ME stays the idle micro-hint. */
body.band-on #c-status { display: none !important; }
body.band-on #c-tray { order: 2; display: flex; flex-direction: row; align-items: center;
  gap: 8px; overflow-x: auto; padding: 6px 2px 2px; scrollbar-width: none; }
body.band-on #c-tray .gb-row { display: none; }
body.band-on #c-tray .gb-row.row-lit { display: inline-flex; flex: 0 0 auto;
  flex-direction: row; align-items: baseline; gap: 7px; min-width: 0; max-width: 240px;
  padding: 4px 11px; border: 1px solid rgba(236, 240, 245, 0.18); border-radius: 2px;
  background: rgba(6, 8, 12, 0.55); animation: row-chip-in 300ms cubic-bezier(0.22, 1, 0.36, 1); }
@keyframes row-chip-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; } }
body.band-on #c-tray .gb-row-t { font-size: 12.5px; white-space: nowrap; overflow: hidden;
  text-overflow: ellipsis; }
body.band-on #c-tray .gb-row-n, body.band-on #c-tray .gb-row-m {
  font: 9px 'Space Mono', ui-monospace, monospace; color: rgba(218, 225, 234, 0.55);
  white-space: nowrap; }
body.band-on #c-tray .gb-row:nth-child(n+6) { display: none !important; } /* the +N carries them */
#row-plus { flex: 0 0 auto; background: none; border: 1px solid rgba(245, 196, 105, 0.4);
  color: #f5c469; cursor: pointer; padding: 3px 9px; border-radius: 2px;
  font: 10px 'Space Mono', ui-monospace, monospace; }
#row-plus:hover { border-color: #f5c469; }

/* one row, one height: every member is a single-line chip — the ◆ glyph is a landmark's
   whole differentiation, never a taller card */
body.band-on #c-tray .gb-row.row-lit,
body.band-on.gb-printed #c-tray .gb-row.row-lit { height: 26px; max-height: 26px;
  overflow: hidden; align-items: center; }
body.band-on #c-tray .gb-row.row-lit > * { white-space: nowrap; }
#row-plus { align-self: center; height: 26px; box-sizing: border-box; padding: 2px 9px; }


/* ═══ ONE SAY HOME (founder final, 2026-09-08: "we dont want to be covering the map") ═════════
   THE CONSTITUTIONAL BACKSTOP: no dress renders speech mid-glass. The band (band-on) is the
   only live speech surface; the broadcast's own captions ride the same band (its element
   below is a data source, never a renderer); the room's TRANSCRIPT register reads the turn
   LOG, not this element. The compact wall's clothes are deleted at their source (book.css);
   this law catches every other dress, present or future. */
body:not(.band-on):not(.surface-leaf) #c-transcript { display: none !important; }
#arr-captions { display: none !important; }

/* THE ASK LINE SEATS WITH THE BAND (his frame: a ghost detached center-bottom) — the typed
   lane docks at the band's left foot, under the eyebrow, in the band's own ink */
body.surface-hybrid.throat-on #c-form, body.surface-band.throat-on #c-form {
  left: 28px; right: auto; bottom: 8px; transform: none; width: min(400px, 34vw); }


/* ═══ THE FLOATING LEAF (?surface absent — the default; founder ruling 2026-09-08) ═══════════
   One right-side object, exactly as tall as its content: a one-line say floats as a card;
   rows grow it; pages and registers grow it toward the study. The turn at its head, the
   record beneath, the throat at its foot — continuous, never a wall. */
body.surface-leaf.chrome-a:not(.book-full-now) #concierge {
  position: fixed; left: auto; right: 16px; top: auto; bottom: 44px; transform: none;
  width: min(400px, 90vw); max-width: 90vw; height: auto; max-height: calc(100vh - 76px);
  display: flex; flex-direction: column; gap: 10px;
  padding: 14px 18px 10px; overflow-y: auto; overscroll-behavior: contain;
  background: var(--gb-paper); z-index: 45; pointer-events: auto;
  box-shadow: -1px 1px 3px rgba(33, 28, 21, 0.35), -14px 18px 44px rgba(4, 6, 10, 0.45);
  opacity: 1;
}
/* THE SEED IS ALWAYS ON SCREEN — desk-down folds the grown content, never the object */
body.surface-leaf.chrome-a.desk-down #concierge { opacity: 1; transform: none; pointer-events: auto; }
body.surface-leaf.chrome-a.desk-down #concierge > * { pointer-events: auto; }
body.surface-leaf.desk-down :is(#c-transcript, #c-tray, #tb-head, #register-transcript,
  #register-guidebook, #witness-strip, #surface-close) { display: none !important; }
/* the seed: the instrument panel at the object's base; the throat is the very foot */
#leaf-seed { order: 10; display: flex; flex-direction: column; gap: 4px;
  border-top: 1px solid rgba(33, 28, 21, 0.12); padding-top: 8px; margin-top: 2px; }
body.surface-leaf.desk-down #leaf-seed { border-top: none; padding-top: 0; margin-top: 0; }
#leaf-seed #desk-chip { position: static; transform: none; display: flex; flex-direction: row;
  align-items: center; justify-content: space-between; }
#leaf-seed #desk-chip .chip-main { flex-direction: row-reverse; width: 100%;
  justify-content: space-between; min-height: 44px; }
#leaf-seed #edge-tab { position: static; writing-mode: horizontal-tb; transform: none;
  border: none; background: none; padding: 2px 0; text-align: left;
  color: rgba(33, 28, 21, 0.5); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; text-shadow: none; cursor: pointer; display: none; }
body.surface-leaf.desk-down #leaf-seed #edge-tab { display: block; }
#leaf-seed #edge-tab:hover, #leaf-seed #edge-tab.pulse { color: var(--gb-gold); }
body.surface-leaf #c-locate-line { order: 11; }
body.surface-leaf.throat-on #c-form, body.surface-leaf #c-form { order: 12; position: static;
  display: flex; opacity: 1; pointer-events: auto; visibility: visible;
  left: auto; right: auto; bottom: auto; transform: none; width: auto; margin-top: 2px; }
/* the credit rail steps left of the standing seed (nothing overlaps at bottom-right) */
body.surface-leaf #credit-rail { right: calc(min(400px, 90vw) + 32px); }
body.surface-leaf.gb-live:not(.desk-down) #concierge > * { pointer-events: auto; }
/* the head: the LIVE say only (the rolling discipline — older says fold into the
   transcript register); a streaming say rolls in a clamped window, never a wall */
body.surface-leaf #c-transcript { order: 1; overflow: visible; }
body.surface-leaf #c-transcript .c-pg, body.surface-leaf #c-transcript .c-you { display: none; }
body.surface-leaf #c-transcript .c-eyebrow { display: none; }
body.surface-leaf #c-transcript .c-eyebrow.band-cur { display: block; color: rgba(33, 28, 21, 0.45); }
body.surface-leaf #c-transcript .c-eyebrow.band-cur.live { color: var(--gb-gold); }
body.surface-leaf #c-transcript .c-say { display: none; }
body.surface-leaf #c-transcript .c-say:last-of-type {
  display: block; max-height: 9.3em; overflow: hidden;
  color: var(--gb-ink); font-family: 'Playfair Display', georgia, serif;
  font-size: 14.5px; line-height: 1.55; }
/* the rows: the walk lights them into the leaf, one per line */
body.surface-leaf #c-tray { order: 2; display: flex; flex-direction: column; gap: 0;
  height: auto !important; min-height: 0; opacity: 1; visibility: visible; pointer-events: auto; }
body.surface-leaf #c-tray .gb-row { display: none; }
body.surface-leaf #c-tray .gb-row.row-lit { display: flex; align-items: baseline; gap: 8px;
  padding: 6px 0; border-bottom: 1px solid rgba(33, 28, 21, 0.12);
  animation: row-chip-in 300ms cubic-bezier(0.22, 1, 0.36, 1); }
body.surface-leaf.chrome-a #c-tray .gb-row-t { color: var(--gb-ink); font-size: 14px; }
body.surface-leaf.chrome-a #c-tray .gb-row-n, body.surface-leaf.chrome-a #c-tray .gb-row-m {
  color: var(--gb-ink-soft); font: 9.5px 'Space Mono', ui-monospace, monospace; }
body.surface-leaf.chrome-a #c-tray .c-rail-live .gb-row-t,
body.surface-leaf.chrome-a #c-tray .gb-row.tap:hover .gb-row-t { color: var(--gb-gold); }
body.surface-leaf #c-tray { overflow: hidden; }
body.surface-leaf #c-tray .gb-row.row-lit { min-width: 0; }
body.surface-leaf #c-tray .gb-row-t { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
body.surface-leaf #c-tray .c-rail-zone { display: block; max-width: none;
  color: rgba(33, 28, 21, 0.42); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.2em; }
body.surface-leaf #c-tray .gb-offers { display: none; }
body.surface-leaf #row-plus { align-self: flex-start; height: auto; border-color: rgba(138, 107, 31, 0.5);
  color: #8a6b1f; margin-top: 4px; }
/* the record beneath: registers as built, growing the leaf toward the study */
body.surface-leaf #tb-head { order: 3; margin: 4px 0 0; }
body.surface-leaf #register-transcript { order: 4; }
body.surface-leaf #register-guidebook { order: 5; display: block; }
body.surface-leaf #c-book { display: block !important; }
body.surface-leaf.tb-transcript #register-guidebook { display: none; }
body.surface-leaf #register-transcript { display: none; }
body.surface-leaf.tb-transcript #register-transcript { display: block; overflow-y: auto; }
body.surface-leaf .gb-body { max-height: none; }
/* the throat docks at the leaf's foot, on the paper */
body.surface-leaf #c-status { order: 8; color: var(--gb-ink-soft); }
body.surface-leaf.throat-on #c-form { position: static; order: 9; left: auto; right: auto;
  bottom: auto; transform: none; width: auto; margin-top: 2px; }
body.surface-leaf.throat-on #c-input { color: var(--gb-ink); text-shadow: none;
  caret-color: var(--gb-gold); }
body.surface-leaf.throat-on #c-input::placeholder { color: rgba(33, 28, 21, 0.38); text-shadow: none; }
body.surface-leaf.throat-on #c-send { color: var(--gb-ink-soft); text-shadow: none; }
body.surface-leaf.throat-on #c-form::before { display: none; }
/* the old tab yields; the bookmark is the collapsed leaf */
body.surface-leaf #book-tab { display: none !important; }
/* PORTRAIT: the bottom sheet, content-height from the foot (ruled portrait laws stand) */
@media (orientation: portrait), (max-width: 640px) {
  body.surface-leaf.chrome-a:not(.book-full-now) #concierge {
    left: 10px; right: 10px; top: auto; bottom: 10px; width: auto; max-width: none;
    max-height: 58vh; }
}

/* the ⌖ offer rides IN the leaf's flow (its absolute seat assumed the fixed throat) */
body.surface-leaf #c-locate-line { position: static; margin: 0 0 2px; order: 7;
  white-space: normal; }

/* the ask line IS the leaf's foot — always present while the leaf stands (the throat's
   engage-gating belongs to the fixed overlay it was born in); the ⌖ offer rides it */
body.surface-leaf.chrome-a:not(.desk-down):not(.book-full-now) #c-form {
  display: flex; opacity: 1; pointer-events: auto; visibility: visible; }

/* THE RIGHT-EDGE CONTRACT (balloon seat): the rail rides the VISIBLE map's edge — the leaf
   insets it by its own width whenever it stands, gliding with the claim */
body.surface-leaf.chrome-a:not(.desk-down):not(.book-full-now) .brail {
  right: calc(min(400px, 90vw) + 32px); transition: right 300ms var(--ease-chrome, ease); }


/* ═══ THE DRESS FOLLOWS THE DEPTH (founder refinement, 2026-09-08) ════════════════════════════
   At rest and through a passing say the object is INK ON THE WORLD — the transparent
   instrument idiom, chrome ink-shadow for any ground; the paper MATERIALIZES on the
   metronome when reader-content arrives (a lit row, a page, a register). */
body.surface-leaf.chrome-a:not(.book-full-now) #concierge {
  transition: background-color 240ms var(--ease-chrome, ease), box-shadow 240ms var(--ease-chrome, ease); }
body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) {
  background: none; box-shadow: none; overflow-y: visible; }
body.surface-leaf #concierge:not(.paper) .c-say,
body.surface-leaf #concierge:not(.paper) .c-say:last-of-type {
  color: #ecf0f5; text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95), 0 1px 8px rgba(6, 8, 12, 0.8); }
body.surface-leaf #concierge:not(.paper) .c-eyebrow.band-cur { color: rgba(218, 225, 234, 0.5);
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) .c-eyebrow.band-cur.live { color: #f5c469; }
body.surface-leaf #concierge:not(.paper) .c-rail-zone { color: rgba(218, 225, 234, 0.42);
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #c-status { color: rgba(218, 225, 234, 0.45);
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #leaf-seed { border-top-color: rgba(236, 240, 245, 0.14); }
body.surface-leaf #concierge:not(.paper) #leaf-seed #edge-tab { color: rgba(236, 240, 245, 0.5);
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #leaf-seed #edge-tab:hover { color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #c-input { color: #ecf0f5;
  text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95), 0 1px 8px rgba(6, 8, 12, 0.8); caret-color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #c-input::placeholder { color: rgba(224, 230, 238, 0.62);
  text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95); }
body.surface-leaf #concierge:not(.paper) #c-send { color: rgba(224, 230, 238, 0.7); }
/* the chip goes bare-instrument on the world (glyph + verb as ink) */
body.surface-leaf #concierge:not(.paper) #desk-chip .chip-main {
  background: transparent; border-color: transparent; backdrop-filter: none; }
/* the paper materializes — the object arriving, not a style swap */
body.surface-leaf #concierge.paper { animation: leaf-materialize 300ms cubic-bezier(0.22, 1, 0.36, 1); }
@keyframes leaf-materialize { from { box-shadow: none; } }

/* ═══ THE INTERIOR PASS (founder: "the guidebook and the transcript seem horribly muddled") ═══
   Two registers a stranger tells apart in a second: THE TAPE is a log — spine-ruled,
   mono-marked, dense, on faintly toned paper; THE BOOK is an artifact — titled pages,
   generous paper. One head row; the download is a glyph, not a label. */
#tb-head { display: flex; align-items: baseline; gap: 14px; margin: -2px 0 2px; }
#tb-head button { padding: 5px 2px 4px; letter-spacing: 0.24em; }
#tb-press { margin-left: auto; display: flex; align-items: baseline; gap: 8px; }
#tb-press-btn { background: none; border: none; cursor: pointer; padding: 2px 6px;
  color: rgba(33, 28, 21, 0.45); font: 14px 'Space Mono', ui-monospace, monospace; }
#tb-press-btn:hover { color: var(--gb-gold); }
body.surface-leaf #concierge:not(.paper) #tb-press-btn { color: rgba(236, 240, 245, 0.5); }
.tb-press-line, #tb-press-tape { font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.14em; color: var(--gb-ink-soft); }
.tb-press-link { color: #8a6b1f; margin-left: 8px; text-decoration: none; border-bottom: 1px solid rgba(138, 107, 31, 0.4); }
.tb-press-link:hover { color: var(--gb-gold); }
#tb-press-tape { background: none; border: none; cursor: pointer; color: #8a6b1f; padding: 0 0 0 8px; }
#tb-press-tape:hover { color: var(--gb-gold); }

/* THE TAPE — a log, instantly not-a-book: the spine rule, toned ground, mono marks,
   compact dense serif */
body.tb-transcript #register-transcript { display: block; overflow-y: auto;
  background: rgba(33, 28, 21, 0.035); border-left: 2px solid rgba(33, 28, 21, 0.25);
  padding: 8px 10px 10px 12px; margin: 2px -6px 0 0; }
#register-transcript .tb-mark { font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.2em; color: rgba(33, 28, 21, 0.45); margin: 10px 0 1px; }
#register-transcript .tb-mark:first-child { margin-top: 0; }
#register-transcript .tb-you { font: 11px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.04em; color: var(--gb-ink); margin: 0 0 2px; }
#register-transcript .tb-say { font-family: 'Playfair Display', georgia, serif;
  font-size: 13px; line-height: 1.45; color: var(--gb-ink); margin: 0 0 4px; }
#register-transcript .tb-played { font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.18em; color: #8a6b1f; margin: 6px 0; }
#register-transcript .tb-plates { display: flex; gap: 6px; margin: 4px 0 8px; }
#register-transcript .tb-plates figure { margin: 0; max-width: 92px; }
#register-transcript .tb-plates figcaption { font-size: 7.5px; }

/* the ⌖ offer's seat: a quiet right-hand line above the throat */
body.surface-leaf #c-locate-line { position: static; order: 11; text-align: right;
  margin: 0 0 1px; white-space: normal; }

/* leaf rows are block-level lines, never inline neighbors (the gb-printed un-retire says
   inline-flex for the band's horizontal row — the leaf's column overrides it) */
body.surface-leaf.gb-printed #c-tray .gb-row.row-lit,
body.surface-leaf #c-tray .gb-row.row-lit { display: flex !important; }

/* the object's two floors: the scroll region holds the grown content; the seed and the
   throat live BELOW it in plain flow — the foot can never be ridden under */
#leaf-scroll { order: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
  display: flex; flex-direction: column; gap: 10px; }
body.surface-leaf.chrome-a:not(.book-full-now) #concierge { overflow-y: hidden; }
body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) { overflow-y: visible; }
body.surface-leaf.desk-down #leaf-scroll { display: none; }

/* ═══ CALIBRATION (founder frames, 2026-09-08) ═══════════════════════════════════════════════ */
/* 1. THE PAPER SAY STANDS WHOLE (coordinator f01: a rolling tail inside the card). The
   two-line window is for the transparent/over-world state and the film's lower-third ONLY;
   on paper the card is a document — the whole say stands, scrolls in the region if long. */
body.surface-leaf #concierge.paper #c-transcript .c-say:last-of-type {
  max-height: none; overflow: visible; }
/* 2. THE FOOT'S INK FOLLOWS THE DRESS: on paper the verbs + throat are furniture on a card
   (dark on cream, crisp, no world-shadow); the throat is visibly an input (a ruled line +
   caret, legible placeholder). The transparent-state ink lives only under :not(.paper). */
body.surface-leaf #concierge.paper #desk-chip .chip-main {
  background: transparent; border: 1px solid rgba(33, 28, 21, 0.28); backdrop-filter: none; }
body.surface-leaf #concierge.paper #desk-chip:hover .chip-main,
body.surface-leaf #concierge.paper #desk-chip.engaged .chip-main { border-color: var(--gb-gold); }
body.surface-leaf #concierge.paper #desk-chip .chip-label { color: var(--gb-ink); text-shadow: none; }
body.surface-leaf #concierge.paper #leaf-seed #edge-tab { color: var(--gb-ink-soft); text-shadow: none; }
body.surface-leaf #concierge.paper #c-form { border-top: 1px solid rgba(33, 28, 21, 0.18);
  padding-top: 8px; }
body.surface-leaf #concierge.paper #c-input { color: var(--gb-ink); text-shadow: none;
  caret-color: var(--gb-gold); border-bottom: 1px solid rgba(33, 28, 21, 0.3); }
body.surface-leaf #concierge.paper #c-input::placeholder { color: rgba(33, 28, 21, 0.42); text-shadow: none; }
body.surface-leaf #concierge.paper #c-send { color: var(--gb-ink-soft); text-shadow: none; }
/* 3. THE EMPTY REGISTER speaks one honest quiet line rather than dead paper */
#tb-empty-note { display: none; }
body.surface-leaf #register-guidebook:not(:has(.gb-page)) #tb-empty-note,
body.tb-transcript #register-transcript:empty::after { }
.tb-empty { color: var(--gb-ink-soft); font-style: italic; font-size: 13px; padding: 14px 2px; }

/* ═══ THE ROUTE PAGE (founder 2026-09-09) — the guidebook's species for line subjects:
   THE TAKE leads as the route's lede; the chapters ride an ordered corridor list in the
   day-page idiom (one species for roads, trails, expeditions) */
.gb-route .gb-thesis { border-left: 2px solid rgba(138, 107, 31, 0.45); padding-left: 12px;
  font-style: italic; }
.gb-route .gb-stop, .gb-route .gb-row { position: relative; padding-left: 26px; }
.gb-route .gb-stop::before, .gb-route .gb-row::before { content: ''; position: absolute;
  left: 8px; top: 0; bottom: -1px; width: 1px; background: rgba(138, 107, 31, 0.35); }
.gb-route .gb-stop:last-of-type::before, .gb-route .gb-row:last-of-type::before { bottom: 50%; }
.gb-route .gb-row-n { color: #8a6b1f; font-weight: bold; }

/* ═══ PLATE HOME BY ORIGIN (founder ruling 2026-09-09) ═══════════════════════════════════════
   NO STATE where a world plate and the open leaf both stand. When the leaf is ENGAGED
   (surface-leaf, not desk-down), every WORLD-CARD plate lane yields — the film/premiere
   archival strip and the pinned world cards recede while the leaf holds the floor; they
   return the instant it collapses (film posture). Conversational plates live in the leaf
   (witness strip → register-guidebook; page figures → the pages) — ownership by origin. */
body.surface-leaf:not(.desk-down) #arr-strip,
body.surface-leaf:not(.desk-down) #film-pins {
  opacity: 0 !important; pointer-events: none !important;
  transition: opacity 240ms var(--ease-chrome, ease); }

/* ═══ DRESS FOLLOWS THE REGISTER (founder 2026-09-09) ════════════════════════════════════════
   The conversation — seed, says, rows, and THE TAPE — is ink on the world at every height;
   the GUIDEBOOK register alone pulls out the paper artifact. The tape's ink dress: */
body.surface-leaf #concierge:not(.paper) #tb-head button { color: rgba(236, 240, 245, 0.5);
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #tb-head button.on { color: #ecf0f5;
  border-bottom-color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #tb-head button:hover { color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #tb-press-btn { color: rgba(236, 240, 245, 0.5); }
body.surface-leaf #concierge:not(.paper) #register-transcript {
  background: rgba(6, 8, 12, 0.3); border-left-color: rgba(236, 240, 245, 0.3); }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-mark { color: rgba(218, 225, 234, 0.5);
  text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-you { color: #ecf0f5;
  text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-say { color: #ecf0f5;
  text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95), 0 1px 8px rgba(6, 8, 12, 0.8); }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-played { color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-empty { color: rgba(218, 225, 234, 0.5); }
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row-t { color: #ecf0f5;
  text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); }
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row-n,
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row-m { color: rgba(218, 225, 234, 0.55); }
body.surface-leaf #concierge:not(.paper) #c-tray .c-rail-live .gb-row-t { color: #f5c469; }
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row.row-lit { border-bottom-color: rgba(236, 240, 245, 0.14); }
/* THE SCRIM CAVEAT: a barely-there gradient stands behind the text region as it grows —
   the quiet-vignette family, never a card edge; imperceptible on the dark globe */
body.surface-leaf #concierge:not(.paper) #leaf-scroll {
  background: radial-gradient(120% 100% at 100% 60%, rgba(6, 8, 12, 0.34), rgba(6, 8, 12, 0.12) 55%, rgba(6, 8, 12, 0) 82%); }

/* ══ THE EDITOR'S DOCUMENT (founder 2026-09-09) — the guidebook model's pages. The base
   .gb-page/.gb-eyebrow/.gb-title grammar is guidebook.css's; only the doc's own furniture
   (days, leg rows, play refs, the trip meta line) lives here. ═══════════════════════════ */
#tb-doc { display: flex; flex-direction: column; gap: 22px; margin: 6px 0 10px; }
#tb-doc .gb-page { padding: 14px 0 4px; border-top: 1px solid rgba(138, 107, 31, 0.25); }
#tb-doc .gb-lede { color: var(--gb-ink); font: italic 400 14.5px/1.5 'Playfair Display', georgia, serif; }
.tb-trip-meta { color: var(--gb-ink-soft); font: 10px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.12em; }
.tb-day { display: flex; flex-direction: column; gap: 7px; margin-top: 8px; }
.tb-day-mark { border-bottom: 1px dotted rgba(138, 107, 31, 0.35); padding-bottom: 3px; }
#tb-doc .gb-row { display: flex; align-items: baseline; gap: 10px; }
#tb-doc .gb-row-t { color: var(--gb-ink); font: 400 14px/1.3 'Playfair Display', georgia, serif; }
#tb-doc .gb-row-n { color: var(--gb-ink-soft); font: 9.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.08em; white-space: nowrap; }
.tb-why { color: var(--gb-ink-soft); font: 400 11.5px/1.5 georgia, serif; margin: -3px 0 2px 12px; }
.tb-playref { background: none; border: none; cursor: pointer; padding: 0; text-align: left;
  color: var(--gb-gold); font: 10px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.14em; }
.tb-playref:hover { text-decoration: underline; }
.tb-doc-plates { display: flex; gap: 8px; flex-wrap: wrap; }
.tb-doc-plates .gb-tile img { max-height: 140px; }

/* ══ THE RICHES (founder 2026-09-09: "No pictures. No weather. No elevation… put your design
   hat on.") — the guidebook register's own furniture for the corpus fields that now print.
   Written in the paper's existing voice: Playfair for what is said, Space Mono tracked for
   what is measured or labelled, and THE GOLD LAW held — gold marks exactly three things on
   these pages (a section head's rule, the profile's high point, a playable ▸). ═══════════ */

/* the tracked section head — the volume's small caps, one hair of gold under it */
.tb-sect { display: block; color: var(--gb-ink-soft); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; text-transform: uppercase; padding-bottom: 3px;
  border-bottom: 1px solid rgba(200, 148, 47, 0.28); margin: 4px 0 6px; }

/* THE PLATE, matted. A photograph printed on cream sits inside a hairline rule with the paper
   showing as its mat — the printed-plate idiom, not a web card (no radius: the corner law).
   THE PAPER GRADE is a restrained unifier, NOT the film stock of STYLE-GUIDE §2.4c: the
   corpus's plates arrive from wildly different registers (a 2017 Wikimedia colour photo beside
   a 1923 studio negative) and a page that prints them raw reads as a scrapbook. Deliberately
   an eighth of the film's strength — see the handoff; a one-line revert if the constitution
   would rather paper stay ungraded. */
#tb-doc .tb-hero { margin: 4px 0 2px; padding: 7px; border: 1px solid var(--gb-rule);
  background: rgba(255, 253, 247, 0.55); }
#tb-doc .tb-hero img { display: block; width: 100%; height: auto; max-height: 260px;
  object-fit: cover; filter: saturate(0.92) sepia(0.06) contrast(1.04); }
#tb-doc .tb-hero-day img { max-height: 180px; }
#tb-doc .tb-hero figcaption, #tb-doc .tb-doc-plates figcaption {
  display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 6px; }
.tb-fig-cap { color: var(--gb-ink); font: 400 11px/1.4 'Playfair Display', georgia, serif; }
/* the plate's own title, standing behind the subject the page names */
.tb-fig-sub { color: var(--gb-ink-soft); font: 400 10px/1.4 georgia, serif; font-style: italic; }
.tb-credit { color: rgba(33, 28, 21, 0.44); font: 8px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.1em; }
#tb-doc .tb-doc-plates .gb-tile { padding: 5px; border: 1px solid var(--gb-rule); }
#tb-doc .tb-doc-plates .gb-tile img { filter: saturate(0.92) sepia(0.06) contrast(1.04); }

/* THE EPIGRAPH — the chapter's own argument, set as the page's opening breath */
.tb-epigraph { color: var(--gb-ink); font: italic 400 15px/1.6 'Playfair Display', georgia, serif;
  border-left: 2px solid rgba(200, 148, 47, 0.45); padding: 2px 0 2px 14px; margin: 8px 0 4px; }

/* the field register — a mono key over its serif value (WHY GO) */
.tb-field { display: flex; flex-direction: column; gap: 3px; margin: 8px 0 2px; }
.tb-field-k { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; text-transform: uppercase; }
.tb-field-v { color: var(--gb-ink); font: 400 14px/1.6 'Playfair Display', georgia, serif; }
.tb-field-v.tb-field-mono { font: 11px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.1em; }

/* THE INSIDER LINE — the margin note idiom the paper already owns (.tb-note's rule), labelled */
.tb-insider { color: var(--gb-ink); font: 400 12.5px/1.55 georgia, serif;
  padding-left: 11px; border-left: 2px solid var(--gb-rule); margin: 4px 0 2px 12px; }
.tb-insider-block { display: flex; flex-direction: column; gap: 3px; margin: 10px 0 4px; padding-left: 13px; }
.tb-insider-mark { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; }
.tb-insider-t { color: var(--gb-ink); font: 400 13.5px/1.6 'Playfair Display', georgia, serif; }

/* the marks strip — LIGHT · GIVE IT · the kind of ground, all measured or curated, never guessed */
.tb-marks { display: flex; flex-wrap: wrap; gap: 6px 20px; margin: 8px 0 2px;
  padding: 8px 0; border-top: 1px solid var(--gb-rule); border-bottom: 1px solid var(--gb-rule); }
.tb-mark-pair { display: flex; flex-direction: column; gap: 2px; }
.tb-mark-k { color: rgba(33, 28, 21, 0.42); font: 8px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.28em; }
.tb-mark-v { color: var(--gb-ink); font: 11px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.06em; }
.tb-stopmarks { color: rgba(33, 28, 21, 0.5); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.16em; margin: -2px 0 4px 12px; white-space: pre-wrap; }

/* the corpus's own tags — quiet, lowercase, hairline-boxed; never a coloured pill */
.tb-tags { display: flex; flex-wrap: wrap; gap: 5px; margin: 6px 0 2px; }
.tb-tag { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.14em; border: 1px solid var(--gb-rule); padding: 2px 6px 1px; }

/* PAIRS WITH — the corpus's own "and while you're there" */
.tb-pairs { margin: 10px 0 2px; }
.tb-pairs-list { display: flex; flex-wrap: wrap; gap: 4px 14px; }
.tb-pair { color: var(--gb-ink-soft); font: 400 13px/1.45 'Playfair Display', georgia, serif; }
button.tb-pair-live { background: none; border: none; padding: 0; cursor: pointer;
  color: var(--gb-ink); border-bottom: 1px solid rgba(200, 148, 47, 0.4); }
button.tb-pair-live:hover { color: var(--gb-gold); border-bottom-color: rgba(200, 148, 47, 0.8); }

/* THE STORIES — the tracklist. A row is a door: the ▸ is the page's one gold verb. */
.tb-tracks { display: flex; flex-direction: column; margin: 12px 0 2px; }
.tb-track { display: block; width: 100%; text-align: left; background: none; cursor: pointer;
  border: none; border-bottom: 1px solid var(--gb-rule); padding: 7px 2px 7px 0; }
.tb-track:last-of-type { border-bottom: none; }
.tb-track-head { display: flex; align-items: baseline; gap: 8px; }
.tb-track-mark { color: var(--gb-gold); font: 10px 'Space Mono', ui-monospace, monospace; }
.tb-track-t { flex: 1; min-width: 0; color: var(--gb-ink);
  font: 400 13.5px/1.35 'Playfair Display', georgia, serif; }
.tb-track-km { color: rgba(33, 28, 21, 0.42); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.12em; white-space: nowrap; }
.tb-track-th { color: var(--gb-ink-soft); font: 400 11.5px/1.5 georgia, serif; margin: 3px 0 0 18px; }
.tb-track:hover .tb-track-t { color: var(--gb-gold); }

/* ── THE BOOK IS PAGINATED (founder 2026-09-10: "a book-like paginated artifact with the most
   recent turn on the current page"). One page stands at a time; the rest keep their DOM (and
   their weather readings) behind a display switch, so turning back is instant and the press
   still freezes the whole book. The pager foot is the volume's own mono furniture. ───────── */
#tb-doc .tb-doc-page.tb-off { display: none; }
/* THE PAGER IS ALWAYS AT HAND (M4 drive-caught 2026-09-11). The pager sits at the foot of the
   document region, and a page taller than the leaf pushed it — AND ITS LIVE CUE — below the
   fold: a reader paged back into Bengaluru was never yanked (correct) but also never SAW the
   "NEW GROUND ›" the ruling promises them. Sticky to the floor of the scroll region fixes it
   without moving one piece of the leaf's fixed furniture: the tab row's rect is untouched, the
   pager simply stops sliding out from under the reader's thumb. */
#tb-pager { display: flex; align-items: baseline; gap: 10px; margin: 4px 0 12px;
  padding-top: 8px; border-top: 1px solid var(--gb-rule);
  position: sticky; bottom: 0; z-index: 3;
  background: linear-gradient(to bottom, rgba(245, 241, 232, 0) 0, var(--gb-paper) 7px); }
#tb-pager[hidden] { display: none; }
#tb-pager button { background: none; border: none; cursor: pointer; padding: 2px 4px;
  color: var(--gb-ink-soft); font: 13px 'Space Mono', ui-monospace, monospace; }
#tb-pager button:hover:not(:disabled) { color: var(--gb-gold); }
#tb-pager button:disabled { color: rgba(33, 28, 21, 0.2); cursor: default; }
.tb-pg-n { color: var(--gb-ink-soft); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.24em; min-width: 56px; text-align: center; }
/* THE LIVE EDGE CUE — a reader who has paged back is never yanked forward; they are told.
   This is the one place the pager is allowed gold: it is the book's one live thing. */
.tb-pg-live { margin-left: auto; color: var(--gb-gold) !important;
  font: 8.5px 'Space Mono', ui-monospace, monospace !important; letter-spacing: 0.26em;
  border-bottom: 1px solid rgba(200, 148, 47, 0.45) !important; }
.tb-pg-live[hidden] { display: none; }

/* ══ M4 · THE JOURNEY SPINE (founder-ruled 2026-09-11) ════════════════════════════════════════
   Section headers are BOOK FURNITURE in the eyebrow register — the ground's name and the
   section's page count, sitting above the page's own eyebrow with a rule under them, the way a
   part title sits above a chapter title. Ink, never gold: gold is scarce and the pager's live
   cue already owns the one gold thing on this surface. */
.tb-section-head { color: var(--gb-ink); font: 9px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.3em; padding-bottom: 5px; margin-bottom: 9px;
  border-bottom: 1px solid var(--gb-rule); cursor: pointer; }
.tb-section-head:hover, .tb-section-head:focus-visible { color: var(--gb-gold); outline: none; }
.tb-section-head[hidden] { display: none; }
/* THE CONTENTS — the index page at the front: the grounds in order of travel, one tap each */
.tb-contents-list { margin-top: 14px; }
.tb-contents-row { display: flex; align-items: baseline; gap: 12px; width: 100%;
  background: none; border: none; border-bottom: 1px solid var(--gb-rule);
  padding: 9px 2px; cursor: pointer; text-align: left; }
.tb-contents-row:hover .tb-contents-t, .tb-contents-row:focus-visible .tb-contents-t { color: var(--gb-gold); }
.tb-contents-n { color: var(--gb-ink-soft); font: 9px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.16em; }
.tb-contents-t { flex: 1; color: var(--gb-ink); font: 400 17px/1.2 'Playfair Display', Georgia, serif; }
.tb-contents-m { color: var(--gb-ink-soft); font: 8.5px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.14em; }

/* THE DRIVE IN + its elevation strip — measured geometry, drawn in ink; one gold high point */
.tb-drive { margin: 8px 0 4px; }
.tb-drive-head { display: flex; align-items: baseline; gap: 12px; }
.tb-drive-head .tb-sect { flex: 0 0 auto; border-bottom: none; margin: 0; padding: 0; }
.tb-drive-n { color: var(--gb-ink); font: 10px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.1em; }
/* the strip reads as a MEASURED THING, not a scratch: a hairline ground rule under it, a fill
   with enough weight to hold the shape on cream, and a stroke that survives the stretch
   (drive-caught 2026-09-09 — at 0.07/1.2 the profile all but vanished on the page) */
.tb-profile { margin-top: 6px; border-bottom: 1px solid var(--gb-rule); padding-bottom: 2px; }
.tb-profile svg { display: block; width: 100%; height: 54px; }
.tb-prof-fill { fill: rgba(33, 28, 21, 0.1); stroke: none; }
.tb-prof-line { fill: none; stroke: rgba(33, 28, 21, 0.78); stroke-width: 1.5;
  vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
.tb-prof-peak { fill: var(--gb-gold); }
.tb-prof-meta { color: rgba(33, 28, 21, 0.45); font: 8.5px 'Space Mono', ui-monospace, monospace;
  letter-spacing: 0.12em; margin-top: 3px; }

/* ══════════════════════════════════════════════════════════════════════════════════════════════
   THE LEAF'S FURNITURE (leaf-furniture seat, founder-final consolidation 2026-09-09)

   Four measured breakages, one structural answer. The founder's own drive on :7100 (sha
   691545e) recorded: (1) the TRANSCRIPT|GUIDEBOOK row sat INSIDE the content flow, so its y
   was a function of the active register's height — 18px of drift across a two-turn session,
   mid-screen in one tab and at the floor in the other; (2) the paper dress was a class on the
   WHOLE leaf, so the input line and the tab row wore cream in the guidebook and ink in the
   transcript; (3) a say leaked into the guidebook register; (4) the live say printed twice in
   the transcript. (3) and (4) are answered in js (ONE SAY, two-books.mjs); (1) and (2) are
   answered here.

   THE COLUMN. The leaf is bottom-anchored and grows UPWARD (right:16, bottom:44 — the ruled
   floating-leaf geometry, unchanged). Its children, top to bottom:

       #leaf-scroll   D. THE CONTENT REGION — flex-1, the ONE scroller; both registers live in
                         it and scroll BEHIND the furniture
       #leaf-above    C. status · ⌖ · THE RECS BAND (transcript register only)
       #leaf-tabs     B. THE TAB ROW — fixed furniture, outside the scroll flow
       #leaf-foot     A. THE INPUT LINE — bottommost, FIXED height

   Every element below the scroll therefore has a CONSTANT distance from the viewport floor.
   The tab row's rect is byte-identical in both registers and across every turn, and nothing
   #leaf-above does (0–3 rows of recs, a status line or none) can move it, because it is above
   it. There is no sticky, no measurement, no re-seating loop — the geometry IS the guarantee.

   THE DRESS. Paper belongs to the guidebook CONTENT REGION alone (#register-guidebook), never
   to the leaf: the conversation and every piece of furniture is transparent ink at every
   height, in every register, always. `#concierge.paper` is retired (js no longer sets it), so
   the authored `:not(.paper)` ink rules above now apply unconditionally — one ink dress, not
   two — and only the rules that assumed a papered CONTAINER are answered below.
   ══════════════════════════════════════════════════════════════════════════════════════════ */

/* ── the column itself ─────────────────────────────────────────────────────────────────────── */
body.surface-leaf.chrome-a:not(.book-full-now) #concierge,
body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) {
  display: flex; flex-direction: column; gap: 0;
  padding: 14px 18px 10px;
  overflow: hidden;                 /* the column clips; #leaf-scroll is the ONE scroller */
}
body.surface-leaf #leaf-scroll { order: 1; flex: 1 1 auto; min-height: 0; overflow-y: auto;
  overscroll-behavior: contain; display: flex; flex-direction: column; gap: 10px; }
body.surface-leaf #leaf-above { order: 2; flex: 0 0 auto; display: flex; flex-direction: column;
  gap: 2px; padding-top: 6px; }
body.surface-leaf #leaf-tabs { order: 3; flex: 0 0 auto; }
body.surface-leaf #leaf-foot { order: 4; flex: 0 0 auto; }
/* the folded leaf keeps only its foot — the input line and the bookmark are the seed now */
body.surface-leaf.desk-down :is(#leaf-scroll, #leaf-above, #leaf-tabs, #surface-close) {
  display: none !important; }

/* ── B. THE TAB ROW — fixed furniture, one height, forever ─────────────────────────────────── */
body.surface-leaf #tb-head {
  margin: 0; height: 30px; box-sizing: border-box;
  display: flex; align-items: center; gap: 14px; overflow: hidden;
  border-top: 1px solid rgba(236, 240, 245, 0.14); }
body.surface-leaf #tb-head button { padding: 4px 2px 3px; letter-spacing: 0.24em; }
/* the press chip's read-out can never grow the row (a pressed link would have pushed it) */
body.surface-leaf #tb-press { align-items: center; }
body.surface-leaf #tb-press-out { max-width: 138px; overflow: hidden; white-space: nowrap;
  text-overflow: ellipsis; }

/* ── C. THE RECS BAND — two columns at leaf width, one when the leaf goes narrow ───────────── */
/* THE BREAKPOINT, stated: the leaf is min(400px, 90vw). Two columns are honest down to about
   a 340px leaf (a ~160px cell still holds "1 · Point Reyes" + its km tag on one line without
   ellipsis); below that the tag and the name fight, so the band folds to one column. 480px of
   viewport is where 90vw crosses that line, so that is the query. Never horizontal scrolling —
   a deeper list scrolls DOWN inside the band. */
body.surface-leaf #leaf-recs { max-height: 92px; overflow-y: auto; overflow-x: hidden;
  overscroll-behavior: contain; scrollbar-width: none; }
body.surface-leaf #leaf-recs::-webkit-scrollbar { width: 0; height: 0; }
body:not(.tb-transcript) #leaf-recs { display: none; }   /* the guidebook has no recs band */
body.surface-leaf #c-tray { display: grid; grid-template-columns: 1fr 1fr;
  column-gap: 14px; row-gap: 0; overflow: visible; height: auto !important; min-height: 0;
  opacity: 1; visibility: visible; pointer-events: auto; }
body.surface-leaf #c-tray .c-rail-zone { grid-column: 1 / -1; }
body.surface-leaf #c-tray #row-plus { grid-column: 1 / -1; }
@media (max-width: 480px) {
  body.surface-leaf #c-tray { grid-template-columns: 1fr; }
}

/* ── A. THE INPUT LINE — one hairline, no box, no label, no ornament ───────────────────────── */
body.surface-leaf #leaf-foot { height: 44px; box-sizing: border-box;
  display: flex; flex-direction: column; justify-content: flex-end; }
/* TALK TO ME and its rectangle are deleted from this dress (the chip stays in the DOM so
   desk-dress's own state machine keeps reading the mic's classes — it is simply not chrome) */
body.surface-leaf #leaf-foot #desk-chip { display: none !important; }
body.surface-leaf #leaf-foot #edge-tab { display: none; }
body.surface-leaf.desk-down #leaf-foot #edge-tab { display: block; position: static;
  writing-mode: horizontal-tb; transform: none; border: none; background: none;
  padding: 2px 0 4px; text-align: left; color: rgba(236, 240, 245, 0.5);
  font: 9px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.3em;
  text-shadow: 0 1px 6px rgba(6, 8, 12, 0.9); cursor: pointer; }
body.surface-leaf.desk-down #leaf-foot #edge-tab:hover,
body.surface-leaf.desk-down #leaf-foot #edge-tab.pulse { color: #f5c469; }
body.surface-leaf.throat-on #leaf-foot #c-form, body.surface-leaf #leaf-foot #c-form {
  position: relative; left: auto; right: auto; bottom: auto; transform: none;
  width: auto; margin: 0; height: 30px; box-sizing: border-box;
  display: flex; align-items: center; gap: 10px; padding: 0 0 6px;
  border: none; opacity: 1; visibility: visible; pointer-events: auto; }
body.surface-leaf #leaf-foot #c-input { flex: 1 1 auto; min-width: 0; height: 22px;
  font: 300 13px/22px 'Inter', system-ui, sans-serif; padding: 0; }
/* THE ONE GLYPH SLOT at the right end: mic when the line is empty, arrow the moment it isn't */
body.surface-leaf #leaf-foot #c-send { flex: 0 0 auto; margin: 0; padding: 0 2px;
  display: none; font: 15px 'Space Mono', ui-monospace, monospace; }
body.surface-leaf.leaf-typed #leaf-foot #c-send { display: block; }
body.surface-leaf #leaf-foot .tmic-wrap { position: static; flex: 0 0 auto; width: auto;
  transform: none; margin: 0; padding: 0; display: block; opacity: 1; pointer-events: auto; }
body.surface-leaf.leaf-typed #leaf-foot .tmic-wrap { display: none; }
body.surface-leaf #leaf-foot .tmic-cap-slot { display: none !important; } /* TALK TO ME, gone */
body.surface-leaf #leaf-foot .tmic-glyph { display: none; }               /* the ornament, gone */
body.surface-leaf #leaf-foot .tmic { position: static; width: 22px; height: 22px; padding: 0;
  display: flex; align-items: center; justify-content: center; background: none; border: none;
  cursor: pointer; color: rgba(224, 230, 238, 0.62); filter: none; box-shadow: none; }
/* the generous target stays generous, but bounded by the line — it can never swallow the box */
body.surface-leaf #leaf-foot .tmic-target { position: absolute; inset: -8px -6px; width: auto;
  height: auto; }
body.surface-leaf #leaf-foot .tmic:hover { color: #ecf0f5; }
body.surface-leaf #leaf-foot .tmic.held { color: rgba(245, 196, 105, 0.75); }
body.surface-leaf #leaf-foot .tmic.live, body.surface-leaf #leaf-foot .tmic.requesting {
  color: #f5c469; }
.tmic-mini { display: none; }
body.surface-leaf #leaf-foot .tmic-mini { display: block; }
/* the hairline is the throat's own ::after; the FOCUS gold steps down so the meter below is
   the line's only gold */
body.surface-leaf.throat-on #leaf-foot #c-form:focus-within::after {
  background: linear-gradient(to right, rgba(218, 225, 234, 0),
    rgba(218, 225, 234, 0.5) 16%, rgba(218, 225, 234, 0.5)); }

/* THE LEVEL METER — while a hold's channel is live the line renders the level where the text
   would be. talkmic publishes the RMS as --tmic-level; surface-dress republishes it here. */
#leaf-level { display: none; }
body.surface-leaf.mic-hold #leaf-level { display: block; position: absolute; left: 0;
  right: 34px; bottom: 9px; height: 2px; background: rgba(245, 196, 105, 0.14); }
#leaf-level i { display: block; height: 100%; width: calc(var(--leaf-level, 0) * 100%);
  min-width: 2px; background: #f5c469; box-shadow: 0 0 8px rgba(245, 196, 105, 0.7);
  transition: width 90ms linear; }
body.surface-leaf.mic-hold #leaf-foot #c-input { opacity: 0; }
@media (prefers-reduced-motion: reduce) { #leaf-level i { transition: none; } }

/* ── D. THE CONTENT REGION — the registers fill it; the paper is scoped to ONE of them ─────── */
body.surface-leaf #register-transcript, body.surface-leaf #register-guidebook {
  order: 0; margin: 0; overflow: visible; }         /* #leaf-scroll is the only scroller */
body.surface-leaf.tb-transcript #register-transcript { display: block; overflow: visible;
  padding: 8px 10px 10px 12px; }
/* THE PAPER, SCOPED: it dresses this region and stops at its edge. Nothing above (the tab row,
   the input line, the recs band, the status) can ever wear it again. */
body.surface-leaf #register-guidebook { flex: 1 0 auto; min-height: 100%; box-sizing: border-box;
  background: var(--gb-paper); padding: 16px 16px 20px; margin: 0;
  box-shadow: inset 0 0 0 1px rgba(33, 28, 21, 0.1);
  animation: leaf-materialize 300ms cubic-bezier(0.22, 1, 0.36, 1); }
body.surface-leaf.tb-transcript #register-guidebook { display: none; }
body.surface-leaf #register-guidebook #tb-doc { margin-top: 0; }

/* ── THE ONE SAY, dressed: the desk's block slims to its chair line; the say node itself
   (moved here by two-books) is the register's live foot and streams in place ─────────────── */
body.surface-leaf #register-transcript #c-transcript { display: block; order: 0; margin-top: 12px; }
body.surface-leaf #register-transcript #c-transcript:first-child { margin-top: 0; }
body.surface-leaf #c-transcript .c-pager, body.surface-leaf #c-transcript .c-pg,
body.surface-leaf #c-transcript .c-pos { display: none !important; }
body.surface-leaf #c-transcript .c-you { display: block;
  font: 11px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.04em;
  color: #ecf0f5; text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); margin: 0 0 4px; }
body.surface-leaf #c-transcript .c-eyebrow, body.surface-leaf #c-transcript .c-eyebrow.band-cur {
  display: block; font: 8.5px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.2em;
  color: rgba(218, 225, 234, 0.5); text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); margin: 0 0 1px; }
body.surface-leaf #c-transcript .c-eyebrow.live { color: #f5c469; }
/* THE SAY BODY IS NOT THE DESK BLOCK'S. It lives in #tb-live and there is only one of it. */
body.surface-leaf #c-transcript .c-say { display: none !important; }
body.surface-leaf #tb-live { display: block; }
body.surface-leaf #tb-live .c-say, body.surface-leaf #tb-live .c-say:last-of-type {
  display: block; max-height: none; overflow: visible;
  font-family: 'Playfair Display', georgia, serif; font-size: 13px; line-height: 1.45;
  color: #ecf0f5; text-shadow: 0 1px 2px rgba(6, 8, 12, 0.95), 0 1px 8px rgba(6, 8, 12, 0.8);
  margin: 0 0 4px; }
body.surface-leaf #tb-live .c-say.c-composing { opacity: 0.62; }

/* ══ THE FLOOR UNDER THE LEAF (this seat's own drive, over daylight satellite) ════════════════
   Driving the finished column over bright ground convicted the transparent dress on its own
   terms: the leaf was very nearly unreadable over a sunlit San Francisco. The founder's ruling
   is transparent INK, not transparent nothing — and the house has always answered legibility
   with a vignette (the desk's floor, the throat's radial), never with a panel.

   The first cut of this fix was a panel and I convicted it in my own frame: a ground painted
   ON the register drew a hard rectangle with a visible right edge and a visible top edge, and
   the leaf stopped being ink on the world and became a card. So the floor is ONE FIXED FIELD
   behind the leaf, bled off the right edge of the viewport and faded to nothing up and to the
   left — it has no edge anywhere a reader can see. The content region fades at its own top as
   it scrolls, so nothing is ever cut mid-line against a boundary either. */
body.surface-leaf.chrome-a.gb-live:not(.desk-down):not(.book-full-now)::after {
  content: ''; position: fixed; right: 0; bottom: 0; width: min(520px, 96vw); height: 100vh;
  z-index: 44;                       /* under the leaf (45), over the world */
  pointer-events: none;
  /* two layers, one field: a FLOOR across the bottom (the furniture stands on it — the tab row
     and the input line are the thinnest ink on screen and need the most ground) and a VIGNETTE
     climbing the column behind the reading. A horizontal mask fades the whole thing out to the
     left and it bleeds off the right edge of the viewport, so it has no edge anywhere. */
  background:
    linear-gradient(to top, rgba(6, 8, 12, 0.93) 0, rgba(6, 8, 12, 0.88) 10%,
      rgba(6, 8, 12, 0.55) 26%, rgba(6, 8, 12, 0.12) 40%, rgba(6, 8, 12, 0) 52%),
    radial-gradient(122% 80% at 100% 100%, rgba(6, 8, 12, 0.84), rgba(6, 8, 12, 0.62) 40%,
      rgba(6, 8, 12, 0.3) 66%, rgba(6, 8, 12, 0.08) 85%, rgba(6, 8, 12, 0) 96%);
  -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, #000 46%);
  mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, #000 46%);
  transition: opacity 240ms var(--ease-chrome, ease); }
/* the registers add NO ground of their own — the field is the one floor; the tape keeps its
   spine rule, which is its one honest edge */
body.surface-leaf #concierge:not(.paper) #register-transcript {
  background: none; border-left-color: rgba(236, 240, 245, 0.34); }
body.surface-leaf #concierge:not(.paper) #leaf-scroll { background: none; }
/* the content region fades out at its own head — text scrolls away rather than being guillotined
   against the column's top edge */
body.surface-leaf #leaf-scroll {
  -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0, #000 26px);
  mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0, #000 26px); }
/* the papered guidebook is the one thing that wants a real edge — it is a printed page, and it
   opts out of the head fade so its first line is not ghosted */
body.surface-leaf:not(.tb-transcript) #leaf-scroll {
  -webkit-mask-image: none; mask-image: none; }

/* ── the recs band's cut reads as MORE BELOW, not as a broken row ──────────────────────────── */
body.surface-leaf #leaf-recs { margin-bottom: 5px;
  -webkit-mask-image: linear-gradient(to bottom, #000 82%, rgba(0, 0, 0, 0.25));
  mask-image: linear-gradient(to bottom, #000 82%, rgba(0, 0, 0, 0.25)); }

/* ── the live turn's you-line reads like the log's, because it is the same thing ───────────── */
body.surface-leaf #c-transcript .c-you { text-align: left; padding: 0; }
body.surface-leaf #c-transcript .c-you::before { content: '— YOU'; display: block;
  font: 8.5px 'Space Mono', ui-monospace, monospace; letter-spacing: 0.2em;
  color: rgba(33, 28, 21, 0.45); margin-bottom: 1px; }
body.surface-leaf #concierge:not(.paper) #c-transcript .c-you::before {
  color: rgba(218, 225, 234, 0.5); text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); }

/* ── THE THIN INK LIFTS OVER BRIGHT GROUND (same drive, the daylight frame) ─────────────────
   The say body reads on the floor above, but the leaf's THINNEST ink — the mono marks, the
   tab row's off-state, the km tags, the placeholder — was still ghosting over sunlit water at
   the alphas it was drawn at for a night globe. These are the leaf's own furniture and this
   dress owns them, so they step up. Nothing gains a box; the ink simply carries. */
body.surface-leaf #concierge:not(.paper) #tb-head button { color: rgba(236, 240, 245, 0.68); }
body.surface-leaf.throat-on #leaf-foot #c-input::placeholder,
body.surface-leaf #concierge:not(.paper) #c-input::placeholder {
  color: rgba(224, 230, 238, 0.72);
  text-shadow: 0 1px 3px rgba(6, 8, 12, 0.95); }
body.surface-leaf #concierge:not(.paper) #register-transcript .tb-mark,
body.surface-leaf #concierge:not(.paper) #c-transcript .c-eyebrow,
body.surface-leaf #concierge:not(.paper) #c-transcript .c-eyebrow.band-cur,
body.surface-leaf #concierge:not(.paper) #c-transcript .c-you::before {
  color: rgba(224, 230, 238, 0.68); }
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row-n,
body.surface-leaf #concierge:not(.paper) #c-tray .gb-row-m,
body.surface-leaf #concierge:not(.paper) #c-tray .c-rail-zone {
  color: rgba(224, 230, 238, 0.72); text-shadow: 0 1px 4px rgba(6, 8, 12, 0.9); }
/* and the floor under the furniture takes the last of it */
body.surface-leaf.chrome-a.gb-live:not(.desk-down):not(.book-full-now)::after {
  background:
    linear-gradient(to top, rgba(6, 8, 12, 0.96) 0, rgba(6, 8, 12, 0.92) 12%,
      rgba(6, 8, 12, 0.6) 27%, rgba(6, 8, 12, 0.14) 41%, rgba(6, 8, 12, 0) 53%),
    radial-gradient(122% 80% at 100% 100%, rgba(6, 8, 12, 0.86), rgba(6, 8, 12, 0.64) 40%,
      rgba(6, 8, 12, 0.31) 66%, rgba(6, 8, 12, 0.08) 85%, rgba(6, 8, 12, 0) 96%); }

/* ══ THE FILM LEAF (film-leaf seat, 2026-09-10 — the founder's mid-film frame) ════════════════
   THE FOUNDER'S BUG. Mid-film the leaf's furniture — the GUIDEBOOK handle and the input line —
   stood at the TOP-RIGHT of the screen with the tab row gone, while the film's NOW PLAYING
   caption band held the bottom.

   THE DIAGNOSIS, measured (not film-mode's doing at all). book.css's SPLIT placement —
   `body.chrome-a.book-open.book-side:not(.book-full-now) #concierge { left:auto; right:0;
   top:0; bottom:0; width:min(440px,38vw) }` — was written when #concierge WAS the corner desk
   and the record's room was a full-height right pane. It carries FOUR classes to the leaf's
   own seat's THREE, so wherever `book-open` stands it out-ranks `right:16 / bottom:44` and
   stretches the fixed column across the whole viewport. The film then contributes only the
   collapse (desk-down), and the one visible child left — the foot — stacks from the TOP of
   that stretched box. Reproduced live at 1512×945: adding `book-open` alone moved the foot
   from y=847 to y=24 and the column from 400px@right:16 to 440px@right:0 — byte-for-byte the
   founder's frame (his content edge measures 1287px on a 1709px viewport: 1709−440+18).
   In leaf mode the leaf IS the reading room — book.css's three placements are already dead
   here (`#book-tab` is `display:none` for exactly this reason) — so the seat is restated below
   at a rank that cannot be taken, and the FILM gets the dress the founder ruled.

   THE RULED SHAPE. During a film the leaf STAYS bottom-anchored and YIELDS to the caption
   lane: the column's foot sits on the caption band's TOP EDGE (measured and republished by
   surface-dress as `--film-floor`, never a magic number — the band's height is a function of
   the line it holds), collapsed to its furniture (the tab row + the input line) with the
   content region hidden. The film owns the glass; the transcript keeps logging underneath. */

/* ── 1. THE SEAT CANNOT BE TAKEN ────────────────────────────────────────────────────────────
   The leaf's own geometry, restated at (1,4,1) so no book placement can move it. Nothing new
   is invented here — these are the authored floating-leaf numbers, said at a rank that holds.
   The lobby (`book-full-now`) is still excluded: a portrait takeover legitimately owns the
   viewport, and every leaf rule in this file already stands down for it. */
body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) {
  position: fixed; left: auto; right: 16px; top: auto; bottom: 44px;
  width: min(400px, 90vw); max-width: 90vw; height: auto;
  max-height: calc(100vh - 76px);
  /* the seat GLIDES — the film's yield and the way back are the same transition, so neither
     direction can read as a jump (the dress transition from THE DRESS FOLLOWS THE DEPTH is
     restated here because this rule out-ranks it) */
  transition: bottom var(--beat-fast) var(--ease-chrome, ease),
    padding-bottom var(--beat-fast) var(--ease-chrome, ease),
    background-color var(--beat-fast) var(--ease-chrome, ease),
    box-shadow var(--beat-fast) var(--ease-chrome, ease); }
@media (orientation: portrait), (max-width: 640px) {
  body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) {
    left: 10px; right: 10px; top: auto; bottom: 10px; width: auto; max-width: none;
    max-height: 58vh; } }
@media (prefers-reduced-motion: reduce) {
  body.surface-leaf.chrome-a:not(.book-full-now) #concierge:not(.paper) { transition: none; } }

/* ── 2. THE LEAF YIELDS TO THE CAPTION LANE ─────────────────────────────────────────────────
   `--film-floor` is the measured height of whatever the film hangs full-width off the bottom
   (the caption band while it holds a line; the transport row while it stands). padding-bottom
   goes to zero so the FOOT'S bottom edge is the column's bottom edge is the band's top edge —
   the assertion is `#leaf-foot`.bottom == `#caption-band`.top ± 2px, not a guessed gap. */
body.surface-leaf.leaf-film.chrome-a:not(.book-full-now) #concierge:not(.paper) {
  bottom: var(--film-floor, 44px); padding-bottom: 0;
  max-height: calc(100vh - var(--film-floor, 44px) - 32px); }
@media (orientation: portrait), (max-width: 640px) {
  body.surface-leaf.leaf-film.chrome-a:not(.book-full-now) #concierge:not(.paper) {
    bottom: var(--film-floor, 10px); max-height: 42vh; } }
/* the film's own stand-down of the whole desk (film.css) never reaches the leaf's instruments:
   the mic and the input line are live for the length of the movie (a typed ask is a barge) */
body.surface-leaf.leaf-film #concierge > * { pointer-events: auto; }

/* ── 3. COLLAPSED TO ITS FURNITURE ──────────────────────────────────────────────────────────
   desk-down is still the collapse (every law that reads it keeps its meaning); the film dress
   only changes WHICH furniture the folded column keeps. The content region and the recs band
   stay down — the film owns the glass — but the TAB ROW returns and becomes the one door, so
   the edge bookmark stands aside rather than doubling it. */
body.surface-leaf.leaf-film.desk-down #leaf-tabs { display: block !important; }
body.surface-leaf.leaf-film.desk-down #tb-head { display: flex !important; }
body.surface-leaf.leaf-film.desk-down #leaf-foot #edge-tab { display: none; }

/* ── 4. THE FLOOR UNDER THE FILM'S FURNITURE ────────────────────────────────────────────────
   The rest dress's field is a 100vh column and is correctly gated off by desk-down; over a
   playing film a field that tall would be the wall the whole dress exists to refuse. The film
   gets a much smaller, much lighter one — a soft corner under the two lines of thin ink only,
   masked to nothing to the left and bled off the right edge, sitting exactly on the caption
   band's shoulder so the two grounds read as one continuous floor. */
body.surface-leaf.leaf-film.chrome-a.desk-down:not(.book-full-now)::after {
  content: ''; position: fixed; right: 0; bottom: var(--film-floor, 44px);
  width: min(520px, 96vw); height: 124px; z-index: 44; pointer-events: none;
  background: linear-gradient(to top, rgba(6, 8, 12, 0.7) 0, rgba(6, 8, 12, 0.48) 32%,
    rgba(6, 8, 12, 0.16) 62%, rgba(6, 8, 12, 0) 88%);
  -webkit-mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, #000 52%);
  mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, #000 52%);
  transition: bottom var(--beat-fast) var(--ease-chrome, ease); }


/* ──────── THE CURTAIN RISES (app/lib/wire.mjs) ──────── */
#starfield,#map,#masthead,#hud,#dials,#concierge{visibility:visible}
