/*!************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** css ../../node_modules/.pnpm/next@15.5.15_react-dom@19.2.5_react@19.2.5__react@19.2.5_sass@1.99.0/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[14].oneOf[5].use[2]!../../node_modules/.pnpm/next@15.5.15_react-dom@19.2.5_react@19.2.5__react@19.2.5_sass@1.99.0/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[14].oneOf[5].use[3]!./src/app/(auth)/_components/auth-shell.module.css ***!
  \************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/* ══════════════════════════════════════════════════════════════════════════
   auth 面外壳 + 表单样式（s248-03）——/login 与 /invite 共用。
   渲染准绳：design-explore/auth-10/E-locked/login.html
   决策准绳：docs/superpowers/specs/2026-07-26-auth-surfaces-design-spec.md §3

   🚫 纪律（护栏 scripts/check-auth-shell.mjs 逐条盯住，改前先看它）：
   ① 本文件**绝不** import 或引用 (dashboard)/_components/mobile-guide.module.css，
      也绝不定义/引用 `.host` —— 那个模块的 `.host > :not(.guide){display:none}`
      在 <768px 会隐藏除引导页外的一切子元素，auth 外壳没有 `.guide` 子节点，
      抄进来就是**手机端登录页整页空白、完全无法登录**。
      CSS Modules 的类名编译期 hash 化 ⇒ 除非显式 import 那个文件，否则引用不到它，
      所以护栏断言 A 盯住那唯一入口就够（结构性免疫）。
   ② 颜色 token 全取 packages/ui/src/theme/presets.css 的 [data-console]，不自造。
      本文件只本地定义稿里有、presets 里没有的 4 个（--r-field/--r-pill/--mono/--seam-w）。
   ③ 字体走 var(--font-display) / var(--font-body)（s248-01 兜底字栈的唯一真源），
      **不得**在此新写 `--serif:` 短字栈。
   ④ 高度用 100dvh，不用 100vh；<768px 下 input 字号 ≥16px。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 外壳：唯一挂 data-console 的元素（layout.tsx）──
   显式自带背景 + min-height:100dvh：globals.css 的 body 从 :root 取 serene
   #fafaf7，而 data-console 挂在本 div 上才把 --background 换成 --paper，
   不自带背景就会在 overscroll 橡皮筋回弹时漏出 serene 底色。 */
.auth-shell_shell__gW98X {
  --r-field: 12px;
  --r-pill: 999px;
  --mono: ui-monospace, 'SF Mono', Menlo, Consolas, monospace;
  --seam-w: 78px;

  min-height: 100dvh;
  display: flex;
  flex-direction: column;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-body);
  font-weight: 400;
  letter-spacing: 0.01em;
  overscroll-behavior: contain;
  -webkit-font-smoothing: antialiased;
}

/* 作用域内的 focus 环（不写成全局规则） */
.auth-shell_shell__gW98X :focus-visible {
  outline: 2px solid var(--forest-2);
  outline-offset: 3px;
  border-radius: 4px;
}

.auth-shell_stage__r5fuN {
  flex: 1;
  display: grid;
  grid-template-columns: 0.86fr 1fr;
  min-height: 100dvh;
}

/* ── 左：叙事栏 ── */
.auth-shell_narrative__Vm4M2 {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(38px, 4.4vh, 58px) calc(60px + var(--seam-w)) clamp(38px, 4.4vh, 58px)
    clamp(38px, 4.2vw, 74px);
  color: var(--paper-hi);
  background:
    radial-gradient(900px 700px at 10% -12%, rgba(12, 93, 88, 0.55), transparent 62%),
    radial-gradient(760px 640px at 96% 112%, rgba(8, 46, 43, 0.8), transparent 60%), var(--forest);
  /* 切口右端 1px 越界压在 formside 的暖纸上，overflow 必须 visible 否则被裁 */
  overflow: visible;
}

/* 与 console 基线同一张极细颗粒 */
.auth-shell_narrative__Vm4M2::before {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='6' height='6'><circle cx='1' cy='1' r='.5' fill='%23ffffff' opacity='.05'/></svg>");
}

/* ══════════════ 有机切口（签名件）══════════════
   照抄 login.html:81-127，path 数据一个字符不改。三条同时成立：
   ① 不重复：一条 2000px 长单 path、8 段三次贝塞尔、no-repeat。
   ② 不变形：background-size 显式 160px 2000px（与 viewBox 160:2000 同比）
      → 按自身比例被**裁切**，不是被拉伸。禁 preserveAspectRatio="none" / 100% 100% / repeat-y。
   ③ 无接缝/折角：段间控制点共线；末段第二控制点 (79,1960) 让曲线以竖直切线落地，
      与第三层渐变的直边切线连续。
   三层顺序不可换：svg → paper 实心（65px, right top）→ 渐变接手 >2000px 的窗口（82px）。
   ⚠ fill='%23f2efea' 必须是字面量（data URI 吃不了 CSS 变量）；该值 == [data-console]
     的 --paper，由护栏断言 E 盯住漂移。 */
