/* RMCflow Room Planner architectural drawing palette and SVG styles. */
#pb-iso { --blue: #2f3a52; --accent-brass: var(--accent); --font-semibold: 600; --font-bold: 700; background: radial-gradient(circle at 48% 42%, #f8f5ef 0%, #eee8de 50%, #ddd4c6 100%); }
#pb-iso { touch-action: none; width: 100%; height: 100%; }
#pb-iso polygon, #pb-iso path, #pb-iso line { shape-rendering: geometricPrecision; }
#pb-iso .iso-room-shadow { fill: #46392d; fill-opacity: 0.2; }
#pb-iso .iso-wall { stroke: #978d7e; stroke-opacity: 0.72; stroke-width: 0.9; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-wall-cap { fill: #f0eadf; stroke: #9f927d; stroke-opacity: 0.72; stroke-width: 0.85; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-crown-molding { fill: #fbf7ef; stroke: #a99e8d; stroke-opacity: 0.72; stroke-width: 0.75; vector-effect: non-scaling-stroke; }
#pb-iso .iso-pad { fill: #d6d1c7; stroke: #aaa296; stroke-opacity: 0.68; stroke-width: 0.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-pad-edge { fill: #bbb5aa; stroke: #958e82; stroke-opacity: 0.62; stroke-width: 0.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-ground-shadow { fill: #3c3226; fill-opacity: 0.2; }
#pb-iso .iso-front-walls { pointer-events: none; }
#pb-iso .iso-stub-front { fill: #756f64; stroke: #504b44; stroke-opacity: 0.62; stroke-width: 0.7; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-stub-side { fill: #625d54; stroke: #46423c; stroke-opacity: 0.62; stroke-width: 0.7; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-stub-cap { fill: #eee8dc; stroke: #958b7c; stroke-opacity: 0.72; stroke-width: 0.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-window-glass { stroke: #8296a0; stroke-opacity: 0.7; stroke-width: 0.75; vector-effect: non-scaling-stroke; }
#pb-iso .iso-window-glow { fill: #fff5d8; fill-opacity: 0.34; pointer-events: none; }
#pb-iso .iso-wall-ambient-occlusion, #pb-iso .iso-floor-ambient-occlusion { pointer-events: none; }
#pb-iso .iso-window-frame { fill: #fbf8f1; stroke: #a99e8d; stroke-opacity: 0.82; stroke-width: 0.8; vector-effect: non-scaling-stroke; }
#pb-iso .iso-window-mullions line { stroke: #4a453d; stroke-width: 1.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-window-sill-top { fill: #f7f4ee; stroke: #c6bcaa; stroke-width: 0.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-window-sill-front { fill: #e2dbcb; stroke: #c6bcaa; stroke-width: 0.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-door-frame { fill: #f2eee6; stroke: #c4baa8; stroke-width: 0.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-floor-grain { opacity: 0.72; }
#pb-iso .iso-planks line { stroke: #8d6d4c; stroke-opacity: 0.22; stroke-width: 0.6; vector-effect: non-scaling-stroke; }
#pb-iso .iso-floor-outline { fill: none; stroke: #746652; stroke-opacity: 0.32; stroke-width: 0.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-skirting { fill: #f6f2ea; stroke: #cfc6b6; stroke-width: 0.6; vector-effect: non-scaling-stroke; }
#pb-iso .iso-door-leaf-face { fill: #96714f; stroke: #6a4f37; stroke-width: 0.8; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-door-panel { fill: #8d6848; stroke: #6a4f37; stroke-width: 0.6; vector-effect: non-scaling-stroke; }
#pb-iso .iso-door-handle { fill: var(--accent-brass); stroke: #6a4f37; stroke-width: 0.5; vector-effect: non-scaling-stroke; }
/* Editable doors. Same hit-target trick as .iso-item: the wall is CUT at the
   opening, so a bare <g> would only respond over the painted leaf. */
