/*!
 * Rubymaze UI kit — splash, loaders, progress, skeletons.
 * Requires ../10-design-tokens/tokens.css (load it first). Light / dark follow the tokens:
 *   <html data-theme="light|dark"> forces a theme, otherwise the OS decides.
 * Motion: honours prefers-reduced-motion, and <html data-motion="reduce"> forces it (for testing / an in-app switch).
 */

/* ───────── shared ───────── */
.rm-sr { position: absolute !important; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap; border: 0; }
.rm-mark { display: block; width: 100%; height: auto; overflow: visible; }
html.rm-lock { overflow: hidden; }

/* the mark ships in two renderings; show the one that suits the active theme */
.rm-v-dark { display: none; }
:root[data-theme="dark"] .rm-v-light { display: none; }
:root[data-theme="dark"] .rm-v-dark { display: inline; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .rm-v-light { display: none; }
  :root:not([data-theme="light"]) .rm-v-dark { display: inline; }
}

rm-splash, rm-loader { --rm-bloom: .20; }
:root[data-theme="dark"] rm-splash, :root[data-theme="dark"] rm-loader { --rm-bloom: .40; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) rm-splash, :root:not([data-theme="light"]) rm-loader { --rm-bloom: .40; }
}

/* ───────── splash ───────── */
rm-splash {
  position: fixed; inset: 0; z-index: 2147483000;
  display: grid; place-items: center;
  background:
    radial-gradient(64% 52% at 50% 46%, rgb(var(--rm-rgb-primary) / .14) 0%, transparent 70%),
    var(--rm-color-splash-bg);
  box-shadow: inset 0 0 180px rgb(var(--rm-rgb-text) / .07);
  color: var(--rm-color-text);
}
rm-splash[contained] { position: absolute; z-index: 5; }
rm-splash[hidden], rm-loader[hidden] { display: none; }
.rm-splash__stage { position: relative; width: min(600px, 86vw); aspect-ratio: 720 / 560; display: grid; place-items: center; }
.rm-splash__gem { position: relative; width: 54.7%; opacity: 0; transform-origin: 50% 55%;
  animation: rm-gem-in 680ms var(--rm-ease-emphasized) 60ms forwards; }
.rm-splash__bloom {
  position: absolute; inset: 14% 8%; border-radius: 50%; opacity: 0; filter: blur(26px);
  background: radial-gradient(closest-side, rgb(var(--rm-rgb-accent) / var(--rm-bloom)), rgb(var(--rm-rgb-primary) / 0) 72%);
  animation: rm-bloom 1500ms ease-out both;
}
.rm-echo { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.rm-echo path { fill: none; stroke: rgb(var(--rm-rgb-text) / .22); stroke-width: 1.6; stroke-linejoin: round; stroke-dasharray: 100; stroke-dashoffset: 100;
  animation: rm-draw 1300ms var(--rm-ease-standard) 140ms forwards; }
.rm-echo path + path { stroke: rgb(var(--rm-rgb-primary) / .5); animation-delay: 340ms; }
.rm-glint { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; overflow: visible; mix-blend-mode: screen; }
.rm-glint__band { animation: rm-glint 1050ms cubic-bezier(.45, 0, .25, 1) 560ms both; }
:root:not([data-theme="dark"]) .rm-glint { mix-blend-mode: normal; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) .rm-glint { mix-blend-mode: screen; } }
.rm-splash__caption {
  position: absolute; left: 0; right: 0; bottom: max(36px, env(safe-area-inset-bottom));
  text-align: center; font: 600 11px/1 var(--rm-font-display); letter-spacing: .36em; text-indent: .36em; text-transform: uppercase;
  color: var(--rm-color-text-subtle); opacity: 0; animation: rm-fade 520ms ease-out 760ms forwards;
}
rm-splash.is-leaving { animation: rm-leave 360ms var(--rm-ease-standard) forwards; }

@keyframes rm-gem-in { 0% { opacity: 0; transform: translateY(10px) scale(.93); filter: blur(10px); } 55% { opacity: 1; filter: blur(0); } 100% { opacity: 1; transform: none; filter: blur(0); } }
@keyframes rm-bloom { 0% { opacity: 0; transform: scale(.78); } 55% { opacity: 1; } 100% { opacity: .75; transform: scale(1.06); } }
@keyframes rm-draw { to { stroke-dashoffset: 0; } }
@keyframes rm-glint { from { transform: translateX(-120px); } to { transform: translateX(600px); } }
@keyframes rm-fade { to { opacity: 1; } }
@keyframes rm-leave { to { opacity: 0; } }