.auth-shell_narrative__Vm4M2::after {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  right: -1px;
  width: 161px;
  pointer-events: none;
  background-image:
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='2000' viewBox='0 0 160 2000'><path d='M92,0 C74,72 99,152 83,236 C69,318 88,368 71,470 C57,566 81,690 69,800 C59,900 86,946 77,1010 C65,1100 97,1176 84,1272 C72,1363 62,1432 73,1524 C84,1616 98,1706 81,1794 C65,1877 79,1960 79,2000 L160,2000 L160,0 Z' fill='%23f2efea'/></svg>"),
    linear-gradient(var(--paper), var(--paper)),
    linear-gradient(to bottom, transparent 2000px, var(--paper) 2000px);
  background-repeat: no-repeat, no-repeat, no-repeat;
  background-size:
    160px 2000px,
    65px 100%,
    82px 100%;
  background-position:
    left top,
    right top,
    right top;
}

/* 三段收进块高有上限的 .col，块本身在栏里居中（水平也居中）——
   病根是 space-between 沿整栏高度摊三段，栏越高段间距越大、1080 起读成三个孤岛。 */
.auth-shell_col__PAN8z {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: clamp(430px, 26vw, 566px);
  min-height: min(100%, 470px);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/* ① 品牌段 */
.auth-shell_wordmark__TyKg3 {
  font-family: var(--font-display);
  font-size: 21px;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--paper-hi);
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原 */
  line-height: normal;
}
.auth-shell_wordmarkSub__wEfv0 {
  font-size: 11.5px;
  color: var(--ondark-faint);
  letter-spacing: 0.2em;
  margin-top: 6px;
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原 */
  line-height: normal;
}

/* ② 一句干活语气的话（中文大标题显式控断，不交给流式排版） */
.auth-shell_lede__sUPid {
  padding: 40px 0;
}
.auth-shell_lede__sUPid p {
  margin: 0;
  font-family: var(--font-display);
  /* 只挂 vw、不掺 vh —— .col 的 max-width 也是 vw 驱动，同源才保证这两行
     （各 13 字）在任何视口都不折成三行。 */
  font-size: clamp(30px, 1.72vw, 40px);
  font-weight: 500;
  line-height: 1.68;
  letter-spacing: 0.015em;
  color: var(--paper-hi);
  max-width: 14em;
}

/* ③ 凭证行 —— 别人能去查我们的东西（不是自我声称）。
   未备案态：ICP 段连同它前面的分隔点一起缺席，运营主体升一档亮度补位。 */
.auth-shell_cred__KNSiW {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 5px;
  padding-top: 14px;
  border-top: 1px solid rgba(255, 255, 255, 0.1);
  font-size: 11px;
  line-height: 1.6;
  color: var(--ondark-faint);
}
.auth-shell_credRow__5p9f6 {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
.auth-shell_cred__KNSiW .auth-shell_entity__1Epx4 {
  color: var(--ondark-faint);
}
.auth-shell_cred__KNSiW.auth-shell_isUnfiled__I3dzE .auth-shell_entity__1Epx4 {
  color: var(--ondark-soft);
}
.auth-shell_cred__KNSiW .auth-shell_v__Uclxg {
  font-family: var(--mono);
  letter-spacing: 0.04em;
}
.auth-shell_cred__KNSiW a {
  color: inherit;
  text-decoration: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.18);
  padding-bottom: 1px;
}
.auth-shell_cred__KNSiW a:hover {
  color: var(--ondark-hi);
  border-bottom-color: var(--ondark-hi);
}
.auth-shell_cred__KNSiW .auth-shell_sep__63vB3 {
  width: 3px;
  height: 3px;
  border-radius: 50%;
  background: currentColor;
  opacity: 0.55;
  flex: none;
}
.auth-shell_serviceBoundary__XD0re {
  color: var(--ondark-soft);
}

/* ── 右：暖纸表单栏 ──
   与左栏 .col 的 padding-right 对称，两块内容隔着那道毛边对望。 */
.auth-shell_formside__7u0Dg {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 56px clamp(32px, 4vw, 96px) 56px clamp(44px, 7.2vw, 138px);
  background: var(--paper);
}
.auth-shell_formInner__PwUnh {
  width: 100%;
  max-width: 396px;
}
.auth-shell_h1__RrImC {
  font-family: var(--font-display);
  font-size: 32px;
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: 0.01em;
  color: var(--forest-ink);
  margin: 0;
}
.auth-shell_h1Sub__az95g {
  margin: 11px 0 0;
  font-size: 13.5px;
  line-height: 1.7;
  color: var(--ink-soft);
}

/* ═══ 表单手艺：52px 控件高、26px 字段间距、合体验证码输入组 ═══ */
.auth-shell_form__7lFsY {
  margin-top: 34px;
}
.auth-shell_field__ROeqx + .auth-shell_field__ROeqx {
  margin-top: 26px;
}
.auth-shell_lbl__i3YJ0 {
  display: block;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--ink-soft);
  letter-spacing: 0.05em;
  margin-bottom: 11px;
  /* @psyflow/ui <Label> 带 leading-none（line-height:1）→ 标签盒 12.5px；
     稿里是普通 block label（line-height:normal）→ 18px。不覆盖会让每个字段
     矮 5.5px、整列比稿短 11px。实测于 render-vs-target。 */
  line-height: normal;
}

/* 一个边框盒 = 一个字段。验证码 input 与发送按钮共享此盒，中间只有一道发丝线；
   focus 整盒亮、错误整组红 —— 读作一个字段。 */
