/*
 * Masterica · doc-summarizer — FROZEN engine stylesheet (UEB-154 v1).
 *
 * What this file is:
 *   • Design-tokens (colors, type-scale, spacing, radius, shadows).
 *   • Layout primitives (.ms-shell, .ms-header, .ms-main, .ms-footer).
 *   • Component primitives (.ms-card, .ms-input, .ms-button,
 *     .ms-tabs, .ms-tab, .ms-dropzone, .ms-loader, .ms-traffic,
 *     .ms-risk, .ms-alert, .ms-disclaimer).
 *   • Light + dark themes (mode via ``data-theme="dark"`` on <html>).
 *
 * Why it is frozen (DO NOT MODIFY):
 *   Pre-UEB-154 every doc-summarizer build invented its own CSS. Result
 *   (forensic build-90f520d0fb53): forgot to hide spinner on success,
 *   monospace font on result blocks, sticky footer overlapping content,
 *   no traffic-light for risk score. Every regression cost an
 *   acceptance scenario. UEB-154 freezes the visual surface so Builder
 *   ONLY writes content blocks (Jinja `{% block %}`s) and never CSS.
 *
 * How Builder customises:
 *   • Title / subtitle / CTA labels → ``templates/index.html`` blocks.
 *   • Theme tokens (primary / accent) → ``static/app-config.json``
 *     (read by base.js, sets CSS vars on <html>).
 *   • Result rendering → use ``.ms-card`` / ``.ms-risk`` /
 *     ``.ms-traffic`` classes; DO NOT add ``<pre>`` for plain text.
 *
 * Naming convention: ``ms-`` prefix (Masterica) — never collides with
 * Tailwind / Bootstrap utility classes a Builder might paste in.
 */

:root {
  /* Brand tokens — overridable via app-config.json (base.js bridge) */
  --ms-primary:    #2c3e6e;          /* deep blue header */
  --ms-primary-2:  #3b5187;          /* gradient pair */
  --ms-accent:     #5b6cff;          /* CTA / focus ring */
  --ms-success:    #16a34a;          /* low risk traffic */
  --ms-warning:    #d97706;          /* medium risk traffic */
  --ms-danger:     #dc2626;          /* high risk traffic */

  /* Neutrals (light) */
  --ms-bg:         #f4f6fb;
  --ms-surface:    #ffffff;
  --ms-surface-2:  #f8fafc;          /* subtle elevation tier */
  --ms-border:     #e2e8f0;
  --ms-text:       #0f172a;
  --ms-text-soft:  #475569;
  --ms-text-muted: #94a3b8;

  /* Type scale (modular 1.2) */
  --ms-fs-xs:  0.75rem;
  --ms-fs-s:   0.875rem;
  --ms-fs-m:   1rem;
  --ms-fs-l:   1.125rem;
  --ms-fs-xl:  1.375rem;
  --ms-fs-2xl: 1.75rem;
  --ms-fs-3xl: 2.125rem;

  /* Spacing scale (4-px grid) */
  --ms-sp-1: 4px;
  --ms-sp-2: 8px;
  --ms-sp-3: 12px;
  --ms-sp-4: 16px;
  --ms-sp-5: 24px;
  --ms-sp-6: 32px;
  --ms-sp-8: 48px;

  --ms-radius:    14px;
  --ms-radius-s:   8px;
  --ms-radius-pill: 999px;

  --ms-shadow-sm:  0 1px 2px rgba(15,23,42,.06), 0 0 0 1px rgba(15,23,42,.04);
  --ms-shadow-md:  0 6px 24px rgba(15,23,42,.08), 0 0 0 1px rgba(15,23,42,.04);
  --ms-shadow-lg:  0 12px 40px rgba(15,23,42,.12), 0 0 0 1px rgba(15,23,42,.04);

  --ms-font: -apple-system, BlinkMacSystemFont, "Inter", "Segoe UI",
             Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif;
  --ms-font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;

  /* Footer reserved height — body padding-bottom uses this so the
     fixed-position disclaimer never overlaps content. */
  --ms-footer-h: 56px;

  --ms-transition: 160ms cubic-bezier(.4,0,.2,1);
}

