/* /Components/Common/RichTextEditor.razor.rz.scp.css */
.rte-container[b-3mo8a1fqr3] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

/* Tyokalupalkki pysyy nakyvissa myos pitkassa dokumentissa, mutta vain silloin
   kun editori tai nappilista on aktiivisena (:focus-within). Muulloin palkki
   on staattinen ja palautuu editorin ylaosaan. Kiinnityskohta jattaa tilaa
   MudBlazorin kiinteaan ylapalkkiin - dense-palkin korkeus on 3/4
   teemamuuttujasta. Tausta on lapinakymaton, jotta teksti vierii palkin alta. */
.rte-toolbar[b-3mo8a1fqr3] {
    position: static;
    z-index: 2;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.15rem;
    padding: 0.4rem;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background-color: var(--mud-palette-surface);
}

.rte-container:focus-within .rte-toolbar[b-3mo8a1fqr3] {
    position: sticky;
    top: calc(var(--mud-appbar-height, 64px) * 0.75);
}

/* Dialogissa vieritys tapahtuu MudBlazorin .mud-dialog-content-laatikossa, jonka
   ylareunaa ei peita mikaan - ylapalkkia varten tehty siirtyma jattaisi palkin
   turhan alas ja irrottaisi sen editorin ylaosasta liian aikaisin. Valitsimen
   ensimmainen osa on dialogin oma luokka, joten se osuu myos ilman taman
   komponentin scope-attribuuttia.

   Arvo on negatiivinen, koska sticky mittaa siirtyman vierityssailion
   SISALTOLAATIKON ylareunasta, ei nakyvan alueen ylareunasta: .mud-dialog-content
   on padding: 8px 24px, joten top: 0 jattaisi palkin ja dialogin otsikkoalueen
   valiin 8px raon, jossa vieriva teksti nakyy. -8px kumoaa pehmusteen, jolloin
   palkki asettuu tasan otsikkoalueen alareunaan. Jos MudBlazor muuttaa dialogin
   pehmustetta, tama arvo on paivitettava. */
.mud-dialog-content .rte-container:focus-within .rte-toolbar[b-3mo8a1fqr3] {
    top: -8px;
}

/* Lukutilassa kaikki painikkeet ovat pois kaytosta, joten palkin ei tarvitse
   seurata vierimista eika viedaa tilaa luettavalta sisallolta. */
.rte-container-readonly .rte-toolbar[b-3mo8a1fqr3] {
    position: static;
}

/* Toisiinsa kuuluvat painikkeet pysyvat yhdessa kun palkki rivittyy: rivitys tapahtuu
   ryhmien valissa, ei niiden sisalla. */
.rte-toolbar-group[b-3mo8a1fqr3] {
    display: flex;
    align-items: stretch;
    gap: 0.1rem;
}

/* Lista ja sen tyylialasveto ovat yksi kontrolli, joten niiden valissa ei ole rakoa. */
.rte-toolbar-group-joined[b-3mo8a1fqr3] {
    gap: 0;
}

/* Ohut viiva ryhmien valissa. Palkki on flex, joten korkeus on annettava
   erikseen - stretch venyttaisi viivan koko palkin korkuiseksi. */
.rte-separator[b-3mo8a1fqr3] {
    align-self: center;
    width: 1px;
    height: 20px;
    margin: 0 0.15rem;
    background-color: var(--mud-palette-lines-default);
}

/* Kapealla naytolla palkki rivittyy, ja rivin alkuun jaava erotin nayttaisi
   virheelta. CSS ei tunnista rivinvaihtoa, joten erottimet piilotetaan
   kokonaan ja ryhmat erotetaan valjemmalla raolla. */
@media (max-width: 599px) {
    .rte-separator[b-3mo8a1fqr3] {
        display: none;
    }

    .rte-toolbar[b-3mo8a1fqr3] {
        gap: 0.5rem;
    }
}

/* Painikkeen varit tulevat per-tila-muuttujista, jotka osoittavat MudBlazorin
   palettiin. Rakenne on Tiptapin UI Componentsista, arvot eivat: tumma tila ei
   tarvitse omia saantoja, koska Mud vaihtaa palettimuuttujat itse. Uusi
   painiketyyppi maarittelee vain nama muuttujat uudelleen. */
.rte-btn[b-3mo8a1fqr3] {
    --rte-btn-bg: transparent;
    --rte-btn-hover-bg: var(--mud-palette-action-default-hover);
    --rte-btn-active-bg: var(--mud-palette-primary-hover);
    --rte-btn-fg: var(--mud-palette-text-secondary);
    --rte-btn-hover-fg: var(--mud-palette-text-primary);
    --rte-btn-active-fg: var(--mud-palette-primary);

    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 32px;
    height: 32px;
    border: none;
    border-radius: 12px;
    background-color: var(--rte-btn-bg);
    color: var(--rte-btn-fg);
    padding: 8px;
    font-size: 0.85rem;
    line-height: 1.2;
    cursor: pointer;
    transition: background-color 0.2s cubic-bezier(0.46, 0.03, 0.52, 0.96),
                color 0.2s cubic-bezier(0.46, 0.03, 0.52, 0.96);
}

/* Ikoni tayttaa 32 px:n painikkeen sisaosan (32 - 2 * 8 px padding). MudIconin
   oletusmarginaali on tarkoitettu tekstin viereen, joten se nollataan. Varia ei
   aseteta: MudBlazorin .mud-icon-root.mud-svg-icon on fill: currentColor, joten
   ikoni seuraa painikkeen aktiivi- ja hover-varia itsestaan. */
.rte-btn[b-3mo8a1fqr3]  .mud-icon-root {
    width: 16px;
    height: 16px;
    font-size: 16px;
    margin: 0;
}

/* Latauksen etenemiskeha samaan tilaan kuin ikoni. */
.rte-btn[b-3mo8a1fqr3]  .mud-progress-circular {
    width: 16px;
    height: 16px;
    color: inherit;
}

.rte-btn:hover:not(:disabled)[b-3mo8a1fqr3] {
    background-color: var(--rte-btn-hover-bg);
    color: var(--rte-btn-hover-fg);
}

.rte-btn:disabled[b-3mo8a1fqr3] {
    opacity: 0.6;
    cursor: not-allowed;
}

/* Aktiivinen painike on vaalea tausta ja brandivarinen sisalto, ei taytetty
   varilaatta. Tila luetaan data-attribuutista, ei luokasta. */
