/*  바탕 — 부품
 *  ─────────────────────────────────────────────────────────────────
 *  단추 · 필드 · 링크 · 알림. 화면마다 손으로 짓지 않게 하는 자리다.
 *
 *  폐하께서 2026-08-28 에 짚으셨다 —
 *
 *    「앰버님도 오이북에서 작업하실 때 컨트롤이나 링크 하나 붙이면
 *     기본 글자 링크로 나와서 몇 번씩 수정하게 되는데」
 *
 *  ★ 부품이 있으면 «이름을 고를 일 자체»가 없어진다. 틀리게 지을 수가 없다.
 *
 *  ── 얹는 차례 ──────────────────────────────────────────────────────
 *
 *      themes/<브랜드>.css  →  base.css  →  프로젝트 제 파일
 *
 *  ★ 테마가 «먼저»다. 이 파일은 색도 크기도 «값»을 갖지 않는다 — 테마가 준
 *    이름만 딛는다. 그래야 같은 부품이 가람의 물빛과 오이북의 초록을 함께 받는다.
 *  ★ 뒤엣것이 이긴다. 프로젝트가 한 자리를 달리 하고 싶으면 제 파일에 적으면
 *    되고, 이 파일을 고칠 일이 아니다.
 *  ★ 받아 온 사본은 고치지 않는다. 고치면 다음에 받을 때 사라진다.
 *
 *  ── 이름을 새로 짓지 않았다 ────────────────────────────────────────
 *
 *  ★★ 여기 있는 클래스 이름은 모두 가람 app.css 에 «이미 있던 것»이다. 새 이름을
 *     지으면 그 이름을 쓰는 화면 아흔한 개를 전부 고쳐야 한다. 부품을 들이는 값이
 *     화면을 갈아엎는 값보다 커지면 아무도 안 들인다.
 *
 *  ── ★★★ 색보다 «크기»가 먼저 어긋난다 ──────────────────────────────
 *
 *  2026-08-28 오이북을 재다가 알았다. 오이북은 조부모가 폰으로 쓰는 판이라
 *  html 기본 글자가 18px 이고, 누르는 것은 --touch(3rem)보다 작아지지 않는다.
 *  이 파일이 9px·14px 를 «박고» 있으면 그 약속이 «조용히» 깨진다.
 *  색이 틀리면 눈에 띄어 누가 잡아 주지만, 단추가 37px 인 것은 아무도 못 본다.
 *  그래서 크기도 전부 테마가 준다.
 */

/* ══ 부품이 서려면 먼저 깔려야 하는 것 ═══════════════════════════════ */

/*
   여백·테두리를 너비에 «포함»시킨다.

   ★★ 이것이 없으면 아래 .field 의 입력칸이 카드를 벗어난다. width:100% 에
      좌우 여백과 테두리가 «더해져» 넘치고, .form-row 처럼 두 칸을 나란히 둔
      자리에서는 옆 칸을 올라탄다.

   ★ 가람 app.css 에는 이 줄이 이미 있었다. 부품만 떼어 오면서 이것을 두고
     왔더니, 가람에서는 멀쩡하고 «가람 밖에서만» 터지는 꼴이 되었다.
     폐하께서 2026-08-28 미리보기에서 잡아 주셨다.

   ★ 그러니 이 줄은 각 프로젝트가 아니라 «바탕»이 지고 있어야 한다.
     부품은 제가 딛고 선 바닥을 함께 안고 가야 한다 — 안 그러면 「우리 쪽에서만
     안 된다」가 되고, 그것이 가장 찾기 어려운 고장이다.
*/
*, *::before, *::after {
    box-sizing: border-box;
}

/* ── 부품이 딛고 선 «바닥» ───────────────────────────────────────────────
   ★★ 초기화 «전부»가 바탕 것은 아니다. 이 물음이면 갈린다 —

       「남의 틀(부트스트랩 따위)을 걷었을 때 «바탕 부품»이 달라 보이는가?」

     그렇다면 그것은 부품이 딛고 선 바닥이고 «바탕이 진다».
     아니면 그 프로젝트의 «글결»이고 «그쪽이 진다».

   ★ 2026-09-04 에 앰버님이 오이북에서 부트스트랩을 «걷고» 규칙마다 재어 갈라 주셨다 —
       담을 것    button·input·select·textarea 의 글꼴 물림      ← 부품이 달라 보인다
       안 담을 것  h1..h6 여백 · p 여백 · .lead · label           ← 바탕 부품 «바뀐 것 없음»
     ★ 뒤엣것을 바탕이 지면 «네 브랜드의 글결»을 내가 정해 버린다. 안 진다.

   ★★★ 맨바닥에서 재어 보니(부트스트랩 없이 바탕만) 이랬다 —
       맨 <input>    Arial · 13.33px      ← 글꼴을 «물려받지 않는다»
       <textarea>    monospace · 6px
     부트스트랩이 그동안 이것을 해 주고 있었다. 걷으면 «.field 밖» 칸이 다 그리로 돌아간다.

   ★ font 는 «줄임말»이다 — style·variant·weight·size·line-height·family 를 한꺼번에
     정한다(앰버님이 짚어 주셨다). 그러니 크기를 따로 주는 부품 규칙은 «이 줄 뒤»에
     와야 한다. 이 파일에서는 아래 부품들이 다 뒤에 있으므로 안전하다.
   ★ 놓는 자리가 값의 일부다 — 앰버님이 이 결의 것을 «뒤»에 놓았다가 amber.css 까지
     덮어 글칸이 10px 커졌다. 바닥은 «맨 앞»이다. */
button,
input,
optgroup,
select,
textarea {
    font: inherit;
    color: inherit;
}

/* ══ 단추 ══════════════════════════════════════════════════════════ */

/*  ★★갈래를 고르는 것은 «색을 고르는 것»이 아니라 ★«뜻을 고르는 것»이다 —
 *    .btn-primary 는 «하는 것» · .btn-ghost 는 «그만두는 것».
 *    ⇒ 그래서 「무슨 색으로 할까」가 아니라 ★「이 단추가 무엇을 하는가」로 고른다.
 *
 *  ★이 문장은 2026-09-17 에 ★아람님이 주신 것이다. 그전에는 여기 「갈래를 안 고르면
 *    «꼴»만 선다」까지만 적혀 있었다 — «밟으면 어떻게 되는지»는 말하는데
 *    ★«그러니 어떻게 고르라»를 안 말했다. 그래서 아람님이 class="btn-primary" 를
 *    ★칠로만 읽고 적으셨을 때 이 주석이 «막아 주지 못했다».
 *    ⇒ ★읽어도 안 걸리는 문장은 «적혀 있어도 없는 것»이다. 그래서 고쳐 적는다.
 *
 *  ★쓰는 꼴 — ★둘을 «함께» 적는다. 가람(Ruby.Ui)에서 2026-09-17 에 재어 보니 —
 *      class="btn btn-primary"  118곳
 *      class="btn btn-ghost"    180곳
 *      ★class="btn-primary" 만 적은 곳  ★0곳   ⇒ 이 집은 이미 «함께» 적고 있다
 *
 *  ★★이 숫자를 아람님이 주신 것(109 · 닫기·취소 11)과 «맞대어» 보았더니 달랐다.
 *    뒤엣것은 ★«무엇의» 숫자인가가 다르다 — 아람님 11 은 「닫기·취소」라는 ★«뜻»의 수이고,
 *    내 180 은 btn-ghost 라는 ★«이름»의 수다. 둘 다 안 틀렸고 ★낱이 다르다.
 *    ⇒ 이 집의 규칙 그대로다 — ★숫자를 쓸 때는 «무엇의» 숫자인지 함께 적는다. */
/*! 쓰임 .btn — 단추의 «꼴»만 준다 — 색은 안 준다. ★맨 .btn 만 쓰면 투명하다. 갈래를 «반드시» 함께 고른다 (primary=하는 것 · ghost=그만두는 것) */
.btn {
    display: inline-flex;
    /* ★★ 갈래를 안 고르면 «꼴»만 선다 — 칠하는 것은 갈래다(.btn-primary · .btn-ghost …).
       2026-09-04 에 재어 보니 이 자리가 비어 있어 «브라우저 기본 회색»(rgb(240,240,240))이
       들어와 있었다. 남의 틀이 깔려 있는 동안은 그것이 덮어 주어 안 보였다.
       ★ 중립 단추가 필요하면 .btn-ghost 다 — 그것이 면과 테두리를 준다.
         맨 .btn 이 중립까지 겸하면 .btn-ghost 가 할 일이 없어진다. */
    background: transparent;
    color: inherit;
    align-items: center;
    gap: var(--gap-sm);
    border: 1px solid transparent;
    border-radius: var(--radius);
    padding: var(--ctl-pad);
    font-size: var(--ctl-font);
    font-weight: 600;
    font-family: inherit;
    cursor: pointer;
    text-decoration: none;
    line-height: 1.2;
    /* ★ 단추 글자는 쪼개지지 않는다. 좁은 자리에서 두 줄이 되면 단추가
       눌린 것처럼 보인다 — 「규칙대로」 가 「규칙대/로」 가 되었다. */
    white-space: nowrap;
    /* ★★ 손가락으로 누르는 최소 크기. 테마가 정한다 —
       가람은 auto(안 씀), 오이북은 3rem(「이보다 작으면 조부모가 못 누른다」). */
    min-height: var(--touch);
    transition: filter .15s ease, box-shadow .15s ease;
}

/*
   못 누르는 단추.

   예전에는 opacity 만 낮췄다. 그러면 강조색 바탕 위 흰 글씨가 같이 옅어져
   '남기기' 가 배경에 묻히고, 그림자만 남아 색이 깨진 것처럼 보였다.
   흐리게 하는 대신 회색으로 눕힌다 — 아직 못 누른다는 뜻은 드러나되 글씨는 읽힌다.
*/
.btn:disabled {
    background: var(--surface-2);
    background-image: none;
    color: var(--faint);
    border-color: var(--border);
    box-shadow: none;
    cursor: not-allowed;
}

/*! 쓰임 .btn-primary — 그 화면에서 «하려는 일» 하나. 한 화면에 하나만 */
.btn-primary {
    background: linear-gradient(100deg, var(--accent) 0%, var(--accent-2) 100%);
    color: var(--on-accent);
    box-shadow: var(--shadow-accent);
}

.btn-primary:hover:not(:disabled) {
    filter: brightness(1.07);
    color: var(--on-accent);
    box-shadow: var(--shadow-accent-lift);
}

/*! 쓰임 .btn-ghost — 중립 단추. 면과 테두리를 준다 — 「돌아가기·닫기」처럼 일이 아닌 것 */
.btn-ghost {
    background: var(--surface);
    border-color: var(--border-strong);
    color: var(--ink-soft);
}

.btn-ghost:hover:not(:disabled) {
    background: var(--accent-mist);
    border-color: var(--accent);
    color: var(--accent-ink);
}

/*
   줄 끝에 붙는 작은 단추.

   보통 단추를 표 안에 넣으면 줄 높이가 늘어 목록이 성기어 보인다.
   목록에서 '고치기·접기'처럼 곁에 두는 것만 이 크기를 쓴다.
*/
/*! 쓰임 .btn-sm — 목록·표 «줄 끝»에 붙는 작은 단추. 보통 단추를 표에 넣으면 줄이 성겨진다 */
.btn-sm {
    padding: var(--ctl-pad-sm);
    font-size: var(--ctl-font-sm);
    border-radius: var(--radius-sm);
    /* ★ 글자를 쪼개지 않는다. 좁은 자리에 두면 「새 상표」 가 「새 상/표」 로
       두 줄이 되어 단추가 눌린 것처럼 보인다(폐하께서 겪으셨다 2026-08-21).
       옆 칸이 flex 로 늘어날 때 이 단추가 먼저 눌리는 것도 함께 막는다. */
    white-space: nowrap;
    flex: 0 0 auto;
}

