/* 门户的样式入口。打包成 internal/portal/webui/assets/styles.css（shell 第一张样式表）。
   顺序就是层叠顺序：基础层（= signal 皮肤 + 令牌契约的出处）→ 共享图表 → 动效 → 组件 →
   Tailwind 工具类。皮肤样式表与 accent.css 由 shell 在这张之后加载，所以它们压得过这里。 */
/* 门户的令牌与 reset。外观（组件的颜色、圆角、字号）都是 Tailwind 语义类，经 tailwind-preset 读这里的令牌。

   令牌优先级：:root 浅色 → @media (prefers-color-scheme: dark) 系统深色 → :root[data-theme] 使用者的显式选择。
   theme.ts 只设 / 删 [data-theme]，不碰变量。深色写两遍是因为 @media 与 [data-theme] 合不进一个选择器。

   这里定义的就是 signal（唯一的皮肤）的令牌，也是令牌契约（docs/design/ui-skins.md §5.2）：
   skins/signal.css 与深色块都要给全，漏一个不报错，由 internal/uiskin 的契约测试钉住。部署方覆盖强调色时
   JS 写 --ui-accent，--accent 经它生效，其余几个由后加载的 accent.css 派生。
   可选令牌（--focus-ring、--page-glow、--label-size 等）这里不定义，读的地方一律写成 var(--名字, 回退值)。 */

:root {
  --accent: var(--ui-accent, #FFDD4C);   /* signal 的主题金 */
  --accent-text: #715600;   /* #FFDD4C 压暗的金：纸面 #F2F4F7 6.3:1、白卡 6.9:1 */
  --accent-strong: #F2C900;
  --accent-contrast: #1A1500;
  --accent-strong-contrast: #1A1500;   /* 画在 --accent-strong 底上的字（门户主按钮悬停） */
  --accent-glow: rgba(255, 221, 76, 0.35);
  --accent-tint: rgba(255, 221, 76, 0.22);
  --green: #0E9F6E;
  --orange: #D97706;
  --red: #DC2626;
  --bg: #F2F4F7;   /* 中性浅灰纸面 */
  --bg-deep: #E9ECF1;
  --card: #FFFFFF;
  --card-2: #F7F8FA;
  --fill-secondary: rgba(0, 0, 0, 0.05);
  --fill-secondary-hover: rgba(0, 0, 0, 0.08);
  --text-primary: #111111;
  --text-secondary: #45454B;
  --text-tertiary: #5C5C64;   /* 白卡 6.6:1、纸面 6.0:1、最差在导航 pill 底上 4.8:1 */
  --border: rgba(0, 0, 0, 0.08);
  --shadow-card: 0 1px 2px rgba(0, 0, 0, 0.04), 0 8px 24px -12px rgba(0, 0, 0, 0.12);
  --shadow-btn: 0 1px 2px rgba(150, 115, 0, 0.24), 0 6px 16px -8px rgba(150, 115, 0, 0.40);
  --radius-lg: 12px;   /* 卡片（v2 视觉系统：控件 6 / 卡片 12 / 浮层 16） */
  --radius-md: 8px;
  --radius-sm: 6px;
  --space: 16px;
  --font-family: "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB",
    "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;
  --font-mono: "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  /* 字体与小标签的几个角色。signal 全用正文字体；小标签大写加字距（中文界面由 system.css 关掉大写）。 */
  --font-display: var(--font-family);   /* 页面标题、卡片标题 */
  --font-num: var(--font-mono);       /* 大号数字、表格数值列 */
  --font-label: var(--font-family);     /* 表头、小标签、页签 */
  --label-transform: uppercase;
  --label-tracking: 0.04em;
  --card-border: 1px solid var(--border);
  /* 页面底纹：一个背景层——图像（渐变的色标可以读颜色令牌），可带位置、尺寸与平铺，不带
     background-color 分量：它不是最后一层，颜色写在非末层会让整条简写失效。两面都经 background
     简写画，这里叠在 body::before 的光晕之上。 */
  --page-texture: none;
}

@media (prefers-color-scheme: dark) {
  :root {
    --accent: var(--ui-accent, #FFDD4C);
    --accent-text: #FFDD4C;   /* 对深色卡片 #1C1C1E 12.7:1 */
    --accent-strong: #FFE680;
    --accent-contrast: #1A1500;
    --accent-strong-contrast: #1A1500;
    --accent-glow: rgba(255, 221, 76, 0.22);
    --accent-tint: rgba(255, 221, 76, 0.14);
    --green: #34D399;
    --orange: #FBBF24;
    --red: #F87171;
    --bg: #121212;   /* 中性近黑 */
    --bg-deep: #0B0B0B;
    --card: #1C1C1E;
    --card-2: #232325;
    --fill-secondary: rgba(255, 255, 255, 0.08);
    --fill-secondary-hover: rgba(255, 255, 255, 0.12);
    --text-primary: #F5F5F7;
    --text-secondary: #B4B4BA;
    --text-tertiary: #9A9AA2;   /* 卡片 6.1:1、最差在分段控件底上 4.85:1 */
    --border: rgba(255, 255, 255, 0.10);
    --shadow-card: 0 1px 2px rgba(0, 0, 0, 0.30), 0 12px 32px -16px rgba(0, 0, 0, 0.60);
    --shadow-btn: 0 1px 2px rgba(0, 0, 0, 0.35), 0 8px 20px -10px rgba(255, 221, 76, 0.34);
  }
}

:root[data-theme="light"] {
  --accent: var(--ui-accent, #FFDD4C);
  --accent-text: #715600;   /* #FFDD4C 压暗的金：纸面 #F2F4F7 6.3:1、白卡 6.9:1 */
  --accent-strong: #F2C900;
  --accent-contrast: #1A1500;
  --accent-strong-contrast: #1A1500;
  --accent-glow: rgba(255, 221, 76, 0.35);
  --accent-tint: rgba(255, 221, 76, 0.22);
  --green: #0E9F6E;
  --orange: #D97706;
  --red: #DC2626;
  --bg: #F2F4F7;   /* 中性浅灰纸面 */
  --bg-deep: #E9ECF1;
  --card: #FFFFFF;
  --card-2: #F7F8FA;
  --fill-secondary: rgba(0, 0, 0, 0.05);
  --fill-secondary-hover: rgba(0, 0, 0, 0.08);
  --text-primary: #111111;
  --text-secondary: #45454B;
  --text-tertiary: #5C5C64;   /* 白卡 6.6:1、纸面 6.0:1、最差在导航 pill 底上 4.8:1 */
  --border: rgba(0, 0, 0, 0.08);
  --shadow-card: 0 1px 2px rgba(0, 0, 0, 0.04), 0 8px 24px -12px rgba(0, 0, 0, 0.12);
  --shadow-btn: 0 1px 2px rgba(150, 115, 0, 0.24), 0 6px 16px -8px rgba(150, 115, 0, 0.40);
}

:root[data-theme="dark"] {
  --accent: var(--ui-accent, #FFDD4C);
  --accent-text: #FFDD4C;   /* 对深色卡片 #1C1C1E 12.7:1 */
  --accent-strong: #FFE680;
  --accent-contrast: #1A1500;
  --accent-strong-contrast: #1A1500;
  --accent-glow: rgba(255, 221, 76, 0.22);
  --accent-tint: rgba(255, 221, 76, 0.14);
  --green: #34D399;
  --orange: #FBBF24;
  --red: #F87171;
  --bg: #121212;   /* 中性近黑 */
  --bg-deep: #0B0B0B;
  --card: #1C1C1E;
  --card-2: #232325;
  --fill-secondary: rgba(255, 255, 255, 0.08);
  --fill-secondary-hover: rgba(255, 255, 255, 0.12);
  --text-primary: #F5F5F7;
  --text-secondary: #B4B4BA;
  --text-tertiary: #9A9AA2;   /* 卡片 6.1:1、最差在分段控件底上 4.85:1 */
  --border: rgba(255, 255, 255, 0.10);
  --shadow-card: 0 1px 2px rgba(0, 0, 0, 0.30), 0 12px 32px -16px rgba(0, 0, 0, 0.60);
  --shadow-btn: 0 1px 2px rgba(0, 0, 0, 0.35), 0 8px 20px -10px rgba(255, 221, 76, 0.34);
}

* { box-sizing: border-box; }

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

body {
  margin: 0;
  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  font-family: var(--font-family);
  font-size: 16px;
  line-height: 1.5;
  background: var(--bg);
  color: var(--text-primary);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* 页面光晕：顶部居中、fixed，不影响布局与滚动，静止不动——主题色唯一一处「当光用」而不是「当墨用」。
   底纹（--page-texture）叠在最上面：这层渐变不透明，画在 body 上的背景会被整个盖住。光晕与下面那层
   --bg-deep → --bg 的渐变一起是 --page-glow 的回退值，给 --page-glow: none 就是一张平的 --bg 纸面。 */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  pointer-events: none;
  z-index: 0;
  background:
    var(--page-texture),
    var(--page-glow,
      radial-gradient(120% 60% at 50% -8%, var(--accent-glow), transparent 60%),
      linear-gradient(180deg, var(--bg-deep), var(--bg) 240px));
}

a { color: var(--accent-text); text-decoration-thickness: 1px; text-underline-offset: 2px; }
/* 悬停不换字色：--accent-strong 是按钮底色，当字色在深色纸面上只有 2.57:1。下划线加粗来表示。 */
a:hover { text-decoration-thickness: 2px; }

/* 焦点框（不许去掉不补）：颜色读 --focus-ring（可选），回退 --accent-text 而不是 --accent——亮黄的强调色
   当框线在白纸上只有 1.4:1，--accent-text 按约定对纸面不低于 4.5:1，框线要的 3:1 自然够。 */
:focus-visible {
  outline: 2px solid var(--focus-ring, var(--accent-text));
  outline-offset: 2px;
  border-radius: min(var(--radius-sm), 6px);
}

/* 登录 / 状态卡是门面的主角：在顶栏以下的剩余视口里居中（#app 在 body 的纵向 flex 里占满剩余高度）。 */
#app:has(> .login-card), #app:has(> .status-card) {
  display: flex;
  align-items: center;
  justify-content: center;
  padding-top: 0;
  padding-bottom: 0;
}

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; }
}
/* 折线图（packages/ui/src/chart/LineChart.tsx）的 SVG 图形与分类色位；刻度、提示框、图例是组件里的 Tailwind 类。

   分类色位 --ck-1..--ck-8 是**固定顺序**，顺序本身就是色觉安全机制。判据是对卡片底色不低于 3:1
   （WCAG 1.4.11）。浅色 3/4/5 号位是原来那三个色相压暗 OKLCH 亮度得到的，原值对白底只有 2.2~2.8:1。
   相邻两位在色觉缺陷下分不分得开，没有工具在查：定值时用 dataviz 校验器手工量过一次（色觉缺陷
   ΔE 8.8 浅 / 8.4 深，正常视觉 ΔE 17.6 浅 / 19.3 深），改色值要自己重量。超过 8 条序列由 LineChart
   并进「其它」（有突出的合计线时成员跳过金色的 4 号位、至多 7 条），不生成新的色相。 */
:root {
  --ck-1: #2a78d6; --ck-2: #eb6834; --ck-3: #00a370; --ck-4: #c18300;
  --ck-5: #d76c95; --ck-6: #008300; --ck-7: #4a3aa7; --ck-8: #e34948;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --ck-1: #3987e5; --ck-2: #d95926; --ck-3: #199e70; --ck-4: #c98500;
    --ck-5: #d55181; --ck-6: #008300; --ck-7: #9085e9; --ck-8: #e66767;
  }
}
:root[data-theme="dark"] {
  --ck-1: #3987e5; --ck-2: #d95926; --ck-3: #199e70; --ck-4: #c98500;
  --ck-5: #d55181; --ck-6: #008300; --ck-7: #9085e9; --ck-8: #e66767;
}

