/* UX partilhada (carregado em último): tokens, cartões, alvos táteis >=48px, foco, contraste AA, movimento.
   Aplica-se às páginas do atleta (menu com categorias = .nav-grp); o treinador não muda. */
:root{--ux-surface:#fff;--ux-surface2:#eef5f4;--ux-line:#dbe7e5;--ux-text:#0f2a3d;--ux-sub:#4b5b66;--ux-ease:cubic-bezier(.2,.8,.2,1);--ux-spring:cubic-bezier(.34,1.56,.64,1);--ux-focus:#0f766e}
html[data-theme=dark]{--ux-surface:#171b20;--ux-surface2:#1e242b;--ux-line:#2c343c;--ux-text:#eceef1;--ux-sub:#a9b4bf;--ux-focus:#5eead4}
/* ondulação leve e feedback de toque */
.ux-rip{position:relative;overflow:hidden}.ux-rp{position:absolute;border-radius:50%;background:currentColor;opacity:.18;transform:scale(0);pointer-events:none;animation:ux-rp .6s var(--ux-ease) forwards}
@keyframes ux-rp{to{transform:scale(1);opacity:0}}
/* foco visível */
:focus-visible{outline:3px solid var(--ux-focus)!important;outline-offset:2px!important}
/* --- páginas do atleta --- */
.app:has(.nav-grp) .main{max-width:1180px}
.app:has(.nav-grp) .main .card{background:var(--ux-surface);border:1px solid var(--ux-line)!important;border-radius:20px!important;padding:clamp(16px,2.2vw,24px)}
.app:has(.nav-grp) .main .card+.card{margin-top:14px}
html:not([data-theme=dark]) .app:has(.nav-grp) .main .muted,html:not([data-theme=dark]) .app:has(.nav-grp) .main small{color:var(--ux-sub)}
html:not([data-theme=dark]) .app:has(.nav-grp) .main a:not([class]){color:#0f766e}
html[data-theme=dark] .app:has(.nav-grp) .main a:not([class]){color:#5eead4}
/* alvos táteis >= 48px */
.app:has(.nav-grp) :is(button,.btn-link,.backbtn,select,input:not([type=checkbox]):not([type=radio]):not([type=range]),.ob-chip,.ob-dot){min-height:48px}
.app:has(.nav-grp) :is(.btn-link,.backbtn,.ob-chip,.ob-dot){display:inline-flex;align-items:center;justify-content:center}
.app:has(.nav-grp) button.sm{min-height:48px;padding-inline:16px}
.app:has(.nav-grp) .ob-dot{min-width:48px}
.app:has(.nav-grp) label.chk{display:inline-flex;align-items:center;gap:10px;min-height:48px}.app:has(.nav-grp) input[type=checkbox],.app:has(.nav-grp) input[type=radio]{width:22px;height:22px}
.app:has(.nav-grp) input:not([type=checkbox]):not([type=radio]),.app:has(.nav-grp) select,.app:has(.nav-grp) textarea{font-size:16px;border:1.5px solid #7d8d97;border-radius:14px;padding-inline:14px}
.app:has(.nav-grp) textarea{padding-block:12px}
.app:has(.nav-grp) :is(input,select,textarea):focus{border-color:var(--ux-focus)}
html[data-theme=dark] .app:has(.nav-grp) :is(input,select,textarea){border-color:#5b6772}
.app:has(.nav-grp) .tabbar a,.app:has(.nav-grp) .tabbar button.tab-more{min-height:56px}
.app:has(.nav-grp) .side-nav a{min-height:48px}
.app:has(.nav-grp) .hm-row,.app:has(.nav-grp) .card.link{min-height:56px}
/* movimento: molas curtas em ações; nada de movimento se o sistema o pede */
@media(prefers-reduced-motion:no-preference){.app:has(.nav-grp) :is(button,.btn-link):not(.ghost){transition:transform .2s var(--ux-spring),filter .2s}.app:has(.nav-grp) :is(button,.btn-link):active{transform:scale(.97)}}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}.ux-rp{display:none}}
/* ecrãs largos: mais respiração */
@media(min-width:1024px){.app:has(.nav-grp) .main{padding:32px clamp(24px,3vw,48px) 64px}}
@media(max-width:860px){.app:has(.nav-grp) .main{padding-inline:16px!important}}