/*! 쓰임 .btn-block — 폭을 꽉 채운다. 폰의 마지막 단추·로그인처럼 하나만 있는 자리 */
.btn-block {
    width: 100%;
    justify-content: center;
    padding: var(--ctl-pad-block);
}

/*  지우기 단추.
 *  ★★ 글자색이 --on-accent 가 «아니다». 2026-08-29 에 서가유산 밝은 판을 짓다가
 *     드러났다 — 강조색 위 글자를 먹빛으로 뒤집으니 «붉은 단추 글자까지» 먹빛이
 *     되어 3.11 로 무너졌다. 한 이름이 두 자리를 겸하고 있었던 것이다.
 *  ★ 「무엇 위에 얹히는 글자인가」가 다르면 이름도 달라야 한다. */
/*! 쓰임 .btn-danger — 되돌릴 수 없는 일을 «단추 꼴»로. 눈이 먼저 가도 되는 자리에만 */
.btn-danger {
    background: var(--danger);
    color: var(--on-danger);
    border-color: var(--danger);
}

.btn-danger:hover:not(:disabled) {
    filter: brightness(1.08);
    color: var(--on-danger);
}

/* 지우기처럼 되돌릴 수 없는 일. 단추 꼴을 안 주어 눈이 먼저 가지 않게 한다 */
/*! 쓰임 .btn-danger-link — 되돌릴 수 없는 일인데 «눈이 먼저 가면 안 되는» 자리. 단추 꼴을 안 준다 */
.btn-danger-link {
    display: inline-flex;
    align-items: center;
    white-space: nowrap;
    gap: var(--gap-sm);  /* ★2026-09-07 사다리에 얹음(5→6). 폐하께서 보시고 이르심 */
    background: none;
    border: none;
    color: var(--danger);
    font-size: var(--link-font);
    font-weight: 600;
    cursor: pointer;
    padding: var(--link-pad);
    border-radius: var(--radius-sm);
}

.btn-danger-link:hover:not(:disabled) {
    background: var(--danger-soft);
}

.btn-danger-link:disabled {
    opacity: .45;
    cursor: not-allowed;
}

/*! 쓰임 .icon-only — 그림만 있는 단추. ★`.visually-hidden` 으로 «이름을 반드시» 함께 준다 */
.btn-danger-link.icon-only {
    padding: var(--gap-sm);  /* ★2026-09-07 사다리에 얹음(5→6). 폐하께서 보시고 이르심 */
    gap: 0;
}

/* 바깥 서비스로 들어가는 단추 (구글·마이크로소프트 …) */
/*! 쓰임 .btn-provider — 바깥 서비스로 들어가는 단추 (구글·마이크로소프트 …) */
.btn-provider {
    background: var(--surface);
    border-color: var(--border-strong);
    color: var(--ink);
    gap: var(--gap-lg);  /* ★2026-09-07 사다리에 얹음(9→10). 폐하께서 보시고 이르심 */
    font-weight: 650;
}

.btn-provider:hover:not(:disabled) {
    background: var(--accent-mist);
    border-color: var(--accent);
}

/* ══ 필드 ══════════════════════════════════════════════════════════ */

/*! 쓰임 .field — ★세로 폼 한 칸 — label + input/select/textarea 를 «감싼다». 제 아래 여백을 진다 */
.field {
    display: flex;
    flex-direction: column;
    gap: var(--gap-sm);
    margin-bottom: var(--gap-block);
}

.field label {
    font-size: var(--label-font);
    font-weight: 600;
    color: var(--ink-soft);
}

.field input,
.field select,
.field textarea,
/*  ★.select-bare — `.field` «밖»에 홀로 서는 고르개. 2026-09-18 에 섰다.
 *    상자는 여기서 받고, 옷 벗기기와 화살표는 아래 `.field select` 규칙에서 받는다.
 *    ★폭만 안 받는다 — 바로 아래에서 되돌린다. 까닭은 거기 적었다. */
.select-bare {
    font-family: inherit;
    font-size: var(--field-font);
    padding: var(--field-pad);
    border: 1px solid var(--border-strong);
    border-radius: var(--radius);
    background: var(--surface);
    color: var(--ink);
    width: 100%;
    /* 누르는 자리라 단추와 같은 약속을 받는다 */
    min-height: var(--touch);
    /* 폰에서 키보드가 올라올 때 입력칸이 가려지지 않게 */
    /* ★px 가 옳다 — 폰 자판이 가리지 않게 «띄우는 거리»다. 글자를 키워도 자판은 안 커진다(⑮). 2026-09-14 판정 */
    scroll-margin-block: 90px;
}

/*  ★★ `.select-bare` 는 «줄을 채우지» 않는다 — 위에서 받은 width:100% 를 되돌린다.
 *
 *  ★ 까닭 — 이것이 서는 자리는 «줄 안»이다(거르개 줄 · 표 머리 · 칸 줄).
 *    거기서 100% 를 쥐면 옆엣것을 다 밀어낸다.
 *  ★★ 이 저장소에서 «여섯 번» 같은 자리를 만났다 — .btn-social(width:100%) ·
 *    .dropzone svg · .notice-said svg · .badge · .badge svg · .memo-edit textarea.
 *    ⇒ 「줄 안에 서면서 제 크기가 뜻인 것」은 ★폭을 스스로 정하지 않는다.
 *  ★ 넓히고 싶으면 «그 자리»에서 정한다 — .my-row .select-bare { width: 100% } */
/*! 쓰임 .select-bare — `.field` «밖»에 홀로 서는 고르개. 줄 안에 선다. 폭은 «그 자리»가 정한다 */
.select-bare {
    width: auto;
}

/*  ── 고르개(select) — 「운영체제 옷」을 벗고 우리 화살표를 쓴다 ──────────
 *
 *  ★ 2026-09-07 에 폐하께서 판을 보시고 정하셨다. 그 아래에 있던 「안 벗긴다」
 *    를 뒤집은 것이라, 무엇이 바뀌었는지 그대로 적어 둔다.
 *
 *  ── 무엇이 고쳐지나 (재어 확인, 셋 다 «폰 폭»으로) ──────────────────
 *
 *      가람 자 · PC(크로미움)         지금 +2px  → 벗기면 ★같다
 *      가람 자 · 안드로이드            지금 +1px  → 벗기면 ★같다
 *      오이북 자 · 아이폰              지금 −4px  → 벗기면 ★같다
 *
 *    ★ 글 칸과 고르개가 나란히 설 때 «키가 어긋나던 것»이 사라진다.
 *      어긋남은 판마다 부호까지 달라서(어디서는 +, 어디서는 −) 한 곳만
 *      보고는 안 보였다.
 *
 *  ── 왜 처음에는 「안 짓는다」였나, 무엇이 무너졌나 ────────────────────
 *
 *    ① 「화살표를 우리가 그려야 한다」   → 한 번 치르고 끝나는 값이다
 *    ② 「색이 글자를 안 따라간다」        → ★테마가 --select-arrow 를 주면 풀린다.
 *                                          그림이 별개 문서라 currentColor 는
 *                                          여전히 «안 든다» — 대신 «그림째»
 *                                          이름으로 받는다
 *    ③ 「운영체제의 익은 모양이 사라진다」→ ★안드로이드 기본도 ⌄ 하나라 우리
 *                                          것과 거의 구별되지 않는다. 폐하께서
 *                                          PC·아이폰에서 「우리 것이 낫다」 하셨다
 *
 *    ★★ ③은 내가 «재지 않고 짐작으로» 댄 것이었다. 폐하께서 실물을 보시고
 *      뒤집으셨다. ⇒ 보는 사람의 판단이 이기는 자리가 있다.
 *
 *  ── 어디에 거나 ────────────────────────────────────────────────────
 *
 *  ★ `.field select` 에만 건다. `.field` 밖의 고르개는 프로젝트가 제 뜻으로
 *    둔 것일 수 있어 건드리지 않는다. 한 화면에 둘이 섞이면 두 모양이 되므로,
 *    받으시는 쪽에서 «.field 밖»의 고르개를 세어 보시기 바란다.
 *
 *  ★ 삼성 인터넷이 판을 강제로 어둡게 뒤집으면 고르개가 회색 상자로 보이는데,
 *    그것은 «벗긴 쪽»과 «안 벗긴 쪽»이 똑같다. 벗겨서 생기는 흠이 아니다.
 *
 *
 *  ── ★★★ 덮으실 때 조심할 것 하나 — `padding` «묶음» ──────────────────
 *
 *  아래 `padding-right` 가 화살표 자리를 만듭니다. 그런데 프로젝트가
 *  **`padding` 을 묶음으로** 다시 적으면 **그 자리가 사라집니다** —
 *  묶음은 «내가 안 적은 것까지» 정하기 때문입니다.
 *
 *      바탕     .field select                       (0,1,1)  padding-right 36px
 *      ★가람    .list-toolbar .field select …       (0,2,1)  padding: 7px 10px
 *      ⇒ 가람이 이기고, 오른쪽이 10px 만 남습니다. 화살표는 24px 자리를 먹으므로
 *        ★글자가 화살표 밑으로 14px 들어갑니다 (2026-09-08 재어 확인 · 가람 23곳)
 *
 *  ★ 고치는 자리는 «덮는 쪽»입니다 — `padding` 묶음 대신 세로만 주거나
 *    (`padding-block`), 화살표 자리를 함께 지고 가면 됩니다:
 *        padding: 7px calc(var(--gap-xl) * 2 + .75rem) 7px 10px;
 *
 *  ★★ 앰버님이 같은 날 «같은 병»을 다른 갈래로 밟으셨습니다 — `background:`
 *    묶음이 `-repeat`·`-position`·`-size` 를 함께 지워 화살표가 «타일처럼»
 *    깔렸습니다. **묶음은 낱개를 지웁니다.**
 *  ⇒ 판: preview/solo/select-live.html · select-garam-toolbar.html
 *        사진: ios-live-oiibook{,-dark}.png · android-live-garam.png
 */
/*  ★2026-09-18 — `.select-bare` 를 여기 «함께» 건다. 규칙을 베껴 두 벌로 만들지 않는다.
 *    두 벌이면 한쪽만 고쳐지고, 그것이 이 집이 아이콘에서 이미 치른 값이다. */
.field select,
.select-bare {
    -webkit-appearance: none;
    appearance: none;
    background-image: var(--select-arrow);
    background-repeat: no-repeat;
    /* 오른쪽 틈은 테마의 --gap-xl 을 딛는다 (여섯 테마 12px · 오이북 자기 뿌리로 12px) */
    background-position: right var(--gap-xl) center;
    /* 그림의 제 비율 12×8. ★글자를 따라야 하는 것이라 rem 이다 */
    background-size: .75rem .5rem;
    /* 화살표가 앉을 자리 — 틈 둘 + 그림 하나 */
    padding-right: calc(var(--gap-xl) * 2 + .75rem);
}