[data-theme="dark"] {
  --ms-bg:         #0b1220;
  --ms-surface:    #131b2e;
  --ms-surface-2:  #18223a;
  --ms-border:     #1f2a44;
  --ms-text:       #e2e8f0;
  --ms-text-soft:  #94a3b8;
  --ms-text-muted: #64748b;

  --ms-shadow-sm:  0 1px 2px rgba(0,0,0,.32), 0 0 0 1px rgba(255,255,255,.04);
  --ms-shadow-md:  0 8px 32px rgba(0,0,0,.4),  0 0 0 1px rgba(255,255,255,.04);
  --ms-shadow-lg:  0 16px 48px rgba(0,0,0,.5), 0 0 0 1px rgba(255,255,255,.04);
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
html { scroll-behavior: smooth; }

body {
  font-family: var(--ms-font);
  font-size: var(--ms-fs-m);
  line-height: 1.55;
  color: var(--ms-text);
  background: var(--ms-bg);
  /* UEB-154 P0 fix #3: reserve space for the fixed disclaimer footer
     so the last paragraph of content is never hidden under it. */
  padding-bottom: var(--ms-footer-h);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

/* Long-form LLM-rendered text. The .ms-prose class explicitly forces
   PROPORTIONAL typography so Builder cannot accidentally render the
   result block in monospace (UEB-154 P0 fix #2). */
.ms-prose,
.ms-prose * {
  font-family: var(--ms-font) !important;
  font-variant-numeric: proportional-nums;
  white-space: normal;
}
.ms-prose pre {
  /* If Builder still wraps with <pre>, render it as a flowing
     paragraph rather than monospace block. */
  font-family: var(--ms-font) !important;
  white-space: pre-wrap;
  word-wrap: break-word;
  background: transparent;
  padding: 0;
  margin: 0 0 var(--ms-sp-3) 0;
}
.ms-prose code,
.ms-prose kbd,
.ms-prose samp {
  /* Inline code stays monospace — that IS the right shape. */
  font-family: var(--ms-font-mono) !important;
  font-size: 0.92em;
  background: var(--ms-surface-2);
  padding: 1px 6px;
  border-radius: var(--ms-radius-s);
}

/* ── Layout ───────────────────────────────────────────────────── */

.ms-shell {
  max-width: 960px;
  margin: 0 auto;
  padding: 0 var(--ms-sp-4);
}

.ms-header {
  color: #fff;
  padding: var(--ms-sp-6) var(--ms-sp-4) var(--ms-sp-5);
  margin: 0 calc(-1 * var(--ms-sp-4)) var(--ms-sp-5);
  background: linear-gradient(135deg, var(--ms-primary) 0%, var(--ms-primary-2) 100%);
  box-shadow: var(--ms-shadow-md);
}
.ms-header h1 {
  margin: 0 0 var(--ms-sp-2);
  font-size: var(--ms-fs-2xl);
  font-weight: 700;
  letter-spacing: -0.01em;
  text-align: center;
}
.ms-header p {
  margin: 0;
  font-size: var(--ms-fs-m);
  color: rgba(255,255,255,.85);
  text-align: center;
}

.ms-main { padding-bottom: var(--ms-sp-6); }

/* ── Cards ────────────────────────────────────────────────────── */

.ms-card {
  background: var(--ms-surface);
  border-radius: var(--ms-radius);
  padding: var(--ms-sp-5);
  margin-bottom: var(--ms-sp-4);
  box-shadow: var(--ms-shadow-sm);
  border: 1px solid var(--ms-border);
}
.ms-card-title {
  margin: 0 0 var(--ms-sp-3);
  font-size: var(--ms-fs-l);
  font-weight: 600;
}

/* ── Buttons + inputs ─────────────────────────────────────────── */

.ms-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ms-sp-2);
  padding: var(--ms-sp-3) var(--ms-sp-5);
  border-radius: var(--ms-radius-s);
  border: none;
  background: var(--ms-accent);
  color: #fff;
  font-size: var(--ms-fs-m);
  font-weight: 600;
  font-family: inherit;
  cursor: pointer;
  transition: transform var(--ms-transition), background var(--ms-transition), opacity var(--ms-transition);
}
.ms-button:hover:not(:disabled) { background: #4858e6; transform: translateY(-1px); }
.ms-button:active:not(:disabled) { transform: translateY(0); }
.ms-button:disabled { opacity: .55; cursor: not-allowed; }
.ms-button--ghost {
  background: transparent;
  color: var(--ms-text);
  border: 1px solid var(--ms-border);
}
.ms-button--block { width: 100%; }

.ms-input, .ms-textarea, .ms-select {
  width: 100%;
  padding: var(--ms-sp-3);
  border-radius: var(--ms-radius-s);
  border: 1px solid var(--ms-border);
  background: var(--ms-surface);
  color: var(--ms-text);
  font-family: inherit;
  font-size: var(--ms-fs-m);
  transition: border-color var(--ms-transition), box-shadow var(--ms-transition);
}
.ms-input:focus, .ms-textarea:focus, .ms-select:focus {
  outline: none;
  border-color: var(--ms-accent);
  box-shadow: 0 0 0 3px rgba(91,108,255,.18);
}
.ms-textarea { min-height: 120px; resize: vertical; }

/* ── Tabs ─────────────────────────────────────────────────────── */

.ms-tabs {
  display: flex;
  gap: var(--ms-sp-2);
  background: var(--ms-surface-2);
  padding: var(--ms-sp-1);
  border-radius: var(--ms-radius-s);
  margin-bottom: var(--ms-sp-4);
  border: 1px solid var(--ms-border);
}
.ms-tab {
  flex: 1;
  padding: var(--ms-sp-3) var(--ms-sp-4);
  border: none;
  background: transparent;
  border-radius: calc(var(--ms-radius-s) - 2px);
  color: var(--ms-text-soft);
  font-family: inherit;
  font-size: var(--ms-fs-m);
  font-weight: 600;
  cursor: pointer;
  transition: background var(--ms-transition), color var(--ms-transition);
}
.ms-tab[aria-selected="true"], .ms-tab--active {
  background: var(--ms-surface);
  color: var(--ms-text);
  box-shadow: var(--ms-shadow-sm);
}
.ms-tab:hover:not([aria-selected="true"]) { color: var(--ms-text); }

/* ── Dropzone ─────────────────────────────────────────────────── */

.ms-dropzone {
  border: 2px dashed var(--ms-border);
  border-radius: var(--ms-radius);
  padding: var(--ms-sp-6) var(--ms-sp-5);
  text-align: center;
  cursor: pointer;
  transition: border-color var(--ms-transition), background var(--ms-transition);
  background: var(--ms-surface-2);
}
.ms-dropzone:hover, .ms-dropzone[data-over="true"] {
  border-color: var(--ms-accent);
  background: rgba(91,108,255,.06);
}
.ms-dropzone[data-over="true"] { border-style: solid; }
.ms-dropzone-icon {
  width: 48px; height: 48px;
  margin: 0 auto var(--ms-sp-3);
  color: var(--ms-text-muted);
  transition: color var(--ms-transition);
}
.ms-dropzone:hover .ms-dropzone-icon { color: var(--ms-accent); }
.ms-dropzone-text {
  margin: 0;
  color: var(--ms-text-soft);
  font-size: var(--ms-fs-m);
}
.ms-dropzone-hint {
  margin: var(--ms-sp-2) 0 0;
  color: var(--ms-text-muted);
  font-size: var(--ms-fs-s);
}

/* ── Loader ───────────────────────────────────────────────────── */

/*
 * Single source of truth: ``.ms-loader``. base.js shows/hides it via
 * ``hidden`` attribute, so Builder cannot accidentally leave a spinner
 * running after success. UEB-154 P0 fix #1.
 */
.ms-loader {
  display: flex;
  align-items: center;
  gap: var(--ms-sp-3);
  padding: var(--ms-sp-3) var(--ms-sp-4);
  color: var(--ms-text-soft);
  font-size: var(--ms-fs-s);
}
.ms-loader[hidden] { display: none !important; }
.ms-loader-spinner {
  width: 16px; height: 16px;
  border: 2px solid var(--ms-border);
  border-top-color: var(--ms-accent);
  border-radius: 50%;
  animation: ms-spin .9s linear infinite;
}
@keyframes ms-spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* ── Traffic-light risk score (UEB-138 manifest contract) ────── */

.ms-risk {
  display: inline-flex;
  align-items: center;
  gap: var(--ms-sp-2);
  padding: var(--ms-sp-1) var(--ms-sp-3);
  border-radius: var(--ms-radius-pill);
  font-weight: 600;
  font-size: var(--ms-fs-s);
}
.ms-risk--low    { background: rgba(22,163,74,.12);  color: var(--ms-success); }
.ms-risk--medium { background: rgba(217,119,6,.12);  color: var(--ms-warning); }
.ms-risk--high   { background: rgba(220,38,38,.12);  color: var(--ms-danger);  }
.ms-risk-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: currentColor;
}