.rte-btn[data-active-state="on"][b-3mo8a1fqr3] {
    background-color: var(--rte-btn-active-bg);
    color: var(--rte-btn-active-fg);
}

/* Aktiivisen painikkeen hover tarvitsee oman saannon, koska :hover voittaisi
   muuten aktiivitilan. color-mix antaa hieman vahvemman saman savyn; vanhempi
   selain jattaa sen huomiotta ja kayttaa edellista rivia. */
.rte-btn[data-active-state="on"]:hover:not(:disabled)[b-3mo8a1fqr3] {
    background-color: var(--rte-btn-active-bg);
    background-color: color-mix(in srgb, var(--mud-palette-primary) 16%, transparent);
    color: var(--rte-btn-active-fg);
}

/* Listaparin poikkeukset perustyylista. Nama saannot ohittavat .rte-btn:n
   leveyden, pyoristyksen ja ikonikoon, joten niiden on oltava tiedostossa
   .rte-btn-saantojen JALKEEN: valitsimien tarkkuus on sama, jolloin
   lahdejarjestys ratkaisee. Ylempana ne eivat vaikuta lainkaan. */

/* Painike, johon on liitetty kapea avaaja: pyoristys vain vasemmasta reunasta,
   jotta pari nayttaa yhdelta kontrollilta. */
.rte-btn-joined[b-3mo8a1fqr3] {
    border-radius: 12px 0 0 12px;
}

/* Kapea avaaja tyylivalikolle. Sama ghost-tyyli kuin painikkeilla, mutta puolet
   kapeampi ja pyoristys vain oikeasta reunasta. Aktiivitila tulee samasta
   data-attribuutista kuin viereisella painikkeella, jolloin pari saa yhteisen
   taustan eika avaaja jaa irralliseksi. */
.rte-btn-xs[b-3mo8a1fqr3] {
    width: 14px;
    padding: 8px 0;
    border-radius: 0 12px 12px 0;
}

.rte-btn-xs[b-3mo8a1fqr3]  .mud-icon-root {
    width: 14px;
    height: 14px;
    font-size: 14px;
}

/* MudMenu kaarii avaajan omaan elementtiinsa. Flex pitaa avaajan
   samankorkuisena parin kanssa. */
.rte-toolbar-group-joined[b-3mo8a1fqr3]  .mud-menu {
    display: flex;
}

.rte-editor[b-3mo8a1fqr3] {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    min-height: 180px;
    padding: 0.65rem;
    background-color: var(--mud-palette-surface);
    /* Valitun kuvan painikepalkki (tiptap-editor.js) sijoitetaan tahan nahden. */
    position: relative;
}

/* MudBlazor kirjoittaa muuttujan amerikkalaisittain (gray). Brittikirjoitusasua
   ei ole olemassa, jolloin arvo olisi kelvoton ja tausta muuttuisi lapinakyvaksi
   - lukutila nayttaisi tismalleen samalta kuin muokkaustila. */
.rte-editor-readonly[b-3mo8a1fqr3] {
    background-color: var(--mud-palette-background-gray);
}