/*  ── 날짜·시각 칸 — 아이폰에서만 «부품 옷»을 입고 나온다 ──────────────
 *
 *  ★★★ 웹킷은 이 칸들을 «네이티브 부품»으로 그리면서 UA 스타일시트에
 *    `!important` 를 건다. 그러면 이 파일 맨 앞의
 *        *, *::before, *::after { box-sizing: border-box }
 *    가 «조용히 안 든다». 저작자의 `!important` 로도 «못 이긴다» —
 *    차례가 «UA important > 저작자 important» 이기 때문이다.
 *
 *  ★ 그래서 값으로 싸우지 않고 «옷을 벗긴다». 벗기면 평범한 칸이 되어
 *    바로 위의 `.field input` 규칙이 그대로 든다 — 안여백·글자·키가 저절로 맞는다.
 *
 *  ══ 2026-09-07 아이폰 17 시뮬레이터에서 «재어» 확인 ═══════════════════
 *
 *    가람 자(폭 402 · 뿌리 16px · --touch auto)
 *      전   글 h40 · 날짜/시각 ★h47 · 오른쪽 끝 412 «화면 402 를 넘침» · content-box
 *      후   전부 h40 · 끝 386 · border-box                       ✔ 다 같은 키
 *    오이북 자(폭 402 · 뿌리 18px · --touch 3rem)
 *      전   글 h54 · 날짜/시각 ★h59 · 끝 417 «넘침»
 *      후   전부 h54                                             ✔
 *
 *  ★★ 세 갈래를 나란히 재어 «가장 짧은 것»을 골랐다 —
 *      ㉮ box-sizing + min-height + appearance   (앰버님이 오이북에 쓰신 꼴)
 *      ㉯ appearance + min-height
 *      ㉰ ★appearance «만»
 *    셋이 «한 픽셀도 다르지 않았다». box-sizing 은 이 파일 맨 앞이 이미 주고,
 *    min-height 는 바로 위 `.field input` 이 이미 준다. 그래서 ㉰ 로 짓는다.
 *    ⇒ 판: preview/solo/ios-datefield.html · ios-datefield{,-oiibook}.png
 *
 *  ★ 아이폰에만 건다. 안드로이드·PC 는 이미 성했고, 거기서 벗기면
 *    네이티브 달력 아이콘까지 사라진다. «성한 쪽을 건드릴 까닭이 없다»(앰버님).
 *
 *  ★★ 고르개(select)는 «벗긴다» — 2026-09-07 에 이 줄이 뒤집혔다.
 *    위쪽 `.field select` 블록을 보라. ★옛 글을 지우지 않고 남긴다 —
 *    그때 「가람 자에서는 0px」이라 적었는데, 그것은 «폭 980»에서 잰
 *    값이었다(미리보기 판에 viewport 를 안 주어 폰이 데스크톱처럼 그렸다).
 *    ★★폰 폭으로 다시 재니 가람도 어긋났다 — PC +2px · 안드로이드 +1px.
 *
 *      옛 글 — 「고르개(select)는 «안 벗긴다». 가람 자에서는 글 칸과 0px,
 *               오이북 자에서만 −4px 다. 둘째 프로젝트가 아직 안 섰고(⑪),
 *               벗기면 네이티브 화살표를 우리가 그려야 한다 — 그것은
 *               «꼴을 새로 짓는 일»이라 폐하께 여쭐 자리다.」
 *
 *      ⇒ 여쭈었고, 폐하께서 판을 보시고 「짓는다」로 정하셨다.
 *      ★ ⑪(둘째 프로젝트)은 넘고도 남았다 — 82개가 세 프로젝트에 서 있다.
 *        ⑪ 은 「«언제» 올릴 수 있나」를 재는 잣대이지 「«올려야» 하나」를
 *        재는 잣대가 아니다. 그 위에 「들이는 값이 고치는 값보다 작은가」가
 *        한 겹 더 있고, 이번에는 재어 보니 «작았다».
 *
 *  ★ 「값이 나왔다 ≠ 그 값이 쓰인다」의 갈래다. 앰버님이 이렇게 적어 오셨다 —
 *    「규칙이 맞았다 ≠ 그 규칙이 쓰였다」. 시험판이 선택자 목록을 찍어 보니
 *    규칙은 «그대로 있었는데» 셈한 값은 여전히 옛것이었다.
 */
@supports (-webkit-touch-callout: none) {

    input[type="date"],
    input[type="time"],
    input[type="datetime-local"],
    input[type="month"],
    input[type="week"] {
        -webkit-appearance: none;
        appearance: none;
    }
}


.field textarea {
    resize: vertical;
    line-height: 1.6;
}

.field input:focus,
.field select:focus,
.field textarea:focus {
    /* ★ --ring 은 강조색을 눕힌 «겹»이다. 밑색과 섞여 보이는 값이라 테마가 준다 */
    outline: 3px solid var(--ring);
    outline-offset: 0;
    border-color: var(--accent-2);
}

/*! 쓰임 .hint — 칸 아래 붙는 작은 설명. `.field` 안에 둔다 */
.field .hint {
    font-size: var(--hint-font);
    color: var(--faint);
}

/*! 쓰임 .form-row — 칸 «둘»을 한 줄에. 640px 아래에서는 저절로 한 칸으로 접힌다 */
.form-row {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0 var(--gap-xl);  /* ★2026-09-07 사다리에 얹음(14→12). 폐하께서 보시고 이르심 */
}

/*
   좁은 화면에서는 두 칸을 한 칸으로 접는다.

   ★ 이것도 가람 app.css 에 «따로» 있던 줄이다(app.css:1314). box-sizing 과
     같은 사정으로 두고 올 뻔했다 — 부품과 «떨어져» 적혀 있으면 떼어 갈 때
     같이 안 딸려 온다.

   ★ 두 함정이 같은 뿌리다: 부품이 제 힘으로 서는 데 필요한 것이 파일 여기저기에
     흩어져 있으면, 부품만 옮긴 사람은 «반쪽»을 옮긴 줄도 모른다.
     그러니 base.css 안에서는 한 부품에 필요한 것을 «그 부품 곁에» 둔다.
*/
@media (max-width: 640px) {
    .form-row {
        grid-template-columns: 1fr;
    }
}

/*! 쓰임 .form-actions — 폼 «맨 아래» 단추 줄. 차례는 규칙 ⑳ 을 본다 */
.form-actions {
    display: flex;
    gap: var(--gap-lg);
    margin-top: var(--gap-xs);
}

/* 왼쪽에 「지우기」, 오른쪽에 「저장」처럼 무게가 다른 것을 갈라 놓을 때 */
/*! 쓰임 .form-actions-split — 무게가 다른 것을 좌우로 가른다 — 왼쪽 「지우기」, 오른쪽 「저장」 */
.form-actions-split {
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--gap-xl);
    margin-top: var(--gap-lg);
    /* ★px 로 둔다 — 3곳이 쓰는데 «덮는 프로젝트 0». 둘째가 서면 이름으로(⑪·⑰). 2026-09-14 재어 확인 */
    padding-top: 16px;
    border-top: 1px solid var(--border);
}


/*  ── 가로 줄에 서는 칸 — `.field-row` ────────────────────────────────
 *
 *  ★ `.field` 는 «세로 폼»용이라 `margin-bottom: var(--gap-block)` 을 답니다.
 *    가로 줄에 그대로 쓰면 **그 여백이 줄 아래에 남습니다** — 가람 자에서 14px.
 *
 *  ★★ 세 프로젝트가 «각자» 이 자리에 걸려 각자 걷었습니다 (2026-09-08 재어 확인) —
 *
 *      가람   .list-toolbar          ★35화면 · margin 걷고 + 칸을 «작게»(35px · 13px)
 *      콘솔   .filters                 4화면 · margin 걷고 + 칸을 «작게»(36px · 14.4px)
 *      살림   .open-num (SalimPayroll) 1화면 · ★크기는 «그대로». 배치만
 *
 *    ⇒ 셋이 «같은 것»이 아닙니다. **겹이 둘**입니다 —
 *        겹 하나  가로 줄에 서게 한다        ← ★셋 다 여기 걸렸다
 *        겹 둘    그 위에 «작게» 를 얹는다   ← 가람·콘솔만
 *
 *  ── 왜 «지금» 올리나 (폐하께서 물으셔서 재었습니다) ──────────────────
 *
 *      쓰는 곳          ★39화면 (가람 35 · 콘솔 4). 「아직 없다」가 아니었습니다
 *      새 화면          ★주 13개 (최근 7일: 가람 10 · 오이북 3)
 *      이미 베낀 벌     margin-bottom:0 을 가람 4곳 · 콘솔 3곳에서 각자 적음
 *      ⇒ 미루면 «미루는 주 수 × 13» 만큼 각자 베낀 것이 늘어납니다
 *
 *  ★ 그리고 크기는 **테마가 줍니다** — 그래서 지금 쓰는 39곳이 «한 픽셀도» 안 바뀝니다.
 *    가람 2.1875rem/.8125rem(=35px/13px) · 오이북 자 2.25rem/.9rem(콘솔 뿌리 16px 에서
 *    =36px/14.4px). 규칙 ⑭ — 「크기를 이름으로 옮길 때 값을 바꾸지 않는다」.
 *
 *  ── 쓰는 법 ─────────────────────────────────────────────────────────
 *
 *      <div class="field-row">            ← 여백만 걷는다 (살림 자리)
 *      <div class="field-row compact">    ← 그 위에 «작게» (가람·콘솔 자리)
 *
 *  ★ `.compact` 는 «홀로» 서지 않습니다 — 반드시 `.field-row` 와 함께 씁니다.
 *    홀로 두면 세로 폼의 칸까지 작아집니다.
 *  ⇒ 판: preview/solo/toolbar-field.html
 */
/*! 쓰임 .field-row — ★칸을 «가로 줄»에 세운다(도구줄·거르개). `.field` 의 아래 여백을 걷는다 */
.field-row {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--gap);
}

.field-row > .field {
    /* ★이 한 줄이 「걸리던 것」입니다 — 세로 폼의 아래 여백을 걷습니다 */
    margin-bottom: 0;
    /* 칸이 제 내용만큼 서게 한다. 늘어나야 할 칸은 화면이 flex: 1 을 준다 */
    flex: 0 1 auto;
}

/*  ★ 「작게」 — 거르개 줄처럼 칸이 여럿 늘어설 때.
 *    값은 테마가 줍니다(--field-h-sm · --field-font-sm). */
/*! 쓰임 .compact — `.field-row` 에 얹어 칸을 «작게». 크기는 테마의 --field-h-sm · --field-font-sm 이 정한다 */
.field-row.compact > .field input,
.field-row.compact > .field select,
.field-row.compact > .field textarea {
    height: var(--field-h-sm);
    /* 높이를 못박았으므로 세로 안여백은 걷는다 — 안 걷으면 글자가 눌린다 */
    padding-block: 0;
    font-size: var(--field-font-sm);
    line-height: 1;
    /* ★min-height 를 함께 눕힌다. 안 그러면 --touch 가 이겨 안 작아진다 */
    min-height: 0;
}

/*  ★ 고르개는 화살표 자리를 «따로» 지켜야 합니다 — 위에서 padding 을 걷었으므로
 *    오른쪽만 되돌립니다. 안 하면 글자가 화살표 밑으로 들어갑니다
 *    (2026-09-08 에 가람 23곳에서 실제로 그랬습니다). */
.field-row.compact > .field select {
    padding-right: calc(var(--gap-xl) * 2 + .75rem);
}

/* ══ 링크 ══════════════════════════════════════════════════════════ */

a {
    color: var(--accent-ink);
}

/*
   단추인데 링크처럼 보여야 하는 것.

   ★ 가람에 «두 가지»가 있었다 — .link-btn 과 .btn-link. 둘이 하는 일이 같은데
     색이 달랐다. 폐하께서 2026-08-28 에 «바다색»(--accent-deep)으로 맞추셨다.

   ★ 이름은 둘 다 남긴다. 하나로 줄이면 그 이름을 쓰는 화면을 전부 고쳐야
     하는데, 그 값이 얻는 것보다 크다. 크기와 밑줄이 아직 다른 것은 쓰는
     자리가 달라서다 — .link-btn 은 글 속에, .btn-link 는 줄 끝에 붙는다.
*/
/*! 쓰임 .link-btn — 단추인데 링크처럼 — ★«글 속»에 섞이는 것. 밑줄이 있다 */
.link-btn {
    background: none;
    border: none;
    padding: 0;
    font-family: inherit;
    font-size: var(--ctl-font-sm);
    color: var(--accent-deep);
    text-decoration: underline;
    cursor: pointer;
}

