@import "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";
@import "https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@24,400,0,0";

/* web/css/design-tokens.css */
:root {
  --md-sys-color-primary: #8b4513;
  --md-sys-color-on-primary: #ffffff;
  --md-sys-color-primary-container: #d2b48c;
  --md-sys-color-on-primary-container: #3e2723;
  --md-sys-color-secondary: #5d4037;
  --md-sys-color-on-secondary: #ffffff;
  --md-sys-color-secondary-container: #d7ccc8;
  --md-sys-color-on-secondary-container: #3e2723;
  --md-sys-color-tertiary: #c68e03;
  --md-sys-color-on-tertiary: #ffffff;
  --md-sys-color-tertiary-container: #fff8e1;
  --md-sys-color-on-tertiary-container: #4e342e;
  --md-sys-color-error: #b71c1c;
  --md-sys-color-on-error: #ffffff;
  --md-sys-color-error-container: #ffcdd2;
  --md-sys-color-on-error-container: #410001;
  --md-sys-color-background: #f5f1e6;
  --md-sys-color-on-background: #3e2723;
  --md-sys-color-surface: #f5f1e6;
  --md-sys-color-on-surface: #3e2723;
  --md-sys-color-surface-variant: #e8e0d1;
  --md-sys-color-on-surface-variant: #5d4037;
  --md-sys-color-outline: #8d6e63;
  --md-sys-color-outline-variant: #d7ccc8;
  --md-sys-color-shadow: rgba(62, 39, 35, 0.1);
  --md-sys-color-scrim: rgba(62, 39, 35, 0.3);
  --md-sys-color-inverse-surface: #efebe9;
  --md-sys-color-inverse-on-surface: #3e2723;
  --md-sys-color-inverse-primary: #d7ccc8;
  --md-sys-color-primary-fixed: #d2b48c;
  --md-sys-color-on-primary-fixed: #3e2723;
  --md-sys-color-primary-fixed-dim: #8b4513;
  --md-sys-color-on-primary-fixed-variant: #5d3a2a;
  --md-sys-color-secondary-fixed: #d7ccc8;
  --md-sys-color-on-secondary-fixed: #3e2723;
  --md-sys-color-secondary-fixed-dim: #5d4037;
  --md-sys-color-on-secondary-fixed-variant: #4e342e;
  --md-sys-color-tertiary-fixed: #fff8e1;
  --md-sys-color-on-tertiary-fixed: #4e342e;
  --md-sys-color-tertiary-fixed-dim: #c68e03;
  --md-sys-color-on-tertiary-fixed-variant: #a07002;
  --md-sys-color-surface-dim: #e8e0d1;
  --md-sys-color-surface-bright: #f5f1e6;
  --md-sys-color-surface-container-lowest: #fdf6e3;
  --md-sys-color-surface-container-low: #f0e6d6;
  --md-sys-color-surface-container: #e8e0d1;
  --md-sys-color-surface-container-high: #e0d5c4;
  --md-sys-color-surface-container-highest: #d7ccc8;
  --md-sys-typescale-display-large: 57px/1.1 Inter, sans-serif;
  --md-sys-typescale-display-medium: 48px/1.1 Inter, sans-serif;
  --md-sys-typescale-display-small: 40px/1.1 Inter, sans-serif;
  --md-sys-typescale-headline-large: 33px/1.2 Inter, sans-serif;
  --md-sys-typescale-headline-medium: 28px/1.2 Inter, sans-serif;
  --md-sys-typescale-headline-small: 23px/1.2 Inter, sans-serif;
  --md-sys-typescale-title-large: 19px/1.2 500 Inter, sans-serif;
  --md-sys-typescale-title-medium: 16px/1.2 500 Inter, sans-serif;
  --md-sys-typescale-title-small: 13px/1.2 500 Inter, sans-serif;
  --md-sys-typescale-body-large: 16px/1.5 Inter, sans-serif;
  --md-sys-typescale-body-medium: 13px/1.5 Inter, sans-serif;
  --md-sys-typescale-body-small: 11px/1.5 Inter, sans-serif;
  --md-sys-typescale-label-large: 13px/1.4 500 Inter, sans-serif;
  --md-sys-typescale-label-medium: 11px/1.4 500 Inter, sans-serif;
  --md-sys-typescale-label-small: 9px/1.4 500 Inter, sans-serif;
  --md-sys-shape-corner-none: 0px;
  --md-sys-shape-corner-extra-small: 4px;
  --md-sys-shape-corner-small: 8px;
  --md-sys-shape-corner-medium: 4px;
  --md-sys-shape-corner-large: 12px;
  --md-sys-shape-corner-extra-large: 16px;
  --md-sys-shape-corner-extra-extra-large: 24px;
  --md-sys-shape-corner-full: 9999px;
  --md-sys-spacing-none: 0px;
  --md-sys-spacing-xxs: 2px;
  --md-sys-spacing-xs: 4px;
  --md-sys-spacing-sm: 8px;
  --md-sys-spacing-md: 12px;
  --md-sys-spacing-lg: 16px;
  --md-sys-spacing-xl: 24px;
  --md-sys-spacing-xxl: 32px;
  --md-sys-spacing-xxxl: 40px;
  --md-sys-spacing-xxxxl: 48px;
  --md-sys-spacing-xxxxxl: 56px;
  --md-sys-spacing-xxxxxxl: 64px;
  --md-sys-motion-easing-standard: cubic-bezier(0.2, 0, 0, 1);
  --md-sys-motion-easing-emphasized: cubic-bezier(0.3, 0, 0.8, 0.15);
  --md-sys-motion-easing-decelerate: cubic-bezier(0, 0, 0, 1);
  --md-sys-motion-duration-short-1: 50ms;
  --md-sys-motion-duration-short-2: 100ms;
  --md-sys-motion-duration-short-3: 150ms;
  --md-sys-motion-duration-short-4: 200ms;
  --md-sys-motion-duration-short-5: 250ms;
  --md-sys-motion-duration-medium-1: 300ms;
  --md-sys-motion-duration-medium-2: 350ms;
  --md-sys-motion-duration-medium-3: 400ms;
  --md-sys-motion-duration-long-1: 450ms;
  --md-sys-motion-duration-long-2: 500ms;
  --md-sys-motion-duration-long-3: 550ms;
  --md-sys-motion-duration-long-4: 600ms;
  --md-sys-motion-duration-long-5: 700ms;
  --md-sys-elevation-1: 0 1px 2px color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 1px 3px color-mix(in srgb, var(--md-sys-color-shadow) 10%, transparent);
  --md-sys-elevation-2: 0 1px 2px color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 2px 6px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
  --md-sys-elevation-3: 0 1px 3px color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 4px 8px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
  --md-sys-elevation-4: 0 2px 3px color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 6px 10px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
  --md-sys-elevation-5: 0 4px 4px color-mix(in srgb, var(--md-sys-color-shadow) 30%, transparent), 0 8px 12px color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent);
  --brand-primary: #8b4513;
  --brand-secondary: #5d4037;
  --brand-accent: #c68e03;
  --brand-tertiary: #a07002;
  --md-sys-color-surface-dark: #1a1612;
  --md-sys-color-on-surface-dark: #f0e6d6;
  --md-sys-color-surface-variant-dark: #2d2620;
  --md-sys-color-on-surface-variant-dark: #c5bca8;
  --md-sys-color-primary-dark: #c68e03;
  --md-sys-color-on-primary-dark: #3e2723;
  --md-sys-color-primary-container-dark: #4e342e;
  --md-sys-color-on-primary-container-dark: #fff8e1;
  --md-sys-color-secondary-dark: #a07002;
  --md-sys-color-on-secondary-dark: #3e2723;
  --md-sys-color-secondary-container-dark: #4e342e;
  --md-sys-color-on-secondary-container-dark: #fff8e1;
  --md-sys-color-tertiary-dark: #d7ccc8;
  --md-sys-color-on-tertiary-dark: #3e2723;
  --md-sys-color-tertiary-container-dark: #4e342e;
  --md-sys-color-on-tertiary-container-dark: #fff8e1;
  --md-sys-color-shadow-dark: rgba(0, 0, 0, 0.3);
  --md-sys-color-outline-dark: #5d4037;
  --md-sys-color-outline-variant-dark: #2d2620;
  --md-sys-color-surface-container-low-dark: #231e19;
  --md-sys-color-surface-container-dark: #1d1915;
  --md-sys-color-surface-container-high-dark: #171410;
  --md-sys-color-background-dark: #1a1612;
  --md-sys-color-on-background-dark: #f0e6d6;
  --md-sys-color-surface-bright-dark: #2d2620;
  --md-sys-color-surface-dim-dark: #1a1612;
  --md-sys-focus-ring-width: 2px;
  --md-sys-component-button-primary-bg: var(--md-sys-color-primary);
  --md-sys-component-button-primary-text: var(--md-sys-color-on-primary);
  --md-sys-component-button-primary-height: 40px;
  --md-sys-component-button-secondary-bg: var(--md-sys-color-secondary-container);
  --md-sys-component-button-secondary-text: var(--md-sys-color-on-secondary-container);
  --md-sys-component-button-text-color: var(--md-sys-color-primary);
  --md-sys-component-button-shape: var(--md-sys-shape-corner-full);
  --md-sys-component-input-bg: var(--md-sys-color-surface-container-highest);
  --md-sys-component-input-text: var(--md-sys-color-on-surface);
  --md-sys-component-input-height: 56px;
  --md-sys-component-input-outline-color: var(--md-sys-color-outline);
  --md-sys-component-input-shape: var(--md-sys-shape-corner-medium);
  --md-sys-component-card-bg: var(--md-sys-color-surface-container-low);
  --md-sys-component-card-text: var(--md-sys-color-on-surface);
  --md-sys-component-card-shape: var(--md-sys-shape-corner-large);
  --md-sys-component-chip-bg: var(--md-sys-color-surface-container-low);
  --md-sys-component-chip-text: var(--md-sys-color-on-surface-variant);
  --md-sys-component-chip-height: 32px;
  --md-sys-component-chip-shape: var(--md-sys-shape-corner-full);
  --md-sys-component-tooltip-bg: var(--md-sys-color-inverse-surface);
  --md-sys-component-tooltip-text: var(--md-sys-color-inverse-on-surface);
  --md-sys-component-tooltip-shape: var(--md-sys-shape-corner-extra-small);
  --md-sys-component-table-shape: var(--md-sys-shape-corner-large);
  --md-sys-component-table-header-shape: var(--md-sys-shape-corner-large);
}
.dark-mode {
  --md-sys-color-surface: var(--md-sys-color-surface-dark);
  --md-sys-color-on-surface: var(--md-sys-color-on-surface-dark);
  --md-sys-color-surface-variant: var(--md-sys-color-surface-variant-dark);
  --md-sys-color-on-surface-variant: var(--md-sys-color-on-surface-variant-dark);
  --md-sys-color-primary: var(--md-sys-color-primary-dark);
  --md-sys-color-on-primary: var(--md-sys-color-on-primary-dark);
  --md-sys-color-primary-container: var(--md-sys-color-primary-container-dark);
  --md-sys-color-on-primary-container: var(--md-sys-color-on-primary-container-dark);
  --md-sys-color-secondary: var(--md-sys-color-secondary-dark);
  --md-sys-color-on-secondary: var(--md-sys-color-on-secondary-dark);
  --md-sys-color-secondary-container: var(--md-sys-color-secondary-container-dark);
  --md-sys-color-on-secondary-container: var(--md-sys-color-on-secondary-container-dark);
  --md-sys-color-tertiary: var(--md-sys-color-tertiary-dark);
  --md-sys-color-on-tertiary: var(--md-sys-color-on-tertiary-dark);
  --md-sys-color-tertiary-container: var(--md-sys-color-tertiary-container-dark);
  --md-sys-color-on-tertiary-container: var(--md-sys-color-on-tertiary-container-dark);
  --md-sys-color-shadow: var(--md-sys-color-shadow-dark);
  --md-sys-color-outline: var(--md-sys-color-outline-dark);
  --md-sys-color-outline-variant: var(--md-sys-color-outline-variant-dark);
  --md-sys-color-surface-container-low: var(--md-sys-color-surface-container-low-dark);
  --md-sys-color-surface-container: var(--md-sys-color-surface-container-dark);
  --md-sys-color-surface-container-high: var(--md-sys-color-surface-container-high-dark);
  --md-sys-color-background: var(--md-sys-color-background-dark);
  --md-sys-color-on-background: var(--md-sys-color-on-background-dark);
  --md-sys-color-surface-bright: var(--md-sys-color-surface-bright-dark);
  --md-sys-color-surface-dim: var(--md-sys-color-surface-dim-dark);
  --md-sys-color-surface-container-lowest: #28221c;
  --md-sys-color-surface-container-highest: #3d352c;
  --md-sys-elevation-1: 0 1px 2px color-mix(in srgb, var(--md-sys-color-shadow) 40%, transparent), 0 1px 3px color-mix(in srgb, var(--md-sys-color-shadow) 15%, transparent);
  --md-sys-elevation-2: 0 1px 2px color-mix(in srgb, var(--md-sys-color-shadow) 40%, transparent), 0 2px 6px color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent);
  --md-sys-elevation-3: 0 1px 3px color-mix(in srgb, var(--md-sys-color-shadow) 40%, transparent), 0 4px 8px color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent);
  --md-sys-elevation-4: 0 2px 3px color-mix(in srgb, var(--md-sys-color-shadow) 40%, transparent), 0 6px 10px color-mix(in srgb, var(--md-sys-color-shadow) 20%, transparent);
  --md-sys-elevation-5: 0 4px 4px color-mix(in srgb, var(--md-sys-color-shadow) 40%, transparent), 0 8px 12px color-mix(in srgb, var(--md-sys-color-shadow) 25%, transparent);
  --md-sys-color-primary-fixed: #4e342e;
  --md-sys-color-on-primary-fixed: #fff8e1;
  --md-sys-color-secondary-fixed: #4e342e;
  --md-sys-color-on-secondary-fixed: #fff8e1;
  --md-sys-color-tertiary-fixed: #fff8e1;
  --md-sys-color-on-tertiary-fixed: #4e342e;
  --md-sys-color-primary-fixed-dim: #c68e03;
  --md-sys-color-on-primary-fixed-variant: #8d6e63;
  --md-sys-color-secondary-fixed-dim: #a07002;
  --md-sys-color-on-secondary-fixed-variant: #8d6e63;
  --md-sys-color-tertiary-fixed-dim: #d7ccc8;
  --md-sys-color-on-tertiary-fixed-variant: #8d6e63;
  --brand-primary: #c68e03;
  --brand-secondary: #a07002;
  --brand-accent: #d7ccc8;
  --brand-tertiary: #8d6e63;
}

/* node_modules/leaflet/dist/leaflet.css */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
  position: absolute;
  left: 0;
  top: 0;
}
.leaflet-container {
  overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  -webkit-user-drag: none;
}
.leaflet-tile::selection {
  background: transparent;
}
.leaflet-safari .leaflet-tile {
  image-rendering: -webkit-optimize-contrast;
}
.leaflet-safari .leaflet-tile-container {
  width: 1600px;
  height: 1600px;
  -webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
  display: block;
}
.leaflet-container .leaflet-overlay-pane svg {
  max-width: none !important;
  max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
  max-width: none !important;
  max-height: none !important;
  width: auto;
  padding: 0;
}
.leaflet-container.leaflet-touch-zoom {
  -ms-touch-action: pan-x pan-y;
  touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
  -ms-touch-action: pinch-zoom;
  touch-action: none;
  touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
  -ms-touch-action: none;
  touch-action: none;
}
.leaflet-container {
  -webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
  -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
  filter: inherit;
  visibility: hidden;
}
.leaflet-tile-loaded {
  visibility: inherit;
}
.leaflet-zoom-box {
  width: 0;
  height: 0;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  z-index: 800;
}
.leaflet-overlay-pane svg {
  -moz-user-select: none;
}
.leaflet-pane {
  z-index: 400;
}
.leaflet-tile-pane {
  z-index: 200;
}
.leaflet-overlay-pane {
  z-index: 400;
}
.leaflet-shadow-pane {
  z-index: 500;
}
.leaflet-marker-pane {
  z-index: 600;
}
.leaflet-tooltip-pane {
  z-index: 650;
}
.leaflet-popup-pane {
  z-index: 700;
}
.leaflet-map-pane canvas {
  z-index: 100;
}
.leaflet-map-pane svg {
  z-index: 200;
}
.leaflet-vml-shape {
  width: 1px;
  height: 1px;
}
.lvml {
  behavior: url(#default#VML);
  display: inline-block;
  position: absolute;
}
.leaflet-control {
  position: relative;
  z-index: 800;
  pointer-events: visiblePainted;
  pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
  position: absolute;
  z-index: 1000;
  pointer-events: none;
}
.leaflet-top {
  top: 0;
}
.leaflet-right {
  right: 0;
}
.leaflet-bottom {
  bottom: 0;
}
.leaflet-left {
  left: 0;
}
.leaflet-control {
  float: left;
  clear: both;
}
.leaflet-right .leaflet-control {
  float: right;
}
.leaflet-top .leaflet-control {
  margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
  margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
  margin-left: 10px;
}
.leaflet-right .leaflet-control {
  margin-right: 10px;
}
.leaflet-fade-anim .leaflet-popup {
  opacity: 0;
  -webkit-transition: opacity 0.2s linear;
  -moz-transition: opacity 0.2s linear;
  transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
  opacity: 1;
}
.leaflet-zoom-animated {
  -webkit-transform-origin: 0 0;
  -ms-transform-origin: 0 0;
  transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
  will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
  -webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1);
  -moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1);
  transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
  -webkit-transition: none;
  -moz-transition: none;
  transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
  visibility: hidden;
}
.leaflet-interactive {
  cursor: pointer;
}
.leaflet-grab {
  cursor: -webkit-grab;
  cursor: -moz-grab;
  cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
  cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
  cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
  cursor: move;
  cursor: -webkit-grabbing;
  cursor: -moz-grabbing;
  cursor: grabbing;
}
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
  pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
  pointer-events: visiblePainted;
  pointer-events: auto;
}
.leaflet-container {
  background: #ddd;
  outline-offset: 1px;
}
.leaflet-container a {
  color: #0078A8;
}
.leaflet-zoom-box {
  border: 2px dotted #38f;
  background: rgba(255, 255, 255, 0.5);
}
.leaflet-container {
  font-family:
    "Helvetica Neue",
    Arial,
    Helvetica,
    sans-serif;
  font-size: 12px;
  font-size: 0.75rem;
  line-height: 1.5;
}
.leaflet-bar {
  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.65);
  border-radius: 4px;
}
.leaflet-bar a {
  background-color: #fff;
  border-bottom: 1px solid #ccc;
  width: 26px;
  height: 26px;
  line-height: 26px;
  display: block;
  text-align: center;
  text-decoration: none;
  color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
  background-position: 50% 50%;
  background-repeat: no-repeat;
  display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
  background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
  border-bottom-left-radius: 4px;
  border-bottom-right-radius: 4px;
  border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
  cursor: default;
  background-color: #f4f4f4;
  color: #bbb;
}
.leaflet-touch .leaflet-bar a {
  width: 30px;
  height: 30px;
  line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
  border-top-left-radius: 2px;
  border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
  border-bottom-left-radius: 2px;
  border-bottom-right-radius: 2px;
}
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
  font:
    bold 18px "Lucida Console",
    Monaco,
    monospace;
  text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in,
.leaflet-touch .leaflet-control-zoom-out {
  font-size: 22px;
}
.leaflet-control-layers {
  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.4);
  background: #fff;
  border-radius: 5px;
}
.leaflet-control-layers-toggle {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);
  width: 36px;
  height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);
  background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
  width: 44px;
  height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
  display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
  display: block;
  position: relative;
}
.leaflet-control-layers-expanded {
  padding: 6px 10px 6px 6px;
  color: #333;
  background: #fff;
}
.leaflet-control-layers-scrollbar {
  overflow-y: scroll;
  overflow-x: hidden;
  padding-right: 5px;
}
.leaflet-control-layers-selector {
  margin-top: 2px;
  position: relative;
  top: 1px;
}
.leaflet-control-layers label {
  display: block;
  font-size: 13px;
  font-size: 1.08333em;
}
.leaflet-control-layers-separator {
  height: 0;
  border-top: 1px solid #ddd;
  margin: 5px -10px 5px -6px;
}
.leaflet-default-icon-path {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=);
}
.leaflet-container .leaflet-control-attribution {
  background: #fff;
  background: rgba(255, 255, 255, 0.8);
  margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
  padding: 0 5px;
  color: #333;
  line-height: 1.4;
}
.leaflet-control-attribution a {
  text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
  text-decoration: underline;
}
.leaflet-attribution-flag {
  display: inline !important;
  vertical-align: baseline !important;
  width: 1em;
  height: 0.6669em;
}
.leaflet-left .leaflet-control-scale {
  margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
  margin-bottom: 5px;
}
.leaflet-control-scale-line {
  border: 2px solid #777;
  border-top: none;
  line-height: 1.1;
  padding: 2px 5px 1px;
  white-space: nowrap;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  background: rgba(255, 255, 255, 0.8);
  text-shadow: 1px 1px #fff;
}
.leaflet-control-scale-line:not(:first-child) {
  border-top: 2px solid #777;
  border-bottom: none;
  margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
  border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
  box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
  border: 2px solid rgba(0, 0, 0, 0.2);
  background-clip: padding-box;
}
.leaflet-popup {
  position: absolute;
  text-align: center;
  margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
  padding: 1px;
  text-align: left;
  border-radius: 12px;
}
.leaflet-popup-content {
  margin: 13px 24px 13px 20px;
  line-height: 1.3;
  font-size: 13px;
  font-size: 1.08333em;
  min-height: 1px;
}
.leaflet-popup-content p {
  margin: 17px 0;
  margin: 1.3em 0;
}
.leaflet-popup-tip-container {
  width: 40px;
  height: 20px;
  position: absolute;
  left: 50%;
  margin-top: -1px;
  margin-left: -20px;
  overflow: hidden;
  pointer-events: none;
}
.leaflet-popup-tip {
  width: 17px;
  height: 17px;
  padding: 1px;
  margin: -10px auto 0;
  pointer-events: auto;
  -webkit-transform: rotate(45deg);
  -moz-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
  background: white;
  color: #333;
  box-shadow: 0 3px 14px rgba(0, 0, 0, 0.4);
}
.leaflet-container a.leaflet-popup-close-button {
  position: absolute;
  top: 0;
  right: 0;
  border: none;
  text-align: center;
  width: 24px;
  height: 24px;
  font:
    16px/24px Tahoma,
    Verdana,
    sans-serif;
  color: #757575;
  text-decoration: none;
  background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
  color: #585858;
}
.leaflet-popup-scrolled {
  overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
  -ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
  width: 24px;
  margin: 0 auto;
  -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
  filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
  border: 1px solid #999;
}
.leaflet-div-icon {
  background: #fff;
  border: 1px solid #666;
}
.leaflet-tooltip {
  position: absolute;
  padding: 6px;
  background-color: #fff;
  border: 1px solid #fff;
  border-radius: 3px;
  color: #222;
  white-space: nowrap;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  pointer-events: none;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}
.leaflet-tooltip.leaflet-interactive {
  cursor: pointer;
  pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
  position: absolute;
  pointer-events: none;
  border: 6px solid transparent;
  background: transparent;
  content: "";
}
.leaflet-tooltip-bottom {
  margin-top: 6px;
}
.leaflet-tooltip-top {
  margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
  left: 50%;
  margin-left: -6px;
}
.leaflet-tooltip-top:before {
  bottom: 0;
  margin-bottom: -12px;
  border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
  top: 0;
  margin-top: -12px;
  margin-left: -6px;
  border-bottom-color: #fff;
}
.leaflet-tooltip-left {
  margin-left: -6px;
}
.leaflet-tooltip-right {
  margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
  top: 50%;
  margin-top: -6px;
}
.leaflet-tooltip-left:before {
  right: 0;
  margin-right: -12px;
  border-left-color: #fff;
}
.leaflet-tooltip-right:before {
  left: 0;
  margin-left: -12px;
  border-right-color: #fff;
}
@media print {
  .leaflet-control {
    -webkit-print-color-adjust: exact;
    print-color-adjust: exact;
  }
}

/* web/app/styles/variables.css */
:root {
  --circle-size: clamp(1rem, 4vw, 2rem);
  --spacing: clamp(0.25rem, 2vw, 0.5rem);
}
:root {
  --md-sys-spacing-none: 0px;
  --md-sys-spacing-xxs: 2px;
  --md-sys-spacing-xs: 4px;
  --md-sys-spacing-sm: 8px;
  --md-sys-spacing-md: 12px;
  --md-sys-spacing-lg: 16px;
  --md-sys-spacing-xl: 24px;
  --md-sys-spacing-xxl: 32px;
  --md-sys-spacing-xxxl: 40px;
  --md-sys-spacing-xxxxl: 48px;
  --md-sys-spacing-xxxxxl: 56px;
  --md-sys-spacing-xxxxxxl: 64px;
}
:root {
  --md-sys-shape-corner-none: 0px;
  --md-sys-shape-corner-extra-small: 4px;
  --md-sys-shape-corner-small: 8px;
  --md-sys-shape-corner-medium: 4px;
  --md-sys-shape-corner-large: 12px;
  --md-sys-shape-corner-extra-large: 16px;
  --md-sys-shape-corner-extra-extra-large: 24px;
  --md-sys-shape-corner-full: 9999px;
  --md-sys-shape-corner-medium-legacy: 12px;
  --md-sys-shape-corner-large-legacy: 16px;
  --md-sys-shape-corner-extra-large-legacy: 24px;
}
:root {
  --md-sys-component-button-primary-height: 40px;
  --md-sys-component-input-height: 56px;
  --md-sys-component-chip-height: 32px;
  --md-sys-component-state-layer: 40px;
}
:root {
  --md-sys-focus-ring-width: 3px;
}

