@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600;700&family=Crimson+Text:wght@400;600&display=swap');

/* ======================
   ALLMÄNNA STILAR
   ====================== */

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

/* Botten under sidan.
   -------------------------------------------------------------------
   Färgen låg bara på <body>, och body är precis så hög som sidan.
   Drar mobilens adressfält ihop sig växer vyn förbi den höjden, och det
   som lyste igenom var webbläsarens egen vita duk — en vit remsa i
   underkanten som kom och gick när man rullade. Färgen hör hemma på
   <html>, som alltid täcker hela vyn.

   overscroll-behavior stoppar studsen i samma veva: utan den går det
   att dra fram samma vita remsa med fingret. */
html {
    background: #12100c;
    overscroll-behavior-y: none;
}

body {
    font-family: 'Crimson Text', serif;
    background: #1a1a1a;
    background-image: 
        radial-gradient(circle at 25% 25%, #2d2d2d 0%, transparent 50%),
        radial-gradient(circle at 75% 75%, #2d2d2d 0%, transparent 50%),
        linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 50%, #1a1a1a 100%);
    color: #d4af37;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    align-items: center;
}

/* ======================
   LOGIN-SIDA STILAR
   ====================== */

/* Inloggningssidan bär spelets färger.
   -------------------------------------------------------------------
   Sidan var byggd i en annan palett än resten: sadelbrunt (#8b4513),
   peru (#cd853f) och mörkt gullris (#b8860b), med glöd runt rubriken
   och ornament i hörnen. Den läste sig som orange, och den som loggat
   in möttes av något som inte såg ut som spelet hen just kommit till.

   Här används samma tokens som arket och klanvyn: nästan svart brunt
   som botten, en hårfin ram i #3d3527, guld till rubriker och dämpat
   linne till brödtext. Ingen glöd, inga hörnornament — det som skiljer
   sidorna åt ska vara innehållet.

   Reglerna hänger på .login-page och rör därför inget annat. */

.login-page {
    min-height: 100svh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem 1rem;
    background: #12100c;
    background-image:
        /* Storleken står utskriven. Ett sken utan mått tar sin
           utsträckning ur rutans proportioner, så samma regel ger en
           cirkel på en telefon och en utdragen strimma på en bred
           skärm — och den skarva syns. */
        radial-gradient(circle 42rem at 50% 0%,
                        rgba(212, 175, 55, 0.07) 0%,
                        rgba(212, 175, 55, 0.03) 45%,
                        transparent 75%),
        linear-gradient(180deg, #1a1611 0%, #12100c 100%);
    color: #ddd5c2;
}

.login-container {
    width: 100%;
    max-width: 28rem;
}

/* Rubriken är centrerad, med lådans indrag.
   -------------------------------------------------------------------
   Indraget står kvar fast texten är centrerad: det håller underrubriken
   inom samma bredd som lådans innehåll, så att den bryter rad på samma
   ställe. Det var *det* som saknades förut, inte centreringen. */
.login-header {
    text-align: center;
    margin-bottom: 1.7rem;
    padding: 0 1.3rem;
}

.login-header h1 {
    font-family: 'Cinzel', serif;
    font-size: clamp(2.5rem, 11vw, 3.5rem);
    font-weight: 700;
    letter-spacing: 0.18em;
    color: #d4af37;
    text-shadow: 0 2px 6px rgba(0, 0, 0, 0.7);
}

.login-header p {
    margin-top: 0.6rem;
    font-size: 1.08rem;
    font-style: italic;
    color: #9c9080;
}

/* Lådan är ett <main>, och sidfoten är en <footer>.
   -------------------------------------------------------------------
   Längre ner i den här filen ligger regler på just de två taggarna från
   den gamla sidlayouten: main centrerar sina barn med flex och kapar
   bredden till 90 %, footer har grå botten, orange överkant och en
   skugga. De reglerna nådde hit och gav rubriker och knappar som krympt
   till sin text, och en sidfot som såg ut som en avdelare från en helt
   annan sida.

   Egenskaperna nollas därför uttryckligen. Det är fulare än att bara
   ange det man vill ha, men alternativet — att ändra de gamla
   reglerna — hade rört sidor som fortfarande lever på dem. */
.login-box {
    display: block;
    flex-grow: 0;
    width: 100%;
    max-width: none;
    align-items: initial;
    background: linear-gradient(180deg, #211d17 0%, #171410 100%);
    border: 1px solid #3d3527;
    border-radius: 0.6rem;
    padding: 1.4rem 1.3rem 1.5rem;
    box-shadow: 0 14px 34px rgba(0, 0, 0, 0.55);
}

/* Samma rubrikform som .story-heading inne i spelet: liten, spärrad,
   versal, med en hårlinje under. */
.login-heading {
    font-family: 'Cinzel', serif;
    font-size: 0.92rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: #9a7f2a;
    margin: 0 0 0.8rem;
    border-bottom: 1px solid rgba(212, 175, 55, 0.2);
    padding-bottom: 3px;
}

.login-heading + .login-note { margin-top: -0.2rem; }

.login-note {
    font-size: 1rem;
    font-style: italic;
    color: #9c9080;
    margin-bottom: 0.9rem;
}

.login-options {
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
    margin-bottom: 1.4rem;
}

/* Knapparna talar samma språk som .village-btn i spelet. Den som hör
   hit — Ecranas egen inloggning — är den fyllda; de andra är dämpade.
   Tre likadana knappar hade tvingat läsaren att läsa alla tre. */
.login-btn {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    padding: 0.85rem 1.1rem;
    border: 1px solid #9a7f2a;
    border-radius: 0.35rem;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    letter-spacing: 0.04em;
    text-decoration: none;
    cursor: pointer;
    transition: filter 0.15s ease, border-color 0.15s ease;
}

/* Ikonen får en fast bredd så att texterna börjar på samma lodräta
   linje, oavsett hur bred just den ikonen råkar vara. */
.login-icon {
    width: 1.35rem;
    height: 1.35rem;
    flex: 0 0 1.35rem;
}

.login-btn:hover { filter: brightness(1.25); }

.login-btn:focus-visible {
    outline: 2px solid #d4af37;
    outline-offset: 2px;
}

.login-btn-quiet {
    border-color: #3d3527;
    background: rgba(0, 0, 0, 0.3);
    color: #9c9080;
}

.login-btn-quiet:hover {
    border-color: #9a7f2a;
    color: #d4af37;
}

/* Google och Facebook bär sina egna färger.
   -------------------------------------------------------------------
   Tre likadana knappar tvingar läsaren att läsa alla tre. Färgen får
   göra jobbet i stället — men dämpad, och bara i kant och text.
   Bakgrunden är densamma som på allt annat, så knapparna hör hemma på
   sidan i stället för att se inklistrade ut. Märkena i ikonerna är
   däremot i sina riktiga färger: en tonad Google-logotyp är inte
   Google-logotypen. */
.login-btn-google {
    border-color: #7d3f37;
    background: rgba(234, 67, 53, 0.08);
    color: #dda79c;
}

.login-btn-google:hover {
    border-color: #a85348;
    color: #f0c7bd;
}

.login-btn-facebook {
    border-color: #33507a;
    background: rgba(24, 119, 242, 0.07);
    color: #9dbbe8;
}

.login-btn-facebook:hover {
    border-color: #4a72ac;
    color: #cbdcf7;
}

/* Ett misslyckat inloggningsförsök säger varför. Guldkanten till
   vänster räcker som markering — sidan har redan en ram, och en ruta
   inuti en ruta blir svårläst. */
.login-flash {
    list-style: none;
    margin: 0 0 1rem;
    padding: 0;
}

.login-flash li {
    background: rgba(212, 175, 55, 0.07);
    border-left: 2px solid #9a7f2a;
    border-radius: 0 0.25rem 0.25rem 0;
    padding: 0.55rem 0.7rem;
    margin-bottom: 0.4rem;
    font-size: 0.98rem;
    color: #ddd5c2;
}

/* Sidfoten. Reglerna står också på stycket inuti: ärvda värden räcker
   nästan alltid, och just därför är det lätt att missa att en enda
   avvikande regel någon annanstans räcker för att den ska falla
   tillbaka till något som ser gammalt ut. */
.login-footer {
    width: auto;
    background: none;
    border-top: 0;
    box-shadow: none;
    padding: 0;
}

.login-footer,
.login-footer p {
    text-align: center;
    font-family: 'Cinzel', serif;
    font-size: 0.8rem;
    font-style: normal;
    font-weight: 400;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: #6d6455;
    text-shadow: none;
}

.login-footer { margin-top: 1.4rem; }

/* Telefonen har inte råd med samma luft.
   -------------------------------------------------------------------
   Indragen räknas ihop: sidans, lådans och rubrikens. På en skärm som
   är 360 px bred åt de tillsammans en femtedel av bredden, och
   "Logga in med Facebook" fick inte plats på en rad. Raden bröts mitt
   i en knapptext, vilket ser ut som ett fel — för det är det.

   Texten krymper bara en aning. Det är luften som ska bort, inte
   läsbarheten. */
@media (max-width: 30rem) {
    .login-page { padding: 1rem 0.6rem; }

    .login-header { padding: 0 0.4rem; }

    .login-header p { font-size: 1rem; }

    .login-box { padding: 1.1rem 0.9rem 1.2rem; }

    .login-btn {
        gap: 0.55rem;
        padding: 0.8rem 0.7rem;
        font-size: 0.92rem;
        letter-spacing: 0.02em;
    }

    .login-icon {
        width: 1.2rem;
        height: 1.2rem;
        flex: 0 0 1.2rem;
    }
}

/* ======================
   BEFINTLIGA GAME STILAR
   (Behåller dina ursprungliga stilar)
   ====================== */

/* Allmänna komponentstilar */
.button-primary {
    background: linear-gradient(135deg, #8b4513, #654321);
    color: #d4af37;
    padding: 10px 20px;
    border: 2px solid #d4af37;
    border-radius: 8px;
    cursor: pointer;
    font-family: 'Cinzel', serif;
    font-size: 1.1em;
    font-weight: 600;
    text-decoration: none;
    text-shadow: 1px 1px 2px #000;
    transition: all 0.2s ease;
    display: inline-block;
}

.button-primary:hover {
    background: linear-gradient(135deg, #a0522d, #8b4513);
    color: #fff8dc;
    border-color: #fff8dc;
    box-shadow: 0 0 10px rgba(212, 175, 55, 0.4);
    transform: translateY(-1px);
}

.button-secondary {
    background: #444;
    color: #d4af37;
    border: 1px solid #8b4513;
    padding: 5px 10px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.9em;
    transition: all 0.2s ease;
}

.button-secondary:hover {
    background: #555;
    border-color: #d4af37;
    color: #fff8dc;
}


/* Den gamla sidhuvudsregeln på elementet header är borttagen.
   Varje header i spelet har numera en egen klass — .hud, .sheet-head,
   .village-head, .creation-head och .barter-head — och ingen av dem
   ville ha den här bakgrunden. Den letade sig ändå in, eftersom
   klasserna bara satte layout och inte bakgrund. Resultatet syntes
   tydligast i stridsrapporten: rubrikraden fick en egen mörk yta med
   räta hörn som stack ut utanför rutans rundade hörn. */

#header-logo {
    height: 50px;
    width: auto;
    vertical-align: middle;
}

#header-top-row {
    display: flex;
    justify-content: space-between;
    align-items: center;
    width: 100%;
}

#auth-status {
    font-size: 0.9em;
    white-space: nowrap;
}

#auth-status a {
    color: #cd853f;
    text-decoration: none;
    margin: 0 5px;
    font-weight: bold;
}
#auth-status a:hover {
    color: #d4af37;
    text-decoration: underline;
}

#auth-status a.button {
    background: #444;
    color: #d4af37;
    border: 1px solid #8b4513;
    padding: 6px 12px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.9em;
    transition: all 0.2s ease;
    margin-left: 10px;
}

#auth-status a.button:hover {
    background: #555;
    border-color: #d4af37;
    color: #fff8dc;
}

main {
    flex-grow: 1;
    width: 90%;
    max-width: 1200px;
    padding: 20px 0;
    display: flex;
    flex-direction: column;
    align-items: center;
}

.hidden {
    display: none !important;
}

/* Flash meddelanden */
.flashes {
    list-style: none;
    margin: 15px 0;
    padding: 0;
}

.flashes li {
    background: linear-gradient(135deg, #8b4513, #654321);
    color: #d4af37;
    padding: 15px 25px;
    border: 1px solid #d4af37;
    border-radius: 8px;
    margin-bottom: 10px;
    text-align: center;
    font-weight: 600;
    text-shadow: 1px 1px 2px #000;
}

/* Karaktärsskapande formulär */
#character-creation {
    width: 100%;
    max-width: 500px;
    margin-top: 20px;
}

#character-form {
    text-align: center;
}

#character-form label {
    display: block;
    margin-bottom: 5px;
    font-weight: bold;
    text-align: center;
}

input[type="text"],
select {
    width: 80%;
    max-width: 300px;
    padding: 10px;
    margin-bottom: 15px;
    border: 2px solid #8b4513;
    background-color: #1a1a1a;
    color: #d4af37;
    border-radius: 4px;
    font-family: 'Crimson Text', serif;
    font-size: 1rem;
}

input[type="text"]:focus,
select:focus {
    outline: none;
    border-color: #d4af37;
    box-shadow: 0 0 8px rgba(212, 175, 55, 0.3);
}

#character-form select {
    width: 80%;
    max-width: 300px;
}

.stat-container {
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 10px;
}

.stat-container label {
    margin: 0 10px;
    width: 80px;
    text-align: right;
}

.stat-container button {
    background: #d4af37;
    color: #2d2d2d;
    border: 1px solid #8b4513;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    font-size: 1.2em;
    font-weight: bold;
    cursor: pointer;
    transition: all 0.2s ease;
}

.stat-container button:hover {
    background: #fff8dc;
    transform: scale(1.1);
}

.stat-container span {
    display: inline-block;
    width: 30px;
    text-align: center;
    font-weight: bold;
    font-size: 1.1em;
}

#points-remaining {
    margin-top: 15px;
    font-weight: bold;
    color: #d4af37;
    text-shadow: 1px 1px 2px #000;
}

/* Huvudspelskärm */
#game-screen {
    width: 100%;
    flex-grow: 1; /* Make it fill vertical space */
    position: relative; /* Context for floating panels */
    margin-top: 20px;
}

.game-info {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

.info-box {
    background: rgba(30, 30, 30, 0.9);
    border: 2px solid #8b4513;
    border-radius: 8px;
    box-shadow: 0 5px 15px rgba(0,0,0,0.5);
    backdrop-filter: blur(3px);
    padding: 0; /* Padding now handled by panel-header/panel-content */
}

.info-box:not(.floating-panel) .panel-content {
    padding: 20px;
}

.info-box h2 { /* This is now unused, replaced by panel-title */
    display: none;
}

.stats-content {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-around;
    gap: 15px;
    margin-top: 10px;
}

#player-stats p {
    margin: 0;
}


#player-stats span {
    font-weight: bold;
    color: #eee;
}

#inventory-list {
    list-style: none;
    padding: 0;
    margin: 0;
}

#inventory-list li {
    background-color: #444;
    padding: 8px;
    margin-bottom: 5px;
    border-radius: 4px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

/* Generic button style for dynamically created buttons */
#inventory-list button {
    background: #444;
    color: #d4af37;
    border: 1px solid #8b4513;
    padding: 5px 10px;
    border-radius: 4px;
    cursor: pointer;
    font-size: 0.9em;
    transition: all 0.2s ease;
    font-family: 'Crimson Text', serif;
}

#inventory-list button:hover {
    background: #555;
    border-color: #d4af37;
    color: #fff8dc;
}

/* Spelområdet är bara en behållare för kartan och har inga egna
   regler. */

#map-container.floating-panel {
    min-width: 0;
    min-height: 0;
}

/* #map-container får sin form av .floating-panel. */

#map-container .panel-content {
    padding: 0;
    position: relative; /* Allow positioning of children like item-panel */
    overflow: hidden; /* Canvas should fill this */
}

#map-container h2 {
    color: #d4af37;
    margin-top: 0;
    margin-bottom: 15px;
    font-family: 'Cinzel', serif;
}

#hexmap {
    background-color: #000000;
    width: 100%;
    height: 100%;
    display: block;
    border: none;
}

/* Profilvy (ersätter kartan) */
#profile-view {
    background-color: #333;
    padding: 20px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0,0,0,0.5);
    display: flex;
    flex-direction: column;
    box-sizing: border-box;
    position: relative;
}

.profile-back-btn {
    background-color: #4CAF50;
    color: white;
    padding: 10px 20px;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    font-size: 1.1em;
    transition: background-color 0.2s ease;
    position: absolute;
    bottom: 20px;
    right: 20px;
    z-index: 10;
}

.profile-back-btn:hover {
    background-color: #45a049;
}

.profile-iframe {
    flex-grow: 1;
    border: none;
    background-color: #2a2a2a; /* Matchar profilens bakgrund */
    border-radius: 4px;
}

#action-buttons {
    display: flex;
    flex-direction: column;
    align-items: stretch; /* Make buttons fill width */
    justify-content: center;
    gap: 10px;
    width: 100%;
}


.action-btn {
    background: linear-gradient(135deg, #8b4513, #654321);
    color: #d4af37;
    padding: 10px 20px;
    border: 2px solid #d4af37;
    border-radius: 8px;
    cursor: pointer;
    font-family: 'Cinzel', serif;
    font-size: 1em;
    font-weight: 600;
    text-decoration: none;
    text-shadow: 1px 1px 2px #000;
    transition: all 0.2s ease;
    margin-bottom: 8px;
}
.action-btn:last-child {
    margin-bottom: 0;
}
.action-btn:hover {
    background: linear-gradient(135deg, #a0522d, #8b4513);
    color: #fff8dc;
    border-color: #fff8dc;
    box-shadow: 0 0 10px rgba(212, 175, 55, 0.4);
    transform: translateY(-1px);
}

/* Loggar och chatt */

.log-box {
    background-color: #1a1a1a;
    border: 1px solid #8b4513;
    height: 150px;
    overflow-y: auto;
    padding: 10px;
    margin-bottom: 15px;
    border-radius: 4px;
    font-size: 0.9em;
}

.log-box p {
    margin: 5px 0;
    word-wrap: break-word;
}

#send-chat-btn {
    background: #d4af37;
    color: #2d2d2d;
    padding: 8px 15px;
    border: 1px solid #8b4513;
    border-radius: 4px;
    cursor: pointer;
    transition: all 0.2s ease;
    font-weight: bold;
}

#send-chat-btn:hover {
    background: #fff8dc;
}

footer {
    width: 100%;
    background: linear-gradient(135deg, #1e1e1e, #111);
    border-top: 3px solid #8b4513;
    text-align: center;
    padding: 15px;
    margin-top: auto; /* Push to bottom */
    box-shadow: 0 -4px 15px rgba(0,0,0,0.7);
    font-size: 0.9em;
    color: #8b4513;
}

/* ======================
   RESPONSIV DESIGN
   ====================== */

/* Login responsive */
@media (max-width: 768px) {
    .login-container {
        max-width: 95%;
        padding: 15px;
    }
    
    .login-header h1 {
        font-size: 3rem;
    }
    
    .login-header h1::before,
    .login-header h1::after {
        display: none;
    }
    
    .login-box {
        padding: 30px 25px;
    }
    
    .login-button, .register-button {
        padding: 15px 25px;
        font-size: 1.1rem;
    }
    
    /* Game responsive */
    #game-screen {
        grid-template-columns: 1fr;
    }
    
    #hexmap {
        width: 100%;
        height: 100%;
        max-width: 100%;
        max-height: 100%;
    }
    
    #chat-input {
        width: calc(100% - 70px);
    }

    header {
        padding: 20px 15px;
    }

    #header-top-row {
        flex-direction: column;
        gap: 15px;
    }
    
    /* Mobile-specific adjustments for floating panels */
    .info-box.floating-panel {
        min-width: 200px;
    }
    
    /* Ensure map container takes full available space on mobile */
    #map-container.floating-panel {
        width: 95vw;
        height: 60vh;
    }
}

@media (max-width: 480px) {
    .login-header h1 {
        font-size: 2.5rem;
    }
    
    .login-box {
        padding: 25px 20px;
    }
    
    .login-box h2 {
        font-size: 1.6rem;
    }
    
    .login-box h2::before,
    .login-box h2::after {
        display: none;
    }
}
#context-menu {
    position: absolute;
    z-index: 1000;
    background: #2d2d2d;
    border: 2px solid #8b4513;
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    padding: 4px 0;
    list-style: none;
    min-width: 220px;
    box-shadow: 0 0 10px rgba(0,0,0,0.8);
    border-radius: 8px;
}