.link-btn:hover {
    color: var(--accent-hover);
}

/*! 쓰임 .btn-link — 단추인데 링크처럼 — ★«줄 끝»에 붙는 것. 굵고 밑줄이 없다 */
.btn-link {
    background: none;
    border: none;
    color: var(--accent-deep);
    font-size: var(--link-font);
    font-weight: 600;
    cursor: pointer;
    padding: var(--link-pad);
}

.btn-link:hover {
    text-decoration: underline;
}

/* ── 초점 테두리 ────────────────────────────────────────────────────
   마우스로 눌렀을 때 남는 테두리는 감추고,
   키보드(Tab)로 옮길 때만 접근성용 테두리를 보여 준다. */

a:focus:not(:focus-visible),
button:focus:not(:focus-visible),
select:focus:not(:focus-visible) {
    outline: none;
    box-shadow: none;
}

a:focus-visible,
button:focus-visible,
select:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

/* ══ 알림 ══════════════════════════════════════════════════════════ */

/*
   ★ 여기가 날것 색이 가장 많이 뭉쳐 있던 자리다. 가람 한 곳에 여섯이 박혀
     있었다. 의미 색(--good·--warn·--danger)은 진해서 «면»으로 못 칠하는데,
     옅은 짝이 팔레트에 없었기 때문이다. 그래서 화면마다 각자 지어 썼다.
*/

/*! 쓰임 .alert — ★「무엇이 «잘못»됐다」. 갈래(-error/-ok/-info/-warn)를 함께 고른다 */
.alert {
    padding: var(--alert-pad);
    border-radius: var(--radius);
    font-size: var(--alert-font);
    margin-bottom: var(--gap-block);
    border: 1px solid;
}

.alert-error {
    background: var(--danger-soft);
    border-color: var(--danger-line);
    color: var(--danger-ink);
}

.alert-ok {
    background: var(--good-soft);
    border-color: var(--good-line);
    color: var(--good-ink);
}

.alert-info {
    background: var(--info-soft);
    border-color: var(--info-line);
    color: var(--info-ink);
}

/* ★ 넷째. 살림 화면들이 이 꼴을 각자 손으로 짓고 있었다 */
.alert-warn {
    background: var(--warn-soft);
    border-color: var(--warn-line);
    color: var(--warn-ink);
}

/* 목록에 줄이 하나도 없을 때. 「없음」을 «빈 화면»으로 두지 않는다 */
/*! 쓰임 .empty — 목록에 «줄이 하나도 없을» 때. 「없음」을 빈 화면으로 두지 않는다 */
.empty {
    /* ★px 로 둔다 — 138곳이 쓰는데 덮는 곳은 ★콘솔 «하나»(1.5rem 0). 가람은 .empty strong(자식)만 덮는다 ⇒ 둘째가 아직 아니다(⑪). 2026-09-14 */
    padding: 44px 20px;
    text-align: center;
    color: var(--faint);
    font-size: var(--ctl-font);
}

/* ── 파일 고르는 자리 ────────────────────────────────────
   길이 셋인데 «자리는 하나»다 — 붙여넣기 · 끌어다 놓기 · 눌러서 고르기.
   파일칸을 투명하게 덮어 두면 셋이 모두 이 자리로 들어온다.

   <label class="dropzone">          ← div 도 되지만 label 이 낫다(눌러서 고르기가 공짜)
     <input type="file" class="dropzone-input">
     <span class="dropzone-face">
       <svg class="dropzone-icon">   ← ★크기를 안 주면 svg 가 자리를 다 먹는다
       <span class="dropzone-title"> 무엇을 할 수 있나
       <span class="dropzone-sub">   어떻게
       <span class="dropzone-hint">  무엇까지

   끌어다 놓는 동안 «.on» 을 붙인다. 그것은 화면 쪽이 한다. */
/*! 쓰임 .dropzone — 파일 받는 자리 «하나»로 길 셋을 받는다 — 붙여넣기·끌어다 놓기·눌러서 고르기 */
/*! 실어야 .dropzone — 「끌어다 놓기·눌러서 고르기」는 CSS 만으로 섭니다. ★「붙여넣기」는 js/paste.js 를 <script> 로 싣고 window.batang.paste.attach('파일칸 id') 를 불러야 삽니다 — 안 실으면 «길이 셋이 아니라 둘»입니다 */
.dropzone {
    position: relative;
    display: block;
    border: 2px dashed var(--border-strong);
    border-radius: var(--radius);
    background: var(--surface-2);
    padding: var(--zone-pad);
    text-align: center;
    /* ★ 제 둘레 여백을 «스스로» 가진다 — .field · .alert 와 같은 결이다.
       2026-08-29 오이북에서 「보내기」 단추와 0px 로 맞닿았다. 앰버님 말씀 —
       「부품으로 모아 없앤 중복이 그대로 돌아옵니다」. 옳다. 부품이 진다.

       ★★ .field 는 «아래»만 가지는데 이것은 «위아래»를 다 가진다. 까닭은
         앰버님 진단 그대로다 — 「그전 파일 칸은 꾸밈이 없어 글줄처럼 흘렀고,
         테두리를 두른 덩어리가 되자 맞닿았다. 덩어리끼리는 저절로 떨어지지 않는다」.
         .field 는 늘 .field 들 사이에 서지만, 이 덩어리는 «꾸밈 없는 것» 바로
         밑에 놓일 수 있다. 그때 위쪽이 0px 이 된다.
       ★ 위아래를 다 줘도 «겹치는 여백은 합쳐지므로»(margin collapsing) 틈이
         두 배가 되지 않는다. 공짜로 안전해지는 자리다. */
    margin-block: var(--gap-block);
    transition: border-color .12s, background .12s;
}

.dropzone:hover,
.dropzone:focus-within {
    border-color: var(--accent);
}

/* 끌어온 것이 이 자리 위에 있다 */
/*! 쓰임 .on — `.dropzone` 위에 파일을 «끌어다 놓는 중». 홀로 쓰지 않는다 */
.dropzone.on {
    border-color: var(--accent);
    background: var(--accent-mist);
}

/* 파일칸을 통째로 덮는다. 이래야 «끌어다 놓기»가 가장자리에서도 받아진다 */
.dropzone-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: pointer;
}

.dropzone-input:disabled {
    cursor: not-allowed;
}

/* 덮개가 눌림을 다 받아야 하므로 글자는 눌림을 통과시킨다 */
.dropzone-face {
    pointer-events: none;
    display: block;
}

/* ★ 크기 없는 svg 는 그리는 자리를 전부 먹는다. 이름을 안 붙여도 막히도록
   .dropzone 안의 svg 를 통째로 가둔다 — 2026-08-29 오이북에서 실제로 났다 */
.dropzone-icon,
.dropzone > svg,
.dropzone-face svg {
    display: block;
    width: var(--zone-icon);
    height: var(--zone-icon);
    margin: 0 auto var(--gap);
    color: var(--faint);
    flex: none;
}

.dropzone-title {
    display: block;
    font-size: var(--ctl-font);
    color: var(--ink);
}

.dropzone-sub {
    display: block;
    font-size: var(--ctl-font-sm);
    color: var(--ink-soft);
    margin-top: var(--gap-sm);  /* ★2026-09-07 사다리에 얹음(5→6). 폐하께서 보시고 이르심 */
}

.dropzone-hint {
    display: block;
    font-size: var(--hint-font);
    color: var(--faint);
    margin-top: var(--gap-lg);  /* ★2026-09-07 사다리에 얹음(9→10). 폐하께서 보시고 이르심 */
}

/* 좁은 폭에서는 세 겹이 다 서면 자리를 너무 먹는다.
   ★ 「붙여넣기」는 폰에 없는 길이라, 감추는 것은 화면 쪽이 정한다(.only-wide) */
@media (max-width: 420px) {
    .dropzone {
        padding: var(--zone-pad-sm);
    }

    .dropzone-hint {
        margin-top: var(--gap-sm);
    }
}

/* PC 에만 있는 길. 폰에는 Ctrl+V 가 없으므로 이 줄을 감춘다 */
@media (hover: none), (pointer: coarse) {
/*! 쓰임 .only-wide — 넓은 화면에서만 보이는 줄. `.dropzone` 안에 둔다 */
    .dropzone .only-wide {
        display: none;
    }
}

/* ── 소셜 로그인 단추 ────────────────────────────────────
   ★★ 이 부품만은 «테마를 따르지 않는다».
   나머지 부품은 브랜드가 색을 정하지만, 여기는 «남의 상표»다 —
   카카오 노랑·네이버 초록·애플 검정은 그쪽이 정한 것이라 우리가 못 바꾼다.
   그래서 값이 이 파일에 박혀 있다. 흠이 아니라 «일부러»다.

   ★ 로고는 마크업이 아니라 ::before 가 그린다.
     <button class="btn-social sso-microsoft">Microsoft 계정으로 로그인</button>
   이 한 줄이면 로고가 따라온다 — 잊거나 크기를 틀릴 자리가 없다.
   (2026-08-29 오이북은 로고 없이 «글자만» 나가 있었다. 폐하 말씀 —
    「글을 읽지 않으면 로그인 버튼인지 쉽게 받아들여지지 않습니다」) */
/*! 쓰임 .btn-social — 소셜 로그인 단추의 바탕. `.sso-*` 와 «함께» 쓴다 */
.btn-social {
    --social-mark: 18px;   /* ★공식 로고 표식 크기. 글자가 여기에 매인다 */
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--gap-lg);
    /* ★★ 폭을 못 박는다 — «줄 안에» 세우지 말 것.
       로그인 화면에서 위아래로 쌓는 것을 전제로 한 값이다. 줄(flex row) 안에 세우면
       이 단추가 줄 전체를 달라고 하고, 옆엣것이 «0 까지 짜부라진다».
       ★ 2026-08-30 앰버님이 오이북에서 이 결로 «네 번째» 밟으셨다 —
         파일 이름 칸이 통째로 사라졌는데 이름은 멀쩡히 붙어 있었다. 안 보였을 뿐이다.
       ★ 줄 안에 세우실 것이면 이 규칙을 «덮으십시오» — width: auto 로.
         그리고 그 사실을 바탕에 알려 주십시오. 여럿이 그러면 부품이 져야 할 몫이다. */
    width: 100%;
    /* ★px 가 옳다 — 공식 배포본 단추 크기다. 브랜드가 고를 자리가 아니다(규칙 ④의 결) */
    min-height: 46px;
    padding: var(--ctl-pad-block);
    border: 1px solid transparent;
    border-radius: var(--radius);
    /* ★글자는 «로고보다 작아야» 한다 — 네이버가 못박은 것이다(2026-10-01 폐하께서 주심):
     *   「아이콘형 18px · 완성형 16px — ★텍스트는 로고 높이보다 작은 크기를 사용해야 해요」
     *
     * ★★ 값으로 박지 «않고» 로고 크기에 «묶는다». 그래야 로고가 바뀌는 날
     *   글자가 «저절로» 따라간다 — 이 집의 「규칙은 «지키는 것»이 아니라 «꼴»이어야
     *   버틴다」 그대로다(스위치 규칙과 같은 결).
     *
     * ★ min() 이라 대부분의 집은 «안 바뀐다» — --ctl-font 가 14~16px 이라 그쪽이 이긴다.
     *   ★오직 «뿌리가 18px 인 오이북 본체»에서만 18px → 17px 로 내려간다.
     *   (콘솔은 admin.css 가 --root-font 를 16px 로 덮으므로 그대로다) */
    font-size: min(var(--ctl-font), calc(var(--social-mark) - 1px));
    font-weight: 600;
    line-height: 1.2;
    cursor: pointer;
    transition: filter .12s, box-shadow .12s;

    /* ★★ <a> 로 세우는 곳이 있다. 그때 프로젝트의 «a 규칙»이 밑줄을 그으므로
       여기서 지워 둔다 — .btn 에는 있었는데 이 부품에만 빠져 있었다.
       ★ 2026-09-03 앰버님이 «살아 있는 화면에서» 찾아 주셨다. 로고를 붙여 놓고도
         글자에 줄이 그어진 채 배포되었다. 부품이 안 지우면 받는 쪽마다 각자 덮게 되고,
         그러면 「부품을 쓴다」면서 다섯 곳이 같은 한 줄을 따로 적는다. */
    text-decoration: none;
}