/* web/app/styles/base.css */
html {
  height: 100%;
}
body {
  background-color: var(--md-sys-color-background);
  color: var(--md-sys-color-on-background);
  font-family: "Inter", sans-serif;
  font-size: 1rem;
  font-weight: 400;
  line-height: 1.5;
  margin: 0;
  min-height: 100vh;
  padding: 0;
}
.text-overline {
  font: var(--md-sys-typescale-label-small);
  letter-spacing: 0.5px;
  text-transform: uppercase;
}
a {
  color: var(--md-sys-color-primary);
  text-decoration: none;
  transition: opacity 0.2s ease;
}
a:hover {
  color: var(--md-sys-color-on-primary-container);
  opacity: 0.9;
}
.page-link {
  color: var(--md-sys-color-on-background) !important;
}
.page-link:hover {
  color: var(--md-sys-color-on-background) !important;
  opacity: 0.9;
}
.page-link:focus {
  background-color: var(--md-sys-color-primary-container);
  box-shadow: 0 0 0 0.2rem rgba(224, 227, 232, 0.5);
  color: var(--md-sys-color-on-background) !important;
  outline: 2px solid var(--md-sys-color-on-background);
}
.grid {
  display: grid;
  gap: var(--md-sys-spacing-md);
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
}

/* web/app/styles/navbar-core.css */
.navbar {
  position: sticky;
  top: 0;
  z-index: 1000;
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.navbar-scrolled {
  box-shadow: var(--md-sys-elevation-2);
}
.navbar-brand {
  color: var(--md-sys-color-on-surface);
  font-weight: 700;
  text-decoration: none;
  font-size: var(--md-sys-typescale-headline-small);
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
}
.navbar-brand .material-symbols-rounded {
  font-size: 28px;
  color: var(--brand-accent);
}
.nav-link {
  color: var(--md-sys-color-on-surface-variant);
  text-decoration: none;
  font-weight: 500;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
}
.nav-link.active {
  color: var(--md-sys-color-primary);
  font-weight: 600;
}

/* web/app/styles/navbar-darkmode.css */
.dark-mode-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  background-color: var(--md-sys-color-surface-container-low);
}
.dark-mode-toggle:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.dark-mode-toggle.active {
  background-color: var(--brand-primary);
}
.dark-mode-toggle .material-symbols-rounded {
  font-size: 18px;
  color: var(--md-sys-color-on-surface-variant);
  margin-right: var(--md-sys-spacing-xs);
}
.dark-mode-toggle.active .material-symbols-rounded {
  color: var(--brand-accent);
}
.dark-mode-switch-track {
  position: relative;
  width: 40px;
  height: 20px;
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.dark-mode-toggle.active .dark-mode-switch-track {
  background-color: var(--brand-primary);
}
.dark-mode-toggle:not(.active) .dark-mode-switch-track {
  background-color: var(--md-sys-color-on-surface-variant);
}
.dark-mode-switch-knob {
  position: absolute;
  top: 2px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background-color: var(--md-sys-color-surface);
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
  box-shadow: var(--md-sys-elevation-1);
}
.dark-mode-toggle.active .dark-mode-switch-knob {
  left: 22px;
  box-shadow: none;
}
.dark-mode-toggle:not(.active) .dark-mode-switch-knob {
  left: 2px;
}
.admin-link .group-icon,
.admin-link .key-icon {
  font-size: 18px;
  margin-right: var(--md-sys-spacing-xs);
  color: var(--brand-accent);
}
.flash-message {
  margin-bottom: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  border: none;
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  box-shadow: var(--md-sys-elevation-2);
}
.flash-message .material-symbols-rounded {
  font-size: 24px;
  color: var(--md-sys-color-primary);
}

/* web/app/styles/navbar-mobile.css */
.user-menu {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
}
.user-info {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  background-color: var(--md-sys-color-surface-container-low);
}
.user-info .material-symbols-rounded {
  font-size: 18px;
  color: var(--md-sys-color-primary);
}
.user-info .user-name {
  color: var(--md-sys-color-on-surface);
  font-weight: 500;
  font-size: var(--md-sys-typescale-label-large);
}
.logout-btn {
  color: var(--md-sys-color-error);
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all 0.2s ease;
}
.mobile-menu-toggle {
  display: none;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  transition: all 0.2s ease;
}
.mobile-menu-toggle .material-symbols-rounded {
  font-size: 24px;
  color: var(--md-sys-color-on-surface-variant);
}
.mobile-menu {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-surface-container);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.mobile-nav-link {
  color: var(--md-sys-color-on-surface-variant);
  text-decoration: none;
  font-weight: 500;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-medium);
  transition: all 0.2s ease;
}
.mobile-nav-link.active {
  color: var(--brand-primary);
  font-weight: 600;
}
@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* web/app/styles/app.css */
.app-body {
  display: flex;
}
.app-main {
  flex: 1;
  margin-left: 0;
  padding: var(--md-sys-spacing-xl);
}
.app-layout {
  min-height: 100vh;
}
.app-content {
  margin-left: 0;
  padding: var(--md-sys-spacing-xl);
}
@media (max-width: 768px) {
  .nav-items {
    display: none;
  }
  .navbar-actions {
    display: none;
  }
  .mobile-menu-toggle {
    display: block;
  }
  .app-main {
    padding: var(--md-sys-spacing-md);
  }
}

/* web/app/styles/stepper.css */
.stepper {
  display: flex;
}
.stepper-item {
  align-items: center;
  display: flex;
  gap: var(--spacing);
}
.stepper-item.active:before {
  background-color: var(--md-sys-color-primary);
}
.stepper-item:before {
  border: 2px solid var(--md-sys-color-outline);
  border-radius: 50%;
  background-color: var(--md-sys-color-surface-container-high);
  content: "";
  display: block;
  height: var(--circle-size);
  width: var(--circle-size);
}
.stepper-item:not(:last-child) {
  flex: 1;
}
.stepper-item:not(:last-child):after {
  background-color: var(--md-sys-color-outline-variant);
  content: "";
  height: 2px;
  margin-right: 0.5rem;
  position: relative;
  z-index: -1;
  width: 100%;
}
.stepper-title {
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-title-medium);
}
.upload-step {
  margin: 0 auto;
  max-width: 800px;
  padding: var(--md-sys-spacing-lg);
}
.upload-step .form-label {
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-title-medium);
  margin-bottom: var(--md-sys-spacing-sm);
}
.dropzone {
  align-items: center;
  background-color: var(--md-sys-color-surface-container);
  border: 2px dashed var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  display: flex;
  flex-direction: column;
  justify-content: center;
  margin: var(--md-sys-spacing-lg) 0;
  min-height: 300px;
  padding: var(--md-sys-spacing-xl);
  text-align: center;
  transition: all 0.3s ease;
}
.dropzone:hover {
  background-color: var(--md-sys-color-surface-container-high);
  border-color: var(--md-sys-color-primary);
  transform: translateY(-2px);
}
.dropzone.active {
  background-color: rgba(151, 204, 249, 0.1);
  border-color: var(--md-sys-color-primary);
  border-style: solid;
  box-shadow: 0 0 20px rgba(151, 204, 249, 0.2);
}
.dropzone label {
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  font-size: 1.25rem;
  transition: color 0.3s ease;
}
.dropzone label:hover {
  color: var(--md-sys-color-primary);
}
.dropzone input[type=file] {
  display: none;
}
.file-list {
  list-style: none;
  margin: var(--md-sys-spacing-md) 0;
  padding: 0;
}
.file-list li {
  align-items: center;
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-small);
  color: var(--md-sys-color-on-surface);
  display: flex;
  font-size: 0.95rem;
  gap: var(--md-sys-spacing-sm);
  margin-bottom: var(--md-sys-spacing-sm);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
}

/* web/app/styles/status.css */
.loading {
  align-items: center;
  color: var(--md-sys-color-on-surface-variant);
  display: flex;
  font-size: var(--md-sys-typescale-title-large);
  height: 100vh;
  justify-content: center;
}
.loading::before {
  animation: spin 1s linear infinite;
  border: 4px solid var(--md-sys-color-outline-variant);
  border-radius: 50%;
  border-top-color: var(--md-sys-color-primary);
  content: "";
  display: block;
  height: 48px;
  margin-bottom: var(--md-sys-spacing-md);
  width: 48px;
}
@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}
.progress {
  border-radius: 4px;
  height: 8px;
  background: var(--md-sys-color-surface-container-highest);
  overflow: hidden;
}
.progress-bar {
  border-radius: 4px;
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-primary) 0%,
      var(--md-sys-color-secondary) 100%);
  height: 100%;
  transition: width 0.3s ease;
}
.empty-state {
  background: var(--md-sys-color-surface);
  border: 2px dashed var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-large);
  padding: 60px 20px;
  text-align: center;
}
.empty-state-icon {
  color: var(--md-sys-color-on-surface-variant);
  font-size: 48px;
  margin-bottom: 16px;
}
.empty-state h3 {
  color: var(--md-sys-color-on-surface);
  font-size: 20px;
  font-weight: 600;
  margin: 0 0 8px 0;
}
.empty-state p {
  color: var(--md-sys-color-on-surface-variant);
  font-size: 14px;
  margin: 0 0 24px 0;
}
.map-overlay {
  background-color: var(--md-sys-color-surface-container);
  border-radius: var(--md-sys-shape-corner-medium);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  left: 0;
  padding: var(--md-sys-spacing-md);
  position: absolute;
  top: 150px;
  z-index: 99999;
}

/* web/app/styles/breadcrumbs.css */
.breadcrumb {
  align-items: center;
  display: flex;
  font: var(--md-sys-typescale-label-large);
  gap: var(--md-sys-spacing-sm);
  margin-bottom: var(--md-sys-spacing-lg);
  color: var(--md-sys-color-on-surface-variant);
}
.breadcrumb-item {
  align-items: center;
  display: flex;
  gap: var(--md-sys-spacing-xs);
}
.breadcrumb-item a {
  color: var(--md-sys-color-primary);
  text-decoration: none;
}
.breadcrumb-item a:hover {
  text-decoration: underline;
}
.breadcrumb-item.active {
  color: var(--md-sys-color-on-surface-variant);
}
.breadcrumb-separator {
  color: var(--md-sys-color-outline-variant);
}

/* web/app/styles/auth.css */
.login-body {
  align-items: center;
  animation: gradientShift 15s ease infinite;
  background:
    linear-gradient(
      135deg,
      var(--md-sys-color-surface-container-low) 0%,
      var(--md-sys-color-primary-container) 50%,
      var(--brand-accent));
  display: flex;
  justify-content: center;
  min-height: 100vh;
  padding: 1rem;
}
@keyframes gradientShift {
  0% {
    background-position: 0% 0%;
  }
  50% {
    background-position: 100% 100%;
  }
  100% {
    background-position: 0% 0%;
  }
}
.login-container {
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  box-shadow: 0 10px 40px var(--md-sys-color-shadow);
  max-width: 450px;
  padding: 2.5rem;
  transition: transform 0.3s ease;
  width: 100%;
}
.login-container:hover {
  transform: translateY(-5px);
}
.login-container h1 {
  color: var(--md-sys-color-on-surface);
  margin-bottom: 1.5rem;
}
.login-container .form-control {
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-small);
  padding: 0.75rem 1rem;
}
.login-container .form-control:focus {
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent);
}
.login-container .btn-primary {
  background-color: var(--md-sys-color-primary);
  border-color: var(--md-sys-color-primary);
  padding: 0.75rem 1rem;
  font-weight: 500;
}
.login-container .btn-primary:hover {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  border-color: var(--md-sys-color-on-primary-fixed-variant);
}

/* web/app/styles/misc.css */
.dark-mode {
  background-color: var(--md-sys-color-background);
}
.dark-mode .navbar {
  border-bottom-color: var(--md-sys-color-outline-variant);
}
.dark-mode .nav-link {
  color: var(--md-sys-color-on-surface-variant) !important;
}
.dark-mode .nav-link.active {
  color: var(--md-sys-color-primary) !important;
}
.dark-mode .app-body {
  background-color: var(--md-sys-color-background);
}
.dark-mode .app-main {
  background-color: var(--md-sys-color-background);
}
.dark-mode .card {
  background-color: var(--md-sys-color-surface-container-low);
}
.dark-mode .table {
  background-color: var(--md-sys-color-surface-container-low);
}
.dark-mode .form-control,
.dark-mode input[type=text],
.dark-mode input[type=email],
.dark-mode input[type=password],
.dark-mode input[type=number],
.dark-mode textarea,
.dark-mode select {
  background-color: var(--md-sys-color-surface-container-high);
  border-color: var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface);
}
.page-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-lg);
}
.page-header h1 {
  margin: 0;
  font: var(--md-sys-typescale-headline-medium);
  color: var(--md-sys-color-on-surface);
}
.filter-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  margin-left: 6px;
  font: var(--md-sys-typescale-label-small);
  font-weight: 500;
  color: var(--md-sys-color-on-primary);
  background: var(--md-sys-color-primary);
  border-radius: var(--md-sys-shape-corner-full);
}
.upload-step .form-select:focus {
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent);
  outline: none;
}
.form-signin {
  margin: 0 auto;
  padding: 15px;
  width: 100%;
  max-width: 330px;
}
.page-content {
  width: 100%;
  max-width: 1400px;
  margin: 0 auto;
  padding: 0;
}
@media (max-width: 767.98px) {
  .page-content {
    margin-bottom: 64px;
    margin-left: 0;
    padding: var(--md-sys-spacing-md);
  }
}
a,
button,
input,
select,
textarea {
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
}
.card-hover {
  transition: transform var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard), box-shadow var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.card-hover:hover {
  transform: translateY(-4px);
  box-shadow: var(--md-sys-elevation-4);
}
@keyframes pulse {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.5;
  }
}
.animate-pulse {
  animation: pulse 2s var(--md-sys-motion-easing-decelerate) infinite;
}
.hover-scale {
  transition: transform var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
}
.hover-scale:hover {
  transform: scale(1.02);
}
@keyframes fade-in {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.fade-in {
  animation: fade-in var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized);
}
@keyframes slide-in-left {
  from {
    opacity: 0;
    transform: translateX(-20px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
.slide-in-left {
  animation: slide-in-left var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized);
}
@keyframes slide-in-right {
  from {
    opacity: 0;
    transform: translateX(20px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
.slide-in-right {
  animation: slide-in-right var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized);
}

/* web/app/styles/buttons.css */
.btn {
  font: var(--md-sys-typescale-label-large);
  height: var(--md-sys-component-button-primary-height);
  padding: 0 var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-full);
  border: none;
  cursor: pointer;
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--md-sys-spacing-xs);
  text-transform: none;
  letter-spacing: normal;
  box-shadow: var(--md-sys-elevation-1);
}
.btn-primary {
  background-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.btn-primary:hover {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  box-shadow: var(--md-sys-elevation-2);
  transform: translateY(-1px);
}
.btn-primary:active {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.btn-secondary {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.btn-secondary:hover {
  background-color: var(--md-sys-color-secondary-container);
  opacity: 0.92;
  box-shadow: var(--md-sys-elevation-2);
  transform: translateY(-1px);
}
.btn-secondary:active {
  opacity: 0.95;
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.btn-text {
  --btn-text-state: var(--md-sys-color-primary);
  background-color: transparent;
  color: var(--md-sys-color-primary);
  padding: 0 var(--md-sys-spacing-sm);
  box-shadow: none;
}
.btn-text:hover {
  background-color: color-mix(in srgb, var(--btn-text-state) 8%, transparent);
  box-shadow: none;
}
.btn-text:active {
  background-color: color-mix(in srgb, var(--btn-text-state) 12%, transparent);
}
.btn-text.text-error {
  --btn-text-state: var(--md-sys-color-error);
}
.btn-outline-danger {
  background: transparent;
  border: 1px solid var(--md-sys-color-error);
  color: var(--md-sys-color-error);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  font: var(--md-sys-typescale-label-large);
  transition: all 0.2s ease;
}
.btn-outline-danger:hover {
  background-color: var(--md-sys-color-error);
  color: var(--md-sys-color-on-error);
}
.btn-danger {
  background-color: var(--md-sys-color-error);
  color: var(--md-sys-color-on-error);
}
.btn-danger:hover {
  background-color: var(--md-sys-color-on-error-fixed-variant);
  box-shadow: var(--md-sys-elevation-2);
  transform: translateY(-1px);
}
.btn-danger:active {
  background-color: var(--md-sys-color-on-error-fixed-variant);
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.next-button {
  width: 100%;
  margin-top: var(--md-sys-spacing-md);
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  font: var(--md-sys-typescale-label-large);
  background-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
  box-shadow: var(--md-sys-elevation-2);
}
.next-button:hover {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(-1px);
  box-shadow: var(--md-sys-elevation-3);
}
.next-button:active {
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.btn-sm {
  height: 32px;
  padding: 0 var(--md-sys-spacing-md);
  font: var(--md-sys-typescale-label-medium);
  border-radius: var(--md-sys-shape-corner-small);
}
.btn-link {
  background: transparent;
  border: none;
  color: var(--md-sys-color-primary);
  font: var(--md-sys-typescale-label-large);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  cursor: pointer;
  text-decoration: none;
  transition: all 0.2s ease;
}
.btn-link:hover {
  color: var(--md-sys-color-on-primary-container);
  text-decoration: underline;
}
.btn-link:disabled {
  opacity: 0.38;
  cursor: not-allowed;
  text-decoration: none;
}
.btn-bovw {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 20px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-size: 14px;
  font-weight: 500;
  text-decoration: none;
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  border: none;
  cursor: pointer;
}
.btn-bovw-primary {
  background: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.btn-bovw-primary:hover {
  background: var(--md-sys-color-on-primary-fixed-variant);
  color: var(--md-sys-color-on-primary);
}
.btn-bovw-secondary {
  background: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
}
.btn-bovw-secondary:hover {
  background: var(--md-sys-color-surface-container-high);
}

/* web/app/styles/cards.css */
.card {
  background-color: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
  border: none;
  border-radius: var(--md-sys-shape-corner-large);
  padding: var(--md-sys-spacing-md);
  box-shadow: var(--md-sys-elevation-1);
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.card:hover {
  box-shadow: var(--md-sys-elevation-3);
  transform: translateY(-2px);
}
.card-header {
  font: var(--md-sys-typescale-title-large);
  color: var(--md-sys-color-on-surface);
  margin-bottom: var(--md-sys-spacing-md);
  padding-bottom: var(--md-sys-spacing-sm);
  border-bottom: 2px solid var(--md-sys-color-outline-variant);
}
.card-body {
  padding: var(--md-sys-spacing-md);
}
.stat-card {
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  padding: var(--md-sys-spacing-xl);
  box-shadow: var(--md-sys-elevation-1);
  transition: transform var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard), box-shadow var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
}
.stat-card:hover {
  transform: translateY(-2px);
  box-shadow: var(--md-sys-elevation-3);
}
.stat-card-header {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 16px;
}
.card-icon {
  width: 40px;
  height: 40px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
}
.card-icon.blue {
  background: var(--md-sys-color-primary-container);
}
.card-icon.green {
  background: var(--md-sys-color-tertiary-container);
}
.card-icon.purple {
  background: var(--md-sys-color-secondary-container);
}
.card-icon.orange {
  background: var(--md-sys-color-error-container);
}
.stat-card h3 {
  margin: 0;
  font-size: 14px;
  font-weight: 500;
  color: var(--md-sys-color-on-surface-variant);
}
.stat-value {
  font-size: 32px;
  font-weight: 700;
  color: var(--md-sys-color-on-surface);
  margin-bottom: 4px;
}
.stat-description {
  font-size: 13px;
  color: var(--md-sys-color-on-surface-variant);
}
.card-footer {
  padding: var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  margin-top: var(--md-sys-spacing-md);
}
.list-group {
  display: flex;
  flex-direction: column;
  gap: 0;
  padding: 0;
  margin: 0;
  list-style: none;
}
.list-group-item {
  display: flex;
  align-items: center;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  color: var(--md-sys-color-on-surface);
  background-color: transparent;
  transition: background-color 0.15s ease;
}
.list-group-item:last-child {
  border-bottom: none;
}
.list-group-item-action {
  cursor: pointer;
}
.list-group-item-action:hover,
.list-group-item-action:focus {
  background-color: var(--md-sys-color-surface-container-low);
}
.list-group-item.active {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.btn-group {
  display: inline-flex;
  gap: 0;
}
.btn-group .btn {
  border-radius: 0;
}
.btn-group .btn:first-child {
  border-top-left-radius: var(--md-sys-shape-corner-small);
  border-bottom-left-radius: var(--md-sys-shape-corner-small);
}
.btn-group .btn:last-child {
  border-top-right-radius: var(--md-sys-shape-corner-small);
  border-bottom-right-radius: var(--md-sys-shape-corner-small);
}
.similarity-card {
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-md);
  margin-bottom: var(--md-sys-spacing-sm);
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
}
.similarity-card:hover {
  border-color: var(--md-sys-color-primary);
  transform: translateY(-2px);
  box-shadow: var(--md-sys-elevation-3);
}

/* web/app/styles/forms.css */
.form-control,
input[type=text],
input[type=email],
input[type=password],
input[type=number],
input[type=search],
textarea,
select {
  background-color: var(--md-sys-color-surface-container-highest);
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-body-large);
  height: var(--md-sys-component-input-height);
  padding: var(--md-sys-spacing-md);
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-medium);
  transition: all 0.2s ease;
}
.form-group {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
  margin-top: 5px;
}
.form-control:focus,
input:focus,
textarea:focus,
select:focus {
  outline: none;
  border-color: var(--md-sys-color-primary);
  border-width: 2px;
  padding: calc(var(--md-sys-spacing-md) - 1px);
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent);
}
.form-control:disabled,
input:disabled,
textarea:disabled,
select:disabled {
  background-color: var(--md-sys-color-on-surface);
  color: var(--md-sys-color-on-surface);
  opacity: 0.38;
  border-color: var(--md-sys-color-on-surface);
}
.form-control.outlined,
input.outlined,
textarea.outlined,
select.outlined {
  background-color: transparent;
  border-width: 1px;
  border-radius: var(--md-sys-shape-corner-medium);
}
.form-control.outlined:focus,
input.outlined:focus,
textarea.outlined:focus,
select.outlined:focus {
  border-width: 2px;
  padding: calc(var(--md-sys-spacing-md) - 1px);
}
.form-helper {
  font: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
  margin-top: var(--md-sys-spacing-xxs);
  min-height: 16px;
}
.form-control.is-invalid,
input.is-invalid,
textarea.is-invalid,
select.is-invalid {
  border-color: var(--md-sys-color-error) !important;
  border-width: 2px;
  padding: calc(var(--md-sys-spacing-md) - 1px);
}
.form-control.is-invalid:focus,
input.is-invalid:focus,
textarea.is-invalid:focus,
select.is-invalid:focus {
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-error) 20%, transparent);
}
.form-helper.error {
  color: var(--md-sys-color-error);
}
.form-select {
  background-color: var(--md-sys-color-surface-container-highest);
  border: 1px solid var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface);
  border-radius: var(--md-sys-shape-corner-small);
  cursor: pointer;
}
.form-select:focus {
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent);
  outline: none;
}
.checkbox-list {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
}
.form-check {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  margin-bottom: var(--md-sys-spacing-sm);
  min-height: var(--md3-checkbox-target);
}
.form-check-input {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  accent-color: var(--md-sys-color-primary);
  cursor: pointer;
}
.form-check-label {
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-surface);
  cursor: pointer;
  margin: 0;
}
.form-select-sm {
  height: 32px;
  padding: 0 var(--md-sys-spacing-sm);
  font: var(--md-sys-typescale-label-medium);
  border-radius: var(--md-sys-shape-corner-small);
}

/* web/app/styles/alerts.css */
.alert {
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-md);
  border: none;
}
.alert-danger {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.alert-success {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.alert-warning {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.alert-primary {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.info-box {
  display: flex;
  gap: var(--md-sys-spacing-md);
  padding: var(--md-sys-spacing-md);
  background: var(--md-sys-color-primary-container);
  border-left: 4px solid var(--md-sys-color-primary);
  border-radius: var(--md-sys-shape-corner-medium);
  margin-top: var(--md-sys-spacing-xl);
  margin-bottom: var(--md-sys-spacing-sm);
}
.info-box-icon {
  font-size: 24px;
  color: var(--md-sys-color-primary);
}
.info-box-content h4 {
  margin: 0 0 8px 0;
  font-size: 16px;
  font-weight: 600;
  color: var(--md-sys-color-on-primary-container);
}
.info-box-content p {
  margin: 0;
  font-size: 14px;
  color: var(--md-sys-color-on-surface-variant);
}

/* web/app/styles/_detail-page.css */
.detail-page {
  max-width: 960px;
  margin: 0 auto;
  padding: var(--md-sys-spacing-md) 0;
}
.detail-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-lg);
  padding-bottom: var(--md-sys-spacing-md);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.detail-header h1 {
  font: var(--md-sys-typescale-headline-small);
  color: var(--md-sys-color-on-surface);
  margin: 0;
}
.detail-section {
  margin-bottom: var(--md-sys-spacing-xl);
}
.detail-section h3 {
  font: var(--md-sys-typescale-title-large);
  color: var(--md-sys-color-on-surface);
  margin: 0 0 var(--md-sys-spacing-md) 0;
  padding-bottom: var(--md-sys-spacing-xs);
  border-bottom: 2px solid var(--md-sys-color-outline-variant);
}
.detail-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.detail-row:last-child {
  border-bottom: none;
}
.detail-label {
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-surface-variant);
  font-weight: 500;
}
.detail-value {
  font: var(--md-sys-typescale-body-large);
  color: var(--md-sys-color-on-surface);
}
.page-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--md-sys-spacing-md);
}
.page-card {
  display: flex;
  flex-direction: column;
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  overflow: hidden;
  text-decoration: none;
  color: var(--md-sys-color-on-surface);
  transition: all 0.2s ease;
}
.page-card:hover {
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-2px);
}
.page-card-image {
  width: 100%;
  height: 120px;
  object-fit: cover;
  background-color: var(--md-sys-color-surface-container);
}
.page-card-placeholder {
  width: 100%;
  height: 120px;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: var(--md-sys-color-surface-container);
}
.page-card-placeholder .material-symbols-rounded {
  font-size: 32px;
  color: var(--md-sys-color-on-surface-variant);
}
.page-card-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  font: var(--md-sys-typescale-label-medium);
  color: var(--md-sys-color-on-surface-variant);
}
.page-card-number {
  font-weight: 600;
  color: var(--md-sys-color-on-surface);
}