#pb-iso .iso-door.editable { cursor: grab; outline: none; }
#pb-iso .iso-door .iso-hit-target { fill: none; stroke: none; pointer-events: fill; }
#pb-iso .iso-door.editable:hover .iso-door-leaf-face { filter: brightness(1.08); }
#pb-iso .iso-door.selected .iso-door-leaf-face,
#pb-iso .iso-door:focus-visible .iso-door-leaf-face { stroke: var(--primary); stroke-width: 2.2; }

/* Editable windows. Same contract as .iso-door above — the two kinds are one
   openings array and 2D already treats them identically. The glow is
   pointer-events:none, so the glass, frame and sill are what pick; the glass is
   a filled polygon spanning the whole aperture, which is why no separate
   hit-target is needed here (unlike a door, whose leaf leaves gaps). */
#pb-iso .iso-window.editable { cursor: grab; outline: none; }
#pb-iso .iso-window.editable:hover .iso-window-glass { filter: brightness(1.06); }
#pb-iso .iso-window.selected .iso-window-frame,
#pb-iso .iso-window:focus-visible .iso-window-frame { stroke: var(--primary); stroke-width: 2.2; }
#pb-iso .iso-window.selected .iso-window-glass,
#pb-iso .iso-window:focus-visible .iso-window-glass { stroke: var(--primary); stroke-opacity: 1; stroke-width: 1.6; }
/* A door on a section-cut wall: the stub is notched away, so the opening reads
   on the floor. The threshold is the pick target; the arc is decoration and
   must not steal clicks from the furniture it sweeps over. */
/* Floor plane, drawn for EVERY door on every wall. Decoration only: the arc
   sweeps over floor that furniture legitimately occupies, so it must never
   steal a click from the item underneath it. */
#pb-iso .iso-door-floor { pointer-events: none; }
#pb-iso .iso-door-threshold { fill: #efe7d8; stroke: #a1937c; stroke-width: 0.8; vector-effect: non-scaling-stroke; }
#pb-iso .iso-door-swing { fill: none; stroke: #6a4f37; stroke-opacity: 0.5; stroke-dasharray: 4 3; stroke-width: 1; vector-effect: non-scaling-stroke; }
#pb-iso .iso-door-floor-marks.selected .iso-door-threshold { fill: var(--primary-bg); stroke: var(--primary); stroke-width: 1.6; }
#pb-iso .iso-door-floor-marks.selected .iso-door-swing { stroke: var(--primary); stroke-opacity: 1; stroke-dasharray: none; }

/* The dashed profile of whatever the section plane removed — the standard
   "continues above the cut" convention. Empty on a full-height wall, so those
   doors look exactly as they always have. */
#pb-iso .iso-door-ghost {
  fill: none;
  stroke: #6a4f37;
  stroke-opacity: 0.45;
  stroke-dasharray: 5 4;
  stroke-width: 1.1;
  vector-effect: non-scaling-stroke;
  stroke-linejoin: round;
  pointer-events: none;
}
#pb-iso .iso-door.selected .iso-door-ghost { stroke: var(--primary); stroke-opacity: 0.9; }
#pb-iso .iso-dim { fill: #615b53; opacity: 0.88; font-size: 12px; font-weight: var(--font-semibold); letter-spacing: 0.07em; paint-order: stroke; stroke: rgba(248, 245, 239, 0.78); stroke-width: 2px; }
#pb-iso .iso-dimline line { stroke: var(--blue); stroke-opacity: 0.68; stroke-width: 0.9; vector-effect: non-scaling-stroke; }
#pb-iso .iso-dimline .iso-dim-tick { stroke-opacity: 0.8; stroke-width: 1.2; }
/* Caption keeps clear of the ~150px zoom toolbar anchored at the other corner. */
#pb-iso .iso-caption { position: absolute; bottom: 14px; inset-inline-start: 16px; display: flex; max-width: calc(100% - 190px); flex-direction: column; gap: 1px; color: #5d564b; z-index: 3; pointer-events: none; }
#pb-iso .iso-caption strong { border-bottom: 1.5px solid rgba(90, 90, 94, 0.75); padding-bottom: 2px; font-family: var(--font-display); font-size: var(--text-sm); font-weight: var(--font-semibold); letter-spacing: 0.1em; text-transform: uppercase; }
#pb-iso .iso-caption span { margin-top: 3px; font-size: var(--text-2xs); font-weight: var(--font-semibold); letter-spacing: 0.07em; text-transform: uppercase; opacity: 0.75; }
#pb-iso .iso-shadows polygon { fill: #3b3026; fill-opacity: 0.09; }
#pb-iso .iso-contact-shadows polygon { fill: #2d251e; fill-opacity: 0.2; }
#pb-iso .iso-item { cursor: pointer; transition: filter 0.16s ease; }
#pb-iso .iso-item:hover { filter: brightness(1.025); }
/* An SVG <g> only hit-tests through PAINTED children, so a multi-part volume
   is dead to the pointer in its own gaps (between table legs). IsometricView
   renders this invisible silhouette polygon inside each item group to fill
   them: fill:none paints nothing; pointer-events:fill makes the interior
   respond anyway. */
