Commit e31e7c18 authored by Andy-bubu's avatar Andy-bubu

feat: refine xinyuan brand and chart palette

parent 0e656687
...@@ -46,10 +46,10 @@ ...@@ -46,10 +46,10 @@
已移除活动源码中的 `src/catalyst-ui-kit`、Headless UI ApplicationSwitcher、旧 `FormSelect` DOM API、旧 Table 兼容解析和页容量 Select。业务列表与只读 Excel 导入预览均使用 HeroUI Pro DataGrid。 已移除活动源码中的 `src/catalyst-ui-kit`、Headless UI ApplicationSwitcher、旧 `FormSelect` DOM API、旧 Table 兼容解析和页容量 Select。业务列表与只读 Excel 导入预览均使用 HeroUI Pro DataGrid。
Native HeroUI 静态架构门禁已通过:`src/xinyuan-portable.css` 已移除,业务图表统一保留并使用 ECharts 适配器,页面目录无私有 CSS/Less/SCSS;仅保留与确认基准逐字节一致的共享样式层。HeroUI 与 HeroUI Pro 的样式分别通过 `@heroui/styles/css` 和 `@heroui-pro/react/css` 显式加载;包根 `@heroui/styles` 是 JavaScript 样式工具入口,不能替代 CSS 入口。2026-08-26 已完成四视口、深浅主题、权限、通知和文件事务的运行态浏览器门禁。 Native HeroUI 静态架构门禁已通过:`src/xinyuan-portable.css` 已移除,业务图表统一保留并使用 ECharts 适配器,页面目录无私有 CSS/Less/SCSS;仅保留经确认的共享样式层。HeroUI 与 HeroUI Pro 的样式分别通过 `@heroui/styles/css` 和 `@heroui-pro/react/css` 显式加载;包根 `@heroui/styles` 是 JavaScript 样式工具入口,不能替代 CSS 入口。当前品牌主色固定为 `#DA241A`,HeroUI `accent/focus` 和 `primary-*` Token 不随浅深主题改变色相;图表 Token 按品牌红深浅、暖土色、中性灰紫和灰蓝分组,禁止绿色和荧光色。2026-08-26 已完成四视口、深浅主题、权限、通知和文件事务的运行态浏览器门禁。
# 共享 UI 架构补充 # 共享 UI 架构补充
`XinyuanEChart` 是图表唯一渲染适配器,页面仅提供业务数据和 ECharts option;适配器统一主题、Tooltip、坐标轴和 Pie 扇区样式。相同分类维度的多个数据项使用 `createResolvedXinyuanChartColorMap` 和 `XINYUAN_CHART_CATEGORY_PALETTE` 按稳定顺序分配颜色,标准顺序为红 → 粉 → 橙 → 黄 → 蓝 → 紫 → 青 → 中性灰;单一指标或多指标系列使用与“审计项目管理”一致的 `XINYUAN_CHART_SEMANTIC` 语义色,页面不得写入硬编码颜色,单一指标不得按柱子拆成多色。年度分布单系列柱图显示顶部真实数值,使用紧凑柱宽和规范圆角,单年份数据保持平衡。业务源码禁止直接导入 Recharts 或 HeroUI Pro 图表组件;`recharts` 依赖仅因当前 HeroUI Pro `KPI` 包的静态运行时解析而保留,不作为应用图表渲染器。`XinyuanModal` 统一使用 `bg-background` Dialog Surface。列表分页由 `DataTablePagination` 统一承载容量选择器与页码状态:容量使用 HeroUI Autocomplete 受控单选,标准选项为 `20 / 50 / 100 条/页`、默认值必须属于选项集合,固定少量选项时关闭 `showSearch` 与 `isClearable`,切换容量回到第 1 页。 `XinyuanEChart` 是图表唯一渲染适配器,页面仅提供业务数据和 ECharts option;适配器统一主题、Tooltip、坐标轴和 Pie 扇区样式。相同分类维度的多个数据项使用 `createResolvedXinyuanChartColorMap` 和 `XINYUAN_CHART_CATEGORY_PALETTE` 按稳定顺序分配颜色,顺序为品牌红深浅 → 暖土色 → 中性灰紫 → 灰蓝,禁止绿色、荧光色和彩虹式跳色;单一指标或多指标系列使用 `XINYUAN_CHART_SEMANTIC` 语义色,单系列固定使用 `#DA241A`,页面不得写入硬编码颜色。业务源码禁止直接导入 Recharts 或 HeroUI Pro 图表组件;`recharts` 依赖仅因当前 HeroUI Pro `KPI` 包的静态运行时解析而保留,不作为应用图表渲染器。`XinyuanModal` 统一使用 `bg-background` Dialog Surface。列表分页由 `DataTablePagination` 统一承载容量选择器与页码状态:容量使用 HeroUI Autocomplete 受控单选,标准选项为 `20 / 50 / 100 条/页`、默认值必须属于选项集合,固定少量选项时关闭 `showSearch` 与 `isClearable`,切换容量回到第 1 页。
驾驶舱模块标题沿用“审计项目管理”基准的 HeroUI `Card.Header` 左对齐横向结构;`Card.Title` 使用共享 `.rc-module-title`(16px/600、24px 行高、主题前景色)与 `min-w-0 flex-1 text-left`,操作或描述信息放在标题右侧,不通过页面私有 CSS 改写字号、颜色或字重。 驾驶舱模块标题沿用“审计项目管理”基准的 HeroUI `Card.Header` 左对齐横向结构;`Card.Title` 使用共享 `.rc-module-title`(16px/600、24px 行高、主题前景色)与 `min-w-0 flex-1 text-left`,操作或描述信息放在标题右侧,不通过页面私有 CSS 改写字号、颜色或字重。
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
- [x] 阅读 `record-api.md`、`subjectsDefinition.md` 和党风廉政业务流程 - [x] 阅读 `record-api.md`、`subjectsDefinition.md` 和党风廉政业务流程
- [x] 建立设计规范、审计、迁移清单和架构文档 - [x] 建立设计规范、审计、迁移清单和架构文档
- [x] 同步权威 HeroUI 主题与扩展 Tokens - [x] 同步权威 HeroUI 主题与扩展 Tokens
- [x] 品牌专项:HeroUI 主色固定为 `#DA241A`,Hover/Pressed 使用品牌红深色派生,图表与 KPI 使用低饱和暖/中性/灰蓝色板且不含绿色
- [x] 通过官方 `hpsetup` 安装并精确锁定 HeroUI Pro 1.0.0-beta.8,移除本地 `file:` 镜像 - [x] 通过官方 `hpsetup` 安装并精确锁定 HeroUI Pro 1.0.0-beta.8,移除本地 `file:` 镜像
- [x] 收敛应用与 Pro 使用的 HeroUI 3.2.2 / React Aria Components 1.19.0 运行时 - [x] 收敛应用与 Pro 使用的 HeroUI 3.2.2 / React Aria Components 1.19.0 运行时
- [x] 删除多余 lockfile、Catalyst/Headless 依赖与未引用旧组件 - [x] 删除多余 lockfile、Catalyst/Headless 依赖与未引用旧组件
......
...@@ -2,13 +2,13 @@ ...@@ -2,13 +2,13 @@
## 适用范围 ## 适用范围
本应用统一采用鑫元 HeroUI / HeroUI Pro 设计系统。品牌主色为 `#9E1B1B`,浅色和深色主题由根节点 `data-theme` 与 `.light` / `.dark` 驱动。 本应用统一采用鑫元 HeroUI / HeroUI Pro 设计系统。品牌主色固定为 `#DA241A`,浅色和深色主题的 HeroUI `accent`、`focus` 与主操作均保持该品牌色;Hover/Pressed 仅使用品牌红的深浅派生,不随主题自动切换为其他色相。
## 主题与身份 ## 主题与身份
- CSS 加载顺序固定为 Tailwind、HeroUI、HeroUI Pro、`src/design-system/theme.css`、`tokens.css`、Shell 与应用样式。 - CSS 加载顺序固定为 Tailwind、HeroUI、HeroUI Pro、`src/design-system/theme.css`、`tokens.css`、Shell 与应用样式。
- HeroUI 基础 CSS 使用 `@heroui/styles/css`,HeroUI Pro 使用 `@heroui-pro/react/css`;禁止用 `@heroui/styles` JavaScript 入口代替基础 CSS。 - HeroUI 基础 CSS 使用 `@heroui/styles/css`,HeroUI Pro 使用 `@heroui-pro/react/css`;禁止用 `@heroui/styles` JavaScript 入口代替基础 CSS。
- `theme.css` 必须与鑫元技能基线逐字节一致;业务样式不得重定义其核心变量。 - `theme.css` 是本应用 HeroUI 主题权威源;业务样式不得重定义其核心变量。品牌 `accent/focus` 固定为 `#DA241A`,并提供 `primary-50` 至 `primary-950` 的同色相派生层级。
- `tokens.css` 仅定义 `--rc-*` 扩展、别名、图表色和组件几何。 - `tokens.css` 仅定义 `--rc-*` 扩展、别名、图表色和组件几何。
- 浅色使用 `xy-logo-red.png`,深色使用 `xy-logo-white.png`,禁止使用 RSM 资产或 CSS 反色。 - 浅色使用 `xy-logo-red.png`,深色使用 `xy-logo-white.png`,禁止使用 RSM 资产或 CSS 反色。
- 应用展示名统一为“党风廉政建设”。 - 应用展示名统一为“党风廉政建设”。
...@@ -66,7 +66,8 @@ ...@@ -66,7 +66,8 @@
- Shell 采用固定深色 Sidebar + 浅色内容区,移除主题切换入口。 - Shell 采用固定深色 Sidebar + 浅色内容区,移除主题切换入口。
- 分页支持 20/50/100 条/页选择,切换容量回到第一页。 - 分页支持 20/50/100 条/页选择,切换容量回到第一页。
- 图表统一通过 `XinyuanEChart`(ECharts)渲染,饼图使用扇区间隙与圆角;同一分类维度的多个数据项(例如饼图扇区、模块柱图)必须通过 `createResolvedXinyuanChartColorMap` 按稳定顺序使用 `XINYUAN_CHART_CATEGORY_PALETTE` 映射,顺序为红 → 粉 → 橙 → 黄 → 蓝 → 紫 → 青 → 中性灰。单一指标或不同指标系列使用与基准一致的 `XINYUAN_CHART_SEMANTIC` 语义色,不得把单一指标的每根柱子人为染成不同颜色。年度分布柱图保留单一主色,并显示顶部真实数值、紧凑柱宽和规范圆角,单年份数据也要保持视觉平衡。 - 图表统一通过 `XinyuanEChart`(ECharts)渲染,饼图使用扇区间隙与圆角;同一分类维度的多个数据项(例如饼图扇区、模块柱图)必须通过 `createResolvedXinyuanChartColorMap` 按稳定顺序使用 `XINYUAN_CHART_CATEGORY_PALETTE` 映射,顺序为品牌红深浅 → 暖土色 → 中性灰紫 → 灰蓝,禁止绿色、荧光色和彩虹式跳色。单一指标或不同指标系列使用与基准一致的 `XINYUAN_CHART_SEMANTIC` 语义色,不得把单一指标的每根柱子人为染成不同颜色;单系列统一使用品牌红 `#DA241A`。年度分布柱图保留单一主色,并显示顶部真实数值、紧凑柱宽和规范圆角,单年份数据也要保持视觉平衡。
- 品牌主色 Token 固定为 `#DA241A`:HeroUI `accent`、`focus`、`primary` 及主按钮默认态均使用该值,Hover 使用 `#C91F17`,Pressed 使用 `#B51B14`。`primary-50` 至 `primary-950` 只能由该品牌红与黑/白按比例派生,浅色和深色主题不得切换到蓝、紫或其他色相。
- Modal/Dialog 使用 `bg-background`,详情查看态不再包裹大面积 secondary Surface。 - Modal/Dialog 使用 `bg-background`,详情查看态不再包裹大面积 secondary Surface。
以上仅调整 UI、布局和渲染适配,业务接口、权限、数据结构与保存回调保持不变。 以上仅调整 UI、布局和渲染适配,业务接口、权限、数据结构与保存回调保持不变。
...@@ -52,14 +52,14 @@ ...@@ -52,14 +52,14 @@
## 当前迁移状态与阻断项 ## 当前迁移状态与阻断项
- 权威 `theme.css` 已同步并通过逐字节校验;旧 Tokens 不再重定义 HeroUI 核心变量。 - 项目权威 `theme.css` 已完成品牌专项更新:HeroUI `accent/focus` 固定为 `#DA241A`,Hover/Pressed 使用 `#C91F17/#B51B14`,旧 Tokens 不重定义 HeroUI 核心变量。
- 已通过官方 `hpsetup` 在当前仓库独立安装 `@heroui-pro/react@1.0.0-beta.8`;`package.json`、lockfile 和安装目录均不再依赖相邻项目、绝对路径或软链接。 - 已通过官方 `hpsetup` 在当前仓库独立安装 `@heroui-pro/react@1.0.0-beta.8`;`package.json`、lockfile 和安装目录均不再依赖相邻项目、绝对路径或软链接。
- HeroUI 基础样式入口已更正为 `@heroui/styles/css`。此前包根 JavaScript 入口导致 Tabs、Input、Button、Dropdown 和 DataGrid 缺失官方结构样式,是本次截图中纵向 Tabs、裸控件和尺寸异常的共同根因。 - HeroUI 基础样式入口已更正为 `@heroui/styles/css`。此前包根 JavaScript 入口导致 Tabs、Input、Button、Dropdown 和 DataGrid 缺失官方结构样式,是本次截图中纵向 Tabs、裸控件和尺寸异常的共同根因。
- Catalyst、Headless UI、旧 Select/Table 兼容层与多余 pnpm lockfile 已从活动源码移除。 - Catalyst、Headless UI、旧 Select/Table 兼容层与多余 pnpm lockfile 已从活动源码移除。
- Login、Shell、党风廉政筛选/DataGrid/Modal/DropZone 已完成原生 HeroUI/HeroUI Pro 结构迁移。应用切换进一步同步 `model_analysis` 当前基准:保留 `/application/info` 与用户权限合并,读取 `/info -> site.group` 动态分组,显示真实组数并处理“其他应用”/“全部应用”回退。 - Login、Shell、党风廉政筛选/DataGrid/Modal/DropZone 已完成原生 HeroUI/HeroUI Pro 结构迁移。应用切换进一步同步 `model_analysis` 当前基准:保留 `/application/info` 与用户权限合并,读取 `/info -> site.group` 动态分组,显示真实组数并处理“其他应用”/“全部应用”回退。
- 党风廉政筛选对齐问题整改基线:Surface 内前三项等宽排列,溢出条件通过 Disclosure 展开;移除刷新和查询按钮,字段变化后自动请求,关键词采用约 300ms 延迟。 - 党风廉政筛选对齐问题整改基线:Surface 内前三项等宽排列,溢出条件通过 Disclosure 展开;移除刷新和查询按钮,字段变化后自动请求,关键词采用约 300ms 延迟。
- 驾驶舱 KPI 使用 HeroUI Pro `KPI` compound API;所有业务图表统一使用共享 `XinyuanEChart`(底层 `echarts-for-react`/ECharts)适配器,页面只提供业务数据和 ECharts option。 - 驾驶舱 KPI 使用 HeroUI Pro `KPI` compound API;所有业务图表统一使用共享 `XinyuanEChart`(底层 `echarts-for-react`/ECharts)适配器,页面只提供业务数据和 ECharts option。
- `src/xinyuan-portable.css` 已删除;页面目录不存在私有 CSS/Less/SCSS。`theme.css` 与 Skill 权威副本一致,`tokens.css`、`shell.css`、`tailwind.css`、`global.less` 与确认基准逐字节一致。 - `src/xinyuan-portable.css` 已删除;页面目录不存在私有 CSS/Less/SCSS。`theme.css` 作为本应用品牌主题权威源,`tokens.css`、`shell.css`、`tailwind.css`、`global.less` 保持共享结构与布局契约。
- 广义关键词已移到透明列表工具栏的 HeroUI `SearchField`,结构化筛选 Surface 仅保留年份和分类关键字段。 - 广义关键词已移到透明列表工具栏的 HeroUI `SearchField`,结构化筛选 Surface 仅保留年份和分类关键字段。
- 2026-08-19 最终静态门禁:`npm run build`、`git diff --check`、鑫元审计脚本均成功;旧组件、非 ECharts 图表库调用、页面私有视觉类、跨项目依赖、本机路径和授权值均无有效源码命中。 - 2026-08-19 最终静态门禁:`npm run build`、`git diff --check`、鑫元审计脚本均成功;旧组件、非 ECharts 图表库调用、页面私有视觉类、跨项目依赖、本机路径和授权值均无有效源码命中。
- HeroUI Pro 的 CSS、入口文件和 sidebar/navbar/data-grid/drop-zone/action-bar/empty-state ESM 导入均可用。 - HeroUI Pro 的 CSS、入口文件和 sidebar/navbar/data-grid/drop-zone/action-bar/empty-state ESM 导入均可用。
......
...@@ -17,6 +17,13 @@ export const XINYUAN_CHART_PALETTE = Object.freeze([ ...@@ -17,6 +17,13 @@ export const XINYUAN_CHART_PALETTE = Object.freeze([
'var(--rc-chart-16)', 'var(--rc-chart-16)',
]); ]);
const XINYUAN_CHART_FALLBACKS = Object.freeze([
'#DA241A', '#B83A32', '#C95A52', '#D47A70',
'#A65A45', '#B87958', '#C99772', '#8A6F63',
'#9A8174', '#6F6674', '#807783', '#938B96',
'#4F6380', '#61758F', '#74879A', '#B39A93',
]);
// Approved categorical sequence for charts where each category is independently meaningful. // Approved categorical sequence for charts where each category is independently meaningful.
// Keep the semantic series palette above unchanged for single-metric charts. // Keep the semantic series palette above unchanged for single-metric charts.
export const XINYUAN_CHART_CATEGORY_PALETTE = Object.freeze([ export const XINYUAN_CHART_CATEGORY_PALETTE = Object.freeze([
...@@ -24,18 +31,18 @@ export const XINYUAN_CHART_CATEGORY_PALETTE = Object.freeze([ ...@@ -24,18 +31,18 @@ export const XINYUAN_CHART_CATEGORY_PALETTE = Object.freeze([
'var(--rc-chart-2)', 'var(--rc-chart-2)',
'var(--rc-chart-3)', 'var(--rc-chart-3)',
'var(--rc-chart-4)', 'var(--rc-chart-4)',
'var(--rc-chart-9)',
'var(--rc-chart-11)',
'var(--rc-chart-7)',
'var(--rc-chart-16)',
'var(--rc-chart-5)', 'var(--rc-chart-5)',
'var(--rc-chart-6)', 'var(--rc-chart-6)',
'var(--rc-chart-7)',
'var(--rc-chart-8)', 'var(--rc-chart-8)',
'var(--rc-chart-9)',
'var(--rc-chart-10)', 'var(--rc-chart-10)',
'var(--rc-chart-11)',
'var(--rc-chart-12)', 'var(--rc-chart-12)',
'var(--rc-chart-13)', 'var(--rc-chart-13)',
'var(--rc-chart-14)', 'var(--rc-chart-14)',
'var(--rc-chart-15)', 'var(--rc-chart-15)',
'var(--rc-chart-16)',
]); ]);
export const XINYUAN_CHART_SEMANTIC = Object.freeze({ export const XINYUAN_CHART_SEMANTIC = Object.freeze({
...@@ -156,7 +163,7 @@ export function getXinyuanEChartsTheme() { ...@@ -156,7 +163,7 @@ export function getXinyuanEChartsTheme() {
grid: readRootToken('--xinyuan-chart-grid', '#e8e8e8'), grid: readRootToken('--xinyuan-chart-grid', '#e8e8e8'),
label: readRootToken('--xinyuan-chart-label', '#737373'), label: readRootToken('--xinyuan-chart-label', '#737373'),
palette: Array.from({ length: 16 }, (_, index) => ( palette: Array.from({ length: 16 }, (_, index) => (
readRootToken(`--xinyuan-chart-${index + 1}`, '#667085') readRootToken(`--xinyuan-chart-${index + 1}`, XINYUAN_CHART_FALLBACKS[index])
)), )),
tooltipBackground: readRootToken('--xinyuan-chart-tooltip-background', '#ffffff'), tooltipBackground: readRootToken('--xinyuan-chart-tooltip-background', '#ffffff'),
tooltipBorder: readRootToken('--xinyuan-chart-tooltip-border', '#dedede'), tooltipBorder: readRootToken('--xinyuan-chart-tooltip-border', '#dedede'),
......
...@@ -11,8 +11,10 @@ ...@@ -11,8 +11,10 @@
[data-theme="light"], [data-theme="light"],
[data-theme="default"] { [data-theme="default"] {
/* Theme Colors (Light Mode) */ /* Theme Colors (Light Mode) */
--accent: oklch(57.14% 0.2156 29.20); --accent: #DA241A;
--accent-foreground: oklch(99.11% 0 0); --accent-foreground: oklch(99.11% 0 0);
--accent-hover: #C91F17;
--accent-pressed: #B51B14;
--background: oklch(97.02% 0.0000 29.20); --background: oklch(97.02% 0.0000 29.20);
--border: oklch(90.00% 0.0000 29.20); --border: oklch(90.00% 0.0000 29.20);
--danger: oklch(45.32% 0.1661 27.03); --danger: oklch(45.32% 0.1661 27.03);
...@@ -23,7 +25,7 @@ ...@@ -23,7 +25,7 @@
--field-border: transparent; --field-border: transparent;
--field-foreground: oklch(21.03% 0.0000 29.20); --field-foreground: oklch(21.03% 0.0000 29.20);
--field-placeholder: oklch(55.17% 0.0000 29.20); --field-placeholder: oklch(55.17% 0.0000 29.20);
--focus: oklch(57.14% 0.2156 29.20); --focus: #DA241A;
--foreground: oklch(21.03% 0.0000 29.20); --foreground: oklch(21.03% 0.0000 29.20);
--muted: oklch(55.17% 0.0000 29.20); --muted: oklch(55.17% 0.0000 29.20);
--overlay: oklch(100.00% 0.0000 29.20); --overlay: oklch(100.00% 0.0000 29.20);
...@@ -70,22 +72,22 @@ ...@@ -70,22 +72,22 @@
* Ant Design remains the icon source. Resolve these CSS variables to * Ant Design remains the icon source. Resolve these CSS variables to
* concrete colors before assigning them to an ECharts option object. * concrete colors before assigning them to an ECharts option object.
*/ */
--xinyuan-chart-1: #d92d20; --xinyuan-chart-1: #DA241A;
--xinyuan-chart-2: #ef4444; --xinyuan-chart-2: #B83A32;
--xinyuan-chart-3: #f97316; --xinyuan-chart-3: #C95A52;
--xinyuan-chart-4: #f59e0b; --xinyuan-chart-4: #D47A70;
--xinyuan-chart-5: #22c55e; --xinyuan-chart-5: #A65A45;
--xinyuan-chart-6: #14b87a; --xinyuan-chart-6: #B87958;
--xinyuan-chart-7: #06b6d4; --xinyuan-chart-7: #C99772;
--xinyuan-chart-8: #0ea5e9; --xinyuan-chart-8: #8A6F63;
--xinyuan-chart-9: #3b82f6; --xinyuan-chart-9: #9A8174;
--xinyuan-chart-10: #6366f1; --xinyuan-chart-10: #6F6674;
--xinyuan-chart-11: #8b5cf6; --xinyuan-chart-11: #807783;
--xinyuan-chart-12: #7c3aed; --xinyuan-chart-12: #938B96;
--xinyuan-chart-13: #b42318; --xinyuan-chart-13: #4F6380;
--xinyuan-chart-14: #84cc16; --xinyuan-chart-14: #61758F;
--xinyuan-chart-15: #a855f7; --xinyuan-chart-15: #74879A;
--xinyuan-chart-16: #64748b; --xinyuan-chart-16: #B39A93;
--xinyuan-chart-grid: #e8e8e8; --xinyuan-chart-grid: #e8e8e8;
--xinyuan-chart-axis: #737373; --xinyuan-chart-axis: #737373;
--xinyuan-chart-label: #737373; --xinyuan-chart-label: #737373;
...@@ -101,8 +103,10 @@ ...@@ -101,8 +103,10 @@
[data-theme="dark"] { [data-theme="dark"] {
color-scheme: dark; color-scheme: dark;
/* Theme Colors (Dark Mode) */ /* Theme Colors (Dark Mode) */
--accent: oklch(57.14% 0.2156 29.20); --accent: #DA241A;
--accent-foreground: oklch(99.11% 0 0); --accent-foreground: oklch(99.11% 0 0);
--accent-hover: #C91F17;
--accent-pressed: #B51B14;
--background: oklch(12.00% 0.0000 29.20); --background: oklch(12.00% 0.0000 29.20);
--border: oklch(28.00% 0.0000 29.20); --border: oklch(28.00% 0.0000 29.20);
--danger: oklch(62% 0.16 27.03); --danger: oklch(62% 0.16 27.03);
...@@ -113,7 +117,7 @@ ...@@ -113,7 +117,7 @@
--field-border: transparent; --field-border: transparent;
--field-foreground: oklch(99.11% 0.0000 29.20); --field-foreground: oklch(99.11% 0.0000 29.20);
--field-placeholder: oklch(70.50% 0.0000 29.20); --field-placeholder: oklch(70.50% 0.0000 29.20);
--focus: oklch(57.14% 0.2156 29.20); --focus: #DA241A;
--foreground: oklch(99.11% 0.0000 29.20); --foreground: oklch(99.11% 0.0000 29.20);
--muted: oklch(70.50% 0.0000 29.20); --muted: oklch(70.50% 0.0000 29.20);
--overlay: oklch(21.03% 0.0000 29.20); --overlay: oklch(21.03% 0.0000 29.20);
......
...@@ -4,7 +4,26 @@ ...@@ -4,7 +4,26 @@
[data-theme='light'], [data-theme='light'],
[data-theme='default'] { [data-theme='default'] {
/* Xinyuan aliases and extension tokens. HeroUI core tokens are owned by theme.css. */ /* Xinyuan aliases and extension tokens. HeroUI core tokens are owned by theme.css. */
--primary: #DA241A;
--primary-foreground: #FFFFFF;
--primary-hover: #C91F17;
--primary-pressed: #B51B14;
--primary-disabled: color-mix(in oklab, #DA241A 42%, var(--surface));
--primary-50: color-mix(in oklab, #DA241A 8%, white);
--primary-100: color-mix(in oklab, #DA241A 16%, white);
--primary-200: color-mix(in oklab, #DA241A 28%, white);
--primary-300: color-mix(in oklab, #DA241A 42%, white);
--primary-400: color-mix(in oklab, #DA241A 64%, white);
--primary-500: #DA241A;
--primary-600: color-mix(in oklab, #DA241A 90%, black);
--primary-700: color-mix(in oklab, #DA241A 82%, black);
--primary-800: color-mix(in oklab, #DA241A 70%, black);
--primary-900: color-mix(in oklab, #DA241A 58%, black);
--primary-950: color-mix(in oklab, #DA241A 44%, black);
--rc-brand-primary: var(--accent); --rc-brand-primary: var(--accent);
--rc-brand-primary-hover: #C91F17;
--rc-brand-primary-pressed: #B51B14;
--rc-brand-primary-disabled: color-mix(in oklab, #DA241A 42%, var(--surface));
--rc-brand-light: color-mix(in oklab, var(--accent) 84%, white); --rc-brand-light: color-mix(in oklab, var(--accent) 84%, white);
--rc-brand-dark: color-mix(in oklab, var(--accent) 82%, black); --rc-brand-dark: color-mix(in oklab, var(--accent) 82%, black);
...@@ -91,14 +110,14 @@ ...@@ -91,14 +110,14 @@
--rc-shadow-card: 0 1px 2px rgb(15 23 42 / 2%), 0 4px 12px rgb(15 23 42 / 2%); --rc-shadow-card: 0 1px 2px rgb(15 23 42 / 2%), 0 4px 12px rgb(15 23 42 / 2%);
/* KPI icon surfaces. Card bodies remain neutral; only the icon well carries tone. */ /* KPI icon surfaces. Card bodies remain neutral; only the icon well carries tone. */
--rc-metric-tone-info: oklch(55% 0.14 255); --rc-metric-tone-info: #4F6380;
--rc-metric-tone-success: oklch(54% 0.13 145); --rc-metric-tone-success: #B83A32;
--rc-metric-tone-teal: oklch(55% 0.1 205); --rc-metric-tone-teal: #807783;
--rc-metric-tone-danger: oklch(52% 0.17 25); --rc-metric-tone-danger: #DA241A;
--rc-metric-tone-warning: oklch(62% 0.12 75); --rc-metric-tone-warning: #B87958;
--rc-metric-tone-violet: oklch(56% 0.12 300); --rc-metric-tone-violet: #6F6674;
--rc-metric-tone-indigo: oklch(53% 0.13 275); --rc-metric-tone-indigo: #61758F;
--rc-metric-tone-coral: oklch(60% 0.12 48); --rc-metric-tone-coral: #C95A52;
--rc-metric-tone-neutral: var(--muted); --rc-metric-tone-neutral: var(--muted);
--rc-metric-tone-info-soft: color-mix( --rc-metric-tone-info-soft: color-mix(
in oklab, in oklab,
...@@ -164,11 +183,11 @@ ...@@ -164,11 +183,11 @@
--rc-chart-15: var(--xinyuan-chart-15); --rc-chart-15: var(--xinyuan-chart-15);
--rc-chart-16: var(--xinyuan-chart-16); --rc-chart-16: var(--xinyuan-chart-16);
--rc-chart-primary: var(--rc-chart-1); --rc-chart-primary: var(--rc-chart-1);
--rc-chart-risk: oklch(47% 0.145 27.03); --rc-chart-risk: var(--rc-chart-2);
--rc-chart-warning: var(--rc-chart-6); --rc-chart-warning: var(--rc-chart-6);
--rc-chart-positive: var(--rc-chart-2); --rc-chart-positive: var(--rc-chart-3);
--rc-chart-comparison: var(--rc-chart-4); --rc-chart-comparison: var(--rc-chart-13);
--rc-chart-neutral: var(--rc-chart-8); --rc-chart-neutral: var(--rc-chart-11);
--rc-chart-legend-font-size: var(--xinyuan-chart-legend-font-size); --rc-chart-legend-font-size: var(--xinyuan-chart-legend-font-size);
--rc-chart-legend-line-height: var(--xinyuan-chart-legend-line-height); --rc-chart-legend-line-height: var(--xinyuan-chart-legend-line-height);
--rc-chart-sector-gap: var(--surface); --rc-chart-sector-gap: var(--surface);
......
:root { :root {
--pm-brand: var(--rc-brand-primary, #9e1b1b); --pm-brand: var(--rc-brand-primary, #DA241A);
--pm-brand-strong: var(--rc-brand-dark, #7e1515); --pm-brand-strong: var(--rc-brand-primary-pressed, #B51B14);
--pm-surface: var(--rc-bg-surface, #ffffff); --pm-surface: var(--rc-bg-surface, #ffffff);
--pm-bg: var(--rc-bg-canvas, #f5f5f5); --pm-bg: var(--rc-bg-canvas, #f5f5f5);
--pm-text: var(--rc-text-primary, #172033); --pm-text: var(--rc-text-primary, #172033);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment