/*
    Delade panelklasser för Common/ExpandablePanel. Laddas globalt av varje host (Portal:
    wwwroot/index.html) — utan <link>-raden saknar panelen all layout och renderar som staplade divar.

    Två inline-satta custom properties på slotten styr all höjd:
      --hammar-panel-max-height       max-höjd i expanderat läge (default 360px ≈ 10 dense-rader)
      --hammar-panel-full-max-height  valfritt tak även i fullskärm (default none = fyll ytan)
*/

.hammar-panel {
    display: flex;
    flex-direction: column;
    /* Utan detta vägrar en flex-item krympa under sitt innehålls storlek, och body:ns overflow
       skulle aldrig slå in — panelen skulle växa med tabellen i stället för att skrolla. */
    min-height: 0;
    /* Klipper innehållet mot .mud-papers rundade hörn — en randig tabellrad som går ända ut
       fyrkantar annars underkanten. */
    overflow: hidden;
}

.hammar-panel__header {
    display: flex;
    align-items: center;
    /* HeaderActions kan bära riktiga knappar med text (CalendarRulesPanel: "Ny regel" + "Bygg om
       kalender") och panelen kan stå i en smal kolumn. MudBlazor sätter ingen white-space: nowrap
       på .mud-button, så utan wrap radbryts etiketterna INUTI knapparna i stället för att raden
       lägger sig om — och .hammar-panel { overflow: hidden } klipper det som ändå inte får plats. */
    flex-wrap: wrap;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    flex: 0 0 auto;
    cursor: pointer;
    user-select: none;
}

/* Rubriken ska bara se klickbar ut när klicket gör något. Utan AllowCollapse är rubrikklicket en
   no-op, och i fullskärm stänger man med X eller Escape — inte genom att klicka på raden. */
.hammar-panel--locked > .hammar-panel__header,
.hammar-panel--full > .hammar-panel__header {
    cursor: default;
}

.hammar-panel--disabled .hammar-panel__header {
    cursor: default;
    color: var(--mud-palette-text-disabled);
}

/* ...men en inaktiverad panel som står ÖPPEN går fortfarande att minimera (annars är användaren
   instängd i den, se SetStageAsync). Då ska rubriken se klickbar ut igen. */
.hammar-panel--disabled.hammar-panel--expanded > .hammar-panel__header {
    cursor: pointer;
}

