/*
 * announcement-body.css
 * ----------------------------------------------------------------------------
 * 用途:
 *   お知らせ本文 HTML の共通スタイルシート。
 *   編集側（Blazored.TextEditor 内 Quill エディタ、および詳細プレビュー）と
 *   閲覧側（NoticeDropdown iframe srcdoc、IframeSrcDocBuilder.Build が生成）の
 *   双方が同一定義を共有し、本文の見た目を媒体間で等価に保つ。
 *
 * 読み込み順序（index.html / iframe srcdoc 共通の方針）:
 *   Quill quill.snow.css → Quill quill.bubble.css → MudBlazor.min.css
 *     → 本 announcement-body.css → Unifinity.Unibaas.Spa.styles.css
 *   このファイルは Quill 標準テーマ (.ql-editor) より後に読み込まれ、
 *   .announcement-body スコープの規則が後勝ちで上書きする前提で書く。
 *
 * 設計原則:
 *   - すべての規則は .announcement-body をルートとしてスコープする。
 *   - HtmlSanitizer の許可タグ（a, b, br, code, div, em, h1-h6, hr, i, img,
 *     li, ol, p, pre, small, span, strong, sub, sup, table, tbody, td, tfoot,
 *     th, thead, tr, u, ul）のみで一貫した体裁が成立するよう定義する。
 *     任意のクラス名・未許可タグへは依存しない（Req 6.7）。
 *   - 親アプリ MudBlazor グローバル CSS の流入は、冒頭の all: revert
 *     リセットでブロックする（Req 6.6）。
 *   - 編集側 / 閲覧側で同一ファイルから供給するため、片側固有の分岐は
 *     書かない（Req 6.5）。
 *
 * 既存 src/wwwroot/css/app.css とは独立に動作する。
 * app.css は管理画面シェル全体の体裁を担い、announcement-body.css は
 * .announcement-body 配下のお知らせ本文のみを担当する。
 * ----------------------------------------------------------------------------
 */

/* -------------------------------------------------------------------------- */
/* リセット: 親アプリ（MudBlazor / MainLayout）からのスタイル流入を遮断する。   */
/* `all: revert` で .announcement-body 自身と子孫の継承を一旦ブラウザ既定に    */
/* 戻したうえで、以降の規則で意図する体裁を明示的に積み上げる。                */
/* -------------------------------------------------------------------------- */
.announcement-body,
.announcement-body * {
    all: revert;
    box-sizing: border-box;
}

.announcement-body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue",
        "Hiragino Sans", "Noto Sans CJK JP", "Yu Gothic", Meiryo, sans-serif;
    font-size: 14px;
    line-height: 1.6;
    /* MudBlazor の CSS 変数を使い、ダークテーマ自動追従。
       iframe srcdoc (NoticeDropdown) では MudBlazor 変数が無いためフォールバック色を使う。 */
    color: var(--mud-palette-text-primary, #212121);
    word-wrap: break-word;
    overflow-wrap: break-word;
}