.ck-grid { stroke: var(--border); stroke-width: 1; }

/* 线宽/点径全部 non-scaling(屏幕像素),不随 viewBox 拉伸。
   色走 currentColor:色位类只设 color,线/点/色键/tooltip 键共用同一条通道。
   单序列的线用 --accent-text 而不是 --accent:前者按约定在每种模式、每个覆盖色下对纸面
   不低于 4.5:1,图形要的 3:1 自然够;--accent 可以是亮黄,画在白卡片上只有 1.4:1。 */
.ck-line { fill: none; stroke: currentColor; stroke-width: 2px; stroke-linejoin: round; }
.ck-accent { color: var(--accent-text); }
/* 色位 0：多序列图里被突出的那一条（如「全组合计」），用主题色、线加粗。 */
.ck-c0 { color: var(--accent-text); }
.ck-line.ck-c0 { stroke-width: 3px; }
.ck-c1 { color: var(--ck-1); }
.ck-c2 { color: var(--ck-2); }
.ck-c3 { color: var(--ck-3); }
.ck-c4 { color: var(--ck-4); }
.ck-c5 { color: var(--ck-5); }
.ck-c6 { color: var(--ck-6); }
.ck-c7 { color: var(--ck-7); }
.ck-c8 { color: var(--ck-8); }
.ck-area { stroke: none; }
/* 渐变面积(上浓下透):stop 元素只挂类,颜色在这里跟主题令牌走。与单序列的线同读 --accent-text:
   读 --accent 的话,部署方给亮黄时浅色下是一条棕线压在一片黄上,给深藏青时深色下线底下的面积看不见。 */
.ck-area-from { stop-color: var(--accent-text); stop-opacity: 0.22; }
.ck-area-to { stop-color: var(--accent-text); stop-opacity: 0; }
.ck-hit { fill: transparent; }
.ck-cursor { stroke: var(--text-tertiary); stroke-width: 1px; stroke-dasharray: 3 3; }
/* 钉住的桶（热力格联动）：主题色、略粗的虚线，与悬停游标分得开。 */
.ck-mark { stroke: var(--accent-text); stroke-width: 2px; stroke-dasharray: 4 3; }
.ck-dot { stroke: currentColor; stroke-width: 8px; }
/* 动效：两面唯一的动效入口（ui-visual-system 的「动效语态与规则」落在这里）。

   令牌挂在 html 上而不是 :root：internal/uiskin 的令牌契约把 :root 下的自定义属性都当成皮肤必须写全的
   清单，而时长与缓动不随皮肤变。html 与 :root 是同一个元素，var(--dur-*) 照常生效；动效类本身在
   tailwind-preset 的 animation / keyframes 里。

   规则（违反就是装饰，不做）：
     - 只动 transform 与 opacity。登记的例外：SVG 描边长度（折线描绘）。
     - 工作区时长不超过 240ms；退场比进场快；
     - 每条动效说得出语态：放（按压）、导（折线描绘）、结（卡片落位、条子生长）、停（收起）；
     - 系统开启「减少动态效果」时时长归零、直接给终态。 */

html {
  --dur-press: 80ms;
  --dur-hover: 120ms;
  --dur-swap: 180ms;
  --dur-enter: 240ms;
  --dur-draw: 520ms;
  --stagger-step: 40ms;
  --ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --ease-enter: cubic-bezier(0.05, 0.7, 0.1, 1);
  --ease-exit: cubic-bezier(0.3, 0, 0.8, 0.15);
  --ease-settle: cubic-bezier(0.34, 1.36, 0.64, 1);
}

@media (prefers-reduced-motion: reduce) {
  html {
    --dur-press: 0ms;
    --dur-hover: 0ms;
    --dur-swap: 0ms;
    --dur-enter: 0ms;
    --dur-draw: 0ms;
    --stagger-step: 0ms;
  }
}

/* 动效 keyframes 与 animation 入口在 Tailwind preset 中登记；本文件只保留跨页面的时长与缓动令牌。 */
/* 页面内的版本脚注、读数一律等宽数字，列与列对得齐。 */

/* 面板里放的是原先的整张卡：去掉卡片自己的外框与阴影，面板本身就是那张卡。 */
.ui-sheet-body .card { border: 0; box-shadow: none; padding: 0; margin: 0; background: transparent; }

/* 面板里放的是整张配置卡，标题已由 SheetTitle 给出，卡片自己的大标题不再重复。 */
.ui-sheet-body .card > h2:first-child, .ui-sheet-body .card > .card-head:first-child > h2 { display: none; }

/* 住宅卡的内容包在 fieldset 里，只为保存 / 删除途中一并禁用。去掉 UA 的边框与内边距；UA 默认的
   min-inline-size: min-content 会让长串把卡片在窄屏上撑出视口，也一并去掉。 */
/* 状态位空着时也占一行高：否则「已保存」出现、4 秒后清空，保存键那一行各跳一次。 */
/* 仪器化语汇（刻度环、读数、热力格、拓扑、会呼吸的状态点）与门面特效的样式。
   两面都加载。颜色只读令牌：门户是 --green/--orange/--red，运维面是 --good/--warning/--critical，
   这里两个都写、前者带后者做回退。只动 transform 与 opacity（SVG 描边长度除外）。 */

/* ── 会呼吸的状态点：活的东西才呼吸（在线、实时连接）。离线的点静止。 ── */
@keyframes ui-breath {
  0% { transform: scale(1); opacity: 0.55; }
  70% { transform: scale(2.4); opacity: 0; }
  100% { transform: scale(2.4); opacity: 0; }
}
.dot-online { position: relative; }
.dot-online::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: inherit;
  animation: ui-breath 2.4s var(--ease-standard) infinite;
}

/* ── 刻度环 ── */
.ui-tick { stroke: var(--border); stroke-width: 1.4; stroke-linecap: round; }
.ui-tick.is-major { stroke-width: 2.2; }
@keyframes ui-tick-on { from { opacity: 0.15; } to { opacity: 1; } }
.ui-tick.is-lit {
  stroke: var(--accent-text);
  animation: ui-tick-on var(--dur-swap) var(--ease-enter) backwards;
  animation-delay: calc(var(--tick-i, 0) * 12ms);
}
.ui-tickring.is-warn .ui-tick.is-lit { stroke: var(--orange, var(--warning)); }
.ui-tickring.is-crit .ui-tick.is-lit { stroke: var(--red, var(--critical)); }

/* ── 热力格 ── */
.ui-hg-cell {
  display: block;
  aspect-ratio: 1.6;
  border-radius: min(var(--radius-sm), 3px);
  background: var(--accent-text);
  opacity: 0.08;
  animation: ui-fade var(--dur-enter) var(--ease-enter) backwards;
  animation-delay: calc(var(--hg-d, 0) * 10ms);
}

