@james_sww/metaform-asset-distribution 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -2
- package/codebase/codebase.json +87 -0
- package/codebase/template/.env.example +1 -0
- package/codebase/template/.metaform/asset-baselines/0551d7ee067550cd2757cf693414c5e180adbb5efe3af4f5f9b1242aa9cd788e +13 -0
- package/codebase/template/.metaform/asset-baselines/0e7bb494140c2c4118b919496a4246b26935367453282bd654fedecd2b16f1a5 +373 -0
- package/codebase/template/.metaform/asset-baselines/3d1a9a8a1f7ed83eaf3422d1497cac02b643fe1c470b5c5f357f3bd26c585a0f +136 -0
- package/codebase/template/.metaform/asset-baselines/4acbc7165a8d54738ff62b51414e772c08fe78434e524e6d8770180d3ba2925f +6 -0
- package/codebase/template/.metaform/asset-baselines/4b8ea69ef28a9699c0c3b28e12590a7521f91aa1a4a3d618fc0778455d39cbcc +65 -0
- package/codebase/template/.metaform/asset-baselines/567f039384fb23a20a4cd5e1d4fda56255abda6fc04d80b36c4bb6f6c040691b +152 -0
- package/codebase/template/.metaform/asset-baselines/5f56cd15afc07567f7b80b8b4d9e89da405e070a562583bbbc2414fd981af324 +52 -0
- package/codebase/template/.metaform/asset-baselines/7b725132bcc0688429adae31cb0ba872421d87eab5ae118fab88292e2c6e3fd3 +227 -0
- package/codebase/template/.metaform/asset-baselines/89d01af0d566e2f42b4653d75be97356896ade09dbfb8de2865d941ade16b398 +13 -0
- package/codebase/template/.metaform/asset-baselines/8d4794e5500b7f577ad5c5676d27a7796cdb32984b40ec41a25acbba17c7a425 +67 -0
- package/codebase/template/.metaform/asset-baselines/92cd18a919b549b4827f611c3a4157652c4a6ae034850da1254ca422693c759d +173 -0
- package/codebase/template/.metaform/asset-baselines/b48c73f51ff3e148f20ad2c9dbd2847235e4fdf1cdb304d5e2feec9c2febd65e +125 -0
- package/codebase/template/.metaform/asset-baselines/b9e31158082ce71a2b3bdb904d9462619e3690735e73e138b1ce57f8f036347f +82 -0
- package/codebase/template/.metaform/asset-baselines/bcc48c05cd912dad5373242ff699cdbec032c8ebb2de45a9df5de79a6daec59c +468 -0
- package/codebase/template/.metaform/asset-baselines/bf9e1bbb252c1fa5da20a17eeee1ac163c7d3a0b6deff817d30ba04b766fb8a1 +51 -0
- package/codebase/template/.metaform/asset-baselines/e9d4784c2ad5bceccdc4f2f19f367fdc37537a10e3f99f510e42c0226adfbf8f +43 -0
- package/codebase/template/.metaform/asset-baselines/f3ce568d1ede383d9cb0d11dcc2acb6ce7984cbef8e2db0feec310df76303ccd +19 -0
- package/codebase/template/.metaform/asset-baselines/fc763d53079b51a789c1cfff23d40e00f844a9a093a2ad112f0ac68ab46fe080 +135 -0
- package/codebase/template/LICENSES/NOTICE.md +5 -0
- package/codebase/template/README.md +17 -0
- package/codebase/template/_gitignore +6 -0
- package/codebase/template/application.json +7 -0
- package/codebase/template/assets.lock.json +149 -0
- package/codebase/template/components.json +21 -0
- package/codebase/template/eslint.config.js +10 -0
- package/codebase/template/index.html +11 -0
- package/codebase/template/package.json +44 -0
- package/codebase/template/pnpm-lock.yaml +3843 -0
- package/codebase/template/role-targets.json +1 -0
- package/codebase/template/src/components/common/error-boundary.tsx +101 -0
- package/codebase/template/src/components/common/semantic-region/contract.ts +173 -0
- package/codebase/template/src/components/common/semantic-region/semantic-region-scaffold.tsx +152 -0
- package/codebase/template/src/components/ui/alert.tsx +65 -0
- package/codebase/template/src/components/ui/avatar.tsx +43 -0
- package/codebase/template/src/components/ui/badge.tsx +51 -0
- package/codebase/template/src/components/ui/breadcrumb.tsx +108 -0
- package/codebase/template/src/components/ui/button.tsx +67 -0
- package/codebase/template/src/components/ui/card.tsx +79 -0
- package/codebase/template/src/components/ui/checkbox.tsx +31 -0
- package/codebase/template/src/components/ui/collapsible.tsx +19 -0
- package/codebase/template/src/components/ui/dialog.tsx +156 -0
- package/codebase/template/src/components/ui/dropdown-menu.tsx +227 -0
- package/codebase/template/src/components/ui/input.tsx +24 -0
- package/codebase/template/src/components/ui/label.tsx +23 -0
- package/codebase/template/src/components/ui/progress.tsx +28 -0
- package/codebase/template/src/components/ui/radio-group.tsx +42 -0
- package/codebase/template/src/components/ui/select.tsx +187 -0
- package/codebase/template/src/components/ui/separator.tsx +27 -0
- package/codebase/template/src/components/ui/sheet.tsx +135 -0
- package/codebase/template/src/components/ui/skeleton.tsx +13 -0
- package/codebase/template/src/components/ui/switch.tsx +34 -0
- package/codebase/template/src/components/ui/table.tsx +117 -0
- package/codebase/template/src/components/ui/tabs.tsx +90 -0
- package/codebase/template/src/components/ui/tooltip.tsx +52 -0
- package/codebase/template/src/contexts/toast-context.tsx +75 -0
- package/codebase/template/src/hooks/index.ts +213 -0
- package/codebase/template/src/integrations/platform.ts +6 -0
- package/codebase/template/src/layouts/role-workspace-account.tsx +136 -0
- package/codebase/template/src/layouts/role-workspace-icons.tsx +65 -0
- package/codebase/template/src/layouts/role-workspace-routes.ts +13 -0
- package/codebase/template/src/layouts/role-workspace-shell.tsx +468 -0
- package/codebase/template/src/layouts/role-workspace-types.ts +82 -0
- package/codebase/template/src/lib/http-client.ts +250 -0
- package/codebase/template/src/lib/utils.ts +6 -0
- package/codebase/template/src/main.tsx +6 -0
- package/codebase/template/src/styles/index.css +2 -0
- package/codebase/template/src/styles/styles.css +125 -0
- package/codebase/template/src/styles/theme-tokens.css +373 -0
- package/codebase/template/src/workspace/default-workspace.tsx +40 -0
- package/codebase/template/src/workspace/routes.ts +79 -0
- package/codebase/template/tests/workspace.test.mjs +22 -0
- package/codebase/template/tooling/contracts.d.ts +102 -0
- package/codebase/template/tooling/contracts.js +10 -0
- package/codebase/template/tooling/role-inputs.d.mts +32 -0
- package/codebase/template/tooling/role-inputs.mjs +86 -0
- package/codebase/template/tooling/validate.d.ts +9 -0
- package/codebase/template/tooling/validate.js +162 -0
- package/codebase/template/tsconfig.json +20 -0
- package/codebase/template/vite.config.ts +24 -0
- package/dist/application-design.d.ts +53 -0
- package/dist/application-design.js +113 -0
- package/dist/application-source.d.ts +3 -0
- package/dist/application-source.js +106 -0
- package/dist/apply.d.ts +18 -0
- package/dist/apply.js +59 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +6 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +231 -0
- package/dist/commands.d.ts +2 -0
- package/dist/commands.js +23 -0
- package/dist/contracts.d.ts +101 -0
- package/dist/contracts.js +9 -0
- package/dist/export-source.d.ts +7 -0
- package/dist/export-source.js +188 -0
- package/dist/generated/semantic-region-contract.d.ts +64 -0
- package/dist/generated/semantic-region-contract.js +119 -0
- package/dist/install-transaction.d.ts +22 -0
- package/dist/install-transaction.js +479 -0
- package/dist/official.d.ts +9 -0
- package/dist/official.js +45 -0
- package/dist/planner.d.ts +6 -0
- package/dist/planner.js +99 -0
- package/dist/prepare.d.ts +6 -0
- package/dist/prepare.js +68 -0
- package/dist/provenance.d.ts +10 -0
- package/dist/provenance.js +90 -0
- package/dist/publish.d.ts +15 -0
- package/dist/publish.js +119 -0
- package/dist/role-inputs.d.ts +31 -0
- package/dist/role-inputs.js +85 -0
- package/dist/source-map.d.ts +8 -0
- package/dist/source-map.js +42 -0
- package/dist/template.d.ts +16 -0
- package/dist/template.js +81 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.js +161 -0
- package/package.json +42 -3
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/catalog.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/common-semantic-region-scaffold.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/components-business-role-tasks-icons.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/components-business-role-tasks-types.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/components-common-semantic-region-contract.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/layouts-role-workspace-account.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/layouts-role-workspace-icons.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/layouts-role-workspace-routes.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/layouts-role-workspace-types.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/lib-utils.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/quality-role-task-groups.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/quality-role-task-overview.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/role-workspace-shell.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/styles-styles.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/styles-theme-tokens.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-avatar.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-badge.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-button.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-collapsible.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-dropdown-menu.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-empty.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-sheet.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-skeleton.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/r/ui-tooltip.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/registry.json +1 -0
- package/registry/ff84eb9a229a362050c3262110942d6ba6acac9b4f4694db1d496ee39bfba9d3/release.json +1 -0
- package/registry/release.json +1 -0
package/README.md
CHANGED
|
@@ -1,3 +1,117 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Metaform 源码资产分发(P1)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
这个包提供源码资产 CLI,并携带独立 `@james_sww/metaform-codebase-template` 的版本快照。基础模板唯一维护源已迁到桌面 `metaform-codebase/`,包含 RoleWorkspaceShell、设计系统原语、完整主题与语义骨架。业务组件按需复制,源码归应用维护;生成工程不依赖 Metaform workspace 或该 CLI 才能运行。
|
|
4
|
+
|
|
5
|
+
## npm 使用与沙箱接入
|
|
6
|
+
|
|
7
|
+
发布版本使用 Node 24.18.0、pnpm 10.18.2。CLI 自带固定版本模板与源码 Registry,无需平台仓库或本机桌面目录。私有包需有下载权限;沙箱凭据由运行环境注入,不写入应用源码。
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install -g @james_sww/metaform-asset-distribution@0.1.0
|
|
11
|
+
metaform-assets init --project ./my-app
|
|
12
|
+
cd my-app
|
|
13
|
+
corepack pnpm install --frozen-lockfile
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
不安装全局工具也可运行:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm exec --yes --package=@james_sww/metaform-asset-distribution@0.1.0 -- metaform-assets init --project ./my-app
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Agent 根据应用本体和 skill 形成 `ApplicationDesign` JSON 后,在已初始化的应用目录执行:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
metaform-assets search 岗位任务 --json
|
|
26
|
+
metaform-assets inspect quality.role-task-groups --json
|
|
27
|
+
metaform-assets plan prepare --design /path/to/application-design.json --json > /tmp/application-plan.json
|
|
28
|
+
metaform-assets prepare --plan /tmp/application-plan.json
|
|
29
|
+
corepack pnpm dev
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
CLI 负责按底稿确定性装配;读取线上本体并作语义转译由 Agent 完成。匹配组件安装为应用内源码,未匹配区域保留语义骨架。模板初始化、安装成功不代表真实业务数据已绑定或平台 S7 已自动接通。
|
|
33
|
+
|
|
34
|
+
基础模板也单独按 `@james_sww/metaform-codebase-template@0.1.0` 分发,可安装到工具目录后用 `--codebase /path/to/node_modules/@james_sww/metaform-codebase-template` 指定。初始化底稿的完整类型随 CLI 发布在 `dist/application-design.d.ts`,语义区域类型在 `dist/generated/semantic-region-contract.d.ts`。固定 CLI、模板和 Registry 版本用于沙箱重放;初始化后的源码和基线存入项目快照。
|
|
35
|
+
|
|
36
|
+
## 维护仓库
|
|
37
|
+
|
|
38
|
+
在 frontend 目录使用 pnpm 10.18.2:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
corepack pnpm --filter @james_sww/metaform-asset-distribution test
|
|
42
|
+
corepack pnpm --filter @james_sww/metaform-asset-distribution typecheck
|
|
43
|
+
corepack pnpm --filter @james_sww/metaform-asset-distribution build
|
|
44
|
+
corepack pnpm --filter @james_sww/metaform-asset-distribution pack --pack-destination /tmp/metaform-cli
|
|
45
|
+
corepack pnpm --filter @james_sww/metaform-asset-distribution test:standalone
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
pack 前从独立基础模板包生成 `codebase/` 快照,再生成 CLI 和资产发布快照。`codebase-source.json` 固定模板名称、版本及本地来源;可用 `METAFORM_CODEBASE_SOURCE` 指向其他包目录(包括已安装或解压的 npm 包)。修改模板后先在模板包运行 `npm run seal`。CLI 发行包不依赖桌面路径。`prepare:release` 只写本地 registry 目录,不发布在线服务。默认 Registry URL 是本机验收地址;正式托管前显式设置 `METAFORM_REGISTRY_BASE=https://...`。每个 release 目录以完整内容摘要命名;同摘要的条目、依赖 URL 和 Catalog 不可改写。更换部署 URL 时使用新的输出目录,不能覆盖已发布版本。
|
|
49
|
+
|
|
50
|
+
`registry/<digest>/registry.json`、`r/*.json` 遵守 shadcn Registry schema;`release.json` 是 Metaform 的原始字节和来源 sidecar。schema 校验 fixture 来自 [官方 registry-item schema](https://ui.shadcn.com/schema/registry-item.json),2026-10-17 固定入库。Catalog 分开保留 component 与 asset 两种粒度,候选不会自动变成推荐。可发现但不在首批源码范围内的条目显示 `installable: false`。
|
|
51
|
+
|
|
52
|
+
当前可安装资产:role-workspace-shell、quality.role-task-overview、quality.role-task-groups、common.semantic-region-scaffold,以及真实传递依赖。不猜测任意资产或 npm 版本。所有直接、重导出、字面量动态 import 使用 AST 改写为应用内相对路径;UI aliases 由应用自由配置。未枚举动态 import、未知 npm 依赖、越界路径、软链接、同目标所有权冲突均拒绝。标准 Registry 本轮只接收 UTF-8;二进制资源明确报错。
|
|
53
|
+
|
|
54
|
+
## 独立应用使用
|
|
55
|
+
|
|
56
|
+
在仓库外安装生成的 tgz 后,可直接在应用目录内使用(--project 仍可用于操作其他目录):
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
mkdir my-app
|
|
60
|
+
cd my-app
|
|
61
|
+
metaform-assets init
|
|
62
|
+
corepack pnpm install --frozen-lockfile
|
|
63
|
+
metaform-assets search 岗位任务 --json
|
|
64
|
+
metaform-assets inspect quality.role-task-groups --json
|
|
65
|
+
metaform-assets plan add quality.role-task-overview quality.role-task-groups --json > /tmp/metaform-assets-plan.json
|
|
66
|
+
metaform-assets add --plan /tmp/metaform-assets-plan.json
|
|
67
|
+
metaform-assets official add accordion
|
|
68
|
+
metaform-assets reconcile
|
|
69
|
+
metaform-assets diff
|
|
70
|
+
metaform-assets doctor --recover
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
可用 `--registry /path/to/release.json` 或可信 HTTPS 地址替换内置快照,用 `--expect-digest` 固定已审核摘要。摘要只校验一致性,不代替分发身份认证;远端托管及鉴权由后续平台工作负责。CLI 默认输出可读 JSON,`--json` 输出紧凑 JSON。`inspect` 展示版本、契约来源、候选状态、依赖和实际可读源码(包括 Props 类型)。
|
|
74
|
+
|
|
75
|
+
init 只接受空目录,验证模板清单并记录 `.metaform/codebase.json`,复制自带锁文件;支持 `--codebase /path/to/template-package`;然后在工程内运行 `corepack pnpm install --frozen-lockfile`。Node 24.18.0、pnpm 10.18.2。项目可直接 dev/typecheck/lint/test/build,官方 shadcn 通过 components.json 和 @/ alias 接入。默认包含四个固定框架入口及其语义骨架,没有业务角色、业务菜单、演示数据或在线调用;进入 S7 前由初始化流程根据本体底稿和首轮选型填写角色、页面和区域;S7 沿当前源码继续打造。
|
|
76
|
+
|
|
77
|
+
同一应用一次 build 处理全部角色 HTML/React 入口,一份 package.json、pnpm-lock.yaml、application.json 和 dist。`src/features/<roleKey>/` 属于角色私有,公共 UI/layouts 可共享;构建审计静态与可枚举动态导入的传递模块图,输出 entry-map.json,禁止跨角色专属导入。边界按源码归属执行:不要将角色私有业务代码放进公共目录来规避检查。基础能力按照打造前确认的接入设计实现,P1 没有实现真实登录或数据授权。
|
|
78
|
+
|
|
79
|
+
## 源码维护和恢复
|
|
80
|
+
|
|
81
|
+
assets.lock.json 保存每个资产原始文件 SHA、版本及发布摘要,.metaform/asset-baselines/ 保存原始字节,必须一并进入 Git、工程下载和快照。重复加入同版本不会覆盖应用修改;不同来源占用已有路径、依赖版本不相容、需要升级的差异均产生冲突,没有自动 overwrite 或自动三方合并。基线缺失会明确失败。
|
|
82
|
+
|
|
83
|
+
安装先核对计划与当前源码摘要,在临时工作目录准备源码和依赖结果;确认后只将实际变化的文件逐项写回原工程。工程根目录、未改源码、.git、已有 dist 不替换,终端 cwd 和无关文件句柄保持有效。文件变更带日志和原文件备份,初始化也使用同一机制。多文件更新不宣称是文件系统原子事务。
|
|
84
|
+
|
|
85
|
+
依赖声明或锁文件变化、或依赖目录缺失时,才在安装完成后切换 node_modules;仅新增源码且依赖未变时保持现有依赖目录。安装失败不写回源码;中途异常只恢复本次触及文件与依赖,不回滚无关编辑。回滚清理本次创建且仍为空的目录,保留原有目录及外部新增内容,空目录初始化恢复后可以重试。目标文件已有外部新编辑时停止自动恢复并保留双方副本。工具锁带心跳,进程中断至少等 10 秒后可在工程内运行 doctor --recover。 `--no-install` 仅复制源码,保留已有依赖目录;新增 npm 依赖后须自行运行 pnpm install 更新锁文件。官方组件使用固定 shadcn 4.19.0 在暂存副本运行,不带 overwrite;如果修改了原有源码、主题或来源基线则拒绝提交。新增官方或手工文件标记 unverified,意为“没有 Metaform 上游基线”,不表示组件质量不合格。
|
|
86
|
+
|
|
87
|
+
## 验收范围
|
|
88
|
+
|
|
89
|
+
test:standalone 需要 Docker 和公共 npm/shadcn 网络,使用固定 Node 24.18.0 镜像。它在仓库外安装打包 CLI,验证默认工程、两个岗位任务资产、官方 Accordion、保留用户 Button 修改、双角色构建、动态跨角色拒绝及第二目录按锁文件冷重放。报告和逐命令日志保存在打印的临时路径;浏览器桌面、窄屏、键盘与动作由单独的浏览器验收记录补充。不会因为缺少外部环境把未验收当通过。
|
|
90
|
+
|
|
91
|
+
P1 不改现有应用工作台,不包含线上沙箱、S7 执行器、项目快照、平台预览/发布和真实基础能力集成;这些由 P2–P5 实施。
|
|
92
|
+
|
|
93
|
+
成功后仅保留本次触及源码文件的旧 inode 和快照,输出 retainedBackup,doctor 列出备份及 changedPaths。它不再是整工程备份。若外部进程在更晚时刻通过旧句柄写入已替换的文件,仍可从该文件备份找回;未修改文件的旧句柄继续指向活工程。node_modules 作为可由锁文件重建的缓存,不保留成功安装前的缓存副本。源码备份可由开发者确认后显式清理。
|
|
94
|
+
|
|
95
|
+
## S7 前本地初始化
|
|
96
|
+
|
|
97
|
+
打包 CLI 可全局安装后在任意独立应用目录使用,不需本维护仓库。Agent 先读取本体并完成双粒度检索、inspect 与选型,形成 ApplicationDesign JSON;CLI 消费底稿生成普通源码,不自行猜测业务映射。
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
metaform-assets init
|
|
101
|
+
metaform-assets plan prepare --design /path/to/application-design.json --json > /tmp/application-plan.json
|
|
102
|
+
metaform-assets prepare --plan /tmp/application-plan.json
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
底稿结构由 src/application-design.ts 定义,区域契约来自 layout 的唯一维护源;CLI 构建前生成纯契约快照,发布后只读取其本地模块。匹配区域指定固定 asset/version/exportName、JSON props 与已声明事件;其余使用 common.semantic-region-scaffold。当前生成页面按区域顺序装配,复杂布局与真实业务能力由后续打造实现。
|
|
106
|
+
|
|
107
|
+
生成结果保留 docs/application-design.json、.metaform/application-baselines.json,以及原有 assets.lock.json/资产基线。相同底稿重复准备会保留用户已改文件;新底稿需变更已编辑源码时形成冲突。后续真实替换单独记录区域实现与源码摘要,初始底稿不冒充最终实现。
|
|
108
|
+
|
|
109
|
+
本地闭环验收:corepack pnpm test:semantic-region。它使用打包 CLI 与 Node 24.18.0 容器,在仓库外验证全局命令安装、初始化、源码替换、修改保护和冷安装构建。未接入线上 S7、真实身份或业务数据。
|
|
110
|
+
|
|
111
|
+
## 独立基础模板与固定入口
|
|
112
|
+
|
|
113
|
+
仓库中的 `templates/role-workspace/` 已迁出,不再维护第二份模板源。资产库仍在原仓库;CLI 将匹配资产装进应用源码。模板初始化不需要 Registry;业务资产安装和应用准备使用 Registry。
|
|
114
|
+
|
|
115
|
+
底稿支持 `roles[].workspaceRoutes`,将 `value-panorama`、`my-value`、`inbox`、`enterprise-tasks` 显式映射到当前角色的页面 ID,禁止跨角色映射。未映射入口由模板中的平台语义骨架承接;不将平台占位页面伪造为应用本体页面。映射页面不重复显示在扩展菜单,业务页面和区域保留原本体 ID。
|
|
116
|
+
|
|
117
|
+
本地已验证模板拆分、源码资产装配和入口衔接;npm 发布状态以 Registry 为准,线上 S7 接入单独完成。已有桌面应用不会被强制覆盖,新模板需在新工程初始化或显式审阅升级。
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"name": "@james_sww/metaform-codebase-template",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"files": {
|
|
6
|
+
"_gitignore": "184ad45835c68a6d3fd5100366678797c5fe4d2a2aa6548749039912376faf54",
|
|
7
|
+
".env.example": "5c15c4f0187d52019398f42ced14c7e6d54211ddb554c2142c4b8a9d250573c0",
|
|
8
|
+
".metaform/asset-baselines/0551d7ee067550cd2757cf693414c5e180adbb5efe3af4f5f9b1242aa9cd788e": "0551d7ee067550cd2757cf693414c5e180adbb5efe3af4f5f9b1242aa9cd788e",
|
|
9
|
+
".metaform/asset-baselines/0e7bb494140c2c4118b919496a4246b26935367453282bd654fedecd2b16f1a5": "0e7bb494140c2c4118b919496a4246b26935367453282bd654fedecd2b16f1a5",
|
|
10
|
+
".metaform/asset-baselines/3d1a9a8a1f7ed83eaf3422d1497cac02b643fe1c470b5c5f357f3bd26c585a0f": "3d1a9a8a1f7ed83eaf3422d1497cac02b643fe1c470b5c5f357f3bd26c585a0f",
|
|
11
|
+
".metaform/asset-baselines/4acbc7165a8d54738ff62b51414e772c08fe78434e524e6d8770180d3ba2925f": "4acbc7165a8d54738ff62b51414e772c08fe78434e524e6d8770180d3ba2925f",
|
|
12
|
+
".metaform/asset-baselines/4b8ea69ef28a9699c0c3b28e12590a7521f91aa1a4a3d618fc0778455d39cbcc": "4b8ea69ef28a9699c0c3b28e12590a7521f91aa1a4a3d618fc0778455d39cbcc",
|
|
13
|
+
".metaform/asset-baselines/567f039384fb23a20a4cd5e1d4fda56255abda6fc04d80b36c4bb6f6c040691b": "567f039384fb23a20a4cd5e1d4fda56255abda6fc04d80b36c4bb6f6c040691b",
|
|
14
|
+
".metaform/asset-baselines/5f56cd15afc07567f7b80b8b4d9e89da405e070a562583bbbc2414fd981af324": "5f56cd15afc07567f7b80b8b4d9e89da405e070a562583bbbc2414fd981af324",
|
|
15
|
+
".metaform/asset-baselines/7b725132bcc0688429adae31cb0ba872421d87eab5ae118fab88292e2c6e3fd3": "7b725132bcc0688429adae31cb0ba872421d87eab5ae118fab88292e2c6e3fd3",
|
|
16
|
+
".metaform/asset-baselines/89d01af0d566e2f42b4653d75be97356896ade09dbfb8de2865d941ade16b398": "89d01af0d566e2f42b4653d75be97356896ade09dbfb8de2865d941ade16b398",
|
|
17
|
+
".metaform/asset-baselines/8d4794e5500b7f577ad5c5676d27a7796cdb32984b40ec41a25acbba17c7a425": "8d4794e5500b7f577ad5c5676d27a7796cdb32984b40ec41a25acbba17c7a425",
|
|
18
|
+
".metaform/asset-baselines/92cd18a919b549b4827f611c3a4157652c4a6ae034850da1254ca422693c759d": "92cd18a919b549b4827f611c3a4157652c4a6ae034850da1254ca422693c759d",
|
|
19
|
+
".metaform/asset-baselines/b48c73f51ff3e148f20ad2c9dbd2847235e4fdf1cdb304d5e2feec9c2febd65e": "b48c73f51ff3e148f20ad2c9dbd2847235e4fdf1cdb304d5e2feec9c2febd65e",
|
|
20
|
+
".metaform/asset-baselines/b9e31158082ce71a2b3bdb904d9462619e3690735e73e138b1ce57f8f036347f": "b9e31158082ce71a2b3bdb904d9462619e3690735e73e138b1ce57f8f036347f",
|
|
21
|
+
".metaform/asset-baselines/bcc48c05cd912dad5373242ff699cdbec032c8ebb2de45a9df5de79a6daec59c": "bcc48c05cd912dad5373242ff699cdbec032c8ebb2de45a9df5de79a6daec59c",
|
|
22
|
+
".metaform/asset-baselines/bf9e1bbb252c1fa5da20a17eeee1ac163c7d3a0b6deff817d30ba04b766fb8a1": "bf9e1bbb252c1fa5da20a17eeee1ac163c7d3a0b6deff817d30ba04b766fb8a1",
|
|
23
|
+
".metaform/asset-baselines/e9d4784c2ad5bceccdc4f2f19f367fdc37537a10e3f99f510e42c0226adfbf8f": "e9d4784c2ad5bceccdc4f2f19f367fdc37537a10e3f99f510e42c0226adfbf8f",
|
|
24
|
+
".metaform/asset-baselines/f3ce568d1ede383d9cb0d11dcc2acb6ce7984cbef8e2db0feec310df76303ccd": "f3ce568d1ede383d9cb0d11dcc2acb6ce7984cbef8e2db0feec310df76303ccd",
|
|
25
|
+
".metaform/asset-baselines/fc763d53079b51a789c1cfff23d40e00f844a9a093a2ad112f0ac68ab46fe080": "fc763d53079b51a789c1cfff23d40e00f844a9a093a2ad112f0ac68ab46fe080",
|
|
26
|
+
"application.json": "832c19243f16e38c7a6e100e995675d995537ea0d53da7df9cc1b239782b3ca0",
|
|
27
|
+
"assets.lock.json": "cad385719b1d3b2ccbb56343ca5305d862b813a1e0013d2c12c827423ca47db4",
|
|
28
|
+
"components.json": "bf8e563e20f684aad29b2b7671b3327effd62dc2cb3bd944fcd1ccb7d581217e",
|
|
29
|
+
"eslint.config.js": "05a1c2fbaca8ec2c04985ca14e7da9ecf7b6722a5d9e27313e814de4b0393ccd",
|
|
30
|
+
"index.html": "0c8ce9649128d2ebbe282b1eee040524b78896b9df13f3ca1481c3965f66b823",
|
|
31
|
+
"LICENSES/NOTICE.md": "dc2bd63b6bcdf6007dcc823ae145828ae0fc3ff2768950a2899e752c1016e0b2",
|
|
32
|
+
"package.json": "7b256b3982d5683f6279e75ee86280498b7ef444a4262158f8d622f77361f64f",
|
|
33
|
+
"pnpm-lock.yaml": "46912c695ef4a2f351a7469aa26ab1312ccf6347b4d0aa2b075bf3a96632782b",
|
|
34
|
+
"README.md": "d738a1bfbe9e9221f15e2bdcb46af9fae112afd0c1354bd9d45bdf3ae5205e38",
|
|
35
|
+
"role-targets.json": "37517e5f3dc66819f61f5a7bb8ace1921282415f10551d2defa5c3eb0985b570",
|
|
36
|
+
"src/components/common/error-boundary.tsx": "990d7a72a5634dc854f3acbe9b9d4aac8f13540ca0901be8dbc2f27d77a76f3e",
|
|
37
|
+
"src/components/common/semantic-region/contract.ts": "92cd18a919b549b4827f611c3a4157652c4a6ae034850da1254ca422693c759d",
|
|
38
|
+
"src/components/common/semantic-region/semantic-region-scaffold.tsx": "567f039384fb23a20a4cd5e1d4fda56255abda6fc04d80b36c4bb6f6c040691b",
|
|
39
|
+
"src/components/ui/alert.tsx": "d03dcae5cdb63c381c1144ca9a0c49ba0e46466967d7deb94662034042acb034",
|
|
40
|
+
"src/components/ui/avatar.tsx": "e9d4784c2ad5bceccdc4f2f19f367fdc37537a10e3f99f510e42c0226adfbf8f",
|
|
41
|
+
"src/components/ui/badge.tsx": "bf9e1bbb252c1fa5da20a17eeee1ac163c7d3a0b6deff817d30ba04b766fb8a1",
|
|
42
|
+
"src/components/ui/breadcrumb.tsx": "c75fcd3d9e8470188bc0dd4b27a2b26fff3ad42b9c9c534a953dc090ae2cba33",
|
|
43
|
+
"src/components/ui/button.tsx": "8d4794e5500b7f577ad5c5676d27a7796cdb32984b40ec41a25acbba17c7a425",
|
|
44
|
+
"src/components/ui/card.tsx": "8f7c5833342b8365a7df2c34350cffa15ddc3ec9a5475b2a8dd7110431aa7192",
|
|
45
|
+
"src/components/ui/checkbox.tsx": "ba0ac64064e2d8fa7299d53e9e84b9a4772fef8dd4cf6170c56d3030a1d69941",
|
|
46
|
+
"src/components/ui/collapsible.tsx": "f3ce568d1ede383d9cb0d11dcc2acb6ce7984cbef8e2db0feec310df76303ccd",
|
|
47
|
+
"src/components/ui/dialog.tsx": "dcd488cc5d713da215ce2037efd644f35904df755c70f31534706643db488514",
|
|
48
|
+
"src/components/ui/dropdown-menu.tsx": "7b725132bcc0688429adae31cb0ba872421d87eab5ae118fab88292e2c6e3fd3",
|
|
49
|
+
"src/components/ui/input.tsx": "6db36fff95daf78fdf73d00940a3608108146083a63e76f94a37ecc63048571d",
|
|
50
|
+
"src/components/ui/label.tsx": "344bde38b8531615dbf8e14af3895517c24d8ef6ce56ddeda7e2e6fe4b5d0c00",
|
|
51
|
+
"src/components/ui/progress.tsx": "cf5de49b1c6d9ba6753d1d2f62820c543935cf426b8af8b49b277cfda6cc2c5b",
|
|
52
|
+
"src/components/ui/radio-group.tsx": "38c810acd91e1ef4aa8a9c7ec8375b6e65c89ce3f2292dacebaf5176f1d4e394",
|
|
53
|
+
"src/components/ui/select.tsx": "9293fd75923693411cd443049fba313135014c4ad6997cfcde1e37693fc85b04",
|
|
54
|
+
"src/components/ui/separator.tsx": "ad7d5403fe337160e41dbf04147896e448ae3a747b8d06660d627d74d60021bc",
|
|
55
|
+
"src/components/ui/sheet.tsx": "fc763d53079b51a789c1cfff23d40e00f844a9a093a2ad112f0ac68ab46fe080",
|
|
56
|
+
"src/components/ui/skeleton.tsx": "89d01af0d566e2f42b4653d75be97356896ade09dbfb8de2865d941ade16b398",
|
|
57
|
+
"src/components/ui/switch.tsx": "743676f33f823ffa8008bbd5eb94cb68e227599447d60e132a202291a395f8e4",
|
|
58
|
+
"src/components/ui/table.tsx": "602667b428501cd238f201b999191251a979d25da7c3dd349f63db5fb264f1c3",
|
|
59
|
+
"src/components/ui/tabs.tsx": "e1df6e2f95ece373ca909c1d54b8ba8cf4c47dd425c1784bbb9a01c38dd0936b",
|
|
60
|
+
"src/components/ui/tooltip.tsx": "5f56cd15afc07567f7b80b8b4d9e89da405e070a562583bbbc2414fd981af324",
|
|
61
|
+
"src/contexts/toast-context.tsx": "a3af91f8915d7753ef15888997ba941d07459d4df3e3e6d58e25365143bf336f",
|
|
62
|
+
"src/hooks/index.ts": "31e5708e471dbeb44413632535b8f846686de9be28c8ad18e2d930761de8b73b",
|
|
63
|
+
"src/integrations/platform.ts": "2deb59e0f2938342cb66600b7310da0a67f8754ed291330a18034e819b448c4e",
|
|
64
|
+
"src/layouts/role-workspace-account.tsx": "3d1a9a8a1f7ed83eaf3422d1497cac02b643fe1c470b5c5f357f3bd26c585a0f",
|
|
65
|
+
"src/layouts/role-workspace-icons.tsx": "4b8ea69ef28a9699c0c3b28e12590a7521f91aa1a4a3d618fc0778455d39cbcc",
|
|
66
|
+
"src/layouts/role-workspace-routes.ts": "0551d7ee067550cd2757cf693414c5e180adbb5efe3af4f5f9b1242aa9cd788e",
|
|
67
|
+
"src/layouts/role-workspace-shell.tsx": "bcc48c05cd912dad5373242ff699cdbec032c8ebb2de45a9df5de79a6daec59c",
|
|
68
|
+
"src/layouts/role-workspace-types.ts": "b9e31158082ce71a2b3bdb904d9462619e3690735e73e138b1ce57f8f036347f",
|
|
69
|
+
"src/lib/http-client.ts": "da19f0a16d8be3672573346d59c7242aa87440fc8b97b68a35867291f4da6af7",
|
|
70
|
+
"src/lib/utils.ts": "4acbc7165a8d54738ff62b51414e772c08fe78434e524e6d8770180d3ba2925f",
|
|
71
|
+
"src/main.tsx": "60221d67b63e9e685f2669f8deea9e4e56d5f285ea248d399e87fa69134b191f",
|
|
72
|
+
"src/styles/index.css": "72f8f255c56d117bab6f2aaa53ce5a37aa9b2d5d085b321b9fcb4b4b983e15eb",
|
|
73
|
+
"src/styles/styles.css": "b48c73f51ff3e148f20ad2c9dbd2847235e4fdf1cdb304d5e2feec9c2febd65e",
|
|
74
|
+
"src/styles/theme-tokens.css": "0e7bb494140c2c4118b919496a4246b26935367453282bd654fedecd2b16f1a5",
|
|
75
|
+
"src/workspace/default-workspace.tsx": "0239a9926ab2bc6aa6a0c4923a1af03d618bc245483b114c74b017a4a2051737",
|
|
76
|
+
"src/workspace/routes.ts": "94275cc4d44abcfa672e7d56ac1abc7ecd9f5caf656aa54d3e3ef68eaa7e2085",
|
|
77
|
+
"tests/workspace.test.mjs": "daf930b4db33de45eeecf8431663540ecd54aa90c3ba3dd1e683b539cbb8bf5d",
|
|
78
|
+
"tooling/contracts.d.ts": "9ce9d9ac8e59c11c89aa41881b6e8d6edfc84fb4da115970b9f4a2c1e7486ba8",
|
|
79
|
+
"tooling/contracts.js": "8d539db86dd27573de87c494ae15d7f702d67f24300bce995c7e733619fff630",
|
|
80
|
+
"tooling/role-inputs.d.mts": "eb0e0acbb70e5d2b4def558d2e768ae59a6eade0748f374b3219c7bbef923efb",
|
|
81
|
+
"tooling/role-inputs.mjs": "70080473372b7db8056166b9f8035f6e6997b0f36d8a040131a25f76423b17d0",
|
|
82
|
+
"tooling/validate.d.ts": "5a8da530567c8cefe820e94ee09ab2de1987fea87735531340c1e81299ed0ae4",
|
|
83
|
+
"tooling/validate.js": "b64d25b1c4ff78c6a9f2c6534b895b3c0b032df965cb1f010cf7436f8946240a",
|
|
84
|
+
"tsconfig.json": "77045d61127f797598d0cf6671b7465313b33c35744bd68bae2656bc8032e8bd",
|
|
85
|
+
"vite.config.ts": "30b4f3de7b6e97a6bb237853719c9c45098c5d6982ba90d940a63170fd162b33"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# 在打造前完成基础能力接入设计后填写;默认不配置业务服务地址。
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 固定框架入口;URL 前缀、页面内容和权限由消费者负责。 */
|
|
2
|
+
export const DEFAULT_WORKSPACE_ROUTES = [
|
|
3
|
+
{ id: 'value-panorama', label: '价值全景', group: 'value' },
|
|
4
|
+
{ id: 'my-value', label: '我的价值', group: 'value' },
|
|
5
|
+
{ id: 'inbox', label: '待办事项', group: 'inbox' },
|
|
6
|
+
{ id: 'enterprise-tasks', label: '企业任务总览', group: 'enterprise' },
|
|
7
|
+
] as const;
|
|
8
|
+
|
|
9
|
+
export type WorkspaceRouteId = (typeof DEFAULT_WORKSPACE_ROUTES)[number]['id'];
|
|
10
|
+
|
|
11
|
+
export function isWorkspaceRouteId(id: string): id is WorkspaceRouteId {
|
|
12
|
+
return DEFAULT_WORKSPACE_ROUTES.some((route) => route.id === id);
|
|
13
|
+
}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/* Platform console's always-dark navigation, shared by light and dark modes. */
|
|
2
|
+
[data-sidebar-theme='platform'] {
|
|
3
|
+
--sidebar-background: #17263c;
|
|
4
|
+
--sidebar-foreground: #aebed0;
|
|
5
|
+
--sidebar-border: #2e4055;
|
|
6
|
+
--sidebar-user-foreground: #fff;
|
|
7
|
+
--sidebar-avatar-background: #e4d9c9;
|
|
8
|
+
--sidebar-avatar-foreground: #7a6044;
|
|
9
|
+
--foreground: #fff;
|
|
10
|
+
--muted-foreground: #859bb2;
|
|
11
|
+
--control-hover: #263950;
|
|
12
|
+
--selection: #294c54;
|
|
13
|
+
--selection-foreground: #58d5bd;
|
|
14
|
+
--selection-border: #294c54;
|
|
15
|
+
--ring: #58d5bd;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/*
|
|
19
|
+
* Metaform theme source of truth.
|
|
20
|
+
*
|
|
21
|
+
* Palette tokens never change meaning. Theme role tokens are the only values
|
|
22
|
+
* overridden by a preset, so application code never depends on a brand hex.
|
|
23
|
+
*/
|
|
24
|
+
:root {
|
|
25
|
+
--radius: 0.5rem;
|
|
26
|
+
|
|
27
|
+
/* Fixed palette */
|
|
28
|
+
--palette-ink: oklch(21.01% 0.0318 264.66deg);
|
|
29
|
+
--palette-ink-hover: oklch(27.81% 0.0296 256.85deg);
|
|
30
|
+
--palette-ink-active: oklch(12.96% 0.0274 261.69deg);
|
|
31
|
+
--palette-cobalt: oklch(54.78% 0.1724 265.67deg);
|
|
32
|
+
--palette-cobalt-hover: oklch(47.44% 0.1459 265.64deg);
|
|
33
|
+
--palette-cobalt-active: oklch(39.72% 0.1074 262.56deg);
|
|
34
|
+
--palette-cyan: oklch(71.5% 0.143 215.22deg);
|
|
35
|
+
--palette-teal: oklch(49.5% 0.102 181.5deg);
|
|
36
|
+
--palette-teal-hover: oklch(43.5% 0.092 181.5deg);
|
|
37
|
+
--palette-teal-active: oklch(36% 0.075 181.5deg);
|
|
38
|
+
--palette-steel: oklch(48% 0.065 245deg);
|
|
39
|
+
--palette-steel-hover: oklch(41% 0.06 245deg);
|
|
40
|
+
--palette-steel-active: oklch(33% 0.052 245deg);
|
|
41
|
+
--palette-safety: oklch(66% 0.17 58deg);
|
|
42
|
+
--palette-safety-hover: oklch(57% 0.15 58deg);
|
|
43
|
+
--palette-safety-active: oklch(48% 0.13 58deg);
|
|
44
|
+
--palette-ocean: oklch(49% 0.11 210deg);
|
|
45
|
+
--palette-ocean-hover: oklch(42% 0.1 210deg);
|
|
46
|
+
--palette-ocean-active: oklch(35% 0.082 210deg);
|
|
47
|
+
--palette-white: oklch(98.5% 0.003 247.86deg);
|
|
48
|
+
|
|
49
|
+
/* Theme roles: neutral is the default preset. */
|
|
50
|
+
--theme-accent: var(--palette-ink);
|
|
51
|
+
--theme-accent-hover: var(--palette-ink-hover);
|
|
52
|
+
--theme-accent-active: var(--palette-ink-active);
|
|
53
|
+
--theme-accent-soft: oklch(96.83% 0.0069 247.9deg);
|
|
54
|
+
--theme-accent-border: oklch(86.9% 0.0198 252.89deg);
|
|
55
|
+
--theme-accent-foreground: var(--palette-white);
|
|
56
|
+
|
|
57
|
+
/* Auxiliary brand roles: every preset owns the complete family. */
|
|
58
|
+
--theme-support: var(--palette-cobalt);
|
|
59
|
+
--theme-support-strong: var(--palette-teal);
|
|
60
|
+
--theme-support-soft: oklch(96.5% 0.012 230deg);
|
|
61
|
+
--theme-display-gradient-start: var(--palette-cobalt-active);
|
|
62
|
+
--theme-display-gradient-highlight: var(--palette-cyan);
|
|
63
|
+
--theme-display-gradient-end: var(--palette-teal);
|
|
64
|
+
|
|
65
|
+
/* Stable semantic colors never follow the selected brand theme. */
|
|
66
|
+
--semantic-success: oklch(65.59% 0.1686 146.19deg);
|
|
67
|
+
--semantic-success-soft: oklch(96.3% 0.032 146.19deg);
|
|
68
|
+
--semantic-success-foreground: oklch(40.5% 0.115 146.19deg);
|
|
69
|
+
--semantic-warning: oklch(79.98% 0.1706 72.75deg);
|
|
70
|
+
--semantic-warning-soft: oklch(97.3% 0.035 72.75deg);
|
|
71
|
+
--semantic-warning-foreground: oklch(43% 0.12 72.75deg);
|
|
72
|
+
--semantic-danger: oklch(63.07% 0.201 25.03deg);
|
|
73
|
+
--semantic-danger-soft: oklch(95.8% 0.025 25.03deg);
|
|
74
|
+
--semantic-danger-foreground: oklch(44% 0.16 25.03deg);
|
|
75
|
+
|
|
76
|
+
/* Surfaces and content */
|
|
77
|
+
--surface-canvas: oklch(97.89% 0.0029 264.54deg);
|
|
78
|
+
--surface-panel: oklch(99.5% 0.002 247.86deg);
|
|
79
|
+
--surface-raised: oklch(100% 0.001 247.86deg);
|
|
80
|
+
--surface-muted: oklch(96.7% 0.004 264.54deg);
|
|
81
|
+
--surface-muted-foreground: var(--text-regular);
|
|
82
|
+
--text-primary: var(--palette-ink);
|
|
83
|
+
--text-regular: oklch(37.3% 0.034 259.73deg);
|
|
84
|
+
--text-secondary: oklch(55.44% 0.0407 257.42deg);
|
|
85
|
+
|
|
86
|
+
/* Navigation links stay blue independently of the selected brand theme. */
|
|
87
|
+
--link-foreground: var(--palette-cobalt);
|
|
88
|
+
--link-hover-foreground: var(--palette-cobalt-hover);
|
|
89
|
+
--border-base: oklch(92.88% 0.0126 255.51deg);
|
|
90
|
+
--border-soft: oklch(95.5% 0.008 255.51deg);
|
|
91
|
+
--border-input: oklch(84.5% 0.016 255.51deg);
|
|
92
|
+
--control-hover: var(--surface-muted);
|
|
93
|
+
--control-active: var(--selection);
|
|
94
|
+
--control-active-foreground: var(--selection-foreground);
|
|
95
|
+
--control-active-border: var(--selection-border);
|
|
96
|
+
|
|
97
|
+
/* shadcn focus ring: neutral gray, not brand accent */
|
|
98
|
+
--ring-muted: oklch(70.4% 0.04 256.79deg);
|
|
99
|
+
|
|
100
|
+
/* Application roles derived from the active theme preset. */
|
|
101
|
+
--brand-accent: var(--theme-accent);
|
|
102
|
+
--brand-accent-hover: var(--theme-accent-hover);
|
|
103
|
+
--brand-accent-active: var(--theme-accent-active);
|
|
104
|
+
--brand-accent-soft: var(--theme-accent-soft);
|
|
105
|
+
--brand-accent-border: var(--theme-accent-border);
|
|
106
|
+
--brand-accent-foreground: var(--theme-accent-foreground);
|
|
107
|
+
--brand-support: var(--theme-support);
|
|
108
|
+
--brand-support-strong: var(--theme-support-strong);
|
|
109
|
+
--brand-support-soft: var(--theme-support-soft);
|
|
110
|
+
--brand-gradient-start: var(--theme-display-gradient-start);
|
|
111
|
+
--brand-gradient-highlight: var(--theme-display-gradient-highlight);
|
|
112
|
+
--brand-gradient-end: var(--theme-display-gradient-end);
|
|
113
|
+
--action-primary: var(--theme-accent);
|
|
114
|
+
--action-primary-hover: var(--theme-accent-hover);
|
|
115
|
+
--action-primary-active: var(--theme-accent-active);
|
|
116
|
+
--action-primary-foreground: var(--theme-accent-foreground);
|
|
117
|
+
--selection: var(--theme-accent-soft);
|
|
118
|
+
--selection-foreground: var(--theme-accent);
|
|
119
|
+
--selection-border: var(--theme-accent-border);
|
|
120
|
+
--selection-strong: var(--theme-accent-active);
|
|
121
|
+
--focus-ring: var(--theme-accent);
|
|
122
|
+
--sidebar-background: var(--surface-panel);
|
|
123
|
+
--sidebar-foreground: var(--text-primary);
|
|
124
|
+
--sidebar-active: var(--selection);
|
|
125
|
+
--sidebar-active-foreground: var(--selection-foreground);
|
|
126
|
+
--sidebar-border: var(--border-base);
|
|
127
|
+
|
|
128
|
+
/* Data visualization colors are fixed and independent from branding. */
|
|
129
|
+
--data-blue: var(--palette-cobalt);
|
|
130
|
+
--data-cyan: var(--palette-cyan);
|
|
131
|
+
--data-violet: oklch(60.6% 0.196 286.48deg);
|
|
132
|
+
--data-green: var(--semantic-success);
|
|
133
|
+
--data-amber: var(--semantic-warning);
|
|
134
|
+
--data-red: var(--semantic-danger);
|
|
135
|
+
--data-business: var(--palette-teal);
|
|
136
|
+
--data-equipment: var(--semantic-danger);
|
|
137
|
+
--data-process: var(--semantic-warning);
|
|
138
|
+
--data-metric: var(--data-violet);
|
|
139
|
+
--data-strategy: var(--palette-cyan);
|
|
140
|
+
--data-business-soft: color-mix(in oklch, var(--data-business) 10%, var(--surface-panel));
|
|
141
|
+
--data-equipment-soft: color-mix(in oklch, var(--data-equipment) 10%, var(--surface-panel));
|
|
142
|
+
--data-process-soft: color-mix(in oklch, var(--data-process) 10%, var(--surface-panel));
|
|
143
|
+
--data-metric-soft: color-mix(in oklch, var(--data-metric) 10%, var(--surface-panel));
|
|
144
|
+
--data-strategy-soft: color-mix(in oklch, var(--data-strategy) 10%, var(--surface-panel));
|
|
145
|
+
|
|
146
|
+
/* Theme setting swatches */
|
|
147
|
+
--theme-swatch-neutral: var(--palette-ink);
|
|
148
|
+
--theme-swatch-cobalt: var(--palette-cobalt);
|
|
149
|
+
--theme-swatch-teal: var(--palette-teal);
|
|
150
|
+
--theme-swatch-steel: var(--palette-steel);
|
|
151
|
+
--theme-swatch-safety: var(--palette-safety);
|
|
152
|
+
--theme-swatch-ocean: var(--palette-ocean);
|
|
153
|
+
|
|
154
|
+
/* shadcn roles */
|
|
155
|
+
--background: var(--surface-canvas);
|
|
156
|
+
--foreground: var(--text-primary);
|
|
157
|
+
--card: var(--surface-panel);
|
|
158
|
+
--card-foreground: var(--text-primary);
|
|
159
|
+
--popover: var(--surface-raised);
|
|
160
|
+
--popover-foreground: var(--text-primary);
|
|
161
|
+
--primary: var(--action-primary);
|
|
162
|
+
--primary-foreground: var(--action-primary-foreground);
|
|
163
|
+
--secondary: var(--surface-muted);
|
|
164
|
+
--secondary-foreground: var(--surface-muted-foreground);
|
|
165
|
+
--muted: var(--surface-muted);
|
|
166
|
+
--muted-foreground: var(--text-secondary);
|
|
167
|
+
--accent: var(--selection);
|
|
168
|
+
--accent-foreground: var(--selection-foreground);
|
|
169
|
+
--destructive: var(--semantic-danger);
|
|
170
|
+
--destructive-foreground: var(--palette-white);
|
|
171
|
+
--border: var(--border-base);
|
|
172
|
+
--input: var(--border-input);
|
|
173
|
+
--ring: var(--brand-accent);
|
|
174
|
+
|
|
175
|
+
/* Legacy aliases. New code should use role tokens above. */
|
|
176
|
+
--el-color-primary: var(--theme-accent);
|
|
177
|
+
--el-color-primary-hover: var(--theme-accent-hover);
|
|
178
|
+
--el-color-primary-active: var(--theme-accent-active);
|
|
179
|
+
--el-color-primary-light-9: var(--theme-accent-soft);
|
|
180
|
+
--el-color-primary-light-7: var(--theme-accent-border);
|
|
181
|
+
--el-color-action: var(--action-primary);
|
|
182
|
+
--el-color-action-hover: var(--action-primary-hover);
|
|
183
|
+
--el-color-action-active: var(--action-primary-active);
|
|
184
|
+
--el-color-success: var(--semantic-success);
|
|
185
|
+
--el-color-success-light-9: var(--semantic-success-soft);
|
|
186
|
+
--el-color-warning: var(--semantic-warning);
|
|
187
|
+
--el-color-warning-light-9: var(--semantic-warning-soft);
|
|
188
|
+
--el-color-danger: var(--semantic-danger);
|
|
189
|
+
--el-color-danger-light-9: var(--semantic-danger-soft);
|
|
190
|
+
--el-bg-color: var(--surface-canvas);
|
|
191
|
+
--el-text-color-primary: var(--text-primary);
|
|
192
|
+
--el-text-color-regular: var(--text-regular);
|
|
193
|
+
--el-text-color-secondary: var(--text-secondary);
|
|
194
|
+
--el-border-color-base: var(--border-base);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
:root[data-accent='cobalt'] {
|
|
198
|
+
--theme-accent: var(--palette-cobalt);
|
|
199
|
+
--theme-accent-hover: var(--palette-cobalt-hover);
|
|
200
|
+
--theme-accent-active: var(--palette-cobalt-active);
|
|
201
|
+
--theme-accent-soft: oklch(95.53% 0.0154 269.98deg);
|
|
202
|
+
--theme-accent-border: oklch(86.49% 0.0463 269.14deg);
|
|
203
|
+
--theme-accent-foreground: var(--palette-white);
|
|
204
|
+
--theme-support: var(--palette-cyan);
|
|
205
|
+
--theme-support-strong: var(--palette-teal);
|
|
206
|
+
--theme-support-soft: oklch(95.5% 0.025 215.22deg);
|
|
207
|
+
--theme-display-gradient-start: var(--palette-cobalt-active);
|
|
208
|
+
--theme-display-gradient-highlight: oklch(70% 0.13 265.67deg);
|
|
209
|
+
--theme-display-gradient-end: var(--palette-cobalt);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
:root[data-accent='teal'] {
|
|
213
|
+
--theme-accent: var(--palette-teal);
|
|
214
|
+
--theme-accent-hover: var(--palette-teal-hover);
|
|
215
|
+
--theme-accent-active: var(--palette-teal-active);
|
|
216
|
+
--theme-accent-soft: oklch(96% 0.018 181.5deg);
|
|
217
|
+
--theme-accent-border: oklch(84% 0.045 181.5deg);
|
|
218
|
+
--theme-accent-foreground: var(--palette-white);
|
|
219
|
+
--theme-support: var(--palette-cyan);
|
|
220
|
+
--theme-support-strong: var(--palette-cobalt);
|
|
221
|
+
--theme-support-soft: oklch(95.5% 0.025 205deg);
|
|
222
|
+
--theme-display-gradient-start: var(--palette-teal-active);
|
|
223
|
+
--theme-display-gradient-highlight: oklch(72% 0.1 181.5deg);
|
|
224
|
+
--theme-display-gradient-end: var(--palette-teal);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
:root[data-accent='steel'] {
|
|
228
|
+
--theme-accent: var(--palette-steel);
|
|
229
|
+
--theme-accent-hover: var(--palette-steel-hover);
|
|
230
|
+
--theme-accent-active: var(--palette-steel-active);
|
|
231
|
+
--theme-accent-soft: oklch(95.5% 0.012 245deg);
|
|
232
|
+
--theme-accent-border: oklch(84% 0.035 245deg);
|
|
233
|
+
--theme-accent-foreground: var(--palette-white);
|
|
234
|
+
--theme-support: var(--palette-cobalt);
|
|
235
|
+
--theme-support-strong: var(--palette-ocean);
|
|
236
|
+
--theme-support-soft: oklch(95.5% 0.02 225deg);
|
|
237
|
+
--theme-display-gradient-start: var(--palette-steel-active);
|
|
238
|
+
--theme-display-gradient-highlight: oklch(75% 0.08 225deg);
|
|
239
|
+
--theme-display-gradient-end: var(--palette-ocean);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
:root[data-accent='safety'] {
|
|
243
|
+
--theme-accent: var(--palette-safety);
|
|
244
|
+
--theme-accent-hover: var(--palette-safety-hover);
|
|
245
|
+
--theme-accent-active: var(--palette-safety-active);
|
|
246
|
+
--theme-accent-soft: oklch(96.5% 0.025 75deg);
|
|
247
|
+
--theme-accent-border: oklch(86% 0.08 70deg);
|
|
248
|
+
--theme-accent-foreground: var(--palette-ink-active);
|
|
249
|
+
--theme-support: var(--palette-ocean);
|
|
250
|
+
--theme-support-strong: var(--palette-steel);
|
|
251
|
+
--theme-support-soft: oklch(95.5% 0.02 210deg);
|
|
252
|
+
--theme-display-gradient-start: var(--palette-safety-active);
|
|
253
|
+
--theme-display-gradient-highlight: oklch(79% 0.11 75deg);
|
|
254
|
+
--theme-display-gradient-end: var(--palette-ocean);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
:root[data-accent='ocean'] {
|
|
258
|
+
--theme-accent: var(--palette-ocean);
|
|
259
|
+
--theme-accent-hover: var(--palette-ocean-hover);
|
|
260
|
+
--theme-accent-active: var(--palette-ocean-active);
|
|
261
|
+
--theme-accent-soft: oklch(95.5% 0.02 210deg);
|
|
262
|
+
--theme-accent-border: oklch(84% 0.055 210deg);
|
|
263
|
+
--theme-accent-foreground: var(--palette-white);
|
|
264
|
+
--theme-support: var(--palette-cyan);
|
|
265
|
+
--theme-support-strong: var(--palette-steel);
|
|
266
|
+
--theme-support-soft: oklch(95.5% 0.025 215deg);
|
|
267
|
+
--theme-display-gradient-start: var(--palette-ocean-active);
|
|
268
|
+
--theme-display-gradient-highlight: oklch(78% 0.1 210deg);
|
|
269
|
+
--theme-display-gradient-end: var(--palette-cyan);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
:root.dark {
|
|
273
|
+
color-scheme: dark;
|
|
274
|
+
|
|
275
|
+
--link-foreground: oklch(72% 0.12 265.67deg);
|
|
276
|
+
--link-hover-foreground: oklch(78% 0.105 265.67deg);
|
|
277
|
+
--theme-accent: oklch(92.88% 0.0126 255.51deg);
|
|
278
|
+
--theme-accent-hover: oklch(86% 0.015 255.51deg);
|
|
279
|
+
--theme-accent-active: oklch(78% 0.018 255.51deg);
|
|
280
|
+
--theme-accent-soft: oklch(25.5% 0.018 257.42deg);
|
|
281
|
+
--theme-accent-border: oklch(36% 0.02 257.42deg);
|
|
282
|
+
--theme-accent-foreground: oklch(16% 0.02 264.66deg);
|
|
283
|
+
--theme-support: oklch(72% 0.12 215.22deg);
|
|
284
|
+
--theme-support-strong: oklch(72% 0.1 181.5deg);
|
|
285
|
+
--theme-support-soft: oklch(25.5% 0.025 215.22deg);
|
|
286
|
+
--theme-display-gradient-start: oklch(69% 0.02 257.42deg);
|
|
287
|
+
--theme-display-gradient-highlight: oklch(96% 0.008 255.51deg);
|
|
288
|
+
--theme-display-gradient-end: oklch(82% 0.014 255.51deg);
|
|
289
|
+
--surface-canvas: oklch(14.5% 0.014 264.66deg);
|
|
290
|
+
--surface-panel: oklch(17.8% 0.016 264.66deg);
|
|
291
|
+
--surface-raised: oklch(21% 0.018 264.66deg);
|
|
292
|
+
--surface-muted: oklch(24.5% 0.017 264.66deg);
|
|
293
|
+
--surface-muted-foreground: var(--text-regular);
|
|
294
|
+
--text-primary: oklch(95.5% 0.008 255.51deg);
|
|
295
|
+
--text-regular: oklch(82% 0.014 255.51deg);
|
|
296
|
+
--text-secondary: oklch(69% 0.02 257.42deg);
|
|
297
|
+
--border-base: oklch(31% 0.018 257.42deg);
|
|
298
|
+
--border-soft: oklch(25.5% 0.015 257.42deg);
|
|
299
|
+
--border-input: oklch(38% 0.02 257.42deg);
|
|
300
|
+
--ring-muted: oklch(55.1% 0.027 264.36deg);
|
|
301
|
+
--semantic-success: oklch(74% 0.145 146.19deg);
|
|
302
|
+
--semantic-success-soft: oklch(24% 0.045 146.19deg);
|
|
303
|
+
--semantic-success-foreground: oklch(82% 0.12 146.19deg);
|
|
304
|
+
--semantic-warning: oklch(82% 0.15 72.75deg);
|
|
305
|
+
--semantic-warning-soft: oklch(25% 0.045 72.75deg);
|
|
306
|
+
--semantic-warning-foreground: oklch(86% 0.12 72.75deg);
|
|
307
|
+
--semantic-danger: oklch(70.4% 0.191 22.22deg);
|
|
308
|
+
--semantic-danger-soft: oklch(25% 0.045 22.22deg);
|
|
309
|
+
--semantic-danger-foreground: oklch(82% 0.14 22.22deg);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
:root.dark[data-accent='cobalt'] {
|
|
313
|
+
--theme-accent: oklch(67.5% 0.145 265.67deg);
|
|
314
|
+
--theme-accent-hover: oklch(73% 0.125 265.67deg);
|
|
315
|
+
--theme-accent-active: oklch(62% 0.135 265.67deg);
|
|
316
|
+
--theme-accent-soft: oklch(25.5% 0.04 265.67deg);
|
|
317
|
+
--theme-accent-border: oklch(42% 0.075 265.67deg);
|
|
318
|
+
--theme-accent-foreground: oklch(16% 0.02 264.66deg);
|
|
319
|
+
--theme-support: oklch(76% 0.11 215.22deg);
|
|
320
|
+
--theme-support-strong: oklch(72% 0.1 181.5deg);
|
|
321
|
+
--theme-support-soft: oklch(25.5% 0.04 215.22deg);
|
|
322
|
+
--theme-display-gradient-start: oklch(62% 0.135 265.67deg);
|
|
323
|
+
--theme-display-gradient-highlight: oklch(82% 0.095 265.67deg);
|
|
324
|
+
--theme-display-gradient-end: oklch(70% 0.13 265.67deg);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
:root.dark[data-accent='teal'] {
|
|
328
|
+
--theme-accent: oklch(72% 0.12 181.5deg);
|
|
329
|
+
--theme-accent-hover: oklch(78% 0.105 181.5deg);
|
|
330
|
+
--theme-accent-active: oklch(65% 0.11 181.5deg);
|
|
331
|
+
--theme-accent-soft: oklch(25.5% 0.035 181.5deg);
|
|
332
|
+
--theme-accent-border: oklch(42% 0.065 181.5deg);
|
|
333
|
+
--theme-accent-foreground: oklch(16% 0.02 264.66deg);
|
|
334
|
+
--theme-support: oklch(76% 0.11 215.22deg);
|
|
335
|
+
--theme-support-strong: oklch(72% 0.12 265.67deg);
|
|
336
|
+
--theme-support-soft: oklch(25.5% 0.035 215.22deg);
|
|
337
|
+
--theme-display-gradient-start: oklch(65% 0.11 181.5deg);
|
|
338
|
+
--theme-display-gradient-highlight: oklch(84% 0.08 181.5deg);
|
|
339
|
+
--theme-display-gradient-end: oklch(72% 0.12 181.5deg);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
:root.dark[data-accent='steel'],
|
|
343
|
+
:root.dark[data-accent='safety'],
|
|
344
|
+
:root.dark[data-accent='ocean'] {
|
|
345
|
+
--theme-accent-foreground: oklch(16% 0.02 264.66deg);
|
|
346
|
+
--theme-accent-soft: color-mix(in oklch, var(--theme-accent) 22%, transparent);
|
|
347
|
+
--theme-accent-border: color-mix(in oklch, var(--theme-accent) 48%, var(--border-base));
|
|
348
|
+
--theme-support-soft: color-mix(in oklch, var(--theme-support) 22%, transparent);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
:root.dark[data-accent='steel'] {
|
|
352
|
+
--theme-accent: oklch(70% 0.075 245deg);
|
|
353
|
+
--theme-accent-hover: oklch(77% 0.065 245deg);
|
|
354
|
+
--theme-accent-active: oklch(62% 0.07 245deg);
|
|
355
|
+
--theme-support: oklch(73% 0.1 210deg);
|
|
356
|
+
--theme-support-strong: oklch(70% 0.08 210deg);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
:root.dark[data-accent='safety'] {
|
|
360
|
+
--theme-accent: oklch(76% 0.15 65deg);
|
|
361
|
+
--theme-accent-hover: oklch(82% 0.12 65deg);
|
|
362
|
+
--theme-accent-active: oklch(68% 0.14 65deg);
|
|
363
|
+
--theme-support: oklch(73% 0.1 210deg);
|
|
364
|
+
--theme-support-strong: oklch(70% 0.075 245deg);
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
:root.dark[data-accent='ocean'] {
|
|
368
|
+
--theme-accent: oklch(72% 0.11 210deg);
|
|
369
|
+
--theme-accent-hover: oklch(79% 0.095 210deg);
|
|
370
|
+
--theme-accent-active: oklch(64% 0.105 210deg);
|
|
371
|
+
--theme-support: oklch(76% 0.11 215.22deg);
|
|
372
|
+
--theme-support-strong: oklch(70% 0.075 245deg);
|
|
373
|
+
}
|