/* web/app/styles/badges.css */
.badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 4px 12px;
  border-radius: var(--md-sys-shape-corner-full);
  font: var(--md-sys-typescale-label-large);
  font-weight: 500;
}
.badge-primary {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.badge-secondary {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.badge-success {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.badge-warning {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.badge-danger {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.badge-bovw {
  display: inline-block;
  padding: 4px 12px;
  border-radius: 12px;
  font-size: 12px;
  font-weight: 600;
}
.badge-bovw-success {
  background: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.badge-bovw-warning {
  background: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.badge-bovw-danger {
  background: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.badge-bovw-info {
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.similarity-badge {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-full);
  font: var(--md-sys-typescale-label-large);
}

/* web/app/styles/tables.css */
.table {
  color: var(--md-sys-color-on-surface);
}
.table th {
  font: var(--md-sys-typescale-title-small);
  color: var(--md-sys-color-on-surface-variant);
  border-bottom: 2px solid var(--md-sys-color-outline-variant);
  font-weight: 600;
  padding: var(--md-sys-spacing-md);
}
.table td {
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  opacity: 0.9;
  padding: var(--md-sys-spacing-md);
}
.table tbody tr:hover {
  background-color: var(--md-sys-color-surface-container-low);
}
.similarity-table {
  width: 100%;
  border-collapse: collapse;
}
.similarity-table th {
  text-align: left;
  padding: 12px 16px;
  font-size: 14px;
  font-weight: 600;
  color: var(--md-sys-color-on-surface-variant);
  border-bottom: 2px solid var(--md-sys-color-outline-variant);
}
.similarity-table td {
  padding: 16px;
  border-bottom: 1px solid var(--md-sys-color-surface-container-highest);
  color: var(--md-sys-color-on-surface);
}
.similarity-table tr:hover {
  background: var(--md-sys-color-surface-container-low);
}
.similarity-bar {
  height: 8px;
  border-radius: 4px;
  background: var(--md-sys-color-surface-container-highest);
  overflow: hidden;
  min-width: 100px;
}
.similarity-fill {
  height: 100%;
  border-radius: 4px;
  background: var(--md-sys-color-primary);
  transition: width var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized);
}

/* web/app/styles/utilities.css */
.d-flex {
  display: flex !important;
}
.d-inline-flex {
  display: inline-flex !important;
}
.flex-wrap {
  flex-wrap: wrap !important;
}
.justify-content-between {
  justify-content: space-between !important;
}
.justify-content-center {
  justify-content: center !important;
}
.align-items-center {
  align-items: center !important;
}
.align-items-start {
  align-items: flex-start !important;
}
.align-items-end {
  align-items: flex-end !important;
}
.gap-2 {
  gap: var(--md-sys-spacing-sm) !important;
}
.gap-4 {
  gap: var(--md-sys-spacing-lg) !important;
}
.text-center {
  text-align: center !important;
}
.text-left {
  text-align: left !important;
}
.text-right {
  text-align: right !important;
}
.h3 {
  font-size: var(--md-sys-typescale-headline-medium) !important;
  font-weight: 400 !important;
  line-height: 1.2 !important;
}
.font-weight-normal {
  font-weight: 400 !important;
}
.mb-4 {
  margin-bottom: var(--md-sys-spacing-xl) !important;
}
.mb-0 {
  margin-bottom: 0 !important;
}
.mt-4 {
  margin-top: var(--md-sys-spacing-xl) !important;
}
.mt-auto {
  margin-top: auto !important;
}
.mb-auto {
  margin-bottom: auto !important;
}
.ms-auto {
  margin-left: auto !important;
}
.me-auto {
  margin-right: auto !important;
}
.row {
  display: flex;
  flex-wrap: wrap !important;
  margin-left: calc(-1 * var(--md-sys-spacing-sm));
  margin-right: calc(-1 * var(--md-sys-spacing-sm));
}
.col-md-12 {
  flex: 0 0 100% !important;
  max-width: 100% !important;
}
.text-primary {
  color: var(--md-sys-color-primary) !important;
}
.text-secondary {
  color: var(--md-sys-color-secondary) !important;
}
.text-tertiary {
  color: var(--md-sys-color-tertiary) !important;
}
.text-error {
  color: var(--md-sys-color-error) !important;
}
.text-muted {
  color: var(--md-sys-color-on-surface-variant) !important;
}
.bg-primary {
  background-color: var(--md-sys-color-primary) !important;
}
.bg-secondary {
  background-color: var(--md-sys-color-secondary) !important;
}
.bg-tertiary {
  background-color: var(--md-sys-color-tertiary) !important;
}
.bg-error {
  background-color: var(--md-sys-color-error) !important;
}
.bg-surface {
  background-color: var(--md-sys-color-surface) !important;
}
.bg-surface-container {
  background-color: var(--md-sys-color-surface-container) !important;
}
.bg-surface-container-low {
  background-color: var(--md-sys-color-surface-container-low) !important;
}
.rounded-xs {
  border-radius: var(--md-sys-shape-corner-extra-small) !important;
}
.rounded-sm {
  border-radius: var(--md-sys-shape-corner-small) !important;
}
.rounded-md {
  border-radius: var(--md-sys-shape-corner-medium) !important;
}
.rounded-lg {
  border-radius: var(--md-sys-shape-corner-large) !important;
}
.rounded-xl {
  border-radius: var(--md-sys-shape-corner-extra-large) !important;
}
.rounded-full {
  border-radius: var(--md-sys-shape-corner-full) !important;
}
.p-xs {
  padding: var(--md-sys-spacing-xs) !important;
}
.p-sm {
  padding: var(--md-sys-spacing-sm) !important;
}
.p-md {
  padding: var(--md-sys-spacing-md) !important;
}
.p-lg {
  padding: var(--md-sys-spacing-lg) !important;
}
.p-xl {
  padding: var(--md-sys-spacing-xl) !important;
}
.m-xs {
  margin: var(--md-sys-spacing-xs) !important;
}
.m-sm {
  margin: var(--md-sys-spacing-sm) !important;
}
.m-md {
  margin: var(--md-sys-spacing-md) !important;
}
.m-lg {
  margin: var(--md-sys-spacing-lg) !important;
}
.m-xl {
  margin: var(--md-sys-spacing-xl) !important;
}
.mt-1 {
  margin-top: 4px !important;
}
.mt-2 {
  margin-top: 8px !important;
}
.mt-3 {
  margin-top: 16px !important;
}
.mb-1 {
  margin-bottom: 4px !important;
}
.mb-2 {
  margin-bottom: 8px !important;
}
.mb-3 {
  margin-bottom: 16px !important;
}
.ms-1 {
  margin-left: 4px !important;
}
.ms-2 {
  margin-left: 8px !important;
}
.ms-3 {
  margin-left: 16px !important;
}
.me-1 {
  margin-right: 4px !important;
}
.me-2 {
  margin-right: 8px !important;
}
.me-3 {
  margin-right: 16px !important;
}
.fw-bold {
  font-weight: 700 !important;
}
.rounded-pill {
  border-radius: 9999px !important;
}
.bg-primary-container {
  background-color: var(--md-sys-color-primary-container);
}
.text-on-primary-container {
  color: var(--md-sys-color-on-primary-container);
}
.bg-secondary-container {
  background-color: var(--md-sys-color-secondary-container);
}
.text-on-secondary-container {
  color: var(--md-sys-color-on-secondary-container);
}
.bg-tertiary-container {
  background-color: var(--md-sys-color-tertiary-container);
}
.text-on-tertiary-container {
  color: var(--md-sys-color-on-tertiary-container);
}
.bg-error-container {
  background-color: var(--md-sys-color-error-container);
}
.text-on-error-container {
  color: var(--md-sys-color-on-error-container);
}
.bg-surface-container-highest {
  background-color: var(--md-sys-color-surface-container-highest);
}
.text-on-surface {
  color: var(--md-sys-color-on-surface);
}

/* web/app/styles/structure.css */
.sidebar {
  bottom: 0;
  box-shadow: inset -1px 0 0 var(--md-sys-color-outline-variant);
  left: 0;
  padding: var(--md-sys-spacing-xxxxl) 0 0;
  position: fixed;
  top: 0;
  z-index: 100;
}
@media (max-width: 767.98px) {
  .sidebar {
    top: 5rem;
  }
}
.sidebar-sticky {
  height: calc(100vh - 48px);
  overflow-x: hidden;
  overflow-y: auto;
}
.sidebar .nav-link {
  color: var(--md-sys-color-on-surface-variant);
  font-weight: 500;
}
.sidebar .nav-link .feather {
  margin-right: 4px;
}
.sidebar .nav-link:hover .feather,
.sidebar .nav-link.active .feather {
  color: inherit;
}
.sidebar-heading {
  font-size: .75rem;
}
.navbar-brand {
  border-bottom: 1px solid var(--md-sys-color-surface-container);
  border-top: 1px solid var(--md-sys-color-surface-container);
  box-shadow: inset -1px 0 0 var(--md-sys-color-outline-variant);
  padding-bottom: var(--md-sys-spacing-md);
  padding-top: var(--md-sys-spacing-md);
}
.navbar .navbar-toggler {
  right: 1rem;
  top: .25rem;
}
.navbar-collapse {
  display: none;
}
.navbar-collapse.show {
  display: block;
}
.navbar .form-control {
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
}
.bd-placeholder-img {
  font-size: 1.125rem;
  -moz-user-select: none;
  -webkit-user-select: none;
  user-select: none;
  text-anchor: middle;
}
@media (min-width: 768px) {
  .bd-placeholder-img-lg {
    font-size: 3.5rem;
  }
}
.b-example-divider {
  border: solid var(--md-sys-color-outline-variant);
  border-width: 1px 0;
  height: 3rem;
}
.b-example-vr {
  flex-shrink: 0;
  height: 100vh;
  width: 1.5rem;
}
.bi {
  fill: currentColor;
  vertical-align: -.125em;
}
.nav-scroller {
  height: 2.75rem;
  overflow-y: hidden;
  position: relative;
  z-index: 2;
}
.nav-scroller .nav {
  display: flex;
  flex-wrap: nowrap;
  margin-top: -1px;
  overflow-x: auto;
  padding-bottom: 1rem;
  text-align: center;
  white-space: nowrap;
  -webkit-overflow-scrolling: touch;
}
.feather {
  height: 16px;
  width: 16px;
}

/* web/app/styles/grave-wizard.css */
.wizard-container {
  margin: 0 auto;
}
.wizard-steps {
  display: flex;
  align-items: flex-start;
  gap: 0;
  margin-bottom: var(--md-sys-spacing-lg);
  padding: var(--md-sys-spacing-md) 0;
}
.wizard-step {
  display: flex;
  flex-direction: column;
  align-items: center;
  flex: 1;
  position: relative;
  cursor: pointer;
}
.wizard-connector {
  flex: 1;
  height: 2px;
  background-color: var(--md-sys-color-outline-variant);
  align-self: center;
  margin: 0 var(--md-sys-spacing-xs);
  transition: background-color 0.3s ease;
}
.wizard-connector.completed {
  background-color: var(--md-sys-color-primary);
}
.step-number {
  width: var(--wizard-circle-size);
  height: var(--wizard-circle-size);
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  font: var(--md-sys-typescale-label-large);
  font-weight: 600;
  color: var(--md-sys-color-on-surface-variant);
  background-color: var(--md-sys-color-surface-container-high);
  border: 2px solid var(--md-sys-color-outline);
  z-index: 1;
  transition: all 0.3s ease;
}
.wizard-step.active .step-number {
  background-color: var(--md-sys-color-primary);
  border-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
  box-shadow: 0 0 0 3px var(--md-sys-color-primary-container);
}
.wizard-step.completed .step-number {
  background-color: var(--md-sys-color-primary-container);
  border-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary-container);
}
.step-label {
  margin-top: var(--md-sys-spacing-xs);
  font: var(--md-sys-typescale-label-medium);
  color: var(--md-sys-color-on-surface-variant);
  text-align: center;
  transition: color 0.3s ease;
  white-space: nowrap;
}
.wizard-step.active .step-label {
  color: var(--md-sys-color-primary);
  font-weight: 600;
}
.wizard-step:hover .step-number {
  background-color: var(--md-sys-color-primary-container);
  border-color: var(--md-sys-color-primary);
}
.wizard-step:hover .step-label {
  color: var(--md-sys-color-primary);
}
.wizard-content {
  background-color: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-lg);
  margin-bottom: var(--md-sys-spacing-md);
  min-height: 300px;
}
.step-content h3 {
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-title-large);
  margin: 0 0 var(--md-sys-spacing-md);
  padding-bottom: var(--md-sys-spacing-sm);
  border-bottom: 2px solid var(--md-sys-color-outline-variant);
}
.wizard-nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
}
.form-actions {
  display: flex;
  gap: var(--md-sys-spacing-sm);
  margin-top: var(--md-sys-spacing-lg);
  padding-top: var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
}
@media (max-width: 768px) {
  .data-step-layout {
    flex-direction: column;
  }
  .data-step-layout > :first-child {
    flex: none;
    width: 100%;
  }
}
@media (max-width: 600px) {
  .wizard-steps {
    flex-direction: column;
    gap: var(--md-sys-spacing-sm);
  }
  .wizard-connector {
    display: none;
  }
  .wizard-step {
    flex-direction: row;
    gap: var(--md-sys-spacing-sm);
  }
  .step-label {
    margin-top: 0;
  }
}
.dark-mode .wizard-connector {
  background-color: var(--md-sys-color-outline-variant-dark);
}
.dark-mode .wizard-connector.completed {
  background-color: var(--md-sys-color-primary-dark);
}
.dark-mode .step-number {
  background-color: var(--md-sys-color-surface-container-high-dark);
  border-color: var(--md-sys-color-outline-dark);
  color: var(--md-sys-color-on-surface-variant-dark);
}
.dark-mode .wizard-step.active .step-number {
  background-color: var(--md-sys-color-primary-dark);
  border-color: var(--md-sys-color-primary-dark);
  color: var(--md-sys-color-on-primary-dark);
  box-shadow: 0 0 0 3px var(--md-sys-color-primary-container-dark);
}
.dark-mode .wizard-step.completed .step-number {
  background-color: var(--md-sys-color-primary-container-dark);
  border-color: var(--md-sys-color-primary-dark);
  color: var(--md-sys-color-on-primary-container-dark);
}
.dark-mode .wizard-content {
  background-color: var(--md-sys-color-surface-container-dark);
}
:root {
  --wizard-circle-size: 32px;
}
.data-step-layout {
  display: flex;
  gap: var(--md-sys-spacing-lg);
  align-items: flex-start;
}
.data-step-layout > :first-child {
  flex: 0 0 40%;
}
.data-step-layout > :last-child {
  flex: 1;
}
.figure-preview {
  width: 100%;
  overflow: auto;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  background-color: var(--md-sys-color-surface);
}
.figure-preview-svg {
  display: block;
  max-width: 100%;
  height: auto;
}
.figure-preview-label {
  font-size: 12px;
  fill: currentColor;
}

/* web/app/styles/box-resizer.css */
.box-resizer-layout {
  display: flex;
  flex-direction: row;
  gap: var(--md-sys-spacing-md);
}
.box-resizer-canvas-col {
  flex: 3;
  min-width: 0;
}
.box-resizer-sidebar-col {
  flex: 1;
  min-width: 0;
}
@media (max-width: 767px) {
  .box-resizer-canvas-col,
  .box-resizer-sidebar-col {
    flex: none;
    width: 100%;
  }
}
.box-resizer-toolbar {
  position: sticky;
  top: 0;
  display: flex;
  z-index: 999;
}
.box-resizer-btn {
  margin-right: var(--md-sys-spacing-xs);
}
.box-resizer-btn-spine {
  background-color: #F44336;
}
.box-resizer-btn-skeleton {
  background-color: #9575CD;
}
.box-resizer-btn-arrow {
  background-color: #009688;
}
.box-resizer-btn-grave-cross-section {
  background-color: #26C6DA;
}
.box-resizer-btn-artefact {
  background-color: #4CAF50;
}
.box-resizer-btn-scale {
  background-color: #FF9800;
}
.box-resizer-sidebar {
  position: sticky;
  top: 60px;
}
.box-resizer-figure-list {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
}
.box-resizer-figure-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-small);
  cursor: pointer;
  transition: background-color 0.15s ease;
}
.box-resizer-figure-item:hover {
  background-color: var(--md-sys-color-surface-container-highest);
}
.box-resizer-figure-item.active {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.box-resizer-figure-name {
  font-weight: 600;
}
.box-resizer-validation-list {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
  margin-top: var(--md-sys-spacing-md);
}
.box-resizer-validation-item {
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-small);
  font-size: 13px;
}
.box-resizer-form-check {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
}
.box-resizer-form-check-input {
  width: 18px;
  height: 18px;
  cursor: pointer;
}
.box-resizer-form-check-label {
  font-size: 14px;
  cursor: pointer;
}
.box-resizer-btn-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--md-sys-spacing-xs);
}
.box-resizer-card-link {
  display: block;
  width: 100%;
  text-align: center;
  padding: var(--md-sys-spacing-md);
  color: var(--md-sys-color-primary);
  text-decoration: none;
  border-radius: var(--md-sys-shape-corner-medium);
  transition: background-color 0.15s ease;
}
.box-resizer-card-link:hover {
  background-color: var(--md-sys-color-primary-container);
}

/* web/app/styles/pagination.css */
.pagination {
  display: flex;
  justify-content: flex-start;
  align-items: center;
  gap: var(--md-sys-spacing-lg);
  padding: var(--md-sys-spacing-md) 0;
}
.pagination__info {
  font: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface-variant);
}
.pagination__controls {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
}
.pagination__btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 36px;
  height: 36px;
  padding: 0 var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-full);
  border: 1px solid var(--md-sys-color-outline-variant);
  background: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface-variant);
  font: var(--md-sys-typescale-label-medium);
  cursor: pointer;
  transition: all 0.2s ease;
  gap: var(--md-sys-spacing-xs);
}
.pagination__btn:hover:not(:disabled) {
  background: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
  border-color: var(--md-sys-color-outline);
  transform: translateY(-1px);
  box-shadow: 0 2px 6px var(--md-sys-color-shadow);
}
.pagination__btn:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: none;
}
.pagination__btn:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}
.pagination__page {
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-surface);
  min-width: 90px;
  text-align: center;
  padding: 0 var(--md-sys-spacing-sm);
}
.pagination__separator {
  color: var(--md-sys-color-outline);
  margin: 0 var(--md-sys-spacing-xs);
}
.dark-mode .pagination__btn {
  background: var(--md-sys-color-surface-container);
  border-color: var(--md-sys-color-outline-variant-dark);
  color: var(--md-sys-color-on-surface-variant-dark);
}
.dark-mode .pagination__btn:hover:not(:disabled) {
  background: var(--md-sys-color-secondary-container-dark);
  color: var(--md-sys-color-on-secondary-container-dark);
}

/* web/app/styles/page-filters.css */
.page-filters {
  display: flex;
  flex-wrap: wrap;
  gap: var(--md-sys-spacing-lg);
  align-items: center;
  margin-bottom: var(--md-sys-spacing-md);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-lg);
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  border: 1px solid var(--md-sys-color-outline-variant);
}
.page-filters__item {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  min-width: 200px;
}
.page-filters__label-inline {
  font: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
  font-weight: 500;
  white-space: nowrap;
  flex-shrink: 0;
}
.page-filters__label-inline::after {
  content: ":";
  margin-right: 2px;
}
.page-filters__select {
  background-color: var(--md-sys-color-surface-container-highest);
  border: 1px solid var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-body-medium);
  height: 36px;
  padding: 0 var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-small);
  cursor: pointer;
  transition: all 0.2s ease;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%235d4037' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  padding-right: 32px;
  flex: 1;
  min-width: 140px;
}
.page-filters__select:hover {
  border-color: var(--md-sys-color-outline);
  background-color: var(--md-sys-color-surface-container);
}
.page-filters__select:focus {
  outline: none;
  border-color: var(--md-sys-color-primary);
  border-width: 2px;
  padding: 0 calc(var(--md-sys-spacing-md) - 1px);
  box-shadow: 0 0 0 3px rgba(139, 69, 19, 0.15);
}
.dark-mode .page-filters {
  background: var(--md-sys-color-surface-container);
  border-color: var(--md-sys-color-outline-variant-dark);
}
.dark-mode .page-filters__select {
  background-color: var(--md-sys-color-surface-container-highest);
  border-color: var(--md-sys-color-outline-dark);
  color: var(--md-sys-color-on-surface-dark);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23c5bca8' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
}
.dark-mode .page-filters__select:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.dark-mode .page-filters__select:focus {
  box-shadow: 0 0 0 3px rgba(198, 142, 3, 0.2);
}