/* ───────── full-page loader ───────── */
rm-loader {
  position: fixed; inset: 0; z-index: 2147482000; display: grid; place-items: center;
  background: rgb(var(--rm-rgb-background) / .9);
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
  color: var(--rm-color-text); outline: none;
  animation: rm-fade-in var(--rm-duration-base) var(--rm-ease-standard) both;
}
rm-loader[contained] { position: absolute; z-index: 4; }
.rm-loader__box { position: relative; display: grid; justify-items: center; gap: 26px; width: min(340px, 78vw); }
.rm-loader__box::before {
  content: ""; position: absolute; z-index: -1; width: 220px; height: 220px; top: -60px; border-radius: 50%; filter: blur(30px);
  background: radial-gradient(closest-side, rgb(var(--rm-rgb-accent) / var(--rm-bloom)), transparent 72%);
  animation: rm-bloom-pulse var(--rm-duration-pulse) ease-in-out infinite;
}
.rm-loader__gem { width: 112px; animation: rm-pulse var(--rm-duration-pulse) ease-in-out infinite; transform-origin: 50% 55%; }
.rm-loader__box rm-progress { width: 100%; }
.rm-loader__label { font: 600 11px/1 var(--rm-font-display); letter-spacing: .3em; text-indent: .3em; text-transform: uppercase; color: var(--rm-color-text-muted); }
@keyframes rm-fade-in { from { opacity: 0; } }
@keyframes rm-pulse {
  0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 rgb(var(--rm-rgb-primary) / 0)); }
  50% { transform: scale(1.05); filter: drop-shadow(0 8px 24px rgb(var(--rm-rgb-primary) / .5)); }
}
@keyframes rm-bloom-pulse { 0%, 100% { opacity: .35; transform: scale(.92); } 50% { opacity: 1; transform: scale(1.08); } }

/* ───────── inline spinner ───────── */
rm-spinner { display: inline-block; vertical-align: middle; line-height: 0; }
.rm-spinner { display: inline-block; }
.rm-spinner--sm { width: 22px; } .rm-spinner--md { width: 36px; } .rm-spinner--lg { width: 64px; }
.rm-spinner .rm-pulse { animation: rm-pulse-sm 1500ms ease-in-out infinite; }
@keyframes rm-pulse-sm { 0%, 100% { transform: scale(.94); opacity: .78; } 50% { transform: scale(1.04); opacity: 1; } }

/* ───────── maze-path progress ───────── */
rm-progress { display: block; }
.rm-progress { width: 100%; }
.rm-progress__row { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; font: 600 12px/1 var(--rm-font-display); letter-spacing: .06em; color: var(--rm-color-text-muted); }
.rm-progress__row b { color: var(--rm-color-text); font-variant-numeric: tabular-nums; }
.rm-progress svg { display: block; width: 100%; height: auto; overflow: visible; }
.rm-progress path { fill: none; stroke-width: 6; stroke-linejoin: miter; stroke-miterlimit: 4; stroke-linecap: butt; }
.rm-progress__track { stroke: var(--rm-color-border); }
.rm-progress__bar { stroke: var(--rm-color-primary); stroke-dasharray: calc(var(--rm-p, 0) * 1) 100; transition: stroke-dasharray var(--rm-duration-slow) var(--rm-ease-standard); filter: drop-shadow(0 0 6px rgb(var(--rm-rgb-primary) / .55)); }
.rm-progress.is-indeterminate .rm-progress__bar { stroke-dasharray: 22 78; stroke-dashoffset: 22; animation: rm-trace var(--rm-duration-maze) linear infinite; transition: none; }
@keyframes rm-trace { from { stroke-dashoffset: 22; } to { stroke-dashoffset: -100; } }

/* ───────── skeletons ───────── */
rm-skeleton { display: block; }
.rm-skeleton { position: relative; display: block; overflow: hidden; background: var(--rm-color-skeleton-base); border-radius: var(--rm-radius-sm); }
.rm-skeleton::after { content: ""; position: absolute; inset: 0; transform: translateX(-100%);
  background: linear-gradient(100deg, transparent 18%, var(--rm-color-skeleton-highlight) 50%, transparent 82%);
  animation: rm-shimmer var(--rm-duration-shimmer) ease-in-out infinite; }