.btn-social + .btn-social {
    margin-top: var(--gap);
}

/* 로고 자리. ★크기를 여기서 «못 벗어나게» 가둔다 */
.btn-social::before {
    content: "";
    /*  ★★★ display 를 «적어 두는» 까닭 — 2026-09-07 앰버님이 값을 치르고 알려 주셨다.
     *  이 자리는 원래 `.btn-social { display: flex }` 의 항목이라 «저절로» 블록이 되어
     *  width·height 를 받고 있었다. 적지 않아도 되던 것이다.
     *
     *  ★ 그런데 위 주석이 「줄 안에 세우실 것이면 이 규칙을 «덮으십시오»」라고 시킨다.
     *    앰버님이 시킨 대로 `display: inline-block` 으로 덮으시자 ::before 가 다시
     *    inline 이 되었고, **inline 상자는 width·height 를 무시한다.** 0×0 이 되어
     *    로고가 통째로 사라졌다 — 흰 네모·검은 네모만 섰다.
     *
     *  ★★ **부품이 «쓰라는 대로 썼을 때» 깨졌으니 부품의 흠이다.** 이 한 줄이 있으면
     *     덮는 쪽이 display 를 무엇으로 바꾸든 로고가 산다.
     *
     *  ★★★ 재는 자를 함께 적어 둔다 — 이 고장은 **getComputedStyle 로는 안 잡힌다.**
     *      깨진 채로도 `width: 18px` 이라 답한다(«계산된 값»이지 «쓰이는 값»이 아니다).
     *      띄워서 «눈으로» 보아야 한다: preview/solo/sso-mark-{before,after}.html */
    display: block;
    flex: none;
    /* ★px 가 옳다 — 공식 로고 표식 크기. 아래 height 도 같다 */
    width: var(--social-mark);
    height: var(--social-mark);
    background-repeat: no-repeat;
    background-position: center;
    background-size: contain;
}

.btn-social:hover { filter: brightness(.96); }
.btn-social:active { filter: brightness(.92); }
.btn-social:focus-visible { outline: none; box-shadow: var(--ring); }
.btn-social:disabled { opacity: .55; cursor: not-allowed; filter: none; }

/* ── 마이크로소프트 ── 흰 바탕 · 검은 글씨 (공식 배포본)
   ★ 이름은 «sso-microsoft» 다. 나머지 넷이 다 온 이름이라(sso-kakao·sso-apple…)
     이것만 줄이면 어긋난다 — 2026-08-29 앰버님이 짚어 주셨다.
     v3.0 에 나간 sso-ms 도 그대로 듣는다(별명). */
.sso-microsoft,
/*! 쓰임 .sso-ms — 마이크로소프트 — `.btn-social` 과 «함께». 공식 배포본 색이라 고치지 않는다 */
.sso-ms {
    background: #FFFFFF;
    color: #5E5E5E;
    border-color: #8C8C8C;
}
.sso-microsoft::before,
.sso-ms::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 23 23'%3E%3Cpath fill='%23F25022' d='M1 1h10v10H1z'/%3E%3Cpath fill='%237FBA00' d='M12 1h10v10H12z'/%3E%3Cpath fill='%2300A4EF' d='M1 12h10v10H1z'/%3E%3Cpath fill='%23FFB900' d='M12 12h10v10H12z'/%3E%3C/svg%3E");
}

/* ── 애플 ── 검은 바탕 · 흰 글씨 */
/*! 쓰임 .sso-apple — 애플 — `.btn-social` 과 «함께». 공식 배포본 색이라 고치지 않는다 */
.sso-apple {
    background: #000000;
    color: #FFFFFF;
}
.sso-apple::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23FFFFFF' d='M16.4 12.8c0-2.5 2.1-3.7 2.2-3.8-1.2-1.7-3-2-3.6-2-1.5-.2-3 .9-3.8.9s-2-.9-3.3-.9c-1.7 0-3.3 1-4.1 2.5-1.8 3.1-.5 7.6 1.3 10.1.9 1.2 1.9 2.6 3.3 2.5 1.3-.1 1.8-.8 3.4-.8s2 .8 3.3.8 2.2-1.2 3.1-2.4c1-1.4 1.4-2.8 1.4-2.9-.1 0-2.7-1.1-2.7-4zM14 5.4c.7-.9 1.2-2.1 1.1-3.3-1.1 0-2.4.7-3.1 1.6-.7.8-1.3 2-1.1 3.2 1.2.1 2.4-.6 3.1-1.5z'/%3E%3C/svg%3E");
}

/* ── 구글 ── 흰 바탕 · 회색 테두리 (공식 배포본) */
/*! 쓰임 .sso-google — 구글 — `.btn-social` 과 «함께». 공식 배포본 색이라 고치지 않는다 */
.sso-google {
    background: #FFFFFF;
    color: #1F1F1F;
    border-color: #747775;
}
.sso-google::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 48 48'%3E%3Cpath fill='%234285F4' d='M45.1 24.5c0-1.6-.1-2.7-.4-4H24v7.3h12.1c-.2 1.9-1.6 4.9-4.5 6.8l6.9 5.4c4.1-3.8 6.6-9.4 6.6-15.5z'/%3E%3Cpath fill='%2334A853' d='M24 46c5.9 0 10.9-2 14.5-5.3l-6.9-5.4c-1.8 1.3-4.3 2.2-7.6 2.2-5.8 0-10.7-3.8-12.5-9.1l-7.1 5.5C8.1 41 15.4 46 24 46z'/%3E%3Cpath fill='%23FBBC05' d='M11.5 28.4c-.5-1.4-.7-2.9-.7-4.4s.3-3 .7-4.4l-7.1-5.5C2.9 17 2 20.4 2 24s.9 7 2.4 9.9l7.1-5.5z'/%3E%3Cpath fill='%23EA4335' d='M24 10.2c4.1 0 6.9 1.8 8.5 3.3l6.2-6C34.9 4 29.9 2 24 2 15.4 2 8.1 7 4.4 14.1l7.1 5.5C13.3 14.3 18.2 10.2 24 10.2z'/%3E%3C/svg%3E");
}
/* ── 카카오 ── 노란 바탕 · 검은 글씨 (공식값 #FEE500 · 글자 #000000 «85%»)
   ★★ 2026-09-30 에 «재어서» 고쳤다. 그전에는 글자가 #191600 이었는데
     ★그 값은 «내가 지어낸 것»이고 주석에 까닭이 없었다. 바로 옆의
     .sso-ms · .sso-apple · .sso-google 에는 「공식 배포본 색이라 고치지 않는다」가
     적혀 있어, ★공식이 아닌 값이 공식들 사이에 앉아 «공식처럼» 읽혔다.
   ★ 공식 가이드(developers.kakao.com/docs/ko/kakaologin/design-guide)가 말하는 것 —
     바탕 #FEE500 · 글자 ★#000000 85% · 심볼은 «좌측 정렬» · 둥글기 12px 권장.
   ★ 대비는 고치기 전 14.2 · 고친 뒤 12.4 로 ★둘 다 넉넉하다.
     ⇒ ★고친 까닭은 «대비»가 아니라 «공식값»이다. 값을 지어내지 않는다.
   ★ 둥글기 12px 은 ★따르지 않는다 — var(--radius) 가 집의 «결»이고(서가유산은 0),
     한 화면에서 소셜 단추만 12px 이면 그것이 더 어긋난다. 폐하께서 그렇게 정하셨다. */
/*! 쓰임 .sso-kakao — 카카오 — `.btn-social` 과 «함께». 공식값 #FEE500 · 글자 #000 85% */
.sso-kakao {
    background: #FEE500;
    color: rgba(0, 0, 0, .85);
}
.sso-kakao::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000000' fill-opacity='.85' d='M12 3C6.5 3 2 6.6 2 11c0 2.8 1.9 5.3 4.7 6.7l-1.1 4.1c-.1.4.3.7.7.5l4.9-3.2c.3 0 .6.1.8.1 5.5 0 10-3.6 10-8.2S17.5 3 12 3z'/%3E%3C/svg%3E");
}

/* ── 네이버 ── 초록 바탕 · 흰 글씨 (공식값 #03C75A)
   ★ 이 짝은 대비가 2.2 다. 우리가 못 고친다 — 네이버가 정한 것이다.
     대신 «글씨를 굵고 크게» 두어 굵은 글자 기준(3.0)에 최대한 붙인다.

   ★★★ 2026-10-01 — ★폐하께서 화면을 보시고 짚어 주셨다:
     「로고가 글자보다 커야 합니다. ★화면에 보이는 로고는 글자보다 ★작습니다」
   ★★ 폐하께서 옳으셨다. 재어 보니 —
        옛 viewBox '0 0 20 20' 인데 잉크는 x 5~15 · y 5.4~14.6 뿐이라
        ★박스의 «46%» 만 썼다. 18px 박스 안에서 N 이 ★8.28px.
        글자의 «보이는» 높이가 16px 이니 ★0.52배 — ★로고가 글자의 «반»이었다.
   ★ 다른 여섯은 75~92% 를 쓴다(google 92 · ms 91 · apple 83 · facebook 83 ·
     kakao 81 · instagram 75). ★네이버 하나만 유별났다 — ★내가 그렇게 그렸다.
   ★★ 그리고 이것은 이 집 규칙의 «첫 줄»이 말하는 병이다(앰버님 자리) —
     「`::before` 가 width:18px — ★맞는데 «안 쓰인다»」. ★계산된 값이 «보이는 값»이 아니다.
     v3.42 에서 나는 «박스 18px»만 재고 「글자가 작다」로 판정했다. ★잉크를 안 쟀다.
   ⇒ viewBox 를 ★잉크 범위로 잘랐다. 채움 46% → ★100%.
     ★공식 사진에서 잰 네이버 비율은 1.18배이고, 잘라서 얻는 것은 약 1.04배다 —
     박스가 18px 로 묶여 있어 거기까지다. ★그래도 「로고 ≥ 글자」는 선다. */
/*! 쓰임 .sso-naver — 네이버 — `.btn-social` 과 «함께». 공식값 #03C75A */
.sso-naver {
    background: #03C75A;
    color: #FFFFFF;
}
.sso-naver::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='5 5.4 10 9.2'%3E%3Cpath fill='%23FFFFFF' d='M11.7 10.6 8.1 5.4H5v9.2h3.4V9.4l3.5 5.2H15V5.4h-3.3z'/%3E%3C/svg%3E");
}

/* ── 페이스북 ── 파란 바탕 · 흰 「f」 (공식값 #1877F2)
   ★ 2026-09-03 앰버님이 청하셨다. 오이북에 제공자(Slug "facebook")는 이미 있는데
     꾸밈이 없어 단추가 로고도 색도 없이 맨 .btn-social 로만 서 있었다.
   ★ 색은 페이스북이 정한 것이라 우리가 못 고친다 — 이 갈래 전체가 그렇다.
     대비는 3.1 로 굵은 글자 기준을 넘는다(네이버 2.2 보다 낫다). */
