/* ───────────────────────────────────────────────────────────────────────────
   Alleen wat MudBlazor niet zelf kan. Alle kleuren en lettergroottes van de
   interface staan in BoekhoudingTheme.cs; dit bestand voegt daar twee dingen
   aan toe: de grootboekconventies voor cijferkolommen, en de handvol regels
   die de Identity-pagina's nodig hebben omdat die op Bootstrap leunen.
   ─────────────────────────────────────────────────────────────────────────── */

/* ─── De letters, zelf gehost ───────────────────────────────────────────────
   DM Sans en DM Mono staan in wwwroot/fonts/ en niet bij Google. Spec §4 stelde
   dat uit; de eigenaar heeft het op 19 september 2026 alsnog besloten, en om
   twee redenen die beide zwaarder wegen dan het gemak van een <link>:

   1. De applicatie draait volledig op zijn NAS. Een externe request bij elke
      paginalading maakt Google medeplichtig aan wie wanneer zijn boekhouding
      opent, en maakt het inloggen afhankelijk van een host die niet de zijne is.
   2. Fase 1h krijgt een Content-Security-Policy. Zelf hosten houdt die dicht:
      geen font-src of style-src naar googleapis.com en gstatic.com.

   DM Sans is een variabele letter — één bestand dekt 400 tot 600, vandaar
   `font-weight: 400 600`. DM Mono heeft een bestand per gewicht. Per letter
   twee subsets: latin, en latin-ext voor de diakrieten in buitenlandse
   relatienamen. Zes bestanden, samen 102 kB (104.136 bytes, nageteld in
   wwwroot/fonts/ — er stond 116 kB en dat klopte niet); de unicode-ranges komen
   ongewijzigd uit het antwoord van de Google Fonts API, zodat de browser
   latin-ext alleen ophaalt als een pagina die tekens werkelijk gebruikt.

   `font-display: swap`: liever direct leesbare tekst in de systeemletter dan
   een lege tabel terwijl er 37 kB onderweg is.

   Beide letters staan onder de SIL Open Font License 1.1 — zie
   fonts/OFL.txt. Die licentie staat zelf hosten uitdrukkelijk toe.
   ─────────────────────────────────────────────────────────────────────────── */