.auth-shell_ctrl__tWMH8 {
  display: flex;
  align-items: stretch;
  background: var(--paper-hi);
  border: 1px solid var(--hair);
  border-radius: var(--r-field);
  transition:
    border-color 0.16s ease,
    box-shadow 0.16s ease;
}
.auth-shell_ctrl__tWMH8:focus-within {
  border-color: var(--forest-2);
  box-shadow: 0 0 0 3px rgba(12, 93, 88, 0.13);
}
/* 覆盖 @psyflow/ui <Input> 的 h-9 / text-base md:text-sm / shadow-xs / rounded-md：
   CSS Module 是无 layer 的普通规则，恒胜 Tailwind 的 @layer utilities。 */
.auth-shell_ctrl__tWMH8 input {
  flex: 1 1 auto;
  min-width: 0;
  height: 52px;
  padding: 0 16px;
  border: 0;
  background: transparent;
  box-shadow: none;
  border-radius: var(--r-field);
  font-family: inherit;
  font-size: 15px;
  color: var(--ink);
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
}
.auth-shell_ctrl__tWMH8 input:focus,
.auth-shell_ctrl__tWMH8 input:focus-visible {
  outline: none;
}
.auth-shell_ctrl__tWMH8 input::placeholder {
  color: var(--ink-faint);
  letter-spacing: 0.02em;
}
.auth-shell_ctrl__tWMH8 input:disabled {
  opacity: 1;
  color: var(--ink-faint);
}
.auth-shell_ctrlCode__5th_Y input {
  font-family: var(--mono);
  letter-spacing: 0.24em;
}
.auth-shell_ctrlCode__5th_Y input::placeholder {
  font-family: var(--font-body);
  letter-spacing: 0.02em;
}

/* 覆盖 <Button> 的 h-9 / rounded-md / bg-primary / disabled:opacity-50。
   ⚠ 本类**刻意不覆盖** `<Button>` cva 基类的 `display:flex` 与 `gap-2`（8px）——
   倒计时文案「38s 后重发」在 login-form 里已被包成**单个** flex item，那个 gap
   因此不参与排布，`.tick` 与「后重发」之间就是稿里那个普通文本空格（13px 下约 3.5px）。
   🚫 **不要在这里加 `gap: 0` 去"修"间距**：flex 会折叠匿名 item 的首尾空白，
      加了以后是「38s后重发」完全没有空格，比不加更偏离锁定稿。
      要动间距，去改 login-form 里那层包裹 span 的结构，不要动这里。 */
.auth-shell_send__2Pepx {
  flex: 0 0 auto;
  height: auto;
  min-width: 112px;
  padding: 0;
  border: 0;
  border-left: 1px solid var(--hair);
  background: transparent;
  box-shadow: none;
  font-family: inherit;
  font-size: 13px;
  font-weight: 500;
  color: var(--forest-2);
  cursor: pointer;
  border-radius: 0 var(--r-field) var(--r-field) 0;
  transition: background 0.15s ease;
  /* 稿里 `.send` 是 <button>，吃浏览器 UA 表单控件复位的 `letter-spacing: normal`；
     本页 Tailwind preflight 给表单控件写了 `letter-spacing: inherit`，把 `.shell` 的
     0.01em（= 0.16px）重新继承了下来 —— 于是每个字符都宽 0.16px、字距也被撑开。
     显式写回 normal 与稿对齐（两个 input 各自已显式声明字距，只有本类漏了）。 */
  letter-spacing: normal;
}
.auth-shell_send__2Pepx:hover:not(:disabled) {
  background: rgba(12, 93, 88, 0.06);
}
.auth-shell_send__2Pepx:disabled {
  color: var(--ink-faint);
  cursor: default;
  opacity: 1;
}
.auth-shell_tick__LZZZl {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
}

/* 错误态：整组变红，只描边不铺色 —— 危机红是界面唯一高饱和色，不许泛滥 */
.auth-shell_ctrl__tWMH8.auth-shell_isError__Vjm1S {
  border-color: var(--crisis);
}
.auth-shell_ctrl__tWMH8.auth-shell_isError__Vjm1S:focus-within {
  border-color: var(--crisis);
  box-shadow: 0 0 0 3px rgba(192, 41, 38, 0.12);
}
.auth-shell_err__WRcR4 {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  margin: 11px 0 0;
  font-size: 12.5px;
  line-height: 1.6;
  color: var(--crisis);
}
.auth-shell_err__WRcR4 svg {
  width: 14px;
  height: 14px;
  flex: none;
  margin-top: 2px;
}

/* 页面级说明块（限流 / 锁定 / 收不到码）：中性发丝线，不占用危机红。
   这些不是她犯的错，是系统状态；把故障翻译成规则，而不是指责。 */