/* web/app/styles/filter-dialog.css */
.filter-dialog {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 1000;
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: var(--md-sys-elevation-3);
  width: 420px;
  max-width: 90vw;
  max-height: 85vh;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  animation: filter-dialog-in 0.2s ease-out;
}
@keyframes filter-dialog-in {
  from {
    opacity: 0;
    transform: translate(-50%, -45%);
  }
  to {
    opacity: 1;
    transform: translate(-50%, -50%);
  }
}
.filter-dialog__overlay {
  position: fixed;
  inset: 0;
  z-index: 999;
  background: rgba(0, 0, 0, 0.4);
  animation: filter-dialog-overlay-in 0.2s ease-out;
}
@keyframes filter-dialog-overlay-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.filter-dialog__header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.filter-dialog__header h3 {
  margin: 0;
  font: var(--md-sys-typescale-title-medium);
  color: var(--md-sys-color-on-surface);
}
.filter-dialog__close {
  background: none;
  border: none;
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s ease;
}
.filter-dialog__close:hover {
  background: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface);
}
.filter-dialog__body {
  flex: 1;
  overflow-y: auto;
  padding: var(--md-sys-spacing-lg);
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-md);
}
.filter-dialog__field {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
}
.filter-dialog__label {
  font: var(--md-sys-typescale-label-large);
  font-weight: 500;
  color: var(--md-sys-color-on-surface-variant);
  text-transform: uppercase;
  letter-spacing: 0.02em;
}
.filter-dialog__select {
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-body-medium);
  height: 40px;
  padding: 0 var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-small);
  cursor: pointer;
  transition: all 0.2s ease;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%235d4037' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  padding-right: 32px;
}
.filter-dialog__select:focus {
  outline: none;
  border-color: var(--md-sys-color-primary);
  border-width: 2px;
  padding: 0 calc(var(--md-sys-spacing-md) - 1px);
  box-shadow: 0 0 0 3px rgba(139, 69, 19, 0.15);
}
.filter-dialog__select[multiple] {
  appearance: auto;
  background-image: none;
  height: auto;
  min-height: 120px;
  padding: 0;
  cursor: default;
}
.filter-dialog__help {
  margin: 0;
  font: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
}
.filter-dialog__footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  background: var(--md-sys-color-surface-container-low);
}
.filter-dialog__actions {
  display: flex;
  gap: var(--md-sys-spacing-sm);
}
.filter-dialog__badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  margin-left: 6px;
  font: var(--md-sys-typescale-label-small);
  font-weight: 500;
  color: var(--md-sys-color-on-primary);
  background: var(--md-sys-color-primary);
  border-radius: var(--md-sys-shape-corner-full);
}
.dark-mode .filter-dialog {
  background: var(--md-sys-color-surface-container);
}
.dark-mode .filter-dialog__header {
  border-color: var(--md-sys-color-outline-variant-dark);
}
.dark-mode .filter-dialog__header h3 {
  color: var(--md-sys-color-on-surface);
}
.dark-mode .filter-dialog__select {
  background-color: var(--md-sys-color-surface-container-high);
  border-color: var(--md-sys-color-outline-dark);
  color: var(--md-sys-color-on-surface);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23c5bca8' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
}
.dark-mode .filter-dialog__select:focus {
  box-shadow: 0 0 0 3px rgba(198, 142, 3, 0.2);
}
.dark-mode .filter-dialog__footer {
  border-color: var(--md-sys-color-outline-variant-dark);
  background: var(--md-sys-color-surface-container-high);
}
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--md-sys-spacing-xs);
  padding: 0 var(--md-sys-spacing-lg);
  height: 36px;
  font: var(--md-sys-typescale-label-large);
  font-weight: 500;
  border-radius: var(--md-sys-shape-corner-full);
  border: none;
  cursor: pointer;
  transition: all 0.15s ease;
  white-space: nowrap;
}
.btn-primary {
  background: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.btn-primary:hover {
  box-shadow: var(--md-sys-elevation-1);
  filter: brightness(1.05);
}
.btn-secondary {
  background: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.btn-secondary:hover {
  background: var(--md-sys-color-surface-container-highest);
}
.btn-ghost {
  background: transparent;
  color: var(--md-sys-color-primary);
}
.btn-ghost:hover {
  background: var(--md-sys-color-primary-container);
}
.dark-mode .btn-primary {
  background: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.dark-mode .btn-secondary {
  background: var(--md-sys-color-surface-container-highest);
  color: var(--md-sys-color-on-surface-variant);
}

/* web/autarch.css */

/* web/css/_md3-list.css */
.md3-list {
  background-color: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-extra-extra-large);
  overflow: hidden;
  box-shadow: var(--md-sys-elevation-1);
}
.md3-list-header {
  padding: var(--md-sys-spacing-lg) var(--md-sys-spacing-md) var(--md-sys-spacing-xs);
}
.md3-list-header h2 {
  font: var(--md-sys-typescale-title-large);
  color: var(--md-sys-color-on-surface);
  margin: 0;
}
.md3-list-content {
  padding: var(--md-sys-spacing-xs) 0;
}
.md3-list-item {
  display: flex;
  align-items: center;
  padding: 0 var(--md-sys-spacing-md);
  height: 56px;
  background-color: transparent;
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  cursor: default;
  position: relative;
  overflow: hidden;
}
.md3-list-item::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      circle at center,
      rgba(255, 255, 255, 0.2) 0%,
      transparent 70%);
  opacity: 0;
  transition: opacity var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.md3-list-item:hover::before {
  opacity: 0.1;
}
.md3-list-item:hover {
  background-color: var(--md-sys-color-surface-container-high);
  transform: translateX(2px);
}
.md3-list-item-clickable {
  cursor: pointer;
}
.md3-list-item-clickable:hover {
  background-color: var(--md-sys-color-secondary-container);
  transform: translateX(4px);
}
.md3-list-item:active {
  background-color: var(--md-sys-color-on-surface-variant);
  opacity: 0.12;
  transform: scale(0.98);
}
.md3-list-item-content {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 2px;
}
.md3-list-item-primary {
  font-family: var(--md-sys-typescale-body-large);
  font-size: 16px;
  font-weight: 500;
  line-height: 1.5;
  color: var(--md-sys-color-on-surface);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  display: flex;
  align-items: center;
  gap: 8px;
}
.md3-list-item-icon {
  font-size: 18px;
  color: var(--md-sys-color-primary);
  flex-shrink: 0;
}
.md3-list-item-secondary {
  font-family: var(--md-sys-typescale-body-medium);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--md-sys-color-on-surface-variant);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.md3-list-empty {
  padding: 32px 16px;
  text-align: center;
}
.md3-list-empty p {
  margin: 0;
  font-family: var(--md-sys-typescale-body-large);
  font-size: 16px;
  line-height: 1.5;
  color: var(--md-sys-color-on-surface-variant);
}
.md3-skeleton {
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: md3-shimmer 1.5s infinite;
  border-radius: var(--md-sys-shape-corner-small);
}
@keyframes md3-shimmer {
  0% {
    background-position: 200% 0;
  }
  100% {
    background-position: -200% 0;
  }
}

/* web/css/_md3-table.css */
.md3-table-wrapper {
  overflow-x: auto;
  border-radius: var(--md-sys-component-table-shape);
  border: 1px solid var(--md-sys-color-outline-variant);
  box-shadow: var(--md-sys-elevation-2);
  background-color: var(--md-sys-color-surface);
  animation: table-fade-in var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
}
@keyframes table-fade-in {
  from {
    opacity: 0;
    transform: translateY(-10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.md3-table {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--md-sys-typescale-body-large);
}
.md3-table thead {
  background-color: var(--md-sys-color-primary-container);
}
.md3-table-header {
  padding: 16px 24px 16px 16px;
  text-align: left;
  font-family: var(--md-sys-typescale-title-medium);
  font-size: 14px;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1.43;
  color: var(--md-sys-color-on-primary-container);
  border-bottom: 1px solid var(--md-sys-color-primary-fixed-dim);
  user-select: none;
  white-space: nowrap;
  background-color: var(--md-sys-color-primary-container);
}
.md3-table-header-sortable {
  cursor: pointer;
  transition: background-color 0.2s ease, color 0.2s ease;
}
.md3-table-header-sortable:hover {
  background-color: var(--md-sys-color-on-primary-container);
}
.md3-table-header-active {
  background-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.md3-table-header-active:hover {
  background-color: var(--md-sys-color-primary);
}
.md3-table-header-right {
  text-align: right;
}
.md3-table-header-center {
  text-align: center;
}
.md3-table-header-actions {
  width: 1%;
  text-align: right;
  white-space: nowrap;
}
.md3-sort-icon {
  display: inline-flex;
  align-items: center;
  vertical-align: middle;
  margin-left: 4px;
  color: var(--md-sys-color-primary);
}
.md3-sort-icon .material-symbols-rounded {
  font-size: 20px;
  font-variation-settings: "FILL" 0;
}
.md3-table-header-active .md3-sort-icon {
  color: var(--md-sys-color-on-primary);
}
.md3-table-header:not(.md3-table-header-active) .md3-sort-icon {
  color: var(--md-sys-color-on-primary-container);
  opacity: 0.6;
}
.md3-table-header:hover .md3-sort-icon {
  opacity: 1;
}
.md3-table-row {
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  transition: background-color 0.15s ease, transform 0.2s ease;
  animation: md3-row-fade-in 0.3s ease forwards;
  opacity: 0;
}
@keyframes md3-row-fade-in {
  from {
    opacity: 0;
    transform: translateY(-4px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.md3-table-row:last-child {
  border-bottom: none;
}
.md3-table tbody tr:nth-child(even) {
  background-color: var(--md-sys-color-surface-container-low);
}
.md3-table-row:hover,
.md3-table-row-clickable:hover {
  background-color: var(--md-sys-color-primary-container);
  transform: translateX(2px);
}
.md3-table-row-clickable:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: -2px;
}
.md3-table-cell {
  padding: 16px 24px 16px 16px;
  font-family: var(--md-sys-typescale-body-large);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.43;
  color: var(--md-sys-color-on-surface);
  vertical-align: middle;
}
.md3-table-cell-right {
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.md3-table-cell-center {
  text-align: center;
}
.md3-table-cell-actions {
  width: 1%;
  text-align: right;
  white-space: nowrap;
}
.md3-table-loading,
.md3-table-empty {
  text-align: center;
  padding: 32px 16px;
  color: var(--md-sys-color-on-surface-variant);
  font-family: var(--md-sys-typescale-body-large);
  font-size: 14px;
}

/* web/css/_md3-actions.css */
.md3-table-actions {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
  justify-content: flex-end;
}
.md3-action-link {
  font-family: var(--md-sys-typescale-label-large);
  font-size: 12px;
  font-weight: 500;
  line-height: 1.67;
  color: var(--md-sys-color-primary);
  text-decoration: none;
  padding: 4px 8px;
  border-radius: var(--md-sys-shape-corner-small);
  transition: background-color 0.2s ease;
  cursor: pointer;
  background: none;
  border: none;
}
.md3-action-link:hover {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.md3-action-link-danger {
  color: var(--md-sys-color-error);
}
.md3-action-link-danger:hover {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error);
}
.md3-action-divider {
  color: var(--md-sys-color-outline);
  user-select: none;
}
.md3-title-large {
  font-family: var(--md-sys-typescale-title-large);
  font-size: 19px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--md-sys-color-on-surface);
}
.md3-title-medium {
  font-family: var(--md-sys-typescale-title-medium);
  font-size: 16px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--md-sys-color-on-surface);
}
.md3-body-large {
  font-family: var(--md-sys-typescale-body-large);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--md-sys-color-on-surface);
}
.md3-body-medium {
  font-family: var(--md-sys-typescale-body-medium);
  font-size: 14px;
  font-weight: 400;
  line-height: 1.5;
  color: var(--md-sys-color-on-surface-variant);
}
.md3-on-surface {
  color: var(--md-sys-color-on-surface);
}
.md3-on-surface-variant {
  color: var(--md-sys-color-on-surface-variant);
}
.md3-primary {
  color: var(--md-sys-color-primary);
}
.md3-secondary {
  color: var(--md-sys-color-secondary);
}
.md3-tertiary {
  color: var(--md-sys-color-tertiary);
}
:root {
  --similarity-bg-start: var(--md-sys-color-surface);
  --similarity-header-start: var(--md-sys-color-primary);
  --similarity-header-end: var(--md-sys-color-on-primary-fixed-variant);
  --similarity-border: var(--md-sys-color-outline-variant);
  --similarity-surface-secondary: var(--md-sys-color-surface-container-low);
  --similarity-text-primary: var(--md-sys-color-on-surface);
  --similarity-text-secondary: var(--md-sys-color-on-surface-variant);
  --similarity-text-tertiary: var(--md-sys-color-outline);
  --similarity-heading: var(--md-sys-color-on-surface);
  --similarity-divider: var(--md-sys-color-outline-variant);
  --similarity-selection: var(--md-sys-color-primary);
  --similarity-selected-bg: var(--md-sys-color-primary-container);
}

/* web/css/_shared-button.css */
.shared-button {
  width: 100%;
  margin: var(--md-sys-spacing-md) 0 0 0;
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-primary);
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  background-color: var(--md-sys-color-primary);
  box-shadow: var(--md-sys-elevation-2);
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  overflow: hidden;
}
.shared-button::after {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      circle at center,
      rgba(255, 255, 255, 0.3) 0%,
      transparent 70%);
  opacity: 0;
  transition: opacity var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.shared-button:hover:not(:disabled)::after {
  opacity: 0.1;
}
.shared-button:hover:not(:disabled) {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(-1px);
  box-shadow: var(--md-sys-elevation-3);
}
.shared-button:active:not(:disabled) {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.shared-button:disabled {
  opacity: 0.38;
  cursor: not-allowed;
  transform: none;
}
.btn-gradient-primary {
  background-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
  box-shadow: var(--md-sys-elevation-2);
}
.btn-gradient-primary:hover:not(:disabled) {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(-1px);
  box-shadow: var(--md-sys-elevation-3);
}
.btn-gradient-primary:active:not(:disabled) {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  transform: translateY(0);
  box-shadow: var(--md-sys-elevation-1);
}
.btn-gradient-primary:disabled {
  background-color: var(--md-sys-color-on-surface);
  opacity: 0.38;
  cursor: not-allowed;
  box-shadow: none;
  transform: none;
}
.btn-gradient-secondary {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.btn-gradient-secondary:hover:not(:disabled) {
  background-color: var(--md-sys-color-secondary-container);
  opacity: 0.92;
  transform: translateY(-1px);
  box-shadow: var(--md-sys-elevation-2);
}
.btn-gradient-secondary:active:not(:disabled) {
  opacity: 0.95;
  transform: translateY(0);
}
.btn-gradient-secondary:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  box-shadow: none;
  transform: none;
}

/* web/css/_brand-colors.css */
.brand-accent {
  color: var(--brand-accent) !important;
}
.bg-brand-accent {
  background-color: var(--brand-accent) !important;
}
.brand-primary {
  color: var(--brand-primary) !important;
}
.bg-brand-primary {
  background-color: var(--brand-primary) !important;
}
.card-hover:hover {
  transform: translateY(-4px);
  box-shadow: 0 8px 24px rgba(62, 39, 35, 0.12);
}
.table-row:hover {
  background-color: var(--md-sys-color-surface-container-low);
}
.link-primary {
  color: var(--brand-primary) !important;
  text-decoration: none;
}
.link-primary:hover {
  text-decoration: underline;
  color: var(--brand-secondary) !important;
}
.link-accent {
  color: var(--brand-accent) !important;
  text-decoration: none;
}
.link-accent:hover {
  text-decoration: underline;
  color: #a07002 !important;
}
.divider {
  border-top: 1px solid var(--md-sys-color-outline-variant);
  margin: var(--md-sys-spacing-md) 0;
}
.badge-primary {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  font-size: var(--md-sys-typescale-label-small);
  font-weight: 500;
}
.badge-accent {
  background-color: var(--brand-accent);
  color: #ffffff;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  font-size: var(--md-sys-typescale-label-small);
  font-weight: 500;
}
.react-surface {
  background-color: var(--md-sys-color-surface);
}
.react-surface-container {
  background-color: var(--md-sys-color-surface-container);
}
.react-surface-container-low {
  background-color: var(--md-sys-color-surface-container-low);
}
.react-surface-container-high {
  background-color: var(--md-sys-color-surface-container-high);
}
.react-surface-container-highest {
  background-color: var(--md-sys-color-surface-container-highest);
}
.react-text-primary {
  color: var(--md-sys-color-on-surface);
}
.react-text-secondary {
  color: var(--md-sys-color-on-surface-variant);
}
.react-text-on-primary {
  color: var(--md-sys-color-on-primary);
}
.react-text-on-primary-container {
  color: var(--md-sys-color-on-primary-container);
}
.react-text-on-tertiary-container {
  color: var(--md-sys-color-on-tertiary-container);
}
.react-text-on-error-container {
  color: var(--md-sys-color-on-error-container);
}
.react-elevation-1 {
  box-shadow: 0 1px 3px var(--md-sys-color-shadow);
}
.react-elevation-2 {
  box-shadow: 0 4px 6px var(--md-sys-color-shadow);
}
.react-elevation-3 {
  box-shadow: 0 8px 16px var(--md-sys-color-shadow);
}

/* web/css/_login.css */
.login-page {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1rem;
  background: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
}
.login-container {
  width: 100%;
  max-width: 450px;
  padding: 2.5rem;
  border-radius: var(--md-sys-shape-corner-large);
  background: var(--md-sys-color-surface-container-low);
  box-shadow: var(--md-sys-elevation-1);
}
.login-title {
  margin: 0 0 0.5rem;
  font-size: 1.75rem;
  font-weight: 500;
}
.login-subtitle {
  margin: 0 0 1.5rem;
  color: var(--md-sys-color-on-surface-variant);
}
.login-error {
  margin-bottom: 1rem;
  padding: 0.75rem 1rem;
  border-radius: var(--md-sys-shape-corner-small);
  background: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.login-input {
  width: 100%;
  margin-bottom: 1rem;
  padding: 0.75rem 1rem;
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-small);
  background: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
  font: inherit;
  box-sizing: border-box;
}
.login-input:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: -1px;
}
.login-input::placeholder {
  color: var(--md-sys-color-on-surface-variant);
}
.login-link {
  display: block;
  margin-top: 1rem;
  border: none;
  background: none;
  color: var(--md-sys-color-primary);
  font: inherit;
  cursor: pointer;
}

/* web/css/_form-styles.css */
.resource-form {
  max-width: 700px;
  margin: 0 auto;
  animation: form-fade-in 0.4s ease;
}
@keyframes form-fade-in {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.resource-form h2 {
  color: var(--md-sys-color-on-surface);
  margin-bottom: var(--md-sys-spacing-lg);
}
.form-field {
  margin-bottom: var(--md-sys-spacing-md);
  animation: form-field-slide-in 0.3s ease forwards;
  opacity: 0;
}
.form-field:nth-child(1) {
  animation-delay: 0.05s;
}
.form-field:nth-child(2) {
  animation-delay: 0.1s;
}
.form-field:nth-child(3) {
  animation-delay: 0.15s;
}
.form-field:nth-child(4) {
  animation-delay: 0.2s;
}
.form-field:nth-child(5) {
  animation-delay: 0.25s;
}
@keyframes form-field-slide-in {
  from {
    opacity: 0;
    transform: translateX(-10px);
  }
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
.form-field label {
  display: block;
  margin-bottom: var(--md-sys-spacing-xs);
  color: var(--md-sys-color-on-surface-variant);
  font: var(--md-sys-typescale-label-large);
  transition: color 0.2s ease;
}
.form-field:focus-within label {
  color: var(--md-sys-color-primary);
}
.form-field input,
.form-field textarea,
.form-field select {
  width: 100%;
  box-sizing: border-box;
  padding: 12px 16px;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  background-color: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
  font-family: var(--md-sys-typescale-body-medium);
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.form-field input:focus,
.form-field textarea:focus,
.form-field select:focus {
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 0 0 var(--md-sys-focus-ring-width) color-mix(in srgb, var(--md-sys-color-primary) 20%, transparent);
  outline: none;
  background-color: var(--md-sys-color-surface-container-high);
}
.form-field input:hover,
.form-field textarea:hover,
.form-field select:hover {
  border-color: var(--md-sys-color-primary);
}
.form-field .invalid-feedback {
  color: var(--md-sys-color-error);
  font-size: 0.875rem;
  margin-top: 4px;
  animation: error-shake 0.3s ease;
}
.form-hint {
  display: block;
  margin-top: 4px;
  color: var(--md-sys-color-on-surface-variant);
  font-size: 0.75rem;
  font-style: italic;
}
.form-field select[multiple] {
  min-height: 80px;
  padding: 4px;
}
.form-field select[multiple] option {
  padding: 4px 8px;
  border-radius: var(--md-sys-shape-corner-extra-small);
}
.form-field select[multiple] option:checked {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
@keyframes error-shake {
  0%, 100% {
    transform: translateX(0);
  }
  25% {
    transform: translateX(-4px);
  }
  75% {
    transform: translateX(4px);
  }
}
.form-actions {
  display: flex;
  gap: var(--md-sys-spacing-sm);
  margin-top: var(--md-sys-spacing-lg);
  padding-top: var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  animation: form-actions-fade-in 0.3s ease 0.3s forwards;
  opacity: 0;
}
@keyframes form-actions-fade-in {
  to {
    opacity: 1;
  }
}
.react-breadcrumb {
  margin-bottom: var(--md-sys-spacing-md);
}
.react-breadcrumb ol {
  display: flex;
  flex-wrap: wrap;
  list-style: none;
  padding: 0;
  margin: 0;
  gap: var(--md-sys-spacing-xs);
}
.react-breadcrumb li {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  font: var(--md-sys-typescale-body-small);
}
.react-breadcrumb li:not(:last-child)::after {
  content: "/";
  color: var(--md-sys-color-on-surface-variant);
}
.react-breadcrumb a {
  color: var(--md-sys-color-primary);
  text-decoration: none;
}
.react-breadcrumb a:hover {
  text-decoration: underline;
}
.react-breadcrumb .active {
  color: var(--md-sys-color-on-surface-variant);
}
.detail-page {
  max-width: 1400px;
  margin: 0 auto;
}
.detail-page .detail-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-lg);
}
.detail-page .detail-actions {
  display: flex;
  gap: var(--md-sys-spacing-sm);
}
.detail-page .detail-section {
  background-color: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-lg);
  margin-bottom: var(--md-sys-spacing-md);
}
.detail-page .detail-section h3 {
  color: var(--md-sys-color-on-surface);
  margin-bottom: var(--md-sys-spacing-md);
  font: var(--md-sys-typescale-title-large);
}
.detail-page .detail-row {
  display: flex;
  justify-content: space-between;
  padding: var(--md-sys-spacing-sm) 0;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.detail-page .detail-row:last-child {
  border-bottom: none;
}
.detail-page .detail-label {
  color: var(--md-sys-color-on-surface-variant);
  font: var(--md-sys-typescale-label-large);
}
.detail-page .detail-value {
  color: var(--md-sys-color-on-surface);
  text-align: right;
}

/* web/css/_map-styles.css */
.location-map-backdrop {
  position: fixed;
  inset: 0;
  background-color: var(--md-sys-color-scrim);
  z-index: 99999;
  display: flex;
  align-items: center;
  justify-content: center;
  animation: react-fadeIn 0.2s ease;
}
.location-map-wrapper {
  position: relative;
  height: 100%;
  width: 100%;
}
.location-map-container-inner {
  height: 100%;
  width: 100%;
}
.location-map-marker {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  border: 3px solid var(--md-sys-color-surface-container-highest);
  box-shadow: 0 2px 4px var(--md-sys-color-shadow);
}
.location-map-marker.selected {
  background-color: var(--md-sys-color-primary) !important;
  border-color: var(--md-sys-color-on-surface);
  animation: react-pulse 1.5s infinite;
}
.location-map-marker:not(.selected) {
  background-color: var(--md-sys-color-tertiary) !important;
}
.leaflet-popup-content-wrapper {
  background-color: var(--md-sys-color-surface-container-low) !important;
  color: var(--md-sys-color-on-surface) !important;
  border-radius: var(--md-sys-shape-corner-small) !important;
  box-shadow: 0 4px 12px var(--md-sys-color-shadow) !important;
}
.leaflet-popup-tip {
  background-color: var(--md-sys-color-surface-container-low) !important;
}
.leaflet-container {
  font-family: "Inter", sans-serif !important;
}
.figure-type-badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: var(--md-sys-shape-corner-full);
  font: var(--md-sys-typescale-label-large);
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.figure-type-badge.grave {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.figure-type-badge.arrow {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.figure-type-badge.ceramic {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.figure-type-badge.stone-tool,
.figure-type-badge.stonetool {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.figure-type-badge.skeleton {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.figure-type-badge.kurgan {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.figure-type-badge.oxcal {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}

/* web/css/_map-modal.css */
.location-map-modal {
  background-color: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-medium);
  overflow: hidden;
}
.location-map-modal .modal-header {
  background-color: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  padding: var(--md-sys-spacing-md);
}
.location-map-modal .modal-title {
  color: var(--md-sys-color-on-surface);
}
.location-map-modal .modal-body {
  padding: 0;
  background-color: var(--md-sys-color-surface);
}
.location-map-modal .modal-footer {
  background-color: var(--md-sys-color-surface-container-low);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  padding: var(--md-sys-spacing-md);
}
.location-map-legend {
  background-color: var(--md-sys-color-surface-container);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-small);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  font-size: 12px;
  color: var(--md-sys-color-on-surface);
}
.location-map-legend-item {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  margin-bottom: 4px;
}
.location-map-legend-item:last-child {
  margin-bottom: 0;
}
.location-map-legend-dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 2px solid var(--md-sys-color-outline);
  flex-shrink: 0;
}
.location-map-legend-dot.normal {
  background-color: var(--md-sys-color-tertiary);
}
.location-map-legend-dot.highlighted {
  background-color: var(--md-sys-color-primary);
  animation: react-pulse 1.5s infinite;
}
@keyframes react-pulse {
  0% {
    box-shadow: 0 0 0 0 rgba(26, 111, 196, 0.5);
  }
  70% {
    box-shadow: 0 0 0 8px rgba(26, 111, 196, 0);
  }
  100% {
    box-shadow: 0 0 0 0 rgba(26, 111, 196, 0);
  }
}
.location-map-info-panel {
  background-color: var(--md-sys-color-surface-container);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-small);
  padding: var(--md-sys-spacing-md);
  max-width: 300px;
  color: var(--md-sys-color-on-surface);
}
.kiosk-config-container {
  padding: var(--md-sys-spacing-md);
}
.kiosk-config-container .card-header {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  border-radius: var(--md-sys-shape-corner-medium) var(--md-sys-shape-corner-medium) 0 0;
  padding: var(--md-sys-spacing-md);
}
.kiosk-config-container .card-header.bg-success {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
}
.kiosk-config-container .card-header.bg-info {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}

/* web/css/_similarity-common.css */
.similarity-card {
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-small);
  padding: var(--md-sys-spacing-md);
  margin-bottom: var(--md-sys-spacing-sm);
  transition: all 0.3s ease;
}
.similarity-card:hover {
  border-color: var(--md-sys-color-primary);
  transform: translateY(-2px);
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
}
.grave-editor-page {
  padding: var(--md-sys-spacing-md);
}
.grave-editor-page .grave-editor-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-md);
  padding: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
}
.grave-editor-page .grave-editor-nav {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
}
.grave-editor-page .grave-editor-nav .nav-link {
  color: var(--md-sys-color-on-surface-variant);
  text-decoration: none;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
}
.grave-editor-page .grave-editor-nav .nav-link:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
}

/* web/css/_similarity-step.css */
.similarity-step {
  padding: var(--md-sys-spacing-xxl) var(--md-sys-spacing-xl);
  max-width: 1600px;
  margin: 0 auto;
  background: var(--md-sys-color-surface);
  min-height: 100vh;
  animation: similarity-step-fade-in var(--md-sys-motion-duration-long-1) var(--md-sys-motion-easing-emphasized);
}
@keyframes similarity-step-fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.similarity-header {
  text-align: center;
  margin-bottom: var(--md-sys-spacing-xxl);
  padding: var(--md-sys-spacing-xl) var(--md-sys-spacing-lg);
  background: var(--md-sys-color-primary-container);
  border-radius: var(--md-sys-shape-corner-extra-large);
  color: var(--md-sys-color-on-primary-container);
  box-shadow: var(--md-sys-elevation-3);
  animation: similarity-header-slide-in var(--md-sys-motion-duration-long-2) var(--md-sys-motion-easing-emphasized);
}
@keyframes similarity-header-slide-in {
  from {
    opacity: 0;
    transform: translateY(-20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.similarity-header h2 {
  font: var(--md-sys-typescale-display-small);
  margin: 0 0 var(--md-sys-spacing-sm) 0;
  color: var(--md-sys-color-on-primary-container);
}
.similarity-header p {
  font: var(--md-sys-typescale-body-large);
  margin: 0;
  opacity: 0.9;
}
.similarity-controls {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-xl);
  padding: var(--md-sys-spacing-lg) var(--md-sys-spacing-xl);
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-extra-large);
  box-shadow: var(--md-sys-elevation-2);
  border: 1px solid var(--similarity-border);
}
.similarity-stats {
  display: flex;
  gap: var(--md-sys-spacing-xxxl);
}
.stat-item {
  text-align: center;
  padding: 0 var(--md-sys-spacing-sm);
}
.stat-value {
  font: var(--md-sys-typescale-display-small);
  color: var(--md-sys-color-primary);
  margin-bottom: var(--md-sys-spacing-xxs);
}
.stat-label {
  font: var(--md-sys-typescale-label-medium);
  color: var(--similarity-text-secondary);
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.similarity-main {
  display: grid;
  grid-template-columns: 1fr 1.2fr;
  gap: var(--md-sys-spacing-xl);
  margin-bottom: var(--md-sys-spacing-xl);
}

/* web/css/_similarity-panel.css */
.similarity-original {
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-extra-large);
  padding: var(--md-sys-spacing-xl);
  box-shadow: var(--md-sys-elevation-2);
  border: 1px solid var(--similarity-border);
  height: fit-content;
  animation: similarity-panel-slide-in var(--md-sys-motion-duration-long-1) var(--md-sys-motion-easing-emphasized) 0.2s forwards;
  opacity: 0;
  transform: translateX(-20px);
}
@keyframes similarity-panel-slide-in {
  to {
    opacity: 1;
    transform: translateX(0);
  }
}
.similarity-original h3 {
  font: var(--md-sys-typescale-title-large);
  color: var(--similarity-heading);
  margin: 0 0 var(--md-sys-spacing-md) 0;
  padding-bottom: var(--md-sys-spacing-sm);
  border-bottom: 2px solid var(--similarity-divider);
}
.original-image {
  width: 100%;
  border-radius: var(--md-sys-shape-corner-large);
  overflow: hidden;
  margin-bottom: var(--md-sys-spacing-md);
  box-shadow: var(--md-sys-elevation-2);
}
.original-image img {
  width: 100%;
  display: block;
}
.similarity-right {
  display: flex;
  flex-direction: column;
}
.similarity-right h3 {
  font: var(--md-sys-typescale-title-large);
  color: var(--similarity-heading);
  margin: 0 0 var(--md-sys-spacing-md) 0;
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: var(--md-sys-elevation-1);
}
.similarity-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
  gap: var(--md-sys-spacing-md);
  max-height: 700px;
  overflow-y: auto;
  padding-right: var(--md-sys-spacing-sm);
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: var(--md-sys-elevation-1);
  border: 1px solid var(--similarity-border);
  padding: var(--md-sys-spacing-md);
}
.similarity-list::-webkit-scrollbar {
  width: 10px;
}
.similarity-list::-webkit-scrollbar-track {
  background: var(--similarity-divider);
  border-radius: 5px;
  margin: 4px 0;
}
.similarity-list::-webkit-scrollbar-thumb {
  background: var(--md-sys-color-primary);
  border-radius: 5px;
}
.similarity-list::-webkit-scrollbar-thumb:hover {
  background: var(--md-sys-color-on-primary-fixed-variant);
}

/* web/css/_similarity-item.css */
.similarity-item {
  padding: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--similarity-border);
  border-radius: var(--md-sys-shape-corner-large);
  cursor: pointer;
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
  box-shadow: var(--md-sys-elevation-1);
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  min-height: 140px;
  animation: similarity-item-fade-in var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized) forwards;
  opacity: 0;
}
.similarity-item:nth-child(1) {
  animation-delay: 0.05s;
}
.similarity-item:nth-child(2) {
  animation-delay: 0.1s;
}
.similarity-item:nth-child(3) {
  animation-delay: 0.15s;
}
.similarity-item:nth-child(4) {
  animation-delay: 0.2s;
}
.similarity-item:nth-child(5) {
  animation-delay: 0.25s;
}
@keyframes similarity-item-fade-in {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.similarity-item:hover {
  transform: translateY(-2px);
  box-shadow: var(--md-sys-elevation-3);
  border-color: var(--similarity-selection);
}
.similarity-item.selected {
  background-color: var(--similarity-selected-bg);
  border: 2px solid var(--similarity-selection);
  box-shadow: var(--md-sys-elevation-3);
  transform: scale(1.01);
}
.similarity-item .selection-bar {
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 4px;
  background-color: var(--similarity-selection);
}
.similarity-item .item-top-row {
  display: flex;
  gap: 16px;
  align-items: flex-start;
  margin-bottom: 12px;
}
.similarity-item .item-image {
  width: 90px;
  height: 90px;
  border-radius: 10px;
  overflow: hidden;
  flex-shrink: 0;
  border: 1px solid var(--similarity-border);
  background-color: var(--similarity-surface-secondary);
}
.similarity-item .item-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.similarity-item .item-info {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.similarity-item .item-identifier {
  font-weight: 700;
  font-size: 16px;
  color: var(--similarity-text-primary);
  margin-bottom: 4px;
  line-height: 1.3;
}
.similarity-item .item-site {
  font-size: 13px;
  color: var(--similarity-text-secondary);
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 2px;
}
.similarity-item .item-page {
  font-size: 12px;
  color: var(--similarity-text-tertiary);
  display: flex;
  align-items: center;
  gap: 6px;
}
.similarity-item .item-right {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: center;
  min-width: 120px;
}
.similarity-item .similarity-percent {
  font-size: 26px;
  font-weight: 800;
  margin-bottom: 6px;
}
.similarity-item .similarity-percent.high {
  color: var(--md-sys-color-secondary);
}
.similarity-item .similarity-percent.medium {
  color: var(--md-sys-color-tertiary);
}
.similarity-item .similarity-percent.low {
  color: var(--md-sys-color-error);
}
.similarity-item .similarity-badge {
  font-size: 11px;
  color: white;
  padding: 3px 10px;
  border-radius: 12px;
  display: inline-block;
  font-weight: 600;
}
.similarity-item .similarity-badge.high {
  background-color: var(--md-sys-color-secondary);
  box-shadow: 0 2px 6px var(--md-sys-color-shadow);
}
.similarity-item .similarity-badge.medium {
  background-color: var(--md-sys-color-tertiary);
  box-shadow: 0 2px 6px var(--md-sys-color-shadow);
}
.similarity-item .similarity-badge.low {
  background-color: var(--md-sys-color-error);
  box-shadow: 0 2px 6px var(--md-sys-color-shadow);
}
.similarity-item .progress-bar {
  height: 5px;
  background-color: var(--similarity-divider);
  border-radius: 3px;
  overflow: hidden;
}
.similarity-item .progress-bar-fill {
  height: 100%;
  border-radius: 3px;
  transition: width 0.5s cubic-bezier(0.4, 0, 0.2, 1);
  width: var(--similarity-width, 0%);
}
.similarity-item .progress-bar-fill.high {
  background: var(--md-sys-color-secondary);
}
.similarity-item .progress-bar-fill.medium {
  background: var(--md-sys-color-tertiary);
}
.similarity-item .progress-bar-fill.low {
  background: var(--md-sys-color-error);
}

/* web/css/_similarity-preview.css */
.preview-modal {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: var(--md-sys-color-scrim);
  backdrop-filter: blur(8px);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
  padding: var(--md-sys-spacing-xl);
  animation: sim-fadeIn var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
}
@keyframes sim-fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.preview-content {
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-extra-extra-large);
  max-width: 1000px;
  max-height: 90vh;
  overflow-y: auto;
  padding: var(--md-sys-spacing-xxl);
  position: relative;
  box-shadow: var(--md-sys-elevation-5);
  animation: sim-slideUp var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
}
@keyframes sim-slideUp {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.close-preview {
  position: absolute;
  top: 20px;
  right: 20px;
  background: var(--md-sys-color-secondary);
  color: var(--md-sys-color-on-secondary);
  border: none;
  border-radius: 50%;
  width: 48px;
  height: 48px;
  font-size: 28px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
}
.close-preview:hover {
  background: var(--md-sys-color-on-secondary-container);
  color: var(--md-sys-color-on-secondary);
}
.preview-content h2 {
  font: var(--md-sys-typescale-display-small);
  color: var(--similarity-heading);
  margin: 0 0 var(--md-sys-spacing-xl) 0;
  padding-bottom: var(--md-sys-spacing-md);
  border-bottom: 3px solid var(--md-sys-color-primary);
}
.preview-images {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--md-sys-spacing-xl);
  margin-bottom: var(--md-sys-spacing-xl);
}
.preview-image-container {
  border-radius: var(--md-sys-shape-corner-large);
  overflow: hidden;
  box-shadow: var(--md-sys-elevation-2);
}
.preview-image-container img {
  width: 100%;
  display: block;
}
.preview-image-label {
  font-size: 14px;
  font-weight: 600;
  color: var(--similarity-text-secondary);
  margin-bottom: 8px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}
.preview-details h4 {
  font: var(--md-sys-typescale-title-large);
  color: var(--similarity-heading);
  margin: 0 0 var(--md-sys-spacing-md) 0;
}
.detail-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
}
.detail-table tr {
  border-bottom: 1px solid var(--similarity-border);
}
.detail-table tr:last-child {
  border-bottom: none;
}
.detail-table td {
  padding: 16px;
  vertical-align: top;
}
.detail-table td:first-child {
  width: 140px;
  font-weight: 700;
  color: var(--md-sys-color-on-surface-variant);
  vertical-align: middle;
}
.detail-table td:last-child {
  color: var(--similarity-text-primary);
  font-weight: 500;
}
.similarity-score-value.high {
  color: var(--md-sys-color-secondary);
}
.similarity-score-value.medium {
  color: var(--md-sys-color-tertiary);
}
.similarity-score-value.low {
  color: var(--md-sys-color-error);
}
.similarity-score-badge.high {
  background-color: var(--md-sys-color-secondary);
}
.similarity-score-badge.medium {
  background-color: var(--md-sys-color-tertiary);
}
.similarity-score-badge.low {
  background-color: var(--md-sys-color-error);
}

/* web/css/_similarity-bottom.css */
.similarity-error,
.similarity-empty {
  text-align: center;
  padding: 50px;
}
.similarity-error {
  color: var(--md-sys-color-error);
}
.similarity-empty {
  color: var(--similarity-text-secondary);
}
.similarity-back-button {
  margin-top: var(--md-sys-spacing-md);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-secondary);
  color: var(--md-sys-color-on-secondary);
  border: none;
  border-radius: var(--md-sys-shape-corner-medium);
  cursor: pointer;
}
@media (max-width: 1024px) {
  .similarity-main {
    grid-template-columns: 1fr;
  }
  .similarity-stats {
    gap: 24px;
  }
}
@media (max-width: 640px) {
  .similarity-step {
    padding: 16px 12px;
  }
  .similarity-header h2 {
    font-size: 24px;
  }
  .similarity-controls {
    flex-direction: column;
    gap: 16px;
    padding: 16px;
  }
  .similarity-stats {
    width: 100%;
    justify-content: space-around;
    gap: 16px;
  }
  .stat-value {
    font-size: 24px;
  }
  .similarity-list {
    grid-template-columns: 1fr;
  }
  .similarity-item {
    min-height: auto !important;
  }
  .preview-images {
    grid-template-columns: 1fr;
  }
}
.similarity-btn {
  width: auto;
  max-width: 300px;
  flex-shrink: 0;
}
.similarity-count {
  color: var(--similarity-text-secondary);
  font-weight: 500;
}