/* ── 节点拓扑 ── */
.ui-topo-link line { stroke: var(--border); stroke-width: 1.5; }
.ui-topo-link.is-ok line { stroke: color-mix(in srgb, var(--accent-text) 55%, transparent); }
.ui-topo-link.is-crit line, .ui-topo-link.is-unknown line { stroke-dasharray: 4 5; }
@keyframes ui-pulse-run {
  0% { transform: translate(0, 0); opacity: 0; }
  12% { opacity: 1; }
  88% { opacity: 1; }
  100% { transform: translate(var(--dx), var(--dy)); opacity: 0; }
}
.ui-topo-pulse {
  fill: var(--accent-text);
  animation: ui-pulse-run var(--dur, 2s) linear infinite;
  animation-delay: var(--phase, 0s);
}
.ui-topo-hub circle { fill: var(--accent); stroke: var(--accent-text); stroke-width: 1.5; }
.ui-topo-hub .ui-topo-hub-ring { fill: var(--accent-tint); }
.ui-topo-hub text, .ui-topo-label { fill: var(--text-primary); font-size: 13px; font-weight: 600; font-family: var(--font-label); }
.ui-topo-status { fill: var(--text-secondary); font-size: var(--t-overline); }
.ui-topo-node .ui-topo-dot { fill: var(--card); stroke-width: 3; stroke: var(--text-tertiary); transition: transform var(--dur-hover) var(--ease-standard); transform-box: fill-box; transform-origin: center; }
.ui-topo-node.is-ok .ui-topo-dot { stroke: var(--green, var(--good)); }
.ui-topo-node.is-warn .ui-topo-dot { stroke: var(--orange, var(--warning)); }
.ui-topo-node.is-crit .ui-topo-dot { stroke: var(--red, var(--critical)); fill: color-mix(in srgb, var(--red, var(--critical)) 18%, var(--card)); }
.ui-topo-node:hover .ui-topo-dot, .ui-topo-node:focus-visible .ui-topo-dot { transform: scale(1.25); }
.ui-topo-node:focus-visible .ui-topo-label { text-decoration: underline; }
.ui-topo-breath { fill: var(--green, var(--good)); transform-box: fill-box; transform-origin: center; animation: ui-breath 2.6s var(--ease-standard) infinite; }

/* ── 门面特效：信号中继网络 ── */
@media (prefers-reduced-motion: reduce) {
  .dot-online::after, .ui-topo-breath, .ui-topo-pulse { animation: none; opacity: 0; }
  .ui-tick.is-lit, .ui-hg-cell { animation: none; }
}

/* ── 链路图（门户「我的链路」）：节点即入口 ── */
/* 窄屏车道：每条到达目标的路径一行，节点是小胶囊，箭头带线的状态。 */
.ui-route-chip.is-live { border-color: color-mix(in srgb, var(--accent-text) 50%, var(--border)); }
.ui-route-chip.is-selected { box-shadow: 0 0 0 2px var(--accent-tint); }
.ui-route-col { fill: var(--text-tertiary); font-family: var(--font-label); font-size: var(--t-overline); letter-spacing: var(--label-tracking); text-transform: var(--label-transform); }
.ui-route-link path { fill: none; stroke: var(--border); stroke-width: 1.6; }
.ui-route-link.is-live path { stroke: color-mix(in srgb, var(--accent-text) 60%, transparent); stroke-width: 2; }
.ui-route-link.is-idle path { stroke: color-mix(in srgb, var(--accent-text) 35%, transparent); }
.ui-route-link.is-off path { stroke-dasharray: 4 6; }
.ui-route-link.is-fail path { stroke: var(--red, var(--critical)); stroke-dasharray: 4 5; }
/* 脉冲沿链路曲线流动：offset-path 上推 offset-distance（与 transform 同属合成层的运动路径）。 */
@keyframes ui-route-run {
  0% { offset-distance: 0%; opacity: 0; }
  10% { opacity: 1; }
  90% { opacity: 1; }
  100% { offset-distance: 100%; opacity: 0; }
}
.ui-route-pulse { fill: var(--accent-text); offset-rotate: 0deg; animation: ui-route-run 2.4s linear infinite; }
.ui-route-disc { fill: var(--card); stroke: var(--border); stroke-width: 2; transition: transform var(--dur-hover) var(--ease-standard); transform-box: fill-box; transform-origin: center; }
/* 底色不透明（主题色按比例混进卡片底色）：半透明底会让连线从图标上穿过去。 */
.ui-route-node.is-live .ui-route-disc { stroke: var(--accent-text); fill: color-mix(in srgb, var(--accent) 24%, var(--card)); }
.ui-route-node.is-idle .ui-route-disc { stroke: color-mix(in srgb, var(--accent-text) 50%, var(--border)); }
.ui-route-node.is-fail .ui-route-disc { stroke: var(--red, var(--critical)); }
/* 未配置是虚线圈、图标降到三级字色；与「已配置、还没检测结论」（实线、半饱和）一眼分开。 */
.ui-route-node.is-off .ui-route-disc { stroke-dasharray: 3 4; }
.ui-route-node.is-off .ui-route-glyph { fill: var(--text-tertiary); }
/* 三种交互态各有各的样子：悬停 = 放大；选中（面板正开着它）= 粗描边 + 主题色底；键盘焦点 = 外圈焦点环
   （.ui-route-focus，平时透明）+ 名字下划线。此前三者共用一个样式，焦点分辨不出来。 */
.ui-route-node:hover .ui-route-disc { transform: scale(1.12); }
.ui-route-node.is-selected .ui-route-disc { stroke-width: 3; fill: color-mix(in srgb, var(--accent) 40%, var(--card)); }
.ui-route-focus { fill: none; stroke: transparent; stroke-width: 2; }
.ui-route-node:focus-visible .ui-route-focus { stroke: var(--accent-text); }
.ui-route-node:focus-visible .ui-route-label { text-decoration: underline; text-underline-offset: 3px; }
.ui-route-glyph { fill: var(--accent-text); font-size: 12px; font-weight: 700; font-family: var(--font-label); pointer-events: none; }
.ui-route-label { fill: var(--text-primary); font-size: 13px; font-weight: 600; }
.ui-route-status { fill: var(--text-secondary); font-size: var(--t-overline); }
.ui-route-node.is-fail .ui-route-status { fill: var(--red-text, color-mix(in oklab, var(--red, var(--critical)) 60%, var(--text-primary))); }
.ui-route-breath { fill: var(--accent); opacity: 0.12; transform-box: fill-box; transform-origin: center; animation: ui-breath 2.8s var(--ease-standard) infinite; }
@media (prefers-reduced-motion: reduce) {
  .ui-route-pulse, .ui-route-breath { animation: none; opacity: 0; }
}

/* 「落地」：保存成功、面板关上后，刚改过的节点外放三圈主题色的环，把结果落回它在链路里的位置。
   只动 transform / opacity；时长读 --dur-draw——减少动态效果时它是 0，动画不出画面、animationend 照常触发，
   landed 随之清掉。放大到 1.6 倍为止，不压到节点下面的名字。窄屏车道里是胶囊外一圈伪元素光环，同样只动
   transform / opacity（不动 box-shadow）。 */
@keyframes ui-route-land { from { transform: scale(1); opacity: 0.9; } to { transform: scale(1.6); opacity: 0; } }
.ui-route-land { fill: none; stroke: var(--accent-text); stroke-width: 2; transform-box: fill-box; transform-origin: center; pointer-events: none;
  opacity: 0; animation: ui-route-land var(--dur-draw) var(--ease-enter) 3; }
.ui-route-chip.is-landed::after { content: ''; position: absolute; inset: -3px; border-radius: inherit; border: 2px solid var(--accent-text);
  pointer-events: none; opacity: 0; animation: ui-route-land var(--dur-draw) var(--ease-enter) 3; }

/* 断链图形（错误页、取数失败卡）：你这一端主题色实心，够不着的那一端空心，断口一个红叉。 */
.ui-broken-live { stroke: var(--accent-text); stroke-width: 2; stroke-linecap: round; }
.ui-broken-dead { stroke: var(--border); stroke-width: 2; stroke-dasharray: 3 5; stroke-linecap: round; }
.ui-broken-x { stroke: var(--red, var(--critical)); stroke-width: 2; stroke-linecap: round; fill: none; }
.ui-broken-near { fill: var(--accent); stroke: var(--accent-text); stroke-width: 2; }
.ui-broken-far { fill: var(--card); stroke: var(--text-tertiary); stroke-width: 2; stroke-dasharray: 3 3; }

/* 拓扑按健康成簇：环内侧一条淡色弧带 + 段名与台数。弧带只是分组提示，颜色淡，状态仍以节点圈与文字为准。 */
.ui-topo-band path { fill: none; stroke-width: 10; stroke-linecap: round; opacity: 0.22; stroke: var(--text-tertiary); }
.ui-topo-band.is-ok path { stroke: var(--green, var(--good)); }
.ui-topo-band.is-warn path { stroke: var(--orange, var(--warning)); }
.ui-topo-band.is-crit path { stroke: var(--red, var(--critical)); }
.ui-topo-band text { fill: var(--text-secondary); font-size: var(--t-overline); font-weight: 600; paint-order: stroke; stroke: var(--card); stroke-width: 4px; }
/* 系统层：两面共用的系统令牌、元素级默认排版，以及少数按位置生效的规则。组件的外观都在 Tailwind 类里。

   系统令牌挂在 html 上（不进 :root 的皮肤令牌契约）：
     字号阶梯   --t-hero … --t-overline，行高随级别给（tailwind-preset 的 text-* 读它们）；
     间距阶梯   --s-1 … --s-12（4 的倍数）。
   颜色只读令牌：中性灰承担画面，主题色（--accent 底、--accent-text 线与字）只给链路、主序列、当前项，状态色只有三档。 */

html {
  --t-hero: clamp(40px, 5vw, 64px); --lh-hero: 1.04;
  --t-display: 40px; --lh-display: 44px;
  --t-metric: 32px; --lh-metric: 36px;
  --t-h1: 24px; --lh-h1: 32px;
  --t-h2: 17px; --lh-h2: 24px;
  --t-h3: 14px; --lh-h3: 22px;
  --t-body: 14px; --lh-body: 22px;
  --t-control: 14px; --lh-control: 22px;
  --t-caption: 13px; --lh-caption: 18px;
  --t-overline: 12px; --lh-overline: 16px;
  --s-1: 4px; --s-2: 8px; --s-3: 12px; --s-4: 16px; --s-5: 20px; --s-6: 24px; --s-8: 32px; --s-10: 40px; --s-12: 48px;
  --control-h: 36px;
  --shadow-ground: 0 1px 2px rgba(10, 20, 30, 0.05);
  --shadow-float: 0 8px 24px -8px rgba(10, 20, 30, 0.22);
  --shadow-pop: 0 24px 64px -16px rgba(10, 20, 30, 0.42);
}

