feat(module-studio): add configurable map page

This commit is contained in:
DCCONSTRUCTIONS
2026-07-13 17:14:34 +03:00
parent 1f2dffc031
commit 1a2ca8c82c
23 changed files with 2700 additions and 31 deletions
+307
View File
@@ -552,6 +552,313 @@ textarea {
.catalog-map-template-preview--application { min-height: 42rem; }
.catalog-map-fixture {
position: relative;
height: var(--catalog-map-height, 30rem);
min-height: 22.5rem;
overflow: hidden;
border-radius: var(--nodedc-radius-card);
background:
radial-gradient(circle at 70% 28%, color-mix(in srgb, var(--catalog-accent) 16%, transparent), transparent 32%),
linear-gradient(145deg, color-mix(in srgb, var(--nodedc-nested-surface) 88%, #18322e), var(--nodedc-nested-surface));
isolation: isolate;
}
.catalog-map-fixture--expanded { min-height: 22.5rem; }
.catalog-map-fixture__loading {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: var(--nodedc-text-muted);
font-size: var(--nodedc-font-size-sm);
}
.catalog-cesium-map,
.catalog-cesium-map__canvas,
.catalog-cesium-map__canvas > .cesium-viewer,
.catalog-cesium-map__canvas .cesium-viewer-cesiumWidgetContainer,
.catalog-cesium-map__canvas .cesium-widget,
.catalog-cesium-map__canvas canvas {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.catalog-cesium-map__canvas canvas {
touch-action: none;
}
/* Sandbox-only visual mode. Restore provider credits before any external or
commercial deployment; the runtime still retains the attribution metadata. */
.catalog-cesium-map__credits,
.catalog-cesium-map__credits .cesium-widget-credits,
.catalog-cesium-map__credits .cesium-credit-logoContainer,
.catalog-cesium-map__credits .cesium-credit-expand-link,
.catalog-cesium-map__credits .cesium-credit-textContainer {
display: none;
}
.catalog-map-fixture__grid {
position: absolute;
inset: 0;
opacity: 0.32;
background-image:
radial-gradient(circle, color-mix(in srgb, var(--catalog-accent) 54%, transparent) 1px, transparent 1.4px),
linear-gradient(color-mix(in srgb, var(--nodedc-text-muted) 18%, transparent) 1px, transparent 1px),
linear-gradient(90deg, color-mix(in srgb, var(--nodedc-text-muted) 18%, transparent) 1px, transparent 1px);
background-position: 0 0, center, center;
background-size: 1.25rem 1.25rem, 5rem 5rem, 5rem 5rem;
}
.catalog-map-fixture__geometry {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
overflow: visible;
}
.catalog-map-fixture__zone {
fill: color-mix(in srgb, var(--catalog-accent) 18%, transparent);
stroke: color-mix(in srgb, var(--catalog-accent) 70%, transparent);
stroke-width: 0.45;
vector-effect: non-scaling-stroke;
}
.catalog-map-fixture__track,
.catalog-map-fixture__route,
.catalog-map-fixture__trace {
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
vector-effect: non-scaling-stroke;
}
.catalog-map-fixture__track { stroke: color-mix(in srgb, #8f72dc 74%, var(--nodedc-text-primary)); stroke-width: 2; }
.catalog-map-fixture__route { stroke: var(--catalog-accent); stroke-width: 4; }
.catalog-map-fixture__trace { stroke: color-mix(in srgb, var(--catalog-accent) 58%, transparent); stroke-width: 2; stroke-dasharray: 5 5; }
.catalog-map-fixture__place {
position: absolute;
z-index: 1;
translate: -50% -50%;
color: color-mix(in srgb, var(--nodedc-text-primary) 72%, transparent);
font-size: clamp(1.2rem, 2.4vw, 2.35rem);
font-weight: 700;
letter-spacing: 0.16em;
pointer-events: none;
}
.catalog-map-fixture__entity {
position: absolute;
z-index: 4;
display: flex;
align-items: center;
gap: 0.4rem;
min-width: 0;
border: 0;
background: transparent;
color: var(--nodedc-text-primary);
translate: -1.35rem -50%;
cursor: pointer;
}
.catalog-map-fixture__pin {
display: grid;
width: 2.35rem;
height: 2.35rem;
flex: 0 0 auto;
place-items: center;
border: 0.2rem solid color-mix(in srgb, var(--nodedc-text-primary) 84%, transparent);
border-radius: 50%;
background: var(--catalog-accent);
color: var(--nodedc-text-on-accent);
box-shadow: 0 0 0 0.45rem color-mix(in srgb, var(--catalog-accent) 18%, transparent);
}
.catalog-map-fixture__entity[data-kind="station"] .catalog-map-fixture__pin {
background: color-mix(in srgb, #8f72dc 82%, var(--nodedc-panel-item-bg));
}
.catalog-map-fixture__entity[data-active] .catalog-map-fixture__pin {
box-shadow: 0 0 0 0.7rem color-mix(in srgb, var(--catalog-accent) 26%, transparent), 0 0 1.6rem color-mix(in srgb, var(--catalog-accent) 58%, transparent);
}
.catalog-map-fixture__label {
max-width: 12rem;
overflow: hidden;
border-radius: var(--nodedc-radius-circle);
background: var(--nodedc-panel-item-bg);
padding: 0.5rem 0.72rem;
box-shadow: var(--nodedc-glass-control-shadow);
font-size: var(--nodedc-font-size-xs);
font-weight: 700;
text-overflow: ellipsis;
white-space: nowrap;
}
.catalog-map-fixture__status {
position: absolute;
z-index: 5;
top: 1rem;
left: 1rem;
display: flex;
align-items: center;
gap: 0.6rem;
border-radius: var(--nodedc-radius-circle);
background: var(--nodedc-panel-item-bg);
padding: 0.5rem 0.8rem;
color: var(--nodedc-text-muted);
font-size: var(--nodedc-font-size-xs);
}
.catalog-map-fixture__status span {
color: var(--nodedc-status-success);
font-weight: 800;
text-transform: uppercase;
}
.catalog-map-fixture__actions {
position: absolute;
z-index: 8;
top: 1rem;
right: 1rem;
display: flex;
gap: 0.45rem;
}
.catalog-map-fixture__actions .nodedc-icon-button,
.catalog-map-fixture__toolbar .nodedc-icon-button {
border: 1px solid var(--nodedc-glass-outline);
background: color-mix(in srgb, var(--nodedc-glass-control-bg) 76%, transparent);
box-shadow: var(--nodedc-glass-control-shadow);
backdrop-filter: blur(var(--nodedc-blur-control));
}
.catalog-map-fixture__actions .nodedc-icon-button:hover,
.catalog-map-fixture__toolbar .nodedc-icon-button:hover {
background: var(--nodedc-glass-control-hover);
}
.catalog-map-fixture__actions .nodedc-icon-button[data-active],
.catalog-map-fixture__toolbar .nodedc-icon-button[data-active] {
border-color: transparent;
background: var(--nodedc-glass-control-active);
color: var(--nodedc-glass-control-active-text);
}
.catalog-map-fixture__layers {
position: absolute;
z-index: 8;
top: 4.8rem;
right: 1rem;
display: grid;
width: min(20rem, calc(100% - 2rem));
gap: 0.55rem;
box-shadow: var(--nodedc-glass-dropdown-shadow);
}
.catalog-map-fixture__layers-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 0.75rem;
}
.catalog-map-fixture__layers .nodedc-checker {
min-height: 3rem;
}
.catalog-map-fixture__provider {
display: grid;
gap: 0.16rem;
border-radius: var(--nodedc-radius-control);
background: var(--nodedc-glass-control-bg);
padding: 0.82rem 0.9rem;
}
.catalog-map-fixture__provider small {
color: var(--nodedc-text-muted);
font-size: var(--nodedc-font-size-xs);
}
.catalog-map-fixture__cache-toggle,
.catalog-map-inspector__cache-toggle {
min-height: 3.4rem;
}
.catalog-map-fixture__toolbar {
position: absolute;
z-index: 8;
bottom: 1rem;
left: 50%;
display: flex;
gap: 0.35rem;
border-radius: var(--nodedc-radius-circle);
background: color-mix(in srgb, var(--nodedc-glass-control-bg) 76%, transparent);
padding: 0.4rem;
translate: -50% 0;
backdrop-filter: blur(var(--nodedc-blur-control));
box-shadow: var(--nodedc-glass-dropdown-shadow);
}
.catalog-map-inspector__note {
color: var(--nodedc-text-muted);
font-size: var(--nodedc-font-size-xs);
line-height: 1.4;
}
.catalog-map-inspector__note--error {
color: rgb(var(--nodedc-danger-rgb));
font-weight: var(--nodedc-font-weight-strong);
}
.catalog-map-fixture__assistant {
position: absolute;
z-index: 9;
right: 1rem;
bottom: 1rem;
display: grid;
max-width: 22rem;
gap: 0.35rem;
border-radius: var(--nodedc-radius-card);
background: var(--nodedc-modal-surface);
padding: 1rem;
box-shadow: var(--nodedc-modal-shadow);
backdrop-filter: blur(var(--nodedc-blur-modal));
}
.catalog-map-fixture__assistant span { color: var(--nodedc-text-muted); font-size: var(--nodedc-font-size-xs); }
.catalog-map-fixture__resize {
position: absolute;
z-index: 9;
right: 0;
bottom: 0;
display: grid;
width: 2.9rem;
height: 2.9rem;
place-items: end;
border: 0;
background: linear-gradient(135deg, transparent 50%, color-mix(in srgb, var(--nodedc-panel-item-bg) 86%, transparent) 50%);
cursor: ns-resize;
}
.catalog-map-fixture__resize > span {
width: 1.05rem;
height: 1.05rem;
margin: 0.48rem;
border-right: 1px solid color-mix(in srgb, var(--nodedc-text-primary) 68%, transparent);
border-bottom: 1px solid color-mix(in srgb, var(--nodedc-text-primary) 68%, transparent);
background: repeating-linear-gradient(135deg, transparent 0 0.2rem, color-mix(in srgb, var(--nodedc-text-primary) 58%, transparent) 0.2rem 0.26rem, transparent 0.26rem 0.4rem);
opacity: 0.8;
}
.catalog-map-fixture__resize:hover > span { opacity: 1; }
.catalog-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));