/*
 * Interactive diagrams (assets/js/diagrams.js; markup in
 * ops/content/diagrams/). Loaded only on pages that have one.
 *
 * Drawing style (Vince, Nov 1: polished, not textbook): soft lines in a
 * muted ink, light tinted fills, metals with a gentle sheen so lead, copper,
 * galvanized iron and brass read as materials, the accent only for what is
 * in focus. Labels are chips that light their part. Every item is still
 * labelled in words, so colour is never the only signal.
 */
.dg {
	--dg-ink: color-mix(in srgb, var(--c-text) 62%, var(--c-bg));
	--dg-faint: color-mix(in srgb, var(--c-text) 22%, var(--c-bg));
	--dg-soft: color-mix(in srgb, var(--c-text) 6%, var(--c-bg));
	--dg-soil: color-mix(in srgb, #8A6F4E 16%, var(--c-bg));
	--dg-tint: color-mix(in srgb, var(--c-accent) 16%, var(--c-bg));
	--dg-glow: color-mix(in srgb, var(--c-accent) 45%, transparent);
	--dg-ease: cubic-bezier(.2, .7, .2, 1);
	display: grid; gap: var(--s2);
}
.dg-card { background: var(--dg-soft); border-radius: 12px; padding: clamp(12px, 3vw, 24px); display: grid; gap: var(--s2); overflow: hidden; }
.dg svg { display: block; width: 100%; height: auto; overflow: visible; }
.dg figcaption { font-size: var(--fs-small); color: var(--c-muted); }
.dg-note { font-size: 0.875rem; color: var(--c-muted); }

/* Strokes and fills */
.dg .ln { fill: none; stroke: var(--dg-ink); stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.dg .ln-faint { fill: none; stroke: var(--dg-faint); stroke-width: 1.25; stroke-linecap: round; }
.dg .ln-dash { stroke-dasharray: 6 7; }
.dg .fl-bg { fill: var(--c-bg); }
.dg .fl-soft { fill: var(--dg-soft); }
.dg .fl-soil { fill: var(--dg-soil); }
.dg .fl-water { fill: color-mix(in srgb, var(--c-accent) 10%, var(--c-bg)); }
.dg .tx { fill: var(--c-text); font: 500 15px var(--font); }
.dg .tx-m { fill: var(--c-muted); font: 400 14px var(--font); }
.dg .tx-b { font-weight: 700; }

/* Parts: dim the rest, light the one in focus */
.dg-part { transition: opacity .35s var(--dg-ease), filter .35s var(--dg-ease); }
.dg-part .hl { transition: stroke .35s var(--dg-ease), fill .35s var(--dg-ease); }
.has-active .dg-part { opacity: .25; }
.has-active .dg-part.is-on { opacity: 1; filter: drop-shadow(0 0 6px var(--dg-glow)); }
.dg-part.is-on .hl { stroke: var(--c-accent); stroke-width: 2.5; }
.dg-part.is-on .hl-fill { fill: var(--dg-tint); }
.dg-part .tag { opacity: 0; transition: opacity .3s var(--dg-ease); }
.dg-part.is-on .tag { opacity: 1; }
.dg-tag-bg { fill: var(--c-accent); }
.dg-tag-tx { fill: var(--c-on-accent); font: 700 14px var(--font); }

/* Chips: the labels, as buttons that light their part */
.body .dg-chips { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.dg-chip {
	display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 6px 14px 6px 6px;
	border: 1.5px solid var(--c-border); border-radius: 999px; background: var(--c-bg); color: var(--c-text);
	font: inherit; font-size: var(--fs-small); line-height: 1.3; text-align: left; cursor: pointer;
	transition: border-color .2s ease, background-color .2s ease, transform .2s var(--dg-ease);
}
.dg-chip .n {
	flex: none; display: grid; place-items: center; width: 28px; height: 28px; border-radius: 50%;
	background: var(--dg-soft); color: var(--c-text); font-weight: 700; font-size: 0.875rem; transition: background-color .2s ease, color .2s ease;
}
.dg-chip:hover, .dg-chip.is-on, .dg-chip[aria-pressed="true"] { border-color: var(--c-accent); background: var(--dg-tint); }
.dg-chip:hover .n, .dg-chip.is-on .n, .dg-chip[aria-pressed="true"] .n { background: var(--c-accent); color: var(--c-on-accent); }
.dg-chip:active { transform: scale(.98); }
.dg:not(.is-live) .dg-chip { cursor: default; }
.dg-say { min-height: 1.6em; font-weight: 700; color: var(--c-text); }
.dg:not(.is-live) .dg-say, .dg:not(.is-live) .dg-hint { display: none; }
.dg-hint { font-size: 0.875rem; color: var(--c-muted); }

/* Numbered pins in the drawing */
.dg .pin circle { fill: var(--c-bg); stroke: var(--dg-ink); stroke-width: 1.5; transition: fill .3s ease, stroke .3s ease; }
.dg .pin text { fill: var(--c-text); font: 700 14px var(--font); text-anchor: middle; }
.dg-part.is-on .pin circle { fill: var(--c-accent); stroke: var(--c-accent); }
.dg-part.is-on .pin text { fill: var(--c-on-accent); }

/* D3: pipe tester */
.dg-tests { display: flex; flex-wrap: wrap; gap: 8px; }
.dg:not(.is-live) .dg-tests { display: none; }
.dg-test {
	min-height: 44px; padding: 0 18px; border-radius: 999px; border: 1.5px solid var(--c-border); background: var(--c-bg);
	color: var(--c-text); font: inherit; font-size: var(--fs-small); font-weight: 700; cursor: pointer;
}
.dg-test[aria-pressed="true"] { background: var(--c-accent); border-color: var(--c-accent); color: var(--c-on-accent); }
.body .dg-pipes { list-style: none; padding: 0; display: grid; gap: var(--s2); grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (min-width: 760px) { .body .dg-pipes { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.dg-pipe { background: var(--c-bg); border-radius: 10px; padding: 12px; display: grid; gap: 8px; align-content: start; font-size: var(--fs-small); }
.dg-pipe svg { aspect-ratio: 200 / 110; }
.dg-pipe-name { font-weight: 700; }
/* Each pipe's signs as labelled rows (Vince, Nov 2: structure, no heavy bold). */
.dg-pipe-facts { display: grid; gap: 6px; margin: 0; }
.dg-pipe-facts > div { display: grid; gap: 1px; padding: 5px 8px; margin: 0 -8px; border-radius: 6px; transition: background-color .3s ease; }
.dg-pipe-facts dt { font-size: 0.8125rem; color: var(--c-muted); }
.dg-pipe-facts dd { margin: 0; color: var(--c-text); line-height: 1.35; }
.dg.is-live[data-test-on] .dg-pipe-facts > div { opacity: .55; transition: opacity .3s ease, background-color .3s ease; }
.dg[data-test-on="look"] .dg-pipe-facts > [data-for="look"],
.dg[data-test-on="scratch"] .dg-pipe-facts > [data-for="scratch"],
.dg[data-test-on="magnet"] .dg-pipe-facts > [data-for="magnet"] { opacity: 1; background: var(--dg-tint); }
.dg-pipe .scratch, .dg-pipe .mag { opacity: 0; transition: opacity .3s ease; }
.dg-pipe .scratch-line { stroke-dasharray: 80; stroke-dashoffset: 80; transition: stroke-dashoffset .8s var(--dg-ease) .1s; }
.dg[data-test-on="scratch"] .dg-pipe .scratch { opacity: 1; }
.dg[data-test-on="scratch"] .dg-pipe .scratch-line { stroke-dashoffset: 0; }
.dg[data-test-on="magnet"] .dg-pipe .mag { opacity: 1; }
.dg-pipe .mag-body { transform-box: fill-box; transform-origin: center; transform: translateY(-22px); transition: transform .6s var(--dg-ease); }
.dg[data-test-on="magnet"] .dg-pipe .mag-body { transform: translateY(0); }
.dg[data-test-on="magnet"] .dg-pipe[data-magnet="no"] .mag-body { animation: dg-slip 1.4s var(--dg-ease) .5s forwards; }
@keyframes dg-slip { 0% { transform: translateY(0) rotate(0); } 30% { transform: translateY(0) rotate(0); } 100% { transform: translate(24px, 58px) rotate(96deg); opacity: .55; } }
.dg-pipe svg { overflow: hidden; }
.dg-pipe .no-test { color: var(--c-muted); font-style: normal; }
.dg:not(.is-live) .dg-pipe .scratch, .dg:not(.is-live) .dg-pipe .mag { display: none; }

/* Metals */
.dg .m-lead { fill: url(#dg-lead); }
.dg .m-copper { fill: url(#dg-copper); }
.dg .m-galv { fill: url(#dg-galv); }
.dg .m-brass { fill: url(#dg-brass); }
.dg .shine { stroke: #FFFFFF; stroke-width: 3; stroke-linecap: round; opacity: .9; }
.dg .shine-cu { stroke: #FBD9B6; stroke-width: 3; stroke-linecap: round; }
.dg .dull { stroke: #6E767D; stroke-width: 3; stroke-linecap: round; }

/* D4: scratch slider and magnet try */
.dg-try { display: grid; gap: var(--s2); grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.dg-try-item { background: var(--c-bg); border-radius: 10px; padding: 14px; display: grid; gap: 10px; align-content: start; }
.dg-try-label { font-weight: 700; font-size: var(--fs-small); }
.dg-range { width: 100%; accent-color: var(--c-accent); min-height: 32px; cursor: grab; }
.dg-range:active { cursor: grabbing; }
.dg:not(.is-live) .dg-range, .dg:not(.is-live) [data-dg-try-btn], .dg:not(.is-live) label.dg-hint { display: none; }
[data-dg-scrub] .scrub-line { stroke-dasharray: 100; stroke-dashoffset: calc(100 - var(--scrub, 1) * 100); }
.dg:not(.is-live) [data-dg-scrub] .scrub-line { stroke-dashoffset: 0; }
[data-dg-scrub] .key { transform: translateX(calc(var(--scrub, 1) * 92px)); }
[data-dg-scrub].is-done .scrub-result { opacity: 1; }
.scrub-result { opacity: 0; transition: opacity .3s ease; }
.dg:not(.is-live) .scrub-result { opacity: 1; }
.dg-btn {
	justify-self: start; min-height: 44px; padding: 0 18px; border-radius: 999px; border: 1.5px solid var(--c-accent);
	background: var(--c-bg); color: var(--c-accent); font: inherit; font-size: var(--fs-small); font-weight: 700; cursor: pointer;
}
.dg-btn:hover { background: var(--dg-tint); }
.dg-btn[aria-pressed="true"] { background: var(--c-accent); color: var(--c-on-accent); }
[data-dg-try] .mag-body { transform-box: view-box; transform: translateY(-34px); }
[data-dg-try].is-trying .mag-body { animation: dg-try-mag 1.6s var(--dg-ease) forwards; }
@keyframes dg-try-mag {
	0% { transform: translateY(-34px); opacity: 1; }
	30% { transform: translateY(0); }
	50% { transform: translateY(0) rotate(0); }
	80% { transform: translate(18px, 96px) rotate(30deg); opacity: 0; }
	81% { transform: translateY(-34px); opacity: 0; }
	100% { transform: translateY(-34px); opacity: 1; }
}
[data-dg-try] svg { overflow: hidden; }
[data-dg-try] .try-result { opacity: 0; transition: opacity .3s ease; }
[data-dg-try].is-tried .try-result, .dg:not(.is-live) [data-dg-try] .try-result { opacity: 1; }

/* D5: lab report */
.dg-report { background: var(--c-bg); border-radius: 10px; box-shadow: 0 1px 0 var(--c-border), 0 10px 30px -18px color-mix(in srgb, var(--c-text) 40%, transparent); overflow: hidden; font-size: var(--fs-small); }
.dg-report-banner { background: repeating-linear-gradient(-45deg, var(--dg-soft) 0 10px, var(--c-bg) 10px 20px); border-bottom: 1px solid var(--c-border); padding: 8px 16px; font-weight: 700; }
.dg-report-body { padding: 16px; display: grid; gap: 14px; }
.dg-report .field { border-radius: 6px; padding: 2px 6px; margin: -2px -6px; transition: background-color .3s ease, box-shadow .3s ease, opacity .3s ease; }
.dg-report.has-active .field, .has-active .dg-report .field { opacity: .4; }
.has-active .dg-report .field.is-on { opacity: 1; background: var(--dg-tint); box-shadow: inset 0 0 0 1.5px var(--c-accent); }
.dg-report table { font-size: var(--fs-small); }
.dg-report td, .dg-report th { padding: 8px 12px 8px 0; }
.dg-report .val { font-variant-numeric: tabular-nums; }

/* D6: result on the scale */
.dg-scale-track { position: relative; height: 112px; margin: 34px 6px 0; }
.dg-scale-line { position: absolute; left: 0; right: 0; top: 62px; height: 4px; border-radius: 2px; background: var(--dg-faint); }
/* From 5 up the line takes the warning colour (Content, Nov 2: no red, no
   green; urgency is in the readout's words and action, not colour alone). */
.dg-scale-band { position: absolute; top: 58px; height: 12px; border-radius: 3px; background: var(--c-warn-edge); }
.dg-scale-say { display: grid; gap: 6px; padding: 10px 14px; border-radius: var(--radius); background: var(--c-surface); min-height: 1.6em; }
.dg-scale-say p { margin: 0; }
.dg-scale[data-zone="between"] .dg-scale-say,
.dg-scale[data-zone="above"] .dg-scale-say { background: var(--c-warn-bg); color: var(--c-warn-text); border-left: 6px solid var(--c-warn-edge); border-radius: 0 var(--radius) var(--radius) 0; }
.dg-scale-say a { color: inherit; }
.dg-scale[data-zone="between"] .dg-scale-you,
.dg-scale[data-zone="above"] .dg-scale-you { background: var(--c-warn-edge); }
.dg-scale-tick { position: absolute; top: 56px; width: 2px; height: 16px; background: var(--dg-ink); transform: translateX(-1px); }
.dg-scale-num { position: absolute; top: 80px; transform: translateX(-50%); font-variant-numeric: tabular-nums; font-size: var(--fs-small); color: var(--c-muted); }
.dg-scale-mark { position: absolute; top: 18px; height: 48px; width: 3px; background: var(--c-accent); transform: translateX(-1.5px); border-radius: 2px; }
.dg-scale-mark span { position: absolute; bottom: calc(100% + 4px); white-space: nowrap; font-size: var(--fs-small); font-weight: 700; transform: translateX(-50%); }
.dg-scale-mark.end span { transform: translateX(-100%); }
.dg-scale-you { position: absolute; top: 52px; left: calc(var(--at, 0) * 100%); width: 24px; height: 24px; margin-left: -12px; border-radius: 50%; background: var(--c-text); box-shadow: 0 0 0 4px var(--c-bg), 0 0 0 6px var(--c-text); transition: left .15s ease-out; }
.dg:not(.is-live) .dg-scale-you, .dg:not(.is-live) .dg-scale-try { display: none; }
.dg-scale-try { display: grid; gap: 6px; }
.dg-scale-try label { font-weight: 700; font-size: var(--fs-small); }
.dg-axis { text-align: center; font-size: var(--fs-small); color: var(--c-muted); }
@media (max-width: 520px) {
	.dg-scale-track { margin-top: 60px; }
	.dg-scale-mark span { font-size: 0.875rem; line-height: 1.2; }
	/* Health Canada label wraps beside its own line so it never crosses Ontario's. */
	.dg-scale-mark.mid span { white-space: normal; width: 7.2em; transform: translateX(6px); text-align: left; }
	.dg-scale-mark.end { top: -26px !important; height: 92px !important; }
}
@media (max-width: 560px) { .dg .tx-m { font-size: 24px; } .dg .pin text { font-size: 18px; } .dg .pin circle { r: 19px; } }

/* D7: filter box (a gentle tilt answers the pointer) */
.dg-box-stage { perspective: 900px; }
.dg-box-stage svg { transition: transform .4s var(--dg-ease); transform: rotateY(var(--ry, -8deg)) rotateX(var(--rx, 4deg)); }

/* D8: replacement steps */
.body .dg-steps { list-style: none; padding: 0; display: grid; gap: 4px; position: relative; }
.dg-steps::before { content: ""; position: absolute; left: 21px; top: 22px; bottom: 22px; width: 4px; border-radius: 2px; background: var(--dg-faint); }
.dg-steps::after { content: ""; position: absolute; left: 21px; top: 22px; width: 4px; border-radius: 2px; background: var(--c-accent); height: calc((100% - 44px) * var(--fill, 0)); transition: height .4s var(--dg-ease), width .4s var(--dg-ease); }
.dg-step {
	position: relative; z-index: 1; display: grid; grid-template-columns: 46px 1fr; gap: 12px; align-items: center; width: 100%;
	min-height: 52px; padding: 4px 8px 4px 0; border: 0; border-radius: 10px; background: none; color: var(--c-text);
	font: inherit; font-size: var(--fs-small); text-align: left; cursor: pointer;
}
.dg-step .n {
	display: grid; place-items: center; width: 46px; height: 46px; border-radius: 50%; border: 2px solid var(--dg-faint);
	background: var(--c-bg); font-weight: 700; transition: background-color .25s ease, border-color .25s ease, color .25s ease, transform .25s var(--dg-ease);
}
.dg-step.is-past .n, .dg-step.is-on .n { background: var(--c-accent); border-color: var(--c-accent); color: var(--c-on-accent); }
.dg-step.is-on .n { transform: scale(1.08); box-shadow: 0 0 0 6px var(--dg-tint); }
.dg-step.is-on { font-weight: 700; }
.dg-step-city { font-size: 0.875rem; color: var(--c-muted); font-weight: 400; display: block; }
.dg-steps-bracket { font-size: var(--fs-small); font-weight: 700; padding: 8px 12px; border-radius: 8px; background: var(--c-bg); justify-self: start; transition: background-color .3s ease, color .3s ease; }
[data-at="5"] .dg-steps-bracket, [data-at="6"] .dg-steps-bracket { background: var(--c-accent); color: var(--c-on-accent); }
@media (min-width: 760px) {
	.body .dg-steps { grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 8px; }
	.dg-steps::before, .dg-steps::after { left: 23px; right: auto; top: 21px; bottom: auto; height: 4px; width: calc(100% - 100% / 6); }
	.dg-steps::after { width: calc((100% - 100% / 6) * var(--fill, 0)); }
	.dg-step { grid-template-columns: 1fr; align-items: start; align-content: start; padding: 0 4px 0 0; }
	.dg-steps-bracket { justify-self: end; width: calc(100% / 3 - 8px); text-align: left; }
}

/* D10: hardness map */
.dg-map .city { cursor: pointer; transition: opacity .3s var(--dg-ease); }
.dg-map .city circle.dot { fill: var(--c-accent); stroke: var(--c-bg); stroke-width: 2; transition: r .3s var(--dg-ease); }
.dg-map .city circle.halo { fill: var(--dg-tint); opacity: 0; transition: opacity .3s ease; }
.dg-map .city text { fill: var(--c-text); font: 400 17px var(--font); }
.dg-map .city .name { font-weight: 700; }
.dg-map.has-active .city { opacity: .3; }
.dg-map.has-active .city.is-on { opacity: 1; }
.dg-map .city.is-on circle.halo { opacity: 1; }
.dg-map .city.is-on circle.dot { r: 9px; }
.dg-map .city:focus { outline: none; }
.dg-map .city:focus-visible circle.halo { opacity: 1; stroke: var(--c-accent); stroke-width: 2; }
.map-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.map-scroll svg { min-width: 600px; direction: ltr; }
@media (max-width: 640px) { .map-scroll { direction: rtl; } }
.map-hint { display: none; font-size: var(--fs-small); color: var(--c-muted); }
@media (max-width: 640px) { .map-hint { display: block; } }
.dg-map .map-water { fill: color-mix(in srgb, var(--c-accent) 10%, var(--c-bg)); }
.dg-map .map-coast { fill: none; stroke: var(--dg-ink); stroke-width: 1.75; stroke-linejoin: round; stroke-linecap: round; }
.dg-map .map-border { fill: none; stroke: var(--dg-faint); stroke-width: 1.5; stroke-dasharray: 3 6; }
.dg-map .map-place { fill: var(--c-muted); font: 400 16px var(--font); letter-spacing: .02em; }
.dg-map .map-arrow { fill: none; stroke: var(--c-accent); stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
.dg-map .map-note { fill: var(--c-muted); font-size: 15px; }

@media (prefers-reduced-motion: reduce) {
	.dg *, .dg *::before, .dg *::after { transition: none !important; animation: none !important; }
	.dg[data-test-on="magnet"] .dg-pipe[data-magnet="no"] .mag-body { transform: translate(24px, 58px) rotate(96deg); opacity: .55; }
	[data-dg-try].is-trying .mag-body { transform: translateY(-34px); }
	.dg-box-stage svg { transform: none; }
}

