/* Trading-Journal — Kanalregeln.
   ==========================================================================
   Umgezogen aus dem <style>-Block von templates/channels/journal.html
   (STEP_03_JOURNAL.md, Lauf A). Der Block stand ausserhalb jeder Schicht
   und hat damit tokens.css, components.css und shell.css vollstaendig
   ueberstimmt — derselbe Fehler, der bei theme.css schon einmal das ganze
   Redesign unwirksam gemacht hat. Er gehoert in `channels`, damit er
   `components` schlaegt und von `overrides` geschlagen wird.

   Diese Datei enthaelt KEINE hartkodierte Farbe. Jede Rolle kommt aus
   tokens.css; wo eine Zuordnung nicht eindeutig war, steht der Grund
   daneben.
   ========================================================================== */

@layer channels {
    .journal-app {
        height: 100%;
        display: flex;
        background: transparent;
        overflow: hidden;
    }

    /* `theme.css` setzt pauschal `button, .btn { text-transform: uppercase }`
       (Schicht `legacy`). Solange der Kanalstil im Template stand und damit
       ausserhalb jeder Schicht lag, hat er das nebenbei ueberstimmt. Beim
       Umzug nach `channels` kam die Altregel wieder durch — jeder Knopf im
       Journal stand wieder in Versalien. Das ist kein Schoenheitsfehler,
       sondern §7: Versalien gehoeren nicht ueber Bedienelemente. Hier steht
       die Gegenregel, damit sie an EINER Stelle steht und nicht an zwanzig. */
    .journal-app button,
    .journal-app .btn,
    .jai-view button,
    .jai-view .btn {
        text-transform: none;
        letter-spacing: normal;
    }

    /* ── Sidebar ──────────────────────────────────────────────── */
    /* Die zweite Leiste im Kanal (J3). Sie bekommt hier nur eine Rolle —
       `--surface-canvas`, weil sie heute DUNKLER liegt als der Inhalt und
       genau dadurch als Leiste liest. Lauf B stellt sie auf
       `--surface-panel` um; das ist der eigentliche Umbau und nicht die
       Aufgabe dieses Laufs. */
    .journal-sidebar {
        width: 270px;
        min-width: 270px;
        border-right: 1px solid var(--line-subtle);
        display: flex;
        flex-direction: column;
        background: var(--surface-canvas);
        overflow: hidden;
    }
    .journal-sidebar-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 18px 16px 14px;
        border-bottom: 1px solid var(--line-subtle);
    }
    /* Versalien und Sperrsatz raus (J6), Gewicht 700 raus (R4: es gibt nur
       400/500/600). Der Schriftzug selbst faellt in Lauf B ganz weg — die
       Kanalkopfzeile sagt bereits, wo man ist. */
    .journal-sidebar-logo {
        display: flex;
        align-items: center;
        gap: 9px;
        font-family: var(--font-ui);
        font-weight: var(--font-weight-medium);
        font-size: var(--text-sm);
        color: var(--ink-secondary);
    }
    /* War `--signal-up`. Gruen als Markenfarbe verstoesst gegen R2 — es ist
       hier kein Gewinn, sondern ein Logo. Das Motiv erbt jetzt wie ueberall
       sonst `currentColor`. */
    .journal-sidebar-logo i {
        font-size: var(--icon-nav);
        color: currentColor;
    }
    .journal-new-btn {
        width: 30px; height: 30px;
        border: 1px solid var(--line);
        border-radius: var(--radius-chip);
        background: transparent;
        color: var(--ink-secondary);
        cursor: pointer;
        display: flex; align-items: center; justify-content: center;
        padding: 0;
        transition: color var(--dur-instant) var(--ease-standard),
                    border-color var(--dur-instant) var(--ease-standard),
                    background-color var(--dur-instant) var(--ease-standard),
                    transform var(--dur-fast) var(--ease-out);
    }
    /* Der gruene Umriss beim Ueberfahren ist gefallen (R2): ein Neu-Knopf
       hat keine Finanzbedeutung. Die Flaeche traegt den Zustand (R3). */
    @media (hover: hover) and (pointer: fine) {
        .journal-new-btn:hover {
            border-color: var(--line-strong);
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }
    .journal-new-btn:active {
        transform: scale(0.97);
    }
    .journal-new-btn:focus-visible {
        outline: none;
        border-color: var(--line-focus);
    }
    .journal-new-btn-icon {
        width: 13px;
        height: 13px;
        display: block;
    }
    .journal-search-wrap {
        padding: 10px 14px;
        position: relative;
    }
    .journal-search-icon {
        position: absolute;
        left: 24px; top: 50%;
        transform: translateY(-50%);
        font-size: var(--icon-inline);
        color: var(--ink-muted);
        pointer-events: none;
    }
    /* War `--font-label` (= die Maschinenschrift) bei 11 px mit Versal-
       Platzhalter. „Suchen" ist Sprache, kein Messwert (J6, Statut §4). */
    .journal-search {
        width: 100%; height: 34px;
        border: 1px solid var(--line);
        border-radius: var(--radius-control);
        background: var(--surface-raised);
        color: var(--ink-primary);
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        padding: 0 12px 0 32px;
        outline: none;
        transition: border-color var(--dur-fast) var(--ease-standard),
                    background-color var(--dur-fast) var(--ease-standard);
    }
    .journal-search:focus {
        border-color: var(--line-focus-soft);
        background: var(--surface-hover);
    }
    .journal-search::placeholder {
        color: var(--ink-muted);
    }

    /* Tree */
    .journal-tree {
        flex: 1;
        overflow-y: auto;
        padding: 6px 8px;
    }
    .journal-tree::-webkit-scrollbar { width: 4px; }
    .journal-tree::-webkit-scrollbar-thumb {
        background: var(--line-strong);
        border-radius: var(--radius-chip);
    }
    .journal-category { margin-bottom: 4px; }
    /* Kategorienamen standen in der Maschinenschrift, versal und gesperrt.
       „Fehler", „Aktien", „Regeln" sind Sprache (J6). */
    .journal-category-header {
        display: flex;
        align-items: center;
        gap: 8px;
        padding: 7px 10px;
        cursor: pointer;
        color: var(--ink-secondary);
        font-family: var(--font-ui);
        font-size: var(--text-sm);
        font-weight: var(--font-weight-regular);
        transition: color var(--dur-instant) var(--ease-standard),
                    background-color var(--dur-instant) var(--ease-standard);
        user-select: none;
        border-radius: var(--radius-control);
    }
    .journal-category.is-empty .journal-category-header {
        cursor: default;
    }
    .journal-category.is-empty .journal-category-header:hover {
        color: var(--ink-secondary);
        background: transparent;
    }
    .journal-category.is-empty .cat-chevron {
        opacity: 0.35;
    }
    @media (hover: hover) and (pointer: fine) {
        .journal-category-header:hover {
            color: var(--ink-primary);
            background: var(--surface-hover);
        }
    }
    .journal-category-header .cat-icon {
        font-size: var(--icon-nav);
        width: 18px;
        text-align: center;
        color: var(--ink-muted);
    }
    .journal-category-header .cat-name { flex: 1; }
    /* Der Zaehler verliert seinen Kasten — eine Zahl braucht keinen
       (Plan §4.1). Als Maschinenwert bleibt er in `--font-data`. */
    .journal-category-header .cat-count {
        font-family: var(--font-data);
        font-size: var(--text-2xs);
        font-variant-numeric: tabular-nums;
        color: var(--ink-muted);
        background: transparent;
        padding: 1px 2px;
        min-width: 20px;
        text-align: right;
    }
    .journal-category-header .cat-chevron {
        font-size: var(--icon-inline);
        transition: transform var(--dur-fast) var(--ease-standard);
        color: var(--ink-muted);
    }
    .journal-category.is-expanded .cat-chevron {
        transform: rotate(90deg);
    }
    .journal-category-entries {
        display: block;
        max-height: 0;
        overflow: hidden;
        opacity: 0;
        transform: translateY(-4px);
        padding: 0;
        pointer-events: none;
        /* Die Umstellung auf `grid-template-rows: 0fr → 1fr` steht in Lauf D
           (Plan §6). Hier kommen nur Dauer und Kurve aus Token. */
        transition:
            max-height var(--dur-base) var(--ease-out),
            opacity var(--dur-fast) var(--ease-out),
            transform var(--dur-base) var(--ease-out),
            padding var(--dur-base) var(--ease-out);
        will-change: max-height, opacity, transform;
    }
    .journal-category.is-expanded .journal-category-entries {
        max-height: 900px;
        opacity: 1;
        transform: translateY(0);
        padding: 2px 0 4px;
        pointer-events: auto;
    }
    .journal-entry-item {
        display: flex;
        align-items: center;
        gap: 7px;
        padding: 6px 10px 6px 34px;
        cursor: pointer;
        color: var(--ink-secondary);
        font-size: var(--text-xs);
        font-family: var(--font-ui);
        transition: color var(--dur-instant) var(--ease-standard),
                    background-color var(--dur-instant) var(--ease-standard);
        border-radius: var(--radius-control);
        margin: 1px 0;
        /* Der 2-px-Balken links ist gefallen: Statut §7 verbietet
           Farbstreifen breiter als 1 px, R3 laesst die Flaeche die Auswahl
           tragen. Der aktive Zustand steht jetzt in `.is-active`. */
    }
    .journal-entry-item .journal-entry-delete-btn {
        width: 22px;
        height: 22px;
        border: none;
        background: transparent;
        border-radius: var(--radius-control);
        color: var(--ink-muted);
        display: flex;
        align-items: center;
        justify-content: center;
        flex-shrink: 0;
        opacity: 0;
        transform: translateX(4px);
        transition: opacity var(--dur-fast) var(--ease-out),
                    transform var(--dur-fast) var(--ease-out),
                    color var(--dur-instant) var(--ease-standard),
                    background-color var(--dur-instant) var(--ease-standard);
        cursor: pointer;
        pointer-events: none;
        margin-left: 2px;
    }
    .journal-entry-item:hover .journal-entry-delete-btn,
    .journal-entry-item .journal-entry-delete-btn:focus-visible {
        opacity: 1;
        transform: translateX(0);
        pointer-events: auto;
    }
    /* Loeschen ist eine zerstoerende Handlung — hier ist Rot Zustandssignal
       und damit nach R2 erlaubt. */
    .journal-entry-item .journal-entry-delete-btn:hover {
        background: var(--signal-down-surface);
        color: var(--signal-down);
    }
    .journal-entry-item .journal-entry-delete-btn i {
        font-size: var(--icon-inline);
    }
    @media (hover: hover) and (pointer: fine) {
        .journal-entry-item:hover {
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }
    .journal-entry-item.is-active {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }
    .journal-entry-item .entry-icon {
        font-size: var(--icon-inline);
        flex-shrink: 0;
        color: var(--ink-muted);
    }
    .journal-entry-item .entry-title {
        flex: 1;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
    /* Ein Ticker ist ein Maschinenwert (Statut §4): Mono, nicht die
       Fliessschrift. Das Blauviolett (`--bot-accent`, #a8b1ff) steht in
       keiner Rolle des Statuts und faellt ersatzlos — ein Ticker ist keine
       Kategorie und traegt keine Farbe. */
    .journal-entry-item .entry-ticker {
        font-family: var(--font-data);
        font-size: var(--text-2xs);
        font-weight: var(--font-weight-medium);
        font-variant-numeric: tabular-nums;
        color: var(--ink-secondary);
        background: var(--surface-raised);
        padding: 2px 6px; border-radius: var(--radius-chip);
        flex-shrink: 0;
    }

    /* ── Main Area ────────────────────────────────────────────── */
    .journal-main {
        flex: 1;
        display: flex;
        flex-direction: column;
        overflow: hidden;
        min-width: 0;
        background: transparent;
    }
    .journal-empty-state {
        flex: 1;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 16px;
        color: var(--ink-muted);
    }
    /* 52 px und Gruen: beides faellt. Das Motiv im leeren Zustand ist die
       Rolle `--icon-feature`, und Gruen waere hier Dekoration, kein Gewinn
       (R2). Plan §4.4. */
    .journal-empty-icon {
        font-size: var(--icon-feature);
        color: var(--ink-muted);
    }
    .journal-empty-text {
        font-size: var(--text-sm);
        font-family: var(--font-ui);
        font-weight: var(--font-weight-regular);
        color: var(--ink-secondary);
    }
    .journal-feature-row {
        display: flex;
        flex-wrap: wrap;
        gap: 10px;
        margin-top: 16px;
    }
    /* Der Rahmen faellt (R3: die Flaeche ordnet). Die Umwandlung von Kachel
       zu Zeile steht in Lauf B, Plan §4.4. */
    .journal-feature-box {
        background: var(--surface-raised);
        padding: 12px 16px;
        border-radius: var(--radius-control);
        font-size: var(--text-xs);
        color: var(--ink-primary);
        border: none;
        display: flex;
        align-items: center;
        gap: 10px;
        min-width: 170px;
        cursor: pointer;
        transition: background-color var(--dur-fast) var(--ease-standard),
                    transform var(--dur-fast) var(--ease-out);
    }
    @media (hover: hover) and (pointer: fine) {
        .journal-feature-box:hover {
            background: var(--surface-hover);
        }
    }
    .journal-feature-box:active {
        transform: scale(0.97);
    }
    /* Die drei farbigen Kacheln aus dem leeren Zustand: die Einfaerbung
       setzt JavaScript inline (`icon.style.color`) — sie faellt in Lauf C.
       Hier verliert der Behaelter schon einmal seine eigene Flaeche, damit
       keine Karte in einer Karte steht (R3). */
    .journal-feature-icon {
        width: 28px; height: 28px;
        border-radius: var(--radius-chip);
        color: var(--ink-muted);
        display: flex; align-items: center; justify-content: center;
        flex-shrink: 0;
    }

    /* ── Editor ───────────────────────────────────────────────── */
    .journal-editor {
        flex: 1;
        display: flex;
        flex-direction: column;
        overflow-y: auto;
        padding: 28px 48px 48px;
        max-width: 820px;
        margin: 0 auto;
        width: 100%;
        background: transparent;
    }
    .journal-editor::-webkit-scrollbar { width: 4px; }
    .journal-editor::-webkit-scrollbar-thumb {
        background: var(--line-strong);
        border-radius: var(--radius-chip);
    }
    .journal-editor-toolbar {
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin-bottom: 12px;
    }
    /* Gemessen: 1,66 : 1 — unlesbar, und dazu versal und gesperrt. Der
       Speicherhinweis ist ein Wort, kein Etikett (Plan §4.2). Gelb und
       Gruen fallen: „wird gespeichert" ist kein Kurs. Den Unterschied
       traegt jetzt die Helligkeitsstufe, nicht die Farbe. */
    .journal-save-indicator {
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        color: var(--ink-muted);
        transition: color var(--dur-base) var(--ease-standard),
                    opacity var(--dur-base) var(--ease-out);
        display: flex;
        align-items: center;
        gap: 6px;
    }
    .journal-save-indicator.is-saving { color: var(--ink-muted); }
    .journal-save-indicator.is-saved  { color: var(--ink-secondary); }
    .journal-save-dot {
        width: 6px; height: 6px;
        border-radius: 50%;
        background: currentColor;
        display: inline-block;
    }
    /* J7: 30 px / 700 kennt das Statut nicht. Die Titelstufe ist 23 px · 500
       (Statut §4, `--text-xl`). Ein Titel traegt durch Groesse und Ruhe,
       nicht durch Fettdruck. Der gruene Cursor faellt — R2. */
    .journal-title-input {
        flex-shrink: 0;
        font-family: var(--font-ui);
        font-size: var(--text-xl);
        font-weight: var(--font-weight-medium);
        color: var(--ink-primary);
        background: transparent;
        border: none;
        outline: none;
        width: 100%;
        padding: 0;
        margin-bottom: 12px;
        caret-color: var(--ink-primary);
        line-height: 1.2;
    }
    .journal-title-input::placeholder { color: var(--ink-muted); }
    .journal-meta-row {
        flex-shrink: 0;
        display: flex;
        align-items: center;
        gap: 8px;
        margin-bottom: 28px;
        flex-wrap: wrap;
    }
    .journal-meta-select-wrap {
        position: relative;
        flex-shrink: 0;
    }
    .journal-meta-select,
    .journal-meta-input {
        height: 30px;
        border: 1px solid var(--line);
        border-radius: var(--radius-md);
        background: var(--surface-raised);
        color: var(--ink-secondary);
        font-family: var(--font-ui);
        font-size: 11px;
        padding: 0 10px;
        outline: none;
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
    }
    .journal-meta-select {
        min-width: 118px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 8px;
        cursor: pointer;
        font-weight: 600;
        white-space: nowrap;
        padding-right: 10px;
        appearance: none;
        -webkit-appearance: none;
    }
    .journal-meta-select:hover {
        border-color: var(--line);
        background: var(--surface-hover);
    }
    .journal-meta-select.is-open,
    .journal-meta-select:focus-visible,
    .journal-meta-input:focus {
        border-color: var(--line-focus);
    }
    .journal-meta-select-label {
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
    .journal-meta-select-caret {
        font-size: 10px;
        color: var(--ink-muted);
        transition: transform var(--dur-fast) var(--ease-standard), color var(--dur-instant) var(--ease-standard);
        flex-shrink: 0;
    }
    .journal-meta-select.is-open .journal-meta-select-caret {
        transform: rotate(180deg);
        color: var(--ink-primary);
    }
    .journal-meta-select-menu {
        position: absolute;
        top: calc(100% + 6px);
        left: 0;
        min-width: 180px;
        padding: 6px;
        border-radius: var(--radius-lg);
        border: 1px solid var(--line);
        background: var(--surface-menu);
        box-shadow: var(--shadow-lg);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        opacity: 0;
        visibility: hidden;
        transform: translateY(-4px);
        transition: opacity var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), visibility 0s linear var(--dur-fast);
        z-index: var(--z-dropdown);
    }
    .journal-meta-select-menu.is-visible {
        opacity: 1;
        visibility: visible;
        transform: translateY(0);
    }
    .journal-meta-select-item {
        display: flex;
        align-items: center;
        gap: 8px;
        padding: 8px 10px;
        border-radius: var(--radius-md);
        cursor: pointer;
        font-family: var(--font-ui);
        font-size: 11px;
        color: var(--ink-secondary);
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
        user-select: none;
        width: 100%;
        border: none;
        background: transparent;
        text-align: left;
        appearance: none;
        -webkit-appearance: none;
    }
    .journal-meta-select-item:hover {
        background: var(--surface-hover);
        color: var(--ink-primary);
    }
    .journal-meta-select-item.is-active {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }
    .journal-meta-select-item i {
        font-size: 14px;
        width: 18px;
        text-align: center;
        flex-shrink: 0;
    }
    /* Ein Ticker IST ein Maschinenwert — Versalien und Mono sind hier
       richtig (Statut §4). Der Platzhalter dagegen ist Sprache und
       verliert sie. */
    .journal-meta-input {
        width: 85px;
        font-family: var(--font-data);
        text-transform: uppercase;
    }
    .journal-meta-input::placeholder {
        color: var(--ink-muted);
        font-family: var(--font-ui);
        text-transform: none;
    }
    .journal-meta-date {
        font-family: var(--font-label);
        font-size: 11px;
        color: var(--ink-muted);
    }
    .journal-meta-source {
        font-family: var(--font-ui);
        font-size: 9px;
        font-weight: 700;
        padding: 3px 8px;
        border-radius: var(--radius-md);
        background: var(--surface-hover);
        color: var(--ink-muted);
    }
    .journal-meta-source[data-source="ai"] {
        background: var(--surface-raised);
        color: var(--ink-secondary);
    }
    .journal-meta-divider {
        width: 1px; height: 16px;
        background: var(--surface-selected);
        border-radius: 1px;
    }

    /* ── Blocks ───────────────────────────────────────────────── */
    .journal-blocks {
        flex-shrink: 0;
        height: auto;
        min-height: 240px;
        padding: 18px 20px;
        border: 1px solid var(--line);
        border-radius: var(--radius-panel);
        background: var(--surface-composer);
        box-sizing: border-box;
        transition:
            border-color var(--dur-fast) var(--ease-out),
            box-shadow var(--dur-fast) var(--ease-out);
        display: flex;
        flex-direction: column;
        gap: 4px;
        cursor: text;
        margin-block-end: 16px;
    }
    .journal-blocks:focus-within {
        border-color: var(--line-focus-soft);
        box-shadow: 0 0 0 1px var(--line-focus-soft);
    }
    .journal-block {
        display: flex;
        align-items: flex-start;
        gap: 4px;
        padding: 4px 6px;
        position: relative;
        border-radius: var(--radius-md);
        transition: background-color var(--dur-instant) var(--ease-standard);
    }
    .journal-block:hover {
        background: var(--surface-hover);
    }
    .journal-block:hover .block-delete-btn {
        opacity: 0.7;
    }
    /* Das T-Symbol und die 3 Punkte entfallen — saubere, ununterbrochene Schreibflaeche */
    .block-handle,
    .block-type-btn {
        display: none;
    }
    .block-content {
        flex: 1;
        outline: none;
        min-height: 1.6em;
        line-height: 1.65;
        color: var(--ink-primary);
        font-size: 14px;
        font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
        padding: 2px 4px;
        border-radius: var(--radius-md);
        word-break: break-word;
        transition: background-color var(--dur-instant) var(--ease-standard);
    }
    .block-content:focus {
        background: transparent;
    }
    /* Placeholder ("Schreibe etwas...") erscheint NUR bei Fokus auf leerer Zeile
       oder wenn das Dokument komplett leer ist (einzelner Block) */
    .block-content:empty::before {
        content: none;
    }
    .journal-blocks:not(:focus-within) .journal-block:first-child:only-child .block-content:empty::before,
    .block-content:focus:empty::before {
        content: attr(data-placeholder);
        color: var(--ink-muted);
        pointer-events: none;
    }
    .journal-inline-image-btn {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        margin: 0 4px;
        padding: 3px 9px;
        border-radius: var(--radius-pill);
        border: 1px solid var(--line);
        background: var(--surface-raised);
        color: var(--ink-primary);
        font-family: var(--font-ui);
        font-size: 11px;
        line-height: 1.2;
        cursor: pointer;
        vertical-align: middle;
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
    }
    .journal-inline-image-btn:hover,
    .journal-inline-image-btn:focus-visible {
        border-color: var(--line-strong);
        background: var(--surface-hover);
        color: var(--ink-primary);
        outline: none;
    }
    .journal-inline-image-btn i {
        font-size: 12px;
        color: var(--ink-primary);
    }
    .journal-block[data-type="bullet"] .block-content { padding-left: 16px; }
    .journal-block[data-type="bullet"]::after {
        content: '';
        position: absolute;
        left: 10px; top: 11px;
        width: 5px; height: 5px;
        background: var(--ink-secondary);
        border-radius: 50%;
        pointer-events: none;
    }
    .journal-block[data-type="heading"] .block-content {
        font-size: 17px;
        font-weight: 600;
        font-family: var(--font-ui);
        color: var(--ink-primary);
        margin-top: 10px;
        margin-bottom: 2px;
    }
    .block-delete-btn {
        opacity: 0;
        background: transparent;
        border: none;
        color: var(--ink-muted);
        cursor: pointer;
        font-size: 11px;
        padding: 4px;
        flex-shrink: 0;
        border-radius: var(--radius-chip);
        transition: opacity var(--dur-fast) var(--ease-out), color var(--dur-instant) var(--ease-standard);
    }
    .block-delete-btn:hover {
        opacity: 1;
        color: var(--signal-down);
    }

    /* ── Floating Selection Toolbar ────────────────────────────── */
    .journal-selection-toolbar {
        position: fixed;
        /* 10000 war eine Zahl, die gewinnen sollte. Die Leiste schwebt ueber
           dem Text und unter jedem Dialog — das ist genau `--z-dropdown`. */
        z-index: var(--z-dropdown);
        display: none;
        align-items: center;
        gap: 2px;
        padding: 3px 5px;
        border-radius: var(--radius-control);
        border: 1px solid var(--line-strong);
        background: var(--surface-menu);
        /* Kein eigener Schatten: das Projekt setzt --shadow-* auf `none`
           (R3 — die Flaeche ordnet). Die schwebende Leiste trennt sich ueber
           `--surface-menu` und die Kante, nicht ueber einen Schlagschatten. */
        box-shadow: var(--shadow-lg);
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
    }
    .jst-btn {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        min-width: 26px;
        height: 26px;
        padding: 0 6px;
        border: none;
        border-radius: var(--radius-chip);
        background: transparent;
        color: var(--ink-secondary);
        font-family: var(--font-ui);
        font-size: 12px;
        font-weight: var(--font-weight-medium);
        cursor: pointer;
        user-select: none;
        transition: background-color var(--dur-instant) var(--ease-standard),
                    color var(--dur-instant) var(--ease-standard);
    }
    .jst-btn:hover {
        background: var(--surface-hover);
        color: var(--ink-primary);
    }
    .jst-btn.is-active {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }
    .jst-divider {
        width: 1px;
        height: 14px;
        background: var(--line);
        margin: 0 2px;
    }
    .journal-add-block {
        flex-shrink: 0;
        display: flex;
        align-items: center;
        gap: 7px;
        padding: 10px 8px;
        margin-top: 8px;
        /* J8: stand auf Deckkraft 0,12 — gemessen 1,27 : 1, also faktisch
           unsichtbar, bis man daraufkam. `--ink-muted` bringt es ueber
           4,5 : 1. Der gestrichelte Rahmen faellt (Plan §4.2). */
        color: var(--ink-muted);
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        cursor: pointer;
        /* Keine Ruhe-Deckkraft: 0,6 haette die gerade erst gewonnenen
           4,77 : 1 wieder auf ~2,6 : 1 gedrueckt. Die Zeile ist im Ruhezustand
           lesbar und wird beim Ueberfahren des Editors nur deutlicher. */
        transition: color var(--dur-fast) var(--ease-standard),
                    background-color var(--dur-fast) var(--ease-standard);
        border-radius: var(--radius-control);
        border: none;
    }
    /* Die Zeile wird deutlich, sobald man IM Editor ist — nicht erst, wenn
       man sie selbst trifft. Sonst muss man etwas treffen, das man nicht
       sieht (Plan §4.2). */
    @media (hover: hover) and (pointer: fine) {
        .journal-editor:hover .journal-add-block {
            color: var(--ink-secondary);
        }
        .journal-add-block:hover {
            color: var(--ink-primary);
            background: var(--surface-raised);
        }
    }
    .journal-add-block:focus-visible {
        color: var(--ink-secondary);
    }

    /* ── Delete Confirmation Modal ────────────────────────────── */
    .journal-modal-overlay {
        position: fixed;
        inset: 0;
        background: color-mix(in oklab, var(--surface-canvas) 52%, transparent);
        display: flex;
        align-items: center;
        justify-content: center;
        z-index: var(--z-modal-backdrop);
        opacity: 0;
        visibility: hidden;
        pointer-events: none;
        transition:
            opacity var(--dur-fast) var(--ease-out),
            visibility 0s linear var(--dur-fast);
    }
    .journal-modal-overlay.is-visible {
        opacity: 1;
        visibility: visible;
        pointer-events: auto;
        transition:
            opacity var(--dur-fast) var(--ease-out),
            visibility 0s linear 0s;
    }
    .journal-modal-overlay.is-closing {
        opacity: 0;
        visibility: visible;
        pointer-events: none;
        transition:
            opacity var(--dur-fast) var(--ease-out),
            visibility 0s linear 0s;
    }
    .journal-modal {
        background: var(--surface-overlay);
        border: 1px solid var(--line);
        border-radius: var(--radius-lg);
        padding: 28px;
        max-width: 380px;
        width: 90%;
        opacity: 0;
        transform: scale(0.975) translateY(10px);
        transition:
            transform var(--dur-base) var(--ease-out),
            opacity var(--dur-fast) var(--ease-out);
        will-change: transform, opacity;
        box-shadow: var(--shadow-lg);
    }
    .journal-modal-overlay.is-visible .journal-modal {
        opacity: 1;
        transform: scale(1) translateY(0);
    }
    .journal-modal-overlay.is-closing .journal-modal {
        opacity: 0;
        transform: scale(0.985) translateY(8px);
    }
    .journal-modal-icon {
        width: 44px; height: 44px;
        border-radius: var(--radius-lg);
        background: var(--signal-down-surface);
        display: flex; align-items: center; justify-content: center;
        font-size: 20px;
        color: var(--signal-down);
        margin-bottom: 16px;
    }
    .journal-modal-title {
        font-family: var(--font-ui);
        font-size: 18px;
        font-weight: 700;
        color: var(--ink-primary);
        margin-bottom: 8px;
    }
    .journal-modal-text {
        font-family: var(--font-ui);
        font-size: 12px;
        color: var(--ink-muted);
        line-height: 1.5;
        margin-bottom: 24px;
    }
    .journal-modal-actions {
        display: flex;
        gap: 10px;
        justify-content: flex-end;
    }
    .journal-modal-btn {
        height: 36px;
        padding: 0 18px;
        border-radius: var(--radius-md);
        font-family: var(--font-ui);
        font-size: 12px;
        font-weight: 600;
        cursor: pointer;
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
        border: none;
    }
    .journal-modal-btn-cancel {
        background: var(--surface-hover);
        color: var(--ink-secondary);
        border: 1px solid var(--line);
    }
    .journal-modal-btn-cancel:hover {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }
    .journal-modal-btn-delete {
        background: var(--signal-down-surface);
        color: var(--signal-down);
    }
    .journal-modal-btn-delete:hover {
        background: var(--signal-down-line);
    }

    /* ── New Entry Category Picker ────────────────────────────── */
    .journal-new-picker {
        position: absolute;
        top: 100%;
        right: 0;
        margin-top: 6px;
        background: var(--surface-menu);
        border: 1px solid var(--line);
        border-radius: var(--radius-lg);
        padding: 6px;
        z-index: var(--z-dropdown);
        min-width: 190px;
        box-shadow: var(--shadow-lg);
        backdrop-filter: blur(10px);
        -webkit-backdrop-filter: blur(10px);
        opacity: 0;
        visibility: hidden;
        transform: translateY(-4px);
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
    }
    .journal-new-picker.is-visible {
        opacity: 1;
        visibility: visible;
        transform: translateY(0);
    }
    .journal-new-picker-item {
        display: flex;
        align-items: center;
        gap: 8px;
        padding: 8px 10px;
        border-radius: var(--radius-md);
        cursor: pointer;
        font-family: var(--font-ui);
        font-size: 11px;
        color: var(--ink-secondary);
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
        user-select: none;
    }
    .journal-new-picker-item:hover {
        background: var(--surface-hover);
        color: var(--ink-primary);
    }
    .journal-new-picker-item i {
        font-size: 14px;
        width: 18px;
        text-align: center;
    }

    .image-gallery-overlay {
        position: fixed;
        inset: 0;
        z-index: var(--z-modal-backdrop);
        background: color-mix(in oklab, var(--surface-canvas) 76%, transparent);
        display: none;
        align-items: center;
        justify-content: center;
        opacity: 0;
        transition: opacity var(--dur-fast) var(--ease-out);
    }
    .image-gallery-overlay.is-open {
        opacity: 1;
    }
    .image-gallery-overlay.is-closing {
        opacity: 0;
    }
    .image-gallery-dialog {
        position: relative;
        width: min(92vw, 780px);
        height: min(82vh, 560px);
        border: 1px solid var(--line-strong);
        border-radius: var(--radius-sm);
        background: var(--surface-overlay);
        padding: 36px 52px 44px;
        box-shadow: var(--shadow-lg);
        display: flex;
        align-items: center;
        justify-content: center;
        opacity: 0;
        transform: translate3d(0, 10px, 0) scale(0.96);
        transition:
            transform var(--dur-base) var(--ease-out),
            opacity var(--dur-fast) var(--ease-out);
        will-change: transform, opacity;
    }
    .image-gallery-overlay.is-open .image-gallery-dialog {
        opacity: 1;
        transform: translate3d(0, 0, 0) scale(1);
    }
    .image-gallery-overlay.is-closing .image-gallery-dialog {
        opacity: 0;
        transform: translate3d(0, 8px, 0) scale(0.975);
    }
    .image-gallery-viewport {
        width: 100%;
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        overflow: hidden;
        touch-action: pan-y;
        cursor: zoom-in;
    }
    .image-gallery-viewport img {
        max-width: 100%;
        max-height: 100%;
        object-fit: contain;
        border: 1px solid var(--border-color);
        border-radius: var(--radius-sm);
        background: var(--surface-canvas);
        user-select: none;
        -webkit-user-drag: none;
        transform-origin: center center;
        transition: transform var(--dur-instant) var(--ease-standard);
    }
    .image-gallery-nav {
        position: absolute;
        border: 1px solid var(--line-strong);
        border-radius: var(--radius-md);
        background: color-mix(in oklab, var(--surface-canvas) 72%, transparent);
        color: var(--ink-primary);
        width: 44px;
        height: 44px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        padding: 0;
        cursor: pointer;
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
        z-index: var(--z-local);
    }
    .image-gallery-nav:hover,
    .image-gallery-nav:focus-visible {
        border-color: var(--line-strong);
        background: color-mix(in oklab, var(--surface-canvas) 92%, transparent);
        color: var(--ink-primary);
        outline: none;
    }
    .image-gallery-nav i {
        font-size: 20px;
        --ph-opacity: 0;
    }
    .image-gallery-nav-prev {
        left: 14px;
        top: 50%;
        transform: translateY(-50%);
    }
    .image-gallery-nav-next {
        right: 14px;
        top: 50%;
        transform: translateY(-50%);
    }
    .image-gallery-actions {
        position: absolute;
        top: 12px;
        right: 12px;
        display: flex;
        gap: 8px;
        z-index: var(--z-local);
    }
    .image-gallery-action-btn {
        border: 1px solid var(--line-strong);
        border-radius: var(--radius-md);
        background: color-mix(in oklab, var(--surface-canvas) 72%, transparent);
        color: var(--ink-secondary);
        width: 40px;
        height: 40px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        padding: 0;
        cursor: pointer;
        transition: color var(--dur-instant) var(--ease-standard), background-color var(--dur-instant) var(--ease-standard), border-color var(--dur-instant) var(--ease-standard);
    }
    .image-gallery-action-btn i {
        font-size: 18px;
        --ph-opacity: 0;
    }
    .image-gallery-action-btn:hover,
    .image-gallery-action-btn:focus-visible {
        border-color: var(--line-strong);
        background: color-mix(in oklab, var(--surface-canvas) 92%, transparent);
        color: var(--ink-primary);
        outline: none;
    }
    .image-gallery-delete-btn:hover,
    .image-gallery-delete-btn:focus-visible {
        border-color: var(--signal-down-line);
        background: var(--signal-down-surface);
        color: var(--signal-down);
    }
    .image-gallery-counter {
        position: absolute;
        left: 50%;
        bottom: 14px;
        transform: translateX(-50%);
        font-family: var(--font-label);
        font-size: 11px;
        color: var(--ink-secondary);
        text-transform: uppercase;
        padding: 4px 12px;
        border: 1px solid var(--line-strong);
        border-radius: var(--radius-md);
        background: color-mix(in oklab, var(--surface-canvas) 55%, transparent);
    }

    @media (max-width: 700px) {
        .journal-sidebar { width: 220px; min-width: 220px; }
        .journal-editor { padding: 20px 16px; }
        .image-gallery-dialog {
            width: min(96vw, 780px);
            height: min(78vh, 520px);
            padding: 52px 18px 54px;
        }
        .image-gallery-nav {
            width: 40px;
            height: 40px;
        }
        .image-gallery-nav-prev { left: 8px; }
        .image-gallery-nav-next { right: 8px; }
    }

    /* Journal-AI: zwei Beschriftungen stehen noch in `theme.css` (Schicht
       `legacy`) und kommen dort versal, gesperrt und in der Maschinenschrift
       heraus. „Verlauf" und „Journal-AI" sind Sprache, keine Messwerte (J6).
       Die Altdatei bleibt unangetastet — `channels` schlaegt `legacy`, die
       Gegenregel gehoert hierher.
       `.jai-intro-head` stand zusaetzlich auf `--accent`: der Akzent ist der
       Primaerknopf, keine Ueberschriftfarbe. */
    .jai-topbar-label {
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        letter-spacing: normal;
        text-transform: none;
        color: var(--ink-secondary);
    }
    .jai-intro-head {
        font-family: var(--font-ui);
        font-size: var(--text-sm);
        font-weight: var(--font-weight-medium);
        letter-spacing: normal;
        text-transform: none;
        color: var(--ink-primary);
    }

    /* ====================================================================
       Journal-AI — Positionen, Breiten, Bedienung
       (STEP_03_JOURNAL.md §4.3, Nacharbeit zu Lauf A)

       Drei Befunde auf einmal: der Umschalter lief ueber die volle
       Kanalbreite, die AI-Ansicht ebenso — waehrend der Chat auf
       `--measure-prose` steht —, und die Verlaufswahl war das einzige
       `<select>` im Projekt. Alles drei bekommt hier die Bauweise, die
       Gruppe 2 fuer den Chat festgelegt hat.
       ==================================================================== */

    /* Ein Umschalter ist so breit wie sein Inhalt, nicht wie sein Behaelter.
       240 px ist die Obergrenze aus §9 dieses Schritts. */
    .journal-view-switch-row {
        flex-shrink: 0;
        padding-block: var(--space-3) 0;
        padding-inline: var(--space-4);
        box-sizing: border-box;
    }

    /* Die Eintragsliste bleibt auch in der AI-Ansicht stehen. Sie ist die
       Navigation des Kanals — verschwindet sie beim Umschalten, springt die
       ganze Flaeche und der Weg zurueck zu den Notizen ist weg. Die
       Lesespalte zentriert sich deshalb in dem, was die Liste uebrig
       laesst. */

    /* Der Umschalter bleibt in BEIDEN Ansichten an derselben Stelle. Zog er
       in der AI-Ansicht in die Lesespalte, sprang er beim Umschalten quer
       ueber die Flaeche — die Bedienung wanderte unter dem Zeiger weg. */

    /* ── Optische Mitte ────────────────────────────────────────────────
       Die Lesespalte zentriert sich in dem, was die Eintragsliste uebrig
       laesst — also im Kanal, nicht im Fenster. Neben dem AI-Chat, der
       keine Liste hat, steht sie dadurch sichtbar zu weit rechts. Der
       Innenabstand am Ende schiebt die auto-Zentrierung um die halbe
       Listenbreite nach links: die Spalte liegt dann in der Mitte des
       Fensters. Erst ab genug Breite, sonst wird die Spalte gequetscht. */
    @media (min-width: 1280px) {
        .journal-app .jai-view {
            padding-inline-end: 270px;
            box-sizing: border-box;
        }
    }

    #journal-view-switch {
        inline-size: 240px;
        max-inline-size: 100%;
    }

    /* `shell.css` kennt nur die Chat-Stellung `data-gewaehlt="data"`. Die
       zweite Stellung heisst hier `ai` — dieselbe Bewegung, anderer Name. */
    #journal-view-switch[data-gewaehlt="ai"] .v2-switch-indicator {
        transform: translateX(calc(100% + 2px));
    }

    /* ── Die Lesespalte ────────────────────────────────────────────────
       `70ch` wird an der Schrift DES Elements gemessen, auf dem es steht.
       Ohne die Schriftangabe erbt die Spalte 14 px aus der Shell und wird
       schmaler als die Chatspalte daneben — derselbe Grund wie in
       `chat.css` bei `.chat-stream`. */
    .jai-topbar {
        flex-shrink: 0;
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-wrap: nowrap;
        inline-size: 100%;
        /* Dieselbe Kante wie die Spalte darunter: 70ch plus der Innenabstand,
           den Stream und Eingabe ebenfalls tragen. */
        max-inline-size: calc(var(--measure-prose) + 2 * var(--space-4));
        margin-inline: auto;
        gap: var(--space-2);
        padding-block: var(--space-3) var(--space-2);
        /* Die Haarlinie lief ueber die volle Kanalbreite und zeichnete damit
           eine Kante, die mit der Spalte darunter nichts zu tun hatte (R3). */
        border-bottom: none;
        font-family: var(--font-prose);
        font-size: var(--text-base);
    }

    .jai-stream {
        padding-block: var(--space-2) var(--space-5);
        padding-inline: var(--space-4);
        gap: var(--space-5);
        font-family: var(--font-prose);
        font-size: var(--text-base);
        line-height: var(--line-height-prose);
    }

    /* Die Spalte steht auf den Kindern, nicht auf dem Scroller — sonst
       wandert die Bildlaufleiste in die Mitte der Flaeche. */
    .jai-stream > * {
        inline-size: 100%;
        max-inline-size: var(--measure-prose);
        margin-inline: auto;
    }

    .jai-topbar,
    .jai-composer-container {
        padding-inline: var(--space-4);
        box-sizing: border-box;
    }

    /* Der Einstiegshinweis stand in einer Karte mit gestricheltem Rahmen und
       eigener Kopfzeile — ein Kasten fuer drei Saetze, die niemand beantwortet
       (§4.3). Der Text bleibt, der Kasten geht: Trennung durch Abstand, nicht
       durch Linie (R3). */
    /* Der Fliesstext der AI ist Hauptausgabe, nicht Beiwerk: er steht auf
       `--ink-primary`. Grau bleibt den kleinen Nebentexten vorbehalten
       (Beschriftungen, Verlauf, Hinweise). */
    .jai-intro {
        padding: 0;
        border: none;
        background: transparent;
        color: var(--ink-primary);
        font-family: var(--font-prose);
        font-size: var(--text-base);
        line-height: var(--line-height-prose);
    }

    /* Auch die Antwortkoerper der AI stehen auf der Hauptfarbe — sie sind
       das Ergebnis, nicht die Fussnote. */
    .jai-legacy-body,
    .jai-answer,
    .jai-answer-body {
        color: var(--ink-primary);
    }

    .jai-intro-head {
        margin-bottom: var(--space-2);
    }

    /* ── Die Verlaufswahl ──────────────────────────────────────────────
       Kein `<select>` mehr (STIL.md §5.2): Knopf, Beschriftung, Pfeil —
       derselbe Aufklapper wie die Kategoriewahl im Editor. */
    .jai-history-wrap {
        position: relative;
        min-inline-size: 0;
        flex: 0 1 auto;
    }

    .jai-history-btn {
        display: inline-flex;
        align-items: center;
        gap: var(--space-2);
        max-inline-size: 100%;
        block-size: 32px;
        padding-inline: var(--space-2);
        border: none;
        border-radius: var(--radius-control);
        background: transparent;
        color: var(--ink-secondary);
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        font-weight: var(--font-weight-regular);
        cursor: pointer;
        transition:
            background-color var(--dur-instant) var(--ease-standard),
            color var(--dur-instant) var(--ease-standard),
            transform var(--dur-fast) var(--ease-out);
    }

    @media (hover: hover) and (pointer: fine) {
        .jai-history-btn:hover {
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }

    .jai-history-btn:active { transform: scale(0.97); }

    .jai-history-btn.is-open {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }

    .jai-history-icon,
    .jai-history-caret {
        inline-size: var(--icon-inline);
        block-size: var(--icon-inline);
        color: var(--ink-muted);
    }

    .jai-history-caret {
        transition: transform var(--dur-fast) var(--ease-out);
    }

    .jai-history-btn.is-open .jai-history-caret {
        transform: rotate(180deg);
        color: var(--ink-primary);
    }

    .jai-history-label {
        min-inline-size: 0;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    .jai-history-menu {
        position: absolute;
        inset-block-start: calc(100% + 4px);
        inset-inline-start: 0;
        min-inline-size: 260px;
        max-inline-size: min(360px, 80vw);
        max-block-size: 320px;
        overflow-y: auto;
        padding: var(--space-1);
        border: 1px solid var(--line);
        border-radius: var(--radius-panel);
        background: var(--surface-menu);
        opacity: 0;
        visibility: hidden;
        /* Das Menue waechst aus seinem Ausloeser, nicht aus dem Nichts (§6). */
        transform: scale(0.97);
        transform-origin: top left;
        transition:
            opacity var(--dur-base) var(--ease-out),
            transform var(--dur-base) var(--ease-out),
            visibility 0s linear var(--dur-base);
        z-index: var(--z-dropdown);
    }

    .jai-history-menu.is-visible {
        opacity: 1;
        visibility: visible;
        transform: scale(1);
        transition-delay: 0s;
    }

    .jai-history-item {
        display: block;
        inline-size: 100%;
        padding-block: var(--space-2);
        padding-inline: var(--space-2);
        border: none;
        border-radius: var(--radius-chip);
        background: transparent;
        color: var(--ink-secondary);
        font-family: var(--font-ui);
        font-size: var(--text-xs);
        text-align: left;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        cursor: pointer;
        transition:
            background-color var(--dur-instant) var(--ease-standard),
            color var(--dur-instant) var(--ease-standard);
    }

    @media (hover: hover) and (pointer: fine) {
        .jai-history-item:hover {
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }

    .jai-history-item.is-active {
        background: var(--surface-selected);
        color: var(--ink-primary);
    }

    .jai-history-empty {
        padding-block: var(--space-2);
        padding-inline: var(--space-2);
        color: var(--ink-muted);
        font-family: var(--font-ui);
        font-size: var(--text-xs);
    }

    /* „Neuer Verlauf" war ein Kasten mit Versalien. Jetzt derselbe runde
       Knopf mit `#i-plus` wie in der Chatliste. */
    .jai-new-btn {
        display: inline-flex;
        flex-shrink: 0;
        align-items: center;
        justify-content: center;
        inline-size: 28px;
        block-size: 28px;
        padding: 0;
        border: none;
        border-radius: 999px;
        background: transparent;
        color: var(--ink-secondary);
        cursor: pointer;
        transition:
            background-color var(--dur-instant) var(--ease-standard),
            color var(--dur-instant) var(--ease-standard),
            transform var(--dur-fast) var(--ease-out);
    }

    @media (hover: hover) and (pointer: fine) {
        .jai-new-btn:hover {
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }

    .jai-new-btn:active { transform: scale(0.97); }

    /* ── Die Eingabezeile ──────────────────────────────────────────────
       Bauweise aus `chat.css`: eine Flaeche, Zeile 1 der Text, Zeile 2 die
       Bedienung. Vorher zwei Elemente nebeneinander mit einer Trennlinie
       ueber die volle Kanalbreite. */
    .jai-composer-container {
        flex-shrink: 0;
        padding-block-end: var(--space-4);
    }

    .jai-composer {
        inline-size: 100%;
        max-inline-size: var(--measure-prose);
        margin-inline: auto;
        display: flex;
        flex-direction: column;
        align-items: stretch;
        gap: var(--space-1);
        padding-block: var(--space-2);
        padding-inline: var(--space-3);
        border: 1px solid var(--line);
        border-radius: var(--radius-panel);
        background: var(--surface-composer);
        font-family: var(--font-prose);
        font-size: var(--text-base);
        transition:
            border-color var(--dur-fast) var(--ease-out),
            box-shadow var(--dur-fast) var(--ease-out);
    }

    /* Der Fokus liegt auf der Leiste, nicht auf dem nackten Textfeld —
       sonst zeichnet der Ring einen Kasten mitten in die Flaeche.
       `box-shadow` ist hier ein Zustand, keine ruhende Flaeche (§7). */
    .jai-composer:focus-within {
        border-color: var(--line-focus-soft);
        box-shadow: 0 0 0 1px var(--line-focus-soft);
    }

    .jai-composer-text {
        display: flex;
        min-inline-size: 0;
        padding-block-start: var(--space-1);
    }

    .jai-input {
        flex: 1;
        min-inline-size: 0;
        min-block-size: 32px;
        max-block-size: 200px;
        padding: 0;
        border: none;
        border-radius: 0;
        background: transparent;
        color: var(--ink-primary);
        font-family: var(--font-prose);
        font-size: var(--text-base);
        line-height: var(--line-height-prose);
        resize: none;
    }

    .jai-input:focus {
        outline: none;
        border: none;
    }

    .jai-input::placeholder {
        color: var(--ink-muted);
    }

    .jai-composer-bar {
        display: flex;
        align-items: center;
        justify-content: flex-end;
        gap: var(--space-2);
    }

    /* Das Wort „FRAGEN" in Versalien, fett, auf einer eigenen Flaeche war
       der lauteste Fleck der Ansicht — fuer einen Knopf, den Enter ohnehin
       ausloest. Jetzt nur das Icon, wie Senden im Chat. */
    .jai-send {
        display: inline-flex;
        align-items: center;
        justify-content: center;
        inline-size: 32px;
        min-inline-size: 32px;
        block-size: 32px;
        padding: 0;
        border: none;
        border-radius: var(--radius-control);
        background: transparent;
        color: var(--ink-secondary);
        cursor: pointer;
        transition:
            background-color var(--dur-instant) var(--ease-standard),
            color var(--dur-instant) var(--ease-standard),
            transform var(--dur-fast) var(--ease-out);
    }

    @media (hover: hover) and (pointer: fine) {
        .jai-send:hover {
            background: var(--surface-hover);
            color: var(--ink-primary);
        }
    }

    .jai-send:active { transform: scale(0.97); }

    /* Ohne Flaeche traegt die Farbe des Icons den Zustand allein — ein
       halbdurchsichtiges Icon faellt unter den Lesekontrast. */
    .jai-send[disabled] {
        opacity: 1;
        color: var(--ink-muted);
        background: transparent;
        cursor: not-allowed;
    }

    .jai-send[disabled]:active { transform: none; }

    @media (prefers-reduced-motion: reduce) {
        .jai-history-menu {
            transition:
                opacity var(--dur-fast) var(--ease-out),
                visibility 0s linear var(--dur-fast);
            transform: none;
        }
        .jai-history-menu.is-visible { transform: none; }
        .jai-history-caret { transition: none; }
    }
}

@layer channels {
    .content-body:has(.journal-app) { container: journal / inline-size; }
    .journal-mobile-nav { display: none; }
    @container journal (max-width: 700px) {
        .journal-app { flex-direction: column; min-width: 0; }
        .journal-mobile-nav { display: flex; flex-shrink: 0; gap: 4px; padding: 8px 0; }
        .journal-mobile-nav button { flex: 1; min-width: 0; min-height: 44px; padding: 8px; border: 0; border-radius: var(--radius-control); background: transparent; color: var(--ink-secondary); font-size: 13px; }
        .journal-app:not(.is-ai-view)[data-mobile-page="list"] .journal-mobile-nav button:first-child,
        .journal-app:not(.is-ai-view)[data-mobile-page="editor"] .journal-mobile-nav button:nth-child(2),
        .journal-app.is-ai-view .journal-mobile-nav button:last-child { background: var(--control-selected); color: var(--ink-primary); }
        .journal-app .journal-sidebar { width: 100%; min-width: 0; flex: 1; min-height: 0; border: 0; }
        .journal-app .journal-main { width: 100%; min-width: 0; min-height: 0; }
        .journal-app:not(.is-ai-view)[data-mobile-page="list"] .journal-main,
        .journal-app[data-mobile-page="editor"] .journal-sidebar,
        .journal-app.is-ai-view .journal-sidebar { display: none; }
        .journal-view-switch-row { display: none; }
        .journal-editor { padding: 12px 4px; }
        .journal-title-input { font-size: 23px; }
        .journal-meta { flex-wrap: wrap; }
        .journal-app .jai-view { padding-inline: 0; min-width: 0; }
        .jai-history-trigger { min-inline-size: 0; max-inline-size: 100%; }
        .jai-toolbar { flex-wrap: wrap; }
        .jai-composer-container { padding-bottom: max(8px, env(safe-area-inset-bottom)); }
        .jai-composer-actions { flex-wrap: wrap; }
        .journal-feature-row { flex-direction: column; }
        .journal-selection-toolbar { max-width: calc(100vw - 24px); overflow-x: auto; }
    }
    @media (pointer: coarse) {
        .journal-app :is(input, textarea, [contenteditable="true"]) { font-size: 16px; }
        .journal-app button, .journal-app [role="button"], .journal-tree-item { min-height: 44px; }
        .journal-app .journal-new-btn, .journal-app .jai-new-btn, .journal-app .jai-send { min-width: 44px; min-height: 44px; }
        .journal-entry-delete { opacity: 1; }
    }
}
