/* ============================================================
   松田歯科OS 共通UIコンポーネント
   技工物到着管理システム

   値は必ず tokens.css の変数を使う。生の色・pxを書かない。
   ============================================================ */

/* ---------- Reset ---------- */

*,
*::before,
*::after {
  box-sizing: border-box;
  -webkit-tap-highlight-color: transparent;
}

html {
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  font-family: var(--font-family);
  font-size: var(--fs-body);
  line-height: var(--lh-normal);
  color: var(--color-ink);
  background: var(--color-canvas);
  overflow-x: hidden;
}

h1,
h2,
h3,
p {
  margin: 0;
}

button {
  font: inherit;
  color: inherit;
}

/* キーボード操作時のみフォーカスリングを出す（タッチ操作の邪魔をしない） */
:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
  border-radius: var(--radius-sm);
}

.u-hidden {
  display: none !important;
}

/* 画面には出さないが読み上げには必要なテキスト */
.u-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* ---------- Icon ---------- */

.icon {
  width: var(--icon-md);
  height: var(--icon-md);
  flex: none;
  stroke: currentColor;
  stroke-width: var(--icon-stroke);
  stroke-linecap: round;
  stroke-linejoin: round;
  fill: none;
}

.icon--sm {
  width: var(--icon-sm);
  height: var(--icon-sm);
}
.icon--lg {
  width: var(--icon-lg);
  height: var(--icon-lg);
}

/* ---------- AppHeader（共通ヘッダー / Charter⑩ Header） ---------- */

.app-header {
  position: sticky;
  top: 0;
  z-index: 20;
  background: var(--color-surface);
  border-bottom: 1px solid var(--color-border);
  padding-top: env(safe-area-inset-top);
}

.app-nav {
  display: flex;
  max-width: var(--layout-max);
  margin-inline: auto;
}

.app-nav__item {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: var(--tap-comfortable);
  padding: var(--space-3) var(--space-2);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-bold);
  color: var(--color-ink-muted);
  text-decoration: none;
  border-bottom: 3px solid transparent;
  transition: color var(--duration-fast) var(--ease-standard);
}

/* 現在地は「色 + 下線 + 背景」の3点で示す（色だけに頼らない） */
.app-nav__item[aria-current="page"] {
  color: var(--color-primary);
  background: var(--color-primary-softer);
  border-bottom-color: var(--color-primary);
}

/* ---------- Page / Title（Charter⑩ Title） ---------- */

.page {
  max-width: var(--layout-max);
  margin-inline: auto;
  padding: var(--space-5) var(--layout-gutter) var(--space-9);
}

.page-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-2) var(--space-4);
  margin-bottom: var(--space-5);
}

.page-head__title {
  font-size: var(--fs-page);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  color: var(--color-ink-strong);
  letter-spacing: 0.01em;
}

.page-head__lead {
  font-size: var(--fs-label);
  color: var(--color-ink-muted);
}

.page-head__actions {
  margin-inline-start: auto;
}

/* ---------- Card（Charter⑩ 共通カード） ---------- */

.card {
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}

.card__body {
  padding: var(--space-5);
}

.section {
  margin-bottom: var(--space-5);
}

.section__head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2) var(--space-4);
  margin-bottom: var(--space-3);
}

.section__title {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-section);
  font-weight: var(--fw-bold);
  color: var(--color-ink-strong);
}

.section__title .icon {
  color: var(--color-primary);
}

.section__note {
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

/* ---------- StatTile（今日の状況） ---------- */

.stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
  gap: var(--space-3);
}

.stat {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-5);
  border: 1px solid;
  border-radius: var(--radius-md);
}

.stat__icon {
  display: grid;
  place-items: center;
}

.stat__icon .icon {
  width: var(--icon-lg);
  height: var(--icon-lg);
}

.stat__label {
  font-size: var(--fs-label);
  font-weight: var(--fw-medium);
  line-height: var(--lh-tight);
}

.stat__value {
  font-size: var(--fs-stat);
  font-weight: var(--fw-bold);
  line-height: 1.15;
  font-variant-numeric: tabular-nums;
}

.stat__unit {
  font-size: var(--fs-label);
  font-weight: var(--fw-medium);
  margin-inline-start: var(--space-1);
}

