/* Shared entry curve matches ENTRY_MOTION in src/lib/motion.js. */
:root{--motion-card-distance:12px;--motion-entry-duration:340ms;--motion-press-scale:.96;--motion-press-duration:150ms;--motion-disclosure-duration:360ms;--motion-disclosure-ease:cubic-bezier(.2,.8,.2,1)}
/* Native details keep keyboard, focus, async content sizing and rapid reversals.
   Older browsers retain the immediate native disclosure plus content entry. */
@supports (interpolate-size:allow-keywords) and selector(::details-content){
  .settings-group{interpolate-size:allow-keywords}
  .settings-group::details-content{
    block-size:0;overflow:clip;
    transition:block-size var(--motion-disclosure-duration) var(--motion-disclosure-ease),content-visibility var(--motion-disclosure-duration) allow-discrete;
  }
  .settings-group[open]::details-content{block-size:auto}
}
.settings-group > summary::after{transition:transform var(--motion-disclosure-duration) var(--motion-disclosure-ease)}
/* Small controls dip in scale. Wide buttons only darken: shrinking a full-width edge feels soft. */
:where(.view:not(.view-routes),.expense-dialog) :is(button,.measurement-guide-link):not(:disabled,.full-btn,.secondary-btn,.expense-row,.schedule-tutorial-choice,.day-cell){transition:scale var(--motion-press-duration) ease-out}
:where(.view:not(.view-routes),.expense-dialog) :is(button,.measurement-guide-link):not(:disabled,.full-btn,.secondary-btn,.expense-row,.schedule-tutorial-choice,.day-cell):active{scale:var(--motion-press-scale);transition-duration:0s}
:where(.view:not(.view-routes),.expense-dialog) :is(.full-btn,.secondary-btn,.expense-row,.schedule-tutorial-choice):not(:disabled){transition:filter var(--motion-press-duration) ease-out}
:where(.view:not(.view-routes),.expense-dialog) :is(.full-btn,.secondary-btn,.expense-row,.schedule-tutorial-choice):not(:disabled):active{filter:brightness(.92);transition-duration:0s}
/* Below-viewport cards are staged before paint. Refresh never hides visible cards. */
.ui-card-pending{opacity:0;transform:translateY(var(--motion-card-distance))}
.ui-card-entering{animation:ui-card-rise var(--motion-entry-duration) linear backwards}
/* Native sampled spring: critically damped, no rebound. Regenerate from ENTRY_MOTION when it changes. */
@keyframes ui-card-rise{0%{opacity:0;transform:translateY(12px)}2%{opacity:0.011;transform:translateY(11.872px)}4%{opacity:0.038;transform:translateY(11.547px)}6%{opacity:0.076;transform:translateY(11.084px)}8%{opacity:0.123;transform:translateY(10.527px)}10%{opacity:0.174;transform:translateY(9.911px)}12%{opacity:0.228;transform:translateY(9.264px)}14%{opacity:0.283;transform:translateY(8.606px)}16%{opacity:0.337;transform:translateY(7.953px)}18%{opacity:0.39;transform:translateY(7.316px)}20%{opacity:0.441;transform:translateY(6.703px)}22%{opacity:0.49;transform:translateY(6.12px)}24%{opacity:0.536;transform:translateY(5.57px)}26%{opacity:0.579;transform:translateY(5.055px)}28%{opacity:0.619;transform:translateY(4.576px)}30%{opacity:0.656;transform:translateY(4.134px)}32%{opacity:0.689;transform:translateY(3.726px)}34%{opacity:0.721;transform:translateY(3.353px)}36%{opacity:0.749;transform:translateY(3.011px)}38%{opacity:0.775;transform:translateY(2.7px)}40%{opacity:0.798;transform:translateY(2.418px)}42%{opacity:0.82;transform:translateY(2.163px)}44%{opacity:0.839;transform:translateY(1.932px)}46%{opacity:0.856;transform:translateY(1.723px)}48%{opacity:0.872;transform:translateY(1.536px)}50%{opacity:0.886;transform:translateY(1.367px)}52%{opacity:0.899;transform:translateY(1.216px)}54%{opacity:0.91;transform:translateY(1.081px)}56%{opacity:0.92;transform:translateY(0.96px)}58%{opacity:0.929;transform:translateY(0.852px)}60%{opacity:0.937;transform:translateY(0.755px)}62%{opacity:0.944;transform:translateY(0.669px)}64%{opacity:0.951;transform:translateY(0.592px)}66%{opacity:0.956;transform:translateY(0.524px)}68%{opacity:0.961;transform:translateY(0.464px)}70%{opacity:0.966;transform:translateY(0.41px)}72%{opacity:0.97;transform:translateY(0.362px)}74%{opacity:0.973;transform:translateY(0.32px)}76%{opacity:0.976;transform:translateY(0.282px)}78%{opacity:0.979;transform:translateY(0.249px)}80%{opacity:0.982;transform:translateY(0.22px)}82%{opacity:0.984;transform:translateY(0.194px)}84%{opacity:0.986;transform:translateY(0.171px)}86%{opacity:0.987;transform:translateY(0.15px)}88%{opacity:0.989;transform:translateY(0.132px)}90%{opacity:0.99;transform:translateY(0.117px)}92%{opacity:0.991;transform:translateY(0.103px)}94%{opacity:0.992;transform:translateY(0.09px)}96%{opacity:0.993;transform:translateY(0.079px)}98%{opacity:0.994;transform:translateY(0.07px)}100%{opacity:1;transform:translateY(0px)}}
/* The day a record was just saved glows once on the home calendar. */
.day-cell.is-just-saved::after{content:"";position:absolute;inset:2px;border-radius:8px;pointer-events:none;background:color-mix(in srgb,var(--gold) 24%,transparent);animation:day-saved-glow .9s cubic-bezier(.2,.8,.2,1) forwards}
@keyframes day-saved-glow{0%{opacity:0;transform:scale(.92)}25%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(1)}}
/* Expense-based lines hold their place with a soft placeholder until expenses load. */
:is(.summary-ledger,.stats-net).is-loading :is(b,strong,#statsNetExpense,#summaryExpense){color:transparent;border-radius:6px;background:linear-gradient(90deg,var(--panel3) 0%,color-mix(in srgb,var(--panel3) 55%,var(--panel)) 50%,var(--panel3) 100%) 0 0/200% 100%;animation:ledger-wait 1.2s ease-in-out infinite}
@keyframes ledger-wait{0%{background-position:100% 0}100%{background-position:-100% 0}}
/* A just-saved expense row glows once. */
.expense-row.is-fresh{animation:row-fresh-glow 1s cubic-bezier(.2,.8,.2,1)}
@keyframes row-fresh-glow{0%,30%{background-color:color-mix(in srgb,var(--gold) 14%,transparent)}100%{background-color:transparent}}
/* Save buttons show a brief check after a successful save. */
.save-tick{display:inline-block;margin-left:6px;font-weight:700;animation:save-tick 1.2s cubic-bezier(.2,.8,.2,1) forwards}
@keyframes save-tick{0%{opacity:0;transform:scale(.6)}18%{opacity:1;transform:scale(1)}80%{opacity:1}100%{opacity:0}}
@media(prefers-reduced-motion:reduce){
  .save-tick{animation:none}
  .expense-row.is-fresh{animation:none}
  :is(.summary-ledger,.stats-net).is-loading :is(b,strong,#statsNetExpense,#summaryExpense){animation:none}
  .day-cell.is-just-saved::after{display:none}
  .settings-group::details-content,.settings-group > summary::after{transition:none}
  button,.full-btn,.secondary-btn,.measurement-guide-link{scale:1!important;transition-duration:0s!important}
  .ui-card-pending,.ui-card-entering{opacity:1;transform:none;animation:none;transition:none}
}
@media print{
  .ui-card-pending,.ui-card-entering{opacity:1;transform:none;animation:none;transition:none}
}