.auth-shell_notice__Ou7aC {
  margin-top: 22px;
  padding: 15px 17px;
  border: 1px solid var(--hair);
  border-radius: var(--r-field);
  background: var(--paper-card);
}
.auth-shell_notice__Ou7aC.auth-shell_isFault__zT7xI {
  border-color: rgba(192, 41, 38, 0.4);
  background: var(--paper-hi);
}
.auth-shell_notice__Ou7aC b {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  font-weight: 600;
  color: var(--forest-ink);
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原 */
  line-height: normal;
}
.auth-shell_notice__Ou7aC.auth-shell_isFault__zT7xI b {
  color: var(--crisis);
}
.auth-shell_notice__Ou7aC b svg {
  width: 15px;
  height: 15px;
  flex: none;
}
.auth-shell_notice__Ou7aC p {
  margin: 8px 0 0;
  font-size: 12.5px;
  line-height: 1.8;
  color: var(--ink-soft);
}
.auth-shell_notice__Ou7aC p .auth-shell_num__gTGHB {
  font-family: var(--mono);
  color: var(--forest-ink);
  font-weight: 500;
}
/* 锁定块结尾那句「你的账号没有受影响。」——稿里它**不是行内提亮，是独占整段宽的一行**：
   上面 `.notice b` 是后代选择器，把段落里这个内嵌 <b> 一起命中了，于是它拿到
   display:flex + font-size:13px（稿实测 320.66×23.4；23.4 = 13px × 从 .notice p 继承的 1.8）。
   稿作者给它写了行内 style="font-weight:500"（把 600 调回 500），说明这个形制是他看过渲染后接受的。
   这里只取稿的**视觉结果**（独占一行 + 13px），不照搬 flex —— 本元素内无图标，flex 的
   align-items/gap 对纯文本无效，block 渲染完全相同且语义更实。
   line-height 必须显式 inherit：稿里这个 <b> 无 line-height 声明、继承 .notice p 的 1.8，
   而产品的 `.notice b` 为还原 Tailwind preflight 写了 line-height:normal，会连带压到这里。 */
.auth-shell_notice__Ou7aC p .auth-shell_reassure__52J9p {
  display: block;
  font-size: 13px;
  line-height: inherit;
  font-weight: 500;
  color: var(--forest-ink);
}

/* 主按钮：pill（基线里每一个主操作都是 pill）。文案「登录」不加字距。 */
.auth-shell_cta__ifLcd {
  width: 100%;
  height: 52px;
  margin-top: 34px;
  border: 0;
  border-radius: var(--r-pill);
  background: var(--forest);
  color: var(--paper-hi);
  font-family: inherit;
  font-size: 15px;
  font-weight: 500;
  cursor: pointer;
  box-shadow: 0 8px 20px rgba(6, 66, 62, 0.2);
  transition:
    background 0.16s ease,
    box-shadow 0.16s ease;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  /* 同 `.send` 那条 preflight 根因（见上方 `.send` 块头注释）：本类也是 <button>，
     稿吃 UA 的 `letter-spacing: normal`，本页却被 preflight 的 `letter-spacing: inherit`
     喂了 `.shell` 的 0.01em。`normal` 也正是设计规格锁死的「『登录』不加字距」。 */
  letter-spacing: normal;
}
.auth-shell_cta__ifLcd:hover:not(:disabled) {
  background: var(--forest-ink);
  box-shadow: 0 10px 26px rgba(6, 66, 62, 0.26);
}
.auth-shell_cta__ifLcd:disabled {
  cursor: default;
  opacity: 0.62;
  box-shadow: none;
}
.auth-shell_ctaGhost__2I9OD {
  width: 100%;
  height: 48px;
  margin-top: 26px;
  border: 1px solid var(--hair);
  border-radius: var(--r-pill);
  background: transparent;
  color: var(--forest-ink);
  font-family: inherit;
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
  box-shadow: none;
  /* 同 `.cta` / `.send`：<button> + preflight 的 `letter-spacing: inherit`，须写回 normal */
  letter-spacing: normal;
  /* 🔴 **必须显式声明 display，别删**（s248-04 R1-1 实测踩过）：
     稿里本类挂在 <button> 上（UA 默认 inline-block，认 width/height）；产品在
     /login 挂 @psyflow/ui 的 <Button>（cva 基类带 inline-flex）也认。
     但 invite 的状态屏用的是裸 <Link>（= <a>，display:inline）——**非替换 inline 盒
     不认 width/height**，于是 396×48 塌成 128×22，而 computed style 里
     `height: 48px` **照样在**（computed ≠ used value）⇒ 只查 computed 会假过，
     必须量 getBoundingClientRect()。`.cta` 因为自带 inline-flex 才一直正常，是本条的反证。
     写死 display 让本类**与标签名解耦**，换成 <a>/<button>/<div> 都成立。 */
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.auth-shell_ctaGhost__2I9OD:hover:not(:disabled) {
  background: var(--paper-hi);
  border-color: var(--forest-2);
}
.auth-shell_ctaGhost__2I9OD:disabled {
  cursor: default;
  opacity: 0.62;
  color: var(--ink-soft);
}

/* 没有邀请链接的出路：不可点的说明文字（/invite 必须带 token，没有通用加入页）。 */
.auth-shell_helper__9LlpQ {
  margin: 24px 0 0;
  padding-top: 18px;
  border-top: 1px solid var(--hair);
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--ink-soft);
  text-align: center;
}
/* 🚫 **本类刻意不写 `letter-spacing: normal`** —— 别看着 `.send`/`.cta`/`.ctaGhost` 都写了就
   "统一一下"，那会凭空造出一条 ~1.1px 的新偏离：
   稿里它是 `<a>`，**不吃**浏览器 UA 的表单控件复位，继承的就是 `0.01em`(= 0.16px)；
   产品里它是 `<button>`，经 Tailwind preflight 的 `letter-spacing: inherit` 继承的也是 0.16px。
   **两边现在恰好相等**（实测文本宽 88.63px 逐位相同）。写 normal 只会把产品这一侧改窄、
   离稿更远。差别只在标签名，而标签名是有理由的（见 login-form 里 dev-8 的注释）。 */