@font-face {
    font-family: "DM Sans";
    font-style: normal;
    font-weight: 400 600;
    font-display: swap;
    src: url("fonts/dm-sans-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: "DM Sans";
    font-style: normal;
    font-weight: 400 600;
    font-display: swap;
    src: url("fonts/dm-sans-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: "DM Mono";
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url("fonts/dm-mono-400-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: "DM Mono";
    font-style: normal;
    font-weight: 400;
    font-display: swap;
    src: url("fonts/dm-mono-400-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

@font-face {
    font-family: "DM Mono";
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("fonts/dm-mono-500-latin.woff2") format("woff2");
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

@font-face {
    font-family: "DM Mono";
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("fonts/dm-mono-500-latin-ext.woff2") format("woff2");
    unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

html, body {
    /* De FontFamily uit het thema geldt voor MudBlazor-componenten. Dit vangt
       de Identity-pagina's, die buiten MudLayout om worden gerenderd. */
    font-family: "DM Sans", "Segoe UI", system-ui, sans-serif;
}

/* ─── Grootboekconventies ──────────────────────────────────────────────────
   Zet .bedrag op elke kolom met een geldbedrag en .codeveld op kolommen met
   een grootboeknummer, boekstuknummer, factuurnummer, IBAN of datum. In een
   MudDataGrid gaat dat via CellClass op de kolom.
   ─────────────────────────────────────────────────────────────────────────── */

.bedrag {
    font-family: "DM Mono", Consolas, monospace;
    /* Gewicht 500 en niet 400: DM Mono is een lichte letter, en op het koele
       grijs van het thema wordt een lange kolom bedragen anders bleek. */
    font-weight: 500;
    /* Dit is de ingreep met het grootste effect per regel CSS: hiermee staan
       de komma's in een kolom onder elkaar. */
    font-variant-numeric: tabular-nums;
    text-align: right;
    white-space: nowrap;
}

.codeveld {
    font-family: "DM Mono", Consolas, monospace;
    font-weight: 500;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* De kolomkop boven een .bedrag-kolom hoort mee naar rechts. De inhoud van
   een MudDataGrid-kop is een flexbox met de sorteerknop erin, dus dit gaat
   via justify-content en niet via text-align. Zet HeaderClass="bedrag-kop"
   op dezelfde kolom die CellClass="bedrag" heeft.

   De selector hier stond op `.bedrag-kop .mud-table-cell-content`, en die
   klasse bestaat niet. Nagekeken in MudBlazor 9.10.0 zelf — noch
   MudBlazor.min.css noch MudBlazor.dll bevat de tekst
   `mud-table-cell-content` — en dat is dezelfde fout als de klassenaam uit
   spec §9.1: uit het geheugen opgeschreven, en een CSS-selector die niets
   raakt geeft geen foutmelding. Wat MudBlazor werkelijk rendert in een
   MudDataGrid-kop is:

       th.mud-table-cell > div.column-header
           > span.sortable-column-header   (alleen als de kolom sorteerbaar is)
           > div.column-options            (sorteericoon, filter, menu)

   met in MudBlazor.min.css:
       .mud-data-grid .mud-table-cell .column-header
           { display:flex; align-items:center; justify-content:space-between }
       .mud-data-grid .mud-table-cell .column-header .sortable-column-header
           { width:100% }

   Dit werkt op een **niet-sorteerbare** kolom, zoals de TemplateColumn
   "Verschil" op /reconciliatie: daar staat de titel als tekst rechtstreeks in
   de flexbox en schuift `justify-content` hem naar rechts.

   ── Op een sorteerbare kolom lukt het niet, en dat is uitgezocht ──────────
   Op /boekingen blijft de kop "Totaal" links staan boven rechts uitgelijnde
   bedragen. Daar is de titel namelijk gewikkeld in een eigen
   `span.sortable-column-header`, en daar staat naast een `.column-options` met
   de sorteerknop en het kolommenu. Die icoontjes hebben `opacity: 0` tot je
   hovert — je ziet ze niet, maar ze nemen ruimte in aan de rechterkant.

   Twee pogingen, beide gemeten in de browser en beide zonder zichtbaar
   effect, dus beide **teruggedraaid** in plaats van bewaard:

   1. `text-align: right` op die span. Kwam wél aan (computed: right), maar de
      span is 40px breed bij een kop van 96px — precies de breedte van het
      woord. Rechts uitlijnen in een doos die om de tekst heen past verschuift
      niets.
   2. `flex: 1` erbij, om die span te laten groeien. Ook geen zichtbaar
      verschil; de kop bleef links staan.

   Wat overblijft is optie 3: `.column-options` uit de stroom halen met
   `position: absolute`. Dat grijpt in op de opbouw van een
   MudBlazor-component en vraagt dat hover en klikken opnieuw worden
   nagekeken. **De eigenaar heeft op 20 september 2026 besloten het zo te
   laten** — hij vindt de kop links acceptabel. Daarom staat hier één regel en
   geen tweede: een CSS-selector die niets raakt geeft geen foutmelding, en
   juist zo'n dode regel heeft deze cyclus al een scheve kolom gekost (zie
   spec §9.4).

   De selector begint met `.mud-data-grid .mud-table-cell` omdat de regels van
   MudBlazor zelf drie klassen diep zijn; `.bedrag-kop .column-header` alleen
   zou eronder blijven. */
.mud-data-grid .mud-table-cell.bedrag-kop .column-header {
    justify-content: flex-end;
}

/* Kolomkoppen als versaal label, niet als gewone tekst. */
.mud-table-head .mud-table-cell {
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--mud-palette-text-secondary);
}

/* Lijnvoering van een grootboek: een zware lijn onder de kolomkoppen,
   haarlijnen tussen de regels (die zet MudBlazor zelf via TableLines). */
.mud-table-head .mud-table-row {
    border-bottom: 1px solid var(--mud-palette-lines-inputs);
}

/* Een totaalregel: een lijn erboven en een dubbele lijn eronder. Zet
   class="totaal" op de rij; alleen het eindtotaal krijgt de dubbele lijn,
   subtotalen houden één lijn.

   Twee selectors, en de tweede is de reparatie van de fixronde van
   20 september 2026. `.mud-table-row` en `.mud-table-cell` zet MudBlazor alleen
   in een MudDataGrid; in een MudSimpleTable schrijf je zelf <tr> en <td> en
   staan die klassen er niet. In de twee MudSimpleTables van deze cyclus — de
   "Verschil"-regel op de balans en de "Totaal"-regel in de afsluitdialoog —
   deed `class="totaal"` dus NIETS. Precies het dode-CSS-geval waar het
   commentaar hierboven zelf voor waarschuwt, en een selector die niets raakt
   geeft geen foutmelding.

   De tweede selector is bewust `.mud-table tr.<klasse> > td` en niet
   `tr.<klasse> > td`: zo blijft hij binnen een MudBlazor-tabel en raakt hij
   geen tabel van de Identity-pagina's, die Bootstrap gebruiken. */
.mud-table-row.totaal .mud-table-cell,
.mud-table tr.totaal > td {
    border-top: 1px solid var(--mud-palette-lines-inputs);
    border-bottom: 3px double var(--mud-palette-lines-inputs);
    font-weight: 600;
}

/* De subtotaalregel die de regel hierboven al aankondigde maar die nog niet
   bestond: één lijn erboven en geen dubbele lijn eronder. Toegevoegd voor de
   winst-en-verliesrekening, waar "Totaal omzet" en "Totaal kosten" boven het
   resultaat staan; drie dubbele lijnen op één grid maakt het eindtotaal
   onherkenbaar. */
.mud-table-row.subtotaal .mud-table-cell,
.mud-table tr.subtotaal > td {
    border-top: 1px solid var(--mud-palette-lines-inputs);
    font-weight: 600;
}

/* Rijen die aanklikbaar zijn, moeten dat ook lijken. Gebruikt door
   JournalEntries en OpenItems via RowClass. */
.cursor-pointer {
    cursor: pointer;
}

/* ─── Identity-pagina's ────────────────────────────────────────────────────
   Deze schermen komen uit de ASP.NET Core Identity-template en gebruiken
   Bootstrap in plaats van MudBlazor. De kleuren staan hier als hexcode en
   niet als --mud-palette-variabele, omdat die variabelen pas bestaan waar
   MudThemeProvider heeft gerenderd. Ze houden wel dezelfde waarden als het
   accent en de foutkleur uit BoekhoudingTheme.
   ─────────────────────────────────────────────────────────────────────────── */

/* Bootstrap zet in bootstrap-reboot `scroll-behavior: smooth` op :root, en in
   Firefox slikt die animatie de eerste scrollbeweging van een touchpad op: het
   scherm beweegt mee zonder te scrollen en pas de tweede beweging werkt. In
   Chrome valt het niet op. Deze regel staat ná Bootstrap in App.razor en zet
   het terug op de standaard.

   De strekking is smaller geworden dan toen deze regel werd toegevoegd: sinds
   Bootstrap alleen nog onder /Account wordt geladen (spec §6), lekt
   `scroll-behavior: smooth` buiten de Identity-schermen niet meer. De regel is
   dus alleen nog voor díe schermen nodig — en verdwijnt zodra hun ombouw naar
   MudBlazor Bootstrap helemaal weghaalt. Zolang die stylesheet meekomt, blijft
   deze regel staan. */
:root {
    scroll-behavior: auto;
}

a, .btn-link {
    color: #2C5A7A;
}

.btn-primary {
    color: #fff;
    background-color: #2C5A7A;
    border-color: #244A66;
}

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus,
.form-control:focus, .form-check-input:focus {
    box-shadow: 0 0 0 .25rem rgba(44, 90, 122, .25);
}

.darker-border-checkbox.form-check-input {
    border-color: #8794A1;
}

.form-floating > .form-control-plaintext::placeholder,
.form-floating > .form-control::placeholder {
    color: var(--bs-secondary-color);
    text-align: end;
}

.form-floating > .form-control-plaintext:focus::placeholder,
.form-floating > .form-control:focus::placeholder {
    text-align: start;
}

/* ─── Validatie ───────────────────────────────────────────────────────────── */

.valid.modified:not([type=checkbox]) {
    outline: 1px solid #2E6B4E;
}

.invalid {
    outline: 1px solid #A03E2A;
}

.validation-message {
    color: #A03E2A;
    font-size: .8rem;
}
