/* Cổng Chúa — L0–L1. UI chậm, ấm, không hối. */
:root {
  --ink: #2c261e;
  --ink-soft: #5a5146;
  --cream: #f6efe3;
  --paper: rgba(246, 239, 227, 0.92);
  --gold: #b8934a;
  --gold-dim: #8a6d35;
  --wood: #4a3428;
  --veil: rgba(18, 14, 10, 0.55);
  --veil-deep: rgba(12, 9, 7, 0.78);
  --line: rgba(184, 147, 74, 0.35);
  --safe: #6b8f71;
  --shadow: 0 18px 50px rgba(12, 9, 7, 0.35);
  --serif: "Iowan Old Style", "Palatino Linotype", Palatino, "Book Antiqua", Georgia, serif;
  --sans: "Segoe UI", "Noto Sans", "Helvetica Neue", Arial, sans-serif;
}

* { box-sizing: border-box; }
html, body { margin: 0; height: 100%; overflow: hidden; background: #1a1410; color: var(--cream); font-family: var(--sans); }
button, input, textarea, select { font: inherit; }

#canvas-wrap { position: fixed; inset: 0; }
#canvas-wrap canvas { display: block; width: 100%; height: 100%; }

/* —— Light / chỉ-audio still (no WebGL) —— */
#still-sanctuary {
  position: absolute; inset: 0;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  gap: 18px;
  background:
    radial-gradient(ellipse at 50% 28%, rgba(232, 184, 109, 0.22), transparent 52%),
    radial-gradient(ellipse at 50% 100%, rgba(20, 14, 10, 0.55), transparent 48%),
    linear-gradient(180deg, #2a2118 0%, #14110e 55%, #0e0c0a 100%);
  pointer-events: none;
}
#still-sanctuary[hidden] { display: none !important; }
/* Play-polish #43: cover blank WebGL while first frame builds */
#still-sanctuary.boot-shell {
  z-index: 2;
  pointer-events: none;
}

#still-sanctuary .still-glow {
  position: absolute; inset: 12% 18% 28%;
  background: radial-gradient(ellipse at 50% 40%, rgba(255, 214, 150, 0.14), transparent 70%);
}
/* Play-polish #171: soft god-ray / light shafts on still/audio-only path — solemn, not disco */
#still-sanctuary .still-shafts {
  position: absolute; inset: 0;
  pointer-events: none;
  background:
    linear-gradient(188deg, transparent 8%, rgba(255, 220, 160, 0.07) 28%, transparent 58%),
    linear-gradient(172deg, transparent 10%, rgba(255, 210, 145, 0.055) 32%, transparent 62%),
    linear-gradient(180deg, rgba(255, 230, 180, 0.05) 0%, transparent 42%),
    radial-gradient(ellipse at 50% 22%, rgba(255, 214, 150, 0.12), transparent 48%);
  mix-blend-mode: screen;
  opacity: 0.85;
}
@media (prefers-reduced-motion: reduce) {
  #still-sanctuary .still-shafts { opacity: 0.55; }
}
#still-sanctuary.has-candles .still-shafts {
  background:
    linear-gradient(188deg, transparent 6%, rgba(255, 210, 140, 0.11) 30%, transparent 60%),
    linear-gradient(172deg, transparent 8%, rgba(255, 200, 120, 0.08) 34%, transparent 64%),
    linear-gradient(180deg, rgba(255, 220, 160, 0.08) 0%, transparent 45%),
    radial-gradient(ellipse at 50% 20%, rgba(255, 200, 130, 0.18), transparent 50%);
  opacity: 0.95;
}
#still-sanctuary .still-nave {
  position: absolute; left: 8%; right: 8%; bottom: 0; height: 38%;
  background: linear-gradient(180deg, transparent, rgba(42, 32, 24, 0.55) 40%, rgba(18, 14, 10, 0.85));
  border-top: 1px solid rgba(184, 147, 74, 0.12);
}
#still-sanctuary .still-corpus {
  position: relative; z-index: 1;
  width: min(42vw, 220px); height: auto;
  max-height: 46vh;
  object-fit: contain;
  filter: drop-shadow(0 12px 28px rgba(0,0,0,0.45));
  opacity: 0.92;
}
#still-sanctuary .still-caption {
  position: relative; z-index: 1;
  margin: 0; padding: 0 20px;
  max-width: 28rem;
  text-align: center;
  font-size: 13px; line-height: 1.45;
  color: rgba(246, 239, 227, 0.72);
  text-shadow: 0 1px 8px rgba(0,0,0,0.55);
}
/* Play-polish #12: solemn warm pool + soft nave dim (audio-only / reduce-motion) */
#still-sanctuary.has-candles {
  background:
    radial-gradient(ellipse at 50% 26%, rgba(255, 200, 130, 0.34), transparent 48%),
    radial-gradient(ellipse at 50% 100%, rgba(12, 8, 6, 0.72), transparent 52%),
    linear-gradient(180deg, #221910 0%, #100e0b 55%, #0a0908 100%);
}
#still-sanctuary.has-candles .still-glow {
  background: radial-gradient(ellipse at 50% 38%, rgba(255, 210, 150, 0.32), rgba(255, 180, 100, 0.08) 55%, transparent 72%);
}
#still-sanctuary.has-candles .still-nave {
  background: linear-gradient(180deg, transparent, rgba(28, 20, 14, 0.7) 40%, rgba(10, 8, 6, 0.92));
}
#still-sanctuary.has-candles .still-corpus {
  filter: drop-shadow(0 10px 26px rgba(40, 22, 8, 0.55)) drop-shadow(0 0 28px rgba(255, 190, 120, 0.18));
  opacity: 0.96;
}
/* Play-polish #167: sit/prayer soft candle mood (audio-only / reduce-motion) — solemn, not disco */
#still-sanctuary.devotion-mood {
  background:
    radial-gradient(ellipse at 50% 28%, rgba(255, 196, 128, 0.22), transparent 50%),
    radial-gradient(ellipse at 50% 100%, rgba(12, 8, 6, 0.55), transparent 55%),
    linear-gradient(180deg, #1f1710 0%, #100e0b 55%, #0a0908 100%);
}
#still-sanctuary.devotion-mood .still-glow {
  background: radial-gradient(ellipse at 50% 40%, rgba(255, 205, 140, 0.22), rgba(255, 175, 95, 0.06) 55%, transparent 72%);
}
#still-sanctuary.prayer-mood .still-corpus {
  filter: drop-shadow(0 10px 24px rgba(40, 22, 8, 0.5)) drop-shadow(0 0 22px rgba(255, 185, 110, 0.14));
}
#still-sanctuary.has-candles.devotion-mood {
  background:
    radial-gradient(ellipse at 50% 26%, rgba(255, 200, 130, 0.40), transparent 48%),
    radial-gradient(ellipse at 50% 100%, rgba(12, 8, 6, 0.74), transparent 52%),
    linear-gradient(180deg, #221910 0%, #100e0b 55%, #0a0908 100%);
}
/* Play-polish #195: sit + nến cháy — ấm hơn nhẹ (still / reduce-motion); không disco; flame eco #22 keep */
#still-sanctuary.has-candles.sit-lit-warm,
#still-sanctuary.has-candles.devotion-mood.sit-lit-warm {
  background:
    radial-gradient(ellipse at 50% 24%, rgba(255, 206, 140, 0.48), transparent 50%),
    radial-gradient(ellipse at 50% 100%, rgba(12, 8, 6, 0.76), transparent 52%),
    linear-gradient(180deg, #241a10 0%, #110e0b 55%, #0a0908 100%);
}
#still-sanctuary.has-candles.sit-lit-warm .still-glow {
  background: radial-gradient(ellipse at 50% 36%, rgba(255, 214, 155, 0.38), rgba(255, 185, 105, 0.10) 55%, transparent 74%);
}
#still-sanctuary.has-candles.sit-lit-warm .still-corpus {
  filter: drop-shadow(0 10px 26px rgba(40, 22, 8, 0.55)) drop-shadow(0 0 32px rgba(255, 195, 125, 0.22));
  opacity: 0.97;
}
/* body HUD: soft warm on candle chip when ngồi + nến cháy */
body.is-seated.has-lit-candles .candle-chip {
  box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.45), 0 4px 18px rgba(180, 110, 40, 0.28);
  background: linear-gradient(160deg, rgba(48, 32, 16, 0.88), rgba(28, 18, 10, 0.92));
}
body.is-seated.has-lit-candles .candle-chip #candle-chip-line {
  color: #f7e7c8;
}
body.audio-only #view { display: none !important; }
body.audio-only #mixer label:has(#quality),
body.audio-only #quality { display: none; }
body.audio-only-pending #gate-light-note { color: var(--gold-dim); }
@media (prefers-reduced-motion: reduce) {
  #still-sanctuary .still-corpus { filter: drop-shadow(0 8px 16px rgba(0,0,0,0.4)); }
}

/* —— Cổng vào —— */
#gate {
  position: fixed; inset: 0; z-index: 40;
  display: flex; align-items: center; justify-content: center;
  /* #20 safe-area — Chạm để vào clear of notch/home */
  padding: max(12px, env(safe-area-inset-top, 0px)) max(16px, env(safe-area-inset-right, 0px)) max(12px, env(safe-area-inset-bottom, 0px)) max(16px, env(safe-area-inset-left, 0px));
  box-sizing: border-box;
  background:
    radial-gradient(ellipse at 50% 30%, rgba(232, 184, 109, 0.18), transparent 55%),
    linear-gradient(180deg, #2a2118 0%, #12100c 100%);
  transition: opacity 1.1s ease, visibility 1.1s ease;
}
#gate.hide {
  opacity: 0; visibility: hidden; pointer-events: none;
  z-index: 0; /* #47: stay below intro/modals after dismiss */
}
.gate-card {
  width: min(440px, calc(100vw - 32px));
  padding: 36px 32px 28px;
  background: var(--paper);
  color: var(--ink);
  border-radius: 6px;
  box-shadow: var(--shadow);
  text-align: center;
}
.gate-kicker {
  letter-spacing: 0.22em; text-transform: uppercase;
  font-size: 11px; color: var(--gold-dim); margin: 0 0 10px;
}
.gate-card h1 {
  font-family: var(--serif); font-weight: 600; font-size: 34px;
  margin: 0 0 8px; letter-spacing: 0.02em;
}
.gate-card .lead {
  margin: 0 0 22px; color: var(--ink-soft); line-height: 1.55; font-size: 15.5px;
}
.gate-card .lead em { font-style: italic; color: var(--ink); }
.disclaimer-box {
  text-align: left; font-size: 13px; line-height: 1.5;
  color: var(--ink-soft); background: rgba(74, 52, 40, 0.06);
  border-left: 3px solid var(--gold); padding: 10px 12px; margin: 0 0 20px;
}
label.quiet {
  display: flex; gap: 10px; align-items: flex-start;
  text-align: left; font-size: 14px; color: var(--ink);
  margin: 0 0 18px; cursor: pointer; line-height: 1.4;
}
label.quiet input { margin-top: 3px; accent-color: var(--gold-dim); }
.btn-enter {
  width: 100%; border: 0; cursor: pointer;
  background: var(--wood); color: var(--cream);
  padding: 14px 18px; border-radius: 4px;
  font-size: 16px; letter-spacing: 0.04em;
  transition: background 0.35s ease, transform 0.35s ease;
}
.btn-enter:hover { background: #3a281e; }
.btn-enter:active { transform: scale(0.99); }
.gate-note { margin: 16px 0 0; font-size: 12px; color: var(--ink-soft); }

/* —— HUD —— */
#hud { position: fixed; inset: 0; z-index: 10; pointer-events: none; }
#hud > * { pointer-events: auto; }

.top-bar {
  position: absolute;
  top: max(16px, env(safe-area-inset-top, 0px));
  left: max(16px, env(safe-area-inset-left, 0px));
  right: max(16px, env(safe-area-inset-right, 0px));
  display: flex; justify-content: flex-start; align-items: flex-start; gap: 12px;
}
.chip, .panel {
  background: var(--veil); backdrop-filter: blur(10px);
  border: 1px solid var(--line); border-radius: 4px;
  color: var(--cream);
}
.chip {
  padding: 8px 12px; font-size: 13px; line-height: 1.35;
  max-width: min(360px, 70vw);
}
.chip strong { font-weight: 600; display: block; font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; color: #e8c27a; margin-bottom: 2px; }
.today-chip {
  text-align: left; cursor: pointer;
  background: #1a1410 !important;
  color: var(--cream);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  max-width: min(168px, 44vw);
  padding: 6px 10px;
  font-size: 12px;
  line-height: 1.3;
  transition: opacity 0.4s ease, visibility 0.4s ease;
}
.today-chip strong {
  font-size: 10px;
  letter-spacing: 0.05em;
  margin-bottom: 1px;
}
.today-chip .today-chip-line {
  display: block;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: 12px;
  color: #f3e6cf;
}
.today-chip.faded { opacity: 0; visibility: hidden; pointer-events: none; }
.today-chip.faded:focus { opacity: 1; visibility: visible; pointer-events: auto; }

.hint {
  position: absolute; left: 50%; top: 64px; bottom: auto;
  transform: translateX(-50%);
  background: rgba(26, 20, 16, 0.92);
  border: 1px solid rgba(184, 147, 74, 0.45);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  padding: 8px 14px; border-radius: 10px; text-align: center;
  font-family: var(--serif); font-size: 15px; line-height: 1.4;
  color: #f3e6cf;
  max-width: min(340px, 78vw);
  opacity: 0; transition: opacity 0.45s ease; pointer-events: none;
  box-shadow: 0 6px 18px rgba(12, 9, 7, 0.35);
  z-index: 8;
}
.hint.show { opacity: 1; }
#hud .hint, #hud .look-label { pointer-events: none; }
/* v428: #hud > * { pointer-events: auto } was overriding these, so coach / first-tips
   banners stole taps from #p-mary and other nave pins. Only the dismiss/skip is tappable. */
#hud > .hint,
#hud > .look-label,
#hud > .coach-tip,
#hud > .first-tips { pointer-events: none !important; }
#hud > .coach-tip .coach-skip,
#hud > .first-tips .first-tips-dismiss { pointer-events: auto !important; }

.dock {
  position: absolute; left: 50%;
  /* Play-polish #20: home indicator — dock above unsafe bottom */
  bottom: max(22px, env(safe-area-inset-bottom, 0px));
  transform: translateX(-50%);
  display: flex; gap: 8px; flex-wrap: wrap; justify-content: center;
  max-width: min(640px, calc(100vw - 24px - env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px)));
  padding-left: env(safe-area-inset-left, 0px);
  padding-right: env(safe-area-inset-right, 0px);
  box-sizing: border-box;
  /* Lavish v11 shot nit: idle was 0.4 → cream #f3e6cf washed out; align ~stand-corner warmth */
  opacity: 0.82;
  transition: opacity 0.35s ease;
}
.dock:hover, .dock:focus-within { opacity: 1; }
.dock button, .icon-btn {
  pointer-events: auto;
  /* Lavish v10-nhanh: cream text #f3e6cf, 17px, warmer darker bg */
  background: rgba(42, 28, 18, 0.94);
  color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.42);
  border-radius: 4px;
  padding: 11px 15px; cursor: pointer; font-size: 17px;
  min-height: 48px;
  transition: background 0.3s ease, border-color 0.3s ease;
}
.dock button:hover, .icon-btn:hover { background: rgba(52, 36, 24, 0.96); border-color: var(--gold); }
.dock button.primary { background: #3a281c; color: #f3e6cf; }
.dock button:disabled { opacity: 0.45; cursor: default; }

.more-wrap { position: relative; }
.more-menu {
  display: none;
  position: absolute; bottom: calc(100% + 8px); right: 0;
  min-width: 188px;
  padding: 6px;
  background: var(--veil-deep);
  border: 1px solid var(--line);
  border-radius: 4px;
  flex-direction: column; gap: 4px;
}
.more-menu.open { display: flex; }
.more-menu button, .more-menu .icon-btn {
  width: 100%; justify-content: flex-start;
  text-decoration: none; display: inline-flex; align-items: center;
}
/* Sit / optional kneel / stand — posture bar; hide under overlay via JS+CSS */
.posture-bar {
  position: absolute;
  /* Play-polish #20: Quỳ/Đứng clear of home indicator + right inset */
  right: max(14px, env(safe-area-inset-right, 0px));
  bottom: max(16px, env(safe-area-inset-bottom, 0px));
  display: flex;
  flex-direction: row-reverse;
  flex-wrap: wrap;
  gap: 8px;
  justify-content: flex-start;
  align-items: stretch;
  pointer-events: none;
  z-index: 12;
  max-width: min(92vw, 280px);
}
.posture-bar .stand-corner {
  pointer-events: auto;
  position: static;
  right: auto;
  bottom: auto;
}
.stand-corner {
  /* Lavish v10-nhanh: same dock style, ≥48px tap */
  position: absolute; right: 14px; bottom: 16px;
  background: rgba(42, 28, 18, 0.94);
  color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.42);
  border-radius: 4px;
  padding: 11px 15px; cursor: pointer; font-size: 17px;
  min-height: 48px; min-width: 48px;
  opacity: 0.88; transition: opacity 0.3s ease, border-color 0.3s ease, background 0.3s ease;
  font-family: var(--serif);
  -webkit-tap-highlight-color: transparent;
  white-space: nowrap;
}
.stand-corner:hover, .stand-corner:focus,
.stand-corner:focus-visible {
  opacity: 1; border-color: var(--gold); background: rgba(52, 36, 24, 0.96);
}
.stand-corner[hidden] { display: none; }
.stand-corner[aria-pressed="true"] {
  border-color: var(--gold);
  background: rgba(58, 40, 28, 0.98);
  color: #fff8ec;
}
body.overlay-open .posture-bar {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.mixer {
  position: absolute; top: 58px; right: 16px;
  width: 220px; padding: 12px 14px 10px;
  display: none;
}
.mixer.open { display: block; }
.mixer h3 { margin: 0 0 8px; font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: #e8c27a; font-weight: 600; }
.mixer label { display: grid; grid-template-columns: 64px 1fr; align-items: center; gap: 8px; font-size: 12px; margin: 6px 0; }
.mixer input[type="range"] { width: 100%; accent-color: var(--gold); }

/* —— Overlay giáo lý —— */
.modal-root {
  position: fixed; inset: 0; z-index: 30;
  display: none; align-items: center; justify-content: center;
  background: rgba(10, 8, 6, 0.45);
  /* #20 safe-area — sticky Đóng/Tiếp/Amen */
  padding: max(20px, env(safe-area-inset-top, 0px)) max(20px, env(safe-area-inset-right, 0px)) max(20px, env(safe-area-inset-bottom, 0px)) max(20px, env(safe-area-inset-left, 0px));
  box-sizing: border-box;
}
.modal-root.open { display: flex; }
.modal {
  width: min(480px, 100%);
  background: var(--cream); color: var(--ink);
  border-radius: 6px; box-shadow: var(--shadow);
  padding: 26px 24px 20px; max-height: min(86vh, 720px); overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
.modal h2 { font-family: var(--serif); margin: 0 0 6px; font-size: 26px; font-weight: 600; }
.modal .sub { margin: 0 0 16px; color: var(--ink-soft); font-size: 14px; line-height: 1.5; }
.intentions { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 0 0 14px; }
.intentions button {
  text-align: left; background: #fff; border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px; padding: 10px 12px; cursor: pointer; color: var(--ink);
  transition: border-color 0.25s ease, background 0.25s ease;
}
.intentions button small { display: block; color: var(--ink-soft); font-size: 11.5px; margin-top: 2px; }
.intentions button.selected { border-color: var(--gold); background: #f3e6c8; box-shadow: 0 0 0 1px rgba(184, 147, 74, 0.35); }
.modal textarea {
  width: 100%; min-height: 72px; resize: vertical;
  border: 1px solid rgba(74, 52, 40, 0.2); border-radius: 4px;
  padding: 10px; background: #fff; color: var(--ink); margin: 0 0 8px;
}
.candle-name-wrap { margin: 0 0 10px; }
.candle-name-wrap label {
  display: block; font-size: 13px; color: var(--ink-soft); margin: 0 0 4px;
}
.candle-name-wrap input[type="text"] {
  width: 100%; border: 1px solid rgba(74, 52, 40, 0.2); border-radius: 4px;
  padding: 10px; background: #fff; color: var(--ink); margin: 0 0 4px;
}
.candle-name-hint { font-size: 11.5px; color: var(--ink-soft); margin: 0 0 4px; line-height: 1.45; }
body.large-text .candle-name-wrap label { font-size: 15px; }
body.large-text .candle-name-wrap input[type="text"] { font-size: 17px; padding: 12px; }
body.large-text .candle-name-hint { font-size: 14px; }
.privacy { font-size: 12px; color: var(--ink-soft); margin: 0 0 14px; }
/* v420: tuỳ chọn giữ ý riêng trên máy đến khi nến tắt (mặc định tắt) */
.candle-keep { display: flex; align-items: flex-start; gap: 8px; min-height: 44px; margin: 6px 0 4px; font-size: 13px; line-height: 1.4; color: var(--ink-soft); cursor: pointer; }
.candle-keep input { flex: none; width: 20px; height: 20px; margin: 2px 0 0; }
.catechesis {
  background: rgba(74, 52, 40, 0.06); border-left: 3px solid var(--gold);
  padding: 12px 14px; margin: 0 0 16px; font-size: 14.5px; line-height: 1.6;
}
.catechesis p { margin: 0 0 8px; }
.catechesis p:last-child { margin: 0; }
.catechesis .src { font-size: 11.5px; color: var(--ink-soft); margin-top: 8px; }
.modal-actions { display: flex; gap: 8px; justify-content: flex-end; flex-wrap: wrap; }
.modal-actions button {
  border: 0; border-radius: 4px; padding: 12px 16px; cursor: pointer;
  min-height: 48px; min-width: 48px; /* a11y — intro / pick / candle «Để sau» */
}
.btn-ghost { background: transparent; color: var(--ink-soft); }
.btn-solid { background: var(--wood); color: var(--cream); }

.sign-cross {
  width: 90px; height: 110px; margin: 12px auto 18px; position: relative;
}
.sign-cross .beam, .sign-cross .post {
  position: absolute; background: var(--gold-dim); border-radius: 2px;
  transform-origin: center; opacity: 0.25;
}
.sign-cross .post { width: 8px; height: 110px; left: 41px; top: 0; }
.sign-cross .beam { width: 90px; height: 8px; left: 0; top: 32px; }
.sign-cross.play .post, .sign-cross.play .beam {
  animation: draw-soft 1.8s ease forwards;
}
@keyframes draw-soft {
  0% { opacity: 0.2; }
  40% { opacity: 1; }
  100% { opacity: 0.85; }
}
.sign-words {
  font-family: var(--serif); font-size: 20px; line-height: 1.55; margin: 0 0 8px;
  max-width: min(100%, 390px);
  margin-left: auto;
  margin-right: auto;
  overflow-wrap: anywhere;
}
.sign-progress {
  font-family: var(--sans);
  font-size: 12.5px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-dim);
  margin: 0 0 4px;
  text-align: center;
  max-width: min(100%, 390px);
  margin-left: auto;
  margin-right: auto;
}
.sign-step {
  font-family: var(--serif);
  font-size: 17px;
  font-weight: 600;
  color: var(--ink);
  margin: 0 0 6px;
  text-align: center;
  max-width: min(100%, 390px);
  margin-left: auto;
  margin-right: auto;
}
body.large-text .sign-progress { font-size: 14px; }
body.large-text .sign-step { font-size: 19px; }
#sign-modal .sign-overlay.modal,
#sign-modal .modal.sign-overlay {
  text-align: center;
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: 12px;
}
#sign-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
  justify-content: center;
}
#sign-modal .modal-actions .btn-ghost,
#sign-modal .modal-actions .btn-solid {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#sign-modal .sub,
#sign-modal .catechesis.src {
  max-width: min(100%, 390px);
  margin-left: auto;
  margin-right: auto;
  overflow-wrap: anywhere;
}
@media (max-width: 390px) {
  #sign-modal .modal-actions { gap: 6px; }
  #sign-modal .modal-actions .btn-ghost,
  #sign-modal .modal-actions .btn-solid {
    padding: 11px 12px;
    font-size: 15px;
  }
}

.look-label {
  position: absolute; left: 50%; bottom: 148px; transform: translateX(-50%);
  background: var(--veil); border: 1px solid var(--line);
  padding: 8px 14px; border-radius: 3px;
  font-family: var(--serif); font-size: 18px; line-height: 1.4;
  opacity: 0; transition: opacity 0.35s ease; pointer-events: none;
  max-width: min(420px, 86vw); text-align: center;
}
.look-label.show { opacity: 1; }
/* v436: raise the pew label above the week bar / emote row when the yard dock is on screen */
body:has(#yard-dock) #look-label,
body:has(#yard-dock) .look-label {
  /* dock bottom (70+92+8) + dock height (~68) + gap */
  bottom: calc(70px + 92px + env(safe-area-inset-bottom, 0px) + 8px + 80px);
}
body.is-seated:not(.prayer-rail-open):has(#yard-dock) #look-label,
body.is-seated:not(.prayer-rail-open):has(#yard-dock) .look-label {
  bottom: calc(78px + var(--v391-rail-h, 60px) + 12px + 52px + 8px + 80px + env(safe-area-inset-bottom, 0px));
}

#toast {
  position: fixed; left: 50%; bottom: 150px; transform: translateX(-50%);
  background: var(--veil-deep); border: 1px solid var(--line);
  padding: 10px 16px; border-radius: 4px; z-index: 25;
  opacity: 0; pointer-events: none; transition: opacity 0.6s ease;
  font-family: var(--serif); font-size: 18px;
  /* Play-polish #20: ~390px wrap + side insets on notched landscape */
  max-width: min(86vw, 390px, calc(100vw - 24px - env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px)));
  text-align: center;
  white-space: pre-line; line-height: 1.45;
  box-sizing: border-box;
}
#toast.show { opacity: 1; }
#toast.show.dismissible {
  pointer-events: auto;
  cursor: pointer;
}
/* Soft D1/D7 structured toast (Lavish): serif bold title + body, no middle «·» */
#toast .toast-title {
  font-family: var(--serif);
  font-weight: 700;
  font-size: inherit;
  line-height: 1.35;
  margin: 0 0 4px;
}
#toast .toast-body {
  font-family: var(--serif);
  font-weight: 400;
  font-size: inherit;
  line-height: 1.45;
  opacity: 0.96;
}

#toast .toast-actions {
  margin-top: 8px;
  display: flex;
  justify-content: center;
  gap: 8px;
}
/* Play-polish #192: parish / soft CTA tap ≥48px (a11y) */
#toast .toast-action {
  font-family: var(--serif);
  font-size: 16px;
  line-height: 1.2;
  padding: 12px 16px;
  min-height: 48px;
  min-width: 48px;
  border-radius: 4px;
  border: 1px solid var(--line);
  background: rgba(243, 230, 207, 0.14);
  color: #f3e6cf;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
#toast .toast-action:active {
  background: rgba(243, 230, 207, 0.28);
}
#toast.has-action.dismissible {
  cursor: default;
}
#toast.has-action .toast-title,
#toast.has-action .toast-body {
  cursor: pointer;
}


@media (max-width: 560px) {
  .intentions { grid-template-columns: 1fr; }
  .gate-card h1 { font-size: 28px; }
  .dock button { font-size: 16px; padding: 10px 13px; min-height: 48px; color: #f3e6cf; }
  .stand-corner { font-size: 16px; min-height: 48px; padding: 10px 13px; }
  .hint, .look-label, .rosary .prayer, .sign-words, #toast { font-size: 18px; }
  /* Mân Côi + Đàng Thánh Giá — mobile */
  .rosary-root {
    align-items: stretch;
    padding: max(12px, env(safe-area-inset-top)) 10px max(96px, calc(80px + env(safe-area-inset-bottom)));
  }
  .rosary, .stations-panel {
    width: 100%;
    max-height: min(78vh, calc(100dvh - 110px));
    overflow: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
    padding: 16px 14px 12px;
  }
  .rosary h2 { font-size: 20px; }
  .rosary .mystery { font-size: 14px; }
  .rosary .prayer { font-size: 18px; }
  .rosary-actions { position: sticky; bottom: 0; z-index: 2; padding-top: 8px; background: var(--cream); }
  .rosary-actions button { min-height: 48px; min-width: 48px; padding: 12px 16px; }
  .beads { gap: 4px; }
  .beads i { width: 11px; height: 11px; }
  .stations-dots i { width: 9px; height: 9px; }
  .mixer { right: 10px; left: 10px; width: auto; }
  .posture-bar {
    right: 10px;
    bottom: max(12px, env(safe-area-inset-bottom));
    max-width: min(96vw, 320px);
  }
  .stand-corner, .kneel-corner {
    font-size: 16px;
    min-height: 48px;
    min-width: 48px;
    padding: 10px 13px;
  }
  /* Candle + rosary-pick + thẻ ngày / thư viện: sticky CTAs on ~390px (dock must not cover Đóng) */
  #candle-modal .modal,
  #rosary-pick-modal .modal,
  #learn-modal .modal,
  #library-modal .modal,
  #keeper-modal .modal,
  #checkin-modal .modal,
  #wardrobe-modal .modal,
  #intro-modal .modal {
    max-height: min(88vh, calc(100dvh - 16px));
    overflow: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;
    padding-bottom: 12px;
  }
  #candle-modal .modal-actions,
  #rosary-pick-modal .modal-actions,
  #learn-modal .modal-actions,
  #library-modal .modal-actions,
  #keeper-modal .modal-actions,
  #checkin-modal .modal-actions,
  #wardrobe-modal .modal-actions,
  #intro-modal .modal-actions {
    position: sticky;
    bottom: 0;
    z-index: 2;
    margin: 0 -4px;
    padding: 10px 4px max(8px, env(safe-area-inset-bottom, 0px));
    background: var(--cream);
    box-shadow: 0 -10px 16px var(--cream);
  }
  #candle-modal .modal,
  #rosary-pick-modal .modal { padding-bottom: 84px; }
  /* Line-reader CTAs stay above sticky Đóng on short phones */
  #library-modal #library-detail .lib-line-actions {
    position: sticky;
    bottom: 56px;
    z-index: 1;
    margin: 8px 0 4px;
    padding: 8px 0 6px;
    background: linear-gradient(180deg, transparent, var(--cream) 32%);
  }
  .coach-tip, .hint {
    bottom: max(168px, calc(162px + env(safe-area-inset-bottom, 0px)));
    max-width: min(420px, 94vw);
  }
  /* Coach «Để sau» sticky — one dismiss path, readable on short phones */
  .coach-tip {
    flex-direction: column;
    align-items: stretch;
    text-align: left;
    gap: 10px;
  }
  .coach-tip .coach-skip {
    position: sticky;
    bottom: 0;
    align-self: stretch;
    width: 100%;
    text-align: center;
  }
}
@media (prefers-reduced-motion: reduce) {
  #gate, .hint, #toast, .btn-enter, .today-chip, .dock { transition: none; }
  .sign-cross.play .post, .sign-cross.play .beam { animation: none; opacity: 1; }
}

/* Mân Côi overlay — chậm, chữ lớn, không combo */
.rosary-root {
  position: fixed; inset: 0; z-index: 28;
  display: none; align-items: flex-end; justify-content: center;
  background: linear-gradient(180deg, rgba(10,8,6,0.15), rgba(10,8,6,0.5));
  /* #20 safe-area — panel above dock + home indicator */
  padding: max(20px, env(safe-area-inset-top, 0px)) max(16px, env(safe-area-inset-right, 0px)) max(92px, calc(80px + env(safe-area-inset-bottom, 0px))) max(16px, env(safe-area-inset-left, 0px));
  box-sizing: border-box;
}
.rosary-root.open { display: flex; }
.rosary {
  width: min(560px, 100%);
  background: var(--cream); color: var(--ink);
  border-radius: 6px; box-shadow: var(--shadow);
  padding: 22px 22px 16px;
}
.rosary .count {
  font-size: 13px; letter-spacing: 0.08em; text-transform: uppercase;
  color: var(--gold-dim); margin: 0 0 6px;
}
.rosary h2 { font-family: var(--serif); font-size: 22px; margin: 0 0 8px; }
.rosary .mystery { font-size: 14.5px; color: var(--ink-soft); margin: 0 0 12px; line-height: 1.45; }
.rosary .prayer {
  font-family: var(--serif); font-size: 19px; line-height: 1.55; margin: 0 0 12px;
}
.rosary .src { font-size: 11.5px; color: var(--ink-soft); margin: 0 0 14px; }
.beads {
  display: flex; gap: 4px; flex-wrap: wrap; margin: 0 0 14px;
}
.beads i {
  width: 12px; height: 12px; border-radius: 50%;
  background: #c4b39a; display: inline-block;
}
.beads i.on { background: var(--gold-dim); }

/* WIN-GAP P0: highlight từng dòng lời kinh (parity niemphat, không TTS) */
.rosary .prayer { display: flex; flex-direction: column; gap: 0.35em; }
.rosary .prayer-line {
  margin: 0;
  color: var(--ink-soft);
  transition: color 0.15s ease, background 0.15s ease;
  border-radius: 3px;
  padding: 1px 2px;
  scroll-margin-top: 12px;
  scroll-margin-bottom: 80px;
}
.rosary .prayer-line.current {
  color: var(--ink);
  background: rgba(184, 147, 74, 0.16);
  font-weight: 600;
}
.rosary-tempo {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; color: var(--ink-soft);
  margin: 0 0 10px; cursor: pointer; user-select: none;
}
.rosary-tempo input { width: 18px; height: 18px; accent-color: var(--gold-dim); }
body.large-text .rosary-tempo { font-size: 15px; }
body.large-text .rosary-tempo input { width: 20px; height: 20px; }
.rosary-actions { display: flex; gap: 8px; justify-content: flex-end; }
/* Play-polish #8: sticky CTAs always so Đóng/Tiếp stay clear of dock (mirror stations) */
#rosary-root .rosary {
  display: flex;
  flex-direction: column;
  max-height: min(82vh, calc(100dvh - 100px));
  overflow: hidden;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
#rosary-root .rosary .prayer {
  flex: 1 1 0%;
  min-height: 0;
  max-height: 100%;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
#rosary-root .rosary .src {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
@media (max-width: 560px) {
  #rosary-root .rosary .src { -webkit-line-clamp: 1; }
}
#rosary-root .rosary-actions {
  position: static;
  flex-shrink: 0;
  flex-wrap: wrap;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: var(--cream);
}
#rosary-root .rosary-actions button {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 14px;
}
.beads i.current { outline: 1.5px solid var(--gold-dim); outline-offset: 1px; }
.rosary .count {
  word-break: break-word;
  overflow-wrap: anywhere;
}
.rosary .mystery {
  word-break: break-word;
  overflow-wrap: anywhere;
}
.tooltip-pop {
  position: absolute; left: 16px; bottom: 118px;
  max-width: min(340px, 80vw);
  padding: 12px 14px; display: none;
}
.tooltip-pop.show { display: block; }
.tooltip-pop strong { display: block; color: #e8c27a; margin-bottom: 4px; font-family: var(--serif); font-size: 18px; }
.tooltip-pop p { margin: 0; font-family: var(--serif); font-size: 18px; line-height: 1.45; }

.tooltip-pop { max-width: min(420px, 86vw); }
.tooltip-pop .src {
  margin: 8px 0 0;
  font-family: var(--sans);
  font-size: 12.5px;
  line-height: 1.4;
  color: rgba(246, 239, 227, 0.72);
}
.sign-words, .rosary .prayer { font-size: 20px; }
.learn-modal { width: min(540px, 100%); }
.learn-modal h3 {
  font-family: var(--serif);
  font-size: 18px;
  margin: 18px 0 8px;
}
.learn-kicker {
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-size: 12px;
  color: var(--gold-dim);
  margin: 0 0 6px;
}
.learn-lead {
  font-family: var(--serif);
  font-size: 20px;
  margin: 0 0 12px;
  line-height: 1.4;
}
.learn-text {
  font-family: var(--serif);
  font-size: 18px;
  line-height: 1.55;
  margin: 0 0 10px;
  color: var(--ink);
  overflow-wrap: anywhere;
  word-break: break-word;
  max-width: min(100%, 390px);
}
.learn-lead {
  overflow-wrap: anywhere;
  word-break: break-word;
  max-width: min(100%, 390px);
}
.learn-refs {
  font-size: 17px;
  color: var(--ink-soft);
}
/* Featured feast / Sunday — solemn badge, not gamey chip */
.learn-feast {
  max-width: min(100%, 390px);
}
.learn-feast-rank {
  display: inline-block;
  font-family: var(--sans);
  font-size: 11.5px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--gold-dim);
  margin-right: 4px;
  vertical-align: 0.12em;
}
.learn-feast-title {
  font-family: var(--serif);
  font-size: 18.5px;
  color: var(--ink);
}
.learn-feast-note {
  font-size: 16.5px;
  color: var(--ink-soft);
  max-width: min(100%, 390px);
}
.learn-empty {
  font-family: var(--serif);
  font-size: 17px;
  color: var(--ink-soft);
  font-style: italic;
  max-width: min(100%, 390px);
  padding: 8px 0 4px;
}

/* Play-polish #9: sticky Đóng / CGKPV always (mirror rosary/stations) */
#learn-modal .modal {
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: 12px;
}
#learn-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
}
#learn-modal .modal-actions .btn-ghost,
#learn-modal .modal-actions .btn-solid,
#learn-modal .modal-actions a.btn-solid {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
@media (max-width: 390px) {
  #learn-modal .modal-actions {
    gap: 6px;
  }
  #learn-modal .modal-actions .btn-ghost,
  #learn-modal .modal-actions .btn-solid,
  #learn-modal .modal-actions a.btn-solid {
    padding: 11px 12px;
    font-size: 15px;
  }
  .learn-text, .learn-lead, .learn-feast, .learn-feast-note, .learn-empty {
    max-width: 100%;
  }
}

.learn-uncertain {
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.45;
  margin: 0 0 12px;
  padding: 8px 12px;
  color: var(--ink-soft);
  background: rgba(74, 52, 40, 0.05);
  border-left: 3px solid var(--gold-dim);
  border-radius: 0 4px 4px 0;
}
.learn-modal .src { font-size: 12.5px; color: var(--ink-soft); margin: 8px 0 0; line-height: 1.45; }
.learn-index { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 12px; }
.learn-index button {
  background: #fff;
  border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px;
  padding: 8px 10px;
  cursor: pointer;
  color: var(--ink);
  font-size: 13.5px;
}
.learn-index button:hover { border-color: var(--gold-dim); background: #f3e6c8; }
#learn-detail strong { font-family: var(--serif); font-size: 18px; }
#learn-detail p { font-family: var(--serif); font-size: 18px; line-height: 1.5; margin: 0 0 8px; }
#learn-detail .src { font-family: var(--sans); font-size: 12.5px; }
a.btn-solid {
  display: inline-flex; align-items: center;
  text-decoration: none; background: var(--wood); color: var(--cream);
  border-radius: 4px; padding: 10px 16px;
}


/* Chọn chế độ Mân Côi + thư viện kinh/giáo lý */
.pick-btn {
  display: block; width: 100%; text-align: left;
  background: #fff; border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px; padding: 12px 14px; margin: 0 0 8px;
  cursor: pointer; color: var(--ink); font-size: 14.5px; line-height: 1.4;
  min-height: 48px; /* a11y tap — rosary picker / library */
}
.pick-btn:hover { border-color: var(--gold-dim); background: #f3e6c8; }
.pick-btn-primary {
  background: var(--wood);
  color: var(--cream);
  border-color: var(--wood);
  font-family: var(--serif);
  font-size: 15.5px;
  padding: 12px 14px;
  min-height: 48px;
  /* Stay visible while scrolling other ngắm on ~390px */
  position: sticky;
  top: 0;
  z-index: 3;
  box-shadow: 0 8px 12px -6px rgba(42, 28, 18, 0.35);
}
.pick-btn-primary:hover {
  background: #5a4032;
  border-color: var(--gold-dim);
  color: var(--cream);
}
.pick-btn-resume {
  border-color: rgba(232, 194, 122, 0.55);
  background: #faf3e4;
}
.pick-or {
  margin: 4px 0 10px;
  letter-spacing: 0.02em;
}
body.large-text .pick-btn-primary { font-size: 17px; min-height: 52px; padding: 14px 16px; }
.lib-tabs {
  display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 14px;
}
.lib-tabs button {
  background: #fff; border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px; padding: 8px 12px; cursor: pointer;
  color: var(--ink); font-size: 13.5px;
}
.lib-tabs button.on {
  background: var(--wood); color: var(--cream); border-color: var(--wood);
}
#library-body h3 {
  font-family: var(--serif); font-size: 18px; margin: 4px 0 10px;
}
#library-detail a { color: var(--gold-dim); }


/* WIN-GAP P2 #7: thư viện đọc theo dòng (reuse prayer-line + tempo) */
#library-detail.lib-line-reader .prayer-lines {
  display: flex; flex-direction: column; gap: 0.35em;
  font-family: var(--serif); font-size: 20px; line-height: 1.5;
  margin: 10px 0 12px;
}
#library-detail .prayer-line {
  margin: 0;
  color: var(--ink-soft);
  transition: color 0.15s ease, background 0.15s ease;
  border-radius: 3px;
  padding: 1px 2px;
}
#library-detail .prayer-line.current {
  color: var(--ink);
  background: rgba(184, 147, 74, 0.16);
  font-weight: 600;
}
#library-detail .lib-line-actions {
  display: flex; gap: 8px; justify-content: flex-end; flex-wrap: wrap;
  margin: 8px 0 4px;
}
#library-detail .lib-line-actions .btn-ghost,
#library-detail .lib-line-actions .btn-solid {
  min-height: 44px;
}
/* Play-polish #11: progress clear ~390px (mirror rosary/stations) */
#library-detail .lib-line-progress {
  font-family: var(--sans);
  font-size: 12.5px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--gold-dim);
  margin: 2px 0 6px;
  max-width: min(100%, 390px);
  word-break: break-word;
  overflow-wrap: anywhere;
}
body.large-text #library-detail .lib-line-progress { font-size: 14px; }
/* Play-polish #11: sticky Đóng + short/line CTAs always (mirror learn/rosary) */
#library-modal .modal {
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: 12px;
}
#library-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
}
#library-modal .modal-actions .btn-ghost,
#library-modal .modal-actions .btn-solid {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#library-modal #library-detail .lib-line-actions {
  position: sticky;
  bottom: 56px;
  z-index: 1;
  margin: 8px 0 4px;
  padding: 8px 0 6px;
  background: linear-gradient(180deg, transparent, var(--cream) 32%);
}
#library-modal #library-detail .lib-line-actions .btn-ghost,
#library-modal #library-detail .lib-line-actions .btn-solid {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 14px;
}
@media (max-width: 390px) {
  #library-modal .modal-actions { gap: 6px; }
  #library-modal #library-detail .lib-line-actions { gap: 6px; bottom: 52px; }
  #library-modal #library-detail .lib-line-actions .btn-ghost,
  #library-modal #library-detail .lib-line-actions .btn-solid {
    padding: 11px 12px;
    font-size: 15px;
  }
  #library-detail .lib-line-progress { font-size: 12px; }
}
body.large-text #library-detail.lib-line-reader .prayer-lines { font-size: 22px; }
#library-body > .pick-btn { margin-bottom: 12px; }

/* Play-polish #16: kho / học giáo lý — cards + detail wrap ~390px; empty solemn */
#library-body .learn-index {
  max-width: min(100%, 390px);
}
#library-body .lib-card {
  min-height: 48px;
  max-width: min(100%, 390px);
  word-break: break-word;
  overflow-wrap: anywhere;
  text-align: left;
}
#library-body .lib-card[aria-current="true"] {
  border-color: var(--gold-dim);
  background: #f3e6c8;
  box-shadow: inset 0 0 0 1px rgba(184, 147, 74, 0.35);
}
#library-detail.catechesis,
#library-detail .lib-detail-empty,
#library-body .lib-empty {
  max-width: min(100%, 390px);
  word-break: break-word;
  overflow-wrap: anywhere;
}
#library-body .lib-empty,
#library-detail .lib-detail-empty {
  font-family: var(--serif);
  font-size: 15.5px;
  line-height: 1.5;
  color: var(--ink-soft);
  margin: 8px 0 12px;
  padding: 10px 12px;
  background: rgba(74, 52, 40, 0.04);
  border-left: 3px solid var(--gold-dim);
  border-radius: 0 4px 4px 0;
}
@media (max-width: 390px) {
  #library-body .lib-card {
    min-height: 48px;
    padding: 10px 12px;
    font-size: 13px;
  }
  #library-body .lib-empty,
  #library-detail .lib-detail-empty {
    font-size: 14.5px;
    padding: 8px 10px;
  }
}


/* Play-polish #91: doctrine long-list UX — sticky group chips · filter · 48px taps (~390px) */
#library-body .lib-doctrine-tools {
  position: sticky;
  top: 0;
  z-index: 3;
  max-width: min(100%, 390px);
  margin: 0 0 8px;
  padding: 6px 0 8px;
  background: linear-gradient(180deg, var(--cream) 70%, transparent);
}
#library-body .lib-doctrine-filter {
  display: block;
  width: 100%;
  box-sizing: border-box;
  min-height: 44px;
  margin: 0 0 8px;
  padding: 10px 12px;
  font-family: var(--serif);
  font-size: 15px;
  color: var(--ink);
  background: #fffdf6;
  border: 1px solid rgba(184, 147, 74, 0.45);
  border-radius: 8px;
}
#library-body .lib-doctrine-filter:focus {
  outline: 2px solid var(--gold-dim);
  outline-offset: 1px;
}
/* Play-polish #116: 9 group chips — horizontal scroll on ~360px; chips ≥48px tap */
#library-body .lib-group-nav {
  display: flex;
  flex-wrap: nowrap;
  gap: 6px;
  max-width: min(100%, 390px);
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;
  padding-bottom: 4px;
}
#library-body .lib-group-chip {
  flex: 0 0 auto;
  min-height: 48px;
  min-width: 48px;
  padding: 8px 12px;
  font-family: var(--serif);
  font-size: 13px;
  line-height: 1.2;
  color: var(--ink-soft);
  background: #f7efdc;
  border: 1px solid rgba(184, 147, 74, 0.4);
  border-radius: 999px;
  cursor: pointer;
}
#library-body .lib-group-chip.on,
#library-body .lib-group-chip:hover {
  color: var(--ink);
  border-color: var(--gold-dim);
  background: #f3e6c8;
}
#library-body .lib-card {
  min-height: 48px;
}
@media (max-width: 390px) {
  #library-body .lib-doctrine-filter {
    min-height: 48px;
    font-size: 14px;
  }
  #library-body .lib-group-chip {
    min-height: 48px;
    padding: 9px 11px;
    font-size: 12.5px;
  }
}

/* Play-polish #32: doctrine groups — Mùa · Bí tích · Kinh nguyện (solemn, ~390px) */
#library-body .lib-doctrine-browse {
  max-width: min(100%, 390px);
}
#library-body .lib-group {
  max-width: min(100%, 390px);
  margin: 0 0 12px;
}
#library-body .lib-group-label {
  font-family: var(--serif);
  font-size: 13.5px;
  line-height: 1.4;
  color: var(--ink-soft);
  margin: 12px 0 6px;
  padding: 0 2px;
  letter-spacing: 0.02em;
}
#library-body .lib-group:first-child .lib-group-label {
  margin-top: 4px;
}
@media (max-width: 390px) {
  #library-body .lib-group-label {
    font-size: 13px;
    margin: 10px 0 5px;
  }
}




/* Chữ lớn (người lớn tuổi / mobile) */
body.large-text .rosary .prayer,
body.large-text .sign-words,
body.large-text .learn-text,
body.large-text .hint,
body.large-text .look-label,
body.large-text #toast,
body.large-text .tooltip-pop p,
body.large-text .tooltip-pop strong { font-size: 22px; }
body.large-text .dock button,
body.large-text .more-menu button { font-size: 17px; padding: 14px 18px; min-height: 48px; min-width: 48px; }
body.large-text .chip { font-size: 14.5px; }
body.large-text .gate-card h1 { font-size: 36px; }
body.large-text .catechesis { font-size: 16.5px; }


/* Đàng Thánh Giá — tái dùng overlay rosary */
.stations-dots i { border-radius: 2px; width: 10px; height: 10px; }
.stations-dots i.current { outline: 1.5px solid var(--gold-dim); outline-offset: 1px; }
.stations-panel .prayer { word-break: break-word; }
body.large-text .stations-panel .prayer { font-size: 22px; }
/* Gospel-ref own line — readable ~390px; wrap long refs / truyền thống label */
.stations-panel .stations-gospel {
  font-family: var(--sans);
  font-size: 13.5px;
  line-height: 1.4;
  color: var(--ink-soft);
  margin: -4px 0 12px;
  padding: 0;
  word-break: break-word;
  overflow-wrap: anywhere;
}
.stations-panel .stations-gospel.biblical { color: var(--ink); }
.stations-panel .stations-gospel.trad { font-style: italic; }
body.large-text .stations-panel .stations-gospel { font-size: 15.5px; }
/* Sticky CTAs always (not only ≤560px) so next/prev stay clear of dock */
.stations-panel .stations-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: 8px;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 32%);
}
.stations-panel .stations-actions button {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 14px;
}
.stations-panel .stations-actions #stations-prev:disabled {
  opacity: 0.4;
  cursor: default;
}
@media (max-width: 380px) {
  .rosary h2 { font-size: 18px; }
  .rosary .prayer, .stations-panel .prayer { font-size: 17px; }
  .rosary .count { font-size: 12px; letter-spacing: 0.04em; }
  .rosary .mystery { font-size: 13px; }
  .stations-panel .stations-gospel { font-size: 12.5px; }
  .stations-panel .mystery { font-size: 13px; }
  .stations-panel .stations-actions { gap: 6px; }
  .stations-panel .stations-actions button { padding: 11px 12px; font-size: 15px; }
  #rosary-root .rosary-actions { gap: 6px; }
  #rosary-root .rosary-actions button { padding: 11px 12px; font-size: 15px; }
  .pick-btn-primary { font-size: 14.5px; padding: 11px 12px; }
}

/* —— Hạt chip + check-in / wardrobe stubs (Lavish QC 0611) —— */
.hat-chip {
  /* QC #137c: small single-line pill, safe-area top-left companion */
  margin-left: auto;
  text-align: center;
  cursor: pointer;
  background: rgba(18, 14, 10, 0.72);
  max-width: none;
  width: auto;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  padding: 6px 12px !important;
  border-radius: 999px !important;
  opacity: 0.72;
  transition: opacity 0.8s ease, visibility 0.8s ease;
  pointer-events: auto;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  line-height: 1.2;
  max-height: 36px;
}
.hat-chip.hat-hidden {
  opacity: 0 !important;
  visibility: hidden;
  pointer-events: none;
}
.hat-chip.claimable { border-color: rgba(232, 194, 122, 0.65); opacity: 0.72; }
.hat-chip:hover, .hat-chip:focus { opacity: 1; }
.hat-chip strong { display: none; } /* label folded into line */
.hat-chip #hat-chip-line {
  font-size: 13px; color: #f3e6cf; white-space: nowrap;
  letter-spacing: 0.02em;
}
.disclaimer-inline {
  font-size: 15px; line-height: 1.45; color: var(--ink-soft);
  border-left: 3px solid var(--gold); padding: 8px 10px;
  background: rgba(74, 52, 40, 0.06); margin: 0 0 14px;
}
.progress-stats p { margin: 0 0 6px; font-size: 15px; color: var(--ink); }
.wardrobe-list { display: flex; flex-direction: column; gap: 8px; margin: 0 0 12px; }
.wardrobe-item {
  display: block; width: 100%; text-align: left;
  background: #fff; border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px; padding: 12px 14px; cursor: pointer; color: var(--ink);
  font-size: 15px; min-height: 48px;
}
.wardrobe-item .w-name {
  display: block; font-family: var(--serif); font-weight: 600;
  font-size: 17px; line-height: 1.3; color: var(--ink);
}
.wardrobe-item .w-meta {
  display: block; font-size: 15px; color: var(--ink-soft); margin-top: 3px; line-height: 1.4;
}
.wardrobe-item .w-lock {
  display: block; font-size: 13px; color: var(--ink-soft); margin-top: 6px;
  letter-spacing: 0.02em;
}
.wardrobe-item .w-lock::before { content: "🔒 "; font-size: 11px; }
.wardrobe-item .w-soon {
  display: inline-block; margin-top: 6px; font-size: 14px;
  color: var(--gold-dim); letter-spacing: 0.06em; text-transform: uppercase;
  border: 1px solid rgba(184, 147, 74, 0.45); border-radius: 3px;
  padding: 2px 7px; background: rgba(246, 239, 227, 0.85);
}
.wardrobe-item .w-eq { display: block; font-size: 14px; color: var(--gold-dim); margin-top: 4px; }
.wardrobe-item.equipped { border-color: var(--gold-dim); background: #f3e6c8; }
.wardrobe-item.greyed {
  opacity: 1; cursor: default;
  background: var(--cream); /* cream, not cold grey */
  border-color: rgba(74, 52, 40, 0.12);
  color: var(--ink-soft);
}
.wardrobe-item.greyed .w-name { color: var(--ink-soft); font-weight: 550; }
.wardrobe-item.greyed .w-meta { color: #7a7166; }
.wardrobe-item:disabled { cursor: default; }
.wardrobe-item:not(:disabled):hover { border-color: var(--gold-dim); background: #f3e6c8; }
#wardrobe-modal .sub { font-size: 15px; }
@media (max-width: 520px) {
  .top-bar { flex-wrap: wrap; }
  .hat-chip { margin-left: 0; max-width: 100%; }
}

/* —— Share stub + first-visit intro —— */
.share-stub { width: 100%; margin: 8px 0 4px; }
.share-note { margin: 0 0 10px; font-size: 12px; color: var(--ink-soft); }
#intro-modal .gate-kicker {
  margin: 0 0 6px; font-size: 12px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--gold-dim);
}
#intro-modal h2 { margin: 0 0 10px; font-size: 22px; }

/* lavish-min-15 — wardrobe / check-in readable floor */
#wardrobe-modal .modal,
#checkin-modal .modal { font-size: 15px; }
#wardrobe-modal .modal .src { font-size: 15px; }


/* —— Lavish wardrobe groups + overlay chrome (0611) —— */
.wardrobe-section { margin: 0 0 12px; }
.wardrobe-sec-title {
  margin: 0 0 8px; font-size: 15px; font-weight: 600;
  letter-spacing: 0.04em; text-transform: uppercase; color: var(--gold-dim);
}
.wardrobe-sec-toggle {
  display: flex; width: 100%; align-items: center; justify-content: space-between;
  background: transparent; border: 1px dashed rgba(74, 52, 40, 0.28);
  border-radius: 4px; padding: 10px 12px; cursor: pointer;
  font-size: 15px; color: var(--ink-soft); margin: 0 0 8px;
}
.wardrobe-sec-toggle .w-count { color: var(--gold-dim); font-size: 14px; }
.wardrobe-soon-sec.open .wardrobe-sec-toggle {
  border-style: solid; border-color: rgba(184, 147, 74, 0.45); color: var(--ink);
}
.wardrobe-sec-body { display: flex; flex-direction: column; gap: 8px; }
.wardrobe-sec-body.collapsed { display: none; }

.today-chip.overlay-hidden,
.hat-chip.overlay-hidden {
  opacity: 0 !important;
  visibility: hidden;
  pointer-events: none;
}

/* Play-polish #6/#8/#9/#10: dock muted under devotion overlay — no tap/focus steal */
body.overlay-open .dock,
body.overlay-open .dock[aria-hidden="true"],
body.overlay-open .dock[aria-hidden="true"] * {
  visibility: hidden;
  opacity: 0;
  pointer-events: none;
}

/* Toast sits clear of dock; when modal open, keep under scrim but readable if any leak */
#toast {
  bottom: max(168px, calc(22px + 56px + env(safe-area-inset-bottom, 0px)));
  z-index: 28;
  line-height: 1.4;
  padding: 12px 18px;
}
body.large-text #toast {
  font-size: 20px;
  max-width: min(92vw, 440px);
  bottom: max(188px, calc(28px + 64px + env(safe-area-inset-bottom, 0px)));
}
body.overlay-open #toast.toast-above-modal.show {
  /* Feedback (mặc trang phục / điểm danh) sits above modal scrim */
  z-index: 40;
  bottom: max(28px, calc(12px + env(safe-area-inset-bottom, 0px)));
}

/* —— Wardrobe 2D silhouette try-preview (0611) — no images / no Xu —— */
.wardrobe-preview {
  display: flex; align-items: center; gap: 14px;
  margin: 0 0 14px; padding: 12px 14px;
  background: #f6efe3; border: 1px solid rgba(74, 52, 40, 0.16);
  border-radius: 6px;
}
.wp-figure {
  flex: 0 0 auto; width: 120px; min-height: 210px;
  display: flex; align-items: flex-end; justify-content: center;
  position: relative;
  /* Soft warm brown/cream halo behind silhouette (Lavish QC) — no black border */
  background:
    radial-gradient(ellipse 72% 58% at 50% 58%,
      rgba(232, 194, 122, 0.38) 0%,
      rgba(246, 239, 227, 0.55) 42%,
      rgba(246, 239, 227, 0) 74%);
  border-radius: 48% 48% 40% 40%;
}
.wp-svg { display: block; max-width: 100%; height: auto; position: relative; z-index: 1; }
.wp-meta { flex: 1 1 auto; min-width: 0; }
.wp-name {
  margin: 0 0 4px; font-family: var(--serif); font-weight: 600;
  font-size: 17px; line-height: 1.3; color: var(--ink);
}
.wp-note {
  margin: 0 0 10px; font-size: 15px; line-height: 1.4; color: var(--ink-soft);
}
.wp-lock-badge {
  display: inline-block; margin: 0 0 8px; font-size: 15px;
  color: var(--gold-dim); letter-spacing: 0.04em;
  border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 3px;
  padding: 6px 10px; background: rgba(246, 239, 227, 0.95);
  min-height: 40px; line-height: 1.3;
}
.wp-lock-badge::before { content: "🔒 "; font-size: 15px; }
/* v409: free items never show the «Sắp có» lock (display above beat the [hidden] attribute) */
.wp-lock-badge[hidden] { display: none !important; }
#wardrobe-wear {
  min-height: 48px; min-width: 120px; padding: 12px 18px;
  font-size: 16px;
}
.wardrobe-item.previewing {
  border-color: var(--gold-dim);
  box-shadow: 0 0 0 2px rgba(184, 147, 74, 0.28);
}
.wardrobe-item.greyed.previewing { background: #efe6d4; }

/* —— Play-polish #161 wardrobe monetize-preview + #162 modal CSS —— */
.wardrobe-preview.is-soon {
  background: #f3ebe0;
  border-style: dashed;
  border-color: rgba(74, 52, 40, 0.22);
}
.wardrobe-preview.is-soon .wp-figure {
  /* Keep garment colors readable; soft veil so «Sắp có» feels preview-only */
  opacity: 0.92;
  filter: saturate(0.92);
}
.wardrobe-preview.is-soon .wp-svg {
  width: 132px;
  height: auto;
  max-width: 132px;
}
.wardrobe-preview.is-soon .wp-lock-badge {
  min-height: 48px;
  display: inline-flex;
  align-items: center;
  padding: 10px 12px;
}
.wardrobe-preview.is-wearable .wp-note { color: var(--ink); }
/* No purchase CTA ever — wear btn only when wearable (JS hides otherwise) */
#wardrobe-wear[hidden] { display: none !important; }
.wardrobe-sec-toggle {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 14px;
}
#wardrobe-modal .modal-actions .btn-ghost,
#wardrobe-modal .modal-actions .btn-solid {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
/* Closed wardrobe must not cover sanctuary / dock */
#wardrobe-modal:not(.open) {
  display: none !important;
  pointer-events: none !important;
  visibility: hidden;
}
#wardrobe-modal.open {
  display: flex;
  pointer-events: auto;
  visibility: visible;
}

body.large-text .wp-name { font-size: 19px; }
body.large-text .wp-note, body.large-text .wp-lock-badge { font-size: 17px; }
body.large-text .wp-lock-badge::before { font-size: 17px; }
body.large-text #wardrobe-wear { font-size: 18px; min-height: 52px; }

body.large-text .wardrobe-item .w-name { font-size: 19px; }
body.large-text .wardrobe-item .w-meta,
body.large-text .wardrobe-sec-toggle,
body.large-text .disclaimer-inline { font-size: 16.5px; }
body.large-text .coach-tip { font-size: 18px; }

/* 3-tap coach — soft skip «Để sau» (pointer-events only on skip) */
.coach-tip {
  position: absolute; left: 50%; bottom: calc(162px + env(safe-area-inset-bottom, 0px)); transform: translateX(-50%);
  background: rgba(18, 14, 10, 0.88); border: 1px solid rgba(232, 194, 122, 0.55);
  color: var(--cream); padding: 10px 14px; border-radius: 4px;
  font-family: var(--serif); font-size: 16px; line-height: 1.4;
  max-width: min(420px, 86vw); text-align: center;
  opacity: 0; pointer-events: none; transition: opacity 0.5s ease; z-index: 12;
  display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px 12px;
}
.coach-tip.show { opacity: 1; }
.coach-tip .coach-msg { flex: 1 1 auto; min-width: 0; }
.coach-tip .coach-skip {
  pointer-events: auto;
  flex: 0 0 auto;
  min-height: 48px;
  min-width: 48px;
  padding: 8px 14px;
  margin: 0;
  border-radius: 4px;
  border: 1px solid rgba(232, 194, 122, 0.55);
  background: rgba(12, 9, 7, 0.55);
  color: #fff8ec;
  font-family: var(--serif);
  font-size: 15px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.coach-tip .coach-skip:hover,
.coach-tip .coach-skip:focus-visible {
  border-color: var(--gold);
  background: rgba(42, 32, 22, 0.9);
}
body.large-text .coach-tip .coach-skip {
  min-height: 52px;
  min-width: 52px;
  font-size: 17px;
  padding: 10px 16px;
}
.dock button.coach-pulse {
  border-color: var(--gold);
  box-shadow: 0 0 0 2px rgba(232, 194, 122, 0.35);
  opacity: 1 !important;
  animation: coach-glow 1.8s ease-in-out infinite;
}
@keyframes coach-glow {
  0%, 100% { box-shadow: 0 0 0 2px rgba(232, 194, 122, 0.25); }
  50% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.45); }
}
@media (prefers-reduced-motion: reduce) {
  .dock button.coach-pulse { animation: none; }
}


/* —— First-visit retention tip strip (sit → nến → hạt → thẻ/kho) · Play-polish #191 —— */
.first-tips {
  position: absolute;
  left: 16px;
  right: 16px;
  /* v438: above the dock, not over home-pill / parish-chip (top) or nave pins (mid) */
  top: auto;
  bottom: max(96px, calc(80px + env(safe-area-inset-bottom, 0px)));
  transform: none;
  z-index: 11;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 8px 12px;
  max-width: min(520px, calc(100vw - 32px));
  padding: 8px 10px 8px 14px;
  background: rgba(18, 14, 10, 0.82);
  border: 1px solid rgba(232, 194, 122, 0.42);
  border-radius: 6px;
  color: var(--cream);
  font-family: var(--serif);
  pointer-events: none; /* never block prayer / dock / chips */
  opacity: 0;
  transition: opacity 0.45s ease;
}
.first-tips.show {
  opacity: 1;
  pointer-events: none;
}
.first-tips[hidden] { display: none !important; }
.first-tips-label {
  margin: 0;
  width: 100%;
  text-align: center;
  font-size: 15px;
  letter-spacing: 0.04em;
  color: rgba(232, 194, 122, 0.78);
}
.first-tips-steps {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 10px;
  list-style: none;
  margin: 0;
  padding: 0;
  counter-reset: tipstep;
}
.first-tips-steps li {
  counter-increment: tipstep;
  font-size: 15px;
  line-height: 1.35;
  color: #f6efe3;
  white-space: normal; /* Lavish: wrap on small screens, no nowrap overflow */
}
.first-tips-steps li::before {
  content: counter(tipstep) " · ";
  color: rgba(232, 194, 122, 0.85);
  font-weight: 600;
}
.first-tips-dismiss {
  pointer-events: auto; /* only dismiss is tappable */
  min-height: 48px;
  min-width: 48px;
  padding: 10px 16px;
  margin: 0;
  border-radius: 4px;
  border: 1px solid rgba(232, 194, 122, 0.55);
  background: rgba(12, 9, 7, 0.55);
  color: #fff8ec;
  font-family: var(--serif);
  font-size: 15px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.first-tips-dismiss:hover,
.first-tips-dismiss:focus-visible {
  border-color: var(--gold);
  background: rgba(42, 32, 22, 0.9);
}
body.large-text .first-tips-label { font-size: 17px; }
body.large-text .first-tips-steps li { font-size: 17px; }
body.large-text .first-tips-dismiss {
  min-height: 52px;
  min-width: 52px;
  font-size: 17px;
  padding: 12px 18px;
}
body.overlay-open .first-tips.show {
  opacity: 0;
  pointer-events: none;
}
@media (max-width: 420px) {
  .first-tips {
    /* v438: same bottom slot on the phone profile — do not raise back to 96px (that covered the chips) */
    top: auto;
    bottom: max(96px, calc(80px + env(safe-area-inset-bottom, 0px)));
    gap: 6px 8px;
    padding: 8px 10px;
  }
  .first-tips-steps li { font-size: 15px; white-space: normal; }
}
@media (prefers-reduced-motion: reduce) {
  .first-tips { transition: none; }
}


/* Soft sitters — no nametag, no interact */
.soft-sitter { pointer-events: none; }


/* —— Ambient mute / mixer note (0611 polish-b) —— */
.mixer-check {
  display: flex !important;
  grid-template-columns: none !important;
  align-items: center;
  gap: 8px;
  font-size: 12.5px;
  margin: 4px 0 2px;
  color: #f0e6d4;
  cursor: pointer;
}
.mixer-check input { width: auto; accent-color: var(--gold); }
.mixer-note {
  margin: 0 0 8px;
  font-size: 11px;
  line-height: 1.35;
  color: rgba(232, 194, 122, 0.75);
}
.mixer label:has(input[type="range"]) { opacity: 0.55; }
body.ambient-on .mixer label:has(input[type="range"]) { opacity: 1; }

/* focus rings: see A11y thin polish below */

/* Nến TTL 24h — trạng thái trên máy */
.candle-ttl {
  white-space: pre-line;
  font-size: 14px;
  line-height: 1.45;
  color: var(--ink-soft);
  background: rgba(232, 194, 122, 0.12);
  border: 1px solid rgba(184, 147, 74, 0.35);
  border-radius: 6px;
  padding: 10px 12px;
  margin: 0 0 12px;
}
body.large-text .candle-ttl { font-size: 17px; }

/* —— Advent week prep stub (2026) —— */
.advent-prep {
  margin: 14px 0 16px;
  padding: 12px 14px;
  border-radius: 6px;
  border: 1px solid rgba(107, 76, 122, 0.45);
  background: rgba(107, 76, 122, 0.08);
}
.advent-prep h3 {
  margin: 0 0 8px;
  font-family: var(--serif);
  font-size: 20px;
  color: #5a3d68;
  font-weight: 600;
}
.advent-weeks {
  list-style: none;
  margin: 8px 0 10px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.advent-weeks li {
  padding: 8px 10px;
  border-radius: 4px;
  background: rgba(255, 255, 255, 0.55);
  border: 1px solid rgba(107, 76, 122, 0.22);
  font-size: 15px;
  line-height: 1.4;
  color: var(--ink);
}
/* Current week: dark purple + purple dot (not pink). Pink reserved for Gaudete (week 3). */
.advent-weeks li.current {
  position: relative;
  padding-left: 22px;
  border-color: #4a3558;
  background: rgba(107, 76, 122, 0.12);
}
.advent-weeks li.current::before {
  content: "";
  position: absolute;
  left: 8px;
  top: 50%;
  transform: translateY(-50%);
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: #6b4c7a;
}
.advent-weeks li.current.gaudete {
  border-color: rgba(180, 100, 120, 0.85);
  background: rgba(196, 138, 154, 0.22);
}
.advent-weeks li.current.gaudete::before {
  background: #c48a9a;
}
.advent-weeks .advent-date {
  color: var(--gold-dim);
  font-size: 15px;
  margin-left: 4px;
}
.advent-weeks .advent-note {
  color: var(--ink-soft);
  font-size: 15px;
}
body.large-text .advent-prep h3 { font-size: 24px; }
body.large-text .advent-weeks li { font-size: 17px; padding: 10px 12px; min-height: 48px; }
body.large-text .advent-weeks .advent-note,
body.large-text .advent-weeks .advent-date { font-size: 15px; }

/* P1-3 season path card (readings) — soft 4-week checkboxes */
.season-path {
  margin: 14px 0 18px;
  padding: 12px 14px;
  border: 1px solid rgba(107, 76, 122, 0.35);
  border-radius: 8px;
  background: rgba(107, 76, 122, 0.06);
}
.season-path-soft {
  border-color: rgba(107, 143, 113, 0.4);
  background: rgba(107, 143, 113, 0.07);
}
.season-path h3 {
  margin: 0 0 8px;
  font-size: 18px;
  font-weight: 600;
  color: #4a3558;
}
.season-path-soft h3 { color: #3d5a44; }
.season-path-weeks {
  list-style: none;
  margin: 8px 0 10px;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.season-path-weeks li {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 10px;
  padding: 8px 10px;
  border-radius: 6px;
  background: rgba(255, 255, 255, 0.45);
  min-height: 44px;
}
.season-path-weeks li.current {
  outline: 2px solid rgba(107, 76, 122, 0.45);
  background: rgba(255, 255, 255, 0.7);
}
.season-path-soft .season-path-weeks li.current {
  outline-color: rgba(107, 143, 113, 0.5);
}
.season-path-weeks li.done {
  opacity: 0.78;
}
.season-path-weeks input[type="checkbox"] {
  width: 20px;
  height: 20px;
  accent-color: #6b4c7a;
  flex: 0 0 auto;
}
.season-path-soft .season-path-weeks input[type="checkbox"] {
  accent-color: #6b8f71;
}
.season-path-weeks label {
  flex: 1 1 140px;
  font-size: 15px;
  line-height: 1.35;
  cursor: pointer;
}
.season-path-go {
  flex: 0 0 auto;
  min-height: 40px;
  padding: 6px 12px;
  border-radius: 6px;
  border: 1px solid rgba(107, 76, 122, 0.4);
  background: #f7f1fa;
  color: #4a3558;
  font-size: 14px;
  cursor: pointer;
}
.season-path-soft .season-path-go {
  border-color: rgba(107, 143, 113, 0.45);
  background: #f1f7f2;
  color: #3d5a44;
}
body.large-text .season-path h3 { font-size: 22px; }
body.large-text .season-path-weeks label { font-size: 17px; }
body.large-text .season-path-go { font-size: 16px; min-height: 44px; }



/* —— Elderly / large-control polish (0611) —— */
/* Baseline 48px tap on ritual actions (rosary / stations / candle) */
.rosary-actions button,
#candle-modal .modal-actions button,
#candle-modal .intentions button,
#candle-modal .share-stub,
#sign-modal .modal-actions button {
  min-height: 48px;
  min-width: 48px;
}
#candle-modal .intentions button {
  padding: 12px 14px;
}
#candle-modal .modal-actions button,
.rosary-actions button {
  padding: 12px 18px;
  font-size: 15px;
}

/* High-contrast dock when Chữ lớn (opt-large) */
body.large-text .dock {
  opacity: 0.92;
  gap: 10px;
  bottom: max(22px, env(safe-area-inset-bottom, 0px));
}
body.large-text .dock:hover,
body.large-text .dock:focus-within { opacity: 1; }
body.large-text .dock button,
body.large-text .more-menu button {
  background: rgba(12, 9, 7, 0.94);
  color: #fff8ec;
  border: 2px solid rgba(232, 194, 122, 0.78);
  font-weight: 600;
  letter-spacing: 0.01em;
}
body.large-text .dock button.primary {
  background: #4a3428;
  border-color: #e8c27a;
}
body.large-text .dock button:hover,
body.large-text .more-menu button:hover {
  background: #2a2016;
  border-color: #f0d48a;
}
body.large-text .stand-corner {
  min-height: 48px;
  min-width: 48px;
  padding: 10px 14px;
  font-size: 17px;
  opacity: 0.9;
  background: rgba(12, 9, 7, 0.94);
  color: #fff8ec;
  border: 2px solid rgba(232, 194, 122, 0.78);
}
body.large-text .more-menu {
  background: rgba(12, 9, 7, 0.96);
  border: 2px solid rgba(232, 194, 122, 0.65);
}
body.large-text .rosary-actions button {
  min-height: 52px;
  font-size: 17px;
  padding: 14px 20px;
}
body.large-text #candle-modal .modal-actions button,
body.large-text #candle-modal .intentions button,
body.large-text #sign-modal .modal-actions button {
  min-height: 52px;
  font-size: 17px;
}
body.large-text #candle-modal .intentions button small { font-size: 14px; }

/* —— Soft FPS HUD (debug: ?fps=1 / localStorage cong-chua-debug-fps) —— */
#fps-badge {
  position: fixed;
  right: max(10px, env(safe-area-inset-right, 0px));
  bottom: max(10px, env(safe-area-inset-bottom, 0px));
  z-index: 22;
  padding: 4px 8px;
  border-radius: 3px;
  font: 11px/1.3 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  letter-spacing: 0.02em;
  color: rgba(246, 239, 227, 0.88);
  background: rgba(12, 9, 7, 0.55);
  border: 1px solid rgba(184, 147, 74, 0.28);
  pointer-events: none;
  user-select: none;
}
#fps-badge[hidden] { display: none !important; }
#hud #fps-badge { pointer-events: none; }

/* —— Cohort stats (dev: ?stats=1) —— */
#cohort-stats {
  position: fixed;
  left: max(10px, env(safe-area-inset-left, 0px));
  bottom: max(10px, env(safe-area-inset-bottom, 0px));
  z-index: 22;
  max-width: min(92vw, 420px);
  padding: 4px 8px;
  border-radius: 3px;
  font: 11px/1.35 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  letter-spacing: 0.02em;
  color: rgba(246, 239, 227, 0.88);
  background: rgba(12, 9, 7, 0.55);
  border: 1px solid rgba(184, 147, 74, 0.28);
  pointer-events: none;
  user-select: none;
}
#cohort-stats[hidden] { display: none !important; }

/* —— A11y thin polish (0611) —— */
.skip-link {
  position: fixed;
  left: max(12px, env(safe-area-inset-left, 0px));
  top: max(12px, env(safe-area-inset-top, 0px));
  z-index: 100;
  padding: 10px 14px;
  background: var(--cream);
  color: var(--ink);
  border: 2px solid var(--gold);
  border-radius: 4px;
  font-size: 17px; /* Lavish a11y: chữ lớn 17px */
  min-height: 48px; /* Lavish a11y: hit target ≥48px when revealed */
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  line-height: 1.3;
  text-decoration: none;
  box-shadow: var(--shadow);
  /* hidden until keyboard focus */
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  width: 1px;
  height: 1px;
  overflow: hidden;
  white-space: nowrap;
}
.skip-link:focus,
.skip-link:focus-visible {
  top: max(72px, calc(env(safe-area-inset-top, 0px) + 56px)); /* v426: below Hôm nay pill */
  clip: auto;
  clip-path: none;
  width: auto;
  height: auto;
  overflow: visible;
  white-space: normal;
  outline: 2px solid var(--gold-dim);
  outline-offset: 3px;
}

.today-aside {
  /* flex child in .top-bar — compact chip, not a card over the sanctuary */
  max-width: min(168px, 44vw);
  flex: 0 1 auto;
}
.today-aside .today-chip { max-width: 100%; }

#dock:focus {
  outline: none; /* landing target from skip; children take focus ring */
}

/* Calm gold focus for keyboard / elderly — Lavish, not neon */
:where(a, button, input, textarea, select, [role="button"], [tabindex]:not([tabindex="-1"])):focus-visible {
  outline: 2px solid rgba(232, 194, 122, 0.9);
  outline-offset: 2px;
}
.modal-root.open .modal :focus-visible,
.rosary-root.open .rosary :focus-visible {
  /* Lavish a11y: wood brown on cream modal (gold too faint) */
  outline: 2px solid #4a3428;
  outline-offset: 2px;
}
body.large-text .modal-root.open .modal :focus-visible,
body.large-text .rosary-root.open .rosary :focus-visible {
  outline: 3px solid #4a3428;
  outline-offset: 3px;
}
body.large-text :where(a, button, input, textarea, select, [role="button"], [tabindex]:not([tabindex="-1"])):focus-visible {
  outline-width: 3px;
  outline-offset: 3px;
}

/* WIN-GAP #8 — người giữ nhà thờ (4 câu cố định) */
#keeper-modal .keeper-qs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  margin: 0 0 14px;
}
#keeper-modal .keeper-qs button {
  background: #fff;
  border: 1px solid rgba(74, 52, 40, 0.18);
  border-radius: 4px;
  padding: 12px 14px;
  cursor: pointer;
  color: var(--ink);
  font-family: var(--serif);
  font-size: 16px;
  line-height: 1.35;
  text-align: left;
  min-height: 48px;
}
#keeper-modal .keeper-qs button:hover,
#keeper-modal .keeper-qs button.selected {
  border-color: var(--gold-dim);
  background: #f3e6c8;
}
#keeper-modal #keeper-answer {
  margin: 0 0 12px;
}
#keeper-modal #keeper-answer strong {
  display: block;
  font-family: var(--serif);
  font-size: 18px;
  margin-bottom: 6px;
  color: var(--ink);
}
#keeper-modal #keeper-answer p {
  font-family: var(--serif);
  font-size: 17px;
  line-height: 1.55;
  margin: 0 0 8px;
  color: var(--ink);
}
#keeper-modal #keeper-answer .src {
  font-family: var(--sans);
  font-size: 12.5px;
  color: var(--ink-soft);
  margin: 8px 0 0;
  line-height: 1.45;
}
@media (max-width: 420px) {
  #keeper-modal .keeper-qs { grid-template-columns: 1fr; }
}
body.large-text #keeper-modal .keeper-qs button { font-size: 18px; padding: 14px 16px; }
body.large-text #keeper-modal #keeper-answer strong { font-size: 22px; }
body.large-text #keeper-modal #keeper-answer p { font-size: 20px; }

/* —— Play-polish #21: sticky Đóng secondary modals (keeper/checkin/wardrobe/intro) —— */
#keeper-modal .modal-actions,
#checkin-modal .modal-actions,
#wardrobe-modal .modal-actions,
#intro-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
  margin: 0 -4px;
  padding: 10px 4px max(4px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
}
#keeper-modal .modal-actions .btn-ghost,
#keeper-modal .modal-actions .btn-solid,
#checkin-modal .modal-actions .btn-ghost,
#checkin-modal .modal-actions .btn-solid,
#wardrobe-modal .modal-actions .btn-ghost,
#wardrobe-modal .modal-actions .btn-solid,
#intro-modal .modal-actions .btn-ghost,
#intro-modal .modal-actions .btn-solid {
  min-height: 48px;
  min-width: 48px;
}

/* —— Play-polish #20: mobile safe-area (notch / home indicator / status) ——
 * Gate · #dock · posture-bar · modal-root · rosary-root · sticky CTAs · toast
 * use env(safe-area-inset-*); viewport-fit=cover already on index/offline.
 * Desktop preview unchanged (env insets resolve to 0). */


/* —— Play-polish #47: first-visit dismiss reliable —— */
#intro-modal.modal-root {
  z-index: 50; /* above #gate(40) + toast-above-modal(40) */
  pointer-events: auto;
}
#intro-modal.modal-root.open {
  display: flex;
}
#intro-modal .modal {
  position: relative;
  z-index: 1;
  transform: none;
  animation: none;
}
#intro-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
  pointer-events: auto;
}
#intro-modal #intro-ok {
  position: relative;
  z-index: 4;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  min-width: 48px;
  padding: 14px 20px;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
  transform: none !important;
  animation: none !important;
  pointer-events: auto;
  cursor: pointer;
}
@media (max-width: 420px) {
  #intro-modal #intro-ok {
    width: 100%;
    min-height: 52px;
  }
}
/* While first-visit open, keep toast under intro (not over the CTA) */
body.overlay-open.intro-open #toast.toast-above-modal.show {
  z-index: 35;
}


/* P1-2 check-in gratitude edit — quiet text button */
button.linkish {
  background: none;
  border: none;
  padding: 0;
  margin: 0;
  color: inherit;
  font: inherit;
  text-decoration: underline;
  cursor: pointer;
  opacity: 0.85;
}
button.linkish:focus-visible {
  outline: 2px solid rgba(106, 32, 24, 0.45);
  outline-offset: 2px;
}


/* Play-polish #126 / deploy #125: privacy links */
#gate .gate-privacy-link {
  color: #e8d4b0;
  text-decoration: underline;
  text-underline-offset: 3px;
}
#gate .gate-privacy-link:focus-visible {
  outline: 2px solid #e8d4b0;
  outline-offset: 3px;
}
.more-menu a.more-menu-link {
  display: flex;
  align-items: center;
  min-height: 48px;
  padding: 10px 14px;
  color: #f3e6cf;
  text-decoration: none;
  font: inherit;
  border-radius: 8px;
}
.more-menu a.more-menu-link:hover,
.more-menu a.more-menu-link:focus-visible {
  background: rgba(243, 230, 207, 0.08);
  outline: none;
}


/* Play-polish #133 — niemphat dock: 3 primary + … ; no posture overlap; safe-area */
#dock {
  display: flex;
  flex-wrap: nowrap;
  align-items: stretch;
  justify-content: center;
  gap: 8px;
  max-width: min(420px, calc(100vw - 20px));
  bottom: max(12px, calc(env(safe-area-inset-bottom, 0px) + 8px));
  padding-bottom: 0;
  z-index: 20;
}
#dock .dock-primary,
#dock > .pray-wrap > #btn-pray {
  flex: 1 1 0;
  min-width: 0;
  min-height: 52px;
  padding: 12px 10px;
  font-size: 15px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
#dock .more-wrap { flex: 0 0 auto; }
#dock #btn-more {
  min-width: 48px;
  min-height: 52px;
  padding: 12px 14px;
}
.pray-wrap { position: relative; flex: 1 1 0; min-width: 0; display: flex; }
.pray-wrap #btn-pray { width: 100%; }
.pray-menu {
  display: none;
  position: absolute;
  left: 50%;
  bottom: calc(100% + 8px);
  transform: translateX(-50%);
  min-width: min(260px, 86vw);
  background: rgba(42, 28, 18, 0.96);
  border: 1px solid var(--line);
  border-radius: 8px;
  flex-direction: column;
  gap: 4px;
  padding: 6px;
  z-index: 25;
}
.pray-menu.open { display: flex; }
.pray-menu button {
  min-height: 48px;
  width: 100%;
  justify-content: flex-start;
  text-align: left;
}
#posture-bar[hidden], #posture-bar { display: none !important; }

.top-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  align-items: flex-start;
  max-width: calc(100vw - 12px);
}
.candle-chip {
  margin-left: 0;
  max-width: 42vw;
  padding: 6px 10px;
  font-size: 13px;
  opacity: 0.85;
}
.candle-chip strong { font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: #e8c27a; display: block; }
.candle-chip #candle-chip-line { color: #f3e6cf; font-size: 13px; }
.sound-toggle {
  /* Play-polish #215: tap ≥48 (was 44) · mute/unmute clarity */
  min-width: 48px; min-height: 48px;
  border-radius: 999px;
  border: 1px solid rgba(184, 147, 74, 0.45);
  background: rgba(42, 28, 18, 0.88);
  color: #f3e6cf;
  font-size: 18px;
  cursor: pointer;
  margin-left: auto;
  touch-action: manipulation;
}
.sound-toggle[aria-pressed="false"] {
  opacity: 0.55;
  border-color: rgba(184, 147, 74, 0.28);
  filter: grayscale(0.35);
}
.sound-toggle[aria-pressed="true"] {
  opacity: 1;
  border-color: rgba(232, 194, 122, 0.65);
  box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.18);
}
.gate-sound-row {
  display: flex; gap: 10px; align-items: center; justify-content: center;
  flex-wrap: wrap; margin-top: 4px;
}
.gate-sound.sound-toggle { margin-left: 0; }

.tooltip-pop {
  max-width: min(320px, 88vw);
  max-height: 28vh;
  overflow: hidden;
  z-index: 18;
}
.tooltip-pop[hidden] { display: none !important; }
.tooltip-pop.show { display: block; }
.tooltip-pop #tooltip-body {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 15px;
  line-height: 1.35;
}
.tooltip-pop.is-expanded #tooltip-body {
  display: block;
  -webkit-line-clamp: unset;
  max-height: 40vh;
  overflow: auto;
}
.tooltip-more {
  margin-top: 6px;
  min-height: 40px;
  background: transparent;
  border: 0;
  color: #e8c27a;
  text-decoration: underline;
  cursor: pointer;
  font: inherit;
  padding: 4px 0;
}
.tooltip-pop .src { font-size: 12px; margin-top: 6px; }

@media (max-width: 430px) {
  #dock .dock-primary,
  #dock > .pray-wrap > #btn-pray {
    font-size: 14px;
    padding: 11px 8px;
  }
  .today-aside { max-width: calc(100vw - 120px); }
  .hat-chip, .candle-chip { max-width: 38vw; }
}

/* ===== Play-polish #137 — prayer rail + character creator (niemphat bar) ===== */
.prayer-rail {
  position: absolute;
  left: 50%;
  bottom: calc(158px + env(safe-area-inset-bottom, 0px));
  transform: translateX(-50%);
  width: min(560px, calc(100vw - 8px));
  z-index: 28;
  pointer-events: none;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
}
.prayer-tabs {
  display: flex;
  flex-wrap: nowrap;
  gap: 5px;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  pointer-events: auto;
  padding: 2px 4px;
  justify-content: space-between;
}

.prayer-tabs::-webkit-scrollbar { display: none; }
.prayer-tab {
  flex: 1 1 0;
  min-width: 0;
  border: 1px solid rgba(201, 162, 74, 0.35);
  background: rgba(42, 30, 22, 0.88);
  color: #f3e6cf;
  border-radius: 999px;
  padding: 9px 4px;
  font-size: 11px;
  font-weight: 600;
  min-height: 40px;
  cursor: pointer;
  white-space: nowrap;
  text-align: center;
}
.prayer-tab[aria-selected="true"] {
  background: linear-gradient(180deg, #c9a24a 0%, #a8842e 100%);
  color: #2a1c12;
  border-color: #e6c878;
}
.prayer-panel {
  pointer-events: auto;
  background: rgba(28, 20, 14, 0.92);
  border: 1px solid rgba(201, 162, 74, 0.4);
  border-radius: 14px;
  padding: 12px 14px 14px;
  color: #f6ecda;
  backdrop-filter: blur(8px);
}
.prayer-panel-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 8px;
}
.prayer-panel-head strong { flex: 1; font-size: 16px; }
.prayer-counter {
  font-variant-numeric: tabular-nums;
  background: rgba(201, 162, 74, 0.2);
  border: 1px solid rgba(201, 162, 74, 0.45);
  border-radius: 999px;
  padding: 4px 10px;
  font-size: 13px;
  color: #f0d9a0;
}
.prayer-panel-close {
  width: 40px; height: 40px; min-width: 40px;
  border-radius: 50%;
  border: 1px solid rgba(243, 230, 207, 0.25);
  background: transparent;
  color: #f3e6cf;
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
}
.prayer-lyric {
  margin: 0 0 6px;
  font-size: 18px;
  line-height: 1.45;
  min-height: 2.9em;
  color: #fff6e4;
}
.prayer-lyric .pray-line { opacity: 0.55; }
.prayer-lyric .pray-line.is-active {
  opacity: 1;
  color: #ffe08a;
  font-weight: 700;
}
.prayer-hint { margin: 0 0 10px; font-size: 12px; opacity: 0.72; }
.prayer-panel-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}
.prayer-voice { font-size: 13px; display: flex; align-items: center; gap: 6px; }
#prayer-tap { min-width: 120px; min-height: 48px; }
.prayer-src { margin: 8px 0 0; font-size: 11px; opacity: 0.65; }

/* Creator — Play-polish #163 beauty + tap ≥48px; closed no cover sanctuary */
#creator-modal:not(.open) {
  /* v440: keep flex layout precomputed so first #btn-enter open is not a 4× 160ms+ style task */
  display: flex;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
}
#creator-modal.open { display: flex; opacity: 1; }
#creator-modal .creator-modal { max-width: 420px; }
.creator-preview {
  display: flex; justify-content: center; margin: 4px 0 14px;
}
.creator-silhouette {
  width: 132px; height: 156px;
  border-radius: 50% 50% 42% 42%;
  background: radial-gradient(circle at 50% 28%, #4a3424 0%, #1c1410 72%);
  border: 2px solid rgba(201, 162, 74, 0.55);
  position: relative;
  overflow: hidden;
  transition: box-shadow 0.18s ease, transform 0.18s ease, border-color 0.18s ease;
}
.creator-silhouette.is-flash {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.55), 0 8px 22px rgba(0,0,0,0.35);
  transform: scale(1.03);
  border-color: #e0c070;
}
/* Head — bigger chibi circle */
.creator-silhouette::before {
  content: "";
  position: absolute; left: 50%; top: 18%;
  width: 56px; height: 56px; margin-left: -28px;
  border-radius: 50%;
  background: var(--creator-skin, #eec8a4);
  box-shadow: inset -4px -6px 0 rgba(0,0,0,0.06);
  z-index: 2;
}
/* Body / áo */
.creator-silhouette::after {
  content: "";
  position: absolute; left: 50%; top: 48%;
  width: 64px; height: 78px; margin-left: -32px;
  border-radius: 20px 20px 24px 24px;
  background: linear-gradient(180deg, var(--creator-accent, #d4c4a8) 0 12%, var(--creator-body, #f8f6f1) 12%);
  z-index: 1;
}
.creator-silhouette.shape-aodai::after {
  width: 58px; margin-left: -29px;
  border-radius: 16px 16px 28px 28px;
  height: 84px;
}
.creator-silhouette.shape-robe::after {
  width: 70px; margin-left: -35px;
  border-radius: 28px 28px 36% 36%;
}
.creator-field { display: block; margin: 8px 0 4px; font-size: 13px; }
#creator-name {
  width: 100%; box-sizing: border-box;
  padding: 12px 14px; border-radius: 10px;
  border: 1px solid rgba(201, 162, 74, 0.35);
  background: rgba(255, 250, 240, 0.96);
  font-size: 16px;
  min-height: 48px;
}
.creator-label { margin: 12px 0 6px; font-size: 13px; font-weight: 600; }
.creator-row { display: flex; flex-wrap: wrap; gap: 8px; }
.creator-chip {
  border: 1px solid rgba(90, 70, 50, 0.35);
  background: #efe6d6;
  color: #2a1c12;
  border-radius: 999px;
  padding: 12px 16px;
  min-height: 48px;
  min-width: 48px;
  font-size: 14px;
  cursor: pointer;
}
.creator-skin-chip::before {
  content: "";
  display: inline-block;
  width: 14px; height: 14px;
  border-radius: 50%;
  margin-right: 8px;
  vertical-align: -2px;
  background: var(--chip-skin, #eec8a4);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,0.15);
}
.creator-chip[aria-pressed="true"] {
  background: #3a281c;
  color: #f3e6cf;
  border-color: #c9a24a;
}
.creator-chip.is-soon { opacity: 0.55; }
/* Play-polish #177: creator outfit list shows new free try-ons; tap ≥44px (48). */
.creator-outfits { display: flex; flex-direction: column; gap: 6px; max-height: 160px; overflow: auto; }
.creator-outfit {
  text-align: left;
  border: 1px solid rgba(90, 70, 50, 0.3);
  background: #f7f1e6;
  border-radius: 10px;
  padding: 12px 14px;
  min-height: 48px;
  min-width: 48px;
  cursor: pointer;
  font-size: 14px;
}
.creator-outfit[aria-pressed="true"] {
  border-color: #c9a24a;
  background: #fff8e8;
  box-shadow: inset 0 0 0 1px #c9a24a;
}
.creator-outfit .soon-tag {
  float: right; font-size: 11px; color: #8a6a28; font-weight: 600;
}
#creator-modal .modal-actions .btn-solid,
#creator-modal .modal-actions .btn-ghost {
  min-height: 48px;
  min-width: 48px;
}

@media (max-width: 480px) {
  .prayer-rail { bottom: calc(76px + env(safe-area-inset-bottom, 0px)); width: calc(100vw - 10px); }
  .prayer-tab { padding: 9px 12px; font-size: 13px; }
  .prayer-lyric { font-size: 16px; }
}
body.large-text .prayer-tab { font-size: 16px; padding: 12px 16px; }
body.large-text .prayer-lyric { font-size: 20px; }
body.prayer-rail-open .hat-chip,
body.prayer-rail-open .candle-chip,
body.prayer-rail-open .today-aside { display: none !important; }
body.prayer-rail-open .dock {
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, 12px);
}
.prayer-panel {
  max-height: min(42vh, 340px);
  overflow: auto;
  padding: 10px 12px 12px;
}
.prayer-lyric {
  font-size: 16px;
  min-height: 2.4em;
  max-height: 5.6em;
  overflow: hidden;
}
.prayer-rail {
  bottom: calc(76px + env(safe-area-inset-bottom, 0px));
}
body.prayer-rail-open .prayer-rail {
  /* dock hidden — drop rail nearer thumb */
  bottom: calc(14px + env(safe-area-inset-bottom, 0px));
}
/* Creator silhouette hair bump (#163 — clearer on bigger head) */
.creator-silhouette.has-hair::before {
  box-shadow: 0 -12px 0 7px var(--creator-hair, #8f6848);
}
.creator-silhouette.hair-bob::before {
  box-shadow: 0 -8px 0 9px var(--creator-hair, #8f6848), 0 10px 0 5px var(--creator-hair, #8f6848);
}
.creator-silhouette.hair-long::before {
  box-shadow: 0 -10px 0 8px var(--creator-hair, #8f6848), 0 20px 0 6px var(--creator-hair, #8f6848);
}
.creator-silhouette.hair-bun::before {
  box-shadow: 0 -16px 0 6px var(--creator-hair, #8f6848), 0 -26px 0 4px var(--creator-hair, #8f6848);
}
.creator-silhouette.hair-short::before {
  box-shadow: 0 -10px 0 6px var(--creator-hair, #8f6848);
}
.creator-silhouette.hair-none::before {
  box-shadow: none;
}


body.is-seated .hat-chip { opacity: 0.35; }
body.is-seated .hat-chip:focus-within, body.is-seated .hat-chip:hover { opacity: 1; }

/* QC: seated play — one prayer bar like niemphat (dock tucked) */
body.is-seated:not(.prayer-rail-open) .dock {
  opacity: 0.0;
  pointer-events: none;
  transform: translate(-50%, 20px);
}
body.is-seated .prayer-rail {
  bottom: calc(16px + env(safe-area-inset-bottom, 0px));
}
body.is-seated .candle-chip { opacity: 0.95; }
/* slim candle affordance when dock hidden */
body.is-seated #hud .sound-toggle { z-index: 30; }


/* ===== QC #137d — compact karaoke prayer + readable tabs ===== */
.prayer-panel {
  max-height: min(24vh, 180px) !important;
  overflow: hidden;
  padding: 6px 10px 8px !important;
  background: rgba(18, 12, 10, 0.62) !important;
  backdrop-filter: blur(10px);
}
.prayer-voice { font-size: 12px; }
body.prayer-rail-open .prayer-tabs {
  margin-bottom: 4px;
}

.prayer-panel-head { margin-bottom: 4px !important; }
.prayer-panel-head strong { font-size: 14px !important; }
.prayer-hint, #prayer-rail-src { display: none !important; }
.prayer-lyric {
  font-size: 15px !important;
  line-height: 1.35 !important;
  min-height: 2.6em !important;
  max-height: 3.4em !important;
  overflow: hidden !important;
  margin: 0 0 6px !important;
}
.prayer-lyric .pray-line.is-active {
  opacity: 1 !important;
  color: #ffe08a !important;
  font-weight: 700 !important;
  font-size: 16px;
  display: block;
}
.prayer-lyric .pray-line.is-next {
  opacity: 0.42 !important;
  color: #f3e6cf !important;
  font-weight: 500 !important;
  font-size: 13px;
  display: block;
  margin-top: 2px;
}
.prayer-panel-actions { gap: 8px; }
#prayer-tap { min-height: 40px !important; min-width: 100px; padding: 8px 12px; font-size: 14px; }
.prayer-tab {
  font-size: 11px !important;
  padding: 8px 4px !important;
  min-height: 38px !important;
}
.hat-chip #hat-chip-line { font-size: 12px !important; }
body.prayer-rail-open .prayer-rail {
  bottom: calc(10px + env(safe-area-inset-bottom, 0px)) !important;
}

/* QC #137d3 panel — hard compact so scene+avatar stay visible */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: 20vh !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 6px 10px 6px !important;
  background: rgba(16, 12, 10, 0.55) !important;
}
#prayer-panel .prayer-panel-actions {
  margin: 2px 0 0 !important;
}
#prayer-tap {
  min-height: 34px !important;
  padding: 4px 12px !important;
  font-size: 13px !important;
}
.prayer-counter { padding: 2px 8px !important; font-size: 12px !important; }
.prayer-lyric { max-height: 2.8em !important; min-height: 2.2em !important; font-size: 14px !important; }
body.prayer-rail-open .prayer-tabs { margin-bottom: 2px !important; }

/* QC #137d4 panel — karaoke strip ≤~28% total rail, scene stays open */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: 16vh !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 4px 8px 4px !important;
  background: rgba(14, 10, 8, 0.48) !important;
  border-color: rgba(201, 162, 74, 0.28) !important;
}
.prayer-panel-head { margin-bottom: 2px !important; gap: 6px !important; }
.prayer-panel-head strong { font-size: 13px !important; }
.prayer-panel-close { width: 32px !important; height: 32px !important; min-width: 32px !important; font-size: 18px !important; }
.prayer-lyric {
  max-height: 2.6em !important;
  min-height: 2.0em !important;
  font-size: 13px !important;
  margin: 0 0 2px !important;
  line-height: 1.25 !important;
}
.prayer-lyric .pray-line.is-active { font-size: 14px !important; }
.prayer-lyric .pray-line.is-next { font-size: 12px !important; opacity: 0.38 !important; }
#prayer-tap { min-height: 30px !important; padding: 3px 10px !important; font-size: 12px !important; }
.prayer-voice { font-size: 11px !important; }
.prayer-counter { padding: 1px 6px !important; font-size: 11px !important; }
.prayer-tab {
  font-size: 10.5px !important;
  padding: 6px 2px !important;
  min-height: 34px !important;
}
body.prayer-rail-open .prayer-rail {
  bottom: calc(8px + env(safe-area-inset-bottom, 0px)) !important;
  gap: 3px !important;
}

/* QC #137d5 hat — keep 📿 N hạt readable while seated */
body.is-seated .hat-chip,
body.is-seated .hat-chip.hat-hidden {
  opacity: 1 !important;
  display: flex !important;
  pointer-events: auto !important;
  visibility: visible !important;
}
.hat-chip { z-index: 40 !important; }
.hat-chip.hat-hidden { opacity: 1 !important; visibility: visible !important; }

/* QC #137d6 lyric — current + next visible inside compact panel */
.prayer-lyric {
  max-height: 3.2em !important;
  min-height: 2.4em !important;
  overflow: hidden !important;
}
.prayer-lyric .pray-line.is-next { display: block !important; }

/* ===== Play-polish #165 — prayer-rail polish (readable lyric · clear counter · close ≥48px · no cover altar) =====
   Overrides residual #137d* compact that shrunk close to 32px / lyric to 13px. Panel stays dock-bottom. */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: min(30vh, 240px) !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 10px 12px 12px !important;
  background: rgba(20, 12, 8, 0.86) !important;
  border-color: rgba(201, 162, 74, 0.5) !important;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}
.prayer-panel-head {
  margin-bottom: 6px !important;
  gap: 8px !important;
}
.prayer-panel-head strong {
  font-size: 15px !important;
  color: #fff6e4 !important;
}
.prayer-counter {
  padding: 6px 12px !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  color: #ffe08a !important;
  background: rgba(201, 162, 74, 0.3) !important;
  border: 1px solid rgba(201, 162, 74, 0.65) !important;
  min-height: 32px;
  display: inline-flex;
  align-items: center;
  letter-spacing: 0.02em;
}
.prayer-panel-close {
  width: 48px !important;
  height: 48px !important;
  min-width: 48px !important;
  min-height: 48px !important;
  font-size: 26px !important;
  border-radius: 50%;
  border: 1px solid rgba(243, 230, 207, 0.35) !important;
  background: rgba(42, 30, 22, 0.55) !important;
  color: #f3e6cf !important;
  cursor: pointer;
  flex-shrink: 0;
}
.prayer-panel-close:active {
  transform: scale(0.94);
  background: rgba(201, 162, 74, 0.25) !important;
}
.prayer-lyric {
  max-height: 4.4em !important;
  min-height: 3em !important;
  font-size: 16px !important;
  line-height: 1.4 !important;
  margin: 0 0 8px !important;
  color: #fff8ea !important;
  overflow: hidden !important;
}
.prayer-lyric .pray-line.is-active {
  opacity: 1 !important;
  color: #ffe08a !important;
  font-weight: 700 !important;
  font-size: 17px !important;
  display: block !important;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.55);
}
.prayer-lyric .pray-line.is-next {
  opacity: 0.5 !important;
  color: #f3e6cf !important;
  font-weight: 500 !important;
  font-size: 13px !important;
  display: block !important;
  margin-top: 3px;
}
.prayer-panel-actions {
  gap: 10px;
  margin-top: 2px !important;
}
.prayer-voice { font-size: 13px !important; color: #f3e6cf; }
#prayer-tap {
  min-height: 48px !important;
  min-width: 128px !important;
  padding: 10px 16px !important;
  font-size: 15px !important;
  font-weight: 700;
  transition: transform 0.08s ease, filter 0.08s ease;
}
#prayer-tap.is-tap-flash {
  transform: scale(0.96);
  filter: brightness(1.14);
}
.prayer-tab {
  font-size: 11.5px !important;
  padding: 8px 4px !important;
  min-height: 40px !important;
}
body.prayer-rail-open .prayer-rail {
  bottom: calc(10px + env(safe-area-inset-bottom, 0px)) !important;
  gap: 6px !important;
}
body.is-seated .prayer-rail {
  bottom: calc(14px + env(safe-area-inset-bottom, 0px));
}
body.large-text .prayer-lyric { font-size: 19px !important; }
body.large-text .prayer-lyric .pray-line.is-active { font-size: 20px !important; }
body.large-text .prayer-panel-close {
  width: 52px !important;
  height: 52px !important;
  min-width: 52px !important;
  min-height: 52px !important;
}
@media (max-width: 390px) {
  .prayer-lyric { font-size: 15px !important; }
  .prayer-lyric .pray-line.is-active { font-size: 16px !important; }
  #prayer-panel.prayer-panel,
  .prayer-panel { max-height: min(32vh, 250px) !important; }
}

/* QC #137e creator 3D preview circle */
.creator-silhouette {
  overflow: hidden;
  background: radial-gradient(circle at 50% 40%, #4a3428 0%, #1c1410 75%) !important;
}
.creator-silhouette::before,
.creator-silhouette::after { display: none !important; content: none !important; }
.creator-silhouette canvas { width: 100% !important; height: 100% !important; }

/* QC #137f — prayer panel ≤25% vh (overrides prior 30/32vh bumps) */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: 25vh !important;
  height: auto !important;
  min-height: 0 !important;
  padding: 6px 10px 8px !important;
  background: rgba(16, 12, 10, 0.55) !important;
}
@media (max-width: 480px) {
  #prayer-panel.prayer-panel,
  .prayer-panel { max-height: 25vh !important; }
}
body.large-text #prayer-panel.prayer-panel,
body.large-text .prayer-panel { max-height: 25vh !important; }
.prayer-lyric {
  max-height: 3.0em !important;
  min-height: 2.2em !important;
  font-size: 14px !important;
}


/* ===== Play-polish #169 — avatar idle/sit (JS bobAmp/gold-ring; no heavy CSS) ===== */

/* ===== Play-polish #170 — Hạt pill readable · ≥44px tap · no cover sanctuary ===== */
.hat-chip {
  min-height: 44px !important;
  max-height: none !important;
  padding: 10px 14px !important;
  background: rgba(18, 14, 10, 0.90) !important;
  border: 1px solid rgba(232, 194, 122, 0.62) !important;
  opacity: 0.94 !important;
  gap: 8px !important;
  line-height: 1.25 !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.28);
}
.hat-chip #hat-chip-line {
  font-size: 14px !important;
  font-weight: 650 !important;
  color: #fff6e4 !important;
  letter-spacing: 0.01em;
}
.hat-chip.claimable {
  border-color: rgba(232, 194, 122, 0.95) !important;
  box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.4), 0 2px 12px rgba(0, 0, 0, 0.3);
  opacity: 1 !important;
}
.hat-chip:hover, .hat-chip:focus, .hat-chip:focus-visible {
  opacity: 1 !important;
  outline: 2px solid rgba(232, 194, 122, 0.55);
  outline-offset: 2px;
}
/* Keep pill clear of sanctuary center — stays top-bar companion */
body.is-seated .hat-chip {
  opacity: 0.96 !important;
}
@media (max-width: 390px) {
  .hat-chip {
    min-height: 44px !important;
    padding: 10px 12px !important;
  }
  .hat-chip #hat-chip-line { font-size: 13.5px !important; }
}

/* Creator outfit swatch ≈ 3D SILHOUETTE (#170) */
.creator-outfit::before {
  content: "";
  display: inline-block;
  width: 14px;
  height: 14px;
  border-radius: 4px;
  margin-right: 8px;
  vertical-align: -2px;
  background: var(--outfit-body, #f7f4ef);
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
}
.creator-silhouette.is-flash {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.55), 0 8px 22px rgba(0, 0, 0, 0.35) !important;
  transform: scale(1.03);
  border-color: #e0c070 !important;
}

/* QC #137g — full karaoke line, never mid-sentence clip */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: 25vh !important;
}
.prayer-lyric {
  max-height: 4.5em !important;
  min-height: 2.4em !important;
  font-size: 13px !important;
  line-height: 1.35 !important;
  overflow: hidden !important;
  margin: 0 0 4px !important;
}
.prayer-lyric .pray-line.is-active {
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 3 !important;
  overflow: hidden !important;
  font-size: 13.5px !important;
  line-height: 1.35 !important;
  white-space: normal !important;
  overflow-wrap: anywhere !important;
  word-break: normal !important;
  color: #ffe08a !important;
  font-weight: 700 !important;
}
.prayer-lyric .pray-line.is-next {
  display: block !important;
  max-height: 1.35em !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  white-space: nowrap !important;
  font-size: 12px !important;
  opacity: 0.38 !important;
}


/* ===== #137g lyric — never clip mid-sentence; 3-line clamp ===== */
.prayer-lyric {
  max-height: 4.6em !important;
  min-height: 2.8em !important;
  font-size: 15px !important;
  line-height: 1.35 !important;
  overflow: hidden !important;
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 3 !important;
  line-clamp: 3 !important;
}
.prayer-lyric .pray-line.is-active {
  font-size: 15px !important;
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 3 !important;
  line-clamp: 3 !important;
  overflow: hidden !important;
  white-space: normal !important;
}


/* ===== Play-polish #179 — Rosary bead highlight · «Hạt n/10» mobile · sticky ≥44 · no sanctuary cover ===== */
#rosary-root .rosary .count {
  font-size: 15.5px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: none;
  color: #5c3f0e;
  margin: 0 0 8px;
  line-height: 1.35;
}
#rosary-root .beads {
  gap: 6px;
  align-items: center;
  margin: 0 0 6px;
}
#rosary-root .beads i {
  width: 14px;
  height: 14px;
  background: #b8a58a;
  box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22);
  transition: transform 0.12s ease, background 0.12s ease, box-shadow 0.12s ease;
}
#rosary-root .beads i.on {
  background: #c9a24a;
}
#rosary-root .beads i.current {
  width: 20px;
  height: 20px;
  background: #e8c27a;
  outline: none;
  box-shadow: 0 0 0 2px #5c3f0e, 0 0 0 4px rgba(232, 194, 122, 0.55);
  transform: scale(1.06);
  z-index: 1;
  position: relative;
}
#rosary-root .beads-progress {
  font-family: var(--sans);
  font-size: 14.5px;
  font-weight: 700;
  color: #5c3f0e;
  margin: 0 0 10px;
  letter-spacing: 0.02em;
  line-height: 1.3;
}
#rosary-root .beads-progress[hidden] { display: none !important; }
#rosary-root .rosary-actions {
  position: static;
  bottom: auto;
  z-index: 3;
}
#rosary-root .rosary-actions button {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 14px;
}
/* Panel stays below sanctuary — keep max-height from #8; reinforce mobile */
@media (max-width: 390px) {
  #rosary-root .rosary .count { font-size: 15px; }
  #rosary-root .beads i { width: 13px; height: 13px; }
  #rosary-root .beads i.current { width: 19px; height: 19px; }
  #rosary-root .beads-progress { font-size: 14px; }
  #rosary-root .rosary {
    max-height: min(78vh, calc(100dvh - 110px));
  }
}

/* ===== Play-polish #180+#203 — Today readings feast badge VI contrast · sticky Đóng/CGKPV ≥48 · empty/UNCERTAIN honesty · soft open pulse ===== */
.learn-feast-rank {
  display: inline-block;
  font-family: var(--sans);
  font-size: 12.5px;
  font-weight: 780;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: #2a1c08;
  background: linear-gradient(180deg, #fff6d6, #e0b45e);
  border: 1.5px solid #7a5818;
  border-radius: 4px;
  padding: 4px 10px;
  margin-right: 8px;
  vertical-align: 0.18em;
  line-height: 1.2;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6), 0 1px 2px rgba(61, 42, 10, 0.18);
}
.learn-feast {
  line-height: 1.5;
  max-width: min(100%, 390px);
}
.learn-feast-title {
  font-family: var(--serif);
  font-size: 19px;
  font-weight: 650;
  color: #2a1c12;
}
.learn-feast-note {
  font-size: 16.5px;
  color: var(--ink-soft);
  max-width: min(100%, 390px);
}
.learn-empty {
  font-family: var(--serif);
  font-size: 17.5px;
  color: #5a4638;
  font-style: italic;
  max-width: min(100%, 390px);
  padding: 8px 10px;
  border-left: 3px solid var(--gold-dim);
  background: rgba(74, 52, 40, 0.04);
  border-radius: 0 4px 4px 0;
}
.learn-uncertain {
  font-size: 14.5px;
  color: #4a3428;
  /* keep honesty note visible — no invent Ordo */
}
#learn-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
}
#learn-modal .modal-actions .btn-ghost,
#learn-modal .modal-actions .btn-solid,
#learn-modal .modal-actions a.btn-solid {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
}
@media (max-width: 390px) {
  .learn-feast-rank {
    font-size: 11.5px;
    padding: 3px 8px;
  }
  .learn-feast-title { font-size: 18px; }
  #learn-modal .modal-actions .btn-ghost,
  #learn-modal .modal-actions .btn-solid,
  #learn-modal .modal-actions a.btn-solid {
    min-height: 48px !important;
    padding: 11px 12px;
  }
}


/* ===== Play-polish #181 — Stations sticky / chặng card · «Chặng n/14» mobile · gospel-ref contrast · sticky ≥48 · keep done-toast #6 ===== */
#stations-root .stations-panel .count {
  font-size: 15.5px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: none;
  color: #5c3f0e;
  margin: 0 0 8px;
  line-height: 1.35;
}
#stations-root .stations-panel .stations-gospel {
  font-size: 14px;
  font-weight: 600;
  line-height: 1.45;
  color: #3d2a0a;
  background: rgba(232, 194, 122, 0.18);
  border-left: 3px solid #8a6520;
  padding: 6px 10px;
  margin: 0 0 12px;
  border-radius: 0 4px 4px 0;
  word-break: break-word;
  overflow-wrap: anywhere;
}
#stations-root .stations-panel .stations-gospel.biblical {
  color: #2a1c12;
  background: rgba(232, 194, 122, 0.28);
}
#stations-root .stations-panel .stations-gospel.trad {
  color: #5a4638;
  font-style: italic;
  background: rgba(74, 52, 40, 0.06);
  border-left-color: #a09070;
}
#stations-root .stations-dots i {
  width: 11px;
  height: 11px;
  background: #b8a58a;
  box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22);
}
#stations-root .stations-dots i.on {
  background: #c9a24a;
}
#stations-root .stations-dots i.current {
  width: 16px;
  height: 16px;
  background: #e8c27a;
  outline: none;
  box-shadow: 0 0 0 2px #5c3f0e, 0 0 0 3px rgba(232, 194, 122, 0.5);
  transform: scale(1.05);
  position: relative;
  z-index: 1;
}
#stations-root .stations-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#stations-root .stations-actions button {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 14px;
}
@media (max-width: 390px) {
  #stations-root .stations-panel .count { font-size: 15px; }
  #stations-root .stations-panel .stations-gospel { font-size: 13.5px; padding: 5px 8px; }
  #stations-root .stations-panel {
    max-height: min(78vh, calc(100dvh - 110px));
  }
  #stations-root .stations-actions button {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
}

/* ===== Play-polish #182 — Sign of the Cross sticky · «Bước n/4» mobile · Đóng/Tiếp ≥48 · keep Esc/closeTopmost #15 ===== */
#sign-modal .sign-progress {
  font-size: 15.5px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: none;
  color: #5c3f0e;
  margin: 0 0 8px;
  line-height: 1.35;
}
#sign-modal .sign-step {
  font-size: 18px;
  font-weight: 700;
  color: #2a1c12;
}
#sign-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#sign-modal .modal-actions .btn-ghost,
#sign-modal .modal-actions .btn-solid {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
}
@media (max-width: 390px) {
  #sign-modal .sign-progress { font-size: 15px; }
  #sign-modal .sign-step { font-size: 17px; }
  #sign-modal .modal-actions .btn-ghost,
  #sign-modal .modal-actions .btn-solid {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
}


/* ===== Play-polish #183 — Library sticky / filter mobile · «Về kho» ≥48 · group chip scroll · keep filter empty «Không bịa giáo lý» · orphan audit · no new doctrine card ===== */
#library-modal #library-detail .lib-line-actions {
  position: sticky;
  bottom: 56px;
  z-index: 2;
  margin: 10px 0 6px;
  padding: 10px 0 8px;
  background: linear-gradient(180deg, transparent, var(--cream) 36%);
  gap: 8px;
}
#library-modal #library-detail .lib-line-actions .btn-ghost,
#library-modal #library-detail .lib-line-actions .btn-solid,
#library-modal #library-detail .lib-line-actions #library-line-back {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
  font-size: 15.5px;
  font-weight: 650;
  color: #3d2a0a;
  border-color: rgba(184, 147, 74, 0.55);
}
#library-body .lib-doctrine-tools {
  position: sticky;
  top: 0;
  z-index: 4;
  padding: 8px 0 10px;
  background: linear-gradient(180deg, var(--cream) 78%, transparent);
}
#library-body .lib-doctrine-filter {
  min-height: 48px;
  font-size: 15px;
  border-color: rgba(184, 147, 74, 0.55);
  background: #fffdf8;
}
#library-body .lib-group-nav {
  display: flex;
  flex-wrap: nowrap;
  gap: 7px;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scrollbar-width: thin;
  padding: 2px 2px 6px;
  max-width: min(100%, 390px);
}
#library-body .lib-group-chip {
  flex: 0 0 auto;
  scroll-snap-align: start;
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 9px 13px;
  font-size: 13px;
  font-weight: 600;
  color: #3d2a0a;
  background: #f7efdc;
  border: 1px solid rgba(184, 147, 74, 0.5);
}
#library-body .lib-group-chip.on {
  background: #f3e6c8;
  border-color: #8a6520;
  box-shadow: inset 0 0 0 1px rgba(138, 101, 32, 0.25);
}
#library-body .lib-empty,
#library-detail .lib-detail-empty,
#library-doctrine-filter-empty {
  font-size: 15px;
  line-height: 1.5;
  color: #5a4638;
  border-left: 3px solid #8a6520;
  background: rgba(232, 194, 122, 0.12);
}
@media (max-width: 390px) {
  #library-modal #library-detail .lib-line-actions { bottom: 52px; gap: 6px; }
  #library-modal #library-detail .lib-line-actions .btn-ghost,
  #library-modal #library-detail .lib-line-actions .btn-solid,
  #library-modal #library-detail .lib-line-actions #library-line-back {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
  #library-body .lib-group-chip {
    min-height: 48px !important;
    padding: 9px 11px;
    font-size: 12.5px;
  }
  #library-body .lib-doctrine-filter { min-height: 48px; font-size: 14.5px; }
}

/* ===== Play-polish #184 — Candle chip + Hạt pill density · one-line · contrast · tap ≥44 · no cover prayer-rail · no feast tip ===== */
.hat-chip,
.candle-chip {
  display: inline-flex !important;
  flex-direction: row !important;
  align-items: center !important;
  gap: 6px !important;
  min-height: 44px !important;
  max-height: none !important;
  padding: 8px 12px !important;
  white-space: nowrap !important;
  line-height: 1.2 !important;
  border-radius: 999px !important;
  box-sizing: border-box;
}
.hat-chip strong,
.candle-chip strong {
  display: none !important; /* label folded into one-line pill */
}
.hat-chip {
  background: rgba(18, 14, 10, 0.92) !important;
  border: 1px solid rgba(232, 194, 122, 0.7) !important;
  opacity: 0.96 !important;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.28);
}
.hat-chip #hat-chip-line {
  font-size: 13.5px !important;
  font-weight: 700 !important;
  color: #fff6e4 !important;
  letter-spacing: 0.01em;
}
.candle-chip {
  background: rgba(18, 14, 10, 0.90) !important;
  border: 1px solid rgba(232, 194, 122, 0.62) !important;
  opacity: 0.95 !important;
  max-width: min(46vw, 220px);
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.26);
  cursor: pointer;
}
.candle-chip #candle-chip-line {
  font-size: 13.5px !important;
  font-weight: 700 !important;
  color: #fff6e4 !important;
  letter-spacing: 0.01em;
}
.hat-chip.claimable {
  border-color: rgba(232, 194, 122, 0.95) !important;
  box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.35), 0 2px 12px rgba(0, 0, 0, 0.3);
}
.hat-chip:hover, .hat-chip:focus, .hat-chip:focus-visible,
.candle-chip:hover, .candle-chip:focus, .candle-chip:focus-visible {
  opacity: 1 !important;
  outline: 2px solid rgba(232, 194, 122, 0.55);
  outline-offset: 2px;
}
/* Density: keep top-bar one row; never sit over prayer-rail (hide when open — retained) */
body.prayer-rail-open .hat-chip,
body.prayer-rail-open .candle-chip {
  display: none !important;
}
@media (max-width: 390px) {
  .hat-chip, .candle-chip {
    min-height: 44px !important;
    padding: 8px 10px !important;
    max-width: 42vw;
  }
  .hat-chip #hat-chip-line,
  .candle-chip #candle-chip-line { font-size: 12.5px !important; }
}

/* ===== Play-polish #185 — Angelus/Regina short sticky · progress rõ · Đóng/Tiếp ≥48 · keep empty TGP honesty · toast «Đọc» chỉ shortVerses · no invent full ===== */
#library-detail.lib-short-reader .lib-line-progress,
#library-detail.lib-line-reader.lib-short-reader #library-line-progress {
  font-size: 15.5px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: none;
  color: #5c3f0e;
  margin: 0 0 8px;
  line-height: 1.35;
  max-width: min(100%, 390px);
  word-break: break-word;
  overflow-wrap: anywhere;
}
#library-detail.lib-short-reader .lib-line-actions {
  position: sticky;
  bottom: 56px;
  z-index: 3;
  margin: 10px 0 6px;
  padding: 10px 0 8px;
  background: linear-gradient(180deg, transparent, var(--cream) 36%);
  gap: 8px;
}
#library-detail.lib-short-reader .lib-line-actions .btn-ghost,
#library-detail.lib-short-reader .lib-line-actions .btn-solid,
#library-detail.lib-short-reader .lib-line-actions #library-line-back,
#library-detail.lib-short-reader .lib-line-actions #library-line-next {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
  font-size: 15.5px;
  font-weight: 650;
}
/* Empty short — sticky Về kho ≥48 · TGP honesty contrast (keep copy; no invent) */
#library-detail #library-short-empty {
  font-size: 15px;
  line-height: 1.5;
  color: #5a4638;
  border-left: 3px solid #8a6520;
  background: rgba(232, 194, 122, 0.12);
  padding: 8px 10px;
  border-radius: 0 4px 4px 0;
  max-width: min(100%, 390px);
}
#library-detail:not(.lib-line-reader) .lib-line-actions #library-line-back {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
}
@media (max-width: 390px) {
  #library-detail.lib-short-reader .lib-line-progress { font-size: 15px; }
  #library-detail.lib-short-reader .lib-line-actions { bottom: 52px; gap: 6px; }
  #library-detail.lib-short-reader .lib-line-actions .btn-ghost,
  #library-detail.lib-short-reader .lib-line-actions .btn-solid {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
}

/* ===== Play-polish #213 — Soft-streak / Hẹn mai yield polish · one soft lane · no key write when hidden · CTA ≥48 · soft pulse · VI trang nghiêm · no spam tip khác ===== */
#toast.toast-soft-retain {
  max-width: min(86vw, 390px);
}
#toast.toast-soft-retain .toast-title {
  font-weight: 700;
  color: #fff6e4;
  letter-spacing: 0.01em;
}
#toast.toast-soft-retain .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}
#toast.toast-soft-retain .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
@keyframes soft-retain-pulse {
  0% { filter: none; }
  40% { filter: drop-shadow(0 0 5px rgba(232, 194, 122, 0.42)); }
  100% { filter: none; }
}
#toast.toast-soft-retain.soft-retain-pulse,
#toast.toast-return-soft.soft-retain-pulse,
#toast.toast-sound-soft.soft-retain-pulse,
#toast.toast-wardrobe-soft.soft-retain-pulse {
  animation: soft-retain-pulse 0.55s ease;
}
#toast.toast-soft-retain.soft-retain-pulse-static,
#toast.toast-return-soft.soft-retain-pulse-static,
#toast.toast-sound-soft.soft-retain-pulse-static,
#toast.toast-wardrobe-soft.soft-retain-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.34));
}
@media (prefers-reduced-motion: reduce) {
  #toast.toast-soft-retain.soft-retain-pulse,
  #toast.toast-return-soft.soft-retain-pulse,
  #toast.toast-sound-soft.soft-retain-pulse,
  #toast.toast-wardrobe-soft.soft-retain-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #187 — Creator sticky / tap targets · Đóng≥48 · skin/hair/outfit chips ≥48 · sil khớp resolveOutfit · closed no cover sanctuary · no IAP/QR/Xu ===== */
#creator-modal .creator-modal {
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: 12px;
}
#creator-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
  margin: 0 -4px;
  padding: 10px 4px max(6px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
  display: flex;
  gap: 8px;
  justify-content: flex-end;
  flex-wrap: wrap;
}
#creator-modal .modal-actions .btn-ghost,
#creator-modal .modal-actions .btn-solid,
#creator-modal .modal-actions #creator-close,
#creator-modal .modal-actions #creator-enter {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
  font-size: 15.5px;
  font-weight: 650;
}
#creator-modal .creator-chip,
#creator-modal .creator-skin-chip,
#creator-modal .creator-outfit,
#creator-modal [data-gender] {
  min-height: 48px !important;
  min-width: 48px !important;
}
#creator-modal:not(.open) {
  display: flex !important;
  pointer-events: none !important;
  visibility: hidden !important;
  opacity: 0 !important;
}
#creator-modal.open {
  display: flex;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}
/* Silhouette CSS mirrors resolveOutfit / SILHOUETTE when 3D preview late */
.creator-silhouette.shape-shirt::after {
  width: 64px; margin-left: -32px;
  border-radius: 20px 20px 24px 24px;
}
@media (max-width: 390px) {
  #creator-modal .modal-actions { gap: 6px; }
  #creator-modal .modal-actions .btn-ghost,
  #creator-modal .modal-actions .btn-solid {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
}

/* ===== Play-polish #188 — Wardrobe sticky try-on · sticky Đóng/Mặc ≥48 · free ao-le-nhe/ao-dai-be rõ · apply chibi ngay · 0 paywall · no feast tip ===== */
#wardrobe-modal .modal {
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}
#wardrobe-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
  margin: 0 -4px;
  padding: 10px 4px max(6px, env(safe-area-inset-bottom, 0px));
  background: linear-gradient(180deg, transparent, var(--cream) 28%);
  display: flex;
  gap: 8px;
  justify-content: flex-end;
  flex-wrap: wrap;
}
#wardrobe-modal .modal-actions .btn-ghost,
#wardrobe-modal .modal-actions .btn-solid,
#wardrobe-modal .modal-actions #wardrobe-close,
#wardrobe-modal .modal-actions #wardrobe-wear {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 16px;
  font-size: 15.5px;
  font-weight: 650;
}
#wardrobe-modal .wardrobe-item {
  min-height: 48px;
}
#wardrobe-modal .wardrobe-item.is-free .w-meta {
  color: #5c3f0e;
  font-weight: 600;
}
#wardrobe-modal .wardrobe-item.is-free .w-free-tag {
  display: inline-block;
  margin-left: 6px;
  padding: 2px 8px;
  border-radius: 999px;
  background: rgba(201, 162, 74, 0.22);
  color: #5c3f0e;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.02em;
  vertical-align: middle;
}
#wardrobe-modal .wardrobe-item.is-free-highlight {
  border-color: rgba(201, 162, 74, 0.55);
  background: #fff8e8;
}
#wardrobe-modal:not(.open) {
  display: none !important;
  pointer-events: none !important;
  visibility: hidden !important;
}
#wardrobe-wear[hidden] { display: none !important; }
@media (max-width: 390px) {
  #wardrobe-modal .modal-actions { gap: 6px; }
  #wardrobe-modal .modal-actions .btn-ghost,
  #wardrobe-modal .modal-actions .btn-solid {
    min-height: 48px !important;
    padding: 11px 12px;
    font-size: 15px;
  }
}

/* ===== Play-polish #189 — Prayer rail lyric mobile contrast (≥#165) · close≥48 · one-tap retained · dock no cover altar · no feast tip =====
   Re-asserts readable lyric/counter after residual #137f/#137g compact shrinks. Panel stays dock-bottom ≤25vh. */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: min(25vh, 220px) !important;
  background: rgba(18, 11, 8, 0.90) !important;
  border-color: rgba(201, 162, 74, 0.55) !important;
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}
.prayer-counter {
  padding: 6px 12px !important;
  font-size: 14.5px !important;
  font-weight: 700 !important;
  color: #ffe08a !important;
  background: rgba(201, 162, 74, 0.34) !important;
  border: 1px solid rgba(232, 194, 122, 0.72) !important;
  min-height: 32px;
  letter-spacing: 0.02em;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45);
}
.prayer-panel-close {
  width: 48px !important;
  height: 48px !important;
  min-width: 48px !important;
  min-height: 48px !important;
  font-size: 26px !important;
}
.prayer-lyric {
  max-height: 4.6em !important;
  min-height: 3.0em !important;
  font-size: 16px !important;
  line-height: 1.4 !important;
  margin: 0 0 8px !important;
  color: #fff8ea !important;
  overflow: hidden !important;
}
.prayer-lyric .pray-line.is-active {
  opacity: 1 !important;
  color: #ffe08a !important;
  font-weight: 700 !important;
  font-size: 17px !important;
  line-height: 1.4 !important;
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 3 !important;
  line-clamp: 3 !important;
  overflow: hidden !important;
  white-space: normal !important;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6), 0 0 12px rgba(232, 194, 122, 0.18);
}
.prayer-lyric .pray-line.is-next {
  opacity: 0.52 !important;
  color: #f3e6cf !important;
  font-weight: 500 !important;
  font-size: 13.5px !important;
  display: block !important;
  margin-top: 3px;
}
#prayer-tap {
  min-height: 48px !important;
  min-width: 128px !important;
}
body.prayer-rail-open .prayer-rail {
  bottom: calc(10px + env(safe-area-inset-bottom, 0px)) !important;
  gap: 6px !important;
}
body.prayer-rail-open .dock {
  /* keep dock clear of sanctuary — slim when rail open (retained #137/#165) */
  opacity: 0.92;
}
body.large-text .prayer-lyric { font-size: 19px !important; }
body.large-text .prayer-lyric .pray-line.is-active { font-size: 20px !important; }
body.large-text .prayer-panel-close {
  width: 52px !important;
  height: 52px !important;
  min-width: 52px !important;
  min-height: 52px !important;
}
@media (max-width: 390px) {
  .prayer-lyric { font-size: 16px !important; }
  .prayer-lyric .pray-line.is-active { font-size: 17px !important; }
  .prayer-lyric .pray-line.is-next { font-size: 13px !important; }
  .prayer-counter { font-size: 14px !important; }
  #prayer-panel.prayer-panel,
  .prayer-panel { max-height: min(26vh, 230px) !important; }
}

/* ===== Play-polish #190 — sit ring / idleBob subtle tune (JS bobAmp/gold-ring; no disco; keep #169 path; flame eco #22) ===== */


/* ===== Play-polish #193 — Soft gratitude / Tạ ơn toast CTA ≥48 (reuse #192 toast-action) · no QR/Xu ===== */
#toast.toast-gratitude-soft .toast-action,
#toast .toast-action {
  min-height: 48px;
  min-width: 48px;
}

/* ===== Play-polish #195 — Candle sit+lit mood polish (CSS subtle; flame eco #22/#174 keep; no heavy asset) ===== */
/* (still-sanctuary sit-lit-warm + body.is-seated.has-lit-candles rules above) */

/* ===== Play-polish #196 — Soft tip Chúa nhật / Mass-prep toast CTA ≥48 · app ≠ Thánh Lễ ===== */
/* ===== Play-polish #198 — Soft tip Kinh chiều / evening examen toast CTA ≥48 · app ≠ giờ kinh giáo xứ ===== */

/* ===== Play-polish #201 — Stations sticky feel · soft done pulse 1 chặng + full · keep #181 sticky ≥48 · gospel-ref honesty · no invent lời ===== */
@keyframes stations-station-done-pulse {
  0% { filter: none; transform: scale(1); }
  40% { filter: drop-shadow(0 0 4px rgba(232, 194, 122, 0.55)); }
  100% { filter: none; transform: scale(1); }
}
@keyframes stations-dot-done-glow {
  0% { box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22); }
  45% { box-shadow: 0 0 0 2px #5c3f0e, 0 0 0 4px rgba(232, 194, 122, 0.45); }
  100% { box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22); }
}
@keyframes stations-complete-pulse {
  0% { filter: none; }
  35% { filter: drop-shadow(0 0 6px rgba(232, 194, 122, 0.6)); }
  100% { filter: none; }
}
#stations-root #stations-count.stations-station-done-pulse,
#stations-root #stations-dots.stations-station-done-pulse {
  animation: stations-station-done-pulse 0.55s ease;
}
#stations-root #stations-dots.stations-station-done-pulse i.on,
#stations-root #stations-dots.stations-station-done-pulse i.current {
  animation: stations-dot-done-glow 0.55s ease;
}
#stations-root #stations-count.stations-station-done-pulse-static,
#stations-root #stations-dots.stations-station-done-pulse-static,
#stations-root #stations-count.stations-complete-pulse-static,
#stations-root #stations-dots.stations-complete-pulse-static,
#stations-root .stations-panel.stations-complete-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.4));
}
#stations-root #stations-count.stations-complete-pulse,
#stations-root #stations-dots.stations-complete-pulse,
#stations-root .stations-panel.stations-complete-pulse {
  animation: stations-complete-pulse 0.7s ease;
}
#stations-root .stations-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#stations-root .stations-actions button {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #stations-root #stations-count.stations-station-done-pulse,
  #stations-root #stations-dots.stations-station-done-pulse,
  #stations-root #stations-dots.stations-station-done-pulse i.on,
  #stations-root #stations-dots.stations-station-done-pulse i.current,
  #stations-root #stations-count.stations-complete-pulse,
  #stations-root #stations-dots.stations-complete-pulse,
  #stations-root .stations-panel.stations-complete-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #202 — Soft tip Thứ Sáu / Đàng Thánh Giá toast CTA ≥48 · app ≠ phụng vụ · yield First Fri #156 ===== */
#toast.toast-stations-friday .toast-action,
#toast.toast-stations-done .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}

/* ===== Play-polish #200 — Soft tip Lòng Chúa Thương Xót toast CTA ≥48 · app ≠ Thánh Lễ / Chaplet nguyên văn ===== */
#toast.toast-mass-prep .toast-action,
#toast.toast-evening-examen .toast-action,
#toast.toast-divine-mercy .toast-action,
#toast.toast-rosary-done .toast-action,
#toast .toast-action {
  min-height: 48px;
  min-width: 48px;
}

/* ===== Play-polish #197 — Kneel/sit transition feel (cam blend / bob / ring; no heavy mesh; keep phone #174) ===== */
/* (logic in js/scene.js + js/avatar.js — CSS chrome unchanged) */

/* ===== Play-polish #199 — Rosary completion feel · soft pulse beads/progress · sticky Đóng/Tiếp ≥48 · keep #179 · no invent lời ===== */
@keyframes rosary-complete-pulse {
  0% { filter: none; transform: scale(1); }
  35% { filter: drop-shadow(0 0 5px rgba(232, 194, 122, 0.65)); }
  70% { filter: drop-shadow(0 0 2px rgba(232, 194, 122, 0.35)); }
  100% { filter: none; transform: scale(1); }
}
@keyframes rosary-bead-complete-glow {
  0% { box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22); }
  40% { box-shadow: 0 0 0 2px #5c3f0e, 0 0 0 5px rgba(232, 194, 122, 0.5); }
  100% { box-shadow: inset 0 0 0 1px rgba(74, 52, 40, 0.22); }
}
#rosary-root .beads.rosary-complete-pulse,
#rosary-root .beads-progress.rosary-complete-pulse,
#rosary-root .count.rosary-complete-pulse {
  animation: rosary-complete-pulse 0.7s ease;
}
#rosary-root .beads.rosary-complete-pulse i.on,
#rosary-root .beads.rosary-complete-pulse i.current {
  animation: rosary-bead-complete-glow 0.7s ease;
}
#rosary-root .beads.rosary-complete-pulse-static i.on,
#rosary-root .beads.rosary-complete-pulse-static i.current,
#rosary-root .beads-progress.rosary-complete-pulse-static,
#rosary-root .count.rosary-complete-pulse-static {
  /* haptic-safe / reduced-motion: one-frame contrast bump, no motion */
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.45));
}
#rosary-root .rosary-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#rosary-root .rosary-actions button {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #rosary-root .beads.rosary-complete-pulse,
  #rosary-root .beads-progress.rosary-complete-pulse,
  #rosary-root .count.rosary-complete-pulse,
  #rosary-root .beads.rosary-complete-pulse i.on,
  #rosary-root .beads.rosary-complete-pulse i.current {
    animation: none !important;
  }
}

/* ===== Play-polish #194 — Library depth UX · «Đọc sâu hơn» related · sticky group chip rõ · empty honesty · Về kho ≥48 keep ===== */
#library-body .lib-doctrine-tools {
  position: sticky;
  top: 0;
  z-index: 5;
  box-shadow: 0 8px 14px -10px rgba(61, 42, 10, 0.35);
  background: linear-gradient(180deg, var(--cream) 82%, rgba(250, 245, 232, 0.92) 92%, transparent);
}
#library-body .lib-group-nav {
  padding-bottom: 8px;
}
#library-body .lib-group-chip {
  min-height: 48px !important;
  min-width: 48px !important;
  font-weight: 650;
}
#library-body .lib-group-chip.on {
  background: #f0e2bc;
  border-color: #7a5818;
  box-shadow: inset 0 0 0 1.5px rgba(122, 88, 24, 0.35);
  color: #2e1f06;
}
#library-detail .lib-related {
  margin: 14px 0 8px;
  padding: 10px 0 4px;
  border-top: 1px solid rgba(184, 147, 74, 0.35);
}
#library-detail .lib-related-label {
  margin: 0 0 8px;
  font-size: 14px;
  font-weight: 700;
  color: #5a3f12;
  letter-spacing: 0.01em;
}
#library-detail .lib-related-btn {
  display: block;
  width: 100%;
  margin: 0 0 8px;
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 11px 14px;
  text-align: left;
  font-size: 15px;
  font-weight: 600;
  color: #3d2a0a;
  background: #f7efdc;
  border: 1px solid rgba(184, 147, 74, 0.55);
  border-radius: 10px;
  cursor: pointer;
}
#library-detail .lib-related-btn:hover,
#library-detail .lib-related-btn:focus-visible {
  background: #f3e6c8;
  border-color: #8a6520;
  outline: none;
}
#library-modal #library-detail .lib-line-actions #library-line-back {
  min-height: 48px !important;
  min-width: 48px !important;
}
#library-body .lib-empty,
#library-detail .lib-detail-empty,
#library-doctrine-filter-empty {
  /* Play-polish #194 keep empty-state honesty «Không bịa giáo lý» */
  color: #5a4638;
}


/* ===== Play-polish #203 — Readings open soft pulse (feast badge / title / sticky) · reduced-motion static · no invent Ordo ===== */
@keyframes readings-open-pulse {
  0% { filter: none; }
  40% { filter: drop-shadow(0 0 5px rgba(232, 194, 122, 0.55)); }
  100% { filter: none; }
}
#learn-modal .learn-feast-rank.readings-open-pulse,
#learn-modal .learn-feast-title.readings-open-pulse,
#learn-modal .learn-kicker.readings-open-pulse,
#learn-modal .modal-actions.readings-open-pulse {
  animation: readings-open-pulse 0.6s ease;
}
#learn-modal .learn-feast-rank.readings-open-pulse-static,
#learn-modal .learn-feast-title.readings-open-pulse-static,
#learn-modal .learn-kicker.readings-open-pulse-static,
#learn-modal .modal-actions.readings-open-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.4));
}
#learn-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
}
#learn-modal .modal-actions .btn-ghost,
#learn-modal .modal-actions .btn-solid,
#learn-modal .modal-actions a.btn-solid {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #learn-modal .learn-feast-rank.readings-open-pulse,
  #learn-modal .learn-feast-title.readings-open-pulse,
  #learn-modal .learn-kicker.readings-open-pulse,
  #learn-modal .modal-actions.readings-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #204 — Soft tip Bài đọc hôm nay toast CTA ≥48 · CGKPV/empty honesty · yield stationsFri/#200/#198/#196 ===== */
#toast.toast-readings .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}


/* ===== Play-polish #205 — Candle / nến ý nguyện completion feel · soft chip pulse · toast ≥48 · keep #167/#195 · reduced-motion · no bí tích/lễ claim ===== */
@keyframes candle-lit-pulse {
  0% { filter: none; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.26); }
  40% { filter: drop-shadow(0 0 6px rgba(232, 194, 122, 0.55)); box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.5), 0 4px 18px rgba(180, 110, 40, 0.32); }
  100% { filter: none; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.26); }
}
.candle-chip.candle-lit-pulse {
  animation: candle-lit-pulse 0.65s ease;
}
.candle-chip.candle-lit-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.4));
  box-shadow: 0 0 0 1px rgba(232, 194, 122, 0.45), 0 4px 14px rgba(180, 110, 40, 0.24);
}
.candle-chip {
  min-height: 48px !important;
  min-width: 48px !important;
}
#candle-modal .modal-actions #candle-ok,
#candle-modal .modal-actions button {
  min-height: 48px !important;
  min-width: 48px !important;
}
#toast.toast-candle-done {
  /* solemn completion lane — no disco */
}
@media (prefers-reduced-motion: reduce) {
  .candle-chip.candle-lit-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #206 — Soft tip thắp nến ý nguyện toast CTA ≥48 · không thay lời cầu giáo xứ · yield readings/#202/#200/#198/#196 ===== */
#toast.toast-candle .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}


/* ===== Play-polish #207 — Sign of the Cross sticky feel · soft step/complete pulse · keep #182 sticky Đóng/Tiếp ≥48 · Esc/closeTopmost #15 · reduced-motion · no invent lời ===== */
@keyframes sign-step-done-pulse {
  0% { filter: none; opacity: 1; }
  40% { filter: drop-shadow(0 0 4px rgba(92, 63, 14, 0.35)); opacity: 1; }
  100% { filter: none; opacity: 1; }
}
@keyframes sign-complete-pulse {
  0% { filter: none; box-shadow: none; }
  40% { filter: drop-shadow(0 0 6px rgba(92, 63, 14, 0.4)); }
  100% { filter: none; box-shadow: none; }
}
#sign-modal .sign-progress.sign-step-done-pulse,
#sign-modal .sign-step.sign-step-done-pulse {
  animation: sign-step-done-pulse 0.55s ease;
}
#sign-modal .sign-progress.sign-step-done-pulse-static,
#sign-modal .sign-step.sign-step-done-pulse-static,
#sign-modal .sign-progress.sign-complete-pulse-static,
#sign-modal .sign-step.sign-complete-pulse-static,
#sign-modal .sign-words.sign-complete-pulse-static,
#sign-modal .modal-actions.sign-complete-pulse-static {
  filter: drop-shadow(0 0 2px rgba(92, 63, 14, 0.3));
}
#sign-modal .sign-progress.sign-complete-pulse,
#sign-modal .sign-step.sign-complete-pulse,
#sign-modal .sign-words.sign-complete-pulse,
#sign-modal .modal-actions.sign-complete-pulse {
  animation: sign-complete-pulse 0.7s ease;
}
#sign-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#sign-modal .modal-actions .btn-ghost,
#sign-modal .modal-actions .btn-solid {
  min-height: 48px !important;
  min-width: 48px !important;
}
#toast.toast-sign-done {
  /* solemn completion lane — no disco */
}
@media (prefers-reduced-motion: reduce) {
  #sign-modal .sign-progress.sign-step-done-pulse,
  #sign-modal .sign-step.sign-step-done-pulse,
  #sign-modal .sign-progress.sign-complete-pulse,
  #sign-modal .sign-step.sign-complete-pulse,
  #sign-modal .sign-words.sign-complete-pulse,
  #sign-modal .modal-actions.sign-complete-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #208 — Soft tip Dấu Thánh Giá toast CTA ≥48 · không thay phụng vụ · yield candle/#204/#202/#200/#198/#196 ===== */
#toast.toast-sign .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}


/* ===== Play-polish #209 — Library / kho open feel · soft pulse sticky «Về kho» / group chips · keep #183/#194 sticky ≥48 · empty «Không bịa giáo lý» · reduced-motion · no invent doctrine ===== */
@keyframes library-open-pulse {
  0% { filter: none; }
  40% { filter: drop-shadow(0 0 5px rgba(232, 194, 122, 0.5)); }
  100% { filter: none; }
}
#library-modal .lib-group-chip.library-open-pulse,
#library-modal .lib-doctrine-tools.library-open-pulse,
#library-modal .lib-group-nav.library-open-pulse,
#library-modal #library-line-back.library-open-pulse,
#library-modal .lib-line-actions.library-open-pulse {
  animation: library-open-pulse 0.6s ease;
}
#library-modal .lib-group-chip.library-open-pulse-static,
#library-modal .lib-doctrine-tools.library-open-pulse-static,
#library-modal .lib-group-nav.library-open-pulse-static,
#library-modal #library-line-back.library-open-pulse-static,
#library-modal .lib-line-actions.library-open-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.38));
}
#library-modal #library-detail .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
}
#library-modal #library-detail .lib-line-actions .btn-ghost,
#library-modal #library-detail .lib-line-actions .btn-solid,
#library-modal #library-line-back {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal .lib-group-chip.library-open-pulse,
  #library-modal .lib-doctrine-tools.library-open-pulse,
  #library-modal .lib-group-nav.library-open-pulse,
  #library-modal #library-line-back.library-open-pulse,
  #library-modal .lib-line-actions.library-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #210 — Soft tip kho giáo lý toast CTA ≥48 · không bịa giáo lý · yield sign/#206/#204/#202/#200/#198/#196 ===== */
#toast.toast-library .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}


/* ===== Play-polish #211 — Angelus short sticky polish · soft open pulse · keep #185 sticky ≥48 · progress rõ · empty TGP honesty · reduced-motion · no invent full ===== */
@keyframes lib-short-open-pulse {
  0% { filter: none; }
  40% { filter: drop-shadow(0 0 5px rgba(232, 194, 122, 0.48)); }
  100% { filter: none; }
}
#library-detail.lib-short-reader .lib-line-progress.lib-short-open-pulse,
#library-detail.lib-short-reader .lib-line-actions.lib-short-open-pulse,
#library-detail #library-short-empty.lib-short-open-pulse,
#library-detail .lib-line-actions.lib-short-open-pulse {
  animation: lib-short-open-pulse 0.55s ease;
}
#library-detail.lib-short-reader .lib-line-progress.lib-short-open-pulse-static,
#library-detail.lib-short-reader .lib-line-actions.lib-short-open-pulse-static,
#library-detail #library-short-empty.lib-short-open-pulse-static,
#library-detail .lib-line-actions.lib-short-open-pulse-static {
  filter: drop-shadow(0 0 3px rgba(232, 194, 122, 0.36));
}
/* Reinforce sticky Đóng/Tiếp ≥48 (keep #185) */
#library-detail.lib-short-reader .lib-line-actions .btn-ghost,
#library-detail.lib-short-reader .lib-line-actions .btn-solid,
#library-detail.lib-short-reader .lib-line-actions #library-line-back,
#library-detail.lib-short-reader .lib-line-actions #library-line-next {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-detail.lib-short-reader .lib-line-progress.lib-short-open-pulse,
  #library-detail.lib-short-reader .lib-line-actions.lib-short-open-pulse,
  #library-detail #library-short-empty.lib-short-open-pulse,
  #library-detail .lib-line-actions.lib-short-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #212 — Soft tip Kinh Truyền Tin toast CTA ≥48 · bản rút gọn · không thay kinh giáo xứ · yield library/#208/#206… · no invent full ===== */
#toast.toast-angelus-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}

/* ===== Play-polish #214 — Soft tip quay lại ngày mai / streak gentle · CTA ≥48 · lời mời nhẹ · không claim ơn thánh / không mua streak · yield Angelus/#210… ===== */
#toast.toast-return-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}


/* ===== Play-polish #215 — Audio dock unmute/mute clarity · 3 nút âm (gate/HUD/…) · tap ≥48 · soft pulse lần đầu bật tiếng · giữ iOS unmute · softDuck #175 · không claim A1 PASS ===== */
#btn-sound-toggle {
  min-height: 48px !important;
  min-width: 48px !important;
  padding: 12px 14px;
  touch-action: manipulation;
}
#btn-sound-toggle[aria-pressed="false"] {
  opacity: 0.72;
  color: rgba(243, 230, 207, 0.78);
}
#btn-sound-toggle[aria-pressed="true"] {
  color: #fff6e4;
}
@keyframes sound-unmute-pulse {
  0% { filter: none; transform: scale(1); }
  40% { filter: drop-shadow(0 0 6px rgba(232, 194, 122, 0.55)); transform: scale(1.06); }
  100% { filter: none; transform: scale(1); }
}
.sound-toggle.sound-unmute-pulse,
#btn-sound-toggle.sound-unmute-pulse {
  animation: sound-unmute-pulse 0.65s ease;
}
.sound-toggle.sound-unmute-pulse-static,
#btn-sound-toggle.sound-unmute-pulse-static {
  filter: drop-shadow(0 0 4px rgba(232, 194, 122, 0.4));
}
@media (prefers-reduced-motion: reduce) {
  .sound-toggle.sound-unmute-pulse,
  #btn-sound-toggle.sound-unmute-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #216 — Soft tip bật tiếng / chuông · CTA ≥48 · trang nghiêm · yield return/#212/#210… · no spam / no A1 PASS ===== */
#toast.toast-sound-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sound-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sound-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sound-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #217 — Wardrobe / «Mặc» open feel · soft pulse sticky Đóng/Mặc ≥48 · free ao-le-nhe/ao-dai-be rõ · apply chibi ngay · 0 paywall/QR/Xu ===== */
#wardrobe-modal .modal-actions #wardrobe-close,
#wardrobe-modal .modal-actions #wardrobe-wear {
  min-height: 48px !important;
  min-width: 48px !important;
}
@keyframes wardrobe-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#wardrobe-close.wardrobe-open-pulse,
#wardrobe-wear.wardrobe-open-pulse {
  animation: wardrobe-open-pulse 0.65s ease;
}
#wardrobe-close.wardrobe-open-pulse-static,
#wardrobe-wear.wardrobe-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
@keyframes wardrobe-free-pulse {
  0% { border-color: rgba(201, 162, 74, 0.55); }
  45% { border-color: rgba(201, 162, 74, 0.95); background: #fff4d8; }
  100% { border-color: rgba(201, 162, 74, 0.55); background: #fff8e8; }
}
#wardrobe-modal .wardrobe-item.is-free-highlight.wardrobe-free-pulse {
  animation: wardrobe-free-pulse 0.7s ease;
}
#wardrobe-modal .wardrobe-item.is-free-highlight.wardrobe-free-pulse-static {
  border-color: rgba(201, 162, 74, 0.85);
  background: #fff4d8;
}
@media (prefers-reduced-motion: reduce) {
  #wardrobe-close.wardrobe-open-pulse,
  #wardrobe-wear.wardrobe-open-pulse,
  #wardrobe-modal .wardrobe-item.is-free-highlight.wardrobe-free-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #218 — Soft tip trang phục / thử áo · CTA ≥48 · thử miễn phí không bắt mua · yield unmute/#214/#212… · no spam / no Xu ===== */
#toast.toast-wardrobe-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-wardrobe-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-wardrobe-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-wardrobe-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #219 — Creator open feel · soft pulse sticky Đóng/Xong ≥48 · calm preview · keep #163/#187 · no heavy mesh · reduced-motion · 0 paywall ===== */
#creator-modal .modal-actions #creator-close,
#creator-modal .modal-actions #creator-enter {
  min-height: 48px !important;
  min-width: 48px !important;
}
@keyframes creator-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#creator-close.creator-open-pulse,
#creator-enter.creator-open-pulse {
  animation: creator-open-pulse 0.65s ease;
}
#creator-close.creator-open-pulse-static,
#creator-enter.creator-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
@keyframes creator-preview-calm {
  0% { opacity: 0.92; }
  50% { opacity: 1; }
  100% { opacity: 0.98; }
}
#creator-modal .creator-silhouette.creator-preview-calm,
#creator-modal #creator-sil.creator-preview-calm,
#creator-modal #creator-preview.creator-preview-calm {
  animation: creator-preview-calm 0.8s ease;
}
#creator-modal .creator-silhouette.creator-preview-calm-static,
#creator-modal #creator-sil.creator-preview-calm-static,
#creator-modal #creator-preview.creator-preview-calm-static {
  opacity: 1;
}
@media (prefers-reduced-motion: reduce) {
  #creator-close.creator-open-pulse,
  #creator-enter.creator-open-pulse,
  #creator-modal .creator-silhouette.creator-preview-calm,
  #creator-modal #creator-sil.creator-preview-calm,
  #creator-modal #creator-preview.creator-preview-calm {
    animation: none !important;
  }
}

/* ===== Play-polish #220 — Soft tip Tạo nhân vật / diện mạo · CTA ≥48 · VI trang nghiêm · yield wardrobe/#218… · no sexy/Elara DNA / no Xu ===== */
#toast.toast-creator-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-creator-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-creator-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-creator-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #221 — Prayer-rail open feel · soft pulse sticky Đóng / Đọc câu·Tiếp ≥48 · lyric/hint clarity keep #165/#189 · reduced-motion · no heavy assets / no TTS / no invent Angelus ===== */
#prayer-panel-close,
.prayer-panel-close {
  min-width: 48px !important;
  min-height: 48px !important;
  width: 48px !important;
  height: 48px !important;
}
#prayer-tap {
  min-height: 48px !important;
  min-width: 128px !important;
}
@keyframes prayer-rail-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#prayer-panel-close.prayer-rail-open-pulse,
.prayer-panel-close.prayer-rail-open-pulse,
#prayer-tap.prayer-rail-open-pulse {
  animation: prayer-rail-open-pulse 0.65s ease;
}
#prayer-panel-close.prayer-rail-open-pulse-static,
.prayer-panel-close.prayer-rail-open-pulse-static,
#prayer-tap.prayer-rail-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
@keyframes prayer-lyric-open-calm {
  0% { opacity: 0.92; }
  50% { opacity: 1; }
  100% { opacity: 0.98; }
}
#prayer-lyric.prayer-lyric-open-calm {
  animation: prayer-lyric-open-calm 0.8s ease;
}
#prayer-lyric.prayer-lyric-open-calm-static {
  opacity: 1;
}
/* Re-assert #165/#189 lyric + hint clarity on open (mobile) */
body.prayer-rail-open .prayer-lyric {
  font-size: 16px !important;
  color: #fff8ea !important;
  line-height: 1.4 !important;
}
body.prayer-rail-open .prayer-lyric .pray-line.is-active {
  font-size: 17px !important;
  color: #ffe08a !important;
  font-weight: 700 !important;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6), 0 0 12px rgba(232, 194, 122, 0.18);
}
body.prayer-rail-open .prayer-counter {
  font-weight: 700 !important;
  color: #ffe08a !important;
}
@media (max-width: 390px) {
  body.prayer-rail-open .prayer-lyric { font-size: 15px !important; }
  body.prayer-rail-open .prayer-lyric .pray-line.is-active { font-size: 16px !important; }
}
@media (prefers-reduced-motion: reduce) {
  #prayer-panel-close.prayer-rail-open-pulse,
  .prayer-panel-close.prayer-rail-open-pulse,
  #prayer-tap.prayer-rail-open-pulse,
  #prayer-lyric.prayer-lyric-open-calm {
    animation: none !important;
  }
}

/* ===== Play-polish #222 — Soft tip Cầu nguyện / kinh nguyện · CTA ≥48 · VI trang nghiêm · yield creator/#220… · no TTS / no invent Angelus / no Xu / no sexy/Elara ===== */
#toast.toast-prayer-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-prayer-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-prayer-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-prayer-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #223 — Library gifts-group open feel · soft pulse sticky Về kho / chips ≥48 · keep #183/#194/#209 · calm empty honesty · reduced-motion · no invent doctrine · no grind counters ===== */
@keyframes library-gifts-open-pulse {
  0% { filter: none; box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); }
  40% { filter: drop-shadow(0 0 6px rgba(232, 194, 122, 0.55)); box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.22); }
  100% { filter: none; box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); }
}
#library-modal .lib-group-chip.library-gifts-open-pulse,
#library-modal .lib-doctrine-tools.library-gifts-open-pulse,
#library-modal .lib-group-nav.library-gifts-open-pulse,
#library-modal #library-line-back.library-gifts-open-pulse,
#library-modal .lib-line-actions.library-gifts-open-pulse {
  animation: library-gifts-open-pulse 0.7s ease;
}
#library-modal .lib-group-chip.library-gifts-open-pulse-static,
#library-modal .lib-doctrine-tools.library-gifts-open-pulse-static,
#library-modal .lib-group-nav.library-gifts-open-pulse-static,
#library-modal #library-line-back.library-gifts-open-pulse-static,
#library-modal .lib-line-actions.library-gifts-open-pulse-static {
  filter: drop-shadow(0 0 4px rgba(232, 194, 122, 0.42));
  box-shadow: 0 0 0 2px rgba(201, 162, 74, 0.28);
}
#library-modal .lib-group-chip.on {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal .lib-group-chip.library-gifts-open-pulse,
  #library-modal .lib-doctrine-tools.library-gifts-open-pulse,
  #library-modal .lib-group-nav.library-gifts-open-pulse,
  #library-modal #library-line-back.library-gifts-open-pulse,
  #library-modal .lib-line-actions.library-gifts-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #224 — Soft tip «7 ơn Thánh Thần» · CTA ≥48 · VI trang nghiêm · yield prayer/#222… · no invent doctrine / no QR/Xu / no claim app=ơn thánh / no sexy/Elara ===== */
#toast.toast-gifts-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gifts-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gifts-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gifts-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #225 — Library fruits-group open feel · soft pulse sticky Về kho / chips ≥48 · keep #183/#194/#209/#223 · calm empty honesty · reduced-motion · no invent doctrine · no grind counters ===== */
@keyframes library-fruits-open-pulse {
  0% { filter: none; box-shadow: 0 0 0 0 rgba(180, 140, 70, 0); }
  40% { filter: drop-shadow(0 0 6px rgba(210, 175, 95, 0.5)); box-shadow: 0 0 0 3px rgba(180, 140, 70, 0.2); }
  100% { filter: none; box-shadow: 0 0 0 0 rgba(180, 140, 70, 0); }
}
#library-modal .lib-group-chip.library-fruits-open-pulse,
#library-modal .lib-doctrine-tools.library-fruits-open-pulse,
#library-modal .lib-group-nav.library-fruits-open-pulse,
#library-modal #library-line-back.library-fruits-open-pulse,
#library-modal .lib-line-actions.library-fruits-open-pulse {
  animation: library-fruits-open-pulse 0.7s ease;
}
#library-modal .lib-group-chip.library-fruits-open-pulse-static,
#library-modal .lib-doctrine-tools.library-fruits-open-pulse-static,
#library-modal .lib-group-nav.library-fruits-open-pulse-static,
#library-modal #library-line-back.library-fruits-open-pulse-static,
#library-modal .lib-line-actions.library-fruits-open-pulse-static {
  filter: drop-shadow(0 0 4px rgba(210, 175, 95, 0.4));
  box-shadow: 0 0 0 2px rgba(180, 140, 70, 0.26);
}
@media (prefers-reduced-motion: reduce) {
  #library-modal .lib-group-chip.library-fruits-open-pulse,
  #library-modal .lib-doctrine-tools.library-fruits-open-pulse,
  #library-modal .lib-group-nav.library-fruits-open-pulse,
  #library-modal #library-line-back.library-fruits-open-pulse,
  #library-modal .lib-line-actions.library-fruits-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #226 — Soft tip «Hoa trái Thánh Thần» · CTA ≥48 · VI trang nghiêm · yield gifts/#224… · no invent doctrine / no QR/Xu / no claim app=ơn/hoa trái thánh / no sexy/Elara ===== */
#toast.toast-fruits-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-fruits-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-fruits-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-fruits-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #227 — Rosary open feel · soft pulse sticky Đóng / Tiếp / chục ≥48 · keep line-highlight + decade toast #179/#199 · reduced-motion · no TTS · no invent mysteries · no heavy assets ===== */
#rosary-root .rosary-actions {
  position: sticky;
  bottom: 0;
  z-index: 2;
}
#rosary-root .rosary-actions button,
#rosary-root #rosary-close,
#rosary-root #rosary-next {
  min-height: 48px !important;
  min-width: 48px !important;
}
@keyframes rosary-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#rosary-root #rosary-close.rosary-open-pulse,
#rosary-root #rosary-next.rosary-open-pulse,
#rosary-root .rosary-actions.rosary-open-pulse,
#rosary-root .beads-progress.rosary-open-pulse {
  animation: rosary-open-pulse 0.65s ease;
}
#rosary-root #rosary-close.rosary-open-pulse-static,
#rosary-root #rosary-next.rosary-open-pulse-static,
#rosary-root .rosary-actions.rosary-open-pulse-static,
#rosary-root .beads-progress.rosary-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
@media (prefers-reduced-motion: reduce) {
  #rosary-root #rosary-close.rosary-open-pulse,
  #rosary-root #rosary-next.rosary-open-pulse,
  #rosary-root .rosary-actions.rosary-open-pulse,
  #rosary-root .beads-progress.rosary-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #228 — Soft tip «Chuỗi Mân Côi» · CTA ≥48 · VI trang nghiêm · yield fruits/#226… · no invent mysteries / no QR/Xu / no claim công đức mua được / no sexy/Elara ===== */
#toast.toast-rosary-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-rosary-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-rosary-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-rosary-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #229 — Sit / idle open feel · soft pulse sit affordance (#btn-sit/#btn-stand/#btn-kneel/#btn-more) ≥48 · gold-ring bump in JS · keep #169/#176/#190/#197 · reduced-motion · no heavy mesh · no FPS PASS · phone #174 kept ===== */
#btn-sit,
#btn-stand,
#btn-kneel,
#btn-more {
  min-height: 48px;
  min-width: 48px;
}
@keyframes sit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#btn-sit.sit-open-pulse,
#btn-stand.sit-open-pulse,
#btn-kneel.sit-open-pulse,
#btn-more.sit-open-pulse {
  animation: sit-open-pulse 0.65s ease;
}
#btn-sit.sit-open-pulse-static,
#btn-stand.sit-open-pulse-static,
#btn-kneel.sit-open-pulse-static,
#btn-more.sit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
@media (prefers-reduced-motion: reduce) {
  #btn-sit.sit-open-pulse,
  #btn-stand.sit-open-pulse,
  #btn-kneel.sit-open-pulse,
  #btn-more.sit-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #230 — Soft tip «Ngồi yên một lát» · CTA ≥48 · VI trang nghiêm · ghế bình an · không grind · yield rosary/#228… · no claim ngồi=công đức mua được / no QR/Xu / no sexy/Elara ===== */
#toast.toast-sit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #231 — Kneel open feel · soft pulse kneel affordance (#btn-kneel/#btn-sit/#btn-stand/#btn-more) ≥48 · gold-ring bump in JS · keep #176/#197 · reduced-motion · no heavy mesh · no FPS PASS · phone #174 kept ===== */
@keyframes kneel-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.30); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#btn-kneel.kneel-open-pulse,
#btn-sit.kneel-open-pulse,
#btn-stand.kneel-open-pulse,
#btn-more.kneel-open-pulse {
  animation: kneel-open-pulse 0.65s ease;
}
#btn-kneel.kneel-open-pulse-static,
#btn-sit.kneel-open-pulse-static,
#btn-stand.kneel-open-pulse-static,
#btn-more.kneel-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.38);
}
@media (prefers-reduced-motion: reduce) {
  #btn-kneel.kneel-open-pulse,
  #btn-sit.kneel-open-pulse,
  #btn-stand.kneel-open-pulse,
  #btn-more.kneel-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #232 — Soft tip «Quỳ cầu nguyện» · CTA ≥48 · VI trang nghiêm · không grind · yield sit/#230… · no claim quỳ=công đức mua được / no QR/Xu / no sexy/Elara ===== */
#toast.toast-kneel-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-kneel-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-kneel-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-kneel-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #233 — Stations panel open feel · soft pulse sticky Đóng/chặng (prev/next) ≥48 · keep #181/#201 sticky · reduced-motion · no invent lời · no heavy assets ===== */
@keyframes stations-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#stations-root #stations-close.stations-open-pulse,
#stations-root #stations-prev.stations-open-pulse,
#stations-root #stations-next.stations-open-pulse,
#stations-root .stations-actions.stations-open-pulse,
#stations-root #stations-count.stations-open-pulse {
  animation: stations-open-pulse 0.65s ease;
}
#stations-root #stations-close.stations-open-pulse-static,
#stations-root #stations-prev.stations-open-pulse-static,
#stations-root #stations-next.stations-open-pulse-static,
#stations-root .stations-actions.stations-open-pulse-static,
#stations-root #stations-count.stations-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
#stations-root .stations-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#stations-root .stations-actions button,
#stations-root #stations-close,
#stations-root #stations-prev,
#stations-root #stations-next {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #stations-root #stations-close.stations-open-pulse,
  #stations-root #stations-prev.stations-open-pulse,
  #stations-root #stations-next.stations-open-pulse,
  #stations-root .stations-actions.stations-open-pulse,
  #stations-root #stations-count.stations-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #234 — Soft tip «Đàng Thánh Giá» (mọi ngày) · CTA ≥48 · VI trang nghiêm · yield stationsFri/#202 · kneel/#232… · no claim đi đàng=công đức mua được / no QR/Xu / no sexy/Elara ===== */
#toast.toast-stations-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-stations-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-stations-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-stations-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #235 — Check-in / 3 hơi thở open feel · soft pulse sticky Đóng/Nhận Hạt ≥48 · keep ba-hoi-tho · calm copy · reduced-motion · no grind meters · no claim công đức ===== */
@keyframes checkin-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#checkin-modal #checkin-close.checkin-open-pulse,
#checkin-modal #checkin-claim.checkin-open-pulse,
#checkin-modal .modal-actions.checkin-open-pulse,
#checkin-modal #checkin-title.checkin-open-pulse {
  animation: checkin-open-pulse 0.65s ease;
}
#checkin-modal #checkin-close.checkin-open-pulse-static,
#checkin-modal #checkin-claim.checkin-open-pulse-static,
#checkin-modal .modal-actions.checkin-open-pulse-static,
#checkin-modal #checkin-title.checkin-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
#checkin-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#checkin-modal .modal-actions .btn-ghost,
#checkin-modal .modal-actions .btn-solid,
#checkin-modal #checkin-close,
#checkin-modal #checkin-claim {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #checkin-modal #checkin-close.checkin-open-pulse,
  #checkin-modal #checkin-claim.checkin-open-pulse,
  #checkin-modal .modal-actions.checkin-open-pulse,
  #checkin-modal #checkin-title.checkin-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #236 — Soft tip «3 hơi thở hôm nay» · CTA ≥48 · VI trang nghiêm · yield stations/#234 · kneel/#232… · no claim hơi thở=công đức mua được / no QR/Xu / no sexy/Elara ===== */
#toast.toast-ba-hoi-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-ba-hoi-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-ba-hoi-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-ba-hoi-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #237 — Keeper modal open feel · soft pulse sticky Đóng / 4 câu ≥48 · keep TOOLTIPS+doctrine answers · reduced-motion · 0 AI invent · 0 sử giáo xứ giả ===== */
@keyframes keeper-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(201, 162, 74, 0.26); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(201, 162, 74, 0); transform: scale(1); }
}
#keeper-modal #keeper-close.keeper-open-pulse,
#keeper-modal .modal-actions.keeper-open-pulse,
#keeper-modal #keeper-title.keeper-open-pulse,
#keeper-modal #keeper-qs.keeper-open-pulse,
#keeper-modal #keeper-qs button.keeper-open-pulse {
  animation: keeper-open-pulse 0.65s ease;
}
#keeper-modal #keeper-close.keeper-open-pulse-static,
#keeper-modal .modal-actions.keeper-open-pulse-static,
#keeper-modal #keeper-title.keeper-open-pulse-static,
#keeper-modal #keeper-qs.keeper-open-pulse-static,
#keeper-modal #keeper-qs button.keeper-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(201, 162, 74, 0.35);
}
#keeper-modal .modal-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#keeper-modal .modal-actions .btn-ghost,
#keeper-modal .modal-actions .btn-solid,
#keeper-modal #keeper-close,
#keeper-modal .keeper-qs button {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #keeper-modal #keeper-close.keeper-open-pulse,
  #keeper-modal .modal-actions.keeper-open-pulse,
  #keeper-modal #keeper-title.keeper-open-pulse,
  #keeper-modal #keeper-qs.keeper-open-pulse,
  #keeper-modal #keeper-qs button.keeper-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #238 — Soft tip «Hỏi người giữ nhà thờ» · CTA ≥48 · VI trang nghiêm · yield breath/#236 · stations/#234… · 0 invent answers / no QR/Xu / no sexy/Elara ===== */
#toast.toast-keeper-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-keeper-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-keeper-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-keeper-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #239 — Advent wreath / Mùa Vọng open feel · soft pulse sticky Về kho / related ≥48 · keep #127/#173 doctrine · reduced-motion · no invent Ordo · no claim app = phụng vụ ===== */
@keyframes advent-wreath-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(107, 76, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(107, 76, 122, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(107, 76, 122, 0); transform: scale(1); }
}
#library-modal #library-line-back.advent-wreath-open-pulse,
#library-modal #library-detail .lib-line-actions.advent-wreath-open-pulse,
#library-modal #library-detail > p.advent-wreath-open-pulse,
#library-modal #library-related.advent-wreath-open-pulse,
#library-modal .lib-related.advent-wreath-open-pulse,
#library-modal .lib-related-btn.advent-wreath-open-pulse,
#library-modal .lib-group-chip.advent-wreath-open-pulse {
  animation: advent-wreath-open-pulse 0.65s ease;
}
#library-modal #library-line-back.advent-wreath-open-pulse-static,
#library-modal #library-detail .lib-line-actions.advent-wreath-open-pulse-static,
#library-modal #library-detail > p.advent-wreath-open-pulse-static,
#library-modal #library-related.advent-wreath-open-pulse-static,
#library-modal .lib-related.advent-wreath-open-pulse-static,
#library-modal .lib-related-btn.advent-wreath-open-pulse-static,
#library-modal .lib-group-chip.advent-wreath-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(107, 76, 122, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="adventWreath"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="adventWreath"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="adventWreath"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.advent-wreath-open-pulse,
  #library-modal #library-detail .lib-line-actions.advent-wreath-open-pulse,
  #library-modal #library-detail > p.advent-wreath-open-pulse,
  #library-modal #library-related.advent-wreath-open-pulse,
  #library-modal .lib-related.advent-wreath-open-pulse,
  #library-modal .lib-related-btn.advent-wreath-open-pulse,
  #library-modal .lib-group-chip.advent-wreath-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #240 — Soft tip «Chuẩn bị Mùa Vọng» · CTA ≥48 · VI trang nghiêm · yield keeper/#238 · breath/#236… · no invent Ordo / no QR/Xu / no sexy/Elara ===== */
#toast.toast-advent-prep-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-advent-prep-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-advent-prep-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-advent-prep-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #241 — crucifix / corpus gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · keep slim Giambologna corpus · reduced-motion · no new heavy texture · no FPS PASS · phone #174 · 0 claim app=thờ phượng ===== */
@keyframes crucifix-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.crucifix-gaze-open-pulse,
#tooltip-more.crucifix-gaze-open-pulse,
#look-label.crucifix-gaze-open-pulse,
#keeper-modal #keeper-close.crucifix-gaze-open-pulse,
#keeper-modal .modal-actions.crucifix-gaze-open-pulse,
#keeper-modal #keeper-answer.crucifix-gaze-open-pulse,
#keeper-modal #keeper-qs button.crucifix-gaze-open-pulse {
  animation: crucifix-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.crucifix-gaze-open-pulse-static,
#tooltip-more.crucifix-gaze-open-pulse-static,
#look-label.crucifix-gaze-open-pulse-static,
#keeper-modal #keeper-close.crucifix-gaze-open-pulse-static,
#keeper-modal .modal-actions.crucifix-gaze-open-pulse-static,
#keeper-modal #keeper-answer.crucifix-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.crucifix-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop.show {
  min-height: 48px;
}
#tooltip-pop #tooltip-more,
#tooltip-more {
  min-height: 48px !important;
  min-width: 48px !important;
}
#tooltip-pop[data-zone-kind="crucifix"] #tooltip-more,
#tooltip-pop[data-zone-kind="crucifix"] {
  /* ensure tap targets ≥48 when crucifix focused */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.crucifix-gaze-open-pulse,
  #tooltip-more.crucifix-gaze-open-pulse,
  #look-label.crucifix-gaze-open-pulse,
  #keeper-modal #keeper-close.crucifix-gaze-open-pulse,
  #keeper-modal .modal-actions.crucifix-gaze-open-pulse,
  #keeper-modal #keeper-answer.crucifix-gaze-open-pulse,
  #keeper-modal #keeper-qs button.crucifix-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #242 — Soft tip «Nhìn Thánh giá» · CTA ≥48 · VI trang nghiêm · yield Advent/#240 · keeper/#238… · 0 claim app=thờ phượng · no QR/Xu · no sexy/Elara ===== */
#toast.toast-crucifix-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-crucifix-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-crucifix-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-crucifix-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #243 — tabernacle / nhà tạm gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing tooltip/doctrine · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim app=Chầu/thay Thánh Lễ ===== */
@keyframes tabernacle-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.tabernacle-gaze-open-pulse,
#tooltip-more.tabernacle-gaze-open-pulse,
#look-label.tabernacle-gaze-open-pulse,
#keeper-modal #keeper-close.tabernacle-gaze-open-pulse,
#keeper-modal .modal-actions.tabernacle-gaze-open-pulse,
#keeper-modal #keeper-answer.tabernacle-gaze-open-pulse,
#keeper-modal #keeper-qs button.tabernacle-gaze-open-pulse {
  animation: tabernacle-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.tabernacle-gaze-open-pulse-static,
#tooltip-more.tabernacle-gaze-open-pulse-static,
#look-label.tabernacle-gaze-open-pulse-static,
#keeper-modal #keeper-close.tabernacle-gaze-open-pulse-static,
#keeper-modal .modal-actions.tabernacle-gaze-open-pulse-static,
#keeper-modal #keeper-answer.tabernacle-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.tabernacle-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="tabernacle"] #tooltip-more,
#tooltip-pop[data-zone-kind="tabernacle"] {
  /* ensure tap targets ≥48 when tabernacle focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.tabernacle-gaze-open-pulse,
  #tooltip-more.tabernacle-gaze-open-pulse,
  #look-label.tabernacle-gaze-open-pulse,
  #keeper-modal #keeper-close.tabernacle-gaze-open-pulse,
  #keeper-modal .modal-actions.tabernacle-gaze-open-pulse,
  #keeper-modal #keeper-answer.tabernacle-gaze-open-pulse,
  #keeper-modal #keeper-qs button.tabernacle-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #244 — Soft tip «Nhìn nhà tạm» · CTA ≥48 · VI trang nghiêm · yield crucifix/#242 · Advent/#240 · keeper/#238… · 0 claim app=Chầu/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-tabernacle-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-tabernacle-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-tabernacle-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-tabernacle-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #245 — altar / bàn thờ gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing TOOLTIPS.altar · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim app=Thánh Lễ/công đức ===== */
@keyframes altar-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.altar-gaze-open-pulse,
#tooltip-more.altar-gaze-open-pulse,
#look-label.altar-gaze-open-pulse,
#keeper-modal #keeper-close.altar-gaze-open-pulse,
#keeper-modal .modal-actions.altar-gaze-open-pulse,
#keeper-modal #keeper-answer.altar-gaze-open-pulse,
#keeper-modal #keeper-qs button.altar-gaze-open-pulse {
  animation: altar-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.altar-gaze-open-pulse-static,
#tooltip-more.altar-gaze-open-pulse-static,
#look-label.altar-gaze-open-pulse-static,
#keeper-modal #keeper-close.altar-gaze-open-pulse-static,
#keeper-modal .modal-actions.altar-gaze-open-pulse-static,
#keeper-modal #keeper-answer.altar-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.altar-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="altar"] #tooltip-more,
#tooltip-pop[data-zone-kind="altar"] {
  /* ensure tap targets ≥48 when altar focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.altar-gaze-open-pulse,
  #tooltip-more.altar-gaze-open-pulse,
  #look-label.altar-gaze-open-pulse,
  #keeper-modal #keeper-close.altar-gaze-open-pulse,
  #keeper-modal .modal-actions.altar-gaze-open-pulse,
  #keeper-modal #keeper-answer.altar-gaze-open-pulse,
  #keeper-modal #keeper-qs button.altar-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #246 — Soft tip «Nhìn bàn thờ» · CTA ≥48 · VI trang nghiêm · yield tabernacle/#244 · crucifix/#242 · Advent/#240 · keeper/#238… · 0 claim app=Thánh Lễ/công đức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-altar-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-altar-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-altar-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-altar-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #247 — sanctuary lamp / đèn chầu gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing TOOLTIPS.lamp · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim app=Chầu/Thánh Lễ/công đức ===== */
@keyframes lamp-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.lamp-gaze-open-pulse,
#tooltip-more.lamp-gaze-open-pulse,
#look-label.lamp-gaze-open-pulse,
#keeper-modal #keeper-close.lamp-gaze-open-pulse,
#keeper-modal .modal-actions.lamp-gaze-open-pulse,
#keeper-modal #keeper-answer.lamp-gaze-open-pulse,
#keeper-modal #keeper-qs button.lamp-gaze-open-pulse {
  animation: lamp-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.lamp-gaze-open-pulse-static,
#tooltip-more.lamp-gaze-open-pulse-static,
#look-label.lamp-gaze-open-pulse-static,
#keeper-modal #keeper-close.lamp-gaze-open-pulse-static,
#keeper-modal .modal-actions.lamp-gaze-open-pulse-static,
#keeper-modal #keeper-answer.lamp-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.lamp-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="lamp"] #tooltip-more,
#tooltip-pop[data-zone-kind="lamp"] {
  /* ensure tap targets ≥48 when đèn chầu focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.lamp-gaze-open-pulse,
  #tooltip-more.lamp-gaze-open-pulse,
  #look-label.lamp-gaze-open-pulse,
  #keeper-modal #keeper-close.lamp-gaze-open-pulse,
  #keeper-modal .modal-actions.lamp-gaze-open-pulse,
  #keeper-modal #keeper-answer.lamp-gaze-open-pulse,
  #keeper-modal #keeper-qs button.lamp-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #248 — Soft tip «Nhìn đèn chầu» · CTA ≥48 · VI trang nghiêm · yield altar/#246 · tabernacle/#244 · crucifix/#242 · Advent/#240 · keeper/#238… · 0 claim app=Chầu/Thánh Lễ/công đức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-lamp-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-lamp-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-lamp-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-lamp-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #249 — baptismal font / giếng rửa tội gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing TOOLTIPS.font · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim app=bí tích Rửa tội/công đức ===== */
@keyframes font-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.font-gaze-open-pulse,
#tooltip-more.font-gaze-open-pulse,
#look-label.font-gaze-open-pulse,
#keeper-modal #keeper-close.font-gaze-open-pulse,
#keeper-modal .modal-actions.font-gaze-open-pulse,
#keeper-modal #keeper-answer.font-gaze-open-pulse,
#keeper-modal #keeper-qs button.font-gaze-open-pulse {
  animation: font-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.font-gaze-open-pulse-static,
#tooltip-more.font-gaze-open-pulse-static,
#look-label.font-gaze-open-pulse-static,
#keeper-modal #keeper-close.font-gaze-open-pulse-static,
#keeper-modal .modal-actions.font-gaze-open-pulse-static,
#keeper-modal #keeper-answer.font-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.font-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="font"] #tooltip-more,
#tooltip-pop[data-zone-kind="font"] {
  /* ensure tap targets ≥48 when giếng rửa tội focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.font-gaze-open-pulse,
  #tooltip-more.font-gaze-open-pulse,
  #look-label.font-gaze-open-pulse,
  #keeper-modal #keeper-close.font-gaze-open-pulse,
  #keeper-modal .modal-actions.font-gaze-open-pulse,
  #keeper-modal #keeper-answer.font-gaze-open-pulse,
  #keeper-modal #keeper-qs button.font-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #250 — Soft tip «Nhìn giếng rửa tội» · CTA ≥48 · VI trang nghiêm · yield lamp/#248 · altar/#246 · tabernacle/#244 · crucifix/#242 · Advent/#240 · keeper/#238… · 0 claim app=bí tích Rửa tội/công đức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-font-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-font-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-font-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-font-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #251 — pew / ghế ngồi gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing TOOLTIPS.pew · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim ngồi=công đức ===== */
@keyframes pew-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.pew-gaze-open-pulse,
#tooltip-more.pew-gaze-open-pulse,
#look-label.pew-gaze-open-pulse,
#keeper-modal #keeper-close.pew-gaze-open-pulse,
#keeper-modal .modal-actions.pew-gaze-open-pulse,
#keeper-modal #keeper-answer.pew-gaze-open-pulse,
#keeper-modal #keeper-qs button.pew-gaze-open-pulse {
  animation: pew-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.pew-gaze-open-pulse-static,
#tooltip-more.pew-gaze-open-pulse-static,
#look-label.pew-gaze-open-pulse-static,
#keeper-modal #keeper-close.pew-gaze-open-pulse-static,
#keeper-modal .modal-actions.pew-gaze-open-pulse-static,
#keeper-modal #keeper-answer.pew-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.pew-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="pew"] #tooltip-more,
#tooltip-pop[data-zone-kind="pew"] {
  /* ensure tap targets ≥48 when ghế ngồi focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.pew-gaze-open-pulse,
  #tooltip-more.pew-gaze-open-pulse,
  #look-label.pew-gaze-open-pulse,
  #keeper-modal #keeper-close.pew-gaze-open-pulse,
  #keeper-modal .modal-actions.pew-gaze-open-pulse,
  #keeper-modal #keeper-answer.pew-gaze-open-pulse,
  #keeper-modal #keeper-qs button.pew-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #252 — Soft tip «Nhìn ghế ngồi» · CTA ≥48 · VI ghế bình an · yield font/#250 · lamp/#248 · altar/#246… · 0 claim ngồi=công đức · không thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-pew-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-pew-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-pew-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-pew-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #253 — stained glass / kính màu gaze open feel · soft calm pulse sticky Đóng/tooltip ≥48 · existing TOOLTIPS.glass · reduced-motion · no heavy assets · no FPS PASS · phone #174 · 0 claim app=thờ phượng/công đức ===== */
@keyframes glass-gaze-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(232, 194, 122, 0.32); transform: scale(1.02); }
  100% { box-shadow: 0 0 0 0 rgba(232, 194, 122, 0); transform: scale(1); }
}
#tooltip-pop.glass-gaze-open-pulse,
#tooltip-more.glass-gaze-open-pulse,
#look-label.glass-gaze-open-pulse,
#keeper-modal #keeper-close.glass-gaze-open-pulse,
#keeper-modal .modal-actions.glass-gaze-open-pulse,
#keeper-modal #keeper-answer.glass-gaze-open-pulse,
#keeper-modal #keeper-qs button.glass-gaze-open-pulse {
  animation: glass-gaze-open-pulse 0.65s ease;
}
#tooltip-pop.glass-gaze-open-pulse-static,
#tooltip-more.glass-gaze-open-pulse-static,
#look-label.glass-gaze-open-pulse-static,
#keeper-modal #keeper-close.glass-gaze-open-pulse-static,
#keeper-modal .modal-actions.glass-gaze-open-pulse-static,
#keeper-modal #keeper-answer.glass-gaze-open-pulse-static,
#keeper-modal #keeper-qs button.glass-gaze-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(232, 194, 122, 0.4);
}
#tooltip-pop[data-zone-kind="glass"] #tooltip-more,
#tooltip-pop[data-zone-kind="glass"] {
  /* ensure tap targets ≥48 when kính màu focused — min-height inherited from #241 */
}
@media (prefers-reduced-motion: reduce) {
  #tooltip-pop.glass-gaze-open-pulse,
  #tooltip-more.glass-gaze-open-pulse,
  #look-label.glass-gaze-open-pulse,
  #keeper-modal #keeper-close.glass-gaze-open-pulse,
  #keeper-modal .modal-actions.glass-gaze-open-pulse,
  #keeper-modal #keeper-answer.glass-gaze-open-pulse,
  #keeper-modal #keeper-qs button.glass-gaze-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #254 — Soft tip «Nhìn kính màu» · CTA ≥48 · VI kính màu trang nghiêm · yield pew/#252 · font/#250 · lamp/#248… · 0 claim app=thờ phượng/công đức · không thay phụng vụ giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-glass-gaze-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-glass-gaze-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-glass-gaze-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-glass-gaze-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #255 — eucharisticAdoration / Chầu Thánh Thể open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Chầu thật / Real Presence in-app / thay Thánh Lễ · 0 invent kinh Chầu ===== */
@keyframes eucharistic-adoration-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.eucharistic-adoration-open-pulse,
#library-modal #library-detail .lib-line-actions.eucharistic-adoration-open-pulse,
#library-modal #library-detail > p.eucharistic-adoration-open-pulse,
#library-modal #library-related.eucharistic-adoration-open-pulse,
#library-modal .lib-related.eucharistic-adoration-open-pulse,
#library-modal .lib-related-btn.eucharistic-adoration-open-pulse,
#library-modal .lib-group-chip.eucharistic-adoration-open-pulse {
  animation: eucharistic-adoration-open-pulse 0.65s ease;
}
#library-modal #library-line-back.eucharistic-adoration-open-pulse-static,
#library-modal #library-detail .lib-line-actions.eucharistic-adoration-open-pulse-static,
#library-modal #library-detail > p.eucharistic-adoration-open-pulse-static,
#library-modal #library-related.eucharistic-adoration-open-pulse-static,
#library-modal .lib-related.eucharistic-adoration-open-pulse-static,
#library-modal .lib-related-btn.eucharistic-adoration-open-pulse-static,
#library-modal .lib-group-chip.eucharistic-adoration-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="eucharisticAdoration"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="eucharisticAdoration"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="eucharisticAdoration"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.eucharistic-adoration-open-pulse,
  #library-modal #library-detail .lib-line-actions.eucharistic-adoration-open-pulse,
  #library-modal #library-detail > p.eucharistic-adoration-open-pulse,
  #library-modal #library-related.eucharistic-adoration-open-pulse,
  #library-modal .lib-related.eucharistic-adoration-open-pulse,
  #library-modal .lib-related-btn.eucharistic-adoration-open-pulse,
  #library-modal .lib-group-chip.eucharistic-adoration-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #256 — Soft tip «Chầu Thánh Thể» · CTA ≥48 · VI học về Chầu · yield glass/#254 · pew/#252… · 0 claim app=Chầu thật/Real Presence/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-eucharistic-adoration-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-eucharistic-adoration-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-eucharistic-adoration-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-eucharistic-adoration-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #257 — realPresence / Hiện diện thật open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app chứa Real Presence / Mình Thánh thật trong canvas / thay Thánh Lễ · 0 invent kinh ===== */
@keyframes real-presence-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.real-presence-open-pulse,
#library-modal #library-detail .lib-line-actions.real-presence-open-pulse,
#library-modal #library-detail > p.real-presence-open-pulse,
#library-modal #library-related.real-presence-open-pulse,
#library-modal .lib-related.real-presence-open-pulse,
#library-modal .lib-related-btn.real-presence-open-pulse,
#library-modal .lib-group-chip.real-presence-open-pulse {
  animation: real-presence-open-pulse 0.65s ease;
}
#library-modal #library-line-back.real-presence-open-pulse-static,
#library-modal #library-detail .lib-line-actions.real-presence-open-pulse-static,
#library-modal #library-detail > p.real-presence-open-pulse-static,
#library-modal #library-related.real-presence-open-pulse-static,
#library-modal .lib-related.real-presence-open-pulse-static,
#library-modal .lib-related-btn.real-presence-open-pulse-static,
#library-modal .lib-group-chip.real-presence-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="realPresence"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="realPresence"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="realPresence"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.real-presence-open-pulse,
  #library-modal #library-detail .lib-line-actions.real-presence-open-pulse,
  #library-modal #library-detail > p.real-presence-open-pulse,
  #library-modal #library-related.real-presence-open-pulse,
  #library-modal .lib-related.real-presence-open-pulse,
  #library-modal .lib-related-btn.real-presence-open-pulse,
  #library-modal .lib-group-chip.real-presence-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #258 — Soft tip «Hiện diện thật» · CTA ≥48 · VI học giáo lý · yield eucharisticAdoration/#256 · glass/#254… · 0 claim app=Bí tích/Real Presence in-app/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-real-presence-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-real-presence-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-real-presence-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-real-presence-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #259 — holyCommunion / Rước lễ — Hiệp lễ open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Rước lễ thật / virtual Communion / thay Thánh Lễ · 0 invent kinh Hiệp lễ ===== */
@keyframes holy-communion-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.holy-communion-open-pulse,
#library-modal #library-detail .lib-line-actions.holy-communion-open-pulse,
#library-modal #library-detail > p.holy-communion-open-pulse,
#library-modal #library-related.holy-communion-open-pulse,
#library-modal .lib-related.holy-communion-open-pulse,
#library-modal .lib-related-btn.holy-communion-open-pulse,
#library-modal .lib-group-chip.holy-communion-open-pulse {
  animation: holy-communion-open-pulse 0.65s ease;
}
#library-modal #library-line-back.holy-communion-open-pulse-static,
#library-modal #library-detail .lib-line-actions.holy-communion-open-pulse-static,
#library-modal #library-detail > p.holy-communion-open-pulse-static,
#library-modal #library-related.holy-communion-open-pulse-static,
#library-modal .lib-related.holy-communion-open-pulse-static,
#library-modal .lib-related-btn.holy-communion-open-pulse-static,
#library-modal .lib-group-chip.holy-communion-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="holyCommunion"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="holyCommunion"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="holyCommunion"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.holy-communion-open-pulse,
  #library-modal #library-detail .lib-line-actions.holy-communion-open-pulse,
  #library-modal #library-detail > p.holy-communion-open-pulse,
  #library-modal #library-related.holy-communion-open-pulse,
  #library-modal .lib-related.holy-communion-open-pulse,
  #library-modal .lib-related-btn.holy-communion-open-pulse,
  #library-modal .lib-group-chip.holy-communion-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #260 — Soft tip «Rước lễ» · CTA ≥48 · VI học giáo lý · yield realPresence/#258 · eucharisticAdoration/#256 · glass/#254… · 0 claim app=Rước lễ thật/virtual Communion/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-holy-communion-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-holy-communion-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-holy-communion-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-holy-communion-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}



/* ===== Play-polish #261 — mass / Thánh Lễ open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine + MASS_BLOCKS · reduced-motion · 0 claim app = Thánh Lễ thật / virtual Mass / consecration / thay Thánh Lễ · 0 invent Ordo ===== */
@keyframes mass-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.mass-open-pulse,
#library-modal #library-detail .lib-line-actions.mass-open-pulse,
#library-modal #library-detail > p.mass-open-pulse,
#library-modal #library-related.mass-open-pulse,
#library-modal .lib-related.mass-open-pulse,
#library-modal .lib-related-btn.mass-open-pulse,
#library-modal .lib-group-chip.mass-open-pulse {
  animation: mass-open-pulse 0.65s ease;
}
#library-modal #library-line-back.mass-open-pulse-static,
#library-modal #library-detail .lib-line-actions.mass-open-pulse-static,
#library-modal #library-detail > p.mass-open-pulse-static,
#library-modal #library-related.mass-open-pulse-static,
#library-modal .lib-related.mass-open-pulse-static,
#library-modal .lib-related-btn.mass-open-pulse-static,
#library-modal .lib-group-chip.mass-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="mass"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="mass"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="mass"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.mass-open-pulse,
  #library-modal #library-detail .lib-line-actions.mass-open-pulse,
  #library-modal #library-detail > p.mass-open-pulse,
  #library-modal #library-related.mass-open-pulse,
  #library-modal .lib-related.mass-open-pulse,
  #library-modal .lib-related-btn.mass-open-pulse,
  #library-modal .lib-group-chip.mass-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #262 — Soft tip «Thánh Lễ» · CTA ≥48 · VI học cấu trúc · yield holyCommunion/#260 · realPresence/#258 · eucharisticAdoration/#256 · glass/#254… · phân biệt Mass-prep/#196 · 0 claim app=Thánh Lễ thật/virtual Mass/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-mass-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-mass-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-mass-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-mass-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #263 — eucharist / Bí tích Thánh Thể open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app chứa Real Presence / truyền phép / thay Bí tích · 0 invent kinh ===== */
@keyframes eucharist-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.eucharist-open-pulse,
#library-modal #library-detail .lib-line-actions.eucharist-open-pulse,
#library-modal #library-detail > p.eucharist-open-pulse,
#library-modal #library-related.eucharist-open-pulse,
#library-modal .lib-related.eucharist-open-pulse,
#library-modal .lib-related-btn.eucharist-open-pulse,
#library-modal .lib-group-chip.eucharist-open-pulse {
  animation: eucharist-open-pulse 0.65s ease;
}
#library-modal #library-line-back.eucharist-open-pulse-static,
#library-modal #library-detail .lib-line-actions.eucharist-open-pulse-static,
#library-modal #library-detail > p.eucharist-open-pulse-static,
#library-modal #library-related.eucharist-open-pulse-static,
#library-modal .lib-related.eucharist-open-pulse-static,
#library-modal .lib-related-btn.eucharist-open-pulse-static,
#library-modal .lib-group-chip.eucharist-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="eucharist"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="eucharist"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="eucharist"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.eucharist-open-pulse,
  #library-modal #library-detail .lib-line-actions.eucharist-open-pulse,
  #library-modal #library-detail > p.eucharist-open-pulse,
  #library-modal #library-related.eucharist-open-pulse,
  #library-modal .lib-related.eucharist-open-pulse,
  #library-modal .lib-related-btn.eucharist-open-pulse,
  #library-modal .lib-group-chip.eucharist-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #264 — Soft tip «Bí tích Thánh Thể» · CTA ≥48 · VI học giáo lý · yield mass/#262 · holyCommunion/#260 · realPresence/#258 · eucharisticAdoration/#256 · glass/#254… · 0 claim app=Real Presence/truyền phép/thay Bí tích · no QR/Xu · no sexy/Elara ===== */
#toast.toast-eucharist-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-eucharist-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-eucharist-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-eucharist-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #265 — liturgyOfTheWord / Phụng vụ Lời Chúa open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / bài giảng thật · 0 invent bài đọc/Ordo ===== */
@keyframes liturgy-of-the-word-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.liturgy-of-the-word-open-pulse,
#library-modal #library-detail .lib-line-actions.liturgy-of-the-word-open-pulse,
#library-modal #library-detail > p.liturgy-of-the-word-open-pulse,
#library-modal #library-related.liturgy-of-the-word-open-pulse,
#library-modal .lib-related.liturgy-of-the-word-open-pulse,
#library-modal .lib-related-btn.liturgy-of-the-word-open-pulse,
#library-modal .lib-group-chip.liturgy-of-the-word-open-pulse {
  animation: liturgy-of-the-word-open-pulse 0.65s ease;
}
#library-modal #library-line-back.liturgy-of-the-word-open-pulse-static,
#library-modal #library-detail .lib-line-actions.liturgy-of-the-word-open-pulse-static,
#library-modal #library-detail > p.liturgy-of-the-word-open-pulse-static,
#library-modal #library-related.liturgy-of-the-word-open-pulse-static,
#library-modal .lib-related.liturgy-of-the-word-open-pulse-static,
#library-modal .lib-related-btn.liturgy-of-the-word-open-pulse-static,
#library-modal .lib-group-chip.liturgy-of-the-word-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheWord"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheWord"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheWord"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.liturgy-of-the-word-open-pulse,
  #library-modal #library-detail .lib-line-actions.liturgy-of-the-word-open-pulse,
  #library-modal #library-detail > p.liturgy-of-the-word-open-pulse,
  #library-modal #library-related.liturgy-of-the-word-open-pulse,
  #library-modal .lib-related.liturgy-of-the-word-open-pulse,
  #library-modal .lib-related-btn.liturgy-of-the-word-open-pulse,
  #library-modal .lib-group-chip.liturgy-of-the-word-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #266 — Soft tip «Phụng vụ Lời Chúa» · CTA ≥48 · VI học cấu trúc · yield eucharist/#264 · mass/#262… · phân biệt Bài đọc hôm nay/#204 · 0 claim app=Thánh Lễ/bài giảng thật/thay Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-liturgy-of-the-word-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-liturgy-of-the-word-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-liturgy-of-the-word-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-liturgy-of-the-word-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #267 — liturgyOfTheEucharist / Phụng vụ Thánh Thể open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ thật · 0 invent Ordo/kinh · phân biệt eucharist/#263+#264 ===== */
@keyframes liturgy-of-the-eucharist-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.liturgy-of-the-eucharist-open-pulse,
#library-modal #library-detail .lib-line-actions.liturgy-of-the-eucharist-open-pulse,
#library-modal #library-detail > p.liturgy-of-the-eucharist-open-pulse,
#library-modal #library-related.liturgy-of-the-eucharist-open-pulse,
#library-modal .lib-related.liturgy-of-the-eucharist-open-pulse,
#library-modal .lib-related-btn.liturgy-of-the-eucharist-open-pulse,
#library-modal .lib-group-chip.liturgy-of-the-eucharist-open-pulse {
  animation: liturgy-of-the-eucharist-open-pulse 0.65s ease;
}
#library-modal #library-line-back.liturgy-of-the-eucharist-open-pulse-static,
#library-modal #library-detail .lib-line-actions.liturgy-of-the-eucharist-open-pulse-static,
#library-modal #library-detail > p.liturgy-of-the-eucharist-open-pulse-static,
#library-modal #library-related.liturgy-of-the-eucharist-open-pulse-static,
#library-modal .lib-related.liturgy-of-the-eucharist-open-pulse-static,
#library-modal .lib-related-btn.liturgy-of-the-eucharist-open-pulse-static,
#library-modal .lib-group-chip.liturgy-of-the-eucharist-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheEucharist"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheEucharist"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="liturgyOfTheEucharist"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.liturgy-of-the-eucharist-open-pulse,
  #library-modal #library-detail .lib-line-actions.liturgy-of-the-eucharist-open-pulse,
  #library-modal #library-detail > p.liturgy-of-the-eucharist-open-pulse,
  #library-modal #library-related.liturgy-of-the-eucharist-open-pulse,
  #library-modal .lib-related.liturgy-of-the-eucharist-open-pulse,
  #library-modal .lib-related-btn.liturgy-of-the-eucharist-open-pulse,
  #library-modal .lib-group-chip.liturgy-of-the-eucharist-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #268 — Soft tip «Phụng vụ Thánh Thể» · CTA ≥48 · VI học cấu trúc · yield liturgyOfTheWord/#266 · eucharist/#264… · phân biệt Bí tích Thánh Thể/#264 · 0 claim app=truyền phép/Thánh Lễ thật/thay Thánh Lễ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-liturgy-of-the-eucharist-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-liturgy-of-the-eucharist-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-liturgy-of-the-eucharist-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-liturgy-of-the-eucharist-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #269 — confirmation / Bí tích Thêm sức open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Thêm sức thật · 0 invent nghi thức ===== */
@keyframes confirmation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.confirmation-open-pulse,
#library-modal #library-detail .lib-line-actions.confirmation-open-pulse,
#library-modal #library-detail > p.confirmation-open-pulse,
#library-modal #library-related.confirmation-open-pulse,
#library-modal .lib-related.confirmation-open-pulse,
#library-modal .lib-related-btn.confirmation-open-pulse,
#library-modal .lib-group-chip.confirmation-open-pulse {
  animation: confirmation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.confirmation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.confirmation-open-pulse-static,
#library-modal #library-detail > p.confirmation-open-pulse-static,
#library-modal #library-related.confirmation-open-pulse-static,
#library-modal .lib-related.confirmation-open-pulse-static,
#library-modal .lib-related-btn.confirmation-open-pulse-static,
#library-modal .lib-group-chip.confirmation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="confirmation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="confirmation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="confirmation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.confirmation-open-pulse,
  #library-modal #library-detail .lib-line-actions.confirmation-open-pulse,
  #library-modal #library-detail > p.confirmation-open-pulse,
  #library-modal #library-related.confirmation-open-pulse,
  #library-modal .lib-related.confirmation-open-pulse,
  #library-modal .lib-related-btn.confirmation-open-pulse,
  #library-modal .lib-group-chip.confirmation-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #270 — Soft tip «Thêm sức» · CTA ≥48 · VI học giáo lý · yield liturgyOfTheEucharist/#268 · liturgyOfTheWord/#266 · eucharist/#264… · 0 claim app=Bí tích Thêm sức thật/thay bí tích tại giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-confirmation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-confirmation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-confirmation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-confirmation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #271 — baptism / Bí tích Rửa tội open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Rửa tội thật · 0 invent nghi thức · phân biệt font gaze #249+#250 ===== */
@keyframes baptism-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.baptism-open-pulse,
#library-modal #library-detail .lib-line-actions.baptism-open-pulse,
#library-modal #library-detail > p.baptism-open-pulse,
#library-modal #library-related.baptism-open-pulse,
#library-modal .lib-related.baptism-open-pulse,
#library-modal .lib-related-btn.baptism-open-pulse,
#library-modal .lib-group-chip.baptism-open-pulse {
  animation: baptism-open-pulse 0.65s ease;
}
#library-modal #library-line-back.baptism-open-pulse-static,
#library-modal #library-detail .lib-line-actions.baptism-open-pulse-static,
#library-modal #library-detail > p.baptism-open-pulse-static,
#library-modal #library-related.baptism-open-pulse-static,
#library-modal .lib-related.baptism-open-pulse-static,
#library-modal .lib-related-btn.baptism-open-pulse-static,
#library-modal .lib-group-chip.baptism-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="baptism"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="baptism"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="baptism"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.baptism-open-pulse,
  #library-modal #library-detail .lib-line-actions.baptism-open-pulse,
  #library-modal #library-detail > p.baptism-open-pulse,
  #library-modal #library-related.baptism-open-pulse,
  #library-modal .lib-related.baptism-open-pulse,
  #library-modal .lib-related-btn.baptism-open-pulse,
  #library-modal .lib-group-chip.baptism-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #272 — Soft tip «Rửa tội» · CTA ≥48 · VI học giáo lý · phân biệt «Nhìn giếng rửa tội»/#250 · yield confirmation/#270… · 0 claim app=Bí tích Rửa tội thật/thay bí tích tại giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-baptism-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-baptism-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-baptism-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-baptism-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #273 — penance / Bí tích Hòa giải·Giải tội open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Hòa giải / Giải tội / xá giải thật · 0 invent công thức xưng tội · phân biệt examinationOfConscience / actOfContrition · app không thay linh mục ===== */
@keyframes penance-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.penance-open-pulse,
#library-modal #library-detail .lib-line-actions.penance-open-pulse,
#library-modal #library-detail > p.penance-open-pulse,
#library-modal #library-related.penance-open-pulse,
#library-modal .lib-related.penance-open-pulse,
#library-modal .lib-related-btn.penance-open-pulse,
#library-modal .lib-group-chip.penance-open-pulse {
  animation: penance-open-pulse 0.65s ease;
}
#library-modal #library-line-back.penance-open-pulse-static,
#library-modal #library-detail .lib-line-actions.penance-open-pulse-static,
#library-modal #library-detail > p.penance-open-pulse-static,
#library-modal #library-related.penance-open-pulse-static,
#library-modal .lib-related.penance-open-pulse-static,
#library-modal .lib-related-btn.penance-open-pulse-static,
#library-modal .lib-group-chip.penance-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="penance"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="penance"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="penance"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.penance-open-pulse,
  #library-modal #library-detail .lib-line-actions.penance-open-pulse,
  #library-modal #library-detail > p.penance-open-pulse,
  #library-modal #library-related.penance-open-pulse,
  #library-modal .lib-related.penance-open-pulse,
  #library-modal .lib-related-btn.penance-open-pulse,
  #library-modal .lib-group-chip.penance-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #274 — Soft tip «Hòa giải» · CTA ≥48 · VI học giáo lý · phân biệt Xét mình/Ăn năn · yield baptism/#272 · confirmation/#270 · liturgyOfTheEucharist/#268… · 0 claim app=Bí tích Hòa giải/Giải tội/xá giải thật · không thay linh mục/bí tích tại giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-penance-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-penance-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-penance-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-penance-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #275 — anointingOfTheSick / Bí tích Xức dầu bệnh nhân open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Xức dầu bệnh nhân thật · 0 invent nghi thức / dầu / kinh · phân biệt penance/#273 · app không thay linh mục ===== */
@keyframes anointing-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.anointing-open-pulse,
#library-modal #library-detail .lib-line-actions.anointing-open-pulse,
#library-modal #library-detail > p.anointing-open-pulse,
#library-modal #library-related.anointing-open-pulse,
#library-modal .lib-related.anointing-open-pulse,
#library-modal .lib-related-btn.anointing-open-pulse,
#library-modal .lib-group-chip.anointing-open-pulse {
  animation: anointing-open-pulse 0.65s ease;
}
#library-modal #library-line-back.anointing-open-pulse-static,
#library-modal #library-detail .lib-line-actions.anointing-open-pulse-static,
#library-modal #library-detail > p.anointing-open-pulse-static,
#library-modal #library-related.anointing-open-pulse-static,
#library-modal .lib-related.anointing-open-pulse-static,
#library-modal .lib-related-btn.anointing-open-pulse-static,
#library-modal .lib-group-chip.anointing-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="anointingOfTheSick"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="anointingOfTheSick"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="anointingOfTheSick"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.anointing-open-pulse,
  #library-modal #library-detail .lib-line-actions.anointing-open-pulse,
  #library-modal #library-detail > p.anointing-open-pulse,
  #library-modal #library-related.anointing-open-pulse,
  #library-modal .lib-related.anointing-open-pulse,
  #library-modal .lib-related-btn.anointing-open-pulse,
  #library-modal .lib-group-chip.anointing-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #276 — Soft tip «Xức dầu bệnh nhân» · CTA ≥48 · VI học giáo lý / an ủi bệnh nhân · phân biệt penance/#274 · yield penance/#274 · baptism/#272 · confirmation/#270 · liturgyOfTheEucharist/#268… · 0 claim app=Bí tích Xức dầu thật/thay linh mục·giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-anointing-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-anointing-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-anointing-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-anointing-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #277 — matrimony / Bí tích Hôn phối open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Hôn phối thật · 0 invent nghi thức / kinh hôn phối · phân biệt anointing/#275 · app không thay giáo xứ ===== */
@keyframes matrimony-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.matrimony-open-pulse,
#library-modal #library-detail .lib-line-actions.matrimony-open-pulse,
#library-modal #library-detail > p.matrimony-open-pulse,
#library-modal #library-related.matrimony-open-pulse,
#library-modal .lib-related.matrimony-open-pulse,
#library-modal .lib-related-btn.matrimony-open-pulse,
#library-modal .lib-group-chip.matrimony-open-pulse {
  animation: matrimony-open-pulse 0.65s ease;
}
#library-modal #library-line-back.matrimony-open-pulse-static,
#library-modal #library-detail .lib-line-actions.matrimony-open-pulse-static,
#library-modal #library-detail > p.matrimony-open-pulse-static,
#library-modal #library-related.matrimony-open-pulse-static,
#library-modal .lib-related.matrimony-open-pulse-static,
#library-modal .lib-related-btn.matrimony-open-pulse-static,
#library-modal .lib-group-chip.matrimony-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="matrimony"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="matrimony"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="matrimony"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.matrimony-open-pulse,
  #library-modal #library-detail .lib-line-actions.matrimony-open-pulse,
  #library-modal #library-detail > p.matrimony-open-pulse,
  #library-modal #library-related.matrimony-open-pulse,
  #library-modal .lib-related.matrimony-open-pulse,
  #library-modal .lib-related-btn.matrimony-open-pulse,
  #library-modal .lib-group-chip.matrimony-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #278 — Soft tip «Hôn phối» · CTA ≥48 · VI học giáo lý / hôn nhân Kitô giáo · phân biệt anointing/#276 · yield anointing/#276 · penance/#274 · baptism/#272 · confirmation/#270 · liturgyOfTheEucharist/#268… · 0 claim app=Bí tích Hôn phối thật/thay giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-matrimony-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-matrimony-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-matrimony-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-matrimony-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #279 — holyOrders / Bí tích Truyền chức thánh open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Bí tích Truyền chức thật · 0 invent nghi thức / đặt tay / kinh · phân biệt matrimony/#277 · app không thay giáo phận·giáo xứ ===== */
@keyframes holy-orders-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.holy-orders-open-pulse,
#library-modal #library-detail .lib-line-actions.holy-orders-open-pulse,
#library-modal #library-detail > p.holy-orders-open-pulse,
#library-modal #library-related.holy-orders-open-pulse,
#library-modal .lib-related.holy-orders-open-pulse,
#library-modal .lib-related-btn.holy-orders-open-pulse,
#library-modal .lib-group-chip.holy-orders-open-pulse {
  animation: holy-orders-open-pulse 0.65s ease;
}
#library-modal #library-line-back.holy-orders-open-pulse-static,
#library-modal #library-detail .lib-line-actions.holy-orders-open-pulse-static,
#library-modal #library-detail > p.holy-orders-open-pulse-static,
#library-modal #library-related.holy-orders-open-pulse-static,
#library-modal .lib-related.holy-orders-open-pulse-static,
#library-modal .lib-related-btn.holy-orders-open-pulse-static,
#library-modal .lib-group-chip.holy-orders-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="holyOrders"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="holyOrders"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="holyOrders"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.holy-orders-open-pulse,
  #library-modal #library-detail .lib-line-actions.holy-orders-open-pulse,
  #library-modal #library-detail > p.holy-orders-open-pulse,
  #library-modal #library-related.holy-orders-open-pulse,
  #library-modal .lib-related.holy-orders-open-pulse,
  #library-modal .lib-related-btn.holy-orders-open-pulse,
  #library-modal .lib-group-chip.holy-orders-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #280 — Soft tip «Truyền chức thánh» · CTA ≥48 · VI học giáo lý / ba cấp chức thánh · phân biệt matrimony/#278 · yield matrimony/#278 · anointing/#276 · penance/#274 · baptism/#272 · confirmation/#270 · liturgyOfTheEucharist/#268… · 0 claim app=Bí tích Truyền chức thật/thay giáo phận·giáo xứ · no QR/Xu · no sexy/Elara ===== */
#toast.toast-holy-orders-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-holy-orders-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-holy-orders-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-holy-orders-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #281 — examinationOfConscience / Xét mình open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Giải tội / xá giải · 0 invent công thức xét mình dài / checklist gamify · phân biệt penance/#273 · holyOrders/#279 · actOfContrition ===== */
@keyframes examination-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.examination-open-pulse,
#library-modal #library-detail .lib-line-actions.examination-open-pulse,
#library-modal #library-detail > p.examination-open-pulse,
#library-modal #library-related.examination-open-pulse,
#library-modal .lib-related.examination-open-pulse,
#library-modal .lib-related-btn.examination-open-pulse,
#library-modal .lib-group-chip.examination-open-pulse {
  animation: examination-open-pulse 0.65s ease;
}
#library-modal #library-line-back.examination-open-pulse-static,
#library-modal #library-detail .lib-line-actions.examination-open-pulse-static,
#library-modal #library-detail > p.examination-open-pulse-static,
#library-modal #library-related.examination-open-pulse-static,
#library-modal .lib-related.examination-open-pulse-static,
#library-modal .lib-related-btn.examination-open-pulse-static,
#library-modal .lib-group-chip.examination-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="examinationOfConscience"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="examinationOfConscience"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="examinationOfConscience"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.examination-open-pulse,
  #library-modal #library-detail .lib-line-actions.examination-open-pulse,
  #library-modal #library-detail > p.examination-open-pulse,
  #library-modal #library-related.examination-open-pulse,
  #library-modal .lib-related.examination-open-pulse,
  #library-modal .lib-related-btn.examination-open-pulse,
  #library-modal .lib-group-chip.examination-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #282 — Soft tip «Xét mình» · CTA ≥48 · VI học giáo lý / chuẩn bị Giải tội tại giáo xứ · phân biệt penance/#274 · holyOrders/#280 · actOfContrition · yield holyOrders/#280 · matrimony/#278 · anointing/#276 · penance/#274… · 0 claim app=xá giải/thay linh mục · 0 gamify · no QR/Xu · no sexy/Elara ===== */
#toast.toast-examination-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-examination-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-examination-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-examination-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #283 — actOfContrition / Kinh Ăn năn tội open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine + PRAYERS.contrition · reduced-motion · 0 claim app = xá giải / thay Giải tội · 0 invent kinh mới · phân biệt examinationOfConscience/#281 · penance/#273 · holyOrders/#279 ===== */
@keyframes act-of-contrition-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.act-of-contrition-open-pulse,
#library-modal #library-detail .lib-line-actions.act-of-contrition-open-pulse,
#library-modal #library-detail > p.act-of-contrition-open-pulse,
#library-modal #library-related.act-of-contrition-open-pulse,
#library-modal .lib-related.act-of-contrition-open-pulse,
#library-modal .lib-related-btn.act-of-contrition-open-pulse,
#library-modal .lib-group-chip.act-of-contrition-open-pulse {
  animation: act-of-contrition-open-pulse 0.65s ease;
}
#library-modal #library-line-back.act-of-contrition-open-pulse-static,
#library-modal #library-detail .lib-line-actions.act-of-contrition-open-pulse-static,
#library-modal #library-detail > p.act-of-contrition-open-pulse-static,
#library-modal #library-related.act-of-contrition-open-pulse-static,
#library-modal .lib-related.act-of-contrition-open-pulse-static,
#library-modal .lib-related-btn.act-of-contrition-open-pulse-static,
#library-modal .lib-group-chip.act-of-contrition-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="actOfContrition"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="actOfContrition"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="actOfContrition"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.act-of-contrition-open-pulse,
  #library-modal #library-detail .lib-line-actions.act-of-contrition-open-pulse,
  #library-modal #library-detail > p.act-of-contrition-open-pulse,
  #library-modal #library-related.act-of-contrition-open-pulse,
  #library-modal .lib-related.act-of-contrition-open-pulse,
  #library-modal .lib-related-btn.act-of-contrition-open-pulse,
  #library-modal .lib-group-chip.act-of-contrition-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #284 — Soft tip «Ăn năn tội» · CTA ≥48 · VI học / cầu nguyện chân thành / chuẩn bị hoặc bổ sung Giải tội tại giáo xứ · phân biệt examination/#282 · penance/#274 · holyOrders/#280 · yield examination/#282… · 0 claim app=xá giải/thay linh mục · 0 invent kinh · no QR/Xu · no sexy/Elara ===== */
#toast.toast-act-of-contrition-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-act-of-contrition-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-act-of-contrition-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-act-of-contrition-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #285 — holyOils / Dầu thánh (ba dầu) open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = dầu thánh thật / bí tích / Chrism Mass thay giáo phận · 0 invent nghi thức/công thức dầu · phân biệt chrismMass · anointingOfTheSick/#275 · confirmation/#269 · baptism/#271 · actOfContrition/#283 ===== */
@keyframes holy-oils-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.holy-oils-open-pulse,
#library-modal #library-detail .lib-line-actions.holy-oils-open-pulse,
#library-modal #library-detail > p.holy-oils-open-pulse,
#library-modal #library-related.holy-oils-open-pulse,
#library-modal .lib-related.holy-oils-open-pulse,
#library-modal .lib-related-btn.holy-oils-open-pulse,
#library-modal .lib-group-chip.holy-oils-open-pulse {
  animation: holy-oils-open-pulse 0.65s ease;
}
#library-modal #library-line-back.holy-oils-open-pulse-static,
#library-modal #library-detail .lib-line-actions.holy-oils-open-pulse-static,
#library-modal #library-detail > p.holy-oils-open-pulse-static,
#library-modal #library-related.holy-oils-open-pulse-static,
#library-modal .lib-related.holy-oils-open-pulse-static,
#library-modal .lib-related-btn.holy-oils-open-pulse-static,
#library-modal .lib-group-chip.holy-oils-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="holyOils"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="holyOils"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="holyOils"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.holy-oils-open-pulse,
  #library-modal #library-detail .lib-line-actions.holy-oils-open-pulse,
  #library-modal #library-detail > p.holy-oils-open-pulse,
  #library-modal #library-related.holy-oils-open-pulse,
  #library-modal .lib-related.holy-oils-open-pulse,
  #library-modal .lib-related-btn.holy-oils-open-pulse,
  #library-modal .lib-group-chip.holy-oils-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #286 — Soft tip «Dầu thánh» · CTA ≥48 · VI học giáo lý ba dầu / gắn bí tích tại giáo xứ · phân biệt chrismMass · anointing/#276 · confirmation/#270 · baptism/#272 · actOfContrition/#284 · yield actOfContrition/#284… · 0 claim app=dầu thánh thật/bí tích/Chrism Mass thay giáo phận · 0 invent nghi thức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-holy-oils-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-holy-oils-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-holy-oils-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-holy-oils-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #287 — chrismMass / Thánh Lễ Dầu open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ Dầu thật / thay giáo phận · 0 invent Ordo/kinh · phân biệt holyOils/#285+#286 · holyOrders/#279+#280 · mass/#261+#262 ===== */
@keyframes chrism-mass-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.chrism-mass-open-pulse,
#library-modal #library-detail .lib-line-actions.chrism-mass-open-pulse,
#library-modal #library-detail > p.chrism-mass-open-pulse,
#library-modal #library-related.chrism-mass-open-pulse,
#library-modal .lib-related.chrism-mass-open-pulse,
#library-modal .lib-related-btn.chrism-mass-open-pulse,
#library-modal .lib-group-chip.chrism-mass-open-pulse {
  animation: chrism-mass-open-pulse 0.65s ease;
}
#library-modal #library-line-back.chrism-mass-open-pulse-static,
#library-modal #library-detail .lib-line-actions.chrism-mass-open-pulse-static,
#library-modal #library-detail > p.chrism-mass-open-pulse-static,
#library-modal #library-related.chrism-mass-open-pulse-static,
#library-modal .lib-related.chrism-mass-open-pulse-static,
#library-modal .lib-related-btn.chrism-mass-open-pulse-static,
#library-modal .lib-group-chip.chrism-mass-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="chrismMass"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="chrismMass"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="chrismMass"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.chrism-mass-open-pulse,
  #library-modal #library-detail .lib-line-actions.chrism-mass-open-pulse,
  #library-modal #library-detail > p.chrism-mass-open-pulse,
  #library-modal #library-related.chrism-mass-open-pulse,
  #library-modal .lib-related.chrism-mass-open-pulse,
  #library-modal .lib-related-btn.chrism-mass-open-pulse,
  #library-modal .lib-group-chip.chrism-mass-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #288 — Soft tip «Thánh Lễ Dầu» · CTA ≥48 · VI học giáo lý / gắn dầu thánh·chức thánh tại giáo phận · phân biệt holyOils/#286 · holyOrders/#280 · mass/#262 · yield holyOils/#286… · 0 claim app=Thánh Lễ Dầu thật/thay giáo phận/thay Thánh Lễ giáo xứ · 0 invent Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-chrism-mass-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-chrism-mass-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-chrism-mass-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-chrism-mass-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #289 — confiteor / Tôi thú nhận open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = xá giải / thay Giải tội / thay thống hối đầu lễ · 0 invent lời Confiteor / Ordo · phân biệt penance/#273+#274 · examination/#281+#282 · actOfContrition/#283+#284 · mass/#261+#262 · holyCommunion/#259+#260 · chrismMass/#287+#288 ===== */
@keyframes confiteor-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.confiteor-open-pulse,
#library-modal #library-detail .lib-line-actions.confiteor-open-pulse,
#library-modal #library-detail > p.confiteor-open-pulse,
#library-modal #library-related.confiteor-open-pulse,
#library-modal .lib-related.confiteor-open-pulse,
#library-modal .lib-related-btn.confiteor-open-pulse,
#library-modal .lib-group-chip.confiteor-open-pulse {
  animation: confiteor-open-pulse 0.65s ease;
}
#library-modal #library-line-back.confiteor-open-pulse-static,
#library-modal #library-detail .lib-line-actions.confiteor-open-pulse-static,
#library-modal #library-detail > p.confiteor-open-pulse-static,
#library-modal #library-related.confiteor-open-pulse-static,
#library-modal .lib-related.confiteor-open-pulse-static,
#library-modal .lib-related-btn.confiteor-open-pulse-static,
#library-modal .lib-group-chip.confiteor-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="confiteor"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="confiteor"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="confiteor"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.confiteor-open-pulse,
  #library-modal #library-detail .lib-line-actions.confiteor-open-pulse,
  #library-modal #library-detail > p.confiteor-open-pulse,
  #library-modal #library-related.confiteor-open-pulse,
  #library-modal .lib-related.confiteor-open-pulse,
  #library-modal .lib-related-btn.confiteor-open-pulse,
  #library-modal .lib-group-chip.confiteor-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #290 — Soft tip «Tôi thú nhận» · CTA ≥48 · VI học thống hối đầu Thánh Lễ · phân biệt penance/#274 · examination/#282 · actOfContrition/#284 · mass/#262 · holyCommunion/#260 · chrismMass/#288 · yield chrismMass/#288… · 0 claim app=xá giải/thay Giải tội/thay thống hối đầu lễ · 0 invent lời Confiteor · no QR/Xu · no sexy/Elara ===== */
#toast.toast-confiteor-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-confiteor-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-confiteor-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-confiteor-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #291 — particularExamen / Xét mình riêng open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Giải tội / xá giải · 0 invent checklist gamify · phân biệt examinationOfConscience/#281+#282 · eveningExamen/#198 · actOfContrition/#283+#284 · penance/#273+#274 · confiteor/#289+#290 ===== */
@keyframes particular-examen-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.particular-examen-open-pulse,
#library-modal #library-detail .lib-line-actions.particular-examen-open-pulse,
#library-modal #library-detail > p.particular-examen-open-pulse,
#library-modal #library-related.particular-examen-open-pulse,
#library-modal .lib-related.particular-examen-open-pulse,
#library-modal .lib-related-btn.particular-examen-open-pulse,
#library-modal .lib-group-chip.particular-examen-open-pulse {
  animation: particular-examen-open-pulse 0.65s ease;
}
#library-modal #library-line-back.particular-examen-open-pulse-static,
#library-modal #library-detail .lib-line-actions.particular-examen-open-pulse-static,
#library-modal #library-detail > p.particular-examen-open-pulse-static,
#library-modal #library-related.particular-examen-open-pulse-static,
#library-modal .lib-related.particular-examen-open-pulse-static,
#library-modal .lib-related-btn.particular-examen-open-pulse-static,
#library-modal .lib-group-chip.particular-examen-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="particularExamen"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="particularExamen"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="particularExamen"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.particular-examen-open-pulse,
  #library-modal #library-detail .lib-line-actions.particular-examen-open-pulse,
  #library-modal #library-detail > p.particular-examen-open-pulse,
  #library-modal #library-related.particular-examen-open-pulse,
  #library-modal .lib-related.particular-examen-open-pulse,
  #library-modal .lib-related-btn.particular-examen-open-pulse,
  #library-modal .lib-group-chip.particular-examen-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #292 — Soft tip «Xét mình riêng» · CTA ≥48 · VI kỷ luật ngày / 1 điểm tập trung · phân biệt examination/#282 · eveningExamen/#198 · actOfContrition/#284 · penance/#274 · confiteor/#290 · yield confiteor/#290… · 0 claim app=xá giải/thay Giải tội · 0 invent checklist gamify · no QR/Xu · no sexy/Elara ===== */
#toast.toast-particular-examen-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-particular-examen-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-particular-examen-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-particular-examen-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #293 — kyrie / Xin Chúa thương xót open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ · 0 invent lời Kyrie / Ordo · phân biệt confiteor/#289+#290 · entranceRite · gloria · collect · mass/#261+#262 · penance/#273+#274 ===== */
@keyframes kyrie-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.kyrie-open-pulse,
#library-modal #library-detail .lib-line-actions.kyrie-open-pulse,
#library-modal #library-detail > p.kyrie-open-pulse,
#library-modal #library-related.kyrie-open-pulse,
#library-modal .lib-related.kyrie-open-pulse,
#library-modal .lib-related-btn.kyrie-open-pulse,
#library-modal .lib-group-chip.kyrie-open-pulse {
  animation: kyrie-open-pulse 0.65s ease;
}
#library-modal #library-line-back.kyrie-open-pulse-static,
#library-modal #library-detail .lib-line-actions.kyrie-open-pulse-static,
#library-modal #library-detail > p.kyrie-open-pulse-static,
#library-modal #library-related.kyrie-open-pulse-static,
#library-modal .lib-related.kyrie-open-pulse-static,
#library-modal .lib-related-btn.kyrie-open-pulse-static,
#library-modal .lib-group-chip.kyrie-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="kyrie"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="kyrie"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="kyrie"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.kyrie-open-pulse,
  #library-modal #library-detail .lib-line-actions.kyrie-open-pulse,
  #library-modal #library-detail > p.kyrie-open-pulse,
  #library-modal #library-related.kyrie-open-pulse,
  #library-modal .lib-related.kyrie-open-pulse,
  #library-modal .lib-related-btn.kyrie-open-pulse,
  #library-modal .lib-group-chip.kyrie-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #294 — Soft tip «Xin Chúa thương xót» · CTA ≥48 · VI học phần thống hối / nghi thức mở đầu · phân biệt confiteor/#290 · entranceRite · gloria · collect · mass/#262 · penance/#274 · yield particularExamen/#292… · 0 claim app=Thánh Lễ · 0 invent lời Kyrie · no QR/Xu · no sexy/Elara ===== */
#toast.toast-kyrie-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-kyrie-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-kyrie-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-kyrie-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #295 — gloria / Kinh Vinh danh open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ · 0 invent lời Gloria / Ordo · phân biệt kyrie/#293+#294 · entranceRite · collect · confiteor/#289+#290 · mass/#261+#262 · trinity ===== */
@keyframes gloria-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gloria-open-pulse,
#library-modal #library-detail .lib-line-actions.gloria-open-pulse,
#library-modal #library-detail > p.gloria-open-pulse,
#library-modal #library-related.gloria-open-pulse,
#library-modal .lib-related.gloria-open-pulse,
#library-modal .lib-related-btn.gloria-open-pulse,
#library-modal .lib-group-chip.gloria-open-pulse {
  animation: gloria-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gloria-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gloria-open-pulse-static,
#library-modal #library-detail > p.gloria-open-pulse-static,
#library-modal #library-related.gloria-open-pulse-static,
#library-modal .lib-related.gloria-open-pulse-static,
#library-modal .lib-related-btn.gloria-open-pulse-static,
#library-modal .lib-group-chip.gloria-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="gloria"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="gloria"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="gloria"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gloria-open-pulse,
  #library-modal #library-detail .lib-line-actions.gloria-open-pulse,
  #library-modal #library-detail > p.gloria-open-pulse,
  #library-modal #library-related.gloria-open-pulse,
  #library-modal .lib-related.gloria-open-pulse,
  #library-modal .lib-related-btn.gloria-open-pulse,
  #library-modal .lib-group-chip.gloria-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #296 — Soft tip «Kinh Vinh danh» · CTA ≥48 · VI học tôn vinh Ba Ngôi đầu Thánh Lễ · phân biệt kyrie/#294 · entranceRite · collect · confiteor/#290 · mass/#262 · trinity · yield kyrie/#294… · 0 claim app=Thánh Lễ · 0 invent lời Gloria · no QR/Xu · no sexy/Elara ===== */
#toast.toast-gloria-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gloria-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gloria-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gloria-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #297 — collect / Lời nguyện nhập lễ open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ · 0 invent lời nguyện ngày / Ordo · phân biệt gloria/#295+#296 · kyrie/#293+#294 · entranceRite · confiteor/#289+#290 · mass/#261+#262 · liturgyOfTheWord/#265+#266 · readings/#204 ===== */
@keyframes collect-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.collect-open-pulse,
#library-modal #library-detail .lib-line-actions.collect-open-pulse,
#library-modal #library-detail > p.collect-open-pulse,
#library-modal #library-related.collect-open-pulse,
#library-modal .lib-related.collect-open-pulse,
#library-modal .lib-related-btn.collect-open-pulse,
#library-modal .lib-group-chip.collect-open-pulse {
  animation: collect-open-pulse 0.65s ease;
}
#library-modal #library-line-back.collect-open-pulse-static,
#library-modal #library-detail .lib-line-actions.collect-open-pulse-static,
#library-modal #library-detail > p.collect-open-pulse-static,
#library-modal #library-related.collect-open-pulse-static,
#library-modal .lib-related.collect-open-pulse-static,
#library-modal .lib-related-btn.collect-open-pulse-static,
#library-modal .lib-group-chip.collect-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="collect"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="collect"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="collect"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.collect-open-pulse,
  #library-modal #library-detail .lib-line-actions.collect-open-pulse,
  #library-modal #library-detail > p.collect-open-pulse,
  #library-modal #library-related.collect-open-pulse,
  #library-modal .lib-related.collect-open-pulse,
  #library-modal .lib-related-btn.collect-open-pulse,
  #library-modal .lib-group-chip.collect-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #298 — Soft tip «Lời nguyện nhập lễ» · CTA ≥48 · VI học lời nguyện chủ tế mở phụng vụ Lời Chúa · phân biệt gloria/#296 · kyrie/#294 · entranceRite · confiteor/#290 · mass/#262 · liturgyOfTheWord/#266 · readings/#204 · yield gloria/#296… · 0 claim app=Thánh Lễ · 0 invent lời ngày · no QR/Xu · no sexy/Elara ===== */
#toast.toast-collect-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-collect-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-collect-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-collect-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #299 — entranceRite / Nghi thức mở đầu open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ · 0 invent Ordo / kinh · phân biệt collect/#297+#298 · gloria/#295+#296 · kyrie/#293+#294 · confiteor/#289+#290 · mass/#261+#262 · liturgyOfTheWord/#265+#266 ===== */
@keyframes entrance-rite-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.entrance-rite-open-pulse,
#library-modal #library-detail .lib-line-actions.entrance-rite-open-pulse,
#library-modal #library-detail > p.entrance-rite-open-pulse,
#library-modal #library-related.entrance-rite-open-pulse,
#library-modal .lib-related.entrance-rite-open-pulse,
#library-modal .lib-related-btn.entrance-rite-open-pulse,
#library-modal .lib-group-chip.entrance-rite-open-pulse {
  animation: entrance-rite-open-pulse 0.65s ease;
}
#library-modal #library-line-back.entrance-rite-open-pulse-static,
#library-modal #library-detail .lib-line-actions.entrance-rite-open-pulse-static,
#library-modal #library-detail > p.entrance-rite-open-pulse-static,
#library-modal #library-related.entrance-rite-open-pulse-static,
#library-modal .lib-related.entrance-rite-open-pulse-static,
#library-modal .lib-related-btn.entrance-rite-open-pulse-static,
#library-modal .lib-group-chip.entrance-rite-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="entranceRite"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="entranceRite"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="entranceRite"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.entrance-rite-open-pulse,
  #library-modal #library-detail .lib-line-actions.entrance-rite-open-pulse,
  #library-modal #library-detail > p.entrance-rite-open-pulse,
  #library-modal #library-related.entrance-rite-open-pulse,
  #library-modal .lib-related.entrance-rite-open-pulse,
  #library-modal .lib-related-btn.entrance-rite-open-pulse,
  #library-modal .lib-group-chip.entrance-rite-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #300 — Soft tip «Nghi thức mở đầu» · CTA ≥48 · VI học cấu trúc mở đầu Thánh Lễ (tụ họp→thống hối/Confiteor→Kyrie→Gloria→Collect) · phân biệt collect/#298 · gloria/#296 · kyrie/#294 · confiteor/#290 · mass/#262 · liturgyOfTheWord/#266 · yield collect/#298… · 0 claim app=Thánh Lễ · 0 invent Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-entrance-rite-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-entrance-rite-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-entrance-rite-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-entrance-rite-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #301 — alleluia / Alleluia / Tung hô Tin Mừng open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / ca đoàn · 0 invent lời/giai điệu Alleluia / Ordo · phân biệt liturgyOfTheWord/#265+#266 · readings/#204 · homily · entranceRite/#299+#300 · collect/#297+#298 · mass/#261+#262 · creed ===== */
@keyframes alleluia-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.alleluia-open-pulse,
#library-modal #library-detail .lib-line-actions.alleluia-open-pulse,
#library-modal #library-detail > p.alleluia-open-pulse,
#library-modal #library-related.alleluia-open-pulse,
#library-modal .lib-related.alleluia-open-pulse,
#library-modal .lib-related-btn.alleluia-open-pulse,
#library-modal .lib-group-chip.alleluia-open-pulse {
  animation: alleluia-open-pulse 0.65s ease;
}
#library-modal #library-line-back.alleluia-open-pulse-static,
#library-modal #library-detail .lib-line-actions.alleluia-open-pulse-static,
#library-modal #library-detail > p.alleluia-open-pulse-static,
#library-modal #library-related.alleluia-open-pulse-static,
#library-modal .lib-related.alleluia-open-pulse-static,
#library-modal .lib-related-btn.alleluia-open-pulse-static,
#library-modal .lib-group-chip.alleluia-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="alleluia"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="alleluia"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="alleluia"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.alleluia-open-pulse,
  #library-modal #library-detail .lib-line-actions.alleluia-open-pulse,
  #library-modal #library-detail > p.alleluia-open-pulse,
  #library-modal #library-related.alleluia-open-pulse,
  #library-modal .lib-related.alleluia-open-pulse,
  #library-modal .lib-related-btn.alleluia-open-pulse,
  #library-modal .lib-group-chip.alleluia-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #302 — Soft tip «Alleluia» / «Tung hô Tin Mừng» · CTA ≥48 · VI học tung hô trước Tin Mừng trong Phụng vụ Lời Chúa · mùa Chay không Alleluia · phân biệt liturgyOfTheWord/#266 · readings/#204 · homily · entranceRite/#300 · collect/#298 · mass/#262 · creed · yield entranceRite/#300… · 0 claim app=Thánh Lễ/ca đoàn · 0 invent lời/giai điệu · no QR/Xu · no sexy/Elara ===== */
#toast.toast-alleluia-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-alleluia-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-alleluia-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-alleluia-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #303 — homily / Bài giảng open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = bài giảng / Thánh Lễ / thay linh mục · 0 invent bài giảng · phân biệt alleluia/#301+#302 · liturgyOfTheWord/#265+#266 · readings/#204 · creed · prayerOfTheFaithful · mass/#261+#262 · scriptureTradition ===== */
@keyframes homily-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.homily-open-pulse,
#library-modal #library-detail .lib-line-actions.homily-open-pulse,
#library-modal #library-detail > p.homily-open-pulse,
#library-modal #library-related.homily-open-pulse,
#library-modal .lib-related.homily-open-pulse,
#library-modal .lib-related-btn.homily-open-pulse,
#library-modal .lib-group-chip.homily-open-pulse {
  animation: homily-open-pulse 0.65s ease;
}
#library-modal #library-line-back.homily-open-pulse-static,
#library-modal #library-detail .lib-line-actions.homily-open-pulse-static,
#library-modal #library-detail > p.homily-open-pulse-static,
#library-modal #library-related.homily-open-pulse-static,
#library-modal .lib-related.homily-open-pulse-static,
#library-modal .lib-related-btn.homily-open-pulse-static,
#library-modal .lib-group-chip.homily-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="homily"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="homily"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="homily"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.homily-open-pulse,
  #library-modal #library-detail .lib-line-actions.homily-open-pulse,
  #library-modal #library-detail > p.homily-open-pulse,
  #library-modal #library-related.homily-open-pulse,
  #library-modal .lib-related.homily-open-pulse,
  #library-modal .lib-related-btn.homily-open-pulse,
  #library-modal .lib-group-chip.homily-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #304 — Soft tip «Bài giảng» · CTA ≥48 · VI học vị trí bài giảng sau Tin Mừng trong Phụng vụ Lời Chúa · phân biệt alleluia/#302 · liturgyOfTheWord/#266 · readings/#204 · creed · prayerOfTheFaithful · mass/#262 · scriptureTradition · yield alleluia/#302… · 0 claim app=bài giảng/Thánh Lễ/thay linh mục · 0 invent bài giảng · no QR/Xu · no sexy/Elara ===== */
#toast.toast-homily-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-homily-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-homily-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-homily-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #305 — creed / Tin Kính open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / thay tuyên xưng tại giáo xứ · 0 invent lời Tin Kính · phân biệt homily/#303+#304 · alleluia/#301+#302 · liturgyOfTheWord/#265+#266 · prayerOfTheFaithful · mass/#261+#262 · trinity ===== */
@keyframes creed-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.creed-open-pulse,
#library-modal #library-detail .lib-line-actions.creed-open-pulse,
#library-modal #library-detail > p.creed-open-pulse,
#library-modal #library-related.creed-open-pulse,
#library-modal .lib-related.creed-open-pulse,
#library-modal .lib-related-btn.creed-open-pulse,
#library-modal .lib-group-chip.creed-open-pulse {
  animation: creed-open-pulse 0.65s ease;
}
#library-modal #library-line-back.creed-open-pulse-static,
#library-modal #library-detail .lib-line-actions.creed-open-pulse-static,
#library-modal #library-detail > p.creed-open-pulse-static,
#library-modal #library-related.creed-open-pulse-static,
#library-modal .lib-related.creed-open-pulse-static,
#library-modal .lib-related-btn.creed-open-pulse-static,
#library-modal .lib-group-chip.creed-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="creed"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="creed"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="creed"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.creed-open-pulse,
  #library-modal #library-detail .lib-line-actions.creed-open-pulse,
  #library-modal #library-detail > p.creed-open-pulse,
  #library-modal #library-related.creed-open-pulse,
  #library-modal .lib-related.creed-open-pulse,
  #library-modal .lib-related-btn.creed-open-pulse,
  #library-modal .lib-group-chip.creed-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #306 — Soft tip «Tin Kính» · CTA ≥48 · VI học tuyên xưng đức tin trong Phụng vụ Lời Chúa (khi luật chỉ định) · phân biệt homily/#304 · alleluia/#302 · liturgyOfTheWord/#266 · prayerOfTheFaithful · mass/#262 · trinity · yield homily/#304… · 0 claim app=Thánh Lễ/thay tuyên xưng tại giáo xứ · 0 invent lời Tin Kính · no QR/Xu · no sexy/Elara ===== */
#toast.toast-creed-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-creed-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-creed-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-creed-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #307 — prayerOfTheFaithful / Lời nguyện tín hữu open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / thay lời nguyện tín hữu tại giáo xứ · 0 invent ý nguyện/Ordo · phân biệt creed/#305+#306 · homily/#303+#304 · alleluia/#301+#302 · liturgyOfTheWord/#265+#266 · mass/#261+#262 ===== */
@keyframes prayer-of-the-faithful-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.prayer-of-the-faithful-open-pulse,
#library-modal #library-detail .lib-line-actions.prayer-of-the-faithful-open-pulse,
#library-modal #library-detail > p.prayer-of-the-faithful-open-pulse,
#library-modal #library-related.prayer-of-the-faithful-open-pulse,
#library-modal .lib-related.prayer-of-the-faithful-open-pulse,
#library-modal .lib-related-btn.prayer-of-the-faithful-open-pulse,
#library-modal .lib-group-chip.prayer-of-the-faithful-open-pulse {
  animation: prayer-of-the-faithful-open-pulse 0.65s ease;
}
#library-modal #library-line-back.prayer-of-the-faithful-open-pulse-static,
#library-modal #library-detail .lib-line-actions.prayer-of-the-faithful-open-pulse-static,
#library-modal #library-detail > p.prayer-of-the-faithful-open-pulse-static,
#library-modal #library-related.prayer-of-the-faithful-open-pulse-static,
#library-modal .lib-related.prayer-of-the-faithful-open-pulse-static,
#library-modal .lib-related-btn.prayer-of-the-faithful-open-pulse-static,
#library-modal .lib-group-chip.prayer-of-the-faithful-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="prayerOfTheFaithful"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="prayerOfTheFaithful"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="prayerOfTheFaithful"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.prayer-of-the-faithful-open-pulse,
  #library-modal #library-detail .lib-line-actions.prayer-of-the-faithful-open-pulse,
  #library-modal #library-detail > p.prayer-of-the-faithful-open-pulse,
  #library-modal #library-related.prayer-of-the-faithful-open-pulse,
  #library-modal .lib-related.prayer-of-the-faithful-open-pulse,
  #library-modal .lib-related-btn.prayer-of-the-faithful-open-pulse,
  #library-modal .lib-group-chip.prayer-of-the-faithful-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #308 — Soft tip «Lời nguyện tín hữu» · CTA ≥48 · VI học phần lời nguyện chung kết thúc Phụng vụ Lời Chúa · phân biệt creed/#306 · homily/#304 · alleluia/#302 · liturgyOfTheWord/#266 · mass/#262 · yield creed/#306… · 0 claim app=Thánh Lễ/thay lời nguyện tín hữu tại giáo xứ · 0 invent ý nguyện · no QR/Xu · no sexy/Elara ===== */
#toast.toast-prayer-of-the-faithful-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-prayer-of-the-faithful-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-prayer-of-the-faithful-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-prayer-of-the-faithful-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #309 — preparationOfGifts / Chuẩn bị lễ vật open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / truyền phép / thay dâng lễ vật tại giáo xứ · 0 invent Ordo/kinh · phân biệt prayerOfTheFaithful/#307+#308 · liturgyOfTheEucharist/#267+#268 · preface · offertory · mass/#261+#262 · eucharist/#263+#264 ===== */
@keyframes preparation-of-gifts-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.preparation-of-gifts-open-pulse,
#library-modal #library-detail .lib-line-actions.preparation-of-gifts-open-pulse,
#library-modal #library-detail > p.preparation-of-gifts-open-pulse,
#library-modal #library-related.preparation-of-gifts-open-pulse,
#library-modal .lib-related.preparation-of-gifts-open-pulse,
#library-modal .lib-related-btn.preparation-of-gifts-open-pulse,
#library-modal .lib-group-chip.preparation-of-gifts-open-pulse {
  animation: preparation-of-gifts-open-pulse 0.65s ease;
}
#library-modal #library-line-back.preparation-of-gifts-open-pulse-static,
#library-modal #library-detail .lib-line-actions.preparation-of-gifts-open-pulse-static,
#library-modal #library-detail > p.preparation-of-gifts-open-pulse-static,
#library-modal #library-related.preparation-of-gifts-open-pulse-static,
#library-modal .lib-related.preparation-of-gifts-open-pulse-static,
#library-modal .lib-related-btn.preparation-of-gifts-open-pulse-static,
#library-modal .lib-group-chip.preparation-of-gifts-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="preparationOfGifts"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="preparationOfGifts"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="preparationOfGifts"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.preparation-of-gifts-open-pulse,
  #library-modal #library-detail .lib-line-actions.preparation-of-gifts-open-pulse,
  #library-modal #library-detail > p.preparation-of-gifts-open-pulse,
  #library-modal #library-related.preparation-of-gifts-open-pulse,
  #library-modal .lib-related.preparation-of-gifts-open-pulse,
  #library-modal .lib-related-btn.preparation-of-gifts-open-pulse,
  #library-modal .lib-group-chip.preparation-of-gifts-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #310 — Soft tip «Chuẩn bị lễ vật» / «Dâng lễ vật» · CTA ≥48 · VI học phần mở đầu Phụng vụ Thánh Thể (chuẩn bị bánh·rượu) · phân biệt prayerOfTheFaithful/#308 · liturgyOfTheEucharist/#268 · preface · offertory · mass/#262 · eucharist/#264 · yield prayerOfTheFaithful/#308… · 0 claim app=Thánh Lễ/truyền phép/thay dâng lễ vật tại giáo xứ · 0 invent Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-preparation-of-gifts-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-preparation-of-gifts-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-preparation-of-gifts-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-preparation-of-gifts-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #311 — preface / Kinh Tiền tụng open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / truyền phép / thay Kinh Tiền tụng tại giáo xứ · 0 invent lời Preface/Ordo · phân biệt preparationOfGifts/#309+#310 · sanctus · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · eucharist/#263+#264 ===== */
@keyframes preface-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.preface-open-pulse,
#library-modal #library-detail .lib-line-actions.preface-open-pulse,
#library-modal #library-detail > p.preface-open-pulse,
#library-modal #library-related.preface-open-pulse,
#library-modal .lib-related.preface-open-pulse,
#library-modal .lib-related-btn.preface-open-pulse,
#library-modal .lib-group-chip.preface-open-pulse {
  animation: preface-open-pulse 0.65s ease;
}
#library-modal #library-line-back.preface-open-pulse-static,
#library-modal #library-detail .lib-line-actions.preface-open-pulse-static,
#library-modal #library-detail > p.preface-open-pulse-static,
#library-modal #library-related.preface-open-pulse-static,
#library-modal .lib-related.preface-open-pulse-static,
#library-modal .lib-related-btn.preface-open-pulse-static,
#library-modal .lib-group-chip.preface-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="preface"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="preface"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="preface"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.preface-open-pulse,
  #library-modal #library-detail .lib-line-actions.preface-open-pulse,
  #library-modal #library-detail > p.preface-open-pulse,
  #library-modal #library-related.preface-open-pulse,
  #library-modal .lib-related.preface-open-pulse,
  #library-modal .lib-related-btn.preface-open-pulse,
  #library-modal .lib-group-chip.preface-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #312 — Soft tip «Kinh Tiền tụng» · CTA ≥48 · VI học phần mở đầu Kinh nguyện Thánh Thể (tạ ơn trước Sanctus) · phân biệt preparationOfGifts/#310 · sanctus · liturgyOfTheEucharist/#268 · mass/#262 · eucharist/#264 · yield preparationOfGifts/#310… · 0 claim app=Thánh Lễ/truyền phép/thay Kinh Tiền tụng tại giáo xứ · 0 invent lời Preface · no QR/Xu · no sexy/Elara ===== */
#toast.toast-preface-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-preface-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-preface-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-preface-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #313 — sanctus / Thánh Thánh Thánh open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / truyền phép / thay Thánh Thánh Thánh tại giáo xứ · 0 invent lời Sanctus/Ordo · phân biệt preface/#311+#312 · preparationOfGifts/#309+#310 · epiclesis · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 ===== */
@keyframes sanctus-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.sanctus-open-pulse,
#library-modal #library-detail .lib-line-actions.sanctus-open-pulse,
#library-modal #library-detail > p.sanctus-open-pulse,
#library-modal #library-related.sanctus-open-pulse,
#library-modal .lib-related.sanctus-open-pulse,
#library-modal .lib-related-btn.sanctus-open-pulse,
#library-modal .lib-group-chip.sanctus-open-pulse {
  animation: sanctus-open-pulse 0.65s ease;
}
#library-modal #library-line-back.sanctus-open-pulse-static,
#library-modal #library-detail .lib-line-actions.sanctus-open-pulse-static,
#library-modal #library-detail > p.sanctus-open-pulse-static,
#library-modal #library-related.sanctus-open-pulse-static,
#library-modal .lib-related.sanctus-open-pulse-static,
#library-modal .lib-related-btn.sanctus-open-pulse-static,
#library-modal .lib-group-chip.sanctus-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="sanctus"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="sanctus"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="sanctus"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.sanctus-open-pulse,
  #library-modal #library-detail .lib-line-actions.sanctus-open-pulse,
  #library-modal #library-detail > p.sanctus-open-pulse,
  #library-modal #library-related.sanctus-open-pulse,
  #library-modal .lib-related.sanctus-open-pulse,
  #library-modal .lib-related-btn.sanctus-open-pulse,
  #library-modal .lib-group-chip.sanctus-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #314 — Soft tip «Thánh Thánh Thánh» · CTA ≥48 · VI học bài ca tung hô trước phần trung tâm Kinh nguyện Thánh Thể · phân biệt preface/#312 · preparationOfGifts/#310 · epiclesis · liturgyOfTheEucharist/#268 · mass/#262 · yield preface/#312… · 0 claim app=Thánh Lễ/truyền phép/thay Thánh Thánh Thánh tại giáo xứ · 0 invent lời Sanctus · no QR/Xu · no sexy/Elara ===== */
#toast.toast-sanctus-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sanctus-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sanctus-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sanctus-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #315 — epiclesis / Lời cầu Thánh Thần open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ / chứa Real Presence / thay Thánh Lễ giáo xứ · 0 invent lời Epiclesis/Ordo · phân biệt sanctus/#313+#314 · wordsOfInstitution · preface/#311+#312 · liturgyOfTheEucharist/#267+#268 · realPresence/#257+#258 · mass/#261+#262 ===== */
@keyframes epiclesis-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.epiclesis-open-pulse,
#library-modal #library-detail .lib-line-actions.epiclesis-open-pulse,
#library-modal #library-detail > p.epiclesis-open-pulse,
#library-modal #library-related.epiclesis-open-pulse,
#library-modal .lib-related.epiclesis-open-pulse,
#library-modal .lib-related-btn.epiclesis-open-pulse,
#library-modal .lib-group-chip.epiclesis-open-pulse {
  animation: epiclesis-open-pulse 0.65s ease;
}
#library-modal #library-line-back.epiclesis-open-pulse-static,
#library-modal #library-detail .lib-line-actions.epiclesis-open-pulse-static,
#library-modal #library-detail > p.epiclesis-open-pulse-static,
#library-modal #library-related.epiclesis-open-pulse-static,
#library-modal .lib-related.epiclesis-open-pulse-static,
#library-modal .lib-related-btn.epiclesis-open-pulse-static,
#library-modal .lib-group-chip.epiclesis-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="epiclesis"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="epiclesis"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="epiclesis"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.epiclesis-open-pulse,
  #library-modal #library-detail .lib-line-actions.epiclesis-open-pulse,
  #library-modal #library-detail > p.epiclesis-open-pulse,
  #library-modal #library-related.epiclesis-open-pulse,
  #library-modal .lib-related.epiclesis-open-pulse,
  #library-modal .lib-related-btn.epiclesis-open-pulse,
  #library-modal .lib-group-chip.epiclesis-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #316 — Soft tip «Lời cầu Thánh Thần» · CTA ≥48 · VI học lời cầu xin Chúa Thánh Thần trong Kinh nguyện Thánh Thể · phân biệt sanctus/#314 · wordsOfInstitution · preface/#312 · liturgyOfTheEucharist/#268 · realPresence/#258 · mass/#262 · yield sanctus/#314… · 0 claim app=truyền phép/Thánh Lễ/chứa Real Presence/thay Thánh Lễ giáo xứ · 0 invent lời Epiclesis · no QR/Xu · no sexy/Elara ===== */
#toast.toast-epiclesis-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-epiclesis-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-epiclesis-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-epiclesis-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #317 — wordsOfInstitution / Lời truyền phép open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / chứa Real Presence / Thánh Lễ thật / thay linh mục · 0 invent lời truyền phép/Ordo · phân biệt epiclesis/#315+#316 · anamnesis · sanctus/#313+#314 · realPresence/#257+#258 · eucharist/#263+#264 · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 ===== */
@keyframes words-of-institution-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.words-of-institution-open-pulse,
#library-modal #library-detail .lib-line-actions.words-of-institution-open-pulse,
#library-modal #library-detail > p.words-of-institution-open-pulse,
#library-modal #library-related.words-of-institution-open-pulse,
#library-modal .lib-related.words-of-institution-open-pulse,
#library-modal .lib-related-btn.words-of-institution-open-pulse,
#library-modal .lib-group-chip.words-of-institution-open-pulse {
  animation: words-of-institution-open-pulse 0.65s ease;
}
#library-modal #library-line-back.words-of-institution-open-pulse-static,
#library-modal #library-detail .lib-line-actions.words-of-institution-open-pulse-static,
#library-modal #library-detail > p.words-of-institution-open-pulse-static,
#library-modal #library-related.words-of-institution-open-pulse-static,
#library-modal .lib-related.words-of-institution-open-pulse-static,
#library-modal .lib-related-btn.words-of-institution-open-pulse-static,
#library-modal .lib-group-chip.words-of-institution-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="wordsOfInstitution"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="wordsOfInstitution"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="wordsOfInstitution"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.words-of-institution-open-pulse,
  #library-modal #library-detail .lib-line-actions.words-of-institution-open-pulse,
  #library-modal #library-detail > p.words-of-institution-open-pulse,
  #library-modal #library-related.words-of-institution-open-pulse,
  #library-modal .lib-related.words-of-institution-open-pulse,
  #library-modal .lib-related-btn.words-of-institution-open-pulse,
  #library-modal .lib-group-chip.words-of-institution-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #318 — Soft tip «Lời truyền phép» · CTA ≥48 · VI học lời Chúa Giêsu trong bữa Tiệc Ly được linh mục đọc trong Kinh nguyện Thánh Thể tại giáo xứ · app chỉ giúp học · phân biệt epiclesis/#316 · anamnesis · sanctus/#314 · realPresence/#258 · eucharist/#264 · liturgyOfTheEucharist/#268 · mass/#262 · yield epiclesis/#316… · 0 claim app=truyền phép/chứa Mình Máu Thánh/Thánh Lễ thật/thay linh mục · 0 invent lời truyền phép · no QR/Xu · no sexy/Elara ===== */
#toast.toast-words-of-institution-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-words-of-institution-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-words-of-institution-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-words-of-institution-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #319 — anamnesis / Tưởng niệm open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ / chứa Real Presence / thay Thánh Lễ giáo xứ · 0 invent lời/Ordo · phân biệt wordsOfInstitution/#317+#318 · memorialAcclamation · epiclesis/#315+#316 · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · eucharist/#263+#264 ===== */
@keyframes anamnesis-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.anamnesis-open-pulse,
#library-modal #library-detail .lib-line-actions.anamnesis-open-pulse,
#library-modal #library-detail > p.anamnesis-open-pulse,
#library-modal #library-related.anamnesis-open-pulse,
#library-modal .lib-related.anamnesis-open-pulse,
#library-modal .lib-related-btn.anamnesis-open-pulse,
#library-modal .lib-group-chip.anamnesis-open-pulse {
  animation: anamnesis-open-pulse 0.65s ease;
}
#library-modal #library-line-back.anamnesis-open-pulse-static,
#library-modal #library-detail .lib-line-actions.anamnesis-open-pulse-static,
#library-modal #library-detail > p.anamnesis-open-pulse-static,
#library-modal #library-related.anamnesis-open-pulse-static,
#library-modal .lib-related.anamnesis-open-pulse-static,
#library-modal .lib-related-btn.anamnesis-open-pulse-static,
#library-modal .lib-group-chip.anamnesis-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="anamnesis"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="anamnesis"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="anamnesis"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.anamnesis-open-pulse,
  #library-modal #library-detail .lib-line-actions.anamnesis-open-pulse,
  #library-modal #library-detail > p.anamnesis-open-pulse,
  #library-modal #library-related.anamnesis-open-pulse,
  #library-modal .lib-related.anamnesis-open-pulse,
  #library-modal .lib-related-btn.anamnesis-open-pulse,
  #library-modal .lib-group-chip.anamnesis-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #320 — Soft tip «Tưởng niệm» · CTA ≥48 · VI học phần tưởng niệm cuộc khổ nạn·phục sinh trong Kinh nguyện Thánh Thể · phân biệt wordsOfInstitution/#318 · memorialAcclamation · epiclesis/#316 · liturgyOfTheEucharist/#268 · mass/#262 · eucharist/#264 · yield wordsOfInstitution/#318… · 0 claim app=truyền phép/Thánh Lễ/chứa Real Presence/thay Thánh Lễ giáo xứ · 0 invent lời · no QR/Xu · no sexy/Elara ===== */
#toast.toast-anamnesis-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-anamnesis-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-anamnesis-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-anamnesis-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #321 — memorialAcclamation / Tung hô tưởng niệm open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ / chứa Real Presence / thay Thánh Lễ giáo xứ · 0 invent lời/Ordo · phân biệt anamnesis/#319+#320 · wordsOfInstitution/#317+#318 · greatAmen · epiclesis/#315+#316 · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 ===== */
@keyframes memorial-acclamation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.memorial-acclamation-open-pulse,
#library-modal #library-detail .lib-line-actions.memorial-acclamation-open-pulse,
#library-modal #library-detail > p.memorial-acclamation-open-pulse,
#library-modal #library-related.memorial-acclamation-open-pulse,
#library-modal .lib-related.memorial-acclamation-open-pulse,
#library-modal .lib-related-btn.memorial-acclamation-open-pulse,
#library-modal .lib-group-chip.memorial-acclamation-open-pulse {
  animation: memorial-acclamation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.memorial-acclamation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.memorial-acclamation-open-pulse-static,
#library-modal #library-detail > p.memorial-acclamation-open-pulse-static,
#library-modal #library-related.memorial-acclamation-open-pulse-static,
#library-modal .lib-related.memorial-acclamation-open-pulse-static,
#library-modal .lib-related-btn.memorial-acclamation-open-pulse-static,
#library-modal .lib-group-chip.memorial-acclamation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="memorialAcclamation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="memorialAcclamation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="memorialAcclamation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.memorial-acclamation-open-pulse,
  #library-modal #library-detail .lib-line-actions.memorial-acclamation-open-pulse,
  #library-modal #library-detail > p.memorial-acclamation-open-pulse,
  #library-modal #library-related.memorial-acclamation-open-pulse,
  #library-modal .lib-related.memorial-acclamation-open-pulse,
  #library-modal .lib-related-btn.memorial-acclamation-open-pulse,
  #library-modal .lib-group-chip.memorial-acclamation-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #322 — Soft tip «Tung hô tưởng niệm» · CTA ≥48 · VI học lời tung hô của cộng đoàn sau lời truyền phép trong Kinh nguyện Thánh Thể · phân biệt anamnesis/#320 · wordsOfInstitution/#318 · greatAmen · epiclesis/#316 · liturgyOfTheEucharist/#268 · mass/#262 · yield anamnesis/#320… · 0 claim app=truyền phép/Thánh Lễ/chứa Real Presence/thay Thánh Lễ giáo xứ · 0 invent lời · no QR/Xu · no sexy/Elara ===== */
#toast.toast-memorial-acclamation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-memorial-acclamation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-memorial-acclamation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-memorial-acclamation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #323 — eucharisticIntercession / Chuyển cầu trong KNTT open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ / chứa Real Presence / thay Thánh Lễ giáo xứ / cử hành Hy tế · 0 invent lời chuyển cầu/Ordo/ý nguyện · phân biệt memorialAcclamation/#321+#322 · anamnesis/#319+#320 · wordsOfInstitution/#317+#318 · prayerOfTheFaithful/#307+#308 · greatAmen · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · communionOfSaints ===== */
@keyframes eucharistic-intercession-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.eucharistic-intercession-open-pulse,
#library-modal #library-detail .lib-line-actions.eucharistic-intercession-open-pulse,
#library-modal #library-detail > p.eucharistic-intercession-open-pulse,
#library-modal #library-related.eucharistic-intercession-open-pulse,
#library-modal .lib-related.eucharistic-intercession-open-pulse,
#library-modal .lib-related-btn.eucharistic-intercession-open-pulse,
#library-modal .lib-group-chip.eucharistic-intercession-open-pulse {
  animation: eucharistic-intercession-open-pulse 0.65s ease;
}
#library-modal #library-line-back.eucharistic-intercession-open-pulse-static,
#library-modal #library-detail .lib-line-actions.eucharistic-intercession-open-pulse-static,
#library-modal #library-detail > p.eucharistic-intercession-open-pulse-static,
#library-modal #library-related.eucharistic-intercession-open-pulse-static,
#library-modal .lib-related.eucharistic-intercession-open-pulse-static,
#library-modal .lib-related-btn.eucharistic-intercession-open-pulse-static,
#library-modal .lib-group-chip.eucharistic-intercession-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="eucharisticIntercession"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="eucharisticIntercession"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="eucharisticIntercession"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.eucharistic-intercession-open-pulse,
  #library-modal #library-detail .lib-line-actions.eucharistic-intercession-open-pulse,
  #library-modal #library-detail > p.eucharistic-intercession-open-pulse,
  #library-modal #library-related.eucharistic-intercession-open-pulse,
  #library-modal .lib-related.eucharistic-intercession-open-pulse,
  #library-modal .lib-related-btn.eucharistic-intercession-open-pulse,
  #library-modal .lib-group-chip.eucharistic-intercession-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #324 — Soft tip «Chuyển cầu trong KNTT» · CTA ≥48 · VI học chuyển cầu trong Kinh nguyện Thánh Thể · phân biệt memorialAcclamation/#322 · anamnesis/#320 · wordsOfInstitution/#318 · prayerOfTheFaithful/#308 · greatAmen · liturgyOfTheEucharist/#268 · mass/#262 · communionOfSaints · yield memorialAcclamation/#322… · 0 claim app=truyền phép/Thánh Lễ/chứa Real Presence/thay Thánh Lễ giáo xứ/cử hành Hy tế · 0 invent ý nguyện · no QR/Xu · no sexy/Elara ===== */
#toast.toast-eucharistic-intercession-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-eucharistic-intercession-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-eucharistic-intercession-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-eucharistic-intercession-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #325 — greatAmen / Amen lớn open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = truyền phép / Thánh Lễ / chứa Real Presence / nâng cao Mình Thánh / thay Thánh Lễ giáo xứ · 0 invent lời Amen/doxology/Ordo/giai điệu · phân biệt eucharisticIntercession/#323+#324 · memorialAcclamation/#321+#322 · anamnesis/#319+#320 · wordsOfInstitution/#317+#318 · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · sanctus/#313+#314 ===== */
@keyframes great-amen-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.great-amen-open-pulse,
#library-modal #library-detail .lib-line-actions.great-amen-open-pulse,
#library-modal #library-detail > p.great-amen-open-pulse,
#library-modal #library-related.great-amen-open-pulse,
#library-modal .lib-related.great-amen-open-pulse,
#library-modal .lib-related-btn.great-amen-open-pulse,
#library-modal .lib-group-chip.great-amen-open-pulse {
  animation: great-amen-open-pulse 0.65s ease;
}
#library-modal #library-line-back.great-amen-open-pulse-static,
#library-modal #library-detail .lib-line-actions.great-amen-open-pulse-static,
#library-modal #library-detail > p.great-amen-open-pulse-static,
#library-modal #library-related.great-amen-open-pulse-static,
#library-modal .lib-related.great-amen-open-pulse-static,
#library-modal .lib-related-btn.great-amen-open-pulse-static,
#library-modal .lib-group-chip.great-amen-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="greatAmen"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="greatAmen"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="greatAmen"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.great-amen-open-pulse,
  #library-modal #library-detail .lib-line-actions.great-amen-open-pulse,
  #library-modal #library-detail > p.great-amen-open-pulse,
  #library-modal #library-related.great-amen-open-pulse,
  #library-modal .lib-related.great-amen-open-pulse,
  #library-modal .lib-related-btn.great-amen-open-pulse,
  #library-modal .lib-group-chip.great-amen-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #326 — Soft tip «Amen lớn» · CTA ≥48 · VI học Amen lớn sau doxology cuối KNTT · phân biệt eucharisticIntercession/#324 · memorialAcclamation/#322 · anamnesis/#320 · wordsOfInstitution/#318 · liturgyOfTheEucharist/#268 · mass/#262 · yield eucharisticIntercession/#324… · 0 claim app=truyền phép/Thánh Lễ/chứa Real Presence/nâng cao Mình Thánh/thay Thánh Lễ giáo xứ · 0 invent lời/giai điệu · no QR/Xu · no sexy/Elara ===== */
#toast.toast-great-amen-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-great-amen-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-great-amen-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-great-amen-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #327 — signOfPeace / Chúc bình an open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / trao bình an có hiệu lực phụng vụ / thay Thánh Lễ giáo xứ / Rước lễ · 0 invent công thức chúc bình an/Ordo · phân biệt greatAmen/#325+#326 · eucharisticIntercession/#323+#324 · memorialAcclamation/#321+#322 · holyCommunion/#259+#260 · agnusDei · ourFather · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · fraction ===== */
@keyframes sign-of-peace-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.sign-of-peace-open-pulse,
#library-modal #library-detail .lib-line-actions.sign-of-peace-open-pulse,
#library-modal #library-detail > p.sign-of-peace-open-pulse,
#library-modal #library-related.sign-of-peace-open-pulse,
#library-modal .lib-related.sign-of-peace-open-pulse,
#library-modal .lib-related-btn.sign-of-peace-open-pulse,
#library-modal .lib-group-chip.sign-of-peace-open-pulse {
  animation: sign-of-peace-open-pulse 0.65s ease;
}
#library-modal #library-line-back.sign-of-peace-open-pulse-static,
#library-modal #library-detail .lib-line-actions.sign-of-peace-open-pulse-static,
#library-modal #library-detail > p.sign-of-peace-open-pulse-static,
#library-modal #library-related.sign-of-peace-open-pulse-static,
#library-modal .lib-related.sign-of-peace-open-pulse-static,
#library-modal .lib-related-btn.sign-of-peace-open-pulse-static,
#library-modal .lib-group-chip.sign-of-peace-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="signOfPeace"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="signOfPeace"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="signOfPeace"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.sign-of-peace-open-pulse,
  #library-modal #library-detail .lib-line-actions.sign-of-peace-open-pulse,
  #library-modal #library-detail > p.sign-of-peace-open-pulse,
  #library-modal #library-related.sign-of-peace-open-pulse,
  #library-modal .lib-related.sign-of-peace-open-pulse,
  #library-modal .lib-related-btn.sign-of-peace-open-pulse,
  #library-modal .lib-group-chip.sign-of-peace-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #328 — Soft tip «Chúc bình an» · CTA ≥48 · VI học Chúc bình an thuộc nghi thức Hiệp lễ · phân biệt greatAmen/#326 · eucharisticIntercession/#324 · memorialAcclamation/#322 · holyCommunion/#260 · agnusDei · ourFather · liturgyOfTheEucharist/#268 · mass/#262 · fraction · yield greatAmen/#326… · 0 claim app=Thánh Lễ/trao bình an phụng vụ/thay Thánh Lễ giáo xứ/Rước lễ · 0 invent công thức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-sign-of-peace-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sign-of-peace-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sign-of-peace-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sign-of-peace-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #329 — fraction / Bẻ bánh open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = bẻ bánh / phân phát Mình Thánh / Thánh Lễ / thay Thánh Lễ giáo xứ · 0 invent lời/Ordo · phân biệt signOfPeace/#327+#328 · greatAmen/#325+#326 · agnusDei · holyCommunion/#259+#260 · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · ourFather ===== */
@keyframes fraction-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.fraction-open-pulse,
#library-modal #library-detail .lib-line-actions.fraction-open-pulse,
#library-modal #library-detail > p.fraction-open-pulse,
#library-modal #library-related.fraction-open-pulse,
#library-modal .lib-related.fraction-open-pulse,
#library-modal .lib-related-btn.fraction-open-pulse,
#library-modal .lib-group-chip.fraction-open-pulse {
  animation: fraction-open-pulse 0.65s ease;
}
#library-modal #library-line-back.fraction-open-pulse-static,
#library-modal #library-detail .lib-line-actions.fraction-open-pulse-static,
#library-modal #library-detail > p.fraction-open-pulse-static,
#library-modal #library-related.fraction-open-pulse-static,
#library-modal .lib-related.fraction-open-pulse-static,
#library-modal .lib-related-btn.fraction-open-pulse-static,
#library-modal .lib-group-chip.fraction-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="fraction"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="fraction"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="fraction"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.fraction-open-pulse,
  #library-modal #library-detail .lib-line-actions.fraction-open-pulse,
  #library-modal #library-detail > p.fraction-open-pulse,
  #library-modal #library-related.fraction-open-pulse,
  #library-modal .lib-related.fraction-open-pulse,
  #library-modal .lib-related-btn.fraction-open-pulse,
  #library-modal .lib-group-chip.fraction-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #330 — Soft tip «Bẻ bánh» · CTA ≥48 · VI học Bẻ bánh thuộc nghi thức Hiệp lễ · phân biệt signOfPeace/#328 · greatAmen/#326 · agnusDei · holyCommunion/#260 · liturgyOfTheEucharist/#268 · mass/#262 · ourFather · yield signOfPeace/#328… · 0 claim app=bẻ bánh/phân phát Mình Thánh/Thánh Lễ/thay Thánh Lễ giáo xứ · 0 invent lời · no QR/Xu · no sexy/Elara ===== */
#toast.toast-fraction-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-fraction-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-fraction-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-fraction-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #331 — agnusDei / Lạy Chiên Thiên Chúa open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / phân phát Mình Thánh / thay Thánh Lễ giáo xứ / Rước lễ thật · 0 invent lời Agnus Dei/Ordo · phân biệt fraction/#329+#330 · signOfPeace/#327+#328 · holyCommunion/#259+#260 · ourFather · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 · greatAmen/#325+#326 ===== */
@keyframes agnus-dei-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.agnus-dei-open-pulse,
#library-modal #library-detail .lib-line-actions.agnus-dei-open-pulse,
#library-modal #library-detail > p.agnus-dei-open-pulse,
#library-modal #library-related.agnus-dei-open-pulse,
#library-modal .lib-related.agnus-dei-open-pulse,
#library-modal .lib-related-btn.agnus-dei-open-pulse,
#library-modal .lib-group-chip.agnus-dei-open-pulse {
  animation: agnus-dei-open-pulse 0.65s ease;
}
#library-modal #library-line-back.agnus-dei-open-pulse-static,
#library-modal #library-detail .lib-line-actions.agnus-dei-open-pulse-static,
#library-modal #library-detail > p.agnus-dei-open-pulse-static,
#library-modal #library-related.agnus-dei-open-pulse-static,
#library-modal .lib-related.agnus-dei-open-pulse-static,
#library-modal .lib-related-btn.agnus-dei-open-pulse-static,
#library-modal .lib-group-chip.agnus-dei-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="agnusDei"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="agnusDei"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="agnusDei"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.agnus-dei-open-pulse,
  #library-modal #library-detail .lib-line-actions.agnus-dei-open-pulse,
  #library-modal #library-detail > p.agnus-dei-open-pulse,
  #library-modal #library-related.agnus-dei-open-pulse,
  #library-modal .lib-related.agnus-dei-open-pulse,
  #library-modal .lib-related-btn.agnus-dei-open-pulse,
  #library-modal .lib-group-chip.agnus-dei-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #332 — Soft tip «Lạy Chiên Thiên Chúa» · CTA ≥48 · VI học Agnus Dei thuộc nghi thức Hiệp lễ · phân biệt fraction/#330 · signOfPeace/#328 · holyCommunion/#260 · ourFather · liturgyOfTheEucharist/#268 · mass/#262 · greatAmen/#326 · yield fraction/#330… · 0 claim app=Thánh Lễ/phân phát Mình Thánh/thay Thánh Lễ giáo xứ/Rước lễ thật · 0 invent lời · no QR/Xu · no sexy/Elara ===== */
#toast.toast-agnus-dei-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-agnus-dei-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-agnus-dei-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-agnus-dei-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #333 — prayerAfterCommunion / Lời nguyện hiệp lễ open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = Thánh Lễ / Rước lễ thật / thay Thánh Lễ giáo xứ · 0 invent lời nguyện hiệp lễ/Ordo/ngày · phân biệt agnusDei/#331+#332 · fraction/#329+#330 · holyCommunion/#259+#260 · signOfPeace/#327+#328 · sacredSilence · finalBlessing · liturgyOfTheEucharist/#267+#268 · mass/#261+#262 ===== */
@keyframes prayer-after-communion-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.prayer-after-communion-open-pulse,
#library-modal #library-detail .lib-line-actions.prayer-after-communion-open-pulse,
#library-modal #library-detail > p.prayer-after-communion-open-pulse,
#library-modal #library-related.prayer-after-communion-open-pulse,
#library-modal .lib-related.prayer-after-communion-open-pulse,
#library-modal .lib-related-btn.prayer-after-communion-open-pulse,
#library-modal .lib-group-chip.prayer-after-communion-open-pulse {
  animation: prayer-after-communion-open-pulse 0.65s ease;
}
#library-modal #library-line-back.prayer-after-communion-open-pulse-static,
#library-modal #library-detail .lib-line-actions.prayer-after-communion-open-pulse-static,
#library-modal #library-detail > p.prayer-after-communion-open-pulse-static,
#library-modal #library-related.prayer-after-communion-open-pulse-static,
#library-modal .lib-related.prayer-after-communion-open-pulse-static,
#library-modal .lib-related-btn.prayer-after-communion-open-pulse-static,
#library-modal .lib-group-chip.prayer-after-communion-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="prayerAfterCommunion"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="prayerAfterCommunion"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="prayerAfterCommunion"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.prayer-after-communion-open-pulse,
  #library-modal #library-detail .lib-line-actions.prayer-after-communion-open-pulse,
  #library-modal #library-detail > p.prayer-after-communion-open-pulse,
  #library-modal #library-related.prayer-after-communion-open-pulse,
  #library-modal .lib-related.prayer-after-communion-open-pulse,
  #library-modal .lib-related-btn.prayer-after-communion-open-pulse,
  #library-modal .lib-group-chip.prayer-after-communion-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #334 — Soft tip «Lời nguyện hiệp lễ» · CTA ≥48 · VI học Lời nguyện sau Hiệp lễ kết thúc phần hiệp thông · phân biệt agnusDei/#332 · fraction/#330 · holyCommunion/#260 · signOfPeace/#328 · sacredSilence · finalBlessing · liturgyOfTheEucharist/#268 · mass/#262 · yield agnusDei/#332… · 0 claim app=Thánh Lễ/Rước lễ thật/thay Thánh Lễ giáo xứ · 0 invent lời ngày/Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-prayer-after-communion-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-prayer-after-communion-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-prayer-after-communion-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-prayer-after-communion-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #335 — sacredSilence / Thinh lặng thánh open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = thinh lặng phụng vụ / Thánh Lễ / thay giáo xứ · 0 invent luật đo giây / điểm thinh lặng / Ordo · phân biệt prayerAfterCommunion/#333+#334 · holyCommunion/#259+#260 · agnusDei/#331+#332 · finalBlessing · formsOfPrayer · liturgyOfTheWord/#265+#266 · mass/#261+#262 · sit/#229+#230 ===== */
@keyframes sacred-silence-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.sacred-silence-open-pulse,
#library-modal #library-detail .lib-line-actions.sacred-silence-open-pulse,
#library-modal #library-detail > p.sacred-silence-open-pulse,
#library-modal #library-related.sacred-silence-open-pulse,
#library-modal .lib-related.sacred-silence-open-pulse,
#library-modal .lib-related-btn.sacred-silence-open-pulse,
#library-modal .lib-group-chip.sacred-silence-open-pulse {
  animation: sacred-silence-open-pulse 0.65s ease;
}
#library-modal #library-line-back.sacred-silence-open-pulse-static,
#library-modal #library-detail .lib-line-actions.sacred-silence-open-pulse-static,
#library-modal #library-detail > p.sacred-silence-open-pulse-static,
#library-modal #library-related.sacred-silence-open-pulse-static,
#library-modal .lib-related.sacred-silence-open-pulse-static,
#library-modal .lib-related-btn.sacred-silence-open-pulse-static,
#library-modal .lib-group-chip.sacred-silence-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="sacredSilence"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="sacredSilence"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="sacredSilence"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.sacred-silence-open-pulse,
  #library-modal #library-detail .lib-line-actions.sacred-silence-open-pulse,
  #library-modal #library-detail > p.sacred-silence-open-pulse,
  #library-modal #library-related.sacred-silence-open-pulse,
  #library-modal .lib-related.sacred-silence-open-pulse,
  #library-modal .lib-related-btn.sacred-silence-open-pulse,
  #library-modal .lib-group-chip.sacred-silence-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #336 — Soft tip «Thinh lặng thánh» · CTA ≥48 · VI học thinh lặng sau Lời/bài giảng/Hiệp lễ · phân biệt prayerAfterCommunion/#334 · holyCommunion/#260 · agnusDei/#332 · finalBlessing · formsOfPrayer · liturgyOfTheWord/#266 · mass/#262 · sit/#230 · yield prayerAfterCommunion/#334… · 0 claim app=thinh lặng phụng vụ/Thánh Lễ/thay giáo xứ · 0 invent luật đo giây/điểm thinh lặng/Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-sacred-silence-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sacred-silence-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sacred-silence-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sacred-silence-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #337 — finalBlessing / Chúc lành cuối lễ open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = phép lành linh mục / Thánh Lễ / buff / thay giáo xứ · 0 invent công thức chúc lành / Ordo · phân biệt sacredSilence/#335+#336 · prayerAfterCommunion/#333+#334 · iteMissaEst · holyCommunion/#259+#260 · mass/#261+#262 · trinity · liturgyOfTheEucharist/#267+#268 ===== */
@keyframes final-blessing-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.final-blessing-open-pulse,
#library-modal #library-detail .lib-line-actions.final-blessing-open-pulse,
#library-modal #library-detail > p.final-blessing-open-pulse,
#library-modal #library-related.final-blessing-open-pulse,
#library-modal .lib-related.final-blessing-open-pulse,
#library-modal .lib-related-btn.final-blessing-open-pulse,
#library-modal .lib-group-chip.final-blessing-open-pulse {
  animation: final-blessing-open-pulse 0.65s ease;
}
#library-modal #library-line-back.final-blessing-open-pulse-static,
#library-modal #library-detail .lib-line-actions.final-blessing-open-pulse-static,
#library-modal #library-detail > p.final-blessing-open-pulse-static,
#library-modal #library-related.final-blessing-open-pulse-static,
#library-modal .lib-related.final-blessing-open-pulse-static,
#library-modal .lib-related-btn.final-blessing-open-pulse-static,
#library-modal .lib-group-chip.final-blessing-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="finalBlessing"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="finalBlessing"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="finalBlessing"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.final-blessing-open-pulse,
  #library-modal #library-detail .lib-line-actions.final-blessing-open-pulse,
  #library-modal #library-detail > p.final-blessing-open-pulse,
  #library-modal #library-related.final-blessing-open-pulse,
  #library-modal .lib-related.final-blessing-open-pulse,
  #library-modal .lib-related-btn.final-blessing-open-pulse,
  #library-modal .lib-group-chip.final-blessing-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #338 — Soft tip «Chúc lành cuối lễ» · CTA ≥48 · VI học chúc lành cuối lễ thuộc nghi thức kết thúc · phân biệt sacredSilence/#336 · prayerAfterCommunion/#334 · iteMissaEst · holyCommunion/#260 · mass/#262 · trinity · liturgyOfTheEucharist/#268 · yield sacredSilence/#336… · 0 claim app=phép lành linh mục/Thánh Lễ/buff/thay giáo xứ · 0 invent công thức chúc lành/Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-final-blessing-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-final-blessing-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-final-blessing-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-final-blessing-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #339 — iteMissaEst / Lễ xong — sai đi open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = phép lành linh mục / giả giải tán lễ / Thánh Lễ / thay giáo xứ / nút Ite có hiệu lực · 0 invent công thức giải tán / Ordo · phân biệt finalBlessing/#337+#338 · sacredSilence/#335+#336 · prayerAfterCommunion/#333+#334 · mass/#261+#262 · vocation · worksOfMercy · sunday · liturgyOfTheEucharist/#267+#268 ===== */
@keyframes ite-missa-est-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.ite-missa-est-open-pulse,
#library-modal #library-detail .lib-line-actions.ite-missa-est-open-pulse,
#library-modal #library-detail > p.ite-missa-est-open-pulse,
#library-modal #library-related.ite-missa-est-open-pulse,
#library-modal .lib-related.ite-missa-est-open-pulse,
#library-modal .lib-related-btn.ite-missa-est-open-pulse,
#library-modal .lib-group-chip.ite-missa-est-open-pulse {
  animation: ite-missa-est-open-pulse 0.65s ease;
}
#library-modal #library-line-back.ite-missa-est-open-pulse-static,
#library-modal #library-detail .lib-line-actions.ite-missa-est-open-pulse-static,
#library-modal #library-detail > p.ite-missa-est-open-pulse-static,
#library-modal #library-related.ite-missa-est-open-pulse-static,
#library-modal .lib-related.ite-missa-est-open-pulse-static,
#library-modal .lib-related-btn.ite-missa-est-open-pulse-static,
#library-modal .lib-group-chip.ite-missa-est-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="iteMissaEst"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="iteMissaEst"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="iteMissaEst"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.ite-missa-est-open-pulse,
  #library-modal #library-detail .lib-line-actions.ite-missa-est-open-pulse,
  #library-modal #library-detail > p.ite-missa-est-open-pulse,
  #library-modal #library-related.ite-missa-est-open-pulse,
  #library-modal .lib-related.ite-missa-est-open-pulse,
  #library-modal .lib-related-btn.ite-missa-est-open-pulse,
  #library-modal .lib-group-chip.ite-missa-est-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #340 — Soft tip «Lễ xong — sai đi» · CTA ≥48 · VI học Ite, missa est / Lễ xong — sai đi mang Chúa Kitô vào đời · phân biệt finalBlessing/#338 · sacredSilence/#336 · prayerAfterCommunion/#334 · mass/#262 · vocation · worksOfMercy · sunday · liturgyOfTheEucharist/#268 · yield finalBlessing/#338… · 0 claim app=phép lành linh mục/giả giải tán lễ/Thánh Lễ/thay giáo xứ/nút Ite có hiệu lực · 0 invent công thức giải tán/Ordo · no QR/Xu · no sexy/Elara ===== */
#toast.toast-ite-missa-est-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-ite-missa-est-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-ite-missa-est-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-ite-missa-est-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #341 — trinity / Ba Ngôi open feel · soft pulse sticky Về kho / related ≥48 · existing doctrine · reduced-motion · 0 claim app = tuyên xưng phụng vụ / thay giáo xứ / thay Thánh Lễ · 0 invent công thức Tin Kính · phân biệt creed/#305+#306 · gloria/#295+#296 · mass/#261+#262 · holySpirit · jesus · incarnation · finalBlessing/#337+#338 · signOfCross ===== */
@keyframes trinity-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.trinity-open-pulse,
#library-modal #library-detail .lib-line-actions.trinity-open-pulse,
#library-modal #library-detail > p.trinity-open-pulse,
#library-modal #library-related.trinity-open-pulse,
#library-modal .lib-related.trinity-open-pulse,
#library-modal .lib-related-btn.trinity-open-pulse,
#library-modal .lib-group-chip.trinity-open-pulse {
  animation: trinity-open-pulse 0.65s ease;
}
#library-modal #library-line-back.trinity-open-pulse-static,
#library-modal #library-detail .lib-line-actions.trinity-open-pulse-static,
#library-modal #library-detail > p.trinity-open-pulse-static,
#library-modal #library-related.trinity-open-pulse-static,
#library-modal .lib-related.trinity-open-pulse-static,
#library-modal .lib-related-btn.trinity-open-pulse-static,
#library-modal .lib-group-chip.trinity-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="trinity"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="trinity"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="trinity"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.trinity-open-pulse,
  #library-modal #library-detail .lib-line-actions.trinity-open-pulse,
  #library-modal #library-detail > p.trinity-open-pulse,
  #library-modal #library-related.trinity-open-pulse,
  #library-modal .lib-related.trinity-open-pulse,
  #library-modal .lib-related-btn.trinity-open-pulse,
  #library-modal .lib-group-chip.trinity-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #342 — Soft tip «Ba Ngôi» · CTA ≥48 · VI học mầu nhiệm Ba Ngôi Một Chúa — Cha · Con · Thánh Thần · phân biệt creed/#306 · gloria/#296 · mass/#262 · holySpirit · jesus · incarnation · finalBlessing/#338 · signOfCross · yield iteMissaEst/#340… · 0 claim app=tuyên xưng phụng vụ/thay giáo xứ/thay Thánh Lễ · 0 invent công thức Tin Kính · no QR/Xu · no sexy/Elara ===== */
#toast.toast-trinity-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-trinity-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-trinity-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-trinity-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #343 — jesus / Chúa Giêsu Kitô open feel · soft calm pulse sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · 0 invent christology · 0 claim app=nhân vật game thay Chúa/Thánh Lễ/Real Presence · phân biệt trinity/#341+#342 · incarnation · paschalMystery · eucharist/#263+#264 · realPresence/#257+#258 · mass/#261+#262 · creed/#305+#306 · crucifix/#241+#242 ===== */
@keyframes jesus-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.jesus-open-pulse,
#library-modal #library-detail .lib-line-actions.jesus-open-pulse,
#library-modal #library-detail > p.jesus-open-pulse,
#library-modal #library-related.jesus-open-pulse,
#library-modal .lib-related.jesus-open-pulse,
#library-modal .lib-related-btn.jesus-open-pulse,
#library-modal .lib-group-chip.jesus-open-pulse {
  animation: jesus-open-pulse 0.65s ease;
}
#library-modal #library-line-back.jesus-open-pulse-static,
#library-modal #library-detail .lib-line-actions.jesus-open-pulse-static,
#library-modal #library-detail > p.jesus-open-pulse-static,
#library-modal #library-related.jesus-open-pulse-static,
#library-modal .lib-related.jesus-open-pulse-static,
#library-modal .lib-related-btn.jesus-open-pulse-static,
#library-modal .lib-group-chip.jesus-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="jesus"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="jesus"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="jesus"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.jesus-open-pulse,
  #library-modal #library-detail .lib-line-actions.jesus-open-pulse,
  #library-modal #library-detail > p.jesus-open-pulse,
  #library-modal #library-related.jesus-open-pulse,
  #library-modal .lib-related.jesus-open-pulse,
  #library-modal .lib-related-btn.jesus-open-pulse,
  #library-modal .lib-group-chip.jesus-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #344 — Soft tip «Chúa Giêsu Kitô» · CTA ≥48 · VI Giêsu=Thiên Chúa cứu · Kitô=Đấng được xức dầu — Con Một thật Thiên Chúa và thật người · phân biệt trinity/#342 · incarnation · paschalMystery · eucharist/#264 · realPresence/#258 · mass/#262 · creed/#306 · crucifix/#242 · yield trinity/#342… · 0 claim app=Thánh Lễ/Real Presence/nhân vật game thay Chúa/thay tuyên xưng · 0 invent christology · no QR/Xu · no sexy/Elara ===== */
#toast.toast-jesus-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-jesus-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-jesus-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-jesus-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #345 — incarnation / Nhập thể open feel · soft calm pulse sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · 0 invent công thức · 0 claim app=Thánh Lễ/thay giáo xứ/thần thoại game · phân biệt jesus/#343+#344 · trinity/#341+#342 · annunciation · mary · paschalMystery · creed/#305+#306 · mass/#261+#262 ===== */
@keyframes incarnation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.incarnation-open-pulse,
#library-modal #library-detail .lib-line-actions.incarnation-open-pulse,
#library-modal #library-detail > p.incarnation-open-pulse,
#library-modal #library-related.incarnation-open-pulse,
#library-modal .lib-related.incarnation-open-pulse,
#library-modal .lib-related-btn.incarnation-open-pulse,
#library-modal .lib-group-chip.incarnation-open-pulse {
  animation: incarnation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.incarnation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.incarnation-open-pulse-static,
#library-modal #library-detail > p.incarnation-open-pulse-static,
#library-modal #library-related.incarnation-open-pulse-static,
#library-modal .lib-related.incarnation-open-pulse-static,
#library-modal .lib-related-btn.incarnation-open-pulse-static,
#library-modal .lib-group-chip.incarnation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="incarnation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="incarnation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="incarnation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.incarnation-open-pulse,
  #library-modal #library-detail .lib-line-actions.incarnation-open-pulse,
  #library-modal #library-detail > p.incarnation-open-pulse,
  #library-modal #library-related.incarnation-open-pulse,
  #library-modal .lib-related.incarnation-open-pulse,
  #library-modal .lib-related-btn.incarnation-open-pulse,
  #library-modal .lib-group-chip.incarnation-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #346 — Soft tip «Nhập thể» · CTA ≥48 · VI Nhập thể — Ngôi Lời mặc lấy bản tính nhân loại trong lòng Đức Maria bởi phép Chúa Thánh Thần · phân biệt jesus/#344 · trinity/#342 · annunciation · mary · paschalMystery · creed/#306 · mass/#262 · yield jesus/#344… · 0 claim app=Thánh Lễ/thay tuyên xưng giáo xứ · 0 invent công thức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-incarnation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-incarnation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-incarnation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-incarnation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #347 — paschalMystery / Mầu nhiệm Vượt Qua open feel · soft calm pulse sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · 0 invent Passion/Resurrection formulas · 0 claim app=Thánh Lễ/truyền phép/Real Presence/thay giáo xứ · phân biệt incarnation/#345+#346 · jesus/#343+#344 · eucharist/#263+#264 · mass/#261+#262 · stations · easter · holyWeek · anamnesis/#319+#320 · memorialAcclamation/#321+#322 · crucifix/#241+#242 ===== */
@keyframes paschal-mystery-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.paschal-mystery-open-pulse,
#library-modal #library-detail .lib-line-actions.paschal-mystery-open-pulse,
#library-modal #library-detail > p.paschal-mystery-open-pulse,
#library-modal #library-related.paschal-mystery-open-pulse,
#library-modal .lib-related.paschal-mystery-open-pulse,
#library-modal .lib-related-btn.paschal-mystery-open-pulse,
#library-modal .lib-group-chip.paschal-mystery-open-pulse {
  animation: paschal-mystery-open-pulse 0.65s ease;
}
#library-modal #library-line-back.paschal-mystery-open-pulse-static,
#library-modal #library-detail .lib-line-actions.paschal-mystery-open-pulse-static,
#library-modal #library-detail > p.paschal-mystery-open-pulse-static,
#library-modal #library-related.paschal-mystery-open-pulse-static,
#library-modal .lib-related.paschal-mystery-open-pulse-static,
#library-modal .lib-related-btn.paschal-mystery-open-pulse-static,
#library-modal .lib-group-chip.paschal-mystery-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="paschalMystery"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="paschalMystery"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="paschalMystery"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.paschal-mystery-open-pulse,
  #library-modal #library-detail .lib-line-actions.paschal-mystery-open-pulse,
  #library-modal #library-detail > p.paschal-mystery-open-pulse,
  #library-modal #library-related.paschal-mystery-open-pulse,
  #library-modal .lib-related.paschal-mystery-open-pulse,
  #library-modal .lib-related-btn.paschal-mystery-open-pulse,
  #library-modal .lib-group-chip.paschal-mystery-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #348 — Soft tip «Mầu nhiệm Vượt Qua» · CTA ≥48 · VI Khổ nạn · chết · Phục sinh · Lên trời — trung tâm đức tin và mỗi Thánh Lễ · phân biệt incarnation/#346 · jesus/#344 · eucharist/#264 · mass/#262 · stations · easter · holyWeek · anamnesis/#320 · memorialAcclamation/#322 · crucifix/#242 · yield incarnation/#346… · 0 claim app=Thánh Lễ/truyền phép/Real Presence/thay giáo xứ · 0 invent công thức · no QR/Xu · no sexy/Elara ===== */
#toast.toast-paschal-mystery-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-paschal-mystery-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-paschal-mystery-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-paschal-mystery-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #349 — holySpirit / Chúa Thánh Thần open feel · soft calm pulse sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · 0 invent pneumatology formulas · 0 claim app=Thánh Lễ/thay giáo xứ/phong trào giả · phân biệt trinity/#341+#342 · jesus/#343+#344 · incarnation/#345+#346 · paschalMystery/#347+#348 · confirmation · gifts · fruits · pentecost · creed/#305+#306 · mass/#261+#262 ===== */
@keyframes holy-spirit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.holy-spirit-open-pulse,
#library-modal #library-detail .lib-line-actions.holy-spirit-open-pulse,
#library-modal #library-detail > p.holy-spirit-open-pulse,
#library-modal #library-related.holy-spirit-open-pulse,
#library-modal .lib-related.holy-spirit-open-pulse,
#library-modal .lib-related-btn.holy-spirit-open-pulse,
#library-modal .lib-group-chip.holy-spirit-open-pulse {
  animation: holy-spirit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.holy-spirit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.holy-spirit-open-pulse-static,
#library-modal #library-detail > p.holy-spirit-open-pulse-static,
#library-modal #library-related.holy-spirit-open-pulse-static,
#library-modal .lib-related.holy-spirit-open-pulse-static,
#library-modal .lib-related-btn.holy-spirit-open-pulse-static,
#library-modal .lib-group-chip.holy-spirit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="holySpirit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="holySpirit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="holySpirit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.holy-spirit-open-pulse,
  #library-modal #library-detail .lib-line-actions.holy-spirit-open-pulse,
  #library-modal #library-detail > p.holy-spirit-open-pulse,
  #library-modal #library-related.holy-spirit-open-pulse,
  #library-modal .lib-related.holy-spirit-open-pulse,
  #library-modal .lib-related-btn.holy-spirit-open-pulse,
  #library-modal .lib-group-chip.holy-spirit-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #350 — Soft tip «Chúa Thánh Thần» · CTA ≥48 · VI Thánh Thần = Ngôi Ba, ban sự sống / ơn / hoa trái — học khung trên thẻ · phân biệt trinity/#342 · jesus/#344 · incarnation/#346 · paschalMystery/#348 · confirmation · gifts · fruits · pentecost · creed/#306 · mass/#262 · yield paschalMystery/#348… · 0 claim app=Thánh Lễ/thay giáo xứ/phong trào giả · 0 invent pneumatology · no QR/Xu · no sexy/Elara ===== */
#toast.toast-holy-spirit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-holy-spirit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-holy-spirit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-holy-spirit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #351 — mary / Đức Maria open feel · sticky Về kho/related/title/chip Đức Maria ≥48 · reduced-motion · empty honesty · 0 invent Marian dogma · 0 claim app=phụng vụ/thay giáo xứ · phân biệt holySpirit/#349+#350 · jesus/#343+#344 · incarnation/#345+#346 · annunciation · immaculateConception · assumption · queenship · rosary · creed · mass ===== */
@keyframes mary-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.mary-open-pulse,
#library-modal #library-detail .lib-line-actions.mary-open-pulse,
#library-modal #library-detail > p.mary-open-pulse,
#library-modal #library-related.mary-open-pulse,
#library-modal .lib-related.mary-open-pulse,
#library-modal .lib-related-btn.mary-open-pulse,
#library-modal .lib-group-chip.mary-open-pulse {
  animation: mary-open-pulse 0.65s ease;
}
#library-modal #library-line-back.mary-open-pulse-static,
#library-modal #library-detail .lib-line-actions.mary-open-pulse-static,
#library-modal #library-detail > p.mary-open-pulse-static,
#library-modal #library-related.mary-open-pulse-static,
#library-modal .lib-related.mary-open-pulse-static,
#library-modal .lib-related-btn.mary-open-pulse-static,
#library-modal .lib-group-chip.mary-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="mary"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="mary"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="mary"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.mary-open-pulse,
  #library-modal #library-detail .lib-line-actions.mary-open-pulse,
  #library-modal #library-detail > p.mary-open-pulse,
  #library-modal #library-related.mary-open-pulse,
  #library-modal .lib-related.mary-open-pulse,
  #library-modal .lib-related-btn.mary-open-pulse,
  #library-modal .lib-group-chip.mary-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #352 — Soft tip «Đức Maria» · CTA ≥48 · VI Mẹ Chúa Giêsu, mô phạm đức tin — học khung trên thẻ · phân biệt holySpirit/#350 · jesus/#344 · incarnation/#346 · annunciation · immaculateConception · assumption · queenship · rosary · creed · mass · yield holySpirit/#350 · paschalMystery/#348… · 0 claim app=phụng vụ/thay giáo xứ · 0 invent Marian dogma · no QR/Xu · no sexy/Elara ===== */
#toast.toast-mary-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-mary-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-mary-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-mary-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #353 — church / Hội Thánh open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent ecclesiology · 0 claim app=giáo xứ/thay Hội Thánh · phân biệt mary/#351+#352 · holySpirit/#349+#350 · localChurch · churchAsBodyOfChrist · communionOfSaints · creed · mass · baptism ===== */
@keyframes church-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.church-open-pulse,
#library-modal #library-detail .lib-line-actions.church-open-pulse,
#library-modal #library-detail > p.church-open-pulse,
#library-modal #library-related.church-open-pulse,
#library-modal .lib-related.church-open-pulse,
#library-modal .lib-related-btn.church-open-pulse,
#library-modal .lib-group-chip.church-open-pulse {
  animation: church-open-pulse 0.65s ease;
}
#library-modal #library-line-back.church-open-pulse-static,
#library-modal #library-detail .lib-line-actions.church-open-pulse-static,
#library-modal #library-detail > p.church-open-pulse-static,
#library-modal #library-related.church-open-pulse-static,
#library-modal .lib-related.church-open-pulse-static,
#library-modal .lib-related-btn.church-open-pulse-static,
#library-modal .lib-group-chip.church-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="church"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="church"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="church"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.church-open-pulse,
  #library-modal #library-detail .lib-line-actions.church-open-pulse,
  #library-modal #library-detail > p.church-open-pulse,
  #library-modal #library-related.church-open-pulse,
  #library-modal .lib-related.church-open-pulse,
  #library-modal .lib-related-btn.church-open-pulse,
  #library-modal .lib-group-chip.church-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #354 — Soft tip «Hội Thánh» · CTA ≥48 · VI duy nhất·thánh thiện·công giáo·tông truyền — học khung trên thẻ · phân biệt mary/#352 · holySpirit/#350 · localChurch · churchAsBodyOfChrist · communionOfSaints · creed · mass · baptism · yield mary/#352 · holySpirit/#350 · paschalMystery/#348… · 0 claim app=giáo xứ/thay Hội Thánh · 0 invent ecclesiology · no QR/Xu · no sexy/Elara ===== */
#toast.toast-church-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-church-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-church-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-church-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #355 — localChurch / Giáo xứ · Hội Thánh địa phương open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent ecclesiology · 0 claim app=giáo xứ thật/thay giáo xứ · phân biệt church/#353+#354 · churchAsBodyOfChrist · communionOfSaints · parish nudge/#192 · baptism · mass · creed · mary/#351+#352 ===== */
@keyframes local-church-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.local-church-open-pulse,
#library-modal #library-detail .lib-line-actions.local-church-open-pulse,
#library-modal #library-detail > p.local-church-open-pulse,
#library-modal #library-related.local-church-open-pulse,
#library-modal .lib-related.local-church-open-pulse,
#library-modal .lib-related-btn.local-church-open-pulse,
#library-modal .lib-group-chip.local-church-open-pulse {
  animation: local-church-open-pulse 0.65s ease;
}
#library-modal #library-line-back.local-church-open-pulse-static,
#library-modal #library-detail .lib-line-actions.local-church-open-pulse-static,
#library-modal #library-detail > p.local-church-open-pulse-static,
#library-modal #library-related.local-church-open-pulse-static,
#library-modal .lib-related.local-church-open-pulse-static,
#library-modal .lib-related-btn.local-church-open-pulse-static,
#library-modal .lib-group-chip.local-church-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="localChurch"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="localChurch"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="localChurch"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.local-church-open-pulse,
  #library-modal #library-detail .lib-line-actions.local-church-open-pulse,
  #library-modal #library-detail > p.local-church-open-pulse,
  #library-modal #library-related.local-church-open-pulse,
  #library-modal .lib-related.local-church-open-pulse,
  #library-modal .lib-related-btn.local-church-open-pulse,
  #library-modal .lib-group-chip.local-church-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #356 — Soft tip «Giáo xứ» / «Hội Thánh địa phương» · CTA ≥48 · VI giáo xứ = Hội Thánh Chúa Kitô tại địa phương — học khung trên thẻ · phân biệt church/#354 · churchAsBodyOfChrist · communionOfSaints · parish/#192 · baptism · mass · creed · mary/#352 · yield church/#354 · mary/#352 · holySpirit/#350 · paschalMystery/#348… · 0 claim app=giáo xứ thật/thay giáo xứ · 0 invent ecclesiology · no QR/Xu · no sexy/Elara ===== */
#toast.toast-local-church-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-local-church-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-local-church-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-local-church-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #357 — communionOfSaints / Các Thánh thông công open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=các thánh/thay phụng vụ · phân biệt localChurch/#355+#356 · church/#353+#354 · churchAsBodyOfChrist · allSaints · allSouls · creed · mass · mary/#351+#352 ===== */
@keyframes communion-of-saints-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.communion-of-saints-open-pulse,
#library-modal #library-detail .lib-line-actions.communion-of-saints-open-pulse,
#library-modal #library-detail > p.communion-of-saints-open-pulse,
#library-modal #library-related.communion-of-saints-open-pulse,
#library-modal .lib-related.communion-of-saints-open-pulse,
#library-modal .lib-related-btn.communion-of-saints-open-pulse,
#library-modal .lib-group-chip.communion-of-saints-open-pulse {
  animation: communion-of-saints-open-pulse 0.65s ease;
}
#library-modal #library-line-back.communion-of-saints-open-pulse-static,
#library-modal #library-detail .lib-line-actions.communion-of-saints-open-pulse-static,
#library-modal #library-detail > p.communion-of-saints-open-pulse-static,
#library-modal #library-related.communion-of-saints-open-pulse-static,
#library-modal .lib-related.communion-of-saints-open-pulse-static,
#library-modal .lib-related-btn.communion-of-saints-open-pulse-static,
#library-modal .lib-group-chip.communion-of-saints-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="communionOfSaints"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="communionOfSaints"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="communionOfSaints"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.communion-of-saints-open-pulse,
  #library-modal #library-detail .lib-line-actions.communion-of-saints-open-pulse,
  #library-modal #library-detail > p.communion-of-saints-open-pulse,
  #library-modal #library-related.communion-of-saints-open-pulse,
  #library-modal .lib-related.communion-of-saints-open-pulse,
  #library-modal .lib-related-btn.communion-of-saints-open-pulse,
  #library-modal .lib-group-chip.communion-of-saints-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #358 — Soft tip «Các Thánh thông công» · CTA ≥48 · VI trên trời·luyện tội·trần gian liên kết trong Chúa Kitô — học khung trên thẻ · phân biệt localChurch/#356 · church/#354 · churchAsBodyOfChrist · allSaints · allSouls · creed · mass · mary/#352 · yield localChurch/#356 · church/#354 · mary/#352 · holySpirit/#350 · paschalMystery/#348… · 0 claim app=các thánh/thay phụng vụ · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-communion-of-saints-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-communion-of-saints-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-communion-of-saints-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-communion-of-saints-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #359 — churchAsBodyOfChrist / Hội Thánh là Thân Thể Chúa Kitô open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=Thân Thể/thay Hội Thánh · 0 đồng nhất Real Presence · phân biệt communionOfSaints/#357+#358 · church/#353+#354 · localChurch/#355+#356 · eucharist · realPresence · creed · mass ===== */
@keyframes church-as-body-of-christ-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.church-as-body-of-christ-open-pulse,
#library-modal #library-detail .lib-line-actions.church-as-body-of-christ-open-pulse,
#library-modal #library-detail > p.church-as-body-of-christ-open-pulse,
#library-modal #library-related.church-as-body-of-christ-open-pulse,
#library-modal .lib-related.church-as-body-of-christ-open-pulse,
#library-modal .lib-related-btn.church-as-body-of-christ-open-pulse,
#library-modal .lib-group-chip.church-as-body-of-christ-open-pulse {
  animation: church-as-body-of-christ-open-pulse 0.65s ease;
}
#library-modal #library-line-back.church-as-body-of-christ-open-pulse-static,
#library-modal #library-detail .lib-line-actions.church-as-body-of-christ-open-pulse-static,
#library-modal #library-detail > p.church-as-body-of-christ-open-pulse-static,
#library-modal #library-related.church-as-body-of-christ-open-pulse-static,
#library-modal .lib-related.church-as-body-of-christ-open-pulse-static,
#library-modal .lib-related-btn.church-as-body-of-christ-open-pulse-static,
#library-modal .lib-group-chip.church-as-body-of-christ-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="churchAsBodyOfChrist"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="churchAsBodyOfChrist"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="churchAsBodyOfChrist"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.church-as-body-of-christ-open-pulse,
  #library-modal #library-detail .lib-line-actions.church-as-body-of-christ-open-pulse,
  #library-modal #library-detail > p.church-as-body-of-christ-open-pulse,
  #library-modal #library-related.church-as-body-of-christ-open-pulse,
  #library-modal .lib-related.church-as-body-of-christ-open-pulse,
  #library-modal .lib-related-btn.church-as-body-of-christ-open-pulse,
  #library-modal .lib-group-chip.church-as-body-of-christ-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #360 — Soft tip «Hội Thánh là Thân Thể Chúa Kitô» · CTA ≥48 · VI Thân Thể mầu nhiệm — phân biệt Mình Thánh trong Bí tích; học khung trên thẻ · phân biệt communionOfSaints/#358 · localChurch/#356 · church/#354 · eucharist · realPresence · creed · mass · mary/#352 · yield communionOfSaints/#358 · localChurch/#356 · church/#354 · mary/#352 · holySpirit/#350 · paschalMystery/#348… · 0 claim app=Thân Thể/thay Hội Thánh · 0 đồng nhất Real Presence · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-church-as-body-of-christ-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-church-as-body-of-christ-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-church-as-body-of-christ-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-church-as-body-of-christ-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #361 — resurrectionOfTheBody / Xác sống lại open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=phục sinh/thay đức tin · phân biệt churchAsBodyOfChrist/#359+#360 · communionOfSaints/#357+#358 · lastThings · heaven · emptyTomb · paschalMystery · creed · jesus ===== */
@keyframes resurrection-of-the-body-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.resurrection-of-the-body-open-pulse,
#library-modal #library-detail .lib-line-actions.resurrection-of-the-body-open-pulse,
#library-modal #library-detail > p.resurrection-of-the-body-open-pulse,
#library-modal #library-related.resurrection-of-the-body-open-pulse,
#library-modal .lib-related.resurrection-of-the-body-open-pulse,
#library-modal .lib-related-btn.resurrection-of-the-body-open-pulse,
#library-modal .lib-group-chip.resurrection-of-the-body-open-pulse {
  animation: resurrection-of-the-body-open-pulse 0.65s ease;
}
#library-modal #library-line-back.resurrection-of-the-body-open-pulse-static,
#library-modal #library-detail .lib-line-actions.resurrection-of-the-body-open-pulse-static,
#library-modal #library-detail > p.resurrection-of-the-body-open-pulse-static,
#library-modal #library-related.resurrection-of-the-body-open-pulse-static,
#library-modal .lib-related.resurrection-of-the-body-open-pulse-static,
#library-modal .lib-related-btn.resurrection-of-the-body-open-pulse-static,
#library-modal .lib-group-chip.resurrection-of-the-body-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="resurrectionOfTheBody"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="resurrectionOfTheBody"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="resurrectionOfTheBody"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.resurrection-of-the-body-open-pulse,
  #library-modal #library-detail .lib-line-actions.resurrection-of-the-body-open-pulse,
  #library-modal #library-detail > p.resurrection-of-the-body-open-pulse,
  #library-modal #library-related.resurrection-of-the-body-open-pulse,
  #library-modal .lib-related.resurrection-of-the-body-open-pulse,
  #library-modal .lib-related-btn.resurrection-of-the-body-open-pulse,
  #library-modal .lib-group-chip.resurrection-of-the-body-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #362 — Soft tip «Xác sống lại» · CTA ≥48 · VI xác sống lại — không phải đầu thai; học khung trên thẻ · phân biệt churchAsBodyOfChrist/#360 · communionOfSaints/#358 · lastThings · heaven · emptyTomb · paschalMystery · creed · jesus · yield churchAsBodyOfChrist/#360 · communionOfSaints/#358 · localChurch/#356 · church/#354 · mary/#352 · holySpirit/#350 · paschalMystery/#348… · 0 claim app=phục sinh/thay đức tin · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-resurrection-of-the-body-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-resurrection-of-the-body-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-resurrection-of-the-body-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-resurrection-of-the-body-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #363 — lastThings / Cánh chung open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=phán xét/thay đức tin · 0 clickbait sợ hãi · phân biệt resurrectionOfTheBody/#361+#362 · heaven · hope · emptyTomb · paschalMystery · creed · churchAsBodyOfChrist/#359+#360 · communionOfSaints/#357+#358 ===== */
@keyframes last-things-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.last-things-open-pulse,
#library-modal #library-detail .lib-line-actions.last-things-open-pulse,
#library-modal #library-detail > p.last-things-open-pulse,
#library-modal #library-related.last-things-open-pulse,
#library-modal .lib-related.last-things-open-pulse,
#library-modal .lib-related-btn.last-things-open-pulse,
#library-modal .lib-group-chip.last-things-open-pulse {
  animation: last-things-open-pulse 0.65s ease;
}
#library-modal #library-line-back.last-things-open-pulse-static,
#library-modal #library-detail .lib-line-actions.last-things-open-pulse-static,
#library-modal #library-detail > p.last-things-open-pulse-static,
#library-modal #library-related.last-things-open-pulse-static,
#library-modal .lib-related.last-things-open-pulse-static,
#library-modal .lib-related-btn.last-things-open-pulse-static,
#library-modal .lib-group-chip.last-things-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="lastThings"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="lastThings"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="lastThings"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.last-things-open-pulse,
  #library-modal #library-detail .lib-line-actions.last-things-open-pulse,
  #library-modal #library-detail > p.last-things-open-pulse,
  #library-modal #library-related.last-things-open-pulse,
  #library-modal .lib-related.last-things-open-pulse,
  #library-modal .lib-related-btn.last-things-open-pulse,
  #library-modal .lib-group-chip.last-things-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #364 — Soft tip «Cánh chung» · CTA ≥48 · VI các sự sau hết — chết·phán xét·thiên đàng·luyện ngục·hỏa ngục dạy với hy vọng; học khung trên thẻ · phân biệt resurrectionOfTheBody/#362 · heaven · hope · emptyTomb · paschalMystery · creed · churchAsBodyOfChrist/#360 · communionOfSaints/#358 · yield resurrectionOfTheBody/#362 · churchAsBodyOfChrist/#360… · 0 claim app=phán xét/thay đức tin · 0 invent · 0 clickbait sợ hãi · no QR/Xu · no sexy/Elara ===== */
#toast.toast-last-things-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-last-things-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-last-things-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-last-things-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #365 — heaven / Thiên đàng open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent địa chỉ thiên đàng · 0 claim app=lên trời/thay đức tin · phân biệt lastThings/#363+#364 · resurrectionOfTheBody/#361+#362 · hope · beatific vision framing · communionOfSaints · creed · paschalMystery ===== */
@keyframes heaven-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.heaven-open-pulse,
#library-modal #library-detail .lib-line-actions.heaven-open-pulse,
#library-modal #library-detail > p.heaven-open-pulse,
#library-modal #library-related.heaven-open-pulse,
#library-modal .lib-related.heaven-open-pulse,
#library-modal .lib-related-btn.heaven-open-pulse,
#library-modal .lib-group-chip.heaven-open-pulse {
  animation: heaven-open-pulse 0.65s ease;
}
#library-modal #library-line-back.heaven-open-pulse-static,
#library-modal #library-detail .lib-line-actions.heaven-open-pulse-static,
#library-modal #library-detail > p.heaven-open-pulse-static,
#library-modal #library-related.heaven-open-pulse-static,
#library-modal .lib-related.heaven-open-pulse-static,
#library-modal .lib-related-btn.heaven-open-pulse-static,
#library-modal .lib-group-chip.heaven-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="heaven"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="heaven"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="heaven"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.heaven-open-pulse,
  #library-modal #library-detail .lib-line-actions.heaven-open-pulse,
  #library-modal #library-detail > p.heaven-open-pulse,
  #library-modal #library-related.heaven-open-pulse,
  #library-modal .lib-related.heaven-open-pulse,
  #library-modal .lib-related-btn.heaven-open-pulse,
  #library-modal .lib-group-chip.heaven-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #366 — Soft tip «Thiên đàng» · CTA ≥48 · VI thiên đàng — hạnh phúc viên mãn với Chúa; học khung trên thẻ · phân biệt lastThings/#364 · resurrectionOfTheBody/#362 · hope · beatific vision · communionOfSaints · creed · paschalMystery · yield lastThings/#364 · resurrectionOfTheBody/#362… · 0 claim app=lên trời/thay đức tin · 0 invent địa chỉ thiên đàng · no QR/Xu · no sexy/Elara ===== */
#toast.toast-heaven-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-heaven-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-heaven-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-heaven-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #367 — hope / Đức cậy open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=đức cậy/buff · 0 lạc quan kiểu game · phân biệt heaven/#365+#366 · lastThings/#363+#364 · resurrectionOfTheBody/#361+#362 · creed · paschalMystery · charity/faith nếu related ===== */
@keyframes hope-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.hope-open-pulse,
#library-modal #library-detail .lib-line-actions.hope-open-pulse,
#library-modal #library-detail > p.hope-open-pulse,
#library-modal #library-related.hope-open-pulse,
#library-modal .lib-related.hope-open-pulse,
#library-modal .lib-related-btn.hope-open-pulse,
#library-modal .lib-group-chip.hope-open-pulse {
  animation: hope-open-pulse 0.65s ease;
}
#library-modal #library-line-back.hope-open-pulse-static,
#library-modal #library-detail .lib-line-actions.hope-open-pulse-static,
#library-modal #library-detail > p.hope-open-pulse-static,
#library-modal #library-related.hope-open-pulse-static,
#library-modal .lib-related.hope-open-pulse-static,
#library-modal .lib-related-btn.hope-open-pulse-static,
#library-modal .lib-group-chip.hope-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="hope"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="hope"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="hope"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.hope-open-pulse,
  #library-modal #library-detail .lib-line-actions.hope-open-pulse,
  #library-modal #library-detail > p.hope-open-pulse,
  #library-modal #library-related.hope-open-pulse,
  #library-modal .lib-related.hope-open-pulse,
  #library-modal .lib-related-btn.hope-open-pulse,
  #library-modal .lib-group-chip.hope-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #368 — Soft tip «Đức cậy» · CTA ≥48 · VI đức cậy — khao khát Nước Trời dựa lời hứa Chúa Kitô; học khung trên thẻ · không lạc quan kiểu game · phân biệt heaven/#366 · lastThings/#364 · resurrectionOfTheBody/#362 · creed · paschalMystery · charity/faith · yield heaven/#366 · lastThings/#364… · 0 claim app=đức cậy/buff · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-hope-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-hope-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-hope-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-hope-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #369 — faith / Đức tin open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=đức tin/buff · phân biệt hope/#367+#368 · heaven/#365+#366 · charity · creed · paschalMystery · jesus ===== */
@keyframes faith-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.faith-open-pulse,
#library-modal #library-detail .lib-line-actions.faith-open-pulse,
#library-modal #library-detail > p.faith-open-pulse,
#library-modal #library-related.faith-open-pulse,
#library-modal .lib-related.faith-open-pulse,
#library-modal .lib-related-btn.faith-open-pulse,
#library-modal .lib-group-chip.faith-open-pulse {
  animation: faith-open-pulse 0.65s ease;
}
#library-modal #library-line-back.faith-open-pulse-static,
#library-modal #library-detail .lib-line-actions.faith-open-pulse-static,
#library-modal #library-detail > p.faith-open-pulse-static,
#library-modal #library-related.faith-open-pulse-static,
#library-modal .lib-related.faith-open-pulse-static,
#library-modal .lib-related-btn.faith-open-pulse-static,
#library-modal .lib-group-chip.faith-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="faith"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="faith"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="faith"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.faith-open-pulse,
  #library-modal #library-detail .lib-line-actions.faith-open-pulse,
  #library-modal #library-detail > p.faith-open-pulse,
  #library-modal #library-related.faith-open-pulse,
  #library-modal .lib-related.faith-open-pulse,
  #library-modal .lib-related-btn.faith-open-pulse,
  #library-modal .lib-group-chip.faith-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #370 — Soft tip «Đức tin» · CTA ≥48 · VI đức tin — đáp lời Chúa; học khung trên thẻ · không buff game · phân biệt hope/#368 · heaven/#366 · charity · creed · paschalMystery · jesus · yield hope/#368 · heaven/#366 · lastThings/#364… · 0 claim app=đức tin/buff · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-faith-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-faith-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-faith-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-faith-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #371 — charity / Đức ái open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=đức ái/buff · 0 monetize tình yêu · phân biệt faith/#369+#370 · hope/#367+#368 · heaven/#365+#366 · charityFruit · creed · jesus · worksOfMercy nếu related ===== */
@keyframes charity-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.charity-open-pulse,
#library-modal #library-detail .lib-line-actions.charity-open-pulse,
#library-modal #library-detail > p.charity-open-pulse,
#library-modal #library-related.charity-open-pulse,
#library-modal .lib-related.charity-open-pulse,
#library-modal .lib-related-btn.charity-open-pulse,
#library-modal .lib-group-chip.charity-open-pulse {
  animation: charity-open-pulse 0.65s ease;
}
#library-modal #library-line-back.charity-open-pulse-static,
#library-modal #library-detail .lib-line-actions.charity-open-pulse-static,
#library-modal #library-detail > p.charity-open-pulse-static,
#library-modal #library-related.charity-open-pulse-static,
#library-modal .lib-related.charity-open-pulse-static,
#library-modal .lib-related-btn.charity-open-pulse-static,
#library-modal .lib-group-chip.charity-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="charity"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="charity"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="charity"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.charity-open-pulse,
  #library-modal #library-detail .lib-line-actions.charity-open-pulse,
  #library-modal #library-detail > p.charity-open-pulse,
  #library-modal #library-related.charity-open-pulse,
  #library-modal .lib-related.charity-open-pulse,
  #library-modal .lib-related-btn.charity-open-pulse,
  #library-modal .lib-group-chip.charity-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #372 — Soft tip «Đức ái» · CTA ≥48 · VI đức ái — yêu Chúa và yêu người; học khung trên thẻ · không buff game · phân biệt faith/#370 · hope/#368 · heaven/#366 · charityFruit · creed · jesus · worksOfMercy · yield faith/#370 · hope/#368 · heaven/#366 · lastThings/#364… · 0 claim app=đức ái/buff · 0 monetize tình yêu · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-charity-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-charity-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-charity-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-charity-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #373 — theologicalVirtues / Ba nhân đức đối thần open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=nhân đức đối thần/skill tree/buff/cộng điểm nhân đức · phân biệt faith/#369+#370 · hope/#367+#368 · charity/#371+#372 · cardinalVirtues · baptism · creed · eucharist ===== */
@keyframes theological-virtues-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.theological-virtues-open-pulse,
#library-modal #library-detail .lib-line-actions.theological-virtues-open-pulse,
#library-modal #library-detail > p.theological-virtues-open-pulse,
#library-modal #library-related.theological-virtues-open-pulse,
#library-modal .lib-related.theological-virtues-open-pulse,
#library-modal .lib-related-btn.theological-virtues-open-pulse,
#library-modal .lib-group-chip.theological-virtues-open-pulse {
  animation: theological-virtues-open-pulse 0.65s ease;
}
#library-modal #library-line-back.theological-virtues-open-pulse-static,
#library-modal #library-detail .lib-line-actions.theological-virtues-open-pulse-static,
#library-modal #library-detail > p.theological-virtues-open-pulse-static,
#library-modal #library-related.theological-virtues-open-pulse-static,
#library-modal .lib-related.theological-virtues-open-pulse-static,
#library-modal .lib-related-btn.theological-virtues-open-pulse-static,
#library-modal .lib-group-chip.theological-virtues-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="theologicalVirtues"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="theologicalVirtues"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="theologicalVirtues"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.theological-virtues-open-pulse,
  #library-modal #library-detail .lib-line-actions.theological-virtues-open-pulse,
  #library-modal #library-detail > p.theological-virtues-open-pulse,
  #library-modal #library-related.theological-virtues-open-pulse,
  #library-modal .lib-related.theological-virtues-open-pulse,
  #library-modal .lib-related-btn.theological-virtues-open-pulse,
  #library-modal .lib-group-chip.theological-virtues-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #374 — Soft tip «Ba nhân đức đối thần» · CTA ≥48 · VI tin · cậy · mến; học khung trên thẻ · không skill tree/cộng điểm · phân biệt faith/#370 · hope/#368 · charity/#372 · cardinalVirtues · yield charity/#372 · faith/#370 · hope/#368 · heaven/#366 · lastThings/#364… · 0 claim app=nhân đức/buff/skill tree · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-theological-virtues-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-theological-virtues-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-theological-virtues-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-theological-virtues-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #375 — cardinalVirtues / Bốn nhân đức trụ open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=nhân đức trụ/skill tree/buff · phân biệt theologicalVirtues/#373+#374 · prudence · justiceVirtue · fortitude · temperance · faith/hope/charity ===== */
@keyframes cardinal-virtues-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.cardinal-virtues-open-pulse,
#library-modal #library-detail .lib-line-actions.cardinal-virtues-open-pulse,
#library-modal #library-detail > p.cardinal-virtues-open-pulse,
#library-modal #library-related.cardinal-virtues-open-pulse,
#library-modal .lib-related.cardinal-virtues-open-pulse,
#library-modal .lib-related-btn.cardinal-virtues-open-pulse,
#library-modal .lib-group-chip.cardinal-virtues-open-pulse {
  animation: cardinal-virtues-open-pulse 0.65s ease;
}
#library-modal #library-line-back.cardinal-virtues-open-pulse-static,
#library-modal #library-detail .lib-line-actions.cardinal-virtues-open-pulse-static,
#library-modal #library-detail > p.cardinal-virtues-open-pulse-static,
#library-modal #library-related.cardinal-virtues-open-pulse-static,
#library-modal .lib-related.cardinal-virtues-open-pulse-static,
#library-modal .lib-related-btn.cardinal-virtues-open-pulse-static,
#library-modal .lib-group-chip.cardinal-virtues-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="cardinalVirtues"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="cardinalVirtues"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="cardinalVirtues"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.cardinal-virtues-open-pulse,
  #library-modal #library-detail .lib-line-actions.cardinal-virtues-open-pulse,
  #library-modal #library-detail > p.cardinal-virtues-open-pulse,
  #library-modal #library-related.cardinal-virtues-open-pulse,
  #library-modal .lib-related.cardinal-virtues-open-pulse,
  #library-modal .lib-related-btn.cardinal-virtues-open-pulse,
  #library-modal .lib-group-chip.cardinal-virtues-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #376 — Soft tip «Bốn nhân đức trụ» · CTA ≥48 · VI khôn ngoan · công bằng · can đảm · tiết độ; học khung trên thẻ · không skill tree · phân biệt theologicalVirtues/#374 · prudence · justiceVirtue · fortitude · temperance · yield theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · heaven/#366… · 0 claim app=nhân đức/buff/skill tree · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-cardinal-virtues-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-cardinal-virtues-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-cardinal-virtues-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-cardinal-virtues-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #377 — prudence / Khôn ngoan open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=khôn ngoan/skill/buff · phân biệt cardinalVirtues/#375+#376 · justiceVirtue · fortitude · temperance · theologicalVirtues · conscience · freeWill ===== */
@keyframes prudence-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.prudence-open-pulse,
#library-modal #library-detail .lib-line-actions.prudence-open-pulse,
#library-modal #library-detail > p.prudence-open-pulse,
#library-modal #library-related.prudence-open-pulse,
#library-modal .lib-related.prudence-open-pulse,
#library-modal .lib-related-btn.prudence-open-pulse,
#library-modal .lib-group-chip.prudence-open-pulse {
  animation: prudence-open-pulse 0.65s ease;
}
#library-modal #library-line-back.prudence-open-pulse-static,
#library-modal #library-detail .lib-line-actions.prudence-open-pulse-static,
#library-modal #library-detail > p.prudence-open-pulse-static,
#library-modal #library-related.prudence-open-pulse-static,
#library-modal .lib-related.prudence-open-pulse-static,
#library-modal .lib-related-btn.prudence-open-pulse-static,
#library-modal .lib-group-chip.prudence-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="prudence"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="prudence"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="prudence"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.prudence-open-pulse,
  #library-modal #library-detail .lib-line-actions.prudence-open-pulse,
  #library-modal #library-detail > p.prudence-open-pulse,
  #library-modal #library-related.prudence-open-pulse,
  #library-modal .lib-related.prudence-open-pulse,
  #library-modal .lib-related-btn.prudence-open-pulse,
  #library-modal .lib-group-chip.prudence-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #379 — justiceVirtue / Công bằng open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=công bằng/skill/buff · 0 đảng phái · phân biệt cardinalVirtues/#375+#376 · prudence/#377+#378 · fortitude · temperance · commonGood · humanDignity · solidarity ===== */
@keyframes justice-virtue-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.justice-virtue-open-pulse,
#library-modal #library-detail .lib-line-actions.justice-virtue-open-pulse,
#library-modal #library-detail > p.justice-virtue-open-pulse,
#library-modal #library-related.justice-virtue-open-pulse,
#library-modal .lib-related.justice-virtue-open-pulse,
#library-modal .lib-related-btn.justice-virtue-open-pulse,
#library-modal .lib-group-chip.justice-virtue-open-pulse {
  animation: justice-virtue-open-pulse 0.65s ease;
}
#library-modal #library-line-back.justice-virtue-open-pulse-static,
#library-modal #library-detail .lib-line-actions.justice-virtue-open-pulse-static,
#library-modal #library-detail > p.justice-virtue-open-pulse-static,
#library-modal #library-related.justice-virtue-open-pulse-static,
#library-modal .lib-related.justice-virtue-open-pulse-static,
#library-modal .lib-related-btn.justice-virtue-open-pulse-static,
#library-modal .lib-group-chip.justice-virtue-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="justiceVirtue"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="justiceVirtue"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="justiceVirtue"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.justice-virtue-open-pulse,
  #library-modal #library-detail .lib-line-actions.justice-virtue-open-pulse,
  #library-modal #library-detail > p.justice-virtue-open-pulse,
  #library-modal #library-related.justice-virtue-open-pulse,
  #library-modal .lib-related.justice-virtue-open-pulse,
  #library-modal .lib-related-btn.justice-virtue-open-pulse,
  #library-modal .lib-group-chip.justice-virtue-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #381 — fortitude / Dũng cảm open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=dũng cảm/skill/buff · 0 gore · phân biệt cardinalVirtues/#375+#376 · prudence/#377+#378 · justiceVirtue/#379+#380 · temperance · hope · vietnameseMartyrs · vocation · faith ===== */
@keyframes fortitude-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.fortitude-open-pulse,
#library-modal #library-detail .lib-line-actions.fortitude-open-pulse,
#library-modal #library-detail > p.fortitude-open-pulse,
#library-modal #library-related.fortitude-open-pulse,
#library-modal .lib-related.fortitude-open-pulse,
#library-modal .lib-related-btn.fortitude-open-pulse,
#library-modal .lib-group-chip.fortitude-open-pulse {
  animation: fortitude-open-pulse 0.65s ease;
}
#library-modal #library-line-back.fortitude-open-pulse-static,
#library-modal #library-detail .lib-line-actions.fortitude-open-pulse-static,
#library-modal #library-detail > p.fortitude-open-pulse-static,
#library-modal #library-related.fortitude-open-pulse-static,
#library-modal .lib-related.fortitude-open-pulse-static,
#library-modal .lib-related-btn.fortitude-open-pulse-static,
#library-modal .lib-group-chip.fortitude-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="fortitude"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="fortitude"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="fortitude"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.fortitude-open-pulse,
  #library-modal #library-detail .lib-line-actions.fortitude-open-pulse,
  #library-modal #library-detail > p.fortitude-open-pulse,
  #library-modal #library-related.fortitude-open-pulse,
  #library-modal .lib-related.fortitude-open-pulse,
  #library-modal .lib-related-btn.fortitude-open-pulse,
  #library-modal .lib-group-chip.fortitude-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #383 — temperance / Tiết độ open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=tiết độ/skill/buff · phân biệt cardinalVirtues/#375+#376 · prudence/#377+#378 · justiceVirtue/#379+#380 · fortitude/#381+#382 · chastity · freeWill · fastingAbstinence · selfControlFruit ===== */
@keyframes temperance-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.temperance-open-pulse,
#library-modal #library-detail .lib-line-actions.temperance-open-pulse,
#library-modal #library-detail > p.temperance-open-pulse,
#library-modal #library-related.temperance-open-pulse,
#library-modal .lib-related.temperance-open-pulse,
#library-modal .lib-related-btn.temperance-open-pulse,
#library-modal .lib-group-chip.temperance-open-pulse {
  animation: temperance-open-pulse 0.65s ease;
}
#library-modal #library-line-back.temperance-open-pulse-static,
#library-modal #library-detail .lib-line-actions.temperance-open-pulse-static,
#library-modal #library-detail > p.temperance-open-pulse-static,
#library-modal #library-related.temperance-open-pulse-static,
#library-modal .lib-related.temperance-open-pulse-static,
#library-modal .lib-related-btn.temperance-open-pulse-static,
#library-modal .lib-group-chip.temperance-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="temperance"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="temperance"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="temperance"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.temperance-open-pulse,
  #library-modal #library-detail .lib-line-actions.temperance-open-pulse,
  #library-modal #library-detail > p.temperance-open-pulse,
  #library-modal #library-related.temperance-open-pulse,
  #library-modal .lib-related.temperance-open-pulse,
  #library-modal .lib-related-btn.temperance-open-pulse,
  #library-modal .lib-group-chip.temperance-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #378 — Soft tip «Khôn ngoan» · CTA ≥48 · VI nhận điều thiện và chọn phương tiện đúng; học khung trên thẻ · Không mánh khóe hay skill · phân biệt cardinalVirtues/#376 · justiceVirtue · fortitude · temperance · conscience · yield cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · heaven/#366… · 0 claim app=buff/skill · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-prudence-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-prudence-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-prudence-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-prudence-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #380 — Soft tip «Công bằng» · CTA ≥48 · VI trả cho Thiên Chúa và tha nhân điều thuộc về họ; học khung trên thẻ · Không skill hay đảng phái · phân biệt cardinalVirtues/#376 · prudence/#378 · fortitude · temperance · commonGood · yield prudence/#378 · cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · heaven/#366… · 0 claim app=buff/skill · 0 đảng phái · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-justice-virtue-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-justice-virtue-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-justice-virtue-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-justice-virtue-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #382 — Soft tip «Dũng cảm» · CTA ≥48 · VI vững trong khó khăn và kiên trì theo điều thiện; học khung trên thẻ · Không liều lĩnh hay buff · phân biệt cardinalVirtues/#376 · prudence/#378 · justiceVirtue/#380 · temperance · hope · vietnameseMartyrs · yield justiceVirtue/#380 · prudence/#378 · cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · heaven/#366… · 0 claim app=buff/skill · 0 gore · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-fortitude-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-fortitude-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-fortitude-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-fortitude-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #384 — Soft tip «Tiết độ» · CTA ≥48 · VI làm chủ dục vọng để hướng về điều thiện; học khung trên thẻ · Không skill hay buff · phân biệt cardinalVirtues/#376 · prudence/#378 · justiceVirtue/#380 · fortitude/#382 · chastity · fastingAbstinence · selfControlFruit · yield fortitude/#382 · justiceVirtue/#380 · prudence/#378 · cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · heaven/#366… · 0 claim app=buff/skill · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-temperance-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-temperance-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-temperance-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-temperance-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #385 — worksOfMercy / Việc thương xót open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=việc thương xót/công đức/thay bác ái thật/monetize tình yêu · phân biệt charity/#371+#372 · theologicalVirtues/#373+#374 · beatitudes · preferentialOption · commandments · corporal/spiritual works nếu related ===== */
@keyframes works-of-mercy-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.works-of-mercy-open-pulse,
#library-modal #library-detail .lib-line-actions.works-of-mercy-open-pulse,
#library-modal #library-detail > p.works-of-mercy-open-pulse,
#library-modal #library-related.works-of-mercy-open-pulse,
#library-modal .lib-related.works-of-mercy-open-pulse,
#library-modal .lib-related-btn.works-of-mercy-open-pulse,
#library-modal .lib-group-chip.works-of-mercy-open-pulse {
  animation: works-of-mercy-open-pulse 0.65s ease;
}
#library-modal #library-line-back.works-of-mercy-open-pulse-static,
#library-modal #library-detail .lib-line-actions.works-of-mercy-open-pulse-static,
#library-modal #library-detail > p.works-of-mercy-open-pulse-static,
#library-modal #library-related.works-of-mercy-open-pulse-static,
#library-modal .lib-related.works-of-mercy-open-pulse-static,
#library-modal .lib-related-btn.works-of-mercy-open-pulse-static,
#library-modal .lib-group-chip.works-of-mercy-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="worksOfMercy"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="worksOfMercy"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="worksOfMercy"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.works-of-mercy-open-pulse,
  #library-modal #library-detail .lib-line-actions.works-of-mercy-open-pulse,
  #library-modal #library-detail > p.works-of-mercy-open-pulse,
  #library-modal #library-related.works-of-mercy-open-pulse,
  #library-modal .lib-related.works-of-mercy-open-pulse,
  #library-modal .lib-related-btn.works-of-mercy-open-pulse,
  #library-modal .lib-group-chip.works-of-mercy-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #386 — Soft tip «Việc thương xót» · CTA ≥48 · VI yêu người bằng hành động cụ thể; học khung trên thẻ · App không thay bác ái thật hay cộng điểm công đức · phân biệt charity/#372 · beatitudes · preferentialOption · theologicalVirtues/#374 · yield temperance/#384 · fortitude/#382 · justiceVirtue/#380 · prudence/#378 · cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · … · 0 claim app=công đức/thay bác ái/buff/monetize · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-works-of-mercy-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-works-of-mercy-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-works-of-mercy-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-works-of-mercy-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #387 — beatitudes / Tám Mối Phúc / Các mối phúc open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=các mối phúc/buff/công đức/thay Tin Mừng · phân biệt worksOfMercy/#385+#386 · charity/#371+#372 · theologicalVirtues · commandments · jesus · sermon on the mount framing nếu related ===== */
@keyframes beatitudes-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.beatitudes-open-pulse,
#library-modal #library-detail .lib-line-actions.beatitudes-open-pulse,
#library-modal #library-detail > p.beatitudes-open-pulse,
#library-modal #library-related.beatitudes-open-pulse,
#library-modal .lib-related.beatitudes-open-pulse,
#library-modal .lib-related-btn.beatitudes-open-pulse,
#library-modal .lib-group-chip.beatitudes-open-pulse {
  animation: beatitudes-open-pulse 0.65s ease;
}
#library-modal #library-line-back.beatitudes-open-pulse-static,
#library-modal #library-detail .lib-line-actions.beatitudes-open-pulse-static,
#library-modal #library-detail > p.beatitudes-open-pulse-static,
#library-modal #library-related.beatitudes-open-pulse-static,
#library-modal .lib-related.beatitudes-open-pulse-static,
#library-modal .lib-related-btn.beatitudes-open-pulse-static,
#library-modal .lib-group-chip.beatitudes-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="beatitudes"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="beatitudes"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="beatitudes"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.beatitudes-open-pulse,
  #library-modal #library-detail .lib-line-actions.beatitudes-open-pulse,
  #library-modal #library-detail > p.beatitudes-open-pulse,
  #library-modal #library-related.beatitudes-open-pulse,
  #library-modal .lib-related.beatitudes-open-pulse,
  #library-modal .lib-related-btn.beatitudes-open-pulse,
  #library-modal .lib-group-chip.beatitudes-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #388 — Soft tip «Các mối phúc» · CTA ≥48 · VI đường hạnh phúc theo Chúa Giêsu; học khung trên thẻ · App không thay Tin Mừng hay cộng điểm công đức · phân biệt worksOfMercy/#386 · charity/#372 · theologicalVirtues/#374 · commandments · jesus · yield worksOfMercy/#386 · temperance/#384 · fortitude/#382 · justiceVirtue/#380 · prudence/#378 · cardinalVirtues/#376 · theologicalVirtues/#374 · charity/#372 · faith/#370 · hope/#368 · … · 0 claim app=công đức/buff/thay Tin Mừng · 0 invent · no QR/Xu · no sexy/Elara ===== */
#toast.toast-beatitudes-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-beatitudes-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-beatitudes-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-beatitudes-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #389 — preferentialOption / Ưu tiên người nghèo open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=ưu tiên người nghèo/công đức/đảng phái/thay bác ái thật · phân biệt worksOfMercy/#385+#386 · beatitudes/#387+#388 · charity · commandments · commonGood · humanDignity · solidarity ===== */
@keyframes preferential-option-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.preferential-option-open-pulse,
#library-modal #library-detail .lib-line-actions.preferential-option-open-pulse,
#library-modal #library-detail > p.preferential-option-open-pulse,
#library-modal #library-related.preferential-option-open-pulse,
#library-modal .lib-related.preferential-option-open-pulse,
#library-modal .lib-related-btn.preferential-option-open-pulse,
#library-modal .lib-group-chip.preferential-option-open-pulse {
  animation: preferential-option-open-pulse 0.65s ease;
}
#library-modal #library-line-back.preferential-option-open-pulse-static,
#library-modal #library-detail .lib-line-actions.preferential-option-open-pulse-static,
#library-modal #library-detail > p.preferential-option-open-pulse-static,
#library-modal #library-related.preferential-option-open-pulse-static,
#library-modal .lib-related.preferential-option-open-pulse-static,
#library-modal .lib-related-btn.preferential-option-open-pulse-static,
#library-modal .lib-group-chip.preferential-option-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="preferentialOption"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="preferentialOption"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="preferentialOption"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.preferential-option-open-pulse,
  #library-modal #library-detail .lib-line-actions.preferential-option-open-pulse,
  #library-modal #library-detail > p.preferential-option-open-pulse,
  #library-modal #library-related.preferential-option-open-pulse,
  #library-modal .lib-related.preferential-option-open-pulse,
  #library-modal .lib-related-btn.preferential-option-open-pulse,
  #library-modal .lib-group-chip.preferential-option-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #390 — preferentialOption soft tip «Ưu tiên người nghèo» toast ≥48 · soft pulse · 0 invent · 0 claim công đức/buff/đảng phái/thay bác ái · no QR/Xu · no sexy/Elara ===== */
#toast.toast-preferential-option-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-preferential-option-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-preferential-option-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-preferential-option-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #391 — commandments / Mười Điều Răn open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=Mười Điều Răn/checklist gamify/công đức/thay lương tâm giáo xứ · phân biệt preferentialOption/#389+#390 · beatitudes/#387+#388 · worksOfMercy · theologicalVirtues · conscience · freeWill · examinationOfConscience ===== */
@keyframes commandments-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.commandments-open-pulse,
#library-modal #library-detail .lib-line-actions.commandments-open-pulse,
#library-modal #library-detail > p.commandments-open-pulse,
#library-modal #library-related.commandments-open-pulse,
#library-modal .lib-related.commandments-open-pulse,
#library-modal .lib-related-btn.commandments-open-pulse,
#library-modal .lib-group-chip.commandments-open-pulse {
  animation: commandments-open-pulse 0.65s ease;
}
#library-modal #library-line-back.commandments-open-pulse-static,
#library-modal #library-detail .lib-line-actions.commandments-open-pulse-static,
#library-modal #library-detail > p.commandments-open-pulse-static,
#library-modal #library-related.commandments-open-pulse-static,
#library-modal .lib-related.commandments-open-pulse-static,
#library-modal .lib-related-btn.commandments-open-pulse-static,
#library-modal .lib-group-chip.commandments-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="commandments"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="commandments"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="commandments"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.commandments-open-pulse,
  #library-modal #library-detail .lib-line-actions.commandments-open-pulse,
  #library-modal #library-detail > p.commandments-open-pulse,
  #library-modal #library-related.commandments-open-pulse,
  #library-modal .lib-related.commandments-open-pulse,
  #library-modal .lib-related-btn.commandments-open-pulse,
  #library-modal .lib-group-chip.commandments-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #392 — commandments soft tip «Mười Điều Răn» toast ≥48 · soft pulse · 0 invent · 0 claim công đức/buff/gamify/thay lương tâm · no QR/Xu · no sexy/Elara ===== */
#toast.toast-commandments-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-commandments-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-commandments-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-commandments-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #393 — vocation / Ơn gọi open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=ơn gọi/quiz nghề/buff/thay phân định giáo xứ · phân biệt commandments/#391+#392 · baptism · peopleOfGod · theologicalVirtues · charity · iteMissaEst · holyOrders · matrimony ===== */
@keyframes vocation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.vocation-open-pulse,
#library-modal #library-detail .lib-line-actions.vocation-open-pulse,
#library-modal #library-detail > p.vocation-open-pulse,
#library-modal #library-related.vocation-open-pulse,
#library-modal .lib-related.vocation-open-pulse,
#library-modal .lib-related-btn.vocation-open-pulse,
#library-modal .lib-group-chip.vocation-open-pulse {
  animation: vocation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.vocation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.vocation-open-pulse-static,
#library-modal #library-detail > p.vocation-open-pulse-static,
#library-modal #library-related.vocation-open-pulse-static,
#library-modal .lib-related.vocation-open-pulse-static,
#library-modal .lib-related-btn.vocation-open-pulse-static,
#library-modal .lib-group-chip.vocation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="vocation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="vocation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="vocation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.vocation-open-pulse,
  #library-modal #library-detail .lib-line-actions.vocation-open-pulse,
  #library-modal #library-detail > p.vocation-open-pulse,
  #library-modal #library-related.vocation-open-pulse,
  #library-modal .lib-related.vocation-open-pulse,
  #library-modal .lib-related-btn.vocation-open-pulse,
  #library-modal .lib-group-chip.vocation-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #395 — careForCreation / Chăm sóc tạo thành open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=chăm sóc tạo thành/chính sách/thờ thiên nhiên/công đức · phân biệt vocation/#393+#394 · creation · humanDignity · commonGood · solidarity · commandments · preferentialOption ===== */
@keyframes care-for-creation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.care-for-creation-open-pulse,
#library-modal #library-detail .lib-line-actions.care-for-creation-open-pulse,
#library-modal #library-detail > p.care-for-creation-open-pulse,
#library-modal #library-related.care-for-creation-open-pulse,
#library-modal .lib-related.care-for-creation-open-pulse,
#library-modal .lib-related-btn.care-for-creation-open-pulse,
#library-modal .lib-group-chip.care-for-creation-open-pulse {
  animation: care-for-creation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.care-for-creation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.care-for-creation-open-pulse-static,
#library-modal #library-detail > p.care-for-creation-open-pulse-static,
#library-modal #library-related.care-for-creation-open-pulse-static,
#library-modal .lib-related.care-for-creation-open-pulse-static,
#library-modal .lib-related-btn.care-for-creation-open-pulse-static,
#library-modal .lib-group-chip.care-for-creation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="careForCreation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="careForCreation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="careForCreation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.care-for-creation-open-pulse,
  #library-modal #library-detail .lib-line-actions.care-for-creation-open-pulse,
  #library-modal #library-detail > p.care-for-creation-open-pulse,
  #library-modal #library-related.care-for-creation-open-pulse,
  #library-modal .lib-related.care-for-creation-open-pulse,
  #library-modal .lib-related-btn.care-for-creation-open-pulse,
  #library-modal .lib-group-chip.care-for-creation-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #394 — vocation soft tip «Ơn gọi» toast ≥48 · soft pulse · 0 invent · 0 claim quiz nghề/buff/thay phân định · no QR/Xu · no sexy/Elara · phân biệt commandments/#392 · baptism · holyOrders · matrimony · iteMissaEst · charity ===== */
#toast.toast-vocation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-vocation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-vocation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-vocation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #396 — careForCreation soft tip «Chăm sóc tạo thành» toast ≥48 · soft pulse · 0 invent · 0 claim chính sách/thờ thiên nhiên/công đức/buff · no QR/Xu · no sexy/Elara · phân biệt creation · humanDignity · commonGood · solidarity · commandments · vocation ===== */
#toast.toast-care-for-creation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-care-for-creation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-care-for-creation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-care-for-creation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #397 — humanDignity / Phẩm giá con người open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=phẩm giá/đảng phái/công đức/buff/skill/thay linh mục · phân biệt careForCreation/#395+#396 · vocation/#393+#394 · commandments/#391+#392 · preferentialOption · creation · commonGood · solidarity · worksOfMercy · charity · conscience ===== */
@keyframes human-dignity-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.human-dignity-open-pulse,
#library-modal #library-detail .lib-line-actions.human-dignity-open-pulse,
#library-modal #library-detail > p.human-dignity-open-pulse,
#library-modal #library-related.human-dignity-open-pulse,
#library-modal .lib-related.human-dignity-open-pulse,
#library-modal .lib-related-btn.human-dignity-open-pulse,
#library-modal .lib-group-chip.human-dignity-open-pulse {
  animation: human-dignity-open-pulse 0.65s ease;
}
#library-modal #library-line-back.human-dignity-open-pulse-static,
#library-modal #library-detail .lib-line-actions.human-dignity-open-pulse-static,
#library-modal #library-detail > p.human-dignity-open-pulse-static,
#library-modal #library-related.human-dignity-open-pulse-static,
#library-modal .lib-related.human-dignity-open-pulse-static,
#library-modal .lib-related-btn.human-dignity-open-pulse-static,
#library-modal .lib-group-chip.human-dignity-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="humanDignity"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="humanDignity"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="humanDignity"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.human-dignity-open-pulse,
  #library-modal #library-detail .lib-line-actions.human-dignity-open-pulse,
  #library-modal #library-detail > p.human-dignity-open-pulse,
  #library-modal #library-related.human-dignity-open-pulse,
  #library-modal .lib-related.human-dignity-open-pulse,
  #library-modal .lib-related-btn.human-dignity-open-pulse,
  #library-modal .lib-group-chip.human-dignity-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #398 — humanDignity soft tip «Phẩm giá con người» toast ≥48 · soft pulse · 0 invent · 0 claim phẩm giá/đảng phái/công đức/buff/thay mục vụ · no QR/Xu · no sexy/Elara · phân biệt creation · careForCreation · commonGood · solidarity · commandments · vocation · preferentialOption · worksOfMercy · conscience ===== */
#toast.toast-human-dignity-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-human-dignity-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-human-dignity-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-human-dignity-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #399 — commonGood / Công ích open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=công ích/đảng phái/skill/buff/thay mục vụ · phân biệt humanDignity/#397+#398 · careForCreation/#395+#396 · solidarity · subsidiarity · preferentialOption · worksOfMercy · charity · commandments · peopleOfGod · localChurch ===== */
@keyframes common-good-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.common-good-open-pulse,
#library-modal #library-detail .lib-line-actions.common-good-open-pulse,
#library-modal #library-detail > p.common-good-open-pulse,
#library-modal #library-related.common-good-open-pulse,
#library-modal .lib-related.common-good-open-pulse,
#library-modal .lib-related-btn.common-good-open-pulse,
#library-modal .lib-group-chip.common-good-open-pulse {
  animation: common-good-open-pulse 0.65s ease;
}
#library-modal #library-line-back.common-good-open-pulse-static,
#library-modal #library-detail .lib-line-actions.common-good-open-pulse-static,
#library-modal #library-detail > p.common-good-open-pulse-static,
#library-modal #library-related.common-good-open-pulse-static,
#library-modal .lib-related.common-good-open-pulse-static,
#library-modal .lib-related-btn.common-good-open-pulse-static,
#library-modal .lib-group-chip.common-good-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="commonGood"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="commonGood"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="commonGood"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.common-good-open-pulse,
  #library-modal #library-detail .lib-line-actions.common-good-open-pulse,
  #library-modal #library-detail > p.common-good-open-pulse,
  #library-modal #library-related.common-good-open-pulse,
  #library-modal .lib-related.common-good-open-pulse,
  #library-modal .lib-related-btn.common-good-open-pulse,
  #library-modal .lib-group-chip.common-good-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #400 — commonGood soft tip «Công ích» toast ≥48 · soft pulse · 0 invent · 0 claim công ích/đảng phái/buff/thay mục vụ · no QR/Xu · no sexy/Elara · phân biệt humanDignity · solidarity · subsidiarity · preferentialOption · worksOfMercy · charity · peopleOfGod · localChurch ===== */
#toast.toast-common-good-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-common-good-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-common-good-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-common-good-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #401 — solidarity / Liên đới open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=liên đới/đảng phái/buff/thay mục vụ · phân biệt commonGood/#399+#400 · humanDignity/#397+#398 · preferentialOption · subsidiarity · worksOfMercy · charity · peopleOfGod · careForCreation ===== */
@keyframes solidarity-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.solidarity-open-pulse,
#library-modal #library-detail .lib-line-actions.solidarity-open-pulse,
#library-modal #library-detail > p.solidarity-open-pulse,
#library-modal #library-related.solidarity-open-pulse,
#library-modal .lib-related.solidarity-open-pulse,
#library-modal .lib-related-btn.solidarity-open-pulse,
#library-modal .lib-group-chip.solidarity-open-pulse {
  animation: solidarity-open-pulse 0.65s ease;
}
#library-modal #library-line-back.solidarity-open-pulse-static,
#library-modal #library-detail .lib-line-actions.solidarity-open-pulse-static,
#library-modal #library-detail > p.solidarity-open-pulse-static,
#library-modal #library-related.solidarity-open-pulse-static,
#library-modal .lib-related.solidarity-open-pulse-static,
#library-modal .lib-related-btn.solidarity-open-pulse-static,
#library-modal .lib-group-chip.solidarity-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="solidarity"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="solidarity"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="solidarity"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.solidarity-open-pulse,
  #library-modal #library-detail .lib-line-actions.solidarity-open-pulse,
  #library-modal #library-detail > p.solidarity-open-pulse,
  #library-modal #library-related.solidarity-open-pulse,
  #library-modal .lib-related.solidarity-open-pulse,
  #library-modal .lib-related-btn.solidarity-open-pulse,
  #library-modal .lib-group-chip.solidarity-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #402 — solidarity soft tip «Liên đới» toast ≥48 · soft pulse · 0 invent · 0 claim liên đới/đảng phái/buff/thay mục vụ · no QR/Xu · no sexy/Elara · phân biệt commonGood · humanDignity · preferentialOption · subsidiarity · worksOfMercy · charity ===== */
#toast.toast-solidarity-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-solidarity-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-solidarity-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-solidarity-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #403 — subsidiarity / Nguyên tắc bổ trợ open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=bổ trợ/subsidiarity/đảng phái/buff/thay mục vụ/hiến pháp · phân biệt solidarity/#401+#402 · commonGood/#399+#400 · humanDignity/#397+#398 · preferentialOption · localChurch · peopleOfGod · worksOfMercy ===== */
@keyframes subsidiarity-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.subsidiarity-open-pulse,
#library-modal #library-detail .lib-line-actions.subsidiarity-open-pulse,
#library-modal #library-detail > p.subsidiarity-open-pulse,
#library-modal #library-related.subsidiarity-open-pulse,
#library-modal .lib-related.subsidiarity-open-pulse,
#library-modal .lib-related-btn.subsidiarity-open-pulse,
#library-modal .lib-group-chip.subsidiarity-open-pulse {
  animation: subsidiarity-open-pulse 0.65s ease;
}
#library-modal #library-line-back.subsidiarity-open-pulse-static,
#library-modal #library-detail .lib-line-actions.subsidiarity-open-pulse-static,
#library-modal #library-detail > p.subsidiarity-open-pulse-static,
#library-modal #library-related.subsidiarity-open-pulse-static,
#library-modal .lib-related.subsidiarity-open-pulse-static,
#library-modal .lib-related-btn.subsidiarity-open-pulse-static,
#library-modal .lib-group-chip.subsidiarity-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="subsidiarity"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="subsidiarity"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="subsidiarity"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.subsidiarity-open-pulse,
  #library-modal #library-detail .lib-line-actions.subsidiarity-open-pulse,
  #library-modal #library-detail > p.subsidiarity-open-pulse,
  #library-modal #library-related.subsidiarity-open-pulse,
  #library-modal .lib-related.subsidiarity-open-pulse,
  #library-modal .lib-related-btn.subsidiarity-open-pulse,
  #library-modal .lib-group-chip.subsidiarity-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #404 — subsidiarity soft tip «Nguyên tắc bổ trợ» toast ≥48 · soft pulse · 0 invent · 0 claim bổ trợ/đảng phái/buff/thay mục vụ/hiến pháp · no QR/Xu · no sexy/Elara · phân biệt solidarity · commonGood · humanDignity · preferentialOption · localChurch · peopleOfGod ===== */
#toast.toast-subsidiarity-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-subsidiarity-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-subsidiarity-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-subsidiarity-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #405 — sunday / Chúa Nhật — Ngày Chúa open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent Ordo/Mass · 0 claim app=Thánh Lễ/thay Chúa nhật tại giáo xứ/công đức · phân biệt mass/#261+#262 · Mass-prep/#196 · iteMissaEst/#339+#340 · commandments · vocation · subsidiarity/#403+#404 · solidarity · localChurch · eucharist ===== */
@keyframes sunday-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.sunday-open-pulse,
#library-modal #library-detail .lib-line-actions.sunday-open-pulse,
#library-modal #library-detail > p.sunday-open-pulse,
#library-modal #library-related.sunday-open-pulse,
#library-modal .lib-related.sunday-open-pulse,
#library-modal .lib-related-btn.sunday-open-pulse,
#library-modal .lib-group-chip.sunday-open-pulse {
  animation: sunday-open-pulse 0.65s ease;
}
#library-modal #library-line-back.sunday-open-pulse-static,
#library-modal #library-detail .lib-line-actions.sunday-open-pulse-static,
#library-modal #library-detail > p.sunday-open-pulse-static,
#library-modal #library-related.sunday-open-pulse-static,
#library-modal .lib-related.sunday-open-pulse-static,
#library-modal .lib-related-btn.sunday-open-pulse-static,
#library-modal .lib-group-chip.sunday-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="sunday"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="sunday"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="sunday"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.sunday-open-pulse,
  #library-modal #library-detail .lib-line-actions.sunday-open-pulse,
  #library-modal #library-detail > p.sunday-open-pulse,
  #library-modal #library-related.sunday-open-pulse,
  #library-modal .lib-related.sunday-open-pulse,
  #library-modal .lib-related-btn.sunday-open-pulse,
  #library-modal .lib-group-chip.sunday-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #406 — sunday soft tip «Chúa nhật» toast ≥48 · soft pulse · 0 invent · 0 claim Thánh Lễ/công đức/thay giáo xứ · no QR/Xu · no sexy/Elara · phân biệt mass · Mass-prep · iteMissaEst · commandments · vocation · localChurch · subsidiarity/#404 · solidarity/#402 ===== */
#toast.toast-sunday-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sunday-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sunday-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sunday-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #407 — fastingAbstinence / Ăn chay · kiêng thịt open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent luật/ngày · 0 claim app=đếm ngày chay/Xu/thay luật giáo phận/công đức/gamify · phân biệt sunday/#405+#406 · communionFast · lent · penance · worksOfMercy · mass · Mass-prep ===== */
@keyframes fasting-abstinence-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.fasting-abstinence-open-pulse,
#library-modal #library-detail .lib-line-actions.fasting-abstinence-open-pulse,
#library-modal #library-detail > p.fasting-abstinence-open-pulse,
#library-modal #library-related.fasting-abstinence-open-pulse,
#library-modal .lib-related.fasting-abstinence-open-pulse,
#library-modal .lib-related-btn.fasting-abstinence-open-pulse,
#library-modal .lib-group-chip.fasting-abstinence-open-pulse {
  animation: fasting-abstinence-open-pulse 0.65s ease;
}
#library-modal #library-line-back.fasting-abstinence-open-pulse-static,
#library-modal #library-detail .lib-line-actions.fasting-abstinence-open-pulse-static,
#library-modal #library-detail > p.fasting-abstinence-open-pulse-static,
#library-modal #library-related.fasting-abstinence-open-pulse-static,
#library-modal .lib-related.fasting-abstinence-open-pulse-static,
#library-modal .lib-related-btn.fasting-abstinence-open-pulse-static,
#library-modal .lib-group-chip.fasting-abstinence-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="fastingAbstinence"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="fastingAbstinence"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="fastingAbstinence"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.fasting-abstinence-open-pulse,
  #library-modal #library-detail .lib-line-actions.fasting-abstinence-open-pulse,
  #library-modal #library-detail > p.fasting-abstinence-open-pulse,
  #library-modal #library-related.fasting-abstinence-open-pulse,
  #library-modal .lib-related.fasting-abstinence-open-pulse,
  #library-modal .lib-related-btn.fasting-abstinence-open-pulse,
  #library-modal .lib-group-chip.fasting-abstinence-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #408 — fastingAbstinence soft tip «Ăn chay · kiêng thịt» toast ≥48 · soft pulse · 0 invent · 0 claim đếm ngày chay/Xu/thay luật giáo phận/công đức/gamify · no QR/Xu · no sexy/Elara · phân biệt communionFast · lent · penance · sunday · worksOfMercy · sunday/#406 · subsidiarity/#404 ===== */
#toast.toast-fasting-abstinence-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-fasting-abstinence-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-fasting-abstinence-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-fasting-abstinence-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #409 — communionFast / Ăn chay trước rước lễ open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent luật/CIC · 0 claim app=rước lễ/thay giáo luật/mở khóa Hiệp lễ/công đức/gamify · phân biệt fastingAbstinence/#407+#408 · holyCommunion/#259+#260 · eucharist · mass · sunday/#405+#406 · penance ===== */
@keyframes communion-fast-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.communion-fast-open-pulse,
#library-modal #library-detail .lib-line-actions.communion-fast-open-pulse,
#library-modal #library-detail > p.communion-fast-open-pulse,
#library-modal #library-related.communion-fast-open-pulse,
#library-modal .lib-related.communion-fast-open-pulse,
#library-modal .lib-related-btn.communion-fast-open-pulse,
#library-modal .lib-group-chip.communion-fast-open-pulse {
  animation: communion-fast-open-pulse 0.65s ease;
}
#library-modal #library-line-back.communion-fast-open-pulse-static,
#library-modal #library-detail .lib-line-actions.communion-fast-open-pulse-static,
#library-modal #library-detail > p.communion-fast-open-pulse-static,
#library-modal #library-related.communion-fast-open-pulse-static,
#library-modal .lib-related.communion-fast-open-pulse-static,
#library-modal .lib-related-btn.communion-fast-open-pulse-static,
#library-modal .lib-group-chip.communion-fast-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="communionFast"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="communionFast"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="communionFast"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.communion-fast-open-pulse,
  #library-modal #library-detail .lib-line-actions.communion-fast-open-pulse,
  #library-modal #library-detail > p.communion-fast-open-pulse,
  #library-modal #library-related.communion-fast-open-pulse,
  #library-modal .lib-related.communion-fast-open-pulse,
  #library-modal .lib-related-btn.communion-fast-open-pulse,
  #library-modal .lib-group-chip.communion-fast-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #411 — evangelization / Truyền giáo open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=truyền giáo/thay mục vụ/spam/công đức/gamify · phân biệt newEvangelization · vocation · iteMissaEst · worksOfMercy · charity · localChurch · communionFast/#409+#410 · sunday ===== */
@keyframes evangelization-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.evangelization-open-pulse,
#library-modal #library-detail .lib-line-actions.evangelization-open-pulse,
#library-modal #library-detail > p.evangelization-open-pulse,
#library-modal #library-related.evangelization-open-pulse,
#library-modal .lib-related.evangelization-open-pulse,
#library-modal .lib-related-btn.evangelization-open-pulse,
#library-modal .lib-group-chip.evangelization-open-pulse {
  animation: evangelization-open-pulse 0.65s ease;
}
#library-modal #library-line-back.evangelization-open-pulse-static,
#library-modal #library-detail .lib-line-actions.evangelization-open-pulse-static,
#library-modal #library-detail > p.evangelization-open-pulse-static,
#library-modal #library-related.evangelization-open-pulse-static,
#library-modal .lib-related.evangelization-open-pulse-static,
#library-modal .lib-related-btn.evangelization-open-pulse-static,
#library-modal .lib-group-chip.evangelization-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="evangelization"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="evangelization"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="evangelization"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.evangelization-open-pulse,
  #library-modal #library-detail .lib-line-actions.evangelization-open-pulse,
  #library-modal #library-detail > p.evangelization-open-pulse,
  #library-modal #library-related.evangelization-open-pulse,
  #library-modal .lib-related.evangelization-open-pulse,
  #library-modal .lib-related-btn.evangelization-open-pulse,
  #library-modal .lib-group-chip.evangelization-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #410 — communionFast soft tip «Ăn chay trước rước lễ» toast ≥48 · soft pulse · 0 invent · 0 claim rước lễ/thay giáo luật/công đức/gamify · no QR/Xu · no sexy/Elara · phân biệt fastingAbstinence · holyCommunion · eucharist · mass · sunday · fastingAbstinence/#408 · sunday/#406 ===== */
#toast.toast-communion-fast-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-communion-fast-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-communion-fast-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-communion-fast-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #412 — evangelization soft tip «Loan báo Tin Mừng» toast ≥48 · soft pulse · 0 invent · 0 claim truyền giáo/spam/công đức/thay mục vụ · no QR/Xu · no sexy/Elara · phân biệt newEvangelization · vocation · iteMissaEst · worksOfMercy · charity · localChurch · communionFast/#410 · fastingAbstinence/#408 ===== */
#toast.toast-evangelization-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-evangelization-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-evangelization-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-evangelization-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #413 — newEvangelization / Tân Phúc Âm hóa open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=tân phúc âm hóa/thay mục vụ/spam/công đức/gamify · phân biệt evangelization/#411+#412 · vocation · conversion · localChurch · eucharist · divineMercy · faith · iteMissaEst ===== */
@keyframes new-evangelization-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.new-evangelization-open-pulse,
#library-modal #library-detail .lib-line-actions.new-evangelization-open-pulse,
#library-modal #library-detail > p.new-evangelization-open-pulse,
#library-modal #library-related.new-evangelization-open-pulse,
#library-modal .lib-related.new-evangelization-open-pulse,
#library-modal .lib-related-btn.new-evangelization-open-pulse,
#library-modal .lib-group-chip.new-evangelization-open-pulse {
  animation: new-evangelization-open-pulse 0.65s ease;
}
#library-modal #library-line-back.new-evangelization-open-pulse-static,
#library-modal #library-detail .lib-line-actions.new-evangelization-open-pulse-static,
#library-modal #library-detail > p.new-evangelization-open-pulse-static,
#library-modal #library-related.new-evangelization-open-pulse-static,
#library-modal .lib-related.new-evangelization-open-pulse-static,
#library-modal .lib-related-btn.new-evangelization-open-pulse-static,
#library-modal .lib-group-chip.new-evangelization-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="newEvangelization"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="newEvangelization"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="newEvangelization"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.new-evangelization-open-pulse,
  #library-modal #library-detail .lib-line-actions.new-evangelization-open-pulse,
  #library-modal #library-detail > p.new-evangelization-open-pulse,
  #library-modal #library-related.new-evangelization-open-pulse,
  #library-modal .lib-related.new-evangelization-open-pulse,
  #library-modal .lib-related-btn.new-evangelization-open-pulse,
  #library-modal .lib-group-chip.new-evangelization-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #414 — newEvangelization soft tip «Tân Phúc Âm hóa» toast ≥48 · soft pulse · 0 invent · 0 claim spam/công đức/thay mục vụ · no QR/Xu · no sexy/Elara · phân biệt evangelization · vocation · conversion · localChurch · divineMercy · faith · evangelization/#412 · communionFast/#410 ===== */
#toast.toast-new-evangelization-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-new-evangelization-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-new-evangelization-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-new-evangelization-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #415 — saintJoseph / Thánh Giuse open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=cầu bầu thay giáo xứ/công đức/gamify · phân biệt holyFamily · mary · jesus · vocation · matrimony · newEvangelization/#413+#414 · evangelization · tip #153 feast (library-card riêng) ===== */
@keyframes saint-joseph-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.saint-joseph-open-pulse,
#library-modal #library-detail .lib-line-actions.saint-joseph-open-pulse,
#library-modal #library-detail > p.saint-joseph-open-pulse,
#library-modal #library-related.saint-joseph-open-pulse,
#library-modal .lib-related.saint-joseph-open-pulse,
#library-modal .lib-related-btn.saint-joseph-open-pulse,
#library-modal .lib-group-chip.saint-joseph-open-pulse {
  animation: saint-joseph-open-pulse 0.65s ease;
}
#library-modal #library-line-back.saint-joseph-open-pulse-static,
#library-modal #library-detail .lib-line-actions.saint-joseph-open-pulse-static,
#library-modal #library-detail > p.saint-joseph-open-pulse-static,
#library-modal #library-related.saint-joseph-open-pulse-static,
#library-modal .lib-related.saint-joseph-open-pulse-static,
#library-modal .lib-related-btn.saint-joseph-open-pulse-static,
#library-modal .lib-group-chip.saint-joseph-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="saintJoseph"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="saintJoseph"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="saintJoseph"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.saint-joseph-open-pulse,
  #library-modal #library-detail .lib-line-actions.saint-joseph-open-pulse,
  #library-modal #library-detail > p.saint-joseph-open-pulse,
  #library-modal #library-related.saint-joseph-open-pulse,
  #library-modal .lib-related.saint-joseph-open-pulse,
  #library-modal .lib-related-btn.saint-joseph-open-pulse,
  #library-modal .lib-group-chip.saint-joseph-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #417 — conscience / Lương tâm open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=lương tâm/thay xét mình/Giải tội/checklist gamify/công đức · phân biệt examinationOfConscience/#281+#282 · particularExamen/#291+#292 · penance · freeWill · commandments · humanDignity · saintJoseph/#415+#416 ===== */
@keyframes conscience-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.conscience-open-pulse,
#library-modal #library-detail .lib-line-actions.conscience-open-pulse,
#library-modal #library-detail > p.conscience-open-pulse,
#library-modal #library-related.conscience-open-pulse,
#library-modal .lib-related.conscience-open-pulse,
#library-modal .lib-related-btn.conscience-open-pulse,
#library-modal .lib-group-chip.conscience-open-pulse {
  animation: conscience-open-pulse 0.65s ease;
}
#library-modal #library-line-back.conscience-open-pulse-static,
#library-modal #library-detail .lib-line-actions.conscience-open-pulse-static,
#library-modal #library-detail > p.conscience-open-pulse-static,
#library-modal #library-related.conscience-open-pulse-static,
#library-modal .lib-related.conscience-open-pulse-static,
#library-modal .lib-related-btn.conscience-open-pulse-static,
#library-modal .lib-group-chip.conscience-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="conscience"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="conscience"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="conscience"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.conscience-open-pulse,
  #library-modal #library-detail .lib-line-actions.conscience-open-pulse,
  #library-modal #library-detail > p.conscience-open-pulse,
  #library-modal #library-related.conscience-open-pulse,
  #library-modal .lib-related.conscience-open-pulse,
  #library-modal .lib-related-btn.conscience-open-pulse,
  #library-modal .lib-group-chip.conscience-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #419 — graceAndSin / Ơn thánh và tội open feel · sticky Về kho/related/title/chip Đời sống ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=xá giải/chấm tội/moralize game/công đức/thay Hòa giải·Rửa tội tại giáo xứ · phân biệt conscience/#417+#418 · examinationOfConscience/#281+#282 · penance · baptism · mortalSin/sanctifyingGrace · theologicalVirtues · actOfContrition ===== */
@keyframes grace-and-sin-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.grace-and-sin-open-pulse,
#library-modal #library-detail .lib-line-actions.grace-and-sin-open-pulse,
#library-modal #library-detail > p.grace-and-sin-open-pulse,
#library-modal #library-related.grace-and-sin-open-pulse,
#library-modal .lib-related.grace-and-sin-open-pulse,
#library-modal .lib-related-btn.grace-and-sin-open-pulse,
#library-modal .lib-group-chip.grace-and-sin-open-pulse {
  animation: grace-and-sin-open-pulse 0.65s ease;
}
#library-modal #library-line-back.grace-and-sin-open-pulse-static,
#library-modal #library-detail .lib-line-actions.grace-and-sin-open-pulse-static,
#library-modal #library-detail > p.grace-and-sin-open-pulse-static,
#library-modal #library-related.grace-and-sin-open-pulse-static,
#library-modal .lib-related.grace-and-sin-open-pulse-static,
#library-modal .lib-related-btn.grace-and-sin-open-pulse-static,
#library-modal .lib-group-chip.grace-and-sin-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="graceAndSin"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="graceAndSin"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="graceAndSin"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.grace-and-sin-open-pulse,
  #library-modal #library-detail .lib-line-actions.grace-and-sin-open-pulse,
  #library-modal #library-detail > p.grace-and-sin-open-pulse,
  #library-modal #library-related.grace-and-sin-open-pulse,
  #library-modal .lib-related.grace-and-sin-open-pulse,
  #library-modal .lib-related-btn.grace-and-sin-open-pulse,
  #library-modal .lib-group-chip.grace-and-sin-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #416 — saintJoseph soft tip «Thánh Giuse» toast ≥48 · soft pulse · 0 invent · 0 claim công đức/thay cầu bầu giáo xứ · no QR/Xu · no sexy/Elara · phân biệt holyFamily · mary · jesus · vocation · matrimony · #153 · yield newEvangelization/#414 · evangelization/#412 ===== */
#toast.toast-saint-joseph-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-saint-joseph-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-saint-joseph-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-saint-joseph-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #418 — conscience soft tip «Lương tâm» toast ≥48 · soft pulse · 0 invent · 0 claim lương tâm/Giải tội/checklist gamify/công đức · no QR/Xu · no sexy/Elara · phân biệt examinationOfConscience · particularExamen · penance · freeWill · commandments · yield saintJoseph/#416 · newEvangelization/#414 · evangelization/#412 · fastingAbstinence/#408 · sunday/#406 · examination/#282 · particularExamen/#292 · commandments/#392 ===== */
#toast.toast-conscience-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-conscience-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-conscience-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-conscience-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #420 — graceAndSin soft tip «Ơn thánh và tội» toast ≥48 · soft pulse · 0 invent · 0 claim xá giải/chấm tội/moralize game/công đức/thay Hòa giải·Rửa tội · no QR/Xu · no sexy/Elara · phân biệt examinationOfConscience · particularExamen · penance · baptism · conscience · yield conscience/#418 · saintJoseph/#416 · newEvangelization/#414 · evangelization/#412 · fastingAbstinence/#408 · sunday/#406 · examination/#282 · particularExamen/#292 · penance/#274 · commandments/#392 ===== */
#toast.toast-grace-and-sin-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-grace-and-sin-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-grace-and-sin-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-grace-and-sin-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #421 — freeWill / Tự do ý chí open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=tự do tuyệt đối/thay phân định lương tâm·linh hướng/buff·skill/công đức/dọa sợ · phân biệt graceAndSin/#419+#420 · conscience/#417+#418 · humanDignity · commandments · mortalSin · actualGrace · vocation · temperance ===== */
@keyframes free-will-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.free-will-open-pulse,
#library-modal #library-detail .lib-line-actions.free-will-open-pulse,
#library-modal #library-detail > p.free-will-open-pulse,
#library-modal #library-related.free-will-open-pulse,
#library-modal .lib-related.free-will-open-pulse,
#library-modal .lib-related-btn.free-will-open-pulse,
#library-modal .lib-group-chip.free-will-open-pulse {
  animation: free-will-open-pulse 0.65s ease;
}
#library-modal #library-line-back.free-will-open-pulse-static,
#library-modal #library-detail .lib-line-actions.free-will-open-pulse-static,
#library-modal #library-detail > p.free-will-open-pulse-static,
#library-modal #library-related.free-will-open-pulse-static,
#library-modal .lib-related.free-will-open-pulse-static,
#library-modal .lib-related-btn.free-will-open-pulse-static,
#library-modal .lib-group-chip.free-will-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="freeWill"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="freeWill"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="freeWill"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.free-will-open-pulse,
  #library-modal #library-detail .lib-line-actions.free-will-open-pulse,
  #library-modal #library-detail > p.free-will-open-pulse,
  #library-modal #library-related.free-will-open-pulse,
  #library-modal .lib-related.free-will-open-pulse,
  #library-modal .lib-related-btn.free-will-open-pulse,
  #library-modal .lib-group-chip.free-will-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #423 — conversion / Hoán cải open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=xá giải/thay Giải tội·linh mục/công đức/dọa sợ/gore/buff · phân biệt freeWill/#421+#422 · graceAndSin/#419+#420 · penance · baptism · actualGrace · divineMercy · mortalSin · actOfContrition · examinationOfConscience ===== */
@keyframes conversion-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.conversion-open-pulse,
#library-modal #library-detail .lib-line-actions.conversion-open-pulse,
#library-modal #library-detail > p.conversion-open-pulse,
#library-modal #library-related.conversion-open-pulse,
#library-modal .lib-related.conversion-open-pulse,
#library-modal .lib-related-btn.conversion-open-pulse,
#library-modal .lib-group-chip.conversion-open-pulse {
  animation: conversion-open-pulse 0.65s ease;
}
#library-modal #library-line-back.conversion-open-pulse-static,
#library-modal #library-detail .lib-line-actions.conversion-open-pulse-static,
#library-modal #library-detail > p.conversion-open-pulse-static,
#library-modal #library-related.conversion-open-pulse-static,
#library-modal .lib-related.conversion-open-pulse-static,
#library-modal .lib-related-btn.conversion-open-pulse-static,
#library-modal .lib-group-chip.conversion-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="conversion"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="conversion"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="conversion"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.conversion-open-pulse,
  #library-modal #library-detail .lib-line-actions.conversion-open-pulse,
  #library-modal #library-detail > p.conversion-open-pulse,
  #library-modal #library-related.conversion-open-pulse,
  #library-modal .lib-related.conversion-open-pulse,
  #library-modal .lib-related-btn.conversion-open-pulse,
  #library-modal .lib-group-chip.conversion-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #425 — temptation / Cám dỗ open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=checklist gamify cám dỗ/tội vì bị cám dỗ/buff/công đức/dọa sợ/gore · phân biệt conversion/#423+#424 · freeWill/#421+#422 · graceAndSin · ourFather · actualGrace · conscience · jesus · lent · mortalSin (cám dỗ ≠ tội) ===== */
@keyframes temptation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.temptation-open-pulse,
#library-modal #library-detail .lib-line-actions.temptation-open-pulse,
#library-modal #library-detail > p.temptation-open-pulse,
#library-modal #library-related.temptation-open-pulse,
#library-modal .lib-related.temptation-open-pulse,
#library-modal .lib-related-btn.temptation-open-pulse,
#library-modal .lib-group-chip.temptation-open-pulse {
  animation: temptation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.temptation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.temptation-open-pulse-static,
#library-modal #library-detail > p.temptation-open-pulse-static,
#library-modal #library-related.temptation-open-pulse-static,
#library-modal .lib-related.temptation-open-pulse-static,
#library-modal .lib-related-btn.temptation-open-pulse-static,
#library-modal .lib-group-chip.temptation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="temptation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="temptation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="temptation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.temptation-open-pulse,
  #library-modal #library-detail .lib-line-actions.temptation-open-pulse,
  #library-modal #library-detail > p.temptation-open-pulse,
  #library-modal #library-related.temptation-open-pulse,
  #library-modal .lib-related.temptation-open-pulse,
  #library-modal .lib-related-btn.temptation-open-pulse,
  #library-modal .lib-group-chip.temptation-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #427 — merit / Công trạng open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=điểm thưởng mua ơn/Xu/paywall/Pelagian tự cứu/công đức gamify/buff skill tree · no QR/Xu · no sexy/Elara · phân biệt temptation/#425+#426 · conversion/#423+#424 · freeWill · justification · sanctifyingGrace · theologicalVirtues · charity · graceAndSin · yield soft tip #428 paired (CACHE bump once here) ===== */
@keyframes merit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.merit-open-pulse,
#library-modal #library-detail .lib-line-actions.merit-open-pulse,
#library-modal #library-detail > p.merit-open-pulse,
#library-modal #library-related.merit-open-pulse,
#library-modal .lib-related.merit-open-pulse,
#library-modal .lib-related-btn.merit-open-pulse,
#library-modal .lib-group-chip.merit-open-pulse {
  animation: merit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.merit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.merit-open-pulse-static,
#library-modal #library-detail > p.merit-open-pulse-static,
#library-modal #library-related.merit-open-pulse-static,
#library-modal .lib-related.merit-open-pulse-static,
#library-modal .lib-related-btn.merit-open-pulse-static,
#library-modal .lib-group-chip.merit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="merit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="merit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="merit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.merit-open-pulse,
  #library-modal #library-detail .lib-line-actions.merit-open-pulse,
  #library-modal #library-detail > p.merit-open-pulse,
  #library-modal #library-related.merit-open-pulse,
  #library-modal .lib-related.merit-open-pulse,
  #library-modal .lib-related-btn.merit-open-pulse,
  #library-modal .lib-group-chip.merit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #429 — callToHoliness / Ơn gọi nên thánh open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=thay phân định ơn gọi giáo xứ / quiz nghề / buff / công đức gamify / chỉ dành cho tu sĩ · no QR/Xu · no sexy/Elara · phân biệt merit/#427+#428 · temptation/#425+#426 · vocation · baptism · peopleOfGod · theologicalVirtues · charity · pilgrimChurch · yield soft tip #430 paired (CACHE bump once here) ===== */
@keyframes call-to-holiness-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.call-to-holiness-open-pulse,
#library-modal #library-detail .lib-line-actions.call-to-holiness-open-pulse,
#library-modal #library-detail > p.call-to-holiness-open-pulse,
#library-modal #library-related.call-to-holiness-open-pulse,
#library-modal .lib-related.call-to-holiness-open-pulse,
#library-modal .lib-related-btn.call-to-holiness-open-pulse,
#library-modal .lib-group-chip.call-to-holiness-open-pulse {
  animation: call-to-holiness-open-pulse 0.65s ease;
}
#library-modal #library-line-back.call-to-holiness-open-pulse-static,
#library-modal #library-detail .lib-line-actions.call-to-holiness-open-pulse-static,
#library-modal #library-detail > p.call-to-holiness-open-pulse-static,
#library-modal #library-related.call-to-holiness-open-pulse-static,
#library-modal .lib-related.call-to-holiness-open-pulse-static,
#library-modal .lib-related-btn.call-to-holiness-open-pulse-static,
#library-modal .lib-group-chip.call-to-holiness-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="callToHoliness"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="callToHoliness"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="callToHoliness"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.call-to-holiness-open-pulse,
  #library-modal #library-detail .lib-line-actions.call-to-holiness-open-pulse,
  #library-modal #library-detail > p.call-to-holiness-open-pulse,
  #library-modal #library-related.call-to-holiness-open-pulse,
  #library-modal .lib-related.call-to-holiness-open-pulse,
  #library-modal .lib-related-btn.call-to-holiness-open-pulse,
  #library-modal .lib-group-chip.call-to-holiness-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #431 — divineFiliation / Làm nghĩa tử open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=thay Rửa tội / tự nhận làm con ngoài bí tích / buff nghĩa tử / công đức gamify · no QR/Xu · no sexy/Elara · phân biệt callToHoliness/#429+#430 · merit/#427+#428 · baptism · sanctifyingGrace · justification · trinity · ourFather · templeOfHolySpirit · indwellingOfSpirit · yield soft tip #432 paired (CACHE bump once here) ===== */
@keyframes divine-filiation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.divine-filiation-open-pulse,
#library-modal #library-detail .lib-line-actions.divine-filiation-open-pulse,
#library-modal #library-detail > p.divine-filiation-open-pulse,
#library-modal #library-related.divine-filiation-open-pulse,
#library-modal .lib-related.divine-filiation-open-pulse,
#library-modal .lib-related-btn.divine-filiation-open-pulse,
#library-modal .lib-group-chip.divine-filiation-open-pulse {
  animation: divine-filiation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.divine-filiation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.divine-filiation-open-pulse-static,
#library-modal #library-detail > p.divine-filiation-open-pulse-static,
#library-modal #library-related.divine-filiation-open-pulse-static,
#library-modal .lib-related.divine-filiation-open-pulse-static,
#library-modal .lib-related-btn.divine-filiation-open-pulse-static,
#library-modal .lib-group-chip.divine-filiation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="divineFiliation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="divineFiliation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="divineFiliation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.divine-filiation-open-pulse,
  #library-modal #library-detail .lib-line-actions.divine-filiation-open-pulse,
  #library-modal #library-detail > p.divine-filiation-open-pulse,
  #library-modal #library-related.divine-filiation-open-pulse,
  #library-modal .lib-related.divine-filiation-open-pulse,
  #library-modal .lib-related-btn.divine-filiation-open-pulse,
  #library-modal .lib-group-chip.divine-filiation-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #433 — indwellingOfSpirit / Thánh Thần ngự trong open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=cảm nhận Thánh Thần giả lập / phong trào giả / thay Rửa tội / buff / công đức gamify · no QR/Xu · no sexy/Elara · phân biệt divineFiliation/#431+#432 · callToHoliness/#429+#430 · holySpirit · templeOfHolySpirit (Hội Thánh/cộng đoàn) vs ngự trị cá nhân · baptism · giftsOfHolySpirit · fruitsOfHolySpirit · yield soft tip #434 paired (CACHE bump once here) ===== */
@keyframes indwelling-of-spirit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.indwelling-of-spirit-open-pulse,
#library-modal #library-detail .lib-line-actions.indwelling-of-spirit-open-pulse,
#library-modal #library-detail > p.indwelling-of-spirit-open-pulse,
#library-modal #library-related.indwelling-of-spirit-open-pulse,
#library-modal .lib-related.indwelling-of-spirit-open-pulse,
#library-modal .lib-related-btn.indwelling-of-spirit-open-pulse,
#library-modal .lib-group-chip.indwelling-of-spirit-open-pulse {
  animation: indwelling-of-spirit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.indwelling-of-spirit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.indwelling-of-spirit-open-pulse-static,
#library-modal #library-detail > p.indwelling-of-spirit-open-pulse-static,
#library-modal #library-related.indwelling-of-spirit-open-pulse-static,
#library-modal .lib-related.indwelling-of-spirit-open-pulse-static,
#library-modal .lib-related-btn.indwelling-of-spirit-open-pulse-static,
#library-modal .lib-group-chip.indwelling-of-spirit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="indwellingOfSpirit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="indwellingOfSpirit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="indwellingOfSpirit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.indwelling-of-spirit-open-pulse,
  #library-modal #library-detail .lib-line-actions.indwelling-of-spirit-open-pulse,
  #library-modal #library-detail > p.indwelling-of-spirit-open-pulse,
  #library-modal #library-related.indwelling-of-spirit-open-pulse,
  #library-modal .lib-related.indwelling-of-spirit-open-pulse,
  #library-modal .lib-related-btn.indwelling-of-spirit-open-pulse,
  #library-modal .lib-group-chip.indwelling-of-spirit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #435 — originalSin / Tội tổ tông open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=thay Rửa tội/Giải tội / đổ lỗi trẻ nhỏ / dọa sợ / gore / buff / công đức gamify · mục vụ: không đổ lỗi máy móc cho trẻ nhỏ · no QR/Xu · no sexy/Elara · phân biệt indwellingOfSpirit/#433+#434 · divineFiliation/#431+#432 · baptism · graceAndSin · creation · incarnation · humanDignity · mortalSin · redemption · yield soft tip #436 paired (CACHE bump once here) ===== */
@keyframes original-sin-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.original-sin-open-pulse,
#library-modal #library-detail .lib-line-actions.original-sin-open-pulse,
#library-modal #library-detail > p.original-sin-open-pulse,
#library-modal #library-related.original-sin-open-pulse,
#library-modal .lib-related.original-sin-open-pulse,
#library-modal .lib-related-btn.original-sin-open-pulse,
#library-modal .lib-group-chip.original-sin-open-pulse {
  animation: original-sin-open-pulse 0.65s ease;
}
#library-modal #library-line-back.original-sin-open-pulse-static,
#library-modal #library-detail .lib-line-actions.original-sin-open-pulse-static,
#library-modal #library-detail > p.original-sin-open-pulse-static,
#library-modal #library-related.original-sin-open-pulse-static,
#library-modal .lib-related.original-sin-open-pulse-static,
#library-modal .lib-related-btn.original-sin-open-pulse-static,
#library-modal .lib-group-chip.original-sin-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="originalSin"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="originalSin"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="originalSin"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.original-sin-open-pulse,
  #library-modal #library-detail .lib-line-actions.original-sin-open-pulse,
  #library-modal #library-detail > p.original-sin-open-pulse,
  #library-modal #library-related.original-sin-open-pulse,
  #library-modal .lib-related.original-sin-open-pulse,
  #library-modal .lib-related-btn.original-sin-open-pulse,
  #library-modal .lib-group-chip.original-sin-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #437 — redemption / Công cuộc cứu độ open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=cử hành bí tích / thay Thánh Lễ / Pelagian tự cứu / gore thập giá / buff / công đức gamify · thập giá = thương xót, không thất bại · no QR/Xu · no sexy/Elara · phân biệt originalSin/#435+#436 · indwellingOfSpirit/#433+#434 · paschalMystery · jesus · incarnation · graceAndSin · eucharist · baptism · justification · yield soft tip #438 paired (CACHE bump once here) ===== */
@keyframes redemption-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.redemption-open-pulse,
#library-modal #library-detail .lib-line-actions.redemption-open-pulse,
#library-modal #library-detail > p.redemption-open-pulse,
#library-modal #library-related.redemption-open-pulse,
#library-modal .lib-related.redemption-open-pulse,
#library-modal .lib-related-btn.redemption-open-pulse,
#library-modal .lib-group-chip.redemption-open-pulse {
  animation: redemption-open-pulse 0.65s ease;
}
#library-modal #library-line-back.redemption-open-pulse-static,
#library-modal #library-detail .lib-line-actions.redemption-open-pulse-static,
#library-modal #library-detail > p.redemption-open-pulse-static,
#library-modal #library-related.redemption-open-pulse-static,
#library-modal .lib-related.redemption-open-pulse-static,
#library-modal .lib-related-btn.redemption-open-pulse-static,
#library-modal .lib-group-chip.redemption-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="redemption"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="redemption"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="redemption"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.redemption-open-pulse,
  #library-modal #library-detail .lib-line-actions.redemption-open-pulse,
  #library-modal #library-detail > p.redemption-open-pulse,
  #library-modal #library-related.redemption-open-pulse,
  #library-modal .lib-related.redemption-open-pulse,
  #library-modal .lib-related-btn.redemption-open-pulse,
  #library-modal .lib-group-chip.redemption-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #439 — justification / Công chính hóa open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=thay bí tích / Pelagian tự cứu / buff / công đức gamify / «tự giúp mình» · no QR/Xu · no sexy/Elara · phân biệt redemption/#437+#438 · originalSin/#435+#436 · graceAndSin · baptism · paschalMystery · faith · sanctifyingGrace · merit · yield soft tip #440 paired (CACHE bump once here) ===== */
@keyframes justification-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.justification-open-pulse,
#library-modal #library-detail .lib-line-actions.justification-open-pulse,
#library-modal #library-detail > p.justification-open-pulse,
#library-modal #library-related.justification-open-pulse,
#library-modal .lib-related.justification-open-pulse,
#library-modal .lib-related-btn.justification-open-pulse,
#library-modal .lib-group-chip.justification-open-pulse {
  animation: justification-open-pulse 0.65s ease;
}
#library-modal #library-line-back.justification-open-pulse-static,
#library-modal #library-detail .lib-line-actions.justification-open-pulse-static,
#library-modal #library-detail > p.justification-open-pulse-static,
#library-modal #library-related.justification-open-pulse-static,
#library-modal .lib-related.justification-open-pulse-static,
#library-modal .lib-related-btn.justification-open-pulse-static,
#library-modal .lib-group-chip.justification-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="justification"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="justification"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="justification"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.justification-open-pulse,
  #library-modal #library-detail .lib-line-actions.justification-open-pulse,
  #library-modal #library-detail > p.justification-open-pulse,
  #library-modal #library-related.justification-open-pulse,
  #library-modal .lib-related.justification-open-pulse,
  #library-modal .lib-related-btn.justification-open-pulse,
  #library-modal .lib-group-chip.justification-open-pulse {
    animation: none !important;
  }
}




/* ===== Play-polish #441 — sanctifyingGrace / Ơn thánh hóa open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=bán ơn / gamify ân sủng / Xu / paywall / thay Giải tội / buff · no QR/Xu · no sexy/Elara · phân biệt actualGrace (ơn hiện sủng punctual) vs ơn thánh hóa thường trú · justification/#439+#440 · redemption/#437+#438 · graceAndSin · baptism · eucharist · theologicalVirtues · mortalSin · actualGrace · merit · yield soft tip #442 paired (CACHE bump once here) ===== */
@keyframes sanctifying-grace-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.sanctifying-grace-open-pulse,
#library-modal #library-detail .lib-line-actions.sanctifying-grace-open-pulse,
#library-modal #library-detail > p.sanctifying-grace-open-pulse,
#library-modal #library-related.sanctifying-grace-open-pulse,
#library-modal .lib-related.sanctifying-grace-open-pulse,
#library-modal .lib-related-btn.sanctifying-grace-open-pulse,
#library-modal .lib-group-chip.sanctifying-grace-open-pulse {
  animation: sanctifying-grace-open-pulse 0.65s ease;
}
#library-modal #library-line-back.sanctifying-grace-open-pulse-static,
#library-modal #library-detail .lib-line-actions.sanctifying-grace-open-pulse-static,
#library-modal #library-detail > p.sanctifying-grace-open-pulse-static,
#library-modal #library-related.sanctifying-grace-open-pulse-static,
#library-modal .lib-related.sanctifying-grace-open-pulse-static,
#library-modal .lib-related-btn.sanctifying-grace-open-pulse-static,
#library-modal .lib-group-chip.sanctifying-grace-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="sanctifyingGrace"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="sanctifyingGrace"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="sanctifyingGrace"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.sanctifying-grace-open-pulse,
  #library-modal #library-detail .lib-line-actions.sanctifying-grace-open-pulse,
  #library-modal #library-detail > p.sanctifying-grace-open-pulse,
  #library-modal #library-related.sanctifying-grace-open-pulse,
  #library-modal .lib-related.sanctifying-grace-open-pulse,
  #library-modal .lib-related-btn.sanctifying-grace-open-pulse,
  #library-modal .lib-group-chip.sanctifying-grace-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #443 — mortalSin / Tội trọng open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=xá giải / thay linh mục / checklist gamify tội / dọa trẻ / gore / buff · mục vụ: Thiên Chúa muốn thương xót hơn kết án · no QR/Xu · no sexy/Elara · phân biệt sanctifyingGrace/#441+#442 · justification/#439+#440 · graceAndSin · penance · conscience · examinationOfConscience · actOfContrition · venialSin · temptation (cám dỗ ≠ tội) · yield soft tip #444 paired (CACHE bump once here) ===== */
@keyframes mortal-sin-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.mortal-sin-open-pulse,
#library-modal #library-detail .lib-line-actions.mortal-sin-open-pulse,
#library-modal #library-detail > p.mortal-sin-open-pulse,
#library-modal #library-related.mortal-sin-open-pulse,
#library-modal .lib-related.mortal-sin-open-pulse,
#library-modal .lib-related-btn.mortal-sin-open-pulse,
#library-modal .lib-group-chip.mortal-sin-open-pulse {
  animation: mortal-sin-open-pulse 0.65s ease;
}
#library-modal #library-line-back.mortal-sin-open-pulse-static,
#library-modal #library-detail .lib-line-actions.mortal-sin-open-pulse-static,
#library-modal #library-detail > p.mortal-sin-open-pulse-static,
#library-modal #library-related.mortal-sin-open-pulse-static,
#library-modal .lib-related.mortal-sin-open-pulse-static,
#library-modal .lib-related-btn.mortal-sin-open-pulse-static,
#library-modal .lib-group-chip.mortal-sin-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="mortalSin"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="mortalSin"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="mortalSin"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.mortal-sin-open-pulse,
  #library-modal #library-detail .lib-line-actions.mortal-sin-open-pulse,
  #library-modal #library-detail > p.mortal-sin-open-pulse,
  #library-modal #library-related.mortal-sin-open-pulse,
  #library-modal .lib-related.mortal-sin-open-pulse,
  #library-modal .lib-related-btn.mortal-sin-open-pulse,
  #library-modal .lib-group-chip.mortal-sin-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #445 — venialSin / Tội nhẹ open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=xá giải / thay linh mục / checklist gamify tội / dọa trẻ / gore / buff · mục vụ: tội nhẹ làm yếu đức ái nhưng không phá hủy ơn thánh hóa như tội trọng; vẫn cần chiến đấu (xét mình · Thánh Thể · bác ái) · no QR/Xu · no sexy/Elara · phân biệt mortalSin/#443+#444 · sanctifyingGrace · graceAndSin · penance · examinationOfConscience · actOfContrition · temptation (cám dỗ ≠ tội) · actualGrace · yield soft tip #446 paired (CACHE bump once here) ===== */
@keyframes venial-sin-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.venial-sin-open-pulse,
#library-modal #library-detail .lib-line-actions.venial-sin-open-pulse,
#library-modal #library-detail > p.venial-sin-open-pulse,
#library-modal #library-related.venial-sin-open-pulse,
#library-modal .lib-related.venial-sin-open-pulse,
#library-modal .lib-related-btn.venial-sin-open-pulse,
#library-modal .lib-group-chip.venial-sin-open-pulse {
  animation: venial-sin-open-pulse 0.65s ease;
}
#library-modal #library-line-back.venial-sin-open-pulse-static,
#library-modal #library-detail .lib-line-actions.venial-sin-open-pulse-static,
#library-modal #library-detail > p.venial-sin-open-pulse-static,
#library-modal #library-related.venial-sin-open-pulse-static,
#library-modal .lib-related.venial-sin-open-pulse-static,
#library-modal .lib-related-btn.venial-sin-open-pulse-static,
#library-modal .lib-group-chip.venial-sin-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="venialSin"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="venialSin"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="venialSin"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.venial-sin-open-pulse,
  #library-modal #library-detail .lib-line-actions.venial-sin-open-pulse,
  #library-modal #library-detail > p.venial-sin-open-pulse,
  #library-modal #library-related.venial-sin-open-pulse,
  #library-modal .lib-related.venial-sin-open-pulse,
  #library-modal .lib-related-btn.venial-sin-open-pulse,
  #library-modal .lib-group-chip.venial-sin-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #447 — actualGrace / Ơn hiện tại open feel · sticky Về kho/related/title/chip Ơn thánh ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=bán ơn / đo điểm ân sủng / gamify / Xu / paywall / thay bí tích / buff · mục vụ: ơn hiện tại = trợ giúp thoáng qua của Thánh Thần; phân biệt rõ với ơn thánh hóa (thường trú) · no QR/Xu · no sexy/Elara · phân biệt sanctifyingGrace/#441+#442 · venialSin/#445+#446 · mortalSin/#443+#444 · graceAndSin · justification · freeWill · vocation · formsOfPrayer · yield soft tip #448 paired (CACHE bump once here) ===== */
@keyframes actual-grace-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.actual-grace-open-pulse,
#library-modal #library-detail .lib-line-actions.actual-grace-open-pulse,
#library-modal #library-detail > p.actual-grace-open-pulse,
#library-modal #library-related.actual-grace-open-pulse,
#library-modal .lib-related.actual-grace-open-pulse,
#library-modal .lib-related-btn.actual-grace-open-pulse,
#library-modal .lib-group-chip.actual-grace-open-pulse {
  animation: actual-grace-open-pulse 0.65s ease;
}
#library-modal #library-line-back.actual-grace-open-pulse-static,
#library-modal #library-detail .lib-line-actions.actual-grace-open-pulse-static,
#library-modal #library-detail > p.actual-grace-open-pulse-static,
#library-modal #library-related.actual-grace-open-pulse-static,
#library-modal .lib-related.actual-grace-open-pulse-static,
#library-modal .lib-related-btn.actual-grace-open-pulse-static,
#library-modal .lib-group-chip.actual-grace-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="actualGrace"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="actualGrace"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="actualGrace"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.actual-grace-open-pulse,
  #library-modal #library-detail .lib-line-actions.actual-grace-open-pulse,
  #library-modal #library-detail > p.actual-grace-open-pulse,
  #library-modal #library-related.actual-grace-open-pulse,
  #library-modal .lib-related.actual-grace-open-pulse,
  #library-modal .lib-related-btn.actual-grace-open-pulse,
  #library-modal .lib-group-chip.actual-grace-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #449 — creation / Thiên Chúa sáng tạo open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim app=bán tín chỉ carbon / invent kinh / thay Tin Kính giáo xứ / điểm xanh / gamify / Xu / paywall / buff · mục vụ: sáng tạo là ơn nhưng không; imago Dei; chăm sóc thụ tạo ≠ điểm xanh app · no QR/Xu · no sexy/Elara · phân biệt careForCreation/#395+#396 · originalSin/#435+#436 · trinity · creed · humanDignity · incarnation · scriptureTradition · actualGrace/#447+#448 · yield soft tip #450 paired (CACHE bump once here) ===== */
@keyframes creation-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.creation-open-pulse,
#library-modal #library-detail .lib-line-actions.creation-open-pulse,
#library-modal #library-detail > p.creation-open-pulse,
#library-modal #library-related.creation-open-pulse,
#library-modal .lib-related.creation-open-pulse,
#library-modal .lib-related-btn.creation-open-pulse,
#library-modal .lib-group-chip.creation-open-pulse {
  animation: creation-open-pulse 0.65s ease;
}
#library-modal #library-line-back.creation-open-pulse-static,
#library-modal #library-detail .lib-line-actions.creation-open-pulse-static,
#library-modal #library-detail > p.creation-open-pulse-static,
#library-modal #library-related.creation-open-pulse-static,
#library-modal .lib-related.creation-open-pulse-static,
#library-modal .lib-related-btn.creation-open-pulse-static,
#library-modal .lib-group-chip.creation-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="creation"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="creation"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="creation"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.creation-open-pulse,
  #library-modal #library-detail .lib-line-actions.creation-open-pulse,
  #library-modal #library-detail > p.creation-open-pulse,
  #library-modal #library-related.creation-open-pulse,
  #library-modal .lib-related.creation-open-pulse,
  #library-modal .lib-related-btn.creation-open-pulse,
  #library-modal .lib-group-chip.creation-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #451 — guardianAngel / Thiên thần bản mệnh open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent toàn văn kinh thiên thần bản mệnh · 0 claim NPC/linh vật · mục vụ: thiên thần bản mệnh ≠ tổng lãnh (archangels 29/9) ≠ các Thánh/linh hồn; lễ 2/10 trắng; app không invent kinh chính thức · no QR/Xu · no sexy/Elara · phân biệt creation/#449+#450 · archangels · communionOfSaints · allSouls · sacramentals · formsOfPrayer · tip lễ #158 (giữ, không phá) · yield soft tip #452 paired (CACHE bump once here) ===== */
@keyframes guardian-angel-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.guardian-angel-open-pulse,
#library-modal #library-detail .lib-line-actions.guardian-angel-open-pulse,
#library-modal #library-detail > p.guardian-angel-open-pulse,
#library-modal #library-related.guardian-angel-open-pulse,
#library-modal .lib-related.guardian-angel-open-pulse,
#library-modal .lib-related-btn.guardian-angel-open-pulse,
#library-modal .lib-group-chip.guardian-angel-open-pulse {
  animation: guardian-angel-open-pulse 0.65s ease;
}
#library-modal #library-line-back.guardian-angel-open-pulse-static,
#library-modal #library-detail .lib-line-actions.guardian-angel-open-pulse-static,
#library-modal #library-detail > p.guardian-angel-open-pulse-static,
#library-modal #library-related.guardian-angel-open-pulse-static,
#library-modal .lib-related.guardian-angel-open-pulse-static,
#library-modal .lib-related-btn.guardian-angel-open-pulse-static,
#library-modal .lib-group-chip.guardian-angel-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="guardianAngel"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="guardianAngel"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="guardianAngel"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.guardian-angel-open-pulse,
  #library-modal #library-detail .lib-line-actions.guardian-angel-open-pulse,
  #library-modal #library-detail > p.guardian-angel-open-pulse,
  #library-modal #library-related.guardian-angel-open-pulse,
  #library-modal .lib-related.guardian-angel-open-pulse,
  #library-modal .lib-related-btn.guardian-angel-open-pulse,
  #library-modal .lib-group-chip.guardian-angel-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #453 — archangels / Các Tổng Lãnh Thiên thần open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent toàn văn kinh Tổng Lãnh / kinh Mi-ca-e dài · 0 claim boss NPC · mục vụ: Tổng Lãnh 29/9 (Mi-ca-e·Gáp-ri-en·Ra-pha-en) ≠ thiên thần hộ thủ 2/10; ≠ các Thánh/linh hồn; ≠ á bí tích · no QR/Xu · no sexy/Elara · phân biệt guardianAngel/#451+#452 · creation/#449+#450 · communionOfSaints · allSouls · sacramentals · annunciation · tip lễ #160 (giữ, không phá) · yield soft tip #454 paired (CACHE bump once here) ===== */
@keyframes archangels-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.archangels-open-pulse,
#library-modal #library-detail .lib-line-actions.archangels-open-pulse,
#library-modal #library-detail > p.archangels-open-pulse,
#library-modal #library-related.archangels-open-pulse,
#library-modal .lib-related.archangels-open-pulse,
#library-modal .lib-related-btn.archangels-open-pulse,
#library-modal .lib-group-chip.archangels-open-pulse {
  animation: archangels-open-pulse 0.65s ease;
}
#library-modal #library-line-back.archangels-open-pulse-static,
#library-modal #library-detail .lib-line-actions.archangels-open-pulse-static,
#library-modal #library-detail > p.archangels-open-pulse-static,
#library-modal #library-related.archangels-open-pulse-static,
#library-modal .lib-related.archangels-open-pulse-static,
#library-modal .lib-related-btn.archangels-open-pulse-static,
#library-modal .lib-group-chip.archangels-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="archangels"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="archangels"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="archangels"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.archangels-open-pulse,
  #library-modal #library-detail .lib-line-actions.archangels-open-pulse,
  #library-modal #library-detail > p.archangels-open-pulse,
  #library-modal #library-related.archangels-open-pulse,
  #library-modal .lib-related.archangels-open-pulse,
  #library-modal .lib-related-btn.archangels-open-pulse,
  #library-modal .lib-group-chip.archangels-open-pulse {
    animation: none !important;
  }
}




/* ===== Play-polish #455 — scriptureTradition / Kinh Thánh và Thánh Truyền open feel · sticky Về kho/related/title/chip Nền tảng ≥48 · reduced-motion · empty honesty · 0 invent mặc khải · 0 paste CCC/NAB/CGKPV dài · 0 claim thay Magisterium / bài giảng giáo xứ · mục vụ: Kinh Thánh + Thánh Truyền cùng nguồn; Magisterium giải thích; app lectionary chỉ trỏ link đọc đủ · no QR/Xu · no sexy/Elara · phân biệt creed · mass · liturgyOfTheWord · readings/#204 · jesus · holySpirit · archangels/#453+#454 · creation/#449+#450 · yield soft tip #456 paired (CACHE bump once here) ===== */
@keyframes scripture-tradition-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.scripture-tradition-open-pulse,
#library-modal #library-detail .lib-line-actions.scripture-tradition-open-pulse,
#library-modal #library-detail > p.scripture-tradition-open-pulse,
#library-modal #library-related.scripture-tradition-open-pulse,
#library-modal .lib-related.scripture-tradition-open-pulse,
#library-modal .lib-related-btn.scripture-tradition-open-pulse,
#library-modal .lib-group-chip.scripture-tradition-open-pulse {
  animation: scripture-tradition-open-pulse 0.65s ease;
}
#library-modal #library-line-back.scripture-tradition-open-pulse-static,
#library-modal #library-detail .lib-line-actions.scripture-tradition-open-pulse-static,
#library-modal #library-detail > p.scripture-tradition-open-pulse-static,
#library-modal #library-related.scripture-tradition-open-pulse-static,
#library-modal .lib-related.scripture-tradition-open-pulse-static,
#library-modal .lib-related-btn.scripture-tradition-open-pulse-static,
#library-modal .lib-group-chip.scripture-tradition-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="scriptureTradition"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="scriptureTradition"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="scriptureTradition"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.scripture-tradition-open-pulse,
  #library-modal #library-detail .lib-line-actions.scripture-tradition-open-pulse,
  #library-modal #library-detail > p.scripture-tradition-open-pulse,
  #library-modal #library-related.scripture-tradition-open-pulse,
  #library-modal .lib-related.scripture-tradition-open-pulse,
  #library-modal .lib-related-btn.scripture-tradition-open-pulse,
  #library-modal .lib-group-chip.scripture-tradition-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #457 — giftsOfHolySpirit / Bảy ơn Chúa Thánh Thần open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill/cấp bậc/ban bảy ơn ảo · 0 invent kinh Hiện Xuống dài · mục vụ: bảy ơn ≠ hoa trái; gắn Thêm sức; không gamify · no QR/Xu · no sexy/Elara · phân biệt fruitsOfHolySpirit · holySpirit · confirmation · indwellingOfSpirit/#433+#434 · theologicalVirtues · scriptureTradition/#455+#456 · giftOf* individual · KHÔNG phá #223/#224 library-gifts-open-pulse · yield soft tip #458 paired (CACHE bump once here) ===== */
@keyframes gifts-of-holy-spirit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gifts-of-holy-spirit-open-pulse,
#library-modal #library-detail .lib-line-actions.gifts-of-holy-spirit-open-pulse,
#library-modal #library-detail > p.gifts-of-holy-spirit-open-pulse,
#library-modal #library-related.gifts-of-holy-spirit-open-pulse,
#library-modal .lib-related.gifts-of-holy-spirit-open-pulse,
#library-modal .lib-related-btn.gifts-of-holy-spirit-open-pulse,
#library-modal .lib-group-chip.gifts-of-holy-spirit-open-pulse {
  animation: gifts-of-holy-spirit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gifts-of-holy-spirit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gifts-of-holy-spirit-open-pulse-static,
#library-modal #library-detail > p.gifts-of-holy-spirit-open-pulse-static,
#library-modal #library-related.gifts-of-holy-spirit-open-pulse-static,
#library-modal .lib-related.gifts-of-holy-spirit-open-pulse-static,
#library-modal .lib-related-btn.gifts-of-holy-spirit-open-pulse-static,
#library-modal .lib-group-chip.gifts-of-holy-spirit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftsOfHolySpirit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftsOfHolySpirit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftsOfHolySpirit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gifts-of-holy-spirit-open-pulse,
  #library-modal #library-detail .lib-line-actions.gifts-of-holy-spirit-open-pulse,
  #library-modal #library-detail > p.gifts-of-holy-spirit-open-pulse,
  #library-modal #library-related.gifts-of-holy-spirit-open-pulse,
  #library-modal .lib-related.gifts-of-holy-spirit-open-pulse,
  #library-modal .lib-related-btn.gifts-of-holy-spirit-open-pulse,
  #library-modal .lib-group-chip.gifts-of-holy-spirit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #459 — giftOfWisdom / Ơn khôn ngoan open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim IQ thiêng / skill / ban ơn · mục vụ: ơn khôn ngoan = 1/7 ơn Thánh Thần; gắn Thêm Sức; xin chứ không tự luyện; khác nhân đức trụ khôn ngoan (prudence) · no QR/Xu · no sexy/Elara · phân biệt giftsOfHolySpirit/#457+#458 · prudence · holySpirit · confirmation · theologicalVirtues · giftOfUnderstanding (chưa polish) · yield soft tip #460 paired (CACHE bump once here) ===== */
@keyframes gift-of-wisdom-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-wisdom-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-wisdom-open-pulse,
#library-modal #library-detail > p.gift-of-wisdom-open-pulse,
#library-modal #library-related.gift-of-wisdom-open-pulse,
#library-modal .lib-related.gift-of-wisdom-open-pulse,
#library-modal .lib-related-btn.gift-of-wisdom-open-pulse,
#library-modal .lib-group-chip.gift-of-wisdom-open-pulse {
  animation: gift-of-wisdom-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-wisdom-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-wisdom-open-pulse-static,
#library-modal #library-detail > p.gift-of-wisdom-open-pulse-static,
#library-modal #library-related.gift-of-wisdom-open-pulse-static,
#library-modal .lib-related.gift-of-wisdom-open-pulse-static,
#library-modal .lib-related-btn.gift-of-wisdom-open-pulse-static,
#library-modal .lib-group-chip.gift-of-wisdom-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfWisdom"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfWisdom"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfWisdom"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-wisdom-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-wisdom-open-pulse,
  #library-modal #library-detail > p.gift-of-wisdom-open-pulse,
  #library-modal #library-related.gift-of-wisdom-open-pulse,
  #library-modal .lib-related.gift-of-wisdom-open-pulse,
  #library-modal .lib-related-btn.gift-of-wisdom-open-pulse,
  #library-modal .lib-group-chip.gift-of-wisdom-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #461 — giftOfUnderstanding / Ơn thông hiểu open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim IQ/học thuật trần / thay giảng lễ / giáo lý viên · mục vụ: ơn thông hiểu = 1/7 ơn Thánh Thần; giúp thấu chân lý mặc khải; gắn Thêm Sức · no QR/Xu · no sexy/Elara · phân biệt giftOfWisdom/#459+#460 · giftsOfHolySpirit/#457+#458 · scriptureTradition · creed · faith · confirmation · giftOfCounsel (chưa polish) · yield soft tip #462 paired (CACHE bump once here) ===== */
@keyframes gift-of-understanding-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-understanding-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-understanding-open-pulse,
#library-modal #library-detail > p.gift-of-understanding-open-pulse,
#library-modal #library-related.gift-of-understanding-open-pulse,
#library-modal .lib-related.gift-of-understanding-open-pulse,
#library-modal .lib-related-btn.gift-of-understanding-open-pulse,
#library-modal .lib-group-chip.gift-of-understanding-open-pulse {
  animation: gift-of-understanding-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-understanding-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-understanding-open-pulse-static,
#library-modal #library-detail > p.gift-of-understanding-open-pulse-static,
#library-modal #library-related.gift-of-understanding-open-pulse-static,
#library-modal .lib-related.gift-of-understanding-open-pulse-static,
#library-modal .lib-related-btn.gift-of-understanding-open-pulse-static,
#library-modal .lib-group-chip.gift-of-understanding-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfUnderstanding"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfUnderstanding"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfUnderstanding"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-understanding-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-understanding-open-pulse,
  #library-modal #library-detail > p.gift-of-understanding-open-pulse,
  #library-modal #library-related.gift-of-understanding-open-pulse,
  #library-modal .lib-related.gift-of-understanding-open-pulse,
  #library-modal .lib-related-btn.gift-of-understanding-open-pulse,
  #library-modal .lib-group-chip.gift-of-understanding-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #463 — giftOfCounsel / Ơn lo liệu open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim thay linh hướng / phân định ơn gọi giáo xứ / skill tree · mục vụ: ơn lo liệu = 1/7 ơn Thánh Thần; soi sáng phán đoán cụ thể; vượt chỉ dựa vào prudence · no QR/Xu · no sexy/Elara · phân biệt giftOfUnderstanding/#461+#462 · giftOfWisdom/#459+#460 · giftsOfHolySpirit/#457+#458 · prudence · conscience · freeWill · vocation · giftOfFortitude (chưa) · yield soft tip #464 paired (CACHE bump once here) ===== */
@keyframes gift-of-counsel-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-counsel-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-counsel-open-pulse,
#library-modal #library-detail > p.gift-of-counsel-open-pulse,
#library-modal #library-related.gift-of-counsel-open-pulse,
#library-modal .lib-related.gift-of-counsel-open-pulse,
#library-modal .lib-related-btn.gift-of-counsel-open-pulse,
#library-modal .lib-group-chip.gift-of-counsel-open-pulse {
  animation: gift-of-counsel-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-counsel-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-counsel-open-pulse-static,
#library-modal #library-detail > p.gift-of-counsel-open-pulse-static,
#library-modal #library-related.gift-of-counsel-open-pulse-static,
#library-modal .lib-related.gift-of-counsel-open-pulse-static,
#library-modal .lib-related-btn.gift-of-counsel-open-pulse-static,
#library-modal .lib-group-chip.gift-of-counsel-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfCounsel"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfCounsel"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfCounsel"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-counsel-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-counsel-open-pulse,
  #library-modal #library-detail > p.gift-of-counsel-open-pulse,
  #library-modal #library-related.gift-of-counsel-open-pulse,
  #library-modal .lib-related.gift-of-counsel-open-pulse,
  #library-modal .lib-related-btn.gift-of-counsel-open-pulse,
  #library-modal .lib-group-chip.gift-of-counsel-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #465 — giftOfFortitude / Ơn sức mạnh open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / thay linh hướng / gore / sexy / Elara · mục vụ: ơn sức mạnh = 1/7 ơn Thánh Thần; bền vững làm điều thiện khi khó; phân biệt nhân đức trụ fortitude (dũng cảm) · no QR/Xu · no sexy/Elara · phân biệt giftOfCounsel/#463+#464 · giftOfUnderstanding/#461+#462 · giftOfWisdom/#459+#460 · giftsOfHolySpirit/#457+#458 · fortitude · hope · vocation · giftOfKnowledge (chưa polish) · yield soft tip #466 paired (CACHE bump once here; #466 must KEEP v375) ===== */
@keyframes gift-of-fortitude-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-fortitude-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-fortitude-open-pulse,
#library-modal #library-detail > p.gift-of-fortitude-open-pulse,
#library-modal #library-related.gift-of-fortitude-open-pulse,
#library-modal .lib-related.gift-of-fortitude-open-pulse,
#library-modal .lib-related-btn.gift-of-fortitude-open-pulse,
#library-modal .lib-group-chip.gift-of-fortitude-open-pulse {
  animation: gift-of-fortitude-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-fortitude-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-fortitude-open-pulse-static,
#library-modal #library-detail > p.gift-of-fortitude-open-pulse-static,
#library-modal #library-related.gift-of-fortitude-open-pulse-static,
#library-modal .lib-related.gift-of-fortitude-open-pulse-static,
#library-modal .lib-related-btn.gift-of-fortitude-open-pulse-static,
#library-modal .lib-group-chip.gift-of-fortitude-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfFortitude"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfFortitude"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfFortitude"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-fortitude-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-fortitude-open-pulse,
  #library-modal #library-detail > p.gift-of-fortitude-open-pulse,
  #library-modal #library-related.gift-of-fortitude-open-pulse,
  #library-modal .lib-related.gift-of-fortitude-open-pulse,
  #library-modal .lib-related-btn.gift-of-fortitude-open-pulse,
  #library-modal .lib-group-chip.gift-of-fortitude-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #467 — giftOfKnowledge / Ơn thông biết open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / IQ trần / sexy / Elara · mục vụ: ơn thông biết = 1/7 ơn Thánh Thần; nhận ra ý Chúa trong tạo thành và lịch sử cứu độ; phân biệt giftOfUnderstanding (thấu mặc khải) · giftOfWisdom · giftOfCounsel · giftOfFortitude · no QR/Xu · no sexy/Elara · phân biệt giftOfFortitude/#465+#466 · giftOfCounsel/#463+#464 · giftOfUnderstanding/#461+#462 · giftOfWisdom · giftsOfHolySpirit · creation · scriptureTradition · giftOfPiety (chưa) · yield soft tip #468 paired (CACHE bump once here; #468 must KEEP v376) ===== */
@keyframes gift-of-knowledge-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-knowledge-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-knowledge-open-pulse,
#library-modal #library-detail > p.gift-of-knowledge-open-pulse,
#library-modal #library-related.gift-of-knowledge-open-pulse,
#library-modal .lib-related.gift-of-knowledge-open-pulse,
#library-modal .lib-related-btn.gift-of-knowledge-open-pulse,
#library-modal .lib-group-chip.gift-of-knowledge-open-pulse {
  animation: gift-of-knowledge-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-knowledge-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-knowledge-open-pulse-static,
#library-modal #library-detail > p.gift-of-knowledge-open-pulse-static,
#library-modal #library-related.gift-of-knowledge-open-pulse-static,
#library-modal .lib-related.gift-of-knowledge-open-pulse-static,
#library-modal .lib-related-btn.gift-of-knowledge-open-pulse-static,
#library-modal .lib-group-chip.gift-of-knowledge-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfKnowledge"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfKnowledge"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfKnowledge"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-knowledge-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-knowledge-open-pulse,
  #library-modal #library-detail > p.gift-of-knowledge-open-pulse,
  #library-modal #library-related.gift-of-knowledge-open-pulse,
  #library-modal .lib-related.gift-of-knowledge-open-pulse,
  #library-modal .lib-related-btn.gift-of-knowledge-open-pulse,
  #library-modal .lib-group-chip.gift-of-knowledge-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #469 — giftOfPiety / Ơn đạo đức open feel · sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / thay phụng vụ / sexy / Elara · mục vụ: ơn đạo đức = 1/7 ơn Thánh Thần; lòng con thảo với Thiên Chúa và tình thân Hội Thánh; phân biệt formsOfPrayer · divineFiliation · ourFather · localChurch · giftOfFearOfTheLord (chưa) · giftOfKnowledge/#467+#468 · no QR/Xu · no sexy/Elara · phân biệt giftOfKnowledge/#467+#468 · giftOfFortitude/#465+#466 · giftOfCounsel · giftsOfHolySpirit · divineFiliation · ourFather · localChurch · giftOfFearOfTheLord · yield soft tip #470 paired (CACHE bump once here; #470 must KEEP v377) ===== */
@keyframes gift-of-piety-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-piety-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-piety-open-pulse,
#library-modal #library-detail > p.gift-of-piety-open-pulse,
#library-modal #library-related.gift-of-piety-open-pulse,
#library-modal .lib-related.gift-of-piety-open-pulse,
#library-modal .lib-related-btn.gift-of-piety-open-pulse,
#library-modal .lib-group-chip.gift-of-piety-open-pulse {
  animation: gift-of-piety-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-piety-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-piety-open-pulse-static,
#library-modal #library-detail > p.gift-of-piety-open-pulse-static,
#library-modal #library-related.gift-of-piety-open-pulse-static,
#library-modal .lib-related.gift-of-piety-open-pulse-static,
#library-modal .lib-related-btn.gift-of-piety-open-pulse-static,
#library-modal .lib-group-chip.gift-of-piety-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfPiety"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfPiety"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfPiety"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-piety-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-piety-open-pulse,
  #library-modal #library-detail > p.gift-of-piety-open-pulse,
  #library-modal #library-related.gift-of-piety-open-pulse,
  #library-modal .lib-related.gift-of-piety-open-pulse,
  #library-modal .lib-related-btn.gift-of-piety-open-pulse,
  #library-modal .lib-group-chip.gift-of-piety-open-pulse {
    animation: none !important;
  }
}



/* ===== Play-polish #471 — giftOfFearOfTheLord / Ơn kính sợ Chúa open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / dọa sợ / sexy / Elara · no scare tactics / no gore / no fearmongering copy in pulse UI · mục vụ: ơn kính sợ Chúa = 1/7 ơn Thánh Thần; tôn kính + ghét tội; kính sợ hiếu thảo (không nô lệ/dọa sợ); phân biệt giftOfPiety/#469+#470 · humility · conversion · hope · confirmation · giftsOfHolySpirit · phân biệt giftOfPiety/#469+#470 · giftOfKnowledge/#467+#468 · giftsOfHolySpirit · humility · conversion · hope · confirmation · yield soft tip #472 paired (CACHE bump once here; #472 must KEEP v378) ===== */
@keyframes gift-of-fear-of-the-lord-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gift-of-fear-of-the-lord-open-pulse,
#library-modal #library-detail .lib-line-actions.gift-of-fear-of-the-lord-open-pulse,
#library-modal #library-detail > p.gift-of-fear-of-the-lord-open-pulse,
#library-modal #library-related.gift-of-fear-of-the-lord-open-pulse,
#library-modal .lib-related.gift-of-fear-of-the-lord-open-pulse,
#library-modal .lib-related-btn.gift-of-fear-of-the-lord-open-pulse,
#library-modal .lib-group-chip.gift-of-fear-of-the-lord-open-pulse {
  animation: gift-of-fear-of-the-lord-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal #library-detail > p.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal #library-related.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal .lib-related.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal .lib-related-btn.gift-of-fear-of-the-lord-open-pulse-static,
#library-modal .lib-group-chip.gift-of-fear-of-the-lord-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfFearOfTheLord"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="giftOfFearOfTheLord"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="giftOfFearOfTheLord"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gift-of-fear-of-the-lord-open-pulse,
  #library-modal #library-detail .lib-line-actions.gift-of-fear-of-the-lord-open-pulse,
  #library-modal #library-detail > p.gift-of-fear-of-the-lord-open-pulse,
  #library-modal #library-related.gift-of-fear-of-the-lord-open-pulse,
  #library-modal .lib-related.gift-of-fear-of-the-lord-open-pulse,
  #library-modal .lib-related-btn.gift-of-fear-of-the-lord-open-pulse,
  #library-modal .lib-group-chip.gift-of-fear-of-the-lord-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #473 — christianJoy / Niềm vui Kitô open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / toxic positivity / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần + Tin Mừng; vui từ Chúa Kitô Phục Sinh; không toxic positivity; có chỗ khóc/thập giá · phân biệt fruitsOfHolySpirit/#225+#226 · hope · easter · paschalMystery · charity · giftOfFearOfTheLord/#471+#472 · peaceOfChrist (chưa individual polish) · yield soft tip #474 paired (CACHE bump once here; #474 must KEEP v379) ===== */
@keyframes christian-joy-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.christian-joy-open-pulse,
#library-modal #library-detail .lib-line-actions.christian-joy-open-pulse,
#library-modal #library-detail > p.christian-joy-open-pulse,
#library-modal #library-related.christian-joy-open-pulse,
#library-modal .lib-related.christian-joy-open-pulse,
#library-modal .lib-related-btn.christian-joy-open-pulse,
#library-modal .lib-group-chip.christian-joy-open-pulse {
  animation: christian-joy-open-pulse 0.65s ease;
}
#library-modal #library-line-back.christian-joy-open-pulse-static,
#library-modal #library-detail .lib-line-actions.christian-joy-open-pulse-static,
#library-modal #library-detail > p.christian-joy-open-pulse-static,
#library-modal #library-related.christian-joy-open-pulse-static,
#library-modal .lib-related.christian-joy-open-pulse-static,
#library-modal .lib-related-btn.christian-joy-open-pulse-static,
#library-modal .lib-group-chip.christian-joy-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="christianJoy"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="christianJoy"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="christianJoy"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.christian-joy-open-pulse,
  #library-modal #library-detail .lib-line-actions.christian-joy-open-pulse,
  #library-modal #library-detail > p.christian-joy-open-pulse,
  #library-modal #library-related.christian-joy-open-pulse,
  #library-modal .lib-related.christian-joy-open-pulse,
  #library-modal .lib-related-btn.christian-joy-open-pulse,
  #library-modal .lib-group-chip.christian-joy-open-pulse {
    animation: none !important;
  }
}




/* ===== Play-polish #475 — peaceOfChrist / Bình an của Chúa open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / thờ ơ bất công / sexy / Elara · no fake hype UI · mục vụ: bình an Chúa ban ≠ hết xung đột trần; ơn Thánh Thần; hòa giải; đi đôi hoán cải/công bằng; không thờ ơ bất công · phân biệt christianJoy/#473+#474 · fruitsOfHolySpirit · signOfPeace · hope · penance · conversion · giftOfFearOfTheLord/#471+#472 · yield soft tip #476 paired (CACHE bump once here; #476 must KEEP v380) ===== */
@keyframes peace-of-christ-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.peace-of-christ-open-pulse,
#library-modal #library-detail .lib-line-actions.peace-of-christ-open-pulse,
#library-modal #library-detail > p.peace-of-christ-open-pulse,
#library-modal #library-related.peace-of-christ-open-pulse,
#library-modal .lib-related.peace-of-christ-open-pulse,
#library-modal .lib-related-btn.peace-of-christ-open-pulse,
#library-modal .lib-group-chip.peace-of-christ-open-pulse {
  animation: peace-of-christ-open-pulse 0.65s ease;
}
#library-modal #library-line-back.peace-of-christ-open-pulse-static,
#library-modal #library-detail .lib-line-actions.peace-of-christ-open-pulse-static,
#library-modal #library-detail > p.peace-of-christ-open-pulse-static,
#library-modal #library-related.peace-of-christ-open-pulse-static,
#library-modal .lib-related.peace-of-christ-open-pulse-static,
#library-modal .lib-related-btn.peace-of-christ-open-pulse-static,
#library-modal .lib-group-chip.peace-of-christ-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="peaceOfChrist"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="peaceOfChrist"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="peaceOfChrist"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.peace-of-christ-open-pulse,
  #library-modal #library-detail .lib-line-actions.peace-of-christ-open-pulse,
  #library-modal #library-detail > p.peace-of-christ-open-pulse,
  #library-modal #library-related.peace-of-christ-open-pulse,
  #library-modal .lib-related.peace-of-christ-open-pulse,
  #library-modal .lib-related-btn.peace-of-christ-open-pulse,
  #library-modal .lib-group-chip.peace-of-christ-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #477 — fidelityFruit / Trung tín open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần; Thiên Chúa trung tín trước; đáp bằng lời hứa/giao ước/bổn phận · phân biệt peaceOfChrist/#475+#476 · christianJoy/#473+#474 · fruitsOfHolySpirit · faith · matrimony · vocation · hope · gentlenessFruit · yield soft tip #478 paired (CACHE bump once here; #478 must KEEP v381) ===== */
@keyframes fidelity-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.fidelity-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.fidelity-fruit-open-pulse,
#library-modal #library-detail > p.fidelity-fruit-open-pulse,
#library-modal #library-related.fidelity-fruit-open-pulse,
#library-modal .lib-related.fidelity-fruit-open-pulse,
#library-modal .lib-related-btn.fidelity-fruit-open-pulse,
#library-modal .lib-group-chip.fidelity-fruit-open-pulse {
  animation: fidelity-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.fidelity-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.fidelity-fruit-open-pulse-static,
#library-modal #library-detail > p.fidelity-fruit-open-pulse-static,
#library-modal #library-related.fidelity-fruit-open-pulse-static,
#library-modal .lib-related.fidelity-fruit-open-pulse-static,
#library-modal .lib-related-btn.fidelity-fruit-open-pulse-static,
#library-modal .lib-group-chip.fidelity-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="fidelityFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="fidelityFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="fidelityFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.fidelity-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.fidelity-fruit-open-pulse,
  #library-modal #library-detail > p.fidelity-fruit-open-pulse,
  #library-modal #library-related.fidelity-fruit-open-pulse,
  #library-modal .lib-related.fidelity-fruit-open-pulse,
  #library-modal .lib-related-btn.fidelity-fruit-open-pulse,
  #library-modal .lib-group-chip.fidelity-fruit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #479 — gentlenessFruit / Hiền hậu open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần — dịu dàng/tử tế; phân biệt meekness (Phúc thật) · fidelityFruit/#477+#478 · christianJoy · peaceOfChrist · fruitsOfHolySpirit · humility · charity · temperance · selfControlFruit · yield soft tip #480 paired (CACHE bump once here; #480 must KEEP v382) ===== */
@keyframes gentleness-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.gentleness-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.gentleness-fruit-open-pulse,
#library-modal #library-detail > p.gentleness-fruit-open-pulse,
#library-modal #library-related.gentleness-fruit-open-pulse,
#library-modal .lib-related.gentleness-fruit-open-pulse,
#library-modal .lib-related-btn.gentleness-fruit-open-pulse,
#library-modal .lib-group-chip.gentleness-fruit-open-pulse {
  animation: gentleness-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.gentleness-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.gentleness-fruit-open-pulse-static,
#library-modal #library-detail > p.gentleness-fruit-open-pulse-static,
#library-modal #library-related.gentleness-fruit-open-pulse-static,
#library-modal .lib-related.gentleness-fruit-open-pulse-static,
#library-modal .lib-related-btn.gentleness-fruit-open-pulse-static,
#library-modal .lib-group-chip.gentleness-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="gentlenessFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="gentlenessFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="gentlenessFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.gentleness-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.gentleness-fruit-open-pulse,
  #library-modal #library-detail > p.gentleness-fruit-open-pulse,
  #library-modal #library-related.gentleness-fruit-open-pulse,
  #library-modal .lib-related.gentleness-fruit-open-pulse,
  #library-modal .lib-related-btn.gentleness-fruit-open-pulse,
  #library-modal .lib-group-chip.gentleness-fruit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #481 — selfControlFruit / Tiết chế open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần egkrateia — làm chủ dục vọng/thói quen; bổ sung temperance chứ không trùng · phân biệt gentlenessFruit/#479+#480 · fidelityFruit · temperance · chastity · freeWill · fastingAbstinence · fruitsOfHolySpirit · kindnessFruit · yield soft tip #482 paired (CACHE bump once here; #482 must KEEP v383) ===== */
@keyframes self-control-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.self-control-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.self-control-fruit-open-pulse,
#library-modal #library-detail > p.self-control-fruit-open-pulse,
#library-modal #library-related.self-control-fruit-open-pulse,
#library-modal .lib-related.self-control-fruit-open-pulse,
#library-modal .lib-related-btn.self-control-fruit-open-pulse,
#library-modal .lib-group-chip.self-control-fruit-open-pulse {
  animation: self-control-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.self-control-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.self-control-fruit-open-pulse-static,
#library-modal #library-detail > p.self-control-fruit-open-pulse-static,
#library-modal #library-related.self-control-fruit-open-pulse-static,
#library-modal .lib-related.self-control-fruit-open-pulse-static,
#library-modal .lib-related-btn.self-control-fruit-open-pulse-static,
#library-modal .lib-group-chip.self-control-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="selfControlFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="selfControlFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="selfControlFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.self-control-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.self-control-fruit-open-pulse,
  #library-modal #library-detail > p.self-control-fruit-open-pulse,
  #library-modal #library-related.self-control-fruit-open-pulse,
  #library-modal .lib-related.self-control-fruit-open-pulse,
  #library-modal .lib-related-btn.self-control-fruit-open-pulse,
  #library-modal .lib-group-chip.self-control-fruit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #483 — kindnessFruit / Nhân ái open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần — tử tế/thiện cảm cụ thể; bác ái trong việc nhỏ và việc thương xót · phân biệt selfControlFruit/#481+#482 · gentlenessFruit · charity · worksOfMercy · preferentialOption · beatitudes · fruitsOfHolySpirit · goodnessFruit · yield soft tip #484 paired (CACHE bump once here; #484 must KEEP v384) ===== */
@keyframes kindness-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.kindness-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.kindness-fruit-open-pulse,
#library-modal #library-detail > p.kindness-fruit-open-pulse,
#library-modal #library-related.kindness-fruit-open-pulse,
#library-modal .lib-related.kindness-fruit-open-pulse,
#library-modal .lib-related-btn.kindness-fruit-open-pulse,
#library-modal .lib-group-chip.kindness-fruit-open-pulse {
  animation: kindness-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.kindness-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.kindness-fruit-open-pulse-static,
#library-modal #library-detail > p.kindness-fruit-open-pulse-static,
#library-modal #library-related.kindness-fruit-open-pulse-static,
#library-modal .lib-related.kindness-fruit-open-pulse-static,
#library-modal .lib-related-btn.kindness-fruit-open-pulse-static,
#library-modal .lib-group-chip.kindness-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="kindnessFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="kindnessFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="kindnessFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.kindness-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.kindness-fruit-open-pulse,
  #library-modal #library-detail > p.kindness-fruit-open-pulse,
  #library-modal #library-related.kindness-fruit-open-pulse,
  #library-modal .lib-related.kindness-fruit-open-pulse,
  #library-modal .lib-related-btn.kindness-fruit-open-pulse,
  #library-modal .lib-group-chip.kindness-fruit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #485 — goodnessFruit / Nhân lành open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · no fake hype UI · mục vụ: hoa trái Thánh Thần — thiện hảo nội tâm tỏ ra ngoài; muốn và làm điều thiện · phân biệt kindnessFruit/#483+#484 · charity · worksOfMercy · beatitudes · fruitsOfHolySpirit · charityFruit · gentlenessFruit · yield soft tip #486 paired (CACHE bump once here; #486 must KEEP v385) ===== */
@keyframes goodness-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.goodness-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.goodness-fruit-open-pulse,
#library-modal #library-detail > p.goodness-fruit-open-pulse,
#library-modal #library-related.goodness-fruit-open-pulse,
#library-modal .lib-related.goodness-fruit-open-pulse,
#library-modal .lib-related-btn.goodness-fruit-open-pulse,
#library-modal .lib-group-chip.goodness-fruit-open-pulse {
  animation: goodness-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.goodness-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.goodness-fruit-open-pulse-static,
#library-modal #library-detail > p.goodness-fruit-open-pulse-static,
#library-modal #library-related.goodness-fruit-open-pulse-static,
#library-modal .lib-related.goodness-fruit-open-pulse-static,
#library-modal .lib-related-btn.goodness-fruit-open-pulse-static,
#library-modal .lib-group-chip.goodness-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="goodnessFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="goodnessFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="goodnessFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.goodness-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.goodness-fruit-open-pulse,
  #library-modal #library-detail > p.goodness-fruit-open-pulse,
  #library-modal #library-related.goodness-fruit-open-pulse,
  #library-modal .lib-related.goodness-fruit-open-pulse,
  #library-modal .lib-related-btn.goodness-fruit-open-pulse,
  #library-modal .lib-group-chip.goodness-fruit-open-pulse {
    animation: none !important;
  }
}


/* ===== Play-polish #487 — charityFruit / Đức ái (hoa trái) open feel · soft calm pulse sticky Về kho/related/title/chip Nhân đức & Ơn Thánh Thần ≥48 · reduced-motion · empty honesty · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara / monetize tình yêu · no fake hype UI · mục vụ: hoa trái đầu Gl 5,22 — tình yêu Thánh Thần trong đời thường · phân biệt charity (nhân đức đối thần) · goodnessFruit/#485+#486 · kindnessFruit · worksOfMercy · christianJoy · fruitsOfHolySpirit · yield soft tip #488 paired (CACHE bump once here; #488 must KEEP v386) ===== */
@keyframes charity-fruit-open-pulse {
  0% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
  40% { box-shadow: 0 0 0 4px rgba(138, 98, 42, 0.28); transform: scale(1.03); }
  100% { box-shadow: 0 0 0 0 rgba(138, 98, 42, 0); transform: scale(1); }
}
#library-modal #library-line-back.charity-fruit-open-pulse,
#library-modal #library-detail .lib-line-actions.charity-fruit-open-pulse,
#library-modal #library-detail > p.charity-fruit-open-pulse,
#library-modal #library-related.charity-fruit-open-pulse,
#library-modal .lib-related.charity-fruit-open-pulse,
#library-modal .lib-related-btn.charity-fruit-open-pulse,
#library-modal .lib-group-chip.charity-fruit-open-pulse {
  animation: charity-fruit-open-pulse 0.65s ease;
}
#library-modal #library-line-back.charity-fruit-open-pulse-static,
#library-modal #library-detail .lib-line-actions.charity-fruit-open-pulse-static,
#library-modal #library-detail > p.charity-fruit-open-pulse-static,
#library-modal #library-related.charity-fruit-open-pulse-static,
#library-modal .lib-related.charity-fruit-open-pulse-static,
#library-modal .lib-related-btn.charity-fruit-open-pulse-static,
#library-modal .lib-group-chip.charity-fruit-open-pulse-static {
  box-shadow: 0 0 0 3px rgba(138, 98, 42, 0.38);
}
#library-modal #library-detail[data-lib-doctrine-id="charityFruit"] .lib-line-actions {
  position: sticky;
  bottom: 0;
  z-index: 3;
}
#library-modal #library-detail[data-lib-doctrine-id="charityFruit"] #library-line-back,
#library-modal #library-detail[data-lib-doctrine-id="charityFruit"] .lib-related-btn {
  min-height: 48px !important;
  min-width: 48px !important;
}
@media (prefers-reduced-motion: reduce) {
  #library-modal #library-line-back.charity-fruit-open-pulse,
  #library-modal #library-detail .lib-line-actions.charity-fruit-open-pulse,
  #library-modal #library-detail > p.charity-fruit-open-pulse,
  #library-modal #library-related.charity-fruit-open-pulse,
  #library-modal .lib-related.charity-fruit-open-pulse,
  #library-modal .lib-related-btn.charity-fruit-open-pulse,
  #library-modal .lib-group-chip.charity-fruit-open-pulse {
    animation: none !important;
  }
}

/* ===== Play-polish #422 — freeWill soft tip «Tự do ý chí» toast ≥48 · soft pulse · 0 invent · 0 claim tự do tuyệt đối/thay lương tâm·linh hướng/buff/công đức/dọa sợ · no QR/Xu · no sexy/Elara · phân biệt graceAndSin · conscience · commandments · mortalSin · actualGrace · yield graceAndSin/#420 · conscience/#418 · saintJoseph/#416 · newEvangelization/#414 · examination/#282 · commandments/#392 · humanDignity/#398 · vocation/#394 ===== */
#toast.toast-free-will-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-free-will-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-free-will-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-free-will-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #424 — Soft tip «Hoán cải» / conversion ≤1×/ngày · toast ≥48 · 0 invent · 0 claim xá giải/thay linh mục/công đức/dọa sợ/gore · phân biệt freeWill · graceAndSin · penance · baptism · actualGrace · mortalSin · no Xu/sexy/Elara ===== */
#toast.toast-conversion-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-conversion-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-conversion-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-conversion-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #426 — Soft tip «Cám dỗ» / temptation ≤1×/ngày · toast ≥48 · 0 invent · 0 claim gamify cám dỗ/tội vì bị cám dỗ/buff/công đức/dọa sợ/gore · cám dỗ ≠ tội · phân biệt conversion · freeWill · graceAndSin · ourFather · actualGrace · mortalSin · no Xu/sexy/Elara ===== */
#toast.toast-temptation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-temptation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-temptation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-temptation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #428 — Soft tip «Công trạng» / merit ≤1×/ngày · toast ≥48 · 0 invent · 0 claim điểm thưởng mua ơn/Xu/paywall/Pelagian/công đức gamify/buff · phân biệt temptation · conversion · freeWill · justification · sanctifyingGrace · charity · no Xu/sexy/Elara ===== */
#toast.toast-merit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-merit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-merit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-merit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #430 — Soft tip «Ơn gọi nên thánh» / callToHoliness ≤1×/ngày · toast ≥48 · 0 invent · 0 claim thay phân định ơn gọi/quiz nghề/buff/công đức gamify · phân biệt merit · vocation · baptism · peopleOfGod · charity · theologicalVirtues · no Xu/sexy/Elara ===== */
#toast.toast-call-to-holiness-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-call-to-holiness-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-call-to-holiness-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-call-to-holiness-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #432 — Soft tip «Làm nghĩa tử» / divineFiliation ≤1×/ngày · toast ≥48 · 0 invent · 0 claim thay Rửa tội / buff nghĩa tử / công đức gamify · phân biệt callToHoliness · baptism · sanctifyingGrace · justification · trinity · ourFather · indwellingOfSpirit · no Xu/sexy/Elara ===== */
#toast.toast-divine-filiation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-divine-filiation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-divine-filiation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-divine-filiation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #434 — Soft tip «Thánh Thần ngự trong» / indwellingOfSpirit ≤1×/ngày · toast ≥48 · 0 invent · 0 claim cảm nhận Thánh Thần giả lập / phong trào giả / thay Rửa tội / buff / công đức gamify · phân biệt divineFiliation · holySpirit · baptism · giftsOfHolySpirit · fruitsOfHolySpirit · templeOfHolySpirit · no Xu/sexy/Elara ===== */
#toast.toast-indwelling-of-spirit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-indwelling-of-spirit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-indwelling-of-spirit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-indwelling-of-spirit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #436 — Soft tip «Tội tổ tông» / originalSin ≤1×/ngày · toast ≥48 · 0 invent · 0 claim thay Rửa tội/Giải tội / đổ lỗi trẻ nhỏ / dọa sợ / gore / buff / công đức gamify · phân biệt baptism · graceAndSin · creation · incarnation · humanDignity · redemption · mortalSin · no Xu/sexy/Elara ===== */
#toast.toast-original-sin-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-original-sin-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-original-sin-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-original-sin-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #438 — Soft tip «Công cuộc cứu độ» / redemption ≤1×/ngày · toast ≥48 · 0 invent · 0 claim cử hành bí tích / thay Thánh Lễ / Pelagian / gore / buff / công đức gamify · phân biệt originalSin · paschalMystery · jesus · incarnation · graceAndSin · eucharist · baptism · justification · no Xu/sexy/Elara ===== */
#toast.toast-redemption-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-redemption-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-redemption-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-redemption-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #440 — Soft tip «Công chính hóa» / justification ≤1×/ngày · toast ≥48 · 0 invent · 0 claim thay bí tích / Pelagian / buff / công đức gamify · phân biệt redemption · baptism · graceAndSin · paschalMystery · faith · sanctifyingGrace · merit · no Xu/sexy/Elara ===== */
#toast.toast-justification-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-justification-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-justification-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-justification-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #442 — Soft tip «Ơn thánh hóa» / sanctifyingGrace ≤1×/ngày · toast ≥48 · 0 invent · 0 claim bán ơn / gamify ân sủng / Xu / paywall / thay Giải tội / buff · phân biệt justification · graceAndSin · baptism · actualGrace · mortalSin · theologicalVirtues · merit · no Xu/sexy/Elara ===== */
#toast.toast-sanctifying-grace-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-sanctifying-grace-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-sanctifying-grace-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-sanctifying-grace-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #444 — Soft tip «Tội trọng» / mortalSin ≤1×/ngày · toast ≥48 · 0 invent · 0 claim xá giải / thay linh mục / gamify tội / dọa trẻ / gore / buff · phân biệt sanctifyingGrace · penance · venialSin · temptation · graceAndSin · examination · actOfContrition · nhấn thương xót · no Xu/sexy/Elara ===== */
#toast.toast-mortal-sin-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-mortal-sin-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-mortal-sin-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-mortal-sin-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #446 — Soft tip «Tội nhẹ» / venialSin ≤1×/ngày · toast ≥48 · 0 invent · 0 claim xá giải / thay linh mục / gamify tội / dọa trẻ / gore / buff · phân biệt mortalSin · sanctifyingGrace · graceAndSin · penance · examination · actOfContrition · temptation · nhấn thương xót · no Xu/sexy/Elara ===== */
#toast.toast-venial-sin-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-venial-sin-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-venial-sin-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-venial-sin-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #448 — Soft tip «Ơn hiện tại» / actualGrace ≤1×/ngày · toast ≥48 · 0 invent · 0 claim bán ơn / gamify ân sủng / Xu / paywall / thay bí tích / buff · phân biệt sanctifyingGrace · graceAndSin · justification · freeWill · vocation · no Xu/sexy/Elara ===== */
#toast.toast-actual-grace-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-actual-grace-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-actual-grace-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-actual-grace-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #450 — Soft tip «Thiên Chúa sáng tạo» / creation ≤1×/ngày · toast ≥48 · 0 invent · 0 claim carbon credit / thay Tin Kính / buff / Xu · phân biệt careForCreation · originalSin · trinity · humanDignity · creed · no Xu/sexy/Elara ===== */
#toast.toast-creation-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-creation-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-creation-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-creation-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}
/* ===== Play-polish #452 — Soft tip «Thiên thần bản mệnh» / guardianAngel ≤1×/ngày · toast ≥48 · phân biệt archangels · communionOfSaints · allSouls · sacramentals · tip lễ #158 · 0 invent kinh · 0 claim NPC/linh vật/buff/Xu · no mê tín · no Xu/sexy/Elara ===== */
#toast.toast-guardian-angel-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-guardian-angel-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-guardian-angel-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-guardian-angel-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #454 — Soft tip «Các Tổng Lãnh Thiên thần» / archangels ≤1×/ngày · toast ≥48 · phân biệt guardianAngel · communionOfSaints · allSouls · sacramentals · annunciation · tip lễ #160 · 0 invent kinh · 0 claim NPC/boss/buff/Xu · no Xu/sexy/Elara ===== */
#toast.toast-archangels-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-archangels-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-archangels-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-archangels-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #456 — Soft tip «Kinh Thánh và Thánh Truyền» / scriptureTradition ≤1×/ngày · toast ≥48 · phân biệt creed · mass · liturgyOfTheWord · readings · jesus · holySpirit · 0 invent · 0 paste dài · 0 claim thay Magisterium/bài giảng · no Xu/sexy/Elara ===== */
#toast.toast-scripture-tradition-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-scripture-tradition-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-scripture-tradition-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-scripture-tradition-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #458 — Soft tip «Bảy ơn Chúa Thánh Thần» / giftsOfHolySpirit ≤1×/ngày · toast ≥48 · 0 invent · 0 claim skill/ban ơn ảo/buff/Xu · phân biệt fruitsOfHolySpirit · holySpirit · confirmation · theologicalVirtues · tip group #224 (giữ) · no Xu/sexy/Elara ===== */
.toast-gifts-of-holy-spirit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gifts-of-holy-spirit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gifts-of-holy-spirit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gifts-of-holy-spirit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #460 — Soft tip «Ơn khôn ngoan» / giftOfWisdom ≤1×/ngày · toast ≥48 · phân biệt giftsOfHolySpirit · prudence · holySpirit · confirmation · 0 invent · 0 claim skill/IQ/ban ơn/buff/Xu · no Xu/sexy/Elara ===== */
.toast-gift-of-wisdom-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-wisdom-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-wisdom-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-wisdom-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

/* ===== Play-polish #462 — Soft tip «Ơn thông hiểu» / giftOfUnderstanding ≤1×/ngày · toast ≥48 · phân biệt giftOfWisdom · giftsOfHolySpirit · scriptureTradition · creed · faith · 0 invent · 0 claim IQ/skill/ban ơn/buff/Xu · no Xu/sexy/Elara ===== */
.toast-gift-of-understanding-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-understanding-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-understanding-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-understanding-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}


/* ===== Play-polish #464 — Soft tip «Ơn lo liệu» / giftOfCounsel ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt giftOfUnderstanding · giftOfWisdom · giftsOfHolySpirit · prudence · conscience · freeWill · vocation · giftOfFortitude · 0 invent · 0 claim thay linh hướng / phân định ơn gọi / skill tree / buff / Xu · no Xu/sexy/Elara ===== */
.toast-gift-of-counsel-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-counsel-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-counsel-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-counsel-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gift-of-counsel-soft {
    transition: none;
  }
}






/* ===== Play-polish #466 — Soft tip «Ơn sức mạnh» / giftOfFortitude ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt giftOfCounsel · giftOfUnderstanding · giftOfWisdom · giftsOfHolySpirit · fortitude (nhân đức trụ) · hope · vocation · giftOfKnowledge · 0 invent · 0 claim skill tree / buff / Xu / thay linh hướng / gore / sexy / Elara · no Xu/sexy/Elara ===== */
.toast-gift-of-fortitude-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-fortitude-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-fortitude-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-fortitude-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gift-of-fortitude-soft {
    transition: none;
  }
}



/* ===== Play-polish #468 — Soft tip «Ơn thông biết» / giftOfKnowledge ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt giftOfUnderstanding · giftOfWisdom · giftOfCounsel · giftOfFortitude · giftsOfHolySpirit · creation · scriptureTradition · giftOfPiety · 0 invent · 0 claim skill tree / buff / Xu / IQ trần / sexy / Elara · no Xu/sexy/Elara ===== */
.toast-gift-of-knowledge-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-knowledge-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-knowledge-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-knowledge-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gift-of-knowledge-soft {
    transition: none;
  }
}


/* ===== Play-polish #470 — Soft tip «Ơn đạo đức» / giftOfPiety ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt giftOfKnowledge · giftOfFortitude · giftsOfHolySpirit · divineFiliation · ourFather · localChurch · giftOfFearOfTheLord · 0 invent · 0 claim skill tree / buff / Xu / thay phụng vụ / sexy / Elara · no Xu/sexy/Elara ===== */
.toast-gift-of-piety-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-piety-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-piety-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-piety-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gift-of-piety-soft {
    transition: none;
  }
}


/* ===== Play-polish #472 — Soft tip «Ơn kính sợ Chúa» / giftOfFearOfTheLord ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt giftOfPiety · giftOfKnowledge · giftsOfHolySpirit · humility · conversion · hope · confirmation · 0 invent · 0 claim skill tree / buff / Xu / scare / gore / sexy / Elara · App không dọa sợ · không ban ơn ảo · no Xu/sexy/Elara ===== */
.toast-gift-of-fear-of-the-lord-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gift-of-fear-of-the-lord-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gift-of-fear-of-the-lord-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gift-of-fear-of-the-lord-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gift-of-fear-of-the-lord-soft {
    transition: none;
  }
}


/* ===== Play-polish #474 — Soft tip «Niềm vui Kitô» / christianJoy ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt fruitsOfHolySpirit · hope · easter · paschalMystery · charity · giftOfFearOfTheLord · peaceOfChrist · 0 invent · 0 claim skill tree / buff / Xu / toxic positivity / sexy / Elara · App không bán vui · không toxic positivity · no Xu/sexy/Elara ===== */
.toast-christian-joy-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-christian-joy-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-christian-joy-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-christian-joy-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-christian-joy-soft {
    transition: none;
  }
}

/* ===== Play-polish #476 — Soft tip «Bình an của Chúa» / peaceOfChrist ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt christianJoy · fruitsOfHolySpirit · signOfPeace · hope · penance · conversion · giftOfFearOfTheLord · 0 invent · 0 claim skill tree / buff / Xu / thờ ơ bất công / sexy / Elara · App không thay hòa giải giáo xứ · không thờ ơ bất công · no Xu/sexy/Elara ===== */
.toast-peace-of-christ-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-peace-of-christ-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-peace-of-christ-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-peace-of-christ-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-peace-of-christ-soft {
    transition: none;
  }
}

/* ===== Play-polish #478 — Soft tip «Trung tín» / fidelityFruit ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt peaceOfChrist · christianJoy · fruitsOfHolySpirit · faith · matrimony · vocation · hope · gentlenessFruit · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · App không thay giao ước giáo xứ · no Xu/sexy/Elara ===== */
.toast-fidelity-fruit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-fidelity-fruit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-fidelity-fruit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-fidelity-fruit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-fidelity-fruit-soft {
    transition: none;
  }
}

/* ===== Play-polish #480 — Soft tip «Hiền hậu» / gentlenessFruit ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt fidelityFruit · meekness · fruitsOfHolySpirit · humility · charity · temperance · peaceOfChrist · selfControlFruit · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · App không gamify tính cách · no Xu/sexy/Elara ===== */
.toast-gentleness-fruit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-gentleness-fruit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-gentleness-fruit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-gentleness-fruit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-gentleness-fruit-soft {
    transition: none;
  }
}

/* ===== Play-polish #482 — Soft tip «Tiết chế» / selfControlFruit ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt gentlenessFruit · temperance · chastity · freeWill · fastingAbstinence · fruitsOfHolySpirit · kindnessFruit · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · App không checklist gamify · no Xu/sexy/Elara ===== */
.toast-self-control-fruit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-self-control-fruit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-self-control-fruit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-self-control-fruit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-self-control-fruit-soft {
    transition: none;
  }
}

/* ===== Play-polish #484 — Soft tip «Nhân ái» / kindnessFruit ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt selfControlFruit · gentlenessFruit · charity · worksOfMercy · preferentialOption · beatitudes · fruitsOfHolySpirit · goodnessFruit · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · App không monetize bác ái · no Xu/sexy/Elara · học khung trên thẻ ===== */
.toast-kindness-fruit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-kindness-fruit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-kindness-fruit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-kindness-fruit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-kindness-fruit-soft {
    transition: none;
  }
}

/* ===== Play-polish #486 — Soft tip «Nhân lành» / goodnessFruit ≤1×/ngày · toast ≥48 · soft pulse · reduced-motion ok · phân biệt kindnessFruit · charity · worksOfMercy · beatitudes · fruitsOfHolySpirit · charityFruit · gentlenessFruit · 0 invent · 0 claim skill tree / buff / Xu / sexy / Elara · App không bán đức tính · no Xu/sexy/Elara · học khung trên thẻ ===== */
.toast-goodness-fruit-soft .toast-action {
  min-height: 48px;
  min-width: 48px;
  padding: 12px 16px;
}
#toast.toast-goodness-fruit-soft {
  max-width: min(86vw, 390px);
}
#toast.toast-goodness-fruit-soft .toast-title {
  font-weight: 700;
  color: #fff6e4;
}
#toast.toast-goodness-fruit-soft .toast-body {
  color: rgba(255, 246, 228, 0.92);
  line-height: 1.45;
  font-size: 14.5px;
}

@media (prefers-reduced-motion: reduce) {
  #toast.toast-goodness-fruit-soft {
    transition: none;
  }
}







/* ===== Release 10/11 — lyric unclamp (restore v251) + creator CTA must not cover chips ===== */
#prayer-panel.prayer-panel,
.prayer-panel {
  max-height: min(25vh, 220px) !important;
  overflow: hidden !important;
}
.prayer-lyric {
  max-height: none !important;
  min-height: 0 !important;
  overflow: visible !important;
  display: block !important;
  -webkit-line-clamp: unset !important;
  line-clamp: unset !important;
  font-size: 14px !important;
  line-height: 1.32 !important;
  margin: 0 0 4px !important;
}
.prayer-lyric .pray-line.is-active {
  display: block !important;
  -webkit-line-clamp: unset !important;
  line-clamp: unset !important;
  overflow: visible !important;
  white-space: normal !important;
  overflow-wrap: anywhere !important;
  font-size: 14.5px !important;
  line-height: 1.32 !important;
  font-weight: 700 !important;
  color: #ffe08a !important;
}

#creator-modal .creator-modal {
  display: flex !important;
  flex-direction: column !important;
  overflow: hidden !important;
  padding-bottom: 0 !important;
  max-height: calc(100dvh - 52px) !important;
}
#creator-modal .creator-scroll {
  flex: 1 1 auto;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
  min-height: 0;
  /* Footer is a sibling (~80px). Extra pad so last rows can clear it; first screen
     also uses slightly tighter field gaps below so Kiểu tóc fits without scrolling. */
  padding-bottom: calc(80px + 16px);
  scroll-padding-bottom: calc(80px + 16px);
}
#creator-modal .creator-preview { margin: 4px 0 8px; }
#creator-modal .creator-field { margin: 6px 0 2px; }
#creator-modal .creator-label { margin: 8px 0 4px; }
#creator-modal .sub { margin-bottom: 6px; }
#creator-modal .modal-actions {
  position: relative !important;
  flex: 0 0 auto;
  bottom: auto !important;
  z-index: 4;
  margin: 0 -20px 0 !important;
  padding: 12px 20px max(10px, env(safe-area-inset-bottom, 0px)) !important;
  background: #f6efe3 !important;
  border-top: 1px solid rgba(74, 52, 40, 0.18);
  box-shadow: 0 -6px 16px rgba(48, 32, 18, 0.08);
}
#creator-modal .creator-hair-color-chip {
  min-height: 48px !important;
  min-width: 48px !important;
}
#creator-modal .creator-hair-color-chip::before {
  content: "";
  display: inline-block;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  margin-right: 6px;
  vertical-align: middle;
  background: var(--chip-hair, #2a1a12);
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.2);
}

/* Keep toast above the prayer tab row so it cannot cover Lạy Cha / K.Mừng */
#toast.show {
  bottom: auto !important;
  top: max(12px, env(safe-area-inset-top, 0px)) !important;
}


/* ===== v388 visual repair: compact today chip, no stretched hint, no mid-form CTA ===== */
.today-aside {
  max-width: min(168px, 44vw) !important;
  flex: 0 1 auto;
}
.today-chip {
  max-width: min(168px, 44vw) !important;
  background: #1a1410 !important;
}
body:not(.in-church) .hint, body:not(.in-church) #hint {
  /* Mid-nave only outside the church HUD row (village hides this hint anyway) */
  top: 46% !important;
  bottom: auto !important;
  height: auto !important;
  max-height: none !important;
  left: 50% !important;
  transform: translate(-50%, 0) !important;
}
.hint:not(.show), #hint:not(.show) {
  opacity: 0 !important;
  visibility: hidden !important;
}


/* ===== v390 playtest fixes (10/11): toast vs HUD, prayer chips, sticky creator preview, tap feedback, sound state ===== */
/* C. Toast never covers the top HUD (Hạt / − / 🔊) nor the crucifix: sit just above the prayer chip row. */
#toast.show {
  top: auto !important;
  bottom: calc(76px + 56px + 10px + env(safe-area-inset-bottom, 0px)) !important;
}
body.is-seated #toast.show {
  bottom: calc(16px + 56px + 10px + env(safe-area-inset-bottom, 0px)) !important;
}
/* Prayer panel open → bottom is busy; drop below the top HUD instead. */
body.prayer-rail-open #toast.show {
  bottom: auto !important;
  top: calc(max(12px, env(safe-area-inset-top, 0px)) + 120px) !important;
}

/* E. Prayer chips: never clip the last chip (T.Kính) — wrap on narrow panes, ≥44px tap. */
.prayer-rail {
  box-sizing: border-box !important;
  width: min(560px, calc(100vw - 12px - env(safe-area-inset-left, 0px) - env(safe-area-inset-right, 0px))) !important;
  max-width: calc(100vw - 12px) !important;
}
.prayer-tabs {
  flex-wrap: wrap !important;
  justify-content: center !important;
  overflow: visible !important;
  box-sizing: border-box;
  max-width: 100%;
}
.prayer-tab {
  flex: 1 1 54px !important;
  min-width: 54px !important;
  min-height: 44px !important;
  box-sizing: border-box;
}

/* D. Creator: keep the character preview on screen while options scroll; no nested outfit scroller. */
#creator-modal .creator-preview {
  position: sticky !important;
  top: 0;
  z-index: 3;
  margin: 0 -20px 8px !important;
  padding: 6px 20px 8px;
  background: #f6efe3;
  box-shadow: 0 6px 12px -8px rgba(48, 32, 18, 0.35);
}
#creator-modal .creator-outfits {
  max-height: none !important;
  overflow: visible !important;
}
#creator-modal .creator-scroll {
  padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)) !important;
  scroll-padding-top: 180px;
}

/* A. Every tap answers at once, even on a slow GPU. */
button, .chip[role="button"], .creator-chip, .prayer-tab, .dock-primary, .btn-solid, .btn-ghost, .btn-enter {
  -webkit-tap-highlight-color: rgba(201, 162, 74, 0.25);
  touch-action: manipulation;
}
button:active, .chip[role="button"]:active, .creator-chip:active, .prayer-tab:active,
.btn-solid:active, .btn-ghost:active, .btn-enter:active, button.is-tapped {
  scale: 0.96; /* individual property: composes with any existing translate transform */
  filter: brightness(1.12);
  transition: scale 0.06s ease, filter 0.06s ease;
}
.prayer-tab:active, .creator-chip:active { scale: 0.94; }
#creator-modal .creator-chip[aria-pressed="true"] {
  box-shadow: 0 0 0 2px #c9a24a, 0 2px 6px rgba(0,0,0,0.25);
}
#enter-loading {
  position: fixed; inset: 0; z-index: 60;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  background: radial-gradient(circle at 50% 40%, rgba(74, 52, 40, 0.92), rgba(18, 13, 10, 0.97));
  color: #f3e6cf; font-family: var(--serif, Georgia, serif); font-size: 18px;
  pointer-events: none; opacity: 1; transition: opacity 0.4s ease;
}
#enter-loading.is-done { opacity: 0; }
#enter-loading .el-spin {
  width: 34px; height: 34px; border-radius: 50%;
  border: 3px solid rgba(232, 194, 122, 0.25); border-top-color: #e8c27a;
  animation: el-spin 0.9s linear infinite;
}
@keyframes el-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) {
  #enter-loading .el-spin { animation-duration: 2.4s; }
  button:active, .prayer-tab:active, .creator-chip:active { scale: none; }
}
.btn-enter.is-loading { opacity: 0.8; }

/* B. Speaker shows its state clearly: gold ring = on, struck «tắt» badge = off. */
.sound-toggle { position: relative; }
.sound-toggle[aria-pressed="true"] {
  border-color: #e8c27a !important;
  box-shadow: 0 0 0 2px rgba(232, 194, 122, 0.35) !important;
}
.sound-toggle[aria-pressed="false"] {
  opacity: 0.85 !important;
  border-color: rgba(200, 90, 70, 0.75) !important;
}
.sound-toggle[aria-pressed="false"]::after {
  content: "tắt";
  position: absolute; right: -4px; bottom: -4px;
  font: 700 10px/1 system-ui, sans-serif;
  padding: 2px 4px; border-radius: 6px;
  background: #b0473a; color: #fff;
  pointer-events: none;
}

/* ===== v391 walk/stand: visible «Đứng dậy» on the HUD while seated; canvas owns touch gestures ===== */
#canvas-wrap canvas { touch-action: none; }
#hud .hud-stand {
  position: absolute;
  left: calc(12px + env(safe-area-inset-left, 0px));
  bottom: calc(16px + var(--v391-rail-h, 60px) + 12px + env(safe-area-inset-bottom, 0px));
  z-index: 31; /* above prayer rail (28) and toast (25) */
  min-width: 120px;
  min-height: 48px;
  padding: 10px 18px;
  border-radius: 24px;
  border: 1.5px solid #e8c27a;
  background: rgba(38, 27, 20, 0.92);
  color: #f7ead2;
  font: 700 17px/1.1 var(--serif, Georgia, serif);
  letter-spacing: 0.01em;
  box-shadow: 0 4px 14px rgba(10, 7, 5, 0.45);
  cursor: pointer;
  pointer-events: auto;
}
#hud .hud-stand[hidden] { display: none !important; }
#hud .hud-stand::before { content: "↑ "; color: #e8c27a; }
/* Toast stays above the stand button so it never covers it */
body.is-seated.has-hud-stand #toast.show {
  bottom: calc(16px + var(--v391-rail-h, 60px) + 12px + 48px + 12px + env(safe-area-inset-bottom, 0px)) !important;
}
/* Prayer panel open → it owns the bottom; stand button steps aside (still in «…») */
body.prayer-rail-open #hud .hud-stand { display: none !important; }
body.large-text #hud .hud-stand { font-size: 19px; min-height: 52px; }

/* ===== v392 prayer voice: big «Giọng đọc · bật/tắt» button + actions row never clipped =====
   Owner on iPhone: «Anh đâu thấy giọng đọc đâu». Short-screen rules had shrunk .prayer-voice to 11px
   and #prayer-tap to 30px, and the panel's max-height + overflow:hidden clipped the actions row. */
.prayer-voice.prayer-voice-sr {
  position: absolute !important;
  width: 1px !important; height: 1px !important;
  margin: -1px !important; padding: 0 !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important; clip-path: inset(50%) !important;
  white-space: nowrap !important; border: 0 !important;
}
#prayer-panel.prayer-panel,
.prayer-panel {
  display: flex !important;
  flex-direction: column !important;
  max-height: min(46vh, 360px) !important;
  overflow: hidden !important;
}
#prayer-panel.prayer-panel[hidden] { display: none !important; }
#prayer-panel .prayer-panel-head { flex: 0 0 auto !important; }
#prayer-panel .prayer-lyric {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  overflow-y: auto !important;
  -webkit-overflow-scrolling: touch;
}
#prayer-panel .prayer-panel-actions {
  flex: 0 0 auto !important;
  display: flex !important;
  align-items: stretch !important;
  justify-content: space-between !important;
  gap: 10px !important;
  margin-top: 4px !important;
  visibility: visible !important;
}
#prayer-panel .prayer-src { flex: 0 1 auto !important; min-height: 0 !important; overflow: hidden !important; }
#prayer-panel .prayer-voice-btn {
  flex: 1 1 auto;
  min-height: 48px !important;
  min-width: 44px;
  padding: 10px 14px !important;
  border-radius: 12px;
  border: 1.5px solid rgba(232, 194, 122, 0.85);
  background: rgba(201, 162, 74, 0.16);
  color: #fff3d6 !important;
  font-size: 15px !important;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 0.01em;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
  cursor: pointer;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}
#prayer-panel .prayer-voice-btn.is-on {
  background: linear-gradient(180deg, rgba(201, 162, 74, 0.42) 0%, rgba(168, 132, 46, 0.42) 100%);
  border-color: #e6c878;
  color: #ffe08a !important;
}
#prayer-panel .prayer-voice-btn:focus-visible { outline: 3px solid #ffe08a; outline-offset: 2px; }
#prayer-panel #prayer-tap {
  flex: 1 1 auto;
  min-height: 48px !important;
  min-width: 120px !important;
  padding: 10px 16px !important;
  font-size: 15px !important;
}
@media (max-height: 700px), (max-width: 390px) {
  #prayer-panel.prayer-panel,
  .prayer-panel { max-height: min(52vh, 340px) !important; }
  #prayer-panel .prayer-voice-btn,
  #prayer-panel #prayer-tap { min-height: 44px !important; font-size: 14px !important; padding: 8px 10px !important; }
}

/* v393 — voice clip playing: soft gold pulse on «Giọng đọc» + active line glow (solemn) */
body.prayer-voice-playing #prayer-panel .prayer-voice-btn.is-on { box-shadow: 0 0 0 2px rgba(232, 196, 110, 0.55); animation: prayerVoicePulse393 2.4s ease-in-out infinite; }
body.prayer-voice-playing #prayer-panel .pray-line.is-active { text-shadow: 0 0 10px rgba(255, 214, 140, 0.45); }
@keyframes prayerVoicePulse393 { 0%, 100% { box-shadow: 0 0 0 2px rgba(232, 196, 110, 0.35); } 50% { box-shadow: 0 0 0 4px rgba(232, 196, 110, 0.7); } }
@media (prefers-reduced-motion: reduce) { body.prayer-voice-playing #prayer-panel .prayer-voice-btn.is-on { animation: none; } }
/* v393 — coach tip («1/3 · Khi sẵn sàng…») must not bleed behind the prayer rail while a prayer is being read */
body.prayer-rail-open #coach-tip { visibility: hidden !important; }

/* v396 — first-visit coach («1/3 · Khi sẵn sàng…» + «Để sau»): slim solid card in the pew band between the
   sanctuary (crucifix ends ~42% vh) and the chibi (standing ≥61% vh, seated ≥70% vh). Never over the avatar,
   «Đứng dậy», the prayer tabs or the dock. Auto-hides after ~8s (main.js COACH_AUTO_HIDE_MS). */
#hud #coach-tip.coach-tip {
  top: 47%;
  top: 47dvh;
  bottom: auto !important;
  left: 50%;
  transform: translateX(-50%);
  width: min(380px, 92vw);
  max-width: min(380px, 92vw);
  box-sizing: border-box;
  flex-direction: row !important;
  flex-wrap: nowrap;
  align-items: center !important;
  text-align: left !important;
  gap: 10px !important;
  padding: 8px 8px 8px 12px;
  font-size: 14.5px;
  line-height: 1.35;
  background: rgb(22, 17, 12);
  border-radius: 10px;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);
}
#hud #coach-tip.coach-tip .coach-skip {
  position: static;
  width: auto;
  align-self: center;
  min-height: 44px;
  min-width: 72px;
  padding: 6px 10px;
  font-size: 14px;
  white-space: nowrap;
}
#hud #coach-tip.coach-tip:not(.show) { visibility: hidden; }
body.large-text #hud #coach-tip.coach-tip { font-size: 16px; }
/* coach owns the soft lane — the floor hint never prints through it */
body:has(#coach-tip.show) #hint { opacity: 0 !important; visibility: hidden !important; }

/* ===== v397 — tap-along «📿 Lần hạt» (rail head + Chuỗi actions; never over the crucifix or lyric) ===== */
.hat-tap-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 36px;
  min-width: 44px;
  padding: 4px 12px;
  margin: 0 6px 0 auto;
  border-radius: 999px;
  border: 1px solid rgba(232, 196, 120, 0.7);
  background: rgba(60, 42, 22, 0.92);
  color: #f6e3b4;
  font: 600 13px/1.1 system-ui, -apple-system, "Segoe UI", sans-serif;
  white-space: nowrap;
  cursor: pointer;
  overflow: visible;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}
.hat-tap-btn[hidden] { display: none !important; }
.hat-tap-btn:active { transform: scale(0.96); }
#prayer-panel .prayer-panel-head { flex-wrap: nowrap; }
#prayer-panel .prayer-panel-head .hat-tap-btn + .prayer-panel-close { margin-left: 0; }
#rosary-root .rosary-actions .hat-tap-btn {
  margin: 0 auto 0 0;
  min-height: 44px;
  background: #f3e6cc;
  color: #4a321c;
  border-color: #b8934a;
}
.hat-tap-btn.hat-tap-pulse { animation: hatTapPulse 0.32s ease-out; }
@keyframes hatTapPulse {
  0% { box-shadow: 0 0 0 0 rgba(240, 200, 110, 0.65); }
  100% { box-shadow: 0 0 0 10px rgba(240, 200, 110, 0); }
}
.hat-tap-plus {
  position: absolute;
  left: 50%;
  top: -4px;
  transform: translate(-50%, 0);
  font: 700 14px/1 system-ui, -apple-system, sans-serif;
  color: #ffd98a;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
  pointer-events: none;
  animation: hatTapPlus 0.74s ease-out forwards;
}
.hat-tap-plus.is-capped { color: #d8c8a8; font-size: 11px; }
@keyframes hatTapPlus {
  0% { opacity: 0; transform: translate(-50%, 4px); }
  20% { opacity: 1; }
  100% { opacity: 0; transform: translate(-50%, -26px); }
}
@media (prefers-reduced-motion: reduce) {
  .hat-tap-plus { animation-duration: 0.01s; }
  .hat-tap-btn.hat-tap-pulse { animation: none; }
}
/* v397: toast moved off the chibi by placeToastOffAvatar() — keep it one tidy line where it fits */
#toast.toast-off-avatar { box-sizing: border-box; }

/* ===== v398 — «làm cùng»: Lần hạt cue on each new spoken line, tapped-line state, hạt badge ===== */
.hat-tap-btn.hat-tap-cue { animation: hatTapCue 1.1s ease-out 1; }
@keyframes hatTapCue {
  0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(240, 200, 110, 0.8); }
  30% { transform: scale(1.08); box-shadow: 0 0 0 5px rgba(240, 200, 110, 0.45); }
  100% { transform: scale(1); box-shadow: 0 0 0 14px rgba(240, 200, 110, 0); }
}
.hat-tap-btn.is-tapped { border-color: rgba(232, 196, 120, 0.35); opacity: 0.78; }
#rosary-root .rosary-actions .hat-tap-btn.is-tapped { opacity: 0.7; }
.hat-tap-btn .hat-tap-n {
  position: absolute;
  top: -7px;
  right: -6px;
  min-width: 20px;
  height: 20px;
  padding: 0 5px;
  box-sizing: border-box;
  border-radius: 10px;
  background: #e8c878;
  color: #2a1a0e;
  font: 700 12px/20px system-ui, -apple-system, "Segoe UI", sans-serif;
  text-align: center;
  pointer-events: none;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
}
.hat-tap-btn .hat-tap-n[hidden] { display: none !important; }
@media (prefers-reduced-motion: reduce) {
  .hat-tap-btn.hat-tap-cue { animation: none; outline: 2px solid rgba(240, 200, 110, 0.9); outline-offset: 2px; }
}


/* ===== v399 — short phones: compact the prayer card + tab stack so more of the seated chibi
   stays visible above the UI. syncWorldUiBand measures the new band; _fitSeatedFrame still
   keeps the crucifix fully on screen (cross wins a tie). Does NOT apply at 844vh. */
@media (max-height: 740px) {
  body.prayer-rail-open .prayer-rail {
    bottom: calc(6px + env(safe-area-inset-bottom, 0px)) !important;
    gap: 3px !important;
  }
  body.prayer-rail-open .prayer-tabs {
    margin-bottom: 0 !important;
  }
  body.prayer-rail-open .prayer-tab {
    min-height: 36px !important;
    padding: 5px 3px !important;
    font-size: 11px !important;
  }
  #prayer-panel.prayer-panel,
  .prayer-panel {
    max-height: min(38vh, 230px) !important;
    padding: 5px 8px 6px !important;
  }
  #prayer-panel .prayer-panel-head {
    margin-bottom: 2px !important;
    gap: 6px !important;
  }
  #prayer-panel .prayer-panel-head strong { font-size: 13px !important; }
  #prayer-panel .prayer-panel-close {
    width: 40px !important;
    height: 40px !important;
    min-width: 40px !important;
    min-height: 40px !important;
    font-size: 22px !important;
  }
  #prayer-panel .prayer-counter {
    padding: 3px 8px !important;
    min-height: 28px !important;
    font-size: 12px !important;
  }
  #prayer-panel .prayer-lyric {
    font-size: 13px !important;
    line-height: 1.25 !important;
    margin: 0 0 2px !important;
    max-height: 2.7em !important;
  }
  #prayer-panel .prayer-lyric .pray-line.is-active {
    font-size: 13.5px !important;
    line-height: 1.25 !important;
  }
  #prayer-panel .prayer-lyric .pray-line.is-next { display: none !important; }
  #prayer-panel .prayer-panel-actions {
    gap: 8px !important;
    margin-top: 2px !important;
  }
  #prayer-panel .prayer-voice-btn,
  #prayer-panel #prayer-tap {
    min-height: 40px !important;
    padding: 6px 8px !important;
    font-size: 13px !important;
  }
  #prayer-panel .hat-tap-btn {
    min-height: 32px !important;
    padding: 3px 9px !important;
    font-size: 12px !important;
  }
}

/* ===== v400 — the hands have something to do + Chuỗi inside the church =====
   • «📿 Lần hạt» keeps a soft breathing ring until the player's first real tap (opacity-only ::after, compositor cheap).
   • Phones: the Chuỗi card sits low with a clear top so the crucifix + nave (sitters bow on each line) stay
     visible above it — current line uncut, next line faded, earlier lines hidden; «Tự nhịp» hidden while the
     voice leads (the voice already sets the pace). Lần hạt / Đóng / Tiếp stay ≥44–48px. */
.hat-tap-btn.hat-tap-learn::after {
  content: "";
  position: absolute;
  inset: -5px;
  border-radius: 999px;
  border: 2px solid rgba(240, 200, 110, 0.95);
  box-shadow: 0 0 10px rgba(240, 200, 110, 0.55);
  pointer-events: none;
  opacity: 0.25;
  animation: hatTapLearn 1.9s ease-in-out infinite;
}
@keyframes hatTapLearn {
  0%, 100% { opacity: 0.2; }
  50% { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  .hat-tap-btn.hat-tap-learn::after { animation: none; opacity: 0.85; }
}
@media (max-width: 560px) {
  #rosary-root.open {
    align-items: flex-end;
    background: linear-gradient(180deg, rgba(10, 8, 6, 0) 0%, rgba(10, 8, 6, 0) 42%, rgba(10, 8, 6, 0.42) 100%);
    padding-top: 0;
    padding-bottom: max(8px, env(safe-area-inset-bottom, 0px));
  }
  #rosary-root .rosary {
    max-height: min(52vh, 440px) !important;
    padding: 12px 14px 4px;
    border-radius: 14px 14px 10px 10px;
    box-shadow: 0 -6px 24px rgba(0, 0, 0, 0.35);
  }
  #rosary-root .rosary .count { margin: 0 0 2px; font-size: 14px; }
  #rosary-root .rosary h2 { font-size: 18px; margin: 0 0 2px; line-height: 1.25; }
  #rosary-root .rosary .mystery {
    font-size: 13px;
    margin: 0 0 6px;
    line-height: 1.3;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
    overflow: hidden;
  }
  #rosary-root .rosary .prayer { font-size: 17px; line-height: 1.45; margin: 0 0 6px; gap: 0.2em; }
  #rosary-root .rosary .prayer .prayer-line { display: none; }
  #rosary-root .rosary .prayer .prayer-line.current,
  #rosary-root .rosary .prayer .prayer-line.current + .prayer-line { display: block; }
  #rosary-root .rosary .prayer .prayer-line.current + .prayer-line { opacity: 0.72; font-size: 15px; }
  #rosary-root .rosary .src { font-size: 11px; margin: 0 0 4px; }
  #rosary-root .beads { margin: 0 0 2px; }
  #rosary-root .beads-progress { margin: 0 0 2px; font-size: 14px; }
  #rosary-root.is-voice-led .rosary-tempo { display: none; }
  #rosary-root .rosary-tempo { margin: 0 0 2px; }
  #rosary-root .rosary-actions { padding-top: 6px; }
  #rosary-root .rosary-actions .hat-tap-btn { min-height: 48px; padding: 6px 16px; font-size: 15px; }
}
@media (max-width: 560px) and (max-height: 740px) {
  #rosary-root .rosary .prayer .prayer-line.current + .prayer-line { display: none; }
}
/* v400 short phones: rail voice / Đọc câu back to 44px, Lần hạt 40px (chibi stays above the measured band) */
@media (max-height: 740px) {
  #prayer-panel .prayer-voice-btn,
  #prayer-panel #prayer-tap {
    min-height: 44px !important;
  }
  #prayer-panel .hat-tap-btn {
    min-height: 40px !important;
    padding: 4px 11px !important;
    font-size: 13px !important;
  }
}
@media (max-width: 560px) {
  /* v400: the low Chuỗi sheet covers the tab row — hide it so no tab edges peek out at the sides */
  body:has(#rosary-root.open) .prayer-rail { visibility: hidden; }
}
/* v400: Lần hạt in the rail head is a 44px target on taller phones (the head row is already 48px — no band change) */
#prayer-panel .prayer-panel-head .hat-tap-btn { min-height: 44px; padding: 4px 13px; }

/* v401-nodialog: in-page «Tạ ơn 1 dòng» sheet (replaces the blocking native prompt dialog). Above the check-in modal. */
#gratitude-sheet { z-index: 40; }
#gratitude-sheet .modal { width: min(440px, 100%); }
#gratitude-sheet input[type="text"] {
  display: block; width: 100%; box-sizing: border-box; margin: 12px 0 4px;
  min-height: 48px; padding: 10px 12px; font: inherit; font-size: 17px;
  color: var(--ink); background: #fffaf2; border: 1px solid #b89a72; border-radius: 6px;
}
#gratitude-sheet .modal-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 14px; }
#gratitude-sheet .modal-actions button { min-height: 48px; min-width: 96px; }

/* ===== v407 — «Lần hạt» as a big round mõ / hạt chuỗi (QC-VS-NIEMPHAT #3) =====
   Bottom-right of the prayer card (rail actions row) and of the Chuỗi sheet (actions row): below the lyric, never
   over the crucifix. 64px visual circle, ≥72px hit area (::before, invisible). Big count inside once this prayer
   has a tapped hạt. Press = transform only (compositor), no layout change; pulse/cue restart without reflow. */
#prayer-panel .prayer-panel-actions { align-items: center !important; }
#prayer-panel .prayer-panel-actions .hat-tap-btn.hat-tap-mo,
#rosary-root .rosary-actions .hat-tap-btn.hat-tap-mo,
.hat-tap-btn.hat-tap-mo {
  flex: 0 0 64px !important;
  order: 99;
  width: 64px !important;
  height: 64px !important;
  min-width: 64px !important;
  min-height: 64px !important;
  max-width: 64px;
  padding: 0 !important;
  margin: 0 0 0 2px !important;
  border-radius: 50% !important;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0;
  border: 2px solid #e8c878 !important;
  background: radial-gradient(circle at 38% 30%, #a8743c 0%, #6e4422 55%, #4a2c14 100%) !important;
  color: #fff1cf !important;
  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.45), inset 0 -3px 6px rgba(0, 0, 0, 0.35), inset 0 2px 3px rgba(255, 230, 180, 0.35);
  font: 700 12px/1 system-ui, -apple-system, "Segoe UI", sans-serif !important;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
  transform: translateZ(0) scale(1);
  transition: transform 90ms ease-out;
  will-change: transform;
  user-select: none;
  -webkit-user-select: none;
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}
.hat-tap-btn.hat-tap-mo[hidden] { display: none !important; }
/* ≥72px touch target without growing the layout */
.hat-tap-btn.hat-tap-mo::before {
  content: "";
  position: absolute;
  inset: -7px; /* from the padding box (inside the 2px rim) → 64 + 2×5 = 74px hit circle */
  border-radius: 50%;
}
.hat-tap-btn.hat-tap-mo:active { transform: translateZ(0) scale(0.9); transition-duration: 40ms; }
.hat-tap-btn.hat-tap-mo .hat-mo-ico { font-size: 22px; line-height: 1; pointer-events: none; }
.hat-tap-btn.hat-tap-mo .hat-mo-lbl { margin-top: 3px; font-size: 12px; line-height: 1; letter-spacing: 0.01em; pointer-events: none; }
/* big count replaces the label once this prayer has a tapped hạt */
.hat-tap-btn.hat-tap-mo .hat-tap-n {
  position: static;
  min-width: 0;
  height: auto;
  padding: 0;
  margin-top: 1px;
  border-radius: 0;
  background: none;
  box-shadow: none;
  color: #ffe08a;
  font: 800 24px/1 system-ui, -apple-system, "Segoe UI", sans-serif;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.7);
  font-variant-numeric: tabular-nums;
}
.hat-tap-btn.hat-tap-mo.has-n .hat-mo-lbl { display: none; }
.hat-tap-btn.hat-tap-mo.has-n .hat-mo-ico { font-size: 16px; }
/* tapped-this-line: stays readable (count must be legible), only the rim softens */
.hat-tap-btn.hat-tap-mo.is-tapped,
#rosary-root .rosary-actions .hat-tap-btn.hat-tap-mo.is-tapped { opacity: 1; border-color: rgba(232, 200, 120, 0.5) !important; filter: saturate(0.85); }
.hat-tap-btn.hat-tap-mo .hat-tap-plus { top: -10px; font-size: 16px; }
.hat-tap-btn.hat-tap-mo.hat-tap-learn::after { border-radius: 50%; }
/* pulse / cue: alternate twins so JS restarts them without a forced reflow */
.hat-tap-btn.hat-tap-pulse2 { animation: hatTapPulse2 0.32s ease-out; }
@keyframes hatTapPulse2 {
  0% { box-shadow: 0 0 0 0 rgba(240, 200, 110, 0.65); }
  100% { box-shadow: 0 0 0 10px rgba(240, 200, 110, 0); }
}
.hat-tap-btn.hat-tap-cue2 { animation: hatTapCue2 1.1s ease-out 1; }
@keyframes hatTapCue2 {
  0% { box-shadow: 0 0 0 0 rgba(240, 200, 110, 0.8); }
  30% { box-shadow: 0 0 0 5px rgba(240, 200, 110, 0.45); }
  100% { box-shadow: 0 0 0 14px rgba(240, 200, 110, 0); }
}
/* the mõ cue glows only (no scale) so it never fights the press transform */
.hat-tap-btn.hat-tap-mo.hat-tap-cue { animation: hatTapCue2 1.1s ease-out 1; }
@media (prefers-reduced-motion: reduce) {
  .hat-tap-btn.hat-tap-pulse2, .hat-tap-btn.hat-tap-cue2, .hat-tap-btn.hat-tap-mo.hat-tap-cue { animation: none; }
  .hat-tap-btn.hat-tap-mo { transition: none; }
}
#rosary-root .rosary-actions:has(.hat-tap-mo:not([hidden])) { align-items: center; }
/* rail card: the 64px mõ borrows 7px above / 5px below from the row gap/padding so the card grows only ~4px
   (crucifix framing band barely moves); it still sits below the lyric box and inside the card. */
#prayer-panel .prayer-panel-actions .hat-tap-btn.hat-tap-mo { margin: -7px 0 -5px 2px !important; }
/* v407 short phones: the lyric box sits closer to the actions row — borrow less above so the mõ never touches it */
@media (max-height: 740px) {
  #prayer-panel .prayer-panel-actions .hat-tap-btn.hat-tap-mo { margin: -3px 0 -5px 2px !important; }
}

/* v408: name tags above a few seated worshippers («Anh Phêrô», «Chị Maria»…) — DOM overlay under the HUD,
   no WebGL cost. Small text, soft rounded translucent pill (no backdrop-filter: blur is a GPU pass on phones).
   Position = transform written by scene.js (_tickSitterTags), fade = opacity (both compositor-only). */
#sitter-tags {
  position: absolute; inset: 0; z-index: 1; pointer-events: none; overflow: hidden;
  contain: strict;
}
#sitter-tags .sitter-tag {
  position: absolute; left: 0; top: 0;
  height: 17px; box-sizing: border-box;
  padding: 1px 7px 0; border-radius: 9px;
  background: rgba(28, 18, 10, 0.5);
  box-shadow: inset 0 0 0 0.5px rgba(255, 226, 180, 0.22);
  color: #f7e9d0; font-size: 10.5px; font-weight: 600; line-height: 16px; letter-spacing: 0.01em;
  white-space: nowrap; text-shadow: 0 1px 1px rgba(0, 0, 0, 0.45);
  transform-origin: 50% 100%;
  opacity: 0;
  transition: opacity 0.35s ease, transform 0.08s linear;
  will-change: transform, opacity;
}
body.audio-only #sitter-tags { display: none; }
@media (prefers-reduced-motion: reduce) {
  #sitter-tags .sitter-tag { transition: opacity 0.2s linear; }
}

/* v411 — Giờ tĩnh lặng: dim nhẹ + vòng thở CSS (transform/opacity only — compositor, 0 GPU/frame work in WebGL). */
.quiet-choices { display: flex; gap: 8px; margin: 0 0 12px; }
.quiet-choices button { flex: 1 1 0; min-height: 52px; font-size: 18px; border-radius: 4px; border: 0; cursor: pointer; }
.quiet-amb { margin: 0 0 8px; }
.quiet-stats { margin: 0 0 8px; font-size: 14px; color: var(--ink-soft); }
.quiet-root { position: fixed; inset: 0; z-index: 26; }
.quiet-root[hidden] { display: none; }
.quiet-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.32); }
.quiet-card {
  position: absolute; left: 50%; transform: translateX(-50%);
  bottom: max(20px, env(safe-area-inset-bottom, 0px));
  width: min(360px, calc(100vw - 32px));
  box-sizing: border-box;
  padding: 14px 16px 12px;
  background: rgba(30, 20, 13, 0.78);
  border: 1px solid rgba(184, 147, 74, 0.38);
  border-radius: 6px;
  color: #f3e6cf; text-align: center;
  font-family: var(--serif);
}
.quiet-open-line, .quiet-close-line { margin: 0 0 10px; font-size: 18px; line-height: 1.45; }
.quiet-gloria { margin: 0 0 12px; font-size: 17px; line-height: 1.5; }
.quiet-breath { position: relative; width: 112px; height: 112px; margin: 0 auto 6px; }
.quiet-orb {
  position: absolute; inset: 0; border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 226, 160, 0.55) 0%, rgba(232, 182, 96, 0.28) 45%, rgba(232, 182, 96, 0) 70%);
  transform: scale(0.62); opacity: 0.7;
  will-change: transform, opacity;
}
.quiet-lab {
  position: absolute; left: 0; right: 0; top: 50%; transform: translateY(-50%);
  font-size: 17px; opacity: 0; will-change: opacity;
}
.quiet-remain { margin: 0 0 10px; font-size: 15px; opacity: 0.85; font-variant-numeric: tabular-nums; }
.quiet-stop {
  min-height: 48px; min-width: 120px; padding: 10px 20px;
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 4px;
  font-size: 17px; cursor: pointer;
}
.quiet-root .quiet-open-line, .quiet-root .quiet-breath, .quiet-root .quiet-remain, .quiet-root .quiet-close-wrap { display: none; }
.quiet-root.is-open .quiet-open-line { display: block; }
.quiet-root.is-breath .quiet-breath, .quiet-root.is-breath .quiet-remain { display: block; }
.quiet-root.is-close .quiet-close-wrap { display: block; }
/* 10 s cycle: thở vào 4 s (0–40%), thở ra 6 s (40–100%) */
.quiet-root.is-breath .quiet-orb { animation: quietBreath 10s steps(40) infinite; } /* ~10 updates/s: soak 4× CPU — continuous anim cost ~3 fps in software compositing, steps ≥ v410 */
.quiet-root.is-breath .quiet-in { animation: quietLabIn 10s step-end infinite; }
.quiet-root.is-breath .quiet-out { animation: quietLabOut 10s step-end infinite; }
@keyframes quietBreath {
  0% { transform: scale(0.62); opacity: 0.6; }
  40% { transform: scale(1); opacity: 1; }
  100% { transform: scale(0.62); opacity: 0.6; }
}
@keyframes quietLabIn { 0% { opacity: 1; } 40%, 100% { opacity: 0; } }
@keyframes quietLabOut { 0% { opacity: 0; } 40%, 100% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  .quiet-root.is-breath .quiet-orb { animation: none; transform: scale(0.85); opacity: 0.85; }
}
body.quiet-on .dock, body.quiet-on #prayer-rail, body.quiet-on #hud-stand,
body.quiet-on #hint, body.quiet-on .look-label, body.quiet-on #toast { visibility: hidden; }
body.quiet-on #coach-tip { visibility: hidden; }
.quiet-amb { color: var(--ink); font-size: 16px; }
/* v411: «…» menu never runs off the top on short phones (375×667 already clipped «Âm thanh» in v410) — scroll inside instead */
.more-menu {
  max-height: calc(100vh - 100px - env(safe-area-inset-bottom, 0px));
  max-height: calc(100dvh - 100px - env(safe-area-inset-bottom, 0px));
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}
.more-menu > * { flex-shrink: 0; }
/* v412 — Việc nhẹ hằng ngày: lớp DOM nhẹ (chỉ opacity/transform, không WebGL), thẻ ở dưới — không che cung thánh. */
.chores-root { position: fixed; inset: 0; z-index: 26; }
.chores-root[hidden] { display: none; }
.chores-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.28); }
.chores-card {
  position: absolute; left: 50%; transform: translateX(-50%);
  bottom: max(16px, env(safe-area-inset-bottom, 0px));
  width: min(380px, calc(100vw - 24px));
  max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px); overflow-y: auto;
  box-sizing: border-box; padding: 14px 16px 12px;
  background: rgba(30, 20, 13, 0.86);
  border: 1px solid rgba(184, 147, 74, 0.38); border-radius: 6px;
  color: #f3e6cf; text-align: center; font-family: var(--serif);
}
.chores-title { margin: 0 0 8px; font-size: 21px; font-weight: 600; color: #f6e3b8; }
.chores-sub, .chores-hint { margin: 0 0 10px; font-size: 16px; line-height: 1.45; }
.chores-list { display: flex; flex-direction: column; gap: 8px; margin: 0 0 10px; }
.chores-item {
  display: flex; justify-content: space-between; align-items: center; gap: 10px;
  min-height: 52px; padding: 8px 12px; text-align: left; cursor: pointer;
  background: rgba(74, 52, 40, 0.9); color: #f6efe3;
  border: 1px solid rgba(184, 147, 74, 0.45); border-radius: 4px; font: 17px var(--serif);
}
.chores-item-state { font-size: 14px; opacity: 0.85; white-space: nowrap; }
.chores-item.is-done { background: rgba(60, 72, 50, 0.85); }
.chores-item.is-done .chores-item-state { color: #cfe3c4; opacity: 1; }
.chores-badge { margin: 0 0 8px; font-size: 16px; color: #f6e3b8; }
.chores-badge[hidden], .chores-done[hidden], .chores-hub[hidden], .chores-task[hidden], .chores-btn[hidden] { display: none; }
.chores-tally { margin: 0 0 6px; font-size: 14px; opacity: 0.8; }
.chores-stage {
  position: relative; display: flex; justify-content: center; align-items: flex-end; gap: 6px;
  width: 100%; height: 120px; margin: 0 0 8px; padding: 10px 8px 18px; box-sizing: border-box;
  border-radius: 6px; border: 1px dashed rgba(184, 147, 74, 0.55); cursor: pointer;
  background: rgba(58, 44, 30, 0.55); color: inherit; font-size: 34px; line-height: 1;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
}
.chores-stage:disabled { cursor: default; border-style: solid; }
.chores-stage:active:not(:disabled) { transform: scale(0.985); }
.chores-stage.is-sweep { background: rgba(92, 80, 64, 0.55); flex-wrap: wrap; align-items: center; }
.chores-stage.is-water { background: rgba(62, 52, 34, 0.6); }
.chores-it { display: inline-block; transition: opacity 0.25s ease, transform 0.25s ease; }
.chores-stage.is-flowers .chores-it { position: relative; z-index: 1; margin-bottom: 24px; }
.chores-stage.is-flowers .chores-it.off { opacity: 0.12; transform: translateY(8px) scale(0.85); filter: grayscale(1); }
.chores-stage.is-flowers .chores-it.on { opacity: 1; transform: none; }
.chores-vase {
  position: absolute; left: 50%; bottom: 12px; width: 120px; height: 40px; transform: translateX(-50%);
  background: linear-gradient(#cdb48a, #9c7f52); border-radius: 6px 6px 22px 22px; opacity: 0.9;
}
.chores-stage.is-sweep .chores-it.gone { opacity: 0; transform: translateX(46px) rotate(40deg) scale(0.6); }
.chores-stage.is-water .chores-it { transform: scale(0.8); }
.chores-stage.is-water .chores-it.grown { transform: scale(1.15); }
.chores-progress { margin: 0 0 8px; min-height: 1em; font-size: 15px; opacity: 0.85; font-variant-numeric: tabular-nums; }
.chores-done { margin: 0 0 10px; font-size: 17px; line-height: 1.5; color: #f6e3b8; font-style: italic; }
.chores-actions { display: flex; gap: 8px; justify-content: center; }
.chores-btn {
  min-height: 46px; min-width: 110px; padding: 8px 18px; cursor: pointer;
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 4px; font: 17px var(--serif);
}
@media (prefers-reduced-motion: reduce) { .chores-it { transition: none; } }
body.chores-on .dock, body.chores-on #prayer-rail, body.chores-on #hud-stand,
body.chores-on #hint, body.chores-on .look-label, body.chores-on #toast, body.chores-on #coach-tip { visibility: hidden; }
body.large-text .chores-item, body.large-text .chores-btn { font-size: 19px; }
.chores-tool { position: absolute; left: 10px; top: 8px; font-size: 24px; opacity: 0.9; pointer-events: none; }
.chores-clean { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: 19px; color: #f6e3b8; }

/* v413 — Lịch giữ đạo: lớp DOM nhẹ, thẻ ở dưới (không che cung thánh), không animation. */
.cal-root { position: fixed; inset: 0; z-index: 26; }
.cal-root[hidden] { display: none; }
.cal-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.62); }
.cal-card {
  position: absolute; left: 50%; transform: translateX(-50%);
  bottom: max(16px, env(safe-area-inset-bottom, 0px));
  width: min(380px, calc(100vw - 24px));
  max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px); overflow-y: auto; overscroll-behavior: contain;
  box-sizing: border-box; padding: 12px 14px 10px;
  background: #24160e;
  border: 1px solid rgba(184, 147, 74, 0.38); border-radius: 6px;
  color: #f3e6cf; text-align: center; font-family: var(--serif);
}
.cal-title { margin: 0 0 4px; font-size: 21px; font-weight: 600; color: #f6e3b8; }
.cal-streak { margin: 0 0 8px; font-size: 15px; line-height: 1.4; }
.cal-nav { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: 0 0 6px; }
.cal-month { font-size: 17px; color: #f6e3b8; }
.cal-navbtn {
  min-width: 46px; min-height: 40px; cursor: pointer; font: 22px var(--serif); line-height: 1;
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf; border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 4px;
}
.cal-navbtn:disabled { opacity: 0.35; cursor: default; }
.cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); gap: 3px; margin: 0 0 6px; }
.cal-wd { font-size: 12px; opacity: 0.75; padding: 2px 0; }
.cal-cell {
  min-height: 36px; padding: 0; cursor: pointer; font: 15px var(--serif); font-variant-numeric: tabular-nums;
  background: rgba(58, 44, 30, 0.55); color: #f3e6cf; border: 1px solid transparent; border-radius: 4px;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
}
.cal-cell.is-blank { background: none; cursor: default; }
.cal-cell.is-visit { background: rgba(128, 104, 66, 0.92); }
.cal-cell.is-pray { background: rgba(184, 147, 74, 0.78); color: #22170e; font-weight: 600; }
.cal-cell.is-today { border-color: #f6e3b8; }
.cal-cell.is-sel { outline: 2px solid #f6e3b8; outline-offset: 1px; }
.cal-legend { margin: 0 0 6px; font-size: 13px; opacity: 0.85; }
.cal-key { display: inline-block; width: 11px; height: 11px; border-radius: 2px; vertical-align: -1px; }
.cal-key.is-pray { background: rgba(184, 147, 74, 0.9); }
.cal-key.is-visit { background: rgba(128, 104, 66, 0.95); }
.cal-day { margin: 0 0 6px; min-height: 2.6em; font-size: 15px; line-height: 1.4; }
.cal-feast { color: #f6e3b8; font-style: italic; }
.cal-note { margin: 0 0 8px; font-size: 13px; line-height: 1.4; opacity: 0.8; }
.cal-actions { display: flex; gap: 8px; justify-content: center; }
.cal-btn {
  min-height: 44px; min-width: 100px; padding: 8px 16px; cursor: pointer;
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 4px; font: 17px var(--serif);
}
body.cal-on .dock, body.cal-on #prayer-rail, body.cal-on #hud-stand,
body.cal-on #hint, body.cal-on .look-label, body.cal-on #toast, body.cal-on #coach-tip { visibility: hidden; }
body.large-text .cal-cell { font-size: 17px; }
body.large-text .cal-btn { font-size: 19px; }

/* v414 — Viếng nhà thờ & linh địa: lớp DOM nhẹ, thẻ ở dưới (không che cung thánh), không ảnh, không animation. */
.pil-root { position: fixed; inset: 0; z-index: 26; }
.pil-root[hidden], .pil-root [hidden] { display: none; }
.pil-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.28); }
.pil-card {
  position: absolute; left: 50%; transform: translateX(-50%);
  bottom: max(16px, env(safe-area-inset-bottom, 0px));
  width: min(380px, calc(100vw - 24px));
  max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px); overflow-y: auto; overscroll-behavior: contain;
  box-sizing: border-box; padding: 12px 14px 10px;
  background: rgba(30, 20, 13, 0.9);
  border: 1px solid rgba(184, 147, 74, 0.38); border-radius: 6px;
  color: #f3e6cf; text-align: center; font-family: var(--serif);
}
.pil-title { margin: 0 0 6px; font-size: 20px; font-weight: 600; line-height: 1.3; color: #f6e3b8; }
.pil-badge { margin: 0 0 8px; font-size: 15px; color: #f6e3b8; }
.pil-list { display: flex; flex-direction: column; gap: 6px; margin: 0 0 8px; }
.pil-item {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  min-height: 48px; padding: 7px 12px; text-align: left; cursor: pointer;
  background: rgba(74, 52, 40, 0.9); color: #f6efe3;
  border: 1px solid rgba(184, 147, 74, 0.45); border-left: 3px solid rgba(184, 147, 74, 0.8); border-radius: 4px;
  font: 16px var(--serif); line-height: 1.3;
  -webkit-tap-highlight-color: transparent; touch-action: manipulation;
}
.pil-item-sub { font-size: 13px; opacity: 0.85; }
.pil-item.is-done { background: rgba(60, 72, 50, 0.85); }
.pil-item.is-done .pil-item-sub { color: #cfe3c4; opacity: 1; }
.pil-item.is-locked { cursor: default; opacity: 0.55; border-left-color: rgba(184, 147, 74, 0.3); }
.pil-note { margin: 0 0 8px; font-size: 13px; line-height: 1.4; opacity: 0.8; }
/* v420: tranh minh hoạ nơi viếng (SVG tĩnh) */
.pil-scene-wrap { margin: 0 0 8px; border-radius: 10px; overflow: hidden; border: 1px solid rgba(184,147,74,.45); aspect-ratio: 360 / 200; background: #e8dcc4; }
.pil-scene-wrap:empty { display: none; }
.pil-scene-wrap svg { display: block; width: 100%; height: 100%; }
.pil-visit:not([hidden]) ~ .pil-scene-wrap, .pil-site.is-visiting .pil-scene-wrap { max-height: 120px; }
.pil-place { margin: 0 0 4px; font-size: 14px; letter-spacing: 0.02em; opacity: 0.85; }
.pil-desc { margin: 0 0 10px; font-size: 16px; line-height: 1.45; text-align: left; }
.pil-pick { display: flex; gap: 8px; justify-content: center; margin: 0 0 10px; }
.pil-timer { margin: 0 0 6px; font-size: 18px; color: #f6e3b8; font-variant-numeric: tabular-nums; }
.pil-lead { margin: 0 0 6px; font-size: 14px; opacity: 0.85; }
.pil-ptitle { margin: 6px 0 2px; font-size: 15px; font-weight: 600; color: #f6e3b8; }
.pil-prayer { margin: 0 0 6px; font-size: 15px; line-height: 1.5; text-align: left; }
.pil-done { margin: 0 0 10px; font-size: 17px; line-height: 1.5; color: #f6e3b8; font-style: italic; }
.pil-actions { display: flex; gap: 8px; justify-content: center; }
.pil-btn {
  min-height: 44px; min-width: 100px; padding: 8px 16px; cursor: pointer;
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.5); border-radius: 4px; font: 17px var(--serif);
}
.pil-btn.pil-go { background: rgba(92, 66, 36, 0.95); }
body.pil-on .dock, body.pil-on #prayer-rail, body.pil-on #hud-stand,
body.pil-on #hint, body.pil-on .look-label, body.pil-on #toast, body.pil-on #coach-tip { visibility: hidden; }
body.large-text .pil-item, body.large-text .pil-btn { font-size: 19px; }
body.large-text .pil-desc, body.large-text .pil-prayer { font-size: 18px; }

/* v415 — Hiệp ý cầu nguyện: lớp DOM nhẹ, không máy chủ, không giả cộng đồng online */
.com-root { position: fixed; inset: 0; z-index: 26; }
.com-root[hidden], .com-root [hidden] { display: none; }
.com-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.28); }
.com-card {
  position: absolute; left: 50%; bottom: max(12px, env(safe-area-inset-bottom));
  transform: translateX(-50%); width: min(440px, calc(100% - 24px));
  max-height: min(78vh, 640px); overflow: auto;
  padding: 14px 14px 12px; border-radius: 14px;
  background: rgba(28, 22, 16, 0.94); color: #f0e6d4;
  box-shadow: 0 12px 40px rgba(0,0,0,0.45); border: 1px solid rgba(184, 147, 74, 0.35);
}
.com-title { margin: 0 0 6px; font-size: 20px; font-weight: 600; line-height: 1.3; color: #f6e3b8; }
.com-note { margin: 0 0 8px; font-size: 13px; line-height: 1.4; opacity: 0.85; }
.com-badge { margin: 0 0 8px; font-size: 15px; color: #f6e3b8; }
.com-list { display: flex; flex-direction: column; gap: 6px; margin: 0 0 8px; }
.com-item {
  display: flex; flex-direction: column; gap: 2px; text-align: left;
  padding: 10px 12px; border-radius: 10px; cursor: pointer;
  background: rgba(48, 36, 24, 0.9); color: inherit; border: 0;
  border-left: 3px solid rgba(184, 147, 74, 0.7); font-size: 16px;
}
.com-item-sub { font-size: 13px; opacity: 0.85; }
.com-item.is-done { background: rgba(60, 72, 50, 0.85); }
.com-item.is-done .com-item-sub { color: #cfe3c4; opacity: 1; }
.com-intent { margin: 0 0 10px; font-size: 16px; line-height: 1.45; text-align: left; }
.com-ptitle { margin: 6px 0 2px; font-size: 15px; font-weight: 600; color: #f6e3b8; }
.com-prayer { margin: 0 0 10px; font-size: 15px; line-height: 1.5; text-align: left; }
.com-done { margin: 0 0 10px; font-size: 17px; line-height: 1.5; color: #f6e3b8; font-style: italic; }
.com-actions { display: flex; gap: 8px; justify-content: center; margin-top: 4px; }
.com-btn {
  appearance: none; border: 0; border-radius: 10px; padding: 10px 14px;
  font-size: 16px; background: rgba(48, 36, 24, 0.95); color: #f6e3b8; cursor: pointer;
}
.com-btn.com-go { background: rgba(92, 66, 36, 0.95); }
.com-btn:disabled { opacity: 0.55; cursor: default; }
body.com-on .dock, body.com-on #prayer-rail, body.com-on #hud-stand,
body.com-on #hint, body.com-on .look-label, body.com-on #toast, body.com-on #coach-tip { visibility: hidden; }
body.large-text .com-item, body.large-text .com-btn { font-size: 19px; }
body.large-text .com-intent, body.large-text .com-prayer { font-size: 18px; }

/* v416 — Giờ kinh trong ngày: biểu ngữ nhắc nhẹ + bảng cầu nguyện (DOM, không WebGL, không hoạt họa liên tục) */
.hrs-banner {
  position: fixed; left: 50%; transform: translateX(-50%); z-index: 24;
  top: calc(env(safe-area-inset-top, 0px) + 74px);
  width: min(420px, calc(100% - 24px)); box-sizing: border-box;
  display: flex; align-items: center; gap: 8px; padding: 8px 8px 8px 14px; border-radius: 14px;
  background: rgba(28, 22, 16, 0.92); color: #f6e3b8; border: 1px solid rgba(184, 147, 74, 0.4);
  box-shadow: 0 6px 22px rgba(0,0,0,0.4); font-size: 15px; line-height: 1.35;
}
.hrs-banner[hidden] { display: none; }
.hrs-b-text { flex: 1; text-align: left; }
.hrs-b-go, .hrs-b-x {
  appearance: none; border: 0; border-radius: 10px; min-height: 44px; cursor: pointer;
  background: rgba(92, 66, 36, 0.95); color: #f6e3b8; font-size: 15px; padding: 8px 12px;
}
.hrs-b-x { min-width: 44px; background: transparent; font-size: 22px; padding: 0 8px; }
.hrs-root { position: fixed; inset: 0; z-index: 26; }
.hrs-root[hidden], .hrs-root [hidden] { display: none; }
.hrs-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.28); }
.hrs-card {
  position: absolute; left: 50%; bottom: max(12px, env(safe-area-inset-bottom));
  transform: translateX(-50%); width: min(440px, calc(100% - 24px));
  max-height: min(80vh, 660px); overflow: auto; box-sizing: border-box;
  padding: 14px 14px 12px; border-radius: 14px;
  background: rgba(28, 22, 16, 0.95); color: #f0e6d4;
  box-shadow: 0 12px 40px rgba(0,0,0,0.45); border: 1px solid rgba(184, 147, 74, 0.35);
}
.hrs-title { margin: 0 0 6px; font-size: 20px; font-weight: 600; line-height: 1.3; color: #f6e3b8; }
.hrs-next { margin: 0 0 6px; font-size: 16px; color: #f6e3b8; }
.hrs-note, .hrs-hint { margin: 0 0 8px; font-size: 13px; line-height: 1.4; opacity: 0.85; }
.hrs-list { display: flex; flex-direction: column; gap: 6px; margin: 0 0 8px; }
.hrs-item {
  display: flex; flex-direction: column; gap: 2px; text-align: left;
  padding: 10px 12px; border-radius: 10px; cursor: pointer;
  background: rgba(48, 36, 24, 0.9); color: inherit; border: 0;
  border-left: 3px solid rgba(184, 147, 74, 0.7); font-size: 16px;
}
.hrs-item-sub { font-size: 13px; opacity: 0.85; }
.hrs-item.is-done { background: rgba(60, 72, 50, 0.85); }
.hrs-item.is-done .hrs-item-sub { color: #cfe3c4; opacity: 1; }
.hrs-lines { max-height: 42vh; overflow: auto; margin: 0 0 8px; }
.hrs-line { margin: 0 0 6px; padding: 6px 8px; font-size: 15px; line-height: 1.5; text-align: left; border-radius: 8px; }
.hrs-line.is-next { opacity: 0.35; }
.hrs-line.is-past { opacity: 0.55; }
.hrs-line.is-cur { background: rgba(92, 66, 36, 0.55); opacity: 1; color: #fff3d6; }
.hrs-k { font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; color: #d9b873; margin-right: 4px; }
.hrs-done { margin: 0 0 10px; font-size: 16px; line-height: 1.5; color: #f6e3b8; font-style: italic; }
.hrs-actions { display: flex; gap: 8px; justify-content: center; margin-top: 4px; }
.hrs-btn {
  appearance: none; border: 0; border-radius: 10px; padding: 10px 14px; min-height: 44px;
  font-size: 16px; background: rgba(48, 36, 24, 0.95); color: #f6e3b8; cursor: pointer;
}
.hrs-btn.hrs-go { background: rgba(92, 66, 36, 0.95); }
body.hrs-on .dock, body.hrs-on #prayer-rail, body.hrs-on #hud-stand,
body.hrs-on #hint, body.hrs-on .look-label, body.hrs-on #toast, body.hrs-on #coach-tip { visibility: hidden; }
body.hrs-on .hrs-banner { display: none; }
body.large-text .hrs-item, body.large-text .hrs-btn { font-size: 19px; }
body.large-text .hrs-line, body.large-text .hrs-banner { font-size: 18px; }

/* ===== v416 — bố cục 390×844 & máy ngắn: menu «…» nằm trên cùng, dock dùng được khi ngồi, nhãn dock không bị cắt ===== */
body.more-open #prayer-rail, body.pray-open #prayer-rail,
body.more-open .hat-chip, body.more-open .candle-chip, body.more-open .today-chip,
body.more-open #hud-stand, body.pray-open #hud-stand { visibility: hidden !important; }
body.more-open #dock, body.pray-open #dock { z-index: 45 !important; }
.more-menu {
  max-height: calc(100vh - 150px - env(safe-area-inset-bottom, 0px)) !important;
  max-height: calc(100dvh - 150px - env(safe-area-inset-bottom, 0px)) !important;
}
/* khi ngồi: dock vẫn hiện & bấm được; hàng kinh nhanh nằm trên dock như lúc đứng; «Đứng dậy» nằm trên hàng kinh */
body.is-seated:not(.prayer-rail-open) .dock {
  opacity: 1 !important;
  pointer-events: auto !important;
  transform: translateX(-50%) !important;
}
body.is-seated:not(.prayer-rail-open) .prayer-rail { bottom: calc(78px + env(safe-area-inset-bottom, 0px)) !important; }
body.is-seated:not(.prayer-rail-open) #hud .hud-stand {
  bottom: calc(78px + var(--v391-rail-h, 60px) + 12px + env(safe-area-inset-bottom, 0px)) !important;
}
/* hộp thoại mở → hàng kinh nhanh ẩn như dock (không trông như bấm được) */
body:has(.modal-root.open) #prayer-rail { visibility: hidden; }
/* nhãn dock: xuống 2 dòng thay vì «Cầu ng…» (dock rộng cố định để nút không co lại) */
#dock { width: min(420px, calc(100vw - 20px)); box-sizing: border-box; }
#dock .dock-primary,
#dock > .pray-wrap > #btn-pray {
  white-space: normal !important;
  text-overflow: clip !important;
  overflow: hidden;
  line-height: 1.15 !important;
  padding: 6px 6px !important;
  font-size: 14px;
  word-break: keep-all;
}
/* hàng kinh nhanh: vùng chạm ≥48px */
.prayer-tab { min-height: 48px !important; }
/* v416 — vùng chạm ≥48px & tương phản (người lớn tuổi) */
#gate .gate-privacy-link { color: #5a3a1c !important; display: inline-block; min-height: 48px; line-height: 1.4; padding: 6px 0; }
#gate input[type="checkbox"], .mixer-check input[type="checkbox"] { width: 24px; height: 24px; min-width: 24px; accent-color: #6a4a2a; }
#gate label:has(input[type="checkbox"]), .mixer-check { min-height: 48px; display: flex; align-items: center; gap: 10px; cursor: pointer; }
.cal-cell { min-height: 46px; }
.cal-navbtn { min-width: 48px; min-height: 48px; }
.cal-root button, .chores-root button, .pil-root button, .com-root button { min-height: 48px; }
.rosary .pick-btn-primary, #rosary-pick-body .pick-btn { font-family: inherit; }


/* ===== v418 «Mùa phụng vụ»: chip vòng nến + Lịch Mùa Vọng + Vòng nến + Hang Đá + tháng 11 (js/seasons.js) ===== */
.ssn-chip {
  position: absolute; z-index: 6;
  top: calc(max(16px, env(safe-area-inset-top, 0px)) + 112px);
  right: max(12px, env(safe-area-inset-right, 0px));
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  min-width: 64px; min-height: 64px; padding: 6px 6px 5px; box-sizing: border-box;
  background: rgba(42, 28, 18, 0.88); color: #f3e6cf;
  border: 1px solid rgba(184, 147, 74, 0.55); border-radius: 14px;
  font: 12px/1.15 var(--serif); cursor: pointer; touch-action: manipulation; -webkit-tap-highlight-color: transparent;
}
.ssn-chip[hidden] { display: none; }
.ssn-chip-w { position: relative; display: flex; gap: 4px; align-items: flex-end; height: 22px; padding: 0 4px 3px; }
.ssn-chip-w::after { content: ""; position: absolute; left: -2px; right: -2px; bottom: 0; height: 6px; border-radius: 6px; background: linear-gradient(#3d7140, #24452a); }
.ssn-chip-c { position: relative; width: 5px; height: 14px; border-radius: 1px; background: #6b3b8f; opacity: 0.55; }
.ssn-chip-c.is-rose { background: #d98aa8; }
.ssn-chip-c.ready { opacity: 0.95; }
.ssn-chip-c.lit { opacity: 1; }
.ssn-chip-c.lit::before { content: ""; position: absolute; left: -2px; top: -8px; width: 9px; height: 9px; border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%; background: radial-gradient(circle at 50% 65%, #fff6c8, #ffc24a 55%, rgba(255,138,26,0) 75%); }
.ssn-chip-t { font-weight: 600; color: #f6e3b8; font-size: 12.5px; }
.ssn-chip-l { font-size: 11.5px; opacity: 0.92; white-space: nowrap; }
.ssn-chip-dot { position: absolute; top: 4px; right: 5px; width: 9px; height: 9px; border-radius: 50%; background: #ffcf6a; box-shadow: 0 0 0 2px rgba(42,28,18,.9); }
.ssn-chip-dot[hidden] { display: none; }
body.chores-on .ssn-chip, body.quiet-on .ssn-chip { visibility: hidden; }

.ssn-root { position: fixed; inset: 0; z-index: 27; }
.ssn-root[hidden] { display: none; }
.ssn-dim { position: absolute; inset: 0; background: rgba(8, 6, 4, 0.42); }
.ssn-card {
  position: absolute; left: 50%; transform: translateX(-50%);
  bottom: max(10px, env(safe-area-inset-bottom, 0px)); top: max(10px, env(safe-area-inset-top, 0px));
  width: min(420px, calc(100vw - 16px)); box-sizing: border-box;
  display: flex; flex-direction: column;
  background: rgba(30, 20, 13, 0.96); border: 1px solid rgba(184, 147, 74, 0.45); border-radius: 8px;
  color: #f3e6cf; font-family: var(--serif); contain: layout paint;
}
.ssn-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 8px 4px 16px; }
.ssn-title { margin: 0; font-size: 21px; font-weight: 600; color: #f6e3b8; }
.ssn-x { width: 48px; height: 48px; border: 0; background: transparent; color: #f3e6cf; font-size: 30px; line-height: 1; cursor: pointer; }
.ssn-tabs { display: flex; flex-wrap: wrap; gap: 6px; padding: 4px 12px 8px; }
.ssn-tab {
  flex: 0 0 auto; min-height: 42px; padding: 6px 12px; cursor: pointer;
  background: rgba(74, 52, 40, 0.75); color: #f6efe3; border: 1px solid rgba(184, 147, 74, 0.4); border-radius: 999px; font: 15.5px var(--serif);
}
.ssn-tab.is-on { background: #6b3b8f; border-color: #b58ad6; color: #fff; }
.ssn-body { flex: 1 1 auto; overflow-y: auto; -webkit-overflow-scrolling: touch; padding: 4px 14px 16px; overscroll-behavior: contain; }
.ssn-note { margin: 8px 0; font-size: 15.5px; line-height: 1.5; opacity: 0.92; }
.ssn-sub { margin: 10px 0 6px; font-size: 15.5px; }
.ssn-tally { margin: 8px 0; font-size: 14.5px; opacity: 0.85; text-align: center; }
.ssn-src { margin: 6px 0 0; font-size: 12.5px; opacity: 0.7; }
.ssn-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.ssn-row { display: flex; justify-content: center; gap: 8px; margin: 8px 0; }
.ssn-btn {
  min-height: 46px; padding: 8px 16px; cursor: pointer; border-radius: 6px; font: 16.5px var(--serif);
  background: rgba(42, 28, 18, 0.94); color: #f3e6cf; border: 1px solid rgba(184, 147, 74, 0.5);
}
.ssn-btn-solid { background: #8a5a2c; border-color: #d9b46a; color: #fff8e8; }
.ssn-btn-sm { min-height: 40px; padding: 6px 12px; font-size: 15px; }
.ssn-count { display: flex; align-items: center; gap: 12px; justify-content: center; margin: 6px 0; padding: 10px; border-radius: 8px; background: linear-gradient(90deg, rgba(107,59,143,.45), rgba(107,59,143,.15)); }
.ssn-count-n { font-size: 46px; font-weight: 700; color: #f6e3b8; font-variant-numeric: tabular-nums; }
.ssn-count-l { font-size: 15px; line-height: 1.35; }

.ssn-door-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin: 8px 0; }
.ssn-door {
  position: relative; aspect-ratio: 1 / 1.08; min-height: 48px; padding: 0; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  border-radius: 6px; border: 1px solid rgba(184, 147, 74, 0.45);
  background: linear-gradient(#4a2f5e, #3a2449); color: #f6efe3; font-family: var(--serif);
}
.ssn-door.is-sun { background: linear-gradient(#5a3474, #432a58); border-color: #b58ad6; }
.ssn-door.is-rose { background: linear-gradient(#a25a7a, #7d4060); }
.ssn-door.is-locked { opacity: 0.5; }
.ssn-door.is-ready { box-shadow: inset 0 0 0 2px rgba(255, 207, 106, 0.7); }
.ssn-door.is-today { box-shadow: 0 0 0 2px #ffcf6a, 0 0 12px rgba(255, 207, 106, 0.45); }
.ssn-door.is-open { background: linear-gradient(#7a5a2c, #5a4020); border-color: #d9b46a; }
.ssn-door-d { font-size: 19px; font-weight: 600; line-height: 1; }
.ssn-door-m { font-size: 10.5px; opacity: 0.8; }
.ssn-door-i { position: absolute; top: 2px; right: 4px; font-size: 11px; color: #ffe592; }
.ssn-door-view { margin: 10px 0; padding: 12px; border-radius: 8px; background: rgba(74, 52, 40, 0.6); border: 1px solid rgba(184, 147, 74, 0.4); }
.ssn-door-view[hidden] { display: none; }
.ssn-door-date { margin: 0 0 8px; font-weight: 600; color: #f6e3b8; font-size: 16px; }
.ssn-door-ref, .ssn-door-act { margin: 0 0 8px; font-size: 16px; line-height: 1.5; }
.ssn-door-ref span, .ssn-door-act span { display: block; font-size: 12.5px; opacity: 0.75; text-transform: uppercase; letter-spacing: .04em; }
.ssn-door-ref a { color: #ffd98a; }
.ssn-door-gift { margin: 6px 0 10px; padding: 6px 10px; border-radius: 6px; background: rgba(255, 207, 106, 0.16); color: #ffe7a8; font-size: 15px; text-align: center; }
.ssn-door-gift.is-old { background: transparent; opacity: 0.8; }

.ssn-wreath { width: 100%; max-width: 320px; aspect-ratio: 290 / 170; margin: 4px auto; }
.ssn-candles { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin: 6px 0; }
.ssn-cbtn {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px; min-height: 64px; padding: 8px 10px; text-align: left; cursor: pointer;
  border-radius: 6px; border: 1px solid rgba(181, 138, 214, 0.5); background: rgba(74, 46, 96, 0.55); color: #f6efe3; font-family: var(--serif);
}
.ssn-cbtn.is-rose { border-color: rgba(217, 138, 168, 0.7); background: rgba(125, 64, 96, 0.5); }
.ssn-cbtn.is-ready { box-shadow: inset 0 0 0 2px rgba(255, 207, 106, 0.75); }
.ssn-cbtn.is-lit { background: rgba(122, 90, 44, 0.6); border-color: #d9b46a; }
.ssn-cbtn:disabled { cursor: default; }
.ssn-cbtn:disabled:not(.is-lit) { opacity: 0.55; }
.ssn-cbtn-n { font-size: 15.5px; font-weight: 600; }
.ssn-cbtn-d, .ssn-cbtn-s { font-size: 13px; opacity: 0.85; }
.ssn-flame { transform-box: fill-box; transform-origin: 50% 100%; animation: ssn-flick 2.6s ease-in-out infinite alternate; }
@keyframes ssn-flick { from { transform: scale(1, 1); } to { transform: scale(0.94, 1.06); } }

.ssn-crib-wrap { position: relative; margin: 6px 0; border-radius: 8px; overflow: hidden; border: 1px solid rgba(184, 147, 74, 0.5); }
.ssn-crib { display: block; width: 100%; height: auto; aspect-ratio: 360 / 300; }
.ssn-crib-tag { position: absolute; top: 8px; left: 8px; padding: 3px 8px; border-radius: 999px; background: rgba(0,0,0,.5); font-size: 13px; }
.ssn-tray { display: flex; gap: 8px; overflow-x: auto; padding: 2px 0 6px; }
.ssn-piece {
  flex: 0 0 auto; width: 92px; display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 6px; cursor: pointer;
  border-radius: 8px; border: 1px solid rgba(255, 207, 106, 0.7); background: rgba(74, 52, 40, 0.75); color: #f6efe3; font: 13.5px var(--serif);
}
.ssn-piece canvas { width: 72px; height: 72px; border-radius: 6px; }
.ssn-share-msg { min-height: 1.2em; margin: 4px 0; text-align: center; font-size: 15px; color: #ffe7a8; }

.ssn-souls-form { display: flex; gap: 8px; margin: 8px 0; }
.ssn-souls-form input {
  flex: 1 1 auto; min-width: 0; min-height: 46px; padding: 6px 10px; border-radius: 6px; box-sizing: border-box;
  border: 1px solid rgba(184, 147, 74, 0.55); background: rgba(250, 244, 232, 0.95); color: #2a1d14; font: 17px var(--serif);
}
.ssn-souls { list-style: none; margin: 8px 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ssn-soul { display: flex; align-items: center; gap: 10px; min-height: 52px; padding: 4px 4px 4px 10px; border-radius: 6px; background: rgba(74, 52, 40, 0.6); }
.ssn-soul.is-lit { background: rgba(122, 90, 44, 0.55); }
.ssn-soul-c { position: relative; flex: 0 0 auto; width: 10px; height: 24px; margin-top: 8px; border-radius: 2px; background: #efe6d2; }
.ssn-soul-f { position: absolute; left: -3px; top: -13px; width: 16px; height: 14px; border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%; background: radial-gradient(circle at 50% 65%, #fff6c8, #ffc24a 55%, rgba(255,138,26,0) 75%); }
.ssn-soul-n { flex: 1 1 auto; font-size: 17px; overflow-wrap: anywhere; }
.ssn-soul-s { font-size: 13.5px; opacity: 0.85; white-space: nowrap; }
.ssn-soul-x { width: 40px; height: 40px; border: 0; background: transparent; color: #f3e6cf; opacity: 0.6; font-size: 22px; cursor: pointer; }
.ssn-prayer { margin: 12px 0; padding: 12px; border-left: 3px solid #6b3b8f; background: rgba(107, 59, 143, 0.18); border-radius: 4px; }
.ssn-prayer-t { margin: 0; font-size: 17px; line-height: 1.55; font-style: italic; color: #f6e3b8; }
body.large-text .ssn-note, body.large-text .ssn-door-ref, body.large-text .ssn-door-act { font-size: 18px; }
@media (prefers-reduced-motion: reduce) { .ssn-flame { animation: none; } }
@media (max-height: 640px) { .ssn-door-grid { grid-template-columns: repeat(7, 1fr); } .ssn-wreath { max-width: 240px; } }
.ssn-souls-form .ssn-btn { white-space: nowrap; flex: 0 0 auto; }
/* v418: chip mùa ẩn khi menu/lớp phủ khác mở */
body.more-open .ssn-chip, body.pray-open .ssn-chip, body.cal-on .ssn-chip, body.pil-on .ssn-chip, body.com-on .ssn-chip, body.hrs-on .ssn-chip, body.qz-on .ssn-chip { visibility: hidden; }

/* v418: thẻ Hôm nay ẩn khi menu «…»/kinh mở */
body.more-open #home-pill, body.pray-open #home-pill { visibility: hidden !important; }
/* v418: chip «♪ Nhạc bình an» xuống dưới thẻ Hôm nay; thẻ ẩn khi Góc bình an / mùa phụng vụ mở */
.rx-chip { top: max(212px, calc(env(safe-area-inset-top, 0px) + 206px)) !important; }
body.rx-on #home-pill, body.ssn-on #home-pill, body.modal-open #home-pill { visibility: hidden !important; }

/* ===== v419 polish (PLAYTEST-LAVISH-v418) ===== */
/* N1: «Bốn bước nhẹ» + coach không ló ra trên menu / hộp thoại / lớp phủ */
body.overlay-open .first-tips, body.more-open .first-tips, body.pray-open .first-tips,
body.com-on .first-tips, body.pil-on .first-tips, body.cal-on .first-tips, body.chores-on .first-tips,
body.hrs-on .first-tips, body.qz-on .first-tips, body.rx-on .first-tips, body.home-on .first-tips,
body.quiet-on .first-tips, body:has(.modal-root.open:not(#intro-modal):not(#creator-modal)) .first-tips, body:has(#ssn-root:not([hidden])) .first-tips,
body.overlay-open .coach-tip, body.more-open .coach-tip, body.pray-open .coach-tip,
body.com-on .coach-tip, body.pil-on .coach-tip, body.cal-on .coach-tip, body.chores-on .coach-tip,
body.hrs-on .coach-tip, body.qz-on .coach-tip, body.rx-on .coach-tip, body.home-on .coach-tip,
body.quiet-on .coach-tip, body:has(.modal-root.open) .coach-tip, body:has(#ssn-root:not([hidden])) .coach-tip {
  display: none !important;
}
/* N2: chip nến rỗng («—») không được hiện khi [hidden] (display:inline-flex !important đã đè hidden) */
.candle-chip[hidden], .hat-chip[hidden] { display: none !important; }
/* N3: chip «Hôm nay» xuống tối đa 2 dòng thay vì cắt «…thành To…» */
.today-chip .today-chip-line {
  white-space: normal !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; text-overflow: clip;
  line-height: 1.25;
}
/* N5: nguồn cuối thẻ kinh (Kinh Truyền Tin…) không bị nút Đóng / Mở CGKPV / dock che */
#library-detail { padding-bottom: 96px !important; }
#library-detail p.src { color: #4a3420 !important; opacity: 1 !important; }
/* N6: thông báo hết chục — nền đặc, chữ sáng, tương phản cao */
#toast.toast-rosary-done {
  background: rgba(20, 14, 9, 0.96) !important;
  border: 1px solid #d8b25a !important;
  color: #fff3dc !important;
  box-shadow: 0 4px 18px rgba(0, 0, 0, 0.45);
}
#toast.toast-rosary-done .toast-title { color: #ffe3a3 !important; opacity: 1 !important; }
#toast.toast-rosary-done .toast-body { color: #f6ead2 !important; opacity: 1 !important; }
#toast.toast-rosary-done .toast-action {
  background: #6e522c !important; color: #fff6e4 !important;
  border: 1px solid #e8c27a !important; opacity: 1 !important;
}
/* L12 / N4: vùng chạm ≥48 px còn sót */
.qz-x, #qz-close, #qz-back, .rx-ico, #rx-close, .home-x, #home-close { min-width: 48px !important; min-height: 48px !important; }
.home-x { width: 48px !important; height: 48px !important; border-radius: 24px !important; }
.qz-chip { min-height: 48px !important; }
.ssn-tab { min-height: 48px !important; }
#home-tab-today, #home-tab-altar, #home-tab-path, .hm-slot { min-height: 48px !important; }
label.rosary-tempo, #library-detail label:has(#library-tempo) {
  display: inline-flex !important; align-items: center; gap: 10px; min-height: 48px; padding-right: 8px;
}
#rosary-tempo, #library-tempo { width: 24px !important; height: 24px !important; }
#gate input[type="checkbox"] { width: 26px !important; height: 26px !important; }
.skip-link { min-width: 48px; }
.rx-ico { border-radius: 24px !important; }
/* v419: «Tiếp theo» trong kho kinh — chữ sáng trên nền nâu (trước trông như bị tắt) */
#library-line-next:not(:disabled) { color: #fff6e4 !important; background: #5a3a1c !important; border-color: #d8b25a !important; opacity: 1 !important; }
#library-line-next:disabled { color: #f3e6cf !important; background: #7a6650 !important; opacity: 0.85 !important; }
/* v419: thẻ Hôm nay không đè chip nến khi hàng chip trên xuống dòng */
.home-pill { top: max(calc(122px + env(safe-area-inset-top, 0px)), calc(var(--tb-bottom, 0px) + 8px)) !important; }
.rx-chip { top: max(220px, calc(var(--tb-bottom, 0px) + 96px)) !important; }

/* v420 — Thắp nến thật: que nến kéo tới bấc → tia lửa → ngọn lửa bắt và lớn dần (~1,2 s) → lung linh liên tục.
   Chỉ transform/opacity (lớp ghép). Kiểu nến từ Cửa hàng đổi màu sáp/cốc/ánh + hiệu ứng (hào quang / lấp lánh). */
.lc-stage { position: relative; height: 150px; margin: 4px 0 6px; border-radius: 12px; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none;
  background: radial-gradient(60% 80% at 50% 85%, rgba(255, 190, 100, .10), rgba(20, 12, 6, .55)); }
.lc-stage.is-lit, .lc-stage.is-lighting { background: radial-gradient(60% 80% at 50% 70%, rgba(255, 190, 100, .26), rgba(20, 12, 6, .5)); transition: background .9s; }
.lc-candle { --wax: #f4ecd8; --cup: #b98a4a; --glow: #ffd27a; --band: transparent;
  position: absolute; left: calc(50% - 23px); bottom: 8px; width: 46px; height: 122px; cursor: pointer; -webkit-tap-highlight-color: transparent; outline-offset: 4px; }
.lc-candle i { position: absolute; display: block; left: 50%; pointer-events: none; }
.lc-cup { bottom: 0; width: 46px; height: 24px; margin-left: -23px; border-radius: 3px 3px 9px 9px; background: var(--cup); }
.lc-candle.cs-glass .lc-cup { height: 74px; opacity: .6; border-radius: 6px 6px 10px 10px; background: linear-gradient(90deg, var(--cup), color-mix(in srgb, var(--cup) 55%, #fff) 45%, var(--cup)); }
.lc-candle.cs-crystal .lc-cup { background: repeating-linear-gradient(115deg, rgba(255,255,255,.75) 0 3px, rgba(200,230,245,.35) 3px 8px); opacity: .82; }
.lc-wax { bottom: 16px; width: 26px; height: 62px; margin-left: -13px; border-radius: 3px 3px 2px 2px; box-shadow: inset 0 4px 0 var(--band);
  background: linear-gradient(90deg, color-mix(in srgb, var(--wax) 76%, #000), var(--wax) 40%, color-mix(in srgb, var(--wax) 85%, #fff)); }
.lc-candle.cs-fili .lc-wax { background-image: repeating-linear-gradient(45deg, transparent 0 4px, rgba(182,138,38,.5) 4px 5px), linear-gradient(90deg, #c9a24a, var(--wax) 40%, #fff6dc); }
.lc-wick { bottom: 77px; width: 2px; height: 8px; margin-left: -1px; background: #2a1c12; border-radius: 1px; }
.lc-flame { bottom: 82px; width: 16px; height: 30px; margin-left: -8px; transform-origin: 50% 92%; transform: scale(0); opacity: 0;
  border-radius: 50% 50% 45% 45% / 62% 62% 38% 38%; background: radial-gradient(circle at 50% 76%, #fff 0 16%, #ffe8a8 30%, var(--glow) 58%, rgba(255,140,40,0) 72%); }
.lc-core { left: 50% !important; bottom: 2px; width: 6px; height: 9px; margin-left: -3px; border-radius: 50%; background: rgba(120, 170, 255, .55); }
.lc-glow { bottom: 50px; width: 150px; height: 110px; margin-left: -75px; border-radius: 50%; opacity: 0; background: radial-gradient(closest-side, color-mix(in srgb, var(--glow) 55%, transparent), transparent); }
.lc-halo { bottom: 64px; width: 84px; height: 84px; margin-left: -42px; border-radius: 50%; opacity: 0; border: 2px solid rgba(188, 214, 255, .55); }
.lc-spark { bottom: 84px; width: 26px; height: 26px; margin-left: -13px; border-radius: 50%; opacity: 0; transform: scale(.2);
  background: radial-gradient(closest-side, #fff 0 20%, rgba(255, 220, 140, .9) 40%, transparent 70%); }
.lc-sp { width: 4px; height: 4px; border-radius: 50%; background: #fff7d8; box-shadow: 0 0 4px #ffe08a; opacity: 0; }
.lc-sp.s1 { margin-left: -16px; bottom: 100px; } .lc-sp.s2 { margin-left: 12px; bottom: 92px; } .lc-sp.s3 { margin-left: -6px; bottom: 70px; }
.lc-taper { position: absolute; right: 16%; bottom: 14px; width: 9px; height: 96px; border-radius: 3px; cursor: grab; touch-action: none; z-index: 2;
  background: linear-gradient(90deg, #d9c49a, #f4ead2 45%, #cdb68a); transform-origin: 50% 100%; transform: rotate(-32deg); }
.lc-taper::before { content: ""; position: absolute; left: -10px; right: -10px; top: -14px; bottom: -14px; } /* vùng chạm ≥ 44 px */
.lc-taper.dragging { cursor: grabbing; }
.lc-taper.return { transition: transform .45s ease-out; }
.lc-taper.auto { transition: transform .6s ease-in-out; }
.lc-tflame { position: absolute; left: 50%; top: -15px; width: 10px; height: 17px; margin-left: -5px; border-radius: 50% 50% 45% 45% / 62% 62% 38% 38%;
  background: radial-gradient(circle at 50% 75%, #fff 0 18%, #ffd27a 50%, rgba(255,140,40,0) 72%); animation: lc-flick 1.9s ease-in-out infinite; }
.lc-hint { position: absolute; left: 8px; right: 8px; top: 6px; margin: 0; font-size: 13px; line-height: 1.35; text-align: center; color: var(--ink-soft, #cdbb98); pointer-events: none; }
.lc-stage.is-lighting .lc-spark { animation: lc-spark .5s ease-out both; }
.lc-stage.is-lighting .lc-flame { animation: lc-catch 1.2s cubic-bezier(.3,.7,.3,1) both; }
.lc-stage.is-lighting .lc-glow { animation: lc-glowin 1.2s ease-out both; }
.lc-stage.is-lit .lc-flame { opacity: 1; transform: scale(1); animation: lc-flick 2.6s ease-in-out infinite; will-change: transform; }
.lc-stage.is-lit .lc-glow { opacity: .75; animation: lc-glow 3.4s ease-in-out infinite; }
.lc-stage.is-lit .lc-candle.fx-halo .lc-halo { opacity: 1; animation: lc-halo 4s ease-in-out infinite; }
.lc-stage.is-lit .lc-candle.fx-sparkle .lc-sp { animation: lc-twk 2.8s ease-in-out infinite; }
.lc-stage.is-lit .lc-candle.fx-sparkle .lc-sp.s2 { animation-delay: .9s; } .lc-stage.is-lit .lc-candle.fx-sparkle .lc-sp.s3 { animation-delay: 1.8s; }
.lc-stage.is-lit .lc-taper, .lc-stage.is-lighting .lc-taper { cursor: default; }
@keyframes lc-spark { 0% { opacity: 0; transform: scale(.2); } 30% { opacity: 1; transform: scale(1.1); } 100% { opacity: 0; transform: scale(1.6); } }
@keyframes lc-catch { 0% { opacity: 0; transform: scale(.05, .05); } 18% { opacity: 1; transform: scale(.25, .2); } 45% { transform: scale(.5, .62); } 70% { transform: scale(.85, 1.1); } 85% { transform: scale(1.05, .95); } 100% { opacity: 1; transform: scale(1); } }
@keyframes lc-glowin { from { opacity: 0; } to { opacity: .75; } }
@keyframes lc-flick { 0%, 100% { transform: scale(1, 1) rotate(0); } 25% { transform: scale(.95, 1.06) rotate(-2deg); } 55% { transform: scale(1.04, .94) rotate(1.5deg); } 80% { transform: scale(.98, 1.03) rotate(-1deg); } }
@keyframes lc-glow { 0%, 100% { opacity: .62; } 50% { opacity: .85; } }
@keyframes lc-halo { 0%, 100% { opacity: .55; transform: scale(.96); } 50% { opacity: 1; transform: scale(1.04); } }
@keyframes lc-twk { 0%, 100% { opacity: 0; transform: translateY(0) scale(.6); } 40% { opacity: 1; transform: translateY(-7px) scale(1); } }
.lc-styles { display: flex; gap: 6px; overflow-x: auto; margin: 0 0 8px; scrollbar-width: none; }
.lc-styles:empty { display: none; }
.lc-styles button { flex: none; min-height: 40px; padding: 0 12px; border-radius: 20px; font: 13px inherit; font-family: inherit; cursor: pointer;
  background: rgba(20, 13, 8, .35); color: inherit; border: 1px solid rgba(184, 147, 74, .5); display: inline-flex; align-items: center; gap: 6px; }
.lc-styles button.on { border-color: #e0be7a; box-shadow: inset 0 0 0 1px #e0be7a; }
.lc-styles .lc-dot { width: 12px; height: 12px; border-radius: 50%; }
@media (prefers-reduced-motion: reduce) {
  .lc-stage.is-lighting .lc-flame, .lc-stage.is-lit .lc-flame { animation: none !important; opacity: 1; transform: none; }
  .lc-stage.is-lighting .lc-glow, .lc-stage.is-lit .lc-glow { animation: none !important; opacity: .75; }
  .lc-spark, .lc-sp, .lc-tflame, .lc-halo { animation: none !important; }
  .lc-taper.auto, .lc-taper.return { transition: none; }
}


/* v426 — virtual walk joystick (bottom-left, ~110px, above the dock; pointer-events none — canvas owns the gesture) */
#joy-pad {
  position: absolute;
  width: 110px;
  height: 110px;
  left: calc(14px + env(safe-area-inset-left, 0px));
  bottom: calc(76px + env(safe-area-inset-bottom, 0px));
  top: auto;
  z-index: 18;
  pointer-events: none !important;
  opacity: 0.4;
  transition: opacity .16s ease;
  contain: layout style;
}
#joy-pad.is-active { opacity: 0.78; }
#joy-pad[hidden] { display: none !important; }
body.overlay-open #joy-pad,
body.joy-on #joy-pad,
body.is-seated #joy-pad,
body.quiet-on #joy-pad,
body.prayer-rail-open #joy-pad,
body.intro-open #joy-pad { display: none !important; }
#joy-pad .joy-base,
#joy-pad .joy-knob {
  position: absolute;
  border-radius: 50%;
  box-sizing: border-box;
}
#joy-pad .joy-base {
  inset: 0;
  background: rgba(28, 20, 14, 0.38);
  border: 2px solid rgba(243, 230, 207, 0.38);
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.25);
}
#joy-pad .joy-knob {
  width: 48px;
  height: 48px;
  left: 31px;
  top: 31px;
  background: rgba(243, 230, 207, 0.55);
  border: 2px solid rgba(232, 194, 122, 0.7);
  transform: translate(0, 0);
  will-change: transform;
}
@media (max-width: 390px) {
  #joy-pad {
    left: calc(8px + env(safe-area-inset-left, 0px));
    bottom: calc(158px + env(safe-area-inset-bottom, 0px));
  }
}


/* v427 playtest: one global toast lane. When a sheet is open, toast sits in a reserved
   bottom band and the sheet gains padding so buttons / disclaimers are never covered. */
body.toast-lane-on #toast {
  z-index: 200;
}
body.toast-lane-on.overlay-open #toast,
body.toast-lane-on.parish-on #toast,
body.toast-lane-on.cal-on #toast,
body.toast-lane-on.joy-on #toast,
body.toast-lane-on.need-xu-open #toast,
body.toast-lane-on #toast.toast-above-modal.show {
  z-index: 200;
}
body.toast-lane-on #parish-root #par-body,
body.toast-lane-on #chua-root .cz-body,
body.toast-lane-on #plus-root .plus-sheet,
body.toast-lane-on #games-root,
body.toast-lane-on #need-xu-root .nx-sheet,
body.toast-lane-on #joy-root .joy-sheet {
  padding-top: var(--toast-lane-h, 76px);
  scroll-padding-top: var(--toast-lane-h, 76px);
}
/* Candle modal: footer is a real flex footer, never overlays intention choices */
#candle-modal .modal {
  display: flex !important;
  flex-direction: column;
  max-height: min(88vh, calc(100dvh - 16px));
  overflow: hidden !important;
  padding-bottom: 0 !important;
}
#candle-modal .modal-body {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  padding-bottom: 8px;
}
#candle-modal .modal-actions {
  position: static !important;
  flex: 0 0 auto;
  z-index: 2;
  margin: 0;
  padding: 10px 0 max(8px, env(safe-area-inset-bottom, 0px));
  background: var(--cream);
  box-shadow: 0 -8px 16px var(--cream);
}

/* v427 playtest L1: chip / pin tap targets ≥48px */
.hat-chip, .candle-chip, .today-chip {
  min-height: 48px;
  max-height: none;
  box-sizing: border-box;
}