.auth-shell_quietLink__frMQG {
  display: inline-block;
  margin-top: 12px;
  padding: 0 0 1px;
  border: 0;
  border-bottom: 1px solid rgba(12, 93, 88, 0.28);
  background: transparent;
  font-family: inherit;
  font-size: 12.5px;
  color: var(--forest-2);
  cursor: pointer;
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原 */
  line-height: normal;
}
/* 纯信息性页脚链接 —— 无「登录即表示同意」因果前缀：
   登录不是一次新的同意行为，写成因果句既不准确、又反成把柄。 */
.auth-shell_legal__iQWY6 {
  margin: 18px 0 0;
  font-size: 11.5px;
  color: var(--ink-faint);
  text-align: center;
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原 */
  line-height: normal;
}
.auth-shell_legal__iQWY6 a {
  color: var(--ink-soft);
  text-decoration: none;
  border-bottom: 1px solid var(--hair);
  padding-bottom: 1px;
}
.auth-shell_legal__iQWY6 .auth-shell_legalSep__HHQuT {
  margin: 0 8px;
  opacity: 0.6;
}

/* ══════════════════════════════════════════════════════════════════════════
   s248-04 · /invite 专属段 —— 渲染准绳 design-explore/auth-10/E-locked/invite.html

   两页共用本文件，**不给 invite 另起一个 CSS Module**：跨 module 的同特异性规则
   谁赢取决于打包顺序，是不确定行为。差异一律用 `.isInvite` 复合选择器（0,2,0）
   稳赢 login 的单类规则（0,1,0），**与书写顺序无关**。

   🔴 命名映射（改前必读）：稿里工作室名的类名是 `.host`，产品里叫 **`.hostName`**。
      **不许改回 `host`** —— 护栏 `scripts/check-auth-shell.mjs` 断言 A 扫整棵 (auth) 树
      的 `/\.host\b/`，防的是 mobile-guide 那条 `.host > :not(.guide){display:none}`
      被抄进来（<768px 整页空白、完全无法登录）。`.host {` / `styles.host` / `${styles.host}`
      全判红，`.hostName` 干净。改的是名字不是形制；放宽护栏会同时放过 `styles.host`
      这种最可能出现的真违规。同理稿的 `.h1` → 产品 `.hostH1`。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 左栏：invite 版「重」（介绍 + 三条能力声明 + 落款）── */

/* 稿 :195。login 左栏内容轻取 470px，invite 有 pledge 取 640px：
   同一条规则不同参数 —— 上限只是不让栏高继续把三段拉开，栏再高只是"场"变大。 */
.auth-shell_col__PAN8z.auth-shell_isInvite__JZ_t7 {
  min-height: min(100%, 640px);
}

/* 稿 :242-256。invite 的 .lede 刻意不上 clamp（login 上了）：全页最大的字要留给
   右栏那个工作室名——那才是后端唯一的真数据。 */
.auth-shell_lede__sUPid.auth-shell_isInvite__JZ_t7 p {
  font-size: 26px;
  line-height: 1.6;
  max-width: 16em;
}

/* 介绍段（稿 .lede-body，:257-264）。
   ⚠ 特异性必须压过上面的 `.lede.isInvite p`(0,2,1) —— 用 `p.ledeBody` 凑到 (0,3,1)。
   稿里这条规则原本**整条失效**（`.lede p`(0,1,1) 压过 `.lede-body`(0,1,0)），介绍段
   被渲染成 26px 衬线；bruce 2026-07-26 曾据渲染结果追认（D10），2026-07-27 依据
   s248-04 的实测**改判**：那 65 个衬线汉字要多拉 2 个字体分片、86.1KB，直接把
   invite 页顶破 300KB 字体预算（实测见本单 verify 目录的 font-measurements.md）。
   恢复稿的 CSS 本意（无衬线小字），同时拿回「一句大钩子 + 一段正文」的两级层次。 */
.auth-shell_lede__sUPid.auth-shell_isInvite__JZ_t7 p.auth-shell_ledeBody__vls9r {
  margin: 18px 0 0;
  font-family: var(--font-body);
  font-size: 14px;
  line-height: 1.95;
  color: var(--ondark-soft);
  max-width: 30em;
}

/* 三条能力声明（稿 :275-309）。形制照抄已锁基线的 .pledge：每条一行、发丝线分隔、
   22px 圆角填充图标块。无边框、无实线描边 —— 不做成看起来能点的控件。
   措辞逐条对过代码，不许溢出：AES-256-GCM 字段级加密只能写「加密存储」，
   不能写「端到端 / 全站 / 银行级」；咨询师侧没有实名体系，严禁「实名认证」。 */