/* Linje mellan rubrik och innehåll — bara när det finns något innehåll att skilja den från. */
.hammar-panel--expanded > .hammar-panel__header,
.hammar-panel--full > .hammar-panel__header {
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

/*
    Innehållet. Panelen är scroll-container i BÅDA axlarna — avsiktligt, med två följder:
      · .sticky-th (hammar-tables.css) fryser mot NÄRMASTE scroll-container, dvs. mot panelen i
        stället för mot sidan. Det är precis vad vi vill så snart panelen kapar höjden.
      · En bred tabell skrollar i sidled INNE i panelen i stället för att lämna över till
        .mud-main-content.
    overscroll-behavior hindrar skroll-kedjning: när panelen tagit slut ska sidan bakom inte börja åka.
*/
.hammar-panel__body {
    overflow: auto;
    overscroll-behavior: contain;
    flex: 1 1 auto;
    min-height: 0;
}

/* Minimerat läge göms med CSS i stället för att tas ur render-trädet: innehållet har redan
   renderats en gång, och att behålla det i DOM:en bevarar tabellens state (val, sortering,
   skrollposition) över en kollaps. */
.hammar-panel__body--hidden {
    display: none;
}

.hammar-panel--expanded > .hammar-panel__body {
    max-height: var(--hammar-panel-max-height, 360px);
}

.hammar-panel--full > .hammar-panel__body {
    max-height: var(--hammar-panel-full-max-height, none);
}

/* MudSimpleTables default-marginal ger annars en glipa mot scroll-containerns kant (samma sak som
   de befintliga max-height-tabellerna löser med Style="margin: 0;"). */
.hammar-panel__body > .mud-simple-table {
    margin: 0;
}

/*
    En tabell ska gå kant i kant med panelen — allt annat behöver luft. Tabellkomponenterna i huset
    växlar mellan tabellen och ett tomtillstånd (laddar-rad, IdleText, MudAlert), så paddingen kan
    inte sättas av anroparen en gång för alla: den måste följa vad som faktiskt renderas just nu.
*/
.hammar-panel__body:not(:has(> .mud-table)) {
    padding: 0.5rem 0.75rem;
}

/*
    ...men regeln ovan tittar bara på om en tabell finns, inte på om den är ENSAM. En panel med
    BLANDAT innehåll (kontrollrad + tabell — t.ex. leverantörens Kapacitet med Från/Till-pickers,
    eller Volymtrappan med sin Lägg till-knapp) tappar därför paddingen så fort tabellen renderas,
    och kontrollerna ligger kant i kant med panelkanten. Värre: paddingen kommer TILLBAKA i tomt/
    laddande läge, när tabellen inte finns, så layouten hoppar mellan tillstånden.
    Sådana paneler begär i stället padding uttryckligen via ContentClass, och får den i alla lägen.
    Priset är att tabellen paddas med — rätt avvägning här: den är ändå inte ensam om ytan.
*/
.hammar-panel__body--padded {
    padding: 0.5rem 0.75rem;
}

/* MudList bär egen lodrät padding ovanpå den panelen just gav → dubbel luft över första raden och
   under den sista. Panelen äger luften; listan ska bara vara rader. (Gäller varje list-baserad
   panel, t.ex. Stock/StockBalancePanel.) */
.hammar-panel__body > .mud-list {
    padding-top: 0;
    padding-bottom: 0;
}

/*
    .hammar-table finns till för att INTE bli scroll-container, så att rubriken kan frysa mot sidans
    skrollyta. Inuti panelen finns redan en scroll-container — då skulle klassens smala-skärm-regel
    (overflow-x: auto under 960 px) lägga en nästlad x-scroller under rubriken och döda .sticky-th
    igen, precis den fälla hammar-tables.css beskriver. Inuti panelen sköter panelen båda axlarna.
    (Den INRE .mud-table-container neutraliseras redan globalt av hammar-tables.css — utan det
    fryser rubriken inte här heller.)
*/
.hammar-panel__body .hammar-table {
    overflow-x: visible;
}

/*
    FULLSKÄRM — panelen ska fylla sidans innehållsyta, inte hela fönstret: AppBar och drawer ska
    vara kvar synliga och klickbara.

    FÄLLAN: ingen sida, MudPaper eller MudContainer är positionerad, så `absolute; inset: 0` skulle
    ankra mot <html> och täcka AppBaren. Och `absolute` inuti en scroll-container skrollar dessutom
    MED innehållet — panelen skulle glida ur bild så snart sidan var nedskrollad.

    Lösningen är paint-containment på skrollytan. `contain: paint` gör elementet till containing
    block även för position:fixed-ättlingar (css-contain), så `inset: 0` blir EXAKT
    .mud-main-content:s padding-box — under AppBaren (margin-top) och höger om drawern (margin-left)
    utan en enda magisk offset, och utan att följa med skrollen. Samma regel ger ett eget stacking
    context, så panelens z-index är lokal och kan aldrig nå över AppBaren.

    Regeln gäller BARA medan en panel faktiskt är i fullskärm (:has()) — i övrigt rörs inte layouten.
    overflow: hidden fryser sidan bakom och tar bort dess skrollbar; utan den blir en kvarlämnad
    skrollbar synlig till höger om en panel som utger sig för att vara fullskärm (skrollbaren ligger
    mellan padding-box och border-box, dit inset: 0 inte når).

    En host eller sida som vill begränsa fullskärmen till en mindre yta sätter .hammar-panel-scope
    på valfri ancestor och får samma behandling.
*/
.mud-main-content:has(.hammar-panel--full),
.hammar-panel-scope:has(.hammar-panel--full) {
    contain: paint;
    overflow: hidden;
}

.hammar-panel--full {
    position: fixed;
    inset: 0;
    /* Måste slå allt annat i skrollytan: .sticky-th är 1, MudBlazors egna innehålls-lager går upp
       till 5 (sticky-header-celler 2, .sticky-left/right 3, inline .mud-overlay 5). Vid lika
       z-index avgör DOM-ordningen, så en panel LÄNGRE NER på sidan målade annars sin frysta
       rubrikrad ovanpå overlayen. Högt värde är gratis: contain: paint kapslar in panelen i ett
       lokalt stacking context, så den kan ändå aldrig nå över AppBaren. */
    z-index: 10;
    border-radius: 0;
    /* !important därför att anroparens Class ofta är en MudBlazor-spacing-hjälpklass (mt-4, mb-2),
       och de är själva !important. På en fixed box med inset: 0 dras marginalen från den
       tillgängliga ytan — panelen skulle alltså hamna snett och bli för kort i fullskärm. */
    margin: 0 !important;
}

/* Platsen i flödet kollapsar när panelen går fixed. Slotten håller kvar ungefär sin höjd så att
   sidan bakom inte reflowar och skrollpositionen ligger kvar när man lämnar fullskärm. */
.hammar-panel-slot--full {
    min-height: var(--hammar-panel-max-height, 360px);
}
