diff --git a/AGENTS.md b/AGENTS.md index 0494e7e6..172afe19 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -148,6 +148,7 @@ - 现有 `apple-*` token、深色 `ObsidianControlShell`、历史主题 CSS 只能作为兼容遗留;新功能不得以它们作为视觉方向。 - 前端改造不得把现有后台习惯、普通 SaaS 审美或共享组件默认皮肤当成最终依据;如果组件库默认视觉和 Stitch/资产中心标准冲突,应在组件库体系内做专用变体、重写皮肤或局部重构。 - 没有出现在设计稿、组件规范或业务必要路径里的说明文案、辅助卡片、重复统计块、解释区,不要为了“更易懂”自行添加;工作区必须抓重点,图片类功能要让图片和关键动作成为第一层级。 +- 涉及前端动画、入退场、滚动联动、时间线、拖拽、SVG 或动效性能时,先判断是否有助于理解和操作;需要时优先按技术栈调用对应 GSAP Skill,并继续遵守 Impeccable。React 必须使用 `useGSAP` 或带 `gsap.context().revert()` 的完整清理,滚动相关实例必须销毁并在布局变化时正确刷新;优先动画 `transform/opacity`,尊重 `prefers-reduced-motion`,不得为装饰滥用动效。 - 前端修改后优先用真实页面、截图、1920×1080 视口和必要的移动端视口验证,不只看代码。 ## 8. 验证、收口与规范审查 diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.module.css b/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.module.css deleted file mode 100644 index 94410b06..00000000 --- a/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.module.css +++ /dev/null @@ -1,91 +0,0 @@ -.processingSurface { - position: relative; - isolation: isolate; -} - -.processingSurface::after { - position: absolute; - z-index: 3; - right: 0; - left: 0; - top: 0; - height: 2px; - content: ''; - background: linear-gradient( - 90deg, - transparent, - rgba(78, 100, 105, 0.22) 18%, - rgba(78, 100, 105, 0.92) 50%, - rgba(78, 100, 105, 0.22) 82%, - transparent - ); - box-shadow: 0 0 10px rgba(78, 100, 105, 0.28); - animation: bom-image-scan 2.2s cubic-bezier(0.16, 1, 0.3, 1) infinite; - pointer-events: none; -} - -.processingSurface::before { - position: absolute; - z-index: 2; - inset: 0; - content: ''; - border: 1px solid rgba(78, 100, 105, 0.58); - box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.64); - animation: bom-image-signal 1.8s ease-in-out infinite; - pointer-events: none; -} - -.processingDot { - box-shadow: 0 0 0 0 rgba(78, 100, 105, 0.34); - animation: bom-processing-dot 1.7s ease-out infinite; -} - -@keyframes bom-image-scan { - 0% { - transform: translateY(0); - opacity: 0; - } - 12% { - opacity: 1; - } - 88% { - opacity: 1; - } - 100% { - transform: translateY(var(--bom-scan-distance, 250px)); - opacity: 0; - } -} - -@keyframes bom-image-signal { - 0%, - 100% { - opacity: 0.48; - } - 50% { - opacity: 1; - } -} - -@keyframes bom-processing-dot { - 0% { - box-shadow: 0 0 0 0 rgba(78, 100, 105, 0.34); - } - 72%, - 100% { - box-shadow: 0 0 0 7px rgba(78, 100, 105, 0); - } -} - -@media (prefers-reduced-motion: reduce) { - .processingSurface::after, - .processingSurface::before, - .processingDot { - animation: none; - } - - .processingSurface::after { - top: 50%; - opacity: 0.72; - } -} diff --git a/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.tsx b/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.tsx index 35a67f14..7f5dc058 100644 --- a/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.tsx +++ b/furniture-3d-system/src/app/bom-costing/BomCostingAssetWorkspace.tsx @@ -9,7 +9,6 @@ import { X, } from 'lucide-react' import { - type CSSProperties, useEffect, useMemo, useRef, @@ -20,7 +19,12 @@ import type { BomCostingCaseDetail, BomCostingSourceAssetDetail, } from '@/lib/bom-costing/client-types' -import styles from './BomCostingAssetWorkspace.module.css' +import { + BomGsapProcessingSurface, + BomGsapPulse, + BomGsapReveal, + useBomGsapScrollIntoView, +} from './BomCostingMotion' type AssetKindFilter = 'ALL' | BomCostingSourceAssetDetail['kind'] @@ -370,11 +374,9 @@ function AssetStatusIcon({ }) { if (activity.activeAssetIds.has(asset.id)) { return ( -