/* web/css/_page-viewer.css */
.page-viewer {
  display: flex;
  flex-direction: column;
  height: 100%;
  min-height: 0;
  overflow: hidden;
}
.page-viewer-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-surface-container-low);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  flex-shrink: 0;
}
.page-viewer-header h2 {
  margin: 0;
  font-size: var(--md-sys-typescale-title-large);
  color: var(--md-sys-color-on-surface);
}
.page-viewer-canvas-container {
  flex: 1;
  overflow: hidden;
  position: relative;
  background-color: var(--md-sys-color-surface-container);
}
.page-viewer-toolbar {
  position: absolute;
  top: var(--md-sys-spacing-md);
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-sm);
  background-color: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: 0 2px 8px var(--md-sys-color-shadow);
  z-index: 10;
}
.page-viewer-toolbar .btn {
  min-width: 80px;
  font-size: var(--md-sys-typescale-body-small);
}
.page-viewer-sidebar {
  position: absolute;
  top: 80px;
  right: var(--md-sys-spacing-md);
  width: 300px;
  max-height: calc(100% - 100px);
  overflow-y: auto;
  background-color: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: 0 2px 8px var(--md-sys-color-shadow);
  padding: var(--md-sys-spacing-md);
  z-index: 10;
}
.page-viewer-figure-list {
  list-style: none;
  padding: 0;
  margin: 0;
}
.page-viewer-figure-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--md-sys-spacing-sm);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  cursor: pointer;
  transition: background-color 0.2s ease;
}
.page-viewer-figure-item:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.page-viewer-figure-item.active {
  background-color: var(--md-sys-color-primary-container);
}
.page-viewer-figure-color {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  margin-right: var(--md-sys-spacing-sm);
}
.page-viewer-figure-name {
  flex: 1;
  font-size: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface);
}
.page-viewer-figure-delete {
  background: none;
  border: none;
  color: var(--md-sys-color-error);
  cursor: pointer;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  transition: background-color 0.2s ease;
}
.page-viewer-figure-delete:hover {
  background-color: var(--md-sys-color-error-container);
}
.page-viewer-loading,
.page-viewer-error {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  font-size: var(--md-sys-typescale-body-large);
}
.page-viewer-loading {
  color: var(--md-sys-color-on-surface-variant);
}
.page-viewer-error {
  color: var(--md-sys-color-error);
}
.page-viewer-canvas-container.drawing {
  cursor: crosshair;
}
.page-viewer-zoom {
  position: absolute;
  bottom: var(--md-sys-spacing-md);
  right: var(--md-sys-spacing-md);
  display: flex;
  gap: var(--md-sys-spacing-xs);
  background-color: var(--md-sys-color-surface);
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-large);
  box-shadow: 0 2px 8px var(--md-sys-color-shadow);
  z-index: 10;
}

/* web/app/styles/checkbox.css */
.md3-checkbox {
  --md3-checkbox-size: 18px;
  --md3-checkbox-target: 40px;
  --md3-checkbox-radius: 2px;
  --md3-checkbox-state-color: var(--md-sys-color-on-surface);
  --md3-checkbox-state-opacity: 8%;
  --md3-checkbox-check: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 18 18'%3E%3Cpath d='M3.6 9.4 7 12.8 14.4 5.4' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  min-height: var(--md3-checkbox-target);
  padding: 0 var(--md-sys-spacing-sm);
  cursor: pointer;
  user-select: none;
}
.md3-checkbox-input {
  position: absolute;
  left: var(--md-sys-spacing-sm);
  top: 50%;
  width: var(--md3-checkbox-size);
  height: var(--md3-checkbox-size);
  margin: 0;
  opacity: 0;
  pointer-events: none;
}
.md3-checkbox-box {
  position: relative;
  flex-shrink: 0;
  box-sizing: border-box;
  width: var(--md3-checkbox-size);
  height: var(--md3-checkbox-size);
  border: 2px solid var(--md-sys-color-outline);
  border-radius: var(--md3-checkbox-radius);
  transition: background-color 0.15s ease, border-color 0.15s ease;
}
.md3-checkbox-box::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: var(--md3-checkbox-target);
  height: var(--md3-checkbox-target);
  transform: translate(-50%, -50%);
  border-radius: var(--md-sys-shape-corner-full);
  background-color: color-mix(in srgb, var(--md3-checkbox-state-color) var(--md3-checkbox-state-opacity), transparent);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.15s ease;
}
.md3-checkbox-box::after {
  content: "";
  position: absolute;
  inset: -2px;
  background-color: var(--md-sys-color-on-primary);
  mask: var(--md3-checkbox-check) center / contain no-repeat;
  -webkit-mask: var(--md3-checkbox-check) center / contain no-repeat;
  opacity: 0;
  transform: scale(0.5);
  transition: opacity 0.1s ease, transform 0.15s ease;
}
.md3-checkbox-label {
  flex: 1;
  min-width: 0;
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-surface);
}
.md3-checkbox:hover .md3-checkbox-input:not(:disabled) + .md3-checkbox-box::before,
.md3-checkbox:active .md3-checkbox-input:not(:disabled) + .md3-checkbox-box::before {
  opacity: 1;
}
.md3-checkbox:active .md3-checkbox-input:not(:disabled) + .md3-checkbox-box::before {
  --md3-checkbox-state-opacity: 10%;
}
.md3-checkbox .md3-checkbox-input:focus-visible + .md3-checkbox-box::before {
  opacity: 1;
  --md3-checkbox-state-color: var(--md-sys-color-on-surface-variant);
  --md3-checkbox-state-opacity: 10%;
}
.md3-checkbox-input:checked + .md3-checkbox-box {
  background-color: var(--md-sys-color-primary);
  border-color: var(--md-sys-color-primary);
}
.md3-checkbox-input:checked + .md3-checkbox-box::after {
  opacity: 1;
  transform: scale(1);
}
.md3-checkbox:has(.md3-checkbox-input:disabled) {
  cursor: default;
}
.md3-checkbox .md3-checkbox-input:disabled ~ .md3-checkbox-label {
  color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
}
.md3-checkbox-input:disabled + .md3-checkbox-box {
  border-color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 38%, transparent);
}
@media (prefers-reduced-motion: reduce) {
  .md3-checkbox-box,
  .md3-checkbox-box::before,
  .md3-checkbox-box::after {
    transition: none;
  }
}

/* web/app/styles/analytics.css */
.analytics-page {
  min-height: 100vh;
  padding: 1rem;
  background: var(--md-sys-color-background);
  color: var(--md-sys-color-on-background);
  display: grid;
  grid-template-columns: 320px minmax(0, 1fr);
  gap: 1rem;
  align-items: start;
  --analytics-status-pending: #5d4037;
  --analytics-status-running: #1565c0;
  --analytics-status-done: #2e7d32;
  --analytics-status-failed: #b71c1c;
}
.dark-mode .analytics-page {
  --analytics-status-pending: #d7ccc8;
  --analytics-status-running: #64b5f6;
  --analytics-status-done: #81c784;
  --analytics-status-failed: #ef9a9a;
}
.analytics-sidebar,
.analytics-main {
  min-width: 0;
}
.analytics-sidebar {
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-sm);
}
.analytics-empty,
.project-list-empty,
.workflow-empty,
.form-hint {
  color: var(--md-sys-color-on-surface-variant);
  font-size: 0.875rem;
  padding: 8px 0;
}
.sidebar-section {
  padding: var(--md-sys-spacing-md) 0 0;
}
.sidebar-section-title {
  font: var(--md-sys-typescale-title-small);
  color: var(--md-sys-color-on-surface-variant);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 0 var(--md-sys-spacing-sm);
  margin: 0 0 var(--md-sys-spacing-sm);
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.sidebar-section-title h2 {
  font: inherit;
  margin: 0;
}
.sidebar-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
}
.sidebar-list-item {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  padding: 8px var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-extra-small);
  cursor: pointer;
  transition: background 0.15s ease;
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-body-medium);
  overflow: hidden;
}
.sidebar-list-item:hover {
  background: var(--md-sys-color-surface-container-high);
}
.sidebar-list-item-active {
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  font-weight: 500;
}
.sidebar-list-item-active:hover {
  background: var(--md-sys-color-primary-container);
}
.sidebar-list-item-name {
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sidebar-list-item-name-edit {
  flex: 1;
  padding: 2px 6px;
  border: none;
  border-bottom: 2px solid var(--md-sys-color-primary);
  border-radius: 0;
  background: transparent;
  color: var(--md-sys-color-on-surface);
  font: inherit;
  font-family: inherit;
  outline: none;
}
.sidebar-list-item-actions {
  display: flex;
  align-items: center;
  gap: 2px;
  opacity: 0;
  transition: opacity 0.15s ease;
}
.sidebar-list-item:hover .sidebar-list-item-actions {
  opacity: 1;
}
.sidebar-action-btn {
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  border-radius: var(--md-sys-shape-corner-full);
  transition: background 0.15s ease, color 0.15s ease;
}
.sidebar-action-btn:hover {
  background: var(--md-sys-color-surface-variant);
}
.sidebar-action-btn-rename:hover {
  color: var(--md-sys-color-primary);
}
.sidebar-action-btn-delete:hover {
  color: var(--md-sys-color-error);
}
.sidebar-input {
  width: 100%;
  padding: 10px 14px;
  border: none;
  border-bottom: 1px solid var(--md-sys-color-outline);
  border-radius: 0;
  background: transparent;
  color: var(--md-sys-color-on-surface);
  font: var(--md-sys-typescale-body-medium);
  margin-top: var(--md-sys-spacing-sm);
  outline: none;
  transition: border-color 0.15s ease;
}
.sidebar-input:focus {
  border-bottom-color: var(--md-sys-color-primary);
  border-bottom-width: 2px;
}
.sidebar-input::placeholder {
  color: var(--md-sys-color-on-surface-variant);
}
.sidebar-input-inline {
  width: auto;
  padding: 6px 10px;
  margin: 0 0 0 var(--md-sys-spacing-sm);
  font-size: 0.8125rem;
  min-width: 120px;
  flex: 1;
  border: none;
  border-bottom: 1px solid var(--md-sys-color-outline);
  border-radius: 0;
  background: transparent;
}
.sidebar-icon-btn {
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  font-size: 1.125rem;
  font-weight: 500;
  transition: background 0.15s ease;
}
.sidebar-icon-btn:hover {
  filter: brightness(0.92);
}
.workflow-section {
  border-top: 1px solid var(--md-sys-color-outline-variant);
  margin-top: var(--md-sys-spacing-md);
  padding-top: var(--md-sys-spacing-md);
}
.workflow-status {
  font-size: 0.6875rem;
  color: var(--md-sys-color-on-surface-variant);
  opacity: 0.7;
  flex-shrink: 0;
}
.status-chip {
  font-size: 0.75rem;
  white-space: nowrap;
  padding: 2px 8px;
  border-radius: 999px;
  border: 1px solid currentColor;
}
.status-pending {
  color: var(--analytics-status-pending);
}
.status-running {
  color: var(--analytics-status-running);
  font-weight: 600;
}
.status-done {
  color: var(--analytics-status-done);
}
.status-failed {
  color: var(--analytics-status-failed);
}
.join-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  margin-bottom: 8px;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 6px;
  cursor: pointer;
}
.join-item:hover {
  background: var(--md-sys-color-surface-variant);
}
.join-item input {
  accent-color: var(--md-sys-color-primary);
}
.join-label {
  font-weight: 600;
}
.join-desc {
  color: var(--md-sys-color-on-surface-variant);
  font-size: 0.8125rem;
}
.analytics-page select,
.analytics-page input[type=text],
.analytics-page input:not([type]):not(.sidebar-input),
.analytics-page input[type=number] {
  padding: 8px 10px;
  font-size: 0.875rem;
  max-width: 100%;
  border: 1px solid var(--md-sys-component-input-outline-color);
  border-radius: 6px;
  background: var(--md-sys-component-input-bg);
  color: var(--md-sys-component-input-text);
}
.analytics-page select:focus,
.analytics-page input:focus:not(.sidebar-input):not(.sidebar-list-item-name-edit) {
  outline: 2px solid var(--md-sys-color-primary);
}
.analytics-main {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-md);
}
.analytics-workspace {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  background: var(--md-sys-color-background);
  color: var(--md-sys-color-on-background);
}
.analytics-workspace-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1rem;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  gap: 1rem;
  flex-wrap: wrap;
}
.analytics-workspace-header-left {
  display: flex;
  align-items: center;
  gap: 1rem;
}
.analytics-workspace-header h1 {
  font: var(--md-sys-typescale-headline-small);
  margin: 0;
  color: var(--md-sys-color-on-surface);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.workspace-select {
  padding: 6px 10px;
  font-size: 0.875rem;
  border: 1px solid var(--md-sys-color-outline);
  border-radius: 6px;
  background: var(--md-sys-color-surface-container-low);
  color: var(--md-sys-color-on-surface);
  min-width: 180px;
  max-width: 300px;
  outline: none;
}
.workspace-select:focus {
  border-color: var(--md-sys-color-primary);
  outline: 2px solid var(--md-sys-color-primary);
}
.workspace-title {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}
.workspace-rename-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
  flex-shrink: 0;
}
.workspace-rename-btn:hover {
  background: var(--md-sys-color-surface-variant);
  color: var(--md-sys-color-primary);
}
.workspace-rename-btn .material-symbols-rounded {
  font-size: 1.125rem;
}
.analytics-tabs {
  margin-bottom: var(--md-sys-spacing-md);
}
.viz-empty {
  padding: 24px;
  text-align: center;
  color: var(--md-sys-color-on-surface-variant);
}
.viz-stacked {
  display: flex;
  align-items: center;
  gap: 6px;
  color: var(--md-sys-color-on-surface);
}
.overview-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: var(--md-sys-spacing-md);
}
.overview-stat {
  text-align: center;
  padding: var(--md-sys-spacing-md);
  background: var(--md-sys-color-surface-container-lowest);
  border-radius: var(--md-sys-shape-corner-medium);
}
.overview-stat-value {
  font: var(--md-sys-typescale-headline-small);
  color: var(--md-sys-color-on-surface);
  font-weight: 600;
}
.overview-stat-date {
  font-size: 0.8125rem;
  font-weight: 400;
  color: var(--md-sys-color-on-surface-variant);
}
.overview-stat-label {
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-top: 4px;
}
.viz-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.8125rem;
}
.viz-table th {
  text-align: left;
  padding: 8px 10px;
  border-bottom: 2px solid var(--md-sys-color-outline);
  background: var(--md-sys-color-surface-container-lowest);
  color: var(--md-sys-color-on-surface);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.viz-table td {
  padding: 8px 10px;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  color: var(--md-sys-color-on-surface);
}
.viz-table tr:hover td {
  background: var(--md-sys-color-surface-variant);
}
.viz-table-note {
  margin-top: 8px;
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
}

/* web/app/styles/M3Dialog.css */
.m3-dialog-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 10001;
  padding: 1rem;
  animation: m3-dialog-overlay-in 0.15s ease-out;
}
@keyframes m3-dialog-overlay-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.m3-dialog {
  background: var(--md-sys-color-surface-container);
  color: var(--md-sys-color-on-surface);
  border-radius: var(--md-sys-shape-corner-extra-large);
  width: var(--dialog-size, 420px);
  max-width: calc(100vw - 2rem);
  max-height: calc(100vh - 2rem);
  display: flex;
  flex-direction: column;
  box-shadow: var(--md-sys-elevation-3);
  animation: m3-dialog-in 0.2s ease-out;
  outline: none;
}
@keyframes m3-dialog-in {
  from {
    opacity: 0;
    transform: scale(0.95) translateY(8px);
  }
  to {
    opacity: 1;
    transform: scale(1) translateY(0);
  }
}
.m3-dialog-small {
  --dialog-size: 360px;
}
.m3-dialog-medium {
  --dialog-size: 420px;
}
.m3-dialog-large {
  --dialog-size: 560px;
}
.m3-dialog-wide {
  --dialog-size: 720px;
}
.m3-dialog-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 1.25rem 1.5rem 0.5rem;
}
.m3-dialog-title {
  margin: 0;
  font: var(--md-sys-typescale-headline-small);
  color: var(--md-sys-color-on-surface);
}
.m3-dialog-body {
  padding: 0.5rem 1.5rem;
  overflow-y: auto;
  flex: 1;
}
.m3-dialog-footer {
  display: flex;
  justify-content: flex-end;
  gap: 0.5rem;
  padding: 0.75rem 1.5rem 1.25rem;
}
.m3-dialog-btn {
  min-width: 64px;
  padding: 0 var(--md-sys-spacing-lg);
  height: 36px;
  font: var(--md-sys-typescale-label-large);
  font-weight: 500;
  border-radius: var(--md-sys-shape-corner-full);
  border: none;
  cursor: pointer;
  transition: background 0.15s ease, box-shadow 0.15s ease;
}
.m3-dialog-btn.btn-primary {
  background: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.m3-dialog-btn.btn-primary:hover {
  box-shadow: var(--md-sys-elevation-1);
  filter: brightness(1.05);
}
.m3-dialog-btn.btn-ghost {
  background: transparent;
  color: var(--md-sys-color-primary);
}
.m3-dialog-btn.btn-ghost:hover {
  background: var(--md-sys-color-primary-container);
}
.m3-dialog-btn.btn-danger {
  background: var(--md-sys-color-error);
  color: var(--md-sys-color-on-error);
}
.m3-dialog-btn.btn-danger:hover {
  box-shadow: var(--md-sys-elevation-1);
  filter: brightness(1.05);
}
.dark-mode .m3-dialog-overlay {
  background: rgba(0, 0, 0, 0.6);
}

/* web/app/styles/analytics-charts.css */
.viz-map {
  position: relative;
  height: 320px;
  border-radius: 6px;
  z-index: 0;
}

/* web/app/styles/analytics-conditions.css */
.condition-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 10px 12px;
  margin-bottom: 8px;
  background: var(--md-sys-color-surface-container-lowest);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 6px;
}
.condition-row select,
.condition-row input {
  flex: 1;
  min-width: 0;
}
.condition-row .condition-logic {
  flex: 0 0 76px;
}
.condition-op {
  flex: 0 0 110px;
}
.condition-row .condition-remove {
  flex: 0 0 auto;
}
.condition-row input[type=text] {
  width: 100%;
  flex-basis: 100%;
}
.condition-pick {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1;
  min-width: 220px;
  padding: 6px 10px;
  border-radius: 8px;
  cursor: pointer;
  font-size: 0.8rem;
  border: 1px solid var(--md-sys-color-outline-variant);
  background: var(--md-sys-color-surface-container-lowest);
  color: var(--md-sys-color-on-surface);
}
.condition-pick:hover {
  border-color: var(--md-sys-color-primary);
}
.condition-pick-label {
  font-weight: 600;
  white-space: nowrap;
}
.condition-pick-summary {
  opacity: 0.7;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.field-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  width: 100%;
}
.field-chip {
  padding: 2px 10px;
  border-radius: 999px;
  cursor: pointer;
  font-size: 0.8125rem;
  border: 1px solid var(--md-sys-color-outline);
  color: var(--md-sys-color-on-surface-variant);
  background: transparent;
}
.field-chip:hover {
  background: var(--md-sys-color-surface-variant);
}
.field-chip-active {
  background: var(--md-sys-color-primary);
  border-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}