/* ── 排版 ─────────────────────────────────────────────────────────── */
body {
  font-family: var(--font-family);
  font-size: var(--t-body);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
h1 { font-family: var(--font-display); font-size: var(--t-h1); line-height: var(--lh-h1); font-weight: 650; letter-spacing: -0.01em; margin: 0; }
h2 { font-family: var(--font-display); font-size: var(--t-h2); line-height: var(--lh-h2); font-weight: 620; letter-spacing: -0.005em; margin: 0; }
h3 { font-size: var(--t-h3); line-height: var(--lh-h3); font-weight: 600; margin: 0; }
/* overline：表头、小标签、栏目名。拉丁大写加字距，中文不受 transform 影响。 */
th, .ui-route-col {
  font-family: var(--font-label); font-size: var(--t-overline); line-height: var(--lh-overline);
  font-weight: 600; letter-spacing: var(--label-tracking); text-transform: var(--label-transform); color: var(--text-tertiary);
}
/* 读数：所有数字、端口、地址、时间走等宽字体与等宽数字。 */
code, .mono {
  font-family: var(--font-num); font-variant-numeric: tabular-nums;
}

.card > * + * { margin-top: var(--s-3); }
.card > .card-head + * { margin-top: 0; }

.ui-route-label, .ui-topo-label, .ui-topo-hub text { font-size: var(--t-body); }
.ui-route-status, .ui-topo-status { font-size: var(--t-caption); }
.ui-route-glyph { font-size: var(--t-caption); }


/* 中文界面不做大写变换：中文没有大小写，变换只会把单位改坏（「6h 前生成」→「6H 前生成」）。 */
html:lang(zh) { --label-transform: none; }

/* 画布上的字描一圈卡片底色的「光晕」：节点正上 / 正下方的连线会穿过名字与状态（如 hk-01 的「在线」），
   光晕把线在字下面截断，字形完整可读。只描边、不改字号。 */
.ui-topo-label, .ui-topo-status, .ui-topo-hub text, .ui-route-label, .ui-route-status { paint-order: stroke; stroke: var(--card); stroke-width: 4px; stroke-linejoin: round; }
/* 热力格还没到的小时：虚线框、不填色，与「最少」那一档（淡金实心）一眼分开。 */
.ui-hg-cell.is-void { background: transparent; opacity: 1; outline: 1px dashed var(--border); outline-offset: -1px; animation: none; }
/* 画布离屏时暂停里面的常驻动画（链路脉冲、节点呼吸）；data-offscreen 由 useBoxWidth 的 IntersectionObserver 写。 */
[data-offscreen] * { animation-play-state: paused !important; }
/* ── 登录页两栏（宽屏）──────────────────────────────────────────────── */
#app:has(> .login-split) { display: flex; align-items: center; justify-content: center; }

.login-route-link path { stroke: color-mix(in srgb, var(--accent-text) 60%, transparent); stroke-width: 2; fill: none; }
.login-route-node circle { fill: color-mix(in srgb, var(--accent) 24%, var(--card)); stroke: var(--accent-text); stroke-width: 2; }
.login-route-glyph { fill: var(--accent-text); font-size: var(--t-overline); font-weight: 700; font-family: var(--font-label); }
.login-route-label { fill: var(--text-secondary); font-size: var(--t-caption); }

/* base 不能省：preflight 关着时它只产出 *, ::before, ::after 上那组 --tw-* 默认值（ring、translate、
   backdrop-filter 等工具类都读它们）。少了它，ring-* 整条 box-shadow 无效（按钮键盘焦点环看不见）、
   active:translate-y-px 与 backdrop-blur 一起失效，且不报任何错。 */
*, ::before, ::after {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}
::backdrop {
  --tw-border-spacing-x: 0;
  --tw-border-spacing-y: 0;
  --tw-translate-x: 0;
  --tw-translate-y: 0;
  --tw-rotate: 0;
  --tw-skew-x: 0;
  --tw-skew-y: 0;
  --tw-scale-x: 1;
  --tw-scale-y: 1;
  --tw-pan-x:  ;
  --tw-pan-y:  ;
  --tw-pinch-zoom:  ;
  --tw-scroll-snap-strictness: proximity;
  --tw-gradient-from-position:  ;
  --tw-gradient-via-position:  ;
  --tw-gradient-to-position:  ;
  --tw-ordinal:  ;
  --tw-slashed-zero:  ;
  --tw-numeric-figure:  ;
  --tw-numeric-spacing:  ;
  --tw-numeric-fraction:  ;
  --tw-ring-inset:  ;
  --tw-ring-offset-width: 0px;
  --tw-ring-offset-color: #fff;
  --tw-ring-color: rgb(59 130 246 / 0.5);
  --tw-ring-offset-shadow: 0 0 #0000;
  --tw-ring-shadow: 0 0 #0000;
  --tw-shadow: 0 0 #0000;
  --tw-shadow-colored: 0 0 #0000;
  --tw-blur:  ;
  --tw-brightness:  ;
  --tw-contrast:  ;
  --tw-grayscale:  ;
  --tw-hue-rotate:  ;
  --tw-invert:  ;
  --tw-saturate:  ;
  --tw-sepia:  ;
  --tw-drop-shadow:  ;
  --tw-backdrop-blur:  ;
  --tw-backdrop-brightness:  ;
  --tw-backdrop-contrast:  ;
  --tw-backdrop-grayscale:  ;
  --tw-backdrop-hue-rotate:  ;
  --tw-backdrop-invert:  ;
  --tw-backdrop-opacity:  ;
  --tw-backdrop-saturate:  ;
  --tw-backdrop-sepia:  ;
  --tw-contain-size:  ;
  --tw-contain-layout:  ;
  --tw-contain-paint:  ;
  --tw-contain-style:  ;
}
.container {
  width: 100%;
}
@media (min-width: 640px) {

  .container {
    max-width: 640px;
  }
}
@media (min-width: 768px) {

  .container {
    max-width: 768px;
  }
}
@media (min-width: 1024px) {

  .container {
    max-width: 1024px;
  }
}
@media (min-width: 1280px) {

  .container {
    max-width: 1280px;
  }
}
@media (min-width: 1536px) {

  .container {
    max-width: 1536px;
  }
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}
.pointer-events-none {
  pointer-events: none;
}
.\!visible {
  visibility: visible !important;
}
.visible {
  visibility: visible;
}
.static {
  position: static;
}
.fixed {
  position: fixed;
}
.absolute {
  position: absolute;
}
.relative {
  position: relative;
}
.sticky {
  position: sticky;
}
.inset-0 {
  inset: 0px;
}
.inset-y-0 {
  top: 0px;
  bottom: 0px;
}
.left-1\/2 {
  left: 50%;
}
.right-0 {
  right: 0px;
}
.right-4 {
  right: 1rem;
}
.top-1\/2 {
  top: 50%;
}
.top-2 {
  top: 0.5rem;
}
.top-3 {
  top: 0.75rem;
}
.top-4 {
  top: 1rem;
}
.z-0 {
  z-index: 0;
}
.z-20 {
  z-index: 20;
}
.z-50 {
  z-index: 50;
}
.z-\[1\] {
  z-index: 1;
}
.z-\[2\] {
  z-index: 2;
}
.col-span-full {
  grid-column: 1 / -1;
}
.col-start-2 {
  grid-column-start: 2;
}
.row-start-1 {
  grid-row-start: 1;
}
.m-0 {
  margin: 0px;
}
.-my-1\.5 {
  margin-top: -0.375rem;
  margin-bottom: -0.375rem;
}
.mx-0 {
  margin-left: 0px;
  margin-right: 0px;
}
.mx-3 {
  margin-left: 0.75rem;
  margin-right: 0.75rem;
}
.mx-auto {
  margin-left: auto;
  margin-right: auto;
}
.my-0 {
  margin-top: 0px;
  margin-bottom: 0px;
}
.my-1 {
  margin-top: 0.25rem;
  margin-bottom: 0.25rem;
}
.my-1\.5 {
  margin-top: 0.375rem;
  margin-bottom: 0.375rem;
}
.my-2 {
  margin-top: 0.5rem;
  margin-bottom: 0.5rem;
}
.my-2\.5 {
  margin-top: 0.625rem;
  margin-bottom: 0.625rem;
}
.my-3 {
  margin-top: 0.75rem;
  margin-bottom: 0.75rem;
}
.my-3\.5 {
  margin-top: 0.875rem;
  margin-bottom: 0.875rem;
}
.my-4 {
  margin-top: 1rem;
  margin-bottom: 1rem;
}
.-ml-px {
  margin-left: -1px;
}
.mb-0 {
  margin-bottom: 0px;
}
.mb-0\.5 {
  margin-bottom: 0.125rem;
}
.mb-1 {
  margin-bottom: 0.25rem;
}
.mb-1\.5 {
  margin-bottom: 0.375rem;
}
.mb-2 {
  margin-bottom: 0.5rem;
}
.mb-2\.5 {
  margin-bottom: 0.625rem;
}
.mb-3 {
  margin-bottom: 0.75rem;
}
.mb-3\.5 {
  margin-bottom: 0.875rem;
}
.mb-4 {
  margin-bottom: 1rem;
}
.mb-5 {
  margin-bottom: 1.25rem;
}
.mb-6 {
  margin-bottom: 1.5rem;
}
.mb-8 {
  margin-bottom: 2rem;
}
.ml-2 {
  margin-left: 0.5rem;
}
.ml-auto {
  margin-left: auto;
}
.mt-0 {
  margin-top: 0px;
}
.mt-0\.5 {
  margin-top: 0.125rem;
}
.mt-1 {
  margin-top: 0.25rem;
}
.mt-1\.5 {
  margin-top: 0.375rem;
}
.mt-2 {
  margin-top: 0.5rem;
}
.mt-2\.5 {
  margin-top: 0.625rem;
}
.mt-3 {
  margin-top: 0.75rem;
}
.mt-3\.5 {
  margin-top: 0.875rem;
}
.mt-4 {
  margin-top: 1rem;
}
.mt-5 {
  margin-top: 1.25rem;
}
.mt-6 {
  margin-top: 1.5rem;
}
.mt-hero {
  margin-top: 12vh;
}
.mt-quota {
  margin-top: 18px;
}
.box-border {
  box-sizing: border-box;
}
.block {
  display: block;
}
.inline-block {
  display: inline-block;
}
.flex {
  display: flex;
}
.inline-flex {
  display: inline-flex;
}
.table {
  display: table;
}
.grid {
  display: grid;
}
.inline-grid {
  display: inline-grid;
}
.hidden {
  display: none;
}
.aspect-square {
  aspect-ratio: 1 / 1;
}
.size-14 {
  width: 3.5rem;
  height: 3.5rem;
}
.size-2\.5 {
  width: 0.625rem;
  height: 0.625rem;
}
.size-3\.5 {
  width: 0.875rem;
  height: 0.875rem;
}
.size-4 {
  width: 1rem;
  height: 1rem;
}
.size-\[1em\] {
  width: 1em;
  height: 1em;
}
.size-dot {
  width: 9px;
  height: 9px;
}
.h-0\.5 {
  height: 0.125rem;
}
.h-1\.5 {
  height: 0.375rem;
}
.h-11 {
  height: 2.75rem;
}
.h-14 {
  height: 3.5rem;
}
.h-16 {
  height: 4rem;
}
.h-2 {
  height: 0.5rem;
}
.h-2\.5 {
  height: 0.625rem;
}
.h-3 {
  height: 0.75rem;
}
.h-3\.5 {
  height: 0.875rem;
}
.h-4 {
  height: 1rem;
}
.h-48 {
  height: 12rem;
}
.h-5 {
  height: 1.25rem;
}
.h-7 {
  height: 1.75rem;
}
.h-8 {
  height: 2rem;
}
.h-9 {
  height: 2.25rem;
}
.h-auto {
  height: auto;
}
.h-control {
  height: var(--control-h);
}
.h-dvh {
  height: 100dvh;
}
.h-full {
  height: 100%;
}
.h-odo {
  height: 1.1em;
}
.h-plot {
  height: 150px;
}
.h-px {
  height: 1px;
}
.h-screen {
  height: 100vh;
}
.max-h-dvh {
  max-height: 100dvh;
}
.max-h-odo {
  max-height: 1.1em;
}
.min-h-0 {
  min-height: 0px;
}
.min-h-11 {
  min-height: 2.75rem;
}
.min-h-5 {
  min-height: 1.25rem;
}
.min-h-control {
  min-height: var(--control-h);
}
.w-0\.5 {
  width: 0.125rem;
}
.w-11\/12 {
  width: 91.666667%;
}
.w-2\/3 {
  width: 66.666667%;
}
.w-24 {
  width: 6rem;
}
.w-3 {
  width: 0.75rem;
}
.w-3\.5 {
  width: 0.875rem;
}
.w-32 {
  width: 8rem;
}
.w-4\/5 {
  width: 80%;
}
.w-40 {
  width: 10rem;
}
.w-72 {
  width: 18rem;
}
.w-auto {
  width: auto;
}
.w-bar {
  width: calc(100% - 2 * var(--s-4));
}
.w-control {
  width: var(--control-h);
}
.w-full {
  width: 100%;
}
.w-px {
  width: 1px;
}
.w-screen {
  width: 100vw;
}
.min-w-0 {
  min-width: 0px;
}
.min-w-0\.5 {
  min-width: 0.125rem;
}
.min-w-32 {
  min-width: 8rem;
}
.min-w-ip {
  min-width: 140px;
}
.min-w-node {
  min-width: 150px;
}
.max-w-\[30\%\] {
  max-width: 30%;
}
.max-w-auth {
  max-width: 400px;
}
.max-w-confirm {
  max-width: min(360px, calc(100vw - 32px));
}
.max-w-dialog {
  max-width: min(520px, calc(100vw - 32px));
}
.max-w-full {
  max-width: 100%;
}
.max-w-measure {
  max-width: 34em;
}
.max-w-page {
  max-width: 1240px;
}
.max-w-qr {
  max-width: 220px;
}
.max-w-sheet {
  max-width: min(560px, 100vw);
}
.max-w-shell {
  max-width: 1280px;
}
.max-w-split {
  max-width: 1040px;
}
.max-w-tip {
  max-width: min(360px, calc(100vw - 24px));
}
.flex-1 {
  flex: 1 1 0%;
}
.flex-\[0_0_400px\] {
  flex: 0 0 400px;
}
.flex-\[1_1_0\] {
  flex: 1 1 0;
}
.flex-\[1_1_140px\] {
  flex: 1 1 140px;
}
.flex-\[1_1_240px\] {
  flex: 1 1 240px;
}
.flex-auto {
  flex: 1 1 auto;
}
.flex-none {
  flex: none;
}
.shrink-0 {
  flex-shrink: 0;
}
.grow {
  flex-grow: 1;
}
.basis-40 {
  flex-basis: 10rem;
}
.basis-hero-body {
  flex-basis: 280px;
}
.border-collapse {
  border-collapse: collapse;
}
.origin-left {
  transform-origin: left;
}
.-translate-x-1\/2 {
  --tw-translate-x: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-x-\[calc\(100\%\+12px\)\] {
  --tw-translate-x: calc(calc(100% + 12px) * -1);
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-y-1\/2 {
  --tw-translate-y: -50%;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.-translate-y-\[calc\(100\%\+10px\)\] {
  --tw-translate-y: calc(calc(100% + 10px) * -1);
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-x-3 {
  --tw-translate-x: 0.75rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.translate-y-2\.5 {
  --tw-translate-y: 0.625rem;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.transform {
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
@keyframes grow {

  from {
    transform: scaleX(0);
  }

  to {
    transform: none;
  }
}
.animate-grow {
  animation: grow var(--dur-draw) var(--ease-enter) backwards;
}
.animate-none {
  animation: none;
}
@keyframes pulse {

  50% {
    opacity: .5;
  }
}
.animate-pulse {
  animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
@keyframes reveal {

  from {
    opacity: 0;
    transform: translateY(6px);
  }

  to {
    opacity: 1;
    transform: none;
  }
}
.animate-reveal {
  animation: reveal var(--dur-enter) var(--ease-enter) calc(min(var(--reveal-index, 0), 6) * var(--stagger-step)) backwards;
}
@keyframes skeleton-in {

  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}
.animate-skeleton-in {
  animation: skeleton-in var(--dur-enter) var(--ease-standard) 300ms backwards;
}
.cursor-pointer {
  cursor: pointer;
}
.select-all {
  -webkit-user-select: all;
     -moz-user-select: all;
          user-select: all;
}
.resize-y {
  resize: vertical;
}
.resize {
  resize: both;
}
.list-none {
  list-style-type: none;
}
.grid-cols-3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
.grid-cols-\[repeat\(auto-fill\2c minmax\(180px\2c 1fr\)\)\] {
  grid-template-columns: repeat(auto-fill,minmax(180px,1fr));
}
.grid-cols-auth-card {
  grid-template-columns: auto 1fr;
}
.grid-cols-auth-picker {
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
.grid-cols-heat {
  grid-template-columns: auto repeat(var(--hg-cols), minmax(0, 1fr));
}
.grid-cols-probe {
  grid-template-columns: 1fr auto;
}
.flex-row {
  flex-direction: row;
}
.flex-col {
  flex-direction: column;
}
.flex-wrap {
  flex-wrap: wrap;
}
.flex-nowrap {
  flex-wrap: nowrap;
}
.place-items-center {
  place-items: center;
}
.items-start {
  align-items: flex-start;
}
.items-center {
  align-items: center;
}
.items-baseline {
  align-items: baseline;
}
.justify-start {
  justify-content: flex-start;
}
.justify-end {
  justify-content: flex-end;
}
.justify-center {
  justify-content: center;
}
.justify-between {
  justify-content: space-between;
}
.gap-0 {
  gap: 0px;
}
.gap-0\.5 {
  gap: 0.125rem;
}
.gap-1 {
  gap: 0.25rem;
}
.gap-1\.5 {
  gap: 0.375rem;
}
.gap-12 {
  gap: 3rem;
}
.gap-2 {
  gap: 0.5rem;
}
.gap-2\.5 {
  gap: 0.625rem;
}
.gap-3 {
  gap: 0.75rem;
}
.gap-4 {
  gap: 1rem;
}
.gap-6 {
  gap: 1.5rem;
}
.gap-grid {
  gap: 3px;
}
.gap-px {
  gap: 1px;
}
.gap-x-1\.5 {
  -moz-column-gap: 0.375rem;
       column-gap: 0.375rem;
}
.gap-x-2\.5 {
  -moz-column-gap: 0.625rem;
       column-gap: 0.625rem;
}
.gap-x-3 {
  -moz-column-gap: 0.75rem;
       column-gap: 0.75rem;
}
.gap-x-4 {
  -moz-column-gap: 1rem;
       column-gap: 1rem;
}
.gap-y-0\.5 {
  row-gap: 0.125rem;
}
.gap-y-1 {
  row-gap: 0.25rem;
}
.gap-y-2 {
  row-gap: 0.5rem;
}
.overflow-hidden {
  overflow: hidden;
}
.overflow-visible {
  overflow: visible;
}
.overflow-x-auto {
  overflow-x: auto;
}
.overflow-y-auto {
  overflow-y: auto;
}
.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.whitespace-nowrap {
  white-space: nowrap;
}
.whitespace-pre {
  white-space: pre;
}
.whitespace-pre-line {
  white-space: pre-line;
}
.break-all {
  word-break: break-all;
}
.rounded {
  border-radius: 0.25rem;
}
.rounded-2xl {
  border-radius: 1rem;
}
.rounded-full {
  border-radius: 9999px;
}
.rounded-lg {
  border-radius: var(--radius-lg);
}
.rounded-md {
  border-radius: var(--radius-md);
}
.rounded-pill {
  border-radius: var(--radius-pill, 999px);
}
.rounded-sm {
  border-radius: var(--radius-sm);
}
.rounded-l-lg {
  border-top-left-radius: var(--radius-lg);
  border-bottom-left-radius: var(--radius-lg);
}
.border {
  border-width: 1px;
}
.border-0 {
  border-width: 0px;
}
.border-b {
  border-bottom-width: 1px;
}
.border-l-2 {
  border-left-width: 2px;
}
.border-t {
  border-top-width: 1px;
}
.border-solid {
  border-style: solid;
}
.border-border {
  border-color: var(--border);
}
.border-current {
  border-color: currentColor;
}
.border-danger {
  border-color: var(--red, var(--critical));
}
.border-danger-border {
  border-color: color-mix(in srgb, var(--red, var(--critical)) 35%, var(--border));
}
.border-primary-text {
  border-color: var(--accent-text);
}
.border-transparent {
  border-color: transparent;
}
.border-warning-border {
  border-color: color-mix(in srgb, var(--orange, var(--warning)) 35%, transparent);
}
.bg-\[\.\.\.\] {
  background-color: ...;
}
.bg-\[rgba\(4\2c 12\2c 16\2c 0\.5\)\] {
  background-color: rgba(4,12,16,0.5);
}
.bg-background-deep {
  background-color: var(--bg-deep);
}
.bg-border {
  background-color: var(--border);
}
.bg-card {
  background-color: var(--card);
}
.bg-card-frost {
  background-color: color-mix(in srgb, var(--card) 88%, transparent);
}
.bg-card-glass {
  background-color: color-mix(in srgb, var(--card) 92%, transparent);
}
.bg-card-muted {
  background-color: var(--card-2);
}
.bg-current {
  background-color: currentColor;
}
.bg-danger {
  background-color: var(--red, var(--critical));
}
.bg-danger-banner {
  background-color: color-mix(in srgb, var(--red, var(--critical)) 10%, var(--card));
}
.bg-danger-soft {
  background-color: color-mix(in srgb, var(--red, var(--critical)) 16%, transparent);
}
.bg-danger-tint {
  background-color: color-mix(in srgb, var(--red, var(--critical)) 10%, transparent);
}
.bg-foreground {
  background-color: var(--text-primary);
}
.bg-muted {
  background-color: var(--fill-secondary);
}
.bg-muted-foreground {
  background-color: var(--text-secondary);
}
.bg-primary {
  background-color: var(--accent);
}
.bg-primary-text {
  background-color: var(--accent-text);
}
.bg-primary-tint {
  background-color: var(--accent-tint);
}
.bg-series {
  background-color: var(--series-fill, var(--accent-text));
}
.bg-subtle {
  background-color: var(--text-tertiary);
}
.bg-success {
  background-color: var(--green, var(--good));
}
.bg-success-soft {
  background-color: color-mix(in srgb, var(--green, var(--good)) 14%, transparent);
}
.bg-transparent {
  background-color: transparent;
}
.bg-warning {
  background-color: var(--orange, var(--warning));
}
.bg-warning-banner {
  background-color: color-mix(in srgb, var(--orange, var(--warning)) 12%, var(--card));
}
.bg-warning-soft {
  background-color: color-mix(in srgb, var(--orange, var(--warning)) 20%, transparent);
}
.bg-white {
  --tw-bg-opacity: 1;
  background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1));
}
.bg-brand-mark {
  background-image: var(--brand-mark, url("/assets/favicon.svg"));
}
.bg-\[length\:22px_22px\] {
  background-size: 22px 22px;
}
.bg-\[position\:left_center\] {
  background-position: left center;
}
.bg-no-repeat {
  background-repeat: no-repeat;
}
.p-0 {
  padding: 0px;
}
.p-0\.5 {
  padding: 0.125rem;
}
.p-3 {
  padding: 0.75rem;
}
.p-4 {
  padding: 1rem;
}
.p-6 {
  padding: 1.5rem;
}
.\!px-0 {
  padding-left: 0px !important;
  padding-right: 0px !important;
}
.px-0 {
  padding-left: 0px;
  padding-right: 0px;
}
.px-0\.5 {
  padding-left: 0.125rem;
  padding-right: 0.125rem;
}
.px-1\.5 {
  padding-left: 0.375rem;
  padding-right: 0.375rem;
}
.px-2 {
  padding-left: 0.5rem;
  padding-right: 0.5rem;
}
.px-2\.5 {
  padding-left: 0.625rem;
  padding-right: 0.625rem;
}
.px-3 {
  padding-left: 0.75rem;
  padding-right: 0.75rem;
}
.px-4 {
  padding-left: 1rem;
  padding-right: 1rem;
}
.px-6 {
  padding-left: 1.5rem;
  padding-right: 1.5rem;
}
.px-8 {
  padding-left: 2rem;
  padding-right: 2rem;
}
.px-address-x {
  padding-left: 13px;
  padding-right: 13px;
}
.py-0 {
  padding-top: 0px;
  padding-bottom: 0px;
}
.py-0\.5 {
  padding-top: 0.125rem;
  padding-bottom: 0.125rem;
}
.py-1 {
  padding-top: 0.25rem;
  padding-bottom: 0.25rem;
}
.py-1\.5 {
  padding-top: 0.375rem;
  padding-bottom: 0.375rem;
}
.py-10 {
  padding-top: 2.5rem;
  padding-bottom: 2.5rem;
}
.py-2 {
  padding-top: 0.5rem;
  padding-bottom: 0.5rem;
}
.py-2\.5 {
  padding-top: 0.625rem;
  padding-bottom: 0.625rem;
}
.py-3 {
  padding-top: 0.75rem;
  padding-bottom: 0.75rem;
}
.py-address {
  padding-top: 11px;
  padding-bottom: 11px;
}
.py-px {
  padding-top: 1px;
  padding-bottom: 1px;
}
.pb-1 {
  padding-bottom: 0.25rem;
}
.pb-1\.5 {
  padding-bottom: 0.375rem;
}
.pb-12 {
  padding-bottom: 3rem;
}
.pb-4 {
  padding-bottom: 1rem;
}
.pl-3 {
  padding-left: 0.75rem;
}
.pl-8 {
  padding-left: 2rem;
}
.pl-axis {
  padding-left: 52px;
}
.pr-1 {
  padding-right: 0.25rem;
}
.pr-10 {
  padding-right: 2.5rem;
}
.pr-2 {
  padding-right: 0.5rem;
}
.pt-1 {
  padding-top: 0.25rem;
}
.pt-6 {
  padding-top: 1.5rem;
}
.pt-quota-inset {
  padding-top: 14px;
}
.text-left {
  text-align: left;
}
.text-center {
  text-align: center;
}
.text-right {
  text-align: right;
}
.align-middle {
  vertical-align: middle;
}
.font-display {
  font-family: var(--font-display);
}
.font-label {
  font-family: var(--font-label);
}
.font-mono {
  font-family: var(--font-mono);
}
.font-num {
  font-family: var(--font-num);
}
.font-sans {
  font-family: var(--font-family);
}
.text-body {
  font-size: var(--t-body);
  line-height: var(--lh-body);
}
.text-caption {
  font-size: var(--t-caption);
  line-height: var(--lh-caption);
}
.text-control {
  font-size: var(--t-control);
  line-height: var(--lh-control);
}
.text-display {
  font-size: var(--t-display);
  line-height: var(--lh-display);
}
.text-gauge {
  font-size: 30px;
  line-height: 1.1;
}
.text-h1 {
  font-size: var(--t-h1);
  line-height: var(--lh-h1);
}
.text-h2 {
  font-size: var(--t-h2);
  line-height: var(--lh-h2);
}
.text-h3 {
  font-size: var(--t-h3);
  line-height: var(--lh-h3);
}
.text-ip {
  font-size: 15px;
  line-height: 1.5;
}
.text-metric {
  font-size: var(--t-metric);
  line-height: var(--lh-metric);
}
.text-overline {
  font-size: var(--label-size, var(--t-overline));
  line-height: var(--lh-overline);
}
.font-\[650\] {
  font-weight: 650;
}
.font-heading {
  font-weight: var(--display-weight, 680);
}
.font-medium {
  font-weight: 500;
}
.font-metric {
  font-weight: var(--num-weight, 600);
}
.font-semibold {
  font-weight: 600;
}
.font-strong {
  font-weight: 640;
}
.uppercase {
  text-transform: uppercase;
}
.tabular-nums {
  --tw-numeric-spacing: tabular-nums;
  font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
}
.leading-5 {
  line-height: 1.25rem;
}
.leading-copy {
  line-height: 1.5;
}
.leading-none {
  line-height: 1;
}
.leading-normal {
  line-height: 1.5;
}
.leading-odo {
  line-height: 1.1em;
}
.leading-relaxed {
  line-height: 1.625;
}
.leading-snug {
  line-height: 1.375;
}
.leading-tight {
  line-height: 1.25;
}
.tracking-label {
  letter-spacing: var(--label-tracking, normal);
}
.tracking-protocol {
  letter-spacing: 0.04em;
}
.tracking-tight {
  letter-spacing: -0.025em;
}
.text-background {
  color: var(--bg);
}
.text-danger {
  color: var(--red, var(--critical));
}
.text-danger-text {
  color: var(--red-text, color-mix(in oklab, var(--red, var(--critical)) 60%, var(--text-primary)));
}
.text-foreground {
  color: var(--text-primary);
}
.text-muted-foreground {
  color: var(--text-secondary);
}
.text-primary-foreground {
  color: var(--accent-contrast);
}
.text-primary-text {
  color: var(--accent-text);
}
.text-subtle {
  color: var(--text-tertiary);
}
.text-success {
  color: var(--green, var(--good));
}
.text-success-text {
  color: var(--green-text, color-mix(in oklab, var(--green, var(--good)) 60%, var(--text-primary)));
}
.text-warning {
  color: var(--orange, var(--warning));
}
.text-warning-text {
  color: var(--orange-text, color-mix(in oklab, var(--orange, var(--warning)) 60%, var(--text-primary)));
}
.overline {
  text-decoration-line: overline;
}
.no-underline {
  text-decoration-line: none;
}
.opacity-100 {
  opacity: 1;
}
.opacity-22 {
  opacity: 0.22;
}
.opacity-40 {
  opacity: 0.4;
}
.opacity-60 {
  opacity: 0.6;
}
.opacity-70 {
  opacity: 0.7;
}
.opacity-80 {
  opacity: 0.8;
}
.opacity-\[0\.85\] {
  opacity: 0.85;
}
.shadow {
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-btn {
  --tw-shadow: var(--shadow-btn);
  --tw-shadow-colored: var(--shadow-btn);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-ground {
  --tw-shadow: var(--shadow-ground);
  --tw-shadow-colored: var(--shadow-ground);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-hairline {
  --tw-shadow: 0 0 0 0.5px var(--border);
  --tw-shadow-colored: 0 0 0 0.5px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-logo {
  --tw-shadow: 0 0 0 8px var(--accent-tint), var(--shadow-btn);
  --tw-shadow-colored: 0 0 0 8px var(--tw-shadow-color), var(--shadow-btn);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-online {
  --tw-shadow: 0 0 0 3px color-mix(in srgb, var(--green) 22%, transparent);
  --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-pop {
  --tw-shadow: var(--shadow-pop, var(--shadow-card));
  --tw-shadow-colored: var(--shadow-pop, var(--shadow-card));
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-raised {
  --tw-shadow: var(--shadow-card);
  --tw-shadow-colored: var(--shadow-card);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-sheet {
  --tw-shadow: 0 24px 64px -16px rgba(0, 0, 0, 0.45);
  --tw-shadow-colored: 0 24px 64px -16px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-tab {
  --tw-shadow: inset 0 -2px 0 var(--accent-text);
  --tw-shadow-colored: inset 0 -2px 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.shadow-tip {
  --tw-shadow: 0 8px 24px -8px rgba(0, 0, 0, 0.28);
  --tw-shadow-colored: 0 8px 24px -8px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.outline-none {
  outline: 2px solid transparent;
  outline-offset: 2px;
}
.outline {
  outline-style: solid;
}
.outline-2 {
  outline-width: 2px;
}
.outline-offset-1 {
  outline-offset: 1px;
}
.outline-foreground {
  outline-color: var(--text-primary);
}
.invert {
  --tw-invert: invert(100%);
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.filter {
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
}
.backdrop-blur-md {
  --tw-backdrop-blur: blur(12px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-blur-sm {
  --tw-backdrop-blur: blur(4px);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.backdrop-saturate-150 {
  --tw-backdrop-saturate: saturate(1.5);
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
}
.transition-\[background-color\2c border-color\2c color\2c transform\] {
  transition-property: background-color,border-color,color,transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[background-color\2c color\2c transform\] {
  transition-property: background-color,color,transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[border-color\2c box-shadow\] {
  transition-property: border-color,box-shadow;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-\[width\] {
  transition-property: width;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-colors {
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.transition-transform {
  transition-property: transform;
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  transition-duration: 150ms;
}
.duration-draw {
  transition-duration: var(--dur-draw);
}
.duration-hover {
  transition-duration: var(--dur-hover);
}
.duration-swap {
  transition-duration: var(--dur-swap);
}
.ease-enter {
  transition-timing-function: var(--ease-enter);
}
.ease-settle {
  transition-timing-function: var(--ease-settle);
}
.ease-standard {
  transition-timing-function: var(--ease-standard);
}
@keyframes enter {

  from {
    opacity: var(--tw-enter-opacity, 1);
    transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
  }
}
@keyframes exit {

  to {
    opacity: var(--tw-exit-opacity, 1);
    transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
  }
}
.animate-in {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}
.fade-in-0 {
  --tw-enter-opacity: 0;
}
.duration-draw {
  animation-duration: var(--dur-draw);
}
.duration-hover {
  animation-duration: var(--dur-hover);
}
.duration-swap {
  animation-duration: var(--dur-swap);
}
.ease-enter {
  animation-timing-function: var(--ease-enter);
}
.ease-settle {
  animation-timing-function: var(--ease-settle);
}
.ease-standard {
  animation-timing-function: var(--ease-standard);
}
.running {
  animation-play-state: running;
}
.\[image-rendering\:pixelated\] {
  image-rendering: pixelated;
}
.\[overflow-wrap\:anywhere\] {
  overflow-wrap: anywhere;
}
.\[text-transform\:var\(--label-transform\2c none\)\] {
  text-transform: var(--label-transform,none);
}
.before\:absolute::before {
  content: var(--tw-content);
  position: absolute;
}
.before\:inset-x-0::before {
  content: var(--tw-content);
  left: 0px;
  right: 0px;
}
.before\:top-0::before {
  content: var(--tw-content);
  top: 0px;
}
.before\:h-accent::before {
  content: var(--tw-content);
  height: 3px;
}
.before\:bg-\[linear-gradient\(90deg\2c transparent\2c var\(--accent\)\2c transparent\)\]::before {
  content: var(--tw-content);
  background-image: linear-gradient(90deg,transparent,var(--accent),transparent);
}
.before\:content-\[\"\"\]::before {
  --tw-content: "";
  content: var(--tw-content);
}
.last\:border-b-0:last-child {
  border-bottom-width: 0px;
}
.last\:pb-0:last-child {
  padding-bottom: 0px;
}
.hover\:bg-danger-tint:hover {
  background-color: color-mix(in srgb, var(--red, var(--critical)) 10%, transparent);
}
.hover\:bg-muted:hover {
  background-color: var(--fill-secondary);
}
.hover\:bg-primary-strong:hover {
  background-color: var(--accent-strong);
}
.hover\:text-foreground:hover {
  color: var(--text-primary);
}
.hover\:underline:hover {
  text-decoration-line: underline;
}
.hover\:no-underline:hover {
  text-decoration-line: none;
}
.hover\:underline-offset-4:hover {
  text-underline-offset: 4px;
}
.focus\:border-ring:focus {
  border-color: var(--accent-text);
}
.focus\:shadow-focus:focus {
  --tw-shadow: 0 0 0 3px var(--accent-tint);
  --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.focus-visible\:outline-none:focus-visible {
  outline: 2px solid transparent;
  outline-offset: 2px;
}
.focus-visible\:outline:focus-visible {
  outline-style: solid;
}
.focus-visible\:outline-2:focus-visible {
  outline-width: 2px;
}
.focus-visible\:-outline-offset-2:focus-visible {
  outline-offset: -2px;
}
.focus-visible\:outline-offset-2:focus-visible {
  outline-offset: 2px;
}
.focus-visible\:outline-offset-4:focus-visible {
  outline-offset: 4px;
}
.focus-visible\:outline-primary-text:focus-visible {
  outline-color: var(--accent-text);
}
.focus-visible\:outline-ring:focus-visible {
  outline-color: var(--accent-text);
}
.focus-visible\:ring-2:focus-visible {
  --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
  --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
  box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
}
.focus-visible\:ring-ring:focus-visible {
  --tw-ring-color: var(--accent-text);
}
.focus-visible\:ring-offset-2:focus-visible {
  --tw-ring-offset-width: 2px;
}
.focus-visible\:ring-offset-card:focus-visible {
  --tw-ring-offset-color: var(--card);
}
.active\:translate-y-px:active {
  --tw-translate-y: 1px;
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.active\:duration-press:active {
  transition-duration: var(--dur-press);
  animation-duration: var(--dur-press);
}
.disabled\:pointer-events-none:disabled {
  pointer-events: none;
}
.disabled\:cursor-not-allowed:disabled {
  cursor: not-allowed;
}
.disabled\:bg-transparent:disabled {
  background-color: transparent;
}
.disabled\:text-subtle:disabled {
  color: var(--text-tertiary);
}
.disabled\:opacity-50:disabled {
  opacity: 0.5;
}
.disabled\:opacity-55:disabled {
  opacity: 0.55;
}
.has-\[\:disabled\]\:cursor-not-allowed:has(:disabled) {
  cursor: not-allowed;
}
.aria-pressed\:bg-card[aria-pressed="true"] {
  background-color: var(--card);
}
.aria-pressed\:text-foreground[aria-pressed="true"] {
  color: var(--text-primary);
}
.aria-pressed\:shadow-seg[aria-pressed="true"] {
  --tw-shadow: var(--shadow-ground), 0 0 0 1px var(--border);
  --tw-shadow-colored: var(--shadow-ground), 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.aria-selected\:bg-card[aria-selected="true"] {
  background-color: var(--card);
}
.aria-selected\:text-foreground[aria-selected="true"] {
  color: var(--text-primary);
}
.aria-selected\:shadow-seg[aria-selected="true"] {
  --tw-shadow: var(--shadow-ground), 0 0 0 1px var(--border);
  --tw-shadow-colored: var(--shadow-ground), 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.aria-\[busy\=true\]\:cursor-progress[aria-busy="true"] {
  cursor: progress;
}
.aria-\[invalid\=true\]\:border-danger[aria-invalid="true"] {
  border-color: var(--red, var(--critical));
}
.aria-\[disabled\=true\]\:opacity-50[aria-disabled="true"] {
  opacity: 0.5;
}
.aria-\[invalid\=true\]\:shadow-invalid[aria-invalid="true"] {
  --tw-shadow: 0 0 0 3px color-mix(in srgb, var(--red, var(--critical)) 18%, transparent);
  --tw-shadow-colored: 0 0 0 3px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.data-\[state\=inactive\]\:hidden[data-state="inactive"] {
  display: none;
}
.data-\[selected\=true\]\:border-primary-text[data-selected="true"] {
  border-color: var(--accent-text);
}
.data-\[state\=checked\]\:border-primary-text[data-state="checked"] {
  border-color: var(--accent-text);
}
.data-\[selected\=true\]\:bg-primary-tint[data-selected="true"] {
  background-color: var(--accent-tint);
}
.data-\[state\=checked\]\:bg-primary-text[data-state="checked"] {
  background-color: var(--accent-text);
}
.data-\[state\=on\]\:bg-card[data-state="on"] {
  background-color: var(--card);
}
.data-\[state\=selected\]\:bg-muted[data-state="selected"] {
  background-color: var(--fill-secondary);
}
.data-\[state\=checked\]\:text-primary-foreground[data-state="checked"] {
  color: var(--accent-contrast);
}
.data-\[state\=on\]\:text-foreground[data-state="on"] {
  color: var(--text-primary);
}
.data-\[checked\=false\]\:opacity-55[data-checked="false"] {
  opacity: 0.55;
}
.data-\[state\=muted\]\:opacity-55[data-state="muted"] {
  opacity: 0.55;
}
.data-\[state\=on\]\:shadow-seg[data-state="on"] {
  --tw-shadow: var(--shadow-ground), 0 0 0 1px var(--border);
  --tw-shadow-colored: var(--shadow-ground), 0 0 0 1px var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.data-\[state\=closed\]\:duration-swap[data-state="closed"] {
  transition-duration: var(--dur-swap);
}
.data-\[state\=open\]\:duration-enter[data-state="open"] {
  transition-duration: var(--dur-enter);
}
.data-\[state\=closed\]\:ease-exit[data-state="closed"] {
  transition-timing-function: var(--ease-exit);
}
.data-\[state\=open\]\:ease-enter[data-state="open"] {
  transition-timing-function: var(--ease-enter);
}
.data-\[state\=open\]\:animate-in[data-state="open"] {
  animation-name: enter;
  animation-duration: 150ms;
  --tw-enter-opacity: initial;
  --tw-enter-scale: initial;
  --tw-enter-rotate: initial;
  --tw-enter-translate-x: initial;
  --tw-enter-translate-y: initial;
}
.data-\[state\=closed\]\:animate-out[data-state="closed"] {
  animation-name: exit;
  animation-duration: 150ms;
  --tw-exit-opacity: initial;
  --tw-exit-scale: initial;
  --tw-exit-rotate: initial;
  --tw-exit-translate-x: initial;
  --tw-exit-translate-y: initial;
}
.data-\[state\=closed\]\:fade-out-0[data-state="closed"] {
  --tw-exit-opacity: 0;
}
.data-\[state\=open\]\:fade-in-0[data-state="open"] {
  --tw-enter-opacity: 0;
}
.data-\[state\=closed\]\:slide-out-to-bottom-2[data-state="closed"] {
  --tw-exit-translate-y: 0.5rem;
}
.data-\[state\=closed\]\:slide-out-to-right-8[data-state="closed"] {
  --tw-exit-translate-x: 2rem;
}
.data-\[state\=open\]\:slide-in-from-bottom-2[data-state="open"] {
  --tw-enter-translate-y: 0.5rem;
}
.data-\[state\=open\]\:slide-in-from-right-8[data-state="open"] {
  --tw-enter-translate-x: 2rem;
}
.data-\[state\=closed\]\:duration-swap[data-state="closed"] {
  animation-duration: var(--dur-swap);
}
.data-\[state\=open\]\:duration-enter[data-state="open"] {
  animation-duration: var(--dur-enter);
}
.data-\[state\=closed\]\:ease-exit[data-state="closed"] {
  animation-timing-function: var(--ease-exit);
}
.data-\[state\=open\]\:ease-enter[data-state="open"] {
  animation-timing-function: var(--ease-enter);
}
@media (prefers-reduced-motion: reduce) {

  .motion-reduce\:animate-none {
    animation: none;
  }

  .motion-reduce\:transition-none {
    transition-property: none;
  }
}
@media (max-width: 900px) {

  .max-\[900px\]\:hidden {
    display: none;
  }

  .max-\[900px\]\:flex-auto {
    flex: 1 1 auto;
  }

  .max-\[900px\]\:px-0 {
    padding-left: 0px;
    padding-right: 0px;
  }
}
@media (max-width: 760px) {

  .max-\[760px\]\:basis-full {
    flex-basis: 100%;
  }

  .max-\[760px\]\:whitespace-normal {
    white-space: normal;
  }

  .max-\[760px\]\:text-right {
    text-align: right;
  }
}
@media (max-width: 640px) {

  .max-\[640px\]\:top-2 {
    top: 0.5rem;
  }

  .max-\[640px\]\:order-3 {
    order: 3;
  }

  .max-\[640px\]\:mt-2 {
    margin-top: 0.5rem;
  }

  .max-\[640px\]\:aspect-square {
    aspect-ratio: 1 / 1;
  }

  .max-\[640px\]\:h-auto {
    height: auto;
  }

  .max-\[640px\]\:w-bar-narrow {
    width: calc(100% - 2 * var(--s-2));
  }

  .max-\[640px\]\:max-w-full {
    max-width: 100%;
  }

  .max-\[640px\]\:basis-full {
    flex-basis: 100%;
  }

  .max-\[640px\]\:gap-3 {
    gap: 0.75rem;
  }

  .max-\[640px\]\:gap-px {
    gap: 1px;
  }

  .max-\[640px\]\:gap-y-0 {
    row-gap: 0px;
  }

  .max-\[640px\]\:overflow-x-auto {
    overflow-x: auto;
  }

  .max-\[640px\]\:rounded-none {
    border-radius: 0px;
  }

  .max-\[640px\]\:p-5 {
    padding: 1.25rem;
  }

  .max-\[640px\]\:px-4 {
    padding-left: 1rem;
    padding-right: 1rem;
  }

  .max-\[640px\]\:py-2 {
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
  }

  .max-\[640px\]\:pb-10 {
    padding-bottom: 2.5rem;
  }

  .max-\[640px\]\:pt-1 {
    padding-top: 0.25rem;
  }

  .max-\[640px\]\:pt-4 {
    padding-top: 1rem;
  }

  .max-\[640px\]\:\[scrollbar-width\:none\] {
    scrollbar-width: none;
  }
}
@media (max-width: 620px) {

  .max-\[620px\]\:flex-row {
    flex-direction: row;
  }

  .max-\[620px\]\:flex-col {
    flex-direction: column;
  }

  .max-\[620px\]\:flex-col-reverse {
    flex-direction: column-reverse;
  }

  .max-\[620px\]\:items-center {
    align-items: center;
  }

  .max-\[620px\]\:items-stretch {
    align-items: stretch;
  }
}
@media (max-width: 560px) {

  .max-\[560px\]\:hidden {
    display: none;
  }

  .max-\[560px\]\:whitespace-normal {
    white-space: normal;
  }
}
@media (min-width: 720px) {

  .min-\[720px\]\:grid-cols-manual {
    grid-template-columns: 2fr 1fr;
  }
}
.\[\&\:empty\]\:hidden:empty {
  display: none;
}
.\[\&\:last-child\>td\]\:border-b-0:last-child>td {
  border-bottom-width: 0px;
}
.\[\&\>tr\:hover\]\:bg-muted>tr:hover {
  background-color: var(--fill-secondary);
}
.\[\&\>tr\:last-child\>td\]\:border-b-0>tr:last-child>td {
  border-bottom-width: 0px;
}
.\[\&\[data-state\=solo\]\>td\:first-child\]\:shadow-solo[data-state=solo]>td:first-child {
  --tw-shadow: inset 3px 0 0 var(--accent-text);
  --tw-shadow-colored: inset 3px 0 0 var(--tw-shadow-color);
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
}
.\[\&\[hidden\]\]\:hidden[hidden] {
  display: none;
}
@keyframes fade {

  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}
.\[\&_\.ck-area\]\:animate-fade .ck-area {
  animation: fade var(--dur-draw) var(--ease-standard) backwards;
}
@media (prefers-reduced-motion: reduce) {

  .motion-reduce\:\[\&_\.ck-area\]\:animate-none .ck-area {
    animation: none;
  }
}
@keyframes draw {

  from {
    clip-path: inset(0 100% 0 0);
  }

  to {
    clip-path: inset(0 0 0 0);
  }
}
.\[\&_\.ck-line\]\:animate-draw .ck-line {
  animation: draw var(--dur-draw) var(--ease-standard) backwards;
}
@media (prefers-reduced-motion: reduce) {

  .motion-reduce\:\[\&_\.ck-line\]\:animate-none .ck-line {
    animation: none;
  }
}