/* 状態別の配色。件数0のときは主張を弱める。 */
.stat--waiting {
  color: var(--state-waiting-fg);
  background: var(--state-waiting-bg);
  border-color: var(--state-waiting-border);
}
.stat--ordered {
  color: var(--state-ordered-fg);
  background: var(--state-ordered-bg);
  border-color: var(--state-ordered-border);
}
.stat--alert {
  color: var(--state-alert-fg);
  background: var(--state-alert-bg);
  border-color: var(--state-alert-border);
}

.stat.is-zero {
  color: var(--color-ink-muted);
  background: var(--color-surface-sunken);
  border-color: var(--color-border);
}

/* ---------- Button（Charter⑩ Button） ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: var(--tap-comfortable);
  padding: var(--space-3) var(--space-5);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  border: 1px solid transparent;
  border-radius: var(--radius-md);
  cursor: pointer;
  text-decoration: none;
  transition: background-color var(--duration-fast) var(--ease-standard),
    border-color var(--duration-fast) var(--ease-standard);
}

.btn:disabled {
  opacity: 0.45;
  cursor: default;
}

/* 押した瞬間の手応え。hoverには依存しない（Charter⑫） */
.btn:not(:disabled):active {
  transform: translateY(1px);
}

/* 主要操作：これから行う操作は常にこの青 */
.btn--primary {
  color: var(--color-ink-inverse);
  background: var(--color-primary);
}
.btn--primary:not(:disabled):active {
  background: var(--color-primary-active);
}

/* 副次操作 */
.btn--secondary {
  color: var(--color-ink);
  background: var(--color-surface);
  border-color: var(--color-border-strong);
}
.btn--secondary:not(:disabled):active {
  background: var(--color-surface-sunken);
}

/* 取り消し等、慎重に扱う操作 */
.btn--quiet-danger {
  color: var(--state-alert-fg);
  background: var(--color-surface);
  border-color: var(--state-alert-border);
}
.btn--quiet-danger:not(:disabled):active {
  background: var(--state-alert-bg);
}

.btn--lg {
  min-height: var(--tap-primary);
  font-size: var(--fs-body-lg);
  padding-inline: var(--space-6);
}

.btn--block {
  width: 100%;
}

/* ---------- StatusBadge（状態表示 / spec §18） ----------
   色・アイコン・文字の3つで状態を示す。色だけに依存しない。 */

.status {
  display: inline-flex;
  /* 文字数ぶんだけの幅にする（列幅いっぱいに伸ばさない） */
  align-self: start;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  font-size: var(--fs-label);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  border: 1px solid;
  border-radius: var(--radius-pill);
  white-space: nowrap;
}

.status--waiting {
  color: var(--state-waiting-fg);
  background: var(--state-waiting-bg);
  border-color: var(--state-waiting-border);
}
.status--ordered {
  color: var(--state-ordered-fg);
  background: var(--state-ordered-bg);
  border-color: var(--state-ordered-border);
}
.status--alert {
  color: var(--state-alert-fg);
  background: var(--state-alert-bg);
  border-color: var(--state-alert-border);
}
.status--done {
  color: var(--state-done-fg);
  background: var(--state-done-bg);
  border-color: var(--state-done-border);
}

/* ---------- OrderCard（技工物1件） ----------
   「情報」「状態」「操作」を3つの列に完全分離する。 */

.order-list {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}

.order {
  display: grid;
  /* 列幅を固定し、全カードで「状態」「操作」の位置を揃える。
     位置が揃っていないと、一覧を上から追うときに視線が左右に振られる。 */
  grid-template-columns: minmax(0, 1fr) 14rem 18rem;
  align-items: center;
  gap: var(--space-4) var(--space-5);
  padding: var(--space-4) var(--space-5);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-inline-start: 6px solid var(--color-border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}

/* 左端の色帯は状態を示す補助表現。単独では意味を持たせない。 */
.order--waiting {
  border-inline-start-color: var(--state-waiting-border);
}
.order--ordered {
  border-inline-start-color: var(--state-ordered-border);
}
.order--alert {
  border-inline-start-color: var(--state-alert-border);
}
.order--done {
  border-inline-start-color: var(--state-done-border);
}

.order__col {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  min-width: 0;
}

/* 「現在の状態」「操作」の列見出し */
.order__col-label {
  font-size: var(--fs-caption);
  font-weight: var(--fw-bold);
  color: var(--color-ink-subtle);
  letter-spacing: 0.02em;
}

.order__identity {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--space-1) var(--space-3);
}