/*! 쓰임 .sso-facebook — 페이스북 — `.btn-social` 과 «함께». 공식값 #1877F2 */
.sso-facebook {
    background: #1877F2;
    color: #FFFFFF;
}
.sso-facebook::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23FFFFFF' d='M15.12 5.32H17V2.14A26.11 26.11 0 0 0 14.26 2C11.54 2 9.68 3.66 9.68 6.7v2.62H6.61v3.56h3.07V22h3.68v-9.12h3.06l.46-3.56h-3.52V7.05c0-1.03.28-1.73 1.76-1.73z'/%3E%3C/svg%3E");
}

/* ── 인스타그램 ── 흰 바탕 · 그러데이션 로고
   ★★ 이 갈래에서 «유일하게 정해진 색이 없는» 쪽이다. 카카오 #FEE500 ·
     네이버 #03C75A · 페이스북 #1877F2 처럼 한 값으로 못 박힌 것이 없고,
     브랜드가 «그러데이션»(노랑→주황→분홍→보라→파랑)이다.

   ★ 그래서 마이크로소프트·구글과 같은 꼴로 세운다 — «흰 바탕 · 색 로고».
     그 둘도 여러 색 로고를 한 색으로 누를 수 없어서 그리 서 있다.
     ⇒ 없는 브랜드 색을 «지어내지 않는다». 그러데이션을 바탕에 깔면 우리가
       고른 각도·멈춤점이 곧 「인스타그램 색」인 척하게 된다.

   ★ 그리고 이것은 «로그인 줄»에 서지 않는다 — 「내 계정 → 연결」 목록 안이다
     (폐하 결정 2026-09-03, 앰버님 전언). 이메일을 주지 않는 로그인이라
     초대받은 집에 못 들어가기 때문이다. 설정 목록 안에서는 그러데이션 덩어리가
     혼자 소리치므로, 조용한 흰 바탕이 그 자리에도 맞다. */
/*! 쓰임 .sso-instagram — 인스타그램 — `.btn-social` 과 «함께». 그러데이션 로고 */
.sso-instagram {
    background: #FFFFFF;
    color: #262626;
    border-color: #767676;
}
.sso-instagram::before {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cdefs%3E%3ClinearGradient id='ig' x1='0' y1='1' x2='1' y2='0'%3E%3Cstop offset='0' stop-color='%23FEDA75'/%3E%3Cstop offset='.25' stop-color='%23FA7E1E'/%3E%3Cstop offset='.5' stop-color='%23D62976'/%3E%3Cstop offset='.75' stop-color='%23962FBF'/%3E%3Cstop offset='1' stop-color='%234F5BD5'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg fill='none' stroke='url(%23ig)' stroke-width='2'%3E%3Crect x='3' y='3' width='18' height='18' rx='5'/%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3C/g%3E%3Ccircle cx='17.2' cy='6.8' r='1.3' fill='url(%23ig)'/%3E%3C/svg%3E");
}

/* 좁은 폭에서 글이 두 줄로 접히지 않게 */
@media (max-width: 380px) {
    .btn-social {
        font-size: var(--ctl-font-sm);
        gap: var(--gap);
    }
}

/* ── 알리는 자리 — «눌리지 않는» 것 ─────────────────────────────────────
   .alert 와 다르다. .alert 는 「무엇이 잘못됐다」이고, 이것은 「지금 이렇다」다.

   ★★ 2026-08-29 오이북에서 폐하께서 「버튼처럼 보입니다」 하셨다. 앰버님이 재어 보니
     그때 꼴이 기본 단추와 «한 글자도» 다르지 않았다 —
        초록 채움 · 흰 굵은 글씨 · 가운데 정렬 · 둥근 모서리 · 폭 꽉
   ★ 그때 배운 것: «색을 흐리게 하는 것으로는 안 고쳐진다». 흐린 채움이라도
     가운데 정렬에 둥근 상자면 「눌리지 않는 단추」로 읽힌다.
     눌리는 것과 알리는 것을 가르는 것은 «색이 아니라 꼴»이다.

        단추 → 가운데 정렬 · 채운 바탕 · 손가락 높이
        알림 → 왼쪽 정렬 · 왼쪽 띠 · 안 채운 바탕

   ★ 그래서 «띠 쪽 모서리는 각지게» 둔다. 네 귀가 다 둥글면 상자가 되고,
     상자는 눌러 보고 싶어진다.

   가람에도 같은 자리가 있었다(app.css .auto-check-note — 왼쪽 띠 3px · 옅은 바탕 ·
   0 6px 6px 0). 둘이 서로 모르는 채 같은 것을 짓고 있어서 부품으로 올린다.

   <p class="notice">
     <span class="notice-lead">이번에 올리는 사진은</span>      ← 묻는 말. 작고 조용
     <span class="notice-said"><svg/>이어진 가족 모두에게 보입니다</span>   ← 답. 크고 굵게
   </p>
   ★ 「이름표」가 아니라 «문장»으로 적는다. 이름표는 누를 것처럼 읽힌다. */
/*! 쓰임 .notice — ★「지금 «이렇다»」 — 눌리지 않는 알림. `.alert`(잘못됐다)와 다르다 */
.notice {
    border-left: var(--notice-strip) solid var(--accent);
    border-radius: 0 var(--radius) var(--radius) 0;
    background: var(--notice-bg);
    padding: var(--notice-pad);
    margin-block: var(--gap-block);
    text-align: left;
    color: var(--ink);
}

/* 꺼진 상태 — 띠에서 색을 뺀다. 자리는 그대로 둔다(글이 안 움직이도록) */
/*! 쓰임 .off — `.notice` 의 띠에서 색을 뺀다(자리는 그대로). 홀로 쓰지 않는다 */
.notice.off {
    border-left-color: var(--border);
}

.notice-lead {
    display: block;
    font-size: var(--hint-font);
    color: var(--ink-soft);
}

/* ★ 물음과 답의 크기가 «같으면» 어느 쪽이 답인지 알 수 없다.
   한쪽을 만질 때는 짝이 되는 쪽도 함께 본다 — 2026-08-29 앰버님이 겪었다. */
.notice-said {
    display: flex;
    align-items: center;
    gap: var(--gap-sm);
    margin-top: 2px;
    font-size: var(--notice-font);
    font-weight: 600;
}

.notice-said svg {
    flex: none;
    width: 1.05em;
    height: 1.05em;
}

/* ── 눈에만 «안 보이는» 글 ───────────────────────────────────────────────
   읽어 주는 도구에는 남기고 눈에서만 치운다. 아이콘만 있는 단추에 이름을 달거나,
   표 머리글을 화면에서 빼되 읽히게 할 때 쓴다.

   ★★ 이 부품만은 «첫째»여도 바탕이 진다. 다른 부품은 「★둘째 «프로젝트»가 같은
     자리를 밟을 때가 부품이 될 때」인데, 여기는 그 잣대를 안 댄다. 까닭 셋 —

     ① 결(취향)이 없다. 15년째 «한 벌»로 굳은 꼴이고 브랜드가 고를 자리가 없다.
        그러니 「한 프로젝트의 사정이 공용 규칙이 되는」 위험이 아예 없다.
     ② ★없으면 «반대로» 터진다. 다른 이름은 없으면 «아무 일도 안 일어나»
        늦게 발견되는데, 이것은 없으면 숨으라던 글이 «큰 글씨로 한가운데 나와»
        옆엣것을 밀어낸다. 2026-08-30 앰버님 화면에서 실제로 그랬다.
     ③ 접근성의 «바닥»이다. 바탕이 아이콘 단추를 내주면서 그 이름표를 다는 길을
        안 내주면, 프로젝트마다 각자 짓거나 «아예 안 짓는다».

   ★ display: none 이 «아니다». 그것은 읽어 주는 도구도 안 읽는다 —
     숨기려는 것이 아니라 «눈에만» 안 보이게 하는 것이다. */
/*! 쓰임 .visually-hidden — 눈에서만 치우고 읽어 주는 도구에는 남긴다. ★아이콘만 있는 단추에 «반드시» */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    white-space: nowrap;
    border: 0;
    clip-path: inset(50%);
}

/* ── gap 을 쓰는 상자 ────────────────────────────────────────────────────
   ★★ 부품 넷(.field · .alert · .dropzone · .notice)이 «제 아래 여백»을 집니다.
     보통 흐름에서는 이웃과 여백이 «합쳐져» 한 몫만 벌어지는데,
     flex·grid 상자 안에서는 «합쳐지지 않고 gap 에 더해집니다» — 두 배가 됩니다.
     2026-08-31 실측: gap 14px 상자 안에서 14px → «28px».

   ★ 루비님이 가람에서 이 함정을 밟고 알려 주셨습니다. 그때 「gap 쓰는 상자」 이름을
     하나씩 좇아 예외를 두려 하셨는데, `.tab-col` 을 막으니 `.history-wrap` 이
     나왔답니다 — ★«이름을 좇는 방식은 끝이 없습니다». 새 상자를 만들 때마다
     그 화면만 조용히 두 배가 됩니다.

   ★★ 그래서 «상자 쪽»에 이름을 하나 둡니다. 상자를 만드는 사람이 자기가 gap 을
     쓴다는 것을 «압니다» — 모르는 쪽(부품)에 알아내라고 시키지 않습니다.

       <div class="gapped" style="display:flex; gap:14px">
         <div class="field">…</div>     ← 제 여백을 내려놓는다
   */
/*! 쓰임 .gapped — ★flex·grid 상자에 «상자 쪽»으로 단다 — 안에 든 부품이 제 아래 여백을 내려놓는다(안 달면 여백이 두 배) */
.gapped > .field,
.gapped > .alert,
.gapped > .dropzone,
.gapped > .notice {
    margin-block: 0;
}

/* ── 숫자가 들어가는 칸·자리 ─────────────────────────────────────────────
   폐하께서 2026-08-31 에 이르셨습니다 —
     「인간은 셈이 빠르지 않아 1000 단위 콤마가 입력할 때 보이지 않으면 몇 번씩
      숫자를 틀리니, 숫자가 들어가는 곳에는 자동으로 천 단위 콤마가 들어가도록
      부품을 만들어 두는 것이 좋을듯 합니다」

   ★ 바탕이 지는 것은 «꾸밈»뿐입니다 — 오른쪽 맞춤과 «자릿수가 흔들리지 않는 숫자».
     콤마를 넣는 셈은 각 프로젝트의 틀(Blazor/C#)이 집니다. 글쇠를 칠 때마다
     자바스크립트를 오가면 손끝이 무거워집니다.

   ★★ tabular-nums 가 없으면 «1» 이 «8» 보다 좁아, 세로로 쌓인 숫자의 자릿수가
     들쭉날쭉해집니다. 사람이 자릿수를 눈으로 세는 자리라 그것이 곧 오독입니다.

   ★ 셈 쪽에서 밟기 쉬운 자리 둘 — 루비님이 겪으신 것입니다:
       · 소수부에는 콤마를 «넣지 않는다». 1,234.567 이지 1,234.5,67 이 아니다
       · 치는 중인 «점»을 살려 둔다. 「1234.」에서 점을 지우면 소수를 칠 수 없다
   ★ <input type="number"> 로는 «못 합니다». 브라우저가 숫자 아닌 글자를 안 받아
     콤마를 넣는 순간 값이 통째로 비워집니다. type="text" + inputmode="decimal" 로
     폰 자판만 숫자판이 되게 합니다. */
/*! 쓰임 .num — 숫자 칸·자리 — 오른쪽 맞춤 + 자릿수가 안 흔들리는 숫자. ★콤마 셈은 프로젝트가 진다 */
.num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* 표 안의 숫자 칸 — 머리글도 함께 오른쪽으로 가야 줄이 맞는다 */
th.num,
td.num {
    text-align: right;
}