#context-menu li {
    padding: 8px 14px;
    cursor: pointer;
    white-space: nowrap;
    transition: background 0.2s ease;
}

#context-menu li:hover {
    background: #3a2f1c; /* mörkare brun/guld */
    color: #fff8dc;
}

.submenu {
    position: relative;
}

.submenu ul {
    display: none;
    position: absolute;
    top: 0;
    left: 100%;
    background: #2d2d2d;
    border: 2px solid #8b4513;
    border-radius: 8px;
    padding: 4px 0;
    list-style: none;
    min-width: 200px;
    box-shadow: 0 0 10px rgba(0,0,0,0.8);
    /* Med grupprubriker blir listan lång. Utan tak växer den utanför
       skärmen och de sista föremålen går inte att nå. */
    max-height: 60vh;
    overflow-y: auto;
}

.submenu:hover ul {
    display: block;
}

.submenu:hover > ul {
  display: block;
}

.submenu::after {
  content: '▶';
  float: right;
  margin-left: 5px;
}

/* Rubrik i en undermeny: skiljer föremålsslagen åt utan att själv gå
   att klicka på. Pilen från .submenu ärvs inte hit. */
.submenu-group {
    margin-top: 4px;
    padding: 4px 12px 2px;
    border-top: 1px solid #4a4133;
    font-family: 'Cinzel', serif;
    font-size: 0.68rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: #9a7f2a;
    cursor: default;
    pointer-events: none;
}

/* Första rubriken behöver ingen linje ovanför sig. */
.submenu ul .submenu-group:first-child {
    margin-top: 0;
    border-top: none;
}
#item-panel.item-panel {
    /* No longer a separate box, just a container */
    color: #d4af37;
    font-size: 1.08rem;
    font-family: 'Crimson Text', serif;
    width: 100%;
    text-align: left;
    margin-bottom: 15px; /* Space between item list and action buttons */
}
#item-panel ul {
    margin: 6px 0 0 22px;
    padding-left: 0;
    font-size: 1rem;
}

#action-extra-info.action-extra-info {
    background: #222;
    color: #d4af37;
    border-radius: 8px;
    padding: 10px 18px 10px 18px;
    font-size: 1.08rem;
    font-family: 'Crimson Text', serif;
    margin-top: 8px;
    box-shadow: 0 2px 8px #0008;
    width: 100%;
    max-width: 320px;
    text-align: left;
    margin-left: auto;
    margin-right: auto;
}
#action-extra-info ul {
    margin: 6px 0 0 22px;
    padding-left: 0;
    font-size: 1rem;
}

.bar-container {
    position: relative;
    background: #222;
    border-radius: 8px;
    width: 100%;
    max-width: 200px;
    height: 22px;
    margin: 8px 0;
    border: 1px solid #000;
    overflow: hidden;
}

.bar {
    height: 100%;
    border-radius: 8px 0 0 8px;
    width: 0%;
    transition: width 0.3s cubic-bezier(.44,1.64,.53,.77), background 0.2s;
    box-shadow: 0 2px 10px rgba(20,10,0,0.07) inset;
    filter: brightness(0.95) contrast(0.92) saturate(0.9);
}

/* HP-stapelns färg sätts från JavaScript, se getHpBarGradient i
   game.js — därför har .hp-bar ingen egen regel här. */

.ap-bar {
    background: linear-gradient(180deg, #2d4ca0 0%, #497fc1 60%, #2e4e80 100%);
    box-shadow: 0 2px 8px rgba(20,20,50,0.12) inset;
    filter: brightness(0.93) contrast(0.93) saturate(0.92);
}

.bar-text {
    position: absolute;
    top: 0; left: 0; width: 100%; height: 100%;
    color: #f8f5e4;
    font-weight: bold;
    text-shadow: 0 1px 4px #111;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: none;
    font-size: 15px;
    letter-spacing: 0.5px;
}


#latest-log-banner p {
    margin: 0;
}

#banner-panel .panel-content.log-highlight {
    background-color: #4a4a4a;
}

#banner-panel .panel-content {
    padding: 5px 15px;
    text-align: center;
    font-style: italic;
    color: #e0cda1;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: background-color 0.5s ease;
}

.main-menu-btn {
    position: relative;
    background-color: #444;
    border: 1px solid #555;
    border-radius: 8px;
    color: white;
    font-size: 1.5rem;
    width: 50px;
    height: 50px;
    cursor: pointer;
    transition: background-color 0.2s ease;
    display: flex;
    align-items: center;
    justify-content: center;
}

.main-menu-btn:hover {
    background-color: #555;
}

.notification-dot {
    position: absolute;
    top: 5px;
    right: 5px;
    width: 10px;
    height: 10px;
    background-color: red;
    border-radius: 50%;
    border: 2px solid white;
    box-shadow: 0 0 3px rgba(0,0,0,0.5);
}

/* ======================
   FLOATING PANELS
   ====================== */

.info-box.floating-panel {
    padding: 0;
    position: absolute;
    z-index: 100;
    border: 2px solid #8b4513;
    background: rgba(30, 30, 30, 0.95);
    backdrop-filter: blur(5px);
    box-shadow: 0 5px 15px rgba(0,0,0,0.5);
    min-width: 300px;
    min-height: 42px; /* Header height */
    resize: both;
    overflow: hidden; /* Important for resize */
    display: flex;
    flex-direction: column;
}

.floating-panel.minimized .panel-content,
.floating-panel.minimized .chat-input-container {
    display: none;
}
.floating-panel.minimized {
    resize: none; /* Can't resize when minimized */
    height: auto !important; /* Override JS-set height */
}

.panel-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 8px 12px;
    background: linear-gradient(135deg, #8b4513, #654321);
    color: #d4af37;
    cursor: grab;
    user-select: none;
    border-bottom: 2px solid #8b4513;
    flex-shrink: 0;
}

.panel-header:active {
    cursor: grabbing;
}

.panel-header h2.panel-title {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 1.1rem;
    font-weight: 600;
    color: inherit;
    border: none;
    padding: 0;
    text-shadow: 1px 1px 2px #000;
    display: block;
}


.panel-controls {
    display: flex;
    gap: 5px;
}

.panel-controls button {
    background: #d4af37;
    color: #2d2d2d;
    border: 1px solid #8b4513;
    border-radius: 4px;
    width: 22px;
    height: 22px;
    font-weight: bold;
    cursor: pointer;
    line-height: 1;
    padding: 0;
    font-size: 1rem;
    display: flex;
    align-items: center;
    justify-content: center;
}

.panel-controls button:hover {
    background: #fff8dc;
}

.panel-content {
    padding: 15px;
    overflow-y: auto;
    flex-grow: 1;
}


.floating-panel .log-box {
    height: 100%;
    width: 100%;
    margin-bottom: 0;
    box-sizing: border-box;
}

.floating-panel #chat-input {
    width: 100%;
    margin-right: 0;
}

.panel-resize-handle {
    position: absolute;
    bottom: 0;
    right: 0;
    width: 20px;
    height: 20px;
    cursor: se-resize;
    z-index: 10; /* Ensures it is on top of panel content */
}

.panel-resize-handle::after {
    content: '';
    position: absolute;
    bottom: 3px;
    right: 3px;
    width: 0;
    height: 0;
    border-style: solid;
    border-width: 0 0 12px 12px;
    border-color: transparent transparent rgba(212, 175, 55, 0.5) transparent;
    transition: border-color 0.2s ease;
}

.panel-resize-handle:hover::after {
    border-color: transparent transparent rgba(255, 248, 220, 0.8) transparent;
}

.panel-content-row {
    display: flex;
    flex-direction: row;
    gap: 10px;
    justify-content: center;
    padding: 15px; /* Add padding to match other panel content */
}



/* ======================
   BERÄTTELSESYSTEM
   Uppdrag, utmärkelser, bestiarium, regioner och NPC-dialoger.
   ====================== */

/* --- Gemensamt --- */
.story-scroll {
    max-height: 100%;
    overflow-y: auto;
    padding-right: 4px;
}

.story-heading {
    font-family: 'Cinzel', serif;
    font-size: 0.78rem;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: #9a7f2a;
    margin: 12px 0 6px;
    border-bottom: 1px solid rgba(212, 175, 55, 0.2);
    padding-bottom: 3px;
}

.story-subhead {
    font-size: 0.78rem;
    color: #9c9080;
    margin-bottom: 8px;
}

.story-empty {
    font-size: 0.85rem;
    color: #9c9080;
    font-style: italic;
    padding: 12px 4px;
    line-height: 1.5;
}

/* --- Notiser --- */
.story-notices {
    position: fixed;
    top: 16px;
    right: 16px;
    width: 340px;
    max-width: calc(100vw - 32px);
    z-index: 4000;
    display: flex;
    flex-direction: column;
    gap: 8px;
    pointer-events: none;
}

.story-notice {
    pointer-events: auto;
    background: linear-gradient(180deg, #241f18 0%, #1a1611 100%);
    border: 1px solid #3d3527;
    border-left: 3px solid #d4af37;
    border-radius: 6px;
    padding: 10px 12px;
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.55);
    animation: story-notice-in 0.35s ease-out;
}

.story-notice.is-leaving {
    animation: story-notice-out 0.4s ease-in forwards;
}

@keyframes story-notice-in {
    from { opacity: 0; transform: translateX(28px); }
    to   { opacity: 1; transform: translateX(0); }
}

@keyframes story-notice-out {
    from { opacity: 1; transform: translateX(0); }
    to   { opacity: 0; transform: translateX(28px); }
}

.story-notice-head {
    display: flex;
    align-items: center;
    gap: 7px;
    margin-bottom: 4px;
}

.story-notice-icon { font-size: 1rem; }

.story-notice-title {
    font-family: 'Cinzel', serif;
    font-size: 0.85rem;
    color: #d4af37;
    flex: 1;
}

.story-notice-close {
    background: none;
    border: none;
    color: #9c9080;
    font-size: 1.05rem;
    line-height: 1;
    cursor: pointer;
    padding: 0 2px;
}