/* web/app/styles/analytics-dialogs.css */
.dialog-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 10001;
  padding: 1rem;
}
.dialog {
  background: var(--md-sys-color-surface, #fff);
  color: var(--md-sys-color-on-surface, #1f1b16);
  border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));
  border-radius: 12px;
  width: min(420px, 100%);
  max-height: min(75vh, 720px);
  display: flex;
  flex-direction: column;
  box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}
.dialog-options {
  width: min(560px, 100%);
}
.dialog-map {
  width: min(640px, 100%);
}
.dialog-confirm {
  width: min(360px, 100%);
}
.dialog-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.75rem 1rem 0.5rem;
}
.dialog-title {
  margin: 0;
  font-size: 1rem;
}
.dialog-close {
  border: none;
  background: none;
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
  color: inherit;
  padding: 0.25rem 0.5rem;
  border-radius: 6px;
}
.dialog-close:hover {
  background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.06));
}
.dialog-body {
  padding: 0 1rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  overflow: hidden;
}
.dialog-hint {
  margin: 0;
  font-size: 0.8rem;
  opacity: 0.75;
}
.dialog-search {
  width: 100%;
  padding: 0.4rem 0.6rem;
  border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));
  border-radius: 8px;
  background: var(--md-sys-color-surface, #fff);
  color: inherit;
}
.dialog-count {
  font-size: 0.75rem;
  opacity: 0.7;
}
.dialog-list {
  overflow-y: auto;
  max-height: 50vh;
  display: flex;
  flex-direction: column;
}
.dialog-option {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.3rem 0.4rem;
  border-radius: 6px;
  cursor: pointer;
}
.dialog-option:hover {
  background: var(--md-sys-color-surface-variant, rgba(0, 0, 0, 0.06));
}
.dialog-option input {
  margin: 0;
}
.dialog-empty {
  padding: 0.75rem 0.4rem;
  font-size: 0.8rem;
  opacity: 0.6;
  text-align: center;
}
.dialog-tools {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.dialog-footer {
  display: flex;
  justify-content: flex-end;
  gap: 0.5rem;
  padding: 0.75rem 1rem;
}
.bounds-map {
  height: 320px;
  border-radius: 8px;
  border: 1px solid var(--md-sys-color-outline-variant, rgba(0, 0, 0, 0.12));
  cursor: default;
}
.bounds-map.bounds-drawing {
  cursor: crosshair;
}

/* web/app/styles/analytics-layout.css */
.analytics-page :focus-visible:not(input):not(textarea):not(select):not([type=checkbox]):not([type=range]) {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
@media (max-width: 768px) {
  .analytics-page {
    grid-template-columns: 1fr;
  }
  .flow-topbar {
    flex-wrap: wrap;
  }
}
@media (max-width: 600px) {
  .analytics-page {
    padding: 0.75rem;
  }
  .condition-row > * {
    flex: 1 1 100%;
    min-width: 0;
  }
  .condition-row .condition-remove {
    flex: 0 0 auto;
    width: 100%;
  }
}

/* web/app/styles/analytics-map.css */
.map-config {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.map-config-base {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
}
.map-config-add {
  display: flex;
}
.map-config-add-label {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
  flex: 1 1 auto;
}
.map-config-add-label select {
  flex: 1 1 auto;
}
.map-config-empty {
  padding: 8px 10px;
  font-size: 0.8125rem;
  color: var(--md-sys-color-on-surface-variant);
  border: 1px dashed var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-medium);
}
.map-layer {
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: 8px 10px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  background: var(--md-sys-color-surface-container-lowest);
}
.map-layer.is-hidden {
  opacity: 0.55;
}
.map-layer-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.map-layer-title {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--md-sys-color-on-surface);
  cursor: pointer;
}
.map-layer-remove {
  width: 24px;
  height: 24px;
  padding: 0;
  font-size: 1.125rem;
  line-height: 1;
  color: var(--md-sys-color-on-surface-variant);
  background: transparent;
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-small);
}
.map-layer-remove:hover {
  color: var(--md-sys-color-error);
  border-color: var(--md-sys-color-error);
}
.map-options {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: 8px;
}
.map-color {
  width: 40px;
  height: 28px;
  padding: 0;
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-small);
  background: none;
}
.map-size-range {
  width: 100%;
}
.map-size-value {
  display: block;
  margin-top: 2px;
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
  font-variant-numeric: tabular-nums;
}

/* web/app/styles/analytics-flow.css */
.flow-editor {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}
.flow-body {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}
.flow-workspace {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 12px;
  align-items: stretch;
}
.flow-canvas {
  position: relative;
  height: clamp(420px, 58vh, 720px);
  background: var(--md-sys-color-surface-container-lowest);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 12px;
  overflow: hidden;
}
.flow-canvas .react-flow__edge-path {
  stroke: var(--md-sys-color-outline);
  stroke-width: 2;
}
.flow-canvas .react-flow__edge.selected .react-flow__edge-path {
  stroke: var(--md-sys-color-primary);
}
.flow-canvas .react-flow__handle {
  width: 10px;
  height: 10px;
  background: var(--md-sys-color-primary);
  border: 2px solid var(--md-sys-color-surface-container-lowest);
  z-index: 1;
}
.flow-canvas .react-flow__handle:hover {
  transform: scale(1.3);
}
.flow-canvas .react-flow__controls {
  box-shadow: none;
  border-radius: 8px;
  overflow: hidden;
}
.flow-canvas .react-flow__controls-button {
  background: var(--md-sys-color-surface-container);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  color: var(--md-sys-color-on-surface);
  fill: currentColor;
}
.flow-canvas .react-flow__controls-button:hover {
  background: var(--md-sys-color-surface-variant);
}
.flow-minimap {
  background: var(--md-sys-color-surface-container-low) !important;
}
.flow-canvas .react-flow__attribution {
  background: transparent;
  color: var(--md-sys-color-on-surface-variant);
}
.flow-node {
  width: 208px;
  background: var(--md-sys-color-surface);
  border: none;
  border-left: 4px solid var(--md-sys-color-secondary);
  border-radius: var(--md-sys-shape-corner-extra-small);
  padding: 10px 12px;
  font: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface);
  box-shadow: var(--md-sys-elevation-1);
  user-select: none;
  cursor: grab;
  transition: box-shadow 0.15s ease;
}
.flow-node:hover {
  box-shadow: var(--md-sys-elevation-2);
}
.flow-node:active {
  cursor: grabbing;
}
.flow-node-input {
  border-left-color: var(--md-sys-color-primary);
}
.flow-node-output {
  border-left-color: var(--md-sys-color-tertiary);
}
.flow-node-selected {
  box-shadow: 0 0 0 2px var(--md-sys-color-primary);
}
.flow-node-failed {
  border-left-color: var(--md-sys-color-error);
}
.flow-node-head {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 6px;
}
.flow-node-icon {
  color: var(--md-sys-color-primary);
  font-size: 1rem;
}
.flow-node-title {
  font: var(--md-sys-typescale-title-small);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--md-sys-color-on-surface);
}
.flow-node-summary {
  list-style: none;
  margin: 0 0 8px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
  color: var(--md-sys-color-on-surface);
  opacity: 0.65;
}
.flow-node-summary li {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font: var(--md-sys-typescale-body-small);
}
.flow-node-label {
  font-weight: 500;
  opacity: 0.9;
}
.flow-node-foot {
  border-top: 1px solid var(--md-sys-color-outline-variant);
  padding-top: 6px;
}
.flow-node-count {
  color: var(--md-sys-color-primary);
  font-weight: 600;
}
.flow-node-idle {
  color: var(--md-sys-color-on-surface);
  opacity: 0.5;
}
.flow-node-error {
  color: var(--md-sys-color-error);
  display: block;
  max-height: 2.4em;
  overflow: hidden;
}
@media (max-width: 1100px) {
  .flow-workspace {
    grid-template-columns: 1fr;
  }
}
.canvas-guide-overlay {
  position: absolute;
  inset: 0;
  background: rgba(0, 0, 0, 0.45);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 100;
  border-radius: 12px;
  backdrop-filter: blur(2px);
}
.canvas-guide-card {
  background: var(--md-sys-color-surface);
  border-radius: var(--md-sys-shape-corner-large);
  padding: 24px;
  max-width: 420px;
  width: 90%;
  box-shadow: var(--md-sys-elevation-3);
  position: relative;
  color: var(--md-sys-color-on-surface);
}
.canvas-guide-close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 32px;
  height: 32px;
  border: none;
  background: transparent;
  color: var(--md-sys-color-on-surface-variant);
  border-radius: 50%;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background 0.15s ease;
}
.canvas-guide-close:hover {
  background: var(--md-sys-color-surface-container-high);
}
.canvas-guide-close .material-symbols-rounded {
  font-size: 1.25rem;
}
.canvas-guide-step {
  margin-bottom: 16px;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.canvas-guide-step:last-of-type {
  margin-bottom: 0;
  padding-bottom: 0;
  border-bottom: none;
}
.canvas-guide-step-number {
  font: var(--md-sys-typescale-label-medium);
  color: var(--md-sys-color-primary);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 4px;
}
.canvas-guide-title {
  font: var(--md-sys-typescale-title-small);
  margin: 0 0 6px;
  color: var(--md-sys-color-on-surface);
}
.canvas-guide-text {
  font: var(--md-sys-typescale-body-medium);
  margin: 0;
  color: var(--md-sys-color-on-surface-variant);
  line-height: 1.5;
}
.canvas-guide-text strong {
  color: var(--md-sys-color-on-surface);
}
.canvas-guide-start {
  width: 100%;
  margin-top: 8px;
}
@media (max-width: 768px) {
  .flow-palette {
    flex-wrap: wrap;
  }
  .flow-palette-tabs {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .flow-palette-tabs::-webkit-scrollbar {
    display: none;
  }
}

/* web/app/styles/analytics-workflow.css */
.flow-topbar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
}
.flow-title {
  flex: 1;
  min-width: 0;
  font: var(--md-sys-typescale-title-large);
  padding: 6px 10px;
  border: none;
  border-bottom: 1px solid transparent;
  background: transparent;
  color: var(--md-sys-color-on-surface);
  border-radius: 0;
  outline: none;
  transition: border-color 0.15s ease;
}
.flow-title:focus {
  border-bottom-color: var(--md-sys-color-primary);
}
.flow-status {
  font-size: 0.75rem;
  white-space: nowrap;
  padding: 4px 12px;
  border-radius: var(--md-sys-shape-corner-full);
  background: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.flow-status-running {
  color: var(--md-sys-color-primary);
  animation: analytics-pulse 1.6s ease-in-out infinite;
}
.flow-status-done {
  color: var(--md-sys-color-tertiary);
}
.flow-status-failed {
  color: var(--md-sys-color-error);
}
.flow-panel-title {
  font: var(--md-sys-typescale-title-small);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--md-sys-color-on-surface-variant);
  margin: 0 0 10px;
}
.flow-palette {
  display: flex;
  align-items: center;
  gap: 16px;
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: 8px 12px;
}
.flow-palette-tabs {
  display: flex;
  gap: 4px;
}
.flow-palette-tab {
  padding: 6px 12px;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  font: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  transition: color 0.15s ease, background 0.15s ease;
}
.flow-palette-tab:hover {
  color: var(--md-sys-color-on-surface);
}
.flow-palette-tab-active {
  color: var(--md-sys-color-primary);
  background: var(--md-sys-color-surface-container-high);
}
.flow-palette-group {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.flow-palette-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: var(--md-sys-color-surface-container-lowest);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-extra-small);
  cursor: pointer;
  color: var(--md-sys-color-on-surface);
  transition: background 0.15s ease, border-color 0.15s ease;
}
.flow-palette-item:hover {
  background: var(--md-sys-color-surface-container-high);
  border-color: var(--md-sys-color-primary);
}
.flow-palette-item-name {
  font: var(--md-sys-typescale-body-medium);
  font-weight: 500;
  white-space: nowrap;
}
.flow-palette-item-desc {
  font: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 220px;
}
.flow-inspector {
  background: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  padding: 12px;
  overflow-y: auto;
  max-height: clamp(420px, 58vh, 720px);
}
.flow-inspector-hint {
  font: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
  margin: 0 0 12px;
}
.flow-inspector-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.flow-inspector-delete {
  color: var(--md-sys-color-error);
  margin-top: 8px;
}
.flow-input-section {
  margin: 12px 0;
  border-top: 1px solid var(--md-sys-color-outline-variant);
  padding-top: 10px;
}
.flow-input-toggle {
  display: flex;
  align-items: center;
  gap: 6px;
  width: 100%;
  background: transparent;
  border: none;
  cursor: pointer;
  font: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface-variant);
  padding: 4px 0;
  text-align: left;
}
.flow-input-toggle:hover {
  color: var(--md-sys-color-on-surface);
}
.flow-input-toggle-icon {
  transition: transform 0.15s ease;
  font-size: 0.75rem;
}
.flow-input-toggle[aria-expanded=true] .flow-input-toggle-icon {
  transform: rotate(90deg);
}
.flow-input-scroll {
  max-height: 240px;
  overflow: auto;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: var(--md-sys-shape-corner-extra-small);
}
.flow-input-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.875rem;
}
.flow-input-table th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--md-sys-color-surface-container-high);
  padding: 6px 10px;
  text-align: left;
  font: var(--md-sys-typescale-label-small);
  color: var(--md-sys-color-on-surface-variant);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.flow-input-table td {
  padding: 6px 10px;
  color: var(--md-sys-color-on-surface);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 220px;
}
.flow-input-table tr:hover td {
  background: var(--md-sys-color-surface-container-high);
}
.flow-input-empty {
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
  margin: 6px 0;
}
.flow-input-note {
  font-size: 0.6875rem;
  color: var(--md-sys-color-on-surface-variant);
  margin: 4px 0 0;
}
.m3-dialog .flow-input-scroll {
  max-height: min(60vh, 560px);
}
.join-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.analytics-page .form-field {
  animation: none;
  opacity: 1;
  margin-bottom: 12px;
}
.analytics-page .form-label {
  display: block;
  margin-bottom: 4px;
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--md-sys-color-on-surface-variant);
}
.flow-enum-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.flow-enum-chip {
  font-size: 0.75rem;
  padding: 4px 10px;
  border-radius: 999px;
  border: 1px solid var(--md-sys-color-outline-variant);
  background: var(--md-sys-color-surface-container-lowest);
  color: var(--md-sys-color-on-surface);
  cursor: pointer;
}
.flow-enum-chip[aria-pressed=true] {
  background: var(--md-sys-color-primary);
  border-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
}
.agg-row,
.bin-row {
  display: flex;
  gap: 6px;
  align-items: center;
  margin-bottom: 6px;
}
.agg-field {
  flex: 1;
  min-width: 0;
}
.agg-func {
  flex: 0 0 96px;
}
.bin-label {
  flex: 1;
  min-width: 70px;
}
.bin-min,
.bin-max {
  flex: 0 0 64px;
}
.agg-remove,
.bin-remove {
  flex: 0 0 auto;
  background: transparent;
  border: none;
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  font-size: 1rem;
  padding: 2px 6px;
}
.agg-remove:hover,
.bin-remove:hover {
  color: var(--md-sys-color-error);
}
.series-label-row {
  display: flex;
  gap: 6px;
  align-items: center;
  margin-bottom: 6px;
}
.series-label-key {
  flex: 0 0 96px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--md-sys-color-on-surface-variant);
  font-size: 0.78rem;
}
.series-label-input {
  flex: 1;
  min-width: 0;
}
.flow-results {
  background: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 12px;
  padding: 12px;
}
.flow-results-head {
  display: flex;
  align-items: baseline;
  gap: 12px;
  margin-bottom: 8px;
}
.flow-results-ran,
.flow-results-hint {
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
}
.flow-results-error {
  color: var(--md-sys-color-error);
  font-size: 0.8125rem;
}
.flow-results-export {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
.flow-results-bg {
  font-size: 0.75rem;
}
.flow-results-grid {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.flow-result-card {
  padding: 14px;
  border-radius: var(--md-sys-shape-corner-extra-small);
  background: var(--md-sys-color-surface-container-lowest);
  border: 1px solid var(--md-sys-color-outline-variant);
}
.flow-result-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}
.flow-result-title {
  flex: 1;
  font-size: 0.9375rem;
  font-weight: 600;
  margin: 0;
}
.flow-result-status {
  font-size: 0.75rem;
  color: var(--md-sys-color-on-surface-variant);
}
.flow-result-status-failed {
  color: var(--md-sys-color-error);
}
.flow-result-export {
  display: flex;
  gap: 4px;
}
.flow-result-error {
  color: var(--md-sys-color-error);
  font-size: 0.8125rem;
}
.flow-result-body {
  min-height: 220px;
  max-height: 480px;
  overflow: auto;
}
.flow-result-body .viz-table thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--md-sys-color-surface-container);
}

/* web/app/components/Ripple.css */
.ripple-button {
  position: relative;
  overflow: hidden;
  cursor: pointer;
  border: none;
  outline: none;
  transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
.ripple-button:disabled {
  cursor: not-allowed;
  opacity: 0.38;
}
.ripple-button-content {
  position: relative;
  z-index: 1;
  pointer-events: none;
}
.ripple-effect {
  position: absolute;
  border-radius: 50%;
  background-color: currentColor;
  opacity: 0.15;
  transform: scale(0);
  animation: ripple-animation 0.6s ease-out;
  pointer-events: none;
}
@keyframes ripple-animation {
  to {
    transform: scale(4);
    opacity: 0;
  }
}
.ripple-button-primary {
  background-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-on-primary);
  padding: 12px 24px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-family: var(--md-sys-typescale-label-large);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.1px;
  line-height: 1.71;
  box-shadow: 0 2px 6px var(--md-sys-color-shadow);
}
.ripple-button-primary:hover:not(:disabled) {
  background-color: var(--md-sys-color-on-primary-fixed-variant);
  color: var(--md-sys-color-on-primary);
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-1px);
}
.ripple-button-primary:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: 0 1px 3px var(--md-sys-color-shadow);
}
.ripple-button-secondary {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
  padding: 12px 24px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-family: var(--md-sys-typescale-label-large);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.1px;
  line-height: 1.71;
}
.ripple-button-secondary:hover:not(:disabled) {
  background-color: var(--md-sys-color-secondary-container);
  opacity: 0.9;
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-1px);
}
.ripple-button-secondary:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: none;
}
.ripple-button-tertiary {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
  padding: 12px 24px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-family: var(--md-sys-typescale-label-large);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.1px;
  line-height: 1.71;
}
.ripple-button-tertiary:hover:not(:disabled) {
  background-color: var(--md-sys-color-tertiary-container);
  opacity: 0.9;
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-1px);
}
.ripple-button-tertiary:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: none;
}
.ripple-button-outline {
  background-color: transparent;
  color: var(--md-sys-color-primary);
  border: 1px solid var(--md-sys-color-outline);
  padding: 12px 24px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-family: var(--md-sys-typescale-label-large);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.1px;
  line-height: 1.71;
}
.ripple-button-outline:hover:not(:disabled) {
  background-color: var(--md-sys-color-primary-container);
  border-color: var(--md-sys-color-primary);
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-1px);
}
.ripple-button-outline:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: none;
}
.ripple-button-danger {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error);
  padding: 12px 24px;
  border-radius: var(--md-sys-shape-corner-medium);
  font-family: var(--md-sys-typescale-label-large);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.1px;
  line-height: 1.71;
}
.ripple-button-danger:hover:not(:disabled) {
  background-color: var(--md-sys-color-error);
  color: var(--md-sys-color-on-error);
  box-shadow: 0 4px 12px var(--md-sys-color-shadow);
  transform: translateY(-1px);
}
.ripple-button-danger:active:not(:disabled) {
  transform: translateY(0);
  box-shadow: none;
}
.ripple-button:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
.ripple-button-small {
  padding: 8px 16px;
  font-size: 12px;
}
.ripple-button-large {
  padding: 16px 32px;
  font-size: 16px;
}
.ripple-button-full-width {
  width: 100%;
}

