/* Pulsy brand system v1.0 — reference component styles (hand-authored, uses dist/css/pulsy-tokens.css).
   These define the exact look of the core components. Framework ports must match them pixel-for-pixel. */
.pulsy-btn{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:48px;padding:0 20px;border-radius:var(--pulsy-radius-full);border:1px solid transparent;font:600 16px/24px var(--pulsy-font-body);cursor:pointer;transition:background-color var(--pulsy-duration-fast) var(--pulsy-easing-standard),transform var(--pulsy-duration-fast) var(--pulsy-easing-standard);white-space:nowrap}
.pulsy-btn svg{width:20px;height:20px}
.pulsy-btn--md{height:40px;padding:0 16px;font-size:14px;line-height:20px}
.pulsy-btn--sm{height:32px;padding:0 12px;font-size:14px;line-height:20px}
.pulsy-btn:focus-visible{outline:2px solid var(--pulsy-border-focus);outline-offset:2px}
.pulsy-btn:active{transform:scale(.98)}
.pulsy-btn--primary{background:var(--pulsy-action-primary-bg);color:var(--pulsy-action-primary-text)}
.pulsy-btn--primary:hover{background:var(--pulsy-action-primary-bg-hover)}
.pulsy-btn--primary:active{background:var(--pulsy-action-primary-bg-pressed)}
.pulsy-btn--secondary{background:var(--pulsy-action-secondary-bg);color:var(--pulsy-action-secondary-text);border-color:var(--pulsy-action-secondary-border)}
.pulsy-btn--secondary:hover{background:var(--pulsy-action-secondary-bg-hover)}
.pulsy-btn--secondary:active{background:var(--pulsy-action-secondary-bg-pressed)}
.pulsy-btn--accent{background:var(--pulsy-action-accent-bg);color:var(--pulsy-action-accent-text)}
.pulsy-btn--accent:hover{background:var(--pulsy-action-accent-bg-hover)}
.pulsy-btn--accent:active{background:var(--pulsy-action-accent-bg-pressed)}
.pulsy-btn--danger{background:var(--pulsy-action-danger-bg);color:var(--pulsy-action-danger-text)}
.pulsy-btn--danger:hover{background:var(--pulsy-action-danger-bg-hover)}
.pulsy-btn--ghost{background:transparent;color:var(--pulsy-text-link);padding:0 12px}
.pulsy-btn--ghost:hover{background:var(--pulsy-action-secondary-bg-hover)}
.pulsy-btn:disabled,.pulsy-btn[aria-disabled=true]{background:var(--pulsy-action-disabled-bg);color:var(--pulsy-action-disabled-text);border-color:transparent;cursor:not-allowed;transform:none}
.pulsy-field{display:flex;flex-direction:column;gap:6px;font-family:var(--pulsy-font-body)}
.pulsy-field label{font:600 14px/20px var(--pulsy-font-body);color:var(--pulsy-text-primary)}
.pulsy-field .help{font:400 12px/16px var(--pulsy-font-body);letter-spacing:.01em;color:var(--pulsy-text-secondary)}
.pulsy-input{height:48px;padding:0 14px;border-radius:var(--pulsy-radius-md);border:1px solid var(--pulsy-border-strong);background:var(--pulsy-bg-surface);color:var(--pulsy-text-primary);font:400 16px/24px var(--pulsy-font-body);font-variant-numeric:tabular-nums}
.pulsy-input::placeholder{color:var(--pulsy-text-muted)}
.pulsy-input:focus{outline:none;border:2px solid var(--pulsy-border-focus);padding:0 13px}
.pulsy-field--error .pulsy-input{border:2px solid var(--pulsy-status-danger-icon);padding:0 13px}
.pulsy-field--error .help{color:var(--pulsy-status-danger-text)}
.pulsy-card{background:var(--pulsy-bg-surface);border:1px solid var(--pulsy-border-subtle);border-radius:var(--pulsy-radius-lg);padding:24px;box-shadow:var(--pulsy-shadow-1);color:var(--pulsy-text-primary)}
@media (max-width:767px){.pulsy-card{padding:16px}}
.pulsy-kpi{display:flex;flex-direction:column;gap:8px}
.pulsy-kpi .label{font:600 12px/16px var(--pulsy-font-body);letter-spacing:.08em;text-transform:uppercase;color:var(--pulsy-text-secondary)}
.pulsy-kpi .value{font:700 36px/40px var(--pulsy-font-body);letter-spacing:-.02em;font-variant-numeric:tabular-nums lining-nums;color:var(--pulsy-text-primary)}
.pulsy-kpi .unit{font:400 16px/24px var(--pulsy-font-body);color:var(--pulsy-text-secondary);letter-spacing:0;margin-left:4px}
.pulsy-kpi .value.is-estimate{text-decoration:underline dashed 1px var(--pulsy-text-muted);text-underline-offset:6px}
.pulsy-kpi .foot{display:flex;align-items:center;justify-content:space-between;gap:8px;font:400 14px/20px var(--pulsy-font-body);color:var(--pulsy-text-secondary)}
.pulsy-link{color:var(--pulsy-text-link);text-decoration:underline;text-underline-offset:3px;font-weight:600}
.pulsy-link:hover{color:var(--pulsy-text-link-hover)}
.pulsy-badge{display:inline-flex;align-items:center;gap:4px;height:24px;padding:0 10px;border-radius:var(--pulsy-radius-full);font:600 12px/16px var(--pulsy-font-body);letter-spacing:.01em;border:1px solid}
.pulsy-badge svg{width:14px;height:14px}
.pulsy-badge--success{background:var(--pulsy-status-success-bg);color:var(--pulsy-status-success-text);border-color:var(--pulsy-status-success-border)}
.pulsy-badge--warning{background:var(--pulsy-status-warning-bg);color:var(--pulsy-status-warning-text);border-color:var(--pulsy-status-warning-border)}
.pulsy-badge--danger{background:var(--pulsy-status-danger-bg);color:var(--pulsy-status-danger-text);border-color:var(--pulsy-status-danger-border)}
.pulsy-badge--info{background:var(--pulsy-status-info-bg);color:var(--pulsy-status-info-text);border-color:var(--pulsy-status-info-border)}
.pulsy-badge--neutral{background:var(--pulsy-bg-sunken);color:var(--pulsy-text-secondary);border-color:var(--pulsy-border-default)}
.pulsy-toast{display:flex;align-items:flex-start;gap:12px;max-width:420px;padding:14px 16px;border-radius:var(--pulsy-radius-md);background:var(--pulsy-bg-inverse);color:var(--pulsy-text-inverse);box-shadow:var(--pulsy-shadow-3);font:400 14px/20px var(--pulsy-font-body)}
.pulsy-toast strong{display:block;font-weight:600}
.pulsy-toast svg{flex:none;width:20px;height:20px;color:var(--pulsy-icon-on-inverse)}
@media (prefers-reduced-motion:reduce){.pulsy-btn{transition:none}.pulsy-btn:active{transform:none}}
/* Logo + mascot animation (v1.1). The motion lives in the self-contained files in animations/svg/
   (CSS keyframes inside each SVG, reduced motion handled inside the file). Inline them or use <img>.
   These helpers only size and pause them. */
.pulsy-anim{display:inline-block;line-height:0}
.pulsy-anim svg,.pulsy-anim img{width:100%;height:auto}
.pulsy-anim--paused *{animation-play-state:paused!important}
/* Generic one-shot entrance for wrappers (uses motion tokens) */
.pulsy-enter{animation:pulsy-enter var(--pulsy-duration-slow) var(--pulsy-easing-enter) both}
@keyframes pulsy-enter{from{opacity:0;transform:scale(.6)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.pulsy-enter{animation:none}.pulsy-anim *{animation-play-state:paused!important}}
