.spinner{border-style:solid;border-color:color-mix(in srgb, var(--color-purple-bright) 35%, transparent);border-top-color:var(--color-purple-bright);border-radius:50%;flex-shrink:0;animation:.7s linear infinite spinner-rotate;display:inline-block}.spinner--sm{border-width:2px;width:14px;height:14px}.spinner--md{border-width:2.5px;width:22px;height:22px}.spinner--lg{border-width:3px;width:36px;height:36px}@keyframes spinner-rotate{to{transform:rotate(360deg)}}.page-loader{width:100%;min-height:280px;color:var(--color-ink-muted);text-align:center;place-items:center;gap:14px;display:grid}.page-loader--screen{min-height:100vh}.page-loader p{margin:0;font-size:14px}.loading-overlay-host{width:100%;position:relative}.loading-overlay{z-index:2;border-radius:inherit;background:color-mix(in srgb, var(--color-bg) 62%, transparent);-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);color:var(--color-ink-muted);place-items:center;gap:10px;font-size:13px;display:grid;position:absolute;inset:0}.toast-viewport{z-index:80;pointer-events:none;flex-direction:column-reverse;gap:10px;width:min(380px,100vw - 32px);display:flex;position:fixed;top:20px;right:20px}.toast{pointer-events:auto;border:1px solid var(--color-border);background:var(--color-surface-raised);width:100%;color:var(--color-ink);box-shadow:var(--shadow-card), 0 16px 40px #00000059;text-align:left;cursor:pointer;border-radius:14px;align-items:flex-start;gap:10px;padding:12px 14px;animation:.18s ease-out toast-in;display:flex}.toast__message{flex:1;font-size:14px;line-height:1.4}.toast__dot{border-radius:999px;flex-shrink:0;width:8px;height:8px;margin-top:5px}.toast--success{border-color:color-mix(in srgb, var(--color-success) 45%, var(--color-border))}.toast--success .toast__dot{background:var(--color-success);box-shadow:0 0 10px color-mix(in srgb, var(--color-success) 70%, transparent)}.toast--error{border-color:color-mix(in srgb, var(--color-danger) 50%, var(--color-border))}.toast--error .toast__dot{background:var(--color-danger);box-shadow:0 0 10px color-mix(in srgb, var(--color-danger) 70%, transparent)}.toast--info{border-color:color-mix(in srgb, var(--color-purple-bright) 45%, var(--color-border))}.toast--info .toast__dot{background:var(--color-purple-bright);box-shadow:0 0 10px var(--color-purple-glow)}@keyframes toast-in{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}
