/* ============================================================================
   MyRoof Modules — base: reset, typography, layout primitives.
   Loads AFTER tokens.css. Names no colour of its own.
   ============================================================================ */

/* ---- reset --------------------------------------------------------------- */
*,*::before,*::after{box-sizing:border-box}
*{margin:0;padding:0}
html{-webkit-text-size-adjust:100%}
body{
  font-family:var(--font-body);
  font-size:var(--fs-body);
  line-height:var(--lh-body);
  background:var(--bg);
  color:var(--text);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
  /* the theme flip is a fade, not a snap */
  transition:background-color var(--t-slow) ease,color var(--t-slow) ease;
}
img,svg,video{display:block;max-width:100%}
button,input,select,textarea{font:inherit;color:inherit}
button{background:none;border:none;cursor:pointer}
table{border-collapse:collapse;width:100%}
ul,ol{list-style:none}
::selection{background:var(--primary-soft)}

/* Anything focusable gets a visible ring — never `outline:none` without one. */
:focus-visible{outline:2px solid var(--primary);outline-offset:2px;border-radius:var(--r-chip)}

/* ---- type ---------------------------------------------------------------- */
h1,h2,h3,h4{font-family:var(--font-display);font-weight:600;letter-spacing:-.03em}
h1{font-size:var(--fs-h1);line-height:var(--lh-h1)}
h2{font-size:var(--fs-h2);line-height:var(--lh-h2)}
h3{font-size:var(--fs-h3);line-height:var(--lh-h3)}
.display{font-family:var(--font-display);font-size:var(--fs-display);line-height:var(--lh-display);font-weight:600;letter-spacing:-.035em}
a{color:var(--primary);text-decoration:none}
a:hover{text-decoration:underline}
p{max-width:var(--maxw-read)}
strong,b{font-weight:600}
code,kbd,samp,.mono{font-family:var(--font-mono);font-size:.92em}

.overline{font-size:var(--fs-micro);line-height:var(--lh-micro);letter-spacing:.08em;text-transform:uppercase;color:var(--neutral);font-weight:600}
.muted{color:var(--text-2)}
.dim{color:var(--neutral)}
.small{font-size:var(--fs-sm);line-height:var(--lh-sm)}
.xs{font-size:var(--fs-xs);line-height:var(--lh-xs)}
.num{font-variant-numeric:tabular-nums}   /* every column of figures */
.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}

/* screen-reader-only, still focusable */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* The only two visibility utilities. Anything more and the breakpoint logic
   has moved out of the components and into the markup. */
@media (max-width:860px){.hide-sm{display:none!important}}
@media (min-width:861px){.only-sm{display:none!important}}

/* ============================================================================
   LAYOUT PRIMITIVES
   Four shapes cover almost every screen: the app shell, the content column,
   the stack, and the grid. Reach for these before writing a new flex rule.
   ============================================================================ */

/* ---- app shell: sticky top bar + fixed sidebar + scrolling content -------- */
.app{min-height:100vh;display:flex;flex-direction:column}

.topbar{
  position:sticky;top:0;z-index:40;height:var(--nav-h);flex:none;
  display:flex;align-items:center;gap:var(--s2);padding:0 var(--s5);
  background:var(--glass);border-bottom:1px solid var(--border);
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
}
.topbar .spacer{flex:1}
/* Flex items refuse to shrink below their content by default; without this a
   fixed-width control in the bar makes the whole PAGE scroll sideways. */
.topbar > *{min-width:0}

.shell{flex:1;display:flex;align-items:flex-start;min-height:0}

.sidebar{
  position:sticky;top:var(--nav-h);flex:none;
  width:var(--side-w);height:calc(100vh - var(--nav-h));overflow-y:auto;
  padding:var(--s4) var(--s3);border-right:1px solid var(--border);
  background:var(--surface);
}
.sidebar .nav-group + .nav-group{margin-top:var(--s5)}
.sidebar .overline{padding:0 var(--s3) var(--s2)}

.content{flex:1;min-width:0;padding:var(--s5)}

/* ---- content column ------------------------------------------------------ */
.wrap{width:100%;max-width:var(--maxw);margin-inline:auto}
.wrap-read{width:100%;max-width:var(--maxw-read);margin-inline:auto}

/* page heading block — title, subtitle, and the actions that belong to it */
.page-head{display:flex;align-items:flex-start;gap:var(--s4);margin-bottom:var(--s5);flex-wrap:wrap}
.page-head .page-title{flex:1;min-width:220px}
.page-head .page-title p{margin-top:var(--s1);color:var(--text-2);font-size:var(--fs-sm)}
.page-head .page-actions{display:flex;gap:var(--s2);align-items:center}

/* section divider inside a long page */
.section{margin-bottom:var(--s7)}
.section-head{display:flex;align-items:baseline;gap:var(--s3);margin-bottom:var(--s4);padding-bottom:var(--s2);border-bottom:1px solid var(--border)}
.section-head h2{flex:none}
.section-head p{color:var(--text-2);font-size:var(--fs-sm);margin:0}

/* ---- stack: vertical rhythm without margin-collapse guesswork ------------- */
.stack   {display:flex;flex-direction:column;gap:var(--s4)}
.stack-sm{display:flex;flex-direction:column;gap:var(--s2)}
.stack-lg{display:flex;flex-direction:column;gap:var(--s5)}

/* ---- row: horizontal, wraps by default ----------------------------------- */
.row{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap}
.row-tight{display:flex;align-items:center;gap:var(--s1);flex-wrap:wrap}
.row-between{display:flex;align-items:center;gap:var(--s3);justify-content:space-between;flex-wrap:wrap}

/* ---- grid: auto-fit cards; min column width is the only knob -------------- */
.grid{display:grid;gap:var(--s4);grid-template-columns:repeat(auto-fit,minmax(var(--col,260px),1fr))}
.grid-2{display:grid;gap:var(--s4);grid-template-columns:repeat(2,1fr)}
.grid-3{display:grid;gap:var(--s4);grid-template-columns:repeat(3,1fr)}
.grid-4{display:grid;gap:var(--s4);grid-template-columns:repeat(4,1fr)}
.span-all{grid-column:1/-1}

/* main + aside split (detail screens) */
.split{display:grid;gap:var(--s5);grid-template-columns:minmax(0,1fr) 320px;align-items:start}

@media (max-width:1080px){
  .grid-4{grid-template-columns:repeat(2,1fr)}
  .split{grid-template-columns:minmax(0,1fr)}
}
@media (max-width:860px){
  .sidebar{display:none}
  .grid-3{grid-template-columns:repeat(2,1fr)}
  .content{padding:var(--s4)}
}
@media (max-width:640px){
  .topbar{padding:0 var(--s3)}
  .grid-2,.grid-3,.grid-4{grid-template-columns:1fr}
  .content{padding:var(--s3)}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}
