/* One motion vocabulary: quiet hover, tactile press, connected state changes. */
:root{--motion-fast:140ms;--motion-base:240ms;--motion-slow:320ms;--motion-ease:cubic-bezier(.22,1,.36,1);--motion-exit:cubic-bezier(.4,0,1,1)}
button,a,input,summary{-webkit-tap-highlight-color:transparent}
button{transition:background-color var(--motion-fast),color var(--motion-fast),border-color var(--motion-fast),box-shadow var(--motion-base),opacity var(--motion-fast),transform var(--motion-fast) var(--motion-ease)}
button:active:enabled{transform:scale(.975)}
.primary:hover:enabled,.home-start:hover{box-shadow:0 4px 14px #355cff20}
.primary:active:enabled,.home-start:active{transform:scale(.985);box-shadow:0 1px 4px #355cff12}
.swap-token:hover,.home-token:hover{box-shadow:0 3px 10px #101c3c09}
.swap-token:active,.home-token:active{transform:scale(.96)}
.swap-direction button:active:enabled,.home-switch-wrap button:active{transform:scale(.9)}
.swap-direction button .ui-icon,.home-switch-wrap button .ui-icon{transform-origin:center}
.trade-box,.funding-amount,.token-search,.search-input,.funding-token-button{transition:background-color var(--motion-base),border-color var(--motion-base),box-shadow var(--motion-base)}
.trade-box:focus-within,.funding-amount:focus-within{box-shadow:0 0 0 3px #355cff08}
.token-option{transition:background-color 140ms,color 140ms,transform 140ms var(--motion-ease)}
.token-option:active:enabled{transform:scale(.985)}
.token-option>span:last-child .ui-icon{animation:motion-check 220ms var(--motion-ease)}
.control-check .ui-icon{transform:scale(.65);transition:opacity 140ms,transform 220ms var(--motion-ease)}
.control-option[aria-checked=true] .control-check .ui-icon{transform:scale(1)}
.control-chevron,.network-chevron{transition:transform var(--motion-base) var(--motion-ease)}
.network-button[aria-expanded=true] .network-chevron{transform:rotate(180deg)}
.control-option:active:enabled,.control-reset:active:enabled{transform:scale(.985)}

/* Native discrete transitions retain the top layer until an exit has finished. */
.control-menu,.network-panel{opacity:0;transform:translateY(-6px) scale(.98);animation:none;transition:opacity 160ms,transform 220ms var(--motion-ease),display 220ms allow-discrete,overlay 220ms allow-discrete;transform-origin:top left}
.control-menu[data-side=top]{transform:translateY(6px) scale(.98);transform-origin:bottom left}
.control-menu:popover-open,.network-panel:popover-open{opacity:1;transform:translateY(0) scale(1);animation:none}
.network-panel{transform-origin:top right}
@starting-style{.control-menu:popover-open,.network-panel:popover-open{opacity:0;transform:translateY(-6px) scale(.98)}.control-menu[data-side=top]:popover-open{transform:translateY(6px) scale(.98)}}
dialog,dialog:has(.token-results){opacity:0;transform:translateY(12px) scale(.98);animation:none;transition:opacity 160ms,transform 240ms var(--motion-ease),display 240ms allow-discrete,overlay 240ms allow-discrete}
dialog[open],dialog[open]:has(.token-results){opacity:1;transform:translateY(0) scale(1)}
dialog::backdrop{animation:none;background:#10182700;backdrop-filter:blur(0);transition:background-color 220ms,backdrop-filter 220ms,display 240ms allow-discrete,overlay 240ms allow-discrete}
dialog[open]::backdrop{background:#10182755;backdrop-filter:blur(4px)}
@starting-style{dialog[open],dialog[open]:has(.token-results){opacity:0;transform:translateY(12px) scale(.98)}dialog[open]::backdrop{background:#10182700;backdrop-filter:blur(0)}}
dialog[data-switching=true]{overflow:clip;pointer-events:none}
.motion-outgoing{z-index:2;contain:paint;user-select:none;pointer-events:none!important}

/* The selected surface moves; labels and the surrounding layout stay fixed. */
.motion-segments{position:relative;isolation:isolate}
.motion-segments>button,.motion-segments>a{position:relative;z-index:1}
.segment-indicator,.nav-active-indicator{position:absolute;left:0;top:0;pointer-events:none;z-index:0;border-radius:9px;background:var(--accent-soft)}
.segment-indicator[hidden],.nav-active-indicator[hidden]{display:none}
[data-motion-ready=true]>.segment-indicator,[data-motion-ready=true]>.nav-active-indicator{transition:transform 280ms var(--motion-ease),width 280ms var(--motion-ease),height 280ms var(--motion-ease),opacity 180ms}
.nav-active-indicator{background:var(--accent);border-radius:2px}
.motion-segments:not(.topbar nav)>button[aria-pressed=true]{background:transparent;box-shadow:none}
.asset-chart-modes>.segment-indicator,.asset-quote-controls>.segment-indicator,.market-currency>.segment-indicator,.swap-mobile-tabs>.segment-indicator{background:var(--white);box-shadow:0 1px 4px #101c3c09}
.asset-chart-modes>.segment-indicator{background:var(--paper-2);box-shadow:none}
.withdraw-presets>.segment-indicator{border:1px solid #cbd6ff;border-radius:10px}
.withdraw-presets>button[aria-pressed=true]{border-color:transparent}
.pool-tabs[data-positioned] .pool-tab-indicator{transition:transform 300ms var(--motion-ease),width 300ms var(--motion-ease)}
.pool-tabs button:active:enabled,.motion-segments>button:active:enabled{transform:none}
.pool-tabs button,.motion-segments>button{transition:color 180ms,background-color 180ms}
.pool-list-enter{animation:none}
.pool-directory tr,.activity-table tr{transition:background-color 160ms}

@keyframes motion-check{from{opacity:0;transform:scale(.6)}to{opacity:1;transform:scale(1)}}
.swap-details summary .token-chevron,.market-method summary,.home-faq summary .ui-icon{transition:transform 240ms var(--motion-ease),color 180ms}
.swap-details[data-expanded=true] summary .token-chevron,.swap-details[open]:not([data-expanded=false]) summary .token-chevron{transform:rotate(180deg)}
.home-faq details[data-expanded=true] summary .ui-icon,.home-faq details[open]:not([data-expanded=false]) summary .ui-icon{transform:rotate(45deg)}
.swap-details[open]{animation:none}
.receipt-mark.confirmed .ui-icon path{stroke-dasharray:20;stroke-dashoffset:0;animation:receipt-draw 360ms var(--motion-ease) both}
.receipt-mark{animation:receipt-arrive 320ms var(--motion-ease) both}
.transaction-receipt #receipt-message{min-height:48px}
#receipt-update-status{display:block;min-height:18px;margin-top:10px;font-size:12px;color:var(--muted)}
@keyframes receipt-draw{from{stroke-dashoffset:20}to{stroke-dashoffset:0}}
@keyframes receipt-arrive{from{opacity:0;transform:scale(.85)}to{opacity:1;transform:scale(1)}}
.primary[aria-busy=true]:before,.wallet-button[aria-busy=true]:before{content:"";width:14px;height:14px;flex:none;border:1.5px solid currentColor;border-right-color:transparent;border-radius:50%;animation:busy-spin 700ms linear infinite}
@keyframes busy-spin{to{transform:rotate(360deg)}}
.toast{transition:opacity 180ms,transform 240ms var(--motion-ease);transform:translate(-50%,12px)}
.toast.visible{transform:translate(-50%,0)}
@media(prefers-reduced-motion:reduce){*,*::before,*::after,*::backdrop{animation:none!important;transition:none!important;scroll-behavior:auto!important}::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}}

/* Route and region motion own entry; avoid stacking unrelated entrance effects. */
.swap-shell,.pool-detail-layout,.page-heading{animation:none}
.primary[aria-busy=true],.wallet-button[aria-busy=true]{display:inline-flex;align-items:center;justify-content:center;gap:9px}
.motion-outgoing *{animation:none!important;transition:none!important}

/* One stable shell for a selection workflow. Scroll the content, never resize
   the dialog because a search result, selected symbol or status changed. */
#modal{position:fixed;inset:0;margin:auto;padding:0;height:var(--dialog-height,fit-content);max-height:calc(100dvh - 40px);overflow:hidden;flex-direction:column}
#modal[open]{display:flex}
.modal-panel{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;min-width:0;padding:24px;overflow:hidden}
.modal-panel>.modal-header{flex:none}
.modal-body{min-height:0;min-width:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-width:thin;scrollbar-gutter:stable}
.modal-panel:has(.token-results)>.modal-header{margin-bottom:14px}
.modal-body:has(.token-results){display:flex;flex-direction:column;flex:1;overflow:hidden;scrollbar-gutter:auto}
.modal-body .token-search:focus-visible{outline:2px solid #355cff80;outline-offset:-2px;border-color:#9badff}
.modal-body .token-results{flex:1 1 0;min-height:0;max-height:none;overflow-y:auto;overflow-x:hidden}
.modal-body .token-search-status,.modal-body .token-search-status:empty{display:flex;min-height:40px;max-height:40px;line-height:18px;margin-top:10px;overflow-y:auto}
.modal-body .token-list-note{margin-top:10px}
.modal-body:has(#funding-form){display:flex;flex:1;overflow:hidden;scrollbar-gutter:auto}
#funding-form{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0}
.funding-fields{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable;scrollbar-width:thin;padding:2px 6px 0;margin:0 -6px}
#funding-quote{flex:none;margin-top:16px}
.funding-fields>.funding-note{margin-bottom:0}
.modal-body .asset-warning{padding-top:0}
.modal-footer{flex:none;margin-top:24px}
#modal[data-layout=receipt] .receipt-transaction{margin-bottom:0}

/* Give the native scroll area a quiet, separate lane. Keep a stable gutter so
   the amounts never shift when a wallet message makes the body scrollable. */
#modal :is(.modal-body,.token-results,.funding-fields,.token-search-status){--scroll-thumb:#c8ced9;scrollbar-width:thin;scrollbar-color:var(--scroll-thumb) transparent}
#modal :is(.modal-body,.token-results,.funding-fields,.token-search-status):hover{--scroll-thumb:#a8b1c1}
@supports selector(::-webkit-scrollbar){
  #modal :is(.modal-body,.token-results,.funding-fields,.token-search-status){scrollbar-width:auto;scrollbar-color:auto}
  #modal ::-webkit-scrollbar{width:6px;height:6px}
  #modal ::-webkit-scrollbar-track{background:transparent}
  #modal ::-webkit-scrollbar-thumb{background:var(--scroll-thumb,#c8ced9);border-radius:99px}
  #modal ::-webkit-scrollbar-thumb:hover{background:#9ca7b9}
  #modal ::-webkit-scrollbar-corner{background:transparent}
}
#modal[data-layout=review] .modal-body{padding-right:6px;margin-right:-12px}
#modal[data-layout=review] .review-asset{margin:0;padding:16px 0}
#modal[data-layout=review] .review-details{padding:0;margin:20px 0 0}
#modal[data-layout=review] .review-details>div{font-size:13px;margin:0 0 10px;gap:16px}
#modal[data-layout=review] .review-details>div:last-child{margin-bottom:0}
#modal[data-layout=review] .review-details strong{min-width:0;overflow-wrap:anywhere}
#modal[data-layout=review] #save-recovery{margin-top:20px}
/* A short status line fits above the button without resizing a normal review. */
#modal[data-layout=review] .modal-footer{display:flex;flex-direction:column;justify-content:flex-end;min-height:95px;margin-top:20px;padding-top:16px;border-top:1px solid var(--line)}
#modal[data-layout=review] #execute-error{margin:0 0 12px;font-size:12px;line-height:1.5}
#modal[data-layout=review] #confirm-operation{min-height:48px}
@media(max-width:700px){#modal{max-height:calc(100dvh - 32px)}.modal-panel{padding:20px}}
@media(max-width:420px){#modal[data-layout=review] .review-asset{gap:12px}#modal[data-layout=review] .review-asset strong{font-size:21px}#modal[data-layout=review] .review-asset strong>span{display:inline-block;font-size:14px}#modal[data-layout=review] .review-asset .swap-token-icon{width:32px;height:32px}}

#modal .review-wallet{display:grid;gap:7px;margin:18px 0 0;padding:14px 16px;border:1px solid var(--line);border-radius:12px;text-align:left}
#modal .review-wallet span{font-size:12px;color:var(--muted)}
#modal .review-wallet code{font-size:12px;overflow-wrap:anywhere;word-break:break-all}
#modal .review-wallet small{font-size:11px;line-height:1.5;color:var(--muted)}