.auth-shell_pledgeKicker__zRWgK {
  font-size: 10.5px;
  letter-spacing: 0.22em;
  color: var(--ondark-faint);
  margin-bottom: 12px;
  /* 稿里本类无 line-height（= normal）；本页继承 Tailwind preflight 的 1.5，需显式还原
     （10.5px 下差约 3.2px，不补则左栏三段间距全错） */
  line-height: normal;
}
.auth-shell_pledge__cBVFV {
  border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.auth-shell_pledgeRow__oa6hg {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 11px 2px;
  font-size: 11.5px;
  line-height: 1.6;
  color: var(--ondark-soft);
}
.auth-shell_pledgeRow__oa6hg + .auth-shell_pledgeRow__oa6hg {
  border-top: 1px solid rgba(255, 255, 255, 0.07);
}
.auth-shell_pledgeIc__EVD__ {
  width: 22px;
  height: 22px;
  border-radius: 7px;
  background: rgba(169, 216, 197, 0.13);
  color: var(--ondark-hi);
  display: grid;
  place-items: center;
  flex: none;
}
.auth-shell_pledgeIc__EVD__ svg {
  width: 12px;
  height: 12px;
}

/* 稿 :316 给 .cred 加了 margin-top:22px。用相邻兄弟选择器最小侵入 ——
   .cred 由 <CredLine> 渲染、两页共用，不给它加修饰类。 */
.auth-shell_pledge__cBVFV + .auth-shell_cred__KNSiW {
  margin-top: 22px;
}

/* ── 右栏：H1 = 邀请方工作室名（全站唯一 rust）── */

/* 🚫 刻意**不复用** `.h1`（login 的「欢迎回来」，32px/600/--forest-ink/lh1.3）：
   它在 invite 上**恰好**被两个子元素全部覆盖掉 —— 靠"恰好"成立的耦合，
   将来有人调 login 标题就会静默改到 invite。独立类，零耦合。 */
.auth-shell_hostH1__YAp5B {
  margin: 0;
}
.auth-shell_h1Lead__3_J3V {
  display: block;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 400;
  letter-spacing: 0.24em;
  color: var(--ink-faint);
  margin-bottom: 10px;
  /* 稿里本类无 line-height（= normal）；preflight 的 1.5 会让 H1 区整块下移约 3.6px */
  line-height: normal;
}

/* ═══ 长工作室名：守的是 rust 的「面积」，不是字号 ═══
   全稿只有这一处 rust，成立前提是"一个短名字的一行大字"。真实租户名可以长到 50 字
   （createTenantInput.name 上限），同样 38px 下着色面积会从 11.6k 涨到 72k，
   唯一的暖点退化成一大片色块。字号按 √(基准字数/实际字数) 递减收敛成五档。
   **不截断**——把机构全称打点比字大一号更失礼，换行可以，省略号不行（护栏 K 钉死）。
   ⚠ **档位由 packages/shared 的 hostNameTier() 选，这里只提供字号**。
      两处真源会漂移 —— 别在 TSX 里再写一遍 length 三元（护栏 O 盯住两半都在）。 */
.auth-shell_hostName__54abg {
  font-family: var(--font-display);
  font-weight: 600;
  color: var(--rust);
}
.auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg {
  display: block;
  font-size: 38px;
  line-height: 1.28;
  letter-spacing: 0.01em;
  text-wrap: balance;
}
.auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenM__wTHoE {
  font-size: 31px;
  line-height: 1.34;
}
.auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenL__Vd9eb {
  font-size: 26px;
  font-weight: 500;
  line-height: 1.42;
}
.auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenXl__5FBKI {
  font-size: 22px;
  font-weight: 500;
  line-height: 1.5;
}
/* ⚠ 18px 是**下限**，不许再往下调：50 字要压进 2 行需 ≤15.8px，那已与 .h1Sub
   的 13.5px 同量级、H1 层级消失。「50 字 3 行、但墨量受控」是知情接受的残余偏离。 */
.auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenXxl__zyXWx {
  font-size: 18px;
  font-weight: 500;
  line-height: 1.58;
}

/* 状态屏标题（稿 .plain-h1 :448-457）——非 rust，用深林墨色。 */
.auth-shell_plainH1__J5fgj {
  font-family: var(--font-display);
  font-size: 27px;
  font-weight: 600;
  line-height: 1.36;
  letter-spacing: 0.01em;
  color: var(--forest-ink);
  margin: 0;
  text-wrap: balance;
}

/* ── 表单：invite 与 login 的 4 处数值差（最容易被漏掉的一组）── */
.auth-shell_formInner__PwUnh.auth-shell_isInvite__JZ_t7 .auth-shell_h1Sub__az95g {
  margin-top: 14px; /* 稿 :443（login 是 11px） */
}
.auth-shell_formInner__PwUnh.auth-shell_isInvite__JZ_t7 .auth-shell_form__7lFsY {
  margin-top: 32px; /* 稿 :461（login 是 34px） */
}
.auth-shell_formInner__PwUnh.auth-shell_isInvite__JZ_t7 .auth-shell_cta__ifLcd {
  margin-top: 26px; /* 稿 :650（login 是 34px） */
}
.auth-shell_formInner__PwUnh.auth-shell_isInvite__JZ_t7 .auth-shell_ctaGhost__2I9OD {
  margin-top: 24px; /* 稿 :693（login 是 26px） */
}

/* ── 同意行（稿 :599-645）——未预勾选的原生 checkbox ──
   🚫 不用 @psyflow/ui 的 <Checkbox>（Radix 渲染成 <button role=checkbox> + lucide SVG 勾），
      与稿这个「9×5 两条 2px 边框旋转 -45°」画出来的勾**几何不同**。原生 input
      还天然支持 <label htmlFor> 关联与表单语义。登记 dev-2。 */
.auth-shell_consent__WZL7r {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin-top: 26px;
}
.auth-shell_consent__WZL7r input[type='checkbox'] {
  appearance: none;
  flex: none;
  width: 17px;
  height: 17px;
  margin: 1px 0 0;
  border: 1px solid var(--ink-faint);
  border-radius: 5px;
  background: var(--paper-hi);
  cursor: pointer;
  display: grid;
  place-items: center;
}
.auth-shell_consent__WZL7r input[type='checkbox']::after {
  content: '';
  width: 9px;
  height: 5px;
  border-left: 2px solid var(--paper-hi);
  border-bottom: 2px solid var(--paper-hi);
  transform: rotate(-45deg) translate(1px, -1px);
  opacity: 0;
}
.auth-shell_consent__WZL7r input[type='checkbox']:checked {
  background: var(--forest);
  border-color: var(--forest);
}
.auth-shell_consent__WZL7r input[type='checkbox']:checked::after {
  opacity: 1;
}
.auth-shell_consent__WZL7r label {
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--ink-soft);
  cursor: pointer;
}
.auth-shell_consent__WZL7r a {
  color: var(--forest-2);
  text-decoration: none;
  border-bottom: 1px solid rgba(12, 93, 88, 0.28);
  padding-bottom: 1px;
}

