A packet leaves the sandbox for registry.npmjs.org and bounces off a red shield: not on the allowlist. Allow domain presses, the shield turns green and the packet sails through to the globe.
Also known as: network allowlist blocked, sandbox network request denied, allow domain prompt.
npm install zod needs the networkregistry.npmjs.org is not on the allowlistAdded to the allowlist for this session
<div class="aia-sandbox-blocked-request" role="status" aria-label="Sandbox blocked a request to registry.npmjs.org">
<div class="aia-sandbox-blocked-request-map" aria-hidden="true">
<span class="aia-sandbox-blocked-request-node"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.5 7.8 12 3.5 3.5 7.8v8.4l8.5 4.3 8.5-4.3z"/><path d="M3.5 7.8 12 12l8.5-4.2M12 12v8.5"/></svg><em>sandbox</em></span>
<span class="aia-sandbox-blocked-request-track">
<i class="aia-sandbox-blocked-request-packet"></i>
<b class="aia-sandbox-blocked-request-wall"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3.2 5 6v5.6c0 4.3 2.9 7.6 7 9.2 4.1-1.6 7-4.9 7-9.2V6z"/></svg></b>
</span>
<span class="aia-sandbox-blocked-request-node aia-sandbox-blocked-request-far"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8.5"/><path d="M3.5 12h17M12 3.5c2.4 2.4 3.4 5.3 3.4 8.5s-1 6.1-3.4 8.5c-2.4-2.4-3.4-5.3-3.4-8.5s1-6.1 3.4-8.5z"/></svg><em>registry.npmjs.org</em></span>
</div>
<div class="aia-sandbox-blocked-request-msg">
<b><span>Fetching registry.npmjs.org</span><span>Request blocked by the sandbox</span><span>Domain allowed</span></b>
<span class="aia-sandbox-blocked-request-sub"><span><code>npm install zod</code> needs the network</span><span>registry.npmjs.org is not on the allowlist</span><span>Added to the allowlist for this session</span></span>
</div>
<div class="aia-sandbox-blocked-request-actions">
<button type="button" class="aia-sandbox-blocked-request-deny">Keep blocked</button>
<button type="button" class="aia-sandbox-blocked-request-allow"><span>Allow domain</span><span><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5.5 12.5 4 4 9-9.5"/></svg>Allowed</span></button>
</div>
</div>@property --aia-sandbox-blocked-request-t {
syntax: "<number>";
inherits: true;
initial-value: 0;
}
.aia-sandbox-blocked-request {
--c: var(--aia-color, #7c5cff);
font-size: var(--aia-size, 16px);
font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
line-height: 1.4;
position: relative;
box-sizing: border-box;
padding: 0.9em 1em;
border-radius: 0.9em;
background: color-mix(in srgb, currentColor 3%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 11%, transparent), 0 0.1em 0.2em color-mix(in srgb, currentColor 4%, transparent), 0 0.9em 2em -1.1em rgb(0 0 0 / 0.3);
--d: 8.4s;
--t: var(--aia-sandbox-blocked-request-t);
--b: clamp(0, (var(--t) - 1) * 6, 1);
--a: clamp(0, (var(--t) - 2) * 5, 1);
width: 21.5em;
padding: 0.85em 1em 0.85em;
animation: aia-sandbox-blocked-request-clock var(--d) linear infinite;
}
.aia-sandbox-blocked-request > * {
animation: aia-sandbox-blocked-request-fade var(--d) linear infinite;
}
.aia-sandbox-blocked-request-map {
display: flex;
align-items: flex-start;
padding-bottom: 1em;
}
.aia-sandbox-blocked-request-map .aia-sandbox-blocked-request-far em {
right: 0;
left: auto;
}
.aia-sandbox-blocked-request-node {
position: relative;
flex: none;
width: 2.3em;
height: 2.3em;
}
.aia-sandbox-blocked-request-node svg {
display: block;
box-sizing: border-box;
width: 2.3em;
height: 2.3em;
padding: 0.5em;
border-radius: 0.65em;
background: color-mix(in srgb, currentColor 6%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 14%, transparent);
}
.aia-sandbox-blocked-request-node:first-child svg {
background: color-mix(in srgb, var(--c) 14%, transparent);
box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c) 35%, transparent);
color: color-mix(in srgb, var(--c) 80%, currentColor);
}
.aia-sandbox-blocked-request-far svg {
animation: aia-sandbox-blocked-request-arrive var(--d) ease-out infinite;
}
.aia-sandbox-blocked-request-node em {
position: absolute;
top: 100%;
left: 0;
margin-top: 0.45em;
color: color-mix(in srgb, currentColor 50%, transparent);
font: 500 0.6em ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace;
font-style: normal;
white-space: nowrap;
}
.aia-sandbox-blocked-request-track {
position: relative;
flex: 1;
height: 2.3em;
margin: 0 0.5em;
background: linear-gradient(color-mix(in srgb, currentColor 22%, transparent), color-mix(in srgb, currentColor 22%, transparent)) center / 100% 0.1em no-repeat;
}
.aia-sandbox-blocked-request-packet {
position: absolute;
top: calc(50% - 0.3em);
left: 0;
width: 0.6em;
height: 0.6em;
border-radius: 50%;
background: var(--c);
box-shadow: 0 0 0.6em var(--c);
animation: aia-sandbox-blocked-request-fly var(--d) linear infinite;
}
.aia-sandbox-blocked-request-wall {
position: absolute;
left: 50%;
top: 50%;
display: grid;
place-items: center;
width: 1.9em;
height: 1.9em;
margin: -0.95em 0 0 -0.95em;
border-radius: 50%;
background: color-mix(in srgb, #16a34a calc(var(--a) * 100%), color-mix(in srgb, #dc2626 calc(var(--b) * 100%), color-mix(in srgb, currentColor 10%, transparent)));
color: color-mix(in srgb, #fff calc(max(var(--a), var(--b)) * 100%), currentColor);
animation: aia-sandbox-blocked-request-hit var(--d) linear infinite;
}
.aia-sandbox-blocked-request-wall svg {
width: 1.05em;
height: 1.05em;
stroke-width: 2.4;
}
.aia-sandbox-blocked-request-msg {
display: grid;
gap: 0.2em;
margin-top: 0.7em;
}
.aia-sandbox-blocked-request-msg b,
.aia-sandbox-blocked-request-sub {
display: grid;
}
.aia-sandbox-blocked-request-msg b > *,
.aia-sandbox-blocked-request-sub > * {
grid-area: 1 / 1;
white-space: nowrap;
}
.aia-sandbox-blocked-request-msg b { font-size: 0.92em; }
.aia-sandbox-blocked-request-sub {
color: color-mix(in srgb, currentColor 58%, transparent);
font-size: 0.74em;
}
.aia-sandbox-blocked-request-sub code { font: 0.95em ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace; }
.aia-sandbox-blocked-request-msg b > :nth-child(1),
.aia-sandbox-blocked-request-sub > :nth-child(1) { opacity: calc(1 - var(--b)); }
.aia-sandbox-blocked-request-msg b > :nth-child(2),
.aia-sandbox-blocked-request-sub > :nth-child(2) { opacity: calc(var(--b) - var(--a)); }
.aia-sandbox-blocked-request-msg b > :nth-child(3),
.aia-sandbox-blocked-request-sub > :nth-child(3) { opacity: var(--a); }
.aia-sandbox-blocked-request-msg b > :nth-child(2) { color: color-mix(in srgb, #dc2626 80%, currentColor); }
.aia-sandbox-blocked-request-msg b > :nth-child(3) { color: color-mix(in srgb, #16a34a 78%, currentColor); }
.aia-sandbox-blocked-request-actions {
display: flex;
justify-content: flex-end;
gap: 0.5em;
margin-top: 0.8em;
}
.aia-sandbox-blocked-request-actions button {
position: relative;
padding: 0.5em 0.9em;
border: 0;
border-radius: 0.55em;
font: 600 0.8em system-ui, sans-serif;
cursor: pointer;
opacity: calc(0.35 + var(--b) * 0.65);
}
.aia-sandbox-blocked-request-actions button:focus-visible {
outline: 2px solid var(--c);
outline-offset: 2px;
}
.aia-sandbox-blocked-request-deny {
background: transparent;
box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 16%, transparent);
color: inherit;
}
.aia-sandbox-blocked-request-actions .aia-sandbox-blocked-request-deny { opacity: calc((0.35 + var(--b) * 0.65) * (1 - var(--a) * 0.6)); }
.aia-sandbox-blocked-request-allow {
display: grid;
background: color-mix(in srgb, #16a34a calc(var(--a) * 14%), color-mix(in srgb, var(--c) calc((1 - var(--a)) * 100%), transparent));
color: color-mix(in srgb, color-mix(in srgb, #16a34a 78%, currentColor) calc(var(--a) * 100%), #fff);
box-shadow: inset 0 0 0 1px color-mix(in srgb, #16a34a calc(var(--a) * 40%), transparent);
animation: aia-sandbox-blocked-request-press var(--d) cubic-bezier(0.4, 0, 0.2, 1) infinite;
}
.aia-sandbox-blocked-request-allow > span {
grid-area: 1 / 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.35em;
}
.aia-sandbox-blocked-request-allow > span:first-child { opacity: calc(1 - var(--a)); }
.aia-sandbox-blocked-request-allow > span:last-child { opacity: var(--a); }
.aia-sandbox-blocked-request-allow svg {
width: 1.1em;
height: 1.1em;
stroke-width: 3;
}
@keyframes aia-sandbox-blocked-request-clock {
0%, 17% { --aia-sandbox-blocked-request-t: 0; }
20%, 57% { --aia-sandbox-blocked-request-t: 1.2; }
62%, 95.5% { --aia-sandbox-blocked-request-t: 2.3; }
96.5%, 100% { --aia-sandbox-blocked-request-t: 0; }
}
@keyframes aia-sandbox-blocked-request-fly {
0% { left: 0; opacity: 0; transform: scale(0.4); }
3% { opacity: 1; transform: none; }
17% { left: calc(50% - 1.35em); opacity: 1; transform: none; animation-timing-function: cubic-bezier(0.2, 0.7, 0.4, 1); }
23% { left: calc(50% - 3.2em); opacity: 0.7; transform: scale(0.8); }
27%, 59% { left: calc(50% - 3.2em); opacity: 0; transform: scale(0.4); }
60% { left: 0; opacity: 0; transform: scale(0.4); }
63% { left: 0.3em; opacity: 1; transform: none; animation-timing-function: cubic-bezier(0.45, 0, 0.4, 1); }
80% { left: calc(100% - 0.6em); opacity: 1; transform: none; }
84%, 100% { left: calc(100% - 0.6em); opacity: 0; transform: scale(1.8); }
}
@keyframes aia-sandbox-blocked-request-hit {
0%, 16.5% { transform: none; box-shadow: 0 0 0 0 color-mix(in srgb, #dc2626 0%, transparent); }
18% { transform: scale(1.18); box-shadow: 0 0 0 0 color-mix(in srgb, #dc2626 55%, transparent); }
26% { transform: none; box-shadow: 0 0 0 0.8em color-mix(in srgb, #dc2626 0%, transparent); }
60% { transform: none; box-shadow: 0 0 0 0 color-mix(in srgb, #16a34a 50%, transparent); }
68%, 100% { transform: none; box-shadow: 0 0 0 0.8em color-mix(in srgb, #16a34a 0%, transparent); }
}
@keyframes aia-sandbox-blocked-request-arrive {
0%, 79% { box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 14%, transparent), 0 0 0 0 color-mix(in srgb, #16a34a 0%, transparent); color: inherit; }
84%, 95% { box-shadow: inset 0 0 0 1px color-mix(in srgb, #16a34a 60%, transparent), 0 0 0 0.3em color-mix(in srgb, #16a34a 16%, transparent); color: color-mix(in srgb, #16a34a 78%, currentColor); }
100% { box-shadow: inset 0 0 0 1px color-mix(in srgb, currentColor 14%, transparent), 0 0 0 0 color-mix(in srgb, #16a34a 0%, transparent); color: inherit; }
}
@keyframes aia-sandbox-blocked-request-press {
0%, 54%, 60%, 100% { transform: none; }
57% { transform: scale(0.95); }
}
@keyframes aia-sandbox-blocked-request-fade {
0%, 93% { opacity: 1; }
95.5%, 97% { opacity: 0; }
100% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
.aia-sandbox-blocked-request,
.aia-sandbox-blocked-request *,
.aia-sandbox-blocked-request > * {
animation: none;
}
.aia-sandbox-blocked-request { --aia-sandbox-blocked-request-t: 1.2; }
.aia-sandbox-blocked-request-packet { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
.aia-sandbox-blocked-request, .aia-sandbox-blocked-request *, .aia-sandbox-blocked-request::before, .aia-sandbox-blocked-request::after, .aia-sandbox-blocked-request *::before, .aia-sandbox-blocked-request *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}--aia-color on the element or a parent.
Currently previewing #3b82f6.--aia-size. Every other dimension is in
em, so the whole thing scales together. Currently previewing 16px.transition or animation
shorthand. Staggered delays are relative, so they keep their rhythm.