.order__patient {
  font-size: var(--fs-key);
  font-weight: var(--fw-bold);
  color: var(--color-ink-strong);
  font-variant-numeric: tabular-nums;
}

.order__item {
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-bold);
  color: var(--color-ink);
}

.order__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-1) var(--space-4);
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

.order__meta-item {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
}

.order__meta-value {
  font-weight: var(--fw-medium);
  color: var(--color-ink);
  font-variant-numeric: tabular-nums;
}

/* 状態の補足説明（例：到着予定日まであと3日） */
.order__hint {
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

.order__actions {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

/* ---------- Field（入力欄 / Charter⑩） ---------- */

.field {
  margin-bottom: var(--space-5);
}

.field__label {
  display: block;
  margin-bottom: var(--space-2);
  font-size: var(--fs-label);
  font-weight: var(--fw-bold);
  color: var(--color-ink-strong);
}

.field__hint {
  margin-top: var(--space-2);
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

.input {
  width: 100%;
  min-height: var(--tap-comfortable);
  padding: var(--space-3) var(--space-4);
  font-family: inherit;
  font-size: var(--fs-body-lg);
  color: var(--color-ink);
  background: var(--color-surface);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  transition: border-color var(--duration-fast) var(--ease-standard);
}

.input:focus {
  outline: none;
  border-color: var(--color-primary);
  box-shadow: var(--shadow-focus);
}

.input--numeric {
  font-size: var(--fs-key);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.08em;
}

.input--inline {
  width: auto;
  min-width: 11rem;
  /* 列幅に合わせて伸びるが、必要以上には広げない */
  flex: 1 1 11rem;
  max-width: 20rem;
  font-size: var(--fs-body);
}

.input-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2);
}

/* ---------- ChoiceGrid（技工物の選択 / Charter⑪ SelectionCard） ---------- */

.choice-grid {
  display: grid;
  /* 8分類を4列×2段で並べる。1つあたりを大きく取り、文言を折り返させない。 */
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-3);
}

.choice {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: var(--tap-primary);
  padding: var(--space-3);
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-bold);
  color: var(--color-ink);
  background: var(--color-surface);
  border: 2px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: background-color var(--duration-fast) var(--ease-standard),
    border-color var(--duration-fast) var(--ease-standard);
}

/* 選択中は「背景 + 枠 + チェックアイコン」で示す（色だけに頼らない） */
.choice[aria-pressed="true"] {
  color: var(--color-primary-active);
  background: var(--color-primary-soft);
  border-color: var(--color-primary);
}

.choice__check {
  width: var(--icon-sm);
  height: var(--icon-sm);
  flex: none;
  opacity: 0;
  stroke: currentColor;
  stroke-width: 3;
  stroke-linecap: round;
  stroke-linejoin: round;
  fill: none;
}

.choice[aria-pressed="true"] .choice__check {
  opacity: 1;
}

/* ---------- Notice / HelpMessage（Charter⑩） ---------- */

.notice {
  display: flex;
  align-items: flex-start;
  gap: var(--space-3);
  padding: var(--space-4) var(--space-5);
  font-size: var(--fs-label);
  border: 1px solid;
  border-radius: var(--radius-md);
}

.notice__icon {
  margin-top: 0.1em;
}

.notice--info {
  color: var(--state-waiting-fg);
  background: var(--state-waiting-bg);
  border-color: var(--state-waiting-border);
}
.notice--success {
  color: var(--state-done-fg);
  background: var(--state-done-bg);
  border-color: var(--state-done-border);
}
.notice--error {
  color: var(--state-alert-fg);
  background: var(--state-alert-bg);
  border-color: var(--state-alert-border);
}
.notice--warning {
  color: var(--state-ordered-fg);
  background: var(--state-ordered-bg);
  border-color: var(--state-ordered-border);
}

.notice--strong {
  font-weight: var(--fw-bold);
}

/* ---------- NotifyPanel（通知設定） ---------- */

.notify {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3) var(--space-5);
  padding: var(--space-4) var(--space-5);
}

.notify__icon {
  color: var(--color-primary);
}