/* web/app/components/QueryError.css */
.query-error-modern {
  display: flex;
  gap: var(--md-sys-spacing-lg);
  padding: var(--md-sys-spacing-xl);
  background-color: var(--md-sys-color-error-container);
  border-radius: var(--md-sys-shape-corner-large);
  border-left: 4px solid var(--md-sys-color-error);
  animation: query-error-fade-in var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-emphasized);
  max-width: 600px;
  margin: 0 auto;
}
@keyframes query-error-fade-in {
  from {
    opacity: 0;
    transform: translateY(-10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.query-error-icon {
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background-color: var(--md-sys-color-error);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.query-error-icon .material-symbols-rounded {
  font-size: 28px;
  color: var(--md-sys-color-on-error);
}
.query-error-content {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.query-error-title {
  font-family: var(--md-sys-typescale-title-medium);
  font-size: 18px;
  font-weight: 500;
  color: var(--md-sys-color-on-error-container);
  margin: 0;
}
.query-error-message {
  font-family: var(--md-sys-typescale-body-medium);
  font-size: 14px;
  line-height: 1.6;
  color: var(--md-sys-color-on-error-container);
  margin: 0;
}
.query-error-retry {
  align-self: flex-start;
  margin-top: 8px;
}
@media (max-width: 768px) {
  .query-error-modern {
    flex-direction: column;
    text-align: center;
    align-items: center;
  }
  .query-error-retry {
    align-self: center;
  }
}

/* web/app/Layout.css */
*,
*::before,
*::after {
  box-sizing: border-box;
}
.skip-link {
  position: absolute;
  top: -40px;
  left: 0;
  background: var(--brand-primary);
  color: white;
  padding: 8px 16px;
  z-index: 10000;
  transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  text-decoration: none;
  font-weight: 600;
  border-radius: var(--md-sys-shape-corner-small);
}
.skip-link:focus {
  top: 0;
  outline: 3px solid var(--brand-accent);
  outline-offset: 2px;
}
.navbar {
  position: sticky;
  top: 0;
  z-index: 1000;
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
  background-color: var(--md-sys-color-surface-container-low);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  display: flex;
  align-items: center;
  justify-content: space-between;
}
.navbar-scrolled {
  box-shadow: var(--md-sys-elevation-2);
}
.navbar-brand {
  color: var(--md-sys-color-on-surface);
  font-weight: 700;
  text-decoration: none;
  font-size: var(--md-sys-typescale-title-medium);
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
}
.navbar-brand .material-symbols-rounded {
  font-size: 28px;
  color: var(--brand-accent);
}
.navbar-brand:focus-visible {
  outline: var(--md-sys-focus-ring-width) solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
.nav-link {
  color: var(--md-sys-color-on-surface-variant);
  text-decoration: none;
  font-weight: 500;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
  position: relative;
  overflow: hidden;
}
.nav-link::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      circle at center,
      rgba(255, 255, 255, 0.3) 0%,
      transparent 70%);
  opacity: 0;
  transition: opacity var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.nav-link:hover::before {
  opacity: 0.1;
}
.nav-link:hover {
  color: var(--md-sys-color-on-surface);
  background-color: var(--md-sys-color-surface-container-high);
  transform: translateY(-1px);
}
.nav-link:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.nav-link.active {
  color: var(--md-sys-color-primary);
  font-weight: 600;
  background-color: var(--md-sys-color-primary-container);
}
.nav-link.active::after {
  content: "";
  position: absolute;
  bottom: 2px;
  left: 50%;
  transform: translateX(-50%);
  width: 24px;
  height: 4px;
  border-radius: var(--md-sys-shape-corner-full);
  background-color: var(--md-sys-color-primary);
}
.dark-mode-toggle {
  position: relative;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  background-color: var(--md-sys-color-surface-container-low);
}
.dark-mode-toggle:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.dark-mode-toggle.active {
  background-color: var(--md-sys-color-primary);
}
.dark-mode-toggle .material-symbols-rounded {
  font-size: 18px;
  color: var(--md-sys-color-on-surface-variant);
  margin-right: var(--md-sys-spacing-xs);
}
.dark-mode-toggle.active .material-symbols-rounded {
  color: var(--brand-accent);
}
.dark-mode-toggle:focus-visible {
  outline: var(--md-sys-focus-ring-width) solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
.dark-mode-switch-track {
  position: relative;
  width: 40px;
  height: 20px;
  border-radius: var(--md-sys-shape-corner-full);
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.dark-mode-toggle.active .dark-mode-switch-track {
  background-color: var(--md-sys-color-primary);
}
.dark-mode-toggle:not(.active) .dark-mode-switch-track {
  background-color: var(--md-sys-color-on-surface-variant);
}
.dark-mode-switch-knob {
  position: absolute;
  top: 2px;
  width: 16px;
  height: 16px;
  border-radius: var(--md-sys-shape-corner-full);
  background-color: var(--md-sys-color-surface);
  transition: all var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
  box-shadow: var(--md-sys-elevation-1);
}
.dark-mode-toggle.active .dark-mode-switch-knob {
  left: 22px;
  box-shadow: none;
}
.dark-mode-toggle:not(.active) .dark-mode-switch-knob {
  left: 2px;
}
.user-menu {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
}
.user-info {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-full);
  background-color: var(--md-sys-color-surface-container-low);
}
.user-info .material-symbols-rounded {
  font-size: 18px;
  color: var(--md-sys-color-primary);
}
.user-info .user-name {
  color: var(--md-sys-color-on-surface);
  font-weight: 500;
  font-size: var(--md-sys-typescale-title-medium);
}
.logout-btn {
  color: var(--md-sys-color-error);
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  transition: all 0.2s ease;
}
.logout-btn:hover {
  background-color: var(--md-sys-color-error-container);
}
.logout-btn:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.mobile-menu-toggle {
  display: none;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  transition: all 0.2s ease;
}
.mobile-menu-toggle:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.mobile-menu-toggle:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.mobile-menu-toggle .material-symbols-rounded {
  font-size: 24px;
  color: var(--md-sys-color-on-surface-variant);
}
.mobile-menu {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
  padding-top: 0;
  padding-bottom: 0;
  background-color: var(--md-sys-color-surface-container);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  max-height: 0;
  opacity: 0;
  overflow: hidden;
  transition:
    max-height 0.3s ease,
    opacity 0.3s ease,
    padding 0.3s ease;
}
.mobile-menu.open {
  max-height: 500px;
  opacity: 1;
  padding-top: var(--md-sys-spacing-md);
  padding-bottom: var(--md-sys-spacing-md);
}
.mobile-nav-link {
  color: var(--md-sys-color-on-surface-variant);
  text-decoration: none;
  font-weight: 500;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
  border-radius: var(--md-sys-shape-corner-medium);
  transition: all 0.2s ease;
}
.mobile-nav-link:hover {
  color: var(--md-sys-color-on-surface);
  background-color: var(--md-sys-color-surface-container-high);
}
.mobile-nav-link:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.mobile-nav-link.active {
  color: var(--brand-primary);
  font-weight: 600;
}
.admin-link .group-icon,
.admin-link .key-icon {
  font-size: 18px;
  margin-right: var(--md-sys-spacing-xs);
  color: var(--brand-accent);
}
.flash-message {
  margin-bottom: var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  border: none;
  border-radius: var(--md-sys-shape-corner-medium);
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  box-shadow: var(--md-sys-elevation-2);
  position: relative;
}
.flash-message .material-symbols-rounded {
  font-size: 24px;
  color: var(--md-sys-color-primary);
}
.flash-dismiss {
  margin-left: auto;
  background: none;
  border: none;
  cursor: pointer;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-primary-container);
  transition: background-color 0.2s ease;
}
.flash-dismiss:hover {
  background-color: rgba(0, 0, 0, 0.1);
}
.flash-dismiss:focus-visible {
  outline: 2px solid var(--brand-primary);
  outline-offset: 2px;
}
.flash-dismiss .material-symbols-rounded {
  font-size: 18px;
}
.content-wrapper {
  width: 100%;
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}
*:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
html {
  scroll-behavior: smooth;
}
::selection {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.app-body {
  display: flex;
  min-height: calc(100vh - 64px);
}
.app-main {
  flex: 1;
  min-height: 0;
  margin-left: 0;
  padding: var(--md-sys-spacing-xl);
  display: flex;
  flex-direction: column;
}
.app-main:has(> .content-wrapper > .page-viewer) {
  padding: 0;
}
.app-main:has(> .content-wrapper > .page-viewer) .content-wrapper {
  flex: unset;
  padding: 0;
  height: 100%;
}
.navbar-drawer-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  transition: background-color 0.15s ease;
  flex-shrink: 0;
}
.navbar-drawer-toggle:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.navbar-drawer-toggle:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
.navbar-content {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-md);
}
.navbar-nav {
  display: flex;
  gap: var(--md-sys-spacing-sm);
  align-items: center;
  flex: 1;
}
.nav-items {
  display: flex;
  gap: var(--md-sys-spacing-sm);
  align-items: center;
}
.navbar-actions {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  flex-shrink: 0;
  margin-left: auto;
}
@media (max-width: 1024px) {
  .nav-items {
    display: none;
  }
  .navbar-actions {
    display: none;
  }
  .navbar-drawer-toggle {
    display: inline-flex;
  }
  .mobile-menu-toggle {
    display: block;
  }
  .navbar {
    padding: var(--md-sys-spacing-sm);
  }
  .content-wrapper {
    padding: 0 var(--md-sys-spacing-md);
  }
}
@media (max-width: 768px) {
  .content-wrapper {
    padding: 0 var(--md-sys-spacing-sm);
  }
}
.not-found-page {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 60vh;
  text-align: center;
  gap: var(--md-sys-spacing-md);
}
.not-found-page h1 {
  font-size: var(--md-sys-typescale-headline-large);
  color: var(--md-sys-color-on-surface);
}
.not-found-page p {
  color: var(--md-sys-color-on-surface-variant);
  font-size: var(--md-sys-typescale-body-large);
}

/* web/app/components/M3Snackbar.css */
.m3-snackbar-surface {
  position: fixed;
  bottom: var(--md-sys-spacing-xl);
  left: 50%;
  transform: translateX(-50%);
  z-index: 9999;
  display: flex;
  flex-direction: column-reverse;
  gap: var(--md-sys-spacing-sm);
  pointer-events: none;
  max-width: calc(100vw - 32px);
}
.m3-snackbar {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-md);
  background-color: var(--md-sys-color-inverse-surface);
  color: var(--md-sys-color-inverse-on-surface);
  border-radius: var(--md-sys-shape-corner-extra-small);
  box-shadow: var(--md-sys-elevation-3);
  min-height: 48px;
  max-width: 480px;
  min-width: 280px;
  flex: 1;
  pointer-events: auto;
  transform: translateY(100%);
  opacity: 0;
  transition: transform var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized), opacity var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
}
.m3-snackbar-visible {
  transform: translateY(0);
  opacity: 1;
}
.m3-snackbar-exit {
  transform: translateY(100%);
  opacity: 0;
  transition: transform var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard), opacity var(--md-sys-motion-duration-short-4) var(--md-sys-motion-easing-standard);
}
.m3-snackbar-icon {
  flex-shrink: 0;
  font-size: 20px;
}
.m3-snackbar-message {
  flex: 1;
  font: var(--md-sys-typescale-body-medium);
  line-height: 1.5;
  min-width: 0;
}
.m3-snackbar-actions {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  flex-shrink: 0;
}
.m3-snackbar-action {
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-tertiary);
  background: none;
  border: none;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-sm);
  border-radius: var(--md-sys-shape-corner-small);
  cursor: pointer;
  white-space: nowrap;
  transition: background-color 0.15s ease;
}
.m3-snackbar-action:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-tertiary) 8%, transparent);
}
.m3-snackbar-action:active {
  background-color: color-mix(in srgb, var(--md-sys-color-tertiary) 12%, transparent);
}
.m3-snackbar-dismiss {
  background: none;
  border: none;
  padding: var(--md-sys-spacing-xs);
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  color: var(--md-sys-color-inverse-on-surface);
  opacity: 0.7;
  transition: opacity 0.15s ease;
}
.m3-snackbar-dismiss:hover {
  opacity: 1;
}
.m3-snackbar-dismiss .material-symbols-rounded {
  font-size: 18px;
}
.dark-mode .m3-snackbar-action {
  color: var(--md-sys-color-tertiary);
}
@media (max-width: 768px) {
  .m3-snackbar-surface {
    left: var(--md-sys-spacing-md);
    right: var(--md-sys-spacing-md);
    transform: none;
    max-width: none;
  }
  .m3-snackbar {
    min-width: 0;
    max-width: none;
  }
}

/* web/app/components/M3NavigationDrawer.css */
.m3-navigation-drawer-persistent {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: 280px;
  background-color: var(--md-sys-color-surface);
  z-index: 1100;
  display: flex;
  flex-direction: column;
  box-shadow: var(--md-sys-elevation-3);
  transform: translateX(-100%);
  transition: transform var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
}
.m3-navigation-drawer-dismissible,
.m3-navigation-drawer-temporary {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  width: 280px;
  background-color: var(--md-sys-color-surface);
  z-index: 1200;
  display: flex;
  flex-direction: column;
  box-shadow: var(--md-sys-elevation-3);
  transform: translateX(-100%);
  transition: transform var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
}
.m3-navigation-drawer-open {
  transform: translateX(0);
}
.m3-navigation-drawer-overlay {
  position: fixed;
  inset: 0;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 1150;
  animation: drawer-overlay-in 0.2s ease;
}
@keyframes drawer-overlay-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.m3-navigation-drawer-header {
  padding: var(--md-sys-spacing-xl) var(--md-sys-spacing-md);
  min-height: 64px;
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-md);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.m3-navigation-drawer-content {
  flex: 1;
  overflow-y: auto;
  padding: var(--md-sys-spacing-sm) 0;
}
.m3-navigation-drawer-footer {
  padding: var(--md-sys-spacing-md);
  border-top: 1px solid var(--md-sys-color-outline-variant);
}
.m3-nav-drawer-item {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-md);
  width: 100%;
  padding: var(--md-sys-spacing-md) var(--md-sys-spacing-lg);
  background: transparent;
  border: none;
  font: var(--md-sys-typescale-body-large);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  text-align: left;
  transition: background-color 0.12s ease;
}
.m3-nav-drawer-item:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-nav-drawer-item:active {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 12%, transparent);
}
.m3-nav-drawer-item:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: -2px;
}
.m3-nav-drawer-item-active {
  color: var(--md-sys-color-primary);
  background-color: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
}
.m3-nav-drawer-item-active .m3-nav-drawer-item-icon {
  color: var(--md-sys-color-primary);
}
.m3-nav-drawer-item-icon {
  font-size: 24px;
  flex-shrink: 0;
}
.m3-nav-drawer-item-label {
  flex: 1;
  white-space: nowrap;
}
@media (max-width: 768px) {
  .m3-navigation-drawer-persistent {
    transform: translateX(-100%);
  }
  .m3-navigation-drawer-open {
    transform: translateX(0);
  }
}

/* web/app/components/Skeleton.css */
.skeleton {
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s infinite;
  border-radius: var(--md-sys-shape-corner-small);
}
@keyframes skeleton-shimmer {
  0% {
    background-position: 200% 0;
  }
  100% {
    background-position: -200% 0;
  }
}
.skeleton-text {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.skeleton-line {
  height: 16px;
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s infinite;
  border-radius: var(--md-sys-shape-corner-small);
}
.skeleton-line:last-child {
  width: 60% !important;
}
.skeleton-card {
  background-color: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-medium);
  overflow: hidden;
  border: 1px solid var(--md-sys-color-outline-variant);
}
.skeleton-card-image {
  width: 100%;
  height: 150px;
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s infinite;
}
.skeleton-card-content {
  padding: 16px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.skeleton-card-content .skeleton-line {
  height: 14px;
}
.skeleton-table-row {
  display: flex;
  gap: 16px;
  padding: 16px;
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.skeleton-cell {
  height: 16px;
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s infinite;
  border-radius: var(--md-sys-shape-corner-small);
}
.skeleton-avatar {
  border-radius: 50%;
  background:
    linear-gradient(
      90deg,
      var(--md-sys-color-surface-container-high) 25%,
      var(--md-sys-color-surface-container-highest) 50%,
      var(--md-sys-color-surface-container-high) 75%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.5s infinite;
}
.skeleton-container {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.skeleton-container > *:nth-child(1) {
  animation-delay: 0s;
}
.skeleton-container > *:nth-child(2) {
  animation-delay: 0.1s;
}
.skeleton-container > *:nth-child(3) {
  animation-delay: 0.2s;
}
.skeleton-container > *:nth-child(4) {
  animation-delay: 0.3s;
}
.skeleton-container > *:nth-child(5) {
  animation-delay: 0.4s;
}

/* web/app/components/EmptyState.css */
.empty-state-modern {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: var(--md-sys-spacing-xxxxxxl) var(--md-sys-spacing-xl);
  text-align: center;
  animation: empty-state-fade-in var(--md-sys-motion-duration-medium-2) var(--md-sys-motion-easing-emphasized);
}
@keyframes empty-state-fade-in {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.empty-state-icon {
  width: 80px;
  height: 80px;
  border-radius: var(--md-sys-shape-corner-full);
  background-color: var(--md-sys-color-surface-container-low);
  display: flex;
  align-items: center;
  justify-content: center;
  margin-bottom: var(--md-sys-spacing-xl);
  box-shadow: var(--md-sys-elevation-2);
}
.empty-state-icon .material-symbols-rounded {
  font-size: 40px;
  color: var(--md-sys-color-on-surface-variant);
}
.empty-state-title {
  font-family: var(--md-sys-typescale-title-large);
  font-size: 24px;
  font-weight: 500;
  line-height: 1.2;
  color: var(--md-sys-color-on-surface);
  margin: 0 0 12px 0;
}
.empty-state-message {
  font-family: var(--md-sys-typescale-body-medium);
  font-size: 16px;
  line-height: 1.6;
  color: var(--md-sys-color-on-surface-variant);
  margin: 0 0 24px 0;
  max-width: 400px;
}
.empty-state-action {
  margin-top: 8px;
}
@media (max-width: 768px) {
  .empty-state-modern {
    padding: 48px 16px;
  }
  .empty-state-icon {
    width: 64px;
    height: 64px;
  }
  .empty-state-icon .material-symbols-rounded {
    font-size: 32px;
  }
  .empty-state-title {
    font-size: 20px;
  }
  .empty-state-message {
    font-size: 14px;
  }
}

/* web/app/components/M3FAB.css */
.m3-fab {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: var(--md-sys-shape-corner-extra-large);
  cursor: pointer;
  transition: all var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-emphasized);
  position: relative;
  overflow: hidden;
  gap: var(--md-sys-spacing-sm);
}
.m3-fab::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(
      circle at center,
      rgba(255, 255, 255, 0.3) 0%,
      transparent 70%);
  opacity: 0;
  transition: opacity var(--md-sys-motion-duration-medium-1) var(--md-sys-motion-easing-standard);
}
.m3-fab:hover::before {
  opacity: 1;
}
.m3-fab:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 4px;
}
.m3-fab-standard {
  width: 56px;
  height: 56px;
  padding: 0;
}
.m3-fab-standard .m3-fab-icon {
  font-size: 24px;
}
.m3-fab-extended {
  height: 48px;
  padding: 0 var(--md-sys-spacing-xl);
  border-radius: var(--md-sys-shape-corner-extra-large);
}
.m3-fab-extended .m3-fab-icon {
  font-size: 24px;
}
.m3-fab-extended .m3-fab-label {
  font: var(--md-sys-typescale-label-large);
  white-space: nowrap;
}
.m3-fab-primary {
  background-color: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  box-shadow: var(--md-sys-elevation-3);
}
.m3-fab-primary:hover {
  box-shadow: var(--md-sys-elevation-5);
  transform: translateY(-2px);
}
.m3-fab-primary:active {
  box-shadow: var(--md-sys-elevation-1);
  transform: translateY(0);
}
.m3-fab-secondary {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
  box-shadow: var(--md-sys-elevation-1);
}
.m3-fab-secondary:hover {
  box-shadow: var(--md-sys-elevation-3);
  transform: translateY(-1px);
}
.m3-fab-secondary:active {
  box-shadow: var(--md-sys-elevation-1);
  transform: translateY(0);
}
.m3-fab-tertiary {
  background-color: var(--md-sys-color-tertiary-container);
  color: var(--md-sys-color-on-tertiary-container);
  box-shadow: var(--md-sys-elevation-1);
}
.m3-fab-tertiary:hover {
  box-shadow: var(--md-sys-elevation-3);
  transform: translateY(-1px);
}
.m3-fab-tertiary:active {
  box-shadow: var(--md-sys-elevation-1);
  transform: translateY(0);
}
.m3-fab-surface {
  background-color: var(--md-sys-color-surface);
  color: var(--md-sys-color-on-surface);
  box-shadow: var(--md-sys-elevation-2);
}
.m3-fab-surface:hover {
  box-shadow: var(--md-sys-elevation-4);
  transform: translateY(-2px);
}
.m3-fab-surface:active {
  box-shadow: var(--md-sys-elevation-1);
  transform: translateY(0);
}
.m3-fab:disabled {
  opacity: 0.38;
  cursor: not-allowed;
  transform: none !important;
  box-shadow: none !important;
}
@media (max-width: 768px) {
  .m3-fab-extended {
    height: 40px;
    padding: 0 var(--md-sys-spacing-md);
  }
  .m3-fab-extended .m3-fab-label {
    font-size: 12px;
  }
}

/* web/app/components/M3Progress.css */
.m3-linear-progress {
  position: relative;
  height: 4px;
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface) 16%, transparent);
  border-radius: var(--md-sys-shape-corner-full);
  overflow: hidden;
}
.m3-linear-progress-inverse {
  background-color: color-mix(in srgb, var(--md-sys-color-inverse-on-surface) 16%, transparent);
}
.m3-linear-progress-bar {
  height: 100%;
  background-color: var(--md-sys-color-primary);
  border-radius: var(--md-sys-shape-corner-full);
  transition: width 0.3s var(--md-sys-motion-easing-standard);
}
.m3-linear-progress-indeterminate-track {
  position: absolute;
  inset: 0;
  background: transparent;
}
.m3-linear-progress-indeterminate-primary,
.m3-linear-progress-indeterminate-secondary {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 100%;
  border-radius: var(--md-sys-shape-corner-full);
}
.m3-linear-progress-indeterminate-primary {
  background-color: var(--md-sys-color-primary);
  animation: linear-progress-primary 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
}
.m3-linear-progress-indeterminate-secondary {
  background-color: var(--md-sys-color-secondary);
  animation: linear-progress-secondary 1.8s cubic-bezier(0.4, 0, 0.2, 1) infinite;
  animation-delay: 0.4s;
}
@keyframes linear-progress-primary {
  0% {
    left: -35%;
    right: 100%;
  }
  60% {
    left: 100%;
    right: -90%;
  }
  100% {
    left: 100%;
    right: -90%;
  }
}
@keyframes linear-progress-secondary {
  0% {
    left: -200%;
    right: 100%;
  }
  60% {
    left: 107%;
    right: -8%;
  }
  100% {
    left: 107%;
    right: -8%;
  }
}
.m3-linear-progress-secondary .m3-linear-progress-indeterminate-primary {
  background-color: var(--md-sys-color-secondary);
}
.m3-linear-progress-tertiary .m3-linear-progress-indeterminate-primary {
  background-color: var(--md-sys-color-tertiary);
}
.m3-circular-progress {
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.m3-circular-progress svg {
  transform: rotate(-90deg);
}
.m3-circular-progress-track {
  stroke: color-mix(in srgb, var(--md-sys-color-on-surface) 16%, transparent);
}
.m3-circular-progress-indicator {
  stroke: var(--md-sys-color-primary);
  stroke-linecap: round;
  transition: stroke-dashoffset 0.3s var(--md-sys-motion-easing-standard);
}
@keyframes circular-spin {
  from {
    transform: rotate(-90deg);
  }
  to {
    transform: rotate(270deg);
  }
}

/* web/app/styles/publications.css */
.publications-fab {
  position: fixed;
  bottom: var(--md-sys-spacing-xl);
  right: var(--md-sys-spacing-xl);
  z-index: 100;
}
.page-content > .m3-linear-progress {
  margin-bottom: var(--md-sys-spacing-md);
}

/* web/app/styles/sites-map.css */
.sites-map-wrap {
  margin: 0 0 16px;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 12px;
  overflow: hidden;
}
.sites-map {
  height: 380px;
  width: 100%;
}
.sites-map-placeholder {
  height: 120px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 12px;
  color: var(--md-sys-color-on-surface-variant);
  font-size: 14px;
}
.site-marker {
  background: none;
  border: none;
}
.site-marker-dot {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  border: 2px solid var(--md-sys-color-on-surface);
  cursor: pointer;
}
.site-marker-dot.is-selected {
  border-width: 3px;
  box-shadow: 0 0 0 4px rgba(0, 0, 0, 0.15);
}

/* web/app/components/TableActions.css */
.table-actions {
  display: flex;
  gap: var(--md-sys-spacing-xs);
}
.table-action-btn,
.table-action-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface-variant);
  background: none;
  border: none;
  cursor: pointer;
  text-decoration: none;
  font-size: 0;
  transition: background-color 0.2s ease;
}
.table-action-btn:hover,
.table-action-link:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.table-action-btn:active,
.table-action-link:active {
  background-color: var(--md-sys-color-surface-container-highest);
}
.table-action-btn-danger:hover,
.table-action-link-danger:hover {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.table-action-btn:focus-visible,
.table-action-link:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--md-sys-color-primary);
}

/* web/app/components/M3Chip.css */
.m3-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  height: 32px;
  padding: 0 var(--md-sys-spacing-md);
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  font: var(--md-sys-typescale-label-large);
  cursor: pointer;
  transition: all var(--md-sys-motion-duration-short-5) var(--md-sys-motion-easing-standard);
  white-space: nowrap;
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.m3-chip:hover:not(.m3-chip-disabled) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-chip:active:not(.m3-chip-disabled) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 12%, transparent);
}
.m3-chip:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: 2px;
}
.m3-chip-disabled {
  opacity: 0.38;
  cursor: not-allowed;
}
.m3-chip-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 18px;
  flex-shrink: 0;
}
.m3-chip-trailing {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: var(--md-sys-shape-corner-full);
  flex-shrink: 0;
}
.m3-chip-trailing .material-symbols-rounded {
  font-size: 18px;
}
.m3-chip-assist {
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.m3-chip-assist:hover:not(.m3-chip-disabled) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-chip-selected.m3-chip-filter,
.m3-chip-selected.m3-chip-input {
  background-color: var(--md-sys-color-secondary-container);
  color: var(--md-sys-color-on-secondary-container);
}
.m3-chip-selected.m3-chip-filter:hover:not(.m3-chip-disabled),
.m3-chip-selected.m3-chip-input:hover:not(.m3-chip-disabled) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-secondary-container) 8%, transparent);
}
.m3-chip-suggestion {
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
  border: 1px solid var(--md-sys-color-outline-variant);
}
.m3-chip-suggestion:hover:not(.m3-chip-disabled) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-chip-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--md-sys-spacing-xs);
}
.m3-chip-disabled {
  opacity: 0.38;
  cursor: not-allowed;
}
@media (max-width: 768px) {
  .m3-chip {
    height: 28px;
    padding: 0 var(--md-sys-spacing-sm);
    font-size: 12px;
  }
}

/* web/app/components/M3Card.css */
.m3-card {
  background-color: var(--md-sys-color-surface-container-low);
  border-radius: var(--md-sys-shape-corner-large);
  overflow: hidden;
  transition: all var(--md-sys-motion-duration-medium-3) var(--md-sys-motion-easing-standard);
  display: flex;
  flex-direction: column;
}
.m3-card-filled {
  background-color: var(--md-sys-color-surface-container-low);
  box-shadow: none;
}
.m3-card-clickable.m3-card-filled:hover {
  background-color: var(--md-sys-color-surface-container-high);
  box-shadow: var(--md-sys-elevation-1);
}
.m3-card-outlined {
  background-color: var(--md-sys-color-surface);
  border: 1px solid var(--md-sys-color-outline-variant);
  box-shadow: none;
}
.m3-card-clickable.m3-card-outlined:hover {
  border-color: var(--md-sys-color-outline);
  box-shadow: var(--md-sys-elevation-1);
}
.m3-card-elevated {
  background-color: var(--md-sys-color-surface);
  box-shadow: var(--md-sys-elevation-1);
}
.m3-card-clickable.m3-card-elevated:hover {
  box-shadow: var(--md-sys-elevation-3);
  transform: translateY(-2px);
}
.m3-card-media {
  width: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  background-color: var(--md-sys-color-surface-container-high);
}
.m3-card-content {
  padding: var(--md-sys-spacing-lg);
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-xs);
}
.m3-card-title {
  font: var(--md-sys-typescale-title-large);
  color: var(--md-sys-color-on-surface);
  margin: 0;
  line-height: 1.2;
}
.m3-card-subtitle {
  font: var(--md-sys-typescale-body-medium);
  color: var(--md-sys-color-on-surface-variant);
  margin: 0;
  line-height: 1.5;
}
.m3-card-body {
  font: var(--md-sys-typescale-body-large);
  color: var(--md-sys-color-on-surface);
  line-height: 1.5;
}
.m3-card-actions {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-xs);
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-md);
}
.m3-card-actions-trailing {
  justify-content: flex-end;
}
.m3-card-actions-centered {
  justify-content: center;
}
.m3-card-actions-leading {
  justify-content: flex-start;
}
.m3-card-actions .m3-icon-btn {
  width: 36px;
  height: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  transition: background-color 0.15s ease;
}
.m3-card-actions .m3-icon-btn:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-card-actions .m3-icon-btn:active {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 12%, transparent);
}
@media (max-width: 768px) {
  .m3-card {
    border-radius: var(--md-sys-shape-corner-medium);
  }
}