.story-notice-close:hover { color: #e8e0cc; }

.story-notice-text {
    font-size: 0.85rem;
    line-height: 1.55;
    color: #d8d0bc;
    margin: 0;
}

.story-notice.notice-achievement { border-left-color: #d4af37; }
.story-notice.notice-levelup     { border-left-color: #6fbf5e; }
.story-notice.notice-region      { border-left-color: #3b7ea1; }
.story-notice.notice-warning     { border-left-color: #b04a3a; }
.story-notice.notice-quest       { border-left-color: #a0791f; }
.story-notice.notice-bestiary    { border-left-color: #8a6bb8; }
.story-notice.notice-combat      { border-left-color: #c07a3a; }

/* --- Uppdrag --- */
.quest-card {
    background: rgba(0, 0, 0, 0.25);
    border: 1px solid #3d3527;
    border-radius: 5px;
    padding: 9px 10px;
    margin-bottom: 8px;
}

.quest-card.is-ready { border-color: #9a7f2a; }
.quest-card.is-available { opacity: 0.82; }

.quest-title {
    font-family: 'Cinzel', serif;
    font-size: 0.92rem;
    color: #d4af37;
    margin-bottom: 3px;
}

.quest-summary {
    font-size: 0.82rem;
    color: #b8b0a0;
    line-height: 1.45;
    margin: 0 0 6px;
}

.quest-hint {
    font-size: 0.75rem;
    color: #9c9080;
    font-style: italic;
    margin: 0 0 6px;
}

.quest-objectives { list-style: none; padding: 0; margin: 0 0 6px; }

.quest-objective {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 2px 8px;
    font-size: 0.8rem;
    color: #c8c0ae;
    margin-bottom: 5px;
}

.quest-objective.is-done { color: #7fae74; }

.quest-objective-count {
    font-variant-numeric: tabular-nums;
    color: #9c9080;
}

.quest-bar {
    grid-column: 1 / -1;
    display: block;
    height: 4px;
    background: #12100d;
    border: 1px solid #3d3527;
    border-radius: 999px;
    overflow: hidden;
}

.quest-bar-fill {
    display: block;
    height: 100%;
    background: linear-gradient(90deg, #9a7f2a, #d4af37);
}

.quest-btn {
    font-family: 'Cinzel', serif;
    font-size: 0.72rem;
    padding: 4px 10px;
    border-radius: 4px;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    cursor: pointer;
}

.quest-btn:hover { filter: brightness(1.3); }

.quest-btn-ghost {
    border-color: #3d3527;
    background: transparent;
    color: #9c9080;
}

/* --- Utmärkelser --- */
.achievement-card {
    display: flex;
    gap: 9px;
    padding: 8px;
    border: 1px solid #3d3527;
    border-radius: 5px;
    margin-bottom: 6px;
    background: rgba(0, 0, 0, 0.2);
    opacity: 0.65;
}

.achievement-card.is-unlocked {
    opacity: 1;
    border-color: #9a7f2a;
    background: rgba(212, 175, 55, 0.07);
}

.achievement-icon { font-size: 1.3rem; line-height: 1.2; }
.achievement-body { flex: 1; min-width: 0; }

.achievement-name {
    font-family: 'Cinzel', serif;
    font-size: 0.85rem;
    color: #d4af37;
}

.achievement-desc {
    font-size: 0.78rem;
    color: #b0a898;
    margin: 2px 0 4px;
    line-height: 1.4;
}

.achievement-done {
    font-size: 0.72rem;
    color: #7fae74;
}

.achievement-count {
    font-size: 0.7rem;
    color: #9c9080;
    display: block;
    margin-top: 2px;
}

/* --- Titlar --- */
.title-chips { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 10px; }

.title-chip {
    font-size: 0.74rem;
    padding: 3px 9px;
    border-radius: 999px;
    border: 1px solid #3d3527;
    background: transparent;
    color: #9c9080;
    cursor: pointer;
}

.title-chip:hover { border-color: #9a7f2a; color: #d4af37; }

.title-chip.is-active {
    border-color: #d4af37;
    background: rgba(212, 175, 55, 0.15);
    color: #d4af37;
}

/* --- Bestiarium --- */
.bestiary-card {
    border: 1px solid #3d3527;
    border-radius: 5px;
    padding: 8px 10px;
    margin-bottom: 6px;
    background: rgba(0, 0, 0, 0.2);
}

.bestiary-name {
    font-family: 'Cinzel', serif;
    font-size: 0.88rem;
    color: #d4af37;
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 4px;
}

.bestiary-knowledge { font-size: 0.72rem; color: #9a7f2a; letter-spacing: 1px; }

.bestiary-rows { display: flex; flex-direction: column; gap: 2px; }

.bestiary-rows span {
    font-size: 0.76rem;
    color: #b0a898;
}

.bestiary-locked { color: #7a7062 !important; font-style: italic; }

/* --- Regioner --- */
.region-current {
    border: 1px solid #9a7f2a;
    border-radius: 5px;
    padding: 9px 10px;
    margin-bottom: 10px;
    background: rgba(212, 175, 55, 0.07);
}

.region-name {
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    color: #d4af37;
}

.region-desc {
    font-size: 0.82rem;
    color: #b8b0a0;
    margin: 3px 0;
    line-height: 1.45;
}

.region-meta { font-size: 0.74rem; color: #9c9080; margin: 0; }

.region-row {
    display: flex;
    justify-content: space-between;
    font-size: 0.8rem;
    color: #c0b8a6;
    padding: 3px 2px;
    border-bottom: 1px solid rgba(61, 53, 39, 0.5);
}

.region-visits { color: #9c9080; font-variant-numeric: tabular-nums; }

/* --- NPC:er --- */
.npc-bar {
    position: fixed;
    bottom: 16px;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 7px;
    z-index: 3000;
    flex-wrap: wrap;
    justify-content: center;
    max-width: 90vw;
}

.npc-btn {
    display: flex;
    flex-direction: column;
    align-items: center;
    font-family: 'Cinzel', serif;
    font-size: 0.8rem;
    padding: 6px 14px;
    border-radius: 5px;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #2e2719, #1c1811);
    color: #d4af37;
    cursor: pointer;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5);
}

.npc-btn:hover { filter: brightness(1.3); }

.npc-btn-title {
    font-family: 'Crimson Text', serif;
    font-size: 0.68rem;
    color: #9c9080;
}

.npc-marker {
    color: #ffd84d;
    font-weight: bold;
    margin-right: 4px;
}

/* --- Dialogruta --- */
.npc-dialogue-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.72);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 5000;
    padding: 20px;
}

.npc-dialogue-overlay.hidden { display: none; }

.npc-dialogue-box {
    position: relative;
    width: 100%;
    max-width: 560px;
    max-height: 82vh;
    overflow-y: auto;
    background: linear-gradient(180deg, #221e17 0%, #171410 100%);
    border: 1px solid #9a7f2a;
    border-radius: 8px;
    padding: 22px 24px;
    box-shadow: 0 12px 48px rgba(0, 0, 0, 0.75);
}

.npc-dialogue-close {
    position: absolute;
    top: 10px;
    right: 12px;
    background: none;
    border: none;
    color: #9c9080;
    font-size: 1.4rem;
    line-height: 1;
    cursor: pointer;
}

.npc-dialogue-close:hover { color: #d4af37; }

.npc-dialogue-header { margin-bottom: 12px; }

.npc-dialogue-header h3 {
    font-family: 'Cinzel', serif;
    font-size: 1.25rem;
    color: #d4af37;
    margin: 0;
}

.npc-dialogue-header p {
    font-size: 0.82rem;
    color: #9c9080;
    font-style: italic;
    margin: 2px 0 0;
}

.npc-dialogue-text {
    font-size: 0.98rem;
    line-height: 1.7;
    color: #ddd5c2;
    margin: 0 0 14px;
    padding-bottom: 14px;
    border-bottom: 1px solid #3d3527;
}

.npc-message {
    font-size: 0.85rem;
    color: #b8d0a8;
    background: rgba(111, 191, 94, 0.08);
    border-left: 2px solid #6fbf5e;
    padding: 6px 10px;
    margin: 0 0 8px;
    border-radius: 3px;
    line-height: 1.5;
}

.npc-dialogue-options { display: flex; flex-direction: column; gap: 7px; }

.npc-option {
    text-align: left;
    font-family: 'Crimson Text', serif;
    font-size: 0.92rem;
    padding: 9px 13px;
    border-radius: 5px;
    border: 1px solid #3d3527;
    background: rgba(0, 0, 0, 0.3);
    color: #d8d0bc;
    cursor: pointer;
    transition: border-color .15s, background-color .15s;
}

.npc-option:hover {
    border-color: #9a7f2a;
    background: rgba(212, 175, 55, 0.09);
    color: #d4af37;
}

.npc-option-ghost { color: #9c9080; font-style: italic; }

@media (max-width: 640px) {
    .story-notices { width: calc(100vw - 24px); right: 12px; top: 12px; }
    .npc-bar { bottom: 8px; }
    .npc-dialogue-box { padding: 18px 16px; }
}

/* ======================
   EP-MÄTARE
   ====================== */
.xp-bar {
    background: linear-gradient(180deg, #7a5fd6 0%, #5a44a8 60%, #3f2f7a 100%);
}

/* ======================
   FÖREMÅLSSTATS (tooltip)
   ====================== */
.inventory-item-name { cursor: help; }

.item-tooltip {
    position: fixed;
    z-index: 6000;
    width: 240px;
    pointer-events: none;
    background: linear-gradient(180deg, #241f18 0%, #171410 100%);
    border: 1px solid #9a7f2a;
    border-radius: 6px;
    padding: 10px 12px;
    box-shadow: 0 8px 26px rgba(0, 0, 0, 0.7);
}

.item-tooltip.hidden { display: none; }

.item-tip-name {
    font-family: 'Cinzel', serif;
    font-size: 0.92rem;
    color: #d4af37;
    margin-bottom: 2px;
}

.item-tip-tags {
    font-size: 0.72rem;
    color: #9c9080;
    margin-bottom: 6px;
}

.item-tip-desc {
    font-size: 0.78rem;
    color: #b0a898;
    font-style: italic;
    line-height: 1.4;
    margin: 0 0 6px;
}

.item-tip-stats {
    display: flex;
    flex-direction: column;
    gap: 2px;
    border-top: 1px solid #3d3527;
    padding-top: 6px;
}

.item-stat {
    display: flex;
    justify-content: space-between;
    font-size: 0.79rem;
}

.item-stat span:first-child { color: #9c9080; }
.item-stat span:last-child  { color: #ddd5c2; font-variant-numeric: tabular-nums; }

/* ======================
   BUTIK
   ====================== */
/* Boden öppnas ur dialogen och ligger ovanpå den.
   Med samma z-index som .npc-dialogue-overlay avgör ordningen i
   dokumentet vem som hamnar överst, och dialogrutan står senare i
   index.html — så boden försvann bakom den man just pratade med. */
.shop-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.72);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 5100;
    padding: 20px;
}

.shop-overlay.hidden { display: none; }

.shop-box {
    position: relative;
    width: 100%;
    max-width: 760px;
    max-height: 84vh;
    overflow-y: auto;
    background: linear-gradient(180deg, #221e17 0%, #171410 100%);
    border: 1px solid #9a7f2a;
    border-radius: 8px;
    padding: 22px 24px;
    box-shadow: 0 12px 48px rgba(0, 0, 0, 0.75);
}

.shop-header {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 12px;
    margin-bottom: 12px;
    padding-bottom: 10px;
    border-bottom: 1px solid #3d3527;
}

.shop-header h3 {
    font-family: 'Cinzel', serif;
    font-size: 1.2rem;
    color: #d4af37;
    margin: 0;
}

.shop-meta { display: flex; gap: 14px; font-size: 0.82rem; color: #9c9080; }

.shop-columns {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 18px;
}

.shop-list { display: flex; flex-direction: column; gap: 4px; }

/* Raden har tre eller fyra barn.
   -----------------------------------------------------------------
   Namn, pris och knapp finns alltid; antalet ("10 kvar") bara när
   varan inte är obegränsad. Rutnätet hade tre kolumner, så den fjärde
   rutan sköts ner på en egen rad — och eftersom knappen kom sist var
   det den som hamnade under, utsträckt över hela bredden.

   Fyra kolumner där antalets kolumn får vara tom när det saknas. */
.shop-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto auto auto;
    align-items: center;
    gap: 8px;
    padding: 6px 8px;
    border: 1px solid #3d3527;
    border-radius: 4px;
    background: rgba(0, 0, 0, 0.25);
    cursor: help;
}

.shop-row:hover { border-color: #9a7f2a; }

.shop-item-name {
    font-size: 0.86rem;
    color: #ddd5c2;
    min-width: 0;
    overflow-wrap: anywhere;
}
.shop-stock { font-size: 0.7rem; color: #9c9080; }

.shop-price {
    font-size: 0.82rem;
    color: #d4af37;
    font-variant-numeric: tabular-nums;
}

.shop-btn {
    font-family: 'Cinzel', serif;
    font-size: 0.7rem;
    padding: 3px 10px;
    border-radius: 4px;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    cursor: pointer;
}

.shop-btn:hover:not(:disabled) { filter: brightness(1.3); }

.shop-btn:disabled {
    opacity: 0.4;
    cursor: not-allowed;
    border-color: #3d3527;
    color: #9c9080;
}

.shop-btn-sell { border-color: #3f6b3c; color: #96c491; }

@media (max-width: 720px) {
    .shop-columns { grid-template-columns: 1fr; }
    .shop-box { padding: 18px 16px; }
}

/* ==========================================================================
   SPELSKALET
   --------------------------------------------------------------------------
   Ersätter de flytande fönstren. Uppbyggnad:

     .shell            rutnät: HUD överst, resten under
       .hud            tunn rad som alltid syns
       .shell-body     rutnät: docka | kartyta | ark
         .dock         knappar, en per vy
         .stage        kartan, fyller all yta som blir över
         .sheet        en vy åt gången

   Smal skärm: dockan hamnar längst ner, arket glider upp underifrån.
   Bred skärm: dockan blir en lodrät list, arket en kolumn till höger
   som kartan lämnar plats åt i stället för att skymmas av.
   ========================================================================== */

:root {
    --hud-height: 3.65rem;
    --dock-size: 4.15rem;
    /* Arket bär numera uppslagsverkets artiklar och klanens tabeller,
       inte bara en ryggsäck. Tjugotre rem gav rader på fyra ord.
       ---------------------------------------------------------------
       Måttet är ett tak, inte en bredd. Sedan mobilläget börjar först
       vid 730 px finns det skrivbordsskärmar där trettio rem plus
       dockan skulle lämna en karta på ett par hundra bildpunkter —
       och kartan är det man spelar på. Den som är bred nog får hela
       arket. */
    --sheet-width: min(30rem, 45vw);
    --safe-b: env(safe-area-inset-bottom, 0px);

    /* Hur mycket av skärmen mobilens tangentbord tar.
       ---------------------------------------------------------------
       Sätts av game.js ur visualViewport, och är noll överallt utom på
       en telefon med tangentbordet uppe.

       Varför det behövs: 100svh är den *minsta* vyhöjden, och den
       ändras inte när tangentbordet glider upp. Skalet behöll alltså
       hela sin höjd medan halva skärmen försvann under tangenterna, och
       skrivfältet — som ligger längst ner i arket — hamnade bakom dem.
       Man skrev i en ruta man inte såg. */
    --tangentbord: 0px;
    --safe-t: env(safe-area-inset-top, 0px);
    --safe-l: env(safe-area-inset-left, 0px);
    --safe-r: env(safe-area-inset-right, 0px);
}

/* body i style.css är flex-centrerad för inloggningssidan. Spelet
   behöver i stället fylla hela ytan, därav den egna klassen. */
/* Sidans canvas målas av html-elementet. Sätts bakgrunden bara på
   body är den beroende av propagering, vilket slutar gälla så fort
   body hamnar utanför flödet — då lyser webbläsarens vita default
   igenom i kanterna. */
html.game-root { background: #14120f; }

body.game-body {
    /* Basregeln sätter min-height: 100vh, och vh räknar in mobilens
       adressfält — därför hamnade dockan nedanför skärmkanten. svh är
       den minsta möjliga vyhöjden och ändras inte när adressfältet
       glider in och ut, så skalet ryms alltid. */
    display: block;
    align-items: stretch;
    margin: 0;
    padding: 0;
    width: 100%;
    height: 100dvh;
    height: 100svh;
    min-height: 0;
    max-height: 100svh;
    overflow: hidden;
    overscroll-behavior: none;
}

/* Skalet krymper med tangentbordet.
   -------------------------------------------------------------------
   Hela skalet och inte bara skrivfältet: dockan, arkets rullist och
   skrivraden hör ihop, och lyfte man bara det sista hamnade det ovanpå
   knapparna det står bredvid. Kartan blir lägre en stund — det är den
   som får ge vika, för den använder man inte medan man skriver. */
body.game-body {
    height: calc(100svh - var(--tangentbord));
    max-height: calc(100svh - var(--tangentbord));
}

body.game-body #game-screen {
    height: 100%;
    /* Basregeln ger #game-screen margin-top: 20px från den gamla
       layouten med flytande fönster. I skalet sköts all placering av
       rutnätet, så marginalen sköt bara ner allt 20px och lät
       bakgrunden lysa igenom överst. */
    margin: 0;
}

body.game-body #game-container {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
    max-width: none;
    display: block;
}

.shell {
    height: 100%;
    display: grid;
    grid-template-rows: auto 1fr;
    background: #14120f;
}

/* ---------------- HUD ---------------- */

.hud {
    position: relative;
    /* HUD:en är beständig ram och måste ligga överst av skalets lager.
       Den skapar en egen stapelkontext, så kontomenyns z-index: 60
       gäller bara inuti HUD:en — låg HUD:en på samma nivå som
       stadsvyn målades hela menyn över, eftersom stadsvyn kommer
       senare i dokumentet. Håll det här värdet högst av .hud,
       .village, .sheet och .dock. */
    z-index: 50;
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) auto;
    align-items: center;
    gap: 0.9rem;
    height: calc(var(--hud-height) + var(--safe-t));
    padding: var(--safe-t) calc(0.75rem + var(--safe-r)) 0 calc(0.75rem + var(--safe-l));
    background: linear-gradient(180deg, #221e17 0%, #1a1610 100%);
    border-bottom: 1px solid #3d3527;
    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.5);
}

.hud-identity { min-width: 0; }

/* Namnet är numera knappen till karaktärsbladet. Det ska se ut som
   text, inte som en knapp — men bete sig som en. */
.hud-name {
    position: relative;
    padding: 0;
    border: none;
    background: none;
    text-align: left;
    cursor: pointer;
    font-family: 'Cinzel', serif;
    font-size: 0.95rem;
    color: #d4af37;
    display: flex;
    align-items: baseline;
    gap: 0.4rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}

.hud-name:hover { color: #f0d98a; }
.hud-name:hover .hud-title { color: #b9ad95; }
.hud-name:focus-visible { outline: 1px solid #9a7f2a; outline-offset: 2px; }

/* Öppet blad: samma markering som dockans aktiva knapp ger. */
.hud-name.is-active { color: #f0d98a; }

/* Olästprick på namnet, som på dockans knappar. */
.hud-name .notification-dot {
    position: static;
    align-self: center;
    flex-shrink: 0;
}

.hud-title {
    font-family: 'Crimson Text', serif;
    font-size: 0.72rem;
    color: #9c9080;
    font-style: italic;
}

.hud-sub {
    font-size: 0.72rem;
    color: #9c9080;
    white-space: nowrap;
}

.hud-dot { opacity: 0.5; margin: 0 0.15rem; }

/* Staplarna: HP, AP och EP bredvid varandra. */
.hud-vitals {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 0.5rem;
    min-width: 0;
}

/* Etiketten står tätt intill sin stapel. Ett stort mellanrum fick de
   tre paren att flyta ihop till sex fristående saker i stället för
   tre. Samma avstånd för HP, AP och EP. */
.vital { display: flex; align-items: center; gap: 0.15rem; min-width: 0; }

.vital-label {
    font-family: 'Cinzel', serif;
    font-size: 0.62rem;
    letter-spacing: 0.06em;
    color: #9a7f2a;
    /* Ingen bredd här: den sätts i blocket om HUD:ens staplar längre
       ner, och en width på den här raden vore död och vilseledande. */
    flex-shrink: 0;
}

/* Överskriver de generösare måtten från den gamla panelen. */
.hud .bar-container {
    position: relative;
    flex: 1;
    height: 0.85rem;
    min-width: 0;
    margin: 0;
    border-radius: 999px;
    background: #12100d;
    border: 1px solid #3d3527;
    overflow: hidden;
}

.hud .bar { height: 100%; border-radius: 999px; transition: width .3s ease; }

.hud .bar-text {
    position: absolute;
    inset: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.6rem;
    font-variant-numeric: tabular-nums;
    color: #f0e8d4;
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.9);
    pointer-events: none;
}

.hud-meta {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    font-size: 0.8rem;
    color: #c8c0ae;
    white-space: nowrap;
}

.hud-gold { color: #d4af37; font-variant-numeric: tabular-nums; }
.hud-coin { margin-right: 0.2rem; opacity: 0.8; }
.hud-pos { font-variant-numeric: tabular-nums; color: #9c9080; font-size: 0.75rem; }

.hud-menu-btn {
    background: none;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    color: #d4af37;
    font-size: 1rem;
    line-height: 1;
    padding: 0.3rem 0.5rem;
    cursor: pointer;
}

.hud-menu-btn:hover { border-color: #9a7f2a; background: rgba(212,175,55,0.1); }

.account-menu {
    position: absolute;
    top: calc(100% + 4px);
    right: 0.75rem;
    z-index: 60;
    display: flex;
    flex-direction: column;
    min-width: 12rem;
    padding: 0.3rem;
    background: #1e1b16;
    border: 1px solid #9a7f2a;
    border-radius: 0.4rem;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.7);
}

.account-menu.hidden { display: none; }

.account-menu a {
    padding: 0.45rem 0.6rem;
    border-radius: 0.3rem;
    color: #d8d0bc;
    font-size: 0.86rem;
    text-decoration: none;
}

.account-menu a:hover { background: rgba(212,175,55,0.12); color: #d4af37; }

/* ---------------- Kropp: docka, karta, ark ---------------- */

.shell-body {
    position: relative;
    display: grid;
    grid-template-columns: var(--dock-size) minmax(0, 1fr) 0;
    min-height: 0;
    transition: grid-template-columns .28s ease;
}

/* När arket är öppet på bred skärm krymper kartan i stället för att
   döljas — man ska kunna läsa uppdraget och se kartan samtidigt. */
.shell-body.sheet-open { grid-template-columns: var(--dock-size) minmax(0, 1fr) var(--sheet-width); }

/* ---------------- Dockan ---------------- */

.dock {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    padding: 0.5rem 0.35rem calc(0.5rem + var(--safe-b));
    padding-left: calc(0.35rem + var(--safe-l));
    background: linear-gradient(180deg, #1c1913 0%, #171410 100%);
    border-right: 1px solid #3d3527;
    overflow-y: auto;
    z-index: 30;
}

.dock-btn {
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.12rem;
    padding: 0.45rem 0.2rem;
    border: 1px solid transparent;
    border-radius: 0.45rem;
    background: transparent;
    color: #9c9080;
    cursor: pointer;
    transition: background-color .15s, color .15s, border-color .15s;
    -webkit-tap-highlight-color: transparent;
}

.dock-btn:hover { background: rgba(212,175,55,0.07); color: #d8d0bc; }

.dock-btn.is-active {
    background: rgba(212,175,55,0.14);
    border-color: #9a7f2a;
    color: #d4af37;
}

.dock-icon { font-size: 1.18rem; line-height: 1.1; }

.dock-label {
    font-family: 'Cinzel', serif;
    font-size: 0.55rem;
    letter-spacing: 0.02em;
    text-align: center;
    line-height: 1.15;
}

.dock-btn .notification-dot {
    position: absolute;
    top: 0.3rem;
    right: 0.45rem;
    width: 0.5rem;
    height: 0.5rem;
    border-radius: 50%;
    background: #d4af37;
    box-shadow: 0 0 6px rgba(212, 175, 55, 0.8);
}

.dock-btn .notification-dot.hidden { display: none; }

/* ---------------- Kartytan ---------------- */

.stage {
    position: relative;
    min-width: 0;
    min-height: 0;
    overflow: hidden;
    background:
        radial-gradient(circle at 50% 40%, #1d1a15 0%, #100e0b 100%);
}

.stage #hexmap {
    display: block;
    width: 100%;
    height: 100%;
    touch-action: none;
}

/* Överlägget släpper igenom klick utom där det finns knappar. */
.stage-overlay {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    padding: 0.6rem;
    pointer-events: none;
}

/* Notishögen: en ruta per händelse, nyast underst.
   -----------------------------------------------------------------
   Placeringen ligger på högen och inte på rutorna. Förut bar varje
   ruta sin egen position: fixed och sin egen translateX(-50%), och
   två rutor hade då hamnat ovanpå varandra.

   Notiserna måste synas även när staden ligger över kartan.
   position: fixed lyfter högen ur kartans lager helt, så att inget
   som ritas inuti .stage kan täcka den — ett arenaresultat gick
   annars spårlöst förbi den som stod innanför murarna.
   z-index 45: ovanför staden (40), under HUD:en (50) så att
   kontomenyn fortfarande går att klicka på. */
.toast-stack {
    position: fixed;
    top: calc(var(--hud-height) + var(--safe-t) + 0.6rem);
    left: 50%;
    transform: translateX(-50%);
    z-index: 45;
    width: min(90%, 34rem);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.3rem;
    /* Högen är bara en behållare. Tryck ska gå igenom den till kartan
       — det är rutorna som tar emot dem, och bara när de syns. */
    pointer-events: none;
}

.toast-line {
    max-width: 100%;
    margin: 0;
    padding: 0.35rem 0.8rem;
    border-radius: 0.9rem;
    background: rgba(20, 18, 15, 0.82);
    border: 1px solid #3d3527;
    color: #d8d0bc;
    font-size: 0.82rem;
    text-align: center;
    line-height: 1.45;
    backdrop-filter: blur(3px);
    opacity: 0;
    transform: translateY(-6px);
    transition: opacity .25s ease, transform .25s ease;
}

.toast-line.is-visible {
    opacity: 1;
    transform: translateY(0);
}

/* ---------------- Kontextraden ---------------- */

















/* NPC-raden ligger nu inuti kontextraden i stället för att sväva fritt. */


/* ---------------- Arket ---------------- */

.sheet {
    display: flex;
    flex-direction: column;
    min-height: 0;
    background: linear-gradient(180deg, #211d17 0%, #171410 100%);
    border-left: 1px solid #3d3527;
    z-index: 35;
    overflow: hidden;
}

.sheet.hidden { display: none; }

.sheet-grip { display: none; }

.sheet-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.6rem;
    padding: 0.7rem 0.9rem;
    border-bottom: 1px solid #3d3527;
    flex-shrink: 0;
}

.sheet-title {
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    color: #d4af37;
    margin: 0;
}

.sheet-close {
    background: none;
    border: none;
    color: #9c9080;
    font-size: 1.5rem;
    line-height: 1;
    padding: 0 0.3rem;
    cursor: pointer;
}

.sheet-close:hover { color: #d4af37; }

.sheet-body {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 0.85rem 0.9rem calc(0.85rem + var(--safe-b));
    -webkit-overflow-scrolling: touch;
}

.sheet-view[hidden] { display: none; }

/* --- Ryggsäcken --- */

#inventory-list { list-style: none; padding: 0; margin: 0 0 0.5rem; }

#inventory-list li {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
    padding: 0.45rem 0.55rem;
    margin-bottom: 0.3rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: rgba(0, 0, 0, 0.22);
    font-size: 0.85rem;
}

#inventory-list button {
    font-family: 'Cinzel', serif;
    font-size: 0.68rem;
    padding: 0.22rem 0.55rem;
    border-radius: 0.3rem;
    border: 1px solid #3d3527;
    background: linear-gradient(180deg, #2f2819, #221d14);
    color: #c8c0ae;
    cursor: pointer;
}

#inventory-list button:hover { border-color: #9a7f2a; color: #d4af37; }

.equip-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
    gap: 0.3rem;
}

.equip-slot {
    display: flex;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.35rem 0.5rem;
    border: 1px solid #3d3527;
    border-radius: 0.3rem;
    background: rgba(0, 0, 0, 0.18);
    font-size: 0.79rem;
}

.equip-slot span:first-child { color: #9c9080; }
.equip-slot span:last-child { color: #d8d0bc; text-align: right; }

/* --- Loggvyn --- */

.sheet-view-log { display: flex; flex-direction: column; height: 100%; }

/* Krönikan är byggd som loggen och klanvyn: flikraden står stilla och
   bara innehållet rullar. En enda klass räcker här — .sheet-view[hidden]
   väger tyngre och fortsätter dölja vyn. Klanvyn behövde ett :not() av
   just det skälet: den regeln var lika tung och stod längre ner. */
.sheet-view-journal {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}

.journal-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding-top: 0.8rem;
    padding-bottom: 1.2rem;
}

.journal-pane.hidden { display: none; }

/* Flikarnas märke sitter efter texten, inte ovanför den. */
.journal-tab { position: relative; }

.journal-tab .notification-dot {
    position: static;
    display: inline-block;
    margin-left: 0.35rem;
    vertical-align: middle;
}


.log-pane { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.log-pane.hidden { display: none; }

.sheet .log-box {
    flex: 1;
    min-height: 8rem;
    max-height: none;
    overflow-y: auto;
    padding: 0.5rem 0.6rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: rgba(0, 0, 0, 0.28);
    font-size: 0.82rem;
    line-height: 1.5;
}

/* Världschatten är numera byggd som klanchatten: .chat-shell fyller
   loggrutans höjd, samtalet rullar i .letter-messages och .letter-reply
   ligger kvar i nederkanten. Skrivfältet ärver därmed .letter-input och
   behöver ingen egen uppsättning regler längre. */

/* Skrivfältet delar rad med knappen och får den bredd som blir över.
   width: 100% här hade tvingat ut knappen ur raden. */
.sheet #chat-input {
    width: auto;
    resize: none;
}

.sheet #send-chat-btn {
    font-family: 'Cinzel', serif;
    font-size: 0.75rem;
    padding: 0.45rem 0.85rem;
    border-radius: 0.35rem;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    cursor: pointer;
}

/* ==========================================================================
   SMAL SKÄRM
   Dockan flyttar ner, arket blir en låda som glider upp underifrån.

   Gränsen går vid 730 px, inte 900.
   --------------------------------------------------------------------------
   Nio hundra tog mobilläget långt in på surfplattor och små
   bärbara — skärmar där den lodräta listen till vänster får plats
   och är trevligare att använda än en rad ikoner längst ner. 730 är
   det smalaste som rymmer listen, ett läsbart ark och en karta värd
   namnet samtidigt.

   Talet står på flera ställen i den här filen. Media queries kan inte
   läsa CSS-variabler, så det går inte att göra på något annat sätt —
   men alla förekomster hör ihop och ska ändras tillsammans.
   ========================================================================== */

@media (max-width: 729px) {
    :root { --hud-height: 3.35rem; }

    .dock {
        grid-row: 2;
        flex-direction: row;
        justify-content: space-around;
        gap: 0.15rem;
        border-right: none;
        border-top: 1px solid #3d3527;
        padding: 0.3rem 0.25rem calc(0.3rem + var(--safe-b));
    }

    .sheet-grip {
        display: block;
        width: 2.4rem;
        height: 0.25rem;
        margin: 0.45rem auto 0;
        border-radius: 999px;
        background: #4a4133;
        flex-shrink: 0;
    }

    .sheet-head { padding: 0.5rem 0.9rem 0.6rem; }

    .hud {
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-rows: auto auto;
        gap: 0.3rem 0.6rem;
        height: auto;
        padding-bottom: 0.4rem;
    }

    .hud-identity { grid-column: 1; grid-row: 1; }
    .hud-meta { grid-column: 2; grid-row: 1; }
    /* Mellanrummet mellan de tre paren är det som gör staplarna
       smala: varje mellanrum är bredd som annars vore mätare. */
    /* Bredd och mellanrum sätts längre ner i filen, i blocket om
       HUD:ens staplar. Att sätta dem här hade inte synts. */
    .hud-vitals { grid-column: 1 / -1; grid-row: 2; }
    .vital-label { font-size: 0.58rem; }
    .hud .bar-container { height: 0.75rem; }

    
    /* Notisen får nästan hela bredden. 90 % lämnade en marginal som
       inte gjorde någon nytta, och fyra rader i en smal pelare blev
       åtta. Den ligger ändå ovanpå kartan. */
    /* Bredden sätts med left och right, inte med en procent.
       -------------------------------------------------------------
       max-width i procent räknas mot högens containing block, och för
       ett position: fixed-element är det inte alltid fönstret — en
       förfader med transform tar över den rollen. Pillret blev därför
       smalare än begärt hur många procent som än stod där. Två fasta
       kanter lämnar inget att tolka. */
    .toast-stack {
        left: 0.5rem;
        right: 0.5rem;
        width: auto;
        transform: none;
    }

    .toast-line {
        font-size: 0.78rem;
        padding: 0.35rem 0.7rem;
    }
}

/* Riktigt smala telefoner.
   -----------------------------------------------------------------
   Tre staplar bredvid varandra med etikett, siffror och maxvärde får
   inte plats på 380 bildpunkter. Etiketten krymper, siffrorna med
   den, och mellanrummen blir precis så stora att raden går att läsa.
   Enheten inuti stapeln är redan borttagen i game.js — etiketten till
   vänster säger vad det är. */
@media (max-width: 480px) {
    .hud { gap: 0.25rem 0.4rem; padding-bottom: 0.35rem; }

    .vital { gap: 0.1rem; }

    .vital-label { font-size: 0.52rem; letter-spacing: 0; }

    .hud .bar-container { height: 0.7rem; }

    .hud .bar-text { font-size: 0.52rem; letter-spacing: -0.02em; }
}

/* Riktigt smala telefoner: dölj etiketterna, ikonerna räcker. */
@media (max-width: 380px) {
    .dock-label { display: none; }
    .dock-btn { padding: 0.5rem 0.15rem; }
    .hud-pos { display: none; }
}

/* Lågt liggande fönster (mobil i liggande läge): ge kartan mer höjd. */
/* Låga skärmar hanteras längre ned, där arket ligger i rutnätet
   i stället för att sväva över kartan. */

/* ==========================================================================
   ZOOMKNAPPAR, MÖTESRUTA OCH PROFILVY
   ========================================================================== */

/* Raden överst på kartan: notistext i mitten, zoom till höger. */
.stage-top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.5rem;
}

/* Notisraden är numera fixerad och ligger inte kvar här, så
   zoomknapparna får hela raden och ska stå till höger. */
.stage-top { justify-content: flex-end; }

.map-zoom {
    pointer-events: auto;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    flex-shrink: 0;
}

.map-zoom button {
    width: 2rem;
    height: 2rem;
    border-radius: 0.35rem;
    border: 1px solid #3d3527;
    background: rgba(20, 18, 15, 0.82);
    color: #d4af37;
    font-size: 1.05rem;
    line-height: 1;
    cursor: pointer;
    backdrop-filter: blur(3px);
}

.map-zoom button:hover { border-color: #9a7f2a; background: rgba(42,36,24,0.9); }

/* --- Mötesrutan --- */






















/* --- Profilvyn --- */

.pf-head { margin-bottom: 0.6rem; }

/* Namnet och klanen står bredvid varandra: klanen hör till vem man är,
   inte till en egen avdelning längre ner. Vapnet räcker som förklaring
   — en rad som sa "Öppna klanen" var en bruksanvisning, inte innehåll. */
.pf-headline {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.8rem;
    flex-wrap: wrap;
}

.pf-headline-text { min-width: 0; }

.pf-clanless {
    margin-top: 0.35rem;
    font-size: 0.78rem;
    color: #9c9080;
    font-style: italic;
}

/* Brevknappen behöver luft. Den låg tätt intill hälsorutorna, och de
   två läste ihop till ett enda block. */
.pf-action-row {
    margin: 1.1rem 0 1.4rem;
}

.pf-action-row .sheet-action { margin-top: 0; }

/* En strid vars rapport inte är ens egen: raden syns, men den går inte
   att öppna och ska då inte se ut som en knapp. */
.pf-duel.is-sealed {
    cursor: default;
    opacity: 0.78;
}

.pf-name {
    font-family: 'Cinzel', serif;
    font-size: 1.15rem;
    color: #d4af37;
}

.pf-sub { font-size: 0.8rem; color: #9c9080; }

/* Klanraden på karaktärsbladet. Den är en knapp, men ska läsas som en
   rad: vapnet, namnet och en dämpad uppmaning. */
.pf-clan {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    width: 100%;
    text-align: left;
    background: linear-gradient(180deg, #201b14 0%, #1a160f 100%);
    border: 1px solid #3d3527;
    border-radius: 8px;
    padding: 0.55rem 0.7rem;
    cursor: pointer;
    color: inherit;
    font: inherit;
}

.pf-clan:hover { border-color: #6b5a2e; }

.pf-clan-text {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}

.pf-clan-name {
    font-family: 'Cinzel', serif;
    font-size: 0.95rem;
    color: #d4af37;
}

.pf-clan-sub { font-size: 0.75rem; color: #9c9080; }

.pf-bio {
    font-size: 0.85rem;
    line-height: 1.6;
    color: #c0b8a6;
    font-style: italic;
    border-left: 2px solid #3d3527;
    padding-left: 0.7rem;
    margin: 0 0 0.8rem;
}

.pf-stats {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr));
    gap: 0.35rem;
    margin-bottom: 0.3rem;
}

.pf-stat {
    display: flex;
    flex-direction: column;
    padding: 0.45rem 0.6rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: rgba(0, 0, 0, 0.2);
}

.pf-stat-label {
    font-size: 0.66rem;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: #9c9080;
}

.pf-stat-value {
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    color: #d4af37;
    font-variant-numeric: tabular-nums;
}

.pf-stat-sub { font-size: 0.68rem; color: #7a7062; }

.pf-list { display: flex; flex-direction: column; gap: 0.15rem; }

.pf-row {
    display: flex;
    justify-content: space-between;
    gap: 0.6rem;
    padding: 0.32rem 0.5rem;
    border-bottom: 1px solid rgba(61, 53, 39, 0.6);
    font-size: 0.82rem;
}

.pf-row span:first-child { color: #9c9080; }
.pf-row span:last-child { color: #ddd5c2; text-align: right; }

/* ==========================================================================
   JUSTERINGAR: textstorlek, mötesrutans läge, kontomenyns knapp
   ========================================================================== */

/* All text 20% större. Skalet är byggt i rem, så rotens teckenstorlek
   räcker — och klassen sitter bara på spelsidan, så inloggning och
   adminpanel påverkas inte. */
html.game-root { font-size: 120%; }

/* Mötesrutan förankras i kartans nederkant i stället för att hamna
   där flex-utrymmet råkar ta slut. Då hamnar den lika lågt på mobil
   som på dator, oavsett om notisraden syns eller inte. */
.stage-overlay { display: block; padding: 0; }

.stage-top {
    position: absolute;
    top: 0.6rem;
    left: 0.6rem;
    right: 0.6rem;
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.5rem;
}







/* Kompaktare kort: åtgärderna ska synas utan att man scrollar. */







/* Mötesrutan låg förr högre upp på smal skärm, så att tummen inte
   skulle skymma den. Numera sköts det av .context-bar längre ner. */

/* "Min profil" är en knapp nu, men ska se ut som de andra raderna. */
.account-menu button {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.45rem 0.6rem;
    border: none;
    border-radius: 0.3rem;
    background: none;
    color: #d8d0bc;
    font-family: 'Crimson Text', serif;
    font-size: 0.86rem;
    cursor: pointer;
}

.account-menu button:hover { background: rgba(212,175,55,0.12); color: #d4af37; }

/* ==========================================================================
   JUSTERINGAR: dockans etiketter, större vitalvärden
   ========================================================================== */

/* Etiketterna gick utanför den smala listen. Nu får de radbrytas och
   avstavas i stället för att spilla ut över kanten. */
.dock-btn {
    min-width: 0;
    overflow: hidden;
}

.dock-label {
    display: block;
    width: 100%;
    font-size: 0.5rem;
    line-height: 1.1;
    text-align: center;
    overflow-wrap: anywhere;
    hyphens: auto;
}

/* Bred skärm: listen behöver vara bred nog för de längsta orden. */
@media (min-width: 730px) {
    :root { --dock-size: 5.1rem; }
    .dock-btn { padding: 0.5rem 0.3rem; }
    .dock-label { font-size: 0.54rem; }
}

/* HP, AP och EP: större siffror och tjockare staplar. De är det man
   tittar mest på, så de tål att ta plats.
   ---------------------------------------------------------------
   Måtten avgörs här. Blocket står sist av dem som rör HUD:ens
   staplar, och det som skrivs högre upp i filen — även i en
   mediefråga — får inget genomslag. Två omgångar ändringar där uppe
   gjorde ingen synlig skillnad av precis det skälet. */
.hud-vitals { gap: 0.45rem; }

/* Etikettens bredd bestäms här — det här är den sista regeln om den
   i filen, och därmed den som gäller. Ändringar högre upp skrevs
   tidigare över utan att synas. */
.vital-label {
    font-size: 0.78rem;
    width: 1.5rem;
    color: #b8963a;
}

.hud .bar-container { height: 1.25rem; }

.hud .bar-text {
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.01em;
}

@media (max-width: 729px) {
    /* Smalare etikett och mindre mellanrum ger staplarna bredden. */
    .hud-vitals { gap: 0.3rem; }
    .vital-label { font-size: 0.72rem; width: 1.1rem; }
    .hud .bar-container { height: 1.15rem; }
    .hud .bar-text { font-size: 0.74rem; }
}

/* ==========================================================================
   OMARBETNINGAR: docka, mötesruta, utrustning, loggtext
   ========================================================================== */

/* --- Dockans etiketter ---
   overflow-wrap: anywhere bröt mitt i orden ("Utforsknin/g"). Bättre
   att aldrig bryta och i stället låta listen vara bred nog. */
.dock-label {
    white-space: nowrap;
    overflow-wrap: normal;
    hyphens: none;
    overflow: hidden;
    text-overflow: ellipsis;
    font-size: 0.46rem;
    letter-spacing: 0;
}

@media (min-width: 730px) {
    :root { --dock-size: 6rem; }
    .dock-label { font-size: 0.5rem; }
}

/* Mellan 730 och 900: listen får plats, men inte i sin fulla bredd.
   Sex rem av en skärm på 730 är en åttondel av allt utrymme, och det
   som får ge vika är kartan. Etiketterna bryts hellre. */
@media (min-width: 730px) and (max-width: 900px) {
    :root { --dock-size: 4.4rem; }
    .dock-label { font-size: 0.46rem; }
}

/* --- Mötesrutan ---
   Samma formspråk som arket: rubrikrad, tunn avdelare, innehåll.
   Den ligger också högre upp än förut, med ordentlig luft ner till
   dockan i stället för att klistras mot kanten. */








/* Raderna blir plattare — kortet har redan en ram. */









/* --- Utrustade platser --- */
.equip-slot { align-items: center; gap: 0.4rem; }

.equip-slot span:last-child { display: flex; align-items: center; gap: 0.4rem; }

.equip-name { cursor: help; }
.equip-slot .is-equipped .equip-name { color: #d4af37; }

.equip-off {
    flex-shrink: 0;
    font-family: 'Cinzel', serif;
    font-size: 0.6rem;
    padding: 0.15rem 0.45rem;
    border-radius: 0.25rem;
    border: 1px solid #3d3527;
    background: transparent;
    color: #9c9080;
    cursor: pointer;
}

.equip-off:hover { border-color: #b04a3a; color: #e5a394; }

/* --- Logg och chatt ---
   Raderna såg ut som lös brödtext. Nu får de samma radavstånd,
   tunna avdelare och en dämpad tidsstämpel som resten av panelerna. */
/* Klassificerade stridsrader undantas: de bär sin egen färg och sin
   egen form, och ska se likadana ut här som i arenans stridsrapport.
   Utan :not() vann den här regeln på specificitet och färgläggningen
   syntes bara i rapporten. */
.sheet .log-box p:not(.cl-line) {
    margin: 0;
    padding: 0.3rem 0.1rem;
    border-bottom: 1px solid rgba(61, 53, 39, 0.45);
    font-size: 0.82rem;
    line-height: 1.55;
    color: #cfc7b5;
}

.sheet .log-box p:not(.cl-line):last-child { border-bottom: none; }

/* Chattens brödtext. Gäller numera bubblornas .letter-msg-body. */
.sheet #chat-log p { color: #d8d0bc; }

.sheet .log-box { font-family: 'Crimson Text', serif; }

/* En tom logg ska säga att den är tom, inte vara ett hål. Chattloggen
   bytte från .log-box till .letter-messages när den fick klanchattens
   form, så den måste stå med här — annars möts man av tomrum. */
.sheet .log-box:empty::before,
.sheet #chat-log:empty::before {
    content: 'Inget att visa ännu.';
    display: block;
    padding: 0.6rem 0.1rem;
    color: #7a7062;
    font-style: italic;
    font-size: 0.82rem;
}

/* Loggraderna: tidsstämpel dämpad, avsändare i guld, texten läsbar. */
.sheet .log-box .log-line {
    display: grid;
    grid-template-columns: auto auto 1fr;
    gap: 0 0.45rem;
    align-items: baseline;
}

.log-time {
    font-variant-numeric: tabular-nums;
    font-size: 0.7rem;
    color: #6f6658;
    white-space: nowrap;
}

.log-who {
    font-family: 'Cinzel', serif;
    font-size: 0.76rem;
    color: #b8963a;
    white-space: nowrap;
}

.log-who::after { content: ':'; color: #6f6658; }

.log-text { min-width: 0; overflow-wrap: anywhere; }

/* ==========================================================================
   MÖTESRUTAN
   --------------------------------------------------------------------------
   Byggd i ett stycke i stället för lager av lappar. Ett mått styr allt:
   --enc-pad. Rubrik, innehåll och åtgärder använder samma sidopadding
   och samma avdelare, så kortet får jämna avstånd hela vägen ner.

       ┌───────────────────────┐
       │ DU MÖTER              │  rubrik
       ├───────────────────────┤
       │ 👾 Varg      nivå 3   │  rad
       │    ▓▓▓▓░░░░  12/30    │  hälsa under namnet
       ├───────────────────────┤
       │ [Attackera] [Smyga]   │  åtgärder
       └───────────────────────┘
   ========================================================================== */







/* --- Rubrik --- */


/* --- Rader --- */













/* Hälsostapeln ligger under namnet, indragen i linje med det. */




/* Färgprickar i stället för kantlinjer: mindre visuellt brus. */




/* --- Åtgärder --- */








/* Föremål och NPC-knappar följer samma padding som allt annat. */





/* ==========================================================================
   BREV, BIOGRAFI OCH KLICKBARA NAMN
   ========================================================================== */

/* Notisraden är klickbar när den leder någonstans. */
.toast-line.is-visible { pointer-events: auto; }

/* ...men bara medan den syns.
   -----------------------------------------------------------------
   Raden tonas bort med opacity och ligger kvar i sidan. Osynlig men
   fullt träffbar låg den kvar som ett brett band över överkanten och
   fångade tryck som var menade för något annat. Innanför murarna
   hamnade den rakt över stadens rubrikrad, så "Lämna staden" gick
   inte att träffa — trycket gick till notisen, som öppnade den vy den
   senast kom ifrån. Därav både att man kastades till händelseloggen
   och att man inte kom ut ur staden.

   Ett osynligt element ska inte ta emot klick. */
/* En bortonad ruta ligger kvar ett ögonblick innan den plockas bort.
   Utan den här fångade den tryck som var menade för något annat — det
   var den som gjorde att "Lämna staden" inte gick att träffa. */
.toast-line:not(.is-visible) { pointer-events: none; }
.toast-line.is-clickable { cursor: pointer; }
.toast-line.is-clickable:hover { border-color: #9a7f2a; color: #e8e0cc; }

/* Avsändarnamnet i loggen är en knapp till profilen. */
button.log-who {
    padding: 0;
    border: none;
    background: none;
    font-family: 'Cinzel', serif;
    font-size: 0.76rem;
    color: #b8963a;
    cursor: pointer;
    white-space: nowrap;
}

button.log-who:hover { color: #d4af37; text-decoration: underline; }

/* Genomgående knappstil i arket. */
.sheet-action {
    display: block;
    width: 100%;
    margin-top: 0.7rem;
    padding: 0.55rem 0.9rem;
    border-radius: 0.35rem;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 0.8rem;
    cursor: pointer;
}

.sheet-action:hover { filter: brightness(1.25); }
.sheet-action.hidden { display: none; }

/* --- Biografi --- */
.pf-bio-edit { margin-bottom: 0.8rem; }

.pf-bio-input,
.letter-input {
    width: 100%;
    box-sizing: border-box;
    padding: 0.5rem 0.65rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: #12100d;
    color: #e8e0cc;
    font-family: 'Crimson Text', serif;
    font-size: 0.86rem;
    line-height: 1.55;
    resize: vertical;
}

.pf-bio-input:focus,
.letter-input:focus {
    outline: none;
    border-color: #9a7f2a;
}

.letter-input + .story-heading { margin-top: 0.7rem; }

/* --- Brevlistan --- */
.letter-row {
    display: grid;
    gap: 0.15rem;
    width: 100%;
    text-align: left;
    padding: 0.6rem 0.7rem;
    margin-bottom: 0.4rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.22);
    color: inherit;
    cursor: pointer;
}

.letter-row:hover { border-color: #9a7f2a; }
.letter-row.is-unread { border-left: 3px solid #d4af37; }

.letter-row-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
}

.letter-who {
    font-family: 'Cinzel', serif;
    font-size: 0.85rem;
    color: #d4af37;
}

.letter-badge {
    font-size: 0.68rem;
    padding: 0.05rem 0.4rem;
    border-radius: 999px;
    background: #d4af37;
    color: #1a1610;
    font-weight: 600;
}

.letter-subject { font-size: 0.8rem; color: #c8c0ae; }
.letter-preview {
    font-size: 0.78rem;
    color: #9c9080;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.letter-time { font-size: 0.68rem; color: #6f6658; }

/* --- Öppnad växling --- */
.letter-head {
    padding-bottom: 0.6rem;
    margin-bottom: 0.7rem;
    border-bottom: 1px solid #3d3527;
}

.letter-back {
    padding: 0;
    border: none;
    background: none;
    color: #9c9080;
    font-size: 0.78rem;
    cursor: pointer;
    margin-bottom: 0.3rem;
}

.letter-back:hover { color: #d4af37; }

.letter-head-title {
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    color: #d4af37;
}

.letter-head-sub { font-size: 0.75rem; color: #9c9080; }

.letter-messages {
    display: flex;
    flex-direction: column;
    gap: 0.55rem;
    max-height: 22rem;
    overflow-y: auto;
    margin-bottom: 0.7rem;
}

.letter-msg {
    padding: 0.55rem 0.7rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.22);
}

.letter-msg.is-own {
    border-color: #9a7f2a;
    background: rgba(212, 175, 55, 0.07);
}

.letter-msg-head {
    display: flex;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.25rem;
}

/* Avsändaren är en knapp till profilen, men ska se ut som ett namn.
   Utan den här återställningen ritar webbläsaren sin egen grå ruta med
   kant runt texten, och brevet ser sönderklippt ut. Samma
   återställning som .hud-name och button.log-who gör. */
.letter-msg-from {
    padding: 0;
    border: none;
    background: none;
    text-align: left;
    cursor: pointer;
    font-family: 'Cinzel', serif;
    font-size: 0.78rem;
    color: #b8963a;
}

.letter-msg-from:hover { color: #d4af37; text-decoration: underline; }
.letter-msg-from:focus-visible { outline: 1px solid #9a7f2a; }

.letter-msg-time { font-size: 0.68rem; color: #6f6658; }

.letter-msg-body {
    margin: 0;
    font-size: 0.85rem;
    line-height: 1.6;
    color: #ddd5c2;
    white-space: pre-wrap;
    overflow-wrap: anywhere;
}

.letter-reply { display: flex; flex-direction: column; gap: 0.4rem; }

/* Brevväxlingen: bara samtalet rullar.
   -----------------------------------------------------------------
   Vyn var ett vanligt block, så på en kort skärm blev det arkets egen
   rullist som fick ta hand om allt — rubriken, tillbakaknappen och
   svarsrutan rullade bort tillsammans med breven. Loggen och klanen
   löser det på samma sätt: skalet fyller höjden, och det enda som
   rullar är listan i mitten.

   :not([hidden]) är däremot nödvändigt, och det kostade en runda att
   inse. .sheet-view[hidden] { display: none } väger exakt lika mycket
   som .sheet-view[data-view="letters"] — klass plus attribut i båda —
   och den här regeln står längre ner i filen. Utan spärren vann
   display: flex, och brevvyn låg kvar synlig under den vy man just
   öppnat. Klanvyn har samma rad, av exakt samma skäl. (.hidden inuti
   vyn är en annan sak: den är !important och slår igenom ändå.) */
.sheet-view[data-view="letters"]:not([hidden]) {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}

.sheet-view[data-view="letters"] > #letter-list,
.sheet-view[data-view="letters"] > #letter-compose {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

#letter-thread {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

#letter-thread .letter-head,
#letter-thread .letter-reply { flex: 0 0 auto; }

#letter-thread .letter-messages {
    flex: 1 1 auto;
    max-height: none;
    min-height: 0;
    overflow-y: auto;
}

#letter-new-btn { flex: 0 0 auto; }

/* Skicka står bredvid rutan, inte under den.
   -----------------------------------------------------------------
   En knapp i full bredd under ett svarsfält åt två rader av höjden på
   en skärm där höjden redan var det som saknades.

   Gäller alla tre ställena man skriver på: brevväxlingen,
   världschatten och klanchatten. De två chattarna delar .chat-shell,
   så en selektor räcker för båda. */
#letter-thread .letter-reply,
.chat-shell .letter-reply {
    flex-direction: row;
    /* stretch, inte flex-end: knappen blir lika hög som svarsrutan
       i stället för en låg knapp i nederkanten. */
    align-items: stretch;
    gap: 0.5rem;
}

#letter-thread .letter-reply .letter-input,
.chat-shell .letter-reply .letter-input {
    flex: 1 1 auto;
    min-width: 0;
}

/* Knappen tar bara den bredd den behöver. Brevens knapp bär
   .letter-send; chattarnas är .sheet-action med varsitt id, och en
   knapp är det enda elementet där som inte är skrivfältet. */
#letter-thread .letter-reply .letter-send,
.chat-shell .letter-reply > button {
    flex: 0 0 auto;
    width: auto;
    margin: 0;
    /* Fet stil på alla tre. Världschattens knapp hade den sedan
       gammalt (#send-chat-btn), breven och klanchatten inte — samma
       knapp med samma uppgift såg olika ut beroende på var man stod. */
    font-weight: bold;
}

/* ==========================================================================
   MÖTESRUTAN
   --------------------------------------------------------------------------
   Ett mått styr allt: --enc-pad för sidor och --enc-gap mellan saker.
   Rubrik, rader och åtgärder använder samma sidopadding, så kortets
   vänsterkant är en rak linje hela vägen ner.

   Varje varelse får en ikonruta i stället för en lös emoji — det ger
   raderna en gemensam vänsterkolumn och gör typen läsbar på avstånd.
   Hälsan ligger under namnet så att raden inte trängs ihop.
   ========================================================================== */

.context-bar {
    --enc-pad: 0.8rem;
    --enc-gap: 0.6rem;

    position: absolute;
    left: 50%;
    bottom: 1.5rem;
    transform: translateX(-50%);
    width: min(calc(100% - 1.5rem), 24rem);

    pointer-events: auto;
    display: flex;
    flex-direction: column;
    padding: 0;
    margin: 0;
    overflow: hidden;
    border: 1px solid #9a7f2a;
    border-radius: 0.6rem;
    background: linear-gradient(180deg, #262117 0%, #1b1712 100%);
    box-shadow: 0 12px 34px rgba(0, 0, 0, 0.7);
    animation: context-in .18s ease-out;
}

.context-bar.hidden { display: none; }

@keyframes context-in {
    from { opacity: 0; transform: translate(-50%, 10px); }
    to   { opacity: 1; transform: translate(-50%, 0); }
}

/* --- Rubrik --- */
.enc-head {
    padding: var(--enc-pad) var(--enc-pad) 0.55rem;
    font-family: 'Cinzel', serif;
    font-size: 0.66rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: #9a7f2a;
}

/* --- Rader --- */
.enc-rows {
    display: flex;
    flex-direction: column;
    gap: var(--enc-gap);
    padding: 0 var(--enc-pad) var(--enc-pad);
    max-height: 10rem;
    overflow-y: auto;
}

.enc-row {
    display: grid;
    grid-template-columns: 1.75rem minmax(0, 1fr) auto;
    align-items: center;
    gap: 0.2rem 0.6rem;
    padding: 0;
    border: none;
    background: none;
}

/* Ikonruta: ger raderna en gemensam vänsterkolumn. */
.enc-icon {
    grid-row: 1;
    width: 1.75rem;
    height: 1.75rem;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.95rem;
    line-height: 1;
    border-radius: 0.35rem;
    border: 1px solid #3d3527;
    background: rgba(0, 0, 0, 0.3);
}

.enc-monster .enc-icon {
    border-color: rgba(176, 74, 58, 0.55);
    background: rgba(176, 74, 58, 0.16);
}
.enc-npc .enc-icon {
    border-color: rgba(212, 175, 55, 0.5);
    background: rgba(212, 175, 55, 0.14);
}
.enc-player .enc-icon {
    border-color: rgba(59, 126, 161, 0.55);
    background: rgba(59, 126, 161, 0.16);
}

.enc-name {
    grid-row: 1;
    font-size: 0.86rem;
    color: #e2dac6;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.enc-name a { color: #8fbde2; text-decoration: none; }
.enc-name a:hover { text-decoration: underline; }

.enc-detail {
    grid-row: 1;
    font-size: 0.72rem;
    color: #9c9080;
    white-space: nowrap;
}

/* Hälsan under namnet, i linje med det. */
.enc-hp {
    grid-column: 2 / -1;
    grid-row: 2;
    display: block;
    height: 0.25rem;
    border-radius: 999px;
    background: #12100d;
    overflow: hidden;
}

.enc-hp-fill {
    display: block;
    height: 100%;
    background: linear-gradient(90deg, #8c4136, #c05a3a);
}

/* --- Åtgärder --- */
.context-bar #action-buttons {
    display: flex;
    gap: var(--enc-gap);
    padding: var(--enc-pad);
    border-top: 1px solid #3d3527;
}

.context-bar #action-buttons:empty { display: none; }

.context-bar .action-btn,
.context-bar #action-buttons button {
    flex: 1;
    min-width: 0;
    padding: 0.5rem 0.6rem;
    border-radius: 0.35rem;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 0.75rem;
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    cursor: pointer;
}

.context-bar .action-btn:hover,
.context-bar #action-buttons button:hover { filter: brightness(1.25); }

/* Föremåls- och NPC-knappar följer samma padding. */
.context-bar .item-panel,
/* Stadsporten och gestalterna ritas som mötesrutans övriga rader.
   ---------------------------------------------------------------
   Behållaren var en *rad* med flex-wrap. Rubriken och radlistan är
   två syskon, så de hamnade bredvid varandra och .enc-rows fick sin
   bredd av sitt innehåll i stället för av kortet. En NPC-rad har
   mycket i sig och fyllde bredden ändå; stadsportens rad har mindre,
   så knappen kröp intill namnet i stället för att ställa sig vid
   högerkanten. Samma markering, olika utseende — enbart på grund av
   riktningen här.

   En kolumn ger båda full bredd, och då gör rutnätet i .enc-row sitt
   jobb: ikon, namn, detalj till vänster och knapparna längst ut till
   höger. Avstånden ägs av .enc-head och .enc-rows, precis som i
   kortet för styggelser och föremål — därför ingen egen padding och
   ingen egen gap här. */
.context-bar .npc-bar {
    display: flex;
    flex-direction: column;
    gap: 0;
    padding: 0;
    position: static;
    transform: none;
    max-width: none;
    box-shadow: none;
}

.context-bar .npc-bar > .enc-rows { width: 100%; }

.context-bar .item-panel:empty,
.context-bar .npc-bar:empty { display: none; padding: 0; }

@media (max-width: 729px) {
    .context-bar { bottom: 1rem; width: calc(100% - 1.25rem); }
    .enc-rows { max-height: 7.5rem; }
}

/* --- Biografins läs- och redigeringsläge --- */
.pf-bio-block { margin-bottom: 0.9rem; }
.pf-bio-block [hidden] { display: none; }

.pf-bio-actions { display: flex; gap: 0.5rem; margin-top: 0.5rem; }

.pf-bio-btn {
    padding: 0.35rem 0.8rem;
    border-radius: 0.35rem;
    border: 1px solid #3d3527;
    background: transparent;
    color: #9c9080;
    font-family: 'Cinzel', serif;
    font-size: 0.72rem;
    cursor: pointer;
}

.pf-bio-btn:hover { border-color: #9a7f2a; color: #d4af37; }

.pf-bio-btn.is-primary {
    border-color: #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
}

#bio-read .pf-bio-btn { margin-top: 0.4rem; }

/* ==========================================================================
   MÖTESRUTAN: neutralisera de gamla globala reglerna
   --------------------------------------------------------------------------
   #action-buttons, .action-btn och #action-extra-info är kvar från det
   gamla panelsystemet och gäller fortfarande överallt. Inuti kortet
   måste de bort helt, annars staplas knapparna lodrätt och infotexten
   får en egen mörk ruta inuti kortet — vilket är precis vad som hände.
   ========================================================================== */

.context-bar #action-buttons {
    flex-direction: row;
    align-items: stretch;
    width: auto;
    gap: var(--enc-gap);
}

/* Kortets innehåll ska inte ha någon egen ruta. */
.context-bar #action-extra-info,
.context-bar #action-extra-info.action-extra-info {
    background: none;
    border-radius: 0;
    box-shadow: none;
    padding: 0;
    margin: 0;
    width: auto;
    max-width: none;
    font-size: inherit;
    font-family: inherit;
}

.context-bar #action-buttons-container {
    display: flex;
    flex-direction: column;
    background: none;
    padding: 0;
    margin: 0;
    width: auto;
}

/* Knapparna: samma mått som resten av kortet, inte den gamla
   brun-gradienten med 2px kant. */
.context-bar .action-btn {
    margin: 0;
    border-width: 1px;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    border-color: #9a7f2a;
    color: #d4af37;
    font-size: 0.75rem;
    font-weight: 400;
    padding: 0.5rem 0.6rem;
    text-shadow: none;
    box-shadow: none;
}

.context-bar .action-btn:hover {
    background: linear-gradient(180deg, #473c28, #332b1c);
    border-color: #d4af37;
    color: #f0e2b0;
    transform: none;
    box-shadow: none;
}

/* Föremålslistan ska inte lägga på extra marginal inuti kortet. */
.context-bar #item-panel.item-panel {
    width: auto;
    margin: 0;
    font-size: 0.82rem;
}

/* Smal skärm: två knappar får plats bredvid varandra, fler bryter rad. */
@media (max-width: 420px) {
    .context-bar #action-buttons { flex-wrap: wrap; }
    .context-bar .action-btn { flex: 1 1 45%; }
}

/* ==========================================================================
   MÖTESRUTAN: rader med åtgärd, och brevformulärets etiketter
   ========================================================================== */

/* Rader med en knapp till höger (föremål och NPC:er). Samma rutnät som
   övriga rader, men sista kolumnen rymmer knapparna. */
.enc-row {
    grid-template-columns: 1.75rem minmax(0, 1fr) auto;
}

.enc-actions { display: flex; gap: 0.35rem; grid-row: 1; }

.enc-action {
    padding: 0.28rem 0.65rem;
    border-radius: 0.3rem;
    border: 1px solid #3d3527;
    background: rgba(0, 0, 0, 0.35);
    color: #c8c0ae;
    font-family: 'Cinzel', serif;
    font-size: 0.66rem;
    white-space: nowrap;
    cursor: pointer;
}

.enc-action:hover { border-color: #9a7f2a; color: #d4af37; }

.enc-item .enc-icon {
    border-color: rgba(106, 143, 60, 0.5);
    background: rgba(106, 143, 60, 0.15);
}

.enc-item .enc-name { cursor: help; }

/* Uppdragsmarkören sitter i hörnet av ikonrutan. */
.enc-icon { position: relative; }

.enc-marker {
    position: absolute;
    top: -0.35rem;
    right: -0.35rem;
    width: 0.85rem;
    height: 0.85rem;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    background: #d4af37;
    color: #1a1610;
    font-family: 'Cinzel', serif;
    font-size: 0.6rem;
    font-weight: 700;
    line-height: 1;
}

/* NPC- och föremålsraderna ligger i samma block som allt annat och ska
   inte ha egen padding ovanpå kortets. */
.context-bar #npc-list,
.context-bar #item-panel.item-panel {
    display: block;
    padding: 0;
    margin: 0;
    width: auto;
}

.context-bar #npc-list:empty,
.context-bar #item-panel:empty { display: none; }

/* Den gamla NPC-knappen används inte längre i kortet. */
.context-bar .npc-btn { display: none; }

/* --- Brevformulärets etiketter ---
   .story-heading är gjord för rubriker: inline-element med understryk-
   ning och egna marginaler. Som <label> gav det en underruten linje
   under bara ordet och ojämna hopp mellan fälten. */
.letter-label {
    display: block;
    margin: 0.7rem 0 0.25rem;
    font-family: 'Cinzel', serif;
    font-size: 0.7rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #9a7f2a;
    border: none;
    padding: 0;
}

.letter-label:first-child { margin-top: 0; }

/* Fälten får jämna avstånd i stället för att ärva rubrikmarginaler. */
#letter-compose .letter-input { margin: 0; }
#letter-compose .sheet-action { margin-top: 0.9rem; }

/* ==========================================================================
   MOBIL: dockan klipptes, och arket lade sig över kartan
   --------------------------------------------------------------------------
   Dockan hade overflow-y: hidden och ingen garanterad höjd, så
   etiketterna under ikonerna skars av. Och arket låg som overlay över
   kartans nedre del, vilket dolde spelaren mitt på skärmen.

   Nu är arket en egen rad i rutnätet: kartan krymper och flyttas upp
   i stället för att skymmas — samma beteende som på bred skärm.
   ========================================================================== */

@media (max-width: 729px) {
    /* Alla åtta knappar ska rymmas på bredden. Med min-width blev
       raden bredare än telefonen och sista knappen hamnade utanför,
       så den får krympa fritt i stället. */
    .dock {
        overflow: visible;
        min-height: 0;
        align-items: stretch;
        justify-content: space-between;
        gap: 0;
    }

    .dock-btn {
        flex: 1 1 0;
        min-width: 0;
        justify-content: flex-start;
        min-height: 0;
        padding: 0.35rem 0.1rem calc(0.35rem);
    }

    .dock-icon { font-size: 1.15rem; }

    /* Två saker gör att orden får plats på en åttondels telefonbredd:
       Cinzel byts mot brödtextens typsnitt (Cinzel har bara versaler,
       och "BESTIARIUM" i versaler är hopplöst brett), och mallens
       mjuka bindestreck får bryta orden. Bindestrecken syns bara när
       raden faktiskt behöver brytas — på dator står orden hela. */
    .dock-label {
        font-family: 'Crimson Text', serif;
        font-size: 0.56rem;
        line-height: 1.1;
        letter-spacing: 0;
        white-space: normal;
        overflow: visible;
        text-overflow: clip;
        hyphens: manual;
        -webkit-hyphens: manual;
    }

    /* Knappen måste få växa till tre rader, annars klipps sista
       stavelsen bort igen. */
    .dock-btn { overflow: visible; }

    /* Tre rader: karta, ark, docka. Arket har noll höjd när det är
       stängt, så kartan får hela ytan. */
    .shell-body {
        grid-template-columns: minmax(0, 1fr);
        grid-template-rows: minmax(0, 1fr) 0 auto;
        transition: grid-template-rows .26s ease;
    }

    /* Öppet ark täcker hela ytan — men kartan ligger kvar under.
       -------------------------------------------------------------
       Första försöket krympte kartans rad till noll. Då fick duken
       noll höjd, och när arket stängdes ritades den aldrig om: kvar
       blev en grön yta utan hexagoner, och själva krympningen kostade
       en märkbar hackighet varje gång arket öppnades.

       Nu behåller kartan sin plats i rutnätet och arket läggs *över*
       den. Duken mäts aldrig om, så det finns ingenting att förlora
       och ingenting att räkna om. */
    .shell-body.sheet-open {
        grid-template-columns: minmax(0, 1fr);
        grid-template-rows: minmax(0, 1fr) 0 auto;
    }

    /* Arket läggs ovanpå kartan i stället för att tränga undan den.
       Rutnätsplacering räckte inte: arket hamnade visserligen i
       kartans rad, men delade utrymme med den i stället för att
       skymma den. Absolut placering inuti .shell-body är entydig —
       arket täcker allt utom dockan, som ligger i eget lager över. */
    .shell-body { position: relative; }

    .shell-body.sheet-open .sheet {
        /* grid-row måste stå med, och det är hela poängen.
           En absolut placerad ruta i ett rutnät får sin utgångspunkt
           av sin *rutnätsyta*, inte av behållarens kant. Arket stod
           kvar på rad 2 — den rad som numera är noll hög — så inset: 0
           gav en ruta utan höjd, och kartan låg kvar synlig. Genom att
           spänna över kartans rader blir utgångspunkten hela ytan.

           Men bara till dockans kant, inte förbi den. Spände arket
           över *alla* rader låg dess nedersta bit under dockan, som
           ligger i eget lager ovanpå. Rullningen tog slut där, så det
           som stod sist i en vy gick inte att nå — "Lämna klanen"
           längst ner i klanens översikt fanns helt enkelt inte på en
           telefon. Rad 3 är dockans; arket slutar där den börjar. */
        grid-row: 1 / 3;
        grid-column: 1 / -1;
        position: absolute;
        inset: 0;
        height: auto;
        max-height: none;
        min-height: 0;
        /* Lagren på telefon: stad (40) < notisrad (45) < ark (46)
           < docka (47).
           -----------------------------------------------------------
           Två saker låg fel. Ett ark på 30 hamnade under staden, och
           ryggsäcken gick inte att öppna innanför murarna.

           Värre var notisraden. Den är fixerad mot fönstret på 45 och
           är nästan lika bred som skärmen, och arket börjar numera
           högst upp — så pillret låg rakt över arkets kryss. Trycket
           gick till notisen, som öppnade den vy den kom ifrån:
           händelseloggen. Därav både "krysset landar på händelser"
           och "tre tryck för att stänga chatten".

           Arket lägger sig därför över notisraden. Ligger ett ark
           framme tittar man inte på kartan ändå. */
        z-index: 46;
        border-radius: 0;
        border-top: none;
    }

    /* Dockan är vägen tillbaka och får aldrig hamna under arket. */
    .dock {
        position: relative;
        z-index: 47;
    }

    .stage { grid-row: 1; }
    .dock  { grid-row: 3; }

    /* Arket ligger i flödet i stället för att sväva över kartan. */
    .sheet {
        grid-row: 2;
        position: relative;
        left: auto;
        right: auto;
        bottom: auto;
        height: auto;
        min-height: 0;
        transform: none;
        border-left: none;
        border-top: 1px solid #9a7f2a;
        border-radius: 0.9rem 0.9rem 0 0;
        box-shadow: 0 -8px 24px rgba(0, 0, 0, 0.5);
        z-index: 20;
    }

    .sheet.hidden { display: none; transform: none; }

    .sheet-body { padding-bottom: 0.85rem; }
}

/* Liggande telefon: ännu mindre höjd att dela på, så arket tar allt
   här också. Regeln stod kvar med en delad höjd och tog över den
   ovanför — ett öppet ark blev 62% igen så fort skärmen var låg. */
@media (max-height: 560px) and (max-width: 729px) {
    .shell-body.sheet-open {
        grid-template-columns: minmax(0, 1fr);
        grid-template-rows: minmax(0, 1fr) 0 auto;
    }
    .dock-label { display: none; }
    .dock-btn { min-height: 2.4rem; }
    .dock { min-height: 2.8rem; }
}

/* ==========================================================================
   BÄRVIKT, FÖREMÅLSKATEGORI, NIVÅPOÄNG OCH KARAKTÄRSSKAPANDE
   ========================================================================== */

/* --- Bärvikt --- */
.carry-weight {
    margin-bottom: 0.9rem;
    padding: 0.6rem 0.7rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.22);
}

.carry-weight.is-full { border-color: #b04a3a; }

.carry-top {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin-bottom: 0.35rem;
}

.carry-label {
    font-family: 'Cinzel', serif;
    font-size: 0.7rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #9a7f2a;
}

.carry-value {
    font-size: 0.85rem;
    color: #ddd5c2;
    font-variant-numeric: tabular-nums;
}

.carry-bar {
    /* Relativ: de två fyllnaderna ligger ovanpå varandra från vänster
       kant, inte efter varandra. */
    position: relative;
    display: block;
    height: 0.4rem;
    border-radius: 999px;
    background: #12100d;
    border: 1px solid #3d3527;
    overflow: hidden;
}

.carry-fill {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    background: linear-gradient(90deg, #6a8f3c, #9a7f2a);
}

/* Den utrustade delen: samma stapel, mörkare, längst till vänster.
   Den går inte att lätta utan att ta av sig något. */
.carry-worn {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    background: #4a5d2c;
}

.carry-weight.is-full .carry-fill {
    background: linear-gradient(90deg, #8c4136, #c05a3a);
}

.carry-weight.is-full .carry-worn {
    background: #6d3229;
}

.carry-note {
    margin: 0.35rem 0 0;
    font-size: 0.72rem;
    color: #8d8271;
    line-height: 1.4;
}

.carry-warn {
    margin: 0.4rem 0 0;
    font-size: 0.76rem;
    color: #e5a394;
    line-height: 1.4;
}

/* --- Föremålsrader: namn och kategori åtskilda --- */
.inventory-item-label {
    display: flex;
    flex-direction: column;
    gap: 0.05rem;
    min-width: 0;
    cursor: help;
}

.inventory-item-name { color: #ddd5c2; }

.inventory-item-cat {
    font-size: 0.68rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: #8a8072;
}

/* --- Attributrader (används av både nivårutan och skapandet) --- */
.stat-row {
    display: grid;
    grid-template-columns: 1fr auto;
    gap: 0.1rem 0.7rem;
    align-items: center;
    padding: 0.55rem 0;
    border-bottom: 1px solid rgba(61, 53, 39, 0.6);
}

.stat-row:last-of-type { border-bottom: none; }

.stat-name {
    grid-row: 1;
    font-family: 'Cinzel', serif;
    font-size: 0.88rem;
    color: #ddd5c2;
}

.stat-hint {
    grid-column: 1;
    grid-row: 2;
    font-size: 0.72rem;
    color: #8a8072;
}

.stat-stepper {
    grid-column: 2;
    grid-row: 1 / span 2;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-variant-numeric: tabular-nums;
    color: #d4af37;
    font-size: 0.95rem;
}

.stat-btn {
    width: 1.9rem;
    height: 1.9rem;
    border-radius: 0.35rem;
    border: 1px solid #3d3527;
    background: rgba(0, 0, 0, 0.3);
    color: #d4af37;
    font-size: 1rem;
    line-height: 1;
    cursor: pointer;
}

.stat-btn:hover:not(:disabled) { border-color: #9a7f2a; }
.stat-btn:disabled { opacity: 0.35; cursor: not-allowed; }

/* --- Nivåhöjningsrutan --- */
.levelup-overlay {
    position: fixed;
    inset: 0;
    z-index: 5500;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.2rem;
    background: rgba(0, 0, 0, 0.72);
}

.levelup-overlay.hidden { display: none; }

.levelup-box {
    width: 100%;
    max-width: 26rem;
    padding: 1.2rem 1.3rem;
    border: 1px solid #9a7f2a;
    border-radius: 0.6rem;
    background: linear-gradient(180deg, #262117 0%, #1b1712 100%);
    box-shadow: 0 14px 40px rgba(0, 0, 0, 0.75);
}

.levelup-title {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 1.15rem;
    color: #d4af37;
}

.levelup-sub {
    margin: 0.15rem 0 0.8rem;
    font-size: 0.82rem;
    color: #9c9080;
}

#levelup-remaining { color: #d4af37; font-variant-numeric: tabular-nums; }

.levelup-actions {
    display: flex;
    gap: 0.6rem;
    align-items: center;
    margin-top: 1rem;
}

.levelup-actions .sheet-action { margin: 0; flex: 1; }

/* --- Karaktärsskapandet --- */

/* Sidhuvudet på skapelsesidan.
   -----------------------------------------------------------------
   Den som ligger död hamnar här, och utan sidhuvudet fanns varken
   utloggning eller spelledarpanel förrän man skapat en ny karaktär.
   Menyn är samma som i spelet och ärver .account-menu; raden behöver
   därför bara vara en positionerad förälder. */
.creation-topbar {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.9rem;
    padding: calc(0.55rem + var(--safe-t)) calc(0.9rem + var(--safe-r))
             0.55rem calc(0.9rem + var(--safe-l));
    background: linear-gradient(180deg, #221e17 0%, #1a1610 100%);
    border-bottom: 1px solid #3d3527;
}

.creation-brand {
    font-family: 'Cinzel', serif;
    font-size: 1rem;
    letter-spacing: 0.12em;
    color: #d4af37;
}

.creation {
    display: flex;
    align-items: center;
    justify-content: center;
    /* Sidhuvudet tar sin plats ovanför; 100dvh hade gett en sida som
       alltid går att rulla ett stycke i onödan. */
    min-height: calc(100dvh - 3.2rem);
    padding: 1.2rem;
}

/* Dödsbeskedet står där rubriken annars står. */
.creation-fallen {
    padding-bottom: 1rem;
    margin-bottom: 1rem;
    border-bottom: 1px solid #7a2f2a;
}

.creation-fallen .creation-title {
    color: #c14e4e;
    font-size: 1.5rem;
    text-align: center;
}

.creation-fallen .creation-sub { margin-top: 0.6rem; }

.creation.hidden { display: none; }

.creation-card {
    width: 100%;
    max-width: 30rem;
    padding: 1.5rem 1.6rem;
    border: 1px solid #9a7f2a;
    border-radius: 0.7rem;
    background: linear-gradient(180deg, #262117 0%, #1a1712 100%);
    box-shadow: 0 16px 44px rgba(0, 0, 0, 0.7);
}

.creation-head {
    text-align: center;
    padding-bottom: 1rem;
    margin-bottom: 1rem;
    border-bottom: 1px solid #3d3527;
}

.creation-title {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 2rem;
    letter-spacing: 0.1em;
    color: #d4af37;
}

.creation-sub {
    margin: 0.3rem 0 0;
    font-size: 0.88rem;
    color: #9c9080;
    font-style: italic;
}

.creation-label {
    display: block;
    margin: 0.9rem 0 0.3rem;
    font-family: 'Cinzel', serif;
    font-size: 0.7rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: #9a7f2a;
}

.creation-input {
    width: 100%;
    box-sizing: border-box;
    padding: 0.55rem 0.7rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: #12100d;
    color: #e8e0cc;
    font-family: 'Crimson Text', serif;
    font-size: 0.92rem;
}

.creation-input:focus { outline: none; border-color: #9a7f2a; }

.creation-blurb {
    margin: 0.45rem 0 0;
    padding: 0.55rem 0.7rem;
    border-left: 2px solid #3d3527;
    font-size: 0.82rem;
    line-height: 1.55;
    color: #b0a898;
    font-style: italic;
    min-height: 2.6rem;
}

.creation-points {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    margin: 1.2rem 0 0.2rem;
    padding-top: 0.9rem;
    border-top: 1px solid #3d3527;
}

.creation-points .creation-label { margin: 0; }

.creation-remaining {
    font-family: 'Cinzel', serif;
    font-size: 0.85rem;
    color: #d4af37;
    font-variant-numeric: tabular-nums;
}

.creation-submit {
    width: 100%;
    margin-top: 1.3rem;
    padding: 0.7rem 1rem;
    border-radius: 0.4rem;
    border: 1px solid #9a7f2a;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 0.95rem;
    letter-spacing: 0.04em;
    cursor: pointer;
}

.creation-submit:hover { filter: brightness(1.25); }

/* ==========================================================================
   SIDAN /create_character
   --------------------------------------------------------------------------
   Egen mall, inte spelskalet — men samma visuella språk. Klasserna
   .creation* delas med skapandesektionen i index.html.
   ========================================================================== */

body.creation-body {
    display: block;
    margin: 0;
    padding: 0;
    min-height: 100dvh;
}

/* Rullgardinen ska inte se ut som webbläsarens standardkontroll. */
select.creation-input {
    appearance: none;
    -webkit-appearance: none;
    padding-right: 2rem;
    background-image:
        linear-gradient(45deg, transparent 50%, #9a7f2a 50%),
        linear-gradient(135deg, #9a7f2a 50%, transparent 50%);
    background-position:
        calc(100% - 1.1rem) calc(50% + 0.1rem),
        calc(100% - 0.75rem) calc(50% + 0.1rem);
    background-size: 0.35rem 0.35rem, 0.35rem 0.35rem;
    background-repeat: no-repeat;
    cursor: pointer;
}

select.creation-input option {
    background: #1a1712;
    color: #e8e0cc;
}

/* Meddelanden från servern (t.ex. "Din karaktär är död"). */
.creation-flash {
    margin-bottom: 1rem;
    padding: 0.6rem 0.75rem;
    border: 1px solid #7a4a3a;
    border-left-width: 3px;
    border-radius: 0.35rem;
    background: rgba(120, 60, 45, 0.16);
}

.creation-flash p {
    margin: 0;
    font-size: 0.85rem;
    line-height: 1.5;
    color: #e5a394;
}

.creation-flash p + p { margin-top: 0.35rem; }

/* Valideringsfel precis ovanför knappen, där blicken redan är. */
.creation-error {
    margin: 1rem 0 0;
    font-size: 0.85rem;
    color: #e5a394;
    text-align: center;
}

.creation-error.hidden { display: none; }

/* ==========================================================================
   STADEN
   --------------------------------------------------------------------------
   Staden ersätter kartan i stället för att samsas om ytan. Innanför
   murarna finns inget att rita på spelbrädet — spelaren är borta
   därifrån — så halva skärmen karta hade bara varit spilld plats.
   ========================================================================== */

.village {
    position: absolute;
    inset: 0;
    z-index: 40;
    display: flex;
    flex-direction: column;
    min-height: 0;
    /* Skenet i överkanten mäts mot skärmens *bredd*, inte mot ytans
       form, och sköts av --village-glow.

       Utan storleksangivelse mäts cirkeln mot ytans hörn. Då växer
       skenet med höjden, och på en hög och smal skärm tonade det ut
       mitt i topplistan — en rad såg halvbelyst ut medan nästa var
       mörk.

       Radien är ett fast mått i mobilskalet och följer bredden först
       på skrivbordet. En enda formel för alla bredder gick inte: den
       som såg rätt ut på 1200 px sköt ned skenet i topplistan igen
       runt 600–900 px, där staden fortfarande är smal men bredden
       hunnit växa. Brytpunkten är densamma som skalets egen, så
       skenet byter takt när layouten gör det.

       Stoppen mitt i gör övergången mjuk; med ett enda hopp till
       transparent syns en kant där skenet tar slut. */
    --village-glow: 15rem;
    background:
        radial-gradient(circle var(--village-glow) at 30% 0%,
                        rgba(154, 127, 42, 0.16) 0%,
                        rgba(154, 127, 42, 0.07) 45%,
                        rgba(154, 127, 42, 0.02) 75%,
                        transparent 100%),
        linear-gradient(180deg, #1d1913 0%, #14120f 100%);
}

/* På skrivbordet får skenet följa bredden igen. 55vw träffar det
   gamla hörnmåttet: 638 px blev 660 på 1200x800, 743 blev 792 på
   1440x900 och 921 blev 883 på 1920x1000. Taket hindrar att det
   skenar iväg på en 4K-skärm. */
@media (min-width: 730px) {
    .village { --village-glow: clamp(28rem, 55vw, 46rem); }
}

.village.hidden { display: none; }

.village-head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.8rem;
    padding: 0.9rem 1rem 0.7rem;
    border-bottom: 1px solid #3d3527;
    flex-shrink: 0;
}

.village-name {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 1.35rem;
    letter-spacing: 0.06em;
    color: #d4af37;
}

.village-blurb {
    margin: 0.2rem 0 0;
    font-size: 0.85rem;
    line-height: 1.5;
    color: #9c9080;
    font-style: italic;
    max-width: 46ch;
}

.village-leave {
    flex-shrink: 0;
    padding: 0.45rem 0.9rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.3);
    color: #ddd5c2;
    font-family: 'Cinzel', serif;
    font-size: 0.75rem;
    cursor: pointer;
}

.village-leave:hover { border-color: #9a7f2a; color: #d4af37; }

/* Flikrader som inte får plats.

   Raden bröts inte utan scrollade i sidled. En flik som ligger utanför
   kanten går inte att se att den finns, och en scroll utan synlig kant
   ser ut som slutet på listan. Raden bryts därför i stället — det
   gäller både stadens fem flikar och klanens sex. */
.village-tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 0.2rem;
    row-gap: 0.15rem;
    padding: 0.5rem 0.7rem 0.15rem;
    border-bottom: 1px solid #3d3527;
    flex-shrink: 0;
}

/* Flikraden som står först i en vy.
   -----------------------------------------------------------------
   Arkets kropp har 0.85rem toppadding, flikraden 0.5rem till och
   flikarna 0.45rem därutöver. Tre marginaler som lades ihop blev ett
   tomt band mellan rubriken och flikarna. Den rad som står överst
   lånar kroppens padding i stället för att lägga på en egen. */
.sheet-view > .village-tabs:first-child,
.clan-shell > .village-tabs:first-child {
    padding-top: 0;
}

.village-tab {
    /* Flikarna delar på bredden så att en bruten rad ser avsiktlig ut
       i stället för som ett radfall. */
    flex: 1 1 auto;
    min-width: 5.5rem;
    text-align: center;
    padding: 0.45rem 0.75rem;
    border: 1px solid transparent;
    border-bottom: none;
    border-radius: 0.4rem 0.4rem 0 0;
    background: transparent;
    color: #9c9080;
    font-family: 'Cinzel', serif;
    font-size: 0.72rem;
    letter-spacing: 0.03em;
    cursor: pointer;
    white-space: nowrap;
}

.village-tab:hover { color: #ddd5c2; }

.village-tab.is-active {
    border-color: #3d3527;
    background: rgba(212, 175, 55, 0.09);
    color: #d4af37;
}

.village-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0.9rem 1rem 1.4rem;
}

.village-pane.hidden { display: none; }

.village-heading {
    margin: 1.1rem 0 0.45rem;
    font-family: 'Cinzel', serif;
    font-size: 0.75rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: #9a7f2a;
}

.village-pane > .village-heading:first-child { margin-top: 0; }

.village-note {
    margin: 0 0 0.6rem;
    font-size: 0.8rem;
    line-height: 1.5;
    color: #8a8072;
    font-style: italic;
}

/* En anmärkning som förklarar varför något är släckt. */
.village-note.is-warning {
    margin-top: 0.5rem;
    color: #e5a394;
}

/* --- Arenans lag --- */
.duel-row { align-items: flex-start; }

.duel-sides {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin-top: 0.5rem;
}

.duel-side {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex: 1 1 14rem;
    min-width: 0;
    padding: 0.35rem 0.5rem;
    border-left: 2px solid #3d3527;
    background: rgba(0, 0, 0, 0.18);
}

.duel-side-name {
    font-family: 'Cinzel', serif;
    font-size: 0.75rem;
    color: #9a7f2a;
    white-space: nowrap;
}

.duel-side-slots {
    font-size: 0.75rem;
    color: #8a8072;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Namnen får ta det utrymme som blir över och brytas av vid behov. */
.duel-side-members {
    flex: 1;
    min-width: 0;
    font-size: 0.78rem;
    color: #ddd5c2;
    overflow-wrap: anywhere;
}

/* Skälet till att man inte kan anmäla sig. Det ska stå utskrivet, inte
   bara anas av att knappen är grå. */
.duel-reason {
    display: block;
    margin-top: 0.45rem;
    font-size: 0.78rem;
    color: #e5a394;
}

.duel-waiting {
    display: block;
    margin-top: 0.35rem;
    font-size: 0.78rem;
    color: #9c9080;
    font-style: italic;
}

/* En avgjord kamp är en knapp till sin stridsrapport. */
.duel-past { cursor: pointer; }
.duel-past:hover { background: rgba(212, 175, 55, 0.07); }
.duel-past:focus-visible { outline: 1px solid #9a7f2a; }

/* --- Stridsrapporten --- */
.duel-report-outcome {
    margin: 0 0 0.2rem;
    font-family: 'Cinzel', serif;
    font-size: 0.95rem;
    color: #d4af37;
}

.duel-report-when {
    margin: 0 0 0.8rem;
    font-size: 0.75rem;
    color: #8a8072;
}

/* Loggen får växa och fylla rutan.

   .log-box har en fast höjd på 150 px sedan de flytande fönstrens tid.
   Ett max-height biter inte på den — height vinner — så rapporten blev
   en liten ruta med två rader synliga oavsett hur lång striden var.
   Här sätts höjden till auto, och rullningen sköts av rapportens
   kropp så att det bara finns en rullningslist. */
.duel-report-log {
    height: auto;
    min-height: 12rem;
    max-height: none;
    overflow: visible;
    margin-bottom: 0;
    padding: 0.6rem 0.8rem;
    background: rgba(0, 0, 0, 0.22);
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
}

/* --- Stridsloggens färger ---
   En strid är en lång rad likadana meningar. Färgen finns för att man
   ska kunna ögna ner och se var slagen gick in, inte för att pryda. */

/* Raden beskriver sig själv helt och hållet, så att den ser likadan ut
   i händelseloggen och i arenans stridsrapport. Tidsstämpeln får en
   egen kolumn; då hamnar texten i linje hela vägen ner. */
.cl-line {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 0 0.45rem;
    align-items: baseline;
    margin: 0;
    padding: 0.16rem 0.1rem;
    font-size: 0.82rem;
    line-height: 1.5;
    overflow-wrap: anywhere;
}

/* Utan tidsstämpel finns bara texten, och den ska ha hela bredden. */
.cl-line > .log-text { grid-column: span 2; }
.cl-line > .log-time + .log-text { grid-column: auto; }

/* Tomraden mellan rundorna. combat.py skickar den som ett mellanslag;
   utan höjd faller den ihop och rundorna klibbar samman. */
.cl-blank { display: block; height: 0.5rem; margin: 0; padding: 0; }

/* Vilka som möts. Står överst och ramar in resten. */
.cl-roster {
    color: #b9ad95;
    font-size: 0.82rem;
}

/* Rundrubriken är det man hoppar mellan när man skummar. */
.cl-round {
    margin: 0.55rem 0 0.2rem;
    font-family: 'Cinzel', serif;
    font-size: 0.82rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #9a7f2a;
    border-top: 1px solid #2b251c;
    padding-top: 0.35rem;
}

/* Träff, parering och miss: tre tydligt skilda utfall. */
.cl-hit    { color: #d8d0bc; }
.cl-parry  { color: #7fa0b8; }
.cl-miss   { color: #6f665a; }

/* Skadesiffran är det man letar efter i en träffrad. */
.cl-damage {
    color: #e07a5f;
    font-weight: 600;
}

.cl-fatigue {
    color: #9c9080;
    font-style: italic;
}

.cl-victory { color: #d4af37; }
.cl-defeat  { color: #c05a3a; }

/* Rader som inte hör till en strid — förflyttningar, uppdrag, notiser
   — behåller loggens vanliga färg. */
.cl-plain { color: #b9ad95; }

/* --- Egna strider på karaktärsbladet --- */
.pf-duel {
    display: flex;
    align-items: baseline;
    gap: 0.6rem;
    padding: 0.4rem 0.2rem;
    border-bottom: 1px solid #2b251c;
    cursor: pointer;
}

.pf-duel:last-child { border-bottom: none; }
.pf-duel:hover { background: rgba(212, 175, 55, 0.07); }
.pf-duel:focus-visible { outline: 1px solid #9a7f2a; }

.pf-duel-main {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    flex: 1;
    min-width: 0;
}

.pf-duel-name {
    font-size: 0.85rem;
    color: #ddd5c2;
    overflow-wrap: anywhere;
}

/* Var striden stod. Arenans kamper och vildmarkens ligger i samma
   lista, och utan märkningen går de inte att skilja åt. */
.pf-duel-where {
    margin-left: 0.4rem;
    padding: 0.05rem 0.35rem;
    border: 1px solid #3d3527;
    border-radius: 0.6rem;
    font-size: 0.68rem;
    color: #9c9080;
    white-space: nowrap;
}

/* Klanens visitkort: vapnet bredvid namnet. */
.clan-headline {
    display: flex;
    align-items: center;
    gap: 0.9rem;
    margin-bottom: 0.6rem;
}

.clan-headline-text { min-width: 0; }
.clan-headline-text .story-heading { margin-bottom: 0.15rem; }

.clan-back-row { margin-bottom: 0.6rem; }

/* Namnet i klanlistorna är en knapp, men ska läsas som en rubrik. */
.clan-open-btn {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    vertical-align: middle;
    border: none;
    background: none;
    padding: 0;
    text-align: left;
    color: inherit;
    font: inherit;
    cursor: pointer;
}

/* Vapnet står *bredvid* namnet, inte ovanför det. Utan den här raden
   blev knappen ett block i en radlayout: skölden hamnade på egen rad
   ovanför, och namnet knuffades ur led. */
.clan-open-btn .crest {
    display: inline-block;
    vertical-align: middle;
}

.clan-open-btn:hover .village-row-name { color: #f0d98a; }

/* Klaner med hemvist i en annan stad: med i listan, men dämpade. */
.clan-row-away { opacity: 0.72; }


.pf-duel-sub { font-size: 0.76rem; color: #8a8072; }

/* Egna segrar får guldfärgad text — man ska kunna ögna listan. */
.pf-duel.is-win .pf-duel-sub { color: #d4af37; }

.pf-duel-when {
    flex-shrink: 0;
    font-size: 0.72rem;
    color: #6f665a;
    font-variant-numeric: tabular-nums;
}

.village-empty {
    margin: 0 0 0.6rem;
    padding: 0.7rem 0.8rem;
    border: 1px dashed #3d3527;
    border-radius: 0.4rem;
    font-size: 0.82rem;
    color: #8a8072;
}

.village-rows {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    margin-bottom: 0.6rem;
}

.village-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.7rem;
    padding: 0.55rem 0.7rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.22);
}

.village-row-main {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}

.village-row-name {
    font-family: 'Cinzel', serif;
    font-size: 0.9rem;
    color: #ddd5c2;
}

.village-row-sub {
    font-size: 0.75rem;
    color: #8a8072;
}

.village-title {
    margin-left: 0.35rem;
    font-size: 0.7rem;
    color: #9a7f2a;
    font-style: italic;
}

.village-epitaph {
    margin-top: 0.25rem;
    font-size: 0.76rem;
    line-height: 1.45;
    color: #9c9080;
    font-style: italic;
}

.village-row-side {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-shrink: 0;
}

.village-price {
    font-variant-numeric: tabular-nums;
    font-size: 0.85rem;
    color: #d4af37;
}

.village-stock {
    font-size: 0.72rem;
    color: #8a8072;
    white-space: nowrap;
}

.village-btn {
    padding: 0.35rem 0.7rem;
    border: 1px solid #9a7f2a;
    border-radius: 0.35rem;
    background: linear-gradient(180deg, #3a3122, #2a2418);
    color: #d4af37;
    font-family: 'Cinzel', serif;
    font-size: 0.72rem;
    cursor: pointer;
    white-space: nowrap;
}

.village-btn:hover { filter: brightness(1.25); }

.village-btn-quiet {
    border-color: #3d3527;
    background: rgba(0, 0, 0, 0.3);
    color: #9c9080;
}

/* En mindre variant, för knappar inne i en rad. */
.village-btn-sm {
    padding: 0.25rem 0.5rem;
    font-size: 0.68rem;
}

/* En släckt knapp ska se släckt ut, inte bara vara det. */
.village-btn:disabled,
.village-btn:disabled:hover {
    border-color: #3d3527;
    background: rgba(0, 0, 0, 0.25);
    color: #6f665a;
    cursor: not-allowed;
    filter: none;
}

.village-form {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.45rem;
    margin: 0.6rem 0 0.4rem;
    padding: 0.6rem 0.7rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.18);
}

.village-select,
.village-input {
    padding: 0.4rem 0.55rem;
    border: 1px solid #3d3527;
    border-radius: 0.35rem;
    background: #12100d;
    color: #e8e0cc;
    font-family: 'Crimson Text', serif;
    font-size: 0.85rem;
}

/* Rutan och listan ska stå på samma linje. En native <select> räknar
   sin höjd på sitt eget vis — den lägger till plats för pilen och har
   egna inbyggda marginaler — så utan en gemensam höjd hamnar den några
   bildpunkter fel mot det <input> som står bredvid. */
.village-select,
.village-input {
    box-sizing: border-box;
    height: 2.1rem;
    line-height: 1.3;
}

/* margin: 0 är inte överflödigt. Den globala regeln för <select> är
   kvar sedan karaktärsskapandet och ger varje rullgardin 15px under
   sig — vilket sköt listan ur linje med beloppsrutan bredvid. */
.village-select { flex: 1 1 10rem; min-width: 0; margin: 0; }
.village-input { width: 6rem; }

.village-select:focus,
.village-input:focus { outline: none; border-color: #9a7f2a; }

/* Kartans egna kontroller ska inte ligga kvar ovanpå staden. */
body.in-village .stage-overlay { display: none; }

@media (max-width: 729px) {
    .village-head { padding: 0.7rem 0.75rem 0.55rem; }
    .village-name { font-size: 1.1rem; }
    /* Ingressen får hela bredden.
       -------------------------------------------------------------
       .village-head är en rad: namn och ingress till vänster, "Lämna
       staden" till höger. På en telefon åt knappen en tredjedel av
       bredden, så beskrivningen pressades ihop till en smal spalt som
       blev åtta rader hög. Namn och knapp får dela översta raden;
       ingressen lägger sig under dem och tar allt. */
    .village-head {
        flex-wrap: wrap;
        gap: 0.4rem 0.8rem;
    }

    .village-head > div {
        display: contents;
    }

    .village-name { flex: 1 1 auto; min-width: 0; }
    .village-leave { flex: 0 0 auto; }

    /* order: 1 flyttar ingressen sist i raden trots att den står i
       mitten i markupen. Namnet och knappen delar då översta raden —
       space-between skjuter knappen till höger — och beskrivningen
       lägger sig under dem med hela bredden. Utan order hamnade
       knappen på en tredje rad, under texten. */
    /* Ingressen är hopfälld tills man trycker på den.
       -------------------------------------------------------------
       Fyra rader kursiv text överst i staden åt en femtedel av en
       telefonskärm, varje gång man gick innanför murarna. Den är
       läsvärd en gång; sedan är det torget man kommit för.

       -webkit-line-clamp klipper vid två rader och lämnar tre
       punkter. Egenskapen kräver -webkit-box, som är ett gammalt
       flexläge — den är standardiserad i alla webbläsare som räknas
       trots prefixet. */
    .village-blurb {
        order: 1;
        font-size: 0.78rem;
        max-width: none;
        flex: 1 1 100%;
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
        overflow: hidden;
        cursor: pointer;
    }

    /* Utfälld: hela texten, och ett litet besked om att den går att
       fälla ihop igen. */
    .village-blurb.is-open {
        -webkit-line-clamp: unset;
        display: block;
    }

    .village-blurb::after {
        content: ' ▾';
        color: #9a7f2a;
        font-style: normal;
    }

    .village-blurb.is-open::after { content: ' ▴'; }
    .village-body { padding: 0.7rem 0.75rem 1.2rem; }

    /* Raden bryts först när den behöver det.
       -------------------------------------------------------------
       Först lades allt i en kolumn, eftersom namn, undertext och
       knapp inte alltid ryms på en rad på en telefon. Men de flesta
       rader är korta — ett föremålsnamn och ett kilotal — och de blev
       dubbelt så höga i onödan, med knappen ensam på en egen rad
       under texten.

       Med brytning i stället får texten den plats den behöver och
       knappen står kvar till höger. Räcker bredden inte till faller
       knappen ner på en egen rad av sig själv. */
    .village-row {
        flex-wrap: wrap;
        align-items: center;
        gap: 0.45rem;
    }

    /* Texten tar resten av bredden, men får krympa till 9rem innan
       knappen skickas ner. */
    .village-row-main { flex: 1 1 9rem; }

    /* Knappstapeln under texten hugger högerkanten.
       -------------------------------------------------------------
       Raden ligger i en kolumn på telefon, så knapparna får en egen
       rad under namnet — och den raden är hela bredden. Med
       space-between hamnade en ensam knapp ("Ta", "Återkalla") i
       vänsterkanten, långt från allt annat, och två knappar sköts ut
       i var sitt hörn med ett tomt fält emellan. Ingetdera såg ut som
       en handling som hörde till raden ovanför.

       Högerkanten är där knappen står på en bred skärm, och där ögat
       letar efter den. Knapparna behåller sin egen bredd — en
       utsträckt "Ta" över hela skärmen blir en kolumn av breda band
       i ett förråd med tio föremål. */
    .village-row-side {
        justify-content: flex-end;
        flex-wrap: wrap;
        /* Knapparna hålls till höger även när de fått en egen rad. */
        margin-left: auto;
    }
}

/* --- Klickbara namn i topplistan och på kyrkogården --- */
.village-namelink {
    padding: 0;
    border: none;
    background: none;
    font-family: inherit;
    font-size: inherit;
    color: #d4af37;
    text-decoration: underline;
    text-decoration-color: rgba(212, 175, 55, 0.35);
    text-underline-offset: 0.15em;
    cursor: pointer;
}

.village-namelink:hover {
    color: #e8c95a;
    text-decoration-color: currentColor;
}

/* Raden som beskriver ett föremål är hoverbar för statsrutan. */
.village-hoverable { cursor: help; }

/* Utrustningen på karaktärsbladet: samma statsruta som ryggsäcken,
   och samma tecken på att det finns något att se. */
.pf-hoverable { cursor: help; }
.pf-hoverable:hover { color: #e8e0cc; }

/* --- Den fallnas blad i profilvyn --- */
.pf-fallen { border-bottom-color: #4a4133; }

.pf-epitaph {
    margin-top: 0.25rem;
    font-size: 0.78rem;
    letter-spacing: 0.04em;
    color: #8a8072;
    font-style: italic;
}

/* --- Kartan laddar --- */
.map-loading {
    position: absolute;
    inset: 0;
    z-index: 5;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.6rem;
    background: linear-gradient(180deg, #1a1712 0%, #14120f 100%);
    color: #9a7f2a;
    pointer-events: none;
}

.map-loading.hidden { display: none; }

.map-loading p {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 0.9rem;
    letter-spacing: 0.1em;
    color: #9c9080;
}

.map-loading-mark {
    font-size: 1.6rem;
    color: #d4af37;
    animation: map-loading-pulse 1.6s ease-in-out infinite;
}

@keyframes map-loading-pulse {
    0%, 100% { opacity: 0.35; transform: scale(0.94); }
    50%      { opacity: 1;    transform: scale(1.06); }
}

/* Har man bett om mindre rörelse ska märket stå still. */
@media (prefers-reduced-motion: reduce) {
    .map-loading-mark { animation: none; opacity: 0.8; }
}

/* ==========================================================================
   BYTESHANDEL
   --------------------------------------------------------------------------
   Samma form i stadsvyn och i rutan hos en handelsman ute i världen:
   det man lämnar till vänster, det man får till höger, och en pil
   emellan så att riktningen aldrig går att missförstå.
   ========================================================================== */

.barter-trade {
    display: flex;
    align-items: flex-start;
    gap: 0.7rem;
    margin-top: 0.45rem;
    flex-wrap: wrap;
}

.barter-side {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 8rem;
}

.barter-label {
    font-family: 'Cinzel', serif;
    font-size: 0.62rem;
    letter-spacing: 0.09em;
    text-transform: uppercase;
    color: #9a7f2a;
}

.barter-line {
    font-size: 0.82rem;
    color: #ddd5c2;
}

/* Det man saknar ska synas utan att man behöver räkna själv. */
.barter-line.is-short { color: #e5a394; }

.barter-have {
    margin-left: 0.35rem;
    font-size: 0.72rem;
    color: #8a8072;
}

.barter-arrow {
    align-self: center;
    font-size: 1.1rem;
    color: #9a7f2a;
}

.barter-reason {
    margin: 0.4rem 0 0;
    font-size: 0.78rem;
    color: #e5a394;
}

.barter-row { align-items: flex-start; }

/* --- Rutan hos en handelsman --- */
.barter-overlay {
    position: fixed;
    inset: 0;
    z-index: 5000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.2rem;
    background: rgba(0, 0, 0, 0.72);
}

.barter-overlay.hidden { display: none; }

.barter-box {
    width: 100%;
    max-width: 32rem;
    max-height: 85dvh;
    display: flex;
    flex-direction: column;
    border: 1px solid #9a7f2a;
    border-radius: 0.6rem;
    /* Klipper allt som ritas i rutan mot de rundade hörnen. Utan den
       kan ett barn med egen bakgrund måla ut i hörnen, och då ser
       rutan trasig ut i överkanten. */
    overflow: hidden;
    background: linear-gradient(180deg, #262117 0%, #1b1712 100%);
    box-shadow: 0 14px 40px rgba(0, 0, 0, 0.75);
}

.barter-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.8rem;
    padding: 0.8rem 1rem 0.6rem;
    /* Egen bakgrund, uttryckligen ingen: rubrikraden ska visa rutans
       gradient rakt igenom. */
    background: none;
    box-shadow: none;
    border-bottom: 1px solid #3d3527;
    flex-shrink: 0;
}

.barter-title {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 1.05rem;
    color: #d4af37;
}

.barter-body {
    padding: 0.8rem 1rem 1rem;
    overflow-y: auto;
    min-height: 0;
}

.barter-offer {
    padding: 0.7rem 0;
    border-bottom: 1px solid rgba(61, 53, 39, 0.7);
}

.barter-offer:last-child { border-bottom: none; }

.barter-name {
    font-family: 'Cinzel', serif;
    font-size: 0.92rem;
    color: #ddd5c2;
}

.barter-desc {
    margin: 0.2rem 0 0;
    font-size: 0.8rem;
    line-height: 1.5;
    color: #9c9080;
    font-style: italic;
}

.barter-offer .sheet-action { margin-top: 0.6rem; }
.barter-offer .sheet-action:disabled { opacity: 0.4; cursor: not-allowed; }


/* =====================================================================
   KLANER
   ---------------------------------------------------------------------
   Klanvyn lånar stadsvyns radform, så att en lista ser likadan ut var
   man än läser den. Det som är nytt är vapnet och målarrutan.
   ===================================================================== */

/* Klanvyn ska fylla arket, inte växa ur det.
   ---------------------------------------------------------------
   .clan-shell bad om height: 100%, men procent räknas mot något —
   och sektionen ovanför var ett vanligt block utan bestämd höjd.
   Då blev 100% till "auto", skalet växte med sitt innehåll, och
   det var arket som fick rulla. Följden: flikraden och chattens
   skrivfält rullade bort tillsammans med samtalet.
   Värre än så: .clan-pane-chat frågade i sin tur efter 100% av
   .clan-body, vars höjd bestämdes av just det pane:t. En höjd som
   definieras av sig själv går inte att lösa, och webbläsaren
   svarar med noll — chattrutan blev tom.
   Loggvyn har alltid gjort det här rätt (.sheet-view-log); här är
   samma grepp. */
/* :not([hidden]) är inte prydnad. .sheet-view[hidden] { display: none }
   har exakt samma tyngd som .sheet-view[data-view="clan"], och den här
   regeln står längre ner i filen — utan spärren vann display: flex, och
   klanvyn låg kvar synlig ovanpå loggen och alla andra vyer. */
.sheet-view[data-view="clan"]:not([hidden]) {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
}

/* Katalogen och visitkortet är egna vyer i samma sektion och ska
   rulla var för sig. .hidden slår ifrån dem, den är !important. */
.sheet-view[data-view="clan"]:not([hidden]) > #clan-body,
.sheet-view[data-view="clan"]:not([hidden]) > #clan-profile {
    flex: 1 1 auto;
    min-height: 0;
}

.clan-shell {
    display: flex;
    flex-direction: column;
    min-height: 0;
    height: 100%;
}

/* Klanens flikrad på en telefon.
   -----------------------------------------------------------------
   Sex flikar som bryter rad blir tre rader, och på en telefon äter de
   halva arket innan man ens fått se något av klanen. Stadens flikar
   får gärna brytas — där äger vyn hela skärmen — men här är utrymmet
   det som är knappt.

   En rad som rullar i sidled kostar ingen höjd alls. Flikarna behåller
   sin egen bredd i stället för att dela på raden, annars pressas de
   ihop till oläsliga stumpar. */
@media (max-width: 729px) {
    /* Stadens flikrad får samma behandling som klanens: en rad som
       rullar i sidled i stället för tre rader som äter höjden.
       Önskemålet om brytande rader gällde en bredare skärm — på en
       telefon är höjden det som är knappt. */
    .village-tabs,
    .clan-shell .village-tabs,
    .sheet-view-journal .village-tabs {
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
        scrollbar-width: none;
        -webkit-overflow-scrolling: touch;
        /* Utan det här tar arkets egna dragrörelser hand om fingret
           och raden står still hur mycket man än drar. */
        touch-action: pan-x;
        /* Skuggan i högerkanten säger att det finns mer att hämta. */
        -webkit-mask-image: linear-gradient(to right, #000 88%, transparent);
        mask-image: linear-gradient(to right, #000 88%, transparent);
    }

    .village-tabs::-webkit-scrollbar,
    .clan-shell .village-tabs::-webkit-scrollbar,
    .sheet-view-journal .village-tabs::-webkit-scrollbar { display: none; }

    .village-tab,
    .clan-shell .village-tab,
    .sheet-view-journal .village-tab {
        flex: 0 0 auto;
        min-width: 0;
    }
}

.clan-shell.hidden { display: none; }

.clan-body {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding-top: 0.8rem;
    /* Sista knappen i en vy ska ha luft under sig, annars ser den ut
       att vara avklippt även när hela står framme. */
    padding-bottom: 1.2rem;
}

.clan-pane.hidden { display: none; }

/* Rådet markeras när något väntar på svar. Siffran ligger i
   data-pending, så CSS kan visa den utan att markeringen behöver
   någon extra nod i mallen. */
.clan-tab.has-pending {
    border-color: #9a7f2a;
    color: #d4af37;
}

.clan-tab.has-pending::after {
    content: attr(data-pending);
    display: inline-block;
    margin-left: 0.35rem;
    min-width: 1.1em;
    padding: 0 0.25em;
    border-radius: 0.7em;
    background: #9a2a2a;
    color: #f0e6d2;
    font-size: 0.66rem;
    line-height: 1.5;
    text-align: center;
}

/* Chatten rullar i sin egen ruta. Låter man .clan-body rulla också
   får man två rullister i varandra, och den yttre drar bort både
   flikraden och skrivfältet. */
.clan-body.is-chat {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    padding-bottom: 0.2rem;
}

/* Chattfliken ska fylla höjden så att skrivfältet hamnar i nederkant.
   Höjden kommer från flexen och inte från en procent: en procent
   hade räknats mot .clan-body, vars egen höjd bestäms av det här
   pane:t — en höjd som definieras av sig själv blir noll. */
.clan-pane-chat {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

/* Samtalsrutan: loggen tar all höjd som blir över, skrivfältet står
   still längst ner. Utan detta hade meddelandelistan en fast höjd på
   22rem — på en hög skärm blev det ett litet fönster med tomrum under,
   och på en låg fick man rulla trots att det fanns plats. */
.chat-shell {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    height: 100%;
    min-height: 0;
}

.chat-shell .letter-messages {
    flex: 1 1 auto;
    max-height: none;
    min-height: 0;
    overflow-y: auto;
    margin-bottom: 0.6rem;
}

.chat-shell .letter-reply {
    flex: 0 0 auto;
    padding-top: 0.2rem;
}

/* En rad från spelet själv, inte från någon som talar. */
.chat-note {
    font-size: 0.78rem;
    color: #9c9080;
    font-style: italic;
    padding: 0.15rem 0.2rem;
}

/* --- Vapnet --- */

.crest { display: block; flex-shrink: 0; }

/* Vapnet plus märket, att sätta bredvid ett namn. */
.crest-chip {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    vertical-align: middle;
}

.crest-tag,
.clan-tag {
    font-family: 'Cinzel', serif;
    font-size: 0.66rem;
    letter-spacing: 0.08em;
    color: #9a7f2a;
    border: 1px solid #3d3527;
    border-radius: 0.25rem;
    padding: 0.05rem 0.28rem;
    white-space: nowrap;
}

.clan-row-head {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    min-width: 0;
}

.clan-row-titles {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    min-width: 0;
}

.clan-blurb {
    display: block;
    margin-top: 0.35rem;
    font-size: 0.78rem;
    line-height: 1.5;
    color: #9c9080;
    overflow-wrap: anywhere;
}

/* --- Översikten --- */

.clan-banner {
    display: flex;
    align-items: center;
    gap: 1rem;
    padding-bottom: 0.9rem;
    border-bottom: 1px solid #3d3527;
}

.clan-banner-text { min-width: 0; }

.clan-name {
    margin: 0;
    font-family: 'Cinzel', serif;
    font-size: 1.15rem;
    color: #d4af37;
    display: flex;
    align-items: baseline;
    gap: 0.45rem;
    flex-wrap: wrap;
}

.clan-home {
    margin: 0.2rem 0 0;
    font-size: 0.8rem;
    color: #9c9080;
}

.clan-badge {
    margin-left: 0.4rem;
    font-family: 'Cinzel', serif;
    font-size: 0.66rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: #d4af37;
}

.clan-treasury {
    margin: 0.2rem 0 0.6rem;
    font-family: 'Cinzel', serif;
    font-size: 1.4rem;
    color: #d4af37;
}

.clan-edit { margin-bottom: 0.5rem; }

/* --- Vapensmedjan --- */

.crest-editor {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    align-items: flex-start;
    margin-bottom: 0.8rem;
}

.crest-preview {
    flex-shrink: 0;
    padding: 0.5rem;
    border: 1px solid #3d3527;
    border-radius: 0.4rem;
    background: rgba(0, 0, 0, 0.22);
}

.crest-controls {
    flex: 1 1 14rem;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}

/* .village-select har flex: 1 1 10rem för radernas skull. Här står
   listorna i en kolumn, och då blir samma 10rem en *höjd* — varje
   meny blev en handhög ruta med sin text svävande i mitten. Basen
   nollställs, bredden tas av kolumnen. */
.crest-controls .village-select {
    flex: 0 0 auto;
    width: 100%;
}

.crest-colours {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    margin-top: 0.4rem;
}

.crest-colours label {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}

.crest-colours input[type="color"] {
    width: 3rem;
    height: 1.7rem;
    padding: 0;
    border: 1px solid #3d3527;
    border-radius: 0.25rem;
    background: none;
    cursor: pointer;
}

/* Målarrutan. */
.crest-paint {
    display: flex;
    flex-wrap: wrap;
    gap: 0.8rem;
    align-items: flex-start;
}

.crest-palette {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    max-width: 7rem;
}

.crest-swatch {
    width: 1.4rem;
    height: 1.4rem;
    padding: 0;
    border: 1px solid #3d3527;
    border-radius: 0.2rem;
    cursor: pointer;
}

.crest-swatch.is-active {
    border-color: #d4af37;
    box-shadow: 0 0 0 1px #d4af37;
}

.crest-swatch.is-eraser {
    background: rgba(0, 0, 0, 0.4);
    color: #9c9080;
    font-size: 0.7rem;
}

/* Rutnätet: kvadratiskt oavsett hur brett utrymmet är. */
.crest-grid {
    display: grid;
    gap: 1px;
    width: min(17rem, 100%);
    aspect-ratio: 1;
    padding: 2px;
    border: 1px solid #3d3527;
    border-radius: 0.3rem;
    background: #2b251c;
    /* Att dra över rutnätet ska måla, inte markera text. */
    user-select: none;
}

.crest-cell {
    padding: 0;
    border: none;
    background: rgba(0, 0, 0, 0.35);
    cursor: crosshair;
}

.crest-cell:hover { outline: 1px solid #9a7f2a; }

/* --- Rådet --- */

.clan-vote .village-btn.is-active {
    border-color: #d4af37;
    color: #f0d98a;
}

.clan-due { border-left: 2px solid #9a7f2a; }

/* Klanens egna anteckningar i chatten: beslut, insättningar, uttag.
   De ska se ut som noteringar, inte som att någon sagt dem. */
.clan-note {
    display: flex;
    gap: 0.5rem;
    align-items: baseline;
    margin: 0.3rem 0;
    padding: 0.25rem 0.1rem;
    font-size: 0.78rem;
    font-style: italic;
    color: #8a8072;
}

/* Märkesfältet i klanhallen är kort och ska se kort ut. */
.clan-tag-input {
    max-width: 5.5rem;
    text-transform: uppercase;
}

/* Mötesrutans förklaring till varför en ruta inte går att slåss om. */
.enc-note {
    margin: 0.5rem var(--enc-pad, 0.7rem) 0;
    font-size: 0.78rem;
    color: #9c9080;
    font-style: italic;
}

/* =====================================================================
   LÄNKAR I CHATTEN
   =====================================================================
   Ett märke i en replik blir en knapp. Den ska läsas som en del av
   meningen den står i — inte som en knapp man trycker på för att göra
   något — så den ligger i textens linje och får sin färg, inte en ram
   och en bakgrund. */

.chat-link {
    display: inline;
    font: inherit;
    color: var(--ec-gold, #d4af37);
    background: none;
    border: none;
    border-bottom: 1px dotted rgba(212, 175, 55, 0.5);
    padding: 0;
    margin: 0;
    cursor: pointer;
    text-align: left;
}

.chat-link:hover {
    color: #f0d98a;
    border-bottom-style: solid;
}

.chat-link-ikon {
    margin-right: 2px;
    font-size: 0.85em;
    opacity: 0.9;
}

/* =====================================================================
   FÄSTA KORT
   =====================================================================
   Hovringsrutan försvinner när musen rör sig. Kortet gör inte det: det
   används när man klickat på ett föremål eller följt en länk, och då
   vill man läsa i lugn och ro. Det ligger mitt på skärmen i stället
   för vid pekaren, eftersom en länk kan klickas var som helst. */

.info-card {
    position: fixed;
    z-index: 6100;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: min(92vw, 320px);
    max-height: 80vh;
    overflow-y: auto;
    background: linear-gradient(180deg, #241f18 0%, #171410 100%);
    border: 1px solid #9a7f2a;
    border-radius: 6px;
    padding: 14px 16px 12px;
    box-shadow: 0 12px 34px rgba(0, 0, 0, 0.75);
}

.info-card.hidden { display: none; }

.info-card-close {
    position: absolute;
    top: 4px;
    right: 8px;
    background: none;
    border: none;
    color: #9c9080;
    font-size: 1.2rem;
    line-height: 1;
    cursor: pointer;
}

.info-card-close:hover { color: var(--ec-gold, #d4af37); }

.info-card-actions {
    margin-top: 10px;
    display: flex;
    justify-content: flex-end;
}

/* =====================================================================
   UPPSLAGSVERKET
   =====================================================================
   Innehållsförteckning och artikel bredvid varandra på en bred skärm,
   under varandra på en smal. Artikeln är en läsyta och får därför
   längre radavstånd än resten av skalet. */

.wiki-shell {
    display: flex;
    gap: 14px;
    height: 100%;
    min-height: 0;
}

.wiki-side {
    flex: 0 0 220px;
    display: flex;
    flex-direction: column;
    min-height: 0;
}

.wiki-search {
    width: 100%;
    box-sizing: border-box;
    margin-bottom: 8px;
    padding: 6px 8px;
    border: 1px solid var(--ec-border, #3a3227);
    border-radius: 4px;
    background: #14110c;
    color: var(--ec-text, #e8dfcc);
    font-family: inherit;
    font-size: 0.85rem;
}

.wiki-index {
    overflow-y: auto;
    min-height: 0;
    flex: 1 1 auto;
}

.wiki-group {
    font-family: 'Cinzel', serif;
    font-size: 0.72rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #9c9080;
    margin: 10px 0 4px;
}

.wiki-entry {
    display: block;
    width: 100%;
    text-align: left;
    background: none;
    border: none;
    border-left: 2px solid transparent;
    color: var(--ec-text, #e8dfcc);
    font-family: inherit;
    font-size: 0.86rem;
    padding: 4px 6px;
    cursor: pointer;
}

.wiki-entry:hover { color: var(--ec-gold, #d4af37); }

.wiki-entry.is-active {
    border-left-color: var(--ec-gold, #d4af37);
    color: var(--ec-gold, #d4af37);
}

.wiki-entry-snip {
    display: block;
    font-size: 0.74rem;
    color: #9c9080;
    line-height: 1.35;
}

.wiki-article {
    flex: 1 1 auto;
    min-width: 0;
    overflow-y: auto;
    line-height: 1.65;
    padding-right: 6px;
}

.wiki-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    margin-bottom: 4px;
}

.wiki-head-group {
    font-family: 'Cinzel', serif;
    font-size: 0.7rem;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: #9c9080;
}

.wiki-share {
    background: none;
    border: 1px solid var(--ec-border, #3a3227);
    border-radius: 4px;
    color: #9c9080;
    font-family: inherit;
    font-size: 0.74rem;
    padding: 2px 8px;
    cursor: pointer;
}

.wiki-share:hover {
    border-color: var(--ec-gold-dim, #9a7f2a);
    color: var(--ec-gold, #d4af37);
}

.wiki-body h2,
.wiki-body h3,
.wiki-body h4 {
    font-family: 'Cinzel', serif;
    color: var(--ec-gold, #d4af37);
    margin: 18px 0 6px;
}

.wiki-body h2 { font-size: 1.05rem; margin-top: 4px; }
.wiki-body h3 { font-size: 0.94rem; }
.wiki-body h4 { font-size: 0.86rem; color: #c6ac74; }

/* Brödtexten har samma färg som resten av skalet. Artikeln ärvde förut
   sin färg från arket och blev en nyans ljusare än allt omkring, vilket
   syns tydligast där en wikisida ligger bredvid en chattrad. Rubrikerna
   rörs inte: de ska sticka ut. */
.wiki-body { color: #ddd5c2; }

.wiki-body p { margin: 0 0 10px; }
.wiki-body ul,
.wiki-body ol { margin: 0 0 10px; padding-left: 20px; }
.wiki-body li { margin-bottom: 3px; }

.wiki-body blockquote {
    margin: 0 0 10px;
    padding: 4px 0 4px 12px;
    border-left: 2px solid var(--ec-gold-dim, #9a7f2a);
    color: #c9bfa8;
    font-style: italic;
}

.wiki-body hr {
    border: none;
    border-top: 1px solid var(--ec-border, #3a3227);
    margin: 16px 0;
}

.wiki-body code {
    font-family: 'Courier New', monospace;
    font-size: 0.85em;
    background: rgba(0, 0, 0, 0.35);
    padding: 1px 4px;
    border-radius: 3px;
}

/* Knappen som fäller ut förteckningen. Den finns inte på en bred
   skärm — där står spalten framme hela tiden. */
.wiki-toggle {
    display: none;
    align-self: flex-start;
    background: none;
    border: 1px solid var(--ec-border, #3a3227);
    border-radius: 4px;
    color: var(--ec-text, #e8dfcc);
    font-family: 'Cinzel', serif;
    font-size: 0.78rem;
    letter-spacing: 0.06em;
    padding: 4px 10px;
    cursor: pointer;
    margin-bottom: 6px;
}

.wiki-toggle::before { content: '\2630\00a0\00a0'; }

.wiki-toggle:hover,
.wiki-toggle[aria-expanded="true"] {
    border-color: var(--ec-gold-dim, #9a7f2a);
    color: var(--ec-gold, #d4af37);
}

/* Mellanstor skärm och smalare: en spalt på 220 px tar en tredjedel av
   läsytan och lämnar en artikel som är för smal att läsa. Gränsen går
   vid 1000 px och inte vid telefonbredden med flit — arket har en egen
   bredd (--sheet-width), så uppslagsverket har långt mindre plats än
   fönstret antyder.
   Förteckningen blir här en lucka som fälls ut och lägger sig ovanpå
   artikeln. Att den *ligger ovanpå* i stället för att skjuta ned den är
   avsiktligt: annars flyttar sig texten man just läste varje gång man
   letar efter nästa sida. */
@media (max-width: 1000px) {
    .wiki-shell { flex-direction: column; }

    .wiki-toggle { display: block; }

    .wiki-side {
        display: none;
        flex: 0 0 auto;
        position: absolute;
        z-index: 5;
        left: 0;
        right: 0;
        max-width: 26rem;
        background: var(--ec-panel, #1b170f);
        border: 1px solid var(--ec-border, #3a3227);
        border-radius: 6px;
        padding: 8px;
        box-shadow: 0 10px 24px rgba(0, 0, 0, 0.55);
    }

    .wiki-shell.visar-index { position: relative; }

    .wiki-shell.visar-index .wiki-side { display: flex; }

    .wiki-index { max-height: 46vh; }
}

/* =====================================================================
   DELA-KNAPPEN
   =====================================================================
   Sitter vid ett namn, en rubrik eller i ett kort. Den ska gå att
   hitta men aldrig konkurrera med det den står bredvid — därför en
   dämpad ikon som tänds när man är nära den. */

.dela-btn {
    background: none;
    border: none;
    padding: 0 4px;
    margin-left: 4px;
    font-size: 0.8em;
    line-height: 1;
    color: var(--ec-muted, #9c9080);
    cursor: pointer;
    opacity: 0.75;
    vertical-align: middle;
}

/* Kvittensen på att något hamnat i urklippet. Knappen tänds ett
   ögonblick i stället för att en notis lägger sig över spelet — en
   kopiering är för liten händelse för att avbryta något. */
.dela-kvitto,
.sheet-action.dela-kvitto {
    color: var(--ec-gold, #d4af37);
    opacity: 1;
}

.dela-btn:hover {
    color: var(--ec-gold, #d4af37);
    opacity: 1;
}

/* I en rapport står den för sig själv och behöver en egen rad. */
.dela-btn-rad {
    display: inline-block;
    margin: 0 0 8px;
    padding: 2px 8px;
    border: 1px solid var(--ec-border, #3a3227);
    border-radius: 4px;
    font-size: 0.74rem;
}

/* =====================================================================
   FÖRSLAG MEDAN MAN SKRIVER
   =====================================================================
   Ligger ovanför skrivrutan, inte under: rutan sitter längst ner i
   arket, och en lista under den hade hamnat utanför skärmen. */

.lank-forslag {
    position: absolute;
    bottom: 100%;
    left: 0;
    right: 0;
    z-index: 40;
    max-height: 40vh;
    overflow-y: auto;
    margin-bottom: 4px;
    border: 1px solid var(--ec-gold-dim, #9a7f2a);
    border-radius: 6px;
    background: var(--ec-panel, #1c1811);
    box-shadow: 0 -6px 20px rgba(0, 0, 0, 0.6);
}

.lank-forslag.hidden { display: none; }

.lank-forslag-rad {
    display: block;
    width: 100%;
    text-align: left;
    background: none;
    border: none;
    color: var(--ec-text, #e8dfcc);
    font-family: inherit;
    font-size: 0.86rem;
    padding: 5px 10px;
    cursor: pointer;
}

.lank-forslag-rad:hover,
.lank-forslag-rad.is-active {
    background: rgba(212, 175, 55, 0.15);
    color: var(--ec-gold, #d4af37);
}

/* Rutan behöver något att ligga ovanför. Svarsfältet i chatten och i
   klanen är samma sorts rad, så båda får samma hållpunkt. */
.letter-reply { position: relative; }

/* Tabeller i uppslagsverket. Reglerna står ofta bäst i en tabell —
   vad som spärrar, vad ett tecken betyder — och en tabell utan linjer
   är bara ord i rader. */
.wiki-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0 0 12px;
    font-size: 0.86rem;
}

.wiki-table th,
.wiki-table td {
    text-align: left;
    padding: 4px 8px;
    border-bottom: 1px solid var(--ec-border, #3a3227);
    vertical-align: top;
}

.wiki-table th {
    font-family: 'Cinzel', serif;
    font-size: 0.78rem;
    letter-spacing: 0.04em;
    color: var(--ec-gold-dim, #9a7f2a);
    border-bottom-color: var(--ec-gold-dim, #9a7f2a);
}

/* Notisen går att svepa bort. Fingret måste få dra i sidled utan att
   webbläsaren tolkar det som en rullning — annars glider sidan i
   stället för rutan. */
.toast-line.is-visible {
    touch-action: pan-y;
}

/* =====================================================================
   MINIKARTAN
   =====================================================================
   Landet i smått, ovanpå brädet. Brädet visar sju rutor; utan den här
   går det inte att veta åt vilket håll nästa stad ligger. */

.minimap {
    position: absolute;
    top: 46px;
    right: 10px;
    z-index: 6;
    width: min(460px, 82vw);
    background: var(--ec-panel, #1b170f);
    border: 1px solid var(--ec-border, #3a3227);
    border-radius: 8px;
    box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6);
    padding: 6px;
    pointer-events: auto;
}

.minimap.hidden { display: none; }

.minimap-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-family: 'Cinzel', serif;
    font-size: 0.8rem;
    letter-spacing: 0.08em;
    color: var(--ec-gold, #d4af37);
    padding: 2px 4px 6px;
}

.minimap-head button {
    background: none;
    border: none;
    color: var(--ec-muted, #9c9080);
    font-size: 1.1rem;
    line-height: 1;
    cursor: pointer;
}

.minimap-head button:hover { color: var(--ec-gold, #d4af37); }

.minimap canvas {
    display: block;
    width: 100%;
    height: auto;
    background: #14110c;
    border-radius: 4px;
}

.minimap-note {
    margin: 6px 2px 2px;
    font-size: 0.72rem;
    color: var(--ec-muted, #9c9080);
}

/* Notisrutan går att ta tag i.
   -------------------------------------------------------------------
   Att den gick att svepa bort syntes inte: den såg ut som en ruta som
   ligger där tills den tonar ut. Handgripet säger att den går att
   flytta, och medan man håller i den följer den pekaren — se
   notisRor i game.js. */
.toast-line {
    cursor: grab;
    /* Vågrätt drag hör till rutan, lodrätt till sidan. Utan den här
       raden tolkade webbläsaren draget som en rullning och tog över
       det efter några bildpunkter. */
    touch-action: pan-y;
}

.toast-line.dras {
    cursor: grabbing;
    /* Text som markeras mitt i ett drag ser ut som ett fel, och på
       en telefon blir det en förstoringslupp över halva skärmen. */
    user-select: none;
}

/* Mötesrutan går att dra undan med fingret.
   -------------------------------------------------------------------
   Nedåt, inte åt sidan: åt sidan betyder anfall och smyg på brädet
   strax ovanför. Handtaget är hela rutan utom knapparna — se rutaNed
   i game.js.

   Ingen grip-markör, för draget finns inte för musen. Med mus var
   greppet i vägen: man drog av misstag varje gång man siktade på en
   knapp och missade med ett par bildpunkter. */
.context-bar { touch-action: pan-y; }

.context-bar.dras { user-select: none; }
