diff --git a/.github/workflows/css-quality.yml b/.github/workflows/css-quality.yml new file mode 100644 index 0000000..be080ed --- /dev/null +++ b/.github/workflows/css-quality.yml @@ -0,0 +1,23 @@ +name: CSS quality + +on: + pull_request: + push: + branches: [main] + +jobs: + css-quality: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: npm + - run: npm ci + - name: Verify changed formatting and CSS ownership + env: + QUALITY_BASE_REF: ${{ github.event_name == 'pull_request' && format('origin/{0}', github.base_ref) || format('{0}^', github.sha) }} + run: npm run format:check && npm run style:check && npm run css:verify diff --git a/.stylelintrc.json b/.stylelintrc.json new file mode 100644 index 0000000..2d930dc --- /dev/null +++ b/.stylelintrc.json @@ -0,0 +1,55 @@ +{ + "extends": ["stylelint-config-standard"], + "ignoreFiles": ["dist/**/*.css"], + "rules": { + "alpha-value-notation": null, + "color-function-notation": null, + "declaration-block-single-line-max-declarations": null, + "media-feature-range-notation": null, + "no-descending-specificity": null, + "selector-class-pattern": null + }, + "overrides": [ + { + "files": [ + "src/styles/*.css", + "src/styles/domains/*.css", + "src/apps/admin/channels/AdminChannelsPage.css", + "src/apps/admin/enterprise-applications/AdminEnterpriseApplicationsPage.css", + "src/apps/admin/security-detection/AdminSecurityDetectionPage.css", + "src/apps/admin/sms-records/AdminSmsRecordsPage.css", + "src/apps/admin/sms-task-progress/AdminSmsTaskProgressPage.css", + "src/apps/admin/system-monitoring/AdminSystemMonitoringPage.css", + "src/apps/client/ClientUsersPage.css" + ], + "rules": { + "at-rule-empty-line-before": null, + "block-no-empty": null, + "color-function-alias-notation": null, + "color-hex-length": null, + "comment-empty-line-before": null, + "custom-property-pattern": null, + "declaration-block-no-redundant-longhand-properties": null, + "declaration-empty-line-before": null, + "declaration-property-value-keyword-no-deprecated": null, + "font-family-name-quotes": null, + "function-url-quotes": null, + "import-notation": null, + "keyframes-name-pattern": null, + "length-zero-no-unit": null, + "no-duplicate-selectors": null, + "number-max-precision": null, + "property-no-vendor-prefix": null, + "rule-empty-line-before": null, + "selector-attribute-quotes": null, + "selector-id-pattern": null, + "selector-not-notation": null, + "selector-pseudo-class-no-unknown": null, + "selector-type-no-unknown": null, + "shorthand-property-no-redundant-values": null, + "value-keyword-case": null, + "value-no-vendor-prefix": null + } + } + ] +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..1e5a4f8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,44 @@ +# CMPP 平台仓库开发约束 + +本文件适用于整个仓库。进入子目录工作时,如果存在更具体的 `AGENTS.md`,还应同时遵守子目录规范。 + +## 开始工作前 + +- 先检查当前分支、最近提交、远端差异以及 staged、unstaged、untracked 文件。 +- 保留其他会话和用户已有修改;禁止未经授权执行 reset、清理、覆盖、切分支、推送或部署。 +- 功能事实必须以当前代码、真实 API、PostgreSQL、Redis、MinIO、Gateway 和目标环境为准,交接记录只作为线索。 +- 不得发送、补发、重投或重新入队短信;不得擅自修改余额、通道或客户配置。 + +## CSS 任务强制阅读 + +凡新增、修改、迁移或审查 CSS,必须先完整阅读: + +1. `docs/css-development-guidelines.md`; +2. 涉及存量拆分时,再阅读 `docs/global-css-modularization-plan-20260904.md`。 + +## CSS 所有权 + +- 设计变量归 `src/styles/tokens.css`。 +- 浏览器重置和标签基础规则归 `src/styles/reset.css`。 +- AppShell、侧栏、顶栏、导航和页面骨架归 `src/styles/shell.css`。 +- 跨业务复用且语义一致的公共组件样式归 `src/styles/components/`;迁移完成前的既有公共规则可继续位于明确登记的共享样式文件。 +- 同一业务域多个页面共享的样式归业务域目录,并由业务域根类名限定。 +- 只服务一个页面、弹窗或局部组件的样式必须放在其 TSX 同目录或对应业务目录,由所有者直接 import。 +- `src/styles/global.css` 是存量兼容文件:只允许迁出、删除和保持视觉等价所必需的修正,不得新增页面或业务选择器。例外必须在变更说明中写明原因、影响范围和清理条件。 + +## CSS 禁止事项 + +- 禁止把新页面、新弹窗或新业务组件的选择器写入 `global.css`。 +- 禁止使用无业务根节点限定的标签选择器或短通用类名影响其他页面。 +- 禁止通过新增 `!important`、提高 specificity 或依赖偶然加载顺序掩盖归属和级联问题;第三方不可控样式等例外必须记录原因、影响范围和移除条件。 +- 禁止把公共组件样式建立在业务页面样式之上。 +- 禁止对 `global.css` 执行整文件格式化,或在迁移提交中夹带视觉改版和无关重排。 +- 禁止仅凭类名前缀批量移动选择器;必须同时核对 TSX 引用、其他 CSS 定义、媒体查询和真实 DOM。 + +## CSS 变更验收 + +- 提交前检查 staged diff,确保只包含本轮目标文件或精确 hunk。 +- 运行与范围匹配的定向测试、前端全量测试、TypeScript、生产构建、仓库当前提供的格式和样式门禁以及 `git diff --check`;自动门禁尚未覆盖的项目按日常规范人工检查并记录。 +- 页面级变更至少检查 1600×1000、1366×768 和 390×844;覆盖首次进入、刷新、跨路由切换及相关交互状态。 +- 使用真实 API 和测试环境完成最终功能验收;构建成功、组件测试或隔离截图不能代替真实页面验收。 +- 纯 CSS 拆分不得改变计算样式。发现差异时先恢复原级联关系,不得顺手调整设计。 diff --git a/docs/css-development-guidelines.md b/docs/css-development-guidelines.md new file mode 100644 index 0000000..72d9a2a --- /dev/null +++ b/docs/css-development-guidelines.md @@ -0,0 +1,80 @@ +# CSS 日常开发规范 + +## 1. 适用范围 + +本规范适用于新增、修改、迁移和审查前端 CSS。它是日常开发的强制规则;`global.css` 的存量拆分步骤另见 `global-css-modularization-plan-20260904.md`。 + +原则只有两条:每条样式必须有唯一所有者;样式的生效范围必须和所有者范围一致。 + +## 2. 先判断归属 + +按以下顺序判断,命中后停止: + +| 问题 | 归属 | +|---|---| +| 是否只是颜色、间距、字号、圆角、阴影等设计变量? | `src/styles/tokens.css`,只定义自定义属性 | +| 是否是浏览器重置或标签字体继承? | `src/styles/reset.css`,不得包含业务类名 | +| 是否属于 AppShell、侧栏、顶栏、导航、登录框架或页面容器? | `src/styles/shell.css` | +| 是否被多个业务域复用,且所有状态和视觉语义一致? | `src/styles/components/` 中对应公共组件文件 | +| 是否只在同一业务域的多个页面复用? | 业务域目录中的共享 CSS,并使用业务域根前缀 | +| 是否只服务一个页面、弹窗或局部组件? | 与所有者同目录的 CSS,由所有者直接 import | +| 是否无法确认用途的历史规则? | 暂留 `global.css`,先记录和查证,不得复制或新增 | + +“看起来相似”不等于公共组件。只有 API、交互状态和视觉语义都一致,才能上移到公共层。 + +## 3. 命名和作用域 + +- 页面必须有唯一根类名,例如 `.admin-report-materials-page`。 +- 页面样式必须位于页面根类名下,避免路由切换后已加载 CSS 污染其他页面。 +- 业务域共享样式使用稳定的业务域前缀;公共组件使用组件名,不使用 `item`、`title`、`card` 等无上下文短类名。 +- 状态类使用所属组件限定,例如 `.report-field-card.is-selected`,不得单独定义全局 `.selected`。 +- 不新增无根节点限定的 `div`、`button`、`table` 等业务样式。 +- 新代码不使用 ID 选择器控制样式。 + +## 4. Import 和级联 + +固定层级为: + +```text +tokens → reset → shell → shared components → business shared → page styles +``` + +- 基础层和全局共享层只能由应用入口或明确的公共组件入口加载。 +- 页面 CSS 由页面或其业务域入口直接 import,不得通过 `global.css` 间接加载。 +- 公共组件不得依赖业务页面样式;业务页面可以覆盖公共组件,但必须位于页面根节点下。 +- 相同 specificity 下的覆盖如果依赖加载顺序,必须在代码中保持稳定,并验证首次进入、刷新和跨路由跳转。 +- 伪类、子选择器、动画和媒体查询跟随其所有者,不集中到新的全局文件。 + +## 5. 修改规则 + +- 优先复用 `tokens.css` 中已有变量;新增 token 必须具有跨页面意义。 +- 不新增 `!important`。确有第三方样式等不可控原因时,需说明原因、影响范围和移除条件。 +- 不通过不断嵌套或重复类名提高 specificity;应修正所有权、根节点或加载层级。 +- 不在纯样式修复中顺手重排整个文件、改色、改字号或重做布局。 +- 不复制已有规则来快速覆盖问题;先搜索同名选择器和全部消费者。 +- 动态数值可使用 React `style` 或 CSS 自定义属性;稳定视觉规则仍应归入 CSS 所有者文件。 + +## 6. `global.css` 过渡规则 + +- 在完成自动门禁和相关脚本适配前,文件继续保留 `global.css` 名称,行为上视为只减不增的 legacy 文件。 +- 允许:迁出选择器、删除已验证无用规则、为保持迁移前计算样式而做的最小修正。 +- 禁止:新页面选择器、新业务组件、单页补丁、无根节点覆盖以及新的 `!important`。 +- 例外必须在变更说明中记录原因、影响页面、验证证据和后续清理条件;不能只写“临时处理”。 +- 禁止整文件 Prettier;迁出的新文件应单独格式化。 + +## 7. 开发和审查清单 + +提交前至少确认: + +1. 样式文件和选择器有明确所有者。 +2. 页面及业务样式具有根节点命名空间。 +3. 没有向 `global.css` 增加页面或业务规则。 +4. 没有新的无说明 `!important`、宽泛标签选择器或跨层依赖。 +5. 修改共享样式时已列出并检查所有消费者。 +6. hover、focus、disabled、loading、selected、danger、空数据和错误状态没有遗漏。 +7. 1600×1000、1366×768、390×844 下没有新增溢出、遮挡和层级错误。 +8. 首次进入、刷新和跨路由切换后的计算样式一致。 +9. 已运行 CSS 格式与样式门禁、相关测试、TypeScript、生产构建和 `git diff --check`。 +10. staged diff 没有整文件重排或其他会话的修改。 + +在自动门禁正式落地前,第 3、4、5、8 项必须人工检查,不能因工具尚未覆盖而跳过。 diff --git a/docs/css-modularization-result-20260905.md b/docs/css-modularization-result-20260905.md new file mode 100644 index 0000000..5a90df8 --- /dev/null +++ b/docs/css-modularization-result-20260905.md @@ -0,0 +1,47 @@ +# 全局 CSS 模块化实施结果 + +## 结果 + +2026-09-05 完成 `src/styles/global.css` 的全量迁移。原文件已删除,业务样式由 `src/styles/domains/index.css` 按固定顺序加载14个所有权模块;设计变量、重置、Shell、既有运营端/客户端共享层和公共组件层继续按 `main.tsx` 的原层级加载。 + +## 模块与所有者 + +| 顺序 | 文件 | 所有权 | +|---:|---|---| +| 1 | `01-operations-dashboard.css` | Gateway异常辅助界面与运营/客户端概览 | +| 2 | `02-client-sending.css` | 客户端短信/彩信发送和批次任务列表 | +| 3 | `03-client-records.css` | 客户端任务详情、发送记录和上行 | +| 4 | `04-signatures.css` | 签名和引流资料体验 | +| 5 | `05-templates.css` | 短信模板和彩信模板 | +| 6 | `06-auth-enterprise.css` | 登录、风险确认、用户表单和企业认证 | +| 7 | `07-admin-operations.css` | 运营详情、应用路由、企业档案和短信审核 | +| 8 | `08-reporting.css` | 报备资料、导入映射、批次和字段选择 | +| 9 | `09-channels.css` | 通道指标、通道组和路由 | +| 10 | `10-signature-quality.css` | 签名退订与发送质量矩阵 | +| 11 | `11-deliveries-reporting.css` | 下游投递、报表任务和彩信运营页 | +| 12 | `12-admin-configuration.css` | 上行、账务、用户、号段和报备字段库 | +| 13 | `13-client-signatures.css` | 客户端签名和引流资料 | +| 14 | `14-responsive-requeue.css` | 原共享响应式尾段和下游恢复工作台 | + +模块顺序是原 `global.css` 顶层节点顺序的连续分区,不得按名称重新排序。媒体查询、伪类、子选择器和动画均随原节点迁移。 + +## 等价证据 + +- 原始基线:213062字节、9846行、1749条规则、2017个选择器、5321条声明、30个`!important`。 +- 模块化后的AST总量和完整选择器顺序与原基线一致。 +- 迁移前后Vite主CSS产物均为 `index-CkSy6WDi.css`,SHA-256均为 `d7043ee2229a402c6b9284c9153536dd6393446a3b0fe7c47ee7dd05290539c3`,字节比较无差异。 +- 机器可读证据位于 `tools/quality/css-governance-baseline.json`,自动核验入口为 `npm run css:verify`。 + +## 自动门禁 + +- `npm run format:check`:增量Prettier现同时覆盖CSS。 +- `npm run style:check`:对全部CSS执行Stylelint;迁移前已存在的文件使用显式兼容范围,新CSS默认严格执行标准规则。 +- `npm run css:verify`:验证`global.css`不得重建、固定导入顺序、AST基线、选择器顺序、`!important`增长、宽泛业务标签规则和import所有权,并执行允许/拒绝样例测试。 +- `.github/workflows/css-quality.yml`:PR和main推送均以完整提交范围运行格式、Stylelint和CSS治理门禁。 + +## 维护边界 + +- 新页面、弹窗和业务组件继续使用同目录CSS并由所有者直接import。 +- 14个迁移模块只用于承接已登记的历史规则;新增规则应先判断页面、业务域或公共组件所有权,不得因类名前缀相似直接追加。 +- 不得重新创建 `global.css`、扩大Stylelint兼容文件范围或增加无登记例外。 +- 迁移模块后续按真实页面证据继续细化时,必须同步更新机器基线,并保持主CSS产物或关键计算样式等价。 diff --git a/docs/global-css-modularization-plan-20260904.md b/docs/global-css-modularization-plan-20260904.md new file mode 100644 index 0000000..25c001f --- /dev/null +++ b/docs/global-css-modularization-plan-20260904.md @@ -0,0 +1,457 @@ +# `global.css` 分模块治理方案 + +## 1. 文档目的 + +本方案用于治理当前前端全局样式文件 `src/styles/global.css` 体积过大、页面样式归属不清、格式化容易产生大范围无关差异、跨页面覆盖难以追踪的问题。 + +本方案定义拆分策略、实施批次、验证方法和回退边界。2026-09-05 已按本文完成首次全量治理,实施结果和长期维护方式见 `css-modularization-result-20260905.md`;后续仍须遵守本文的所有权、门禁和验收规则。 + +本方案与以下规范共同生效: + +- 根目录 `AGENTS.md`:定义整个仓库必须遵守的 CSS 所有权、禁止事项和验收底线。 +- `docs/css-development-guidelines.md`:定义日常新增和修改 CSS 时的归属决策、命名、import、级联和审查规则。 +- 本文档:只负责存量 `global.css` 的渐进拆分、验证和回退。 + +实施顺序必须是“强制规则 → 自动门禁 → 视觉基线 → 存量拆分”。不得先大规模移动 CSS,再补规则和门禁。 + +## 2. 当前事实基线 + +截至 2026-09-04,只读核验结果如下: + +- `src/styles/global.css`:约 213,062 字节、9,846 行。 +- 该文件最早创建于提交 `2f3c274`(`Initial CMPP frontend prototype`),创建时已经约 6,267 行、136KB,并非由一个很小的基础样式文件自然增长而来。 +- 最近 30 天约有 30 个提交修改该文件,累计约增加 975 行、删除 274 行,是前端高频冲突文件。 +- `src/main.tsx` 当前按顺序全局加载: + 1. `tokens.css` + 2. `reset.css` + 3. `shell.css` + 4. `global.css` + 5. `admin.css` + 6. `client.css` + 7. `components.css` +- 2026-07-31 的提交 `ca4f591` 曾拆出 `reset.css`、`shell.css`、`admin.css` 和 `client.css`,但拆分没有持续完成。目前 `client.css` 仅 8 行,大量运营端、客户端和业务组件样式仍留在 `global.css`。 +- 当前已经存在少量页面级 CSS:短信通道、企业应用、安全检测、短信记录、短信任务进度、系统监控和客户端用户页面。这说明项目已具备页面就近管理样式的实现基础。 + +当前问题主要影响开发、审查和协作效率,不直接等同于浏览器运行性能问题。 + +## 3. 治理目标 + +### 3.1 主要目标 + +1. 将 `global.css` 从业务样式总仓库降级为只减不增的临时兼容入口,最终清空并删除。 +2. 每个页面或业务域的样式有唯一、可定位的归属文件。 +3. 修改一个页面时,不再需要格式化、审查或合并近万行全局 CSS。 +4. 保持现有页面视觉、交互、响应式和打印/导出效果不变。 +5. 建立规则,防止新业务样式重新写回全局文件。 + +### 3.2 建议量化标准 + +- 第一阶段完成后:`global.css` 降至 6,000 行以内。 +- 第二阶段完成后:`global.css` 降至 2,000 行以内。 +- 最终阶段:`global.css` 清零并删除,或仅保留不超过 300 行、经过明确评审的全局兼容规则。 +- 单个页面 CSS 建议不超过 800 行。 +- 单个业务域 CSS 建议不超过 1,200 行;超过后继续按页面或组件拆分。 +- 不允许业务页面通过无前缀标签选择器影响其他页面。 + +## 4. 不在本次治理中处理的内容 + +以下事项不能与 CSS 拆分同时进行: + +- 页面重新设计、颜色调整、字号调整或布局优化。 +- React 组件大规模重构。 +- 后端 API、数据库、Redis、短信链路或权限逻辑修改。 +- 将全部普通 CSS 一次性改造成 CSS Modules、Tailwind 或 CSS-in-JS。 +- 删除看起来“可能无用”但没有运行时证据的选择器。 +- 对整份历史 CSS 执行一次性 Prettier 重排并混入拆分提交。 + +拆分阶段的核心原则是“只改变样式存放位置,不改变最终计算样式”。 + +## 5. 目标目录结构 + +建议继续使用项目当前的普通 CSS 和页面前缀命名方式,不在第一轮引入新的样式技术栈。在通用门禁和所有硬编码路径完成适配前,保留 `global.css` 文件名,行为上将其视为 legacy 文件;不得为了目录整齐过早重命名。 + +```text +src/ +├─ styles/ +│ ├─ tokens.css # 设计变量,仅允许 CSS 自定义属性 +│ ├─ reset.css # 标签重置和浏览器一致性 +│ ├─ shell.css # AppShell、侧栏、顶栏、导航、页面容器 +│ ├─ utilities.css # 少量明确、稳定的工具类 +│ ├─ components/ +│ │ ├─ buttons.css # 通用 UI Button +│ │ ├─ forms.css # Input、Select、Textarea、校验提示 +│ │ ├─ modal.css # Modal、Drawer、Popover +│ │ ├─ table.css # 通用表格、分页、空状态 +│ │ ├─ cards.css # 通用卡片与统计卡 +│ │ └─ feedback.css # Tag、Alert、Toast、Loading +│ └─ global.css # 拆分过程中的临时剩余区,只减不增,治理后删除 +├─ apps/ +│ ├─ admin/ +│ │ ├─ reporting/ # 报备资料、批次、字段映射、状态记录 +│ │ ├─ enterprise-signatures/ # 企业签名、引流资料、退订/质量状态 +│ │ ├─ channels/ # 通道、通道组、通道详情 +│ │ ├─ sms-records/ # 短信记录与详情 +│ │ ├─ sms-task-progress/ # 批次任务与进度 +│ │ ├─ monitoring/ # 系统监控、服务监控、日志 +│ │ ├─ risk/ # 风控、黑名单、敏感词、安全检测 +│ │ └─ billing/ # 充值、对账、利润与账务页面 +│ └─ client/ +│ ├─ dashboard/ +│ ├─ send/ +│ ├─ signatures/ +│ ├─ templates/ +│ ├─ billing/ +│ └─ users/ +``` + +目录名称应优先复用现有页面目录,避免仅为样式拆分同步搬动 TSX 文件。 + +现有 `components.css`、`admin.css` 和 `client.css` 应先完成所有权清单,再决定迁入目录、拆分或保留;不得在旧文件仍承担相同职责时直接创建第二套重复公共样式。 + +## 6. 样式归属规则 + +日常开发以 `docs/css-development-guidelines.md` 的归属决策为准。本节用于拆分时判断存量选择器的目标位置。 + +| 样式类型 | 目标文件 | 规则 | +|---|---|---| +| 颜色、间距、字号、圆角、阴影变量 | `tokens.css` | 只定义变量,不放页面选择器 | +| `html`、`body`、标题、表单字体继承等浏览器重置 | `reset.css` | 不包含业务类名 | +| 侧栏、导航、页面框架、登录框架 | `shell.css` | 仅负责应用骨架,不负责页面业务卡片 | +| Button、Input、Modal、Tag、Pagination 等通用组件 | `styles/components/*.css` | 选择器必须与通用组件类名一致 | +| 只被一个页面使用的样式 | 页面同目录 CSS | 由该页面 TSX 直接 import | +| 同一业务域多个页面共享的样式 | 业务域目录中的共享 CSS | 必须带业务域根前缀 | +| 尚未完成归属确认的旧样式 | `global.css` | 行为上作为 legacy 文件,只允许迁出、删除和保持视觉等价所需的最小修正 | + +禁止继续向 `global.css` 增加以下内容: + +- 新页面样式。 +- 新业务组件样式。 +- 为解决单页问题而增加的无页面根节点限定覆盖。 +- 新的 `!important`,除非有单独说明和回归用例。 + +## 7. 拆分前置工作 + +### 7.1 建立选择器清单 + +为 `global.css` 中每个顶层选择器记录: + +- 选择器名称。 +- 被哪些 TSX 文件引用。 +- 是否存在重复定义。 +- 是否出现在媒体查询中。 +- 是否依赖前后定义顺序。 +- 建议目标文件。 +- 是否存在无法确认用途的情况。 + +不能仅凭类名猜测归属。必须通过 `rg`、构建产物和真实页面 DOM 共同确认。 + +### 7.2 建立视觉基线 + +至少保存以下尺寸下的真实页面截图和关键元素尺寸: + +- 桌面:1600×1000。 +- 常见笔记本:1366×768。 +- 窄屏:390×844。 + +基线页面至少包括: + +- 运营看板。 +- 短信通道列表和报备详情。 +- 报备字段库。 +- 报备资料池、批次、通道报备明细和状态记录。 +- 企业签名管理及查看资料弹窗。 +- 短信记录和详情弹窗。 +- 系统监控、安全检测和高风险操作弹窗。 +- 客户端首页、发送短信、签名、模板、账务和用户页面。 +- 运营端与客户端登录页。 + +使用真实 API 和测试环境数据进行最终验收;隔离截图数据只能用于布局比较,不能替代真实功能验收。 + +### 7.3 冻结无关格式化 + +拆分完成前: + +- 禁止对 `global.css` 执行整文件 `prettier --write`。 +- 每个提交必须检查 `git diff --stat` 和 CSS diff;出现明显超出迁移范围的大量重排立即停止。 +- 增加“本提交是否只移动目标选择器”的人工检查项。 +- 不通过关闭全部格式检查规避问题;应对新文件执行格式检查,对历史遗留文件采用迁出即格式化策略。 + +### 7.4 建立治理基线 + +正式拆分前必须提交一份机器可读的基线,至少记录: + +- `global.css` 的字节数、规则数、选择器数和声明数。 +- 已知允许暂留的全局基础选择器。 +- 已拆分页面的根类名和目标样式文件。 +- 当前 CSS import 层级和入口顺序。 +- 临时例外的原因、影响范围和清理条件。 + +基线比较必须使用 PostCSS AST;行数和字节数只作为辅助指标,不能把注释或换行变化误判为新增业务规则。 + +## 8. 分阶段实施方案 + +### 阶段 0:建立防扩散门禁 + +目标:在正式拆分前停止继续恶化。 + +1. 提交根目录 `AGENTS.md` 和 `docs/css-development-guidelines.md`,明确规则已开始生效。 +2. 保留 `global.css` 文件名并增加“只减不增”文件头;先不重命名,避免破坏当前硬编码该路径的质量脚本。 +3. 扩展增量格式脚本,使新增和修改的 CSS 进入 Prettier 检查。 +4. 引入 Stylelint:新文件严格执行;`global.css` 初期使用兼容配置,不要求一次清理全部历史问题。 +5. 新增基于 PostCSS AST 的通用静态检查,阻止向 `global.css` 增加页面/业务选择器、无说明 `!important` 和宽泛业务标签规则。 +6. 建立增长基线和显式例外清单;无例外时,`global.css` 的规则、选择器、声明和字节数均不得无说明增长。 +7. CI 使用目标分支 merge-base 或显式 `QUALITY_BASE_REF` 比较完整提交范围,不能只比较工作区相对 `HEAD` 的未提交差异。 +8. 建立 CSS 选择器与页面引用清单,并登记已拆分页面的根类名和所有者文件。 +9. 新页面必须使用同目录 CSS;共享样式必须先通过归属判断。 + +验收标准:规则文档可以被 Codex 和开发者直接执行;本地质量命令与 CI 都能拦截故意加入的违规样例;删除违规样例后全部通过;不改变任何计算样式,所有现有页面和构建结果保持一致。 + +### 阶段 1:基础层和应用骨架去重 + +目标:先迁移风险较低、归属明确的全局基础规则。 + +1. 对比 `global.css`、`reset.css`、`shell.css`、`components.css` 中重复的基础规则。 +2. 将标签级重置统一到 `reset.css`。 +3. 将侧栏、顶栏、导航、页面容器和登录框架统一到 `shell.css`。 +4. 同名规则只在确认计算样式一致后删除旧定义。 + +风险重点:加载顺序和相同 specificity 下的后定义覆盖。 + +### 阶段 2:通用 UI 组件拆分 + +目标:将跨页面真正复用的组件从业务样式中分离。 + +建议依次拆分: + +1. 按钮、图标按钮和操作按钮组。 +2. Input、Select、Textarea、查询栏和错误提示。 +3. Modal、Drawer、确认弹窗和弹窗 Footer。 +4. Tag、Alert、Loading、Empty State。 +5. Table、Pagination、统计卡和详情列表。 + +每迁出一类组件,需要搜索所有调用页面,验证 hover、focus、disabled、loading、danger 和窄屏状态。 + +### 阶段 3:报备工作台业务域 + +优先拆分近期最活跃、冲突概率最高的报备相关样式: + +- `report-*` +- `channel-field-*` +- `channel-selected-*` +- `channel-export-*` +- `report-material-*` +- `report-batch-*` +- 报备资料查看、导入、导出格式选择弹窗 + +建议建立: + +```text +src/apps/admin/reporting/ +├─ report-workbench.css +├─ report-field-mapping.css +├─ report-materials.css +├─ report-batches.css +└─ report-records.css +``` + +本阶段必须特别验证: + +- 字段池单卡片固定高度。 +- 导出字段顺序和按钮宽度。 +- 图片预览和历史字段展示。 +- 状态记录大屏免横向滚动布局。 +- 资料池、批次和明细页面的桌面/窄屏响应式。 + +### 阶段 4:企业签名和通道域 + +拆分: + +- `signature-*` +- `enterprise-signature-*` +- `carrier-report-*` +- `channel-*` 中不属于报备字段弹窗的通道管理样式 +- 通道组、通道状态、质量矩阵和签名三网状态样式 + +需要先区分“通道管理共享样式”和“报备工作台专用样式”,避免仅按 `channel-` 前缀批量移动。 + +### 阶段 5:短信、任务、监控和风险域 + +按现有页面目录继续迁移: + +1. 短信发送、短信记录和发送详情。 +2. 批次任务、任务进度和下游恢复/重投页面。 +3. 系统日志、系统监控和服务指标。 +4. 黑名单、敏感词、风险规则和安全检测。 +5. 充值、对账、利润与账务页面。 + +已存在页面 CSS 的模块先做“从 global.css 迁出遗漏规则”,不重新创建第二份页面样式文件。 + +### 阶段 6:客户端域 + +将 `client.css` 从当前 8 行的占位文件调整为客户端共享层,并优先把页面专用规则放到具体客户端页面目录。 + +重点防止运营端和客户端使用相同短类名时互相覆盖。共享规则必须确认视觉语义一致,否则分别使用 `.admin-*` 和 `.client-*` 根前缀。 + +### 阶段 7:清理遗留文件 + +1. 对剩余选择器逐项确认引用。 +2. 无引用选择器必须经过构建、DOM 检查和真实页面核验后按小批次删除。 +3. 检查重复媒体查询、重复属性和无效覆盖。 +4. 删除空的 `global.css` 及其入口引用。 +5. 更新项目开发规范和测试进度。 + +## 9. 单批次迁移方法 + +每一批只处理一个页面或一个可独立验证的组件族: + +1. 记录目标选择器及其原始行号。 +2. 搜索 TSX 使用位置和其他 CSS 中的同名定义。 +3. 将完整规则连同伪类、子选择器和媒体查询一起移动。 +4. 在目标页面或业务域入口显式 import 新 CSS,并确保页面具有唯一根类名命名空间。 +5. 保持选择器文本、属性顺序和 import 后的级联顺序不变。 +6. 运行定向测试、TypeScript 和生产构建。 +7. 在三个尺寸下比较迁移前后页面。 +8. 检查浏览器控制台、网络请求、滚动和弹窗层级。 +9. 独立提交,不夹带业务代码修改。 + +修改共享样式时必须列出全部已知消费者,并逐一检查关键状态;不能只验证提出本次修改的页面。 + +禁止使用正则一次性移动所有相同前缀,因为同一前缀可能跨多个页面或业务域。 + +## 10. 级联和加载顺序策略 + +CSS 拆分最大的风险不是文件移动本身,而是加载顺序变化。 + +建议最终固定顺序: + +```text +tokens → reset → shell → shared components → business shared → page styles +``` + +注意事项: + +- 相同 specificity 的规则依赖“后加载覆盖”,移动前必须记录原顺序。 +- 页面级 CSS 由懒加载页面 import 时,要验证首次进入、刷新、跨页面跳转后的样式一致性。 +- SPA 中已经加载的页面 CSS 通常不会在离开路由后卸载,因此页面样式必须位于唯一页面根类名下,不能把正确性建立在“当前页面最后加载”之上。 +- 不依靠提高 specificity 或新增 `!important` 掩盖顺序错误。 +- 公共组件样式不能反向依赖业务页面样式。 +- 媒体查询应跟随其所属组件迁移,不集中到新的全局响应式文件。 + +## 11. 测试与验收要求 + +### 11.1 自动化检查 + +每批至少执行: + +- 与页面匹配的 Vitest/Testing Library 用例。 +- 前端全量测试。 +- TypeScript 检查。 +- Vite 生产构建。 +- Bundle 预算检查。 +- CSS/代码格式检查,仅覆盖新文件和本批实际修改文件。 +- Stylelint;新文件执行严格规则,遗留文件执行过渡规则。 +- `global.css` AST 增长和禁止选择器检查。 +- 页面根类名、样式所有者和 import 关系检查。 +- `git diff --check`。 +- 选择器引用检查和重复选择器报告。 + +门禁实现要求: + +- 本地增量检查可覆盖 staged、unstaged 和 untracked CSS;提交前以 staged diff 为最终范围。 +- CI 必须比较目标分支 merge-base 到当前提交,不能依赖默认 `HEAD` 导致已提交变化漏检。 +- `global.css` 增长判断以 PostCSS AST 为主,行数和字节数为辅。 +- 例外采用仓库内显式清单,至少包含选择器或规则、原因、影响范围和清理条件;不接受只有提交信息中的“临时处理”。 +- 门禁脚本自身必须包含允许样例和拒绝样例测试。 + +### 11.2 浏览器验收 + +构建成功不能等同于拆分成功。必须检查: + +- 真实页面是否加载对应 CSS 资源。 +- 页面首次进入和路由切换后的样式是否一致。 +- loading、空数据、失败、权限不足和历史数据状态。 +- Modal、Drawer、下拉框、Sticky 表头和滚动容器。 +- hover、focus、disabled、selected 和 danger 状态。 +- 桌面端、笔记本和窄屏。 +- 浏览器控制台无新增错误和样式资源 404。 +- 页面没有新增横向溢出、遮挡或层级错误。 + +### 11.3 视觉差异判定 + +- 纯文件拆分批次的目标是关键页面像素级无变化。 +- 允许字体抗锯齿等环境噪声,但布局尺寸、间距、颜色、折行、滚动和交互状态必须一致。 +- 发现视觉变化时优先恢复原级联顺序,不允许顺手“优化得更好看”后继续合并。 + +## 12. Git 与协作策略 + +- 每个提交只拆一个页面或一个组件族。 +- 提交名称示例:`refactor: extract report field mapping styles`。 +- 提交前检查 staged diff,只包含目标 CSS、新 import、测试和文档。 +- 不在拆分提交中执行全仓库格式化。 +- 不删除或覆盖其他会话的 staged、unstaged、untracked 文件。 +- CSS 门禁例外必须与对应变更同批审查;不得用扩大例外范围的方式让无关规则通过。 +- 主分支持续开发时,优先迁移冲突最频繁的业务域,并缩短分支存活时间。 +- 每批可独立 `git revert`,不要求整体回退全部拆分阶段。 + +## 13. 风险与应对 + +| 风险 | 表现 | 应对 | +|---|---|---| +| CSS 加载顺序变化 | 颜色、间距或布局悄然变化 | 固定 import 顺序并比较 computed style | +| 选择器漏迁 | 某些弹窗或窄屏状态失去样式 | 伪类、子选择器、媒体查询按选择器族迁移 | +| 同名选择器跨页面复用 | 拆走后其他页面异常 | TSX/CSS 双向搜索,无法确认时暂留 legacy | +| 懒加载 CSS 顺序不稳定 | 跨页面跳转后样式变化 | 页面根节点命名空间隔离,验证刷新和跳转 | +| 整文件格式化污染 diff | 数千行无关修改 | 禁止格式化 legacy,迁出后只格式化新文件 | +| 误删历史样式 | 历史数据或低频页面显示异常 | 删除单独分批,真实历史数据页面复验 | +| 拆分期间业务需求冲突 | 合并困难、重复搬运 | 小提交、短周期、按高频业务域优先实施 | + +## 14. 回退方案 + +每个迁移批次的回退单位是对应独立提交: + +1. 浏览器验收失败时停止后续拆分。 +2. 保留截图、控制台和具体选择器差异证据。 +3. 回退当批提交,恢复原 import 和原文件位置。 +4. 不通过追加高优先级覆盖掩盖错误。 +5. 修正选择器归属或加载顺序后重新提交该批次。 + +CSS 拆分不涉及数据库迁移、服务配置或短信链路,因此不应触发数据库回滚、队列处理或短信重投。 + +## 15. 建议实施顺序与工作量 + +| 阶段 | 内容 | 预计工作量 | +|---|---|---:| +| 0 | AGENTS、日常规范、清单、视觉基线、防扩散门禁 | 2~3 人日 | +| 1 | Reset、Shell、基础层去重 | 1~2 人日 | +| 2 | 通用 UI 组件拆分 | 2~4 人日 | +| 3 | 报备工作台 | 2~3 人日 | +| 4 | 企业签名和通道 | 2~3 人日 | +| 5 | 短信、任务、监控、风险、账务 | 3~5 人日 | +| 6 | 客户端页面 | 2~3 人日 | +| 7 | 遗留清理、全量回归和规范固化 | 2~3 人日 | + +整体建议按 2~4 周的渐进式治理安排实施,而不是一次性大提交。实际工期取决于测试环境登录态、历史数据覆盖和视觉回归工具可用性。 + +## 16. 完成标准 + +只有同时满足以下条件,才能认为治理完成: + +1. `global.css` 已删除,或只保留经过批准且不超过 300 行的真正全局规则。 +2. 所有业务样式均有清晰的页面或业务域归属。 +3. 新业务样式写入遗留全局文件会被门禁阻止。 +4. 根目录 `AGENTS.md` 和日常 CSS 规范已成为当前生效规则,自动门禁与其一致。 +5. CSS 已纳入增量 Prettier、Stylelint、所有权和 AST 增长检查,本地及 CI 均能识别完整变更范围。 +6. 前端全量测试、TypeScript、生产构建和包体积检查通过。 +7. 核心运营端、客户端页面在三种尺寸下完成真实浏览器回归。 +8. 浏览器控制台和网络请求无新增错误,CSS 资源无 404。 +9. 报备状态记录的大屏布局、字段池固定高度、Sticky 表头和所有关键弹窗没有回归。 +10. `docs/testing-progress.md` 和相关系统功能用例已同步更新。 + +## 17. 2026-09-05 实施状态 + +- `src/styles/global.css` 已删除,入口替换为 `src/styles/domains/index.css`;原1749条规则、2017个选择器、5321条声明和30个既有`!important`按原顶层节点顺序迁入14个业务域文件。 +- 迁移前后Vite主CSS产物名称、字节内容和SHA-256完全一致,证明本次只改变源码所有权与文件边界,没有改变最终CSS级联结果。 +- `tools/quality/css-governance-baseline.json`保存原始AST指标、完整选择器顺序、模块所有者、导入顺序和模块摘要;`verify-css-governance.mjs`验证旧文件不得重建、AST总量及顺序不变、既有`!important`不得增长、新CSS不得增加宽泛标签选择器、所有CSS必须存在明确import。 +- CSS已进入增量Prettier和Stylelint。迁出的历史规则使用显式兼容清单保留现状;未登记的新CSS默认执行Stylelint标准规则,因此兼容配置不会自动扩散到新页面。 +- 新增GitHub CSS质量工作流,以目标分支或父提交作为`QUALITY_BASE_REF`,避免只检查未提交工作区导致已提交违规变化漏检。 +- 原方案建议逐批迁移;本次为满足一次性执行要求,采用单次原序抽取。由于14个模块共同组成一条完整且经产物哈希证明等价的级联链,保持为一个可整体回退的原子变更,避免中间提交出现规则重复或缺失。 diff --git a/docs/system-functional-test-cases.md b/docs/system-functional-test-cases.md index 7e385ee..4d7eabb 100644 --- a/docs/system-functional-test-cases.md +++ b/docs/system-functional-test-cases.md @@ -5053,6 +5053,17 @@ npm run verify:phase8 | TC-HFQ-012 | 在导入字段映射中展开或收起“查看前10行解析预览” | 预览内容在弹窗内独立滚动,目标字段下拉框及映射表列宽在展开前后保持不变,桌面及窄屏均不产生页面级横向溢出 | | TC-HFQ-013 | 使用无扩展的干净浏览器打开批量导入流程并检查控制台 | 应用源码及产物不包含`reportAllChanges`;不得出现平台自身脚本错误。若仅扩展注入的匿名`VM*`脚本报`startTime`错误,应与平台功能错误分开记录,不得通过全局吞错掩盖 | +## TC-CSS-MODULARIZATION-20260905 全局样式模块化治理 + +| 用例ID | 场景 | 预期 | +|---|---|---| +| TC-CSS-MOD-001 | 构建模块化前后的前端生产资源并比较主CSS | 主CSS字节内容和SHA-256一致,规则、选择器、声明、`!important`数量及选择器顺序与AST基线一致 | +| TC-CSS-MOD-002 | 在`src/styles/global.css`新增业务规则或重新创建该文件 | CSS治理门禁失败并明确提示旧文件禁止重建 | +| TC-CSS-MOD-003 | 在新页面CSS加入无根节点的`button`规则或新增`!important` | CSS治理门禁失败;删除违规样例后恢复通过 | +| TC-CSS-MOD-004 | 修改TS/TSX或新增CSS后运行增量格式检查 | 实际变更的CSS进入Prettier;Stylelint对未登记新文件执行严格规则,历史兼容范围不会自动扩大 | +| TC-CSS-MOD-005 | 分别首次进入、刷新及跨路由打开核心运营端和客户端页面 | CSS资源无404,无框架错误层和新增控制台错误;布局、弹窗、下拉框、Sticky表头、状态记录及字段卡片与迁移前一致 | +| TC-CSS-MOD-006 | 在1600×1000、1366×768和390×844检查核心页面 | 页面无新增横向溢出、遮挡、错位或层级问题,窄屏交互仍可访问 | + ## TC-ADMIN-ENHANCEMENT-20260904 运营看板与配置交互增强 | 用例ID | 场景 | 预期 | diff --git a/docs/testing-progress.md b/docs/testing-progress.md index 8ba2574..c849ef7 100644 --- a/docs/testing-progress.md +++ b/docs/testing-progress.md @@ -4511,3 +4511,12 @@ git diff --check - 映射弹窗新增页面私有样式约束,解析预览和映射表都使用可收缩容器,长预览内容在自身区域滚动,展开“查看前10行解析预览”不再改变目标字段下拉框宽度;没有向`global.css`新增选择器。 - 控制台所示`VM*:2`、`reportAllChanges`和`startTime`调用栈不在仓库源码、依赖声明或构建入口中,形态与浏览器动态注入的Web Vitals采集脚本一致。本轮没有增加全局错误吞噬或修改业务代码掩盖该外部异常;后续真实浏览器验收需用无扩展会话区分平台脚本和注入脚本。 - 定向前端组件测试2项、定向API映射测试3项通过;前端全量13套65项、API全量55套619项通过;前后端TypeScript、API生产构建、Vite生产构建、依赖安全、部署契约、结构质量及增量ESLint通过。Vite仅保留既有Chart分块超过500kB提示,增量ESLint仅保留3条既有Hook依赖warning。本轮按用户最终要求只本地提交,不推送、不部署测试环境或预生产,不操作短信链路、余额、通道及客户配置。 + +## 2026-09-05 全局CSS模块化治理(本地实施与发布前验收完成) + +- 重新读取根目录`AGENTS.md`、`docs/css-development-guidelines.md`和完整拆分方案后执行。原`global.css`为213062字节、9846行,经PostCSS统计为1749条规则、2017个选择器、5321条声明和30个既有`!important`;现已删除并按原顶层节点顺序迁入14个所有权模块,由`src/styles/domains/index.css`固定顺序加载。各业务域文件均不超过1200行建议值。 +- 迁移没有改变CSS级联:格式化新模块并重新生产构建后,迁移前后主CSS均为`index-CkSy6WDi.css`,SHA-256均为`d7043ee2229a402c6b9284c9153536dd6393446a3b0fe7c47ee7dd05290539c3`,工作站逐字节比较无差异。机器基线保存完整选择器顺序、模块指标、所有者、摘要、既有例外和入口顺序。 +- 新增Stylelint及显式历史兼容范围;未登记新CSS默认执行标准规则。增量Prettier现覆盖CSS,跨平台调用改为直接执行Node入口。CSS治理门禁阻止重建`global.css`、改变模块顺序或AST总量、新增未登记`!important`、新增宽泛业务标签选择器及无import所有者文件;Node四项门禁测试和实际临时违规样例均验证为能拒绝,样例随后删除。 +- 新增GitHub CSS质量工作流,在PR中比较目标分支、main推送中比较父提交,避免只检查工作区。实施结果、模块所有权和后续维护边界记录于`docs/css-modularization-result-20260905.md`,方案文档同步改为已实施状态。 +- 发布前真实Chrome基线使用测试环境真实API和PostgreSQL数据:运营端13个核心路由、客户端10个核心路由分别在1600×1000、1366×768、390×844检查,共69张截图;页面均非空、无框架错误层、无页面级横向溢出,控制台warning/error为0。临时平台管理员和企业管理员仅用于验收,发布后将精确删除。 +- 前端全量13套65项、API全量55套619项、CSS治理4项通过;前后端TypeScript、API/Vite生产构建、Stylelint、增量ESLint/Prettier、依赖安全、部署契约、结构质量、包体积和`git diff --check`通过。入口gzip 107.85KiB,低于250KiB预算;只保留既有Chart分块超过500kB提示。发布、推送、发布后69页三尺寸回归、恢复资产、服务/Stream和临时账号清理结果将在完成后追加。 diff --git a/package-lock.json b/package-lock.json index 9c2effb..f0392e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,8 @@ "jsdom": "^29.1.1", "msw": "^2.15.0", "prettier": "^3.9.6", + "stylelint": "^16.23.1", + "stylelint-config-standard": "^38.0.0", "typescript": "^6.0.3", "typescript-eslint": "^8.68.0", "vitest": "^4.1.11" @@ -391,6 +393,67 @@ "specificity": "bin/cli.js" } }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/@csstools/color-helpers": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.1.tgz", @@ -531,6 +594,40 @@ "node": ">=20.19.0" } }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" + } + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -967,6 +1064,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", @@ -1088,6 +1192,44 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@open-draft/deferred-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-3.0.0.tgz", @@ -2114,6 +2256,16 @@ "dequal": "^2.0.3" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -2143,6 +2295,16 @@ "dev": true, "license": "MIT" }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2184,6 +2346,19 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/browserslist": { "version": "4.28.8", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", @@ -2279,6 +2454,30 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2391,6 +2590,13 @@ "dev": true, "license": "MIT" }, + "node_modules/colord": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz", + "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2418,6 +2624,33 @@ "url": "https://opencollective.com/express" } }, + "node_modules/cosmiconfig": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", + "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cron-parser": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", @@ -2445,6 +2678,16 @@ "node": ">= 8" } }, + "node_modules/css-functions-list": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/css-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -2466,6 +2709,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -2551,6 +2807,19 @@ "node": ">=8" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -2596,6 +2865,26 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-module-lexer": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", @@ -2838,6 +3127,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2869,6 +3188,23 @@ "fast-string-truncated-width": "^3.0.2" } }, + "node_modules/fast-uri": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fast-wrap-ansi": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", @@ -2879,6 +3215,26 @@ "fast-string-width": "^3.0.2" } }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", @@ -2909,6 +3265,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -2994,6 +3363,47 @@ "node": ">=10.13.0" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "17.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", @@ -3007,6 +3417,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, "node_modules/graphql": { "version": "16.14.2", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.14.2.tgz", @@ -3027,6 +3465,19 @@ "node": ">=8" } }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/headers-polyfill": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-5.0.1.tgz", @@ -3062,6 +3513,13 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, "node_modules/html-encoding-sniffer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", @@ -3082,6 +3540,19 @@ "dev": true, "license": "MIT" }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3129,6 +3600,13 @@ "node": ">=8" } }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, "node_modules/ioredis": { "version": "5.11.1", "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.11.1.tgz", @@ -3151,6 +3629,13 @@ "url": "https://opencollective.com/ioredis" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3191,6 +3676,26 @@ "dev": true, "license": "MIT" }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.1.0.tgz", + "integrity": "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -3345,6 +3850,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3382,6 +3894,23 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3645,6 +4174,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -3680,6 +4216,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3757,6 +4300,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mdn-data": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", @@ -3764,6 +4318,56 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -3935,6 +4539,16 @@ "node": ">=18" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/obug": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", @@ -4019,6 +4633,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -4059,6 +4692,16 @@ "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -4112,6 +4755,61 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.1.0.tgz", + "integrity": "sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -4178,6 +4876,47 @@ "node": ">=6" } }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", @@ -4317,6 +5056,17 @@ "dev": true, "license": "MIT" }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rolldown": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", @@ -4350,6 +5100,30 @@ "@rolldown/binding-win32-x64-msvc": "1.0.3" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -4430,6 +5204,34 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -4530,6 +5332,234 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylelint": { + "version": "16.23.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", + "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.1", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^10.1.3", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.5", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", + "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.16.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "38.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-38.0.0.tgz", + "integrity": "sha512-uj3JIX+dpFseqd/DJx8Gy3PcRAJhlEZ2IrlFOc4LUxBX/PNMEQ198x7LCOE2Q5oT9Vw8nyc4CIL78xSqPr6iag==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^16.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.18.0" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/stylelint/node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", + "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.13" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4543,6 +5573,29 @@ "node": ">=8" } }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -4550,6 +5603,47 @@ "dev": true, "license": "MIT" }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/tagged-tag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", @@ -4626,6 +5720,19 @@ "dev": true, "license": "MIT" }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tough-cookie": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", @@ -4806,6 +5913,13 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vite": { "version": "8.0.16", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", @@ -5082,6 +6196,20 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", diff --git a/package.json b/package.json index eaada56..11a7932 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,11 @@ "test:frontend:coverage": "vitest run --coverage", "test:auth-redis-integration": "node tools/testing/verify-auth-redis-multi-instance.mjs", "test:gateway": "npm run spike:gateway", - "lint": "npm run quality:verify && node tools/quality/run-changed-code-quality.mjs lint && tsc --noEmit", + "lint": "npm run quality:verify && node tools/quality/run-changed-code-quality.mjs lint && npm run style:check && npm run css:verify && tsc --noEmit", "format:check": "git diff --check && node tools/quality/run-changed-code-quality.mjs format", "quality:verify": "node tools/quality/verify-code-quality.mjs", + "style:check": "stylelint \"src/**/*.css\"", + "css:verify": "node tools/quality/verify-css-governance.mjs && node --test tools/quality/verify-css-governance.test.mjs", "bundle:verify": "node tools/quality/verify-bundle-budget.mjs", "verify:phase1": "npm run spike:contracts && npm run spike:gateway && npm run spike:bullmq && npm run prisma:generate && npm run build:api && npm run build", "verify:phase2": "npm run verify:phase1", @@ -64,6 +66,8 @@ "jsdom": "^29.1.1", "msw": "^2.15.0", "prettier": "^3.9.6", + "stylelint": "^16.23.1", + "stylelint-config-standard": "^38.0.0", "typescript": "^6.0.3", "typescript-eslint": "^8.68.0", "vitest": "^4.1.11" diff --git a/src/main.tsx b/src/main.tsx index fcabe09..17e5771 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,7 +4,7 @@ import { HashRouter } from 'react-router-dom'; import '@/styles/tokens.css'; import '@/styles/reset.css'; import '@/styles/shell.css'; -import '@/styles/global.css'; +import '@/styles/domains/index.css'; import '@/styles/admin.css'; import '@/styles/client.css'; import '@/styles/components.css'; diff --git a/src/styles/domains/01-operations-dashboard.css b/src/styles/domains/01-operations-dashboard.css new file mode 100644 index 0000000..c4378d4 --- /dev/null +++ b/src/styles/domains/01-operations-dashboard.css @@ -0,0 +1,318 @@ +/* Owner: shared operations gateway exceptions and dashboard. Extracted from global.css with original cascade order preserved. */ +.gateway-exception-time { + font-size: 1rem !important; + line-height: 1.35; +} + +.gateway-exception-command { + margin-top: 1rem; +} + +.gateway-exception-command pre { + max-height: 22rem; + margin: 0; + padding: 1rem; + overflow: auto; + border: 1px solid var(--color-border); + border-radius: 0.75rem; + background: var(--color-surface-muted); + color: var(--color-text); + font-size: 0.78rem; + line-height: 1.55; + white-space: pre-wrap; + word-break: break-all; +} + +.gateway-requeue-confirm .callout { + display: flex; + gap: 0.75rem; + padding: 0.9rem 1rem; + border: 1px solid; + border-radius: 0.75rem; +} + +.gateway-requeue-confirm .callout p { + margin: 0.25rem 0 0; +} + +.gateway-requeue-confirm .callout--warning { + border-color: #f5c66f; + background: #fff8e8; + color: #8a5700; +} + +.gateway-requeue-confirm .callout--danger { + border-color: #f2a4a4; + background: #fff0f0; + color: #a12222; +} + +.gateway-requeue-checkbox { + display: flex; + align-items: flex-start; + gap: 0.6rem; + color: var(--color-text); + line-height: 1.5; + cursor: pointer; +} + +.gateway-requeue-checkbox input { + width: 1rem; + height: 1rem; + margin-top: 0.2rem; +} + +.text-page-title { + color: var(--color-text-strong); + font-size: var(--font-size-2xl); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-tight); +} + +.text-section-title { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-tight); +} + +.text-card-title { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + line-height: 1.3; +} + +.text-body { + color: var(--color-text); + font-size: var(--font-size-md); + line-height: var(--line-height-base); +} + +.text-secondary { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + line-height: var(--line-height-base); +} + +.text-caption { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + line-height: 1.45; +} + +.overview-hero { + align-items: center; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + color: var(--color-text); + display: flex; + gap: var(--space-5); + justify-content: space-between; + padding: var(--space-7); +} + +.overview-hero h1 { + color: var(--color-text-strong); +} + +.overview-hero .eyebrow { + color: var(--color-selected); +} + +.overview-hero .muted { + color: var(--color-text-muted); + margin-top: var(--space-2); +} + +.dashboard-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.dashboard-grid--four { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +@media (max-width: 1180px) { + .dashboard-grid--four { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +.metric-card { + display: grid; + gap: var(--space-2); +} + +.metric-card--featured { + background: linear-gradient(180deg, var(--color-surface), var(--color-accent-soft)); + border-color: rgba(217, 195, 160, 0.72); +} + +.metric-card--featured span, +.metric-card--featured small { + color: var(--color-text-muted); +} + +.metric-card span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.metric-card strong { + color: var(--color-text-strong); + font-size: 30px; + line-height: var(--line-height-tight); +} + +.metric-card small { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.chart-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(0, 1.3fr) minmax(320px, 0.7fr); +} + +.chart-card { + min-width: 0; +} + +.chart-card h2 { + margin-bottom: var(--space-2); +} + +.overview-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(0, 1.2fr) minmax(320px, 0.8fr); +} + +.overview-grid--three { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.quick-grid { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.quick-action { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + color: var(--color-text); + display: grid; + gap: var(--space-2); + justify-items: start; + min-width: 0; + padding: var(--space-4); + text-align: left; + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast), + transform var(--transition-fast); +} + +.quick-action:hover { + border-color: rgba(37, 99, 235, 0.24); + box-shadow: var(--shadow-sm); + transform: translateY(-1px); +} + +.quick-action svg { + color: var(--color-selected); +} + +.quick-action span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.quick-action small { + color: var(--color-text-muted); +} + +.progress-heading { + align-items: center; + color: var(--color-text-muted); + display: flex; + justify-content: space-between; + margin: var(--space-4) 0 var(--space-2); +} + +.progress-heading strong { + color: var(--color-text-strong); +} + +.progress-track { + background: var(--color-surface-muted); + border-radius: var(--radius-full); + height: 10px; + overflow: hidden; +} + +.progress-track span { + background: linear-gradient(90deg, var(--color-selected), var(--color-accent)); + border-radius: inherit; + display: block; + height: 100%; +} + +.mini-status-card { + align-items: flex-start; + display: flex; + gap: var(--space-4); +} + +.mini-status-card svg { + color: var(--color-selected); + flex: 0 0 auto; + margin-top: 2px; +} + +.mini-status-card div { + display: grid; + gap: var(--space-1); + min-width: 0; +} + +.mini-status-card span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.mini-status-card strong { + color: var(--color-text-strong); +} + +.mini-status-card small { + color: var(--color-text-muted); +} + +.mini-status-card--action { + appearance: none; + cursor: pointer; + font: inherit; + text-align: left; + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast), + transform var(--transition-fast); + width: 100%; +} + +.mini-status-card--action:hover, +.mini-status-card--action:focus-visible { + border-color: var(--color-selected); + box-shadow: var(--shadow-sm); + outline: none; + transform: translateY(-1px); +} diff --git a/src/styles/domains/02-client-sending.css b/src/styles/domains/02-client-sending.css new file mode 100644 index 0000000..83180b8 --- /dev/null +++ b/src/styles/domains/02-client-sending.css @@ -0,0 +1,756 @@ +/* Owner: client SMS and MMS sending and batch task lists. Extracted from global.css with original cascade order preserved. */ +.sms-send-page { + display: grid; + gap: var(--space-6); +} + +.sms-send-title { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.sms-send-title h1 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); +} + +.sms-send-title__icon { + align-items: center; + background: var(--color-selected-soft); + border-radius: var(--radius-sm); + color: var(--color-selected); + display: inline-flex; + height: 40px; + justify-content: center; + width: 40px; +} + +.sms-send-layout { + align-items: start; + display: grid; + gap: var(--space-6); + grid-template-columns: minmax(0, 1fr) 372px; +} + +.sms-send-main { + display: grid; + gap: var(--space-6); +} + +.send-card, +.sms-preview-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + padding: var(--space-6); +} + +.send-card__title { + align-items: center; + display: flex; + gap: var(--space-2); + margin-bottom: var(--space-5); +} + +.send-card__title span { + align-items: center; + background: var(--color-selected); + border-radius: var(--radius-full); + color: var(--color-text-inverse); + display: inline-flex; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-bold); + height: 24px; + justify-content: center; + width: 24px; +} + +.send-card__title h2, +.preview-title h2 { + font-size: var(--font-size-lg); +} + +.send-field { + display: grid; + gap: var(--space-3); +} + +.send-field span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.send-field input, +.receiver-table input { + background: transparent; + border: 0; + border-bottom: 1px solid transparent; + color: var(--color-text); + height: var(--control-height-md); + outline: 0; + width: 100%; +} + +.send-field input::placeholder, +.receiver-table input::placeholder { + color: var(--color-text-subtle); +} + +.send-form-row { + display: grid; + gap: var(--space-6); + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-top: var(--space-6); +} + +.template-trigger { + align-items: center; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text); + display: flex; + gap: var(--space-2); + height: var(--control-height-md); + justify-content: space-between; + padding: 0 var(--control-padding-x); + text-align: left; + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast), + background var(--transition-fast); + width: 100%; +} + +.template-trigger:hover, +.template-trigger:focus-visible { + border-color: var(--color-selected); + box-shadow: var(--focus-ring); +} + +.template-trigger span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.template-trigger svg { + color: var(--color-selected); + flex: 0 0 auto; +} + +.template-trigger__placeholder { + color: var(--color-text-subtle); +} + +.receiver-tabs { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin-bottom: var(--space-4); +} + +.receiver-tabs button { + background: var(--color-surface); + border: 1px solid var(--color-border); + color: var(--color-text-muted); + height: 44px; +} + +.receiver-tabs button.active { + border-color: var(--color-selected); + color: var(--color-selected); +} + +.receiver-table { + border: 1px solid var(--color-border); + border-bottom: 0; +} + +.receiver-table__head, +.receiver-table__row { + display: grid; + grid-template-columns: 120px minmax(0, 1fr) 96px; +} + +.receiver-table__head { + background: var(--color-surface-muted); + color: var(--color-text); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); +} + +.receiver-table__head span, +.receiver-table__row span, +.receiver-table__row input, +.receiver-table__row button { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: flex; + min-height: 50px; + padding: 0 var(--space-4); +} + +.receiver-table__row span { + color: var(--color-selected); +} + +.receiver-table__row button { + background: transparent; + border-left: 0; + border-right: 0; + border-top: 0; + color: var(--color-danger); + justify-content: center; +} + +.receiver-table__row button:disabled { + color: var(--color-text-subtle); +} + +.add-recipient { + align-items: center; + background: var(--color-bg-subtle); + border: 1px dashed var(--color-selected); + color: var(--color-selected); + display: flex; + gap: var(--space-2); + height: 40px; + justify-content: center; + margin-top: var(--space-3); + width: 100%; +} + +.import-panel { + align-items: center; + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-md); + color: var(--color-text-muted); + display: grid; + gap: var(--space-3); + grid-auto-rows: max-content; + align-content: center; + justify-items: center; + min-height: 190px; + padding: var(--space-6); + text-align: center; +} + +.import-panel__icon { + align-items: center; + background: var(--color-selected-soft); + border-radius: var(--radius-full); + color: var(--color-selected); + display: inline-flex; + height: 48px; + justify-content: center; + width: 48px; +} + +.import-panel__icon svg { + color: var(--color-selected); +} + +.import-panel strong { + color: var(--color-text-strong); +} + +.send-tip { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + margin-top: var(--space-3); +} + +.send-submit-row { + align-items: center; + display: flex; + gap: var(--space-3); + justify-content: flex-end; +} + +.client-billing-page .client-billing-amount { + background: none; + color: var(--color-text-strong); + font-family: inherit; + font-size: 32px; + font-style: normal; + font-variant-numeric: normal; + font-weight: var(--font-weight-regular); + letter-spacing: normal; + line-height: 1.25; + text-shadow: none; + -webkit-background-clip: border-box; + -webkit-text-fill-color: currentColor; +} + +.send-submit-hint { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.mms-send-page .send-card { + box-shadow: none; +} + +.mms-send-tip { + background: var(--color-selected-soft); + border: 1px solid #bfdbfe; + color: var(--color-text); + font-weight: var(--font-weight-medium); + line-height: 1.6; + margin-bottom: var(--space-4); + padding: var(--space-3) var(--space-4); +} + +.mms-import-mode { + display: grid; + gap: var(--space-5); +} + +.mms-import-rules { + align-items: start; + background: #e5e7eb; + color: var(--color-text-muted); + display: flex; + gap: var(--space-5); + justify-content: space-between; + padding: var(--space-5); +} + +.mms-import-rules strong { + color: var(--color-text-strong); + display: block; + margin-bottom: var(--space-3); +} + +.mms-import-rules p { + margin: 0 0 var(--space-2); +} + +.mms-import-panel { + min-height: 240px; +} + +.mms-import-panel .import-panel__icon { + border-radius: var(--radius-md); + height: 64px; + width: 64px; +} + +.sms-preview-card { + position: sticky; + top: calc(var(--topbar-height) + var(--space-6)); +} + +.preview-title { + align-items: center; + color: var(--color-selected); + display: flex; + gap: var(--space-2); + margin-bottom: var(--space-5); +} + +.preview-title h2 { + color: var(--color-text-strong); +} + +.phone-preview { + background: var(--color-surface-muted); + border-radius: var(--radius-sm); + padding: 22px; +} + +.phone-preview div { + background: #dbe6ff; + border: 1px solid #90b0ff; + border-radius: 10px; + box-shadow: 0 2px 5px rgba(37, 99, 235, 0.18); + color: var(--color-text); + min-height: 54px; + padding: var(--space-4); +} + +.preview-stats { + display: grid; + margin-top: var(--space-5); +} + +.preview-stats div { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: flex; + justify-content: space-between; + padding: var(--space-4) 0; +} + +.preview-stats span { + color: var(--color-text-muted); +} + +.preview-stats strong { + color: var(--color-selected); +} + +.preview-note { + background: var(--color-surface-muted); + border-radius: var(--radius-sm); + color: var(--color-text-muted); + font-size: var(--font-size-xs); + margin-top: var(--space-5); + padding: var(--space-3) var(--space-4); +} + +.mms-preview-card { + min-height: 340px; +} + +.mms-message-preview { + background: #e5e7eb; + border-radius: var(--radius-sm); + padding: var(--space-6); +} + +.mms-message-preview > div { + background: var(--color-surface); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + color: var(--color-text); + display: grid; + gap: var(--space-2); + min-height: 64px; + padding: var(--space-4); +} + +.mms-message-preview strong { + color: var(--color-text-strong); + font-size: var(--font-size-sm); +} + +.mms-message-preview p { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + line-height: 1.6; + margin: 0; +} + +.template-picker { + display: grid; + gap: var(--space-4); +} + +.template-picker__list { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + max-height: 360px; + overflow-y: auto; +} + +.template-picker__list button { + align-items: center; + background: var(--color-surface); + border: 0; + border-bottom: 1px solid var(--color-border); + color: var(--color-text); + display: flex; + gap: var(--space-4); + justify-content: space-between; + padding: var(--space-4); + text-align: left; +} + +.template-picker__list button:last-child { + border-bottom: 0; +} + +.template-picker__list button:hover, +.template-picker__list button.active { + background: var(--color-selected-soft); +} + +.template-picker__list button.active { + color: var(--color-selected); +} + +.template-picker__list span { + display: grid; + gap: var(--space-1); + min-width: 0; +} + +.template-picker__list strong { + color: var(--color-text-strong); +} + +.template-picker__list small { + color: var(--color-text-muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.batch-filter-card { + display: grid; + gap: var(--space-5); +} + +.batch-filter-card h2 { + font-size: var(--font-size-lg); +} + +.batch-filter-card p strong { + color: var(--color-selected); +} + +.batch-filter-grid { + align-items: end; + display: grid; + gap: var(--space-8); + grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) minmax(220px, 1fr); +} + +.batch-table-card { + overflow: hidden; + padding: 0; +} + +.batch-table { + min-width: 1080px; +} + +.batch-table th { + background: #e5e7eb; + color: var(--color-text-strong); +} + +.batch-table td { + height: 70px; +} + +.batch-table tbody tr:hover { + background: transparent; +} + +.batch-main-row td { + border-top: 12px solid var(--color-bg); + position: relative; + transition: background var(--transition-fast); +} + +.batch-main-row td, +.batch-template-row td { + background: #fbfcff; +} + +.batch-task-id { + display: grid; + gap: var(--space-2); + justify-items: start; +} + +.batch-task-id strong { + color: var(--color-text-strong); + font-size: var(--font-size-sm); +} + +.batch-template-row td { + border-top: 0; + height: auto; + padding: 0 var(--space-4) var(--space-5); + position: relative; + transition: background var(--transition-fast); +} + +.batch-main-row.batch-row--hovered td, +.batch-template-row.batch-row--hovered td { + background: #dbeafe; +} + +.batch-template-content { + align-items: flex-start; + background: var(--color-surface); + border: 1px solid #edf0f5; + border-radius: var(--radius-md); + box-shadow: inset 0 0 0 1px rgba(18, 18, 26, 0.01); + color: var(--color-text); + display: flex; + gap: var(--space-3); + line-height: 1.7; + margin-left: 0; + padding: var(--space-3) var(--space-4); + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast); +} + +.batch-template-row.batch-row--hovered .batch-template-content { + border-color: rgba(37, 99, 235, 0.18); + box-shadow: 0 1px 2px rgba(37, 99, 235, 0.08); +} + +.batch-template-row.batch-row--hovered .ui-inline-text-preview { + border-color: rgba(37, 99, 235, 0.18); + box-shadow: 0 1px 2px rgba(37, 99, 235, 0.08); +} + +.batch-template-content > span:first-child { + color: var(--color-text-muted); + flex: 0 0 auto; + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.batch-template-content p { + color: var(--color-text-muted); + margin: 0; +} + +.batch-template-content p strong { + color: var(--color-text-muted); + font-weight: var(--font-weight-regular); + margin-right: 2px; +} + +.batch-send-time { + display: grid; + gap: var(--space-1); +} + +.batch-send-time span { + align-items: center; + color: var(--color-selected); + display: flex; + gap: var(--space-1); + font-weight: var(--font-weight-semibold); +} + +.batch-send-time small { + color: var(--color-text-muted); +} + +.batch-progress { + display: grid; + gap: var(--space-2); +} + +.batch-progress div:first-child { + align-items: center; + display: flex; + justify-content: space-between; +} + +.batch-progress span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.batch-progress strong { + color: var(--color-selected); + font-size: var(--font-size-xs); +} + +.batch-progress__track { + background: var(--color-border-strong); + border-radius: var(--radius-full); + height: 8px; + overflow: hidden; +} + +.batch-progress__bar { + display: block; + height: 100%; +} + +.batch-progress__bar--completed { + background: var(--color-success); +} + +.batch-progress__bar--sending { + background: var(--color-selected); +} + +.batch-progress__bar--terminated { + background: var(--color-danger); +} + +.batch-actions { + display: flex; + gap: var(--space-2); + justify-content: flex-end; +} + +.batch-actions .ui-button { + min-width: 52px; +} + +.batch-actions .ui-button:last-child { + color: var(--color-danger); +} + +.mms-task-table td { + height: 96px; +} + +.mms-task-content { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: 74px minmax(0, 1fr); + min-width: 0; +} + +.mms-task-content img { + aspect-ratio: 1 / 1; + border-radius: var(--radius-sm); + object-fit: cover; + width: 74px; +} + +.mms-task-content div { + display: grid; + gap: var(--space-2); + min-width: 0; +} + +.mms-task-content strong { + color: var(--color-text-strong); + font-size: var(--font-size-md); + font-weight: var(--font-weight-semibold); +} + +.mms-task-content p { + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + color: var(--color-text-muted); + display: -webkit-box; + line-height: 1.5; + margin: 0; + overflow: hidden; +} + +.mms-detail-row-content { + align-items: center; + display: grid; + gap: 14px; + grid-template-columns: 84px minmax(0, 1fr); + min-width: 0; +} + +.mms-detail-row-content img { + aspect-ratio: 1 / 1; + border-radius: var(--radius-sm); + object-fit: cover; + width: 84px; +} + +.mms-detail-row-content div { + display: grid; + gap: 6px; + min-width: 0; +} + +.mms-detail-row-content strong { + color: var(--color-text-strong); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); +} diff --git a/src/styles/domains/03-client-records.css b/src/styles/domains/03-client-records.css new file mode 100644 index 0000000..29ca016 --- /dev/null +++ b/src/styles/domains/03-client-records.css @@ -0,0 +1,725 @@ +/* Owner: client task detail, delivery records and uplink. Extracted from global.css with original cascade order preserved. */ +.mms-detail-row-content p { + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + color: var(--color-text-muted); + display: -webkit-box; + line-height: 1.55; + margin: 0; + overflow: hidden; +} + +.mms-task-actions { + grid-template-columns: repeat(2, minmax(62px, 1fr)); +} + +.mms-task-actions .ui-button:last-child { + color: var(--color-selected); +} + +.mms-detail-template { + align-items: start; + display: grid; + gap: var(--space-5); + grid-template-columns: 220px minmax(0, 1fr); +} + +.mms-detail-template img { + aspect-ratio: 4 / 3; + border-radius: var(--radius-sm); + object-fit: cover; + width: 100%; +} + +.mms-detail-template div { + display: grid; + gap: var(--space-3); +} + +.mms-detail-template p { + color: var(--color-text); + line-height: 1.7; + margin: 0; +} + +.batch-pagination { + align-items: center; + display: flex; + justify-content: space-between; + padding: var(--space-4) var(--space-6); +} + +.batch-pagination > span { + color: var(--color-text-muted); +} + +.batch-pagination > div { + display: flex; + gap: var(--space-2); +} + +.task-detail-title { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.task-detail-title .sms-send-title__icon { + background: linear-gradient(135deg, #eff6ff 0%, #f6efe4 100%); + border-color: rgba(37, 99, 235, 0.16); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.72); + height: 46px; + width: 46px; +} + +.task-detail-title h2 { + color: var(--color-text-strong); + font-size: 30px; + line-height: 1.15; + margin: 0; +} + +.task-detail-title p { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + margin: var(--space-2) 0 0; +} + +.task-detail { + display: grid; + gap: var(--space-6); +} + +.task-detail-section { + background: var(--color-surface); + border: 1px solid rgba(209, 213, 219, 0.72); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-xs); + display: grid; + gap: var(--space-5); + padding: var(--space-6); +} + +.task-detail-section > h3, +.task-section-title h3 { + align-items: center; + color: var(--color-text-strong); + display: flex; + font-size: var(--font-size-xl); + gap: var(--space-2); + margin: 0; +} + +.task-section-title { + align-items: center; + display: flex; + gap: var(--space-3); + justify-content: space-between; +} + +.task-info-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.task-info-grid > div { + background: linear-gradient(180deg, #fbfcfe 0%, #f7f8fa 100%); + border: 1px solid rgba(209, 213, 219, 0.74); + border-radius: var(--radius-sm); + display: grid; + gap: var(--space-2); + min-height: 78px; + padding: var(--space-4); + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast), + transform var(--transition-fast); +} + +.task-info-grid > div:hover { + border-color: rgba(37, 99, 235, 0.22); + box-shadow: 0 8px 20px rgba(18, 18, 26, 0.05); + transform: translateY(-1px); +} + +.task-info-grid span, +.task-stat-card span, +.task-total-progress span, +.overall-rate-card span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.task-info-grid strong { + color: var(--color-text-strong); + font-size: var(--font-size-md); +} + +.task-info-full { + grid-column: 1 / -1; +} + +.task-info-full strong { + line-height: 1.7; +} + +.task-send-type { + align-items: center; + color: var(--color-selected) !important; + display: flex; + gap: var(--space-2); +} + +.text-blue { + color: var(--color-selected) !important; +} + +.text-green { + color: var(--color-success) !important; + font-weight: var(--font-weight-semibold); +} + +.task-stat-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.task-stat-card { + background: var(--color-surface); + border: 1px solid rgba(191, 219, 254, 0.9); + border-radius: var(--radius-sm); + display: grid; + gap: var(--space-2); + min-height: 96px; + overflow: hidden; + padding: var(--space-5); + position: relative; +} + +.task-stat-card::before { + content: ''; + height: 3px; + inset: 0 0 auto; + position: absolute; +} + +.task-stat-card--blue::before { + background: var(--color-selected); +} + +.task-stat-card--green { + border-color: #bbf7d0; +} + +.task-stat-card--green::before { + background: var(--color-success); +} + +.task-stat-card strong { + color: var(--color-selected); + font-size: 32px; + line-height: 1; +} + +.task-stat-card--green strong { + color: var(--color-success); +} + +.task-total-progress { + background: #f8fafc; + border: 1px solid rgba(209, 213, 219, 0.72); + border-radius: var(--radius-sm); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.task-total-progress > div:first-child { + align-items: center; + display: flex; + justify-content: space-between; +} + +.task-total-progress strong { + color: var(--color-selected); +} + +.overall-rate-card { + align-items: center; + background: + radial-gradient(circle at 50% 24%, rgba(217, 195, 160, 0.24), transparent 28%), + linear-gradient(135deg, #f8fbff 0%, #eef4ff 100%); + border: 1px solid rgba(191, 219, 254, 0.95); + border-radius: var(--radius-sm); + display: grid; + gap: var(--space-3); + justify-items: center; + min-height: 178px; + padding: var(--space-6); +} + +.overall-rate-card strong { + color: var(--color-success); + font-size: 52px; + line-height: 1; +} + +.overall-rate-card small { + color: var(--color-text-muted); +} + +.task-detail-section h4 { + color: var(--color-text-strong); + font-size: var(--font-size-base); + margin: 0; +} + +.carrier-rate-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.carrier-rate-card { + background: #ffffff; + border: 1px solid rgba(209, 213, 219, 0.78); + border-radius: var(--radius-sm); + box-shadow: var(--shadow-xs); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.carrier-rate-card > div:first-child, +.carrier-rate-card p { + align-items: center; + display: flex; + justify-content: space-between; +} + +.carrier-rate-card > div:first-child strong { + color: var(--color-text-strong); +} + +.carrier-rate-card > div:first-child span { + color: var(--color-success); + font-size: var(--font-size-xl); + font-weight: var(--font-weight-bold); +} + +.carrier-rate-card p { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + margin: 0; +} + +.city-rate-table th { + background: #f3f4f6; + color: var(--color-text-strong); +} + +.city-rate-table td { + height: 56px; +} + +.city-rate-table tbody tr:hover { + background: #f8fafc; +} + +.task-detail-title .sms-send-title__icon { + background: var(--color-brand); + border-color: var(--color-brand); + color: var(--color-accent); + height: 48px; + width: 48px; +} + +.task-detail-title h2 { + font-size: 28px; + letter-spacing: 0; +} + +.task-detail-title p { + color: #8a93a3; + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + margin-top: 6px; +} + +.task-detail { + gap: 18px; +} + +.task-detail-section { + background: #ffffff; + border: 1px solid #e9edf3; + border-radius: var(--radius-lg); + box-shadow: 0 8px 24px rgba(18, 18, 26, 0.04); + gap: 18px; + padding: 22px; +} + +.task-detail-section > h3, +.task-section-title h3 { + font-size: 18px; + gap: 8px; +} + +.task-section-title { + border-bottom: 1px solid #eef1f5; + padding-bottom: 14px; +} + +.task-info-grid { + gap: 0; + grid-template-columns: repeat(4, minmax(0, 1fr)); + overflow: hidden; + border: 1px solid #edf0f5; + border-radius: var(--radius-md); +} + +.task-info-grid > div { + background: #ffffff; + border: 0; + border-bottom: 1px solid #edf0f5; + border-right: 1px solid #edf0f5; + border-radius: 0; + box-shadow: none; + min-height: 82px; + padding: 16px 18px; + transform: none; +} + +.task-info-grid > div:nth-child(4n) { + border-right: 0; +} + +.task-info-grid > div:hover { + background: #fbfcff; + border-color: #edf0f5; + box-shadow: none; + transform: none; +} + +.task-info-grid span, +.task-stat-card span, +.task-total-progress span, +.overall-rate-card span { + color: #7b8494; + font-weight: var(--font-weight-medium); +} + +.task-info-grid strong { + color: #18202f; + font-size: 14px; + line-height: 1.55; +} + +.task-info-full { + background: #fbfcff !important; + border-bottom: 0 !important; + border-right: 0 !important; + grid-column: 1 / -1; + min-height: 92px !important; +} + +.task-info-full strong { + color: #263244; + font-size: 14px; + font-weight: var(--font-weight-medium); +} + +.task-stat-grid { + gap: 12px; +} + +.task-stat-card { + background: #ffffff; + border: 1px solid #e7ebf2; + border-radius: var(--radius-md); + box-shadow: 0 1px 2px rgba(18, 18, 26, 0.04); + min-height: 106px; + padding: 18px; +} + +.task-stat-card::before { + height: 100%; + inset: 0 auto 0 0; + width: 3px; +} + +.task-stat-card strong { + font-size: 30px; + letter-spacing: 0; +} + +.task-total-progress { + background: #fbfcff; + border-color: #e7ebf2; + border-radius: var(--radius-md); + padding: 18px; +} + +.task-total-progress .batch-progress__track { + height: 10px; +} + +.overall-rate-card { + background: linear-gradient(180deg, rgba(37, 99, 235, 0.08), transparent 58%), #ffffff; + border-color: #d9e6ff; + border-radius: var(--radius-md); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9); + min-height: 150px; +} + +.overall-rate-card strong { + font-size: 48px; +} + +.carrier-rate-grid { + gap: 12px; +} + +.carrier-rate-card { + border-color: #e7ebf2; + border-radius: var(--radius-md); + box-shadow: 0 1px 2px rgba(18, 18, 26, 0.04); + padding: 18px; +} + +.city-rate-table { + min-width: 760px; +} + +.city-rate-table th { + background: #f7f8fa; + border-bottom: 1px solid #e7ebf2; + color: #5f6878; + font-size: 12px; +} + +.city-rate-table td { + height: 58px; +} + +.send-detail-table-card { + overflow: hidden; + padding: 0; +} + +.send-detail-table { + min-width: 1420px; +} + +.mms-send-detail-table { + min-width: 1560px; +} + +.send-detail-table th { + background: #e5e7eb; + color: var(--color-text-strong); + height: 58px; +} + +.send-detail-main-row td { + background: #ffffff; + height: 72px; +} + +.send-detail-content-row td { + background: #ffffff; + border-top: 0; + height: auto; + padding: 0 var(--space-4) var(--space-5); +} + +.send-detail-message { + color: var(--color-text-muted); + display: block; + line-height: 1.65; + max-width: 380px; +} + +.send-detail-content-block { + align-items: flex-start; + background: #fbfcff; + border: 1px solid #edf0f5; + border-radius: var(--radius-md); + display: flex; + gap: var(--space-3); + line-height: 1.7; + padding: var(--space-3) var(--space-4); +} + +.send-detail-content-block span { + color: var(--color-text-muted); + flex: 0 0 auto; + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.send-detail-content-block p { + color: var(--color-text-muted); + margin: 0; +} + +.send-detail-app-name, +.send-detail-count, +.send-detail-time, +.send-detail-region { + display: grid; + gap: 2px; +} + +.send-detail-time, +.send-detail-region { + color: var(--color-text-muted); +} + +.send-detail-time small, +.send-detail-region small, +.send-detail-count small { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.send-detail-count strong { + color: var(--color-text-strong); +} + +.send-detail-receipt-code { + color: var(--color-success); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: var(--font-size-xs); +} + +.send-detail-carrier { + color: #374151; + font-weight: var(--font-weight-semibold); +} + +.uplink-table-card { + overflow: hidden; + padding: 0; +} + +.uplink-table-card .ui-table th { + background: #e5e7eb; + color: var(--color-text-strong); + height: 54px; +} + +.uplink-table-card .ui-table td { + height: 78px; +} + +.uplink-content { + color: var(--color-text-strong); + display: -webkit-box; + line-height: 1.6; + min-width: 320px; + overflow: hidden; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; +} + +.uplink-detail { + display: grid; + gap: var(--space-5); +} + +.uplink-detail-hint { + color: var(--color-text-muted); + margin: 0; +} + +.uplink-match-list { + display: grid; + gap: var(--space-5); +} + +.uplink-match-card { + background: #f1f3f5; + border: 1px solid #e5e7eb; + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.uplink-match-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.uplink-match-grid div, +.uplink-match-content { + display: grid; + gap: var(--space-2); +} + +.uplink-match-grid span, +.uplink-match-content span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.uplink-match-grid strong, +.uplink-match-content p { + color: var(--color-text-strong); +} + +.uplink-match-content p { + line-height: 1.75; + margin: 0; +} + +.uplink-match-actions { + display: flex; + justify-content: flex-end; +} + +.mms-uplink-pagination { + align-items: center; + border-top: 1px solid #edf0f5; + color: var(--color-text-muted); + display: flex; + justify-content: space-between; + padding: 16px 22px; +} + +.mms-uplink-pagination > div { + display: flex; + gap: 10px; +} + +.mms-uplink-detail .task-detail-section:first-child { + background: #ffffff; +} + +.mms-uplink-match-card { + background: #f4f6f8; +} + +.mms-uplink-image { + display: grid; + gap: var(--space-2); +} + +.mms-uplink-image span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.mms-uplink-image img { + aspect-ratio: 16 / 7; + border-radius: var(--radius-sm); + object-fit: cover; + width: 100%; +} diff --git a/src/styles/domains/04-signatures.css b/src/styles/domains/04-signatures.css new file mode 100644 index 0000000..bf88d1a --- /dev/null +++ b/src/styles/domains/04-signatures.css @@ -0,0 +1,824 @@ +/* Owner: signature and drainage experiences. Extracted from global.css with original cascade order preserved. */ +.sms-app-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(3, minmax(260px, 1fr)); +} + +.sms-app-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-5); + padding: var(--space-6); +} + +.sms-app-card h2 { + font-size: var(--font-size-xl); +} + +.sms-app-card dl { + display: grid; + gap: var(--space-4); + margin: 0; +} + +.sms-app-card dl div { + align-items: center; + display: flex; + justify-content: space-between; +} + +.sms-app-card dt { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.sms-app-card dd { + color: var(--color-text-strong); + margin: 0; + text-align: right; +} + +.sms-app-card dd span { + color: var(--color-selected); +} + +.sms-app-param-table { + border: 1px solid var(--color-border); + display: grid; +} + +.sms-app-param-table div { + display: grid; + grid-template-columns: minmax(220px, 0.7fr) minmax(0, 1fr); + min-height: 58px; +} + +.sms-app-param-table div + div { + border-top: 1px solid var(--color-border); +} + +.sms-app-param-table span, +.sms-app-param-table strong { + align-items: center; + display: flex; + padding: 0 var(--space-5); +} + +.sms-app-param-table span { + background: #f1f3f5; + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.sms-app-param-table strong { + background: #ffffff; + color: var(--color-text-strong); + font-weight: var(--font-weight-medium); +} + +.signature-page-header { + align-items: center; + display: flex; + justify-content: space-between; +} + +.signature-search-row { + max-width: 360px; +} + +.signature-list { + display: grid; + gap: var(--space-5); +} + +.signature-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: hidden; + position: relative; +} + +.signature-card::before { + content: ''; + inset: 0 auto 0 0; + position: absolute; + width: 5px; +} + +.signature-card--green::before { + background: var(--color-success); +} + +.signature-card--blue::before { + background: var(--color-selected); +} + +.signature-card--amber::before { + background: var(--color-warning); +} + +.signature-card--red::before { + background: var(--color-danger); +} + +.signature-card--gray::before { + background: var(--color-text-subtle); +} + +.signature-summary { + align-items: center; + display: grid; + gap: var(--space-5); + grid-template-columns: 28px 1fr 1fr 1fr 1fr 1fr 1fr 110px; + min-height: 112px; + padding: var(--space-5) var(--space-6); +} + +.signature-summary > button { + background: transparent; + border: 0; + color: var(--color-text-muted); + display: inline-flex; + padding: 0; +} + +.signature-summary div:not(.signature-actions) { + display: grid; + gap: var(--space-2); +} + +.signature-summary span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-medium); +} + +.signature-summary strong { + color: var(--color-text-strong); +} + +.signature-actions { + display: grid; + gap: var(--space-3); +} + +.drainage-panel { + background: #f1f3f5; + border-top: 1px solid var(--color-border); + display: grid; + gap: var(--space-5); + padding: var(--space-5) var(--space-6); +} + +.drainage-panel h2 { + font-size: var(--font-size-lg); +} + +.drainage-table { + display: grid; +} + +.drainage-table__head, +.drainage-table__row { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(180px, 1.5fr) minmax(80px, 0.7fr) repeat(3, minmax(64px, 0.65fr)) minmax(196px, auto); + min-height: 58px; +} + +.drainage-table__head { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); + border-bottom: 1px solid var(--color-border); +} + +.drainage-table__row { + border-bottom: 1px solid var(--color-border); +} + +.drainage-table__url { + color: var(--color-text-strong); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.drainage-row-actions { + display: flex; + gap: var(--space-2); +} + +.drainage-panel__footer { + display: flex; + justify-content: flex-end; +} + +.admin-enterprise-signature-list .signature-summary { + gap: var(--space-2); + grid-template-columns: + 22px minmax(132px, 0.9fr) minmax(168px, 1.1fr) minmax(120px, 0.8fr) minmax(82px, 0.55fr) + repeat(3, minmax(64px, 0.45fr)) minmax(68px, 0.45fr) 224px; + min-height: 64px; + min-width: 1160px; + padding-inline: var(--space-3); +} + +.admin-enterprise-signature-list .signature-actions { + display: flex; + gap: 6px; + justify-self: end; + min-width: 224px; + width: 224px; +} + +.admin-enterprise-signature-list .signature-actions .ui-button, +.admin-enterprise-signature-list .drainage-row-actions .ui-button { + height: var(--control-height-sm); + justify-content: center; + min-height: var(--control-height-sm); + min-width: 0; + padding-left: 8px; + padding-right: 8px; +} + +.signature-summary .signature-summary__regular-value { + color: var(--color-text-strong); + font-weight: 400; +} + +.admin-enterprise-signature-list { + gap: 0; + overflow-x: auto; +} + +.admin-enterprise-signature-list .signature-card { + border-radius: 0; + border-top: 0; +} + +.admin-enterprise-signature-list .signature-card:last-of-type { + border-radius: 0 0 var(--radius-md) var(--radius-md); +} + +.enterprise-signature-table__head { + align-items: center; + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md) var(--radius-md) 0 0; + color: var(--color-text-muted); + display: grid; + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); + gap: var(--space-2); + grid-template-columns: + 22px minmax(132px, 0.9fr) minmax(168px, 1.1fr) minmax(120px, 0.8fr) minmax(82px, 0.55fr) + repeat(3, minmax(64px, 0.45fr)) minmax(68px, 0.45fr) 224px; + min-height: 46px; + min-width: 1160px; + padding-inline: var(--space-3); +} + +.enterprise-signature-table__signature { + min-width: 0; +} + +.enterprise-signature-table__signature strong { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.enterprise-signature-pending-summary { + align-items: center; + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: flex; + gap: var(--space-2); + min-height: 46px; + padding: var(--space-2) var(--space-4); +} + +.enterprise-signature-pending-summary strong { + color: var(--color-primary); + font-size: var(--font-size-xl); + font-variant-numeric: tabular-nums; +} + +.enterprise-signature-pending-summary .ui-button { + margin-left: auto; +} + +.carrier-report-count { + align-items: center; + border-radius: var(--radius-sm); + display: inline-grid; + font-size: var(--font-size-xs); + font-variant-numeric: tabular-nums; + font-weight: var(--font-weight-semibold); + gap: 1px; + justify-content: center; + justify-items: center; + line-height: 1.2; + min-width: 64px; + padding: 4px 6px; +} + +.carrier-report-count small { + font-size: 11px; + font-weight: var(--font-weight-medium); + opacity: 0.82; +} + +.carrier-report-count--success { + background: var(--color-success-soft); + color: var(--color-success); +} + +.carrier-report-count--warning { + background: var(--color-warning-soft); + color: var(--color-warning); +} + +.carrier-report-count--danger { + background: var(--color-danger-soft); + color: var(--color-danger); +} + +.carrier-report-count--info { + background: var(--color-info-soft); + color: var(--color-info); +} + +.carrier-report-count--neutral { + background: var(--color-surface-subtle); + color: var(--color-text-subtle); +} + +.signature-report-status { + display: grid; + gap: var(--space-4); +} + +.signature-report-status__context { + display: flex; + flex-wrap: wrap; + gap: var(--space-2) var(--space-3); +} + +.signature-report-status__context span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.signature-report-status__carriers { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.signature-report-status__carrier { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + min-width: 0; + overflow: hidden; +} + +.signature-report-status__carrier > header { + align-items: center; + background: var(--color-surface-subtle); + display: flex; + justify-content: space-between; + min-height: 54px; + padding: var(--space-3) var(--space-4); +} + +.signature-report-status__carrier > header > span:last-child { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.signature-report-status__list { + max-height: 280px; + min-height: 190px; + overflow: auto; + padding: 0 var(--space-4); +} + +.signature-report-status__row { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: grid; + gap: var(--space-3); + grid-template-columns: minmax(0, 1fr) 168px; + min-height: 64px; +} + +.signature-report-status__row:last-child { + border-bottom: 0; +} + +.signature-report-status__row strong { + font-size: var(--font-size-sm); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.signature-report-status__empty { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + padding: var(--space-7) 0; + text-align: center; +} + +@media (max-width: 920px) { + .signature-report-status__carriers { + grid-template-columns: 1fr; + } + .signature-report-status__list { + min-height: 0; + } +} + +.signature-retirement-heatmap__total { + color: var(--color-text-strong); + font-weight: 700; + background: var(--color-surface-muted); +} + +.carrier-report-summary { + align-items: flex-start; + display: inline-flex; + flex-wrap: wrap; + gap: 4px; +} + +.carrier-report-summary small { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + line-height: 24px; + white-space: nowrap; +} + +.admin-enterprise-template-list { + display: grid; + gap: var(--space-3); +} + +.admin-enterprise-template-row { + align-items: center; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(220px, 1.15fr) minmax(280px, 1.6fr) minmax(136px, 0.65fr) 188px; + min-width: 0; + padding: var(--space-5); + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast); +} + +.admin-enterprise-template-row:hover { + border-color: var(--color-border-strong); + box-shadow: var(--shadow-sm); +} + +.admin-enterprise-template-row__identity, +.admin-enterprise-template-row__content, +.admin-enterprise-template-row__meta { + min-width: 0; +} + +.admin-enterprise-template-row__title { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.admin-enterprise-template-row__title > strong { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.admin-enterprise-template-row dl { + display: grid; + gap: 5px; + margin: var(--space-3) 0 0; +} + +.admin-enterprise-template-row dl div { + display: grid; + gap: var(--space-2); + grid-template-columns: 42px minmax(0, 1fr); +} + +.admin-enterprise-template-row dt, +.admin-enterprise-template-row__content > span, +.admin-enterprise-template-row__meta > span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.admin-enterprise-template-row dd { + color: var(--color-text-strong); + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.admin-enterprise-template-row__content p { + color: var(--color-text-strong); + display: -webkit-box; + line-height: 1.65; + margin: var(--space-2) 0; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.admin-enterprise-template-row__content small { + color: var(--color-text-muted); +} + +.admin-enterprise-template-row__meta { + display: grid; + gap: var(--space-2); +} + +.admin-enterprise-template-row__meta strong { + font-size: var(--font-size-sm); + font-weight: var(--font-weight-medium); +} + +.admin-enterprise-template-row__actions { + display: grid; + gap: var(--space-2); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.admin-enterprise-template-row__actions .ui-button { + justify-content: center; + min-width: 0; +} + +@media (max-width: 1180px) { + .admin-enterprise-template-row { + grid-template-columns: minmax(210px, 1fr) minmax(260px, 1.35fr) 168px; + } + + .admin-enterprise-template-row__meta { + grid-column: 1; + } + + .admin-enterprise-template-row__actions { + grid-column: 3; + grid-row: 1 / span 2; + } +} + +@media (max-width: 860px) { + .admin-enterprise-template-row { + align-items: stretch; + grid-template-columns: 1fr; + } + + .admin-enterprise-template-row__meta, + .admin-enterprise-template-row__actions { + grid-column: auto; + grid-row: auto; + } +} + +.system-log-filters__actions { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.detail-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.detail-grid div { + background: var(--color-bg-subtle); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-2); + padding: var(--space-4); +} + +.detail-grid span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.detail-grid strong { + color: var(--color-text-strong); + line-height: 1.7; +} + +.detail-grid__wide { + grid-column: 1 / -1; +} + +.signature-modal-title h2 { + font-size: var(--font-size-2xl); +} + +.signature-modal-title p { + color: var(--color-text-muted); + margin-top: var(--space-1); +} + +.signature-form { + display: grid; + gap: var(--space-8); +} + +.signature-form section { + display: grid; + gap: var(--space-5); +} + +.signature-form h3 { + border-left: 5px solid var(--color-selected); + padding-left: var(--space-3); +} + +.signature-form-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.signature-form-grid__wide { + grid-column: 1 / -1; +} + +.report-requirement-heading { + align-items: center; + display: flex; + justify-content: space-between; +} + +.report-requirement-heading h3 { + margin: 0; +} + +.report-field-source { + color: var(--color-text-muted); + display: block; + line-height: 1.6; + margin-top: var(--space-2); +} + +.report-requirement-explanation > p { + background: var(--color-selected-soft); + border: 1px solid #bfdbfe; + line-height: 1.7; + padding: var(--space-4); +} + +.report-source-group { + border-left: 3px solid var(--color-selected); + margin-top: var(--space-5); + padding-left: var(--space-4); +} + +.report-source-channel { + background: var(--color-bg-subtle); + margin-top: var(--space-3); + padding: var(--space-3) var(--space-4); +} + +.report-source-channel ul { + color: var(--color-text-muted); + line-height: 1.8; + margin-bottom: 0; +} + +.signature-upload { + align-items: center; + border: 2px dashed var(--color-border); + color: var(--color-text-muted); + display: grid; + gap: var(--space-2); + justify-items: center; + min-height: 170px; + padding: var(--space-5); + text-align: center; +} + +.signature-upload > span:first-child { + justify-self: start; + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.signature-upload svg { + color: var(--color-text-muted); +} + +.signature-upload strong { + color: var(--color-selected); +} + +.signature-upload small { + color: var(--color-text-muted); +} + +.signature-upload--compact { + min-height: 118px; +} + +.signature-file-line { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.signature-file-line > span { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.signature-file-line small { + color: var(--color-text-muted); +} + +.drainage-edit-form .signature-upload { + min-height: 112px; +} + +.drainage-form-note { + align-items: flex-start; +} + +.drainage-form-note ol { + margin: 0; + padding-left: var(--space-5); +} + +.drainage-file-picker { + display: grid; + gap: var(--space-2); +} + +.drainage-file-picker > span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.drainage-file-picker > div { + align-items: center; + display: grid; + gap: var(--space-3); + grid-template-columns: auto 1fr; +} + +.drainage-file-picker em { + background: var(--color-surface-subtle); + color: var(--color-text-muted); + font-style: normal; + padding: var(--space-3) var(--space-4); +} + +.mms-signature-table-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: hidden; + padding: 0; +} + +.mms-signature-table-card .ui-table th { + background: #e1e5ea; + color: #7b8494; + font-size: var(--font-size-sm); + height: 58px; +} + +.mms-signature-table-card .ui-table td { + color: var(--color-text); + height: 86px; +} + +.mms-signature-table-card .ui-table th:first-child, +.mms-signature-table-card .ui-table td:first-child { + padding-left: var(--space-6); +} diff --git a/src/styles/domains/05-templates.css b/src/styles/domains/05-templates.css new file mode 100644 index 0000000..c19d64c --- /dev/null +++ b/src/styles/domains/05-templates.css @@ -0,0 +1,833 @@ +/* Owner: SMS and MMS template experiences. Extracted from global.css with original cascade order preserved. */ +.mms-signature-name { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.mms-signature-actions { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.mms-signature-actions .ui-button:disabled { + background: #f5f6f8; + border-color: #e5e7eb; + color: var(--color-text-subtle); + opacity: 1; +} + +.mms-signature-delete { + border-color: rgba(239, 68, 68, 0.22); + color: var(--color-danger); +} + +.mms-signature-delete:hover { + background: rgba(239, 68, 68, 0.06); + border-color: rgba(239, 68, 68, 0.36); + color: var(--color-danger); +} + +.mms-pagination { + align-items: center; + display: flex; + gap: var(--space-2); + justify-content: center; + padding: var(--space-3) 0; +} + +.mms-pagination button { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + color: var(--color-text); + height: 36px; + min-width: 36px; + padding: 0 var(--space-3); + transition: + background var(--transition-fast), + border-color var(--transition-fast), + color var(--transition-fast); +} + +.mms-pagination button:hover:not(:disabled), +.mms-pagination button.active { + background: var(--color-selected); + border-color: var(--color-selected); + color: var(--color-text-inverse); +} + +.mms-pagination button:disabled { + color: var(--color-text-subtle); +} + +.mms-template-header { + align-items: center; + display: flex; + justify-content: space-between; +} + +.mms-template-header .sms-send-title { + align-items: flex-start; +} + +.mms-template-header p { + color: var(--color-text-muted); + margin-top: var(--space-2); +} + +.mms-template-toolbar { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(0, 1fr) auto; +} + +.mms-template-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(320px, 1fr)); +} + +.mms-template-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + grid-template-rows: auto auto; + min-height: 0; + overflow: hidden; + position: relative; + transition: + border-color var(--transition-fast), + box-shadow var(--transition-fast), + transform var(--transition-fast); +} + +.mms-template-card:hover { + border-color: rgba(37, 99, 235, 0.2); + box-shadow: var(--shadow-sm); + transform: translateY(-1px); +} + +.mms-template-card::before { + content: ''; + inset: 0 auto 0 0; + position: absolute; + width: 5px; +} + +.mms-template-card--green::before { + background: var(--color-success); +} + +.mms-template-card--blue::before { + background: var(--color-selected); +} + +.mms-template-card--gray::before { + background: var(--color-text-subtle); +} + +.mms-template-card__body { + display: grid; + gap: 10px; + padding: var(--space-5) var(--space-5) var(--space-4); +} + +.mms-template-meta { + display: grid; + gap: 7px; + padding-right: 128px; +} + +.mms-template-card h2 { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + line-height: 1.3; +} + +.mms-template-card h3 { + color: var(--color-text-strong); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + line-height: 1.28; + margin-top: 1px; +} + +.mms-template-code { + color: var(--color-text-muted); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: var(--font-size-sm); + line-height: 1.28; + margin-bottom: 0; +} + +.mms-template-card img { + aspect-ratio: 16 / 7.2; + border-radius: var(--radius-sm); + display: block; + object-fit: cover; + width: 100%; +} + +.mms-template-content { + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + color: var(--color-text-muted); + display: -webkit-box; + line-height: 1.45; + margin: 0; + overflow: hidden; +} + +.mms-template-app-tag { + background: var(--color-selected-soft); + border: 1px solid rgba(37, 99, 235, 0.16); + border-radius: var(--radius-full); + color: var(--color-selected); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); + padding: 5px 10px; + position: absolute; + right: var(--space-5); + top: var(--space-5); + z-index: 1; +} + +.mms-template-status { + display: grid; + gap: 6px; + margin-top: 2px; +} + +.mms-template-status > span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.mms-template-status > div { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.mms-template-status section { + align-items: center; + display: inline-flex; + gap: 5px; + min-width: 0; +} + +.mms-template-status small { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.mms-template-card__footer { + align-items: center; + background: #f4f6f8; + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--space-2); + justify-content: space-between; + min-height: 48px; + padding: 0 var(--space-5); +} + +.mms-template-card__footer > span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.mms-template-card__footer div { + align-items: center; + display: flex; + gap: var(--space-5); +} + +.mms-template-card__footer button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + display: inline-flex; + gap: 4px; + font-weight: var(--font-weight-semibold); + padding: 0; +} + +.mms-template-card__footer button:nth-child(2) { + color: var(--color-text-strong); +} + +.mms-template-card__footer button:last-child { + color: var(--color-danger); +} + +.mms-template-modal-title h2 { + font-size: var(--font-size-2xl); +} + +.mms-template-modal-title p { + color: var(--color-text-muted); + line-height: 1.55; + margin-top: var(--space-2); + max-width: 980px; +} + +.mms-template-form { + display: grid; + gap: var(--space-5); +} + +.mms-template-form-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.mms-frame-header { + align-items: center; + display: flex; + justify-content: space-between; +} + +.mms-frame-header div { + align-items: baseline; + display: flex; + gap: var(--space-2); +} + +.mms-frame-header strong { + color: var(--color-text-strong); +} + +.mms-frame-header span { + color: var(--color-text-muted); +} + +.mms-frame-list { + display: grid; + gap: var(--space-5); +} + +.mms-frame { + background: #eef0f2; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-3); + padding: var(--space-4); +} + +.mms-frame__top { + align-items: center; + display: grid; + gap: var(--space-3); + grid-template-columns: auto 124px 1fr; +} + +.mms-frame__top > strong { + color: var(--color-text-strong); +} + +.mms-frame__top > button { + background: transparent; + border: 0; + color: var(--color-danger); + justify-self: end; + padding: 0; +} + +.mms-frame-type .ui-field__label { + display: none; +} + +.mms-frame-type .ui-select button { + background: var(--color-surface); +} + +.mms-frame .ui-textarea { + background: var(--color-surface); + border-color: transparent; + min-height: 106px; +} + +.mms-file-drop { + align-items: center; + background: var(--color-surface); + border: 2px dashed var(--color-border); + color: var(--color-text-muted); + display: grid; + gap: var(--space-3); + justify-items: center; + min-height: 132px; + padding: var(--space-5); + text-align: center; +} + +.mms-file-drop div { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.mms-file-drop strong { + color: var(--color-text-strong); +} + +.mms-file-drop small { + color: var(--color-text-muted); +} + +.mms-save-button { + background: #7c3aed; + border-color: #7c3aed; +} + +.mms-save-button:hover { + background: #6d28d9; + border-color: #6d28d9; +} + +.mms-preview { + display: grid; + gap: var(--space-4); +} + +.mms-preview img { + aspect-ratio: 16 / 9; + border-radius: var(--radius-md); + object-fit: cover; + width: 100%; +} + +.mms-preview p { + color: var(--color-text-muted); + line-height: 1.75; +} + +.mms-preview-frames { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.mms-preview-frames span { + align-items: center; + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-full); + color: var(--color-text-muted); + display: inline-flex; + gap: var(--space-1); + min-height: 30px; + padding: 0 var(--space-3); +} + +.template-toolbar { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(0, 1fr) auto; +} + +.template-card-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); + min-width: 0; +} + +.template-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + min-height: 300px; + min-width: 0; + overflow: hidden; + padding: var(--space-6); + position: relative; +} + +.template-card::before { + content: ''; + inset: 0 auto 0 0; + position: absolute; + width: 5px; +} + +.template-card--green::before { + background: var(--color-success); +} + +.template-card--blue::before { + background: var(--color-selected); +} + +.template-card--red::before { + background: var(--color-danger); +} + +.template-card h2 { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + line-height: 1.3; +} + +.template-hash { + color: var(--color-text-muted); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + margin: 0; +} + +.template-content { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + line-height: 1.65; + margin: 0; +} + +.template-vars { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.template-vars span { + color: var(--color-text-muted); +} + +.template-vars strong, +.template-current-vars strong { + background: #e8f0ff; + border-radius: var(--radius-sm); + color: var(--color-selected); + font-weight: var(--font-weight-medium); + padding: 5px 10px; +} + +.template-card-footer { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + flex-wrap: wrap; + gap: var(--space-3); + justify-content: space-between; + margin-top: auto; + padding-top: var(--space-4); +} + +.template-card-footer span { + color: var(--color-text-muted); +} + +.template-card-footer div { + display: flex; + flex-wrap: wrap; + gap: var(--space-3); +} + +.template-card-footer button { + background: transparent; + border: 0; + color: var(--color-selected); + padding: 0; +} + +.template-card-footer button:last-child { + color: var(--color-danger); +} + +.template-form { + display: grid; + gap: var(--space-5); +} + +.template-form .ui-textarea { + min-height: 220px; +} + +.template-form-meta { + align-items: center; + display: flex; + justify-content: space-between; +} + +.template-form-meta button { + background: transparent; + border: 0; + color: var(--color-selected); + font-weight: var(--font-weight-semibold); + padding: 0; +} + +.template-form-meta span { + color: var(--color-text-muted); +} + +.template-variable-panel { + border: 1px solid var(--color-border); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.template-variable-panel h3 { + font-size: var(--font-size-lg); +} + +.template-variable-buttons { + display: flex; + flex-wrap: wrap; + gap: var(--space-3); +} + +.template-variable-buttons button { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + color: var(--color-text); + min-height: 36px; + padding: 0 var(--space-4); +} + +.template-variable-buttons button:hover { + border-color: var(--color-selected); + color: var(--color-selected); +} + +.template-custom-variable { + display: grid; + gap: var(--space-3); + grid-template-columns: minmax(0, 1fr) 96px; +} + +.template-info-tip { + align-items: center; + background: var(--color-selected-soft); + border-left: 4px solid var(--color-selected); + color: var(--color-text); + display: flex; + gap: var(--space-3); + line-height: 1.7; + padding: var(--space-4); +} + +.template-info-tip svg { + color: var(--color-selected); + flex: 0 0 auto; +} + +.template-current-vars { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.task-detail-title h2 { + font-size: 22px; +} + +.task-stat-layout { + display: grid; + gap: 14px; + grid-template-columns: minmax(280px, 0.9fr) minmax(0, 1.4fr); +} + +.task-progress-card { + background: linear-gradient(180deg, rgba(37, 99, 235, 0.08), transparent 64%), #ffffff; + border: 1px solid #dbe7ff; + border-radius: var(--radius-md); + display: grid; + gap: 14px; + padding: 20px; +} + +.task-progress-card span, +.task-stat-list span { + color: #7b8494; + font-size: var(--font-size-xs); + font-weight: var(--font-weight-medium); +} + +.task-progress-card strong { + color: var(--color-selected); + font-size: 42px; + line-height: 1; +} + +.task-progress-card small { + color: #7b8494; +} + +.task-stat-list { + background: #ffffff; + border: 1px solid #e7ebf2; + border-radius: var(--radius-md); + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + overflow: hidden; +} + +.task-stat-list > div { + align-content: center; + border-right: 1px solid #edf0f5; + display: grid; + gap: 10px; + min-height: 138px; + padding: 20px; +} + +.task-stat-list > div:last-child { + border-right: 0; +} + +.task-stat-list strong { + color: #18202f; + font-size: 28px; + line-height: 1; +} + +.overall-rate-card { + min-height: 188px; +} + +.overall-rate-split { + display: grid; + gap: 12px; + grid-template-columns: repeat(2, minmax(120px, 1fr)); + width: min(420px, 100%); +} + +.overall-rate-split div { + background: rgba(255, 255, 255, 0.78); + border: 1px solid rgba(209, 213, 219, 0.72); + border-radius: var(--radius-md); + display: grid; + gap: 4px; + justify-items: center; + padding: 12px; +} + +.overall-rate-split b { + color: #18202f; + font-size: 18px; +} + +.rate-tone-low, +.rate-tone-low .batch-progress__bar { + --rate-color: var(--color-danger); +} + +.rate-tone-medium, +.rate-tone-medium .batch-progress__bar { + --rate-color: var(--color-warning); +} + +.rate-tone-high, +.rate-tone-high .batch-progress__bar { + --rate-color: var(--color-success); +} + +.overall-rate-card.rate-tone-low { + background: linear-gradient(180deg, rgba(220, 38, 38, 0.09), transparent 58%), #ffffff; + border-color: rgba(220, 38, 38, 0.28); +} + +.overall-rate-card.rate-tone-medium { + background: linear-gradient(180deg, rgba(217, 119, 6, 0.1), transparent 58%), #ffffff; + border-color: rgba(217, 119, 6, 0.28); +} + +.overall-rate-card.rate-tone-high { + background: linear-gradient(180deg, rgba(22, 163, 74, 0.09), transparent 58%), #ffffff; + border-color: rgba(22, 163, 74, 0.26); +} + +.overall-rate-card.rate-tone-low strong, +.carrier-rate-card.rate-tone-low > div:first-child span, +.rate-text.rate-tone-low { + color: var(--color-danger) !important; +} + +.overall-rate-card.rate-tone-medium strong, +.carrier-rate-card.rate-tone-medium > div:first-child span, +.rate-text.rate-tone-medium { + color: var(--color-warning) !important; +} + +.overall-rate-card.rate-tone-high strong, +.carrier-rate-card.rate-tone-high > div:first-child span, +.rate-text.rate-tone-high { + color: var(--color-success) !important; +} + +.rate-text { + font-weight: var(--font-weight-semibold); +} + +.carrier-rate-card .batch-progress__bar, +.city-rate-table .batch-progress__bar { + background: var(--rate-color, var(--color-success)); +} + +.detail-message { + color: var(--color-text-muted); + display: block; + max-width: 330px; +} + +.receipt { + color: var(--color-success); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: var(--font-size-xs); + font-weight: var(--font-weight-semibold); +} + +.receipt--failed { + color: var(--color-danger); +} + +.content-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(0, 1.4fr) minmax(300px, 0.6fr); +} + +.soft-panel { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + min-width: 0; + padding: var(--space-5); +} + +.soft-panel h3 { + margin-bottom: var(--space-3); +} + +.summary-list { + display: grid; + gap: var(--space-3); +} + +.summary-list div { + align-items: center; + display: flex; + justify-content: space-between; +} + +.summary-list span { + color: var(--color-text-muted); +} diff --git a/src/styles/domains/06-auth-enterprise.css b/src/styles/domains/06-auth-enterprise.css new file mode 100644 index 0000000..a72e9c8 --- /dev/null +++ b/src/styles/domains/06-auth-enterprise.css @@ -0,0 +1,1114 @@ +/* Owner: authentication, risk confirmation and enterprise review. Extracted from global.css with original cascade order preserved. */ +.summary-list strong { + color: var(--color-text-strong); +} + +.plan-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.plan-card { + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.plan-card--highlight { + border-color: rgba(217, 195, 160, 0.78); + box-shadow: 0 0 0 3px rgba(217, 195, 160, 0.18); +} + +.plan-card strong { + color: var(--color-text-strong); + font-size: 26px; + line-height: var(--line-height-tight); +} + +.muted { + color: var(--color-text-muted); +} + +.text-strong { + color: var(--color-text-strong); +} + +.status-success { + color: var(--color-success); +} + +.status-warning { + color: var(--color-warning); +} + +.status-danger { + color: var(--color-danger); +} + +.status-info { + color: var(--color-info); +} + +.empty-state { + align-items: center; + display: grid; + justify-items: center; + min-height: 240px; + text-align: center; +} + +.empty-state strong { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.empty-state span { + color: var(--color-text-muted); + margin-top: var(--space-2); +} + +.login-page { + position: relative; + isolation: isolate; + min-height: 100vh; + display: grid; + grid-template-columns: minmax(0, 1fr); + place-items: center; + padding: 36px 20px; + background: + radial-gradient(circle at 18% 16%, rgba(37, 99, 235, 0.12), transparent 32%), + radial-gradient(circle at 82% 14%, rgba(16, 185, 129, 0.1), transparent 30%), + linear-gradient(135deg, rgba(37, 99, 235, 0.08), rgba(15, 23, 42, 0.04)), var(--color-bg); +} + +.client-login-canvas { + position: absolute; + inset: 0; + z-index: 0; + width: 100%; + height: 100%; + pointer-events: none; +} + +.login-panel { + position: relative; + z-index: 1; + box-sizing: border-box; + max-width: 428px; + min-width: 0; + width: 100%; + padding: 34px 34px 30px; + border: 1px solid rgba(148, 163, 184, 0.24); + border-radius: 8px; + background: var(--color-surface); + box-shadow: 0 26px 70px rgba(15, 23, 42, 0.14); +} + +.login-brand { + display: grid; + justify-items: center; + gap: 14px; + margin-bottom: 30px; + text-align: center; +} + +.login-brand img { + display: block; + width: 178px; + height: 64px; + object-fit: contain; +} + +.login-brand h1 { + margin: 0; + color: var(--color-text-strong); + font-size: 24px; + font-weight: 800; + letter-spacing: 0; + line-height: 1.15; +} + +.login-brand p { + margin: 8px 0 0; + color: var(--color-text-muted); + font-size: 15px; + font-weight: 500; +} + +.login-form { + display: grid; + gap: 17px; +} + +.login-captcha-row { + display: grid; + grid-template-columns: 1fr 136px; + gap: 12px; + align-items: end; +} + +.login-captcha { + height: 40px; + border: 1px solid var(--color-border); + border-radius: 8px; + background: linear-gradient(180deg, #fff, var(--color-surface-muted)); + color: var(--color-text-strong); + font-weight: 700; + cursor: pointer; +} + +.login-error { + margin: 0; + padding: 10px 12px; + border-radius: 8px; + color: var(--color-danger); + background: rgba(239, 68, 68, 0.1); +} + +.login-session-notice { + margin: 0; + padding: 10px 12px; + border: 1px solid rgba(37, 99, 235, 0.2); + border-radius: 8px; + color: var(--color-text-strong); + background: rgba(37, 99, 235, 0.08); + line-height: 1.6; +} + +.page-loading-state { + min-height: 100vh; + display: grid; + place-items: center; + color: var(--color-text-muted); + background: var(--color-surface-muted); +} + +.login-alert-message { + margin: 0; + color: var(--color-text-strong); + line-height: 1.7; +} + +.system-page { + gap: 28px; +} + +.system-page-toolbar { + align-items: center; + display: flex; + justify-content: space-between; +} + +.system-log-export { + align-items: flex-end; + display: flex; + flex-direction: column; + gap: 8px; + max-width: min(100%, 680px); +} + +.system-log-export__result, +.system-log-export__error { + align-items: center; + border-radius: var(--radius-md); + display: flex; + font-size: 13px; + gap: 8px; + justify-content: space-between; + padding: 8px 10px; +} + +.system-log-export__result { + background: var(--color-success-soft); + color: var(--color-success-strong); +} + +.system-log-export__error { + background: var(--color-danger-soft); + color: var(--color-danger-strong); +} + +.risk-action-content { + display: grid; + gap: 18px; +} + +.risk-action-content section { + display: grid; + gap: 8px; +} + +.risk-action-content h3 { + font-size: 14px; + margin: 0; +} + +.risk-action-content ul { + margin: 0; + padding-left: 20px; +} + +.risk-action-identity { + background: var(--color-surface-muted); + border-radius: var(--radius-lg); + display: grid; + gap: 10px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + padding: 14px; +} + +.risk-action-identity div { + display: grid; + gap: 3px; + min-width: 0; +} + +.risk-action-identity span { + color: var(--color-text-muted); + font-size: 12px; +} + +.risk-action-identity strong { + overflow-wrap: anywhere; +} + +.risk-action-blockers { + color: var(--color-danger-strong); + list-style: none; + padding: 0 !important; +} + +.risk-action-blockers li, +.risk-action-passed { + align-items: center; + display: flex; + gap: 7px; +} + +.risk-action-passed { + color: var(--color-success-strong); + margin: 0; +} + +.risk-action-result { + align-items: center; + background: var(--color-success-soft); + border-radius: var(--radius-lg); + color: var(--color-success-strong); + display: flex; + gap: 10px; + padding: 14px; +} + +.risk-action-result div { + display: grid; + gap: 4px; +} + +.risk-action-result span { + font-size: 12px; + overflow-wrap: anywhere; +} + +@media (max-width: 640px) { + .risk-action-identity { + grid-template-columns: 1fr; + } +} + +.delete-risk-dependencies { + display: grid; + gap: 8px; + list-style: none; + padding: 0 !important; +} + +.delete-risk-dependencies li { + align-items: center; + background: var(--color-surface-muted); + border-radius: var(--radius-md); + display: grid; + gap: 3px; + grid-template-columns: 1fr auto; + padding: 10px 12px; +} + +.delete-risk-dependencies small { + color: var(--color-text-muted); + grid-column: 1 / -1; + overflow-wrap: anywhere; +} + +.delete-risk-selections { + display: grid; + gap: 10px; +} + +.delete-risk-selections > h3, +.delete-risk-selections > p { + margin: 0; +} + +.delete-risk-selections label { + align-items: flex-start; + background: var(--color-surface-muted); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + cursor: pointer; + display: flex; + gap: 10px; + padding: 11px 12px; +} + +.delete-risk-selections input { + flex: 0 0 auto; + margin-top: 3px; +} + +.delete-risk-selections label > span { + display: grid; + gap: 4px; +} + +.delete-risk-selections small { + color: var(--color-text-muted); + line-height: 1.55; +} + +.delete-risk-action .ui-textarea { + min-height: 88px; +} + +@media (max-width: 640px) { + .system-page-toolbar { + align-items: stretch; + flex-direction: column; + } + .system-log-export { + align-items: stretch; + max-width: none; + } + .system-log-export > .ui-button { + min-height: 44px; + width: 100%; + } + .system-log-export__result, + .system-log-export__error { + align-items: stretch; + flex-direction: column; + } +} + +.system-filter-row { + max-width: 520px; +} + +.system-log-filters { + align-items: end; + display: grid; + gap: 22px; + grid-template-columns: minmax(280px, 1.2fr) repeat(3, minmax(190px, 0.65fr)) auto; +} + +.system-log-range { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: 12px; +} + +.system-log-range > span { + align-items: center; + color: var(--color-text-muted); + display: inline-flex; + gap: 8px; +} + +.system-table-card { + overflow: hidden; + padding: 0; +} + +.system-table-card .ui-table-wrap { + border: 0; + border-radius: 0; +} + +.system-table-card .ui-table { + min-width: 1080px; +} + +.system-table-card .ui-table th { + background: #e5e7eb; + color: #7b8494; + height: 58px; +} + +.system-table-card .ui-table td { + height: 72px; +} + +.system-table-card .ui-table tbody tr:nth-child(odd) td { + background: #ffffff; +} + +.system-table-card .ui-table tbody tr:nth-child(even) td { + background: #fbfcfe; +} + +.system-table-card .ui-table tbody tr:hover td { + background: #f2f5fa; +} + +.inline-actions { + align-items: center; + display: flex; + gap: 12px; +} + +.system-user-form { + display: grid; + gap: 24px; + padding-bottom: 96px; +} + +.system-user-form .ui-field__label { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.system-log-detail { + color: var(--color-text-muted); + line-height: 1.6; +} + +.system-log-detail-card { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-1); + line-height: 1.55; + max-width: 360px; + padding: var(--space-3); +} + +.system-log-detail-card strong { + color: var(--color-text-strong); + font-size: var(--font-size-sm); +} + +.system-log-detail-card span { + color: var(--color-text-muted); +} + +.system-log-detail-card small { + color: var(--color-selected); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: var(--font-size-xs); +} + +.protocol-log-hint { + background: var(--color-info-soft); + border: 1px solid color-mix(in srgb, var(--color-info) 24%, transparent); + border-radius: var(--radius-md); + color: var(--color-text); + font-size: var(--font-size-sm); + padding: var(--space-3) var(--space-4); +} + +.protocol-log-filters { + grid-template-columns: minmax(240px, 1.2fr) repeat(4, minmax(125px, 0.5fr)) minmax(230px, 0.8fr) auto; +} + +.protocol-log-table .ui-table { + min-width: 1320px; +} + +.protocol-log-table .ui-table th:last-child, +.protocol-log-table .ui-table td:last-child { + background: var(--color-surface); + box-shadow: -10px 0 18px -18px rgba(15, 23, 42, 0.6); + position: sticky; + right: 0; + z-index: 1; +} + +.protocol-log-identifiers, +.protocol-log-result { + display: grid; + gap: 4px; +} + +.protocol-log-identifiers small, +.protocol-log-result small { + color: var(--color-text-muted); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + overflow-wrap: anywhere; +} + +.protocol-log-detail { + display: grid; + gap: var(--space-3); + margin: 0; +} + +.protocol-log-detail > div { + display: grid; + gap: var(--space-1); + grid-template-columns: minmax(130px, 0.35fr) minmax(0, 1fr); +} + +.protocol-log-detail dt { + color: var(--color-text-muted); +} + +.protocol-log-detail dd { + margin: 0; + overflow-wrap: anywhere; +} + +@media (max-width: 1024px) { + .protocol-log-filters { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 640px) { + .protocol-log-filters { + grid-template-columns: 1fr; + } + + .protocol-log-detail > div { + grid-template-columns: 1fr; + } +} + +.enterprise-page { + gap: 28px; +} + +.enterprise-page-title { + color: var(--color-text-strong); + font-size: var(--font-size-2xl); + font-weight: var(--font-weight-semibold); + margin: 0; +} + +.enterprise-status-card { + align-items: center; + display: flex; + gap: 14px; + min-height: 96px; + padding: 0 34px; +} + +.enterprise-status-card strong { + color: var(--color-text-strong); + font-size: var(--font-size-md); +} + +.enterprise-status-card--pending { + border-color: rgba(37, 99, 235, 0.26); +} + +.enterprise-status-card--approved { + border-color: rgba(22, 163, 74, 0.28); +} + +.enterprise-status-card--rejected { + border-color: rgba(220, 38, 38, 0.28); +} + +.enterprise-review-status { + align-items: center; + border-radius: var(--radius-full); + display: inline-flex; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + min-height: 30px; + padding: 0 var(--space-3); +} + +.enterprise-review-status--uncertified { + background: var(--color-surface-muted); + color: var(--color-text-muted); +} + +.enterprise-review-status--pending { + background: var(--color-info-soft); + color: var(--color-info); +} + +.enterprise-review-status--approved { + background: var(--color-success-soft); + color: var(--color-success); +} + +.enterprise-review-status--rejected { + background: var(--color-danger-soft); + color: var(--color-danger); +} + +.enterprise-status-card button, +.enterprise-result button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: 4px; +} + +.enterprise-info-card { + padding: 44px 54px; +} + +.enterprise-info-card dl { + display: grid; + gap: 34px 120px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin: 0; + max-width: 1120px; +} + +.enterprise-info-card div, +.enterprise-result dl div { + display: grid; + gap: 14px; + grid-template-columns: 170px minmax(0, 1fr); +} + +.enterprise-info-card dt, +.enterprise-result dt { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.enterprise-info-card dd, +.enterprise-result dd { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); + margin: 0; +} + +.enterprise-flow-card { + min-height: 700px; + padding: 46px 54px; +} + +.enterprise-stepper { + align-items: center; + display: flex; + justify-content: center; + margin-bottom: 82px; +} + +.enterprise-stepper__item { + align-items: center; + display: flex; + gap: 14px; +} + +.enterprise-stepper__dot { + align-items: center; + background: #d1d5db; + border-radius: var(--radius-full); + color: #8b95a5; + display: inline-flex; + font-weight: var(--font-weight-bold); + height: 44px; + justify-content: center; + width: 44px; +} + +.enterprise-stepper__dot.is-active, +.enterprise-stepper__dot.is-complete { + background: var(--color-selected); + color: #ffffff; +} + +.enterprise-stepper__item strong { + color: #8b95a5; + font-size: var(--font-size-md); +} + +.enterprise-stepper__item strong.is-active { + color: var(--color-text-strong); +} + +.enterprise-stepper__arrow { + color: #8b95a5; + margin: 0 28px; +} + +.enterprise-form-panel, +.enterprise-verify-panel, +.enterprise-face-panel { + display: grid; + gap: 26px; + margin-left: 0; + max-width: 920px; +} + +.enterprise-form-panel { + margin-left: 0; +} + +.enterprise-required, +.enterprise-address-selects > span { + color: var(--color-text-strong); + font-size: var(--font-size-md); + font-weight: var(--font-weight-semibold); +} + +.enterprise-required::first-letter, +.enterprise-address-selects > span::first-letter { + color: var(--color-danger); +} + +.enterprise-upload { + align-items: center; + border: 2px dashed #dfe4ec; + color: var(--color-selected); + display: grid; + gap: 12px; + height: 176px; + justify-items: center; + max-width: 920px; +} + +.enterprise-upload strong { + color: var(--color-selected); + font-size: var(--font-size-md); +} + +.enterprise-help, +.enterprise-form-note, +.enterprise-verify-panel small { + color: var(--color-text-muted); + line-height: 1.7; + margin: -12px 0 0; +} + +.enterprise-address-selects { + display: grid; + gap: 12px; +} + +.enterprise-address-selects > div { + display: flex; + gap: 16px; +} + +.enterprise-address-selects .ui-field { + min-width: 140px; + width: 236px; +} + +.enterprise-actions { + align-items: center; + display: flex; + gap: 16px; + justify-content: flex-end; + margin-top: 16px; +} + +.enterprise-actions--center { + justify-content: center; +} + +.enterprise-method-panel { + display: grid; + gap: 24px; + margin: 0 auto; + max-width: 1060px; + width: 100%; +} + +.enterprise-method-card { + align-items: center; + background: #ffffff; + border: 1px solid #e1e6ef; + border-radius: var(--radius-sm); + display: grid; + gap: 22px; + grid-template-columns: 88px minmax(0, 1fr); + min-height: 168px; + padding: 34px; + text-align: left; +} + +.enterprise-method-card.is-selected { + border-color: var(--color-selected); + box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.35); +} + +.enterprise-method-card svg { + color: #c8d0dc; +} + +.enterprise-method-card strong { + color: var(--color-text-strong); + font-size: 20px; +} + +.enterprise-method-card strong span, +.enterprise-verify-copy em, +.enterprise-info-alert em, +.enterprise-qr-section em { + color: #ff7a00; + font-style: normal; +} + +.enterprise-method-card p { + color: var(--color-text-muted); + font-size: var(--font-size-md); + line-height: 1.75; + margin: 4px 0 0; +} + +.enterprise-verify-panel, +.enterprise-face-panel { + margin-left: 0; +} + +.enterprise-verify-panel > p, +.enterprise-face-panel > p { + align-items: center; + display: flex; + gap: 28px; + margin: 0; +} + +.enterprise-verify-panel > p span, +.enterprise-face-panel > p span { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.enterprise-verify-copy { + color: var(--color-text-muted); + line-height: 1.8; + margin-top: 18px !important; +} + +.enterprise-verify-copy em:first-of-type { + color: var(--color-danger); +} + +.enterprise-verify-panel h2, +.enterprise-face-panel h2 { + color: var(--color-text-strong); + font-size: 22px; + margin: 24px 0 0; +} + +.enterprise-info-alert { + align-items: flex-start; + background: #eff6ff; + border: 1px solid #bfdbfe; + color: #344054; + display: flex; + gap: 14px; + line-height: 1.8; + margin-top: 24px; + max-width: 920px; + padding: 22px; +} + +.enterprise-info-alert svg { + color: var(--color-selected); + flex: 0 0 auto; + margin-top: 3px; +} + +.enterprise-face-panel { + max-width: 920px; +} + +.enterprise-qr-section { + display: grid; + gap: 22px; + justify-items: center; + margin-top: 36px; + text-align: center; +} + +.enterprise-legal-summary { + display: grid; + gap: 22px; + margin: 0; +} + +.enterprise-legal-summary div { + display: flex; + gap: 28px; +} + +.enterprise-legal-summary dt { + color: var(--color-text-muted); + min-width: 150px; +} + +.enterprise-legal-summary dd { + color: var(--color-text-strong); + margin: 0; +} + +.enterprise-qr-section h2, +.enterprise-qr-section p { + justify-self: start; + margin: 0; + text-align: left; +} + +.enterprise-qr-section p { + color: var(--color-text-muted); + line-height: 1.8; +} + +.enterprise-qr { + align-items: center; + border: 2px solid #e1e5ec; + color: #ff4040; + display: flex; + font-size: 34px; + height: 280px; + justify-content: center; + width: 280px; +} + +.enterprise-qr-section > span { + color: var(--color-text-muted); +} + +.enterprise-success-test { + background: var(--color-success); + border-color: var(--color-success); +} + +.enterprise-result { + align-items: center; + display: grid; + justify-items: center; + min-height: 610px; + text-align: center; +} + +.enterprise-result > span { + align-items: center; + border-radius: var(--radius-full); + display: inline-flex; + justify-content: center; +} + +.enterprise-result--success > span, +.enterprise-result--pending > span { + background: #00bb38; + color: #ffffff; + height: 132px; + width: 132px; +} + +.enterprise-result--pending > span { + background: var(--color-selected); +} + +.enterprise-result--failed > span { + border: 5px solid #ff4040; + color: #ff4040; + font-size: 62px; + height: 132px; + width: 132px; +} + +.enterprise-result h2 { + color: var(--color-text-strong); + font-size: 28px; + margin: 28px 0 22px; +} + +.enterprise-result dl { + display: grid; + gap: 22px; + margin: 0 0 50px; + text-align: left; +} + +.enterprise-result--failed p { + color: var(--color-text-muted); + margin: 0; +} + +.enterprise-result--failed > strong { + color: #ff7a00; + font-size: 26px; + margin: 14px 0 26px; +} + +.admin-dashboard-hero { + background: #ffffff; + border: 1px solid var(--color-border); + color: var(--color-text); +} + +.admin-dashboard-hero h1 { + color: var(--color-text-strong); +} + +.admin-dashboard-main-grid { + grid-template-columns: minmax(0, 1fr) minmax(360px, 0.72fr); +} + +.admin-metric-grid { + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.metric-card__value--danger { + color: var(--color-danger) !important; +} + +@media (max-width: 1380px) { + .admin-metric-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +.admin-workload-grid { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.admin-workload-card { + background: #fbfcff; + border: 1px solid #edf0f5; + border-radius: var(--radius-md); + display: grid; + gap: var(--space-2); + justify-items: start; + min-height: 112px; + padding: var(--space-4); + text-align: left; + transition: + background var(--transition-fast), + border-color var(--transition-fast), + transform var(--transition-fast); +} + +.admin-workload-card:hover { + background: #f3f7ff; + border-color: rgba(37, 99, 235, 0.24); + transform: translateY(-1px); +} + +.admin-workload-card strong { + color: var(--color-text-strong); + font-size: 28px; + line-height: 1; +} diff --git a/src/styles/domains/07-admin-operations.css b/src/styles/domains/07-admin-operations.css new file mode 100644 index 0000000..954859a --- /dev/null +++ b/src/styles/domains/07-admin-operations.css @@ -0,0 +1,1089 @@ +/* Owner: admin detail, routes, profiles and SMS audit. Extracted from global.css with original cascade order preserved. */ +.admin-workload-card span:not(.ui-tag) { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.admin-alert-list { + display: grid; + gap: var(--space-3); +} + +.admin-alert { + border: 1px solid #edf0f5; + border-left-width: 4px; + border-radius: var(--radius-md); + display: grid; + gap: var(--space-2); + padding: var(--space-4); +} + +.admin-alert--danger { + border-left-color: var(--color-danger); +} + +.admin-alert--warning { + border-left-color: var(--color-warning); +} + +.admin-alert--info { + border-left-color: var(--color-selected); +} + +.admin-alert > div { + align-items: center; + display: flex; + gap: var(--space-3); + justify-content: space-between; +} + +.admin-alert strong { + color: var(--color-text-strong); +} + +.admin-alert span, +.admin-alert p { + color: var(--color-text-muted); +} + +.admin-alert p { + line-height: 1.6; + margin: 0; +} + +.enterprise-summary-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.enterprise-query-grid { + grid-template-columns: minmax(180px, 1fr) minmax(220px, 1fr) minmax(180px, 1fr) auto; +} + +.enterprise-query-actions { + align-items: end; + display: flex; + gap: var(--space-3); +} + +.enterprise-inline-tag { + margin-left: var(--space-2); +} + +.enterprise-form { + display: grid; + gap: var(--space-5); +} + +.enterprise-form-page { + max-width: 1120px; +} + +.enterprise-form-card { + display: grid; + gap: var(--space-6); +} + +.enterprise-upload-panel { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: 120px 176px minmax(0, 1fr); +} + +.enterprise-upload-panel > span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.enterprise-upload-panel button, +.enterprise-upload-button { + align-items: center; + background: #ffffff; + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-md); + color: var(--color-selected); + display: grid; + gap: var(--space-2); + height: 142px; + justify-items: center; + text-align: center; +} + +.enterprise-upload-button { + min-width: 0; + overflow-wrap: anywhere; + padding: var(--space-3); + width: 176px; +} + +.enterprise-upload-panel p { + color: var(--color-text-muted); + line-height: var(--line-height-base); + margin: 0; +} + +.enterprise-info-tip { + background: var(--color-selected-soft); + border: 1px solid #bfdbfe; + border-radius: var(--radius-md); + color: var(--color-text); + padding: var(--space-4); +} + +.admin-enterprise-detail { + max-width: 1320px; +} + +.admin-detail-backbar { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.admin-detail-backbar > span { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.admin-enterprise-profile { + display: grid; + gap: var(--space-6); +} + +.admin-enterprise-profile__main { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.admin-enterprise-profile__icon { + align-items: center; + background: var(--color-selected-soft); + border-radius: var(--radius-md); + color: var(--color-selected); + display: inline-flex; + height: 52px; + justify-content: center; + width: 52px; +} + +.admin-enterprise-profile h1 { + font-size: 28px; + margin: 0 0 var(--space-1); +} + +.admin-enterprise-profile p { + color: var(--color-text-muted); + margin: 0; +} + +.admin-enterprise-profile > .ui-button { + justify-self: end; + margin-top: -72px; +} + +.admin-enterprise-profile dl { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin: 0; +} + +.admin-enterprise-profile dt { + color: var(--color-text-muted); + font-size: 13px; + margin-bottom: var(--space-2); +} + +.admin-enterprise-profile dd { + color: var(--color-text-strong); + font-size: 18px; + font-weight: var(--font-weight-semibold); + margin: 0; +} + +.admin-business-tabs { + background: var(--color-surface-muted); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-2); + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin-inline: auto; + max-width: 560px; + padding: var(--space-2); +} + +.admin-business-tabs button { + align-items: center; + background: transparent; + border: 0; + border-radius: var(--radius-md); + color: var(--color-text-muted); + display: flex; + font-weight: var(--font-weight-semibold); + justify-content: center; + min-height: 44px; +} + +.admin-business-tabs button.active { + background: var(--color-surface); + box-shadow: var(--shadow-sm); + color: var(--color-selected); +} + +.admin-app-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.admin-app-card { + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.admin-app-card header { + align-items: center; + display: flex; + gap: var(--space-3); + justify-content: space-between; +} + +.admin-app-card h3 { + font-size: 20px; + margin: 0; +} + +.admin-app-card header button { + align-items: center; + background: var(--color-border-strong); + border: 0; + border-radius: 999px; + color: var(--color-text-muted); + display: inline-flex; + font-size: 13px; + font-weight: var(--font-weight-semibold); + gap: var(--space-2); + padding: 5px 10px; +} + +.admin-app-card header button.is-on { + background: var(--color-selected-soft); + color: var(--color-selected); +} + +.admin-app-card dl { + display: grid; + gap: var(--space-3); + margin: 0; +} + +.admin-app-card dl div { + align-items: center; + display: flex; + justify-content: space-between; +} + +.admin-app-card dt { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.admin-app-card dd { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); + margin: 0; +} + +.admin-app-card footer { + border-top: 1px solid var(--color-border); + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(2, minmax(0, 1fr)); + padding-top: var(--space-4); +} + +.admin-section-footer { + align-items: center; + display: flex; + justify-content: flex-end; +} + +.admin-mms-signature-summary { + grid-template-columns: 28px 1.4fr 1fr 1fr 1fr 1fr 130px; +} + +.admin-signature-spacer { + width: 28px; +} + +.admin-report-detail { + display: grid; + gap: var(--space-5); +} + +.admin-report-tabs { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + overflow: hidden; +} + +.admin-report-tabs button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-text-muted); + display: grid; + gap: var(--space-2); + justify-items: center; + min-height: 86px; + padding: var(--space-4); +} + +.admin-report-tabs button.active { + background: var(--color-surface); + box-shadow: var(--shadow-sm); +} + +.admin-report-tabs strong { + font-size: 18px; +} + +.admin-report-carrier--mobile strong { + color: var(--color-selected); +} + +.admin-report-carrier--unicom strong { + color: var(--color-warning); +} + +.admin-report-carrier--telecom strong { + color: var(--color-success); +} + +.admin-report-tabs span { + align-items: center; + display: inline-flex; + gap: 6px; + margin-inline: 4px; +} + +.admin-report-tabs i { + border-radius: 999px; + display: inline-block; + height: 8px; + width: 8px; +} + +.admin-report-tabs i.is-success { + background: var(--color-success); +} + +.admin-report-tabs i.is-info { + background: var(--color-selected); +} + +.admin-report-tabs i.is-danger { + background: var(--color-danger); +} + +.admin-report-carrier-detail { + display: grid; + gap: var(--space-4); +} + +.admin-report-carrier-title { + align-items: center; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: flex; + justify-content: space-between; + padding: var(--space-4); +} + +.admin-report-carrier-title div { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.admin-report-carrier-title strong { + color: var(--color-selected); + font-size: 18px; +} + +.admin-report-carrier-title span, +.admin-report-carrier-title p { + color: var(--color-text-muted); +} + +.admin-report-carrier-title p { + display: flex; + gap: var(--space-4); + margin: 0; +} + +.admin-report-carrier-title p span { + color: var(--color-success); + font-weight: var(--font-weight-semibold); +} + +.admin-report-carrier-title p em { + color: var(--color-selected); + font-style: normal; + font-weight: var(--font-weight-semibold); +} + +.admin-report-record-list { + display: grid; + gap: var(--space-4); +} + +.admin-report-record-list article { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-3); + padding: var(--space-5); +} + +.admin-report-record-list h4 { + align-items: center; + color: var(--color-text-strong); + display: flex; + gap: var(--space-3); + margin: 0; +} + +.admin-report-record-list p { + color: var(--color-text-muted); + margin: 0; +} + +.admin-report-record-list p span { + color: var(--color-text); + margin-left: var(--space-2); +} + +.admin-drainage-report-meta { + display: grid; + gap: var(--space-2); +} + +.admin-drainage-report-meta p { + color: var(--color-text); + margin: 0; +} + +.admin-drainage-report-meta a { + color: var(--color-selected); + font-weight: var(--font-weight-semibold); +} + +.admin-app-form-page { + max-width: 1120px; +} + +.admin-app-form-card { + display: grid; + gap: var(--space-6); +} + +.admin-app-form-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.admin-app-form-tip { + align-items: flex-start; + background: var(--color-selected-soft); + border: 1px solid #bfdbfe; + border-radius: var(--radius-md); + color: var(--color-text); + display: flex; + gap: var(--space-3); + line-height: var(--line-height-base); + padding: var(--space-4); +} + +.admin-app-form-tip svg { + color: var(--color-selected); + flex: 0 0 auto; + margin-top: 2px; +} + +.admin-app-protocol-section { + border-top: 3px solid #4f6fae; + overflow: hidden; +} + +.admin-app-protocol-section--http { + border-top-color: #178367; +} + +.admin-app-protocol-header { + align-items: flex-start; +} + +.admin-app-protocol-heading { + align-items: flex-start; + display: flex; + gap: var(--space-3); + min-width: 0; +} + +.admin-app-protocol-heading > div { + min-width: 0; +} + +.admin-app-protocol-heading p { + color: var(--color-text-muted); + line-height: var(--line-height-base); + margin: 5px 0 0; +} + +.admin-app-protocol-icon { + align-items: center; + background: #edf3ff; + border: 1px solid #d7e2f8; + border-radius: var(--radius-md); + color: #3d5f9d; + display: inline-flex; + flex: 0 0 auto; + height: 38px; + justify-content: center; + width: 38px; +} + +.admin-app-protocol-section--http .admin-app-protocol-icon { + background: #eaf7f2; + border-color: #cce9dd; + color: #17745d; +} + +.admin-app-protocol-section--http .admin-switch.is-on { + color: #17745d; +} + +.admin-app-protocol-section--http .admin-switch.is-on span { + background: #178367; +} + +.admin-app-protocol-body { + padding-top: var(--space-1); +} + +.admin-app-protocol-empty { + background: var(--color-bg-subtle); + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-md); + color: var(--color-text-muted); + line-height: var(--line-height-base); + padding: var(--space-5); + text-align: center; +} + +.admin-app-form-price-note { + color: var(--color-selected); + font-weight: var(--font-weight-semibold); +} + +.admin-app-route-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.admin-app-route-card { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + min-width: 0; + padding: var(--space-4); +} + +.admin-app-route-card.is-selected { + background: var(--color-selected-soft); + border-color: #bfdbfe; +} + +.admin-app-route-card header { + align-items: flex-start; + display: grid; + gap: var(--space-3); + grid-template-columns: auto minmax(0, 1fr) auto; +} + +.admin-app-route-card header > span:first-child { + align-items: center; + background: #ffffff; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-selected); + display: inline-flex; + height: 34px; + justify-content: center; + width: 34px; +} + +.admin-app-route-card header strong, +.admin-app-route-card header small { + display: block; +} + +.admin-app-route-card header small, +.admin-app-route-card p { + color: var(--color-text-muted); + line-height: var(--line-height-base); + margin: 0; +} + +.admin-switch { + align-items: center; + background: transparent; + border: 0; + color: var(--color-text-muted); + display: inline-flex; + gap: var(--space-3); + justify-self: start; +} + +.admin-switch span { + background: var(--color-border-strong); + border-radius: 999px; + display: inline-flex; + height: 24px; + position: relative; + width: 44px; +} + +.admin-switch span::after { + background: var(--color-surface); + border-radius: 999px; + box-shadow: var(--shadow-sm); + content: ''; + height: 18px; + left: 3px; + position: absolute; + top: 3px; + transition: transform var(--transition-fast); + width: 18px; +} + +.admin-switch.is-on { + color: var(--color-selected); +} + +.admin-switch.is-on span { + background: var(--color-selected); +} + +.admin-switch.is-on span::after { + transform: translateX(20px); +} + +.breadcrumb-line { + align-items: center; + align-self: flex-start; + display: flex; + gap: var(--space-4); + max-width: 100%; + min-height: 40px; +} + +.breadcrumb-line__icon { + align-items: center; + background: var(--color-selected-soft); + border-radius: var(--radius-sm); + color: var(--color-selected); + display: inline-flex; + flex: 0 0 auto; + height: 40px; + justify-content: center; + width: 40px; +} + +.breadcrumb-line h1 { + align-items: center; + color: var(--color-text-strong); + display: flex; + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + gap: var(--space-4); + letter-spacing: 0; + line-height: 1.25; + margin: 0; + min-width: 0; +} + +.page-heading > div:has(.breadcrumb-line) > h1 { + display: none; +} + +.channel-report-heading h1 { + display: none; +} + +.channel-route-modal__title { + align-items: center; + display: flex; + gap: var(--space-3); +} + +.channel-route-modal__title > span { + align-items: center; + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-selected); + display: inline-flex; + height: 40px; + justify-content: center; + width: 40px; +} + +.channel-route-modal__title h2, +.channel-route-modal__title p { + margin: 0; +} + +.channel-route-modal__title p { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + margin-top: var(--space-1); +} + +.channel-route-modal__empty { + background: var(--color-surface-subtle); + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-md); + color: var(--color-text-muted); + margin: 0; + padding: var(--space-4); +} + +.channel-route-modal__selected { + align-items: center; + background: color-mix(in srgb, var(--color-success) 8%, var(--color-surface)); + border: 1px solid color-mix(in srgb, var(--color-success) 35%, var(--color-border)); + border-radius: var(--radius-md); + color: var(--color-success); + display: flex; + gap: var(--space-3); + padding: var(--space-4); +} + +.channel-route-modal__selected strong, +.channel-route-modal__selected span { + display: block; +} + +.channel-route-modal__selected span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + margin-top: var(--space-1); +} + +.admin-enterprise-profile__main { + align-items: center; +} + +.admin-enterprise-profile__icon { + height: 40px; + width: 40px; +} + +.admin-enterprise-profile__main h1 { + font-size: var(--font-size-lg); + font-weight: var(--font-weight-semibold); + letter-spacing: 0; +} + +.audit-table-card { + padding: 0; +} + +.enterprise-audit-detail { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.enterprise-audit-detail section { + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-3); + padding: var(--space-5); +} + +.enterprise-audit-detail h3 { + color: var(--color-text-strong); + font-size: var(--font-size-lg); + margin: 0 0 var(--space-2); +} + +.enterprise-audit-detail div { + display: grid; + gap: 4px; +} + +.enterprise-audit-detail span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.enterprise-audit-detail strong { + color: var(--color-text-strong); + overflow-wrap: anywhere; +} + +.enterprise-audit-detail__remark { + border-top: 1px solid var(--color-border); + padding-top: var(--space-3); +} + +.audit-link { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + cursor: pointer; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-1); + padding: 0; +} + +.audit-link--success { + color: var(--color-success); +} + +.audit-link--danger { + color: var(--color-danger); +} + +.audit-pagination { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + justify-content: flex-end; + gap: var(--space-3); + padding: var(--space-4); +} + +.sms-bulk-actions { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--space-4); + margin-top: var(--space-6); + padding-top: var(--space-5); +} + +.sms-bulk-actions .ui-button--secondary { + background: var(--color-success); + border-color: var(--color-success); + color: white; +} + +.sms-audit-toolbar { + align-items: center; + display: flex; + justify-content: flex-end; + gap: var(--space-5); + padding: var(--space-3) 0; +} + +.sms-audit-toolbar > div { + display: flex; + gap: var(--space-2); +} + +.sms-audit-list { + padding: 0; +} + +.sms-audit-cell-stack { + align-items: flex-start; + display: grid; + gap: var(--space-2); + min-width: 0; +} + +.sms-audit-cell-stack small { + color: var(--color-text-muted); + line-height: var(--line-height-base); +} + +.sms-audit-cell-stack .table-link { + justify-self: start; + text-align: left; +} + +.sms-audit-head, +.sms-audit-row { + display: grid; + grid-template-columns: + 42px minmax(190px, 1.1fr) minmax(320px, 1.8fr) minmax(120px, 0.7fr) minmax(130px, 0.7fr) + minmax(130px, 0.7fr) 112px; +} + +.sms-audit-head { + background: var(--color-surface-subtle); + border-bottom: 1px solid var(--color-border); + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); + padding: var(--space-4); +} + +.sms-audit-row { + align-items: center; + border-bottom: 1px solid var(--color-border); + padding: var(--space-5) var(--space-4); +} + +.sms-audit-row:last-child { + border-bottom: 0; +} + +.sms-audit-customer, +.sms-audit-count, +.sms-audit-result, +.sms-audit-actions { + display: grid; + gap: var(--space-2); +} + +.sms-audit-customer span, +.sms-audit-customer small, +.sms-audit-count { + color: var(--color-text-muted); +} + +.sms-audit-content { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + line-height: 1.7; + margin: 0; + max-height: 92px; + overflow: hidden; + padding: var(--space-4); +} + +.sms-audit-count a, +.sms-audit-count button { + color: var(--color-selected); +} + +.sms-audit-count button { + background: transparent; + border: 0; + cursor: pointer; + justify-self: start; + padding: 0; +} + +.sms-audit-reasons { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.audit-dot { + align-items: center; + display: inline-flex; + gap: var(--space-2); + font-weight: var(--font-weight-semibold); +} + +.audit-dot::before { + border-radius: 999px; + content: ''; + height: 9px; + width: 9px; +} + +.audit-dot--warning { + color: #b7791f; +} + +.audit-dot--warning::before { + background: #d97706; +} + +.audit-dot--success { + color: var(--color-success); +} + +.audit-dot--success::before { + background: var(--color-success); +} + +.audit-dot--danger { + color: var(--color-danger); +} + +.audit-dot--danger::before { + background: var(--color-danger); +} + +.sms-audit-result small { + color: var(--color-text-muted); +} + +.sms-audit-actions .ui-button { + justify-content: center; +} + +.sms-audit-actions .ui-button--secondary { + background: transparent; + border-color: #86efac; + color: var(--color-success); +} + +.sms-audit-actions .ui-button--danger { + background: transparent; + color: var(--color-danger); +} + +.sms-audit-edit { + display: grid; + gap: var(--space-5); +} + +.sms-audit-edit__meta { + background: var(--color-surface-subtle); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); + padding: var(--space-5); +} + +.sms-audit-edit__meta span { + color: var(--color-text-muted); +} + +.sms-audit-edit__meta strong { + color: var(--color-text); +} + +.sms-audit-edit__count { + align-items: center; + color: var(--color-text-muted); + display: flex; + justify-content: space-between; +} diff --git a/src/styles/domains/08-reporting.css b/src/styles/domains/08-reporting.css new file mode 100644 index 0000000..4833a8f --- /dev/null +++ b/src/styles/domains/08-reporting.css @@ -0,0 +1,1132 @@ +/* Owner: report materials, import mapping, batches and field selection. Extracted from global.css with original cascade order preserved. */ +.sms-audit-edit__count strong { + color: var(--color-text-strong); +} + +.sms-reject-modal { + display: grid; + gap: var(--space-5); +} + +.reject-reason-tags { + display: flex; + flex-wrap: wrap; + gap: var(--space-3); + margin-top: var(--space-3); +} + +.reject-reason-tags button { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: 999px; + color: var(--color-text); + cursor: pointer; + font-weight: var(--font-weight-semibold); + padding: var(--space-2) var(--space-4); +} + +.reject-reason-tags button:hover { + border-color: var(--color-selected); + color: var(--color-selected); +} + +.audit-collapse-link { + background: transparent; + border: 0; + color: var(--color-text-muted); + cursor: pointer; + justify-self: start; + padding: 0; +} + +.phone-list-modal { + display: grid; + gap: var(--space-5); +} + +.phone-list-toolbar { + align-items: center; + display: flex; + justify-content: flex-end; + gap: var(--space-3); +} + +.phone-list-toolbar > label { + width: 150px; +} + +.phone-list-toolbar > div { + align-items: center; + display: flex; + gap: var(--space-2); +} + +.phone-list-table { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: hidden; +} + +.phone-list-table .ui-table-wrap { + border: 0; + box-shadow: none; +} + +.phone-list-table .ui-table tbody tr:nth-child(even) { + background: var(--color-surface-subtle); +} + +.channel-report-page { + min-width: 1100px; +} + +.channel-report-hero { + display: grid; + gap: var(--space-5); + padding: var(--space-6); +} + +.channel-report-heading { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.channel-report-heading h1 { + border-left: 5px solid var(--color-selected); + font-size: 26px; + letter-spacing: 0; + margin: 0; + padding-left: var(--space-4); +} + +.channel-report-config-actions { + display: flex; + gap: var(--space-3); + margin-left: auto; +} + +.channel-report-filter { + padding: var(--space-6); +} + +.channel-report-filter-grid { + align-items: end; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(220px, 1.3fr) repeat(2, minmax(150px, 0.75fr)) repeat(2, minmax(138px, 0.65fr)); +} + +.channel-report-filter-footer { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + justify-content: space-between; + margin-top: var(--space-5); + padding-top: var(--space-5); +} + +.channel-report-filter-footer > div { + display: flex; + gap: var(--space-3); +} + +.channel-report-table { + overflow-x: auto; + padding: 0; +} + +.channel-report-table__head, +.channel-report-row { + display: grid; + grid-template-columns: 34px minmax(220px, 1.2fr) 112px 120px 120px 130px minmax(280px, 1.35fr) 300px; + min-width: 1340px; +} + +.report-material-detail-list { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: hidden; +} + +.report-material-detail-list > div { + align-items: start; + border-bottom: 1px solid var(--color-border); + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(180px, 0.7fr) minmax(0, 1.3fr); + padding: var(--space-4); +} + +.report-material-detail-list > div:last-child { + border-bottom: 0; +} + +.report-material-detail-list > div > span { + color: var(--color-text-muted); +} + +.report-material-detail-list > div > strong { + overflow-wrap: anywhere; +} + +.report-material-detail-list > div.is-missing { + background: var(--color-danger-soft); +} + +.report-batch-toolbar { + align-items: center; + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: flex; + gap: var(--space-3); + justify-content: space-between; + padding: var(--space-4); +} + +.report-batch-progress { + display: grid; + gap: 4px 14px; + grid-template-columns: repeat(2, minmax(72px, auto)); +} + +.report-batch-progress span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.report-batch-progress strong { + color: var(--color-text-strong); + margin-left: 4px; +} + +.ui-modal__panel.report-batch-drawer { + animation: report-batch-drawer-in 180ms ease-out; + border-radius: var(--radius-lg) 0 0 var(--radius-lg); + height: 100vh; + inset: 0 0 0 auto; + max-height: none; + max-width: min(1180px, calc(100vw - 64px)); + position: absolute; + transform: none; + width: min(1080px, calc(100vw - 64px)); +} + +.ui-modal__panel.report-batch-drawer .ui-modal__body { + max-height: none; +} + +@keyframes report-batch-drawer-in { + from { + opacity: 0; + transform: translateX(32px); + } + to { + opacity: 1; + transform: translateX(0); + } +} + +.report-batch-detail-summary { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.report-batch-detail-summary span { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text-muted); + display: grid; + gap: var(--space-2); + padding: var(--space-4); +} + +.report-batch-detail-summary strong { + color: var(--color-text-strong); + font-size: var(--font-size-xl); +} + +.report-batch-briefs { + display: grid; + gap: 12px; +} + +.report-batch-briefs__title { + display: flex; + justify-content: space-between; + gap: 12px; +} + +.report-batch-briefs__title h3 { + margin: 0 0 4px; +} + +.report-batch-brief { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: 10px; + padding: 14px; +} + +.report-batch-brief header { + align-items: center; + display: flex; + justify-content: space-between; + gap: 12px; +} + +.report-batch-brief header > div { + display: grid; + gap: 2px; +} + +.report-batch-brief header span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.report-batch-brief pre { + background: var(--color-surface-subtle); + border-radius: var(--radius-sm); + font: inherit; + line-height: 1.75; + margin: 0; + overflow-wrap: anywhere; + padding: 12px; + white-space: pre-wrap; +} + +.report-material-summary { + display: grid; + gap: var(--space-1); + min-width: 260px; +} + +.report-material-summary span { + color: var(--color-text-muted); + font-size: var(--font-size-xs); + white-space: normal; +} + +@media (max-width: 760px) { + .report-batch-toolbar, + .report-material-detail-list > div { + grid-template-columns: minmax(0, 1fr); + } + .enterprise-signature-pending-summary { + align-items: flex-start; + flex-wrap: wrap; + } + .enterprise-signature-pending-summary .ui-button { + margin-left: 0; + width: 100%; + } + .report-batch-brief header { + align-items: flex-start; + flex-direction: column; + } + .report-batch-brief header .ui-button { + width: 100%; + } + .ui-modal__panel.report-batch-drawer { + border-radius: 0; + max-width: none; + width: 100%; + } + .report-batch-detail-summary { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +.channel-report-table__head { + align-items: center; + background: var(--color-surface-subtle); + border-bottom: 1px solid var(--color-border); + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); + min-height: 56px; + padding: 0 var(--space-5); +} + +.channel-report-row { + align-items: center; + border-bottom: 1px solid var(--color-border); + min-height: 132px; + padding: var(--space-5); +} + +.channel-report-row--signature { + background: var(--color-surface); +} + +.channel-report-row--drainage { + background: #fff9f5; + border-left: 4px solid var(--color-danger); + padding-left: calc(var(--space-5) - 4px); +} + +.channel-report-name { + align-items: center; + display: flex; + gap: var(--space-3); + min-width: 0; +} + +.channel-report-name > button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-text-muted); + cursor: pointer; + display: inline-flex; + justify-content: center; + padding: var(--space-1); +} + +.channel-report-name > button:disabled { + cursor: default; + opacity: 0.25; +} + +.channel-report-name > span { + display: grid; + gap: var(--space-2); + min-width: 0; +} + +.channel-report-name strong { + overflow-wrap: anywhere; +} + +.channel-report-name small { + color: var(--color-text-muted); +} + +.channel-report-name small b { + background: var(--color-accent-soft); + border-radius: 999px; + color: var(--color-selected); + display: inline-flex; + justify-content: center; + margin-left: var(--space-2); + min-width: 24px; + padding: 2px var(--space-2); +} + +.channel-report-name--flow { + padding-left: 36px; +} + +.channel-report-name--flow i { + background: var(--color-danger); + border-radius: 50%; + height: 9px; + width: 9px; +} + +.channel-report-date { + color: var(--color-text-muted); + display: grid; + gap: var(--space-1); + line-height: 1.35; +} + +.channel-report-stats { + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + grid-template-columns: repeat(4, 1fr); + min-width: 260px; + padding: var(--space-4); +} + +.channel-report-stats span { + color: var(--color-text-muted); + display: grid; + gap: var(--space-3); +} + +.channel-report-stats strong { + margin-left: var(--space-1); +} + +.channel-report-stats b { + color: var(--color-text-strong); +} + +.success-rate-text--red { + color: #dc2626 !important; +} + +.success-rate-text--orange { + color: #ea580c !important; +} + +.success-rate-text--yellow { + color: #ca8a04 !important; +} + +.success-rate-text--blue { + color: #2563eb !important; +} + +.success-rate-text--green { + color: #16a34a !important; +} + +.success-rate-text--deep-green { + color: #047857 !important; +} + +.channel-report-stats .is-success { + color: var(--color-success); +} + +.channel-report-stats .is-warning { + color: #ea580c; +} + +.channel-report-stats .is-danger { + color: var(--color-danger); +} + +.channel-report-actions { + display: grid; + gap: var(--space-3); + justify-items: start; +} + +.channel-report-actions button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + cursor: pointer; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-2); + padding: 0; +} + +.channel-report-actions button.is-warning { + color: #ea580c; +} + +.channel-report-actions button.is-danger { + color: var(--color-danger); +} + +.channel-report-detail { + display: grid; + gap: var(--space-4); +} + +.channel-report-detail > strong { + font-size: var(--font-size-xl); +} + +.channel-report-detail p { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: grid; + grid-template-columns: 150px 1fr; + margin: 0; + padding-bottom: var(--space-3); +} + +.channel-report-detail p > span:first-child { + color: var(--color-text-muted); +} + +.channel-signature-title h2, +.channel-signature-title p { + margin: 0; +} + +.channel-signature-title p { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-regular); + margin-top: var(--space-2); +} + +.channel-signature-detail { + display: grid; + gap: var(--space-8); +} + +.channel-signature-detail section { + display: grid; + gap: var(--space-5); +} + +.channel-signature-detail h3 { + border-left: 5px solid var(--color-selected); + font-size: var(--font-size-lg); + letter-spacing: 0; + margin: 0; + padding-left: var(--space-3); +} + +.channel-signature-grid { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.channel-signature-grid__wide, +.channel-signature-grid > .channel-signature-upload:first-of-type:last-child { + grid-column: 1 / -1; +} + +.channel-signature-detail input[readonly] { + background: var(--color-surface-subtle); + color: var(--color-text-strong); + cursor: default; + font-weight: var(--font-weight-medium); +} + +.channel-signature-upload { + display: grid; + gap: var(--space-2); +} + +.channel-signature-upload > span { + color: var(--color-text-strong); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); +} + +.channel-signature-upload > div { + align-items: center; + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text-muted); + display: flex; + justify-content: center; + min-height: 68px; +} + +.channel-status-title h2, +.channel-status-title p { + margin: 0; +} + +.channel-status-title p { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-regular); + margin-top: var(--space-2); +} + +.channel-status-form { + display: grid; + gap: var(--space-6); +} + +.channel-status-options { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.channel-status-options button { + background: var(--color-surface); + border: 2px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text-strong); + cursor: pointer; + font: inherit; + font-weight: var(--font-weight-semibold); + min-height: 58px; + position: relative; +} + +.channel-status-options button.is-info { + color: var(--color-selected); +} + +.channel-status-options button.is-success { + color: var(--color-success); +} + +.channel-status-options button.is-danger { + color: var(--color-danger); +} + +.channel-status-options button.is-warning { + color: #a16207; +} + +.channel-status-options button.is-selected { + border-color: var(--color-selected); + box-shadow: 0 0 0 2px var(--color-accent-soft); +} + +.channel-status-options button > span { + align-items: center; + background: var(--color-selected); + border-radius: 0 var(--radius-sm) 0 var(--radius-sm); + color: white; + display: flex; + height: 30px; + justify-content: center; + position: absolute; + right: -2px; + top: -2px; + width: 34px; +} + +.channel-export-preview { + display: flex; + gap: 8px; + overflow-x: auto; + padding: 10px; + border: 1px solid var(--border); + border-radius: 10px; + background: var(--surface-muted); +} + +.channel-export-preview span { + flex: 0 0 auto; + padding: 5px 9px; + border-radius: 6px; + background: var(--surface); + font-size: 12px; +} + +.channel-field-mapping-grid, +.report-import-basic-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.report-import-basic-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.report-import-file { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin: 16px 0; + padding: 14px 16px; + border: 1px dashed var(--primary); + border-radius: 10px; + background: color-mix(in srgb, var(--primary) 5%, var(--surface)); +} + +.report-import-file span { + display: flex; + align-items: center; + gap: 9px; +} + +.report-import-file input { + max-width: 310px; +} + +.report-import-analysis-progress { + display: grid; + gap: 8px; + padding: 12px; + border: 1px solid var(--border); + border-radius: 10px; + background: var(--surface-muted); +} + +.report-import-analysis-progress > div:first-child { + display: flex; + justify-content: space-between; + gap: 12px; +} + +.report-import-analysis-progress small { + color: var(--text-muted); +} + +.report-import-mapping { + display: grid; + gap: 12px; +} + +.report-import-mapping-table { + overflow-x: auto; + border: 1px solid var(--border); + border-radius: 10px; +} + +.report-import-mapping-head, +.report-import-mapping-row { + display: grid; + grid-template-columns: minmax(180px, 1.2fr) minmax(220px, 1.5fr) 110px 100px 130px; + gap: 10px; + align-items: center; + min-width: 820px; + padding: 10px 12px; +} + +.report-import-mapping-head { + background: var(--surface-muted); + color: var(--text-muted); + font-size: 12px; + font-weight: 700; +} + +.report-import-mapping-row { + border-top: 1px solid var(--border); +} + +.report-import-mapping-row > span { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 5px; +} + +.report-import-mapping-row small { + width: 100%; + color: var(--text-muted); +} + +.report-import-profile { + display: flex; + align-items: end; + gap: 12px; +} + +.report-import-profile__toggle { + min-width: 238px; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08); +} + +.report-import-profile__toggle[aria-pressed='true'] { + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12); +} + +.report-import-profile .field { + min-width: 320px; +} + +.report-import-preview pre { + max-height: 240px; + overflow: auto; + padding: 12px; + background: #111827; + color: #d1fae5; + border-radius: 8px; + font-size: 11px; +} + +.report-material-filter { + align-items: end; + display: grid; + gap: 12px; +} + +.report-material-filter--pending { + grid-template-columns: 160px minmax(200px, 260px) minmax(320px, 1fr) auto; +} + +.report-material-filter--batches { + grid-template-columns: minmax(220px, 260px) 300px auto; + justify-content: start; +} + +.report-material-pool { + overflow: hidden; + padding: 0; +} + +.report-material-table-head, +.report-material-row { + display: grid; + grid-template-columns: 28px minmax(260px, 1.5fr) minmax(180px, 1fr) 90px 160px; + gap: 12px; + align-items: center; + padding: 12px 16px; +} + +.report-material-table-head { + background: var(--surface-muted); + color: var(--text-muted); + font-size: 12px; + font-weight: 700; +} + +.report-material-row { + border-top: 1px solid var(--border); + cursor: pointer; +} + +.report-material-row:hover { + background: color-mix(in srgb, var(--primary) 3%, var(--surface)); +} + +.report-material-row.is-disabled { + cursor: not-allowed; + opacity: 0.72; +} + +.report-material-row.is-disabled:hover { + background: var(--surface); +} + +.report-material-row > span { + display: grid; + gap: 3px; +} + +.report-material-row small, +.report-material-row em { + color: var(--text-muted); + font-size: 12px; + font-style: normal; +} + +.report-material-batches { + display: grid; + gap: 0; +} + +.report-material-batches article { + display: flex; + justify-content: space-between; + gap: 24px; + padding: 14px 0; + border-top: 1px solid var(--border); +} + +.report-material-batches article > div { + display: flex; + flex-wrap: wrap; + gap: 8px 14px; + align-items: center; +} + +.report-material-batches article small { + width: 100%; + color: var(--text-muted); +} + +.report-material-batches article a { + display: inline-flex; + align-items: center; + gap: 5px; + color: var(--primary); +} + +.report-batch-preflight { + display: grid; + gap: 16px; +} + +.report-batch-summary { + display: flex; + flex-wrap: wrap; + gap: 12px; +} + +.report-batch-summary span { + display: inline-flex; + align-items: center; + gap: 7px; + padding: 9px 12px; + border-radius: 8px; + background: var(--surface-muted); + font-weight: 700; +} + +.report-batch-preflight article { + display: grid; + gap: 10px; + padding: 14px; + border: 1px solid var(--border); + border-radius: 10px; +} + +.report-batch-preflight article > div { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 8px; +} + +.report-batch-preflight article small { + color: var(--text-muted); +} + +.report-batch-preflight ul { + display: grid; + gap: 8px; + margin: 0; + padding: 0; + list-style: none; +} + +.report-batch-preflight li { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 8px; + padding: 9px 10px; + border-radius: 8px; + background: var(--surface-muted); +} + +.report-batch-preflight li.is-eligible { + border-left: 3px solid var(--success); +} + +.report-batch-preflight li.is-blocked { + border-left: 3px solid var(--warning); +} + +@media (max-width: 980px) { + .channel-field-mapping-grid, + .report-import-basic-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .report-material-filter--pending, + .report-material-filter--batches { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .report-material-filter .ui-query-actions { + grid-column: 1 / -1; + } + .report-material-table-head, + .report-material-row { + grid-template-columns: 28px minmax(220px, 1.5fr) minmax(160px, 1fr); + } + .report-material-table-head > :nth-child(n + 4), + .report-material-row > :nth-child(n + 4) { + display: none; + } +} + +.channel-field-pool { + border-right: 1px solid var(--color-border); +} + +.channel-field-pool-list, +.channel-selected-field-list { + display: grid; + gap: var(--space-3); + margin-top: var(--space-4); + max-height: 520px; + overflow-y: auto; + padding-right: var(--space-2); +} + +.channel-field-pool-list { + align-content: start; + grid-auto-rows: 68px; +} + +.channel-field-pool-list > button { + align-items: center; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text-strong); + cursor: pointer; + display: flex; + justify-content: space-between; + box-sizing: border-box; + height: 68px; + max-height: 68px; + min-height: 68px; + padding: var(--space-3) var(--space-4); + text-align: left; +} + +.channel-remove-field-button { + justify-self: start; + width: auto; +} + +.report-material-image-value { + align-items: flex-start; + display: flex; + flex-direction: column; + gap: var(--space-2); +} + +.report-material-image-value img { + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + max-height: 180px; + max-width: min(100%, 280px); + object-fit: contain; +} + +.report-export-format-options { + display: grid; + gap: var(--space-3); +} + +.report-export-format-options button { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text); + display: grid; + gap: var(--space-2); + padding: var(--space-4); + text-align: left; +} + +.report-export-format-options button[aria-checked='true'] { + background: var(--color-accent-soft); + border-color: var(--color-selected); +} + +.report-export-format-options span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.channel-field-pool-list > button:hover { + background: var(--color-accent-soft); + border-color: var(--color-selected); +} + +.channel-field-pool-list > button > span { + align-items: center; + display: inline-flex; + gap: var(--space-2); +} + +.channel-field-pool-list > button > span:last-child { + color: var(--color-selected); + font-size: var(--font-size-sm); +} + +.channel-selected-fields { + background: var(--color-surface-subtle); + grid-template-rows: auto minmax(0, 1fr) !important; +} + +.channel-selected-field-list article { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + padding: var(--space-4); +} + +.channel-selected-field-head { + align-items: center; + display: flex; + gap: var(--space-2); +} diff --git a/src/styles/domains/09-channels.css b/src/styles/domains/09-channels.css new file mode 100644 index 0000000..fba730f --- /dev/null +++ b/src/styles/domains/09-channels.css @@ -0,0 +1,491 @@ +/* Owner: channel metrics, groups and routing. Extracted from global.css with original cascade order preserved. */ +.channel-selected-field-index { + align-items: center; + background: var(--color-selected); + border-radius: var(--radius-sm); + color: white; + display: inline-flex; + height: 30px; + justify-content: center; + width: 30px; +} + +.channel-selected-field-order { + display: flex; + margin-left: auto; +} + +.channel-selected-field-order button, +.channel-selected-field-controls > button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-text-muted); + cursor: pointer; + display: inline-flex; + justify-content: center; + padding: var(--space-1); +} + +.channel-selected-field-order button:disabled { + cursor: default; + opacity: 0.3; +} + +.channel-selected-field-controls { + align-items: center; + display: flex; + gap: var(--space-4); +} + +.channel-selected-field-controls label { + align-items: center; + cursor: pointer; + display: inline-flex; + gap: var(--space-2); +} + +.channel-selected-field-controls > button { + color: var(--color-danger); + margin-left: auto; +} + +.mms-channel-page .page-heading { + align-items: center; +} + +.mms-channel-filter { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(260px, 1fr) 180px 180px auto; + padding: var(--space-5); +} + +.mms-channel-list { + overflow: hidden; + padding: 0; +} + +.mms-channel-list .ui-table-wrap { + border: 0; + border-radius: 0; + box-shadow: none; +} + +.mms-channel-list .ui-table { + min-width: 900px; +} + +.mms-channel-list .ui-table th, +.mms-channel-list .ui-table td { + padding: var(--space-4); + vertical-align: middle; +} + +.mms-channel-list .ui-table tbody tr:nth-child(even) { + background: var(--color-surface-subtle); +} + +.mms-channel-identity { + display: grid; + gap: var(--space-1); + min-width: 0; +} + +.mms-channel-identity span, +.mms-channel-identity small { + color: var(--color-text-muted); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.mms-channel-identity small { + font-size: var(--font-size-xs); +} + +.mms-channel-carrier { + align-items: flex-start; + display: grid; + gap: var(--space-2); + justify-items: start; +} + +.mms-channel-quality { + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + padding: var(--space-3); +} + +.mms-channel-metric { + display: grid; + gap: 3px; +} + +.mms-channel-metric small { + color: var(--color-text-muted); +} + +.mms-channel-metric strong { + color: var(--color-text-strong); +} + +.mms-channel-metric--success strong { + color: var(--color-success); +} + +.mms-channel-metric--warning strong { + color: #ea580c; +} + +.mms-channel-metric--danger strong { + color: var(--color-danger); +} + +.mms-channel-actions { + display: flex; + gap: var(--space-2); + justify-content: flex-end; +} + +.mms-channel-modal-title h2, +.mms-channel-modal-title p { + margin: 0; +} + +.mms-channel-modal-title p { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-regular); + margin-top: var(--space-2); +} + +.mms-channel-form { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.mms-channel-form__wide { + grid-column: 1 / -1; +} + +.sms-channel-group-page .page-heading { + align-items: center; +} + +.channel-group-filter { + align-items: end; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) auto; +} + +.channel-group-filter__actions { + display: flex; + gap: var(--space-3); +} + +.channel-group-list { + display: grid; + gap: var(--space-5); +} + +.channel-group-config-list { + display: grid; + gap: var(--space-3); +} + +.channel-group-config-item { + align-items: center; + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(180px, 1.15fr) minmax(210px, 0.9fr) minmax(200px, 0.95fr) minmax(220px, 1.2fr) minmax( + 82px, + auto + ); + min-width: 0; + padding: var(--space-4); +} + +.channel-group-config-item__identity { + align-items: center; + display: flex; + gap: var(--space-3); + min-width: 0; +} + +.channel-group-config-item__icon { + align-items: center; + background: #eef5ff; + border: 1px solid #cfe2ff; + border-radius: var(--radius-sm); + color: var(--color-selected); + display: inline-flex; + flex: 0 0 auto; + height: 38px; + justify-content: center; + width: 38px; +} + +.channel-group-config-item__identity div { + display: grid; + gap: var(--space-1); + min-width: 0; +} + +.channel-group-config-item__identity strong { + color: var(--color-text-strong); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.channel-group-config-item__identity span:last-child, +.channel-group-config-item__metrics span, +.channel-group-config-item__policy span, +.channel-group-config-item__channels span { + color: var(--color-text-muted); +} + +.channel-group-config-item__metrics { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(3, minmax(0, 1fr)); + min-width: 0; +} + +.channel-group-config-item__metrics div { + border-left: 1px solid var(--color-border); + display: grid; + gap: var(--space-1); + padding-left: var(--space-3); +} + +.channel-group-config-item__metrics strong { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.channel-group-config-item__policy { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-3); + min-width: 0; +} + +.channel-group-config-item__policy span { + align-items: center; + display: inline-flex; + gap: var(--space-1); + white-space: nowrap; +} + +.channel-group-config-item__channels { + display: flex; + flex-wrap: wrap; + gap: var(--space-2); + min-width: 0; +} + +.channel-group-config-item__channels span { + background: var(--color-surface-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + max-width: 160px; + overflow: hidden; + padding: var(--space-1) var(--space-2); + text-overflow: ellipsis; + white-space: nowrap; +} + +.channel-group-config-item__actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-3); + justify-content: flex-end; + justify-self: end; + min-width: 82px; +} + +.channel-group-config-item__actions button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + cursor: pointer; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-1); + padding: 0; +} + +.channel-group-config-item__actions button.is-danger { + color: var(--color-danger); +} + +.channel-group-form-page { + min-width: 1040px; +} + +.channel-group-form-section { + display: grid; + gap: var(--space-5); +} + +.channel-group-form-section h2 { + border-bottom: 1px solid var(--color-border); + border-left: 5px solid var(--color-selected); + margin: 0; + padding: 0 0 var(--space-4) var(--space-3); +} + +.channel-group-base-form { + display: grid; + gap: var(--space-6); + grid-template-columns: 190px minmax(0, 1fr); +} + +.channel-group-base-form > .ui-field, +.channel-group-retry-limit, +.channel-group-radio-row, +.channel-group-switch-row { + grid-column: 2; +} + +.channel-group-radio-row, +.channel-group-switch-row { + align-items: center; + display: flex; + gap: var(--space-7); + min-height: 42px; +} + +.channel-group-radio-row > span, +.channel-group-switch-row > span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.channel-group-radio-row label { + align-items: center; + display: inline-flex; + gap: var(--space-2); +} + +.channel-group-switch-row button { + background: #d1d5db; + border: 0; + border-radius: 999px; + cursor: pointer; + height: 30px; + padding: 3px; + transition: background 0.18s ease; + width: 54px; +} + +.channel-group-switch-row button i { + background: #fff; + border-radius: 50%; + box-shadow: var(--shadow-sm); + display: block; + height: 24px; + transition: transform 0.18s ease; + width: 24px; +} + +.channel-group-switch-row button.is-on { + background: var(--color-selected); +} + +.channel-group-switch-row button.is-on i { + transform: translateX(24px); +} + +.channel-group-row-actions { + display: flex; + gap: var(--space-4); +} + +.channel-group-row-actions button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + cursor: pointer; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-1); + padding: 0; +} + +.channel-group-row-actions button.is-danger { + color: var(--color-danger); +} + +.channel-group-retry-limit { + display: grid; + gap: var(--space-3); + grid-template-columns: 150px 150px minmax(220px, 1fr); +} + +.channel-group-retry-limit > span { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); + grid-column: 1 / -1; +} + +.channel-group-retry-limit small { + align-self: center; + color: var(--color-text-muted); +} + +.channel-route-card-grid { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(3, minmax(220px, 1fr)); +} + +.channel-route-card { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-3); + min-height: 188px; + padding: var(--space-4); +} + +.channel-route-card > div { + align-items: flex-start; + display: flex; + gap: var(--space-3); + justify-content: space-between; +} + +.channel-route-card strong { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.channel-route-card span, +.channel-route-card small { + color: var(--color-text-muted); +} + +.channel-route-card p { + color: var(--color-text); + font-weight: var(--font-weight-semibold); + line-height: 1.5; + margin: 0; + overflow-wrap: anywhere; +} diff --git a/src/styles/domains/10-signature-quality.css b/src/styles/domains/10-signature-quality.css new file mode 100644 index 0000000..2d873ab --- /dev/null +++ b/src/styles/domains/10-signature-quality.css @@ -0,0 +1,774 @@ +/* Owner: signature retirement and quality matrix. Extracted from global.css with original cascade order preserved. */ +.channel-route-card footer { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--space-3); + justify-content: flex-end; + margin-top: var(--space-1); + padding-top: var(--space-3); +} + +.channel-route-card footer button { + align-items: center; + background: transparent; + border: 0; + color: var(--color-selected); + cursor: pointer; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-1); + padding: 0; +} + +.channel-route-card footer button.is-danger { + color: var(--color-danger); +} + +.channel-route-empty { + align-items: center; + background: var(--color-surface-subtle); + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-md); + color: var(--color-text-muted); + display: flex; + justify-content: center; + min-height: 120px; + padding: var(--space-5); +} + +.channel-route-modal { + display: grid; + gap: var(--space-5); + grid-template-columns: repeat(2, minmax(0, 1fr)); + min-width: 0; +} + +.channel-route-modal__channel-select { + grid-column: 1 / -1; +} + +.channel-route-modal .ui-select__dropdown { + max-height: min(360px, calc(100vh - 360px)); +} + +.channel-route-modal .ui-select__dropdown button { + align-items: flex-start; + height: auto; + line-height: 1.45; + min-height: 42px; + padding: var(--space-2) var(--space-3); + white-space: normal; +} + +.channel-route-modal__note { + align-items: center; + background: #eff6ff; + border: 1px solid #bfdbfe; + border-radius: var(--radius-md); + color: var(--color-text); + display: flex; + gap: var(--space-3); + padding: var(--space-4); +} + +.channel-route-modal__note svg { + color: var(--color-selected); + flex: 0 0 auto; +} + +.channel-group-form-footer { + align-items: center; + display: flex; + gap: var(--space-4); + justify-content: center; + padding: var(--space-4) 0; +} + +.channel-group-form-footer .ui-button { + min-width: 160px; +} + +.recovery-status-explainer { + align-items: flex-start; + display: flex; + gap: var(--space-3); +} + +.recovery-status-explainer > svg { + color: var(--color-primary); + flex: 0 0 auto; + margin-top: 2px; +} + +.recovery-status-explainer strong { + color: var(--color-text-strong); +} + +.recovery-status-explainer p { + color: var(--color-text-muted); + line-height: 1.7; + margin: var(--space-1) 0 0; +} + +.signature-quality-card { + overflow: hidden; +} + +.login-return-link { + color: var(--color-text-strong); + font-size: 14px; + font-weight: 600; + justify-self: center; + text-decoration: none; +} + +.login-return-link:hover { + color: var(--color-selected); + text-decoration: underline; +} + +.signature-retirement-heatmap { + padding: var(--space-5); +} + +.signature-retirement-heatmap__heading, +.signature-retirement-heatmap__actions { + align-items: center; +} + +.signature-retirement-heatmap__actions { + display: flex; + gap: var(--space-3); +} + +.signature-retirement-heatmap__actions .ui-field { + min-width: 280px; +} + +.signature-retirement-heatmap__scroll { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + overflow: auto; +} + +.signature-retirement-heatmap table { + border-collapse: collapse; + min-width: 100%; + white-space: nowrap; +} + +.signature-retirement-heatmap th, +.signature-retirement-heatmap td { + border-bottom: 1px solid var(--color-border); + border-right: 1px solid var(--color-border); + font-size: 12px; + min-width: 48px; + padding: 8px; + text-align: center; +} + +.signature-retirement-heatmap th:first-child { + background: var(--color-surface); + left: 0; + min-width: 280px; + position: sticky; + text-align: left; + z-index: 1; +} + +.signature-retirement-heatmap tbody th { + align-items: center; + display: flex; + gap: var(--space-2); + justify-content: space-between; +} + +.signature-retirement-heatmap__identity { + display: grid; + gap: 2px; + min-width: 0; + text-align: left; +} + +.signature-retirement-heatmap__identity strong { + color: var(--color-text-strong); + cursor: help; + overflow: hidden; + text-overflow: ellipsis; +} + +.signature-retirement-heatmap__identity small { + color: var(--color-text-muted); + font-weight: 400; + overflow: hidden; + text-overflow: ellipsis; +} + +.signature-retirement-heatmap td.is-zero { + background: #f3f4f6; + color: var(--color-text-muted); + font-weight: 700; +} + +.signature-retirement-heatmap td.is-inapplicable { + background: repeating-linear-gradient(135deg, #f8fafc, #f8fafc 4px, #eef2f7 4px, #eef2f7 8px); + color: var(--color-text-muted); +} + +.signature-retirement-heatmap td.is-rate-red { + background: #fee2e2; + color: #dc2626; + font-weight: 700; +} + +.signature-retirement-heatmap td.is-rate-orange { + background: #ffedd5; + color: #ea580c; + font-weight: 700; +} + +.signature-retirement-heatmap td.is-rate-yellow { + background: #fef9c3; + color: #ca8a04; + font-weight: 700; +} + +.signature-retirement-heatmap td.is-rate-blue { + background: #dbeafe; + color: #2563eb; + font-weight: 700; +} + +.signature-retirement-heatmap td.is-rate-green { + background: #dcfce7; + color: #16a34a; + font-weight: 700; +} + +.signature-retirement-heatmap td.is-rate-deep-green { + background: #d1fae5; + color: #047857; + font-weight: 700; +} + +.ui-table__long-text { + display: block; + line-height: 1.55; + overflow-wrap: anywhere; + white-space: normal; + word-break: normal; +} + +.signature-retirement-message-card { + overflow: hidden; +} + +.signature-retirement-message-filter { + align-items: end; + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(4, minmax(180px, 1fr)); + margin-bottom: var(--space-4); +} + +.signature-retirement-message-filter__actions { + display: flex; + gap: var(--space-2); +} + +.signature-retirement-suppression-modes { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.signature-retirement-suppression-modes label { + align-items: flex-start; + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + cursor: pointer; + display: flex; + gap: var(--space-3); + padding: var(--space-4); +} + +.signature-retirement-suppression-modes label.is-selected { + background: var(--color-selected-soft); + border-color: var(--color-selected); +} + +.signature-retirement-suppression-modes input { + margin-top: 3px; +} + +.signature-retirement-suppression-modes span { + display: grid; + gap: 4px; +} + +.signature-retirement-suppression-modes small { + color: var(--color-text-muted); +} + +.signature-quality-card__heading { + align-items: flex-start; + display: flex; + gap: var(--space-5); + justify-content: space-between; + padding: var(--space-5); +} + +.signature-quality-card__heading h2, +.signature-quality-section h3 { + margin: 0; +} + +.signature-quality-card__heading p, +.signature-quality-section__heading p { + margin: var(--space-1) 0 0; +} + +.section-heading__title { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-2); +} + +.signature-quality-card__query { + align-items: flex-end; + display: flex; + flex: 0 1 390px; + gap: var(--space-2); +} + +.signature-quality-card__query .ui-field { + flex: 1; +} + +.signature-quality-card__note { + background: color-mix(in srgb, var(--color-primary) 6%, white); + border-bottom: 1px solid var(--color-border); + border-top: 1px solid var(--color-border); + color: var(--color-text-muted); + font-size: 13px; + line-height: 1.6; + padding: 10px var(--space-5); +} + +.signature-quality-card .ui-table-wrap { + border: 0; + border-radius: 0; +} + +.signature-quality-card > .ui-pagination { + border-top: 1px solid var(--color-border); + padding: var(--space-4) var(--space-5); +} + +.signature-quality-name { + display: grid; + gap: 3px; +} + +.signature-quality-name strong { + color: var(--color-text-strong); +} + +.signature-quality-name span, +.signature-quality-name small { + color: var(--color-text-muted); +} + +.quality-number--success { + color: var(--color-success); +} + +.quality-number--warning { + color: var(--color-warning); +} + +.quality-number--danger { + color: var(--color-danger); +} + +.signature-quality-rate { + align-items: center; + display: flex; + gap: var(--space-2); +} + +.signature-quality-rate > div { + background: var(--color-surface-muted); + border-radius: 99px; + flex: 1; + height: 6px; + overflow: hidden; +} + +.signature-quality-rate > div span { + background: var(--color-success); + border-radius: inherit; + display: block; + height: 100%; +} + +.signature-quality-rate strong { + min-width: 50px; + text-align: right; +} + +.signature-quality-drawer__backdrop { + background: rgb(15 23 42 / 42%); + inset: 0; + position: fixed; + z-index: 1200; +} + +.signature-quality-drawer { + animation: signature-quality-drawer-in 180ms ease-out; + background: var(--color-bg); + box-shadow: -18px 0 48px rgb(15 23 42 / 18%); + display: flex; + flex-direction: column; + height: 100%; + margin-left: auto; + max-width: min(1120px, calc(100vw - 72px)); + width: 88vw; +} + +@keyframes signature-quality-drawer-in { + from { + opacity: 0; + transform: translateX(28px); + } + + to { + opacity: 1; + transform: translateX(0); + } +} + +.signature-quality-drawer__header { + align-items: flex-start; + background: var(--color-surface); + border-bottom: 1px solid var(--color-border); + display: flex; + gap: var(--space-5); + justify-content: space-between; + padding: var(--space-5) var(--space-6); +} + +.signature-quality-drawer__header p { + color: var(--color-primary); + font-size: 13px; + margin: 0 0 var(--space-2); +} + +.signature-quality-drawer__header h2 { + margin: 0; +} + +.signature-quality-drawer__header span { + color: var(--color-text-muted); + display: block; + margin-top: var(--space-2); +} + +.signature-quality-drawer__header > button { + align-items: center; + background: transparent; + border: 0; + border-radius: var(--radius-md); + color: var(--color-text-muted); + cursor: pointer; + display: inline-flex; + justify-content: center; + padding: var(--space-2); +} + +.signature-quality-drawer__header > button:hover { + background: var(--color-surface-muted); + color: var(--color-text-strong); +} + +.signature-quality-drawer__body { + display: grid; + gap: var(--space-5); + overflow: auto; + padding: var(--space-5) var(--space-6) var(--space-7); +} + +.signature-quality-overview { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(4, minmax(0, 1fr)); + min-width: 0; +} + +.signature-quality-metric { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-2); + padding: var(--space-4); +} + +.signature-quality-metric span { + color: var(--color-text-muted); + font-size: 13px; +} + +.signature-quality-metric strong { + color: var(--color-text-strong); + font-size: 24px; +} + +.signature-quality-metric--success strong { + color: var(--color-success); +} + +.signature-quality-metric--warning strong { + color: var(--color-warning); +} + +.signature-quality-metric--danger strong { + color: var(--color-danger); +} + +.signature-quality-section { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + min-width: 0; + padding: var(--space-5); +} + +.signature-quality-section__heading { + margin-bottom: var(--space-4); +} + +.signature-quality-section__heading p { + color: var(--color-text-muted); + font-size: 13px; +} + +.signature-carrier-grid { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.signature-carrier-card { + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: var(--space-4); +} + +.signature-carrier-card > div { + align-items: center; + display: flex; + justify-content: space-between; +} + +.signature-carrier-card > div strong { + color: var(--color-text-strong); +} + +.signature-carrier-card dl { + display: grid; + gap: var(--space-2); + margin: var(--space-4) 0 0; +} + +.signature-carrier-card dl div { + align-items: center; + display: flex; + justify-content: space-between; +} + +.signature-carrier-card dt { + color: var(--color-text-muted); +} + +.signature-carrier-card dd { + color: var(--color-text-strong); + font-weight: 600; + margin: 0; +} + +.signature-quality-matrix { + background: var(--color-surface-muted); + border: 1px solid color-mix(in srgb, var(--color-border) 80%, var(--color-primary)); + border-radius: var(--radius-lg); + max-width: 100%; + overflow: auto; + width: 100%; +} + +.signature-quality-matrix table { + border-collapse: collapse; + min-width: 760px; + width: 100%; +} + +.signature-quality-matrix th, +.signature-quality-matrix td { + border-bottom: 1px solid var(--color-border); + border-right: 1px solid var(--color-border); + padding: 10px; + text-align: left; + vertical-align: top; +} + +.signature-quality-matrix th:last-child, +.signature-quality-matrix td:last-child { + border-right: 0; +} + +.signature-quality-matrix tr:last-child th, +.signature-quality-matrix tr:last-child td { + border-bottom: 0; +} + +.signature-quality-matrix thead th { + background: color-mix(in srgb, var(--color-primary) 6%, var(--color-surface)); + color: var(--color-text-muted); + font-size: 13px; + position: sticky; + top: 0; + z-index: 2; +} + +.signature-quality-matrix tbody th { + background: var(--color-surface); + color: var(--color-text-strong); + min-width: 210px; + position: sticky; + left: 0; + z-index: 1; +} + +.signature-quality-matrix__metric { + background: var(--color-surface); + border-left: 3px solid var(--color-border); + border-radius: var(--radius-sm); + display: grid; + gap: 7px; + min-width: 150px; + padding: 10px 12px; +} + +.signature-quality-matrix__metric--success { + border-left-color: var(--color-success); +} + +.signature-quality-matrix__metric--warning { + border-left-color: var(--color-warning); +} + +.signature-quality-matrix__metric--danger { + border-left-color: var(--color-danger); +} + +.signature-quality-matrix__metric > div { + align-items: center; + display: flex; + gap: var(--space-2); + justify-content: space-between; +} + +.signature-quality-matrix__metric strong { + color: var(--color-text-strong); +} + +.signature-quality-matrix__metric small { + color: var(--color-text-muted); + font-size: 12px; +} + +.signature-quality-matrix__metric em { + color: var(--color-warning); + font-size: 12px; + font-style: normal; +} + +.signature-quality-matrix__drainage-label { + color: var(--color-text-muted); + font-size: 13px; + min-width: 88px; +} + +.signature-quality-matrix__rate { + font-weight: 600; +} + +.signature-quality-matrix__empty { + color: var(--color-text-subtle); +} + +.signature-quality-matrix__zero { + color: var(--color-text-strong); + font-weight: 600; +} + +.signature-quality-drawer__footnote { + color: var(--color-text-muted); + font-size: 13px; + line-height: 1.7; + margin: 0; +} + +@media (max-width: 900px) { + .signature-retirement-message-filter, + .signature-retirement-suppression-modes { + grid-template-columns: 1fr; + } + + .signature-retirement-heatmap__heading, + .signature-retirement-heatmap__actions { + align-items: stretch; + flex-direction: column; + } + + .signature-retirement-heatmap__actions .ui-field { + min-width: 0; + width: 100%; + } + + .signature-quality-card__heading, + .signature-quality-card__query { + align-items: stretch; + flex-direction: column; + } + + .signature-quality-card__query { + flex-basis: auto; + width: 100%; + } + + .signature-quality-drawer { + max-width: none; + width: 100%; + } + + .signature-quality-overview, + .signature-carrier-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 600px) { + .signature-quality-drawer__header, + .signature-quality-drawer__body { + padding-left: var(--space-4); + padding-right: var(--space-4); + } + + .signature-quality-overview, + .signature-carrier-grid { + grid-template-columns: 1fr; + } +} diff --git a/src/styles/domains/11-deliveries-reporting.css b/src/styles/domains/11-deliveries-reporting.css new file mode 100644 index 0000000..a111a28 --- /dev/null +++ b/src/styles/domains/11-deliveries-reporting.css @@ -0,0 +1,541 @@ +/* Owner: downstream delivery, report tasks and MMS operations. Extracted from global.css with original cascade order preserved. */ +.downstream-delivery-toolbar { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: flex; + gap: var(--space-4); + justify-content: space-between; + padding: var(--space-4) var(--space-5); +} + +.downstream-delivery-toolbar p { + color: var(--color-text-muted); + line-height: 1.6; + margin: 0; +} + +.downstream-delivery-toolbar p strong { + color: var(--color-text-strong); +} + +.downstream-requeue-confirm, +.downstream-requeue-result { + align-items: flex-start; + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: flex; + gap: var(--space-3); + padding: var(--space-4); +} + +.downstream-requeue-confirm { + background: #fffbeb; + border-color: #fde68a; + color: #92400e; +} + +.downstream-requeue-confirm > div, +.downstream-requeue-result > div { + display: grid; + gap: var(--space-2); + min-width: 0; +} + +.downstream-requeue-confirm p, +.downstream-requeue-confirm small, +.downstream-requeue-confirm strong, +.downstream-requeue-result p, +.downstream-requeue-result small { + margin: 0; +} + +.downstream-requeue-confirm strong { + line-height: 1.6; +} + +.downstream-requeue-result--success { + background: #f0fdf4; + border-color: #bbf7d0; + color: #166534; +} + +.downstream-requeue-result--partial { + background: #fffbeb; + border-color: #fde68a; + color: #92400e; +} + +.downstream-requeue-result--failed { + background: #fef2f2; + border-color: #fecaca; + color: #991b1b; +} + +.downstream-requeue-result p, +.downstream-requeue-result li { + line-height: 1.6; + overflow-wrap: anywhere; +} + +.downstream-requeue-result ul { + margin: 0; + max-height: 180px; + overflow: auto; + padding-left: var(--space-5); +} + +.downstream-delivery-toolbar > div, +.downstream-delivery-list__actions { + align-items: center; + display: flex; + flex-shrink: 0; + gap: var(--space-2); +} + +.downstream-delivery-list { + overflow-x: auto; +} + +.downstream-delivery-list__header, +.downstream-delivery-list__row { + align-items: center; + display: grid; + gap: var(--space-3); + grid-template-columns: 36px 140px minmax(150px, 1fr) minmax(165px, 1.05fr) 126px 54px minmax(170px, 1.2fr) 136px; + min-width: 1080px; + padding: var(--space-4); +} + +.downstream-delivery-list__header { + background: var(--color-bg-subtle); + color: var(--color-text-muted); + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); +} + +.downstream-delivery-list__row { + border-top: 1px solid var(--color-border); + min-height: 104px; +} + +.downstream-delivery-list__row:first-of-type { + border-top: 0; +} + +.downstream-delivery-list__row:hover { + background: color-mix(in srgb, var(--color-selected-soft) 28%, transparent); +} + +.downstream-delivery-list__select, +.downstream-delivery-list__retry { + text-align: center; +} + +.downstream-delivery-list__meta, +.downstream-delivery-list__owner, +.downstream-delivery-list__retry { + display: grid; + gap: 6px; +} + +.downstream-delivery-list__meta strong, +.downstream-delivery-list__owner strong, +.downstream-delivery-list__retry strong { + color: var(--color-text-strong); +} + +.downstream-delivery-list__meta span, +.downstream-delivery-list__owner span, +.downstream-delivery-list__retry span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.downstream-delivery-list__message strong { + color: var(--color-text-strong); + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; + font-size: var(--font-size-sm); + overflow-wrap: anywhere; +} + +.downstream-delivery-list__error { + background: #fff7ed; + border: 1px solid #fed7aa; + border-radius: var(--radius-md); + color: #9a3412; + display: -webkit-box; + line-height: 1.55; + overflow: hidden; + padding: var(--space-3); + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.downstream-delivery-list__error.is-empty { + background: var(--color-bg-subtle); + border-color: var(--color-border); + color: var(--color-text-subtle); +} + +.downstream-delivery-list__actions { + justify-content: flex-end; +} + +.downstream-delivery-list__empty { + color: var(--color-text-muted); + padding: 48px var(--space-5); + text-align: center; +} + +@media (max-width: 760px) { + .downstream-delivery-toolbar { + align-items: stretch; + flex-direction: column; + } + + .downstream-delivery-toolbar > div { + justify-content: flex-end; + } +} + +.report-page-actions { + align-items: center; + display: flex; + flex-wrap: wrap; + gap: var(--space-3); +} + +.report-task-time { + color: var(--color-text-muted); + display: grid; + font-size: var(--font-size-xs); + gap: 4px; + line-height: 1.45; +} + +.report-task-time span { + white-space: nowrap; +} + +.admin-remark-cell { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + color: var(--color-text); + display: -webkit-box; + line-height: 1.6; + max-width: 360px; + min-width: 220px; + overflow: hidden; + padding: var(--space-3); + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.admin-remark-cell--empty { + color: var(--color-text-subtle); +} + +.report-task-generate { + display: grid; + gap: var(--space-5); +} + +.report-task-generate section, +.report-task-detail .admin-task-card { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: var(--space-5); +} + +.report-task-generate h3, +.report-receipt-preview h3 { + color: var(--color-text-strong); + font-size: var(--font-size-md); + font-weight: 700; + margin: 0 0 var(--space-4); +} + +.report-task-preview { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.report-task-preview > div, +.report-receipt-preview > div { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + padding: var(--space-4); +} + +.report-task-preview span, +.report-receipt-preview span { + color: var(--color-text-muted); + display: block; + font-size: var(--font-size-xs); + margin-bottom: var(--space-2); +} + +.report-task-preview strong, +.report-receipt-preview strong { + color: var(--color-text-strong); + font-size: var(--font-size-xl); +} + +.report-receipt-modal { + align-items: start; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(260px, 0.9fr) minmax(320px, 1.1fr); +} + +.report-receipt-modal .ui-field { + grid-column: 1 / -1; +} + +.report-upload-drop { + align-content: center; + background: var(--color-bg-subtle); + border: 1px dashed var(--color-border-strong); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-2); + min-height: 180px; + padding: var(--space-6); + place-items: center; + text-align: center; +} + +.report-upload-drop svg { + color: var(--color-primary); +} + +.report-upload-drop strong { + color: var(--color-text-strong); + font-size: var(--font-size-md); +} + +.report-upload-drop span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + line-height: 1.5; +} + +.report-receipt-preview { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: grid; + gap: var(--space-3); + padding: var(--space-5); +} + +.admin-app-route-card > .ui-field { + max-width: 100%; + min-width: 0; + width: 100%; +} + +.downstream-attempt-timeline { + border-top: 0 !important; + display: grid !important; + gap: var(--space-4) !important; + grid-template-columns: 1fr !important; + padding: var(--space-2) 0 0 !important; + position: relative; +} + +.downstream-attempt-timeline::before { + background: var(--color-border); + bottom: 24px; + content: ''; + left: 19px; + position: absolute; + top: 28px; + width: 2px; +} + +.downstream-attempt-card { + align-items: start; + display: grid; + gap: var(--space-4); + grid-template-columns: 40px minmax(0, 1fr); + position: relative; +} + +.downstream-attempt-marker { + align-items: center; + background: var(--color-bg-subtle); + border: 2px solid var(--color-border); + border-radius: 50%; + color: var(--color-text-muted); + display: flex; + font-size: var(--font-size-sm); + font-weight: 700; + height: 40px; + justify-content: center; + position: relative; + width: 40px; + z-index: 1; +} + +.downstream-attempt-marker--success { + background: #ecfdf3; + border-color: #86efac; + color: #15803d; +} + +.downstream-attempt-marker--danger { + background: #fef2f2; + border-color: #fca5a5; + color: #b91c1c; +} + +.downstream-attempt-marker--info { + background: #eff6ff; + border-color: #93c5fd; + color: #1d4ed8; +} + +.downstream-attempt-card__body { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + padding: var(--space-4); +} + +.downstream-attempt-card__body > header { + align-items: center; + display: flex; + justify-content: space-between; +} + +.downstream-attempt-card dl { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin: 0; +} + +.downstream-attempt-card dl > div { + display: grid; + gap: var(--space-1); + min-width: 0; +} + +.downstream-attempt-card dt { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.downstream-attempt-card dd { + color: var(--color-text-strong); + font-size: var(--font-size-sm); + margin: 0; + overflow-wrap: anywhere; +} + +.downstream-attempt-card__identifiers dd { + font-family: ui-monospace, SFMono-Regular, Consolas, monospace; +} + +.downstream-attempt-result { + align-items: center; + background: var(--color-surface); + border-radius: var(--radius-sm); + display: flex; + gap: var(--space-4); + justify-content: space-between; + padding: var(--space-3); +} + +.downstream-attempt-result--error { + background: #fef2f2; + color: #b91c1c; +} + +.downstream-attempt-timeline > p { + color: var(--color-text-muted); + margin: var(--space-3) 0 0; +} + +.admin-mms-task-page .page-heading { + align-items: center; +} + +.admin-mms-task-table-card .ui-table { + min-width: 1360px; +} + +.admin-mms-task-table-card .ui-table-wrap { + border: 0; + border-radius: 0; +} + +.admin-mms-task-table-card { + overflow: hidden; + padding: 0; +} + +.admin-mms-task-table-card .mms-task-content { + max-width: 420px; +} + +.admin-mms-task-table-card .mms-task-content p { + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + display: -webkit-box; + overflow: hidden; +} + +.admin-mms-task-table-card .mms-task-actions { + justify-content: flex-end; +} + +.admin-mms-task-table-card .mms-task-actions .ui-button { + padding: 0 9px; +} + +.admin-mms-task-detail .mms-detail-template small { + color: var(--color-text-muted); + font-size: var(--font-size-sm); + margin-top: var(--space-2); +} + +.admin-mms-city-list { + background: var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: grid; + gap: var(--space-4); + padding: var(--space-5); +} + +.admin-mms-city-list > div { + display: grid; + gap: var(--space-2); + grid-template-columns: 120px minmax(140px, 1fr) 80px; +} + +.admin-mms-city-list strong { + color: var(--color-text-strong); +} + +.admin-mms-city-list span { + color: var(--color-text-muted); + text-align: right; +} + +.admin-mms-city-list b { + color: var(--color-selected); + text-align: right; +} + +.admin-mms-city-list .ui-progress-bar { + grid-column: 1 / -1; +} diff --git a/src/styles/domains/12-admin-configuration.css b/src/styles/domains/12-admin-configuration.css new file mode 100644 index 0000000..4b6ea1d --- /dev/null +++ b/src/styles/domains/12-admin-configuration.css @@ -0,0 +1,1069 @@ +/* Owner: uplink, billing, users, phone segments and report field library. Extracted from global.css with original cascade order preserved. */ +.admin-mms-record-search-button { + background: #9d18ff; + color: var(--color-text-inverse); +} + +.admin-mms-record-search-button:hover { + background: #8610dc; +} + +.admin-mms-record-table { + min-width: 1120px; +} + +.admin-mms-record-table td { + height: 112px; +} + +.admin-mms-template-cell { + display: grid; + gap: var(--space-1); +} + +.admin-mms-template-cell strong { + color: var(--color-text-strong); +} + +.admin-mms-template-cell span { + color: var(--color-text-muted); +} + +.admin-mms-template-cell small { + color: #9d18ff; + font-weight: var(--font-weight-semibold); +} + +.admin-mms-preview-link { + align-items: center; + background: transparent; + border: 0; + color: #9d18ff; + display: inline-flex; + font-weight: var(--font-weight-semibold); + gap: var(--space-2); + padding: 0; +} + +.admin-uplink-page .page-heading { + align-items: center; +} + +.admin-uplink-filter { + align-items: end; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(260px, 1.1fr) minmax(220px, 1fr) minmax(220px, 1fr) auto; +} + +.admin-uplink-filter__actions { + display: grid; + gap: var(--space-3); + grid-template-columns: repeat(2, minmax(120px, 1fr)); +} + +.admin-uplink-table-card { + overflow: hidden; + padding: 0; +} + +.admin-uplink-table-card .ui-table-wrap { + border: 0; + border-radius: 0; +} + +.admin-uplink-table-card .ui-table { + min-width: 1052px; + table-layout: fixed; +} + +.admin-uplink-table-card .uplink-content { + -webkit-line-clamp: 2; + min-width: 0; +} + +.admin-uplink-table-card .ui-table td strong { + overflow-wrap: anywhere; +} + +.gateway-exception-list-heading { + align-items: flex-start; + border-bottom: 1px solid var(--color-border); + gap: var(--space-5); + margin: 0; + padding: var(--space-5) var(--space-6); +} + +.gateway-exception-list-heading > div { + display: grid; + gap: var(--space-1); +} + +.gateway-exception-list-heading h2, +.gateway-exception-list-heading p { + margin: 0; +} + +.gateway-exception-page .report-task-table-card > .ui-pagination { + border-top: 1px solid var(--color-border); + padding: var(--space-4) var(--space-6); +} + +@media (max-width: 720px) { + .downstream-attempt-card dl { + grid-template-columns: 1fr; + } + + .downstream-attempt-result { + align-items: flex-start; + flex-direction: column; + gap: var(--space-2); + } +} + +.admin-uplink-table-card .ui-table th { + background: var(--color-bg-subtle); + color: var(--color-text-muted); + font-size: var(--font-size-sm); + height: 58px; +} + +.admin-uplink-table-card .ui-table td { + height: 84px; + padding: var(--space-5) var(--space-4); +} + +.admin-uplink-checkbox { + accent-color: var(--color-selected); + height: 18px; + width: 18px; +} + +.admin-uplink-detail-link { + background: transparent; + border: 0; + color: var(--color-selected); + font-weight: var(--font-weight-semibold); + padding: 0; +} + +.admin-uplink-detail { + display: grid; + gap: var(--space-7); +} + +.admin-uplink-info-card, +.admin-uplink-match-card { + background: var(--color-bg-subtle); + border-radius: var(--radius-md); + padding: var(--space-6); +} + +.admin-uplink-info-card h3, +.admin-uplink-match-section h3 { + font-size: var(--font-size-lg); + margin: 0 0 var(--space-5); +} + +.admin-uplink-info-grid { + display: grid; + gap: var(--space-6) var(--space-8); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.admin-uplink-info-grid div { + display: grid; + gap: var(--space-2); +} + +.admin-uplink-info-grid__full { + grid-column: 1 / -1; +} + +.admin-uplink-info-grid span, +.admin-uplink-match-section > p, +.admin-uplink-match-grid span, +.admin-uplink-match-content span { + color: var(--color-text-muted); + font-weight: var(--font-weight-semibold); +} + +.admin-uplink-info-grid strong, +.admin-uplink-match-grid strong { + color: var(--color-text-strong); + font-weight: var(--font-weight-semibold); +} + +.admin-uplink-match-section > p { + margin-bottom: var(--space-5); +} + +.admin-uplink-match-grid { + display: grid; + gap: var(--space-6); + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.admin-uplink-match-grid div, +.admin-uplink-match-content { + display: grid; + gap: var(--space-2); +} + +.admin-uplink-match-content { + margin-top: var(--space-5); +} + +.admin-uplink-match-content p { + border-bottom: 1px solid var(--color-border); + color: var(--color-text-strong); + line-height: 1.75; + margin: 0; + padding-bottom: var(--space-5); +} + +.admin-uplink-candidate-footer { + align-items: center; + display: flex; + gap: var(--space-4); + justify-content: space-between; + margin-top: var(--space-5); +} + +.admin-uplink-candidate-footer span { + color: var(--color-text-muted); + line-height: 1.6; + min-width: 0; +} + +.admin-recharge-page .page-heading { + align-items: center; +} + +.admin-recharge-filter { + align-items: end; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(320px, 1.2fr) minmax(320px, 1.2fr) minmax(360px, 1fr); +} + +.admin-recharge-filter__actions { + display: grid; + gap: var(--space-4); + grid-template-columns: repeat(2, minmax(140px, 1fr)); +} + +.admin-recharge-table-card { + overflow: hidden; + padding: 0; +} + +.admin-recharge-table-card .ui-table-wrap { + border: 0; + border-radius: 0; +} + +.admin-recharge-table { + min-width: 1350px; +} + +.admin-recharge-table th { + background: var(--color-bg-subtle); + color: var(--color-text-muted); + font-size: var(--font-size-sm); + height: 58px; + text-align: left; +} + +.admin-recharge-table td { + color: var(--color-text-strong); + font-weight: var(--font-weight-medium); + height: 76px; + padding: var(--space-4) var(--space-6); + vertical-align: middle; +} + +.admin-recharge-table td:nth-child(3), +.admin-recharge-table td:nth-child(4) { + font-variant-numeric: tabular-nums; +} + +.recharge-receipt-modal .ui-modal__header, +.recharge-receipt-modal .ui-modal__footer { + padding: var(--space-3) var(--space-5); +} + +.recharge-receipt-modal .ui-modal__body { + padding: var(--space-3) var(--space-5); +} + +.recharge-receipt { + background: linear-gradient(135deg, rgba(217, 195, 160, 0.18), transparent 42%), var(--color-surface); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + overflow: hidden; + position: relative; +} + +.recharge-receipt::before { + background: linear-gradient(90deg, var(--color-brand), var(--color-accent-strong)); + content: ''; + height: 4px; + inset: 0 0 auto; + position: absolute; +} + +.recharge-receipt__header { + align-items: center; + display: flex; + justify-content: space-between; + min-height: 52px; + padding: var(--space-3) var(--space-5) var(--space-2); +} + +.recharge-receipt__logo { + display: block; + height: 32px; + max-width: 190px; + object-fit: contain; + object-position: left center; + width: auto; +} + +.recharge-receipt__header > span { + align-items: center; + border-radius: var(--radius-full); + display: inline-flex; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + gap: var(--space-2); + padding: 7px 12px; +} + +.recharge-receipt__header .is-posted { + background: var(--color-success-soft); + color: var(--color-success); +} + +.recharge-receipt__header .is-correction { + background: var(--color-warning-soft); + color: var(--color-warning); +} + +.recharge-receipt__amount { + border-bottom: 1px solid var(--color-border); + display: grid; + justify-items: center; + padding: var(--space-2) var(--space-5) var(--space-3); +} + +.recharge-receipt__amount > span, +.recharge-receipt__enterprise > span, +.recharge-receipt__remark > span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.recharge-receipt__amount strong { + color: var(--color-text-strong); + font-size: clamp(28px, 4vw, 34px); + font-variant-numeric: tabular-nums; + letter-spacing: -0.035em; + line-height: 1.15; + margin-top: var(--space-1); +} + +.recharge-receipt__amount small { + font-size: 0.58em; + font-weight: var(--font-weight-semibold); + margin: 0 var(--space-1); +} + +.recharge-receipt__enterprise { + display: grid; + gap: var(--space-1); + padding: var(--space-3) var(--space-5); +} + +.recharge-receipt__enterprise strong { + color: var(--color-text-strong); + font-size: var(--font-size-lg); +} + +.recharge-receipt__enterprise small { + color: var(--color-text-muted); +} + +.recharge-receipt__details { + background: var(--color-bg-subtle); + border-bottom: 1px solid var(--color-border); + border-top: 1px solid var(--color-border); + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin: 0; + padding: var(--space-1) var(--space-5); +} + +.recharge-receipt__details > div { + display: grid; + gap: var(--space-1); + min-width: 0; + padding: var(--space-2) 0; +} + +.recharge-receipt__details > div:nth-child(even) { + padding-left: var(--space-6); +} + +.recharge-receipt__details dt { + color: var(--color-text-muted); + font-size: var(--font-size-xs); +} + +.recharge-receipt__details dd { + color: var(--color-text-strong); + font-variant-numeric: tabular-nums; + font-weight: var(--font-weight-medium); + margin: 0; + overflow-wrap: anywhere; +} + +.recharge-receipt__remark { + display: grid; + gap: var(--space-2); + padding: var(--space-2) var(--space-5); +} + +.recharge-receipt__remark p { + color: var(--color-text-strong); + line-height: var(--line-height-loose); + margin: 0; + overflow-wrap: anywhere; +} + +.recharge-receipt__note { + background: var(--color-bg-subtle); + border-top: 1px dashed var(--color-border-strong); + color: var(--color-text-muted); + font-size: var(--font-size-xs); + padding: var(--space-2) var(--space-5); + text-align: center; +} + +.recharge-receipt--correction .recharge-receipt__amount { + padding-bottom: var(--space-2); + padding-top: var(--space-1); +} + +.recharge-receipt--correction .recharge-receipt__amount strong { + font-size: 28px; +} + +@media (max-width: 560px) { + .recharge-receipt__header, + .recharge-receipt__enterprise, + .recharge-receipt__remark { + padding-left: var(--space-5); + padding-right: var(--space-5); + } + + .recharge-receipt__logo { + height: 32px; + max-width: 150px; + } + + .recharge-receipt__details { + grid-template-columns: 1fr; + padding-left: var(--space-5); + padding-right: var(--space-5); + } + + .recharge-receipt__details > div { + border-bottom: 1px solid var(--color-border); + } + + .recharge-receipt__details > div:last-child { + border-bottom: 0; + } + + .recharge-receipt__details > div:nth-child(even) { + padding-left: 0; + } +} + +.manual-recharge-review, +.manual-recharge-result { + display: grid; + gap: var(--space-5); +} + +.manual-recharge-review > p { + color: var(--color-text-muted); + margin: 0; +} + +.manual-recharge-review dl { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + margin: 0; + overflow: hidden; +} + +.manual-recharge-review dl > div { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(110px, 0.7fr) minmax(0, 1.5fr); + padding: var(--space-4) var(--space-5); +} + +.manual-recharge-review dl > div:last-child { + border-bottom: 0; +} + +.manual-recharge-review dt { + color: var(--color-text-muted); +} + +.manual-recharge-review dd { + display: grid; + font-variant-numeric: tabular-nums; + gap: var(--space-1); + justify-items: end; + margin: 0; + overflow-wrap: anywhere; + text-align: right; +} + +.manual-recharge-review dd span { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.manual-recharge-review .is-positive { + color: var(--color-success); +} + +.manual-recharge-review .is-negative { + color: var(--color-danger); +} + +.manual-recharge-review__remark { + background: var(--color-warning-soft); + border-radius: var(--radius-md); + color: var(--color-text-strong) !important; + padding: var(--space-4); + overflow-wrap: anywhere; +} + +.manual-recharge-result { + background: var(--color-success-soft); + border: 1px solid var(--color-success); + border-radius: var(--radius-lg); + color: var(--color-text-strong); + padding: var(--space-6); +} + +.manual-recharge-result > strong { + color: var(--color-success); + font-size: var(--font-size-lg); +} + +@media (max-width: 480px) { + .manual-recharge-review dl > div { + align-items: start; + grid-template-columns: 1fr; + gap: var(--space-2); + } + + .manual-recharge-review dd { + justify-items: start; + text-align: left; + } +} + +.admin-recharge-pagination { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--space-5); + justify-content: flex-end; + min-height: 88px; + padding: var(--space-4) var(--space-6); +} + +.admin-recharge-pagination > label { + width: 130px; +} + +.admin-recharge-pagination > div { + align-items: center; + display: flex; + gap: var(--space-2); +} + +.admin-recharge-pagination .ui-button--primary { + background: var(--color-selected); +} + +.admin-recharge-pagination span { + color: var(--color-text-muted); + padding: 0 var(--space-2); +} + +.phone-segment-tabs .ui-tabs__list { + width: fit-content; +} + +.phone-segment-tabs .ui-tabs__tab { + min-width: 0; + padding-inline: var(--space-3); +} + +.admin-user-toolbar { + grid-template-columns: minmax(0, 1fr) auto; +} + +.admin-user-filter-grid { + min-width: 0; +} + +.admin-user-toolbar > .ui-button { + justify-self: end; + width: max-content; +} + +.phone-segment-workbench { + max-width: 1440px; +} + +.phone-segment-heading { + display: grid; + gap: var(--space-2); +} + +.phone-segment-summary__icon { + align-items: center; + background: var(--color-selected-soft); + border: 1px solid #bfdbfe; + border-radius: 50%; + color: var(--color-selected); + display: inline-flex; + flex: 0 0 auto; + justify-content: center; +} + +.phone-segment-heading > p { + color: var(--color-text-muted); + margin: 0 0 0 56px; +} + +.phone-segment-panel { + border-radius: var(--radius-lg); +} + +.phone-segment-query { + align-items: center; + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(300px, 670px) auto; +} + +.phone-segment-query__actions { + display: flex; + gap: var(--space-3); +} + +.phone-segment-workbench__tabs { + display: grid; +} + +.phone-segment-workbench__tabs .ui-tabs__list { + border-bottom: 1px solid var(--color-border); + overflow-y: hidden; + padding: 0 var(--space-6); + width: fit-content; +} + +.phone-segment-workbench__tabs .ui-tabs__tab { + min-height: 58px; + padding-inline: var(--space-4); +} + +.phone-segment-tab-content { + display: grid; + gap: 0; +} + +.phone-segment-summary { + align-items: center; + border-bottom: 1px solid var(--color-border); + display: grid; + gap: var(--space-4); + grid-template-columns: 52px auto minmax(0, 1fr); + margin: 0 var(--space-6); + min-height: 128px; + padding: var(--space-5) 0; +} + +.phone-segment-summary__icon { + height: 48px; + width: 48px; +} + +.phone-segment-summary__value { + border-right: 1px solid var(--color-border); + display: grid; + gap: var(--space-1); + min-width: 190px; + padding-right: var(--space-6); +} + +.phone-segment-summary__value > span { + color: var(--color-text); + font-weight: var(--font-weight-medium); +} + +.phone-segment-summary__value strong { + color: var(--color-selected); + font-size: 30px; + letter-spacing: -0.02em; + line-height: 1.1; +} + +.phone-segment-summary p { + color: var(--color-text-muted); + margin: 0; + padding-left: var(--space-2); +} + +.phone-segment-tab-content > .phone-segment-query { + margin: var(--space-5) var(--space-6); +} + +.phone-segment-prefix { + color: var(--color-text-strong); + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 15px; + letter-spacing: 0.04em; +} + +.phone-segment-delete { + color: var(--color-danger); +} + +.phone-segment-delete:hover:not(:disabled) { + background: var(--color-danger-soft); + color: var(--color-danger); +} + +.phone-segment-panel .ui-pagination { + border-top: 1px solid var(--color-border); + padding: var(--space-5) var(--space-6); +} + +.phone-segment-panel .ui-table { + min-width: 800px; +} + +.admin-drainage-actions { + align-items: center; + display: inline-flex; + gap: var(--space-2); + justify-content: flex-end; +} + +.admin-drainage-toolbar { + align-items: end; + display: grid; + gap: var(--space-5); + grid-template-columns: minmax(320px, 1fr) minmax(160px, 220px) auto; +} + +.admin-drainage-page .page-heading > div > p { + color: var(--color-text-muted); + margin: 6px 0 0; +} + +.admin-drainage-summary { + display: grid; + gap: 16px; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.admin-drainage-summary article { + align-items: center; + background: linear-gradient(135deg, #fff, var(--color-bg-subtle)); + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + display: flex; + gap: 14px; + min-height: 96px; + padding: 20px; +} + +.admin-drainage-summary article > span { + align-items: center; + background: #eef4ff; + border-radius: 12px; + color: var(--color-primary); + display: flex; + height: 42px; + justify-content: center; + width: 42px; +} + +.admin-drainage-summary strong { + color: var(--color-text-strong); + font-size: 24px; +} + +.admin-drainage-summary p { + color: var(--color-text-muted); + margin: 3px 0 0; +} + +.admin-drainage-section { + padding: 22px; +} + +.admin-drainage-section__heading { + align-items: flex-start; + display: flex; + gap: 20px; + justify-content: space-between; + margin-bottom: 18px; +} + +.admin-drainage-section__heading h2 { + margin: 0 0 6px; +} + +.admin-drainage-section__heading p { + color: var(--color-text-muted); + margin: 0; +} + +.admin-drainage-common-grid { + display: grid; + gap: 16px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.admin-drainage-common-group { + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + min-width: 0; + padding: 16px; +} + +.admin-drainage-common-group__title { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 12px; +} + +.admin-drainage-common-group__title > span, +.admin-drainage-common-empty { + color: var(--color-text-muted); + font-size: var(--font-size-sm); +} + +.admin-drainage-common-list { + display: grid; + gap: 8px; +} + +.admin-drainage-common-list > div { + align-items: center; + background: #fff; + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + display: grid; + gap: 10px; + grid-template-columns: minmax(0, 1fr) auto auto auto auto; + padding: 11px 12px; +} + +.admin-drainage-common-list strong, +.admin-drainage-common-list span { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.admin-drainage-common-list span { + color: var(--color-text-muted); + font-size: 12px; + margin-top: 3px; +} + +.admin-drainage-common-order { + display: inline-flex; + gap: 2px; +} + +.admin-drainage-field-grid { + display: grid; + gap: 14px; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); +} + +.admin-drainage-field-card { + border: 1px solid var(--color-border); + border-radius: var(--radius-md); + display: flex; + flex-direction: column; + min-height: 220px; + padding: 16px; + transition: + border-color 0.2s, + box-shadow 0.2s, + transform 0.2s; +} + +.admin-drainage-field-card:hover { + border-color: #b8c9eb; + box-shadow: 0 8px 24px rgba(27, 55, 100, 0.08); + transform: translateY(-1px); +} + +.admin-drainage-field-card__actions { + display: inline-flex; + gap: 4px; +} + +.admin-drainage-field-card__top { + align-items: center; + display: flex; + justify-content: space-between; +} + +.admin-drainage-field-card h3 { + font-size: 17px; + margin: 15px 0 5px; +} + +.admin-drainage-field-card code { + color: var(--color-primary); + font-size: 13px; +} + +.admin-drainage-field-card > p { + color: var(--color-text-muted); + flex: 1; + line-height: 1.6; + margin: 12px 0; +} + +.admin-drainage-field-card__meta { + border-top: 1px solid var(--color-border); + color: var(--color-text-muted); + display: flex; + font-size: 13px; + gap: 18px; + padding-top: 12px; +} + +.admin-drainage-field-card__meta strong { + color: var(--color-text-strong); +} + +.admin-drainage-empty { + color: var(--color-text-muted); + padding: 42px; + text-align: center; +} + +.admin-drainage-type { + align-items: center; + background: var(--color-bg-subtle); + border: 1px solid var(--color-border); + border-radius: var(--radius-sm); + color: var(--color-text-strong); + display: inline-flex; + font-size: var(--font-size-sm); + font-weight: var(--font-weight-semibold); + min-height: 30px; + padding: 0 var(--space-3); +} + +@media (max-width: 900px) { + .admin-drainage-summary, + .admin-drainage-common-grid { + grid-template-columns: 1fr; + } + .admin-drainage-toolbar { + grid-template-columns: 1fr; + } + .admin-drainage-section__heading { + align-items: stretch; + flex-direction: column; + } + .admin-user-toolbar { + grid-template-columns: 1fr; + } +} + +.admin-drainage-actions .ui-button--ghost { + color: var(--color-text); +} + +.admin-drainage-pagination { + align-items: center; + border-top: 1px solid var(--color-border); + display: flex; + gap: var(--space-3); + justify-content: flex-end; + min-height: 76px; + padding: var(--space-4) var(--space-6); +} + +.admin-drainage-pagination span { + color: var(--color-text-muted); +} + +.file-actions { + align-items: center; + display: inline-flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 6px; +} + +.file-action-link, +.file-action-preview.ui-button { + align-items: center; + background: #fff; + border: 1px solid var(--border); + border-radius: 6px; + color: var(--text); + display: inline-flex; + font-size: 13px; + font-weight: 600; + gap: 4px; + min-height: 30px; + padding: 0 10px; + text-decoration: none; +} + +.file-action-link:hover, +.file-action-preview.ui-button:hover { + border-color: var(--primary); + color: var(--primary); +} + +.file-preview-image { + display: block; + height: auto; + margin: 0 auto; + max-height: calc(100vh - 300px); + max-width: 100%; + object-fit: contain; +} diff --git a/src/styles/domains/13-client-signatures.css b/src/styles/domains/13-client-signatures.css new file mode 100644 index 0000000..f9f3c47 --- /dev/null +++ b/src/styles/domains/13-client-signatures.css @@ -0,0 +1,490 @@ +/* Owner: client signature and drainage materials. Extracted from global.css with original cascade order preserved. */ +.client-signature-page { + gap: 18px; +} + +.client-signature-heading, +.client-signature-title, +.client-drainage-panel__head { + align-items: center; + display: flex; + justify-content: space-between; +} + +.client-signature-title { + justify-content: flex-start; + gap: 13px; +} + +.client-signature-title__icon { + align-items: center; + background: #e9f6f0; + border: 1px solid #d3ebe1; + border-radius: 12px; + color: #187352; + display: inline-flex; + height: 46px; + justify-content: center; + width: 46px; +} + +.client-signature-title h1, +.client-signature-title p, +.client-drainage-panel h3, +.client-drainage-panel p, +.client-signature-form-section h3, +.client-signature-form-section p { + margin: 0; +} + +.client-signature-title h1 { + color: var(--text-strong); + font-size: 24px; + line-height: 1.25; +} + +.client-signature-title p, +.client-drainage-panel p, +.client-signature-form-section p { + color: var(--text-muted); + font-size: 13px; + margin-top: 5px; +} + +.client-signature-overview { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + display: grid; + grid-template-columns: repeat(4, 1fr); + overflow: hidden; +} + +.client-signature-overview > div { + display: grid; + gap: 7px; + padding: 18px 22px; + position: relative; +} + +.client-signature-overview > div + div::before { + background: var(--border); + content: ''; + height: 34px; + left: 0; + position: absolute; + top: 20px; + width: 1px; +} + +.client-signature-overview span { + color: var(--text-muted); + font-size: 13px; +} + +.client-signature-overview strong { + color: var(--text-strong); + font-size: 25px; + line-height: 1; +} + +.client-signature-toolbar { + align-items: end; + display: grid; + gap: 12px; + grid-template-columns: minmax(240px, 1fr) 190px 160px auto; +} + +.client-signature-list-shell { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + overflow: hidden; +} + +.client-signature-list-head, +.client-signature-list-row { + align-items: center; + display: grid; + gap: 14px; + grid-template-columns: 24px minmax(120px, 1.05fr) minmax(110px, 0.85fr) minmax(360px, 2.2fr) 142px minmax(144px, auto); + min-width: 1030px; +} + +.client-signature-list-head { + background: #f7f9f8; + border-bottom: 1px solid var(--border); + color: var(--text-muted); + font-size: 12px; + font-weight: 600; + letter-spacing: 0.02em; + padding: 12px 18px; +} + +.client-signature-row-wrap { + content-visibility: auto; + contain-intrinsic-size: 62px; +} + +.client-signature-row-wrap + .client-signature-row-wrap { + border-top: 1px solid var(--border); +} + +.client-signature-list-row { + min-height: 62px; + padding: 10px 18px; +} + +.client-signature-list-row > span { + color: var(--text-secondary); + font-size: 13px; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.client-signature-list-row > strong { + color: var(--text-strong); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.client-signature-expand { + align-items: center; + background: transparent; + border: 0; + color: var(--text-muted); + cursor: pointer; + display: inline-flex; + justify-content: center; + padding: 3px; +} + +.client-signature-expand:hover { + color: var(--primary); +} + +.client-carrier-status-group { + display: grid; + gap: 8px; + grid-template-columns: repeat(3, minmax(0, 1fr)); + min-width: 0; +} + +.client-carrier-status { + align-items: center; + background: #f8faf9; + border: 1px solid #e3e9e6; + border-radius: 8px; + display: grid; + gap: 6px; + grid-template-columns: auto 7px minmax(0, 1fr); + min-height: 34px; + padding: 5px 8px; +} + +.client-carrier-status strong { + color: var(--text-secondary); + font-size: 12px; + font-weight: 600; + min-width: 0; + white-space: nowrap; +} + +.client-carrier-status__dot { + background: #b5c0bb; + border-radius: 50%; + height: 7px; + width: 7px; +} + +.client-carrier-status--available { + background: #f1faf6; + border-color: #cfe8dc; +} + +.client-carrier-status--available strong { + color: #176b49; +} + +.client-carrier-status--available .client-carrier-status__dot { + background: #24a06b; + box-shadow: 0 0 0 3px rgba(36, 160, 107, 0.12); +} + +.client-signature-inline-reason, +.client-signature-reason, +.client-drainage-reason { + background: #fff8f0; + color: #9a4d12; + font-size: 13px; +} + +.client-signature-inline-reason { + border-top: 1px solid #f5dfc8; + padding: 9px 56px; +} + +.client-signature-reason { + border: 1px solid #f5dfc8; + border-radius: 8px; + display: grid; + gap: 4px; + padding: 12px 14px; +} + +.client-drainage-panel { + background: #f8fbfa; + border-top: 1px solid var(--border); + padding: 18px 56px 22px; +} + +.client-drainage-panel__head { + margin-bottom: 14px; +} + +.client-drainage-panel h3 { + align-items: center; + color: var(--text-strong); + display: flex; + font-size: 15px; + gap: 7px; +} + +.client-drainage-table { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 9px; + overflow-x: auto; +} + +.client-drainage-table__head, +.client-drainage-table__row { + align-items: center; + display: grid; + gap: 14px; + grid-template-columns: minmax(220px, 1.35fr) minmax(360px, 2.2fr) 142px minmax(144px, auto); + min-width: 940px; +} + +.client-drainage-table__head { + background: #f5f8f7; + color: var(--text-muted); + font-size: 12px; + font-weight: 600; + padding: 10px 14px; +} + +.client-drainage-table__row { + border-top: 1px solid var(--border); + min-height: 56px; + padding: 9px 14px; +} + +.client-drainage-target { + color: var(--primary); + font-size: 13px; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.client-drainage-reason { + grid-column: 1 / -1; + margin: 0 -14px -9px; + padding: 8px 14px; +} + +.client-signature-list-empty, +.client-signature-empty-hint { + color: var(--text-muted); + font-size: 13px; + margin: 0; + padding: 28px; + text-align: center; +} + +.client-signature-form-section { + background: #f8fbfa; + border: 1px solid var(--border); + border-radius: 10px; + display: grid; + gap: 14px; + padding: 16px; +} + +.client-signature-form-section .client-signature-empty-hint { + padding: 10px; + text-align: left; +} + +@media (max-width: 1180px) { + .client-signature-list-shell { + overflow-x: auto; + } +} + +@media (max-width: 780px) { + .enterprise-flow-card { + min-height: 0; + padding: var(--space-4); + } + + .enterprise-stepper { + justify-content: flex-start; + margin-bottom: var(--space-8); + overflow-x: auto; + padding-bottom: var(--space-2); + } + + .enterprise-stepper__item { + flex: 0 0 auto; + gap: var(--space-2); + } + + .enterprise-stepper__dot { + height: 36px; + width: 36px; + } + + .enterprise-stepper__arrow { + flex: 0 0 auto; + margin: 0 var(--space-2); + } + + .enterprise-form-panel, + .enterprise-upload { + min-width: 0; + width: 100%; + } + + .enterprise-upload { + padding: var(--space-4); + text-align: center; + } + + .enterprise-upload strong { + max-width: 100%; + overflow-wrap: anywhere; + } + + .enterprise-upload .file-actions { + justify-content: center; + } + + .enterprise-address-selects > div { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .enterprise-address-selects .ui-field { + min-width: 0; + width: 100%; + } + + .client-signature-heading, + .client-drainage-panel__head { + align-items: stretch; + display: grid; + gap: 14px; + } + + .client-signature-overview { + grid-template-columns: repeat(2, 1fr); + } + + .client-signature-overview > div:nth-child(3)::before { + display: none; + } + + .client-signature-toolbar { + grid-template-columns: 1fr; + } + + .client-drainage-panel { + padding: 18px; + } +} + +@media (max-width: 780px) { + .overview-hero { + align-items: stretch; + display: grid; + padding: var(--space-5); + } + + .dashboard-grid { + grid-template-columns: 1fr; + } + + .content-grid, + .plan-grid, + .chart-grid, + .overview-grid, + .overview-grid--three, + .quick-grid, + .sms-send-layout, + .send-form-row { + grid-template-columns: 1fr; + } + + .sms-preview-card { + position: static; + } + + .receiver-table__head, + .receiver-table__row { + grid-template-columns: 64px minmax(0, 1fr) 64px; + } + + .batch-filter-grid { + gap: var(--space-4); + grid-template-columns: 1fr; + } + + .batch-pagination { + align-items: stretch; + display: grid; + gap: var(--space-3); + } + + .task-info-grid, + .task-stat-grid, + .carrier-rate-grid, + .sms-app-grid, + .template-card-grid { + grid-template-columns: 1fr; + } + + .template-toolbar, + .template-custom-variable { + grid-template-columns: 1fr; + } + + .task-detail-title h2 { + font-size: 26px; + } + + .admin-uplink-filter, + .admin-recharge-filter, + .admin-recharge-filter__actions, + .phone-segment-overview, + .phone-segment-tabs, + .admin-drainage-toolbar, + .channel-route-card-grid, + .detail-grid, + .admin-mms-city-list > div, + .admin-uplink-info-grid, + .admin-uplink-match-grid { + grid-template-columns: 1fr; + } + + .admin-recharge-pagination { + align-items: stretch; + display: grid; + justify-content: stretch; + } +} diff --git a/src/styles/domains/14-responsive-requeue.css b/src/styles/domains/14-responsive-requeue.css new file mode 100644 index 0000000..ab3d760 --- /dev/null +++ b/src/styles/domains/14-responsive-requeue.css @@ -0,0 +1,745 @@ +/* Owner: shared responsive rules and downstream requeue workbench. Extracted from global.css with original cascade order preserved. */ +/* Shared responsive layouts for report filters and compact record rows. */ + +.client-http-credential-row { + align-items: center; + display: grid; + gap: var(--space-3); + grid-template-columns: 1fr 1.5fr 100px 1fr auto; + padding: var(--space-4); +} + +.client-http-credential-row code { + min-width: 0; + overflow-wrap: anywhere; +} + +.admin-report-target-row { + display: grid; + gap: var(--space-4); + grid-template-columns: minmax(0, 1fr) 220px; + padding: var(--space-4); +} + +@media (max-width: 780px) { + .login-page { + padding: var(--space-4); + } + + .login-panel { + padding: 28px 22px 24px; + } + + .login-brand { + margin-bottom: var(--space-6); + } + + .login-captcha-row { + grid-template-columns: minmax(0, 1fr) 112px; + gap: var(--space-2); + } + + .admin-dashboard-main-grid, + .admin-metric-grid, + .admin-workload-grid, + .enterprise-summary-grid, + .enterprise-query-grid, + .system-log-filters, + .channel-report-filter-grid, + .channel-group-filter, + .channel-group-config-item, + .channel-group-base-form, + .channel-group-retry-limit, + .report-receipt-modal, + .phone-segment-query, + .client-http-credential-row, + .admin-report-target-row, + .admin-app-form-grid, + .admin-app-route-grid { + grid-template-columns: minmax(0, 1fr); + } + + .admin-app-protocol-header { + align-items: stretch; + display: grid; + gap: var(--space-4); + } + + .admin-app-protocol-header > .admin-switch { + justify-self: start; + } + + .admin-metric-grid, + .enterprise-summary-grid, + .admin-workload-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .enterprise-query-actions, + .phone-segment-query__actions { + align-items: stretch; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .enterprise-query-actions .ui-button, + .phone-segment-query__actions .ui-button { + width: 100%; + } + + .channel-report-page, + .channel-group-form-page { + min-width: 0; + width: 100%; + } + + .channel-report-heading, + .channel-report-filter-footer { + align-items: stretch; + display: grid; + gap: var(--space-4); + } + + .channel-report-config-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin-left: 0; + } + + .channel-report-filter-footer > div { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .channel-report-table { + background: transparent; + border: 0; + box-shadow: none; + overflow: visible; + } + + .channel-report-table__head { + display: none; + } + + .channel-report-row { + align-items: stretch; + border: 1px solid var(--color-border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + display: grid; + gap: var(--space-3); + grid-template-columns: minmax(0, 1fr); + margin-bottom: var(--space-3); + min-height: 0; + padding: var(--space-4); + } + + .channel-report-row > :first-child { + display: none; + } + + .channel-report-name--flow { + padding-left: 0; + } + + .channel-report-row > :nth-child(3), + .channel-report-row > :nth-child(4), + .channel-report-row > :nth-child(5), + .channel-report-row > :nth-child(6) { + align-items: center; + display: grid; + gap: var(--space-3); + grid-template-columns: 88px minmax(0, 1fr); + min-width: 0; + } + + .channel-report-row > :nth-child(3)::before { + color: var(--color-text-muted); + content: '报备状态'; + font-size: var(--font-size-xs); + } + .channel-report-row > :nth-child(4)::before { + color: var(--color-text-muted); + content: '提交报备时间'; + font-size: var(--font-size-xs); + } + .channel-report-row > :nth-child(5)::before { + color: var(--color-text-muted); + content: '报备成功时间'; + font-size: var(--font-size-xs); + } + .channel-report-row > :nth-child(6)::before { + color: var(--color-text-muted); + content: '上次发送成功'; + font-size: var(--font-size-xs); + } + + .channel-report-stats { + grid-template-columns: repeat(2, minmax(0, 1fr)); + min-width: 0; + width: 100%; + } + + .channel-report-actions { + display: flex; + flex-wrap: wrap; + gap: var(--space-4); + } + + .channel-signature-grid, + .channel-status-options { + grid-template-columns: minmax(0, 1fr); + } + + .channel-group-base-form > .ui-field, + .channel-group-retry-limit, + .channel-group-radio-row, + .channel-group-switch-row { + grid-column: auto; + } + + .channel-group-radio-row, + .channel-group-switch-row { + align-items: flex-start; + display: grid; + gap: var(--space-3); + } + + .channel-group-filter__actions, + .channel-group-config-item__actions, + .channel-group-row-actions { + justify-content: flex-start; + justify-self: stretch; + } + + .channel-group-config-item__metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .channel-group-retry-limit > span, + .channel-group-retry-limit small { + grid-column: auto; + } + + .phone-segment-tab-content > .phone-segment-query { + margin: var(--space-4); + } + + .phone-segment-heading > p { + font-size: var(--font-size-sm); + line-height: 1.55; + margin-left: 0; + } + + .phone-segment-workbench__tabs .ui-tabs__list { + padding: 0 var(--space-3); + width: 100%; + } + + .phone-segment-workbench__tabs .ui-tabs__tab { + flex: 1; + justify-content: center; + white-space: nowrap; + } + + .phone-segment-summary { + gap: var(--space-3); + grid-template-columns: 44px minmax(0, 1fr); + margin: 0 var(--space-4); + min-height: 0; + padding: var(--space-5) 0; + } + + .phone-segment-summary__icon { + height: 42px; + width: 42px; + } + + .phone-segment-summary__value { + border-right: 0; + min-width: 0; + padding-right: 0; + } + + .phone-segment-summary__value strong { + font-size: 26px; + } + + .phone-segment-summary p { + grid-column: 1 / -1; + padding-left: 0; + } + + .phone-segment-panel .ui-table tbody { + padding: 0 var(--space-4) var(--space-4); + } + + .phone-segment-panel .ui-pagination { + padding: var(--space-4); + } + + .sms-bulk-actions, + .sms-audit-toolbar { + align-items: stretch; + flex-wrap: wrap; + } + + /* Signature and drainage rows use true mobile cards. */ + .client-signature-list-shell { + background: transparent; + border: 0; + overflow: visible; + } + + .client-signature-list-head, + .client-drainage-table__head { + display: none; + } + + .client-signature-row-wrap { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-lg); + box-shadow: var(--shadow-sm); + overflow: hidden; + } + + .client-signature-row-wrap + .client-signature-row-wrap { + border-top: 1px solid var(--border); + margin-top: var(--space-3); + } + + .client-signature-list-row { + align-items: center; + display: grid; + gap: 10px; + grid-template-columns: 32px minmax(0, 1fr); + min-width: 0; + padding: var(--space-4); + } + + .client-signature-list-row > :nth-child(n + 3):nth-child(-n + 7) { + align-items: center; + display: grid; + gap: var(--space-3); + grid-column: 1 / -1; + grid-template-columns: 92px minmax(0, 1fr); + overflow: visible; + white-space: normal; + } + + .client-signature-list-row > :nth-child(3)::before { + color: var(--text-muted); + content: '所属应用'; + font-size: 12px; + } + .client-signature-list-row > :nth-child(4)::before { + color: var(--text-muted); + content: '移动'; + font-size: 12px; + } + .client-signature-list-row > :nth-child(5)::before { + color: var(--text-muted); + content: '联通'; + font-size: 12px; + } + .client-signature-list-row > :nth-child(6)::before { + color: var(--text-muted); + content: '电信'; + font-size: 12px; + } + .client-signature-list-row > :nth-child(7)::before { + color: var(--text-muted); + content: '更新时间'; + font-size: 12px; + } + + .client-signature-list-row > .table-actions { + grid-column: 1 / -1; + justify-content: flex-start; + } + + .client-signature-inline-reason, + .client-drainage-panel { + padding: var(--space-4); + } + + .client-drainage-table { + background: transparent; + border: 0; + overflow: visible; + } + + .client-drainage-table__row { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius-md); + display: grid; + gap: 10px; + grid-template-columns: 88px minmax(0, 1fr); + min-width: 0; + padding: var(--space-4); + } + + .client-drainage-table__row > * { + grid-column: 1 / -1; + min-width: 0; + white-space: normal; + } + + .client-drainage-table__row > a { + overflow-wrap: anywhere; + } + + .client-drainage-reason { + margin: 0; + } +} + +@media (max-width: 360px) { + .login-captcha-row, + .admin-metric-grid, + .enterprise-summary-grid, + .admin-workload-grid, + .channel-report-config-actions, + .channel-report-filter-footer > div, + .enterprise-query-actions, + .phone-segment-query__actions { + grid-template-columns: minmax(0, 1fr); + } +} + +.application-unit-price { + color: var(--color-text-strong); + font-size: var(--font-size-base); + font-variant-numeric: tabular-nums; +} + +.downstream-page-size { + display: inline-flex; + align-items: center; + gap: 8px; + color: var(--text-muted); + font-size: 13px; +} + +.downstream-page-size select { + min-width: 76px; + height: 36px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--surface); + color: var(--text); + padding: 0 10px; +} + +.downstream-requeue-task-heading { + gap: 20px; +} + +.downstream-requeue-task-card > .downstream-requeue-task-heading { + padding: var(--space-6) var(--space-6) var(--space-5); +} + +.downstream-requeue-task-heading__actions { + display: flex; + align-items: center; + gap: 8px; +} + +.downstream-requeue-task-heading__actions .ui-field { + min-width: 150px; +} + +.downstream-requeue-task-list { + display: grid; + margin: 0 var(--space-6); + overflow: hidden; + border: 1px solid var(--border); + border-radius: var(--radius-lg); + background: var(--color-surface); +} + +.downstream-requeue-task-list article { + display: grid; + grid-template-columns: minmax(190px, 0.9fr) minmax(260px, 1.35fr) minmax(250px, 1fr) auto; + gap: 22px; + align-items: center; + padding: 18px var(--space-5); + border-bottom: 1px solid var(--border); +} + +.downstream-requeue-task-list article:last-of-type { + border-bottom: 0; +} + +.downstream-requeue-task-list > .muted { + margin: 0; + padding: var(--space-6); + text-align: center; +} + +.downstream-requeue-task-card > .ui-pagination { + padding: var(--space-5) var(--space-6) var(--space-6); +} + +.downstream-requeue-task-list article > div { + min-width: 0; +} + +.downstream-requeue-task-list__identity, +.downstream-requeue-task-list__scope, +.downstream-requeue-task-list__progress { + display: grid; + gap: 5px; +} + +.downstream-requeue-task-list__identity > strong { + color: var(--text-strong); + font-size: 14px; + font-variant-numeric: tabular-nums; +} + +.downstream-requeue-task-list__identity > span, +.downstream-requeue-task-list__identity > small, +.downstream-requeue-task-list__scope > span, +.downstream-requeue-task-list__progress > small { + color: var(--text-muted); +} + +.downstream-requeue-task-list__scope > strong { + overflow: hidden; + color: var(--text); + font-weight: 500; + text-overflow: ellipsis; + white-space: nowrap; +} + +.downstream-requeue-task-list__progress > div:first-child { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.downstream-requeue-task-list__meter { + height: 5px; + overflow: hidden; + border-radius: 999px; + background: var(--surface-subtle, #eef2f6); +} + +.downstream-requeue-task-list__meter > span { + display: block; + height: 100%; + border-radius: inherit; + background: var(--brand, #2f6f91); + transition: width 0.2s ease; +} + +.downstream-requeue-task-list__actions { + display: flex !important; + flex-wrap: wrap; + justify-content: flex-end; + gap: 6px; +} + +.downstream-requeue-preview { + display: grid; + gap: 20px; +} + +.downstream-requeue-preview__summary { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 10px; +} + +.downstream-requeue-preview__summary > div { + display: grid; + gap: 4px; + padding: 16px; + border: 1px solid var(--border); + border-radius: 12px; + background: var(--surface-subtle, #f8fafc); +} + +.downstream-requeue-preview__summary > div.is-primary { + border-color: color-mix(in srgb, var(--brand, #2f6f91) 28%, var(--border)); + background: color-mix(in srgb, var(--brand, #2f6f91) 7%, white); +} + +.downstream-requeue-preview__summary span, +.downstream-requeue-preview__summary small { + color: var(--text-muted); +} + +.downstream-requeue-preview__summary strong { + color: var(--text-strong); + font-size: 24px; + line-height: 1.15; +} + +.downstream-requeue-preview__meta { + margin: 0; +} + +.downstream-requeue-preview__distribution { + display: grid; + gap: 8px; +} + +.downstream-requeue-preview__distribution > span { + color: var(--text-muted); + font-size: 13px; +} + +.downstream-requeue-preview__distribution > div { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.downstream-requeue-reason { + padding: 16px; + border: 1px solid var(--border); + border-radius: var(--radius-lg); + background: var(--surface-subtle, #f8fafc); +} + +.downstream-requeue-reason .ui-textarea { + min-height: 124px; + background: var(--color-surface); + line-height: 1.65; +} + +.downstream-requeue-warning { + display: flex; + align-items: flex-start; + gap: 10px; + padding: 14px; + border: 1px solid #fed7aa; + border-radius: 10px; + background: var(--warning-soft, #fff7ed); + color: var(--warning-text, #9a3412); +} + +.downstream-requeue-warning > div { + display: grid; + gap: 4px; +} + +.downstream-requeue-warning p { + margin: 0; + color: inherit; + line-height: 1.6; +} + +.downstream-requeue-task-detail { + display: grid; + gap: 20px; +} + +.downstream-requeue-detail-alert { + display: flex; + gap: 8px; + align-items: flex-start; + padding: 12px 14px; + border-radius: 10px; + background: var(--warning-soft, #fff7ed); + color: var(--warning-text, #9a3412); +} + +.downstream-requeue-detail-section { + display: grid; + gap: 14px; +} + +.downstream-requeue-detail-filter { + display: grid; + grid-template-columns: 180px minmax(240px, 1fr) auto; + gap: 10px; + align-items: end; +} + +.downstream-requeue-detail-items { + display: grid; + border: 1px solid var(--border); + border-radius: 10px; + overflow: hidden; +} + +.downstream-requeue-detail-items > div { + display: grid; + grid-template-columns: minmax(160px, 1fr) 125px 130px minmax(220px, 1.5fr) 155px; + gap: 12px; + align-items: center; + padding: 11px 14px; + border-top: 1px solid var(--border); +} + +.downstream-requeue-detail-items > div:first-child { + border-top: 0; +} + +.downstream-requeue-detail-items__head { + background: var(--surface-subtle, #f8fafc); + color: var(--text-muted); + font-size: 12px; + font-weight: 600; +} + +.downstream-requeue-detail-items time { + color: var(--text-muted); + font-size: 12px; +} + +@media (max-width: 1100px) { + .downstream-requeue-task-list article { + grid-template-columns: 1fr 1.4fr; + } + .downstream-requeue-task-list__actions { + justify-content: flex-start; + } + .downstream-requeue-preview__summary { + grid-template-columns: repeat(2, 1fr); + } +} + +@media (max-width: 780px) { + .downstream-requeue-task-card > .downstream-requeue-task-heading { + padding: var(--space-5) var(--space-4) var(--space-4); + } + .downstream-requeue-task-heading, + .downstream-requeue-task-heading__actions { + align-items: stretch; + flex-direction: column; + } + .downstream-requeue-task-list { + margin: 0 var(--space-4); + } + .downstream-requeue-task-list article, + .downstream-requeue-preview__summary, + .downstream-requeue-detail-filter { + grid-template-columns: 1fr; + } + .downstream-requeue-task-card > .ui-pagination { + padding: var(--space-4); + } + .downstream-requeue-detail-items { + border: 0; + overflow: visible; + gap: 10px; + } + .downstream-requeue-detail-items__head { + display: none !important; + } + .downstream-requeue-detail-items > div { + grid-template-columns: 1fr; + gap: 6px; + padding: 14px; + border: 1px solid var(--border); + border-radius: 10px; + } +} diff --git a/src/styles/domains/index.css b/src/styles/domains/index.css new file mode 100644 index 0000000..31fb360 --- /dev/null +++ b/src/styles/domains/index.css @@ -0,0 +1,15 @@ +/* Ordered business-domain stylesheet entry. Keep imports in source-cascade order. */ +@import './01-operations-dashboard.css'; +@import './02-client-sending.css'; +@import './03-client-records.css'; +@import './04-signatures.css'; +@import './05-templates.css'; +@import './06-auth-enterprise.css'; +@import './07-admin-operations.css'; +@import './08-reporting.css'; +@import './09-channels.css'; +@import './10-signature-quality.css'; +@import './11-deliveries-reporting.css'; +@import './12-admin-configuration.css'; +@import './13-client-signatures.css'; +@import './14-responsive-requeue.css'; diff --git a/src/styles/global.css b/src/styles/global.css deleted file mode 100644 index 412eeb7..0000000 --- a/src/styles/global.css +++ /dev/null @@ -1,9846 +0,0 @@ -.gateway-exception-time { - font-size: 1rem !important; - line-height: 1.35; -} - -.gateway-exception-command { - margin-top: 1rem; -} - -.gateway-exception-command pre { - max-height: 22rem; - margin: 0; - padding: 1rem; - overflow: auto; - border: 1px solid var(--color-border); - border-radius: 0.75rem; - background: var(--color-surface-muted); - color: var(--color-text); - font-size: 0.78rem; - line-height: 1.55; - white-space: pre-wrap; - word-break: break-all; -} - -.gateway-requeue-confirm .callout { - display: flex; - gap: 0.75rem; - padding: 0.9rem 1rem; - border: 1px solid; - border-radius: 0.75rem; -} - -.gateway-requeue-confirm .callout p { - margin: 0.25rem 0 0; -} - -.gateway-requeue-confirm .callout--warning { - border-color: #f5c66f; - background: #fff8e8; - color: #8a5700; -} - -.gateway-requeue-confirm .callout--danger { - border-color: #f2a4a4; - background: #fff0f0; - color: #a12222; -} - -.gateway-requeue-checkbox { - display: flex; - align-items: flex-start; - gap: 0.6rem; - color: var(--color-text); - line-height: 1.5; - cursor: pointer; -} - -.gateway-requeue-checkbox input { - width: 1rem; - height: 1rem; - margin-top: 0.2rem; -} - -.text-page-title { - color: var(--color-text-strong); - font-size: var(--font-size-2xl); - font-weight: var(--font-weight-bold); - line-height: var(--line-height-tight); -} - -.text-section-title { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - line-height: var(--line-height-tight); -} - -.text-card-title { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - line-height: 1.3; -} - -.text-body { - color: var(--color-text); - font-size: var(--font-size-md); - line-height: var(--line-height-base); -} - -.text-secondary { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - line-height: var(--line-height-base); -} - -.text-caption { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - line-height: 1.45; -} - -.overview-hero { - align-items: center; - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - color: var(--color-text); - display: flex; - gap: var(--space-5); - justify-content: space-between; - padding: var(--space-7); -} - -.overview-hero h1 { - color: var(--color-text-strong); -} - -.overview-hero .eyebrow { - color: var(--color-selected); -} - -.overview-hero .muted { - color: var(--color-text-muted); - margin-top: var(--space-2); -} - -.dashboard-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.dashboard-grid--four { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -@media (max-width: 1180px) { - .dashboard-grid--four { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -.metric-card { - display: grid; - gap: var(--space-2); -} - -.metric-card--featured { - background: linear-gradient(180deg, var(--color-surface), var(--color-accent-soft)); - border-color: rgba(217, 195, 160, 0.72); -} - -.metric-card--featured span, -.metric-card--featured small { - color: var(--color-text-muted); -} - -.metric-card span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.metric-card strong { - color: var(--color-text-strong); - font-size: 30px; - line-height: var(--line-height-tight); -} - -.metric-card small { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.chart-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(0, 1.3fr) minmax(320px, 0.7fr); -} - -.chart-card { - min-width: 0; -} - -.chart-card h2 { - margin-bottom: var(--space-2); -} - -.overview-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(0, 1.2fr) minmax(320px, 0.8fr); -} - -.overview-grid--three { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.quick-grid { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.quick-action { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - color: var(--color-text); - display: grid; - gap: var(--space-2); - justify-items: start; - min-width: 0; - padding: var(--space-4); - text-align: left; - transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast); -} - -.quick-action:hover { - border-color: rgba(37, 99, 235, 0.24); - box-shadow: var(--shadow-sm); - transform: translateY(-1px); -} - -.quick-action svg { - color: var(--color-selected); -} - -.quick-action span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.quick-action small { - color: var(--color-text-muted); -} - -.progress-heading { - align-items: center; - color: var(--color-text-muted); - display: flex; - justify-content: space-between; - margin: var(--space-4) 0 var(--space-2); -} - -.progress-heading strong { - color: var(--color-text-strong); -} - -.progress-track { - background: var(--color-surface-muted); - border-radius: var(--radius-full); - height: 10px; - overflow: hidden; -} - -.progress-track span { - background: linear-gradient(90deg, var(--color-selected), var(--color-accent)); - border-radius: inherit; - display: block; - height: 100%; -} - -.mini-status-card { - align-items: flex-start; - display: flex; - gap: var(--space-4); -} - -.mini-status-card svg { - color: var(--color-selected); - flex: 0 0 auto; - margin-top: 2px; -} - -.mini-status-card div { - display: grid; - gap: var(--space-1); - min-width: 0; -} - -.mini-status-card span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.mini-status-card strong { - color: var(--color-text-strong); -} - -.mini-status-card small { - color: var(--color-text-muted); -} - -.mini-status-card--action { - appearance: none; - cursor: pointer; - font: inherit; - text-align: left; - transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast); - width: 100%; -} - -.mini-status-card--action:hover, -.mini-status-card--action:focus-visible { - border-color: var(--color-selected); - box-shadow: var(--shadow-sm); - outline: none; - transform: translateY(-1px); -} - -.sms-send-page { - display: grid; - gap: var(--space-6); -} - -.sms-send-title { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.sms-send-title h1 { - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); -} - -.sms-send-title__icon { - align-items: center; - background: var(--color-selected-soft); - border-radius: var(--radius-sm); - color: var(--color-selected); - display: inline-flex; - height: 40px; - justify-content: center; - width: 40px; -} - -.sms-send-layout { - align-items: start; - display: grid; - gap: var(--space-6); - grid-template-columns: minmax(0, 1fr) 372px; -} - -.sms-send-main { - display: grid; - gap: var(--space-6); -} - -.send-card, -.sms-preview-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - padding: var(--space-6); -} - -.send-card__title { - align-items: center; - display: flex; - gap: var(--space-2); - margin-bottom: var(--space-5); -} - -.send-card__title span { - align-items: center; - background: var(--color-selected); - border-radius: var(--radius-full); - color: var(--color-text-inverse); - display: inline-flex; - font-size: var(--font-size-sm); - font-weight: var(--font-weight-bold); - height: 24px; - justify-content: center; - width: 24px; -} - -.send-card__title h2, -.preview-title h2 { - font-size: var(--font-size-lg); -} - -.send-field { - display: grid; - gap: var(--space-3); -} - -.send-field span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.send-field input, -.receiver-table input { - background: transparent; - border: 0; - border-bottom: 1px solid transparent; - color: var(--color-text); - height: var(--control-height-md); - outline: 0; - width: 100%; -} - -.send-field input::placeholder, -.receiver-table input::placeholder { - color: var(--color-text-subtle); -} - -.send-form-row { - display: grid; - gap: var(--space-6); - grid-template-columns: repeat(3, minmax(0, 1fr)); - margin-top: var(--space-6); -} - -.template-trigger { - align-items: center; - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text); - display: flex; - gap: var(--space-2); - height: var(--control-height-md); - justify-content: space-between; - padding: 0 var(--control-padding-x); - text-align: left; - transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background var(--transition-fast); - width: 100%; -} - -.template-trigger:hover, -.template-trigger:focus-visible { - border-color: var(--color-selected); - box-shadow: var(--focus-ring); -} - -.template-trigger span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.template-trigger svg { - color: var(--color-selected); - flex: 0 0 auto; -} - -.template-trigger__placeholder { - color: var(--color-text-subtle); -} - -.receiver-tabs { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin-bottom: var(--space-4); -} - -.receiver-tabs button { - background: var(--color-surface); - border: 1px solid var(--color-border); - color: var(--color-text-muted); - height: 44px; -} - -.receiver-tabs button.active { - border-color: var(--color-selected); - color: var(--color-selected); -} - -.receiver-table { - border: 1px solid var(--color-border); - border-bottom: 0; -} - -.receiver-table__head, -.receiver-table__row { - display: grid; - grid-template-columns: 120px minmax(0, 1fr) 96px; -} - -.receiver-table__head { - background: var(--color-surface-muted); - color: var(--color-text); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); -} - -.receiver-table__head span, -.receiver-table__row span, -.receiver-table__row input, -.receiver-table__row button { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: flex; - min-height: 50px; - padding: 0 var(--space-4); -} - -.receiver-table__row span { - color: var(--color-selected); -} - -.receiver-table__row button { - background: transparent; - border-left: 0; - border-right: 0; - border-top: 0; - color: var(--color-danger); - justify-content: center; -} - -.receiver-table__row button:disabled { - color: var(--color-text-subtle); -} - -.add-recipient { - align-items: center; - background: var(--color-bg-subtle); - border: 1px dashed var(--color-selected); - color: var(--color-selected); - display: flex; - gap: var(--space-2); - height: 40px; - justify-content: center; - margin-top: var(--space-3); - width: 100%; -} - -.import-panel { - align-items: center; - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-md); - color: var(--color-text-muted); - display: grid; - gap: var(--space-3); - grid-auto-rows: max-content; - align-content: center; - justify-items: center; - min-height: 190px; - padding: var(--space-6); - text-align: center; -} - -.import-panel__icon { - align-items: center; - background: var(--color-selected-soft); - border-radius: var(--radius-full); - color: var(--color-selected); - display: inline-flex; - height: 48px; - justify-content: center; - width: 48px; -} - -.import-panel__icon svg { - color: var(--color-selected); -} - -.import-panel strong { - color: var(--color-text-strong); -} - -.send-tip { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - margin-top: var(--space-3); -} - -.send-submit-row { - align-items: center; - display: flex; - gap: var(--space-3); - justify-content: flex-end; -} - -.client-billing-page .client-billing-amount { - background: none; - color: var(--color-text-strong); - font-family: inherit; - font-size: 32px; - font-style: normal; - font-variant-numeric: normal; - font-weight: var(--font-weight-regular); - letter-spacing: normal; - line-height: 1.25; - text-shadow: none; - -webkit-background-clip: border-box; - -webkit-text-fill-color: currentColor; -} - -.send-submit-hint { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.mms-send-page .send-card { - box-shadow: none; -} - -.mms-send-tip { - background: var(--color-selected-soft); - border: 1px solid #bfdbfe; - color: var(--color-text); - font-weight: var(--font-weight-medium); - line-height: 1.6; - margin-bottom: var(--space-4); - padding: var(--space-3) var(--space-4); -} - -.mms-import-mode { - display: grid; - gap: var(--space-5); -} - -.mms-import-rules { - align-items: start; - background: #e5e7eb; - color: var(--color-text-muted); - display: flex; - gap: var(--space-5); - justify-content: space-between; - padding: var(--space-5); -} - -.mms-import-rules strong { - color: var(--color-text-strong); - display: block; - margin-bottom: var(--space-3); -} - -.mms-import-rules p { - margin: 0 0 var(--space-2); -} - -.mms-import-panel { - min-height: 240px; -} - -.mms-import-panel .import-panel__icon { - border-radius: var(--radius-md); - height: 64px; - width: 64px; -} - -.sms-preview-card { - position: sticky; - top: calc(var(--topbar-height) + var(--space-6)); -} - -.preview-title { - align-items: center; - color: var(--color-selected); - display: flex; - gap: var(--space-2); - margin-bottom: var(--space-5); -} - -.preview-title h2 { - color: var(--color-text-strong); -} - -.phone-preview { - background: var(--color-surface-muted); - border-radius: var(--radius-sm); - padding: 22px; -} - -.phone-preview div { - background: #dbe6ff; - border: 1px solid #90b0ff; - border-radius: 10px; - box-shadow: 0 2px 5px rgba(37, 99, 235, 0.18); - color: var(--color-text); - min-height: 54px; - padding: var(--space-4); -} - -.preview-stats { - display: grid; - margin-top: var(--space-5); -} - -.preview-stats div { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: flex; - justify-content: space-between; - padding: var(--space-4) 0; -} - -.preview-stats span { - color: var(--color-text-muted); -} - -.preview-stats strong { - color: var(--color-selected); -} - -.preview-note { - background: var(--color-surface-muted); - border-radius: var(--radius-sm); - color: var(--color-text-muted); - font-size: var(--font-size-xs); - margin-top: var(--space-5); - padding: var(--space-3) var(--space-4); -} - -.mms-preview-card { - min-height: 340px; -} - -.mms-message-preview { - background: #e5e7eb; - border-radius: var(--radius-sm); - padding: var(--space-6); -} - -.mms-message-preview > div { - background: var(--color-surface); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - color: var(--color-text); - display: grid; - gap: var(--space-2); - min-height: 64px; - padding: var(--space-4); -} - -.mms-message-preview strong { - color: var(--color-text-strong); - font-size: var(--font-size-sm); -} - -.mms-message-preview p { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - line-height: 1.6; - margin: 0; -} - -.template-picker { - display: grid; - gap: var(--space-4); -} - -.template-picker__list { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - max-height: 360px; - overflow-y: auto; -} - -.template-picker__list button { - align-items: center; - background: var(--color-surface); - border: 0; - border-bottom: 1px solid var(--color-border); - color: var(--color-text); - display: flex; - gap: var(--space-4); - justify-content: space-between; - padding: var(--space-4); - text-align: left; -} - -.template-picker__list button:last-child { - border-bottom: 0; -} - -.template-picker__list button:hover, -.template-picker__list button.active { - background: var(--color-selected-soft); -} - -.template-picker__list button.active { - color: var(--color-selected); -} - -.template-picker__list span { - display: grid; - gap: var(--space-1); - min-width: 0; -} - -.template-picker__list strong { - color: var(--color-text-strong); -} - -.template-picker__list small { - color: var(--color-text-muted); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.batch-filter-card { - display: grid; - gap: var(--space-5); -} - -.batch-filter-card h2 { - font-size: var(--font-size-lg); -} - -.batch-filter-card p strong { - color: var(--color-selected); -} - -.batch-filter-grid { - align-items: end; - display: grid; - gap: var(--space-8); - grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) minmax(220px, 1fr); -} - -.batch-table-card { - overflow: hidden; - padding: 0; -} - -.batch-table { - min-width: 1080px; -} - -.batch-table th { - background: #e5e7eb; - color: var(--color-text-strong); -} - -.batch-table td { - height: 70px; -} - -.batch-table tbody tr:hover { - background: transparent; -} - -.batch-main-row td { - border-top: 12px solid var(--color-bg); - position: relative; - transition: background var(--transition-fast); -} - -.batch-main-row td, -.batch-template-row td { - background: #fbfcff; -} - -.batch-task-id { - display: grid; - gap: var(--space-2); - justify-items: start; -} - -.batch-task-id strong { - color: var(--color-text-strong); - font-size: var(--font-size-sm); -} - -.batch-template-row td { - border-top: 0; - height: auto; - padding: 0 var(--space-4) var(--space-5); - position: relative; - transition: background var(--transition-fast); -} - -.batch-main-row.batch-row--hovered td, -.batch-template-row.batch-row--hovered td { - background: #dbeafe; -} - -.batch-template-content { - align-items: flex-start; - background: var(--color-surface); - border: 1px solid #edf0f5; - border-radius: var(--radius-md); - box-shadow: inset 0 0 0 1px rgba(18, 18, 26, 0.01); - color: var(--color-text); - display: flex; - gap: var(--space-3); - line-height: 1.7; - margin-left: 0; - padding: var(--space-3) var(--space-4); - transition: border-color var(--transition-fast), box-shadow var(--transition-fast); -} - -.batch-template-row.batch-row--hovered .batch-template-content { - border-color: rgba(37, 99, 235, 0.18); - box-shadow: 0 1px 2px rgba(37, 99, 235, 0.08); -} - -.batch-template-row.batch-row--hovered .ui-inline-text-preview { - border-color: rgba(37, 99, 235, 0.18); - box-shadow: 0 1px 2px rgba(37, 99, 235, 0.08); -} - -.batch-template-content > span:first-child { - color: var(--color-text-muted); - flex: 0 0 auto; - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.batch-template-content p { - color: var(--color-text-muted); - margin: 0; -} - -.batch-template-content p strong { - color: var(--color-text-muted); - font-weight: var(--font-weight-regular); - margin-right: 2px; -} - -.batch-send-time { - display: grid; - gap: var(--space-1); -} - -.batch-send-time span { - align-items: center; - color: var(--color-selected); - display: flex; - gap: var(--space-1); - font-weight: var(--font-weight-semibold); -} - -.batch-send-time small { - color: var(--color-text-muted); -} - -.batch-progress { - display: grid; - gap: var(--space-2); -} - -.batch-progress div:first-child { - align-items: center; - display: flex; - justify-content: space-between; -} - -.batch-progress span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.batch-progress strong { - color: var(--color-selected); - font-size: var(--font-size-xs); -} - -.batch-progress__track { - background: var(--color-border-strong); - border-radius: var(--radius-full); - height: 8px; - overflow: hidden; -} - -.batch-progress__bar { - display: block; - height: 100%; -} - -.batch-progress__bar--completed { - background: var(--color-success); -} - -.batch-progress__bar--sending { - background: var(--color-selected); -} - -.batch-progress__bar--terminated { - background: var(--color-danger); -} - -.batch-actions { - display: flex; - gap: var(--space-2); - justify-content: flex-end; -} - -.batch-actions .ui-button { - min-width: 52px; -} - -.batch-actions .ui-button:last-child { - color: var(--color-danger); -} - -.mms-task-table td { - height: 96px; -} - -.mms-task-content { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: 74px minmax(0, 1fr); - min-width: 0; -} - -.mms-task-content img { - aspect-ratio: 1 / 1; - border-radius: var(--radius-sm); - object-fit: cover; - width: 74px; -} - -.mms-task-content div { - display: grid; - gap: var(--space-2); - min-width: 0; -} - -.mms-task-content strong { - color: var(--color-text-strong); - font-size: var(--font-size-md); - font-weight: var(--font-weight-semibold); -} - -.mms-task-content p { - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - color: var(--color-text-muted); - display: -webkit-box; - line-height: 1.5; - margin: 0; - overflow: hidden; -} - -.mms-detail-row-content { - align-items: center; - display: grid; - gap: 14px; - grid-template-columns: 84px minmax(0, 1fr); - min-width: 0; -} - -.mms-detail-row-content img { - aspect-ratio: 1 / 1; - border-radius: var(--radius-sm); - object-fit: cover; - width: 84px; -} - -.mms-detail-row-content div { - display: grid; - gap: 6px; - min-width: 0; -} - -.mms-detail-row-content strong { - color: var(--color-text-strong); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); -} - -.mms-detail-row-content p { - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - color: var(--color-text-muted); - display: -webkit-box; - line-height: 1.55; - margin: 0; - overflow: hidden; -} - -.mms-task-actions { - grid-template-columns: repeat(2, minmax(62px, 1fr)); -} - -.mms-task-actions .ui-button:last-child { - color: var(--color-selected); -} - -.mms-detail-template { - align-items: start; - display: grid; - gap: var(--space-5); - grid-template-columns: 220px minmax(0, 1fr); -} - -.mms-detail-template img { - aspect-ratio: 4 / 3; - border-radius: var(--radius-sm); - object-fit: cover; - width: 100%; -} - -.mms-detail-template div { - display: grid; - gap: var(--space-3); -} - -.mms-detail-template p { - color: var(--color-text); - line-height: 1.7; - margin: 0; -} - -.batch-pagination { - align-items: center; - display: flex; - justify-content: space-between; - padding: var(--space-4) var(--space-6); -} - -.batch-pagination > span { - color: var(--color-text-muted); -} - -.batch-pagination > div { - display: flex; - gap: var(--space-2); -} - -.task-detail-title { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.task-detail-title .sms-send-title__icon { - background: linear-gradient(135deg, #eff6ff 0%, #f6efe4 100%); - border-color: rgba(37, 99, 235, 0.16); - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.72); - height: 46px; - width: 46px; -} - -.task-detail-title h2 { - color: var(--color-text-strong); - font-size: 30px; - line-height: 1.15; - margin: 0; -} - -.task-detail-title p { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - margin: var(--space-2) 0 0; -} - -.task-detail { - display: grid; - gap: var(--space-6); -} - -.task-detail-section { - background: var(--color-surface); - border: 1px solid rgba(209, 213, 219, 0.72); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-xs); - display: grid; - gap: var(--space-5); - padding: var(--space-6); -} - -.task-detail-section > h3, -.task-section-title h3 { - align-items: center; - color: var(--color-text-strong); - display: flex; - font-size: var(--font-size-xl); - gap: var(--space-2); - margin: 0; -} - -.task-section-title { - align-items: center; - display: flex; - gap: var(--space-3); - justify-content: space-between; -} - -.task-info-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.task-info-grid > div { - background: linear-gradient(180deg, #fbfcfe 0%, #f7f8fa 100%); - border: 1px solid rgba(209, 213, 219, 0.74); - border-radius: var(--radius-sm); - display: grid; - gap: var(--space-2); - min-height: 78px; - padding: var(--space-4); - transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast); -} - -.task-info-grid > div:hover { - border-color: rgba(37, 99, 235, 0.22); - box-shadow: 0 8px 20px rgba(18, 18, 26, 0.05); - transform: translateY(-1px); -} - -.task-info-grid span, -.task-stat-card span, -.task-total-progress span, -.overall-rate-card span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.task-info-grid strong { - color: var(--color-text-strong); - font-size: var(--font-size-md); -} - -.task-info-full { - grid-column: 1 / -1; -} - -.task-info-full strong { - line-height: 1.7; -} - -.task-send-type { - align-items: center; - color: var(--color-selected) !important; - display: flex; - gap: var(--space-2); -} - -.text-blue { - color: var(--color-selected) !important; -} - -.text-green { - color: var(--color-success) !important; - font-weight: var(--font-weight-semibold); -} - -.task-stat-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.task-stat-card { - background: var(--color-surface); - border: 1px solid rgba(191, 219, 254, 0.9); - border-radius: var(--radius-sm); - display: grid; - gap: var(--space-2); - min-height: 96px; - overflow: hidden; - padding: var(--space-5); - position: relative; -} - -.task-stat-card::before { - content: ""; - height: 3px; - inset: 0 0 auto; - position: absolute; -} - -.task-stat-card--blue::before { - background: var(--color-selected); -} - -.task-stat-card--green { - border-color: #bbf7d0; -} - -.task-stat-card--green::before { - background: var(--color-success); -} - -.task-stat-card strong { - color: var(--color-selected); - font-size: 32px; - line-height: 1; -} - -.task-stat-card--green strong { - color: var(--color-success); -} - -.task-total-progress { - background: #f8fafc; - border: 1px solid rgba(209, 213, 219, 0.72); - border-radius: var(--radius-sm); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.task-total-progress > div:first-child { - align-items: center; - display: flex; - justify-content: space-between; -} - -.task-total-progress strong { - color: var(--color-selected); -} - -.overall-rate-card { - align-items: center; - background: - radial-gradient(circle at 50% 24%, rgba(217, 195, 160, 0.24), transparent 28%), - linear-gradient(135deg, #f8fbff 0%, #eef4ff 100%); - border: 1px solid rgba(191, 219, 254, 0.95); - border-radius: var(--radius-sm); - display: grid; - gap: var(--space-3); - justify-items: center; - min-height: 178px; - padding: var(--space-6); -} - -.overall-rate-card strong { - color: var(--color-success); - font-size: 52px; - line-height: 1; -} - -.overall-rate-card small { - color: var(--color-text-muted); -} - -.task-detail-section h4 { - color: var(--color-text-strong); - font-size: var(--font-size-base); - margin: 0; -} - -.carrier-rate-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.carrier-rate-card { - background: #ffffff; - border: 1px solid rgba(209, 213, 219, 0.78); - border-radius: var(--radius-sm); - box-shadow: var(--shadow-xs); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.carrier-rate-card > div:first-child, -.carrier-rate-card p { - align-items: center; - display: flex; - justify-content: space-between; -} - -.carrier-rate-card > div:first-child strong { - color: var(--color-text-strong); -} - -.carrier-rate-card > div:first-child span { - color: var(--color-success); - font-size: var(--font-size-xl); - font-weight: var(--font-weight-bold); -} - -.carrier-rate-card p { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - margin: 0; -} - -.city-rate-table th { - background: #f3f4f6; - color: var(--color-text-strong); -} - -.city-rate-table td { - height: 56px; -} - -.city-rate-table tbody tr:hover { - background: #f8fafc; -} - -.task-detail-title .sms-send-title__icon { - background: var(--color-brand); - border-color: var(--color-brand); - color: var(--color-accent); - height: 48px; - width: 48px; -} - -.task-detail-title h2 { - font-size: 28px; - letter-spacing: 0; -} - -.task-detail-title p { - color: #8a93a3; - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - margin-top: 6px; -} - -.task-detail { - gap: 18px; -} - -.task-detail-section { - background: #ffffff; - border: 1px solid #e9edf3; - border-radius: var(--radius-lg); - box-shadow: 0 8px 24px rgba(18, 18, 26, 0.04); - gap: 18px; - padding: 22px; -} - -.task-detail-section > h3, -.task-section-title h3 { - font-size: 18px; - gap: 8px; -} - -.task-section-title { - border-bottom: 1px solid #eef1f5; - padding-bottom: 14px; -} - -.task-info-grid { - gap: 0; - grid-template-columns: repeat(4, minmax(0, 1fr)); - overflow: hidden; - border: 1px solid #edf0f5; - border-radius: var(--radius-md); -} - -.task-info-grid > div { - background: #ffffff; - border: 0; - border-bottom: 1px solid #edf0f5; - border-right: 1px solid #edf0f5; - border-radius: 0; - box-shadow: none; - min-height: 82px; - padding: 16px 18px; - transform: none; -} - -.task-info-grid > div:nth-child(4n) { - border-right: 0; -} - -.task-info-grid > div:hover { - background: #fbfcff; - border-color: #edf0f5; - box-shadow: none; - transform: none; -} - -.task-info-grid span, -.task-stat-card span, -.task-total-progress span, -.overall-rate-card span { - color: #7b8494; - font-weight: var(--font-weight-medium); -} - -.task-info-grid strong { - color: #18202f; - font-size: 14px; - line-height: 1.55; -} - -.task-info-full { - background: #fbfcff !important; - border-bottom: 0 !important; - border-right: 0 !important; - grid-column: 1 / -1; - min-height: 92px !important; -} - -.task-info-full strong { - color: #263244; - font-size: 14px; - font-weight: var(--font-weight-medium); -} - -.task-stat-grid { - gap: 12px; -} - -.task-stat-card { - background: #ffffff; - border: 1px solid #e7ebf2; - border-radius: var(--radius-md); - box-shadow: 0 1px 2px rgba(18, 18, 26, 0.04); - min-height: 106px; - padding: 18px; -} - -.task-stat-card::before { - height: 100%; - inset: 0 auto 0 0; - width: 3px; -} - -.task-stat-card strong { - font-size: 30px; - letter-spacing: 0; -} - -.task-total-progress { - background: #fbfcff; - border-color: #e7ebf2; - border-radius: var(--radius-md); - padding: 18px; -} - -.task-total-progress .batch-progress__track { - height: 10px; -} - -.overall-rate-card { - background: - linear-gradient(180deg, rgba(37, 99, 235, 0.08), transparent 58%), - #ffffff; - border-color: #d9e6ff; - border-radius: var(--radius-md); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9); - min-height: 150px; -} - -.overall-rate-card strong { - font-size: 48px; -} - -.carrier-rate-grid { - gap: 12px; -} - -.carrier-rate-card { - border-color: #e7ebf2; - border-radius: var(--radius-md); - box-shadow: 0 1px 2px rgba(18, 18, 26, 0.04); - padding: 18px; -} - -.city-rate-table { - min-width: 760px; -} - -.city-rate-table th { - background: #f7f8fa; - border-bottom: 1px solid #e7ebf2; - color: #5f6878; - font-size: 12px; -} - -.city-rate-table td { - height: 58px; -} - -.send-detail-table-card { - overflow: hidden; - padding: 0; -} - -.send-detail-table { - min-width: 1420px; -} - -.mms-send-detail-table { - min-width: 1560px; -} - -.send-detail-table th { - background: #e5e7eb; - color: var(--color-text-strong); - height: 58px; -} - -.send-detail-main-row td { - background: #ffffff; - height: 72px; -} - -.send-detail-content-row td { - background: #ffffff; - border-top: 0; - height: auto; - padding: 0 var(--space-4) var(--space-5); -} - -.send-detail-message { - color: var(--color-text-muted); - display: block; - line-height: 1.65; - max-width: 380px; -} - -.send-detail-content-block { - align-items: flex-start; - background: #fbfcff; - border: 1px solid #edf0f5; - border-radius: var(--radius-md); - display: flex; - gap: var(--space-3); - line-height: 1.7; - padding: var(--space-3) var(--space-4); -} - -.send-detail-content-block span { - color: var(--color-text-muted); - flex: 0 0 auto; - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.send-detail-content-block p { - color: var(--color-text-muted); - margin: 0; -} - -.send-detail-app-name, -.send-detail-count, -.send-detail-time, -.send-detail-region { - display: grid; - gap: 2px; -} - -.send-detail-time, -.send-detail-region { - color: var(--color-text-muted); -} - -.send-detail-time small, -.send-detail-region small, -.send-detail-count small { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.send-detail-count strong { - color: var(--color-text-strong); -} - -.send-detail-receipt-code { - color: var(--color-success); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - font-size: var(--font-size-xs); -} - -.send-detail-carrier { - color: #374151; - font-weight: var(--font-weight-semibold); -} - -.uplink-table-card { - overflow: hidden; - padding: 0; -} - -.uplink-table-card .ui-table th { - background: #e5e7eb; - color: var(--color-text-strong); - height: 54px; -} - -.uplink-table-card .ui-table td { - height: 78px; -} - -.uplink-content { - color: var(--color-text-strong); - display: -webkit-box; - line-height: 1.6; - min-width: 320px; - overflow: hidden; - overflow-wrap: anywhere; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; -} - -.uplink-detail { - display: grid; - gap: var(--space-5); -} - -.uplink-detail-hint { - color: var(--color-text-muted); - margin: 0; -} - -.uplink-match-list { - display: grid; - gap: var(--space-5); -} - -.uplink-match-card { - background: #f1f3f5; - border: 1px solid #e5e7eb; - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.uplink-match-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.uplink-match-grid div, -.uplink-match-content { - display: grid; - gap: var(--space-2); -} - -.uplink-match-grid span, -.uplink-match-content span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.uplink-match-grid strong, -.uplink-match-content p { - color: var(--color-text-strong); -} - -.uplink-match-content p { - line-height: 1.75; - margin: 0; -} - -.uplink-match-actions { - display: flex; - justify-content: flex-end; -} - -.mms-uplink-pagination { - align-items: center; - border-top: 1px solid #edf0f5; - color: var(--color-text-muted); - display: flex; - justify-content: space-between; - padding: 16px 22px; -} - -.mms-uplink-pagination > div { - display: flex; - gap: 10px; -} - -.mms-uplink-detail .task-detail-section:first-child { - background: #ffffff; -} - -.mms-uplink-match-card { - background: #f4f6f8; -} - -.mms-uplink-image { - display: grid; - gap: var(--space-2); -} - -.mms-uplink-image span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.mms-uplink-image img { - aspect-ratio: 16 / 7; - border-radius: var(--radius-sm); - object-fit: cover; - width: 100%; -} - -.sms-app-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(3, minmax(260px, 1fr)); -} - -.sms-app-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-5); - padding: var(--space-6); -} - -.sms-app-card h2 { - font-size: var(--font-size-xl); -} - -.sms-app-card dl { - display: grid; - gap: var(--space-4); - margin: 0; -} - -.sms-app-card dl div { - align-items: center; - display: flex; - justify-content: space-between; -} - -.sms-app-card dt { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.sms-app-card dd { - color: var(--color-text-strong); - margin: 0; - text-align: right; -} - -.sms-app-card dd span { - color: var(--color-selected); -} - -.sms-app-param-table { - border: 1px solid var(--color-border); - display: grid; -} - -.sms-app-param-table div { - display: grid; - grid-template-columns: minmax(220px, 0.7fr) minmax(0, 1fr); - min-height: 58px; -} - -.sms-app-param-table div + div { - border-top: 1px solid var(--color-border); -} - -.sms-app-param-table span, -.sms-app-param-table strong { - align-items: center; - display: flex; - padding: 0 var(--space-5); -} - -.sms-app-param-table span { - background: #f1f3f5; - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.sms-app-param-table strong { - background: #ffffff; - color: var(--color-text-strong); - font-weight: var(--font-weight-medium); -} - -.signature-page-header { - align-items: center; - display: flex; - justify-content: space-between; -} - -.signature-search-row { - max-width: 360px; -} - -.signature-list { - display: grid; - gap: var(--space-5); -} - -.signature-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - overflow: hidden; - position: relative; -} - -.signature-card::before { - content: ""; - inset: 0 auto 0 0; - position: absolute; - width: 5px; -} - -.signature-card--green::before { - background: var(--color-success); -} - -.signature-card--blue::before { - background: var(--color-selected); -} - -.signature-card--amber::before { - background: var(--color-warning); -} - -.signature-card--red::before { - background: var(--color-danger); -} - -.signature-card--gray::before { - background: var(--color-text-subtle); -} - -.signature-summary { - align-items: center; - display: grid; - gap: var(--space-5); - grid-template-columns: 28px 1fr 1fr 1fr 1fr 1fr 1fr 110px; - min-height: 112px; - padding: var(--space-5) var(--space-6); -} - -.signature-summary > button { - background: transparent; - border: 0; - color: var(--color-text-muted); - display: inline-flex; - padding: 0; -} - -.signature-summary div:not(.signature-actions) { - display: grid; - gap: var(--space-2); -} - -.signature-summary span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-medium); -} - -.signature-summary strong { - color: var(--color-text-strong); -} - -.signature-actions { - display: grid; - gap: var(--space-3); -} - -.drainage-panel { - background: #f1f3f5; - border-top: 1px solid var(--color-border); - display: grid; - gap: var(--space-5); - padding: var(--space-5) var(--space-6); -} - -.drainage-panel h2 { - font-size: var(--font-size-lg); -} - -.drainage-table { - display: grid; -} - -.drainage-table__head, -.drainage-table__row { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(180px, 1.5fr) minmax(80px, 0.7fr) repeat(3, minmax(64px, 0.65fr)) minmax(196px, auto); - min-height: 58px; -} - -.drainage-table__head { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); - border-bottom: 1px solid var(--color-border); -} - -.drainage-table__row { - border-bottom: 1px solid var(--color-border); -} - -.drainage-table__url { - color: var(--color-text-strong); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.drainage-row-actions { - display: flex; - gap: var(--space-2); -} - -.drainage-panel__footer { - display: flex; - justify-content: flex-end; -} - -.admin-enterprise-signature-list .signature-summary { - gap: var(--space-2); - grid-template-columns: 22px minmax(132px, 0.9fr) minmax(168px, 1.1fr) minmax(120px, 0.8fr) minmax(82px, 0.55fr) repeat(3, minmax(64px, 0.45fr)) minmax(68px, 0.45fr) 224px; - min-height: 64px; - min-width: 1160px; - padding-inline: var(--space-3); -} - -.admin-enterprise-signature-list .signature-actions { - display: flex; - gap: 6px; - justify-self: end; - min-width: 224px; - width: 224px; -} - -.admin-enterprise-signature-list .signature-actions .ui-button, -.admin-enterprise-signature-list .drainage-row-actions .ui-button { - height: var(--control-height-sm); - justify-content: center; - min-height: var(--control-height-sm); - min-width: 0; - padding-left: 8px; - padding-right: 8px; -} - -.signature-summary .signature-summary__regular-value { - color: var(--color-text-strong); - font-weight: 400; -} - -.admin-enterprise-signature-list { - gap: 0; - overflow-x: auto; -} - -.admin-enterprise-signature-list .signature-card { - border-radius: 0; - border-top: 0; -} - -.admin-enterprise-signature-list .signature-card:last-of-type { - border-radius: 0 0 var(--radius-md) var(--radius-md); -} - -.enterprise-signature-table__head { - align-items: center; - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md) var(--radius-md) 0 0; - color: var(--color-text-muted); - display: grid; - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); - gap: var(--space-2); - grid-template-columns: 22px minmax(132px, 0.9fr) minmax(168px, 1.1fr) minmax(120px, 0.8fr) minmax(82px, 0.55fr) repeat(3, minmax(64px, 0.45fr)) minmax(68px, 0.45fr) 224px; - min-height: 46px; - min-width: 1160px; - padding-inline: var(--space-3); -} - -.enterprise-signature-table__signature { min-width: 0; } -.enterprise-signature-table__signature strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } - -.enterprise-signature-pending-summary { - align-items: center; - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: flex; - gap: var(--space-2); - min-height: 46px; - padding: var(--space-2) var(--space-4); -} - -.enterprise-signature-pending-summary strong { - color: var(--color-primary); - font-size: var(--font-size-xl); - font-variant-numeric: tabular-nums; -} - -.enterprise-signature-pending-summary .ui-button { margin-left: auto; } - -.carrier-report-count { - align-items: center; - border-radius: var(--radius-sm); - display: inline-grid; - font-size: var(--font-size-xs); - font-variant-numeric: tabular-nums; - font-weight: var(--font-weight-semibold); - gap: 1px; - justify-content: center; - justify-items: center; - line-height: 1.2; - min-width: 64px; - padding: 4px 6px; -} - -.carrier-report-count small { font-size: 11px; font-weight: var(--font-weight-medium); opacity: .82; } -.carrier-report-count--success { background: var(--color-success-soft); color: var(--color-success); } -.carrier-report-count--warning { background: var(--color-warning-soft); color: var(--color-warning); } -.carrier-report-count--danger { background: var(--color-danger-soft); color: var(--color-danger); } -.carrier-report-count--info { background: var(--color-info-soft); color: var(--color-info); } -.carrier-report-count--neutral { background: var(--color-surface-subtle); color: var(--color-text-subtle); } - -.signature-report-status { - display: grid; - gap: var(--space-4); -} - -.signature-report-status__context { - display: flex; - flex-wrap: wrap; - gap: var(--space-2) var(--space-3); -} - -.signature-report-status__context span { color: var(--color-text-muted); font-size: var(--font-size-sm); } - -.signature-report-status__carriers { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.signature-report-status__carrier { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - min-width: 0; - overflow: hidden; -} - -.signature-report-status__carrier > header { - align-items: center; - background: var(--color-surface-subtle); - display: flex; - justify-content: space-between; - min-height: 54px; - padding: var(--space-3) var(--space-4); -} - -.signature-report-status__carrier > header > span:last-child { color: var(--color-text-muted); font-size: var(--font-size-xs); } - -.signature-report-status__list { - max-height: 280px; - min-height: 190px; - overflow: auto; - padding: 0 var(--space-4); -} - -.signature-report-status__row { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: grid; - gap: var(--space-3); - grid-template-columns: minmax(0, 1fr) 168px; - min-height: 64px; -} - -.signature-report-status__row:last-child { border-bottom: 0; } -.signature-report-status__row strong { font-size: var(--font-size-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.signature-report-status__empty { color: var(--color-text-muted); font-size: var(--font-size-sm); padding: var(--space-7) 0; text-align: center; } - -@media (max-width: 920px) { - .signature-report-status__carriers { grid-template-columns: 1fr; } - .signature-report-status__list { min-height: 0; } -} - - -.signature-retirement-heatmap__total { - color: var(--color-text-strong); - font-weight: 700; - background: var(--color-surface-muted); -} - -.carrier-report-summary { - align-items: flex-start; - display: inline-flex; - flex-wrap: wrap; - gap: 4px; -} - -.carrier-report-summary small { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - line-height: 24px; - white-space: nowrap; -} - -.admin-enterprise-template-list { - display: grid; - gap: var(--space-3); -} - -.admin-enterprise-template-row { - align-items: center; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(220px, 1.15fr) minmax(280px, 1.6fr) minmax(136px, 0.65fr) 188px; - min-width: 0; - padding: var(--space-5); - transition: border-color var(--transition-fast), box-shadow var(--transition-fast); -} - -.admin-enterprise-template-row:hover { - border-color: var(--color-border-strong); - box-shadow: var(--shadow-sm); -} - -.admin-enterprise-template-row__identity, -.admin-enterprise-template-row__content, -.admin-enterprise-template-row__meta { - min-width: 0; -} - -.admin-enterprise-template-row__title { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.admin-enterprise-template-row__title > strong { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.admin-enterprise-template-row dl { - display: grid; - gap: 5px; - margin: var(--space-3) 0 0; -} - -.admin-enterprise-template-row dl div { - display: grid; - gap: var(--space-2); - grid-template-columns: 42px minmax(0, 1fr); -} - -.admin-enterprise-template-row dt, -.admin-enterprise-template-row__content > span, -.admin-enterprise-template-row__meta > span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.admin-enterprise-template-row dd { - color: var(--color-text-strong); - margin: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.admin-enterprise-template-row__content p { - color: var(--color-text-strong); - display: -webkit-box; - line-height: 1.65; - margin: var(--space-2) 0; - overflow: hidden; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.admin-enterprise-template-row__content small { - color: var(--color-text-muted); -} - -.admin-enterprise-template-row__meta { - display: grid; - gap: var(--space-2); -} - -.admin-enterprise-template-row__meta strong { - font-size: var(--font-size-sm); - font-weight: var(--font-weight-medium); -} - -.admin-enterprise-template-row__actions { - display: grid; - gap: var(--space-2); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.admin-enterprise-template-row__actions .ui-button { - justify-content: center; - min-width: 0; -} - -@media (max-width: 1180px) { - .admin-enterprise-template-row { - grid-template-columns: minmax(210px, 1fr) minmax(260px, 1.35fr) 168px; - } - - .admin-enterprise-template-row__meta { - grid-column: 1; - } - - .admin-enterprise-template-row__actions { - grid-column: 3; - grid-row: 1 / span 2; - } - -} - -@media (max-width: 860px) { - .admin-enterprise-template-row { - align-items: stretch; - grid-template-columns: 1fr; - } - - .admin-enterprise-template-row__meta, - .admin-enterprise-template-row__actions { - grid-column: auto; - grid-row: auto; - } - -} - -.system-log-filters__actions { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.detail-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.detail-grid div { - background: var(--color-bg-subtle); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-2); - padding: var(--space-4); -} - -.detail-grid span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.detail-grid strong { - color: var(--color-text-strong); - line-height: 1.7; -} - -.detail-grid__wide { - grid-column: 1 / -1; -} - -.signature-modal-title h2 { - font-size: var(--font-size-2xl); -} - -.signature-modal-title p { - color: var(--color-text-muted); - margin-top: var(--space-1); -} - -.signature-form { - display: grid; - gap: var(--space-8); -} - -.signature-form section { - display: grid; - gap: var(--space-5); -} - -.signature-form h3 { - border-left: 5px solid var(--color-selected); - padding-left: var(--space-3); -} - -.signature-form-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.signature-form-grid__wide { - grid-column: 1 / -1; -} - -.report-requirement-heading { - align-items: center; - display: flex; - justify-content: space-between; -} - -.report-requirement-heading h3 { - margin: 0; -} - -.report-field-source { - color: var(--color-text-muted); - display: block; - line-height: 1.6; - margin-top: var(--space-2); -} - -.report-requirement-explanation > p { - background: var(--color-selected-soft); - border: 1px solid #bfdbfe; - line-height: 1.7; - padding: var(--space-4); -} - -.report-source-group { - border-left: 3px solid var(--color-selected); - margin-top: var(--space-5); - padding-left: var(--space-4); -} - -.report-source-channel { - background: var(--color-bg-subtle); - margin-top: var(--space-3); - padding: var(--space-3) var(--space-4); -} - -.report-source-channel ul { - color: var(--color-text-muted); - line-height: 1.8; - margin-bottom: 0; -} - -.signature-upload { - align-items: center; - border: 2px dashed var(--color-border); - color: var(--color-text-muted); - display: grid; - gap: var(--space-2); - justify-items: center; - min-height: 170px; - padding: var(--space-5); - text-align: center; -} - -.signature-upload > span:first-child { - justify-self: start; - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.signature-upload svg { - color: var(--color-text-muted); -} - -.signature-upload strong { - color: var(--color-selected); -} - -.signature-upload small { - color: var(--color-text-muted); -} - -.signature-upload--compact { - min-height: 118px; -} - -.signature-file-line { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.signature-file-line > span { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.signature-file-line small { - color: var(--color-text-muted); -} - -.drainage-edit-form .signature-upload { - min-height: 112px; -} - -.drainage-form-note { - align-items: flex-start; -} - -.drainage-form-note ol { - margin: 0; - padding-left: var(--space-5); -} - -.drainage-file-picker { - display: grid; - gap: var(--space-2); -} - -.drainage-file-picker > span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.drainage-file-picker > div { - align-items: center; - display: grid; - gap: var(--space-3); - grid-template-columns: auto 1fr; -} - -.drainage-file-picker em { - background: var(--color-surface-subtle); - color: var(--color-text-muted); - font-style: normal; - padding: var(--space-3) var(--space-4); -} - -.mms-signature-table-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - overflow: hidden; - padding: 0; -} - -.mms-signature-table-card .ui-table th { - background: #e1e5ea; - color: #7b8494; - font-size: var(--font-size-sm); - height: 58px; -} - -.mms-signature-table-card .ui-table td { - color: var(--color-text); - height: 86px; -} - -.mms-signature-table-card .ui-table th:first-child, -.mms-signature-table-card .ui-table td:first-child { - padding-left: var(--space-6); -} - -.mms-signature-name { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.mms-signature-actions { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.mms-signature-actions .ui-button:disabled { - background: #f5f6f8; - border-color: #e5e7eb; - color: var(--color-text-subtle); - opacity: 1; -} - -.mms-signature-delete { - border-color: rgba(239, 68, 68, 0.22); - color: var(--color-danger); -} - -.mms-signature-delete:hover { - background: rgba(239, 68, 68, 0.06); - border-color: rgba(239, 68, 68, 0.36); - color: var(--color-danger); -} - -.mms-pagination { - align-items: center; - display: flex; - gap: var(--space-2); - justify-content: center; - padding: var(--space-3) 0; -} - -.mms-pagination button { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-sm); - color: var(--color-text); - height: 36px; - min-width: 36px; - padding: 0 var(--space-3); - transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast); -} - -.mms-pagination button:hover:not(:disabled), -.mms-pagination button.active { - background: var(--color-selected); - border-color: var(--color-selected); - color: var(--color-text-inverse); -} - -.mms-pagination button:disabled { - color: var(--color-text-subtle); -} - -.mms-template-header { - align-items: center; - display: flex; - justify-content: space-between; -} - -.mms-template-header .sms-send-title { - align-items: flex-start; -} - -.mms-template-header p { - color: var(--color-text-muted); - margin-top: var(--space-2); -} - -.mms-template-toolbar { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(0, 1fr) auto; -} - -.mms-template-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(320px, 1fr)); -} - -.mms-template-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - grid-template-rows: auto auto; - min-height: 0; - overflow: hidden; - position: relative; - transition: border-color var(--transition-fast), box-shadow var(--transition-fast), transform var(--transition-fast); -} - -.mms-template-card:hover { - border-color: rgba(37, 99, 235, 0.2); - box-shadow: var(--shadow-sm); - transform: translateY(-1px); -} - -.mms-template-card::before { - content: ""; - inset: 0 auto 0 0; - position: absolute; - width: 5px; -} - -.mms-template-card--green::before { - background: var(--color-success); -} - -.mms-template-card--blue::before { - background: var(--color-selected); -} - -.mms-template-card--gray::before { - background: var(--color-text-subtle); -} - -.mms-template-card__body { - display: grid; - gap: 10px; - padding: var(--space-5) var(--space-5) var(--space-4); -} - -.mms-template-meta { - display: grid; - gap: 7px; - padding-right: 128px; -} - -.mms-template-card h2 { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - line-height: 1.3; -} - -.mms-template-card h3 { - color: var(--color-text-strong); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - line-height: 1.28; - margin-top: 1px; -} - -.mms-template-code { - color: var(--color-text-muted); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - font-size: var(--font-size-sm); - line-height: 1.28; - margin-bottom: 0; -} - -.mms-template-card img { - aspect-ratio: 16 / 7.2; - border-radius: var(--radius-sm); - display: block; - object-fit: cover; - width: 100%; -} - -.mms-template-content { - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - color: var(--color-text-muted); - display: -webkit-box; - line-height: 1.45; - margin: 0; - overflow: hidden; -} - -.mms-template-app-tag { - background: var(--color-selected-soft); - border: 1px solid rgba(37, 99, 235, 0.16); - border-radius: var(--radius-full); - color: var(--color-selected); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); - padding: 5px 10px; - position: absolute; - right: var(--space-5); - top: var(--space-5); - z-index: 1; -} - -.mms-template-status { - display: grid; - gap: 6px; - margin-top: 2px; -} - -.mms-template-status > span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.mms-template-status > div { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.mms-template-status section { - align-items: center; - display: inline-flex; - gap: 5px; - min-width: 0; -} - -.mms-template-status small { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.mms-template-card__footer { - align-items: center; - background: #f4f6f8; - border-top: 1px solid var(--color-border); - display: flex; - gap: var(--space-2); - justify-content: space-between; - min-height: 48px; - padding: 0 var(--space-5); -} - -.mms-template-card__footer > span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.mms-template-card__footer div { - align-items: center; - display: flex; - gap: var(--space-5); -} - -.mms-template-card__footer button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - display: inline-flex; - gap: 4px; - font-weight: var(--font-weight-semibold); - padding: 0; -} - -.mms-template-card__footer button:nth-child(2) { - color: var(--color-text-strong); -} - -.mms-template-card__footer button:last-child { - color: var(--color-danger); -} - -.mms-template-modal-title h2 { - font-size: var(--font-size-2xl); -} - -.mms-template-modal-title p { - color: var(--color-text-muted); - line-height: 1.55; - margin-top: var(--space-2); - max-width: 980px; -} - -.mms-template-form { - display: grid; - gap: var(--space-5); -} - -.mms-template-form-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.mms-frame-header { - align-items: center; - display: flex; - justify-content: space-between; -} - -.mms-frame-header div { - align-items: baseline; - display: flex; - gap: var(--space-2); -} - -.mms-frame-header strong { - color: var(--color-text-strong); -} - -.mms-frame-header span { - color: var(--color-text-muted); -} - -.mms-frame-list { - display: grid; - gap: var(--space-5); -} - -.mms-frame { - background: #eef0f2; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-3); - padding: var(--space-4); -} - -.mms-frame__top { - align-items: center; - display: grid; - gap: var(--space-3); - grid-template-columns: auto 124px 1fr; -} - -.mms-frame__top > strong { - color: var(--color-text-strong); -} - -.mms-frame__top > button { - background: transparent; - border: 0; - color: var(--color-danger); - justify-self: end; - padding: 0; -} - -.mms-frame-type .ui-field__label { - display: none; -} - -.mms-frame-type .ui-select button { - background: var(--color-surface); -} - -.mms-frame .ui-textarea { - background: var(--color-surface); - border-color: transparent; - min-height: 106px; -} - -.mms-file-drop { - align-items: center; - background: var(--color-surface); - border: 2px dashed var(--color-border); - color: var(--color-text-muted); - display: grid; - gap: var(--space-3); - justify-items: center; - min-height: 132px; - padding: var(--space-5); - text-align: center; -} - -.mms-file-drop div { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.mms-file-drop strong { - color: var(--color-text-strong); -} - -.mms-file-drop small { - color: var(--color-text-muted); -} - -.mms-save-button { - background: #7c3aed; - border-color: #7c3aed; -} - -.mms-save-button:hover { - background: #6d28d9; - border-color: #6d28d9; -} - -.mms-preview { - display: grid; - gap: var(--space-4); -} - -.mms-preview img { - aspect-ratio: 16 / 9; - border-radius: var(--radius-md); - object-fit: cover; - width: 100%; -} - -.mms-preview p { - color: var(--color-text-muted); - line-height: 1.75; -} - -.mms-preview-frames { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.mms-preview-frames span { - align-items: center; - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-full); - color: var(--color-text-muted); - display: inline-flex; - gap: var(--space-1); - min-height: 30px; - padding: 0 var(--space-3); -} - -.template-toolbar { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(0, 1fr) auto; -} - -.template-card-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); - min-width: 0; -} - -.template-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - min-height: 300px; - min-width: 0; - overflow: hidden; - padding: var(--space-6); - position: relative; -} - -.template-card::before { - content: ""; - inset: 0 auto 0 0; - position: absolute; - width: 5px; -} - -.template-card--green::before { - background: var(--color-success); -} - -.template-card--blue::before { - background: var(--color-selected); -} - -.template-card--red::before { - background: var(--color-danger); -} - -.template-card h2 { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - line-height: 1.3; -} - -.template-hash { - color: var(--color-text-muted); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - margin: 0; -} - -.template-content { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - line-height: 1.65; - margin: 0; -} - -.template-vars { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.template-vars span { - color: var(--color-text-muted); -} - -.template-vars strong, -.template-current-vars strong { - background: #e8f0ff; - border-radius: var(--radius-sm); - color: var(--color-selected); - font-weight: var(--font-weight-medium); - padding: 5px 10px; -} - -.template-card-footer { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - justify-content: space-between; - margin-top: auto; - padding-top: var(--space-4); -} - -.template-card-footer span { - color: var(--color-text-muted); -} - -.template-card-footer div { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); -} - -.template-card-footer button { - background: transparent; - border: 0; - color: var(--color-selected); - padding: 0; -} - -.template-card-footer button:last-child { - color: var(--color-danger); -} - -.template-form { - display: grid; - gap: var(--space-5); -} - -.template-form .ui-textarea { - min-height: 220px; -} - -.template-form-meta { - align-items: center; - display: flex; - justify-content: space-between; -} - -.template-form-meta button { - background: transparent; - border: 0; - color: var(--color-selected); - font-weight: var(--font-weight-semibold); - padding: 0; -} - -.template-form-meta span { - color: var(--color-text-muted); -} - -.template-variable-panel { - border: 1px solid var(--color-border); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.template-variable-panel h3 { - font-size: var(--font-size-lg); -} - -.template-variable-buttons { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); -} - -.template-variable-buttons button { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-sm); - color: var(--color-text); - min-height: 36px; - padding: 0 var(--space-4); -} - -.template-variable-buttons button:hover { - border-color: var(--color-selected); - color: var(--color-selected); -} - -.template-custom-variable { - display: grid; - gap: var(--space-3); - grid-template-columns: minmax(0, 1fr) 96px; -} - -.template-info-tip { - align-items: center; - background: var(--color-selected-soft); - border-left: 4px solid var(--color-selected); - color: var(--color-text); - display: flex; - gap: var(--space-3); - line-height: 1.7; - padding: var(--space-4); -} - -.template-info-tip svg { - color: var(--color-selected); - flex: 0 0 auto; -} - -.template-current-vars { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.task-detail-title h2 { - font-size: 22px; -} - -.task-stat-layout { - display: grid; - gap: 14px; - grid-template-columns: minmax(280px, 0.9fr) minmax(0, 1.4fr); -} - -.task-progress-card { - background: - linear-gradient(180deg, rgba(37, 99, 235, 0.08), transparent 64%), - #ffffff; - border: 1px solid #dbe7ff; - border-radius: var(--radius-md); - display: grid; - gap: 14px; - padding: 20px; -} - -.task-progress-card span, -.task-stat-list span { - color: #7b8494; - font-size: var(--font-size-xs); - font-weight: var(--font-weight-medium); -} - -.task-progress-card strong { - color: var(--color-selected); - font-size: 42px; - line-height: 1; -} - -.task-progress-card small { - color: #7b8494; -} - -.task-stat-list { - background: #ffffff; - border: 1px solid #e7ebf2; - border-radius: var(--radius-md); - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - overflow: hidden; -} - -.task-stat-list > div { - align-content: center; - border-right: 1px solid #edf0f5; - display: grid; - gap: 10px; - min-height: 138px; - padding: 20px; -} - -.task-stat-list > div:last-child { - border-right: 0; -} - -.task-stat-list strong { - color: #18202f; - font-size: 28px; - line-height: 1; -} - -.overall-rate-card { - min-height: 188px; -} - -.overall-rate-split { - display: grid; - gap: 12px; - grid-template-columns: repeat(2, minmax(120px, 1fr)); - width: min(420px, 100%); -} - -.overall-rate-split div { - background: rgba(255, 255, 255, 0.78); - border: 1px solid rgba(209, 213, 219, 0.72); - border-radius: var(--radius-md); - display: grid; - gap: 4px; - justify-items: center; - padding: 12px; -} - -.overall-rate-split b { - color: #18202f; - font-size: 18px; -} - -.rate-tone-low, -.rate-tone-low .batch-progress__bar { - --rate-color: var(--color-danger); -} - -.rate-tone-medium, -.rate-tone-medium .batch-progress__bar { - --rate-color: var(--color-warning); -} - -.rate-tone-high, -.rate-tone-high .batch-progress__bar { - --rate-color: var(--color-success); -} - -.overall-rate-card.rate-tone-low { - background: linear-gradient(180deg, rgba(220, 38, 38, 0.09), transparent 58%), #ffffff; - border-color: rgba(220, 38, 38, 0.28); -} - -.overall-rate-card.rate-tone-medium { - background: linear-gradient(180deg, rgba(217, 119, 6, 0.1), transparent 58%), #ffffff; - border-color: rgba(217, 119, 6, 0.28); -} - -.overall-rate-card.rate-tone-high { - background: linear-gradient(180deg, rgba(22, 163, 74, 0.09), transparent 58%), #ffffff; - border-color: rgba(22, 163, 74, 0.26); -} - -.overall-rate-card.rate-tone-low strong, -.carrier-rate-card.rate-tone-low > div:first-child span, -.rate-text.rate-tone-low { - color: var(--color-danger) !important; -} - -.overall-rate-card.rate-tone-medium strong, -.carrier-rate-card.rate-tone-medium > div:first-child span, -.rate-text.rate-tone-medium { - color: var(--color-warning) !important; -} - -.overall-rate-card.rate-tone-high strong, -.carrier-rate-card.rate-tone-high > div:first-child span, -.rate-text.rate-tone-high { - color: var(--color-success) !important; -} - -.rate-text { - font-weight: var(--font-weight-semibold); -} - -.carrier-rate-card .batch-progress__bar, -.city-rate-table .batch-progress__bar { - background: var(--rate-color, var(--color-success)); -} - -.detail-message { - color: var(--color-text-muted); - display: block; - max-width: 330px; -} - -.receipt { - color: var(--color-success); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - font-size: var(--font-size-xs); - font-weight: var(--font-weight-semibold); -} - -.receipt--failed { - color: var(--color-danger); -} - -.content-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(0, 1.4fr) minmax(300px, 0.6fr); -} - -.soft-panel { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - min-width: 0; - padding: var(--space-5); -} - -.soft-panel h3 { - margin-bottom: var(--space-3); -} - -.summary-list { - display: grid; - gap: var(--space-3); -} - -.summary-list div { - align-items: center; - display: flex; - justify-content: space-between; -} - -.summary-list span { - color: var(--color-text-muted); -} - -.summary-list strong { - color: var(--color-text-strong); -} - -.plan-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.plan-card { - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.plan-card--highlight { - border-color: rgba(217, 195, 160, 0.78); - box-shadow: 0 0 0 3px rgba(217, 195, 160, 0.18); -} - -.plan-card strong { - color: var(--color-text-strong); - font-size: 26px; - line-height: var(--line-height-tight); -} - -.muted { - color: var(--color-text-muted); -} - -.text-strong { - color: var(--color-text-strong); -} - -.status-success { - color: var(--color-success); -} - -.status-warning { - color: var(--color-warning); -} - -.status-danger { - color: var(--color-danger); -} - -.status-info { - color: var(--color-info); -} - -.empty-state { - align-items: center; - display: grid; - justify-items: center; - min-height: 240px; - text-align: center; -} - -.empty-state strong { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.empty-state span { - color: var(--color-text-muted); - margin-top: var(--space-2); -} - -.login-page { - position: relative; - isolation: isolate; - min-height: 100vh; - display: grid; - grid-template-columns: minmax(0, 1fr); - place-items: center; - padding: 36px 20px; - background: - radial-gradient(circle at 18% 16%, rgba(37, 99, 235, 0.12), transparent 32%), - radial-gradient(circle at 82% 14%, rgba(16, 185, 129, 0.1), transparent 30%), - linear-gradient(135deg, rgba(37, 99, 235, 0.08), rgba(15, 23, 42, 0.04)), - var(--color-bg); -} - -.client-login-canvas { - position: absolute; - inset: 0; - z-index: 0; - width: 100%; - height: 100%; - pointer-events: none; -} - -.login-panel { - position: relative; - z-index: 1; - box-sizing: border-box; - max-width: 428px; - min-width: 0; - width: 100%; - padding: 34px 34px 30px; - border: 1px solid rgba(148, 163, 184, 0.24); - border-radius: 8px; - background: var(--color-surface); - box-shadow: 0 26px 70px rgba(15, 23, 42, 0.14); -} - -.login-brand { - display: grid; - justify-items: center; - gap: 14px; - margin-bottom: 30px; - text-align: center; -} - -.login-brand img { - display: block; - width: 178px; - height: 64px; - object-fit: contain; -} - -.login-brand h1 { - margin: 0; - color: var(--color-text-strong); - font-size: 24px; - font-weight: 800; - letter-spacing: 0; - line-height: 1.15; -} - -.login-brand p { - margin: 8px 0 0; - color: var(--color-text-muted); - font-size: 15px; - font-weight: 500; -} - -.login-form { - display: grid; - gap: 17px; -} - -.login-captcha-row { - display: grid; - grid-template-columns: 1fr 136px; - gap: 12px; - align-items: end; -} - -.login-captcha { - height: 40px; - border: 1px solid var(--color-border); - border-radius: 8px; - background: linear-gradient(180deg, #fff, var(--color-surface-muted)); - color: var(--color-text-strong); - font-weight: 700; - cursor: pointer; -} - -.login-error { - margin: 0; - padding: 10px 12px; - border-radius: 8px; - color: var(--color-danger); - background: rgba(239, 68, 68, 0.1); -} - -.login-session-notice { - margin: 0; - padding: 10px 12px; - border: 1px solid rgba(37, 99, 235, 0.2); - border-radius: 8px; - color: var(--color-text-strong); - background: rgba(37, 99, 235, 0.08); - line-height: 1.6; -} - -.page-loading-state { - min-height: 100vh; - display: grid; - place-items: center; - color: var(--color-text-muted); - background: var(--color-surface-muted); -} - -.login-alert-message { - margin: 0; - color: var(--color-text-strong); - line-height: 1.7; -} - -.system-page { - gap: 28px; -} - -.system-page-toolbar { - align-items: center; - display: flex; - justify-content: space-between; -} - -.system-log-export { - align-items: flex-end; - display: flex; - flex-direction: column; - gap: 8px; - max-width: min(100%, 680px); -} - -.system-log-export__result, -.system-log-export__error { - align-items: center; - border-radius: var(--radius-md); - display: flex; - font-size: 13px; - gap: 8px; - justify-content: space-between; - padding: 8px 10px; -} - -.system-log-export__result { background: var(--color-success-soft); color: var(--color-success-strong); } -.system-log-export__error { background: var(--color-danger-soft); color: var(--color-danger-strong); } - -.risk-action-content { display: grid; gap: 18px; } -.risk-action-content section { display: grid; gap: 8px; } -.risk-action-content h3 { font-size: 14px; margin: 0; } -.risk-action-content ul { margin: 0; padding-left: 20px; } -.risk-action-identity { background: var(--color-surface-muted); border-radius: var(--radius-lg); display: grid; gap: 10px; grid-template-columns: repeat(2, minmax(0, 1fr)); padding: 14px; } -.risk-action-identity div { display: grid; gap: 3px; min-width: 0; } -.risk-action-identity span { color: var(--color-text-muted); font-size: 12px; } -.risk-action-identity strong { overflow-wrap: anywhere; } -.risk-action-blockers { color: var(--color-danger-strong); list-style: none; padding: 0 !important; } -.risk-action-blockers li, .risk-action-passed { align-items: center; display: flex; gap: 7px; } -.risk-action-passed { color: var(--color-success-strong); margin: 0; } -.risk-action-result { align-items: center; background: var(--color-success-soft); border-radius: var(--radius-lg); color: var(--color-success-strong); display: flex; gap: 10px; padding: 14px; } -.risk-action-result div { display: grid; gap: 4px; } -.risk-action-result span { font-size: 12px; overflow-wrap: anywhere; } - -@media (max-width: 640px) { .risk-action-identity { grid-template-columns: 1fr; } } -.delete-risk-dependencies { display: grid; gap: 8px; list-style: none; padding: 0 !important; } -.delete-risk-dependencies li { align-items: center; background: var(--color-surface-muted); border-radius: var(--radius-md); display: grid; gap: 3px; grid-template-columns: 1fr auto; padding: 10px 12px; } -.delete-risk-dependencies small { color: var(--color-text-muted); grid-column: 1 / -1; overflow-wrap: anywhere; } -.delete-risk-selections { display: grid; gap: 10px; } -.delete-risk-selections > h3, .delete-risk-selections > p { margin: 0; } -.delete-risk-selections label { align-items: flex-start; background: var(--color-surface-muted); border: 1px solid var(--color-border); border-radius: var(--radius-md); cursor: pointer; display: flex; gap: 10px; padding: 11px 12px; } -.delete-risk-selections input { flex: 0 0 auto; margin-top: 3px; } -.delete-risk-selections label > span { display: grid; gap: 4px; } -.delete-risk-selections small { color: var(--color-text-muted); line-height: 1.55; } -.delete-risk-action .ui-textarea { min-height: 88px; } - -@media (max-width: 640px) { - .system-page-toolbar { align-items: stretch; flex-direction: column; } - .system-log-export { align-items: stretch; max-width: none; } - .system-log-export > .ui-button { min-height: 44px; width: 100%; } - .system-log-export__result, - .system-log-export__error { align-items: stretch; flex-direction: column; } -} - -.system-filter-row { - max-width: 520px; -} - -.system-log-filters { - align-items: end; - display: grid; - gap: 22px; - grid-template-columns: minmax(280px, 1.2fr) repeat(3, minmax(190px, .65fr)) auto; -} - -.system-log-range { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: 12px; -} - -.system-log-range > span { - align-items: center; - color: var(--color-text-muted); - display: inline-flex; - gap: 8px; -} - -.system-table-card { - overflow: hidden; - padding: 0; -} - -.system-table-card .ui-table-wrap { - border: 0; - border-radius: 0; -} - -.system-table-card .ui-table { - min-width: 1080px; -} - -.system-table-card .ui-table th { - background: #e5e7eb; - color: #7b8494; - height: 58px; -} - -.system-table-card .ui-table td { - height: 72px; -} - -.system-table-card .ui-table tbody tr:nth-child(odd) td { - background: #ffffff; -} - -.system-table-card .ui-table tbody tr:nth-child(even) td { - background: #fbfcfe; -} - -.system-table-card .ui-table tbody tr:hover td { - background: #f2f5fa; -} - -.inline-actions { - align-items: center; - display: flex; - gap: 12px; -} - -.system-user-form { - display: grid; - gap: 24px; - padding-bottom: 96px; -} - -.system-user-form .ui-field__label { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.system-log-detail { - color: var(--color-text-muted); - line-height: 1.6; -} - -.system-log-detail-card { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-1); - line-height: 1.55; - max-width: 360px; - padding: var(--space-3); -} - -.system-log-detail-card strong { - color: var(--color-text-strong); - font-size: var(--font-size-sm); -} - -.system-log-detail-card span { - color: var(--color-text-muted); -} - -.system-log-detail-card small { - color: var(--color-selected); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - font-size: var(--font-size-xs); -} - -.protocol-log-hint { - background: var(--color-info-soft); - border: 1px solid color-mix(in srgb, var(--color-info) 24%, transparent); - border-radius: var(--radius-md); - color: var(--color-text); - font-size: var(--font-size-sm); - padding: var(--space-3) var(--space-4); -} - -.protocol-log-filters { - grid-template-columns: minmax(240px, 1.2fr) repeat(4, minmax(125px, .5fr)) minmax(230px, .8fr) auto; -} - -.protocol-log-table .ui-table { - min-width: 1320px; -} - -.protocol-log-table .ui-table th:last-child, -.protocol-log-table .ui-table td:last-child { - background: var(--color-surface); - box-shadow: -10px 0 18px -18px rgba(15, 23, 42, .6); - position: sticky; - right: 0; - z-index: 1; -} - -.protocol-log-identifiers, -.protocol-log-result { - display: grid; - gap: 4px; -} - -.protocol-log-identifiers small, -.protocol-log-result small { - color: var(--color-text-muted); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - overflow-wrap: anywhere; -} - -.protocol-log-detail { - display: grid; - gap: var(--space-3); - margin: 0; -} - -.protocol-log-detail > div { - display: grid; - gap: var(--space-1); - grid-template-columns: minmax(130px, .35fr) minmax(0, 1fr); -} - -.protocol-log-detail dt { - color: var(--color-text-muted); -} - -.protocol-log-detail dd { - margin: 0; - overflow-wrap: anywhere; -} - -@media (max-width: 1024px) { - .protocol-log-filters { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -@media (max-width: 640px) { - .protocol-log-filters { - grid-template-columns: 1fr; - } - - .protocol-log-detail > div { - grid-template-columns: 1fr; - } -} - -.enterprise-page { - gap: 28px; -} - -.enterprise-page-title { - color: var(--color-text-strong); - font-size: var(--font-size-2xl); - font-weight: var(--font-weight-semibold); - margin: 0; -} - -.enterprise-status-card { - align-items: center; - display: flex; - gap: 14px; - min-height: 96px; - padding: 0 34px; -} - -.enterprise-status-card strong { - color: var(--color-text-strong); - font-size: var(--font-size-md); -} - -.enterprise-status-card--pending { - border-color: rgba(37, 99, 235, 0.26); -} - -.enterprise-status-card--approved { - border-color: rgba(22, 163, 74, 0.28); -} - -.enterprise-status-card--rejected { - border-color: rgba(220, 38, 38, 0.28); -} - -.enterprise-review-status { - align-items: center; - border-radius: var(--radius-full); - display: inline-flex; - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - min-height: 30px; - padding: 0 var(--space-3); -} - -.enterprise-review-status--uncertified { - background: var(--color-surface-muted); - color: var(--color-text-muted); -} - -.enterprise-review-status--pending { - background: var(--color-info-soft); - color: var(--color-info); -} - -.enterprise-review-status--approved { - background: var(--color-success-soft); - color: var(--color-success); -} - -.enterprise-review-status--rejected { - background: var(--color-danger-soft); - color: var(--color-danger); -} - -.enterprise-status-card button, -.enterprise-result button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: 4px; -} - -.enterprise-info-card { - padding: 44px 54px; -} - -.enterprise-info-card dl { - display: grid; - gap: 34px 120px; - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin: 0; - max-width: 1120px; -} - -.enterprise-info-card div, -.enterprise-result dl div { - display: grid; - gap: 14px; - grid-template-columns: 170px minmax(0, 1fr); -} - -.enterprise-info-card dt, -.enterprise-result dt { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.enterprise-info-card dd, -.enterprise-result dd { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); - margin: 0; -} - -.enterprise-flow-card { - min-height: 700px; - padding: 46px 54px; -} - -.enterprise-stepper { - align-items: center; - display: flex; - justify-content: center; - margin-bottom: 82px; -} - -.enterprise-stepper__item { - align-items: center; - display: flex; - gap: 14px; -} - -.enterprise-stepper__dot { - align-items: center; - background: #d1d5db; - border-radius: var(--radius-full); - color: #8b95a5; - display: inline-flex; - font-weight: var(--font-weight-bold); - height: 44px; - justify-content: center; - width: 44px; -} - -.enterprise-stepper__dot.is-active, -.enterprise-stepper__dot.is-complete { - background: var(--color-selected); - color: #ffffff; -} - -.enterprise-stepper__item strong { - color: #8b95a5; - font-size: var(--font-size-md); -} - -.enterprise-stepper__item strong.is-active { - color: var(--color-text-strong); -} - -.enterprise-stepper__arrow { - color: #8b95a5; - margin: 0 28px; -} - -.enterprise-form-panel, -.enterprise-verify-panel, -.enterprise-face-panel { - display: grid; - gap: 26px; - margin-left: 0; - max-width: 920px; -} - -.enterprise-form-panel { - margin-left: 0; -} - -.enterprise-required, -.enterprise-address-selects > span { - color: var(--color-text-strong); - font-size: var(--font-size-md); - font-weight: var(--font-weight-semibold); -} - -.enterprise-required::first-letter, -.enterprise-address-selects > span::first-letter { - color: var(--color-danger); -} - -.enterprise-upload { - align-items: center; - border: 2px dashed #dfe4ec; - color: var(--color-selected); - display: grid; - gap: 12px; - height: 176px; - justify-items: center; - max-width: 920px; -} - -.enterprise-upload strong { - color: var(--color-selected); - font-size: var(--font-size-md); -} - -.enterprise-help, -.enterprise-form-note, -.enterprise-verify-panel small { - color: var(--color-text-muted); - line-height: 1.7; - margin: -12px 0 0; -} - -.enterprise-address-selects { - display: grid; - gap: 12px; -} - -.enterprise-address-selects > div { - display: flex; - gap: 16px; -} - -.enterprise-address-selects .ui-field { - min-width: 140px; - width: 236px; -} - -.enterprise-actions { - align-items: center; - display: flex; - gap: 16px; - justify-content: flex-end; - margin-top: 16px; -} - -.enterprise-actions--center { - justify-content: center; -} - -.enterprise-method-panel { - display: grid; - gap: 24px; - margin: 0 auto; - max-width: 1060px; - width: 100%; -} - -.enterprise-method-card { - align-items: center; - background: #ffffff; - border: 1px solid #e1e6ef; - border-radius: var(--radius-sm); - display: grid; - gap: 22px; - grid-template-columns: 88px minmax(0, 1fr); - min-height: 168px; - padding: 34px; - text-align: left; -} - -.enterprise-method-card.is-selected { - border-color: var(--color-selected); - box-shadow: inset 0 0 0 1px rgba(37, 99, 235, 0.35); -} - -.enterprise-method-card svg { - color: #c8d0dc; -} - -.enterprise-method-card strong { - color: var(--color-text-strong); - font-size: 20px; -} - -.enterprise-method-card strong span, -.enterprise-verify-copy em, -.enterprise-info-alert em, -.enterprise-qr-section em { - color: #ff7a00; - font-style: normal; -} - -.enterprise-method-card p { - color: var(--color-text-muted); - font-size: var(--font-size-md); - line-height: 1.75; - margin: 4px 0 0; -} - -.enterprise-verify-panel, -.enterprise-face-panel { - margin-left: 0; -} - -.enterprise-verify-panel > p, -.enterprise-face-panel > p { - align-items: center; - display: flex; - gap: 28px; - margin: 0; -} - -.enterprise-verify-panel > p span, -.enterprise-face-panel > p span { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.enterprise-verify-copy { - color: var(--color-text-muted); - line-height: 1.8; - margin-top: 18px !important; -} - -.enterprise-verify-copy em:first-of-type { - color: var(--color-danger); -} - -.enterprise-verify-panel h2, -.enterprise-face-panel h2 { - color: var(--color-text-strong); - font-size: 22px; - margin: 24px 0 0; -} - -.enterprise-info-alert { - align-items: flex-start; - background: #eff6ff; - border: 1px solid #bfdbfe; - color: #344054; - display: flex; - gap: 14px; - line-height: 1.8; - margin-top: 24px; - max-width: 920px; - padding: 22px; -} - -.enterprise-info-alert svg { - color: var(--color-selected); - flex: 0 0 auto; - margin-top: 3px; -} - -.enterprise-face-panel { - max-width: 920px; -} - -.enterprise-qr-section { - display: grid; - gap: 22px; - justify-items: center; - margin-top: 36px; - text-align: center; -} - -.enterprise-legal-summary { - display: grid; - gap: 22px; - margin: 0; -} - -.enterprise-legal-summary div { - display: flex; - gap: 28px; -} - -.enterprise-legal-summary dt { - color: var(--color-text-muted); - min-width: 150px; -} - -.enterprise-legal-summary dd { - color: var(--color-text-strong); - margin: 0; -} - -.enterprise-qr-section h2, -.enterprise-qr-section p { - justify-self: start; - margin: 0; - text-align: left; -} - -.enterprise-qr-section p { - color: var(--color-text-muted); - line-height: 1.8; -} - -.enterprise-qr { - align-items: center; - border: 2px solid #e1e5ec; - color: #ff4040; - display: flex; - font-size: 34px; - height: 280px; - justify-content: center; - width: 280px; -} - -.enterprise-qr-section > span { - color: var(--color-text-muted); -} - -.enterprise-success-test { - background: var(--color-success); - border-color: var(--color-success); -} - -.enterprise-result { - align-items: center; - display: grid; - justify-items: center; - min-height: 610px; - text-align: center; -} - -.enterprise-result > span { - align-items: center; - border-radius: var(--radius-full); - display: inline-flex; - justify-content: center; -} - -.enterprise-result--success > span, -.enterprise-result--pending > span { - background: #00bb38; - color: #ffffff; - height: 132px; - width: 132px; -} - -.enterprise-result--pending > span { - background: var(--color-selected); -} - -.enterprise-result--failed > span { - border: 5px solid #ff4040; - color: #ff4040; - font-size: 62px; - height: 132px; - width: 132px; -} - -.enterprise-result h2 { - color: var(--color-text-strong); - font-size: 28px; - margin: 28px 0 22px; -} - -.enterprise-result dl { - display: grid; - gap: 22px; - margin: 0 0 50px; - text-align: left; -} - -.enterprise-result--failed p { - color: var(--color-text-muted); - margin: 0; -} - -.enterprise-result--failed > strong { - color: #ff7a00; - font-size: 26px; - margin: 14px 0 26px; -} - -.admin-dashboard-hero { - background: #ffffff; - border: 1px solid var(--color-border); - color: var(--color-text); -} - -.admin-dashboard-hero h1 { - color: var(--color-text-strong); -} - -.admin-dashboard-main-grid { - grid-template-columns: minmax(0, 1fr) minmax(360px, 0.72fr); -} - -.admin-metric-grid { - grid-template-columns: repeat(5, minmax(0, 1fr)); -} - -.metric-card__value--danger { - color: var(--color-danger) !important; -} - -@media (max-width: 1380px) { - .admin-metric-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); - } -} - -.admin-workload-grid { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.admin-workload-card { - background: #fbfcff; - border: 1px solid #edf0f5; - border-radius: var(--radius-md); - display: grid; - gap: var(--space-2); - justify-items: start; - min-height: 112px; - padding: var(--space-4); - text-align: left; - transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast); -} - -.admin-workload-card:hover { - background: #f3f7ff; - border-color: rgba(37, 99, 235, 0.24); - transform: translateY(-1px); -} - -.admin-workload-card strong { - color: var(--color-text-strong); - font-size: 28px; - line-height: 1; -} - -.admin-workload-card span:not(.ui-tag) { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.admin-alert-list { - display: grid; - gap: var(--space-3); -} - -.admin-alert { - border: 1px solid #edf0f5; - border-left-width: 4px; - border-radius: var(--radius-md); - display: grid; - gap: var(--space-2); - padding: var(--space-4); -} - -.admin-alert--danger { - border-left-color: var(--color-danger); -} - -.admin-alert--warning { - border-left-color: var(--color-warning); -} - -.admin-alert--info { - border-left-color: var(--color-selected); -} - -.admin-alert > div { - align-items: center; - display: flex; - gap: var(--space-3); - justify-content: space-between; -} - -.admin-alert strong { - color: var(--color-text-strong); -} - -.admin-alert span, -.admin-alert p { - color: var(--color-text-muted); -} - -.admin-alert p { - line-height: 1.6; - margin: 0; -} - -.enterprise-summary-grid { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.enterprise-query-grid { - grid-template-columns: minmax(180px, 1fr) minmax(220px, 1fr) minmax(180px, 1fr) auto; -} - -.enterprise-query-actions { - align-items: end; - display: flex; - gap: var(--space-3); -} - -.enterprise-inline-tag { - margin-left: var(--space-2); -} - -.enterprise-form { - display: grid; - gap: var(--space-5); -} - -.enterprise-form-page { - max-width: 1120px; -} - -.enterprise-form-card { - display: grid; - gap: var(--space-6); -} - -.enterprise-upload-panel { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: 120px 176px minmax(0, 1fr); -} - -.enterprise-upload-panel > span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.enterprise-upload-panel button, -.enterprise-upload-button { - align-items: center; - background: #ffffff; - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-md); - color: var(--color-selected); - display: grid; - gap: var(--space-2); - height: 142px; - justify-items: center; - text-align: center; -} - -.enterprise-upload-button { - min-width: 0; - overflow-wrap: anywhere; - padding: var(--space-3); - width: 176px; -} - -.enterprise-upload-panel p { - color: var(--color-text-muted); - line-height: var(--line-height-base); - margin: 0; -} - -.enterprise-info-tip { - background: var(--color-selected-soft); - border: 1px solid #bfdbfe; - border-radius: var(--radius-md); - color: var(--color-text); - padding: var(--space-4); -} - -.admin-enterprise-detail { - max-width: 1320px; -} - -.admin-detail-backbar { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.admin-detail-backbar > span { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.admin-enterprise-profile { - display: grid; - gap: var(--space-6); -} - -.admin-enterprise-profile__main { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.admin-enterprise-profile__icon { - align-items: center; - background: var(--color-selected-soft); - border-radius: var(--radius-md); - color: var(--color-selected); - display: inline-flex; - height: 52px; - justify-content: center; - width: 52px; -} - -.admin-enterprise-profile h1 { - font-size: 28px; - margin: 0 0 var(--space-1); -} - -.admin-enterprise-profile p { - color: var(--color-text-muted); - margin: 0; -} - -.admin-enterprise-profile > .ui-button { - justify-self: end; - margin-top: -72px; -} - -.admin-enterprise-profile dl { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(3, minmax(0, 1fr)); - margin: 0; -} - -.admin-enterprise-profile dt { - color: var(--color-text-muted); - font-size: 13px; - margin-bottom: var(--space-2); -} - -.admin-enterprise-profile dd { - color: var(--color-text-strong); - font-size: 18px; - font-weight: var(--font-weight-semibold); - margin: 0; -} - -.admin-business-tabs { - background: var(--color-surface-muted); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-2); - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin-inline: auto; - max-width: 560px; - padding: var(--space-2); -} - -.admin-business-tabs button { - align-items: center; - background: transparent; - border: 0; - border-radius: var(--radius-md); - color: var(--color-text-muted); - display: flex; - font-weight: var(--font-weight-semibold); - justify-content: center; - min-height: 44px; -} - -.admin-business-tabs button.active { - background: var(--color-surface); - box-shadow: var(--shadow-sm); - color: var(--color-selected); -} - -.admin-app-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.admin-app-card { - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.admin-app-card header { - align-items: center; - display: flex; - gap: var(--space-3); - justify-content: space-between; -} - -.admin-app-card h3 { - font-size: 20px; - margin: 0; -} - -.admin-app-card header button { - align-items: center; - background: var(--color-border-strong); - border: 0; - border-radius: 999px; - color: var(--color-text-muted); - display: inline-flex; - font-size: 13px; - font-weight: var(--font-weight-semibold); - gap: var(--space-2); - padding: 5px 10px; -} - -.admin-app-card header button.is-on { - background: var(--color-selected-soft); - color: var(--color-selected); -} - -.admin-app-card dl { - display: grid; - gap: var(--space-3); - margin: 0; -} - -.admin-app-card dl div { - align-items: center; - display: flex; - justify-content: space-between; -} - -.admin-app-card dt { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.admin-app-card dd { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); - margin: 0; -} - -.admin-app-card footer { - border-top: 1px solid var(--color-border); - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(2, minmax(0, 1fr)); - padding-top: var(--space-4); -} - -.admin-section-footer { - align-items: center; - display: flex; - justify-content: flex-end; -} - -.admin-mms-signature-summary { - grid-template-columns: 28px 1.4fr 1fr 1fr 1fr 1fr 130px; -} - -.admin-signature-spacer { - width: 28px; -} - -.admin-report-detail { - display: grid; - gap: var(--space-5); -} - -.admin-report-tabs { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - overflow: hidden; -} - -.admin-report-tabs button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-text-muted); - display: grid; - gap: var(--space-2); - justify-items: center; - min-height: 86px; - padding: var(--space-4); -} - -.admin-report-tabs button.active { - background: var(--color-surface); - box-shadow: var(--shadow-sm); -} - -.admin-report-tabs strong { - font-size: 18px; -} - -.admin-report-carrier--mobile strong { - color: var(--color-selected); -} - -.admin-report-carrier--unicom strong { - color: var(--color-warning); -} - -.admin-report-carrier--telecom strong { - color: var(--color-success); -} - -.admin-report-tabs span { - align-items: center; - display: inline-flex; - gap: 6px; - margin-inline: 4px; -} - -.admin-report-tabs i { - border-radius: 999px; - display: inline-block; - height: 8px; - width: 8px; -} - -.admin-report-tabs i.is-success { - background: var(--color-success); -} - -.admin-report-tabs i.is-info { - background: var(--color-selected); -} - -.admin-report-tabs i.is-danger { - background: var(--color-danger); -} - -.admin-report-carrier-detail { - display: grid; - gap: var(--space-4); -} - -.admin-report-carrier-title { - align-items: center; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: flex; - justify-content: space-between; - padding: var(--space-4); -} - -.admin-report-carrier-title div { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.admin-report-carrier-title strong { - color: var(--color-selected); - font-size: 18px; -} - -.admin-report-carrier-title span, -.admin-report-carrier-title p { - color: var(--color-text-muted); -} - -.admin-report-carrier-title p { - display: flex; - gap: var(--space-4); - margin: 0; -} - -.admin-report-carrier-title p span { - color: var(--color-success); - font-weight: var(--font-weight-semibold); -} - -.admin-report-carrier-title p em { - color: var(--color-selected); - font-style: normal; - font-weight: var(--font-weight-semibold); -} - -.admin-report-record-list { - display: grid; - gap: var(--space-4); -} - -.admin-report-record-list article { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-3); - padding: var(--space-5); -} - -.admin-report-record-list h4 { - align-items: center; - color: var(--color-text-strong); - display: flex; - gap: var(--space-3); - margin: 0; -} - -.admin-report-record-list p { - color: var(--color-text-muted); - margin: 0; -} - -.admin-report-record-list p span { - color: var(--color-text); - margin-left: var(--space-2); -} - -.admin-drainage-report-meta { - display: grid; - gap: var(--space-2); -} - -.admin-drainage-report-meta p { - color: var(--color-text); - margin: 0; -} - -.admin-drainage-report-meta a { - color: var(--color-selected); - font-weight: var(--font-weight-semibold); -} - -.admin-app-form-page { - max-width: 1120px; -} - -.admin-app-form-card { - display: grid; - gap: var(--space-6); -} - -.admin-app-form-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.admin-app-form-tip { - align-items: flex-start; - background: var(--color-selected-soft); - border: 1px solid #bfdbfe; - border-radius: var(--radius-md); - color: var(--color-text); - display: flex; - gap: var(--space-3); - line-height: var(--line-height-base); - padding: var(--space-4); -} - -.admin-app-form-tip svg { - color: var(--color-selected); - flex: 0 0 auto; - margin-top: 2px; -} - -.admin-app-protocol-section { - border-top: 3px solid #4f6fae; - overflow: hidden; -} - -.admin-app-protocol-section--http { - border-top-color: #178367; -} - -.admin-app-protocol-header { - align-items: flex-start; -} - -.admin-app-protocol-heading { - align-items: flex-start; - display: flex; - gap: var(--space-3); - min-width: 0; -} - -.admin-app-protocol-heading > div { - min-width: 0; -} - -.admin-app-protocol-heading p { - color: var(--color-text-muted); - line-height: var(--line-height-base); - margin: 5px 0 0; -} - -.admin-app-protocol-icon { - align-items: center; - background: #edf3ff; - border: 1px solid #d7e2f8; - border-radius: var(--radius-md); - color: #3d5f9d; - display: inline-flex; - flex: 0 0 auto; - height: 38px; - justify-content: center; - width: 38px; -} - -.admin-app-protocol-section--http .admin-app-protocol-icon { - background: #eaf7f2; - border-color: #cce9dd; - color: #17745d; -} - -.admin-app-protocol-section--http .admin-switch.is-on { - color: #17745d; -} - -.admin-app-protocol-section--http .admin-switch.is-on span { - background: #178367; -} - -.admin-app-protocol-body { - padding-top: var(--space-1); -} - -.admin-app-protocol-empty { - background: var(--color-bg-subtle); - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-md); - color: var(--color-text-muted); - line-height: var(--line-height-base); - padding: var(--space-5); - text-align: center; -} - -.admin-app-form-price-note { - color: var(--color-selected); - font-weight: var(--font-weight-semibold); -} - -.admin-app-route-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.admin-app-route-card { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - min-width: 0; - padding: var(--space-4); -} - -.admin-app-route-card.is-selected { - background: var(--color-selected-soft); - border-color: #bfdbfe; -} - -.admin-app-route-card header { - align-items: flex-start; - display: grid; - gap: var(--space-3); - grid-template-columns: auto minmax(0, 1fr) auto; -} - -.admin-app-route-card header > span:first-child { - align-items: center; - background: #ffffff; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-selected); - display: inline-flex; - height: 34px; - justify-content: center; - width: 34px; -} - -.admin-app-route-card header strong, -.admin-app-route-card header small { - display: block; -} - -.admin-app-route-card header small, -.admin-app-route-card p { - color: var(--color-text-muted); - line-height: var(--line-height-base); - margin: 0; -} - -.admin-switch { - align-items: center; - background: transparent; - border: 0; - color: var(--color-text-muted); - display: inline-flex; - gap: var(--space-3); - justify-self: start; -} - -.admin-switch span { - background: var(--color-border-strong); - border-radius: 999px; - display: inline-flex; - height: 24px; - position: relative; - width: 44px; -} - -.admin-switch span::after { - background: var(--color-surface); - border-radius: 999px; - box-shadow: var(--shadow-sm); - content: ""; - height: 18px; - left: 3px; - position: absolute; - top: 3px; - transition: transform var(--transition-fast); - width: 18px; -} - -.admin-switch.is-on { - color: var(--color-selected); -} - -.admin-switch.is-on span { - background: var(--color-selected); -} - -.admin-switch.is-on span::after { - transform: translateX(20px); -} - -.breadcrumb-line { - align-items: center; - align-self: flex-start; - display: flex; - gap: var(--space-4); - max-width: 100%; - min-height: 40px; -} - -.breadcrumb-line__icon { - align-items: center; - background: var(--color-selected-soft); - border-radius: var(--radius-sm); - color: var(--color-selected); - display: inline-flex; - flex: 0 0 auto; - height: 40px; - justify-content: center; - width: 40px; -} - -.breadcrumb-line h1 { - align-items: center; - color: var(--color-text-strong); - display: flex; - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - gap: var(--space-4); - letter-spacing: 0; - line-height: 1.25; - margin: 0; - min-width: 0; -} - -.page-heading > div:has(.breadcrumb-line) > h1 { - display: none; -} - -.channel-report-heading h1 { - display: none; -} - -.channel-route-modal__title { - align-items: center; - display: flex; - gap: var(--space-3); -} - -.channel-route-modal__title > span { - align-items: center; - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-selected); - display: inline-flex; - height: 40px; - justify-content: center; - width: 40px; -} - -.channel-route-modal__title h2, -.channel-route-modal__title p { - margin: 0; -} - -.channel-route-modal__title p { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - margin-top: var(--space-1); -} - -.channel-route-modal__empty { - background: var(--color-surface-subtle); - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-md); - color: var(--color-text-muted); - margin: 0; - padding: var(--space-4); -} - -.channel-route-modal__selected { - align-items: center; - background: color-mix(in srgb, var(--color-success) 8%, var(--color-surface)); - border: 1px solid color-mix(in srgb, var(--color-success) 35%, var(--color-border)); - border-radius: var(--radius-md); - color: var(--color-success); - display: flex; - gap: var(--space-3); - padding: var(--space-4); -} - -.channel-route-modal__selected strong, -.channel-route-modal__selected span { - display: block; -} - -.channel-route-modal__selected span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - margin-top: var(--space-1); -} - -.admin-enterprise-profile__main { - align-items: center; -} - -.admin-enterprise-profile__icon { - height: 40px; - width: 40px; -} - -.admin-enterprise-profile__main h1 { - font-size: var(--font-size-lg); - font-weight: var(--font-weight-semibold); - letter-spacing: 0; -} - -.audit-table-card { - padding: 0; -} - -.enterprise-audit-detail { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.enterprise-audit-detail section { - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-3); - padding: var(--space-5); -} - -.enterprise-audit-detail h3 { - color: var(--color-text-strong); - font-size: var(--font-size-lg); - margin: 0 0 var(--space-2); -} - -.enterprise-audit-detail div { - display: grid; - gap: 4px; -} - -.enterprise-audit-detail span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.enterprise-audit-detail strong { - color: var(--color-text-strong); - overflow-wrap: anywhere; -} - -.enterprise-audit-detail__remark { - border-top: 1px solid var(--color-border); - padding-top: var(--space-3); -} - -.audit-link { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - cursor: pointer; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-1); - padding: 0; -} - -.audit-link--success { - color: var(--color-success); -} - -.audit-link--danger { - color: var(--color-danger); -} - -.audit-pagination { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - justify-content: flex-end; - gap: var(--space-3); - padding: var(--space-4); -} - -.sms-bulk-actions { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - gap: var(--space-4); - margin-top: var(--space-6); - padding-top: var(--space-5); -} - -.sms-bulk-actions .ui-button--secondary { - background: var(--color-success); - border-color: var(--color-success); - color: white; -} - -.sms-audit-toolbar { - align-items: center; - display: flex; - justify-content: flex-end; - gap: var(--space-5); - padding: var(--space-3) 0; -} - -.sms-audit-toolbar > div { - display: flex; - gap: var(--space-2); -} - -.sms-audit-list { - padding: 0; -} - -.sms-audit-cell-stack { - align-items: flex-start; - display: grid; - gap: var(--space-2); - min-width: 0; -} - -.sms-audit-cell-stack small { - color: var(--color-text-muted); - line-height: var(--line-height-base); -} - -.sms-audit-cell-stack .table-link { - justify-self: start; - text-align: left; -} - -.sms-audit-head, -.sms-audit-row { - display: grid; - grid-template-columns: 42px minmax(190px, 1.1fr) minmax(320px, 1.8fr) minmax(120px, 0.7fr) minmax(130px, 0.7fr) minmax(130px, 0.7fr) 112px; -} - -.sms-audit-head { - background: var(--color-surface-subtle); - border-bottom: 1px solid var(--color-border); - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); - padding: var(--space-4); -} - -.sms-audit-row { - align-items: center; - border-bottom: 1px solid var(--color-border); - padding: var(--space-5) var(--space-4); -} - -.sms-audit-row:last-child { - border-bottom: 0; -} - -.sms-audit-customer, -.sms-audit-count, -.sms-audit-result, -.sms-audit-actions { - display: grid; - gap: var(--space-2); -} - -.sms-audit-customer span, -.sms-audit-customer small, -.sms-audit-count { - color: var(--color-text-muted); -} - -.sms-audit-content { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - line-height: 1.7; - margin: 0; - max-height: 92px; - overflow: hidden; - padding: var(--space-4); -} - -.sms-audit-count a, -.sms-audit-count button { - color: var(--color-selected); -} - -.sms-audit-count button { - background: transparent; - border: 0; - cursor: pointer; - justify-self: start; - padding: 0; -} - -.sms-audit-reasons { - align-items: flex-start; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.audit-dot { - align-items: center; - display: inline-flex; - gap: var(--space-2); - font-weight: var(--font-weight-semibold); -} - -.audit-dot::before { - border-radius: 999px; - content: ''; - height: 9px; - width: 9px; -} - -.audit-dot--warning { - color: #b7791f; -} - -.audit-dot--warning::before { - background: #d97706; -} - -.audit-dot--success { - color: var(--color-success); -} - -.audit-dot--success::before { - background: var(--color-success); -} - -.audit-dot--danger { - color: var(--color-danger); -} - -.audit-dot--danger::before { - background: var(--color-danger); -} - -.sms-audit-result small { - color: var(--color-text-muted); -} - -.sms-audit-actions .ui-button { - justify-content: center; -} - -.sms-audit-actions .ui-button--secondary { - background: transparent; - border-color: #86efac; - color: var(--color-success); -} - -.sms-audit-actions .ui-button--danger { - background: transparent; - color: var(--color-danger); -} - -.sms-audit-edit { - display: grid; - gap: var(--space-5); -} - -.sms-audit-edit__meta { - background: var(--color-surface-subtle); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); - padding: var(--space-5); -} - -.sms-audit-edit__meta span { - color: var(--color-text-muted); -} - -.sms-audit-edit__meta strong { - color: var(--color-text); -} - -.sms-audit-edit__count { - align-items: center; - color: var(--color-text-muted); - display: flex; - justify-content: space-between; -} - -.sms-audit-edit__count strong { - color: var(--color-text-strong); -} - -.sms-reject-modal { - display: grid; - gap: var(--space-5); -} - -.reject-reason-tags { - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - margin-top: var(--space-3); -} - -.reject-reason-tags button { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: 999px; - color: var(--color-text); - cursor: pointer; - font-weight: var(--font-weight-semibold); - padding: var(--space-2) var(--space-4); -} - -.reject-reason-tags button:hover { - border-color: var(--color-selected); - color: var(--color-selected); -} - -.audit-collapse-link { - background: transparent; - border: 0; - color: var(--color-text-muted); - cursor: pointer; - justify-self: start; - padding: 0; -} - -.phone-list-modal { - display: grid; - gap: var(--space-5); -} - -.phone-list-toolbar { - align-items: center; - display: flex; - justify-content: flex-end; - gap: var(--space-3); -} - -.phone-list-toolbar > label { - width: 150px; -} - -.phone-list-toolbar > div { - align-items: center; - display: flex; - gap: var(--space-2); -} - -.phone-list-table { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - overflow: hidden; -} - -.phone-list-table .ui-table-wrap { - border: 0; - box-shadow: none; -} - -.phone-list-table .ui-table tbody tr:nth-child(even) { - background: var(--color-surface-subtle); -} - -.channel-report-page { - min-width: 1100px; -} - -.channel-report-hero { - display: grid; - gap: var(--space-5); - padding: var(--space-6); -} - -.channel-report-heading { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.channel-report-heading h1 { - border-left: 5px solid var(--color-selected); - font-size: 26px; - letter-spacing: 0; - margin: 0; - padding-left: var(--space-4); -} - -.channel-report-config-actions { - display: flex; - gap: var(--space-3); - margin-left: auto; -} - -.channel-report-filter { - padding: var(--space-6); -} - -.channel-report-filter-grid { - align-items: end; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(220px, 1.3fr) repeat(2, minmax(150px, 0.75fr)) repeat(2, minmax(138px, 0.65fr)); -} - -.channel-report-filter-footer { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - justify-content: space-between; - margin-top: var(--space-5); - padding-top: var(--space-5); -} - -.channel-report-filter-footer > div { - display: flex; - gap: var(--space-3); -} - -.channel-report-table { - overflow-x: auto; - padding: 0; -} - -.channel-report-table__head, -.channel-report-row { - display: grid; - grid-template-columns: 34px minmax(220px, 1.2fr) 112px 120px 120px 130px minmax(280px, 1.35fr) 300px; - min-width: 1340px; -} - -.report-material-detail-list { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - overflow: hidden; -} - -.report-material-detail-list > div { - align-items: start; - border-bottom: 1px solid var(--color-border); - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(180px, 0.7fr) minmax(0, 1.3fr); - padding: var(--space-4); -} - -.report-material-detail-list > div:last-child { border-bottom: 0; } -.report-material-detail-list > div > span { color: var(--color-text-muted); } -.report-material-detail-list > div > strong { overflow-wrap: anywhere; } -.report-material-detail-list > div.is-missing { background: var(--color-danger-soft); } - -.report-batch-toolbar { - align-items: center; - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: flex; - gap: var(--space-3); - justify-content: space-between; - padding: var(--space-4); -} - -.report-batch-progress { - display: grid; - gap: 4px 14px; - grid-template-columns: repeat(2, minmax(72px, auto)); -} - -.report-batch-progress span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.report-batch-progress strong { - color: var(--color-text-strong); - margin-left: 4px; -} - -.ui-modal__panel.report-batch-drawer { - animation: report-batch-drawer-in 180ms ease-out; - border-radius: var(--radius-lg) 0 0 var(--radius-lg); - height: 100vh; - inset: 0 0 0 auto; - max-height: none; - max-width: min(1180px, calc(100vw - 64px)); - position: absolute; - transform: none; - width: min(1080px, calc(100vw - 64px)); -} - -.ui-modal__panel.report-batch-drawer .ui-modal__body { - max-height: none; -} - -@keyframes report-batch-drawer-in { - from { opacity: 0; transform: translateX(32px); } - to { opacity: 1; transform: translateX(0); } -} - -.report-batch-detail-summary { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.report-batch-detail-summary span { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text-muted); - display: grid; - gap: var(--space-2); - padding: var(--space-4); -} - -.report-batch-detail-summary strong { - color: var(--color-text-strong); - font-size: var(--font-size-xl); -} - -.report-batch-briefs { display: grid; gap: 12px; } -.report-batch-briefs__title { display: flex; justify-content: space-between; gap: 12px; } -.report-batch-briefs__title h3 { margin: 0 0 4px; } -.report-batch-brief { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: 10px; - padding: 14px; -} -.report-batch-brief header { align-items: center; display: flex; justify-content: space-between; gap: 12px; } -.report-batch-brief header > div { display: grid; gap: 2px; } -.report-batch-brief header span { color: var(--color-text-muted); font-size: var(--font-size-xs); } -.report-batch-brief pre { - background: var(--color-surface-subtle); - border-radius: var(--radius-sm); - font: inherit; - line-height: 1.75; - margin: 0; - overflow-wrap: anywhere; - padding: 12px; - white-space: pre-wrap; -} - -.report-material-summary { - display: grid; - gap: var(--space-1); - min-width: 260px; -} - -.report-material-summary span { - color: var(--color-text-muted); - font-size: var(--font-size-xs); - white-space: normal; -} - -@media (max-width: 760px) { - .report-batch-toolbar, - .report-material-detail-list > div { - grid-template-columns: minmax(0, 1fr); - } - .enterprise-signature-pending-summary { align-items: flex-start; flex-wrap: wrap; } - .enterprise-signature-pending-summary .ui-button { margin-left: 0; width: 100%; } - .report-batch-brief header { align-items: flex-start; flex-direction: column; } - .report-batch-brief header .ui-button { width: 100%; } - .ui-modal__panel.report-batch-drawer { border-radius: 0; max-width: none; width: 100%; } - .report-batch-detail-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); } -} - -.channel-report-table__head { - align-items: center; - background: var(--color-surface-subtle); - border-bottom: 1px solid var(--color-border); - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); - min-height: 56px; - padding: 0 var(--space-5); -} - -.channel-report-row { - align-items: center; - border-bottom: 1px solid var(--color-border); - min-height: 132px; - padding: var(--space-5); -} - -.channel-report-row--signature { - background: var(--color-surface); -} - -.channel-report-row--drainage { - background: #fff9f5; - border-left: 4px solid var(--color-danger); - padding-left: calc(var(--space-5) - 4px); -} - -.channel-report-name { - align-items: center; - display: flex; - gap: var(--space-3); - min-width: 0; -} - -.channel-report-name > button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-text-muted); - cursor: pointer; - display: inline-flex; - justify-content: center; - padding: var(--space-1); -} - -.channel-report-name > button:disabled { - cursor: default; - opacity: 0.25; -} - -.channel-report-name > span { - display: grid; - gap: var(--space-2); - min-width: 0; -} - -.channel-report-name strong { - overflow-wrap: anywhere; -} - -.channel-report-name small { - color: var(--color-text-muted); -} - -.channel-report-name small b { - background: var(--color-accent-soft); - border-radius: 999px; - color: var(--color-selected); - display: inline-flex; - justify-content: center; - margin-left: var(--space-2); - min-width: 24px; - padding: 2px var(--space-2); -} - -.channel-report-name--flow { - padding-left: 36px; -} - -.channel-report-name--flow i { - background: var(--color-danger); - border-radius: 50%; - height: 9px; - width: 9px; -} - -.channel-report-date { - color: var(--color-text-muted); - display: grid; - gap: var(--space-1); - line-height: 1.35; -} - -.channel-report-stats { - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - grid-template-columns: repeat(4, 1fr); - min-width: 260px; - padding: var(--space-4); -} - -.channel-report-stats span { - color: var(--color-text-muted); - display: grid; - gap: var(--space-3); -} - -.channel-report-stats strong { - margin-left: var(--space-1); -} - -.channel-report-stats b { - color: var(--color-text-strong); -} - -.success-rate-text--red { - color: #dc2626 !important; -} - -.success-rate-text--orange { - color: #ea580c !important; -} - -.success-rate-text--yellow { - color: #ca8a04 !important; -} - -.success-rate-text--blue { - color: #2563eb !important; -} - -.success-rate-text--green { - color: #16a34a !important; -} - -.success-rate-text--deep-green { - color: #047857 !important; -} - -.channel-report-stats .is-success { - color: var(--color-success); -} - -.channel-report-stats .is-warning { - color: #ea580c; -} - -.channel-report-stats .is-danger { - color: var(--color-danger); -} - -.channel-report-actions { - display: grid; - gap: var(--space-3); - justify-items: start; -} - -.channel-report-actions button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - cursor: pointer; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-2); - padding: 0; -} - -.channel-report-actions button.is-warning { - color: #ea580c; -} - -.channel-report-actions button.is-danger { - color: var(--color-danger); -} - -.channel-report-detail { - display: grid; - gap: var(--space-4); -} - -.channel-report-detail > strong { - font-size: var(--font-size-xl); -} - -.channel-report-detail p { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: grid; - grid-template-columns: 150px 1fr; - margin: 0; - padding-bottom: var(--space-3); -} - -.channel-report-detail p > span:first-child { - color: var(--color-text-muted); -} - -.channel-signature-title h2, -.channel-signature-title p { - margin: 0; -} - -.channel-signature-title p { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-regular); - margin-top: var(--space-2); -} - -.channel-signature-detail { - display: grid; - gap: var(--space-8); -} - -.channel-signature-detail section { - display: grid; - gap: var(--space-5); -} - -.channel-signature-detail h3 { - border-left: 5px solid var(--color-selected); - font-size: var(--font-size-lg); - letter-spacing: 0; - margin: 0; - padding-left: var(--space-3); -} - -.channel-signature-grid { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.channel-signature-grid__wide, -.channel-signature-grid > .channel-signature-upload:first-of-type:last-child { - grid-column: 1 / -1; -} - -.channel-signature-detail input[readonly] { - background: var(--color-surface-subtle); - color: var(--color-text-strong); - cursor: default; - font-weight: var(--font-weight-medium); -} - -.channel-signature-upload { - display: grid; - gap: var(--space-2); -} - -.channel-signature-upload > span { - color: var(--color-text-strong); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); -} - -.channel-signature-upload > div { - align-items: center; - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text-muted); - display: flex; - justify-content: center; - min-height: 68px; -} - -.channel-status-title h2, -.channel-status-title p { - margin: 0; -} - -.channel-status-title p { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-regular); - margin-top: var(--space-2); -} - -.channel-status-form { - display: grid; - gap: var(--space-6); -} - -.channel-status-options { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.channel-status-options button { - background: var(--color-surface); - border: 2px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text-strong); - cursor: pointer; - font: inherit; - font-weight: var(--font-weight-semibold); - min-height: 58px; - position: relative; -} - -.channel-status-options button.is-info { - color: var(--color-selected); -} - -.channel-status-options button.is-success { - color: var(--color-success); -} - -.channel-status-options button.is-danger { - color: var(--color-danger); -} - -.channel-status-options button.is-warning { - color: #a16207; -} - -.channel-status-options button.is-selected { - border-color: var(--color-selected); - box-shadow: 0 0 0 2px var(--color-accent-soft); -} - -.channel-status-options button > span { - align-items: center; - background: var(--color-selected); - border-radius: 0 var(--radius-sm) 0 var(--radius-sm); - color: white; - display: flex; - height: 30px; - justify-content: center; - position: absolute; - right: -2px; - top: -2px; - width: 34px; -} - -.channel-export-preview { - display: flex; - gap: 8px; - overflow-x: auto; - padding: 10px; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--surface-muted); -} - -.channel-export-preview span { - flex: 0 0 auto; - padding: 5px 9px; - border-radius: 6px; - background: var(--surface); - font-size: 12px; -} - -.channel-field-mapping-grid, -.report-import-basic-grid { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 12px; -} - -.report-import-basic-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.report-import-file { - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - margin: 16px 0; - padding: 14px 16px; - border: 1px dashed var(--primary); - border-radius: 10px; - background: color-mix(in srgb, var(--primary) 5%, var(--surface)); -} - -.report-import-file span { display: flex; align-items: center; gap: 9px; } -.report-import-file input { max-width: 310px; } -.report-import-analysis-progress { display: grid; gap: 8px; padding: 12px; border: 1px solid var(--border); border-radius: 10px; background: var(--surface-muted); } -.report-import-analysis-progress > div:first-child { display: flex; justify-content: space-between; gap: 12px; } -.report-import-analysis-progress small { color: var(--text-muted); } -.report-import-mapping { display: grid; gap: 12px; } -.report-import-mapping-table { overflow-x: auto; border: 1px solid var(--border); border-radius: 10px; } -.report-import-mapping-head, -.report-import-mapping-row { display: grid; grid-template-columns: minmax(180px, 1.2fr) minmax(220px, 1.5fr) 110px 100px 130px; gap: 10px; align-items: center; min-width: 820px; padding: 10px 12px; } -.report-import-mapping-head { background: var(--surface-muted); color: var(--text-muted); font-size: 12px; font-weight: 700; } -.report-import-mapping-row { border-top: 1px solid var(--border); } -.report-import-mapping-row > span { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; } -.report-import-mapping-row small { width: 100%; color: var(--text-muted); } -.report-import-profile { display: flex; align-items: end; gap: 12px; } -.report-import-profile__toggle { min-width: 238px; box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08); } -.report-import-profile__toggle[aria-pressed="true"] { box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12); } -.report-import-profile .field { min-width: 320px; } -.report-import-preview pre { max-height: 240px; overflow: auto; padding: 12px; background: #111827; color: #d1fae5; border-radius: 8px; font-size: 11px; } - -.report-material-filter { - align-items: end; - display: grid; - gap: 12px; -} - -.report-material-filter--pending { - grid-template-columns: 160px minmax(200px, 260px) minmax(320px, 1fr) auto; -} - -.report-material-filter--batches { - grid-template-columns: minmax(220px, 260px) 300px auto; - justify-content: start; -} -.report-material-pool { overflow: hidden; padding: 0; } -.report-material-table-head, -.report-material-row { display: grid; grid-template-columns: 28px minmax(260px, 1.5fr) minmax(180px, 1fr) 90px 160px; gap: 12px; align-items: center; padding: 12px 16px; } -.report-material-table-head { background: var(--surface-muted); color: var(--text-muted); font-size: 12px; font-weight: 700; } -.report-material-row { border-top: 1px solid var(--border); cursor: pointer; } -.report-material-row:hover { background: color-mix(in srgb, var(--primary) 3%, var(--surface)); } -.report-material-row.is-disabled { cursor: not-allowed; opacity: 0.72; } -.report-material-row.is-disabled:hover { background: var(--surface); } -.report-material-row > span { display: grid; gap: 3px; } -.report-material-row small, .report-material-row em { color: var(--text-muted); font-size: 12px; font-style: normal; } -.report-material-batches { display: grid; gap: 0; } -.report-material-batches article { display: flex; justify-content: space-between; gap: 24px; padding: 14px 0; border-top: 1px solid var(--border); } -.report-material-batches article > div { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; } -.report-material-batches article small { width: 100%; color: var(--text-muted); } -.report-material-batches article a { display: inline-flex; align-items: center; gap: 5px; color: var(--primary); } -.report-batch-preflight { display: grid; gap: 16px; } -.report-batch-summary { display: flex; flex-wrap: wrap; gap: 12px; } -.report-batch-summary span { display: inline-flex; align-items: center; gap: 7px; padding: 9px 12px; border-radius: 8px; background: var(--surface-muted); font-weight: 700; } -.report-batch-preflight article { display: grid; gap: 10px; padding: 14px; border: 1px solid var(--border); border-radius: 10px; } -.report-batch-preflight article > div { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; } -.report-batch-preflight article small { color: var(--text-muted); } -.report-batch-preflight ul { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; } -.report-batch-preflight li { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; padding: 9px 10px; border-radius: 8px; background: var(--surface-muted); } -.report-batch-preflight li.is-eligible { border-left: 3px solid var(--success); } -.report-batch-preflight li.is-blocked { border-left: 3px solid var(--warning); } - -@media (max-width: 980px) { - .channel-field-mapping-grid, .report-import-basic-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .report-material-filter--pending, - .report-material-filter--batches { grid-template-columns: repeat(2, minmax(0, 1fr)); } - .report-material-filter .ui-query-actions { grid-column: 1 / -1; } - .report-material-table-head, .report-material-row { grid-template-columns: 28px minmax(220px, 1.5fr) minmax(160px, 1fr); } - .report-material-table-head > :nth-child(n+4), .report-material-row > :nth-child(n+4) { display: none; } -} - -.channel-field-pool { - border-right: 1px solid var(--color-border); -} - -.channel-field-pool-list, -.channel-selected-field-list { - display: grid; - gap: var(--space-3); - margin-top: var(--space-4); - max-height: 520px; - overflow-y: auto; - padding-right: var(--space-2); -} - -.channel-field-pool-list { - align-content: start; - grid-auto-rows: 68px; -} - -.channel-field-pool-list > button { - align-items: center; - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text-strong); - cursor: pointer; - display: flex; - justify-content: space-between; - box-sizing: border-box; - height: 68px; - max-height: 68px; - min-height: 68px; - padding: var(--space-3) var(--space-4); - text-align: left; -} - -.channel-remove-field-button { - justify-self: start; - width: auto; -} - -.report-material-image-value { - align-items: flex-start; - display: flex; - flex-direction: column; - gap: var(--space-2); -} - -.report-material-image-value img { - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - max-height: 180px; - max-width: min(100%, 280px); - object-fit: contain; -} - -.report-export-format-options { - display: grid; - gap: var(--space-3); -} - -.report-export-format-options button { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text); - display: grid; - gap: var(--space-2); - padding: var(--space-4); - text-align: left; -} - -.report-export-format-options button[aria-checked="true"] { - background: var(--color-accent-soft); - border-color: var(--color-selected); -} - -.report-export-format-options span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.channel-field-pool-list > button:hover { - background: var(--color-accent-soft); - border-color: var(--color-selected); -} - -.channel-field-pool-list > button > span { - align-items: center; - display: inline-flex; - gap: var(--space-2); -} - -.channel-field-pool-list > button > span:last-child { - color: var(--color-selected); - font-size: var(--font-size-sm); -} - -.channel-selected-fields { - background: var(--color-surface-subtle); - grid-template-rows: auto minmax(0, 1fr) !important; -} - -.channel-selected-field-list article { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - padding: var(--space-4); -} - -.channel-selected-field-head { - align-items: center; - display: flex; - gap: var(--space-2); -} - -.channel-selected-field-index { - align-items: center; - background: var(--color-selected); - border-radius: var(--radius-sm); - color: white; - display: inline-flex; - height: 30px; - justify-content: center; - width: 30px; -} - -.channel-selected-field-order { - display: flex; - margin-left: auto; -} - -.channel-selected-field-order button, -.channel-selected-field-controls > button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-text-muted); - cursor: pointer; - display: inline-flex; - justify-content: center; - padding: var(--space-1); -} - -.channel-selected-field-order button:disabled { - cursor: default; - opacity: 0.3; -} - -.channel-selected-field-controls { - align-items: center; - display: flex; - gap: var(--space-4); -} - -.channel-selected-field-controls label { - align-items: center; - cursor: pointer; - display: inline-flex; - gap: var(--space-2); -} - -.channel-selected-field-controls > button { - color: var(--color-danger); - margin-left: auto; -} - -.mms-channel-page .page-heading { - align-items: center; -} - -.mms-channel-filter { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(260px, 1fr) 180px 180px auto; - padding: var(--space-5); -} - -.mms-channel-list { - overflow: hidden; - padding: 0; -} - -.mms-channel-list .ui-table-wrap { - border: 0; - border-radius: 0; - box-shadow: none; -} - -.mms-channel-list .ui-table { - min-width: 900px; -} - -.mms-channel-list .ui-table th, -.mms-channel-list .ui-table td { - padding: var(--space-4); - vertical-align: middle; -} - -.mms-channel-list .ui-table tbody tr:nth-child(even) { - background: var(--color-surface-subtle); -} - -.mms-channel-identity { - display: grid; - gap: var(--space-1); - min-width: 0; -} - -.mms-channel-identity span, -.mms-channel-identity small { - color: var(--color-text-muted); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.mms-channel-identity small { - font-size: var(--font-size-xs); -} - -.mms-channel-carrier { - align-items: flex-start; - display: grid; - gap: var(--space-2); - justify-items: start; -} - -.mms-channel-quality { - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - grid-template-columns: repeat(3, minmax(0, 1fr)); - padding: var(--space-3); -} - -.mms-channel-metric { - display: grid; - gap: 3px; -} - -.mms-channel-metric small { - color: var(--color-text-muted); -} - -.mms-channel-metric strong { - color: var(--color-text-strong); -} - -.mms-channel-metric--success strong { - color: var(--color-success); -} - -.mms-channel-metric--warning strong { - color: #ea580c; -} - -.mms-channel-metric--danger strong { - color: var(--color-danger); -} - -.mms-channel-actions { - display: flex; - gap: var(--space-2); - justify-content: flex-end; -} - -.mms-channel-modal-title h2, -.mms-channel-modal-title p { - margin: 0; -} - -.mms-channel-modal-title p { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-regular); - margin-top: var(--space-2); -} - -.mms-channel-form { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.mms-channel-form__wide { - grid-column: 1 / -1; -} - -.sms-channel-group-page .page-heading { - align-items: center; -} - -.channel-group-filter { - align-items: end; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(220px, 1fr) minmax(220px, 1fr) auto; -} - -.channel-group-filter__actions { - display: flex; - gap: var(--space-3); -} - -.channel-group-list { - display: grid; - gap: var(--space-5); -} - -.channel-group-config-list { - display: grid; - gap: var(--space-3); -} - -.channel-group-config-item { - align-items: center; - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-sm); - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(180px, 1.15fr) minmax(210px, 0.9fr) minmax(200px, 0.95fr) minmax(220px, 1.2fr) minmax(82px, auto); - min-width: 0; - padding: var(--space-4); -} - -.channel-group-config-item__identity { - align-items: center; - display: flex; - gap: var(--space-3); - min-width: 0; -} - -.channel-group-config-item__icon { - align-items: center; - background: #eef5ff; - border: 1px solid #cfe2ff; - border-radius: var(--radius-sm); - color: var(--color-selected); - display: inline-flex; - flex: 0 0 auto; - height: 38px; - justify-content: center; - width: 38px; -} - -.channel-group-config-item__identity div { - display: grid; - gap: var(--space-1); - min-width: 0; -} - -.channel-group-config-item__identity strong { - color: var(--color-text-strong); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.channel-group-config-item__identity span:last-child, -.channel-group-config-item__metrics span, -.channel-group-config-item__policy span, -.channel-group-config-item__channels span { - color: var(--color-text-muted); -} - -.channel-group-config-item__metrics { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(3, minmax(0, 1fr)); - min-width: 0; -} - -.channel-group-config-item__metrics div { - border-left: 1px solid var(--color-border); - display: grid; - gap: var(--space-1); - padding-left: var(--space-3); -} - -.channel-group-config-item__metrics strong { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.channel-group-config-item__policy { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - min-width: 0; -} - -.channel-group-config-item__policy span { - align-items: center; - display: inline-flex; - gap: var(--space-1); - white-space: nowrap; -} - -.channel-group-config-item__channels { - display: flex; - flex-wrap: wrap; - gap: var(--space-2); - min-width: 0; -} - -.channel-group-config-item__channels span { - background: var(--color-surface-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-sm); - max-width: 160px; - overflow: hidden; - padding: var(--space-1) var(--space-2); - text-overflow: ellipsis; - white-space: nowrap; -} - -.channel-group-config-item__actions { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-3); - justify-content: flex-end; - justify-self: end; - min-width: 82px; -} - -.channel-group-config-item__actions button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - cursor: pointer; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-1); - padding: 0; -} - -.channel-group-config-item__actions button.is-danger { - color: var(--color-danger); -} - -.channel-group-form-page { - min-width: 1040px; -} - -.channel-group-form-section { - display: grid; - gap: var(--space-5); -} - -.channel-group-form-section h2 { - border-bottom: 1px solid var(--color-border); - border-left: 5px solid var(--color-selected); - margin: 0; - padding: 0 0 var(--space-4) var(--space-3); -} - -.channel-group-base-form { - display: grid; - gap: var(--space-6); - grid-template-columns: 190px minmax(0, 1fr); -} - -.channel-group-base-form > .ui-field, -.channel-group-retry-limit, -.channel-group-radio-row, -.channel-group-switch-row { - grid-column: 2; -} - -.channel-group-radio-row, -.channel-group-switch-row { - align-items: center; - display: flex; - gap: var(--space-7); - min-height: 42px; -} - -.channel-group-radio-row > span, -.channel-group-switch-row > span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.channel-group-radio-row label { - align-items: center; - display: inline-flex; - gap: var(--space-2); -} - -.channel-group-switch-row button { - background: #d1d5db; - border: 0; - border-radius: 999px; - cursor: pointer; - height: 30px; - padding: 3px; - transition: background 0.18s ease; - width: 54px; -} - -.channel-group-switch-row button i { - background: #fff; - border-radius: 50%; - box-shadow: var(--shadow-sm); - display: block; - height: 24px; - transition: transform 0.18s ease; - width: 24px; -} - -.channel-group-switch-row button.is-on { - background: var(--color-selected); -} - -.channel-group-switch-row button.is-on i { - transform: translateX(24px); -} - -.channel-group-row-actions { - display: flex; - gap: var(--space-4); -} - -.channel-group-row-actions button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - cursor: pointer; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-1); - padding: 0; -} - -.channel-group-row-actions button.is-danger { - color: var(--color-danger); -} - -.channel-group-retry-limit { - display: grid; - gap: var(--space-3); - grid-template-columns: 150px 150px minmax(220px, 1fr); -} - -.channel-group-retry-limit > span { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); - grid-column: 1 / -1; -} - -.channel-group-retry-limit small { - align-self: center; - color: var(--color-text-muted); -} - -.channel-route-card-grid { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(3, minmax(220px, 1fr)); -} - -.channel-route-card { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-3); - min-height: 188px; - padding: var(--space-4); -} - -.channel-route-card > div { - align-items: flex-start; - display: flex; - gap: var(--space-3); - justify-content: space-between; -} - -.channel-route-card strong { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.channel-route-card span, -.channel-route-card small { - color: var(--color-text-muted); -} - -.channel-route-card p { - color: var(--color-text); - font-weight: var(--font-weight-semibold); - line-height: 1.5; - margin: 0; - overflow-wrap: anywhere; -} - -.channel-route-card footer { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - gap: var(--space-3); - justify-content: flex-end; - margin-top: var(--space-1); - padding-top: var(--space-3); -} - -.channel-route-card footer button { - align-items: center; - background: transparent; - border: 0; - color: var(--color-selected); - cursor: pointer; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-1); - padding: 0; -} - -.channel-route-card footer button.is-danger { - color: var(--color-danger); -} - -.channel-route-empty { - align-items: center; - background: var(--color-surface-subtle); - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-md); - color: var(--color-text-muted); - display: flex; - justify-content: center; - min-height: 120px; - padding: var(--space-5); -} - -.channel-route-modal { - display: grid; - gap: var(--space-5); - grid-template-columns: repeat(2, minmax(0, 1fr)); - min-width: 0; -} - -.channel-route-modal__channel-select { - grid-column: 1 / -1; -} - -.channel-route-modal .ui-select__dropdown { - max-height: min(360px, calc(100vh - 360px)); -} - -.channel-route-modal .ui-select__dropdown button { - align-items: flex-start; - height: auto; - line-height: 1.45; - min-height: 42px; - padding: var(--space-2) var(--space-3); - white-space: normal; -} - -.channel-route-modal__note { - align-items: center; - background: #eff6ff; - border: 1px solid #bfdbfe; - border-radius: var(--radius-md); - color: var(--color-text); - display: flex; - gap: var(--space-3); - padding: var(--space-4); -} - -.channel-route-modal__note svg { - color: var(--color-selected); - flex: 0 0 auto; -} - -.channel-group-form-footer { - align-items: center; - display: flex; - gap: var(--space-4); - justify-content: center; - padding: var(--space-4) 0; -} - -.channel-group-form-footer .ui-button { - min-width: 160px; -} - -.recovery-status-explainer { - align-items: flex-start; - display: flex; - gap: var(--space-3); -} - -.recovery-status-explainer > svg { - color: var(--color-primary); - flex: 0 0 auto; - margin-top: 2px; -} - -.recovery-status-explainer strong { - color: var(--color-text-strong); -} - -.recovery-status-explainer p { - color: var(--color-text-muted); - line-height: 1.7; - margin: var(--space-1) 0 0; -} - -.signature-quality-card { - overflow: hidden; -} - -.login-return-link { - color: var(--color-text-strong); - font-size: 14px; - font-weight: 600; - justify-self: center; - text-decoration: none; -} - -.login-return-link:hover { color: var(--color-selected); text-decoration: underline; } - -.signature-retirement-heatmap { - padding: var(--space-5); -} - -.signature-retirement-heatmap__heading, -.signature-retirement-heatmap__actions { - align-items: center; -} - -.signature-retirement-heatmap__actions { - display: flex; - gap: var(--space-3); -} - -.signature-retirement-heatmap__actions .ui-field { - min-width: 280px; -} - -.signature-retirement-heatmap__scroll { - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - overflow: auto; -} - -.signature-retirement-heatmap table { - border-collapse: collapse; - min-width: 100%; - white-space: nowrap; -} - -.signature-retirement-heatmap th, -.signature-retirement-heatmap td { - border-bottom: 1px solid var(--color-border); - border-right: 1px solid var(--color-border); - font-size: 12px; - min-width: 48px; - padding: 8px; - text-align: center; -} - -.signature-retirement-heatmap th:first-child { - background: var(--color-surface); - left: 0; - min-width: 280px; - position: sticky; - text-align: left; - z-index: 1; -} - -.signature-retirement-heatmap tbody th { - align-items: center; - display: flex; - gap: var(--space-2); - justify-content: space-between; -} - -.signature-retirement-heatmap__identity { - display: grid; - gap: 2px; - min-width: 0; - text-align: left; -} - -.signature-retirement-heatmap__identity strong { - color: var(--color-text-strong); - cursor: help; - overflow: hidden; - text-overflow: ellipsis; -} - -.signature-retirement-heatmap__identity small { - color: var(--color-text-muted); - font-weight: 400; - overflow: hidden; - text-overflow: ellipsis; -} - -.signature-retirement-heatmap td.is-zero { - background: #f3f4f6; - color: var(--color-text-muted); - font-weight: 700; -} - -.signature-retirement-heatmap td.is-inapplicable { - background: repeating-linear-gradient(135deg, #f8fafc, #f8fafc 4px, #eef2f7 4px, #eef2f7 8px); - color: var(--color-text-muted); -} - -.signature-retirement-heatmap td.is-rate-red { background: #fee2e2; color: #dc2626; font-weight: 700; } -.signature-retirement-heatmap td.is-rate-orange { background: #ffedd5; color: #ea580c; font-weight: 700; } -.signature-retirement-heatmap td.is-rate-yellow { background: #fef9c3; color: #ca8a04; font-weight: 700; } -.signature-retirement-heatmap td.is-rate-blue { background: #dbeafe; color: #2563eb; font-weight: 700; } -.signature-retirement-heatmap td.is-rate-green { background: #dcfce7; color: #16a34a; font-weight: 700; } -.signature-retirement-heatmap td.is-rate-deep-green { background: #d1fae5; color: #047857; font-weight: 700; } - -.ui-table__long-text { - display: block; - line-height: 1.55; - overflow-wrap: anywhere; - white-space: normal; - word-break: normal; -} - -.signature-retirement-message-card { - overflow: hidden; -} - -.signature-retirement-message-filter { - align-items: end; - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(4, minmax(180px, 1fr)); - margin-bottom: var(--space-4); -} - -.signature-retirement-message-filter__actions { - display: flex; - gap: var(--space-2); -} - -.signature-retirement-suppression-modes { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.signature-retirement-suppression-modes label { - align-items: flex-start; - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - cursor: pointer; - display: flex; - gap: var(--space-3); - padding: var(--space-4); -} - -.signature-retirement-suppression-modes label.is-selected { - background: var(--color-selected-soft); - border-color: var(--color-selected); -} - -.signature-retirement-suppression-modes input { - margin-top: 3px; -} - -.signature-retirement-suppression-modes span { - display: grid; - gap: 4px; -} - -.signature-retirement-suppression-modes small { - color: var(--color-text-muted); -} - -.signature-quality-card__heading { - align-items: flex-start; - display: flex; - gap: var(--space-5); - justify-content: space-between; - padding: var(--space-5); -} - -.signature-quality-card__heading h2, -.signature-quality-section h3 { - margin: 0; -} - -.signature-quality-card__heading p, -.signature-quality-section__heading p { - margin: var(--space-1) 0 0; -} - -.section-heading__title { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-2); -} - -.signature-quality-card__query { - align-items: flex-end; - display: flex; - flex: 0 1 390px; - gap: var(--space-2); -} - -.signature-quality-card__query .ui-field { - flex: 1; -} - -.signature-quality-card__note { - background: color-mix(in srgb, var(--color-primary) 6%, white); - border-bottom: 1px solid var(--color-border); - border-top: 1px solid var(--color-border); - color: var(--color-text-muted); - font-size: 13px; - line-height: 1.6; - padding: 10px var(--space-5); -} - -.signature-quality-card .ui-table-wrap { - border: 0; - border-radius: 0; -} - -.signature-quality-card > .ui-pagination { - border-top: 1px solid var(--color-border); - padding: var(--space-4) var(--space-5); -} - -.signature-quality-name { - display: grid; - gap: 3px; -} - -.signature-quality-name strong { - color: var(--color-text-strong); -} - -.signature-quality-name span, -.signature-quality-name small { - color: var(--color-text-muted); -} - -.quality-number--success { - color: var(--color-success); -} - -.quality-number--warning { - color: var(--color-warning); -} - -.quality-number--danger { - color: var(--color-danger); -} - -.signature-quality-rate { - align-items: center; - display: flex; - gap: var(--space-2); -} - -.signature-quality-rate > div { - background: var(--color-surface-muted); - border-radius: 99px; - flex: 1; - height: 6px; - overflow: hidden; -} - -.signature-quality-rate > div span { - background: var(--color-success); - border-radius: inherit; - display: block; - height: 100%; -} - -.signature-quality-rate strong { - min-width: 50px; - text-align: right; -} - -.signature-quality-drawer__backdrop { - background: rgb(15 23 42 / 42%); - inset: 0; - position: fixed; - z-index: 1200; -} - -.signature-quality-drawer { - animation: signature-quality-drawer-in 180ms ease-out; - background: var(--color-bg); - box-shadow: -18px 0 48px rgb(15 23 42 / 18%); - display: flex; - flex-direction: column; - height: 100%; - margin-left: auto; - max-width: min(1120px, calc(100vw - 72px)); - width: 88vw; -} - -@keyframes signature-quality-drawer-in { - from { - opacity: 0; - transform: translateX(28px); - } - - to { - opacity: 1; - transform: translateX(0); - } -} - -.signature-quality-drawer__header { - align-items: flex-start; - background: var(--color-surface); - border-bottom: 1px solid var(--color-border); - display: flex; - gap: var(--space-5); - justify-content: space-between; - padding: var(--space-5) var(--space-6); -} - -.signature-quality-drawer__header p { - color: var(--color-primary); - font-size: 13px; - margin: 0 0 var(--space-2); -} - -.signature-quality-drawer__header h2 { - margin: 0; -} - -.signature-quality-drawer__header span { - color: var(--color-text-muted); - display: block; - margin-top: var(--space-2); -} - -.signature-quality-drawer__header > button { - align-items: center; - background: transparent; - border: 0; - border-radius: var(--radius-md); - color: var(--color-text-muted); - cursor: pointer; - display: inline-flex; - justify-content: center; - padding: var(--space-2); -} - -.signature-quality-drawer__header > button:hover { - background: var(--color-surface-muted); - color: var(--color-text-strong); -} - -.signature-quality-drawer__body { - display: grid; - gap: var(--space-5); - overflow: auto; - padding: var(--space-5) var(--space-6) var(--space-7); -} - -.signature-quality-overview { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(4, minmax(0, 1fr)); - min-width: 0; -} - -.signature-quality-metric { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-2); - padding: var(--space-4); -} - -.signature-quality-metric span { - color: var(--color-text-muted); - font-size: 13px; -} - -.signature-quality-metric strong { - color: var(--color-text-strong); - font-size: 24px; -} - -.signature-quality-metric--success strong { - color: var(--color-success); -} - -.signature-quality-metric--warning strong { - color: var(--color-warning); -} - -.signature-quality-metric--danger strong { - color: var(--color-danger); -} - -.signature-quality-section { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - min-width: 0; - padding: var(--space-5); -} - -.signature-quality-section__heading { - margin-bottom: var(--space-4); -} - -.signature-quality-section__heading p { - color: var(--color-text-muted); - font-size: 13px; -} - -.signature-carrier-grid { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.signature-carrier-card { - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - padding: var(--space-4); -} - -.signature-carrier-card > div { - align-items: center; - display: flex; - justify-content: space-between; -} - -.signature-carrier-card > div strong { - color: var(--color-text-strong); -} - -.signature-carrier-card dl { - display: grid; - gap: var(--space-2); - margin: var(--space-4) 0 0; -} - -.signature-carrier-card dl div { - align-items: center; - display: flex; - justify-content: space-between; -} - -.signature-carrier-card dt { - color: var(--color-text-muted); -} - -.signature-carrier-card dd { - color: var(--color-text-strong); - font-weight: 600; - margin: 0; -} - -.signature-quality-matrix { - background: var(--color-surface-muted); - border: 1px solid color-mix(in srgb, var(--color-border) 80%, var(--color-primary)); - border-radius: var(--radius-lg); - max-width: 100%; - overflow: auto; - width: 100%; -} - -.signature-quality-matrix table { - border-collapse: collapse; - min-width: 760px; - width: 100%; -} - -.signature-quality-matrix th, -.signature-quality-matrix td { - border-bottom: 1px solid var(--color-border); - border-right: 1px solid var(--color-border); - padding: 10px; - text-align: left; - vertical-align: top; -} - -.signature-quality-matrix th:last-child, -.signature-quality-matrix td:last-child { - border-right: 0; -} - -.signature-quality-matrix tr:last-child th, -.signature-quality-matrix tr:last-child td { - border-bottom: 0; -} - -.signature-quality-matrix thead th { - background: color-mix(in srgb, var(--color-primary) 6%, var(--color-surface)); - color: var(--color-text-muted); - font-size: 13px; - position: sticky; - top: 0; - z-index: 2; -} - -.signature-quality-matrix tbody th { - background: var(--color-surface); - color: var(--color-text-strong); - min-width: 210px; - position: sticky; - left: 0; - z-index: 1; -} - -.signature-quality-matrix__metric { - background: var(--color-surface); - border-left: 3px solid var(--color-border); - border-radius: var(--radius-sm); - display: grid; - gap: 7px; - min-width: 150px; - padding: 10px 12px; -} - -.signature-quality-matrix__metric--success { border-left-color: var(--color-success); } -.signature-quality-matrix__metric--warning { border-left-color: var(--color-warning); } -.signature-quality-matrix__metric--danger { border-left-color: var(--color-danger); } - -.signature-quality-matrix__metric > div { - align-items: center; - display: flex; - gap: var(--space-2); - justify-content: space-between; -} - -.signature-quality-matrix__metric strong { - color: var(--color-text-strong); -} - -.signature-quality-matrix__metric small { - color: var(--color-text-muted); - font-size: 12px; -} - -.signature-quality-matrix__metric em { - color: var(--color-warning); - font-size: 12px; - font-style: normal; -} - -.signature-quality-matrix__drainage-label { - color: var(--color-text-muted); - font-size: 13px; - min-width: 88px; -} - -.signature-quality-matrix__rate { - font-weight: 600; -} - -.signature-quality-matrix__empty { - color: var(--color-text-subtle); -} - -.signature-quality-matrix__zero { - color: var(--color-text-strong); - font-weight: 600; -} - -.signature-quality-drawer__footnote { - color: var(--color-text-muted); - font-size: 13px; - line-height: 1.7; - margin: 0; -} - -@media (max-width: 900px) { - .signature-retirement-message-filter, - .signature-retirement-suppression-modes { - grid-template-columns: 1fr; - } - - .signature-retirement-heatmap__heading, - .signature-retirement-heatmap__actions { - align-items: stretch; - flex-direction: column; - } - - .signature-retirement-heatmap__actions .ui-field { - min-width: 0; - width: 100%; - } - - .signature-quality-card__heading, - .signature-quality-card__query { - align-items: stretch; - flex-direction: column; - } - - .signature-quality-card__query { - flex-basis: auto; - width: 100%; - } - - .signature-quality-drawer { - max-width: none; - width: 100%; - } - - .signature-quality-overview, - .signature-carrier-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -@media (max-width: 600px) { - .signature-quality-drawer__header, - .signature-quality-drawer__body { - padding-left: var(--space-4); - padding-right: var(--space-4); - } - - .signature-quality-overview, - .signature-carrier-grid { - grid-template-columns: 1fr; - } -} - -.downstream-delivery-toolbar { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: flex; - gap: var(--space-4); - justify-content: space-between; - padding: var(--space-4) var(--space-5); -} - -.downstream-delivery-toolbar p { - color: var(--color-text-muted); - line-height: 1.6; - margin: 0; -} - -.downstream-delivery-toolbar p strong { - color: var(--color-text-strong); -} - -.downstream-requeue-confirm, -.downstream-requeue-result { - align-items: flex-start; - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: flex; - gap: var(--space-3); - padding: var(--space-4); -} - -.downstream-requeue-confirm { - background: #fffbeb; - border-color: #fde68a; - color: #92400e; -} - -.downstream-requeue-confirm > div, -.downstream-requeue-result > div { - display: grid; - gap: var(--space-2); - min-width: 0; -} - -.downstream-requeue-confirm p, -.downstream-requeue-confirm small, -.downstream-requeue-confirm strong, -.downstream-requeue-result p, -.downstream-requeue-result small { - margin: 0; -} - -.downstream-requeue-confirm strong { - line-height: 1.6; -} - -.downstream-requeue-result--success { - background: #f0fdf4; - border-color: #bbf7d0; - color: #166534; -} - -.downstream-requeue-result--partial { - background: #fffbeb; - border-color: #fde68a; - color: #92400e; -} - -.downstream-requeue-result--failed { - background: #fef2f2; - border-color: #fecaca; - color: #991b1b; -} - -.downstream-requeue-result p, -.downstream-requeue-result li { - line-height: 1.6; - overflow-wrap: anywhere; -} - -.downstream-requeue-result ul { - margin: 0; - max-height: 180px; - overflow: auto; - padding-left: var(--space-5); -} - -.downstream-delivery-toolbar > div, -.downstream-delivery-list__actions { - align-items: center; - display: flex; - flex-shrink: 0; - gap: var(--space-2); -} - -.downstream-delivery-list { - overflow-x: auto; -} - -.downstream-delivery-list__header, -.downstream-delivery-list__row { - align-items: center; - display: grid; - gap: var(--space-3); - grid-template-columns: 36px 140px minmax(150px, 1fr) minmax(165px, 1.05fr) 126px 54px minmax(170px, 1.2fr) 136px; - min-width: 1080px; - padding: var(--space-4); -} - -.downstream-delivery-list__header { - background: var(--color-bg-subtle); - color: var(--color-text-muted); - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); -} - -.downstream-delivery-list__row { - border-top: 1px solid var(--color-border); - min-height: 104px; -} - -.downstream-delivery-list__row:first-of-type { - border-top: 0; -} - -.downstream-delivery-list__row:hover { - background: color-mix(in srgb, var(--color-selected-soft) 28%, transparent); -} - -.downstream-delivery-list__select, -.downstream-delivery-list__retry { - text-align: center; -} - -.downstream-delivery-list__meta, -.downstream-delivery-list__owner, -.downstream-delivery-list__retry { - display: grid; - gap: 6px; -} - -.downstream-delivery-list__meta strong, -.downstream-delivery-list__owner strong, -.downstream-delivery-list__retry strong { - color: var(--color-text-strong); -} - -.downstream-delivery-list__meta span, -.downstream-delivery-list__owner span, -.downstream-delivery-list__retry span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.downstream-delivery-list__message strong { - color: var(--color-text-strong); - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; - font-size: var(--font-size-sm); - overflow-wrap: anywhere; -} - -.downstream-delivery-list__error { - background: #fff7ed; - border: 1px solid #fed7aa; - border-radius: var(--radius-md); - color: #9a3412; - display: -webkit-box; - line-height: 1.55; - overflow: hidden; - padding: var(--space-3); - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.downstream-delivery-list__error.is-empty { - background: var(--color-bg-subtle); - border-color: var(--color-border); - color: var(--color-text-subtle); -} - -.downstream-delivery-list__actions { - justify-content: flex-end; -} - -.downstream-delivery-list__empty { - color: var(--color-text-muted); - padding: 48px var(--space-5); - text-align: center; -} - -@media (max-width: 760px) { - .downstream-delivery-toolbar { - align-items: stretch; - flex-direction: column; - } - - .downstream-delivery-toolbar > div { - justify-content: flex-end; - } -} - -.report-page-actions { - align-items: center; - display: flex; - flex-wrap: wrap; - gap: var(--space-3); -} - -.report-task-time { - color: var(--color-text-muted); - display: grid; - font-size: var(--font-size-xs); - gap: 4px; - line-height: 1.45; -} - -.report-task-time span { - white-space: nowrap; -} - -.admin-remark-cell { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - color: var(--color-text); - display: -webkit-box; - line-height: 1.6; - max-width: 360px; - min-width: 220px; - overflow: hidden; - padding: var(--space-3); - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; -} - -.admin-remark-cell--empty { - color: var(--color-text-subtle); -} - -.report-task-generate { - display: grid; - gap: var(--space-5); -} - -.report-task-generate section, -.report-task-detail .admin-task-card { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - padding: var(--space-5); -} - -.report-task-generate h3, -.report-receipt-preview h3 { - color: var(--color-text-strong); - font-size: var(--font-size-md); - font-weight: 700; - margin: 0 0 var(--space-4); -} - -.report-task-preview { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.report-task-preview > div, -.report-receipt-preview > div { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - padding: var(--space-4); -} - -.report-task-preview span, -.report-receipt-preview span { - color: var(--color-text-muted); - display: block; - font-size: var(--font-size-xs); - margin-bottom: var(--space-2); -} - -.report-task-preview strong, -.report-receipt-preview strong { - color: var(--color-text-strong); - font-size: var(--font-size-xl); -} - -.report-receipt-modal { - align-items: start; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(260px, 0.9fr) minmax(320px, 1.1fr); -} - -.report-receipt-modal .ui-field { - grid-column: 1 / -1; -} - -.report-upload-drop { - align-content: center; - background: var(--color-bg-subtle); - border: 1px dashed var(--color-border-strong); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-2); - min-height: 180px; - padding: var(--space-6); - place-items: center; - text-align: center; -} - -.report-upload-drop svg { - color: var(--color-primary); -} - -.report-upload-drop strong { - color: var(--color-text-strong); - font-size: var(--font-size-md); -} - -.report-upload-drop span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - line-height: 1.5; -} - -.report-receipt-preview { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - display: grid; - gap: var(--space-3); - padding: var(--space-5); -} - -.admin-app-route-card > .ui-field { - max-width: 100%; - min-width: 0; - width: 100%; -} - -.downstream-attempt-timeline { - border-top: 0 !important; - display: grid !important; - gap: var(--space-4) !important; - grid-template-columns: 1fr !important; - padding: var(--space-2) 0 0 !important; - position: relative; -} - -.downstream-attempt-timeline::before { - background: var(--color-border); - bottom: 24px; - content: ''; - left: 19px; - position: absolute; - top: 28px; - width: 2px; -} - -.downstream-attempt-card { - align-items: start; - display: grid; - gap: var(--space-4); - grid-template-columns: 40px minmax(0, 1fr); - position: relative; -} - -.downstream-attempt-marker { - align-items: center; - background: var(--color-bg-subtle); - border: 2px solid var(--color-border); - border-radius: 50%; - color: var(--color-text-muted); - display: flex; - font-size: var(--font-size-sm); - font-weight: 700; - height: 40px; - justify-content: center; - position: relative; - width: 40px; - z-index: 1; -} - -.downstream-attempt-marker--success { background: #ecfdf3; border-color: #86efac; color: #15803d; } -.downstream-attempt-marker--danger { background: #fef2f2; border-color: #fca5a5; color: #b91c1c; } -.downstream-attempt-marker--info { background: #eff6ff; border-color: #93c5fd; color: #1d4ed8; } - -.downstream-attempt-card__body { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - padding: var(--space-4); -} - -.downstream-attempt-card__body > header { - align-items: center; - display: flex; - justify-content: space-between; -} - -.downstream-attempt-card dl { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(3, minmax(0, 1fr)); - margin: 0; -} - -.downstream-attempt-card dl > div { - display: grid; - gap: var(--space-1); - min-width: 0; -} - -.downstream-attempt-card dt { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.downstream-attempt-card dd { - color: var(--color-text-strong); - font-size: var(--font-size-sm); - margin: 0; - overflow-wrap: anywhere; -} - -.downstream-attempt-card__identifiers dd { - font-family: ui-monospace, SFMono-Regular, Consolas, monospace; -} - -.downstream-attempt-result { - align-items: center; - background: var(--color-surface); - border-radius: var(--radius-sm); - display: flex; - gap: var(--space-4); - justify-content: space-between; - padding: var(--space-3); -} - -.downstream-attempt-result--error { - background: #fef2f2; - color: #b91c1c; -} - -.downstream-attempt-timeline > p { - color: var(--color-text-muted); - margin: var(--space-3) 0 0; -} - -.admin-mms-task-page .page-heading { - align-items: center; -} - -.admin-mms-task-table-card .ui-table { - min-width: 1360px; -} - -.admin-mms-task-table-card .ui-table-wrap { - border: 0; - border-radius: 0; -} - -.admin-mms-task-table-card { - overflow: hidden; - padding: 0; -} - -.admin-mms-task-table-card .mms-task-content { - max-width: 420px; -} - -.admin-mms-task-table-card .mms-task-content p { - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - display: -webkit-box; - overflow: hidden; -} - -.admin-mms-task-table-card .mms-task-actions { - justify-content: flex-end; -} - -.admin-mms-task-table-card .mms-task-actions .ui-button { - padding: 0 9px; -} - -.admin-mms-task-detail .mms-detail-template small { - color: var(--color-text-muted); - font-size: var(--font-size-sm); - margin-top: var(--space-2); -} - -.admin-mms-city-list { - background: var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-md); - display: grid; - gap: var(--space-4); - padding: var(--space-5); -} - -.admin-mms-city-list > div { - display: grid; - gap: var(--space-2); - grid-template-columns: 120px minmax(140px, 1fr) 80px; -} - -.admin-mms-city-list strong { - color: var(--color-text-strong); -} - -.admin-mms-city-list span { - color: var(--color-text-muted); - text-align: right; -} - -.admin-mms-city-list b { - color: var(--color-selected); - text-align: right; -} - -.admin-mms-city-list .ui-progress-bar { - grid-column: 1 / -1; -} - -.admin-mms-record-search-button { - background: #9d18ff; - color: var(--color-text-inverse); -} - -.admin-mms-record-search-button:hover { - background: #8610dc; -} - -.admin-mms-record-table { - min-width: 1120px; -} - -.admin-mms-record-table td { - height: 112px; -} - -.admin-mms-template-cell { - display: grid; - gap: var(--space-1); -} - -.admin-mms-template-cell strong { - color: var(--color-text-strong); -} - -.admin-mms-template-cell span { - color: var(--color-text-muted); -} - -.admin-mms-template-cell small { - color: #9d18ff; - font-weight: var(--font-weight-semibold); -} - -.admin-mms-preview-link { - align-items: center; - background: transparent; - border: 0; - color: #9d18ff; - display: inline-flex; - font-weight: var(--font-weight-semibold); - gap: var(--space-2); - padding: 0; -} - -.admin-uplink-page .page-heading { - align-items: center; -} - -.admin-uplink-filter { - align-items: end; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(260px, 1.1fr) minmax(220px, 1fr) minmax(220px, 1fr) auto; -} - -.admin-uplink-filter__actions { - display: grid; - gap: var(--space-3); - grid-template-columns: repeat(2, minmax(120px, 1fr)); -} - -.admin-uplink-table-card { - overflow: hidden; - padding: 0; -} - -.admin-uplink-table-card .ui-table-wrap { - border: 0; - border-radius: 0; -} - -.admin-uplink-table-card .ui-table { - min-width: 1052px; - table-layout: fixed; -} - -.admin-uplink-table-card .uplink-content { - -webkit-line-clamp: 2; - min-width: 0; -} - -.admin-uplink-table-card .ui-table td strong { - overflow-wrap: anywhere; -} - -.gateway-exception-list-heading { - align-items: flex-start; - border-bottom: 1px solid var(--color-border); - gap: var(--space-5); - margin: 0; - padding: var(--space-5) var(--space-6); -} - -.gateway-exception-list-heading > div { - display: grid; - gap: var(--space-1); -} - -.gateway-exception-list-heading h2, -.gateway-exception-list-heading p { - margin: 0; -} - -.gateway-exception-page .report-task-table-card > .ui-pagination { - border-top: 1px solid var(--color-border); - padding: var(--space-4) var(--space-6); -} - -@media (max-width: 720px) { - .downstream-attempt-card dl { - grid-template-columns: 1fr; - } - - .downstream-attempt-result { - align-items: flex-start; - flex-direction: column; - gap: var(--space-2); - } -} - -.admin-uplink-table-card .ui-table th { - background: var(--color-bg-subtle); - color: var(--color-text-muted); - font-size: var(--font-size-sm); - height: 58px; -} - -.admin-uplink-table-card .ui-table td { - height: 84px; - padding: var(--space-5) var(--space-4); -} - -.admin-uplink-checkbox { - accent-color: var(--color-selected); - height: 18px; - width: 18px; -} - -.admin-uplink-detail-link { - background: transparent; - border: 0; - color: var(--color-selected); - font-weight: var(--font-weight-semibold); - padding: 0; -} - -.admin-uplink-detail { - display: grid; - gap: var(--space-7); -} - -.admin-uplink-info-card, -.admin-uplink-match-card { - background: var(--color-bg-subtle); - border-radius: var(--radius-md); - padding: var(--space-6); -} - -.admin-uplink-info-card h3, -.admin-uplink-match-section h3 { - font-size: var(--font-size-lg); - margin: 0 0 var(--space-5); -} - -.admin-uplink-info-grid { - display: grid; - gap: var(--space-6) var(--space-8); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.admin-uplink-info-grid div { - display: grid; - gap: var(--space-2); -} - -.admin-uplink-info-grid__full { - grid-column: 1 / -1; -} - -.admin-uplink-info-grid span, -.admin-uplink-match-section > p, -.admin-uplink-match-grid span, -.admin-uplink-match-content span { - color: var(--color-text-muted); - font-weight: var(--font-weight-semibold); -} - -.admin-uplink-info-grid strong, -.admin-uplink-match-grid strong { - color: var(--color-text-strong); - font-weight: var(--font-weight-semibold); -} - -.admin-uplink-match-section > p { - margin-bottom: var(--space-5); -} - -.admin-uplink-match-grid { - display: grid; - gap: var(--space-6); - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.admin-uplink-match-grid div, -.admin-uplink-match-content { - display: grid; - gap: var(--space-2); -} - -.admin-uplink-match-content { - margin-top: var(--space-5); -} - -.admin-uplink-match-content p { - border-bottom: 1px solid var(--color-border); - color: var(--color-text-strong); - line-height: 1.75; - margin: 0; - padding-bottom: var(--space-5); -} - -.admin-uplink-candidate-footer { - align-items: center; - display: flex; - gap: var(--space-4); - justify-content: space-between; - margin-top: var(--space-5); -} - -.admin-uplink-candidate-footer span { - color: var(--color-text-muted); - line-height: 1.6; - min-width: 0; -} - -.admin-recharge-page .page-heading { - align-items: center; -} - -.admin-recharge-filter { - align-items: end; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(320px, 1.2fr) minmax(320px, 1.2fr) minmax(360px, 1fr); -} - -.admin-recharge-filter__actions { - display: grid; - gap: var(--space-4); - grid-template-columns: repeat(2, minmax(140px, 1fr)); -} - -.admin-recharge-table-card { - overflow: hidden; - padding: 0; -} - -.admin-recharge-table-card .ui-table-wrap { - border: 0; - border-radius: 0; -} - -.admin-recharge-table { - min-width: 1350px; -} - -.admin-recharge-table th { - background: var(--color-bg-subtle); - color: var(--color-text-muted); - font-size: var(--font-size-sm); - height: 58px; - text-align: left; -} - -.admin-recharge-table td { - color: var(--color-text-strong); - font-weight: var(--font-weight-medium); - height: 76px; - padding: var(--space-4) var(--space-6); - vertical-align: middle; -} - -.admin-recharge-table td:nth-child(3), -.admin-recharge-table td:nth-child(4) { - font-variant-numeric: tabular-nums; -} - -.recharge-receipt-modal .ui-modal__header, -.recharge-receipt-modal .ui-modal__footer { - padding: var(--space-3) var(--space-5); -} - -.recharge-receipt-modal .ui-modal__body { - padding: var(--space-3) var(--space-5); -} - -.recharge-receipt { - background: - linear-gradient(135deg, rgba(217, 195, 160, 0.18), transparent 42%), - var(--color-surface); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - overflow: hidden; - position: relative; -} - -.recharge-receipt::before { - background: linear-gradient(90deg, var(--color-brand), var(--color-accent-strong)); - content: ''; - height: 4px; - inset: 0 0 auto; - position: absolute; -} - -.recharge-receipt__header { - align-items: center; - display: flex; - justify-content: space-between; - min-height: 52px; - padding: var(--space-3) var(--space-5) var(--space-2); -} - -.recharge-receipt__logo { - display: block; - height: 32px; - max-width: 190px; - object-fit: contain; - object-position: left center; - width: auto; -} - -.recharge-receipt__header > span { - align-items: center; - border-radius: var(--radius-full); - display: inline-flex; - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - gap: var(--space-2); - padding: 7px 12px; -} - -.recharge-receipt__header .is-posted { - background: var(--color-success-soft); - color: var(--color-success); -} - -.recharge-receipt__header .is-correction { - background: var(--color-warning-soft); - color: var(--color-warning); -} - -.recharge-receipt__amount { - border-bottom: 1px solid var(--color-border); - display: grid; - justify-items: center; - padding: var(--space-2) var(--space-5) var(--space-3); -} - -.recharge-receipt__amount > span, -.recharge-receipt__enterprise > span, -.recharge-receipt__remark > span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.recharge-receipt__amount strong { - color: var(--color-text-strong); - font-size: clamp(28px, 4vw, 34px); - font-variant-numeric: tabular-nums; - letter-spacing: -0.035em; - line-height: 1.15; - margin-top: var(--space-1); -} - -.recharge-receipt__amount small { - font-size: 0.58em; - font-weight: var(--font-weight-semibold); - margin: 0 var(--space-1); -} - -.recharge-receipt__enterprise { - display: grid; - gap: var(--space-1); - padding: var(--space-3) var(--space-5); -} - -.recharge-receipt__enterprise strong { - color: var(--color-text-strong); - font-size: var(--font-size-lg); -} - -.recharge-receipt__enterprise small { - color: var(--color-text-muted); -} - -.recharge-receipt__details { - background: var(--color-bg-subtle); - border-bottom: 1px solid var(--color-border); - border-top: 1px solid var(--color-border); - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin: 0; - padding: var(--space-1) var(--space-5); -} - -.recharge-receipt__details > div { - display: grid; - gap: var(--space-1); - min-width: 0; - padding: var(--space-2) 0; -} - -.recharge-receipt__details > div:nth-child(even) { - padding-left: var(--space-6); -} - -.recharge-receipt__details dt { - color: var(--color-text-muted); - font-size: var(--font-size-xs); -} - -.recharge-receipt__details dd { - color: var(--color-text-strong); - font-variant-numeric: tabular-nums; - font-weight: var(--font-weight-medium); - margin: 0; - overflow-wrap: anywhere; -} - -.recharge-receipt__remark { - display: grid; - gap: var(--space-2); - padding: var(--space-2) var(--space-5); -} - -.recharge-receipt__remark p { - color: var(--color-text-strong); - line-height: var(--line-height-loose); - margin: 0; - overflow-wrap: anywhere; -} - -.recharge-receipt__note { - background: var(--color-bg-subtle); - border-top: 1px dashed var(--color-border-strong); - color: var(--color-text-muted); - font-size: var(--font-size-xs); - padding: var(--space-2) var(--space-5); - text-align: center; -} - -.recharge-receipt--correction .recharge-receipt__amount { - padding-bottom: var(--space-2); - padding-top: var(--space-1); -} - -.recharge-receipt--correction .recharge-receipt__amount strong { - font-size: 28px; -} - -@media (max-width: 560px) { - .recharge-receipt__header, - .recharge-receipt__enterprise, - .recharge-receipt__remark { - padding-left: var(--space-5); - padding-right: var(--space-5); - } - - .recharge-receipt__logo { - height: 32px; - max-width: 150px; - } - - .recharge-receipt__details { - grid-template-columns: 1fr; - padding-left: var(--space-5); - padding-right: var(--space-5); - } - - .recharge-receipt__details > div { - border-bottom: 1px solid var(--color-border); - } - - .recharge-receipt__details > div:last-child { - border-bottom: 0; - } - - .recharge-receipt__details > div:nth-child(even) { - padding-left: 0; - } -} - -.manual-recharge-review, -.manual-recharge-result { - display: grid; - gap: var(--space-5); -} - -.manual-recharge-review > p { - color: var(--color-text-muted); - margin: 0; -} - -.manual-recharge-review dl { - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - margin: 0; - overflow: hidden; -} - -.manual-recharge-review dl > div { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(110px, 0.7fr) minmax(0, 1.5fr); - padding: var(--space-4) var(--space-5); -} - -.manual-recharge-review dl > div:last-child { - border-bottom: 0; -} - -.manual-recharge-review dt { - color: var(--color-text-muted); -} - -.manual-recharge-review dd { - display: grid; - font-variant-numeric: tabular-nums; - gap: var(--space-1); - justify-items: end; - margin: 0; - overflow-wrap: anywhere; - text-align: right; -} - -.manual-recharge-review dd span { - color: var(--color-text-muted); - font-size: var(--font-size-sm); -} - -.manual-recharge-review .is-positive { - color: var(--color-success); -} - -.manual-recharge-review .is-negative { - color: var(--color-danger); -} - -.manual-recharge-review__remark { - background: var(--color-warning-soft); - border-radius: var(--radius-md); - color: var(--color-text-strong) !important; - padding: var(--space-4); - overflow-wrap: anywhere; -} - -.manual-recharge-result { - background: var(--color-success-soft); - border: 1px solid var(--color-success); - border-radius: var(--radius-lg); - color: var(--color-text-strong); - padding: var(--space-6); -} - -.manual-recharge-result > strong { - color: var(--color-success); - font-size: var(--font-size-lg); -} - -@media (max-width: 480px) { - .manual-recharge-review dl > div { - align-items: start; - grid-template-columns: 1fr; - gap: var(--space-2); - } - - .manual-recharge-review dd { - justify-items: start; - text-align: left; - } -} - -.admin-recharge-pagination { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - gap: var(--space-5); - justify-content: flex-end; - min-height: 88px; - padding: var(--space-4) var(--space-6); -} - -.admin-recharge-pagination > label { - width: 130px; -} - -.admin-recharge-pagination > div { - align-items: center; - display: flex; - gap: var(--space-2); -} - -.admin-recharge-pagination .ui-button--primary { - background: var(--color-selected); -} - -.admin-recharge-pagination span { - color: var(--color-text-muted); - padding: 0 var(--space-2); -} - -.phone-segment-tabs .ui-tabs__list { - width: fit-content; -} - -.phone-segment-tabs .ui-tabs__tab { - min-width: 0; - padding-inline: var(--space-3); -} - -.admin-user-toolbar { - grid-template-columns: minmax(0, 1fr) auto; -} - -.admin-user-filter-grid { - min-width: 0; -} - -.admin-user-toolbar > .ui-button { - justify-self: end; - width: max-content; -} - -.phone-segment-workbench { - max-width: 1440px; -} - -.phone-segment-heading { - display: grid; - gap: var(--space-2); -} - -.phone-segment-summary__icon { - align-items: center; - background: var(--color-selected-soft); - border: 1px solid #bfdbfe; - border-radius: 50%; - color: var(--color-selected); - display: inline-flex; - flex: 0 0 auto; - justify-content: center; -} - -.phone-segment-heading > p { - color: var(--color-text-muted); - margin: 0 0 0 56px; -} - -.phone-segment-panel { - border-radius: var(--radius-lg); -} - -.phone-segment-query { - align-items: center; - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(300px, 670px) auto; -} - -.phone-segment-query__actions { - display: flex; - gap: var(--space-3); -} - -.phone-segment-workbench__tabs { - display: grid; -} - -.phone-segment-workbench__tabs .ui-tabs__list { - border-bottom: 1px solid var(--color-border); - overflow-y: hidden; - padding: 0 var(--space-6); - width: fit-content; -} - -.phone-segment-workbench__tabs .ui-tabs__tab { - min-height: 58px; - padding-inline: var(--space-4); -} - -.phone-segment-tab-content { - display: grid; - gap: 0; -} - -.phone-segment-summary { - align-items: center; - border-bottom: 1px solid var(--color-border); - display: grid; - gap: var(--space-4); - grid-template-columns: 52px auto minmax(0, 1fr); - margin: 0 var(--space-6); - min-height: 128px; - padding: var(--space-5) 0; -} - -.phone-segment-summary__icon { - height: 48px; - width: 48px; -} - -.phone-segment-summary__value { - border-right: 1px solid var(--color-border); - display: grid; - gap: var(--space-1); - min-width: 190px; - padding-right: var(--space-6); -} - -.phone-segment-summary__value > span { - color: var(--color-text); - font-weight: var(--font-weight-medium); -} - -.phone-segment-summary__value strong { - color: var(--color-selected); - font-size: 30px; - letter-spacing: -0.02em; - line-height: 1.1; -} - -.phone-segment-summary p { - color: var(--color-text-muted); - margin: 0; - padding-left: var(--space-2); -} - -.phone-segment-tab-content > .phone-segment-query { - margin: var(--space-5) var(--space-6); -} - -.phone-segment-prefix { - color: var(--color-text-strong); - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; - font-size: 15px; - letter-spacing: 0.04em; -} - -.phone-segment-delete { - color: var(--color-danger); -} - -.phone-segment-delete:hover:not(:disabled) { - background: var(--color-danger-soft); - color: var(--color-danger); -} - -.phone-segment-panel .ui-pagination { - border-top: 1px solid var(--color-border); - padding: var(--space-5) var(--space-6); -} - -.phone-segment-panel .ui-table { - min-width: 800px; -} - -.admin-drainage-actions { - align-items: center; - display: inline-flex; - gap: var(--space-2); - justify-content: flex-end; -} - -.admin-drainage-toolbar { - align-items: end; - display: grid; - gap: var(--space-5); - grid-template-columns: minmax(320px, 1fr) minmax(160px, 220px) auto; -} - -.admin-drainage-page .page-heading > div > p { color: var(--color-text-muted); margin: 6px 0 0; } -.admin-drainage-summary { display: grid; gap: 16px; grid-template-columns: repeat(3, minmax(0, 1fr)); } -.admin-drainage-summary article { align-items: center; background: linear-gradient(135deg, #fff, var(--color-bg-subtle)); border: 1px solid var(--color-border); border-radius: var(--radius-lg); display: flex; gap: 14px; min-height: 96px; padding: 20px; } -.admin-drainage-summary article > span { align-items: center; background: #eef4ff; border-radius: 12px; color: var(--color-primary); display: flex; height: 42px; justify-content: center; width: 42px; } -.admin-drainage-summary strong { color: var(--color-text-strong); font-size: 24px; } -.admin-drainage-summary p { color: var(--color-text-muted); margin: 3px 0 0; } -.admin-drainage-section { padding: 22px; } -.admin-drainage-section__heading { align-items: flex-start; display: flex; gap: 20px; justify-content: space-between; margin-bottom: 18px; } -.admin-drainage-section__heading h2 { margin: 0 0 6px; } -.admin-drainage-section__heading p { color: var(--color-text-muted); margin: 0; } -.admin-drainage-common-grid { display: grid; gap: 16px; grid-template-columns: repeat(2, minmax(0, 1fr)); } -.admin-drainage-common-group { background: var(--color-bg-subtle); border: 1px solid var(--color-border); border-radius: var(--radius-md); min-width: 0; padding: 16px; } -.admin-drainage-common-group__title { align-items: center; display: flex; justify-content: space-between; margin-bottom: 12px; } -.admin-drainage-common-group__title > span, .admin-drainage-common-empty { color: var(--color-text-muted); font-size: var(--font-size-sm); } -.admin-drainage-common-list { display: grid; gap: 8px; } -.admin-drainage-common-list > div { align-items: center; background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-sm); display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr) auto auto auto auto; padding: 11px 12px; } -.admin-drainage-common-list strong, .admin-drainage-common-list span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.admin-drainage-common-list span { color: var(--color-text-muted); font-size: 12px; margin-top: 3px; } -.admin-drainage-common-order { display: inline-flex; gap: 2px; } -.admin-drainage-field-grid { display: grid; gap: 14px; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); } -.admin-drainage-field-card { border: 1px solid var(--color-border); border-radius: var(--radius-md); display: flex; flex-direction: column; min-height: 220px; padding: 16px; transition: border-color .2s, box-shadow .2s, transform .2s; } -.admin-drainage-field-card:hover { border-color: #b8c9eb; box-shadow: 0 8px 24px rgba(27, 55, 100, .08); transform: translateY(-1px); } -.admin-drainage-field-card__actions { display: inline-flex; gap: 4px; } -.admin-drainage-field-card__top { align-items: center; display: flex; justify-content: space-between; } -.admin-drainage-field-card h3 { font-size: 17px; margin: 15px 0 5px; } -.admin-drainage-field-card code { color: var(--color-primary); font-size: 13px; } -.admin-drainage-field-card > p { color: var(--color-text-muted); flex: 1; line-height: 1.6; margin: 12px 0; } -.admin-drainage-field-card__meta { border-top: 1px solid var(--color-border); color: var(--color-text-muted); display: flex; font-size: 13px; gap: 18px; padding-top: 12px; } -.admin-drainage-field-card__meta strong { color: var(--color-text-strong); } -.admin-drainage-empty { color: var(--color-text-muted); padding: 42px; text-align: center; } - -.admin-drainage-type { - align-items: center; - background: var(--color-bg-subtle); - border: 1px solid var(--color-border); - border-radius: var(--radius-sm); - color: var(--color-text-strong); - display: inline-flex; - font-size: var(--font-size-sm); - font-weight: var(--font-weight-semibold); - min-height: 30px; - padding: 0 var(--space-3); -} - -@media (max-width: 900px) { - .admin-drainage-summary, .admin-drainage-common-grid { grid-template-columns: 1fr; } - .admin-drainage-toolbar { grid-template-columns: 1fr; } - .admin-drainage-section__heading { align-items: stretch; flex-direction: column; } - .admin-user-toolbar { grid-template-columns: 1fr; } -} - -.admin-drainage-actions .ui-button--ghost { - color: var(--color-text); -} - -.admin-drainage-pagination { - align-items: center; - border-top: 1px solid var(--color-border); - display: flex; - gap: var(--space-3); - justify-content: flex-end; - min-height: 76px; - padding: var(--space-4) var(--space-6); -} - -.admin-drainage-pagination span { - color: var(--color-text-muted); -} - -.file-actions { - align-items: center; - display: inline-flex; - flex-wrap: wrap; - gap: 6px; - margin-top: 6px; -} - -.file-action-link, -.file-action-preview.ui-button { - align-items: center; - background: #fff; - border: 1px solid var(--border); - border-radius: 6px; - color: var(--text); - display: inline-flex; - font-size: 13px; - font-weight: 600; - gap: 4px; - min-height: 30px; - padding: 0 10px; - text-decoration: none; -} - -.file-action-link:hover, -.file-action-preview.ui-button:hover { - border-color: var(--primary); - color: var(--primary); -} - -.file-preview-image { - display: block; - height: auto; - margin: 0 auto; - max-height: calc(100vh - 300px); - max-width: 100%; - object-fit: contain; -} - -.client-signature-page { - gap: 18px; -} - -.client-signature-heading, -.client-signature-title, -.client-drainage-panel__head { - align-items: center; - display: flex; - justify-content: space-between; -} - -.client-signature-title { - justify-content: flex-start; - gap: 13px; -} - -.client-signature-title__icon { - align-items: center; - background: #e9f6f0; - border: 1px solid #d3ebe1; - border-radius: 12px; - color: #187352; - display: inline-flex; - height: 46px; - justify-content: center; - width: 46px; -} - -.client-signature-title h1, -.client-signature-title p, -.client-drainage-panel h3, -.client-drainage-panel p, -.client-signature-form-section h3, -.client-signature-form-section p { - margin: 0; -} - -.client-signature-title h1 { - color: var(--text-strong); - font-size: 24px; - line-height: 1.25; -} - -.client-signature-title p, -.client-drainage-panel p, -.client-signature-form-section p { - color: var(--text-muted); - font-size: 13px; - margin-top: 5px; -} - -.client-signature-overview { - background: var(--surface); - border: 1px solid var(--border); - border-radius: var(--radius-lg); - display: grid; - grid-template-columns: repeat(4, 1fr); - overflow: hidden; -} - -.client-signature-overview > div { - display: grid; - gap: 7px; - padding: 18px 22px; - position: relative; -} - -.client-signature-overview > div + div::before { - background: var(--border); - content: ''; - height: 34px; - left: 0; - position: absolute; - top: 20px; - width: 1px; -} - -.client-signature-overview span { - color: var(--text-muted); - font-size: 13px; -} - -.client-signature-overview strong { - color: var(--text-strong); - font-size: 25px; - line-height: 1; -} - -.client-signature-toolbar { - align-items: end; - display: grid; - gap: 12px; - grid-template-columns: minmax(240px, 1fr) 190px 160px auto; -} - -.client-signature-list-shell { - background: var(--surface); - border: 1px solid var(--border); - border-radius: var(--radius-lg); - overflow: hidden; -} - -.client-signature-list-head, -.client-signature-list-row { - align-items: center; - display: grid; - gap: 14px; - grid-template-columns: 24px minmax(120px, 1.05fr) minmax(110px, .85fr) minmax(360px, 2.2fr) 142px minmax(144px, auto); - min-width: 1030px; -} - -.client-signature-list-head { - background: #f7f9f8; - border-bottom: 1px solid var(--border); - color: var(--text-muted); - font-size: 12px; - font-weight: 600; - letter-spacing: .02em; - padding: 12px 18px; -} - -.client-signature-row-wrap { - content-visibility: auto; - contain-intrinsic-size: 62px; -} - -.client-signature-row-wrap + .client-signature-row-wrap { - border-top: 1px solid var(--border); -} - -.client-signature-list-row { - min-height: 62px; - padding: 10px 18px; -} - -.client-signature-list-row > span { - color: var(--text-secondary); - font-size: 13px; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.client-signature-list-row > strong { - color: var(--text-strong); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.client-signature-expand { - align-items: center; - background: transparent; - border: 0; - color: var(--text-muted); - cursor: pointer; - display: inline-flex; - justify-content: center; - padding: 3px; -} - -.client-signature-expand:hover { - color: var(--primary); -} - -.client-carrier-status-group { - display: grid; - gap: 8px; - grid-template-columns: repeat(3, minmax(0, 1fr)); - min-width: 0; -} - -.client-carrier-status { - align-items: center; - background: #f8faf9; - border: 1px solid #e3e9e6; - border-radius: 8px; - display: grid; - gap: 6px; - grid-template-columns: auto 7px minmax(0, 1fr); - min-height: 34px; - padding: 5px 8px; -} - -.client-carrier-status strong { - color: var(--text-secondary); - font-size: 12px; - font-weight: 600; - min-width: 0; - white-space: nowrap; -} - -.client-carrier-status__dot { - background: #b5c0bb; - border-radius: 50%; - height: 7px; - width: 7px; -} - -.client-carrier-status--available { - background: #f1faf6; - border-color: #cfe8dc; -} - -.client-carrier-status--available strong { - color: #176b49; -} - -.client-carrier-status--available .client-carrier-status__dot { - background: #24a06b; - box-shadow: 0 0 0 3px rgba(36, 160, 107, .12); -} - -.client-signature-inline-reason, -.client-signature-reason, -.client-drainage-reason { - background: #fff8f0; - color: #9a4d12; - font-size: 13px; -} - -.client-signature-inline-reason { - border-top: 1px solid #f5dfc8; - padding: 9px 56px; -} - -.client-signature-reason { - border: 1px solid #f5dfc8; - border-radius: 8px; - display: grid; - gap: 4px; - padding: 12px 14px; -} - -.client-drainage-panel { - background: #f8fbfa; - border-top: 1px solid var(--border); - padding: 18px 56px 22px; -} - -.client-drainage-panel__head { - margin-bottom: 14px; -} - -.client-drainage-panel h3 { - align-items: center; - color: var(--text-strong); - display: flex; - font-size: 15px; - gap: 7px; -} - -.client-drainage-table { - background: var(--surface); - border: 1px solid var(--border); - border-radius: 9px; - overflow-x: auto; -} - -.client-drainage-table__head, -.client-drainage-table__row { - align-items: center; - display: grid; - gap: 14px; - grid-template-columns: minmax(220px, 1.35fr) minmax(360px, 2.2fr) 142px minmax(144px, auto); - min-width: 940px; -} - -.client-drainage-table__head { - background: #f5f8f7; - color: var(--text-muted); - font-size: 12px; - font-weight: 600; - padding: 10px 14px; -} - -.client-drainage-table__row { - border-top: 1px solid var(--border); - min-height: 56px; - padding: 9px 14px; -} - -.client-drainage-target { - color: var(--primary); - font-size: 13px; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.client-drainage-reason { - grid-column: 1 / -1; - margin: 0 -14px -9px; - padding: 8px 14px; -} - -.client-signature-list-empty, -.client-signature-empty-hint { - color: var(--text-muted); - font-size: 13px; - margin: 0; - padding: 28px; - text-align: center; -} - -.client-signature-form-section { - background: #f8fbfa; - border: 1px solid var(--border); - border-radius: 10px; - display: grid; - gap: 14px; - padding: 16px; -} - -.client-signature-form-section .client-signature-empty-hint { - padding: 10px; - text-align: left; -} - -@media (max-width: 1180px) { - .client-signature-list-shell { - overflow-x: auto; - } -} - -@media (max-width: 780px) { - .enterprise-flow-card { - min-height: 0; - padding: var(--space-4); - } - - .enterprise-stepper { - justify-content: flex-start; - margin-bottom: var(--space-8); - overflow-x: auto; - padding-bottom: var(--space-2); - } - - .enterprise-stepper__item { - flex: 0 0 auto; - gap: var(--space-2); - } - - .enterprise-stepper__dot { - height: 36px; - width: 36px; - } - - .enterprise-stepper__arrow { - flex: 0 0 auto; - margin: 0 var(--space-2); - } - - .enterprise-form-panel, - .enterprise-upload { - min-width: 0; - width: 100%; - } - - .enterprise-upload { - padding: var(--space-4); - text-align: center; - } - - .enterprise-upload strong { - max-width: 100%; - overflow-wrap: anywhere; - } - - .enterprise-upload .file-actions { - justify-content: center; - } - - .enterprise-address-selects > div { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .enterprise-address-selects .ui-field { - min-width: 0; - width: 100%; - } - - .client-signature-heading, - .client-drainage-panel__head { - align-items: stretch; - display: grid; - gap: 14px; - } - - .client-signature-overview { - grid-template-columns: repeat(2, 1fr); - } - - .client-signature-overview > div:nth-child(3)::before { - display: none; - } - - .client-signature-toolbar { - grid-template-columns: 1fr; - } - - .client-drainage-panel { - padding: 18px; - } -} - -@media (max-width: 780px) { - - .overview-hero { - align-items: stretch; - display: grid; - padding: var(--space-5); - } - - .dashboard-grid { - grid-template-columns: 1fr; - } - - .content-grid, -.plan-grid, -.chart-grid, -.overview-grid, -.overview-grid--three, -.quick-grid, -.sms-send-layout, -.send-form-row { - grid-template-columns: 1fr; - } - - .sms-preview-card { - position: static; - } - - .receiver-table__head, - .receiver-table__row { - grid-template-columns: 64px minmax(0, 1fr) 64px; - } - - .batch-filter-grid { - gap: var(--space-4); - grid-template-columns: 1fr; - } - - .batch-pagination { - align-items: stretch; - display: grid; - gap: var(--space-3); - } - - .task-info-grid, - .task-stat-grid, - .carrier-rate-grid, - .sms-app-grid, - .template-card-grid { - grid-template-columns: 1fr; - } - - .template-toolbar, - .template-custom-variable { - grid-template-columns: 1fr; - } - - .task-detail-title h2 { - font-size: 26px; - } - - .admin-uplink-filter, -.admin-recharge-filter, -.admin-recharge-filter__actions, -.phone-segment-overview, -.phone-segment-tabs, -.admin-drainage-toolbar, -.channel-route-card-grid, -.detail-grid, -.admin-mms-city-list > div, -.admin-uplink-info-grid, -.admin-uplink-match-grid { - grid-template-columns: 1fr; -} - -.admin-recharge-pagination { - align-items: stretch; - display: grid; - justify-content: stretch; - } - -} - -/* Shared responsive layouts for report filters and compact record rows. */ - -.client-http-credential-row { - align-items: center; - display: grid; - gap: var(--space-3); - grid-template-columns: 1fr 1.5fr 100px 1fr auto; - padding: var(--space-4); -} - -.client-http-credential-row code { - min-width: 0; - overflow-wrap: anywhere; -} - -.admin-report-target-row { - display: grid; - gap: var(--space-4); - grid-template-columns: minmax(0, 1fr) 220px; - padding: var(--space-4); -} - -@media (max-width: 780px) { - .login-page { - padding: var(--space-4); - } - - .login-panel { - padding: 28px 22px 24px; - } - - .login-brand { - margin-bottom: var(--space-6); - } - - .login-captcha-row { - grid-template-columns: minmax(0, 1fr) 112px; - gap: var(--space-2); - } - - .admin-dashboard-main-grid, -.admin-metric-grid, -.admin-workload-grid, -.enterprise-summary-grid, -.enterprise-query-grid, -.system-log-filters, -.channel-report-filter-grid, -.channel-group-filter, -.channel-group-config-item, -.channel-group-base-form, -.channel-group-retry-limit, -.report-receipt-modal, -.phone-segment-query, -.client-http-credential-row, -.admin-report-target-row, -.admin-app-form-grid, -.admin-app-route-grid { - grid-template-columns: minmax(0, 1fr); - } - - .admin-app-protocol-header { - align-items: stretch; - display: grid; - gap: var(--space-4); - } - - .admin-app-protocol-header > .admin-switch { - justify-self: start; - } - - .admin-metric-grid, - .enterprise-summary-grid, - .admin-workload-grid { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .enterprise-query-actions, -.phone-segment-query__actions { - align-items: stretch; - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .enterprise-query-actions .ui-button, -.phone-segment-query__actions .ui-button { - width: 100%; - } - - .channel-report-page, - .channel-group-form-page { - min-width: 0; - width: 100%; - } - - .channel-report-heading, - .channel-report-filter-footer { - align-items: stretch; - display: grid; - gap: var(--space-4); - } - - .channel-report-config-actions { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - margin-left: 0; - } - - .channel-report-filter-footer > div { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .channel-report-table { - background: transparent; - border: 0; - box-shadow: none; - overflow: visible; - } - - .channel-report-table__head { - display: none; - } - - .channel-report-row { - align-items: stretch; - border: 1px solid var(--color-border); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - display: grid; - gap: var(--space-3); - grid-template-columns: minmax(0, 1fr); - margin-bottom: var(--space-3); - min-height: 0; - padding: var(--space-4); - } - - .channel-report-row > :first-child { - display: none; - } - - .channel-report-name--flow { - padding-left: 0; - } - - .channel-report-row > :nth-child(3), - .channel-report-row > :nth-child(4), - .channel-report-row > :nth-child(5), - .channel-report-row > :nth-child(6) { - align-items: center; - display: grid; - gap: var(--space-3); - grid-template-columns: 88px minmax(0, 1fr); - min-width: 0; - } - - .channel-report-row > :nth-child(3)::before { color: var(--color-text-muted); content: "报备状态"; font-size: var(--font-size-xs); } - .channel-report-row > :nth-child(4)::before { color: var(--color-text-muted); content: "提交报备时间"; font-size: var(--font-size-xs); } - .channel-report-row > :nth-child(5)::before { color: var(--color-text-muted); content: "报备成功时间"; font-size: var(--font-size-xs); } - .channel-report-row > :nth-child(6)::before { color: var(--color-text-muted); content: "上次发送成功"; font-size: var(--font-size-xs); } - - .channel-report-stats { - grid-template-columns: repeat(2, minmax(0, 1fr)); - min-width: 0; - width: 100%; - } - - .channel-report-actions { - display: flex; - flex-wrap: wrap; - gap: var(--space-4); - } - - .channel-signature-grid, - .channel-status-options { - grid-template-columns: minmax(0, 1fr); - } - - .channel-group-base-form > .ui-field, - .channel-group-retry-limit, - .channel-group-radio-row, - .channel-group-switch-row { - grid-column: auto; - } - - .channel-group-radio-row, - .channel-group-switch-row { - align-items: flex-start; - display: grid; - gap: var(--space-3); - } - - .channel-group-filter__actions, - .channel-group-config-item__actions, - .channel-group-row-actions { - justify-content: flex-start; - justify-self: stretch; - } - - .channel-group-config-item__metrics { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .channel-group-retry-limit > span, - .channel-group-retry-limit small { - grid-column: auto; - } - - .phone-segment-tab-content > .phone-segment-query { - margin: var(--space-4); - } - - .phone-segment-heading > p { - font-size: var(--font-size-sm); - line-height: 1.55; - margin-left: 0; - } - - .phone-segment-workbench__tabs .ui-tabs__list { - padding: 0 var(--space-3); - width: 100%; - } - - .phone-segment-workbench__tabs .ui-tabs__tab { - flex: 1; - justify-content: center; - white-space: nowrap; - } - - .phone-segment-summary { - gap: var(--space-3); - grid-template-columns: 44px minmax(0, 1fr); - margin: 0 var(--space-4); - min-height: 0; - padding: var(--space-5) 0; - } - - .phone-segment-summary__icon { - height: 42px; - width: 42px; - } - - .phone-segment-summary__value { - border-right: 0; - min-width: 0; - padding-right: 0; - } - - .phone-segment-summary__value strong { - font-size: 26px; - } - - .phone-segment-summary p { - grid-column: 1 / -1; - padding-left: 0; - } - - .phone-segment-panel .ui-table tbody { - padding: 0 var(--space-4) var(--space-4); - } - - .phone-segment-panel .ui-pagination { - padding: var(--space-4); - } - - .sms-bulk-actions, -.sms-audit-toolbar { - align-items: stretch; - flex-wrap: wrap; - } - - /* Signature and drainage rows use true mobile cards. */ - .client-signature-list-shell { - background: transparent; - border: 0; - overflow: visible; - } - - .client-signature-list-head, - .client-drainage-table__head { - display: none; - } - - .client-signature-row-wrap { - background: var(--surface); - border: 1px solid var(--border); - border-radius: var(--radius-lg); - box-shadow: var(--shadow-sm); - overflow: hidden; - } - - .client-signature-row-wrap + .client-signature-row-wrap { - border-top: 1px solid var(--border); - margin-top: var(--space-3); - } - - .client-signature-list-row { - align-items: center; - display: grid; - gap: 10px; - grid-template-columns: 32px minmax(0, 1fr); - min-width: 0; - padding: var(--space-4); - } - - .client-signature-list-row > :nth-child(n+3):nth-child(-n+7) { - align-items: center; - display: grid; - gap: var(--space-3); - grid-column: 1 / -1; - grid-template-columns: 92px minmax(0, 1fr); - overflow: visible; - white-space: normal; - } - - .client-signature-list-row > :nth-child(3)::before { color: var(--text-muted); content: "所属应用"; font-size: 12px; } - .client-signature-list-row > :nth-child(4)::before { color: var(--text-muted); content: "移动"; font-size: 12px; } - .client-signature-list-row > :nth-child(5)::before { color: var(--text-muted); content: "联通"; font-size: 12px; } - .client-signature-list-row > :nth-child(6)::before { color: var(--text-muted); content: "电信"; font-size: 12px; } - .client-signature-list-row > :nth-child(7)::before { color: var(--text-muted); content: "更新时间"; font-size: 12px; } - - .client-signature-list-row > .table-actions { - grid-column: 1 / -1; - justify-content: flex-start; - } - - .client-signature-inline-reason, - .client-drainage-panel { - padding: var(--space-4); - } - - .client-drainage-table { - background: transparent; - border: 0; - overflow: visible; - } - - .client-drainage-table__row { - background: var(--surface); - border: 1px solid var(--border); - border-radius: var(--radius-md); - display: grid; - gap: 10px; - grid-template-columns: 88px minmax(0, 1fr); - min-width: 0; - padding: var(--space-4); - } - - .client-drainage-table__row > * { - grid-column: 1 / -1; - min-width: 0; - white-space: normal; - } - - .client-drainage-table__row > a { - overflow-wrap: anywhere; - } - - .client-drainage-reason { - margin: 0; - } -} - -@media (max-width: 360px) { - .login-captcha-row, -.admin-metric-grid, -.enterprise-summary-grid, -.admin-workload-grid, -.channel-report-config-actions, -.channel-report-filter-footer > div, -.enterprise-query-actions, -.phone-segment-query__actions { - grid-template-columns: minmax(0, 1fr); - } -} -.application-unit-price { - color: var(--color-text-strong); - font-size: var(--font-size-base); - font-variant-numeric: tabular-nums; -} -.downstream-page-size { display: inline-flex; align-items: center; gap: 8px; color: var(--text-muted); font-size: 13px; } -.downstream-page-size select { min-width: 76px; height: 36px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--text); padding: 0 10px; } -.downstream-requeue-task-heading { gap: 20px; } -.downstream-requeue-task-card > .downstream-requeue-task-heading { padding: var(--space-6) var(--space-6) var(--space-5); } -.downstream-requeue-task-heading__actions { display: flex; align-items: center; gap: 8px; } -.downstream-requeue-task-heading__actions .ui-field { min-width: 150px; } -.downstream-requeue-task-list { display: grid; margin: 0 var(--space-6); overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--color-surface); } -.downstream-requeue-task-list article { display: grid; grid-template-columns: minmax(190px, .9fr) minmax(260px, 1.35fr) minmax(250px, 1fr) auto; gap: 22px; align-items: center; padding: 18px var(--space-5); border-bottom: 1px solid var(--border); } -.downstream-requeue-task-list article:last-of-type { border-bottom: 0; } -.downstream-requeue-task-list > .muted { margin: 0; padding: var(--space-6); text-align: center; } -.downstream-requeue-task-card > .ui-pagination { padding: var(--space-5) var(--space-6) var(--space-6); } -.downstream-requeue-task-list article > div { min-width: 0; } -.downstream-requeue-task-list__identity, .downstream-requeue-task-list__scope, .downstream-requeue-task-list__progress { display: grid; gap: 5px; } -.downstream-requeue-task-list__identity > strong { color: var(--text-strong); font-size: 14px; font-variant-numeric: tabular-nums; } -.downstream-requeue-task-list__identity > span, .downstream-requeue-task-list__identity > small, .downstream-requeue-task-list__scope > span, .downstream-requeue-task-list__progress > small { color: var(--text-muted); } -.downstream-requeue-task-list__scope > strong { overflow: hidden; color: var(--text); font-weight: 500; text-overflow: ellipsis; white-space: nowrap; } -.downstream-requeue-task-list__progress > div:first-child { display: flex; align-items: center; justify-content: space-between; gap: 10px; } -.downstream-requeue-task-list__meter { height: 5px; overflow: hidden; border-radius: 999px; background: var(--surface-subtle, #eef2f6); } -.downstream-requeue-task-list__meter > span { display: block; height: 100%; border-radius: inherit; background: var(--brand, #2f6f91); transition: width .2s ease; } -.downstream-requeue-task-list__actions { display: flex !important; flex-wrap: wrap; justify-content: flex-end; gap: 6px; } -.downstream-requeue-preview { display: grid; gap: 20px; } -.downstream-requeue-preview__summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; } -.downstream-requeue-preview__summary > div { display: grid; gap: 4px; padding: 16px; border: 1px solid var(--border); border-radius: 12px; background: var(--surface-subtle, #f8fafc); } -.downstream-requeue-preview__summary > div.is-primary { border-color: color-mix(in srgb, var(--brand, #2f6f91) 28%, var(--border)); background: color-mix(in srgb, var(--brand, #2f6f91) 7%, white); } -.downstream-requeue-preview__summary span, .downstream-requeue-preview__summary small { color: var(--text-muted); } -.downstream-requeue-preview__summary strong { color: var(--text-strong); font-size: 24px; line-height: 1.15; } -.downstream-requeue-preview__meta { margin: 0; } -.downstream-requeue-preview__distribution { display: grid; gap: 8px; } -.downstream-requeue-preview__distribution > span { color: var(--text-muted); font-size: 13px; } -.downstream-requeue-preview__distribution > div { display: flex; flex-wrap: wrap; gap: 8px; } -.downstream-requeue-reason { padding: 16px; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--surface-subtle, #f8fafc); } -.downstream-requeue-reason .ui-textarea { min-height: 124px; background: var(--color-surface); line-height: 1.65; } -.downstream-requeue-warning { display: flex; align-items: flex-start; gap: 10px; padding: 14px; border: 1px solid #fed7aa; border-radius: 10px; background: var(--warning-soft, #fff7ed); color: var(--warning-text, #9a3412); } -.downstream-requeue-warning > div { display: grid; gap: 4px; } -.downstream-requeue-warning p { margin: 0; color: inherit; line-height: 1.6; } -.downstream-requeue-task-detail { display: grid; gap: 20px; } -.downstream-requeue-detail-alert { display: flex; gap: 8px; align-items: flex-start; padding: 12px 14px; border-radius: 10px; background: var(--warning-soft, #fff7ed); color: var(--warning-text, #9a3412); } -.downstream-requeue-detail-section { display: grid; gap: 14px; } -.downstream-requeue-detail-filter { display: grid; grid-template-columns: 180px minmax(240px, 1fr) auto; gap: 10px; align-items: end; } -.downstream-requeue-detail-items { display: grid; border: 1px solid var(--border); border-radius: 10px; overflow: hidden; } -.downstream-requeue-detail-items > div { display: grid; grid-template-columns: minmax(160px, 1fr) 125px 130px minmax(220px, 1.5fr) 155px; gap: 12px; align-items: center; padding: 11px 14px; border-top: 1px solid var(--border); } -.downstream-requeue-detail-items > div:first-child { border-top: 0; } -.downstream-requeue-detail-items__head { background: var(--surface-subtle, #f8fafc); color: var(--text-muted); font-size: 12px; font-weight: 600; } -.downstream-requeue-detail-items time { color: var(--text-muted); font-size: 12px; } -@media (max-width: 1100px) { .downstream-requeue-task-list article { grid-template-columns: 1fr 1.4fr; } .downstream-requeue-task-list__actions { justify-content: flex-start; } .downstream-requeue-preview__summary { grid-template-columns: repeat(2, 1fr); } } -@media (max-width: 780px) { .downstream-requeue-task-card > .downstream-requeue-task-heading { padding: var(--space-5) var(--space-4) var(--space-4); } .downstream-requeue-task-heading, .downstream-requeue-task-heading__actions { align-items: stretch; flex-direction: column; } .downstream-requeue-task-list { margin: 0 var(--space-4); } .downstream-requeue-task-list article, .downstream-requeue-preview__summary, .downstream-requeue-detail-filter { grid-template-columns: 1fr; } .downstream-requeue-task-card > .ui-pagination { padding: var(--space-4); } .downstream-requeue-detail-items { border: 0; overflow: visible; gap: 10px; } .downstream-requeue-detail-items__head { display: none !important; } .downstream-requeue-detail-items > div { grid-template-columns: 1fr; gap: 6px; padding: 14px; border: 1px solid var(--border); border-radius: 10px; } } diff --git a/tools/quality/css-governance-baseline.json b/tools/quality/css-governance-baseline.json new file mode 100644 index 0000000..94380df --- /dev/null +++ b/tools/quality/css-governance-baseline.json @@ -0,0 +1,4287 @@ +{ + "schemaVersion": 1, + "generatedAt": "2026-09-05", + "legacySource": { + "file": "src/styles/global.css", + "bytes": 213062, + "sha256": "e145a65e3efc0e25a29307f219b18775b5755dfced73a2a3dab8e9886986e3fc", + "rules": 1749, + "selectors": 2017, + "declarations": 5321, + "important": 30, + "selectorList": [ + ".gateway-exception-time", + ".gateway-exception-command", + ".gateway-exception-command pre", + ".gateway-requeue-confirm .callout", + ".gateway-requeue-confirm .callout p", + ".gateway-requeue-confirm .callout--warning", + ".gateway-requeue-confirm .callout--danger", + ".gateway-requeue-checkbox", + ".gateway-requeue-checkbox input", + ".text-page-title", + ".text-section-title", + ".text-card-title", + ".text-body", + ".text-secondary", + ".text-caption", + ".overview-hero", + ".overview-hero h1", + ".overview-hero .eyebrow", + ".overview-hero .muted", + ".dashboard-grid", + ".dashboard-grid--four", + ".dashboard-grid--four", + ".metric-card", + ".metric-card--featured", + ".metric-card--featured span", + ".metric-card--featured small", + ".metric-card span", + ".metric-card strong", + ".metric-card small", + ".chart-grid", + ".chart-card", + ".chart-card h2", + ".overview-grid", + ".overview-grid--three", + ".quick-grid", + ".quick-action", + ".quick-action:hover", + ".quick-action svg", + ".quick-action span", + ".quick-action small", + ".progress-heading", + ".progress-heading strong", + ".progress-track", + ".progress-track span", + ".mini-status-card", + ".mini-status-card svg", + ".mini-status-card div", + ".mini-status-card span", + ".mini-status-card strong", + ".mini-status-card small", + ".mini-status-card--action", + ".mini-status-card--action:hover", + ".mini-status-card--action:focus-visible", + ".sms-send-page", + ".sms-send-title", + ".sms-send-title h1", + ".sms-send-title__icon", + ".sms-send-layout", + ".sms-send-main", + ".send-card", + ".sms-preview-card", + ".send-card__title", + ".send-card__title span", + ".send-card__title h2", + ".preview-title h2", + ".send-field", + ".send-field span", + ".send-field input", + ".receiver-table input", + ".send-field input::placeholder", + ".receiver-table input::placeholder", + ".send-form-row", + ".template-trigger", + ".template-trigger:hover", + ".template-trigger:focus-visible", + ".template-trigger span", + ".template-trigger svg", + ".template-trigger__placeholder", + ".receiver-tabs", + ".receiver-tabs button", + ".receiver-tabs button.active", + ".receiver-table", + ".receiver-table__head", + ".receiver-table__row", + ".receiver-table__head", + ".receiver-table__head span", + ".receiver-table__row span", + ".receiver-table__row input", + ".receiver-table__row button", + ".receiver-table__row span", + ".receiver-table__row button", + ".receiver-table__row button:disabled", + ".add-recipient", + ".import-panel", + ".import-panel__icon", + ".import-panel__icon svg", + ".import-panel strong", + ".send-tip", + ".send-submit-row", + ".client-billing-page .client-billing-amount", + ".send-submit-hint", + ".mms-send-page .send-card", + ".mms-send-tip", + ".mms-import-mode", + ".mms-import-rules", + ".mms-import-rules strong", + ".mms-import-rules p", + ".mms-import-panel", + ".mms-import-panel .import-panel__icon", + ".sms-preview-card", + ".preview-title", + ".preview-title h2", + ".phone-preview", + ".phone-preview div", + ".preview-stats", + ".preview-stats div", + ".preview-stats span", + ".preview-stats strong", + ".preview-note", + ".mms-preview-card", + ".mms-message-preview", + ".mms-message-preview > div", + ".mms-message-preview strong", + ".mms-message-preview p", + ".template-picker", + ".template-picker__list", + ".template-picker__list button", + ".template-picker__list button:last-child", + ".template-picker__list button:hover", + ".template-picker__list button.active", + ".template-picker__list button.active", + ".template-picker__list span", + ".template-picker__list strong", + ".template-picker__list small", + ".batch-filter-card", + ".batch-filter-card h2", + ".batch-filter-card p strong", + ".batch-filter-grid", + ".batch-table-card", + ".batch-table", + ".batch-table th", + ".batch-table td", + ".batch-table tbody tr:hover", + ".batch-main-row td", + ".batch-main-row td", + ".batch-template-row td", + ".batch-task-id", + ".batch-task-id strong", + ".batch-template-row td", + ".batch-main-row.batch-row--hovered td", + ".batch-template-row.batch-row--hovered td", + ".batch-template-content", + ".batch-template-row.batch-row--hovered .batch-template-content", + ".batch-template-row.batch-row--hovered .ui-inline-text-preview", + ".batch-template-content > span:first-child", + ".batch-template-content p", + ".batch-template-content p strong", + ".batch-send-time", + ".batch-send-time span", + ".batch-send-time small", + ".batch-progress", + ".batch-progress div:first-child", + ".batch-progress span", + ".batch-progress strong", + ".batch-progress__track", + ".batch-progress__bar", + ".batch-progress__bar--completed", + ".batch-progress__bar--sending", + ".batch-progress__bar--terminated", + ".batch-actions", + ".batch-actions .ui-button", + ".batch-actions .ui-button:last-child", + ".mms-task-table td", + ".mms-task-content", + ".mms-task-content img", + ".mms-task-content div", + ".mms-task-content strong", + ".mms-task-content p", + ".mms-detail-row-content", + ".mms-detail-row-content img", + ".mms-detail-row-content div", + ".mms-detail-row-content strong", + ".mms-detail-row-content p", + ".mms-task-actions", + ".mms-task-actions .ui-button:last-child", + ".mms-detail-template", + ".mms-detail-template img", + ".mms-detail-template div", + ".mms-detail-template p", + ".batch-pagination", + ".batch-pagination > span", + ".batch-pagination > div", + ".task-detail-title", + ".task-detail-title .sms-send-title__icon", + ".task-detail-title h2", + ".task-detail-title p", + ".task-detail", + ".task-detail-section", + ".task-detail-section > h3", + ".task-section-title h3", + ".task-section-title", + ".task-info-grid", + ".task-info-grid > div", + ".task-info-grid > div:hover", + ".task-info-grid span", + ".task-stat-card span", + ".task-total-progress span", + ".overall-rate-card span", + ".task-info-grid strong", + ".task-info-full", + ".task-info-full strong", + ".task-send-type", + ".text-blue", + ".text-green", + ".task-stat-grid", + ".task-stat-card", + ".task-stat-card::before", + ".task-stat-card--blue::before", + ".task-stat-card--green", + ".task-stat-card--green::before", + ".task-stat-card strong", + ".task-stat-card--green strong", + ".task-total-progress", + ".task-total-progress > div:first-child", + ".task-total-progress strong", + ".overall-rate-card", + ".overall-rate-card strong", + ".overall-rate-card small", + ".task-detail-section h4", + ".carrier-rate-grid", + ".carrier-rate-card", + ".carrier-rate-card > div:first-child", + ".carrier-rate-card p", + ".carrier-rate-card > div:first-child strong", + ".carrier-rate-card > div:first-child span", + ".carrier-rate-card p", + ".city-rate-table th", + ".city-rate-table td", + ".city-rate-table tbody tr:hover", + ".task-detail-title .sms-send-title__icon", + ".task-detail-title h2", + ".task-detail-title p", + ".task-detail", + ".task-detail-section", + ".task-detail-section > h3", + ".task-section-title h3", + ".task-section-title", + ".task-info-grid", + ".task-info-grid > div", + ".task-info-grid > div:nth-child(4n)", + ".task-info-grid > div:hover", + ".task-info-grid span", + ".task-stat-card span", + ".task-total-progress span", + ".overall-rate-card span", + ".task-info-grid strong", + ".task-info-full", + ".task-info-full strong", + ".task-stat-grid", + ".task-stat-card", + ".task-stat-card::before", + ".task-stat-card strong", + ".task-total-progress", + ".task-total-progress .batch-progress__track", + ".overall-rate-card", + ".overall-rate-card strong", + ".carrier-rate-grid", + ".carrier-rate-card", + ".city-rate-table", + ".city-rate-table th", + ".city-rate-table td", + ".send-detail-table-card", + ".send-detail-table", + ".mms-send-detail-table", + ".send-detail-table th", + ".send-detail-main-row td", + ".send-detail-content-row td", + ".send-detail-message", + ".send-detail-content-block", + ".send-detail-content-block span", + ".send-detail-content-block p", + ".send-detail-app-name", + ".send-detail-count", + ".send-detail-time", + ".send-detail-region", + ".send-detail-time", + ".send-detail-region", + ".send-detail-time small", + ".send-detail-region small", + ".send-detail-count small", + ".send-detail-count strong", + ".send-detail-receipt-code", + ".send-detail-carrier", + ".uplink-table-card", + ".uplink-table-card .ui-table th", + ".uplink-table-card .ui-table td", + ".uplink-content", + ".uplink-detail", + ".uplink-detail-hint", + ".uplink-match-list", + ".uplink-match-card", + ".uplink-match-grid", + ".uplink-match-grid div", + ".uplink-match-content", + ".uplink-match-grid span", + ".uplink-match-content span", + ".uplink-match-grid strong", + ".uplink-match-content p", + ".uplink-match-content p", + ".uplink-match-actions", + ".mms-uplink-pagination", + ".mms-uplink-pagination > div", + ".mms-uplink-detail .task-detail-section:first-child", + ".mms-uplink-match-card", + ".mms-uplink-image", + ".mms-uplink-image span", + ".mms-uplink-image img", + ".sms-app-grid", + ".sms-app-card", + ".sms-app-card h2", + ".sms-app-card dl", + ".sms-app-card dl div", + ".sms-app-card dt", + ".sms-app-card dd", + ".sms-app-card dd span", + ".sms-app-param-table", + ".sms-app-param-table div", + ".sms-app-param-table div + div", + ".sms-app-param-table span", + ".sms-app-param-table strong", + ".sms-app-param-table span", + ".sms-app-param-table strong", + ".signature-page-header", + ".signature-search-row", + ".signature-list", + ".signature-card", + ".signature-card::before", + ".signature-card--green::before", + ".signature-card--blue::before", + ".signature-card--amber::before", + ".signature-card--red::before", + ".signature-card--gray::before", + ".signature-summary", + ".signature-summary > button", + ".signature-summary div:not(.signature-actions)", + ".signature-summary span", + ".signature-summary strong", + ".signature-actions", + ".drainage-panel", + ".drainage-panel h2", + ".drainage-table", + ".drainage-table__head", + ".drainage-table__row", + ".drainage-table__head", + ".drainage-table__row", + ".drainage-table__url", + ".drainage-row-actions", + ".drainage-panel__footer", + ".admin-enterprise-signature-list .signature-summary", + ".admin-enterprise-signature-list .signature-actions", + ".admin-enterprise-signature-list .signature-actions .ui-button", + ".admin-enterprise-signature-list .drainage-row-actions .ui-button", + ".signature-summary .signature-summary__regular-value", + ".admin-enterprise-signature-list", + ".admin-enterprise-signature-list .signature-card", + ".admin-enterprise-signature-list .signature-card:last-of-type", + ".enterprise-signature-table__head", + ".enterprise-signature-table__signature", + ".enterprise-signature-table__signature strong", + ".enterprise-signature-pending-summary", + ".enterprise-signature-pending-summary strong", + ".enterprise-signature-pending-summary .ui-button", + ".carrier-report-count", + ".carrier-report-count small", + ".carrier-report-count--success", + ".carrier-report-count--warning", + ".carrier-report-count--danger", + ".carrier-report-count--info", + ".carrier-report-count--neutral", + ".signature-report-status", + ".signature-report-status__context", + ".signature-report-status__context span", + ".signature-report-status__carriers", + ".signature-report-status__carrier", + ".signature-report-status__carrier > header", + ".signature-report-status__carrier > header > span:last-child", + ".signature-report-status__list", + ".signature-report-status__row", + ".signature-report-status__row:last-child", + ".signature-report-status__row strong", + ".signature-report-status__empty", + ".signature-report-status__carriers", + ".signature-report-status__list", + ".signature-retirement-heatmap__total", + ".carrier-report-summary", + ".carrier-report-summary small", + ".admin-enterprise-template-list", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row:hover", + ".admin-enterprise-template-row__identity", + ".admin-enterprise-template-row__content", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__title", + ".admin-enterprise-template-row__title > strong", + ".admin-enterprise-template-row dl", + ".admin-enterprise-template-row dl div", + ".admin-enterprise-template-row dt", + ".admin-enterprise-template-row__content > span", + ".admin-enterprise-template-row__meta > span", + ".admin-enterprise-template-row dd", + ".admin-enterprise-template-row__content p", + ".admin-enterprise-template-row__content small", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__meta strong", + ".admin-enterprise-template-row__actions", + ".admin-enterprise-template-row__actions .ui-button", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__actions", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__actions", + ".system-log-filters__actions", + ".detail-grid", + ".detail-grid div", + ".detail-grid span", + ".detail-grid strong", + ".detail-grid__wide", + ".signature-modal-title h2", + ".signature-modal-title p", + ".signature-form", + ".signature-form section", + ".signature-form h3", + ".signature-form-grid", + ".signature-form-grid__wide", + ".report-requirement-heading", + ".report-requirement-heading h3", + ".report-field-source", + ".report-requirement-explanation > p", + ".report-source-group", + ".report-source-channel", + ".report-source-channel ul", + ".signature-upload", + ".signature-upload > span:first-child", + ".signature-upload svg", + ".signature-upload strong", + ".signature-upload small", + ".signature-upload--compact", + ".signature-file-line", + ".signature-file-line > span", + ".signature-file-line small", + ".drainage-edit-form .signature-upload", + ".drainage-form-note", + ".drainage-form-note ol", + ".drainage-file-picker", + ".drainage-file-picker > span", + ".drainage-file-picker > div", + ".drainage-file-picker em", + ".mms-signature-table-card", + ".mms-signature-table-card .ui-table th", + ".mms-signature-table-card .ui-table td", + ".mms-signature-table-card .ui-table th:first-child", + ".mms-signature-table-card .ui-table td:first-child", + ".mms-signature-name", + ".mms-signature-actions", + ".mms-signature-actions .ui-button:disabled", + ".mms-signature-delete", + ".mms-signature-delete:hover", + ".mms-pagination", + ".mms-pagination button", + ".mms-pagination button:hover:not(:disabled)", + ".mms-pagination button.active", + ".mms-pagination button:disabled", + ".mms-template-header", + ".mms-template-header .sms-send-title", + ".mms-template-header p", + ".mms-template-toolbar", + ".mms-template-grid", + ".mms-template-card", + ".mms-template-card:hover", + ".mms-template-card::before", + ".mms-template-card--green::before", + ".mms-template-card--blue::before", + ".mms-template-card--gray::before", + ".mms-template-card__body", + ".mms-template-meta", + ".mms-template-card h2", + ".mms-template-card h3", + ".mms-template-code", + ".mms-template-card img", + ".mms-template-content", + ".mms-template-app-tag", + ".mms-template-status", + ".mms-template-status > span", + ".mms-template-status > div", + ".mms-template-status section", + ".mms-template-status small", + ".mms-template-card__footer", + ".mms-template-card__footer > span", + ".mms-template-card__footer div", + ".mms-template-card__footer button", + ".mms-template-card__footer button:nth-child(2)", + ".mms-template-card__footer button:last-child", + ".mms-template-modal-title h2", + ".mms-template-modal-title p", + ".mms-template-form", + ".mms-template-form-grid", + ".mms-frame-header", + ".mms-frame-header div", + ".mms-frame-header strong", + ".mms-frame-header span", + ".mms-frame-list", + ".mms-frame", + ".mms-frame__top", + ".mms-frame__top > strong", + ".mms-frame__top > button", + ".mms-frame-type .ui-field__label", + ".mms-frame-type .ui-select button", + ".mms-frame .ui-textarea", + ".mms-file-drop", + ".mms-file-drop div", + ".mms-file-drop strong", + ".mms-file-drop small", + ".mms-save-button", + ".mms-save-button:hover", + ".mms-preview", + ".mms-preview img", + ".mms-preview p", + ".mms-preview-frames", + ".mms-preview-frames span", + ".template-toolbar", + ".template-card-grid", + ".template-card", + ".template-card::before", + ".template-card--green::before", + ".template-card--blue::before", + ".template-card--red::before", + ".template-card h2", + ".template-hash", + ".template-content", + ".template-vars", + ".template-vars span", + ".template-vars strong", + ".template-current-vars strong", + ".template-card-footer", + ".template-card-footer span", + ".template-card-footer div", + ".template-card-footer button", + ".template-card-footer button:last-child", + ".template-form", + ".template-form .ui-textarea", + ".template-form-meta", + ".template-form-meta button", + ".template-form-meta span", + ".template-variable-panel", + ".template-variable-panel h3", + ".template-variable-buttons", + ".template-variable-buttons button", + ".template-variable-buttons button:hover", + ".template-custom-variable", + ".template-info-tip", + ".template-info-tip svg", + ".template-current-vars", + ".task-detail-title h2", + ".task-stat-layout", + ".task-progress-card", + ".task-progress-card span", + ".task-stat-list span", + ".task-progress-card strong", + ".task-progress-card small", + ".task-stat-list", + ".task-stat-list > div", + ".task-stat-list > div:last-child", + ".task-stat-list strong", + ".overall-rate-card", + ".overall-rate-split", + ".overall-rate-split div", + ".overall-rate-split b", + ".rate-tone-low", + ".rate-tone-low .batch-progress__bar", + ".rate-tone-medium", + ".rate-tone-medium .batch-progress__bar", + ".rate-tone-high", + ".rate-tone-high .batch-progress__bar", + ".overall-rate-card.rate-tone-low", + ".overall-rate-card.rate-tone-medium", + ".overall-rate-card.rate-tone-high", + ".overall-rate-card.rate-tone-low strong", + ".carrier-rate-card.rate-tone-low > div:first-child span", + ".rate-text.rate-tone-low", + ".overall-rate-card.rate-tone-medium strong", + ".carrier-rate-card.rate-tone-medium > div:first-child span", + ".rate-text.rate-tone-medium", + ".overall-rate-card.rate-tone-high strong", + ".carrier-rate-card.rate-tone-high > div:first-child span", + ".rate-text.rate-tone-high", + ".rate-text", + ".carrier-rate-card .batch-progress__bar", + ".city-rate-table .batch-progress__bar", + ".detail-message", + ".receipt", + ".receipt--failed", + ".content-grid", + ".soft-panel", + ".soft-panel h3", + ".summary-list", + ".summary-list div", + ".summary-list span", + ".summary-list strong", + ".plan-grid", + ".plan-card", + ".plan-card--highlight", + ".plan-card strong", + ".muted", + ".text-strong", + ".status-success", + ".status-warning", + ".status-danger", + ".status-info", + ".empty-state", + ".empty-state strong", + ".empty-state span", + ".login-page", + ".client-login-canvas", + ".login-panel", + ".login-brand", + ".login-brand img", + ".login-brand h1", + ".login-brand p", + ".login-form", + ".login-captcha-row", + ".login-captcha", + ".login-error", + ".login-session-notice", + ".page-loading-state", + ".login-alert-message", + ".system-page", + ".system-page-toolbar", + ".system-log-export", + ".system-log-export__result", + ".system-log-export__error", + ".system-log-export__result", + ".system-log-export__error", + ".risk-action-content", + ".risk-action-content section", + ".risk-action-content h3", + ".risk-action-content ul", + ".risk-action-identity", + ".risk-action-identity div", + ".risk-action-identity span", + ".risk-action-identity strong", + ".risk-action-blockers", + ".risk-action-blockers li", + ".risk-action-passed", + ".risk-action-passed", + ".risk-action-result", + ".risk-action-result div", + ".risk-action-result span", + ".risk-action-identity", + ".delete-risk-dependencies", + ".delete-risk-dependencies li", + ".delete-risk-dependencies small", + ".delete-risk-selections", + ".delete-risk-selections > h3", + ".delete-risk-selections > p", + ".delete-risk-selections label", + ".delete-risk-selections input", + ".delete-risk-selections label > span", + ".delete-risk-selections small", + ".delete-risk-action .ui-textarea", + ".system-page-toolbar", + ".system-log-export", + ".system-log-export > .ui-button", + ".system-log-export__result", + ".system-log-export__error", + ".system-filter-row", + ".system-log-filters", + ".system-log-range", + ".system-log-range > span", + ".system-table-card", + ".system-table-card .ui-table-wrap", + ".system-table-card .ui-table", + ".system-table-card .ui-table th", + ".system-table-card .ui-table td", + ".system-table-card .ui-table tbody tr:nth-child(odd) td", + ".system-table-card .ui-table tbody tr:nth-child(even) td", + ".system-table-card .ui-table tbody tr:hover td", + ".inline-actions", + ".system-user-form", + ".system-user-form .ui-field__label", + ".system-log-detail", + ".system-log-detail-card", + ".system-log-detail-card strong", + ".system-log-detail-card span", + ".system-log-detail-card small", + ".protocol-log-hint", + ".protocol-log-filters", + ".protocol-log-table .ui-table", + ".protocol-log-table .ui-table th:last-child", + ".protocol-log-table .ui-table td:last-child", + ".protocol-log-identifiers", + ".protocol-log-result", + ".protocol-log-identifiers small", + ".protocol-log-result small", + ".protocol-log-detail", + ".protocol-log-detail > div", + ".protocol-log-detail dt", + ".protocol-log-detail dd", + ".protocol-log-filters", + ".protocol-log-filters", + ".protocol-log-detail > div", + ".enterprise-page", + ".enterprise-page-title", + ".enterprise-status-card", + ".enterprise-status-card strong", + ".enterprise-status-card--pending", + ".enterprise-status-card--approved", + ".enterprise-status-card--rejected", + ".enterprise-review-status", + ".enterprise-review-status--uncertified", + ".enterprise-review-status--pending", + ".enterprise-review-status--approved", + ".enterprise-review-status--rejected", + ".enterprise-status-card button", + ".enterprise-result button", + ".enterprise-info-card", + ".enterprise-info-card dl", + ".enterprise-info-card div", + ".enterprise-result dl div", + ".enterprise-info-card dt", + ".enterprise-result dt", + ".enterprise-info-card dd", + ".enterprise-result dd", + ".enterprise-flow-card", + ".enterprise-stepper", + ".enterprise-stepper__item", + ".enterprise-stepper__dot", + ".enterprise-stepper__dot.is-active", + ".enterprise-stepper__dot.is-complete", + ".enterprise-stepper__item strong", + ".enterprise-stepper__item strong.is-active", + ".enterprise-stepper__arrow", + ".enterprise-form-panel", + ".enterprise-verify-panel", + ".enterprise-face-panel", + ".enterprise-form-panel", + ".enterprise-required", + ".enterprise-address-selects > span", + ".enterprise-required::first-letter", + ".enterprise-address-selects > span::first-letter", + ".enterprise-upload", + ".enterprise-upload strong", + ".enterprise-help", + ".enterprise-form-note", + ".enterprise-verify-panel small", + ".enterprise-address-selects", + ".enterprise-address-selects > div", + ".enterprise-address-selects .ui-field", + ".enterprise-actions", + ".enterprise-actions--center", + ".enterprise-method-panel", + ".enterprise-method-card", + ".enterprise-method-card.is-selected", + ".enterprise-method-card svg", + ".enterprise-method-card strong", + ".enterprise-method-card strong span", + ".enterprise-verify-copy em", + ".enterprise-info-alert em", + ".enterprise-qr-section em", + ".enterprise-method-card p", + ".enterprise-verify-panel", + ".enterprise-face-panel", + ".enterprise-verify-panel > p", + ".enterprise-face-panel > p", + ".enterprise-verify-panel > p span", + ".enterprise-face-panel > p span", + ".enterprise-verify-copy", + ".enterprise-verify-copy em:first-of-type", + ".enterprise-verify-panel h2", + ".enterprise-face-panel h2", + ".enterprise-info-alert", + ".enterprise-info-alert svg", + ".enterprise-face-panel", + ".enterprise-qr-section", + ".enterprise-legal-summary", + ".enterprise-legal-summary div", + ".enterprise-legal-summary dt", + ".enterprise-legal-summary dd", + ".enterprise-qr-section h2", + ".enterprise-qr-section p", + ".enterprise-qr-section p", + ".enterprise-qr", + ".enterprise-qr-section > span", + ".enterprise-success-test", + ".enterprise-result", + ".enterprise-result > span", + ".enterprise-result--success > span", + ".enterprise-result--pending > span", + ".enterprise-result--pending > span", + ".enterprise-result--failed > span", + ".enterprise-result h2", + ".enterprise-result dl", + ".enterprise-result--failed p", + ".enterprise-result--failed > strong", + ".admin-dashboard-hero", + ".admin-dashboard-hero h1", + ".admin-dashboard-main-grid", + ".admin-metric-grid", + ".metric-card__value--danger", + ".admin-metric-grid", + ".admin-workload-grid", + ".admin-workload-card", + ".admin-workload-card:hover", + ".admin-workload-card strong", + ".admin-workload-card span:not(.ui-tag)", + ".admin-alert-list", + ".admin-alert", + ".admin-alert--danger", + ".admin-alert--warning", + ".admin-alert--info", + ".admin-alert > div", + ".admin-alert strong", + ".admin-alert span", + ".admin-alert p", + ".admin-alert p", + ".enterprise-summary-grid", + ".enterprise-query-grid", + ".enterprise-query-actions", + ".enterprise-inline-tag", + ".enterprise-form", + ".enterprise-form-page", + ".enterprise-form-card", + ".enterprise-upload-panel", + ".enterprise-upload-panel > span", + ".enterprise-upload-panel button", + ".enterprise-upload-button", + ".enterprise-upload-button", + ".enterprise-upload-panel p", + ".enterprise-info-tip", + ".admin-enterprise-detail", + ".admin-detail-backbar", + ".admin-detail-backbar > span", + ".admin-enterprise-profile", + ".admin-enterprise-profile__main", + ".admin-enterprise-profile__icon", + ".admin-enterprise-profile h1", + ".admin-enterprise-profile p", + ".admin-enterprise-profile > .ui-button", + ".admin-enterprise-profile dl", + ".admin-enterprise-profile dt", + ".admin-enterprise-profile dd", + ".admin-business-tabs", + ".admin-business-tabs button", + ".admin-business-tabs button.active", + ".admin-app-grid", + ".admin-app-card", + ".admin-app-card header", + ".admin-app-card h3", + ".admin-app-card header button", + ".admin-app-card header button.is-on", + ".admin-app-card dl", + ".admin-app-card dl div", + ".admin-app-card dt", + ".admin-app-card dd", + ".admin-app-card footer", + ".admin-section-footer", + ".admin-mms-signature-summary", + ".admin-signature-spacer", + ".admin-report-detail", + ".admin-report-tabs", + ".admin-report-tabs button", + ".admin-report-tabs button.active", + ".admin-report-tabs strong", + ".admin-report-carrier--mobile strong", + ".admin-report-carrier--unicom strong", + ".admin-report-carrier--telecom strong", + ".admin-report-tabs span", + ".admin-report-tabs i", + ".admin-report-tabs i.is-success", + ".admin-report-tabs i.is-info", + ".admin-report-tabs i.is-danger", + ".admin-report-carrier-detail", + ".admin-report-carrier-title", + ".admin-report-carrier-title div", + ".admin-report-carrier-title strong", + ".admin-report-carrier-title span", + ".admin-report-carrier-title p", + ".admin-report-carrier-title p", + ".admin-report-carrier-title p span", + ".admin-report-carrier-title p em", + ".admin-report-record-list", + ".admin-report-record-list article", + ".admin-report-record-list h4", + ".admin-report-record-list p", + ".admin-report-record-list p span", + ".admin-drainage-report-meta", + ".admin-drainage-report-meta p", + ".admin-drainage-report-meta a", + ".admin-app-form-page", + ".admin-app-form-card", + ".admin-app-form-grid", + ".admin-app-form-tip", + ".admin-app-form-tip svg", + ".admin-app-protocol-section", + ".admin-app-protocol-section--http", + ".admin-app-protocol-header", + ".admin-app-protocol-heading", + ".admin-app-protocol-heading > div", + ".admin-app-protocol-heading p", + ".admin-app-protocol-icon", + ".admin-app-protocol-section--http .admin-app-protocol-icon", + ".admin-app-protocol-section--http .admin-switch.is-on", + ".admin-app-protocol-section--http .admin-switch.is-on span", + ".admin-app-protocol-body", + ".admin-app-protocol-empty", + ".admin-app-form-price-note", + ".admin-app-route-grid", + ".admin-app-route-card", + ".admin-app-route-card.is-selected", + ".admin-app-route-card header", + ".admin-app-route-card header > span:first-child", + ".admin-app-route-card header strong", + ".admin-app-route-card header small", + ".admin-app-route-card header small", + ".admin-app-route-card p", + ".admin-switch", + ".admin-switch span", + ".admin-switch span::after", + ".admin-switch.is-on", + ".admin-switch.is-on span", + ".admin-switch.is-on span::after", + ".breadcrumb-line", + ".breadcrumb-line__icon", + ".breadcrumb-line h1", + ".page-heading > div:has(.breadcrumb-line) > h1", + ".channel-report-heading h1", + ".channel-route-modal__title", + ".channel-route-modal__title > span", + ".channel-route-modal__title h2", + ".channel-route-modal__title p", + ".channel-route-modal__title p", + ".channel-route-modal__empty", + ".channel-route-modal__selected", + ".channel-route-modal__selected strong", + ".channel-route-modal__selected span", + ".channel-route-modal__selected span", + ".admin-enterprise-profile__main", + ".admin-enterprise-profile__icon", + ".admin-enterprise-profile__main h1", + ".audit-table-card", + ".enterprise-audit-detail", + ".enterprise-audit-detail section", + ".enterprise-audit-detail h3", + ".enterprise-audit-detail div", + ".enterprise-audit-detail span", + ".enterprise-audit-detail strong", + ".enterprise-audit-detail__remark", + ".audit-link", + ".audit-link--success", + ".audit-link--danger", + ".audit-pagination", + ".sms-bulk-actions", + ".sms-bulk-actions .ui-button--secondary", + ".sms-audit-toolbar", + ".sms-audit-toolbar > div", + ".sms-audit-list", + ".sms-audit-cell-stack", + ".sms-audit-cell-stack small", + ".sms-audit-cell-stack .table-link", + ".sms-audit-head", + ".sms-audit-row", + ".sms-audit-head", + ".sms-audit-row", + ".sms-audit-row:last-child", + ".sms-audit-customer", + ".sms-audit-count", + ".sms-audit-result", + ".sms-audit-actions", + ".sms-audit-customer span", + ".sms-audit-customer small", + ".sms-audit-count", + ".sms-audit-content", + ".sms-audit-count a", + ".sms-audit-count button", + ".sms-audit-count button", + ".sms-audit-reasons", + ".audit-dot", + ".audit-dot::before", + ".audit-dot--warning", + ".audit-dot--warning::before", + ".audit-dot--success", + ".audit-dot--success::before", + ".audit-dot--danger", + ".audit-dot--danger::before", + ".sms-audit-result small", + ".sms-audit-actions .ui-button", + ".sms-audit-actions .ui-button--secondary", + ".sms-audit-actions .ui-button--danger", + ".sms-audit-edit", + ".sms-audit-edit__meta", + ".sms-audit-edit__meta span", + ".sms-audit-edit__meta strong", + ".sms-audit-edit__count", + ".sms-audit-edit__count strong", + ".sms-reject-modal", + ".reject-reason-tags", + ".reject-reason-tags button", + ".reject-reason-tags button:hover", + ".audit-collapse-link", + ".phone-list-modal", + ".phone-list-toolbar", + ".phone-list-toolbar > label", + ".phone-list-toolbar > div", + ".phone-list-table", + ".phone-list-table .ui-table-wrap", + ".phone-list-table .ui-table tbody tr:nth-child(even)", + ".channel-report-page", + ".channel-report-hero", + ".channel-report-heading", + ".channel-report-heading h1", + ".channel-report-config-actions", + ".channel-report-filter", + ".channel-report-filter-grid", + ".channel-report-filter-footer", + ".channel-report-filter-footer > div", + ".channel-report-table", + ".channel-report-table__head", + ".channel-report-row", + ".report-material-detail-list", + ".report-material-detail-list > div", + ".report-material-detail-list > div:last-child", + ".report-material-detail-list > div > span", + ".report-material-detail-list > div > strong", + ".report-material-detail-list > div.is-missing", + ".report-batch-toolbar", + ".report-batch-progress", + ".report-batch-progress span", + ".report-batch-progress strong", + ".ui-modal__panel.report-batch-drawer", + ".ui-modal__panel.report-batch-drawer .ui-modal__body", + "from", + "to", + ".report-batch-detail-summary", + ".report-batch-detail-summary span", + ".report-batch-detail-summary strong", + ".report-batch-briefs", + ".report-batch-briefs__title", + ".report-batch-briefs__title h3", + ".report-batch-brief", + ".report-batch-brief header", + ".report-batch-brief header > div", + ".report-batch-brief header span", + ".report-batch-brief pre", + ".report-material-summary", + ".report-material-summary span", + ".report-batch-toolbar", + ".report-material-detail-list > div", + ".enterprise-signature-pending-summary", + ".enterprise-signature-pending-summary .ui-button", + ".report-batch-brief header", + ".report-batch-brief header .ui-button", + ".ui-modal__panel.report-batch-drawer", + ".report-batch-detail-summary", + ".channel-report-table__head", + ".channel-report-row", + ".channel-report-row--signature", + ".channel-report-row--drainage", + ".channel-report-name", + ".channel-report-name > button", + ".channel-report-name > button:disabled", + ".channel-report-name > span", + ".channel-report-name strong", + ".channel-report-name small", + ".channel-report-name small b", + ".channel-report-name--flow", + ".channel-report-name--flow i", + ".channel-report-date", + ".channel-report-stats", + ".channel-report-stats span", + ".channel-report-stats strong", + ".channel-report-stats b", + ".success-rate-text--red", + ".success-rate-text--orange", + ".success-rate-text--yellow", + ".success-rate-text--blue", + ".success-rate-text--green", + ".success-rate-text--deep-green", + ".channel-report-stats .is-success", + ".channel-report-stats .is-warning", + ".channel-report-stats .is-danger", + ".channel-report-actions", + ".channel-report-actions button", + ".channel-report-actions button.is-warning", + ".channel-report-actions button.is-danger", + ".channel-report-detail", + ".channel-report-detail > strong", + ".channel-report-detail p", + ".channel-report-detail p > span:first-child", + ".channel-signature-title h2", + ".channel-signature-title p", + ".channel-signature-title p", + ".channel-signature-detail", + ".channel-signature-detail section", + ".channel-signature-detail h3", + ".channel-signature-grid", + ".channel-signature-grid__wide", + ".channel-signature-grid > .channel-signature-upload:first-of-type:last-child", + ".channel-signature-detail input[readonly]", + ".channel-signature-upload", + ".channel-signature-upload > span", + ".channel-signature-upload > div", + ".channel-status-title h2", + ".channel-status-title p", + ".channel-status-title p", + ".channel-status-form", + ".channel-status-options", + ".channel-status-options button", + ".channel-status-options button.is-info", + ".channel-status-options button.is-success", + ".channel-status-options button.is-danger", + ".channel-status-options button.is-warning", + ".channel-status-options button.is-selected", + ".channel-status-options button > span", + ".channel-export-preview", + ".channel-export-preview span", + ".channel-field-mapping-grid", + ".report-import-basic-grid", + ".report-import-basic-grid", + ".report-import-file", + ".report-import-file span", + ".report-import-file input", + ".report-import-analysis-progress", + ".report-import-analysis-progress > div:first-child", + ".report-import-analysis-progress small", + ".report-import-mapping", + ".report-import-mapping-table", + ".report-import-mapping-head", + ".report-import-mapping-row", + ".report-import-mapping-head", + ".report-import-mapping-row", + ".report-import-mapping-row > span", + ".report-import-mapping-row small", + ".report-import-profile", + ".report-import-profile__toggle", + ".report-import-profile__toggle[aria-pressed='true']", + ".report-import-profile .field", + ".report-import-preview pre", + ".report-material-filter", + ".report-material-filter--pending", + ".report-material-filter--batches", + ".report-material-pool", + ".report-material-table-head", + ".report-material-row", + ".report-material-table-head", + ".report-material-row", + ".report-material-row:hover", + ".report-material-row.is-disabled", + ".report-material-row.is-disabled:hover", + ".report-material-row > span", + ".report-material-row small", + ".report-material-row em", + ".report-material-batches", + ".report-material-batches article", + ".report-material-batches article > div", + ".report-material-batches article small", + ".report-material-batches article a", + ".report-batch-preflight", + ".report-batch-summary", + ".report-batch-summary span", + ".report-batch-preflight article", + ".report-batch-preflight article > div", + ".report-batch-preflight article small", + ".report-batch-preflight ul", + ".report-batch-preflight li", + ".report-batch-preflight li.is-eligible", + ".report-batch-preflight li.is-blocked", + ".channel-field-mapping-grid", + ".report-import-basic-grid", + ".report-material-filter--pending", + ".report-material-filter--batches", + ".report-material-filter .ui-query-actions", + ".report-material-table-head", + ".report-material-row", + ".report-material-table-head > :nth-child(n + 4)", + ".report-material-row > :nth-child(n + 4)", + ".channel-field-pool", + ".channel-field-pool-list", + ".channel-selected-field-list", + ".channel-field-pool-list", + ".channel-field-pool-list > button", + ".channel-remove-field-button", + ".report-material-image-value", + ".report-material-image-value img", + ".report-export-format-options", + ".report-export-format-options button", + ".report-export-format-options button[aria-checked='true']", + ".report-export-format-options span", + ".channel-field-pool-list > button:hover", + ".channel-field-pool-list > button > span", + ".channel-field-pool-list > button > span:last-child", + ".channel-selected-fields", + ".channel-selected-field-list article", + ".channel-selected-field-head", + ".channel-selected-field-index", + ".channel-selected-field-order", + ".channel-selected-field-order button", + ".channel-selected-field-controls > button", + ".channel-selected-field-order button:disabled", + ".channel-selected-field-controls", + ".channel-selected-field-controls label", + ".channel-selected-field-controls > button", + ".mms-channel-page .page-heading", + ".mms-channel-filter", + ".mms-channel-list", + ".mms-channel-list .ui-table-wrap", + ".mms-channel-list .ui-table", + ".mms-channel-list .ui-table th", + ".mms-channel-list .ui-table td", + ".mms-channel-list .ui-table tbody tr:nth-child(even)", + ".mms-channel-identity", + ".mms-channel-identity span", + ".mms-channel-identity small", + ".mms-channel-identity small", + ".mms-channel-carrier", + ".mms-channel-quality", + ".mms-channel-metric", + ".mms-channel-metric small", + ".mms-channel-metric strong", + ".mms-channel-metric--success strong", + ".mms-channel-metric--warning strong", + ".mms-channel-metric--danger strong", + ".mms-channel-actions", + ".mms-channel-modal-title h2", + ".mms-channel-modal-title p", + ".mms-channel-modal-title p", + ".mms-channel-form", + ".mms-channel-form__wide", + ".sms-channel-group-page .page-heading", + ".channel-group-filter", + ".channel-group-filter__actions", + ".channel-group-list", + ".channel-group-config-list", + ".channel-group-config-item", + ".channel-group-config-item__identity", + ".channel-group-config-item__icon", + ".channel-group-config-item__identity div", + ".channel-group-config-item__identity strong", + ".channel-group-config-item__identity span:last-child", + ".channel-group-config-item__metrics span", + ".channel-group-config-item__policy span", + ".channel-group-config-item__channels span", + ".channel-group-config-item__metrics", + ".channel-group-config-item__metrics div", + ".channel-group-config-item__metrics strong", + ".channel-group-config-item__policy", + ".channel-group-config-item__policy span", + ".channel-group-config-item__channels", + ".channel-group-config-item__channels span", + ".channel-group-config-item__actions", + ".channel-group-config-item__actions button", + ".channel-group-config-item__actions button.is-danger", + ".channel-group-form-page", + ".channel-group-form-section", + ".channel-group-form-section h2", + ".channel-group-base-form", + ".channel-group-base-form > .ui-field", + ".channel-group-retry-limit", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row > span", + ".channel-group-switch-row > span", + ".channel-group-radio-row label", + ".channel-group-switch-row button", + ".channel-group-switch-row button i", + ".channel-group-switch-row button.is-on", + ".channel-group-switch-row button.is-on i", + ".channel-group-row-actions", + ".channel-group-row-actions button", + ".channel-group-row-actions button.is-danger", + ".channel-group-retry-limit", + ".channel-group-retry-limit > span", + ".channel-group-retry-limit small", + ".channel-route-card-grid", + ".channel-route-card", + ".channel-route-card > div", + ".channel-route-card strong", + ".channel-route-card span", + ".channel-route-card small", + ".channel-route-card p", + ".channel-route-card footer", + ".channel-route-card footer button", + ".channel-route-card footer button.is-danger", + ".channel-route-empty", + ".channel-route-modal", + ".channel-route-modal__channel-select", + ".channel-route-modal .ui-select__dropdown", + ".channel-route-modal .ui-select__dropdown button", + ".channel-route-modal__note", + ".channel-route-modal__note svg", + ".channel-group-form-footer", + ".channel-group-form-footer .ui-button", + ".recovery-status-explainer", + ".recovery-status-explainer > svg", + ".recovery-status-explainer strong", + ".recovery-status-explainer p", + ".signature-quality-card", + ".login-return-link", + ".login-return-link:hover", + ".signature-retirement-heatmap", + ".signature-retirement-heatmap__heading", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions .ui-field", + ".signature-retirement-heatmap__scroll", + ".signature-retirement-heatmap table", + ".signature-retirement-heatmap th", + ".signature-retirement-heatmap td", + ".signature-retirement-heatmap th:first-child", + ".signature-retirement-heatmap tbody th", + ".signature-retirement-heatmap__identity", + ".signature-retirement-heatmap__identity strong", + ".signature-retirement-heatmap__identity small", + ".signature-retirement-heatmap td.is-zero", + ".signature-retirement-heatmap td.is-inapplicable", + ".signature-retirement-heatmap td.is-rate-red", + ".signature-retirement-heatmap td.is-rate-orange", + ".signature-retirement-heatmap td.is-rate-yellow", + ".signature-retirement-heatmap td.is-rate-blue", + ".signature-retirement-heatmap td.is-rate-green", + ".signature-retirement-heatmap td.is-rate-deep-green", + ".ui-table__long-text", + ".signature-retirement-message-card", + ".signature-retirement-message-filter", + ".signature-retirement-message-filter__actions", + ".signature-retirement-suppression-modes", + ".signature-retirement-suppression-modes label", + ".signature-retirement-suppression-modes label.is-selected", + ".signature-retirement-suppression-modes input", + ".signature-retirement-suppression-modes span", + ".signature-retirement-suppression-modes small", + ".signature-quality-card__heading", + ".signature-quality-card__heading h2", + ".signature-quality-section h3", + ".signature-quality-card__heading p", + ".signature-quality-section__heading p", + ".section-heading__title", + ".signature-quality-card__query", + ".signature-quality-card__query .ui-field", + ".signature-quality-card__note", + ".signature-quality-card .ui-table-wrap", + ".signature-quality-card > .ui-pagination", + ".signature-quality-name", + ".signature-quality-name strong", + ".signature-quality-name span", + ".signature-quality-name small", + ".quality-number--success", + ".quality-number--warning", + ".quality-number--danger", + ".signature-quality-rate", + ".signature-quality-rate > div", + ".signature-quality-rate > div span", + ".signature-quality-rate strong", + ".signature-quality-drawer__backdrop", + ".signature-quality-drawer", + "from", + "to", + ".signature-quality-drawer__header", + ".signature-quality-drawer__header p", + ".signature-quality-drawer__header h2", + ".signature-quality-drawer__header span", + ".signature-quality-drawer__header > button", + ".signature-quality-drawer__header > button:hover", + ".signature-quality-drawer__body", + ".signature-quality-overview", + ".signature-quality-metric", + ".signature-quality-metric span", + ".signature-quality-metric strong", + ".signature-quality-metric--success strong", + ".signature-quality-metric--warning strong", + ".signature-quality-metric--danger strong", + ".signature-quality-section", + ".signature-quality-section__heading", + ".signature-quality-section__heading p", + ".signature-carrier-grid", + ".signature-carrier-card", + ".signature-carrier-card > div", + ".signature-carrier-card > div strong", + ".signature-carrier-card dl", + ".signature-carrier-card dl div", + ".signature-carrier-card dt", + ".signature-carrier-card dd", + ".signature-quality-matrix", + ".signature-quality-matrix table", + ".signature-quality-matrix th", + ".signature-quality-matrix td", + ".signature-quality-matrix th:last-child", + ".signature-quality-matrix td:last-child", + ".signature-quality-matrix tr:last-child th", + ".signature-quality-matrix tr:last-child td", + ".signature-quality-matrix thead th", + ".signature-quality-matrix tbody th", + ".signature-quality-matrix__metric", + ".signature-quality-matrix__metric--success", + ".signature-quality-matrix__metric--warning", + ".signature-quality-matrix__metric--danger", + ".signature-quality-matrix__metric > div", + ".signature-quality-matrix__metric strong", + ".signature-quality-matrix__metric small", + ".signature-quality-matrix__metric em", + ".signature-quality-matrix__drainage-label", + ".signature-quality-matrix__rate", + ".signature-quality-matrix__empty", + ".signature-quality-matrix__zero", + ".signature-quality-drawer__footnote", + ".signature-retirement-message-filter", + ".signature-retirement-suppression-modes", + ".signature-retirement-heatmap__heading", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions .ui-field", + ".signature-quality-card__heading", + ".signature-quality-card__query", + ".signature-quality-card__query", + ".signature-quality-drawer", + ".signature-quality-overview", + ".signature-carrier-grid", + ".signature-quality-drawer__header", + ".signature-quality-drawer__body", + ".signature-quality-overview", + ".signature-carrier-grid", + ".downstream-delivery-toolbar", + ".downstream-delivery-toolbar p", + ".downstream-delivery-toolbar p strong", + ".downstream-requeue-confirm", + ".downstream-requeue-result", + ".downstream-requeue-confirm", + ".downstream-requeue-confirm > div", + ".downstream-requeue-result > div", + ".downstream-requeue-confirm p", + ".downstream-requeue-confirm small", + ".downstream-requeue-confirm strong", + ".downstream-requeue-result p", + ".downstream-requeue-result small", + ".downstream-requeue-confirm strong", + ".downstream-requeue-result--success", + ".downstream-requeue-result--partial", + ".downstream-requeue-result--failed", + ".downstream-requeue-result p", + ".downstream-requeue-result li", + ".downstream-requeue-result ul", + ".downstream-delivery-toolbar > div", + ".downstream-delivery-list__actions", + ".downstream-delivery-list", + ".downstream-delivery-list__header", + ".downstream-delivery-list__row", + ".downstream-delivery-list__header", + ".downstream-delivery-list__row", + ".downstream-delivery-list__row:first-of-type", + ".downstream-delivery-list__row:hover", + ".downstream-delivery-list__select", + ".downstream-delivery-list__retry", + ".downstream-delivery-list__meta", + ".downstream-delivery-list__owner", + ".downstream-delivery-list__retry", + ".downstream-delivery-list__meta strong", + ".downstream-delivery-list__owner strong", + ".downstream-delivery-list__retry strong", + ".downstream-delivery-list__meta span", + ".downstream-delivery-list__owner span", + ".downstream-delivery-list__retry span", + ".downstream-delivery-list__message strong", + ".downstream-delivery-list__error", + ".downstream-delivery-list__error.is-empty", + ".downstream-delivery-list__actions", + ".downstream-delivery-list__empty", + ".downstream-delivery-toolbar", + ".downstream-delivery-toolbar > div", + ".report-page-actions", + ".report-task-time", + ".report-task-time span", + ".admin-remark-cell", + ".admin-remark-cell--empty", + ".report-task-generate", + ".report-task-generate section", + ".report-task-detail .admin-task-card", + ".report-task-generate h3", + ".report-receipt-preview h3", + ".report-task-preview", + ".report-task-preview > div", + ".report-receipt-preview > div", + ".report-task-preview span", + ".report-receipt-preview span", + ".report-task-preview strong", + ".report-receipt-preview strong", + ".report-receipt-modal", + ".report-receipt-modal .ui-field", + ".report-upload-drop", + ".report-upload-drop svg", + ".report-upload-drop strong", + ".report-upload-drop span", + ".report-receipt-preview", + ".admin-app-route-card > .ui-field", + ".downstream-attempt-timeline", + ".downstream-attempt-timeline::before", + ".downstream-attempt-card", + ".downstream-attempt-marker", + ".downstream-attempt-marker--success", + ".downstream-attempt-marker--danger", + ".downstream-attempt-marker--info", + ".downstream-attempt-card__body", + ".downstream-attempt-card__body > header", + ".downstream-attempt-card dl", + ".downstream-attempt-card dl > div", + ".downstream-attempt-card dt", + ".downstream-attempt-card dd", + ".downstream-attempt-card__identifiers dd", + ".downstream-attempt-result", + ".downstream-attempt-result--error", + ".downstream-attempt-timeline > p", + ".admin-mms-task-page .page-heading", + ".admin-mms-task-table-card .ui-table", + ".admin-mms-task-table-card .ui-table-wrap", + ".admin-mms-task-table-card", + ".admin-mms-task-table-card .mms-task-content", + ".admin-mms-task-table-card .mms-task-content p", + ".admin-mms-task-table-card .mms-task-actions", + ".admin-mms-task-table-card .mms-task-actions .ui-button", + ".admin-mms-task-detail .mms-detail-template small", + ".admin-mms-city-list", + ".admin-mms-city-list > div", + ".admin-mms-city-list strong", + ".admin-mms-city-list span", + ".admin-mms-city-list b", + ".admin-mms-city-list .ui-progress-bar", + ".admin-mms-record-search-button", + ".admin-mms-record-search-button:hover", + ".admin-mms-record-table", + ".admin-mms-record-table td", + ".admin-mms-template-cell", + ".admin-mms-template-cell strong", + ".admin-mms-template-cell span", + ".admin-mms-template-cell small", + ".admin-mms-preview-link", + ".admin-uplink-page .page-heading", + ".admin-uplink-filter", + ".admin-uplink-filter__actions", + ".admin-uplink-table-card", + ".admin-uplink-table-card .ui-table-wrap", + ".admin-uplink-table-card .ui-table", + ".admin-uplink-table-card .uplink-content", + ".admin-uplink-table-card .ui-table td strong", + ".gateway-exception-list-heading", + ".gateway-exception-list-heading > div", + ".gateway-exception-list-heading h2", + ".gateway-exception-list-heading p", + ".gateway-exception-page .report-task-table-card > .ui-pagination", + ".downstream-attempt-card dl", + ".downstream-attempt-result", + ".admin-uplink-table-card .ui-table th", + ".admin-uplink-table-card .ui-table td", + ".admin-uplink-checkbox", + ".admin-uplink-detail-link", + ".admin-uplink-detail", + ".admin-uplink-info-card", + ".admin-uplink-match-card", + ".admin-uplink-info-card h3", + ".admin-uplink-match-section h3", + ".admin-uplink-info-grid", + ".admin-uplink-info-grid div", + ".admin-uplink-info-grid__full", + ".admin-uplink-info-grid span", + ".admin-uplink-match-section > p", + ".admin-uplink-match-grid span", + ".admin-uplink-match-content span", + ".admin-uplink-info-grid strong", + ".admin-uplink-match-grid strong", + ".admin-uplink-match-section > p", + ".admin-uplink-match-grid", + ".admin-uplink-match-grid div", + ".admin-uplink-match-content", + ".admin-uplink-match-content", + ".admin-uplink-match-content p", + ".admin-uplink-candidate-footer", + ".admin-uplink-candidate-footer span", + ".admin-recharge-page .page-heading", + ".admin-recharge-filter", + ".admin-recharge-filter__actions", + ".admin-recharge-table-card", + ".admin-recharge-table-card .ui-table-wrap", + ".admin-recharge-table", + ".admin-recharge-table th", + ".admin-recharge-table td", + ".admin-recharge-table td:nth-child(3)", + ".admin-recharge-table td:nth-child(4)", + ".recharge-receipt-modal .ui-modal__header", + ".recharge-receipt-modal .ui-modal__footer", + ".recharge-receipt-modal .ui-modal__body", + ".recharge-receipt", + ".recharge-receipt::before", + ".recharge-receipt__header", + ".recharge-receipt__logo", + ".recharge-receipt__header > span", + ".recharge-receipt__header .is-posted", + ".recharge-receipt__header .is-correction", + ".recharge-receipt__amount", + ".recharge-receipt__amount > span", + ".recharge-receipt__enterprise > span", + ".recharge-receipt__remark > span", + ".recharge-receipt__amount strong", + ".recharge-receipt__amount small", + ".recharge-receipt__enterprise", + ".recharge-receipt__enterprise strong", + ".recharge-receipt__enterprise small", + ".recharge-receipt__details", + ".recharge-receipt__details > div", + ".recharge-receipt__details > div:nth-child(even)", + ".recharge-receipt__details dt", + ".recharge-receipt__details dd", + ".recharge-receipt__remark", + ".recharge-receipt__remark p", + ".recharge-receipt__note", + ".recharge-receipt--correction .recharge-receipt__amount", + ".recharge-receipt--correction .recharge-receipt__amount strong", + ".recharge-receipt__header", + ".recharge-receipt__enterprise", + ".recharge-receipt__remark", + ".recharge-receipt__logo", + ".recharge-receipt__details", + ".recharge-receipt__details > div", + ".recharge-receipt__details > div:last-child", + ".recharge-receipt__details > div:nth-child(even)", + ".manual-recharge-review", + ".manual-recharge-result", + ".manual-recharge-review > p", + ".manual-recharge-review dl", + ".manual-recharge-review dl > div", + ".manual-recharge-review dl > div:last-child", + ".manual-recharge-review dt", + ".manual-recharge-review dd", + ".manual-recharge-review dd span", + ".manual-recharge-review .is-positive", + ".manual-recharge-review .is-negative", + ".manual-recharge-review__remark", + ".manual-recharge-result", + ".manual-recharge-result > strong", + ".manual-recharge-review dl > div", + ".manual-recharge-review dd", + ".admin-recharge-pagination", + ".admin-recharge-pagination > label", + ".admin-recharge-pagination > div", + ".admin-recharge-pagination .ui-button--primary", + ".admin-recharge-pagination span", + ".phone-segment-tabs .ui-tabs__list", + ".phone-segment-tabs .ui-tabs__tab", + ".admin-user-toolbar", + ".admin-user-filter-grid", + ".admin-user-toolbar > .ui-button", + ".phone-segment-workbench", + ".phone-segment-heading", + ".phone-segment-summary__icon", + ".phone-segment-heading > p", + ".phone-segment-panel", + ".phone-segment-query", + ".phone-segment-query__actions", + ".phone-segment-workbench__tabs", + ".phone-segment-workbench__tabs .ui-tabs__list", + ".phone-segment-workbench__tabs .ui-tabs__tab", + ".phone-segment-tab-content", + ".phone-segment-summary", + ".phone-segment-summary__icon", + ".phone-segment-summary__value", + ".phone-segment-summary__value > span", + ".phone-segment-summary__value strong", + ".phone-segment-summary p", + ".phone-segment-tab-content > .phone-segment-query", + ".phone-segment-prefix", + ".phone-segment-delete", + ".phone-segment-delete:hover:not(:disabled)", + ".phone-segment-panel .ui-pagination", + ".phone-segment-panel .ui-table", + ".admin-drainage-actions", + ".admin-drainage-toolbar", + ".admin-drainage-page .page-heading > div > p", + ".admin-drainage-summary", + ".admin-drainage-summary article", + ".admin-drainage-summary article > span", + ".admin-drainage-summary strong", + ".admin-drainage-summary p", + ".admin-drainage-section", + ".admin-drainage-section__heading", + ".admin-drainage-section__heading h2", + ".admin-drainage-section__heading p", + ".admin-drainage-common-grid", + ".admin-drainage-common-group", + ".admin-drainage-common-group__title", + ".admin-drainage-common-group__title > span", + ".admin-drainage-common-empty", + ".admin-drainage-common-list", + ".admin-drainage-common-list > div", + ".admin-drainage-common-list strong", + ".admin-drainage-common-list span", + ".admin-drainage-common-list span", + ".admin-drainage-common-order", + ".admin-drainage-field-grid", + ".admin-drainage-field-card", + ".admin-drainage-field-card:hover", + ".admin-drainage-field-card__actions", + ".admin-drainage-field-card__top", + ".admin-drainage-field-card h3", + ".admin-drainage-field-card code", + ".admin-drainage-field-card > p", + ".admin-drainage-field-card__meta", + ".admin-drainage-field-card__meta strong", + ".admin-drainage-empty", + ".admin-drainage-type", + ".admin-drainage-summary", + ".admin-drainage-common-grid", + ".admin-drainage-toolbar", + ".admin-drainage-section__heading", + ".admin-user-toolbar", + ".admin-drainage-actions .ui-button--ghost", + ".admin-drainage-pagination", + ".admin-drainage-pagination span", + ".file-actions", + ".file-action-link", + ".file-action-preview.ui-button", + ".file-action-link:hover", + ".file-action-preview.ui-button:hover", + ".file-preview-image", + ".client-signature-page", + ".client-signature-heading", + ".client-signature-title", + ".client-drainage-panel__head", + ".client-signature-title", + ".client-signature-title__icon", + ".client-signature-title h1", + ".client-signature-title p", + ".client-drainage-panel h3", + ".client-drainage-panel p", + ".client-signature-form-section h3", + ".client-signature-form-section p", + ".client-signature-title h1", + ".client-signature-title p", + ".client-drainage-panel p", + ".client-signature-form-section p", + ".client-signature-overview", + ".client-signature-overview > div", + ".client-signature-overview > div + div::before", + ".client-signature-overview span", + ".client-signature-overview strong", + ".client-signature-toolbar", + ".client-signature-list-shell", + ".client-signature-list-head", + ".client-signature-list-row", + ".client-signature-list-head", + ".client-signature-row-wrap", + ".client-signature-row-wrap + .client-signature-row-wrap", + ".client-signature-list-row", + ".client-signature-list-row > span", + ".client-signature-list-row > strong", + ".client-signature-expand", + ".client-signature-expand:hover", + ".client-carrier-status-group", + ".client-carrier-status", + ".client-carrier-status strong", + ".client-carrier-status__dot", + ".client-carrier-status--available", + ".client-carrier-status--available strong", + ".client-carrier-status--available .client-carrier-status__dot", + ".client-signature-inline-reason", + ".client-signature-reason", + ".client-drainage-reason", + ".client-signature-inline-reason", + ".client-signature-reason", + ".client-drainage-panel", + ".client-drainage-panel__head", + ".client-drainage-panel h3", + ".client-drainage-table", + ".client-drainage-table__head", + ".client-drainage-table__row", + ".client-drainage-table__head", + ".client-drainage-table__row", + ".client-drainage-target", + ".client-drainage-reason", + ".client-signature-list-empty", + ".client-signature-empty-hint", + ".client-signature-form-section", + ".client-signature-form-section .client-signature-empty-hint", + ".client-signature-list-shell", + ".enterprise-flow-card", + ".enterprise-stepper", + ".enterprise-stepper__item", + ".enterprise-stepper__dot", + ".enterprise-stepper__arrow", + ".enterprise-form-panel", + ".enterprise-upload", + ".enterprise-upload", + ".enterprise-upload strong", + ".enterprise-upload .file-actions", + ".enterprise-address-selects > div", + ".enterprise-address-selects .ui-field", + ".client-signature-heading", + ".client-drainage-panel__head", + ".client-signature-overview", + ".client-signature-overview > div:nth-child(3)::before", + ".client-signature-toolbar", + ".client-drainage-panel", + ".overview-hero", + ".dashboard-grid", + ".content-grid", + ".plan-grid", + ".chart-grid", + ".overview-grid", + ".overview-grid--three", + ".quick-grid", + ".sms-send-layout", + ".send-form-row", + ".sms-preview-card", + ".receiver-table__head", + ".receiver-table__row", + ".batch-filter-grid", + ".batch-pagination", + ".task-info-grid", + ".task-stat-grid", + ".carrier-rate-grid", + ".sms-app-grid", + ".template-card-grid", + ".template-toolbar", + ".template-custom-variable", + ".task-detail-title h2", + ".admin-uplink-filter", + ".admin-recharge-filter", + ".admin-recharge-filter__actions", + ".phone-segment-overview", + ".phone-segment-tabs", + ".admin-drainage-toolbar", + ".channel-route-card-grid", + ".detail-grid", + ".admin-mms-city-list > div", + ".admin-uplink-info-grid", + ".admin-uplink-match-grid", + ".admin-recharge-pagination", + ".client-http-credential-row", + ".client-http-credential-row code", + ".admin-report-target-row", + ".login-page", + ".login-panel", + ".login-brand", + ".login-captcha-row", + ".admin-dashboard-main-grid", + ".admin-metric-grid", + ".admin-workload-grid", + ".enterprise-summary-grid", + ".enterprise-query-grid", + ".system-log-filters", + ".channel-report-filter-grid", + ".channel-group-filter", + ".channel-group-config-item", + ".channel-group-base-form", + ".channel-group-retry-limit", + ".report-receipt-modal", + ".phone-segment-query", + ".client-http-credential-row", + ".admin-report-target-row", + ".admin-app-form-grid", + ".admin-app-route-grid", + ".admin-app-protocol-header", + ".admin-app-protocol-header > .admin-switch", + ".admin-metric-grid", + ".enterprise-summary-grid", + ".admin-workload-grid", + ".enterprise-query-actions", + ".phone-segment-query__actions", + ".enterprise-query-actions .ui-button", + ".phone-segment-query__actions .ui-button", + ".channel-report-page", + ".channel-group-form-page", + ".channel-report-heading", + ".channel-report-filter-footer", + ".channel-report-config-actions", + ".channel-report-filter-footer > div", + ".channel-report-table", + ".channel-report-table__head", + ".channel-report-row", + ".channel-report-row > :first-child", + ".channel-report-name--flow", + ".channel-report-row > :nth-child(3)", + ".channel-report-row > :nth-child(4)", + ".channel-report-row > :nth-child(5)", + ".channel-report-row > :nth-child(6)", + ".channel-report-row > :nth-child(3)::before", + ".channel-report-row > :nth-child(4)::before", + ".channel-report-row > :nth-child(5)::before", + ".channel-report-row > :nth-child(6)::before", + ".channel-report-stats", + ".channel-report-actions", + ".channel-signature-grid", + ".channel-status-options", + ".channel-group-base-form > .ui-field", + ".channel-group-retry-limit", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-filter__actions", + ".channel-group-config-item__actions", + ".channel-group-row-actions", + ".channel-group-config-item__metrics", + ".channel-group-retry-limit > span", + ".channel-group-retry-limit small", + ".phone-segment-tab-content > .phone-segment-query", + ".phone-segment-heading > p", + ".phone-segment-workbench__tabs .ui-tabs__list", + ".phone-segment-workbench__tabs .ui-tabs__tab", + ".phone-segment-summary", + ".phone-segment-summary__icon", + ".phone-segment-summary__value", + ".phone-segment-summary__value strong", + ".phone-segment-summary p", + ".phone-segment-panel .ui-table tbody", + ".phone-segment-panel .ui-pagination", + ".sms-bulk-actions", + ".sms-audit-toolbar", + ".client-signature-list-shell", + ".client-signature-list-head", + ".client-drainage-table__head", + ".client-signature-row-wrap", + ".client-signature-row-wrap + .client-signature-row-wrap", + ".client-signature-list-row", + ".client-signature-list-row > :nth-child(n + 3):nth-child(-n + 7)", + ".client-signature-list-row > :nth-child(3)::before", + ".client-signature-list-row > :nth-child(4)::before", + ".client-signature-list-row > :nth-child(5)::before", + ".client-signature-list-row > :nth-child(6)::before", + ".client-signature-list-row > :nth-child(7)::before", + ".client-signature-list-row > .table-actions", + ".client-signature-inline-reason", + ".client-drainage-panel", + ".client-drainage-table", + ".client-drainage-table__row", + ".client-drainage-table__row > *", + ".client-drainage-table__row > a", + ".client-drainage-reason", + ".login-captcha-row", + ".admin-metric-grid", + ".enterprise-summary-grid", + ".admin-workload-grid", + ".channel-report-config-actions", + ".channel-report-filter-footer > div", + ".enterprise-query-actions", + ".phone-segment-query__actions", + ".application-unit-price", + ".downstream-page-size", + ".downstream-page-size select", + ".downstream-requeue-task-heading", + ".downstream-requeue-task-card > .downstream-requeue-task-heading", + ".downstream-requeue-task-heading__actions", + ".downstream-requeue-task-heading__actions .ui-field", + ".downstream-requeue-task-list", + ".downstream-requeue-task-list article", + ".downstream-requeue-task-list article:last-of-type", + ".downstream-requeue-task-list > .muted", + ".downstream-requeue-task-card > .ui-pagination", + ".downstream-requeue-task-list article > div", + ".downstream-requeue-task-list__identity", + ".downstream-requeue-task-list__scope", + ".downstream-requeue-task-list__progress", + ".downstream-requeue-task-list__identity > strong", + ".downstream-requeue-task-list__identity > span", + ".downstream-requeue-task-list__identity > small", + ".downstream-requeue-task-list__scope > span", + ".downstream-requeue-task-list__progress > small", + ".downstream-requeue-task-list__scope > strong", + ".downstream-requeue-task-list__progress > div:first-child", + ".downstream-requeue-task-list__meter", + ".downstream-requeue-task-list__meter > span", + ".downstream-requeue-task-list__actions", + ".downstream-requeue-preview", + ".downstream-requeue-preview__summary", + ".downstream-requeue-preview__summary > div", + ".downstream-requeue-preview__summary > div.is-primary", + ".downstream-requeue-preview__summary span", + ".downstream-requeue-preview__summary small", + ".downstream-requeue-preview__summary strong", + ".downstream-requeue-preview__meta", + ".downstream-requeue-preview__distribution", + ".downstream-requeue-preview__distribution > span", + ".downstream-requeue-preview__distribution > div", + ".downstream-requeue-reason", + ".downstream-requeue-reason .ui-textarea", + ".downstream-requeue-warning", + ".downstream-requeue-warning > div", + ".downstream-requeue-warning p", + ".downstream-requeue-task-detail", + ".downstream-requeue-detail-alert", + ".downstream-requeue-detail-section", + ".downstream-requeue-detail-filter", + ".downstream-requeue-detail-items", + ".downstream-requeue-detail-items > div", + ".downstream-requeue-detail-items > div:first-child", + ".downstream-requeue-detail-items__head", + ".downstream-requeue-detail-items time", + ".downstream-requeue-task-list article", + ".downstream-requeue-task-list__actions", + ".downstream-requeue-preview__summary", + ".downstream-requeue-task-card > .downstream-requeue-task-heading", + ".downstream-requeue-task-heading", + ".downstream-requeue-task-heading__actions", + ".downstream-requeue-task-list", + ".downstream-requeue-task-list article", + ".downstream-requeue-preview__summary", + ".downstream-requeue-detail-filter", + ".downstream-requeue-task-card > .ui-pagination", + ".downstream-requeue-detail-items", + ".downstream-requeue-detail-items__head", + ".downstream-requeue-detail-items > div" + ] + }, + "entry": "src/styles/domains/index.css", + "importOrder": [ + "src/styles/domains/01-operations-dashboard.css", + "src/styles/domains/02-client-sending.css", + "src/styles/domains/03-client-records.css", + "src/styles/domains/04-signatures.css", + "src/styles/domains/05-templates.css", + "src/styles/domains/06-auth-enterprise.css", + "src/styles/domains/07-admin-operations.css", + "src/styles/domains/08-reporting.css", + "src/styles/domains/09-channels.css", + "src/styles/domains/10-signature-quality.css", + "src/styles/domains/11-deliveries-reporting.css", + "src/styles/domains/12-admin-configuration.css", + "src/styles/domains/13-client-signatures.css", + "src/styles/domains/14-responsive-requeue.css" + ], + "modules": [ + { + "file": "src/styles/domains/01-operations-dashboard.css", + "owner": "shared operations gateway exceptions and dashboard", + "sourceNodeRange": [ + 1, + 51 + ], + "sha256": "e3289a9a5d5ef9c7488778069bff88a0483135f905bbb8e5cd8a8a725c36b8ff", + "rules": 51, + "selectors": 53, + "declarations": 155, + "important": 1, + "selectorList": [ + ".gateway-exception-time", + ".gateway-exception-command", + ".gateway-exception-command pre", + ".gateway-requeue-confirm .callout", + ".gateway-requeue-confirm .callout p", + ".gateway-requeue-confirm .callout--warning", + ".gateway-requeue-confirm .callout--danger", + ".gateway-requeue-checkbox", + ".gateway-requeue-checkbox input", + ".text-page-title", + ".text-section-title", + ".text-card-title", + ".text-body", + ".text-secondary", + ".text-caption", + ".overview-hero", + ".overview-hero h1", + ".overview-hero .eyebrow", + ".overview-hero .muted", + ".dashboard-grid", + ".dashboard-grid--four", + ".dashboard-grid--four", + ".metric-card", + ".metric-card--featured", + ".metric-card--featured span", + ".metric-card--featured small", + ".metric-card span", + ".metric-card strong", + ".metric-card small", + ".chart-grid", + ".chart-card", + ".chart-card h2", + ".overview-grid", + ".overview-grid--three", + ".quick-grid", + ".quick-action", + ".quick-action:hover", + ".quick-action svg", + ".quick-action span", + ".quick-action small", + ".progress-heading", + ".progress-heading strong", + ".progress-track", + ".progress-track span", + ".mini-status-card", + ".mini-status-card svg", + ".mini-status-card div", + ".mini-status-card span", + ".mini-status-card strong", + ".mini-status-card small", + ".mini-status-card--action", + ".mini-status-card--action:hover", + ".mini-status-card--action:focus-visible" + ] + }, + { + "file": "src/styles/domains/02-client-sending.css", + "owner": "client SMS and MMS sending and batch task lists", + "sourceNodeRange": [ + 52, + 168 + ], + "sha256": "f922b64252235fab265f41bebc8bc178467c41d569e11dbbcf84edfb66775a43", + "rules": 117, + "selectors": 129, + "declarations": 388, + "important": 0, + "selectorList": [ + ".sms-send-page", + ".sms-send-title", + ".sms-send-title h1", + ".sms-send-title__icon", + ".sms-send-layout", + ".sms-send-main", + ".send-card", + ".sms-preview-card", + ".send-card__title", + ".send-card__title span", + ".send-card__title h2", + ".preview-title h2", + ".send-field", + ".send-field span", + ".send-field input", + ".receiver-table input", + ".send-field input::placeholder", + ".receiver-table input::placeholder", + ".send-form-row", + ".template-trigger", + ".template-trigger:hover", + ".template-trigger:focus-visible", + ".template-trigger span", + ".template-trigger svg", + ".template-trigger__placeholder", + ".receiver-tabs", + ".receiver-tabs button", + ".receiver-tabs button.active", + ".receiver-table", + ".receiver-table__head", + ".receiver-table__row", + ".receiver-table__head", + ".receiver-table__head span", + ".receiver-table__row span", + ".receiver-table__row input", + ".receiver-table__row button", + ".receiver-table__row span", + ".receiver-table__row button", + ".receiver-table__row button:disabled", + ".add-recipient", + ".import-panel", + ".import-panel__icon", + ".import-panel__icon svg", + ".import-panel strong", + ".send-tip", + ".send-submit-row", + ".client-billing-page .client-billing-amount", + ".send-submit-hint", + ".mms-send-page .send-card", + ".mms-send-tip", + ".mms-import-mode", + ".mms-import-rules", + ".mms-import-rules strong", + ".mms-import-rules p", + ".mms-import-panel", + ".mms-import-panel .import-panel__icon", + ".sms-preview-card", + ".preview-title", + ".preview-title h2", + ".phone-preview", + ".phone-preview div", + ".preview-stats", + ".preview-stats div", + ".preview-stats span", + ".preview-stats strong", + ".preview-note", + ".mms-preview-card", + ".mms-message-preview", + ".mms-message-preview > div", + ".mms-message-preview strong", + ".mms-message-preview p", + ".template-picker", + ".template-picker__list", + ".template-picker__list button", + ".template-picker__list button:last-child", + ".template-picker__list button:hover", + ".template-picker__list button.active", + ".template-picker__list button.active", + ".template-picker__list span", + ".template-picker__list strong", + ".template-picker__list small", + ".batch-filter-card", + ".batch-filter-card h2", + ".batch-filter-card p strong", + ".batch-filter-grid", + ".batch-table-card", + ".batch-table", + ".batch-table th", + ".batch-table td", + ".batch-table tbody tr:hover", + ".batch-main-row td", + ".batch-main-row td", + ".batch-template-row td", + ".batch-task-id", + ".batch-task-id strong", + ".batch-template-row td", + ".batch-main-row.batch-row--hovered td", + ".batch-template-row.batch-row--hovered td", + ".batch-template-content", + ".batch-template-row.batch-row--hovered .batch-template-content", + ".batch-template-row.batch-row--hovered .ui-inline-text-preview", + ".batch-template-content > span:first-child", + ".batch-template-content p", + ".batch-template-content p strong", + ".batch-send-time", + ".batch-send-time span", + ".batch-send-time small", + ".batch-progress", + ".batch-progress div:first-child", + ".batch-progress span", + ".batch-progress strong", + ".batch-progress__track", + ".batch-progress__bar", + ".batch-progress__bar--completed", + ".batch-progress__bar--sending", + ".batch-progress__bar--terminated", + ".batch-actions", + ".batch-actions .ui-button", + ".batch-actions .ui-button:last-child", + ".mms-task-table td", + ".mms-task-content", + ".mms-task-content img", + ".mms-task-content div", + ".mms-task-content strong", + ".mms-task-content p", + ".mms-detail-row-content", + ".mms-detail-row-content img", + ".mms-detail-row-content div", + ".mms-detail-row-content strong" + ] + }, + { + "file": "src/styles/domains/03-client-records.css", + "owner": "client task detail, delivery records and uplink", + "sourceNodeRange": [ + 169, + 285 + ], + "sha256": "3b54b71ff29a07cb65cffc75939edb15851b5e03b72ba695f7b4815f01aade1b", + "rules": 117, + "selectors": 135, + "declarations": 351, + "important": 7, + "selectorList": [ + ".mms-detail-row-content p", + ".mms-task-actions", + ".mms-task-actions .ui-button:last-child", + ".mms-detail-template", + ".mms-detail-template img", + ".mms-detail-template div", + ".mms-detail-template p", + ".batch-pagination", + ".batch-pagination > span", + ".batch-pagination > div", + ".task-detail-title", + ".task-detail-title .sms-send-title__icon", + ".task-detail-title h2", + ".task-detail-title p", + ".task-detail", + ".task-detail-section", + ".task-detail-section > h3", + ".task-section-title h3", + ".task-section-title", + ".task-info-grid", + ".task-info-grid > div", + ".task-info-grid > div:hover", + ".task-info-grid span", + ".task-stat-card span", + ".task-total-progress span", + ".overall-rate-card span", + ".task-info-grid strong", + ".task-info-full", + ".task-info-full strong", + ".task-send-type", + ".text-blue", + ".text-green", + ".task-stat-grid", + ".task-stat-card", + ".task-stat-card::before", + ".task-stat-card--blue::before", + ".task-stat-card--green", + ".task-stat-card--green::before", + ".task-stat-card strong", + ".task-stat-card--green strong", + ".task-total-progress", + ".task-total-progress > div:first-child", + ".task-total-progress strong", + ".overall-rate-card", + ".overall-rate-card strong", + ".overall-rate-card small", + ".task-detail-section h4", + ".carrier-rate-grid", + ".carrier-rate-card", + ".carrier-rate-card > div:first-child", + ".carrier-rate-card p", + ".carrier-rate-card > div:first-child strong", + ".carrier-rate-card > div:first-child span", + ".carrier-rate-card p", + ".city-rate-table th", + ".city-rate-table td", + ".city-rate-table tbody tr:hover", + ".task-detail-title .sms-send-title__icon", + ".task-detail-title h2", + ".task-detail-title p", + ".task-detail", + ".task-detail-section", + ".task-detail-section > h3", + ".task-section-title h3", + ".task-section-title", + ".task-info-grid", + ".task-info-grid > div", + ".task-info-grid > div:nth-child(4n)", + ".task-info-grid > div:hover", + ".task-info-grid span", + ".task-stat-card span", + ".task-total-progress span", + ".overall-rate-card span", + ".task-info-grid strong", + ".task-info-full", + ".task-info-full strong", + ".task-stat-grid", + ".task-stat-card", + ".task-stat-card::before", + ".task-stat-card strong", + ".task-total-progress", + ".task-total-progress .batch-progress__track", + ".overall-rate-card", + ".overall-rate-card strong", + ".carrier-rate-grid", + ".carrier-rate-card", + ".city-rate-table", + ".city-rate-table th", + ".city-rate-table td", + ".send-detail-table-card", + ".send-detail-table", + ".mms-send-detail-table", + ".send-detail-table th", + ".send-detail-main-row td", + ".send-detail-content-row td", + ".send-detail-message", + ".send-detail-content-block", + ".send-detail-content-block span", + ".send-detail-content-block p", + ".send-detail-app-name", + ".send-detail-count", + ".send-detail-time", + ".send-detail-region", + ".send-detail-time", + ".send-detail-region", + ".send-detail-time small", + ".send-detail-region small", + ".send-detail-count small", + ".send-detail-count strong", + ".send-detail-receipt-code", + ".send-detail-carrier", + ".uplink-table-card", + ".uplink-table-card .ui-table th", + ".uplink-table-card .ui-table td", + ".uplink-content", + ".uplink-detail", + ".uplink-detail-hint", + ".uplink-match-list", + ".uplink-match-card", + ".uplink-match-grid", + ".uplink-match-grid div", + ".uplink-match-content", + ".uplink-match-grid span", + ".uplink-match-content span", + ".uplink-match-grid strong", + ".uplink-match-content p", + ".uplink-match-content p", + ".uplink-match-actions", + ".mms-uplink-pagination", + ".mms-uplink-pagination > div", + ".mms-uplink-detail .task-detail-section:first-child", + ".mms-uplink-match-card", + ".mms-uplink-image", + ".mms-uplink-image span", + ".mms-uplink-image img" + ] + }, + { + "file": "src/styles/domains/04-signatures.css", + "owner": "signature and drainage experiences", + "sourceNodeRange": [ + 286, + 418 + ], + "sha256": "649d79cb60e1d6011d2ba16b5855be6fb778b1b3cd42480748b64140704c2f9c", + "rules": 137, + "selectors": 146, + "declarations": 393, + "important": 0, + "selectorList": [ + ".sms-app-grid", + ".sms-app-card", + ".sms-app-card h2", + ".sms-app-card dl", + ".sms-app-card dl div", + ".sms-app-card dt", + ".sms-app-card dd", + ".sms-app-card dd span", + ".sms-app-param-table", + ".sms-app-param-table div", + ".sms-app-param-table div + div", + ".sms-app-param-table span", + ".sms-app-param-table strong", + ".sms-app-param-table span", + ".sms-app-param-table strong", + ".signature-page-header", + ".signature-search-row", + ".signature-list", + ".signature-card", + ".signature-card::before", + ".signature-card--green::before", + ".signature-card--blue::before", + ".signature-card--amber::before", + ".signature-card--red::before", + ".signature-card--gray::before", + ".signature-summary", + ".signature-summary > button", + ".signature-summary div:not(.signature-actions)", + ".signature-summary span", + ".signature-summary strong", + ".signature-actions", + ".drainage-panel", + ".drainage-panel h2", + ".drainage-table", + ".drainage-table__head", + ".drainage-table__row", + ".drainage-table__head", + ".drainage-table__row", + ".drainage-table__url", + ".drainage-row-actions", + ".drainage-panel__footer", + ".admin-enterprise-signature-list .signature-summary", + ".admin-enterprise-signature-list .signature-actions", + ".admin-enterprise-signature-list .signature-actions .ui-button", + ".admin-enterprise-signature-list .drainage-row-actions .ui-button", + ".signature-summary .signature-summary__regular-value", + ".admin-enterprise-signature-list", + ".admin-enterprise-signature-list .signature-card", + ".admin-enterprise-signature-list .signature-card:last-of-type", + ".enterprise-signature-table__head", + ".enterprise-signature-table__signature", + ".enterprise-signature-table__signature strong", + ".enterprise-signature-pending-summary", + ".enterprise-signature-pending-summary strong", + ".enterprise-signature-pending-summary .ui-button", + ".carrier-report-count", + ".carrier-report-count small", + ".carrier-report-count--success", + ".carrier-report-count--warning", + ".carrier-report-count--danger", + ".carrier-report-count--info", + ".carrier-report-count--neutral", + ".signature-report-status", + ".signature-report-status__context", + ".signature-report-status__context span", + ".signature-report-status__carriers", + ".signature-report-status__carrier", + ".signature-report-status__carrier > header", + ".signature-report-status__carrier > header > span:last-child", + ".signature-report-status__list", + ".signature-report-status__row", + ".signature-report-status__row:last-child", + ".signature-report-status__row strong", + ".signature-report-status__empty", + ".signature-report-status__carriers", + ".signature-report-status__list", + ".signature-retirement-heatmap__total", + ".carrier-report-summary", + ".carrier-report-summary small", + ".admin-enterprise-template-list", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row:hover", + ".admin-enterprise-template-row__identity", + ".admin-enterprise-template-row__content", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__title", + ".admin-enterprise-template-row__title > strong", + ".admin-enterprise-template-row dl", + ".admin-enterprise-template-row dl div", + ".admin-enterprise-template-row dt", + ".admin-enterprise-template-row__content > span", + ".admin-enterprise-template-row__meta > span", + ".admin-enterprise-template-row dd", + ".admin-enterprise-template-row__content p", + ".admin-enterprise-template-row__content small", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__meta strong", + ".admin-enterprise-template-row__actions", + ".admin-enterprise-template-row__actions .ui-button", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__actions", + ".admin-enterprise-template-row", + ".admin-enterprise-template-row__meta", + ".admin-enterprise-template-row__actions", + ".system-log-filters__actions", + ".detail-grid", + ".detail-grid div", + ".detail-grid span", + ".detail-grid strong", + ".detail-grid__wide", + ".signature-modal-title h2", + ".signature-modal-title p", + ".signature-form", + ".signature-form section", + ".signature-form h3", + ".signature-form-grid", + ".signature-form-grid__wide", + ".report-requirement-heading", + ".report-requirement-heading h3", + ".report-field-source", + ".report-requirement-explanation > p", + ".report-source-group", + ".report-source-channel", + ".report-source-channel ul", + ".signature-upload", + ".signature-upload > span:first-child", + ".signature-upload svg", + ".signature-upload strong", + ".signature-upload small", + ".signature-upload--compact", + ".signature-file-line", + ".signature-file-line > span", + ".signature-file-line small", + ".drainage-edit-form .signature-upload", + ".drainage-form-note", + ".drainage-form-note ol", + ".drainage-file-picker", + ".drainage-file-picker > span", + ".drainage-file-picker > div", + ".drainage-file-picker em", + ".mms-signature-table-card", + ".mms-signature-table-card .ui-table th", + ".mms-signature-table-card .ui-table td", + ".mms-signature-table-card .ui-table th:first-child", + ".mms-signature-table-card .ui-table td:first-child" + ] + }, + { + "file": "src/styles/domains/05-templates.css", + "owner": "SMS and MMS template experiences", + "sourceNodeRange": [ + 419, + 550 + ], + "sha256": "ecf3f139c13402c36520cd7e95974227ccfc3dcf301e6bfe0337f8e7e427c4b3", + "rules": 132, + "selectors": 145, + "declarations": 418, + "important": 3, + "selectorList": [ + ".mms-signature-name", + ".mms-signature-actions", + ".mms-signature-actions .ui-button:disabled", + ".mms-signature-delete", + ".mms-signature-delete:hover", + ".mms-pagination", + ".mms-pagination button", + ".mms-pagination button:hover:not(:disabled)", + ".mms-pagination button.active", + ".mms-pagination button:disabled", + ".mms-template-header", + ".mms-template-header .sms-send-title", + ".mms-template-header p", + ".mms-template-toolbar", + ".mms-template-grid", + ".mms-template-card", + ".mms-template-card:hover", + ".mms-template-card::before", + ".mms-template-card--green::before", + ".mms-template-card--blue::before", + ".mms-template-card--gray::before", + ".mms-template-card__body", + ".mms-template-meta", + ".mms-template-card h2", + ".mms-template-card h3", + ".mms-template-code", + ".mms-template-card img", + ".mms-template-content", + ".mms-template-app-tag", + ".mms-template-status", + ".mms-template-status > span", + ".mms-template-status > div", + ".mms-template-status section", + ".mms-template-status small", + ".mms-template-card__footer", + ".mms-template-card__footer > span", + ".mms-template-card__footer div", + ".mms-template-card__footer button", + ".mms-template-card__footer button:nth-child(2)", + ".mms-template-card__footer button:last-child", + ".mms-template-modal-title h2", + ".mms-template-modal-title p", + ".mms-template-form", + ".mms-template-form-grid", + ".mms-frame-header", + ".mms-frame-header div", + ".mms-frame-header strong", + ".mms-frame-header span", + ".mms-frame-list", + ".mms-frame", + ".mms-frame__top", + ".mms-frame__top > strong", + ".mms-frame__top > button", + ".mms-frame-type .ui-field__label", + ".mms-frame-type .ui-select button", + ".mms-frame .ui-textarea", + ".mms-file-drop", + ".mms-file-drop div", + ".mms-file-drop strong", + ".mms-file-drop small", + ".mms-save-button", + ".mms-save-button:hover", + ".mms-preview", + ".mms-preview img", + ".mms-preview p", + ".mms-preview-frames", + ".mms-preview-frames span", + ".template-toolbar", + ".template-card-grid", + ".template-card", + ".template-card::before", + ".template-card--green::before", + ".template-card--blue::before", + ".template-card--red::before", + ".template-card h2", + ".template-hash", + ".template-content", + ".template-vars", + ".template-vars span", + ".template-vars strong", + ".template-current-vars strong", + ".template-card-footer", + ".template-card-footer span", + ".template-card-footer div", + ".template-card-footer button", + ".template-card-footer button:last-child", + ".template-form", + ".template-form .ui-textarea", + ".template-form-meta", + ".template-form-meta button", + ".template-form-meta span", + ".template-variable-panel", + ".template-variable-panel h3", + ".template-variable-buttons", + ".template-variable-buttons button", + ".template-variable-buttons button:hover", + ".template-custom-variable", + ".template-info-tip", + ".template-info-tip svg", + ".template-current-vars", + ".task-detail-title h2", + ".task-stat-layout", + ".task-progress-card", + ".task-progress-card span", + ".task-stat-list span", + ".task-progress-card strong", + ".task-progress-card small", + ".task-stat-list", + ".task-stat-list > div", + ".task-stat-list > div:last-child", + ".task-stat-list strong", + ".overall-rate-card", + ".overall-rate-split", + ".overall-rate-split div", + ".overall-rate-split b", + ".rate-tone-low", + ".rate-tone-low .batch-progress__bar", + ".rate-tone-medium", + ".rate-tone-medium .batch-progress__bar", + ".rate-tone-high", + ".rate-tone-high .batch-progress__bar", + ".overall-rate-card.rate-tone-low", + ".overall-rate-card.rate-tone-medium", + ".overall-rate-card.rate-tone-high", + ".overall-rate-card.rate-tone-low strong", + ".carrier-rate-card.rate-tone-low > div:first-child span", + ".rate-text.rate-tone-low", + ".overall-rate-card.rate-tone-medium strong", + ".carrier-rate-card.rate-tone-medium > div:first-child span", + ".rate-text.rate-tone-medium", + ".overall-rate-card.rate-tone-high strong", + ".carrier-rate-card.rate-tone-high > div:first-child span", + ".rate-text.rate-tone-high", + ".rate-text", + ".carrier-rate-card .batch-progress__bar", + ".city-rate-table .batch-progress__bar", + ".detail-message", + ".receipt", + ".receipt--failed", + ".content-grid", + ".soft-panel", + ".soft-panel h3", + ".summary-list", + ".summary-list div", + ".summary-list span" + ] + }, + { + "file": "src/styles/domains/06-auth-enterprise.css", + "owner": "authentication, risk confirmation and enterprise review", + "sourceNodeRange": [ + 551, + 725 + ], + "sha256": "0f7883c37c59dea79b427e90dc834821e97db7404159bc9b802db89ab2636dd5", + "rules": 179, + "selectors": 206, + "declarations": 537, + "important": 4, + "selectorList": [ + ".summary-list strong", + ".plan-grid", + ".plan-card", + ".plan-card--highlight", + ".plan-card strong", + ".muted", + ".text-strong", + ".status-success", + ".status-warning", + ".status-danger", + ".status-info", + ".empty-state", + ".empty-state strong", + ".empty-state span", + ".login-page", + ".client-login-canvas", + ".login-panel", + ".login-brand", + ".login-brand img", + ".login-brand h1", + ".login-brand p", + ".login-form", + ".login-captcha-row", + ".login-captcha", + ".login-error", + ".login-session-notice", + ".page-loading-state", + ".login-alert-message", + ".system-page", + ".system-page-toolbar", + ".system-log-export", + ".system-log-export__result", + ".system-log-export__error", + ".system-log-export__result", + ".system-log-export__error", + ".risk-action-content", + ".risk-action-content section", + ".risk-action-content h3", + ".risk-action-content ul", + ".risk-action-identity", + ".risk-action-identity div", + ".risk-action-identity span", + ".risk-action-identity strong", + ".risk-action-blockers", + ".risk-action-blockers li", + ".risk-action-passed", + ".risk-action-passed", + ".risk-action-result", + ".risk-action-result div", + ".risk-action-result span", + ".risk-action-identity", + ".delete-risk-dependencies", + ".delete-risk-dependencies li", + ".delete-risk-dependencies small", + ".delete-risk-selections", + ".delete-risk-selections > h3", + ".delete-risk-selections > p", + ".delete-risk-selections label", + ".delete-risk-selections input", + ".delete-risk-selections label > span", + ".delete-risk-selections small", + ".delete-risk-action .ui-textarea", + ".system-page-toolbar", + ".system-log-export", + ".system-log-export > .ui-button", + ".system-log-export__result", + ".system-log-export__error", + ".system-filter-row", + ".system-log-filters", + ".system-log-range", + ".system-log-range > span", + ".system-table-card", + ".system-table-card .ui-table-wrap", + ".system-table-card .ui-table", + ".system-table-card .ui-table th", + ".system-table-card .ui-table td", + ".system-table-card .ui-table tbody tr:nth-child(odd) td", + ".system-table-card .ui-table tbody tr:nth-child(even) td", + ".system-table-card .ui-table tbody tr:hover td", + ".inline-actions", + ".system-user-form", + ".system-user-form .ui-field__label", + ".system-log-detail", + ".system-log-detail-card", + ".system-log-detail-card strong", + ".system-log-detail-card span", + ".system-log-detail-card small", + ".protocol-log-hint", + ".protocol-log-filters", + ".protocol-log-table .ui-table", + ".protocol-log-table .ui-table th:last-child", + ".protocol-log-table .ui-table td:last-child", + ".protocol-log-identifiers", + ".protocol-log-result", + ".protocol-log-identifiers small", + ".protocol-log-result small", + ".protocol-log-detail", + ".protocol-log-detail > div", + ".protocol-log-detail dt", + ".protocol-log-detail dd", + ".protocol-log-filters", + ".protocol-log-filters", + ".protocol-log-detail > div", + ".enterprise-page", + ".enterprise-page-title", + ".enterprise-status-card", + ".enterprise-status-card strong", + ".enterprise-status-card--pending", + ".enterprise-status-card--approved", + ".enterprise-status-card--rejected", + ".enterprise-review-status", + ".enterprise-review-status--uncertified", + ".enterprise-review-status--pending", + ".enterprise-review-status--approved", + ".enterprise-review-status--rejected", + ".enterprise-status-card button", + ".enterprise-result button", + ".enterprise-info-card", + ".enterprise-info-card dl", + ".enterprise-info-card div", + ".enterprise-result dl div", + ".enterprise-info-card dt", + ".enterprise-result dt", + ".enterprise-info-card dd", + ".enterprise-result dd", + ".enterprise-flow-card", + ".enterprise-stepper", + ".enterprise-stepper__item", + ".enterprise-stepper__dot", + ".enterprise-stepper__dot.is-active", + ".enterprise-stepper__dot.is-complete", + ".enterprise-stepper__item strong", + ".enterprise-stepper__item strong.is-active", + ".enterprise-stepper__arrow", + ".enterprise-form-panel", + ".enterprise-verify-panel", + ".enterprise-face-panel", + ".enterprise-form-panel", + ".enterprise-required", + ".enterprise-address-selects > span", + ".enterprise-required::first-letter", + ".enterprise-address-selects > span::first-letter", + ".enterprise-upload", + ".enterprise-upload strong", + ".enterprise-help", + ".enterprise-form-note", + ".enterprise-verify-panel small", + ".enterprise-address-selects", + ".enterprise-address-selects > div", + ".enterprise-address-selects .ui-field", + ".enterprise-actions", + ".enterprise-actions--center", + ".enterprise-method-panel", + ".enterprise-method-card", + ".enterprise-method-card.is-selected", + ".enterprise-method-card svg", + ".enterprise-method-card strong", + ".enterprise-method-card strong span", + ".enterprise-verify-copy em", + ".enterprise-info-alert em", + ".enterprise-qr-section em", + ".enterprise-method-card p", + ".enterprise-verify-panel", + ".enterprise-face-panel", + ".enterprise-verify-panel > p", + ".enterprise-face-panel > p", + ".enterprise-verify-panel > p span", + ".enterprise-face-panel > p span", + ".enterprise-verify-copy", + ".enterprise-verify-copy em:first-of-type", + ".enterprise-verify-panel h2", + ".enterprise-face-panel h2", + ".enterprise-info-alert", + ".enterprise-info-alert svg", + ".enterprise-face-panel", + ".enterprise-qr-section", + ".enterprise-legal-summary", + ".enterprise-legal-summary div", + ".enterprise-legal-summary dt", + ".enterprise-legal-summary dd", + ".enterprise-qr-section h2", + ".enterprise-qr-section p", + ".enterprise-qr-section p", + ".enterprise-qr", + ".enterprise-qr-section > span", + ".enterprise-success-test", + ".enterprise-result", + ".enterprise-result > span", + ".enterprise-result--success > span", + ".enterprise-result--pending > span", + ".enterprise-result--pending > span", + ".enterprise-result--failed > span", + ".enterprise-result h2", + ".enterprise-result dl", + ".enterprise-result--failed p", + ".enterprise-result--failed > strong", + ".admin-dashboard-hero", + ".admin-dashboard-hero h1", + ".admin-dashboard-main-grid", + ".admin-metric-grid", + ".metric-card__value--danger", + ".admin-metric-grid", + ".admin-workload-grid", + ".admin-workload-card", + ".admin-workload-card:hover", + ".admin-workload-card strong" + ] + }, + { + "file": "src/styles/domains/07-admin-operations.css", + "owner": "admin detail, routes, profiles and SMS audit", + "sourceNodeRange": [ + 726, + 900 + ], + "sha256": "da3fed1c0e22266f890148a945a7b44536a14d8a65581fb78aae4afce19afa8d", + "rules": 175, + "selectors": 189, + "declarations": 548, + "important": 0, + "selectorList": [ + ".admin-workload-card span:not(.ui-tag)", + ".admin-alert-list", + ".admin-alert", + ".admin-alert--danger", + ".admin-alert--warning", + ".admin-alert--info", + ".admin-alert > div", + ".admin-alert strong", + ".admin-alert span", + ".admin-alert p", + ".admin-alert p", + ".enterprise-summary-grid", + ".enterprise-query-grid", + ".enterprise-query-actions", + ".enterprise-inline-tag", + ".enterprise-form", + ".enterprise-form-page", + ".enterprise-form-card", + ".enterprise-upload-panel", + ".enterprise-upload-panel > span", + ".enterprise-upload-panel button", + ".enterprise-upload-button", + ".enterprise-upload-button", + ".enterprise-upload-panel p", + ".enterprise-info-tip", + ".admin-enterprise-detail", + ".admin-detail-backbar", + ".admin-detail-backbar > span", + ".admin-enterprise-profile", + ".admin-enterprise-profile__main", + ".admin-enterprise-profile__icon", + ".admin-enterprise-profile h1", + ".admin-enterprise-profile p", + ".admin-enterprise-profile > .ui-button", + ".admin-enterprise-profile dl", + ".admin-enterprise-profile dt", + ".admin-enterprise-profile dd", + ".admin-business-tabs", + ".admin-business-tabs button", + ".admin-business-tabs button.active", + ".admin-app-grid", + ".admin-app-card", + ".admin-app-card header", + ".admin-app-card h3", + ".admin-app-card header button", + ".admin-app-card header button.is-on", + ".admin-app-card dl", + ".admin-app-card dl div", + ".admin-app-card dt", + ".admin-app-card dd", + ".admin-app-card footer", + ".admin-section-footer", + ".admin-mms-signature-summary", + ".admin-signature-spacer", + ".admin-report-detail", + ".admin-report-tabs", + ".admin-report-tabs button", + ".admin-report-tabs button.active", + ".admin-report-tabs strong", + ".admin-report-carrier--mobile strong", + ".admin-report-carrier--unicom strong", + ".admin-report-carrier--telecom strong", + ".admin-report-tabs span", + ".admin-report-tabs i", + ".admin-report-tabs i.is-success", + ".admin-report-tabs i.is-info", + ".admin-report-tabs i.is-danger", + ".admin-report-carrier-detail", + ".admin-report-carrier-title", + ".admin-report-carrier-title div", + ".admin-report-carrier-title strong", + ".admin-report-carrier-title span", + ".admin-report-carrier-title p", + ".admin-report-carrier-title p", + ".admin-report-carrier-title p span", + ".admin-report-carrier-title p em", + ".admin-report-record-list", + ".admin-report-record-list article", + ".admin-report-record-list h4", + ".admin-report-record-list p", + ".admin-report-record-list p span", + ".admin-drainage-report-meta", + ".admin-drainage-report-meta p", + ".admin-drainage-report-meta a", + ".admin-app-form-page", + ".admin-app-form-card", + ".admin-app-form-grid", + ".admin-app-form-tip", + ".admin-app-form-tip svg", + ".admin-app-protocol-section", + ".admin-app-protocol-section--http", + ".admin-app-protocol-header", + ".admin-app-protocol-heading", + ".admin-app-protocol-heading > div", + ".admin-app-protocol-heading p", + ".admin-app-protocol-icon", + ".admin-app-protocol-section--http .admin-app-protocol-icon", + ".admin-app-protocol-section--http .admin-switch.is-on", + ".admin-app-protocol-section--http .admin-switch.is-on span", + ".admin-app-protocol-body", + ".admin-app-protocol-empty", + ".admin-app-form-price-note", + ".admin-app-route-grid", + ".admin-app-route-card", + ".admin-app-route-card.is-selected", + ".admin-app-route-card header", + ".admin-app-route-card header > span:first-child", + ".admin-app-route-card header strong", + ".admin-app-route-card header small", + ".admin-app-route-card header small", + ".admin-app-route-card p", + ".admin-switch", + ".admin-switch span", + ".admin-switch span::after", + ".admin-switch.is-on", + ".admin-switch.is-on span", + ".admin-switch.is-on span::after", + ".breadcrumb-line", + ".breadcrumb-line__icon", + ".breadcrumb-line h1", + ".page-heading > div:has(.breadcrumb-line) > h1", + ".channel-report-heading h1", + ".channel-route-modal__title", + ".channel-route-modal__title > span", + ".channel-route-modal__title h2", + ".channel-route-modal__title p", + ".channel-route-modal__title p", + ".channel-route-modal__empty", + ".channel-route-modal__selected", + ".channel-route-modal__selected strong", + ".channel-route-modal__selected span", + ".channel-route-modal__selected span", + ".admin-enterprise-profile__main", + ".admin-enterprise-profile__icon", + ".admin-enterprise-profile__main h1", + ".audit-table-card", + ".enterprise-audit-detail", + ".enterprise-audit-detail section", + ".enterprise-audit-detail h3", + ".enterprise-audit-detail div", + ".enterprise-audit-detail span", + ".enterprise-audit-detail strong", + ".enterprise-audit-detail__remark", + ".audit-link", + ".audit-link--success", + ".audit-link--danger", + ".audit-pagination", + ".sms-bulk-actions", + ".sms-bulk-actions .ui-button--secondary", + ".sms-audit-toolbar", + ".sms-audit-toolbar > div", + ".sms-audit-list", + ".sms-audit-cell-stack", + ".sms-audit-cell-stack small", + ".sms-audit-cell-stack .table-link", + ".sms-audit-head", + ".sms-audit-row", + ".sms-audit-head", + ".sms-audit-row", + ".sms-audit-row:last-child", + ".sms-audit-customer", + ".sms-audit-count", + ".sms-audit-result", + ".sms-audit-actions", + ".sms-audit-customer span", + ".sms-audit-customer small", + ".sms-audit-count", + ".sms-audit-content", + ".sms-audit-count a", + ".sms-audit-count button", + ".sms-audit-count button", + ".sms-audit-reasons", + ".audit-dot", + ".audit-dot::before", + ".audit-dot--warning", + ".audit-dot--warning::before", + ".audit-dot--success", + ".audit-dot--success::before", + ".audit-dot--danger", + ".audit-dot--danger::before", + ".sms-audit-result small", + ".sms-audit-actions .ui-button", + ".sms-audit-actions .ui-button--secondary", + ".sms-audit-actions .ui-button--danger", + ".sms-audit-edit", + ".sms-audit-edit__meta", + ".sms-audit-edit__meta span", + ".sms-audit-edit__meta strong", + ".sms-audit-edit__count" + ] + }, + { + "file": "src/styles/domains/08-reporting.css", + "owner": "report materials, import mapping, batches and field selection", + "sourceNodeRange": [ + 901, + 1075 + ], + "sha256": "9331cf0d1a663e21f69b0f31883508c0ea6b9c3216428b9e6f64d0059f062740", + "rules": 186, + "selectors": 200, + "declarations": 565, + "important": 7, + "selectorList": [ + ".sms-audit-edit__count strong", + ".sms-reject-modal", + ".reject-reason-tags", + ".reject-reason-tags button", + ".reject-reason-tags button:hover", + ".audit-collapse-link", + ".phone-list-modal", + ".phone-list-toolbar", + ".phone-list-toolbar > label", + ".phone-list-toolbar > div", + ".phone-list-table", + ".phone-list-table .ui-table-wrap", + ".phone-list-table .ui-table tbody tr:nth-child(even)", + ".channel-report-page", + ".channel-report-hero", + ".channel-report-heading", + ".channel-report-heading h1", + ".channel-report-config-actions", + ".channel-report-filter", + ".channel-report-filter-grid", + ".channel-report-filter-footer", + ".channel-report-filter-footer > div", + ".channel-report-table", + ".channel-report-table__head", + ".channel-report-row", + ".report-material-detail-list", + ".report-material-detail-list > div", + ".report-material-detail-list > div:last-child", + ".report-material-detail-list > div > span", + ".report-material-detail-list > div > strong", + ".report-material-detail-list > div.is-missing", + ".report-batch-toolbar", + ".report-batch-progress", + ".report-batch-progress span", + ".report-batch-progress strong", + ".ui-modal__panel.report-batch-drawer", + ".ui-modal__panel.report-batch-drawer .ui-modal__body", + "from", + "to", + ".report-batch-detail-summary", + ".report-batch-detail-summary span", + ".report-batch-detail-summary strong", + ".report-batch-briefs", + ".report-batch-briefs__title", + ".report-batch-briefs__title h3", + ".report-batch-brief", + ".report-batch-brief header", + ".report-batch-brief header > div", + ".report-batch-brief header span", + ".report-batch-brief pre", + ".report-material-summary", + ".report-material-summary span", + ".report-batch-toolbar", + ".report-material-detail-list > div", + ".enterprise-signature-pending-summary", + ".enterprise-signature-pending-summary .ui-button", + ".report-batch-brief header", + ".report-batch-brief header .ui-button", + ".ui-modal__panel.report-batch-drawer", + ".report-batch-detail-summary", + ".channel-report-table__head", + ".channel-report-row", + ".channel-report-row--signature", + ".channel-report-row--drainage", + ".channel-report-name", + ".channel-report-name > button", + ".channel-report-name > button:disabled", + ".channel-report-name > span", + ".channel-report-name strong", + ".channel-report-name small", + ".channel-report-name small b", + ".channel-report-name--flow", + ".channel-report-name--flow i", + ".channel-report-date", + ".channel-report-stats", + ".channel-report-stats span", + ".channel-report-stats strong", + ".channel-report-stats b", + ".success-rate-text--red", + ".success-rate-text--orange", + ".success-rate-text--yellow", + ".success-rate-text--blue", + ".success-rate-text--green", + ".success-rate-text--deep-green", + ".channel-report-stats .is-success", + ".channel-report-stats .is-warning", + ".channel-report-stats .is-danger", + ".channel-report-actions", + ".channel-report-actions button", + ".channel-report-actions button.is-warning", + ".channel-report-actions button.is-danger", + ".channel-report-detail", + ".channel-report-detail > strong", + ".channel-report-detail p", + ".channel-report-detail p > span:first-child", + ".channel-signature-title h2", + ".channel-signature-title p", + ".channel-signature-title p", + ".channel-signature-detail", + ".channel-signature-detail section", + ".channel-signature-detail h3", + ".channel-signature-grid", + ".channel-signature-grid__wide", + ".channel-signature-grid > .channel-signature-upload:first-of-type:last-child", + ".channel-signature-detail input[readonly]", + ".channel-signature-upload", + ".channel-signature-upload > span", + ".channel-signature-upload > div", + ".channel-status-title h2", + ".channel-status-title p", + ".channel-status-title p", + ".channel-status-form", + ".channel-status-options", + ".channel-status-options button", + ".channel-status-options button.is-info", + ".channel-status-options button.is-success", + ".channel-status-options button.is-danger", + ".channel-status-options button.is-warning", + ".channel-status-options button.is-selected", + ".channel-status-options button > span", + ".channel-export-preview", + ".channel-export-preview span", + ".channel-field-mapping-grid", + ".report-import-basic-grid", + ".report-import-basic-grid", + ".report-import-file", + ".report-import-file span", + ".report-import-file input", + ".report-import-analysis-progress", + ".report-import-analysis-progress > div:first-child", + ".report-import-analysis-progress small", + ".report-import-mapping", + ".report-import-mapping-table", + ".report-import-mapping-head", + ".report-import-mapping-row", + ".report-import-mapping-head", + ".report-import-mapping-row", + ".report-import-mapping-row > span", + ".report-import-mapping-row small", + ".report-import-profile", + ".report-import-profile__toggle", + ".report-import-profile__toggle[aria-pressed='true']", + ".report-import-profile .field", + ".report-import-preview pre", + ".report-material-filter", + ".report-material-filter--pending", + ".report-material-filter--batches", + ".report-material-pool", + ".report-material-table-head", + ".report-material-row", + ".report-material-table-head", + ".report-material-row", + ".report-material-row:hover", + ".report-material-row.is-disabled", + ".report-material-row.is-disabled:hover", + ".report-material-row > span", + ".report-material-row small", + ".report-material-row em", + ".report-material-batches", + ".report-material-batches article", + ".report-material-batches article > div", + ".report-material-batches article small", + ".report-material-batches article a", + ".report-batch-preflight", + ".report-batch-summary", + ".report-batch-summary span", + ".report-batch-preflight article", + ".report-batch-preflight article > div", + ".report-batch-preflight article small", + ".report-batch-preflight ul", + ".report-batch-preflight li", + ".report-batch-preflight li.is-eligible", + ".report-batch-preflight li.is-blocked", + ".channel-field-mapping-grid", + ".report-import-basic-grid", + ".report-material-filter--pending", + ".report-material-filter--batches", + ".report-material-filter .ui-query-actions", + ".report-material-table-head", + ".report-material-row", + ".report-material-table-head > :nth-child(n + 4)", + ".report-material-row > :nth-child(n + 4)", + ".channel-field-pool", + ".channel-field-pool-list", + ".channel-selected-field-list", + ".channel-field-pool-list", + ".channel-field-pool-list > button", + ".channel-remove-field-button", + ".report-material-image-value", + ".report-material-image-value img", + ".report-export-format-options", + ".report-export-format-options button", + ".report-export-format-options button[aria-checked='true']", + ".report-export-format-options span", + ".channel-field-pool-list > button:hover", + ".channel-field-pool-list > button > span", + ".channel-field-pool-list > button > span:last-child", + ".channel-selected-fields", + ".channel-selected-field-list article", + ".channel-selected-field-head" + ] + }, + { + "file": "src/styles/domains/09-channels.css", + "owner": "channel metrics, groups and routing", + "sourceNodeRange": [ + 1076, + 1150 + ], + "sha256": "8517cdd56716c0d0a68f30a41de5065016075d5365fbcd9bf2c31d814ae2d9b9", + "rules": 75, + "selectors": 88, + "declarations": 250, + "important": 0, + "selectorList": [ + ".channel-selected-field-index", + ".channel-selected-field-order", + ".channel-selected-field-order button", + ".channel-selected-field-controls > button", + ".channel-selected-field-order button:disabled", + ".channel-selected-field-controls", + ".channel-selected-field-controls label", + ".channel-selected-field-controls > button", + ".mms-channel-page .page-heading", + ".mms-channel-filter", + ".mms-channel-list", + ".mms-channel-list .ui-table-wrap", + ".mms-channel-list .ui-table", + ".mms-channel-list .ui-table th", + ".mms-channel-list .ui-table td", + ".mms-channel-list .ui-table tbody tr:nth-child(even)", + ".mms-channel-identity", + ".mms-channel-identity span", + ".mms-channel-identity small", + ".mms-channel-identity small", + ".mms-channel-carrier", + ".mms-channel-quality", + ".mms-channel-metric", + ".mms-channel-metric small", + ".mms-channel-metric strong", + ".mms-channel-metric--success strong", + ".mms-channel-metric--warning strong", + ".mms-channel-metric--danger strong", + ".mms-channel-actions", + ".mms-channel-modal-title h2", + ".mms-channel-modal-title p", + ".mms-channel-modal-title p", + ".mms-channel-form", + ".mms-channel-form__wide", + ".sms-channel-group-page .page-heading", + ".channel-group-filter", + ".channel-group-filter__actions", + ".channel-group-list", + ".channel-group-config-list", + ".channel-group-config-item", + ".channel-group-config-item__identity", + ".channel-group-config-item__icon", + ".channel-group-config-item__identity div", + ".channel-group-config-item__identity strong", + ".channel-group-config-item__identity span:last-child", + ".channel-group-config-item__metrics span", + ".channel-group-config-item__policy span", + ".channel-group-config-item__channels span", + ".channel-group-config-item__metrics", + ".channel-group-config-item__metrics div", + ".channel-group-config-item__metrics strong", + ".channel-group-config-item__policy", + ".channel-group-config-item__policy span", + ".channel-group-config-item__channels", + ".channel-group-config-item__channels span", + ".channel-group-config-item__actions", + ".channel-group-config-item__actions button", + ".channel-group-config-item__actions button.is-danger", + ".channel-group-form-page", + ".channel-group-form-section", + ".channel-group-form-section h2", + ".channel-group-base-form", + ".channel-group-base-form > .ui-field", + ".channel-group-retry-limit", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row > span", + ".channel-group-switch-row > span", + ".channel-group-radio-row label", + ".channel-group-switch-row button", + ".channel-group-switch-row button i", + ".channel-group-switch-row button.is-on", + ".channel-group-switch-row button.is-on i", + ".channel-group-row-actions", + ".channel-group-row-actions button", + ".channel-group-row-actions button.is-danger", + ".channel-group-retry-limit", + ".channel-group-retry-limit > span", + ".channel-group-retry-limit small", + ".channel-route-card-grid", + ".channel-route-card", + ".channel-route-card > div", + ".channel-route-card strong", + ".channel-route-card span", + ".channel-route-card small", + ".channel-route-card p" + ] + }, + { + "file": "src/styles/domains/10-signature-quality.css", + "owner": "signature retirement and quality matrix", + "sourceNodeRange": [ + 1151, + 1268 + ], + "sha256": "4200e98bf7a560eb69b3f69569aab630ee2d221c8bdd71dcdb9274135dd079f4", + "rules": 126, + "selectors": 140, + "declarations": 376, + "important": 0, + "selectorList": [ + ".channel-route-card footer", + ".channel-route-card footer button", + ".channel-route-card footer button.is-danger", + ".channel-route-empty", + ".channel-route-modal", + ".channel-route-modal__channel-select", + ".channel-route-modal .ui-select__dropdown", + ".channel-route-modal .ui-select__dropdown button", + ".channel-route-modal__note", + ".channel-route-modal__note svg", + ".channel-group-form-footer", + ".channel-group-form-footer .ui-button", + ".recovery-status-explainer", + ".recovery-status-explainer > svg", + ".recovery-status-explainer strong", + ".recovery-status-explainer p", + ".signature-quality-card", + ".login-return-link", + ".login-return-link:hover", + ".signature-retirement-heatmap", + ".signature-retirement-heatmap__heading", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions .ui-field", + ".signature-retirement-heatmap__scroll", + ".signature-retirement-heatmap table", + ".signature-retirement-heatmap th", + ".signature-retirement-heatmap td", + ".signature-retirement-heatmap th:first-child", + ".signature-retirement-heatmap tbody th", + ".signature-retirement-heatmap__identity", + ".signature-retirement-heatmap__identity strong", + ".signature-retirement-heatmap__identity small", + ".signature-retirement-heatmap td.is-zero", + ".signature-retirement-heatmap td.is-inapplicable", + ".signature-retirement-heatmap td.is-rate-red", + ".signature-retirement-heatmap td.is-rate-orange", + ".signature-retirement-heatmap td.is-rate-yellow", + ".signature-retirement-heatmap td.is-rate-blue", + ".signature-retirement-heatmap td.is-rate-green", + ".signature-retirement-heatmap td.is-rate-deep-green", + ".ui-table__long-text", + ".signature-retirement-message-card", + ".signature-retirement-message-filter", + ".signature-retirement-message-filter__actions", + ".signature-retirement-suppression-modes", + ".signature-retirement-suppression-modes label", + ".signature-retirement-suppression-modes label.is-selected", + ".signature-retirement-suppression-modes input", + ".signature-retirement-suppression-modes span", + ".signature-retirement-suppression-modes small", + ".signature-quality-card__heading", + ".signature-quality-card__heading h2", + ".signature-quality-section h3", + ".signature-quality-card__heading p", + ".signature-quality-section__heading p", + ".section-heading__title", + ".signature-quality-card__query", + ".signature-quality-card__query .ui-field", + ".signature-quality-card__note", + ".signature-quality-card .ui-table-wrap", + ".signature-quality-card > .ui-pagination", + ".signature-quality-name", + ".signature-quality-name strong", + ".signature-quality-name span", + ".signature-quality-name small", + ".quality-number--success", + ".quality-number--warning", + ".quality-number--danger", + ".signature-quality-rate", + ".signature-quality-rate > div", + ".signature-quality-rate > div span", + ".signature-quality-rate strong", + ".signature-quality-drawer__backdrop", + ".signature-quality-drawer", + "from", + "to", + ".signature-quality-drawer__header", + ".signature-quality-drawer__header p", + ".signature-quality-drawer__header h2", + ".signature-quality-drawer__header span", + ".signature-quality-drawer__header > button", + ".signature-quality-drawer__header > button:hover", + ".signature-quality-drawer__body", + ".signature-quality-overview", + ".signature-quality-metric", + ".signature-quality-metric span", + ".signature-quality-metric strong", + ".signature-quality-metric--success strong", + ".signature-quality-metric--warning strong", + ".signature-quality-metric--danger strong", + ".signature-quality-section", + ".signature-quality-section__heading", + ".signature-quality-section__heading p", + ".signature-carrier-grid", + ".signature-carrier-card", + ".signature-carrier-card > div", + ".signature-carrier-card > div strong", + ".signature-carrier-card dl", + ".signature-carrier-card dl div", + ".signature-carrier-card dt", + ".signature-carrier-card dd", + ".signature-quality-matrix", + ".signature-quality-matrix table", + ".signature-quality-matrix th", + ".signature-quality-matrix td", + ".signature-quality-matrix th:last-child", + ".signature-quality-matrix td:last-child", + ".signature-quality-matrix tr:last-child th", + ".signature-quality-matrix tr:last-child td", + ".signature-quality-matrix thead th", + ".signature-quality-matrix tbody th", + ".signature-quality-matrix__metric", + ".signature-quality-matrix__metric--success", + ".signature-quality-matrix__metric--warning", + ".signature-quality-matrix__metric--danger", + ".signature-quality-matrix__metric > div", + ".signature-quality-matrix__metric strong", + ".signature-quality-matrix__metric small", + ".signature-quality-matrix__metric em", + ".signature-quality-matrix__drainage-label", + ".signature-quality-matrix__rate", + ".signature-quality-matrix__empty", + ".signature-quality-matrix__zero", + ".signature-quality-drawer__footnote", + ".signature-retirement-message-filter", + ".signature-retirement-suppression-modes", + ".signature-retirement-heatmap__heading", + ".signature-retirement-heatmap__actions", + ".signature-retirement-heatmap__actions .ui-field", + ".signature-quality-card__heading", + ".signature-quality-card__query", + ".signature-quality-card__query", + ".signature-quality-drawer", + ".signature-quality-overview", + ".signature-carrier-grid", + ".signature-quality-drawer__header", + ".signature-quality-drawer__body", + ".signature-quality-overview", + ".signature-carrier-grid" + ] + }, + { + "file": "src/styles/domains/11-deliveries-reporting.css", + "owner": "downstream delivery, report tasks and MMS operations", + "sourceNodeRange": [ + 1269, + 1350 + ], + "sha256": "e89c3787f5d5cf405652ab47e0cab0f861c078da6f3e34b69b03bef9f8f22478", + "rules": 83, + "selectors": 104, + "declarations": 269, + "important": 5, + "selectorList": [ + ".downstream-delivery-toolbar", + ".downstream-delivery-toolbar p", + ".downstream-delivery-toolbar p strong", + ".downstream-requeue-confirm", + ".downstream-requeue-result", + ".downstream-requeue-confirm", + ".downstream-requeue-confirm > div", + ".downstream-requeue-result > div", + ".downstream-requeue-confirm p", + ".downstream-requeue-confirm small", + ".downstream-requeue-confirm strong", + ".downstream-requeue-result p", + ".downstream-requeue-result small", + ".downstream-requeue-confirm strong", + ".downstream-requeue-result--success", + ".downstream-requeue-result--partial", + ".downstream-requeue-result--failed", + ".downstream-requeue-result p", + ".downstream-requeue-result li", + ".downstream-requeue-result ul", + ".downstream-delivery-toolbar > div", + ".downstream-delivery-list__actions", + ".downstream-delivery-list", + ".downstream-delivery-list__header", + ".downstream-delivery-list__row", + ".downstream-delivery-list__header", + ".downstream-delivery-list__row", + ".downstream-delivery-list__row:first-of-type", + ".downstream-delivery-list__row:hover", + ".downstream-delivery-list__select", + ".downstream-delivery-list__retry", + ".downstream-delivery-list__meta", + ".downstream-delivery-list__owner", + ".downstream-delivery-list__retry", + ".downstream-delivery-list__meta strong", + ".downstream-delivery-list__owner strong", + ".downstream-delivery-list__retry strong", + ".downstream-delivery-list__meta span", + ".downstream-delivery-list__owner span", + ".downstream-delivery-list__retry span", + ".downstream-delivery-list__message strong", + ".downstream-delivery-list__error", + ".downstream-delivery-list__error.is-empty", + ".downstream-delivery-list__actions", + ".downstream-delivery-list__empty", + ".downstream-delivery-toolbar", + ".downstream-delivery-toolbar > div", + ".report-page-actions", + ".report-task-time", + ".report-task-time span", + ".admin-remark-cell", + ".admin-remark-cell--empty", + ".report-task-generate", + ".report-task-generate section", + ".report-task-detail .admin-task-card", + ".report-task-generate h3", + ".report-receipt-preview h3", + ".report-task-preview", + ".report-task-preview > div", + ".report-receipt-preview > div", + ".report-task-preview span", + ".report-receipt-preview span", + ".report-task-preview strong", + ".report-receipt-preview strong", + ".report-receipt-modal", + ".report-receipt-modal .ui-field", + ".report-upload-drop", + ".report-upload-drop svg", + ".report-upload-drop strong", + ".report-upload-drop span", + ".report-receipt-preview", + ".admin-app-route-card > .ui-field", + ".downstream-attempt-timeline", + ".downstream-attempt-timeline::before", + ".downstream-attempt-card", + ".downstream-attempt-marker", + ".downstream-attempt-marker--success", + ".downstream-attempt-marker--danger", + ".downstream-attempt-marker--info", + ".downstream-attempt-card__body", + ".downstream-attempt-card__body > header", + ".downstream-attempt-card dl", + ".downstream-attempt-card dl > div", + ".downstream-attempt-card dt", + ".downstream-attempt-card dd", + ".downstream-attempt-card__identifiers dd", + ".downstream-attempt-result", + ".downstream-attempt-result--error", + ".downstream-attempt-timeline > p", + ".admin-mms-task-page .page-heading", + ".admin-mms-task-table-card .ui-table", + ".admin-mms-task-table-card .ui-table-wrap", + ".admin-mms-task-table-card", + ".admin-mms-task-table-card .mms-task-content", + ".admin-mms-task-table-card .mms-task-content p", + ".admin-mms-task-table-card .mms-task-actions", + ".admin-mms-task-table-card .mms-task-actions .ui-button", + ".admin-mms-task-detail .mms-detail-template small", + ".admin-mms-city-list", + ".admin-mms-city-list > div", + ".admin-mms-city-list strong", + ".admin-mms-city-list span", + ".admin-mms-city-list b", + ".admin-mms-city-list .ui-progress-bar" + ] + }, + { + "file": "src/styles/domains/12-admin-configuration.css", + "owner": "uplink, billing, users, phone segments and report field library", + "sourceNodeRange": [ + 1351, + 1515 + ], + "sha256": "c140c2bd917682d4a3bcf370b945bd08a7a100979d2553a9bbe64a59e80d3dc9", + "rules": 175, + "selectors": 195, + "declarations": 516, + "important": 1, + "selectorList": [ + ".admin-mms-record-search-button", + ".admin-mms-record-search-button:hover", + ".admin-mms-record-table", + ".admin-mms-record-table td", + ".admin-mms-template-cell", + ".admin-mms-template-cell strong", + ".admin-mms-template-cell span", + ".admin-mms-template-cell small", + ".admin-mms-preview-link", + ".admin-uplink-page .page-heading", + ".admin-uplink-filter", + ".admin-uplink-filter__actions", + ".admin-uplink-table-card", + ".admin-uplink-table-card .ui-table-wrap", + ".admin-uplink-table-card .ui-table", + ".admin-uplink-table-card .uplink-content", + ".admin-uplink-table-card .ui-table td strong", + ".gateway-exception-list-heading", + ".gateway-exception-list-heading > div", + ".gateway-exception-list-heading h2", + ".gateway-exception-list-heading p", + ".gateway-exception-page .report-task-table-card > .ui-pagination", + ".downstream-attempt-card dl", + ".downstream-attempt-result", + ".admin-uplink-table-card .ui-table th", + ".admin-uplink-table-card .ui-table td", + ".admin-uplink-checkbox", + ".admin-uplink-detail-link", + ".admin-uplink-detail", + ".admin-uplink-info-card", + ".admin-uplink-match-card", + ".admin-uplink-info-card h3", + ".admin-uplink-match-section h3", + ".admin-uplink-info-grid", + ".admin-uplink-info-grid div", + ".admin-uplink-info-grid__full", + ".admin-uplink-info-grid span", + ".admin-uplink-match-section > p", + ".admin-uplink-match-grid span", + ".admin-uplink-match-content span", + ".admin-uplink-info-grid strong", + ".admin-uplink-match-grid strong", + ".admin-uplink-match-section > p", + ".admin-uplink-match-grid", + ".admin-uplink-match-grid div", + ".admin-uplink-match-content", + ".admin-uplink-match-content", + ".admin-uplink-match-content p", + ".admin-uplink-candidate-footer", + ".admin-uplink-candidate-footer span", + ".admin-recharge-page .page-heading", + ".admin-recharge-filter", + ".admin-recharge-filter__actions", + ".admin-recharge-table-card", + ".admin-recharge-table-card .ui-table-wrap", + ".admin-recharge-table", + ".admin-recharge-table th", + ".admin-recharge-table td", + ".admin-recharge-table td:nth-child(3)", + ".admin-recharge-table td:nth-child(4)", + ".recharge-receipt-modal .ui-modal__header", + ".recharge-receipt-modal .ui-modal__footer", + ".recharge-receipt-modal .ui-modal__body", + ".recharge-receipt", + ".recharge-receipt::before", + ".recharge-receipt__header", + ".recharge-receipt__logo", + ".recharge-receipt__header > span", + ".recharge-receipt__header .is-posted", + ".recharge-receipt__header .is-correction", + ".recharge-receipt__amount", + ".recharge-receipt__amount > span", + ".recharge-receipt__enterprise > span", + ".recharge-receipt__remark > span", + ".recharge-receipt__amount strong", + ".recharge-receipt__amount small", + ".recharge-receipt__enterprise", + ".recharge-receipt__enterprise strong", + ".recharge-receipt__enterprise small", + ".recharge-receipt__details", + ".recharge-receipt__details > div", + ".recharge-receipt__details > div:nth-child(even)", + ".recharge-receipt__details dt", + ".recharge-receipt__details dd", + ".recharge-receipt__remark", + ".recharge-receipt__remark p", + ".recharge-receipt__note", + ".recharge-receipt--correction .recharge-receipt__amount", + ".recharge-receipt--correction .recharge-receipt__amount strong", + ".recharge-receipt__header", + ".recharge-receipt__enterprise", + ".recharge-receipt__remark", + ".recharge-receipt__logo", + ".recharge-receipt__details", + ".recharge-receipt__details > div", + ".recharge-receipt__details > div:last-child", + ".recharge-receipt__details > div:nth-child(even)", + ".manual-recharge-review", + ".manual-recharge-result", + ".manual-recharge-review > p", + ".manual-recharge-review dl", + ".manual-recharge-review dl > div", + ".manual-recharge-review dl > div:last-child", + ".manual-recharge-review dt", + ".manual-recharge-review dd", + ".manual-recharge-review dd span", + ".manual-recharge-review .is-positive", + ".manual-recharge-review .is-negative", + ".manual-recharge-review__remark", + ".manual-recharge-result", + ".manual-recharge-result > strong", + ".manual-recharge-review dl > div", + ".manual-recharge-review dd", + ".admin-recharge-pagination", + ".admin-recharge-pagination > label", + ".admin-recharge-pagination > div", + ".admin-recharge-pagination .ui-button--primary", + ".admin-recharge-pagination span", + ".phone-segment-tabs .ui-tabs__list", + ".phone-segment-tabs .ui-tabs__tab", + ".admin-user-toolbar", + ".admin-user-filter-grid", + ".admin-user-toolbar > .ui-button", + ".phone-segment-workbench", + ".phone-segment-heading", + ".phone-segment-summary__icon", + ".phone-segment-heading > p", + ".phone-segment-panel", + ".phone-segment-query", + ".phone-segment-query__actions", + ".phone-segment-workbench__tabs", + ".phone-segment-workbench__tabs .ui-tabs__list", + ".phone-segment-workbench__tabs .ui-tabs__tab", + ".phone-segment-tab-content", + ".phone-segment-summary", + ".phone-segment-summary__icon", + ".phone-segment-summary__value", + ".phone-segment-summary__value > span", + ".phone-segment-summary__value strong", + ".phone-segment-summary p", + ".phone-segment-tab-content > .phone-segment-query", + ".phone-segment-prefix", + ".phone-segment-delete", + ".phone-segment-delete:hover:not(:disabled)", + ".phone-segment-panel .ui-pagination", + ".phone-segment-panel .ui-table", + ".admin-drainage-actions", + ".admin-drainage-toolbar", + ".admin-drainage-page .page-heading > div > p", + ".admin-drainage-summary", + ".admin-drainage-summary article", + ".admin-drainage-summary article > span", + ".admin-drainage-summary strong", + ".admin-drainage-summary p", + ".admin-drainage-section", + ".admin-drainage-section__heading", + ".admin-drainage-section__heading h2", + ".admin-drainage-section__heading p", + ".admin-drainage-common-grid", + ".admin-drainage-common-group", + ".admin-drainage-common-group__title", + ".admin-drainage-common-group__title > span", + ".admin-drainage-common-empty", + ".admin-drainage-common-list", + ".admin-drainage-common-list > div", + ".admin-drainage-common-list strong", + ".admin-drainage-common-list span", + ".admin-drainage-common-list span", + ".admin-drainage-common-order", + ".admin-drainage-field-grid", + ".admin-drainage-field-card", + ".admin-drainage-field-card:hover", + ".admin-drainage-field-card__actions", + ".admin-drainage-field-card__top", + ".admin-drainage-field-card h3", + ".admin-drainage-field-card code", + ".admin-drainage-field-card > p", + ".admin-drainage-field-card__meta", + ".admin-drainage-field-card__meta strong", + ".admin-drainage-empty", + ".admin-drainage-type", + ".admin-drainage-summary", + ".admin-drainage-common-grid", + ".admin-drainage-toolbar", + ".admin-drainage-section__heading", + ".admin-user-toolbar", + ".admin-drainage-actions .ui-button--ghost", + ".admin-drainage-pagination", + ".admin-drainage-pagination span", + ".file-actions", + ".file-action-link", + ".file-action-preview.ui-button", + ".file-action-link:hover", + ".file-action-preview.ui-button:hover", + ".file-preview-image" + ] + }, + { + "file": "src/styles/domains/13-client-signatures.css", + "owner": "client signature and drainage materials", + "sourceNodeRange": [ + 1516, + 1563 + ], + "sha256": "40a39dcc7fb693003661f1b1a251f2badba228cc2ef0c7d05752c730c27be449", + "rules": 74, + "selectors": 113, + "declarations": 223, + "important": 0, + "selectorList": [ + ".client-signature-page", + ".client-signature-heading", + ".client-signature-title", + ".client-drainage-panel__head", + ".client-signature-title", + ".client-signature-title__icon", + ".client-signature-title h1", + ".client-signature-title p", + ".client-drainage-panel h3", + ".client-drainage-panel p", + ".client-signature-form-section h3", + ".client-signature-form-section p", + ".client-signature-title h1", + ".client-signature-title p", + ".client-drainage-panel p", + ".client-signature-form-section p", + ".client-signature-overview", + ".client-signature-overview > div", + ".client-signature-overview > div + div::before", + ".client-signature-overview span", + ".client-signature-overview strong", + ".client-signature-toolbar", + ".client-signature-list-shell", + ".client-signature-list-head", + ".client-signature-list-row", + ".client-signature-list-head", + ".client-signature-row-wrap", + ".client-signature-row-wrap + .client-signature-row-wrap", + ".client-signature-list-row", + ".client-signature-list-row > span", + ".client-signature-list-row > strong", + ".client-signature-expand", + ".client-signature-expand:hover", + ".client-carrier-status-group", + ".client-carrier-status", + ".client-carrier-status strong", + ".client-carrier-status__dot", + ".client-carrier-status--available", + ".client-carrier-status--available strong", + ".client-carrier-status--available .client-carrier-status__dot", + ".client-signature-inline-reason", + ".client-signature-reason", + ".client-drainage-reason", + ".client-signature-inline-reason", + ".client-signature-reason", + ".client-drainage-panel", + ".client-drainage-panel__head", + ".client-drainage-panel h3", + ".client-drainage-table", + ".client-drainage-table__head", + ".client-drainage-table__row", + ".client-drainage-table__head", + ".client-drainage-table__row", + ".client-drainage-target", + ".client-drainage-reason", + ".client-signature-list-empty", + ".client-signature-empty-hint", + ".client-signature-form-section", + ".client-signature-form-section .client-signature-empty-hint", + ".client-signature-list-shell", + ".enterprise-flow-card", + ".enterprise-stepper", + ".enterprise-stepper__item", + ".enterprise-stepper__dot", + ".enterprise-stepper__arrow", + ".enterprise-form-panel", + ".enterprise-upload", + ".enterprise-upload", + ".enterprise-upload strong", + ".enterprise-upload .file-actions", + ".enterprise-address-selects > div", + ".enterprise-address-selects .ui-field", + ".client-signature-heading", + ".client-drainage-panel__head", + ".client-signature-overview", + ".client-signature-overview > div:nth-child(3)::before", + ".client-signature-toolbar", + ".client-drainage-panel", + ".overview-hero", + ".dashboard-grid", + ".content-grid", + ".plan-grid", + ".chart-grid", + ".overview-grid", + ".overview-grid--three", + ".quick-grid", + ".sms-send-layout", + ".send-form-row", + ".sms-preview-card", + ".receiver-table__head", + ".receiver-table__row", + ".batch-filter-grid", + ".batch-pagination", + ".task-info-grid", + ".task-stat-grid", + ".carrier-rate-grid", + ".sms-app-grid", + ".template-card-grid", + ".template-toolbar", + ".template-custom-variable", + ".task-detail-title h2", + ".admin-uplink-filter", + ".admin-recharge-filter", + ".admin-recharge-filter__actions", + ".phone-segment-overview", + ".phone-segment-tabs", + ".admin-drainage-toolbar", + ".channel-route-card-grid", + ".detail-grid", + ".admin-mms-city-list > div", + ".admin-uplink-info-grid", + ".admin-uplink-match-grid", + ".admin-recharge-pagination" + ] + }, + { + "file": "src/styles/domains/14-responsive-requeue.css", + "owner": "shared responsive rules and downstream requeue workbench", + "sourceNodeRange": [ + 1564, + 1616 + ], + "sha256": "bba21747cf909098a0bca7888d6497dab97e4488a9b73360790cd5a263791f18", + "rules": 122, + "selectors": 174, + "declarations": 332, + "important": 2, + "selectorList": [ + ".client-http-credential-row", + ".client-http-credential-row code", + ".admin-report-target-row", + ".login-page", + ".login-panel", + ".login-brand", + ".login-captcha-row", + ".admin-dashboard-main-grid", + ".admin-metric-grid", + ".admin-workload-grid", + ".enterprise-summary-grid", + ".enterprise-query-grid", + ".system-log-filters", + ".channel-report-filter-grid", + ".channel-group-filter", + ".channel-group-config-item", + ".channel-group-base-form", + ".channel-group-retry-limit", + ".report-receipt-modal", + ".phone-segment-query", + ".client-http-credential-row", + ".admin-report-target-row", + ".admin-app-form-grid", + ".admin-app-route-grid", + ".admin-app-protocol-header", + ".admin-app-protocol-header > .admin-switch", + ".admin-metric-grid", + ".enterprise-summary-grid", + ".admin-workload-grid", + ".enterprise-query-actions", + ".phone-segment-query__actions", + ".enterprise-query-actions .ui-button", + ".phone-segment-query__actions .ui-button", + ".channel-report-page", + ".channel-group-form-page", + ".channel-report-heading", + ".channel-report-filter-footer", + ".channel-report-config-actions", + ".channel-report-filter-footer > div", + ".channel-report-table", + ".channel-report-table__head", + ".channel-report-row", + ".channel-report-row > :first-child", + ".channel-report-name--flow", + ".channel-report-row > :nth-child(3)", + ".channel-report-row > :nth-child(4)", + ".channel-report-row > :nth-child(5)", + ".channel-report-row > :nth-child(6)", + ".channel-report-row > :nth-child(3)::before", + ".channel-report-row > :nth-child(4)::before", + ".channel-report-row > :nth-child(5)::before", + ".channel-report-row > :nth-child(6)::before", + ".channel-report-stats", + ".channel-report-actions", + ".channel-signature-grid", + ".channel-status-options", + ".channel-group-base-form > .ui-field", + ".channel-group-retry-limit", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-radio-row", + ".channel-group-switch-row", + ".channel-group-filter__actions", + ".channel-group-config-item__actions", + ".channel-group-row-actions", + ".channel-group-config-item__metrics", + ".channel-group-retry-limit > span", + ".channel-group-retry-limit small", + ".phone-segment-tab-content > .phone-segment-query", + ".phone-segment-heading > p", + ".phone-segment-workbench__tabs .ui-tabs__list", + ".phone-segment-workbench__tabs .ui-tabs__tab", + ".phone-segment-summary", + ".phone-segment-summary__icon", + ".phone-segment-summary__value", + ".phone-segment-summary__value strong", + ".phone-segment-summary p", + ".phone-segment-panel .ui-table tbody", + ".phone-segment-panel .ui-pagination", + ".sms-bulk-actions", + ".sms-audit-toolbar", + ".client-signature-list-shell", + ".client-signature-list-head", + ".client-drainage-table__head", + ".client-signature-row-wrap", + ".client-signature-row-wrap + .client-signature-row-wrap", + ".client-signature-list-row", + ".client-signature-list-row > :nth-child(n + 3):nth-child(-n + 7)", + ".client-signature-list-row > :nth-child(3)::before", + ".client-signature-list-row > :nth-child(4)::before", + ".client-signature-list-row > :nth-child(5)::before", + ".client-signature-list-row > :nth-child(6)::before", + ".client-signature-list-row > :nth-child(7)::before", + ".client-signature-list-row > .table-actions", + ".client-signature-inline-reason", + ".client-drainage-panel", + ".client-drainage-table", + ".client-drainage-table__row", + ".client-drainage-table__row > *", + ".client-drainage-table__row > a", + ".client-drainage-reason", + ".login-captcha-row", + ".admin-metric-grid", + ".enterprise-summary-grid", + ".admin-workload-grid", + ".channel-report-config-actions", + ".channel-report-filter-footer > div", + ".enterprise-query-actions", + ".phone-segment-query__actions", + ".application-unit-price", + ".downstream-page-size", + ".downstream-page-size select", + ".downstream-requeue-task-heading", + ".downstream-requeue-task-card > .downstream-requeue-task-heading", + ".downstream-requeue-task-heading__actions", + ".downstream-requeue-task-heading__actions .ui-field", + ".downstream-requeue-task-list", + ".downstream-requeue-task-list article", + ".downstream-requeue-task-list article:last-of-type", + ".downstream-requeue-task-list > .muted", + ".downstream-requeue-task-card > .ui-pagination", + ".downstream-requeue-task-list article > div", + ".downstream-requeue-task-list__identity", + ".downstream-requeue-task-list__scope", + ".downstream-requeue-task-list__progress", + ".downstream-requeue-task-list__identity > strong", + ".downstream-requeue-task-list__identity > span", + ".downstream-requeue-task-list__identity > small", + ".downstream-requeue-task-list__scope > span", + ".downstream-requeue-task-list__progress > small", + ".downstream-requeue-task-list__scope > strong", + ".downstream-requeue-task-list__progress > div:first-child", + ".downstream-requeue-task-list__meter", + ".downstream-requeue-task-list__meter > span", + ".downstream-requeue-task-list__actions", + ".downstream-requeue-preview", + ".downstream-requeue-preview__summary", + ".downstream-requeue-preview__summary > div", + ".downstream-requeue-preview__summary > div.is-primary", + ".downstream-requeue-preview__summary span", + ".downstream-requeue-preview__summary small", + ".downstream-requeue-preview__summary strong", + ".downstream-requeue-preview__meta", + ".downstream-requeue-preview__distribution", + ".downstream-requeue-preview__distribution > span", + ".downstream-requeue-preview__distribution > div", + ".downstream-requeue-reason", + ".downstream-requeue-reason .ui-textarea", + ".downstream-requeue-warning", + ".downstream-requeue-warning > div", + ".downstream-requeue-warning p", + ".downstream-requeue-task-detail", + ".downstream-requeue-detail-alert", + ".downstream-requeue-detail-section", + ".downstream-requeue-detail-filter", + ".downstream-requeue-detail-items", + ".downstream-requeue-detail-items > div", + ".downstream-requeue-detail-items > div:first-child", + ".downstream-requeue-detail-items__head", + ".downstream-requeue-detail-items time", + ".downstream-requeue-task-list article", + ".downstream-requeue-task-list__actions", + ".downstream-requeue-preview__summary", + ".downstream-requeue-task-card > .downstream-requeue-task-heading", + ".downstream-requeue-task-heading", + ".downstream-requeue-task-heading__actions", + ".downstream-requeue-task-list", + ".downstream-requeue-task-list article", + ".downstream-requeue-preview__summary", + ".downstream-requeue-detail-filter", + ".downstream-requeue-task-card > .ui-pagination", + ".downstream-requeue-detail-items", + ".downstream-requeue-detail-items__head", + ".downstream-requeue-detail-items > div" + ] + } + ], + "allowedGlobalFiles": [ + "src/styles/tokens.css", + "src/styles/reset.css", + "src/styles/shell.css", + "src/styles/admin.css", + "src/styles/client.css", + "src/styles/components.css" + ], + "exceptions": [] +} diff --git a/tools/quality/run-changed-code-quality.mjs b/tools/quality/run-changed-code-quality.mjs index d3f2aa3..1c97a7f 100644 --- a/tools/quality/run-changed-code-quality.mjs +++ b/tools/quality/run-changed-code-quality.mjs @@ -12,7 +12,7 @@ const tracked = execFileSync('git', ['diff', '--name-only', '--diff-filter=ACMR' }); const untracked = execFileSync('git', ['ls-files', '--others', '--exclude-standard'], { cwd: root, encoding: 'utf8' }); const files = [...new Set(`${tracked}\n${untracked}`.split(/\r?\n/).filter(Boolean))].filter((file) => - /^(?:src|api\/src|tools)\/.+\.(?:[cm]?[jt]sx?)$/.test(file), + /^(?:src|api\/src|tools)\/.+\.(?:[cm]?[jt]sx?|css)$/.test(file), ); if (!files.length) { @@ -20,12 +20,15 @@ if (!files.length) { process.exit(0); } -const executable = - process.platform === 'win32' - ? `${mode === 'lint' ? 'eslint' : 'prettier'}.cmd` - : mode === 'lint' - ? 'eslint' - : 'prettier'; -const args = mode === 'lint' ? files : ['--check', ...files]; -const result = spawnSync(resolve(root, 'node_modules/.bin', executable), args, { cwd: root, stdio: 'inherit' }); +const args = mode === 'lint' ? files.filter((file) => !file.endsWith('.css')) : ['--check', ...files]; +if (mode === 'lint' && !args.length) { + console.log('No changed code files require lint.'); + process.exit(0); +} +const executable = process.execPath; +const moduleEntry = resolve( + root, + mode === 'lint' ? 'node_modules/eslint/bin/eslint.js' : 'node_modules/prettier/bin/prettier.cjs', +); +const result = spawnSync(executable, [moduleEntry, ...args], { cwd: root, stdio: 'inherit' }); process.exit(result.status ?? 1); diff --git a/tools/quality/verify-css-governance.mjs b/tools/quality/verify-css-governance.mjs new file mode 100644 index 0000000..5cb10d9 --- /dev/null +++ b/tools/quality/verify-css-governance.mjs @@ -0,0 +1,157 @@ +import crypto from 'node:crypto'; +import fs from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; +import { execFileSync } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import postcss from 'postcss'; + +const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..'); + +export function analyzeCss(css) { + const ast = postcss.parse(css); + const result = { rules: 0, selectors: 0, declarations: 0, important: 0, selectorList: [] }; + ast.walkRules((rule) => { + result.rules += 1; + const selectors = rule.selectors ?? [rule.selector]; + result.selectors += selectors.length; + result.selectorList.push(...selectors); + }); + ast.walkDecls((declaration) => { + result.declarations += 1; + if (declaration.important) result.important += 1; + }); + return result; +} + +export function broadBusinessSelectors(css) { + const findings = []; + postcss.parse(css).walkRules((rule) => { + for (const selector of rule.selectors ?? [rule.selector]) { + if (/^(?:div|section|article|button|table|input|select|textarea)(?:\b|[ >+~:[.#])/.test(selector.trim())) { + findings.push(selector); + } + } + }); + return findings; +} + +export function verifyGlobalCssAbsent(repoRoot) { + const legacy = path.join(repoRoot, 'src/styles/global.css'); + if (fs.existsSync(legacy)) throw new Error('src/styles/global.css 已完成迁移,禁止重新创建'); +} + +function read(relativePath) { + return fs.readFileSync(path.join(root, relativePath), 'utf8'); +} + +function currentCssFiles(directory) { + return fs.readdirSync(directory, { withFileTypes: true }).flatMap((entry) => { + const target = path.join(directory, entry.name); + return entry.isDirectory() ? currentCssFiles(target) : entry.name.endsWith('.css') ? [target] : []; + }); +} + +function changedCssFiles() { + const configuredBase = process.env.QUALITY_BASE_REF; + let base = configuredBase || 'HEAD'; + if (!configuredBase) { + try { + base = + execFileSync('git', ['merge-base', 'origin/main', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim() || 'HEAD'; + } catch { + base = 'HEAD'; + } + } + const tracked = execFileSync('git', ['diff', '--name-only', '--diff-filter=ACMR', base, '--', '*.css'], { + cwd: root, + encoding: 'utf8', + }); + const untracked = execFileSync('git', ['ls-files', '--others', '--exclude-standard', '--', '*.css'], { + cwd: root, + encoding: 'utf8', + }); + return { base, files: [...new Set(`${tracked}\n${untracked}`.split(/\r?\n/).filter(Boolean))] }; +} + +function baseCss(base, file) { + try { + return execFileSync('git', ['show', `${base}:${file}`], { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }); + } catch { + return ''; + } +} + +function verify() { + verifyGlobalCssAbsent(root); + const baseline = JSON.parse(read('tools/quality/css-governance-baseline.json')); + const entry = read(baseline.entry); + const imports = [...entry.matchAll(/@import\s+['"](.+?)['"]/g)].map((match) => + path.posix.join(path.posix.dirname(baseline.entry), match[1]).replace(/\\/g, '/'), + ); + if (JSON.stringify(imports) !== JSON.stringify(baseline.importOrder)) { + throw new Error('业务样式入口顺序与治理基线不一致,可能改变级联结果'); + } + + const totals = { rules: 0, selectors: 0, declarations: 0, important: 0 }; + const selectorList = []; + for (const module of baseline.modules) { + const css = read(module.file); + const metrics = analyzeCss(css); + for (const key of Object.keys(totals)) totals[key] += metrics[key]; + selectorList.push(...metrics.selectorList); + if (metrics.important > module.important) { + throw new Error(`${module.file} 新增了未登记的 !important`); + } + } + for (const key of Object.keys(totals)) { + if (totals[key] !== baseline.legacySource[key]) { + throw new Error(`迁移后 CSS ${key}=${totals[key]},与原 global.css 基线 ${baseline.legacySource[key]} 不一致`); + } + } + if (JSON.stringify(selectorList) !== JSON.stringify(baseline.legacySource.selectorList)) { + throw new Error('迁移后选择器及顺序与原 global.css 基线不一致'); + } + + const changes = changedCssFiles(); + const migratedFiles = new Set(baseline.modules.map((item) => item.file)); + for (const file of changes.files) { + if (migratedFiles.has(file) || !fs.existsSync(path.join(root, file))) continue; + const current = read(file); + const previous = baseCss(changes.base, file); + const oldBroad = new Set(broadBusinessSelectors(previous)); + const newBroad = broadBusinessSelectors(current).filter((selector) => !oldBroad.has(selector)); + if (newBroad.length) throw new Error(`${file} 新增宽泛业务标签选择器:${newBroad.join(', ')}`); + if (analyzeCss(current).important > analyzeCss(previous).important) { + throw new Error(`${file} 新增了未登记的 !important`); + } + } + + const sourceText = currentCssFiles(path.join(root, 'src')) + .map((file) => fs.readFileSync(file, 'utf8')) + .join('\n'); + const codeText = fs + .readdirSync(path.join(root, 'src'), { recursive: true }) + .filter((name) => /\.(?:ts|tsx)$/.test(String(name))) + .map((name) => fs.readFileSync(path.join(root, 'src', String(name)), 'utf8')) + .join('\n'); + for (const file of currentCssFiles(path.join(root, 'src'))) { + const relative = path.relative(path.join(root, 'src'), file).replace(/\\/g, '/'); + if (relative === 'styles/tokens.css' || relative === 'styles/reset.css') continue; + if (!sourceText.includes(path.basename(file)) && !codeText.includes(path.basename(file))) { + throw new Error(`${relative} 没有明确 import 所有者`); + } + } + + const duplicateCount = selectorList.length - new Set(selectorList).size; + const digest = crypto.createHash('sha256').update(selectorList.join('\n')).digest('hex').slice(0, 12); + console.log( + `CSS governance verified: ${totals.rules} rules, ${totals.selectors} selectors, ${totals.declarations} declarations, ${duplicateCount} duplicate selector occurrences, order ${digest}; ${changes.files.length} changed CSS files checked from ${changes.base}.`, + ); +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) verify(); diff --git a/tools/quality/verify-css-governance.test.mjs b/tools/quality/verify-css-governance.test.mjs new file mode 100644 index 0000000..b531857 --- /dev/null +++ b/tools/quality/verify-css-governance.test.mjs @@ -0,0 +1,33 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; +import { analyzeCss, broadBusinessSelectors, verifyGlobalCssAbsent } from './verify-css-governance.mjs'; + +test('AST metrics ignore formatting and count selectors and important declarations', () => { + assert.deepEqual(analyzeCss('.page { color: red !important; }\n.page a, .page button { display: block; }'), { + rules: 2, + selectors: 3, + declarations: 2, + important: 1, + selectorList: ['.page', '.page a', '.page button'], + }); +}); + +test('broad business tag selectors are rejected while rooted selectors are allowed', () => { + assert.deepEqual(broadBusinessSelectors('button { color: red; } .report-page button { color: blue; }'), ['button']); +}); + +test('formatting changes do not affect AST growth metrics', () => { + assert.deepEqual(analyzeCss('.page{color:red}'), analyzeCss('.page {\n color: red;\n}\n')); +}); + +test('global.css cannot be recreated after migration', () => { + const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'cmpp-css-gate-')); + fs.mkdirSync(path.join(directory, 'src/styles'), { recursive: true }); + assert.doesNotThrow(() => verifyGlobalCssAbsent(directory)); + fs.writeFileSync(path.join(directory, 'src/styles/global.css'), '.new-page {}'); + assert.throws(() => verifyGlobalCssAbsent(directory), /禁止重新创建/); + fs.rmSync(directory, { recursive: true, force: true }); +});