/* 提交中的转圈（稿 :677-689）——只在 .cta 里出现 */
.auth-shell_spin__Bw9yb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  border: 2px solid rgba(255, 252, 246, 0.32);
  border-top-color: var(--paper-hi);
  animation: auth-shell_turn__yOrU3 0.75s linear infinite;
}
@keyframes auth-shell_turn__yOrU3 {
  to {
    transform: rotate(360deg);
  }
}

/* ── 状态屏（过期 / 冲突 / 席位满 / 成功）共用形制（稿 :708-752）── */
.auth-shell_stateIc__KR2fY {
  width: 46px;
  height: 46px;
  border-radius: 50%;
  border: 1px solid var(--hair);
  background: var(--paper-hi);
  display: grid;
  place-items: center;
  color: var(--ink-faint);
  margin-bottom: 20px;
}
.auth-shell_stateIc__KR2fY.auth-shell_isDone__QcOvX {
  border-color: rgba(12, 93, 88, 0.3);
  background: rgba(12, 93, 88, 0.08);
  color: var(--forest-2);
}
.auth-shell_stateIc__KR2fY svg {
  width: 20px;
  height: 20px;
}
.auth-shell_stateBody__kp3MC {
  margin: 14px 0 0;
  font-size: 13.5px;
  line-height: 1.85;
  color: var(--ink-soft);
}
.auth-shell_stateBody__kp3MC b {
  color: var(--forest-ink);
  font-weight: 600;
}
/* 出路块：把"发生了什么"和"你现在能做什么"分开——中性发丝线，不占用危机红。 */
.auth-shell_stateOut__UMONP {
  margin: 18px 0 0;
  padding: 14px 16px;
  border: 1px solid var(--hair);
  border-radius: var(--r-field);
  background: var(--paper-card);
  font-size: 12.5px;
  line-height: 1.8;
  color: var(--ink-soft);
}
.auth-shell_stateOut__UMONP b {
  color: var(--forest-ink);
  font-weight: 600;
}

/* ── 首帧骨架（稿 :754-777）──
   真实首帧工作室名是空的，写死当版式主角会闪一下。
   ⚠ 高度照稿的 38px，**不与真实 H1 首行（48.64px）等高** —— 设计规格 §4.5 写的
     "等高、不跳版"在数学上不可达（五档字号不同，真实高度未知）。稿是唯一准绳，
     跳版量已实测记进 verify/，登记为允许偏离 dev-9。 */