/* Big traffic-light meter (track + fill) for the doc-summarizer
   "Риск: 73/100" headline. base.js sets ``data-score`` and the
   CSS picks the right gradient stop. */
.ms-traffic {
  display: flex; align-items: center;
  gap: var(--ms-sp-3);
  margin: var(--ms-sp-2) 0 var(--ms-sp-4);
}
.ms-traffic-track {
  flex: 1; height: 8px;
  background: var(--ms-border);
  border-radius: var(--ms-radius-pill);
  overflow: hidden;
}
.ms-traffic-fill {
  height: 100%;
  width: var(--ms-fill-w, 0%);
  background: var(--ms-success);
  border-radius: inherit;
  transition: width 400ms cubic-bezier(.4,0,.2,1), background-color 400ms;
}
.ms-traffic[data-level="medium"] .ms-traffic-fill { background: var(--ms-warning); }
.ms-traffic[data-level="high"]   .ms-traffic-fill { background: var(--ms-danger); }
.ms-traffic-label {
  font-weight: 600;
  white-space: nowrap;
  color: var(--ms-text);
}

/* ── Alerts / disclaimer ─────────────────────────────────────── */

.ms-alert {
  padding: var(--ms-sp-3) var(--ms-sp-4);
  border-radius: var(--ms-radius-s);
  font-size: var(--ms-fs-s);
  border-left: 4px solid;
}
.ms-alert--critical { background: rgba(220,38,38,.06);  border-left-color: var(--ms-danger);  color: var(--ms-text); }
.ms-alert--warning  { background: rgba(217,119,6,.06);  border-left-color: var(--ms-warning); color: var(--ms-text); }
.ms-alert--info     { background: rgba(91,108,255,.06); border-left-color: var(--ms-accent);  color: var(--ms-text); }

