.ds-btn{--_h:38px;--_px:16px;--_fs:var(--text-sm);position:relative;display:inline-flex;align-items:center;justify-content:center;gap:8px;height:var(--_h);padding:0 var(--_px);font-family:var(--font-body);font-size:var(--_fs);font-weight:600;line-height:1;letter-spacing:.01em;white-space:nowrap;border:1px solid transparent;border-radius:var(--r-md);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),filter var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out),opacity var(--dur-fast) var(--ease-out)}.ds-btn:active:not(:disabled){transform:translateY(1px)}.ds-btn:focus-visible{outline:none;box-shadow:var(--focus-ring)}.ds-btn:disabled{opacity:.45;cursor:not-allowed}.ds-btn--sm{--_h:30px;--_px:12px;--_fs:var(--text-xs)}.ds-btn--lg{--_h:46px;--_px:22px;--_fs:var(--text-base)}.ds-btn--primary{background:var(--accent);color:var(--accent-ink)}.ds-btn--primary:hover:not(:disabled){filter:brightness(1.08)}.ds-btn--secondary{background:var(--surface-2);color:var(--ink);border-color:var(--line-2)}.ds-btn--secondary:hover:not(:disabled){border-color:var(--accent)}.ds-btn--ghost{background:transparent;color:var(--ink-2)}.ds-btn--ghost:hover:not(:disabled){background:var(--surface-2);color:var(--ink)}.ds-btn--danger{background:transparent;color:var(--danger);border-color:var(--line-2)}.ds-btn--danger:hover:not(:disabled){background:var(--error-bg);border-color:var(--danger)}.ds-btn--loading{color:transparent!important;pointer-events:none}.ds-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--sp-5)}.ds-card--raised{box-shadow:var(--elevation-2)}.ds-card--interactive{cursor:pointer;transition:border-color var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}.ds-card--interactive:hover{border-color:var(--line-2);transform:translateY(-2px);box-shadow:var(--elevation-2)}.ds-badge{display:inline-flex;align-items:center;gap:5px;height:20px;padding:0 9px;font-family:var(--font-body);font-size:10px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;white-space:nowrap;border-radius:var(--r-full);border:1px solid transparent}.ds-badge--neutral{background:var(--surface-2);color:var(--ink-2);border-color:var(--line)}.ds-badge--accent{background:var(--accent-soft);color:var(--accent)}.ds-badge--ok{background:var(--success-bg);color:var(--ok)}.ds-badge--warn{background:var(--warning-bg);color:var(--warn)}.ds-badge--danger{background:var(--error-bg);color:var(--danger)}.ds-input{width:100%;height:38px;padding:0 12px;font-family:var(--font-body);font-size:var(--text-sm);color:var(--ink);background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-md);transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out)}.ds-input::placeholder{color:var(--ink-3)}.ds-input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.ds-input:disabled{opacity:.5;cursor:not-allowed}.ds-input--invalid{border-color:var(--danger)}textarea.ds-input{height:auto;min-height:92px;padding:10px 12px;line-height:var(--leading-normal);resize:vertical}.ds-field{display:flex;flex-direction:column;gap:6px}.ds-field-label{font-family:var(--font-body);font-size:var(--text-xs);font-weight:600;color:var(--ink-2);letter-spacing:.03em}.ds-field-hint{font-size:var(--text-xs);color:var(--ink-3)}.ds-field-error{font-size:var(--text-xs);color:var(--danger)}.ds-spinner{display:inline-block;width:14px;height:14px;flex-shrink:0;border:2px solid;border-top:2px solid transparent;border-radius:50%;animation:ds-spin .6s linear infinite}.ds-btn--loading .ds-spinner{position:absolute;left:50%;top:50%;margin:-7px 0 0 -7px}.ds-btn--primary.ds-btn--loading .ds-spinner{color:var(--accent-ink)}.ds-btn--ghost.ds-btn--loading .ds-spinner,.ds-btn--secondary.ds-btn--loading .ds-spinner{color:var(--ink)}.ds-btn--danger.ds-btn--loading .ds-spinner{color:var(--danger)}@keyframes ds-spin{to{transform:rotate(1turn)}}