From f3f52dc5e0fea9742631307c2c13e1476c2782a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 6 Oct 2026 18:03:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=BA=A2=E4=B9=A6=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=8A=80=E8=83=BD=EF=BC=9AChrome=2061=20=E8=83=BD=E5=8A=9B?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=A1=AC=E6=80=A7=20ERROR=EF=BC=8Cpack=20?= =?UTF-8?q?=E8=87=AA=E5=B8=A6=E7=99=BD=E5=90=8D=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - validate.mjs 恢复 CSS_UNSUPPORTED_PATTERNS / MODERN_RUNTIME_API,命中判 ERROR - 删除「基线层 + 增强层」写法,references 明确 Chrome 61 为硬基线 - pack.mjs 复制白名单与遍历实现,不再 import validate.mjs - SKILL.md 参数表补 validate / pack / vite.config 的默认值 - 修正 decision-log 中与本次相反的旧结论 --- .../resources/agc-skills/manifest.json | 4 +- .../vite-export-xhs-minitool/SKILL.md | 34 ++-- .../references/css-compatibility.md | 162 ++++-------------- .../references/js-compatibility.md | 8 +- .../references/manual-checks.md | 6 +- .../references/zip-artifact-spec.md | 2 +- .../scripts/.validate.test.mjs | 24 ++- .../vite-export-xhs-minitool/scripts/pack.mjs | 47 ++++- .../scripts/validate.mjs | 32 ++++ .../scripts/vite.config.xhs-minitool.mjs | 2 +- .../shared-memory/decision-log.md | 13 +- 11 files changed, 162 insertions(+), 172 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json index 89af00587..f9006428f 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/manifest.json @@ -1,6 +1,6 @@ { "schemaVersion": "agc-skill-pack.v1", - "version": "2026-08-26.61", + "version": "2026-08-26.62", "skills": [ { "name": "agc-unity-editor", @@ -204,7 +204,7 @@ "scripts/validate.mjs", "scripts/vite.config.xhs-minitool.mjs" ], - "sha256": "9a4ebd56d9fe30dacacec35ab2af941ea08cffc3764564a6d0331bb251cfc612" + "sha256": "5c7cd2098061be1203b4055c806b0cb40f2f54efdf4efc34066c98a086a26250" } ] } diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/SKILL.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/SKILL.md index 976cd4881..f5a46b3e8 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/SKILL.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/SKILL.md @@ -12,22 +12,24 @@ metadata: 1. 复制 (并按实际情况修改) `scripts/vite.config.xhs-minitool.mjs` 作为vite构建配置, 这个配置保证了产物符合小红书小工具的规范. 2. 使用 `scripts/validate.mjs` 验证上述配置构建产物目录, 这个脚本实现了一些硬性检查, 此外有一些手动检查项: `references/manual-checks.md` - 3. 使用 `scripts/pack.mjs` 打包成zip; `--zip-out` 默认 **`../.export/xhs-minitool.zip`** (假设 cwd 是 `game/` 子工程, 产物落在 **项目根** `.export/xhs-minitool.zip`; 相对 cwd 解析) + 3. 使用 `scripts/pack.mjs` 打包成zip; `--zip-out` 默认 **`../.export/xhs-minitool.zip`** (假设 cwd 是 `game/` 子工程, + 产物落在 **项目根** `.export/xhs-minitool.zip`; 相对 cwd 解析) 4. 跑通流程后请把需要的脚本配置复制 (agc_install_skill_resource )到项目里 (以免依赖skill), 并形成最终的打包脚本 * 不干扰正常的web构建 # 假设和默认项: -* vite项目目录: game/ ,各个工具 (包括示例vite配置)默认cwd 就是 vite 项目根, 对于非标准的目录结构需要给出显式的参数来适应 +* vite项目目录: game/ +* 各个工具 (包括示例vite配置) 默认cwd 就是 vite 项目根(所以对于非标准的目录结构需要给出显式的参数来适应) # 脚本参数: -| 脚本 | 参数 | -|----------------------------------------|------------------------------------------------------------------| -| `scripts/vite.config.xhs-minitool.mjs` | `build.outDir`(与打包时的 `--vite-built-dir` 必须是同一个目录) | -| `scripts/validate.mjs` | `[project]`、`--json` | -| `scripts/pack.mjs` | `--vite-built-dir `、`--zip-out ` | +| 脚本 | 参数 | +|----------------------------------------|----------------------------------------------------------------------------------------------------------------| +| `scripts/vite.config.xhs-minitool.mjs` | `build.outDir`(默认 `dist-xhs-minitool`;与打包时的 `--vite-built-dir` 必须是同一个目录) | +| `scripts/validate.mjs` | `[project]`(默认 `dist-xhs-minitool`)、`--json` | +| `scripts/pack.mjs` | `--vite-built-dir `(默认 `dist-xhs-minitool`)、`--zip-out `(默认 `../.export/xhs-minitool.zip`) | # 一些情况: @@ -39,12 +41,12 @@ metadata: ## Reference -| 文档 | 何时读 | -|-------------------------------------------------------------|-----------------------------------------------------------------------------------------------| -| [js-api.md](references/js-api.md) | 本地 API 快照; | -| [zip-artifact-spec.md](references/zip-artifact-spec.md) | 写 HTML 文件类型、容器 CSP、`index.html` 要求 | -| [device-capabilities.md](references/device-capabilities.md) | 处理端能力时:哪些 Web 能力可用 / 不可用及替代写法、如何实现常见交互(手势、拍照、选图等) | -| [js-compatibility.md](references/js-compatibility.md) | 写 JS / 选择构建产物时:Android 8.1 出场 Chrome / WebView 61 最低基线、Web API 检测与局部降级 | -| [css-compatibility.md](references/css-compatibility.md) | 写 CSS / 选择构建产物时:Chrome 61 基线、能力检测、现代 CSS 增强与局部回退 | -| [cross-platform-h5.md](references/cross-platform-h5.md) | 适配多端时:触摸、滚动、安全区、PC 模拟器与真机差异 | -| [performance-budget.md](references/performance-budget.md) | 包体、静态数据、Base64、媒体、长列表与 WebGL 资源控制和降级 | +| 文档 | 何时读 | +|-------------------------------------------------------------|--------------------------------------------------------------------------------------------| +| [js-api.md](references/js-api.md) | 本地 API 快照; | +| [zip-artifact-spec.md](references/zip-artifact-spec.md) | 写 HTML 文件类型、容器 CSP、`index.html` 要求 | +| [device-capabilities.md](references/device-capabilities.md) | 处理端能力时:哪些 Web 能力可用 / 不可用及替代写法、如何实现常见交互(手势、拍照、选图等) | +| [js-compatibility.md](references/js-compatibility.md) | 写 JS / 选择构建产物时:Chrome 61 硬基线、不可用 API 与替代写法 | +| [css-compatibility.md](references/css-compatibility.md) | 写 CSS / 选择构建产物时:Chrome 61 硬基线、不支持的能力与替代写法 | +| [cross-platform-h5.md](references/cross-platform-h5.md) | 适配多端时:触摸、滚动、安全区、PC 模拟器与真机差异 | +| [performance-budget.md](references/performance-budget.md) | 包体、静态数据、Base64、媒体、长列表与 WebGL 资源控制和降级 | diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/css-compatibility.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/css-compatibility.md index 2b19208c2..8b1e192ab 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/css-compatibility.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/css-compatibility.md @@ -1,145 +1,52 @@ # CSS 兼容性规范 -> 小工具 CSS 的最低兼容基线是 **Android 8.1 出场 Chrome / WebView 61**。这不等于只能写旧 CSS:交付物采用“Chrome 61 可用的基线层 + 能力检测后的增强层”,在新内核上使用更合适的 CSS 能力。 +> 目标内核固定为 **Android 8.1 出场 Chrome / WebView 61**。晚于 61 的 CSS 能力一律不得出现在最终产物里:浏览器会静默忽略,`validate.mjs` 判为 `CSS_UNSUPPORTED_FEATURE`(ERROR)。 -## 1. 基线原则 +## 1. 硬性要求 -- 基线层保证布局、文字、按钮和核心交互在 Chrome 61 可用;增强层可以使用新 CSS 改善布局、视觉或交互。 -- 按功能点提供回退与增强,不维护两套完整页面或两份完整样式表,避免双份样式逐渐漂移。 -- 根据特性选择检测方法:能用声明级回退的按层叠覆盖,能准确查询的使用 `@supports`,语法检测无法证明实际布局行为时使用 JS 做最小行为检测。 -- 浏览器会静默丢弃无法解析的选择器、声明或整条 at-rule。不能像 JS 一样靠异常发现 CSS 不兼容,必须检查最终产物和实际布局。 -- 兼容性以最终 zip 内的 CSS 为准。源码使用了构建工具,不代表产物已经兼容。 +- 最终 zip 内的 CSS 必须能被 Chrome 61 完整解析;不得保留任何晚于 61 的选择器、声明或 at-rule。 +- 浏览器静默丢弃无法解析的 CSS,不像 JS 会抛异常;兼容性以最终产物为准,源码用了构建工具不代表产物已兼容。 +- 不用 UA、Android 版本或机型字符串决定样式能力。 -## 2. Chrome 61 不可作为唯一实现的能力 +## 2. Chrome 61 不支持的能力与替代写法 -以下能力晚于 Chrome 61,不能作为唯一实现。先提供基线路径,再用适合该能力的检测方式启用增强。 - -| 能力 | 基线写法 / 降级方式 | -|-------------------------------------------------------------|----------------------------------------------------------------------------------------------| -| Flexbox `gap` / `row-gap` / `column-gap` | 基线用子项单边 `margin`;增强用 JS 实际测量 Flex 布局后切换 class,不能只检测 `gap` 属性语法 | -| `aspect-ratio` | 固定媒体尺寸,或用百分比 `padding-top` 比例盒;内容绝对定位 | -| `min()` / `max()` / `clamp()` | 先写固定值、百分比或 `calc()`,再用媒体查询分档 | -| `inset`、`margin-inline`、`padding-block` 等逻辑属性 / 简写 | 使用 `top/right/bottom/left` 与 `margin-left/right`、`padding-top/bottom` 等物理属性 | -| `overflow: clip` | 使用 `overflow: hidden` | -| `:focus-visible` | 先提供 `:focus` 样式;增强规则不能让键盘焦点在基线端消失 | -| `:has()` | 由 JS 在父元素上切换状态 class | -| Container Queries(`@container`) | 使用 viewport 媒体查询,或由 JS 按容器尺寸切换 class | -| Subgrid | 使用普通 Grid、Flex 或显式轨道尺寸 | -| CSS Nesting、Cascade Layers(`@layer`)、`@property` | 已有构建链能可靠展开时才在源码使用;最终产物不得保留为核心规则 | -| `dvh` / `svh` / `lvh` | 先用 `%` / `100vh`;受软键盘影响的全屏高度用 JS 维护 CSS 变量并保留静态兜底 | -| `color-mix()`、`oklab()`、`oklch()` 等现代颜色 | 先写 `#hex`、`rgb()`、`rgba()` 或 `hsl()` 颜色 | -| `backdrop-filter` | 先给不依赖模糊的实色 / 半透明背景;模糊仅作增强,并同时考虑 `-webkit-backdrop-filter` | -| `text-wrap: balance` 等现代排版属性 | 保留普通换行;不要让其决定关键区域高度 | +| 能力 | 必须改用的写法 | +|-------------------------------------------------------------|---------------------------------------------------------------------------------------| +| Flex `gap` / `row-gap` / `column-gap` | Flex 用子项单边 `margin`;Grid 用 `grid-gap` | +| `aspect-ratio` | 固定媒体尺寸,或用百分比 `padding-top` 比例盒;内容绝对定位 | +| `min()` / `max()` / `clamp()` | 固定值、百分比或 `calc()`;需要分档时用媒体查询 | +| `inset`、`margin-inline`、`padding-block` 等逻辑属性 / 简写 | `top/right/bottom/left` 与 `margin-left/right`、`padding-top/bottom` 等物理属性 | +| `overflow: clip` | `overflow: hidden` | +| `:focus-visible` | `:focus` | +| `:has()` | 由 JS 在父元素上切换状态 class | +| `@container` | viewport 媒体查询,或由 JS 按容器尺寸切换 class | +| `subgrid` | 普通 Grid、Flex 或显式轨道尺寸 | +| `@layer` / `@property` | 只允许构建期展开;最终产物不得保留 | +| `dvh` / `svh` / `lvh` | `%` / `100vh`;受软键盘影响的全屏高度用 JS 维护 CSS 变量并保留 `100vh` 兜底 | +| `color-mix()`、`oklab()`、`oklch()` 等现代颜色 | `#hex`、`rgb()`、`rgba()` 或 `hsl()` | +| `backdrop-filter` | 先给不依赖模糊的实色 / 半透明背景 | +| `text-wrap: balance` 等现代排版属性 | 保留普通换行;不要让其决定关键区域高度 | ## 3. 布局与前缀 Chrome 61 可使用 Flexbox、基础 Grid、媒体查询、CSS Variables、`calc()`、transform、transition 和 animation。仍须处理以下跨端差异: - Flex 子项内有长文本、图片或滚动区域时,按方向显式设置 `min-width: 0` 或 `min-height: 0`,避免内容撑破容器。 -- Flex 间距先用子项 `margin` 形成基线;需要时通过行为检测启用 `gap` 并清除 margin。动态增删子项时确认首尾间距仍正确。 -- Grid 只使用基础显式 / 隐式轨道;间距使用 Chrome 61 可解析的 `grid-gap`。不要使用 Subgrid、Masonry 或依赖新语法的自动布局。 +- Flex 间距用子项单边 `margin`;Grid 间距用 `grid-gap`。两者都不要用裸 `gap`。 - 需要隐藏文本时使用 `overflow: hidden; text-overflow: ellipsis; white-space: nowrap`。多行截断使用 `display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: <行数>; overflow: hidden`,并保证截断失效时页面仍可用。 - `user-select`、`appearance`、文字截断和毛玻璃等 WebKit 相关能力按需同时写 `-webkit-` 前缀与标准声明。不要机械给所有属性加前缀。 -- 关键操作不能只在 `:hover` 出现;触摸端默认可见,并可用 `@media (hover: hover)` 增加鼠标悬停效果。 +- 关键操作不能只在 `:hover` 出现;触摸端默认可见,鼠标悬停效果可放 `@media (hover: hover)`。 -## 4. 基线层与增强层 +## 4. 视口与安全区 -### 声明回退和 `@supports` +- 页面宽度使用 `%`、Flex 或基础 Grid,不写死 `375px` 等单一机型宽度。 +- `100vh` 在移动端地址栏、容器高度变化和软键盘出现时可能不等于可视高度。必须跟随可视高度时,由 JS 监听尺寸变化并维护 `--app-height`,同时保留 `100vh` 回退。 +- 安全区规则须配合 `viewport-fit=cover`,用 `var(--safe-area-inset-*, env(safe-area-inset-*, 0px))` 组合;具体见 [cross-platform-h5.md](./cross-platform-h5.md)。 +- 现代桌面浏览器或 PC 模拟器通过不等于 Chrome 61 通过。能够运行旧内核时,至少检查首屏、滚动区、弹层、表单、横竖屏 / 尺寸变化和核心交互;无法运行时在交付说明中标记“Chrome 61 CSS 兼容性未实测”。 -先写 Chrome 61 可用的完整基线,再覆盖增强: +## 5. 构建链目标 -```css -.panel { - background: rgba(255, 255, 255, 0.96); -} - -@supports ((-webkit-backdrop-filter: blur(12px)) or (backdrop-filter: blur(12px))) { - .panel { - background: rgba(255, 255, 255, 0.72); - -webkit-backdrop-filter: blur(12px); - backdrop-filter: blur(12px); - } -} -``` - -同一属性使用“旧值在前、新值在后”的回退顺序: - -```css -.page { - min-height: 100vh; - min-height: var(--app-height, 100vh); -} -``` - -安全区须先保留普通值,再使用容器注入变量与 `env()`: - -```css -.bottom-bar { - padding-bottom: 0; - padding-bottom: var(--safe-area-inset-bottom, env(safe-area-inset-bottom, 0px)); -} -``` - -`@supports` 适合检测 `aspect-ratio`、`backdrop-filter`、动态视口单位等能由单个声明准确表达的能力。需要由 JS 切换 class 时,可以使用 `CSS.supports()` 检测同类声明。任何检测路径都必须保留基础样式。 - -### Flex gap 必须检测布局行为 - -`CSS.supports('gap', '1px')` 和 `@supports (gap: 1px)` 只能证明浏览器认识该属性和值,不能证明 `gap` 在 Flexbox 中生效;支持 Grid gap、但不支持 Flex gap 的内核也可能通过语法检测。需要启用 Flex gap 时,实际创建一次 Flex 容器并测量: - -```js -function supportsFlexGap() { - var flex = document.createElement('div'); - flex.style.position = 'absolute'; - flex.style.visibility = 'hidden'; - flex.style.display = 'flex'; - flex.style.flexDirection = 'column'; - flex.style.rowGap = '1px'; - flex.appendChild(document.createElement('div')); - flex.appendChild(document.createElement('div')); - document.body.appendChild(flex); - var supported = flex.scrollHeight === 1; - flex.parentNode.removeChild(flex); - return supported; -} - -if (supportsFlexGap()) { - document.documentElement.classList.add('supports-flex-gap'); -} -``` - -对应 CSS 只维护一套组件规则,其中 margin 是基线,gap 是增强: - -```css -.actions { - display: flex; -} - -.actions > * + * { - margin-left: 12px; -} - -.supports-flex-gap .actions { - column-gap: 12px; -} - -.supports-flex-gap .actions > * + * { - margin-left: 0; -} -``` - -行为检测放在包内经典脚本中,并在 `document.body` 存在后、核心页面渲染前执行。检测一次即可,不要在 resize 或渲染循环中反复测量。 - -不要用 UA、Android 版本或机型字符串决定样式能力。能力检测决定是否启用增强,Chrome 61 基线层始终保留。 - -## 5. 有构建链与无构建链 - -### 直接交付静态文件 - -没有现成构建链时,不为 CSS 兼容性临时引入 PostCSS、Autoprefixer 或新的 npm 依赖;直接按 Chrome 61 基线编写。 - -### 项目已有构建链 - -将目标浏览器至少设置为: +项目已有构建链时,浏览器目标至少设置为: ```text Chrome >= 61 @@ -148,10 +55,3 @@ ios_saf >= 18.4 - 压缩器也须使用相同浏览器目标,避免把兼容写法重新合并成 Chrome 61 无法解析的现代语法。 - 交付前检查构建后的 CSS;zip 中只保留最终静态产物,不带 source map 和构建配置。 - -## 6. 视口、安全区与实测 - -- 页面宽度使用 `%`、Flex 或基础 Grid,不写死 `375px` 等单一机型宽度。 -- `100vh` 在移动端地址栏、容器高度变化和软键盘出现时可能不等于可视高度。必须跟随可视高度时,由 JS 监听尺寸变化并维护 `--app-height`,同时保留 `100vh` 回退。 -- 安全区规则须配合 `viewport-fit=cover`,具体组合见 [cross-platform-h5.md](./cross-platform-h5.md)。 -- 现代桌面浏览器或 PC 模拟器通过不等于 Chrome 61 通过。能够运行旧内核时,至少检查首屏、滚动区、弹层、表单、横竖屏 / 尺寸变化和核心交互;无法运行时在交付说明中标记“Chrome 61 CSS 兼容性未实测”。 diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/js-compatibility.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/js-compatibility.md index a1ad3db4b..e1173f30d 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/js-compatibility.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/js-compatibility.md @@ -1,12 +1,12 @@ # JavaScript 兼容性规范 -> 小工具 JavaScript 的最低兼容基线是 **Android 8.1 出场 Chrome / WebView 61**。最终代码必须能在 Chrome 61 解析和运行;iOS 18.4+ 支持的额外能力只能用于能力检测后的增强路径。Chrome 61 完整支持 ES2017,最终代码以 ES2017 为构建目标。 +> 目标内核固定为 **Android 8.1 出场 Chrome / WebView 61**。最终代码必须能在 Chrome 61 解析和运行;晚于 Chrome 61 的语法与运行时 API 一律不得出现在最终产物里,`validate.mjs` 判为 ERROR。Chrome 61 完整支持 ES2017,最终代码以 ES2017 为构建目标。 ## 1. 语法基线 最终 zip 中的 JS 须兼容 Chrome 61: -- ES2018+ 语法须由构建链转译,例如对象 spread、异步迭代、可选链、空值合并、逻辑赋值、class 私有字段、static block、BigInt 字面量和 top-level await;更新的运行时 API 仍须做能力检测或提供必要的局部实现。 +- ES2018+ 语法须由构建链转译,例如对象 spread、异步迭代、可选链、空值合并、逻辑赋值、class 私有字段、static block、BigInt 字面量和 top-level await;晚于 ES2017 的运行时 API 须改用基线写法。 语法不兼容会在脚本解析阶段直接失败,无法通过运行时 `if` 兜底。 @@ -30,8 +30,8 @@ ## 3. 运行时 API - ES2017 内置 API 和基础 DOM API 可直接使用。 -- `String.prototype.replaceAll`、`Array.prototype.at`、`Object.hasOwn`、`structuredClone` 等更新 API 不应直接作为唯一实现路径。 -- 使用非基础 Web API 前先做能力检测;不可用时隐藏增强功能、使用简单替代实现或给出清晰提示。 +- `String.prototype.replaceAll`、`Array.prototype.at`、`Object.hasOwn`、`structuredClone` 等更新 API 晚于 Chrome 61,最终产物不得直接使用(`validate.mjs` 的 `MODERN_RUNTIME_API` 会拦下);用 `split()/join()`、下标、`Object.prototype.hasOwnProperty.call`、手写深拷贝等基线写法替代。 +- 其余非基础 Web API 使用前做能力检测;不可用时降级为简单替代实现或给出清晰提示。 - 只补功能实际需要的小型本地 fallback,不引入整套通用 polyfill;所有代码仍须随包离线交付。 - 能力检测基于对象 / 方法是否存在,不按 UA、机型或系统版本字符串分支。 - 不为被容器明确禁止的能力添加 polyfill;能力边界仍以 [device-capabilities.md](./device-capabilities.md) 为准。 diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/manual-checks.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/manual-checks.md index 166a65992..c3e3c9eed 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/manual-checks.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/manual-checks.md @@ -2,11 +2,11 @@ - 相机 / 麦克风由用户手势触发,并处理系统弹窗授权。 ## JS 兼容 -- 使用非基础 Web API 前先做能力检测;不可用时隐藏增强功能、使用简单替代实现或给出清晰提示;能力检测基于对象 / 方法是否存在,不按 UA、机型或系统版本字符串分支。 +- 除 `replaceAll` / `.at` / `Object.hasOwn` / `structuredClone` 这类晚于 Chrome 61 的 API(须用基线写法替代)外,使用非基础 Web API 前先做能力检测;不可用时降级为简单替代实现或给出清晰提示;不按 UA、机型或系统版本字符串分支。 ## CSS 兼容 -- Chrome 61 基线层能够独立完成核心布局和交互,新内核通过能力检测启用增强层。 -- Flex gap 使用布局行为检测,或仅使用 margin 基线;未把 `@supports (gap: …)` / `CSS.supports('gap', …)` 当作 Flex gap 检测。 +- 最终产物只使用 Chrome 61 可解析的 CSS;`validate.mjs` 已拦下 gap、`min()/max()/clamp()`、逻辑属性、`:focus-visible`、`:has()`、`@container`、`dvh` 等,额外人工确认构建后没有残留。 +- Flex 间距用子项 `margin`,Grid 用 `grid-gap`;不使用 flex `gap`。 - Flex 子项内有长文本、图片或滚动区域时,按方向显式设置 `min-width: 0` 或 `min-height: 0`。 - 关键操作不能只在 `:hover` 出现,触摸端默认可见;安全区用 `var(--safe-area-inset-*, env(safe-area-inset-*, 0px))` 组合,配合 `viewport-fit=cover`。 diff --git a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/zip-artifact-spec.md b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/zip-artifact-spec.md index 20537d139..abe2929de 100644 --- a/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/zip-artifact-spec.md +++ b/apps/ai-game-creator-shell/src-tauri/resources/agc-skills/vite-export-xhs-minitool/references/zip-artifact-spec.md @@ -44,7 +44,7 @@ zip 内仅允许以下类型: - **脚本必须是经典脚本**:只用 `