/* Animated visuals and fact lists used inside blog posts (classes phpv-*). One copy for every post. Source of the markup: BLOGS/post_components.py.
   Animations run only when the Chapters script adds html.pc-js / the 'in' class, and are off with prefers-reduced-motion. */
.phpv-box{margin:26px 0;padding:22px;border:1px solid rgba(255,255,255,.12);border-radius:16px;background:rgba(147,114,255,.06)}
.phpv-t{margin:0 0 16px;font:600 .8rem/1 var(--mono,ui-monospace,monospace);letter-spacing:.12em;text-transform:uppercase;color:#b79cff}
.phpv-facts{display:grid;grid-template-columns:150px 1fr;margin:22px 0;border-top:1px solid rgba(255,255,255,.14)}
.phpv-facts .k,.phpv-facts .v{padding:12px 6px;border-bottom:1px solid rgba(255,255,255,.1);line-height:1.5}
.phpv-facts .k{color:#b79cff;font-weight:600;font-size:.9rem}
.phpv-facts code{font-size:.85em;padding:2px 7px;margin-right:6px;border-radius:6px;background:rgba(147,114,255,.14);border:1px solid rgba(147,114,255,.35);white-space:nowrap}
.phpv-url{font:500 .95rem/2 var(--mono,ui-monospace,monospace);word-break:break-all}
.phpv-url .seg{display:inline-block;padding:1px 9px;margin:2px 4px 2px 0;border-radius:8px;background:rgba(147,114,255,.16);border:1px solid rgba(147,114,255,.55);color:#fff}
.phpv-url .seg.b{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.22)}
.phpv-legend{display:grid;gap:8px;margin-top:16px;font-size:.92rem;line-height:1.45}
.phpv-legend b{color:#b79cff;font-family:var(--mono,ui-monospace,monospace);font-weight:600;margin-right:6px}
.phpv-cmp{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.phpv-cmp .col{padding:14px;border:1px solid rgba(255,255,255,.14);border-radius:12px;background:rgba(255,255,255,.03)}
.phpv-cmp .col.good{border-color:rgba(147,114,255,.7);background:rgba(147,114,255,.12)}
.phpv-cmp h4{margin:0 0 10px;font-size:.9rem;color:#fff}
.phpv-cmp .rw{display:flex;justify-content:space-between;gap:10px;padding:7px 0;border-top:1px solid rgba(255,255,255,.1);font-size:.92rem}
.phpv-cmp .rw code{font-size:.85em}
.phpv-cmp .rw span{color:#a8a8b8}
.phpv-cmp .tot{margin-top:8px;color:#b79cff;font-size:.88rem}
.phpv-rules{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin:22px 0}
.phpv-rules .rl{padding:16px;border:1px solid rgba(255,255,255,.14);border-radius:14px;background:rgba(255,255,255,.03)}
.phpv-rules .rl:last-child:nth-child(odd){grid-column:1/-1}
.phpv-rules .n{font:700 1.7rem/1 var(--head,system-ui,sans-serif);color:#9372ff}
.phpv-rules h4{margin:8px 0 8px;font-size:1.02rem;color:#fff}
.phpv-rules p{margin:0 0 8px;font-size:.92rem;line-height:1.45}
.phpv-rules .bad,.phpv-rules .good{display:block;font:.82rem/1.5 var(--mono,ui-monospace,monospace);padding:4px 8px;border-radius:6px;margin-top:4px;word-break:break-all}
.phpv-rules .bad{background:rgba(255,255,255,.05);color:#a8a8b8;text-decoration:line-through}
.phpv-rules .good{background:rgba(147,114,255,.16);border:1px solid rgba(147,114,255,.5);color:#fff}
.phpv-g{display:flex;align-items:center;gap:22px;flex-wrap:wrap}
.phpv-g svg{width:132px;height:132px;flex:none}
.phpv-g .trk{fill:none;stroke:rgba(255,255,255,.12);stroke-width:10}
.phpv-g .val{fill:none;stroke:#9372ff;stroke-width:10;stroke-linecap:round;stroke-dasharray:314.16;transform:rotate(-90deg);transform-origin:60px 60px;stroke-dashoffset:var(--phpv-end,25.13)}
.phpv-g text{fill:#fff;font:700 30px/1 var(--head,system-ui,sans-serif);text-anchor:middle}
.phpv-g text.s{font:500 10px/1 system-ui,sans-serif;fill:#a8a8b8}
.phpv-g p{margin:0;flex:1;min-width:200px}
.phpv-tl{list-style:none;margin:0;padding:0;display:flex;gap:0;position:relative}
.phpv-tl::before{content:"";position:absolute;left:8px;right:12%;top:11px;height:2px;background:rgba(255,255,255,.14)}
.phpv-tl::after{content:"";position:absolute;left:8px;right:12%;top:11px;height:2px;background:#9372ff;transform-origin:left}
.phpv-tl li{flex:1;position:relative;padding:34px 12px 0 0;text-align:left;font-size:.92rem;line-height:1.4}
.phpv-tl li::before{content:"";position:absolute;left:0;top:4px;width:16px;height:16px;border-radius:50%;background:#9372ff;box-shadow:0 0 0 5px rgba(147,114,255,.22)}
.phpv-tl b{display:block;margin-bottom:4px;color:#fff}
.phpv-f{display:grid;grid-template-columns:1fr auto 1fr;gap:12px;align-items:center}
.phpv-f .bx{padding:14px 16px;border:1px solid rgba(255,255,255,.14);border-radius:12px;background:rgba(255,255,255,.04);font-size:.92rem;line-height:1.4}
.phpv-f .bx b{display:block;color:#fff;margin-bottom:3px}
.phpv-f .bad{border-color:rgba(147,114,255,.7);background:rgba(147,114,255,.12)}
.phpv-f .ar{color:#b79cff;font-size:1.4rem}
.phpv-f .col{display:grid;gap:12px}
@media(max-width:640px){.phpv-facts{grid-template-columns:1fr}.phpv-facts .k{border-bottom:0;padding-bottom:0}.phpv-facts .v{padding-top:3px}
.phpv-cmp{grid-template-columns:1fr}
.phpv-tl{flex-direction:column;gap:16px}.phpv-tl::before,.phpv-tl::after{left:7px;right:auto;top:6px;bottom:6px;width:2px;height:auto;transform-origin:top}.phpv-tl li{text-align:left;padding:0 0 0 34px}.phpv-tl li::before{left:0;top:2px}
.phpv-f{grid-template-columns:1fr}.phpv-f .ar{transform:rotate(90deg);justify-self:center}}
@media(prefers-reduced-motion:no-preference){
html.pc-js .phpv-url .seg,html.pc-js .phpv-legend div,html.pc-js .phpv-cmp .rw,html.pc-js .phpv-rules .rl,html.pc-js .phpv-tl li,html.pc-js .phpv-f .bx,html.pc-js .phpv-f .ar{opacity:0;transform:translateY(10px)}
html.pc-js .bs.in .phpv-url .seg,html.pc-js .bs.in .phpv-legend div,html.pc-js .bs.in .phpv-cmp .rw,html.pc-js .bs.in .phpv-rules .rl,html.pc-js .bs.in .phpv-tl li,html.pc-js .bs.in .phpv-f .bx,html.pc-js .bs.in .phpv-f .ar{animation:phpv-pop .55s ease forwards}
html.pc-js .bs.in .phpv-url .seg:nth-child(1){animation-delay:.15s}html.pc-js .bs.in .phpv-url .seg:nth-child(2){animation-delay:.5s}html.pc-js .bs.in .phpv-url .seg:nth-child(3){animation-delay:.85s}html.pc-js .bs.in .phpv-url .seg:nth-child(4){animation-delay:1.2s}html.pc-js .bs.in .phpv-url .seg:nth-child(5){animation-delay:1.55s}
html.pc-js .bs.in .phpv-legend div:nth-child(1){animation-delay:.6s}html.pc-js .bs.in .phpv-legend div:nth-child(2){animation-delay:1s}html.pc-js .bs.in .phpv-legend div:nth-child(3){animation-delay:1.4s}html.pc-js .bs.in .phpv-legend div:nth-child(4){animation-delay:1.8s}
html.pc-js .bs.in .phpv-cmp .bad .rw:nth-of-type(1){animation-delay:.2s}html.pc-js .bs.in .phpv-cmp .bad .rw:nth-of-type(2){animation-delay:.45s}html.pc-js .bs.in .phpv-cmp .bad .rw:nth-of-type(3){animation-delay:.7s}html.pc-js .bs.in .phpv-cmp .bad .rw:nth-of-type(4){animation-delay:.95s}html.pc-js .bs.in .phpv-cmp .bad .rw:nth-of-type(5){animation-delay:1.2s}html.pc-js .bs.in .phpv-cmp .good .rw{animation-delay:1.7s}
html.pc-js .bs.in .phpv-rules .rl:nth-child(1){animation-delay:.1s}html.pc-js .bs.in .phpv-rules .rl:nth-child(2){animation-delay:.3s}html.pc-js .bs.in .phpv-rules .rl:nth-child(3){animation-delay:.5s}html.pc-js .bs.in .phpv-rules .rl:nth-child(4){animation-delay:.7s}html.pc-js .bs.in .phpv-rules .rl:nth-child(5){animation-delay:.9s}
html.pc-js .phpv-g .val{stroke-dashoffset:314.16}html.pc-js .phpv-g text{opacity:0}
html.pc-js .bs.in .phpv-g .val{animation:phpv-fill 1.5s .25s cubic-bezier(.2,.7,.2,1) forwards}html.pc-js .bs.in .phpv-g text{animation:phpv-fade .6s 1.2s ease forwards}
html.pc-js .phpv-tl::after{transform:scaleX(0)}html.pc-js .bs.in .phpv-tl::after{animation:phpv-grow 1.6s .2s ease forwards}
html.pc-js .bs.in .phpv-tl li:nth-child(1){animation-delay:.3s}html.pc-js .bs.in .phpv-tl li:nth-child(2){animation-delay:.9s}html.pc-js .bs.in .phpv-tl li:nth-child(3){animation-delay:1.5s}
html.pc-js .bs.in .phpv-f > .ar{animation-delay:.6s}
html.pc-js .bs.in .phpv-f .ar{animation-name:phpv-pop,phpv-nudge;animation-duration:.6s,1.6s;animation-delay:.6s,1.4s;animation-iteration-count:1,infinite}
html.pc-js .bs.in .phpv-f > .bx:first-child{animation-delay:.2s}html.pc-js .bs.in .phpv-f .col .bx:nth-child(1){animation-delay:1s}html.pc-js .bs.in .phpv-f .col .bx:nth-child(2){animation-delay:1.4s}
}
@keyframes phpv-fill{to{stroke-dashoffset:var(--phpv-end,25.13)}}
@keyframes phpv-fade{to{opacity:1}}
@keyframes phpv-grow{to{transform:scaleX(1)}}
@keyframes phpv-pop{to{opacity:1;transform:none}}
@keyframes phpv-nudge{0%,100%{translate:0 0}50%{translate:6px 0}}