/* -------------------------------------------------------------------------- */
/* 見出し: h1〜h6 のフォントサイズ階層と上下マージン                            */
/* -------------------------------------------------------------------------- */
.announcement-body h1,
.announcement-body h2,
.announcement-body h3,
.announcement-body h4,
.announcement-body h5,
.announcement-body h6 {
    font-weight: 600;
    line-height: 1.3;
    margin: 1.2em 0 0.6em;
    color: var(--mud-palette-text-primary, #1a1a1a);
}

.announcement-body h1 { font-size: 1.875rem; }
.announcement-body h2 { font-size: 1.5rem; }
.announcement-body h3 { font-size: 1.25rem; }
.announcement-body h4 { font-size: 1.125rem; }
.announcement-body h5 { font-size: 1rem; }
.announcement-body h6 { font-size: 0.875rem; }

.announcement-body h1:first-child,
.announcement-body h2:first-child,
.announcement-body h3:first-child,
.announcement-body h4:first-child,
.announcement-body h5:first-child,
.announcement-body h6:first-child {
    margin-top: 0;
}

/* -------------------------------------------------------------------------- */
/* 段落: p の行間と上下マージン                                                 */
/* -------------------------------------------------------------------------- */
.announcement-body p {
    margin: 0 0 0.8em;
    line-height: 1.6;
}

.announcement-body p:last-child {
    margin-bottom: 0;
}

/* -------------------------------------------------------------------------- */
/* リスト: ul / ol / li のインデントとマーカー                                  */
/* -------------------------------------------------------------------------- */
.announcement-body ul,
.announcement-body ol {
    margin: 0.4em 0 0.8em;
    padding-left: 1.75em;
}

.announcement-body ul {
    list-style-type: disc;
}

.announcement-body ol {
    list-style-type: decimal;
}

.announcement-body li {
    margin: 0.2em 0;
    line-height: 1.6;
}

.announcement-body li > ul,
.announcement-body li > ol {
    margin: 0.2em 0 0.2em;
}

/* -------------------------------------------------------------------------- */
/* 表: table / thead / tbody / tr / th / td の罫線と padding                    */
/* -------------------------------------------------------------------------- */
.announcement-body table {
    border-collapse: collapse;
    border-spacing: 0;
    width: auto;
    max-width: 100%;
    margin: 0.8em 0;
    font-size: inherit;
}

.announcement-body thead {
    background-color: var(--mud-palette-background-gray, #f5f5f5);
}

.announcement-body tbody {
    background-color: transparent;
}

.announcement-body tr {
    border-bottom: 1px solid var(--mud-palette-table-lines, #e0e0e0);
}

.announcement-body th,
.announcement-body td {
    border: 1px solid var(--mud-palette-table-lines, #e0e0e0);
    padding: 0.5em 0.75em;
    text-align: left;
    vertical-align: top;
}

.announcement-body th {
    font-weight: 600;
    background-color: var(--mud-palette-background-gray, #fafafa);
}

/* -------------------------------------------------------------------------- */
/* リンク: a のリンク色と underline                                              */
/* -------------------------------------------------------------------------- */
.announcement-body a {
    color: var(--mud-palette-primary, #1976d2);
    text-decoration: underline;
    text-underline-offset: 0.15em;
}

.announcement-body a:hover {
    color: var(--mud-palette-primary-darken, #1565c0);
    text-decoration: underline;
}

.announcement-body a:visited {
    color: var(--mud-palette-tertiary, #6a1b9a);
}

/* -------------------------------------------------------------------------- */
/* 強調: strong / em / b / i / u                                                */
/* -------------------------------------------------------------------------- */
.announcement-body strong,
.announcement-body b {
    font-weight: 700;
}

.announcement-body em,
.announcement-body i {
    font-style: italic;
}

.announcement-body u {
    text-decoration: underline;
    text-underline-offset: 0.15em;
}

/* -------------------------------------------------------------------------- */
/* コード: code（インライン）と pre（ブロック）                                  */
/* -------------------------------------------------------------------------- */
.announcement-body code,
.announcement-body pre {
    font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo,
        "Courier New", monospace;
    font-size: 0.9em;
    /* インラインコード / pre のテキストは目立たせるためエラー系の赤を用いる。
       ダークテーマでは赤が暗背景に沈むため、prefers-color-scheme で明るい赤に切替 */
    color: #c7254e;
}

@media (prefers-color-scheme: dark) {
    .announcement-body code,
    .announcement-body pre {
        color: #ff8aa4;
    }
}

.announcement-body code {
    background-color: var(--mud-palette-background-gray, #f5f5f5);
    padding: 0.15em 0.35em;
    border-radius: 3px;
}

.announcement-body pre {
    display: block;
    background-color: var(--mud-palette-background-gray, #f5f5f5);
    color: var(--mud-palette-text-primary, #212121);
    padding: 0.75em 1em;
    margin: 0.8em 0;
    border-radius: 4px;
    overflow-x: auto;
    line-height: 1.5;
    white-space: pre;
}

.announcement-body pre code {
    background-color: transparent;
    color: inherit;
    padding: 0;
    border-radius: 0;
    font-size: inherit;
}

/* -------------------------------------------------------------------------- */
/* 水平線: hr の境界線                                                          */
/* -------------------------------------------------------------------------- */
.announcement-body hr {
    border: 0;
    border-top: 1px solid var(--mud-palette-divider, #e0e0e0);
    margin: 1.2em 0;
    height: 0;
    display: block;
}

/* -------------------------------------------------------------------------- */
/* 画像: img の最大幅追従                                                       */
/* base64 data URI 画像、外部 URL 画像のいずれもコンテナ幅に追従させ、          */
/* 縦横比を維持する。                                                            */
/* -------------------------------------------------------------------------- */
.announcement-body img {
    max-width: 100%;
    height: auto;
    display: inline-block;
    vertical-align: middle;
}

/* -------------------------------------------------------------------------- */
/* 補助タグ: sub / sup / small / span / div / br                                */
/* HtmlSanitizer 許可タグのうち、上で個別定義していないものを最低限整える。      */
/* -------------------------------------------------------------------------- */
.announcement-body sub {
    vertical-align: sub;
    font-size: 0.75em;
}

.announcement-body sup {
    vertical-align: super;
    font-size: 0.75em;
}

.announcement-body small {
    font-size: 0.85em;
}

/* -------------------------------------------------------------------------- */
/* 編集側エディタ (Blazored.TextEditor / Quill) の入力領域最小高さ              */
/* Quill 標準の .ql-editor は内容に応じて伸縮するが既定では数行分しかなく、     */
/* お知らせ本文編集には狭すぎるため、`.announcement-body` スコープ内のみで      */
/* 最小高さを確保する（閲覧側 iframe の本文表示には影響しない）。               */
/* -------------------------------------------------------------------------- */
.announcement-body .ql-container .ql-editor {
    min-height: 240px;
    max-height: 480px;
    overflow-y: auto;
    /* 本ファイル冒頭の `.announcement-body * { all: revert; }` リセットが
       Quill 標準 (snow.css) の .ql-editor padding (12px 15px) を消すため、
       左右余白を明示的に再付与する。これが無いとテキスト開始位置が
       container border に接し、行頭のキャレットが border の影に隠れて
       視認できなくなる。 */
    padding: 12px 16px;
    /* ダークテーマで Quill 標準の白背景が浮かないように透過にし、
       配下の MudPaper / Dialog 背景に追従させる。 */
    background-color: transparent;
}

/* -------------------------------------------------------------------------- */
/* Safari (WebKit) 入力不可対策                                                 */
/*                                                                              */
/* `.announcement-body *` への `all: revert` リセットは MudBlazor グローバル     */
/* CSS の流入を断つために必要だが、contenteditable 配下の `user-select` /        */
/* `-webkit-user-select` も巻き戻すため、Safari では既定値（非 contenteditable    */
/* テキスト同等）に倒れて Quill 領域への文字入力が無視される。Chrome /          */
/* Firefox は `text` に解決されるため発症しないが、Safari/WebKit ではキー        */
/* イベント到達後の selection モデルが破綻し、キャレット移動も入力も             */
/* 反映されない。`-webkit-user-modify`, `-webkit-touch-callout`, `cursor` も     */
/* 同様に再付与する。                                                            */
/* -------------------------------------------------------------------------- */
.announcement-body .ql-container .ql-editor,
.announcement-body .ql-container .ql-editor * {
    -webkit-user-select: text;
    user-select: text;
}

.announcement-body .ql-container .ql-editor[contenteditable="true"] {
    -webkit-user-modify: read-write;
    -webkit-touch-callout: default;
    cursor: text;
}

/* -------------------------------------------------------------------------- */
/* 編集側エディタ (Blazored.TextEditor / Quill) のカーソル / focus 視認性       */
/* Quill 標準スタイルではカーソル色や focus アウトラインが弱く、ダーク背景     */
/* やマウス操作時に現在のキャレット位置を見失いやすいため、明示的に強調する。   */
/* 閲覧側 iframe には .ql-* クラスが存在しないため影響しない。                  */
/* -------------------------------------------------------------------------- */
/* caret-color は CSS 継承プロパティだが、Quill が内部で挿入する <p> / <br> /
   <li> / <ol> 等の子要素で `caret-color: auto` に上書きされ、エンターキーで
   改行した直後にキャレットが見えなくなる事象が観測された。エディタ配下の
   すべての要素で一律に visible にするため子孫セレクタを併用する。
   色は MudBlazor text-primary 変数でテーマに追従させる（ダーク時は明色）。 */
.announcement-body .ql-container .ql-editor,
.announcement-body .ql-container .ql-editor * {
    caret-color: var(--mud-palette-text-primary, #212121);
}

.announcement-body .ql-container.ql-snow {
    border: 1px solid var(--mud-palette-action-default, rgba(0, 0, 0, 0.23));
    border-radius: 4px;
    transition: border-color 120ms ease-in-out;
}

.announcement-body .ql-container.ql-snow:focus-within {
    border-color: var(--mud-palette-primary, #1976d2);
    box-shadow: 0 0 0 1px var(--mud-palette-primary, #1976d2);
}

.announcement-body .ql-toolbar.ql-snow {
    border: 1px solid var(--mud-palette-action-default, rgba(0, 0, 0, 0.23));
    border-bottom: none;
    border-radius: 4px 4px 0 0;
    /* Quill 標準テーマは白背景固定。ダーク時に MudDialog の暗背景上で
       ツールバーだけ白浮きするのを防ぐため、surface に追従させる。 */
    background-color: var(--mud-palette-surface, transparent);
}

/* Quill ツールバーのアイコン色 (SVG stroke / fill) もテーマに追従させる。
   既定では black が焼き込みされており、ダーク時にアイコンが見えなくなる。 */
.announcement-body .ql-toolbar.ql-snow .ql-stroke {
    stroke: var(--mud-palette-text-primary, #444);
}
.announcement-body .ql-toolbar.ql-snow .ql-fill,
.announcement-body .ql-toolbar.ql-snow .ql-picker-label::before,
.announcement-body .ql-toolbar.ql-snow .ql-picker {
    color: var(--mud-palette-text-primary, #444);
    fill: var(--mud-palette-text-primary, #444);
}
.announcement-body .ql-toolbar.ql-snow .ql-picker-options {
    background-color: var(--mud-palette-surface, #ffffff);
    color: var(--mud-palette-text-primary, #444);
    border-color: var(--mud-palette-action-default, rgba(0, 0, 0, 0.23));
}
.announcement-body .ql-toolbar.ql-snow button:hover .ql-stroke,
.announcement-body .ql-toolbar.ql-snow button.ql-active .ql-stroke {
    stroke: var(--mud-palette-primary, #1976d2);
}
.announcement-body .ql-toolbar.ql-snow button:hover .ql-fill,
.announcement-body .ql-toolbar.ql-snow button.ql-active .ql-fill {
    fill: var(--mud-palette-primary, #1976d2);
}

.announcement-body .ql-container.ql-snow {
    border-top: none;
    border-radius: 0 0 4px 4px;
}

/* placeholder (空状態) のテキストもテーマ追従させる。Quill 標準の灰色は
   ダーク背景で著しく視認性が落ちるため、text-secondary に追従。 */
.announcement-body .ql-editor.ql-blank::before {
    color: var(--mud-palette-text-secondary, rgba(0, 0, 0, 0.6));
    font-style: normal;
}

/* -------------------------------------------------------------------------- */
/* お知らせタイトル (NoticeDropdown iframe 側で IframeSrcDocBuilder が             */
/* `<h1 class="announcement-title">` として本文先頭に挿入)                       */
/* 本文中の `<h1>` 階層と区別するため、別 class で独立スタイルを定義する。        */
/* -------------------------------------------------------------------------- */
.announcement-body h1.announcement-title {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--mud-palette-text-primary, #1a1a1a);
    margin: 0 0 1em;
    padding-bottom: 0.5em;
    border-bottom: 1px solid var(--mud-palette-divider, rgba(0, 0, 0, 0.12));
    line-height: 1.3;
}
