/*! © 2026 Marco Lorica · tutti i diritti riservati */.ab-page .ab-label{letter-spacing:.14em;text-transform:uppercase;color:var(--ml-primary-color);margin-bottom:14px;font-size:13px;font-weight:700;display:inline-block}.ab-page .ab-label--mono{font-family:var(--ab-mono);text-transform:none;letter-spacing:0;color:var(--ab-glow)}.ab-page .ab-title{letter-spacing:-.02em;color:var(--ab-ink);margin-bottom:22px;font-family:Spartan,sans-serif;font-size:clamp(28px,4.2vw,46px);font-weight:800;line-height:1.18}.ab-page .ab-xray{z-index:0;background:#f4f8f4;padding:110px 0;position:relative;overflow:hidden}.ab-page .ab-xray>.container,.ab-page .ab-git>.container{z-index:2;position:relative}.ab-page .ab-git .ml-particles--br{height:min(720px,80%);top:auto}.ab-page .ab-git .ml-particles--tr{height:min(620px,60%);bottom:auto}.ab-page .ab-xr{cursor:none;touch-action:pan-y;background:#fff;border:1px solid #dbe7db;border-radius:24px;padding:48px;position:relative;box-shadow:0 30px 80px -40px #354e4159}.ab-page .ab-lead{color:#33463a;margin-bottom:18px;font-size:20px;line-height:1.6}.ab-page .ab-text{color:#66756b;font-size:16px;line-height:1.75}.ab-page .ab-xr-json{background:var(--ab-ink);border:1px solid #9fe0a033;border-radius:16px;margin-top:8px;overflow:hidden;box-shadow:0 24px 60px -30px #0d1d138c}.ab-page .ab-json-bar{font-family:var(--ab-mono);color:#ffffff8c;background:var(--ab-ink-2);align-items:center;gap:8px;margin:0;padding:10px 18px;font-size:12px;display:flex}.ab-page .ab-json-bar i{color:var(--ab-glow)}.ab-page .ab-json-code{font-family:var(--ab-mono);color:#fff9;white-space:pre-wrap;overflow-wrap:anywhere;margin:0;padding:18px 20px 20px;font-size:13px;line-height:1.75}.ab-page .j-key{color:var(--ab-glow)}.ab-page .j-str{color:#fde68a}.ab-page .j-bool{color:#fbbf24;font-weight:700}@media (width<=991px){.ab-page .ab-xr-json{margin-top:24px}}.ab-page .ab-cards{row-gap:20px;margin-top:40px}.ab-page .ab-card{background:#f7faf7;border:1px solid #e3ece3;border-radius:16px;height:100%;padding:26px}.ab-page .ab-card i{color:#9fe0a0;background:linear-gradient(135deg,#1f4a2e,#0d1d13);border-radius:18px;place-items:center;width:62px;height:62px;margin-bottom:18px;font-size:26px;transition:transform .4s cubic-bezier(.2,.8,.3,1.4),box-shadow .4s;display:inline-grid;box-shadow:0 16px 30px -12px #0d1d13cc,inset 0 1px #9fe0a040}.ab-page .ab-card:hover i{transform:rotate(-8deg)scale(1.08);box-shadow:0 18px 34px -10px #4ade808c,inset 0 1px #9fe0a040}.ab-page .ab-card h4{color:var(--ab-ink);margin-bottom:8px;font-size:18px;font-weight:700}.ab-page .ab-card p{font-size:15px;line-height:1.6}.ab-page .ab-xr-bone{--x:50%;--y:50%;--r:0px;border-radius:inherit;pointer-events:none;background:linear-gradient(#9fe0a00f 1px, transparent 1px) 0 0 / 100% 22px, var(--ab-ink);clip-path:circle(var(--r) at var(--x) var(--y));position:absolute;inset:0;overflow:hidden}.ab-page .ab-xr-bone pre{font-family:var(--ab-mono);white-space:pre-wrap;overflow-wrap:anywhere;color:#d6e6d6;background:var(--ab-ink);margin:0;padding:8px 12px;font-size:11.5px;line-height:1.55;position:absolute;overflow:hidden}.ab-page .ab-xr-bone pre.is-measure{white-space:pre;width:max-content}.ab-page .ab-xr-bone pre:before{content:"";pointer-events:none;border:1px dashed #9fe0a040;border-radius:6px;position:absolute;inset:0}.ab-page .ab-xr-bone .x-ln{padding-left:calc(var(--d) * 2ch);display:block}.ab-page .x-tag{color:#7dd3fc}.ab-page .x-attr{color:#fca5a5}.ab-page .x-str{color:#fde68a}.ab-page .x-php{color:#c4b5fd}.ab-page .x-txt{color:#e5f3e5}.ab-page .ab-xr-lens{--x:50%;--y:50%;--r:0px;width:calc(var(--r) * 2);height:calc(var(--r) * 2);transform:translate(calc(var(--x) - var(--r)), calc(var(--y) - var(--r)));pointer-events:none;opacity:0;border-radius:50%;transition:opacity .25s;position:absolute;top:0;left:0;box-shadow:0 0 0 2px #9fe0a0e6,0 0 0 8px #5881582e,0 0 40px 6px #58815873,inset 0 0 30px #9fe0a040}.ab-page .ab-xr.is-on .ab-xr-lens{opacity:1}.ab-page .ab-xr.is-full .ab-xr-lens{opacity:0}.ab-page .ab-xr-tag{white-space:nowrap;font-family:var(--ab-mono);color:var(--ab-ink);background:var(--ab-glow);border-radius:6px;padding:3px 8px;font-size:11px;position:absolute;top:100%;left:50%;transform:translate(-50%,10px)}.ab-page .ab-xr-tag:empty{display:none}@media (width<=767px){.ab-page .ab-xray{padding:70px 0}.ab-page .ab-xr{padding:32px 20px 24px}.ab-page .ab-lead{font-size:18px}}.ab-page .ab-git,.ab-page .ab-term-area{background:radial-gradient(ellipse 50% 40% at 15% 0%, #58815838, transparent 70%), var(--ab-ink);color:#ffffffb3;padding:120px 0;position:relative}.ab-page .ab-term-area{text-align:center;background:radial-gradient(#9fe0a017 1px,#0000 1.5px) 0 0/22px 22px,radial-gradient(60% 55% at 50% 100%,#5881584d,#0000 70%),#070f0a;border-top:1px solid #9fe0a01f;padding-top:110px}.ab-page .ab-term-area .ab-git-head,.ab-page .ab-term,.ab-page .ab-term-chips{margin-left:auto;margin-right:auto}.ab-page .ab-term{text-align:left}.ab-page .ab-git .ab-title,.ab-page .ab-term-area .ab-title{color:#fff}.ab-page .ab-git-head{max-width:720px;margin-bottom:56px}.ab-page .ab-git-log{max-width:820px;position:relative}.ab-page .ab-git-graph{width:80px;height:100%;position:absolute;top:0;left:0;overflow:visible}.ab-page .ab-git-graph path{fill:none;stroke-width:3px;stroke-linecap:round}.ab-page .ab-git-graph .g-base{stroke:#ffffff14}.ab-page .ab-git-graph .g-main{stroke:var(--ab-glow);filter:drop-shadow(0 0 6px #9fe0a0b3)}.ab-page .ab-git-graph .g-branch{stroke:#fbbf24;filter:drop-shadow(0 0 6px #fbbf2499)}.ab-page .ab-commits{margin:0;padding:0;list-style:none}.ab-page .ab-commit{opacity:.28;padding:0 0 46px 76px;transition:opacity .5s,transform .5s;position:relative;transform:translate(-10px)}.ab-page .ab-commit.is-branch{padding-left:104px}.ab-page .ab-commit.is-on{opacity:1;transform:none}.ab-page .ab-node{background:var(--ab-ink);border:3px solid #fff3;border-radius:50%;width:18px;height:18px;margin-left:-9px;transition:border-color .3s,box-shadow .3s,transform .3s;position:absolute;top:4px;left:16px}.ab-page .ab-commit.is-branch .ab-node{left:50px}.ab-page .ab-commit.is-on .ab-node{border-color:var(--ab-glow);transform:scale(1.1);box-shadow:0 0 0 6px #9fe0a01f,0 0 18px #9fe0a0cc}.ab-page .ab-commit.is-branch.is-on .ab-node{border-color:#fbbf24;box-shadow:0 0 0 6px #fbbf241f,0 0 18px #fbbf24b3}.ab-page .ab-commit.is-head.is-on .ab-node{background:var(--ab-glow)}.ab-page .ab-commit-line{font-family:var(--ab-mono);flex-wrap:wrap;align-items:baseline;gap:6px 10px;margin-bottom:6px;font-size:15px;line-height:1.5;display:flex}.ab-page .ab-hash{color:#fbbf24}.ab-page .ab-msg{color:#fff;font-weight:600}.ab-page .ab-ref{color:var(--ab-ink);background:var(--ab-glow);border-radius:999px;padding:1px 8px;font-size:12px}.ab-page .ab-ref--branch{color:var(--ab-glow);background:#0d1d138c;border:1px solid #9fe0a040;border-radius:999px;align-self:center;align-items:center;gap:7px;padding:2px 10px;display:inline-flex}.ab-page .ab-ref--branch .ab-dot{width:6px;height:6px}.ab-page .ab-commit-text{color:#ffffff9e;max-width:620px;font-size:16px;line-height:1.65}@media (width<=767px){.ab-page .ab-git{padding:80px 0}.ab-page .ab-term-area{padding-top:70px}.ab-page .ab-commit{padding-left:52px}.ab-page .ab-commit.is-branch{padding-left:80px}.ab-page .ab-commit-line{font-size:14px}}.ab-page .ab-git-body{grid-template-columns:minmax(0,7fr) minmax(0,5fr);align-items:start;gap:56px;display:grid}.ab-page .ab-diff{perspective:1400px;position:sticky;top:130px}.ab-page .ab-diff-win{--rx:0deg;--ry:-8deg;transform:rotateX(var(--rx)) rotateY(var(--ry));background:#07110b;border:1px solid #9fe0a038;border-radius:14px;transition:transform .5s cubic-bezier(.2,.8,.3,1),box-shadow .6s;overflow:hidden;box-shadow:0 50px 120px -40px #000000d9,0 0 80px -24px #58815899}.ab-page .ab-diff-win.is-head{box-shadow:0 50px 120px -40px #000000d9,0 0 110px -10px #9fe0a08c}.ab-page .ab-diff-bar{background:#12261a;align-items:center;gap:8px;padding:12px 16px;display:flex}.ab-page .ab-diff-bar span{background:#ef4444;border-radius:50%;width:12px;height:12px}.ab-page .ab-diff-bar span:nth-child(2){background:#f59e0b}.ab-page .ab-diff-bar span:nth-child(3){background:#22c55e}.ab-page .ab-diff-bar b{font-family:var(--ab-mono);color:#ffffff80;margin-left:10px;font-size:12px;font-weight:400}.ab-page .ab-diff-bar i{color:#fbbf24;font-style:normal}.ab-page .ab-diff-tab{font-family:var(--ab-mono);color:var(--ab-glow);white-space:nowrap;text-overflow:ellipsis;background:#0b1a11;border-bottom:1px solid #9fe0a01f;padding:8px 16px;font-size:12px;overflow:hidden}.ab-page .ab-diff-code{min-height:290px;font-family:var(--ab-mono);color:#cfe8cf;padding:14px 0;font-size:12.5px;line-height:1.75;position:relative}.ab-page .ab-diff-code:after{content:"";pointer-events:none;background:repeating-linear-gradient(#0000 0 3px,#9fe0a006 3px 4px);position:absolute;inset:0}.ab-page .ab-diff-line{white-space:pre;animation:.45s cubic-bezier(.2,.8,.3,1) both ab-line-in;animation-delay:calc(var(--i) * 60ms);grid-template-columns:42px 18px minmax(0,1fr);padding-right:16px;display:grid}.ab-page .ab-diff-line .ln{text-align:right;color:#ffffff38;padding-right:12px}.ab-page .ab-diff-line .sg{color:#ffffff4d}.ab-page .ab-diff-line .tx{text-overflow:ellipsis;overflow:hidden}.ab-page .ab-diff-line.is-add{animation:.45s cubic-bezier(.2,.8,.3,1) both ab-line-in,.7s ease-out both ab-sweep;animation-delay:calc(var(--i) * 60ms), calc(var(--i) * 60ms + .1s);background:linear-gradient(90deg,#4ade8029,#4ade800d) 0 0/0 100% no-repeat}.ab-page .ab-diff-line.is-add .sg{color:#4ade80}.ab-page .ab-diff-line.is-del{background:#ef44441a}.ab-page .ab-diff-line.is-del .sg{color:#f87171}.ab-page .ab-diff-line.is-del .tx{color:#fca5a5;text-decoration:line-through #fca5a580}.ab-page .ab-diff-code.is-out .ab-diff-line{animation:.18s ease-in both ab-line-out}.ab-page .ab-diff .x-com{color:#cfe8cf73}@keyframes ab-line-in{0%{opacity:0;transform:translate(-12px)}}@keyframes ab-line-out{to{opacity:0;transform:translateY(-6px)}}@keyframes ab-sweep{to{background-size:100% 100%}}.ab-page .ab-diff-status{font-family:var(--ab-mono);color:#ffffff80;background:#12261a;justify-content:space-between;gap:12px;padding:8px 16px;font-size:12px;display:flex}.ab-page .ab-diff-stat .add{color:#4ade80;font-weight:400}.ab-page .ab-diff-stat .del{color:#f87171;font-weight:400}@media (width<=991px){.ab-page .ab-git-body{display:block}.ab-page .ab-diff{display:none}}@media (prefers-reduced-motion:reduce){.ab-page .ab-diff-win{transition:none}.ab-page .ab-diff-line,.ab-page .ab-diff-code.is-out .ab-diff-line{background-size:100% 100%;animation:none}}.ab-page .ab-term{background:#07110b;border:1px solid #9fe0a033;border-radius:14px;max-width:820px;overflow:hidden;box-shadow:0 40px 100px -30px #000000b3,0 0 60px -20px #58815880}.ab-page .ab-term-bar{background:#12261a;align-items:center;gap:8px;padding:12px 16px;display:flex}.ab-page .ab-term-bar span{background:#ef4444;border-radius:50%;width:12px;height:12px}.ab-page .ab-term-bar span:nth-child(2){background:#f59e0b}.ab-page .ab-term-bar span:nth-child(3){background:#22c55e}.ab-page .ab-term-bar b{font-family:var(--ab-mono);color:#ffffff80;margin-left:10px;font-size:12px;font-weight:400}.ab-page .ab-term-screen{height:360px;font-family:var(--ab-mono);color:#cfe8cf;cursor:text;padding:18px 20px;font-size:14px;line-height:1.65;overflow-y:auto}.ab-page .ab-term-out>div{white-space:pre-wrap;word-break:break-word}.ab-page .ab-term-out .t-cmd{color:#fff}.ab-page .ab-term-out .t-prompt{color:var(--ab-glow)}.ab-page .ab-term-out .t-err{color:#fca5a5}.ab-page .ab-term-out .t-dim{color:#cfe8cf8c}.ab-page .ab-term-out b{color:var(--ab-glow);font-weight:600}.ab-page .ab-term-out a{color:#fde68a;text-decoration:underline}.ab-page .ab-term-line{gap:8px;display:flex}.ab-page .ab-prompt{color:var(--ab-glow);flex:none;margin:0}.ab-page .ab-term-input{color:#fff;min-width:0;font:inherit;caret-color:var(--ab-glow);background:0 0;border:0;outline:0;flex:1;padding:0}.ab-page .ab-term-chips{flex-wrap:wrap;justify-content:center;gap:10px;max-width:820px;margin-top:18px;display:flex}.ab-page .ab-chip{font-family:var(--ab-mono);color:var(--ab-glow);cursor:pointer;background:#9fe0a00f;border:1px solid #9fe0a040;border-radius:999px;padding:6px 14px;font-size:13px;transition:background .2s,color .2s}.ab-page .ab-chip:hover{color:var(--ab-ink);background:var(--ab-glow)}.ab-page .ab-cta{margin-top:48px}.ab-page .ab-cta .btn{background:var(--ab-glow);color:var(--ab-ink);border-radius:999px;padding:14px 30px;font-weight:700}.ab-page .ab-cta .btn:hover{background:#fff}@media (width<=767px){.ab-page .ab-term-screen{height:320px;padding:14px;font-size:13px}.ab-page .ab-prompt{display:none}.ab-page .ab-term-line:before{content:"$";color:var(--ab-glow)}}@media (prefers-reduced-motion:reduce){.ab-page .ab-commit{transition:none;transform:none}}@media (width<=767px){.ab-page .ab-git .ml-particles--br{display:none}}