/* ── 표 — 줄 «안»에 서는 작은 알약 ───────────────────────────────────────
   「관리자」 · 「3」 · 「처리 중」처럼 «한 조각의 사실»을 글줄 곁에 다는 것.

   ★★ 왜 부품이 되었나 — 「하나를 열 번 베끼면 열 번 다 조금씩 다르다」
   2026-09-04 에 두 곳을 재었더니 이랬다:

     가람    .badge-role 11.5px/2px 9px · .board-count 11.5px/1px 8px
             .count-badge 12px/0 7px · .status-chip 11.5px/2px 9px
             .auth-flow span 12.5px/5px 13px
     오이북  .badge · .tag(둘) · .mark · .report-state
             여백 .05rem .45rem / .05rem .5rem / .1rem .45rem / .1rem .5rem
             글자 .75rem / .8rem / .82rem

   ★★★ 열 규칙에 여백이 예닐곱 가지다. 그런데 «아무도 고장으로 안 본다» —
     하나하나는 멀쩡하기 때문이다. 앰버님 말씀 — 「저도 오늘 재기 전에는
     다섯이 다른 줄 몰랐습니다」. ★그것이 부품이 필요한 자리의 생김새다.

   ★ 「줄 안에 서는 것」만이다. «얹는 것»(사진 위의 표)은 아직 부품이 아니다 —
     2026-09-04 실측으로 가람에 그런 자리가 하나도 없다. 둘째가 나오면 그때 선다.

   ★ 색은 프로젝트가 정한다. .badge 는 «꼴»만 진다 —
     역할별 색(.admin · .sales …)은 그 프로젝트의 일이다. */
/*! 쓰임 .badge — 줄 «안»에 서는 작은 알약 — 「관리자」·「3」처럼 «한 조각의 사실» */
.badge {
    display: inline-flex;
    align-items: center;
    gap: var(--gap-xs);
    padding: var(--badge-pad);
    border-radius: var(--radius-round);
    font-size: var(--badge-font);
    font-weight: 600;
    /* ★ 한 자만 담길 때 글자가 아래로 처지지 않게. 2026-09-04 앰버님이 겪으셨다 —
       기본 줄 높이가 글자 상자를 키워 동그라미 «가운데»에서 어긋난다 */
    line-height: 1;
    white-space: nowrap;
    /* ★★ 줄(flex row) 안에서 «짜부라지지» 않게. 2026-09-04 실측 — 이것이 없으면
       .badge.round 가 21px 짜리 동그라미인데 «8px» 로 눌린다(flex-shrink 기본값 1).
       ★ 같은 자리를 이 저장소에서 «네 번째» 만났다 —
         .btn-social(width:100%) · .dropzone svg · .notice-said svg · 그리고 이것.
         ⇒ «제 크기를 지켜야 하는 것»에는 flex: none 을 함께 적는다. */
    flex: none;
    background: var(--surface-2);
    color: var(--ink-soft);
}

/* 한 자짜리 — 「N」 하나를 동그라미에 앉힌다 */
/*! 쓰임 .round — `.badge` 를 한 자짜리 동그라미로. 홀로 쓰지 않는다 */
.badge.round {
    display: grid;
    place-items: center;
    gap: 0;
    padding: 0;
    width: var(--badge-round);
    height: var(--badge-round);
}

/*  ★ 강조색으로 «채운» 알약. 기본 알약은 조용한 회색인데, 눈에 띄어야 하는 것
 *  (안 읽은 수 · 새로 온 것 · 지금 고른 것)이 있어 갈래를 하나 둔다.
 *
 *  ★★ 2026-09-05 에 «재어서» 올렸다 — 두 팀이 넷을 손으로 짓고 있었다.
 *     가람   .count-badge                background: var(--tide)  color: #fff
 *     오이북 .amber-header .drawer .count · .amber-dues .grp .n · .amber-tile .fresh
 *                                        background: var(--oi)   color: var(--on-oi)
 *     ★ --tide 와 --oi 는 «둘 다 그 브랜드의 --accent» 다. 같은 물건이었다.
 *
 *  ★★★ 값을 새로 정할 것이 «없다». 브랜드가 이미 가진 --accent / --on-accent 를
 *      딛는다. 그래서 받는 쪽 화면이 한 픽셀도 안 바뀐다.
 *
 *  ★ «뜻»은 여기 담지 않는다. 「새로 온 것」이면 프로젝트가 .fresh 를 얹고,
 *    「안 읽음」이면 .unread 를 얹는다 — 이 갈래는 «꼴»만 진다.
 *    (앰버님이 .fresh 를 값이 아니라 «이름»으로 두신 것이 그 본보기다.)
 *
 *  ★★ «자리 잡기»(사진 위 절대 자리)와 «글줄 안 세로 맞춤»은 여기 «안» 담았다 —
 *     2026-09-05 에 재니 둘 다 오이북 한 곳뿐이었다. 둘째가 서면 그때 부른다. */
/*! 쓰임 .accent — `.badge` 를 강조색으로. 홀로 쓰지 않는다 */
.badge.accent {
    background: var(--accent);
    color: var(--on-accent);
}

/*  ★ 「빈 알약」 — 테두리만 두고 바탕을 «비운» 것. 2026-09-15 에 재어서 올렸다.
 *
 *  ★★ 까닭은 «한 줄에 둘이 설 때»다. 루비님이 .meta-import 를 지으시며
 *    「옆에 채운 것이 있으니 이것은 비운다」 하셨다. 둘 다 채우면 줄이 무거워지고
 *    «어느 것을 먼저 볼지»가 안 정해진다. 채운 것이 «앞», 빈 것이 «곁»이다.
 *
 *  ★★ 2026-09-15 에 세 프로젝트에서 ★일곱을 재었다(주석 걷고 · <style> 안까지 ·
 *    ★한 이름이 여러 블록에 흩어진 것을 «모아서») —
 *      가람   .meta-import · .topic-chip          ← 둘 다 알약 토큰을 딛는다
 *      오이북 .amber-events .upnext .dday
 *      ★콘솔  .badge · .chip · .tag · .ch-blocks
 *
 *  ★★★ 콘솔이 ★`.badge` «자체»를 다시 지어 빈 알약으로 쓰고 있다 —
 *    base.css 를 먼저 싣고 admin.css 가 뒤에 와서 ★조용히 덮인다.
 *    ⇒ 「갈래가 없어서 이름을 빼앗은 것」이고, 그것이 이 갈래가 필요한 자리의 생김새다.
 *
 *  ★★ 왜 border 가 아니라 box-shadow 인가 — ★테두리는 «자리를 먹는다».
 *    이 알약은 «채운 알약 곁에» 서라고 있는 것인데, border 를 주면 그 하나만
 *    ★2px 크다(높이는 글에서 나오므로 box-sizing 과 무관하다). inset 그림자는
 *    자리를 안 먹어 ★두 알약의 키가 «한 픽셀도» 안 어긋난다(띄워서 재어 확인).
 *    ⇒ 그리고 `.badge` 자체에 투명 테두리를 두는 길은 «안» 골랐다 —
 *      그러면 일곱 프로젝트의 알약이 «다» 2px 커진다.
 *
 *  ★ 이름 — `.round` 는 «꼴», `.accent`·`.quiet` 는 «세기»다.
 *    세게(accent) · 보통(맨 .badge) · 조용히(quiet) 로 셋이 사다리를 이룬다.
 *  ★ 색은 여기서 정하지 않는다 — 브랜드가 이미 가진 --border 와 --muted 를 딛는다.
 *    콘솔처럼 «뜻이 있는 색»(--warn 테두리)이 필요하면 그 프로젝트가 얹는다. */
/*! 쓰임 .quiet — `.badge` 를 테두리만 남기고 비운다. 채운 알약 «곁»에 선다. 홀로 쓰지 않는다 */
.badge.quiet {
    background: none;
    color: var(--muted);
    box-shadow: inset 0 0 0 1px var(--border);
}

.badge svg {
    flex: none;
    width: 1em;
    height: 1em;
}

/* ══ 처리 결과 카드 — 화면 «아래 가운데» ═══════════════════════════════════
   ★2026-09-19 폐하께서 정하신 자리. 말씀 그대로 —
     「소통기록에서 처리 완료, 다른 액션 버튼들을 누르면 ★리스트 제일 상단에 녹색
      라벨이 처리 상태를 알려주는데 ★이는 처리상태 알림 규칙에 어긋납니다, 차라리
      ★화면 하단 중앙에 카드를 띄워 처리 내용을 알려주는것이 좋겠습니다,
      ★정상 처리 푸른 테두리 카드, 오류처리 붉은 테두리 카드, 정상 수정 녹색 테두리
      카드 같이 색으로 구별 되게 하면 좋겠습니다」
   그리고 —「★집의 꼴로 올립니다 바탕님께 청해 주시기 바랍니다」⇒ 그래서 여기 있다.

   ★왜 «맨 위»가 어긋나나 — 목록은 «구른다». 가운데 줄에서 누르면 맨 위의 말은
     ★화면 «밖»이라, 고장이 «먹통»으로 보이고 성공이 «아무 일 없음»으로 보인다.
     (2026-09-17 에 폐하께서 「되돌렸는데 되돌리기가 그대로 있습니다」 하신 그 병이다)
   ★★아래 가운데는 ★구르는 자리와 «무관»하고, ★보던 자리를 «빼앗지 않는다» —
     규칙이 금지한 «맨 위로 굴려 주기»와 다르다.

   ★★★이것이 «오류를 누른 자리에 띄우는 것»을 «대신하지» 않는다.
     실패는 누른 자리가 «먼저»다 — 이 카드만으로는 ★«어느 줄»이 안 된 것인지 못 말한다.
     ⇒ 짚을 수 있으면 그 줄 밑에 «그리고» 여기에. 못 짚으면 여기로.

   ★꼴 — 아람님(가람)이 먼저 세워 쓰시던 것을 견주어 잡았다(ruby d9fdd21).
     쓰는 이름 스무 개가 «전부» 8/8 임을 재어 확인했다.
     ★음성 대조 --ok · --success · --bad-* 는 ★0/8 이다 — 초록은 ★--good-* 다.
     지어내지 마시라고 여기 적어 둔다.

   ★이 층이 «못» 하는 것 — «언제 사라지나»와 «잇달아 누를 때»는 CSS 가 못 한다.
     그것은 쓰는 쪽 코드의 몫이다. 권하는 값은 `.result-card` 쓰임에 적어 두었다.
══════════════════════════════════════════════════════════════════════════ */

/*! 쓰임 .result-card — 누른 «결과»를 화면 아래 가운데에 띄우는 카드.
 *    갈래를 함께 적는다 — .done(푸름 · 되었다) · .edited(초록 · 고쳐 저장) · .bad(붉음 · 안 됨).
 *    ★role="status" aria-live="polite" 를 함께 단다.
 *    ★쓰는 쪽이 정할 것 셋 — 바탕은 «꼴»만 준다:
 *      ① 스스로 사라지는 때 — 권함 되었다 4초 · ★안 된 것 8초(읽을 시간이 필요하다)
 *      ② 손으로 닫기(✕)
 *      ③ ★잇달아 누를 때 — 띄운 것에 «번호»를 매기고 «제 번호일 때만» 지운다.
 *         안 그러면 ★앞의 시계가 «방금 누른 말»을 지운다. 가장 쉽게 빠지는 자리다 */
