@import 'tailwindcss'; @import 'tw-animate-css'; @import "shadcn-svelte/tailwind.css"; @import "@fontsource-variable/inter"; @custom-variant dark (&:is(.dark *)); :root { --bg: #f7fafb; --surface: #ffffff; --surface-2: #f1f5f6; --border: #e2e8ea; --border-strong: #cbd5d8; --text: #1e2a30; --text-2: #4b5a62; --text-3: #7b8a92; --teal: #0d9488; --teal-strong: #0f766e; --teal-soft: #e6f4f2; --ink: #12312d; --danger: #b91c1c; --danger-soft: #fdf2f2; --warn: #92400e; --warn-soft: #fff9ec; --ok: #15803d; --ok-soft: #ecfdf3; --radius: 0.375rem; --shadow: 0 1px 2px rgba(16, 42, 49, 0.05), 0 2px 8px rgba(16, 42, 49, 0.05); --mono: ui-monospace, 'SF Mono', 'JetBrains Mono', Menlo, Consolas, 'Noto Sans Mono CJK SC', monospace; --font: -apple-system, 'SF Pro Text', BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, 'Noto Sans CJK SC', 'Noto Sans SC', 'PingFang SC', 'Microsoft YaHei', sans-serif; --background: #f7fafb; --foreground: oklch(0.145 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.145 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.145 0 0); --primary: #0f766e; --primary-foreground: #ffffff; --secondary: #f1f5f6; --secondary-foreground: oklch(0.205 0 0); --muted: #f1f5f6; --muted-foreground: oklch(0.556 0 0); --accent: #f1f5f6; --accent-foreground: oklch(0.205 0 0); --destructive: oklch(0.577 0.245 27.325); --input: #cbd5d8; --ring: #0d9488; --chart-1: #0f766e; --chart-2: #b45309; --chart-3: #1d4ed8; --chart-4: #8b1d8b; --chart-5: #64748b; --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); font-family: var(--font); font-size: 14.5px; line-height: 1.55; -webkit-font-smoothing: antialiased; } h1, h2, h3, h4 { font-weight: 600; margin: 0; } h1 { font-size: 1.35rem; } h2 { font-size: 1.1rem; } h3 { font-size: 1rem; } a { color: var(--teal-strong); text-decoration: none; } a:hover { text-decoration: underline; } p { margin: 0.4rem 0; } button, input, select, textarea { font: inherit; color: inherit; } .btn { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.45rem 0.95rem; border-radius: var(--radius); border: 1px solid var(--border-strong); background: var(--surface); color: var(--text); cursor: pointer; font-size: 0.92rem; transition: background 0.12s, border-color 0.12s, box-shadow 0.12s; white-space: nowrap; } .btn:hover:not(:disabled) { background: var(--surface-2); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, a:focus-visible { outline: 2px solid var(--teal); outline-offset: 1px; } .btn.primary { background: var(--teal-strong); border-color: var(--teal-strong); color: #fff; } .btn.primary:hover:not(:disabled) { background: #115e59; } .btn.danger { color: var(--danger); border-color: #f2c7c7; } .btn.danger:hover:not(:disabled) { background: var(--danger-soft); } .btn.ghost { border-color: transparent; background: transparent; } .btn.ghost:hover:not(:disabled) { background: var(--surface-2); } .btn.small { padding: 0.25rem 0.6rem; font-size: 0.83rem; } .btn[aria-pressed='true'] { background: var(--teal-soft); border-color: var(--teal); color: var(--ink); } label { display: block; font-size: 0.84rem; color: var(--text-2); font-weight: 500; margin-bottom: 0.25rem; } input, select, textarea.plain { width: 100%; padding: 0.45rem 0.65rem; border: 1px solid var(--border-strong); border-radius: 8px; background: var(--surface); font-size: 0.92rem; } input[type='checkbox'], input[type='radio'] { width: auto; } .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem 1.15rem; box-shadow: var(--shadow); } .card + .card { margin-top: 0.9rem; } .hint { color: var(--text-3); font-size: 0.83rem; } table.data { width: 100%; border-collapse: collapse; font-size: 0.88rem; } table.data th { text-align: left; font-weight: 600; color: var(--text-2); border-bottom: 1px solid var(--border-strong); padding: 0.45rem 0.6rem; white-space: nowrap; } table.data td { border-bottom: 1px solid var(--border); padding: 0.42rem 0.6rem; vertical-align: top; } table.data tr:hover td { background: var(--surface-2); } .num { font-family: var(--mono); font-variant-numeric: tabular-nums; } .badge { display: inline-block; padding: 0.1rem 0.5rem; border-radius: 999px; font-size: 0.76rem; font-weight: 600; border: 1px solid transparent; } .badge.teal { background: var(--teal-soft); color: var(--teal-strong); } .badge.grey { background: var(--surface-2); color: var(--text-2); border-color: var(--border); } .badge.warn { background: var(--warn-soft); color: var(--warn); border-color: #f0ddb4; } .badge.danger { background: var(--danger-soft); color: var(--danger); border-color: #f2c7c7; } .badge.ok { background: var(--ok-soft); color: var(--ok); border-color: #c3ecd0; } .banner { border-radius: var(--radius); padding: 0.65rem 0.9rem; font-size: 0.9rem; border: 1px solid; display: flex; gap: 0.6rem; align-items: flex-start; } .banner.error { background: var(--danger-soft); border-color: #f2c7c7; color: var(--danger); } .banner.warn { background: var(--warn-soft); border-color: #f0ddb4; color: var(--warn); } .banner.info { background: var(--teal-soft); border-color: #c8eae6; color: var(--teal-strong); } .stack { display: flex; flex-direction: column; gap: 0.75rem; } .row { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; } .spread { display: flex; justify-content: space-between; align-items: center; gap: 0.75rem; flex-wrap: wrap; } .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; } .grid3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; } .tabs { display: flex; gap: 0.25rem; border-bottom: 1px solid var(--border); } .tabs button { padding: 0.55rem 1rem; border: none; background: none; color: var(--text-2); font-size: 0.95rem; cursor: pointer; border-bottom: 2px solid transparent; border-radius: 6px 6px 0 0; } .tabs button:hover { background: var(--surface-2); } .tabs button[aria-selected='true'] { color: var(--teal-strong); font-weight: 600; border-bottom-color: var(--teal); } /* metric tiles shared by the results card and other metric rows; without these the six result metrics stacked vertically with large blank space */ .metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 0.7rem; } .metric { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 0.6rem 0.85rem; min-width: 0; } .mlabel { color: var(--text-3); font-size: 0.8rem; } .mvalue { font-size: 1.15rem; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; } .cols-2 { display: grid; grid-template-columns: 1.4fr 1fr; gap: 1rem; align-items: start; } .table-wrap { overflow-x: auto; min-width: 0; } @media (max-width: 900px) { .cols-2 { grid-template-columns: minmax(0, 1fr); } .metric-grid { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); } } code, pre { font-family: var(--mono); font-size: 0.85rem; } pre { margin: 0; white-space: pre-wrap; word-break: break-all; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0; } /* ---- narrow-viewport wrapping (no global content hiding) ---- Real provider error strings contain long unbreakable URLs; .spread/.stack children would otherwise propagate min-content outwards and inflate the document width on mobile. `overflow-wrap` keeps every word reachable while wrapping; nothing is hidden — long tables get a local scroll container. */ .card, .stack, .row, .spread, .banner { min-width: 0; } .banner { overflow-wrap: anywhere; } .banner .err-list { overflow-wrap: anywhere; } .card table.data { min-width: 0; } @media (max-width: 900px) { /* collapse multi-column forms: the dataset wizard grid3 + label min-widths measured 523px min-content at 375px viewport (mobile-overflow-probe) */ .grid2, .grid3 { grid-template-columns: minmax(0, 1fr); } /* wrap table cells instead of nowrap inflating min-content; a truly wide tabular block still gets its own local scrollbar (.scrollx), content remains fully accessible without a document-level horizontal overflow */ table.data th, table.data td { white-space: normal; overflow-wrap: anywhere; } .btn { white-space: normal; } } .dark { --background: oklch(0.145 0 0); --foreground: oklch(0.985 0 0); --card: oklch(0.205 0 0); --card-foreground: oklch(0.985 0 0); --popover: oklch(0.205 0 0); --popover-foreground: oklch(0.985 0 0); --primary: #2dd4bf; --primary-foreground: #04211f; --secondary: oklch(0.269 0 0); --secondary-foreground: oklch(0.985 0 0); --muted: oklch(0.269 0 0); --muted-foreground: oklch(0.708 0 0); --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); --destructive: oklch(0.704 0.191 22.216); --border: oklch(1 0 0 / 10%); --input: oklch(1 0 0 / 15%); --ring: oklch(0.556 0 0); --chart-1: #0f766e; --chart-2: #b45309; --chart-3: #1d4ed8; --chart-4: #8b1d8b; --chart-5: #64748b; --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); --sidebar-primary: oklch(0.488 0.243 264.376); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 10%); --sidebar-ring: oklch(0.556 0 0); } @theme inline { --font-sans: 'Inter Variable', sans-serif; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar: var(--sidebar); --color-chart-5: var(--chart-5); --color-chart-4: var(--chart-4); --color-chart-3: var(--chart-3); --color-chart-2: var(--chart-2); --color-chart-1: var(--chart-1); --color-ring: var(--ring); --color-input: var(--input); --color-border: var(--border); --color-destructive: var(--destructive); --color-accent-foreground: var(--accent-foreground); --color-accent: var(--accent); --color-muted-foreground: var(--muted-foreground); --color-muted: var(--muted); --color-secondary-foreground: var(--secondary-foreground); --color-secondary: var(--secondary); --color-primary-foreground: var(--primary-foreground); --color-primary: var(--primary); --color-popover-foreground: var(--popover-foreground); --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); --color-foreground: var(--foreground); --color-background: var(--background); --radius-sm: calc(var(--radius) * 0.6); --radius-md: calc(var(--radius) * 0.8); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) * 1.4); --radius-2xl: calc(var(--radius) * 1.8); --radius-3xl: calc(var(--radius) * 2.2); --radius-4xl: calc(var(--radius) * 2.6); } @layer base { * { @apply border-border outline-ring/50; } body { @apply bg-background text-foreground; } html { @apply font-sans; } }