.ms-alert-tag {
  display: inline-block;
  font-size: var(--ms-fs-xs);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  margin-bottom: var(--ms-sp-2);
}
.ms-alert--critical .ms-alert-tag { color: var(--ms-danger); }
.ms-alert--warning  .ms-alert-tag { color: var(--ms-warning); }
.ms-alert--info     .ms-alert-tag { color: var(--ms-accent); }

.ms-disclaimer {
  position: fixed;
  inset: auto 0 0 0;
  z-index: 50;
  padding: var(--ms-sp-2) var(--ms-sp-4);
  background: #fff8e1;
  color: #6b4f00;
  border-top: 1px solid #f5e7b3;
  font-size: var(--ms-fs-xs);
  text-align: center;
  min-height: var(--ms-footer-h);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--ms-sp-2);
}
[data-theme="dark"] .ms-disclaimer {
  background: #2a2310; color: #f1d785; border-top-color: #3d3318;
}

/* ── Utilities ────────────────────────────────────────────────── */

.ms-hidden { display: none !important; }
.ms-only-mobile { display: none; }
@media (max-width: 640px) {
  .ms-only-mobile { display: initial; }
  .ms-only-desktop { display: none; }
  .ms-header { padding: var(--ms-sp-5) var(--ms-sp-3); }
  .ms-card { padding: var(--ms-sp-4); }
}

/* Respect users who prefer reduced motion. */
@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; animation: none !important; }
}

/* Respect dark-mode system preference when site hasn't set theme. */
@media (prefers-color-scheme: dark) {
  html:not([data-theme]) { color-scheme: dark; }
  html:not([data-theme]) body { background: #0b1220; color: #e2e8f0; }
}