@keyframes rm-shimmer { to { transform: translateX(100%); } }
.rm-skeleton--line { height: 12px; margin: 0 0 10px; }
.rm-skeleton--title { height: 22px; margin: 0 0 14px; border-radius: var(--rm-radius-sm); }
.rm-skeleton--stat { height: 34px; margin: 10px 0 12px; }
.rm-skeleton--circle { border-radius: 50%; }
.rm-skeleton--image { width: 100%; aspect-ratio: 16 / 9; border-radius: 0; }
.rm-skeleton--button { display: inline-block; width: 112px; height: 40px; border-radius: 0; }
.rm-skeleton--chamfer { --c: 12px; border-radius: 0;
  clip-path: polygon(0 0, calc(100% - var(--c)) 0, 100% var(--c), 100% 100%, var(--c) 100%, 0 calc(100% - var(--c))); }
.rm-sk-card { --c: 16px; display: block; background: var(--rm-color-surface); border: 1px solid var(--rm-color-border);
  clip-path: polygon(0 0, calc(100% - var(--c)) 0, 100% var(--c), 100% 100%, var(--c) 100%, 0 calc(100% - var(--c))); }
.rm-sk-card__body { display: block; padding: 18px 18px 20px; }
.rm-sk-card__foot { display: flex; align-items: center; justify-content: space-between; margin-top: 18px; }
.rm-sk-card__foot .rm-skeleton--line { margin: 0; }
.rm-sk-row { display: flex; align-items: center; gap: 14px; padding: 10px 0; }
.rm-sk-col { display: block; flex: 1; min-width: 0; }
.rm-sk-col .rm-skeleton--line { margin-bottom: 9px; } .rm-sk-col .rm-skeleton--line:last-child { margin-bottom: 0; }
.rm-sk-stat { display: block; padding: 18px; background: var(--rm-color-surface); border: 1px solid var(--rm-color-border); }

/* ───────── small button set (used by the demo; handy for apps) ───────── */
.rm-btn { --c: 10px; display: inline-flex; align-items: center; gap: 10px; min-height: 44px; padding: 0 22px; border: 0; cursor: pointer;
  font: 600 14px/1 var(--rm-font-display); letter-spacing: .02em; color: var(--rm-color-on-primary); background: var(--rm-color-primary);
  clip-path: polygon(var(--c) 0, 100% 0, 100% calc(100% - var(--c)), calc(100% - var(--c)) 100%, 0 100%, 0 var(--c)); transition: background var(--rm-duration-fast) var(--rm-ease-standard); }
.rm-btn:hover { background: var(--rm-color-primary-hover); }
.rm-btn:active { background: var(--rm-color-primary-active); }
.rm-btn:focus-visible { outline: 3px solid var(--rm-color-focus-ring); outline-offset: 3px; }
.rm-btn--secondary { background: var(--rm-color-secondary); color: var(--rm-color-on-secondary); }
.rm-btn--secondary:hover { background: var(--rm-color-secondary-hover); }
.rm-btn[aria-busy="true"] { pointer-events: none; opacity: .92; }

/* ───────── reduced motion: no movement, nothing flashes; states stay legible ───────── */
@media (prefers-reduced-motion: reduce) {
  rm-splash, rm-loader, rm-spinner, rm-progress, rm-skeleton, rm-splash *, rm-loader *, rm-spinner *, rm-progress *, rm-skeleton *, .rm-skeleton, .rm-skeleton::after { animation: none !important; transition: none !important; }
  .rm-splash__gem, .rm-splash__caption { opacity: 1; }
  .rm-splash__bloom { opacity: .6; }
  .rm-echo path { stroke-dashoffset: 0; }
  .rm-glint { display: none; }
  .rm-skeleton::after { display: none; }
  .rm-progress.is-indeterminate .rm-progress__bar { stroke-dasharray: 100 0; opacity: .38; }
}
:root[data-motion="reduce"] :is(rm-splash, rm-loader, rm-spinner, rm-progress, rm-skeleton, .rm-skeleton, .rm-skeleton::after),
:root[data-motion="reduce"] :is(rm-splash, rm-loader, rm-spinner, rm-progress, rm-skeleton) * { animation: none !important; transition: none !important; }
:root[data-motion="reduce"] :is(.rm-splash__gem, .rm-splash__caption) { opacity: 1; }
:root[data-motion="reduce"] .rm-splash__bloom { opacity: .6; }
:root[data-motion="reduce"] .rm-echo path { stroke-dashoffset: 0; }
:root[data-motion="reduce"] .rm-glint, :root[data-motion="reduce"] .rm-skeleton::after { display: none; }
:root[data-motion="reduce"] .rm-progress.is-indeterminate .rm-progress__bar { stroke-dasharray: 100 0; opacity: .38; }
