/* Page #15 internal story only. Exact shared frame, runtime and non-hero stories remain frozen. */
.ddos-story{flex:1;min-height:0;display:flex;align-items:center;justify-content:center}
.ddos-story svg{width:100%;height:100%;overflow:hidden}
.ddos-story .ddos-narrow{display:none}
.ddos-strand,.ddos-in-pulse,.ddos-clean-strand,.ddos-clean-pulse{fill:none;stroke-linecap:round}
.ddos-strand{stroke:var(--ingress-fill);stroke-width:.7}
.ddos-in-pulse{stroke:var(--color-primary);stroke-width:1;stroke-dasharray:7 93;animation:ddos-arrive var(--strand-time) linear infinite;animation-delay:var(--strand-delay);opacity:.6}
.ddos-arrival:nth-child(3n) .ddos-in-pulse{stroke:var(--color-text-accent);stroke-width:.6;stroke-dasharray:3 97;opacity:.4}
.ddos-surge{opacity:.75;transition:opacity var(--motion-structure) var(--motion-ease)}
.ddos-clean-strand{stroke:var(--color-text-accent);stroke-width:.7;opacity:.4}
.ddos-clean-pulse{stroke:var(--color-text-primary);stroke-width:1.05;stroke-dasharray:12 88;animation:ddos-clean 4s linear infinite;animation-delay:var(--clean-delay);opacity:.75}
.ddos-core-stop-a{stop-color:var(--color-bg-surface-2)}.ddos-core-stop-b{stop-color:var(--color-bg-page)}
.ddos-ingress-stop{stop-color:var(--color-primary)}
.ddos-core-body{stroke:var(--color-text-accent);stroke-width:1.1}
.ddos-core-facet{fill:var(--color-primary);opacity:.16}
.ddos-core-inner,.ddos-core-seam,.ddos-core-response{fill:none;stroke:var(--color-primary);stroke-width:1}
.ddos-core-inner{opacity:.7}.ddos-core-seam{opacity:.4}
.ddos-core-response{stroke:var(--color-text-accent);opacity:.18;animation:ddos-process 3s ease-in-out infinite}
.ddos-reject{fill:none;stroke:var(--color-primary);stroke-width:2;opacity:.2;transition:opacity var(--motion-structure) var(--motion-ease)}
.frame[data-phase="0"] .ddos-surge{opacity:.13}.frame[data-phase="1"] .ddos-surge{opacity:.44}
.frame[data-phase="2"] .ddos-surge,.frame[data-phase="3"] .ddos-surge{opacity:1}
.frame[data-phase="3"] .ddos-core-body{stroke:var(--color-text-primary)}
.frame[data-phase="3"] .ddos-core-facet{opacity:.3}
.frame[data-phase="3"] .ddos-reject,.frame[data-phase="4"] .ddos-reject{opacity:.85}
.frame[data-phase="5"] .ddos-surge{opacity:.6}
.frame[data-reduced=true] .ddos-surge{opacity:1}
.frame[data-reduced=true] .ddos-in-pulse,.frame[data-reduced=true] .ddos-clean-pulse{stroke-dasharray:none;opacity:.35}
.frame[data-reduced=true] .ddos-core-response{opacity:.65}
@keyframes ddos-arrive{0%{stroke-dashoffset:10;opacity:.1}18%{opacity:.65}80%{opacity:.6}100%{stroke-dashoffset:-100;opacity:0}}
@keyframes ddos-clean{to{stroke-dashoffset:-100}}
@keyframes ddos-process{50%{opacity:.65}100%{opacity:.18}}
@container(max-width:400px){.ddos-story .ddos-wide{display:none}.ddos-story .ddos-narrow{display:block}}
/* Owner-approved DDoS source / edge / service composition; shared frame unchanged. */
.ddos-visual-label{fill:var(--color-text-secondary);font-size:var(--type-animation-label)}
.ddos-source-card,.ddos-service-card{fill:var(--color-bg-surface);stroke:var(--color-border);stroke-width:1}
.ddos-source-icon{fill:none;stroke:var(--color-text-secondary);stroke-width:1;stroke-linecap:round;stroke-linejoin:round}
.ddos-source-route{fill:none;stroke:var(--color-border);stroke-width:1}
.ddos-edge-body{fill:var(--color-bg-surface-2);stroke:var(--color-border);stroke-width:1}
.ddos-edge-node{fill:var(--color-bg-surface);stroke:var(--color-text-accent);stroke-width:1}
.ddos-service-icon{fill:var(--color-bg-surface-2);stroke:var(--color-text-accent);stroke-width:1;stroke-linejoin:round}