.rte-hidden-input-container[b-3mo8a1fqr3] {
    display: none;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror {
    min-height: 160px;
    outline: none;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror p {
    margin: 0.4rem 0;
}

/* Placeholder-laajennus asettaa vain data-placeholder-attribuutin ja is-empty-luokat.
   Tekstin piirtaminen on kokonaan CSS:n vastuulla - ilman tata saantoa placeholder
   ei nay lainkaan. float+height:0 pitaa sen tekstikursorin rivilla vieematta tilaa. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror p.is-editor-empty:first-child::before {
    content: attr(data-placeholder);
    float: left;
    height: 0;
    pointer-events: none;
    color: var(--mud-palette-text-disabled);
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror ul,
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ol {
    padding-left: 1.4rem;
}

/* Listan tyyli tulee data-attribuutista, ei inline-tyylista - ks. RichTextHtmlSanitizer.
   Uusi tyyli lisataan tanne, tiptap-editor.js:n listStyleDefinitions-olioon ja
   RichTextEditor.razor -komponentin ListStyles-taulukkoon. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ul[data-list-style="disc"] { list-style-type: disc; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ul[data-list-style="circle"] { list-style-type: circle; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ul[data-list-style="square"] { list-style-type: square; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ol[data-list-style="decimal"] { list-style-type: decimal; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ol[data-list-style="lower-alpha"] { list-style-type: lower-alpha; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ol[data-list-style="lower-roman"] { list-style-type: lower-roman; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror ol[data-list-style="upper-alpha"] { list-style-type: upper-alpha; }

/* height: auto pitaa mittasuhteen, kun max-width kaventaa kuvaa tallennettua
   leveytta kapeammaksi (esim. taulukon sarake). Ilman sita height-attribuutti
   venyttaisi rivia. Vedon aikainen inline-korkeus ohittaa taman. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror img {
    max-width: 100%;
    height: auto;
    object-fit: contain;
}

/* Vaakaviiva (--- syottaa horizontalRule-solmun) piirretaan tasta saannosta.
   Ilman sita viiva jaa nakymattomiin: selaimen oletustyyli on 1 px inset-reunus,
   jonka vari on currentColor, ja MudBlazorin pinnalla se hukkuu taustaan.
   Reunus annetaan siksi eksplisiittisesti teeman viivavarilla. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror hr {
    height: 0;
    border: none;
    border-top: 1px solid var(--mud-palette-lines-default);
    margin: 0.9rem 0;
}

/* Vaakaviiva on atominen solmu, joten se voidaan valita kokonaisuutena.
   Valinta ei nakyisi mitenkaan ilman omaa saantoa. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror hr.ProseMirror-selectednode {
    border-top-color: var(--mud-palette-primary);
    outline: none;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror a.rte-image-link {
    display: inline-block;
}

/* Taulukkopainikkeen MudMenu kaarii avaajan omaan elementtiinsa kuten listavalikot. */
.rte-toolbar-group[b-3mo8a1fqr3]  .rte-table-menu {
    display: flex;
}

/* Kontekstivalikkojen (kuva, taulukko) avaaja on tyhja span; valikko avataan hiiren kohdalle JS:sta. */
.rte-container[b-3mo8a1fqr3]  .rte-context-menu-anchor {
    position: absolute;
    width: 0;
    height: 0;
    overflow: hidden;
}

/* Taulukko. Reunat ja otsikkorivin tausta tulevat teeman paletista, jotta tumma
   teema toimii. Leveydet: table-layout: fixed + TipTapin <colgroup> pitavat
   sarakkeet saadetyn levyisina. Muokkaustilassa columnResizing kaarii taulukon
   .tableWrapper-elementtiin, joka vierii vaakasuunnassa leveissa taulukoissa. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror .tableWrapper {
    margin: 0.6rem 0;
    overflow-x: auto;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror table {
    border-collapse: collapse;
    table-layout: fixed;
    width: 100%;
    margin: 0.6rem 0;
    overflow: hidden;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror .tableWrapper table {
    margin: 0;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror td,
.rte-editor[b-3mo8a1fqr3]  .ProseMirror th {
    border: 1px solid var(--mud-palette-lines-default);
    box-sizing: border-box;
    min-width: 1em;
    padding: 4px 8px;
    position: relative;
    vertical-align: top;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror td > *,
.rte-editor[b-3mo8a1fqr3]  .ProseMirror th > * {
    margin: 0;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror th {
    background-color: var(--mud-palette-background-gray);
    font-weight: 600;
    text-align: left;
}

/* Usean solun valinta (CellSelection). ProseMirror merkitsee solut luokalla,
   mutta ei piirra niille mitaan. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror .selectedCell::after {
    content: "";
    position: absolute;
    inset: 0;
    background-color: var(--mud-palette-primary);
    opacity: 0.15;
    pointer-events: none;
    z-index: 2;
}

/* Sarakkeen reunaan tartuttaessa nakyva kahva. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror .column-resize-handle {
    position: absolute;
    top: 0;
    bottom: -2px;
    right: -2px;
    width: 4px;
    background-color: var(--mud-palette-primary);
    pointer-events: none;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror.resize-cursor {
    cursor: col-resize;
}

/* Kuvan koon muutos (TipTapin ResizableNodeView). Nakyma asettaa itse vain
   sijoittelun; kahvojen koko ja ulkoasu ovat taalla. Kahvat nakyvat vain
   valitussa kuvassa, jottei jokaisen kuvan kulmissa ole jatkuvasti laatikoita. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-wrapper] {
    max-width: 100%;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-handle] {
    width: 10px;
    height: 10px;
    border: 1px solid var(--mud-palette-surface);
    border-radius: 2px;
    background-color: var(--mud-palette-primary);
    opacity: 0;
    pointer-events: none;
    z-index: 3;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror .ProseMirror-selectednode [data-resize-handle],
.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-state="true"] [data-resize-handle] {
    opacity: 1;
    pointer-events: auto;
}

.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-handle="top-left"] { margin: -5px 0 0 -5px; cursor: nwse-resize; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-handle="top-right"] { margin: -5px -5px 0 0; cursor: nesw-resize; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-handle="bottom-left"] { margin: 0 0 -5px -5px; cursor: nesw-resize; }
.rte-editor[b-3mo8a1fqr3]  .ProseMirror [data-resize-handle="bottom-right"] { margin: 0 -5px -5px 0; cursor: nwse-resize; }

/* Valittu kuva erottuu reunuksella, jotta nakyy mihin painikepalkki ja kahvat kuuluvat. */
.rte-editor[b-3mo8a1fqr3]  .ProseMirror .ProseMirror-selectednode img {
    outline: 2px solid var(--mud-palette-primary);
    outline-offset: 1px;
}

/* Valitun kuvan painikepalkki: kaanto vasemmalle ja oikealle seka poisto. Luodaan
   JS:ssa editorin isantaelementtiin, joten saannot tarvitsevat ::deep-valitsimen. */
.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar {
    position: absolute;
    z-index: 4;
    display: flex;
    gap: 2px;
    padding: 2px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 6px;
    background-color: var(--mud-palette-surface);
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar[hidden] {
    display: none;
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    padding: 0;
    border: none;
    border-radius: 4px;
    background: transparent;
    color: var(--mud-palette-text-secondary);
    cursor: pointer;
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar-btn[hidden] {
    display: none;
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar-btn svg {
    width: 20px;
    height: 20px;
    fill: currentColor;
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar-btn:hover:not(:disabled) {
    background-color: var(--mud-palette-action-default-hover);
    color: var(--mud-palette-text-primary);
}

.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar-btn:disabled {
    cursor: wait;
    opacity: 0.5;
}

/* Kaannon ajan latausilmaisin: pyoriva kaari palkin reunassa. */
.rte-editor[b-3mo8a1fqr3]  .rte-image-toolbar[data-busy="true"]::after {
    content: "";
    align-self: center;
    width: 16px;
    height: 16px;
    margin: 0 6px 0 4px;
    border: 2px solid var(--mud-palette-lines-default);
    border-top-color: var(--mud-palette-primary);
    border-radius: 50%;
    animation: rte-image-busy-spin-b-3mo8a1fqr3 0.8s linear infinite;
}

@keyframes rte-image-busy-spin-b-3mo8a1fqr3 {
    to { transform: rotate(360deg); }
}
/* /Components/Common/TicketPreviewPanel.razor.rz.scp.css */
/* Sijainnin (left/top), näkyvyyden ja leveyden (80 % listan leveydestä) asettaa
   Tickets.razor.js. Tämä leveys on vain varalla, jos listaa ei löydy. */
.ticket-preview-panel[b-5w560sa3l3] {
    position: fixed;
    left: 0;
    top: 0;
    visibility: hidden;
    z-index: 1500;
    width: min(480px, calc(100vw - 24px));
    pointer-events: none;
}

/* Padding on lohkoilla, jotta ylälohkon tausta ulottuu paneelin reunoihin. */
.ticket-preview-panel[b-5w560sa3l3]  .ticket-preview-paper {
    overflow: hidden;
}

/* Sama väri kuin listojen otsikkoalueella (app.css, .mud-table-head). */
.ticket-preview-header[b-5w560sa3l3] {
    background-color: var(--tiketti-head-bg);
    color: var(--tiketti-head-text);
    padding: 1rem;
}

.ticket-preview-body[b-5w560sa3l3] {
    padding: 1rem;
}

.ticket-preview-section[b-5w560sa3l3] {
    margin-bottom: 0.75rem;
}

/* Asiakas, yhteyshenkilö ja tiketin otsikko hieman muuta tekstiä suurempina,
   jotta ne erottuvat paneelin muista tiedoista. */
.ticket-preview-contact-name[b-5w560sa3l3] {
    font-weight: 600;
    font-size: 1.125rem;
}

/* Puhelin ja sähköposti sekä metatiedot samalle riville; kapeassa paneelissa
   ne rivittyvät allekkain. */
.ticket-preview-inline-fields[b-5w560sa3l3] {
    display: flex;
    flex-wrap: wrap;
    column-gap: 1rem;
    row-gap: 0.25rem;
}

.ticket-preview-title[b-5w560sa3l3] {
    font-weight: 600;
    font-size: 1.125rem;
    overflow-wrap: anywhere;
}

.ticket-preview-description-line[b-5w560sa3l3] {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    overflow-wrap: anywhere;
}

.ticket-preview-muted[b-5w560sa3l3] {
    color: var(--mud-palette-text-secondary);
}
/* /Components/Dialogs/TicketContactInfoDialog.razor.rz.scp.css */
.contact-info[b-3rqt61g3p8] {
    display: flex;
    flex-direction: column;
    gap: 16px;
}

.contact-info-heading[b-3rqt61g3p8] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    min-height: 32px;
}

.contact-info-rows[b-3rqt61g3p8] {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-top: 8px;
}

.contact-info-row[b-3rqt61g3p8] {
    display: flex;
    align-items: center;
    gap: 10px;
    overflow-wrap: anywhere;
}

.contact-info-row[b-3rqt61g3p8]  .contact-info-icon {
    flex: 0 0 auto;
    color: var(--mud-palette-text-secondary);
}

.contact-info-missing[b-3rqt61g3p8] {
    color: var(--mud-palette-text-secondary);
    font-style: italic;
}
/* /Components/ImageLightbox/ImageLightbox.razor.rz.scp.css */
.image-lightbox-overlay[b-0o87el05om] {
    position: fixed;
    inset: 0;
    z-index: 1600;
    background: rgba(15, 15, 15, 0.22);
}

.image-lightbox-window[b-0o87el05om] {
    position: fixed;
    display: grid;
    grid-template-rows: var(--lightbox-header-height, 48px) auto minmax(0, 1fr);
    width: var(--lightbox-default-width, 960px);
    height: var(--lightbox-default-height, 720px);
    min-width: var(--lightbox-min-width, 400px);
    min-height: var(--lightbox-min-height, 280px);
    background: var(--lightbox-window-background, #ffffff);
    border: 1px solid rgba(0, 0, 0, 0.18);
    border-radius: 12px;
    box-shadow: 0 18px 48px rgba(0, 0, 0, 0.28);
    overflow: hidden;
}

.image-lightbox-header[b-0o87el05om] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    padding: 0 0.75rem 0 1rem;
    cursor: move;
    border-bottom: 1px solid rgba(0, 0, 0, 0.08);
    background: color-mix(in srgb, var(--lightbox-window-background, #ffffff) 92%, #000000 8%);
}

.image-lightbox-title[b-0o87el05om] {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.image-lightbox-toolbar[b-0o87el05om] {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.35rem 0.5rem;
    border-bottom: 1px solid rgba(0, 0, 0, 0.08);
    background: color-mix(in srgb, var(--lightbox-window-background, #ffffff) 96%, #000000 4%);
}

.image-lightbox-stage[b-0o87el05om] {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 0;
    overflow: hidden;
    background: var(--lightbox-stage-background, #2b2b2b);
}

.image-lightbox-image[b-0o87el05om] {
    position: relative;
    display: block;
    flex: 0 0 auto;
    background: #ffffff;
    user-select: none;
    -webkit-user-drag: none;
    transform-origin: 0 0;
    will-change: transform;
}

.image-lightbox-stage.image-lightbox-stage--pannable[b-0o87el05om] {
    cursor: grab;
}

.image-lightbox-stage.image-lightbox-stage--panning[b-0o87el05om] {
    cursor: grabbing;
}

.image-lightbox-resize-handle[b-0o87el05om] {
    position: absolute;
    right: 0;
    bottom: 0;
    width: 18px;
    height: 18px;
    cursor: nwse-resize;
    background:
        linear-gradient(135deg, transparent 0 45%, rgba(0, 0, 0, 0.24) 45% 55%, transparent 55% 100%),
        linear-gradient(135deg, transparent 0 62%, rgba(0, 0, 0, 0.24) 62% 72%, transparent 72% 100%);
}
/* /Components/Layout/MainLayout.razor.rz.scp.css */
.mud-main-content[b-h5bl61svvc] {
    min-height: calc(100vh - 64px);
}

.topbar-content[b-h5bl61svvc] {
    width: 100%;
    display: flex;
    align-items: center;
    min-height: 36px;
}

.topbar-user-menu[b-h5bl61svvc] {
    margin-left: auto;
    display: flex;
    align-items: center;
    flex: 0 0 auto;
    padding-left: 8px;
}

.topbar-single[b-h5bl61svvc] {
    width: 100%;
    display: flex;
    align-items: center;
    gap: 12px;
}

.topbar-split[b-h5bl61svvc] {
    width: 100%;
    display: grid;
    grid-template-columns: 1fr 1fr;
    align-items: center;
}

.topbar-half[b-h5bl61svvc] {
    display: flex;
    align-items: center;
    min-width: 0;
}

.topbar-left-half[b-h5bl61svvc] {
    justify-content: flex-start;
    padding-left: 8px;
}

.topbar-right-half[b-h5bl61svvc] {
    justify-content: flex-end;
    padding-right: 8px;
}

.topbar-content .topbar-slot[b-h5bl61svvc] {
    flex: 1 1 0;
}

.topbar-slot[b-h5bl61svvc] {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
}

.topbar-left[b-h5bl61svvc] {
    justify-content: flex-start;
}

.topbar-center[b-h5bl61svvc] {
    justify-content: center;
}

.topbar-right[b-h5bl61svvc] {
    justify-content: flex-end;
}

.topbar-logo[b-h5bl61svvc] {
    height: 36px;
    max-width: 220px;
    object-fit: contain;
}

[b-h5bl61svvc] .app-nav-drawer {
    background-color: var(--nav-background-color, #FFFFFF) !important;
}

#blazor-error-ui[b-h5bl61svvc] {
    color-scheme: light only;
    background: #fff9c4;
    color: #1f1f1f !important;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: var(--mud-drawer-width-left, 260px) !important;
    right: auto !important;
    width: calc(100vw - var(--mud-drawer-width-left, 260px)) !important;
    max-width: calc(100vw - var(--mud-drawer-width-left, 260px)) !important;
    overflow: hidden;
    padding: 0.6rem 3.5rem 0.7rem 1.25rem;
    position: fixed;
    z-index: 1000;
}

/* Alle Lg-rajan (1280 px) navigointi on hampurilaisvalikon takana eikä vie leveyttä. */
@media (max-width: 1279.98px) {
    #blazor-error-ui[b-h5bl61svvc] {
        left: 0 !important;
        width: 100vw !important;
        max-width: 100vw !important;
    }
}

    #blazor-error-ui .reload[b-h5bl61svvc] {
        color: #0b57d0 !important;
        font-weight: 600;
        text-decoration: underline;
    }

    #blazor-error-ui .dismiss[b-h5bl61svvc] {
        color: #1f1f1f !important;
        cursor: pointer;
        font-size: 1.1rem;
        line-height: 1;
        position: absolute;
        right: 1rem;
        top: 0.5rem;
    }
/* /Components/Layout/NavMenu.razor.rz.scp.css */
.mud-navmenu[b-zlssthpj3v] {
    width: 100%;
}

.app-nav-menu[b-zlssthpj3v] {
    background-color: var(--nav-background-color, #FFFFFF);
}

[b-zlssthpj3v] .mud-navmenu.mud-navmenu-default .mud-nav-link {
    color: var(--nav-link-color, #1F2937) !important;
}

[b-zlssthpj3v] .mud-navmenu.mud-navmenu-default .mud-nav-link .mud-nav-link-text,
[b-zlssthpj3v] .mud-navmenu.mud-navmenu-default .mud-nav-link .mud-nav-link-icon {
    color: inherit !important;
}

[b-zlssthpj3v] .app-nav-menu a.mud-nav-link,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link .mud-nav-link-text,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link .mud-nav-link-icon {
    color: var(--nav-link-color, #1F2937) !important;
}

[b-zlssthpj3v] .app-nav-menu a.mud-nav-link:hover,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link:hover .mud-nav-link-text,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link:hover .mud-nav-link-icon {
    color: var(--nav-link-hover-color, #4F46E5) !important;
}

[b-zlssthpj3v] .app-nav-menu a.mud-nav-link.active,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link.active .mud-nav-link-text,
[b-zlssthpj3v] .app-nav-menu a.mud-nav-link.active .mud-nav-link-icon {
    color: var(--nav-link-active-color, #4338CA) !important;
}

[b-zlssthpj3v] .mud-navmenu.mud-navmenu-default .mud-nav-link:hover:not(.mud-nav-link-disabled):not(.active) {
    color: var(--nav-link-hover-color, #4F46E5) !important;
}

[b-zlssthpj3v] .mud-navmenu.mud-navmenu-default .mud-nav-link.active:not(.mud-nav-link-disabled) {
    color: var(--nav-link-active-color, #4338CA) !important;
}

/* Nav group title row color */
.mud-navgroup-scope[b-zlssthpj3v]  .mud-navgroup-title > .mud-nav-link > .mud-nav-link-text,
.mud-navgroup-scope[b-zlssthpj3v]  .mud-navgroup-title > .mud-nav-link > .mud-nav-link-icon,
.mud-navgroup-scope[b-zlssthpj3v]  .mud-navgroup-title > .mud-nav-link > .mud-nav-group-expand-icon,
.mud-navgroup-scope[b-zlssthpj3v]  .mud-navgroup-title > .mud-nav-link > .mud-nav-link-expand-icon {
    color: var(--nav-section-title-color, #111827) !important;
    fill: currentColor !important;
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-bpi7o3wd66],
.components-reconnect-repeated-attempt-visible[b-bpi7o3wd66],
.components-reconnect-failed-visible[b-bpi7o3wd66],
.components-pause-visible[b-bpi7o3wd66],
.components-resume-failed-visible[b-bpi7o3wd66],
.components-rejoining-animation[b-bpi7o3wd66] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-retrying[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-failed[b-bpi7o3wd66],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-bpi7o3wd66] {
    display: block;
}


#components-reconnect-modal[b-bpi7o3wd66] {
    background-color: white;
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-bpi7o3wd66 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-bpi7o3wd66 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-bpi7o3wd66 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-bpi7o3wd66]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-bpi7o3wd66 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-bpi7o3wd66 {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-bpi7o3wd66 {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-bpi7o3wd66 {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-bpi7o3wd66] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-bpi7o3wd66] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-bpi7o3wd66] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-bpi7o3wd66] {
        background-color: #3b6ea2;
    }

    #components-reconnect-modal button:active[b-bpi7o3wd66] {
        background-color: #6b9ed2;
    }

.components-rejoining-animation[b-bpi7o3wd66] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-bpi7o3wd66] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-bpi7o3wd66 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-bpi7o3wd66] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-bpi7o3wd66 {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/AdminAppearance.razor.rz.scp.css */

/* Dense-mode overrides are defined in global app.css because dense class is outside this component scope. */

.position-radio-group[b-g1h20eoox2] {
    display: flex;
    gap: 16px;
}

.logo-file-name[b-g1h20eoox2] {
    font-weight: 600;
}

/* /Components/Pages/AdminCustomerGroups.razor.rz.scp.css */
.customer-type-list[b-62qkh2g153] {
    max-height: 320px;
    overflow-y: auto;
}

.customer-type-item[b-62qkh2g153] {
    border-radius: 6px;
}

[b-62qkh2g153] .customer-type-item.selected,
[b-62qkh2g153] .customer-type-item.selected:hover {
    background-color: #dbeafe !important;
}
/* /Components/Pages/AdminLogs.razor.rz.scp.css */
.admin-logs-page[b-n3aeu4bx5o] {
    padding-bottom: 2rem;
}
/* /Components/Pages/AdminPriorities.razor.rz.scp.css */
.priority-list[b-8uavbwgwaq] {
    max-height: 320px;
    overflow-y: auto;
}

.priority-list-item[b-8uavbwgwaq] {
    border-radius: 6px;
}

.priority-list-item.selected[b-8uavbwgwaq] {
    background-color: var(--mud-palette-primary-hover);
}
/* Alla oleva tarvitaan jotta valittu rivi saadaan korostettua*/
[b-8uavbwgwaq] .priority-list-item.selected, [b-8uavbwgwaq] .priority-list-item.selected:hover {
    background-color: #dbeafe !important;
}
.priority-color-preview[b-8uavbwgwaq] {
    width: 16px;
    height: 16px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 50%;
    display: inline-block;
}

.hex-input-with-picker[b-8uavbwgwaq] {
    position: relative;
}

.hex-color-picker-inline[b-8uavbwgwaq] {
    position: absolute;
    top: 18px;
    left: 14px;
    width: 20px;
    height: 20px;
    border: 1px solid #000;
    border-radius: 50%;
    padding: 0;
    background: transparent;
    cursor: pointer;
    z-index: 3;
    appearance: none;
    -webkit-appearance: none;
}

.hex-color-picker-inline[b-8uavbwgwaq]::-webkit-color-swatch-wrapper {
    padding: 0;
}

.hex-color-picker-inline[b-8uavbwgwaq]::-webkit-color-swatch {
    border: none;
    border-radius: 50%;
}

.hex-color-picker-inline[b-8uavbwgwaq]::-moz-color-swatch {
    border: none;
    border-radius: 50%;
}
/* Tämä selectori tarvittiin jotta värikoodin tekstin saa valittua.*/
.hex-input-with-picker[b-8uavbwgwaq]  .mud-input-slot {
    padding-left: 40px;
}
/* /Components/Pages/AdminTicketStatuses.razor.rz.scp.css */
.ticket-status-list[b-rknym3r1wq] {
    max-height: 320px;
    overflow-y: auto;
}

.ticket-status-item[b-rknym3r1wq] {
    border-radius: 6px;
}

[b-rknym3r1wq] .ticket-status-item.selected,
[b-rknym3r1wq] .ticket-status-item.selected:hover {
    background-color: #dbeafe !important;
}
/* /Components/Pages/AdminUsers.razor.rz.scp.css */
.users-table-container[b-zsi7f3f2aj]  .selected-user-row,
.users-table-container[b-zsi7f3f2aj]  .selected-user-row:hover {
    background-color: var(--mud-palette-primary-hover) !important;
    border-left: 3px solid var(--mud-palette-primary);
}
/* /Components/Pages/TicketDetails.razor.rz.scp.css */
/* Blazorin CSS-eristys lisää scope-attribuutin vain tähän razor-tiedostoon
   kirjoitettuihin HTML-elementteihin. Mud-komponentin Class-parametrilla annettu
   luokka ei saa attribuuttia, joten sellainen luokka tavoitetaan vain
   razor-tiedoston oman div-ankkurin (esim. .ticket-read-mode, .ticket-events-panel)
   kautta ::deep-valitsimella. */

/* Tikettialueen kääre (vaihe 2): esikatselupaneelin tarkka sijainti ja koko
   mitataan JS:llä (ticket-event-preview.js) tämän kääreen näkyvästä osasta ja
   asetetaan inline style -attribuutilla per avaus. Näin paneeli sovittuu aina
   senhetkiseen tikettialueeseen (kutistuu/laajenee tapahtumadrawerin tilan
   mukaan) ja pysyy kokonaan selaimen näkyvällä alueella, vaikka sivua olisi
   vieritetty – position: absolute sivun yläreunaan sidottuna ei riittäisi,
   koska se vierisi pois näkyvistä sivun mukana. */
.ticket-event-preview[b-ezb6qe1s5z] {
    position: fixed;
    z-index: 10;
    pointer-events: none;
}

.ticket-event-preview-description[b-ezb6qe1s5z] {
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden;
}

.ticket-read-mode[b-ezb6qe1s5z]  .mud-disabled .mud-input-slot,
.ticket-read-mode[b-ezb6qe1s5z]  .mud-disabled input,
.ticket-read-mode[b-ezb6qe1s5z]  .mud-disabled textarea,
.ticket-read-mode[b-ezb6qe1s5z]  .mud-disabled .mud-select-input {
    color: var(--mud-palette-text-primary) !important;
    -webkit-text-fill-color: var(--mud-palette-text-primary) !important;
    opacity: 1 !important;
}

/* Asiakaskentän yhteystietopainike. Painike on kentästä erillinen elementti, mutta se
   piirretään kiinni kentän vasempaan reunaan niin, että ne näyttävät yhdeltä kentältä:
   painikkeella on kentän reunaviiva ilman oikeaa reunaa, ja kentän vasemmat kulmat ovat
   suorat. Painike sidotaan yläreunaan (flex-start), koska kentän alle ilmestyvä
   virheteksti kasvattaa kentän korkeutta.

   Korkeus vastaa Outlined-kentän reunaviivaa: MudBlazorin 18.5px + 18.5px pystypadding
   + 1.1876em rivi = 56px. Tiivis ulkoasu (app.css, .dense-controls-enabled) muuttaa
   kentän paddingia, riviä ja ylämarginaalia dense-style.css:n muuttujilla, joten
   painike laskee mittansa samoista muuttujista. font-size 1rem pitää em-yksiköt samoina
   kuin kentän tekstissä. */
.customer-field-group[b-ezb6qe1s5z] {
    display: flex;
    align-items: flex-start;
}

.customer-field-group[b-ezb6qe1s5z]  .mud-autocomplete {
    flex: 1 1 auto;
    min-width: 0;
}

.customer-field-group[b-ezb6qe1s5z]  .mud-input-outlined-border {
    border-top-left-radius: 0;
    border-bottom-left-radius: 0;
}

.customer-contact-addon[b-ezb6qe1s5z] {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    width: 48px;
    height: calc(37px + 1.1876em);
    font-size: 1rem;
    border: 1px solid var(--mud-palette-lines-inputs);
    border-right: none;
    border-radius: var(--mud-default-borderradius) 0 0 var(--mud-default-borderradius);
    transition: border-color 200ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
}

.dense-controls-enabled .customer-contact-addon[b-ezb6qe1s5z] {
    height: calc(2 * var(--dense-input-padding-y) + var(--dense-input-line-height));
    margin-top: var(--dense-input-margin-top);
}

/* Reunan väri seuraa kentän tilaa, muuten liitos näyttää rikkinäiseltä. Hover korostaa
   molempia osia, osoitti hiiri kumpaa tahansa. */
@media (hover: hover) and (pointer: fine) {
    .customer-field-group:hover .customer-contact-addon[b-ezb6qe1s5z] {
        border-color: var(--mud-palette-action-default);
    }

    .customer-field-group:hover[b-ezb6qe1s5z]  .mud-input.mud-input-outlined:not(.mud-disabled):not(:focus-within) .mud-input-outlined-border {
        border-color: var(--mud-palette-action-default);
    }
}

/* Kentän fokus piirtää 2px reunan; painikkeen toinen pikseli tehdään varjolla, ettei
   painikkeen sisältö siirry. Painikkeen oma fokus ei korosta kenttää. */
.customer-field-group:has(.mud-input:focus-within) .customer-contact-addon[b-ezb6qe1s5z] {
    border-color: var(--mud-palette-primary);
    box-shadow: inset 1px 0 0 var(--mud-palette-primary),
                inset 0 1px 0 var(--mud-palette-primary),
                inset 0 -1px 0 var(--mud-palette-primary);
}

/* Virhe voittaa fokuksen kuten kentässä: .mud-input.mud-input-error on tarkoituksella
   kaksiluokkainen, jotta valitsin on vähintään yhtä tarkka kuin fokussääntö. */
.customer-field-group:has(.mud-input.mud-input-error) .customer-contact-addon[b-ezb6qe1s5z] {
    border-color: var(--mud-palette-error);
}

.customer-field-group:has(.mud-input.mud-input-error):has(.mud-input:focus-within) .customer-contact-addon[b-ezb6qe1s5z] {
    box-shadow: inset 1px 0 0 var(--mud-palette-error),
                inset 0 1px 0 var(--mud-palette-error),
                inset 0 -1px 0 var(--mud-palette-error);
}

/* Oikean sivupaneelin tapahtumakortit. Kortin varjostus toteutetaan CSS:llä
   MudBlazorin elevation-muuttujilla eikä MudPaperin Elevation-parametrilla, jotta
   hover- ja aktiivikorostus voidaan animoida ilman komponentin tilaa tai
   @onmouseenter/@onmouseleave-käsittelijöitä. Ks. tapahtumapaneeli-suunnitelma.md. */
.ticket-events-panel[b-ezb6qe1s5z]  .event-card {
    overflow: hidden;
    box-shadow: var(--mud-elevation-2);
    transition: box-shadow 0.15s ease;
}

.ticket-events-panel[b-ezb6qe1s5z]  .event-card:hover {
    box-shadow: var(--mud-elevation-8);
}

.ticket-events-panel[b-ezb6qe1s5z]  .event-card.event-active {
    box-shadow: var(--mud-elevation-10);
    border-left: 3px solid var(--mud-palette-primary);
}

/* Kortin yläpalkki: kapea, värillinen "otsikkopalkki" (kuten käyttöjärjestelmän
   ikkunoissa), jossa näkyy tapahtuman päivä, kellonaika ja vastuuhenkilö. Käytössä
   sekä sivupaneelin korteissa että esikatselussa, joten ei sidota
   .ticket-events-panel-esivanhempaan. */
[b-ezb6qe1s5z] .event-card-header {
    padding: 4px 12px;
    background-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
    font-weight: 700;
    font-size: 0.9rem;
    line-height: 1.4;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Esikatselun yläpalkki: sama tyyli, mutta noin 2x korkeampi ja isommalla fontilla,
   koska esikatselukortti on itsessään isompi kuin sivupaneelin kortit. */
[b-ezb6qe1s5z] .event-card-header-lg {
    padding: 10px 16px;
    font-size: 1.25rem;
}

.ticket-events-panel[b-ezb6qe1s5z]  .event-card-title {
    font-weight: 600;
    margin-top: 8px;
}

.ticket-events-panel[b-ezb6qe1s5z]  .event-card-description {
    white-space: pre-wrap;
    word-break: break-word;
}

.ticket-events-panel[b-ezb6qe1s5z]  .ticket-events-drawer-list {
    overflow-y: auto;
}

/* Kahva, josta piilotettu tapahtumapaneeli avataan uudelleen. Kiinnitetty
   ikkunan oikeaan reunaan, koska paneeli on tällöin suljettu eikä vie tilaa.
   Tavallinen <button>, ei Mud-komponentti, joten scope-attribuutti tulee
   suoraan eikä ::deep-valitsinta tarvita. */
.ticket-events-drawer-handle[b-ezb6qe1s5z] {
    position: fixed;
    top: 120px;
    right: 0;
    z-index: 1300;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    width: 40px;
    height: 160px;
    padding: 12px 4px;
    border: none;
    border-radius: 8px 0 0 8px;
    background-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
    box-shadow: var(--mud-elevation-4);
    cursor: pointer;
}

.ticket-events-drawer-handle:hover[b-ezb6qe1s5z] {
    background-color: var(--mud-palette-primary-darken);
}

.ticket-events-drawer-handle-text[b-ezb6qe1s5z] {
    writing-mode: vertical-rl;
    text-orientation: mixed;
    font-size: 0.8rem;
    letter-spacing: 0.02em;
    white-space: nowrap;
}
/* /Components/Pages/Tickets.razor.rz.scp.css */
.ticket-filter-field[b-o3dfk58ltl]  .mud-input-control {
    margin-top: 0;
    margin-bottom: 0;
}

.ticket-filter-field[b-o3dfk58ltl]  .mud-input-slot {
    min-height: 42px;
}

/* Rivikorkeutta ei aseteta: kaksiriviset solut (ID, asiakas, päivämäärät) määräävät sen. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-priority-column {
    text-align: center;
    white-space: nowrap;
    padding-left: 6px;
    padding-right: 6px;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-cell-ellipsis {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Tiketti koskee juuri tätä henkilöä, joten nimi korostetaan asiakkaan nimeä vahvemmin. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-contact-person {
    font-weight: 600;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-title-clamp {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    overflow-wrap: anywhere;
}

/* Leveän näytön sarakeleveydet. Auto-asettelussa width: 1% + nowrap kutistaa sarakkeen
   sisältönsä levyiseksi, jolloin otsikko saa kaiken jäljelle jäävän tilan. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide table {
    table-layout: auto;
    width: 100%;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide .ticket-shrink-column {
    width: 1%;
    white-space: nowrap;
}

/* Asiakas: kiinteä oletusleveys, jota lyhyet tai pitkät nimet eivät muuta. max-width: 0
   estää sisältöä leventämästä saraketta, joten leveys tulee otsikkosolusta. Vähimmäisleveys
   rajaa myös säätökahvalla kavennettua leveyttä (sama raja: COLUMN_MIN_WIDTHS, Tickets.razor.js). */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide th.ticket-customer-column {
    width: 240px;
    min-width: 180px;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide td.ticket-customer-column {
    max-width: 0;
}

/* Otsikolle jätetään aina lukutilaa. Jos sarakkeet eivät mahdu, taulukko vierii
   vaakasuunnassa – rivejä ei pinota korteiksi (MudTable Breakpoint.None). */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide th.ticket-title-column {
    min-width: 240px;
}

/* "Kapea" mitataan listan omasta leveydestä eikä ikkunasta, jotta auki oleva
   sivuvalikko tulee huomioitua. */
.tickets-table-scope[b-o3dfk58ltl] {
    container-type: inline-size;
}

/* Kapealla listalla vastuuhenkilö saa rivittyä kahdelle riville (esim. etu- ja sukunimi),
   jolloin asiakkaalle ja otsikolle jää enemmän tilaa. Rivit ovat jo kaksirivisiä, joten
   rivikorkeus ei kasva; ylipitkä nimi katkaistaan ja koko nimi näkyy vihjeenä. */
@container (max-width: 899.98px) {
    .tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide td.ticket-responsible-column {
        white-space: normal;
    }

    .tickets-table-scope[b-o3dfk58ltl]  .ticket-responsible-name {
        max-width: 110px;
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
        overflow-wrap: break-word;
    }
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide .mud-table-container {
    overflow-x: auto;
}

/* Tickets.razor.js lisää luokan, kun listassa on vieritettävää: rivejä voi raahata hiirellä.
   Raahauksen aikainen grabbing-kursori asetetaan JS:stä body-elementtiin. */
.tickets-table-scope.ticket-drag-scroll[b-o3dfk58ltl]  tbody tr {
    cursor: grab;
}

/* Sivutusrivit ovat MudStack-komponentteja, joten scoped CSS tarvitsee ::deep:n. Ilman
   rivitystä kapealla listalla viimeinen painike työntyy reunan yli ja sivulle tulee
   turha vaakavierityspalkki. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-pagination-controls {
    gap: 1rem;
    flex-wrap: wrap;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-pagination-actions {
    flex-wrap: wrap;
}

/* MudSelectin kääre ja sisäelementti venyvät oletuksena (flex: 1 1 auto) ja veisivät
   rivin vapaan tilan, jolloin valinnan leveys vaihtelisi sivun leveyden mukaan. Leveys
   tulee sisällöstä; vähimmäisleveys riittää suurimmalle vaihtoehdolle (100), joten
   painikkeet eivät hypi arvoa vaihdettaessa. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-pagination-actions > .mud-select,
.tickets-table-scope[b-o3dfk58ltl]  .ticket-page-size-select {
    flex: 0 0 auto;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-page-size-select {
    min-width: 5rem;
}

.ticket-sort-button[b-o3dfk58ltl] {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0;
    border: 0;
    background: transparent;
    color: inherit;
    font: inherit;
    font-weight: 600;
    cursor: pointer;
}

.ticket-sort-button:hover[b-o3dfk58ltl] {
    color: var(--mud-palette-primary);
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide th[data-column] {
    position: relative;
}

/* ID-sarake pysyy vasemmassa reunassa vaakavierityksessä, jotta tiketin tunnistaa.
   Solulla on oltava peittävä tausta; prioriteetin väri tulee inline-tyylinä ja voittaa
   tämän. Sticky toimii myös koonsäätökahvan asemointikehyksenä. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide .ticket-priority-column {
    position: sticky;
    left: 0;
    z-index: 1;
    background-color: var(--mud-palette-surface);
    box-shadow: inset -1px 0 0 var(--mud-palette-table-lines);
}

/* Otsakesolulla on data-column, joten th[data-column] { position: relative } on
   yllä olevaa sääntöä painavampi. Tämä valitsin on yhtä painava ja myöhempi, joten
   sticky on asetettava tässä uudelleen – muuten otsake vierii sarakkeen mukana. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-table-wide th.ticket-priority-column {
    position: sticky;
    z-index: 2;
}

/* Hakurivi sarakeotsakkeiden yläpuolella. max-width: 0 ja kentän min-width: 0 estävät
   kenttää leventämästä saraketta, joten leveys tulee aina otsakeriviltä (myös säädetty
   leveys). Matalat kentät: pystytäyte pidetään sen verran, ettei teksti osu reunoihin. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-row th {
    padding-top: 6px;
    padding-bottom: 2px;
    border-bottom: none;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-row th.ticket-search-cell {
    max-width: 0;
    padding-left: 8px;
    padding-right: 8px;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field.mud-input-control {
    margin-top: 0;
    margin-bottom: 0;
    min-width: 0;
    width: 100%;
}

/* Outlined-kenttä on läpinäkyvä, jolloin otsakkeen oma väri (--tiketti-head-bg) näkyisi
   läpi. Tausta on sama kuin muilla tekstikentillä, jotka ovat kortin (surface) päällä. */
.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field .mud-input {
    background-color: var(--mud-palette-surface);
    border-radius: var(--mud-default-borderradius);
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field .mud-input-slot {
    padding-top: 4px;
    padding-bottom: 4px;
    padding-left: 8px;
    font-size: 0.875rem;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field input {
    min-width: 0;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field .mud-input-adornment-end {
    margin-right: 2px;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field .mud-input-clear-button {
    padding: 2px;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-search-field .mud-input-clear-button .mud-icon-root {
    font-size: 1.125rem;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-column-resizer {
    position: absolute;
    top: 0;
    right: 0;
    width: 8px;
    height: 100%;
    cursor: col-resize;
    user-select: none;
    touch-action: none;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-column-resizer::after {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 3px;
    width: 2px;
    background-color: transparent;
}

.tickets-table-scope[b-o3dfk58ltl]  .ticket-column-resizer:hover::after,
.tickets-table-scope[b-o3dfk58ltl]  .ticket-column-resizer-active::after {
    background-color: var(--mud-palette-lines-default);
}
/* /Components/Shared/AdminLogPanel.razor.rz.scp.css */
.admin-log-toolbar[b-ignv9hb4wd] {
    row-gap: 0.75rem;
}

.admin-log-search-field[b-ignv9hb4wd] {
    min-width: 18rem;
    flex: 1 1 18rem;
}

.admin-log-viewer[b-ignv9hb4wd] {
    width: 100%;
    min-height: 20rem;
    height: 50vh;
    resize: vertical;
    overflow: auto;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 4px;
    background-color: var(--mud-palette-surface);
    padding: 0.75rem;
    cursor: text;
    user-select: text;
    -webkit-user-select: text;
}

.admin-log-pre[b-ignv9hb4wd] {
    margin: 0;
    white-space: pre-wrap;
    word-break: break-word;
    font-family: Consolas, "Courier New", monospace;
    font-size: 0.875rem;
    cursor: text;
    user-select: text;
    -webkit-user-select: text;
}