.auth-shell_skel__T189v {
  display: block;
  border-radius: 6px;
  background: linear-gradient(90deg, var(--paper-sink), #e4dfd4, var(--paper-sink));
  background-size: 220% 100%;
  animation: auth-shell_shimmer__C4mMi 1.5s linear infinite;
}
@keyframes auth-shell_shimmer__C4mMi {
  to {
    background-position: -220% 0;
  }
}
.auth-shell_skelH1__6KZEH {
  height: 38px;
  width: 74%;
  margin-top: 4px;
}
.auth-shell_skelSub__1MsOm {
  height: 13px;
  width: 56%;
  margin-top: 16px;
}

/* 无障碍：骨架态给读屏的状态播报（稿 :779-786）。
   这里的 nowrap 是 sr-only 惯用法、不是截断 —— 护栏 K 对本类有白名单豁免。 */
.auth-shell_srOnly__9AmtO {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* ═══ 移动端：叙事收成顶部窄带，表单占主体 ═══ */
@media (max-width: 767px) {
  .auth-shell_shell__gW98X {
    --seam-w: 0px;
  }
  .auth-shell_stage__r5fuN {
    grid-template-columns: 1fr;
    min-height: 0;
  }
  /* 同一手法转横向：900px 长单 path、no-repeat、不拉伸、高 42px、贴 .narrative 底缘。
     手机视口最宽 767px < 900px，所以横向也永远看不到重复。 */
  .auth-shell_narrative__Vm4M2::after {
    top: auto;
    left: 0;
    right: 0;
    bottom: -1px;
    width: auto;
    height: 42px;
    background-image:
      url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='900' height='42' viewBox='0 0 900 42'><path d='M0,18 C96,10 150,30 248,24 C340,18 392,8 486,14 C580,20 636,32 726,26 C812,20 856,12 900,16 L900,42 L0,42 Z' fill='%23f2efea'/></svg>"),
      linear-gradient(var(--paper), var(--paper));
    background-repeat: no-repeat, no-repeat;
    background-size:
      900px 42px,
      100% 12px;
    background-position:
      left top,
      left bottom;
  }
  /* 54px 底部内边距把内容让出横向切口的高度 */
  .auth-shell_narrative__Vm4M2 {
    padding: 28px 22px 54px;
    align-items: stretch;
    justify-content: flex-start;
  }
  .auth-shell_col__PAN8z {
    max-width: none;
    min-height: 0;
    gap: 22px;
  }
  .auth-shell_wordmark__TyKg3 {
    font-size: 18px;
  }
  .auth-shell_wordmarkSub__wEfv0 {
    display: none;
  }
  .auth-shell_lede__sUPid {
    padding: 0;
  }
  .auth-shell_lede__sUPid p {
    font-size: 21px;
    line-height: 1.62;
    max-width: none;
  }
  .auth-shell_lede__sUPid p br {
    display: none;
  }
  .auth-shell_cred__KNSiW {
    font-size: 10.5px;
  }
  .auth-shell_credRow__5p9f6 {
    gap: 8px;
  }
  .auth-shell_formside__7u0Dg {
    padding: 30px 22px 40px;
    align-items: flex-start;
  }
  .auth-shell_formInner__PwUnh {
    max-width: none;
  }
  .auth-shell_h1__RrImC {
    font-size: 25px;
  }
  /* iOS：<16px 会在 focus 时放大页面且失焦不还原 */
  .auth-shell_ctrl__tWMH8 input {
    font-size: 16px;
  }
  .auth-shell_send__2Pepx {
    min-width: 96px;
    font-size: 12.5px;
  }

  /* ── s248-04 · invite 的移动端 ──
     ⚠ **修饰类穿透 media query 的坑（必须显式处理）**：桌面段的 `.col.isInvite`(0,2,0)
        特异性高于本块里的 `.col`(0,1,0)，会在手机上把 640px 带进来。同理
        `.lede.isInvite p`(0,2,1) 会盖住本块的 `.lede p`(0,1,1)。
        每一条 isInvite 修饰都要在这里再写一遍，不能只改桌面。 */
  .auth-shell_col__PAN8z.auth-shell_isInvite__JZ_t7 {
    min-height: 0;
  }
  .auth-shell_lede__sUPid.auth-shell_isInvite__JZ_t7 p {
    font-size: 20px; /* 稿 :1040 */
    line-height: 1.6;
    max-width: none;
  }
  /* 介绍段移动档（稿 :1044-1048）。桌面那份改了这份也必须改 ——
     只改桌面 = 换个地方继续骗人。 */
  /* ⚠ 只覆盖稿里移动块真正声明的这三项。**不要**顺手加 `max-width: none` ——
     稿的移动块没有它，字族/颜色/max-width 都继承桌面那条规则。
     （30em × 12.5px = 375px > 390 视口下的实际栏宽 346px ⇒ 本就不构成约束，
       但写了就是无声偏离。） */
  .auth-shell_lede__sUPid.auth-shell_isInvite__JZ_t7 p.auth-shell_ledeBody__vls9r {
    font-size: 12.5px;
    line-height: 1.85;
    margin-top: 12px;
  }
  .auth-shell_pledgeKicker__zRWgK {
    display: none; /* 稿 :1049-1051 */
  }
  .auth-shell_pledgeRow__oa6hg {
    padding: 9px 0;
    font-size: 11px;
  }
  .auth-shell_pledge__cBVFV + .auth-shell_cred__KNSiW {
    margin-top: 16px; /* 稿 :1059（桌面是 22px） */
  }
  /* 五档移动字号（稿 :1068-1082）。⚠ 第五档 16 / 13.5(.h1Sub) = 1.19 是全表最薄的
     一处层级余量：动 .h1Sub 的字号/字族/字重/颜色任一项，这一档先崩，
     必须回来重验 390×844。 */
  .auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg {
    font-size: 27px;
  }
  .auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenM__wTHoE {
    font-size: 24px;
  }
  .auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenL__Vd9eb {
    font-size: 21px;
  }
  .auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenXl__5FBKI {
    font-size: 18.5px;
  }
  .auth-shell_hostH1__YAp5B .auth-shell_hostName__54abg.auth-shell_isLenXxl__zyXWx {
    font-size: 16px;
  }
  .auth-shell_plainH1__J5fgj {
    font-size: 22px; /* 稿 :1084 */
  }
}

/* 窄桌面窗口（768–1279）：左栏被 --seam-w 吃掉 138px 后本就不宽，30px 的标语会把
   每半句再折一次、变四行。降一档到 26px 让它稳定在两行。断点取 1279 是为了不碰
   四个验收视口（最窄的 1366 仍是 30px）。 */
@media (min-width: 768px) and (max-width: 1279px) {
  .auth-shell_lede__sUPid p {
    font-size: 26px;
  }
}

/* 一次编排的载入序列，不散落特效 */
@keyframes auth-shell_rise__HfgdA {
  from {
    opacity: 0;
    transform: translateY(9px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
.auth-shell_lift__OIepX {
  animation: auth-shell_rise__HfgdA 0.6s cubic-bezier(0.22, 0.68, 0.28, 1) both;
}
.auth-shell_d1__1qdet {
  animation-delay: 0.06s;
}
.auth-shell_d2__HEmsi {
  animation-delay: 0.2s;
}
@media (prefers-reduced-motion: reduce) {
  .auth-shell_shell__gW98X *,
  .auth-shell_shell__gW98X *::before,
  .auth-shell_shell__gW98X *::after {
    animation: none !important;
    transition: none !important;
  }
}