.result-card {
    /* ★아래에서 얼마나 띄우나 — 쓰는 쪽이 덮을 수 있게 «이름»으로 뺀다.
       ★떠 있는 아래 차림표가 있는 집이 있다(오이북 .amber-tabs). 그 위로 올리려면
         제 CSS 에서 --result-card-bottom 만 키우면 된다. 부품을 고칠 일이 아니다. */
    position: fixed;
    left: 50%;
    transform: translateX(-50%);
    bottom: var(--result-card-bottom, calc(var(--gap-block) + env(safe-area-inset-bottom, 0px)));

    /* ★떠 있는 차림표(오이북 z-index 30)보다 위에 선다 — 결과는 가려지면 안 된다 */
    z-index: 60;

    /* ★★★v3.40 에서 «키웠다» — 폐하께서 「★카드가 너무 작아 눈에 잘 보이지 않습니다
         카드 크기를 키워주시기 바랍니다」 이르셨다(2026-09-19).
       ★★작았던 까닭이 «둘»이었다. 아람님이 갈라 짚어 주셨다 —
         ① 글자가 13.5px 였다 — 화면 «구석»에 뜨는 것이라 몸글보다 작으면 안 된다
         ★②말이 짧으면 «그릇»도 같이 작아졌다 — 「저장했습니다.」 한 줄이면 손톱만 하다
       ★②가 ①보다 크게 듣는다. 글자만 키웠으면 «또» 작았을 것이다.
         min-width 가 없으면 카드 크기가 ★«말 길이에 끌려다닌다» —
         같은 뜻의 알림이 화면마다 다른 크기로 뜬다. ★가람에서만 서른여섯 화면이 쓴다. */
    min-width: min(88vw, 22rem);
    max-width: min(94vw, 40rem);

    display: flex;
    align-items: center;
    gap: var(--gap-xl);

    /* ★안여백을 «이름으로» 키운다 — 사다리 윗칸이 --gap-block(가람 14px)에서 끝나
         그 위는 더해서 쓴다. ★이것이 P-6(가람 --gap 사다리의 윗칸이 비었다)의 자리다 */
    padding: calc(var(--gap-block) + var(--gap-sm)) calc(var(--gap-block) + var(--gap-lg));

    background: var(--surface);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    color: var(--ink);

    /* ★몸글 «그대로». 구석에 뜨는 말이라 몸글보다 작으면 눈에 안 든다 */
    font-size: var(--body-font);

    /* ★폐하 말씀이 「푸른 «테두리» 카드」다 — 왼쪽 띠가 아니라 ★둘레다.
       ★2px 이다 — 「테두리로 가른다」가 이 부품의 뜻이라, 그 테두리가 먼저 보여야 한다.
       갈래가 안 붙어도 «모양은 서게» 기본 테두리를 둔다 */
    border: 2px solid var(--border);
}

/*! 쓰임 .done — `.result-card` 를 «되었다»(푸름)로. 붙였다·처리했다·되돌렸다. 홀로 쓰지 않는다 */
.result-card.done {
    border-color: var(--info-line);
    background: var(--info-soft);
    color: var(--info-ink);
}

/*! 쓰임 .edited — `.result-card` 를 «고쳐 저장되었다»(초록)로. 홀로 쓰지 않는다 */
.result-card.edited {
    border-color: var(--good-line);
    background: var(--good-soft);
    color: var(--good-ink);
}

/*! 쓰임 .bad — `.result-card` 를 «안 되었다»(붉음)로. 홀로 쓰지 않는다 */
.result-card.bad {
    border-color: var(--danger-line);
    background: var(--danger-soft);
    color: var(--danger-ink);
}

/*! 쓰임 .result-card-text — 카드 안의 «말». 긴 말이 잘리지 않게 한다 */
.result-card-text {
    /* ★자르지 «않는다» — 무엇이 되었는지 못 읽으면 이 카드가 설 까닭이 없다 */
    min-width: 0;
    word-break: break-word;
}

/*! 쓰임 .result-card-x — 카드를 손으로 닫는 단추. `aria-label="닫기"` 를 단다 */
.result-card-x {
    flex: none;
    margin-left: auto;
    padding: 0 var(--gap-xs);
    border: 0;
    background: none;
    color: inherit;
    font: inherit;
    line-height: 1;
    cursor: pointer;

    /* ★카드 글자를 키웠어도 «닫기»는 따라 키우지 않는다 — 딸림이지 말이 아니다 */
    font-size: var(--body-font-sm);

    /* ★글자는 옅게, 그러나 «닿는 자리»는 안 줄인다 */
    opacity: .6;
}

.result-card-x:hover,
.result-card-x:focus-visible {
    opacity: 1;
}

/* ★떠오르는 결 — 「떠 있다」가 눈에 보이게. 아주 짧게 둔다.

   ★★재실 때 알아 두실 것 — 이 움직임은 `transform` 을 쓰므로, 화면을 «안 그리는»
     자리에서 재면(숨은 탭·창이 뒤에 있을 때) 애니가 ★첫 칸에 멈춘 채로 잡힌다.
     그러면 `translateY(14px)` 가 남아 ★카드가 아래로 14px 내려앉은 것처럼 보인다.
     ★고장이 아니다 — 처음 그려지는 순간 제자리로 온다. 2026-09-19 에 재다 만났고,
     `animation: none` 으로 대조를 세워 갈랐다(끈 뒤 Y=0 · 아래틈 14px ⇒ 규칙은 옳다). */
@media (prefers-reduced-motion: no-preference) {
    .result-card {
        animation: result-card-rise .18s ease-out;
    }

    @keyframes result-card-rise {
        from {
            opacity: 0;
            transform: translate(-50%, var(--gap-block));
        }
    }
}

/* ══ 달 한 판 ══════════════════════════════════════════════════════
 *
 *  ★★★ 2026-10-01 — ⑪ 이 섰다. ★둘째 «프로젝트»가 같은 자리를 밟았다.
 *
 *    가람   Schedule.razor.css   .cal-head · .cal-grid · .cal-cell   (아람님 · 폐하 09-18)
 *    오이북 amber.css            .amber-month .dow · .grid · .cell   (앰버님 · 폐하 10-01)
 *
 *  ★★ 그리고 둘 다 «같은 폐하 말씀»에서 났다 —
 *    09-18 「★작게라도 달력이 있어야 합니다」 · 10-01 「★리스트가 아닌 캘린더로」.
 *    한 분이 두 집에 같은 것을 바라셨다.
 *
 *  ★ 열어서 보니 «같은 일»이었다 — 7칸 격자 · 그날을 누르면 좁혀짐 ·
 *    ★「일정이 없는 날도 «비어 있는 것»으로 보인다」(가람 주석: 그것이 달력의 뜻이다).
 *
 *  ── ★무엇을 «안» 지는가 ───────────────────────────────────────
 *
 *  ★★★ 칸 «속»은 부품이 지지 않는다. 거기가 ★둘이 갈린 자리다 —
 *      가람   ★«건수»만 (하루에 여럿이라 이름이 깨알이 된다)
 *      오이북 ★«이름» 최대 둘 + 「+N」
 *    ⇒ 「무엇을 적을까」는 ★그 화면이 답할 물음이지 부품이 답할 물음이 아니다.
 *      부품은 ★«칸까지»만 짓고 속은 넘긴다.
 *
 *  ★ 달 옮김 줄도 따로다(.month-nav) — 오이북은 부품 «안»에, 가람은 «도구줄»에 둔다.
 *    ⇒ ★안 써도 격자가 선다.
 *
 *  ── ★칸 높이는 «값으로 박지 않고» 글자에 묶는다 ────────────────
 *
 *  ★ 되돌림이 calc(var(--body-font) * 3.2) 인 까닭 — 글자가 커지면 칸도 커져야
 *    속이 안 잘린다(앰버님이 오이북에서 그렇게 지으셨다. 그 결을 가져왔다).
 *  ★★ 가람은 44px 로 쓰고 있었다 ⇒ --month-cell-min 을 덮으면 된다.
 *    ★이름을 열어 두는 것이 「한 집에 매이지 않는」 길이다.
 *
 *  ★ 쓰는 이름은 ★여덟 테마에 다 있는 것만 썼다(재어 확인 2026-10-01) —
 *    --border · --ink · --muted · --surface · --surface-2 · --accent-ink ·
 *    --body-font · --body-font-sm · --gap-sm · --radius-sm  ★전부 8/8.
 *    ★음성 대조 --nosuchxy 0/8 — 잣대가 산다.
 *  ★★ 그리고 ★--font 와 --line 은 ★쓰지 않았다 — 재어 보니 1/8 과 2/8 이다.
 *    오이북이 그 둘을 쓰고 있는데 «집안 이름이 아니다». 앰버님께 알린다.
 * ══════════════════════════════════════════════════════════════════ */

/*! 쓰임 .month-grid — 달 한 판. ★칸 «속»은 쓰는 쪽이 넣는다(건수든 이름이든) */
.month-grid {
    /* ★칸의 최소 높이 — 글자에 묶는다. 덮고 싶으면 이 이름만 바꾼다 */
    --month-cell-min: calc(var(--body-font) * 3.2);
}

/*! 쓰임 .dow — 요일 머리. `.month-grid` «안»에 둔다. 홀로 쓰지 않는다 */
/*! 쓰임 .grid — 날짜 격자. `.month-grid` «안»에 둔다. 홀로 쓰지 않는다 */
.month-grid .dow,
.month-grid .grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 2px;
}

.month-grid .dow { margin-bottom: 2px; }

.month-grid .dow span {
    text-align: center;
    font-size: var(--body-font-sm);
    font-weight: 600;
    color: var(--muted);
    padding: var(--gap-sm) 0;
}

/*! 쓰임 .cell — 날짜 한 칸. ★단추다 — 누르면 그날로 좁혀진다. 홀로 쓰지 않는다 */
.month-grid .cell {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1px;
    min-height: var(--month-cell-min);
    padding: 2px;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    background: var(--surface);
    color: var(--ink);
    font: inherit;
    cursor: pointer;
}

.month-grid .cell:hover { background: var(--surface-2); }

/*! 쓰임 .out — 그 달이 «아닌» 날. ★지우지 않고 가라앉힌다. 홀로 쓰지 않는다 */
/* ★ 없애면 칸이 밀려 ★요일이 어긋난다(가람에서 값을 치른 자리다) */
.month-grid .cell.out {
    color: var(--muted);
    background: var(--surface-2);
}

/*! 쓰임 .today — 오늘. ★테두리로만 말한다 — 「고른 날」과 겹치지 않게. 홀로 쓰지 않는다 */
.month-grid .cell.today { border-color: var(--accent-ink); }

/*! 쓰임 .on — 고른 날. ★채워서 말한다 — 테두리만으로는 오늘과 구별이 안 된다. 홀로 쓰지 않는다 */
.month-grid .cell.on {
    background: var(--accent-ink);
    color: var(--surface);
}

/*! 쓰임 .d — 칸 안의 «날짜 숫자». 홀로 쓰지 않는다 */
.month-grid .cell .d {
    font-size: var(--body-font-sm);
    font-variant-numeric: tabular-nums;
}

/*! 쓰임 .has — 그날에 «무언가 있다». 안 붙이면 날짜가 가라앉는다. 홀로 쓰지 않는다 */
/* ★ 있는 날을 칠하지 «않고» 없는 날을 가라앉힌다 — 달력은 «빈 날»을 보여 주는 물건이다 */
.month-grid .cell:not(.has) .d { color: var(--muted); }

/*! 쓰임 .month-nav — 달을 옮기는 줄. ★`.month-grid` 와 «따로» 쓴다(안 써도 된다) */
.month-nav {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--gap-sm);
    margin-bottom: var(--gap-sm);
}

/*! 쓰임 .month-now — 지금 보고 있는 달. ★가운데 글자가 가장 크다. 홀로 쓰지 않는다 */
/* ★ 화살표만 크면 「몇 월인지」가 뒤로 밀린다(앰버님이 오이북에서 적어 두신 결) */
.month-now {
    min-width: 7.5em;
    text-align: center;
    font-weight: 700;
}