#pb-iso .iso-item .iso-hit-target { fill: none; stroke: none; pointer-events: fill; }
#pb-iso .iso-item .iso-face { stroke: var(--iso-edge); stroke-opacity: 0.3; stroke-width: 0.65; vector-effect: non-scaling-stroke; stroke-linejoin: round; }
#pb-iso .iso-item .iso-face-soft-top { stroke: #fff; stroke-opacity: 0.34; stroke-width: 0.55; }
#pb-iso .iso-item .iso-seams line { stroke-opacity: 0.42; stroke-width: 0.7; vector-effect: non-scaling-stroke; }
#pb-iso .iso-item-label { fill: #1e1f28; font-size: var(--text-3xs); font-weight: var(--font-bold); letter-spacing: 0.035em; paint-order: stroke; pointer-events: none; stroke: rgba(249, 249, 245, 0.92); stroke-linejoin: round; stroke-width: 3px; }
#pb-iso .iso-item.selected .iso-face, #pb-iso .iso-item.selected .iso-mirror-glass { stroke: var(--primary); stroke-opacity: 1; stroke-width: 1.4; }
#pb-iso .iso-item.colliding .iso-face, #pb-iso .iso-item.colliding .iso-mirror-glass { stroke: var(--red); stroke-opacity: 1; stroke-width: 2; stroke-dasharray: 5 3; }
#pb-iso .iso-item:focus-visible .iso-face, #pb-iso .iso-item:focus-visible .iso-mirror-glass { stroke: var(--primary); stroke-opacity: 1; }
/* Clearance verdict in 3D — the amber dashed outline and `!` badge that the 2D
   canvas has always drawn. Same tokens as .placed-item.accessibility-error and
   .dimension-label.access-warning, so one item reads identically in both views. */
#pb-iso .iso-item.accessibility-error .iso-face, #pb-iso .iso-item.accessibility-error .iso-mirror-glass { stroke: var(--yellow); stroke-opacity: 1; stroke-width: 2; stroke-dasharray: 4 3; }
#pb-iso .iso-access-warning { pointer-events: none; }
#pb-iso .iso-access-warning circle { fill: var(--yellow-bg); stroke: var(--yellow); stroke-width: 1.4; vector-effect: non-scaling-stroke; }
#pb-iso .iso-access-warning text { fill: var(--yellow); font-size: var(--text-3xs); font-weight: var(--font-bold); }
#pb-iso .iso-footprint-hint { fill: var(--primary-bg); fill-opacity: 0.55; stroke: var(--primary); stroke-width: 1.1; stroke-dasharray: 4 4; vector-effect: non-scaling-stroke; }
#pb-iso .iso-mirror-glass { stroke-width: 2.2; vector-effect: non-scaling-stroke; }