.notify__text {
  min-width: 0;
}

.notify__state {
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  color: var(--color-ink-strong);
}

.notify__desc {
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

.notify__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  margin-inline-start: auto;
}

/* ---------- EmptyState ---------- */

.empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-8) var(--space-5);
  text-align: center;
  color: var(--color-ink-muted);
  background: var(--color-surface);
  border: 1px dashed var(--color-border-strong);
  border-radius: var(--radius-lg);
}

.empty__icon {
  color: var(--state-done-border);
}

.empty__icon .icon {
  width: 2.5em;
  height: 2.5em;
}

.empty__text {
  font-size: var(--fs-body-lg);
  font-weight: var(--fw-bold);
  color: var(--color-ink);
}

.empty__sub {
  font-size: var(--fs-caption);
}

/* ---------- Modal（Charter⑩ Modal） ---------- */

.modal {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: grid;
  place-items: center;
  padding: var(--space-5);
  background: rgba(15, 32, 44, 0.55);
  animation: fade-in var(--duration-normal) var(--ease-standard);
}

.modal__panel {
  width: min(34rem, 100%);
  padding: var(--space-6);
  background: var(--color-surface);
  border-radius: var(--radius-xl);
  box-shadow: var(--shadow-lg);
  animation: pop-in var(--duration-normal) var(--ease-standard);
}

.modal__title {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-bottom: var(--space-3);
  font-size: var(--fs-section);
  font-weight: var(--fw-bold);
  color: var(--color-ink-strong);
}

.modal__body {
  font-size: var(--fs-body-lg);
  line-height: var(--lh-normal);
  color: var(--color-ink);
}

.modal__note {
  margin-top: var(--space-3);
  font-size: var(--fs-caption);
  color: var(--color-ink-muted);
}

.modal__actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--space-3);
  margin-top: var(--space-6);
}

.modal__actions .btn {
  min-width: 9.5rem;
  flex: 1 1 auto;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
}

@keyframes pop-in {
  from {
    opacity: 0;
    transform: translateY(0.5rem) scale(0.98);
  }
}

/* ---------- OfflineBar ---------- */

.offline-bar {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4);
  font-size: var(--fs-label);
  font-weight: var(--fw-bold);
  color: var(--state-ordered-fg);
  background: var(--state-ordered-bg);
  border-bottom: 1px solid var(--state-ordered-border);
}

/* ---------- Toast（操作結果の通知） ---------- */

.toast-area {
  position: fixed;
  left: 50%;
  bottom: var(--space-5);
  z-index: 90;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  width: min(38rem, calc(100% - var(--space-8)));
  transform: translateX(-50%);
  pointer-events: none;
}

.toast {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-4) var(--space-5);
  font-size: var(--fs-body);
  font-weight: var(--fw-bold);
  border: 1px solid;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
  animation: toast-in var(--duration-normal) var(--ease-standard);
}

.toast--success {
  color: var(--state-done-fg);
  background: var(--state-done-bg);
  border-color: var(--state-done-border);
}
.toast--error {
  color: var(--state-alert-fg);
  background: var(--state-alert-bg);
  border-color: var(--state-alert-border);
}

@keyframes toast-in {
  from {
    opacity: 0;
    transform: translateY(0.75rem);
  }
}

/* ============================================================
   レスポンシブ
   基準：iPad横向き（1180×820 / 1366×1024）
   ============================================================ */

/* iPad縦向き・分割表示：カードを2段組みへ切り替える */
@media (max-width: 60rem) {
  .order {
    grid-template-columns: minmax(0, 1fr) minmax(11rem, auto);
  }
  /* 操作列を下段いっぱいに回して、押しやすさを保つ */
  .order__actions {
    grid-column: 1 / -1;
    flex-direction: row;
    flex-wrap: wrap;
  }
  .order__actions .btn {
    flex: 1 1 12rem;
  }
}

@media (max-width: 40rem) {
  .order {
    grid-template-columns: minmax(0, 1fr);
  }
  .choice-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .app-nav__item {
    flex-direction: column;
    gap: var(--space-1);
    font-size: var(--fs-label);
  }
  .notify__actions {
    margin-inline-start: 0;
    width: 100%;
  }
  .notify__actions .btn {
    flex: 1 1 auto;
  }
}