/* web/app/components/M3Menu.css */
.m3-menu-container {
  position: relative;
  display: inline-block;
}
.m3-menu-trigger-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  transition: background-color 0.15s ease;
}
.m3-menu-trigger-btn:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-menu-trigger {
  cursor: pointer;
}
.m3-menu {
  position: absolute;
  z-index: 1000;
  min-width: 112px;
  max-width: 280px;
  padding: var(--md-sys-spacing-xs) 0;
  background-color: var(--md-sys-color-surface-container-high);
  border-radius: var(--md-sys-shape-corner-extra-small);
  box-shadow: var(--md-sys-elevation-8);
  animation: menu-pop-in 0.15s var(--md-sys-motion-easing-emphasized);
  transform-origin: top left;
}
@keyframes menu-pop-in {
  from {
    opacity: 0;
    transform: scale(0.92);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}
.m3-menu-bottom {
  top: 100%;
  left: 0;
  margin-top: var(--md-sys-spacing-xs);
}
.m3-menu-top {
  bottom: 100%;
  left: 0;
  margin-bottom: var(--md-sys-spacing-xs);
}
.m3-menu-start {
  top: 0;
  left: 100%;
  margin-left: var(--md-sys-spacing-xs);
}
.m3-menu-end {
  top: 0;
  right: 0;
  margin-right: var(--md-sys-spacing-xs);
}
.m3-menu-item {
  display: flex;
  align-items: center;
  gap: var(--md-sys-spacing-md);
  width: 100%;
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-lg);
  background: transparent;
  border: none;
  font: var(--md-sys-typescale-body-large);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  text-align: left;
  transition: background-color 0.12s ease;
}
.m3-menu-item:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-menu-item:active {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 12%, transparent);
}
.m3-menu-item:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: -2px;
}
.m3-menu-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 20px;
  flex-shrink: 0;
  color: var(--md-sys-color-on-surface-variant);
}
.m3-menu-icon-trailing {
  margin-left: auto;
}
.m3-menu-label {
  flex: 1;
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.m3-menu-header {
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-lg);
  font: var(--md-sys-typescale-title-small);
  color: var(--md-sys-color-on-surface);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
}
.m3-menu-footer {
  padding: var(--md-sys-spacing-sm) var(--md-sys-spacing-lg);
  font: var(--md-sys-typescale-label-medium);
  color: var(--md-sys-color-primary);
  border-top: 1px solid var(--md-sys-color-outline-variant);
  cursor: pointer;
}
.m3-menu-footer:hover {
  background-color: color-mix(in srgb, var(--md-sys-color-primary) 8%, transparent);
}
@media (max-width: 768px) {
  .m3-menu {
    max-width: 240px;
  }
}

/* web/app/styles/analytics-dashboard.css */
.analytics-dashboard {
  padding: 1.5rem;
  background: var(--md-sys-color-background);
  color: var(--md-sys-color-on-background);
}
.analytics-dashboard-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 1.5rem;
}
.analytics-dashboard-header h1 {
  font: var(--md-sys-typescale-headline-medium);
  margin: 0;
  color: var(--md-sys-color-on-surface);
}
.dashboard-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1rem;
}
.dashboard-card {
  min-height: 160px;
  display: flex;
  flex-direction: column;
}
.dashboard-card-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.dashboard-card-item {
  display: flex;
  align-items: center;
  padding: 6px 8px;
  border-radius: var(--md-sys-shape-corner-extra-small);
  transition: background 0.15s ease;
}
.dashboard-card-item:hover {
  background: var(--md-sys-color-surface-variant);
}
.dashboard-card-item-label {
  font-size: 0.875rem;
  color: var(--md-sys-color-on-surface);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  flex: 1;
}
.dashboard-card-menu-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
  flex-shrink: 0;
  margin-left: 4px;
}
.dashboard-card-menu-btn:hover {
  background: var(--md-sys-color-surface-variant);
  color: var(--md-sys-color-on-surface);
}
.dashboard-card-menu-btn .material-symbols-rounded {
  font-size: 1.25rem;
}
.dashboard-card-item-action {
  font-size: 0.75rem;
  padding: 4px 12px;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
  cursor: pointer;
  font-weight: 500;
  transition: filter 0.15s ease;
}
.dashboard-card-item-action:hover {
  filter: brightness(0.92);
}
.dashboard-card-item-rename {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  padding: 0;
  background: transparent;
  border: none;
  border-radius: var(--md-sys-shape-corner-full);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}
.dashboard-card-item-rename:hover {
  background: var(--md-sys-color-surface-variant);
  color: var(--md-sys-color-primary);
}
.dashboard-card-item-rename .material-symbols-rounded {
  font-size: 1.125rem;
}
.dashboard-card-item-action:hover {
  filter: brightness(0.92);
}
.dashboard-card-add {
  display: block;
  width: 100%;
  padding: 8px;
  margin-top: 8px;
  border: 1px dashed var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-extra-small);
  background: transparent;
  color: var(--md-sys-color-on-surface-variant);
  font: var(--md-sys-typescale-body-medium);
  cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease;
}
.dashboard-card-add:hover {
  background: var(--md-sys-color-surface-variant);
  border-color: var(--md-sys-color-primary);
  color: var(--md-sys-color-primary);
}

/* node_modules/reactflow/dist/style.css */
.react-flow {
  direction: ltr;
}
.react-flow__container {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
}
.react-flow__pane {
  z-index: 1;
  cursor: -webkit-grab;
  cursor: grab;
}
.react-flow__pane.selection {
  cursor: pointer;
}
.react-flow__pane.dragging {
  cursor: -webkit-grabbing;
  cursor: grabbing;
}
.react-flow__viewport {
  transform-origin: 0 0;
  z-index: 2;
  pointer-events: none;
}
.react-flow__renderer {
  z-index: 4;
}
.react-flow__selection {
  z-index: 6;
}
.react-flow__nodesselection-rect:focus,
.react-flow__nodesselection-rect:focus-visible {
  outline: none;
}
.react-flow .react-flow__edges {
  pointer-events: none;
  overflow: visible;
}
.react-flow__edge-path,
.react-flow__connection-path {
  stroke: #b1b1b7;
  stroke-width: 1;
  fill: none;
}
.react-flow__edge {
  pointer-events: visibleStroke;
  cursor: pointer;
}
.react-flow__edge.animated path {
  stroke-dasharray: 5;
  -webkit-animation: dashdraw 0.5s linear infinite;
  animation: dashdraw 0.5s linear infinite;
}
.react-flow__edge.animated path.react-flow__edge-interaction {
  stroke-dasharray: none;
  -webkit-animation: none;
  animation: none;
}
.react-flow__edge.inactive {
  pointer-events: none;
}
.react-flow__edge.selected,
.react-flow__edge:focus,
.react-flow__edge:focus-visible {
  outline: none;
}
.react-flow__edge.selected .react-flow__edge-path,
.react-flow__edge:focus .react-flow__edge-path,
.react-flow__edge:focus-visible .react-flow__edge-path {
  stroke: #555;
}
.react-flow__edge-textwrapper {
  pointer-events: all;
}
.react-flow__edge-textbg {
  fill: white;
}
.react-flow__edge .react-flow__edge-text {
  pointer-events: none;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}
.react-flow__connection {
  pointer-events: none;
}
.react-flow__connection .animated {
  stroke-dasharray: 5;
  -webkit-animation: dashdraw 0.5s linear infinite;
  animation: dashdraw 0.5s linear infinite;
}
.react-flow__connectionline {
  z-index: 1001;
}
.react-flow__nodes {
  pointer-events: none;
  transform-origin: 0 0;
}
.react-flow__node {
  position: absolute;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  pointer-events: all;
  transform-origin: 0 0;
  box-sizing: border-box;
  cursor: -webkit-grab;
  cursor: grab;
}
.react-flow__node.dragging {
  cursor: -webkit-grabbing;
  cursor: grabbing;
}
.react-flow__nodesselection {
  z-index: 3;
  transform-origin: left top;
  pointer-events: none;
}
.react-flow__nodesselection-rect {
  position: absolute;
  pointer-events: all;
  cursor: -webkit-grab;
  cursor: grab;
}
.react-flow__handle {
  position: absolute;
  pointer-events: none;
  min-width: 5px;
  min-height: 5px;
  width: 6px;
  height: 6px;
  background: #1a192b;
  border: 1px solid white;
  border-radius: 100%;
}
.react-flow__handle.connectionindicator {
  pointer-events: all;
  cursor: crosshair;
}
.react-flow__handle-bottom {
  top: auto;
  left: 50%;
  bottom: -4px;
  transform: translate(-50%, 0);
}
.react-flow__handle-top {
  left: 50%;
  top: -4px;
  transform: translate(-50%, 0);
}
.react-flow__handle-left {
  top: 50%;
  left: -4px;
  transform: translate(0, -50%);
}
.react-flow__handle-right {
  right: -4px;
  top: 50%;
  transform: translate(0, -50%);
}
.react-flow__edgeupdater {
  cursor: move;
  pointer-events: all;
}
.react-flow__panel {
  position: absolute;
  z-index: 5;
  margin: 15px;
}
.react-flow__panel.top {
  top: 0;
}
.react-flow__panel.bottom {
  bottom: 0;
}
.react-flow__panel.left {
  left: 0;
}
.react-flow__panel.right {
  right: 0;
}
.react-flow__panel.center {
  left: 50%;
  transform: translateX(-50%);
}
.react-flow__attribution {
  font-size: 10px;
  background: rgba(255, 255, 255, 0.5);
  padding: 2px 3px;
  margin: 0;
}
.react-flow__attribution a {
  text-decoration: none;
  color: #999;
}
@-webkit-keyframes dashdraw {
  from {
    stroke-dashoffset: 10;
  }
}
@keyframes dashdraw {
  from {
    stroke-dashoffset: 10;
  }
}
.react-flow__edgelabel-renderer {
  position: absolute;
  width: 100%;
  height: 100%;
  pointer-events: none;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
}
.react-flow__edge.updating .react-flow__edge-path {
  stroke: #777;
}
.react-flow__edge-text {
  font-size: 10px;
}
.react-flow__node.selectable:focus,
.react-flow__node.selectable:focus-visible {
  outline: none;
}
.react-flow__node-default,
.react-flow__node-input,
.react-flow__node-output,
.react-flow__node-group {
  padding: 10px;
  border-radius: 3px;
  width: 150px;
  font-size: 12px;
  color: #222;
  text-align: center;
  border-width: 1px;
  border-style: solid;
  border-color: #1a192b;
  background-color: white;
}
.react-flow__node-default.selectable:hover,
.react-flow__node-input.selectable:hover,
.react-flow__node-output.selectable:hover,
.react-flow__node-group.selectable:hover {
  box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.08);
}
.react-flow__node-default.selectable.selected,
.react-flow__node-default.selectable:focus,
.react-flow__node-default.selectable:focus-visible,
.react-flow__node-input.selectable.selected,
.react-flow__node-input.selectable:focus,
.react-flow__node-input.selectable:focus-visible,
.react-flow__node-output.selectable.selected,
.react-flow__node-output.selectable:focus,
.react-flow__node-output.selectable:focus-visible,
.react-flow__node-group.selectable.selected,
.react-flow__node-group.selectable:focus,
.react-flow__node-group.selectable:focus-visible {
  box-shadow: 0 0 0 0.5px #1a192b;
}
.react-flow__node-group {
  background-color: rgba(240, 240, 240, 0.25);
}
.react-flow__nodesselection-rect,
.react-flow__selection {
  background: rgba(0, 89, 220, 0.08);
  border: 1px dotted rgba(0, 89, 220, 0.8);
}
.react-flow__nodesselection-rect:focus,
.react-flow__nodesselection-rect:focus-visible,
.react-flow__selection:focus,
.react-flow__selection:focus-visible {
  outline: none;
}
.react-flow__controls {
  box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);
}
.react-flow__controls-button {
  border: none;
  background: #fefefe;
  border-bottom: 1px solid #eee;
  box-sizing: content-box;
  display: flex;
  justify-content: center;
  align-items: center;
  width: 16px;
  height: 16px;
  cursor: pointer;
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none;
  padding: 5px;
}
.react-flow__controls-button:hover {
  background: #f4f4f4;
}
.react-flow__controls-button svg {
  width: 100%;
  max-width: 12px;
  max-height: 12px;
}
.react-flow__controls-button:disabled {
  pointer-events: none;
}
.react-flow__controls-button:disabled svg {
  fill-opacity: 0.4;
}
.react-flow__minimap {
  background-color: #fff;
}
.react-flow__minimap svg {
  display: block;
}
.react-flow__resize-control {
  position: absolute;
}
.react-flow__resize-control.left,
.react-flow__resize-control.right {
  cursor: ew-resize;
}
.react-flow__resize-control.top,
.react-flow__resize-control.bottom {
  cursor: ns-resize;
}
.react-flow__resize-control.top.left,
.react-flow__resize-control.bottom.right {
  cursor: nwse-resize;
}
.react-flow__resize-control.bottom.left,
.react-flow__resize-control.top.right {
  cursor: nesw-resize;
}
.react-flow__resize-control.handle {
  width: 4px;
  height: 4px;
  border: 1px solid #fff;
  border-radius: 1px;
  background-color: #3367d9;
  transform: translate(-50%, -50%);
}
.react-flow__resize-control.handle.left {
  left: 0;
  top: 50%;
}
.react-flow__resize-control.handle.right {
  left: 100%;
  top: 50%;
}
.react-flow__resize-control.handle.top {
  left: 50%;
  top: 0;
}
.react-flow__resize-control.handle.bottom {
  left: 50%;
  top: 100%;
}
.react-flow__resize-control.handle.top.left {
  left: 0;
}
.react-flow__resize-control.handle.bottom.left {
  left: 0;
}
.react-flow__resize-control.handle.top.right {
  left: 100%;
}
.react-flow__resize-control.handle.bottom.right {
  left: 100%;
}
.react-flow__resize-control.line {
  border-color: #3367d9;
  border-width: 0;
  border-style: solid;
}
.react-flow__resize-control.line.left,
.react-flow__resize-control.line.right {
  width: 1px;
  transform: translate(-50%, 0);
  top: 0;
  height: 100%;
}
.react-flow__resize-control.line.left {
  left: 0;
  border-left-width: 1px;
}
.react-flow__resize-control.line.right {
  left: 100%;
  border-right-width: 1px;
}
.react-flow__resize-control.line.top,
.react-flow__resize-control.line.bottom {
  height: 1px;
  transform: translate(0, -50%);
  left: 0;
  width: 100%;
}
.react-flow__resize-control.line.top {
  top: 0;
  border-top-width: 1px;
}
.react-flow__resize-control.line.bottom {
  border-bottom-width: 1px;
  top: 100%;
}

/* web/css/_analytics_viz.css */
.heatmap-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--md-sys-spacing-lg);
}
.heatmap-card {
  display: flex;
  flex-direction: column;
  gap: var(--md-sys-spacing-sm);
}
.heatmap-title {
  font-size: 0.95rem;
  font-weight: 600;
  color: var(--md-sys-color-on-surface);
}
.heatmap-caption {
  font-size: 0.9rem;
  color: var(--md-sys-color-on-surface-variant);
  text-align: center;
}
.heatmap-wrap {
  position: relative;
  display: flex;
  justify-content: center;
}
.heatmap-canvas {
  max-width: 100%;
  border-radius: var(--md-sys-shape-corner-small);
  background-color: var(--md-sys-color-surface-container-low);
}
.similarity-matrix {
  overflow-x: auto;
}
.similarity-matrix table {
  border-collapse: collapse;
  width: 100%;
  font-size: 0.8rem;
}
.similarity-matrix th,
.similarity-matrix td {
  border: 1px solid var(--md-sys-color-outline-variant);
  padding: 6px 8px;
  text-align: center;
  white-space: nowrap;
}
.similarity-matrix th {
  background-color: var(--md-sys-color-surface-container);
}
.similarity-matrix td {
  font-weight: 400;
}
.similarity-matrix td.similarity-cell-medium,
.similarity-matrix td.similarity-cell-strong {
  font-weight: 700;
}
.similarity-matrix td.similarity-cell {
  background-color: transparent;
}
.similarity-matrix td.similarity-cell-soft {
  background-color: rgba(26, 111, 196, 0.15);
}
.similarity-matrix td.similarity-cell-medium {
  background-color: rgba(26, 111, 196, 0.3);
}
.similarity-matrix td.similarity-cell-strong {
  background-color: rgba(26, 111, 196, 0.45);
}
.analysis-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--md-sys-spacing-sm);
  padding: var(--md-sys-spacing-xl);
  color: var(--md-sys-color-on-surface-variant);
}
.analysis-empty-icon {
  font-size: 42px;
  opacity: 0.6;
}

/* web/app/styles/analytics-tools.css */
.analytics-tools {
  display: grid;
  gap: 16px;
  padding: 16px;
}
.tool-controls {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: 16px;
}
.tool-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
  font-size: 0.8125rem;
  color: var(--md-sys-color-on-surface-variant);
}
.tool-field select,
.tool-field input {
  min-width: 160px;
}
.tool-tag-picker {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  max-width: 420px;
}
.tool-tag-option {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 10px;
  border: 1px solid var(--md-sys-color-outline);
  border-radius: var(--md-sys-shape-corner-extra-small);
  font-size: 0.8125rem;
  cursor: pointer;
}
.tool-tag-option.selected {
  border-color: var(--md-sys-color-primary);
  background: var(--md-sys-color-primary-container);
  color: var(--md-sys-color-on-primary-container);
}
.tool-error {
  color: var(--md-sys-color-error);
}

/* web/app/components/M3TabBar.css */
.m3-tab-bar-container {
  position: relative;
  display: flex;
  align-items: center;
}
.m3-tab-bar {
  display: flex;
  overflow-x: auto;
  gap: 0;
  padding: 0 var(--md-sys-spacing-md);
  border-bottom: 1px solid var(--md-sys-color-outline-variant);
  scroll-behavior: smooth;
  -ms-overflow-style: none;
  scrollbar-width: none;
}
.m3-tab-bar::-webkit-scrollbar {
  display: none;
}
.m3-tab-bar-fixed {
  flex: none;
  width: 100%;
  justify-content: space-around;
}
.m3-tab-bar-scrollable {
  flex: 1;
}
.m3-tab {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--md-sys-spacing-xxs);
  min-height: 48px;
  padding: var(--md-sys-spacing-xs) var(--md-sys-spacing-md);
  background: transparent;
  border: none;
  font: var(--md-sys-typescale-label-large);
  color: var(--md-sys-color-on-surface-variant);
  cursor: pointer;
  position: relative;
  transition: color 0.2s ease;
  white-space: nowrap;
}
.m3-tab:focus-visible {
  outline: 2px solid var(--md-sys-color-primary);
  outline-offset: -2px;
}
.m3-tab:hover:not(.m3-tab-active) {
  background-color: color-mix(in srgb, var(--md-sys-color-on-surface-variant) 8%, transparent);
}
.m3-tab-active {
  color: var(--md-sys-color-primary);
}
.m3-tab-active::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 50%;
  transform: translateX(-50%);
  width: 100%;
  height: 3px;
  background-color: var(--md-sys-color-primary);
  border-radius: var(--md-sys-shape-corner-full) var(--md-sys-shape-corner-full) 0 0;
}
.m3-tab-icon {
  font-size: 20px;
}
.m3-tab-label {
  font-weight: 500;
}
.m3-tab-scroll-btn {
  display: none;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 48px;
  background: var(--md-sys-color-surface);
  border: none;
  cursor: pointer;
  color: var(--md-sys-color-on-surface-variant);
  z-index: 1;
  flex-shrink: 0;
}
.m3-tab-scroll-btn:hover {
  background-color: var(--md-sys-color-surface-container-low);
}
.m3-tab-scroll-btn-left {
  border-radius: var(--md-sys-shape-corner-extra-small) 0 0 0;
}
.m3-tab-scroll-btn-right {
  border-radius: 0 var(--md-sys-shape-corner-extra-small) 0 0;
}
.m3-tab-bar-scrollable ~ .m3-tab-scroll-btn {
  display: inline-flex;
}
.m3-tab-panel {
  padding: var(--md-sys-spacing-md);
}
@media (max-width: 768px) {
  .m3-tab {
    min-height: 40px;
    padding: var(--md-sys-spacing-xxs) var(--md-sys-spacing-sm);
  }
  .m3-tab-icon {
    font-size: 18px;
  }
}

/* web/app/styles/sites.css */
.sites-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--md-sys-spacing-lg);
}
.sites-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: var(--md-sys-spacing-md);
}
.site-card {
  transition: box-shadow 0.2s ease;
}
.site-card:hover {
  box-shadow: 0 2px 8px var(--md-sys-color-shadow, rgba(0, 0, 0, 0.12));
}
.site-stats {
  display: flex;
  flex-wrap: wrap;
  gap: var(--md-sys-spacing-sm);
}
.site-card-actions {
  display: flex;
  gap: var(--md-sys-spacing-sm);
}
.site-card-action {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  color: var(--md-sys-color-on-surface-variant);
  background: none;
  border: none;
  cursor: pointer;
  transition: background-color 0.2s ease;
}
.site-card-action:hover {
  background-color: var(--md-sys-color-surface-container-high);
}
.site-card-action-danger:hover {
  background-color: var(--md-sys-color-error-container);
  color: var(--md-sys-color-on-error-container);
}
.sites-fab {
  position: fixed;
  bottom: var(--md-sys-spacing-xl);
  right: var(--md-sys-spacing-xl);
  z-index: 100;
}

/* web/css/_publication-show.css */
.page-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--md-sys-spacing-md);
  animation: grid-fade-in 0.5s ease;
}
@keyframes grid-fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
.page-card {
  display: flex;
  flex-direction: column;
  border-radius: var(--md-sys-shape-corner-medium);
  overflow: hidden;
  background-color: var(--md-sys-color-surface-container-low);
  border: 1px solid var(--md-sys-color-outline-variant);
  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  text-decoration: none;
  color: var(--md-sys-color-on-surface);
  animation: page-card-slide-in 0.4s ease forwards;
  opacity: 0;
}
.page-card:nth-child(1) {
  animation-delay: 0.05s;
}
.page-card:nth-child(2) {
  animation-delay: 0.1s;
}
.page-card:nth-child(3) {
  animation-delay: 0.15s;
}
.page-card:nth-child(4) {
  animation-delay: 0.2s;
}
.page-card:nth-child(5) {
  animation-delay: 0.25s;
}
.page-card:nth-child(6) {
  animation-delay: 0.3s;
}
@keyframes page-card-slide-in {
  from {
    opacity: 0;
    transform: translateY(20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.page-card:hover {
  transform: translateY(-4px) scale(1.02);
  box-shadow: 0 8px 24px var(--md-sys-color-shadow);
  border-color: var(--md-sys-color-primary);
}
.page-card-image {
  width: 100%;
  height: 150px;
  object-fit: cover;
  display: block;
}
.page-card-placeholder {
  width: 100%;
  height: 150px;
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: var(--md-sys-color-surface-container-high);
  color: var(--md-sys-color-on-surface-variant);
}
.page-card-placeholder .material-symbols-rounded {
  font-size: 48px;
}
.page-card-footer {
  padding: var(--md-sys-spacing-sm);
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-top: 1px solid var(--md-sys-color-outline-variant);
  background-color: var(--md-sys-color-surface-container);
}
.page-card-number {
  font-weight: 500;
  font-size: var(--md-sys-typescale-body-medium);
}
.page-card-count {
  font-size: var(--md-sys-typescale-body-small);
  color: var(--md-sys-color-on-surface-variant);
}

/* web/app/styles/grave-related.css */
.grave-related-layout {
  display: grid;
  grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
  gap: 16px;
  align-items: start;
}
@media (max-width: 992px) {
  .grave-related-layout {
    grid-template-columns: 1fr;
  }
}
.grave-related-preview .figure-preview-svg {
  width: 100%;
  height: auto;
  border-radius: 8px;
}
.figure-preview-clickable {
  cursor: pointer;
}
.grave-related-goods {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.grave-related-good {
  border: 1px solid var(--md-sys-color-outline-variant);
  border-radius: 12px;
  padding: 12px 16px;
}
.grave-related-good.is-selected {
  border-color: var(--md-sys-color-primary);
  background: var(--md-sys-color-surface-container);
}
.grave-related-good-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 500;
  cursor: pointer;
}
.grave-related-good-title .material-symbols-rounded {
  font-size: 18px;
  color: var(--md-sys-color-on-surface-variant);
}
.grave-related-section-label {
  margin: 12px 0 6px;
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--md-sys-color-on-surface-variant);
}
.grave-related-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.grave-related-hint {
  margin: 4px 0 0;
  font-size: 13px;
  color: var(--md-sys-color-on-surface-variant);
}
.grave-related-none {
  font-size: 14px;
  color: var(--md-sys-color-on-surface-variant);
}
/*# sourceMappingURL=/assets/autarch.css.map */
