@huicai/cli 2026.814.0 → 2026.1019.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/LICENSE +391 -32
- package/README.md +137 -8
- package/bin/huicai.js +146 -73
- package/package.json +27 -8
- package/skills/ab-testing/trigger-cases.json +30 -0
- package/skills/academic-writing/trigger-cases.json +30 -0
- package/skills/accounting-ops/trigger-cases.json +30 -0
- package/skills/ai-agent/trigger-cases.json +30 -0
- package/skills/ai-aiops/trigger-cases.json +30 -0
- package/skills/ai-coding/trigger-cases.json +30 -0
- package/skills/ai-compliance/trigger-cases.json +30 -0
- package/skills/ai-eval/trigger-cases.json +30 -0
- package/skills/ai-llm-app/trigger-cases.json +30 -0
- package/skills/ai-mlops/trigger-cases.json +30 -0
- package/skills/ai-multimodal/trigger-cases.json +30 -0
- package/skills/ai-prompt/trigger-cases.json +30 -0
- package/skills/ai-rag/trigger-cases.json +30 -0
- package/skills/anomaly-detection/trigger-cases.json +30 -0
- package/skills/api-design/trigger-cases.json +31 -0
- package/skills/api-integration/trigger-cases.json +31 -0
- package/skills/arch-design/trigger-cases.json +12 -0
- package/skills/arch-diagram/SKILL.md +118 -0
- package/skills/arch-diagram/trigger-cases.json +30 -0
- package/skills/arch-distributed/trigger-cases.json +30 -0
- package/skills/arch-multitenant/trigger-cases.json +30 -0
- package/skills/audio-brief/SKILL.md +65 -0
- package/skills/audio-brief/trigger-cases.json +30 -0
- package/skills/audit-assist/trigger-cases.json +30 -0
- package/skills/audit-chain/trigger-cases.json +31 -0
- package/skills/banking-credit/trigger-cases.json +30 -0
- package/skills/brand-design/trigger-cases.json +30 -0
- package/skills/business-plan/trigger-cases.json +30 -0
- package/skills/capital-ops/trigger-cases.json +30 -0
- package/skills/cicd-pipeline/trigger-cases.json +31 -0
- package/skills/code-archaeology/SKILL.md +55 -0
- package/skills/code-archaeology/trigger-cases.json +9 -0
- package/skills/code-quality/SKILL.md +138 -0
- package/skills/code-quality/references/languages.md +107 -0
- package/skills/code-quality/scripts/__pycache__/code_battery.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_check.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_check.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_csharp.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_fix.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_fix.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_java.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_java.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_jsts.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_lens.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_lens.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_python.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_python.cpython-313.pyc +0 -0
- package/skills/code-quality/scripts/__pycache__/code_testplan.cpython-312.pyc +0 -0
- package/skills/code-quality/scripts/code_battery.py +1072 -0
- package/skills/code-quality/scripts/code_check.py +1269 -0
- package/skills/code-quality/scripts/code_csharp.py +371 -0
- package/skills/code-quality/scripts/code_fix.py +201 -0
- package/skills/code-quality/scripts/code_java.py +695 -0
- package/skills/code-quality/scripts/code_jsts.py +313 -0
- package/skills/code-quality/scripts/code_lens.py +1079 -0
- package/skills/code-quality/scripts/code_python.py +536 -0
- package/skills/code-quality/scripts/code_testplan.py +239 -0
- package/skills/code-quality/trigger-cases.json +45 -0
- package/skills/code-review/SKILL.md +24 -0
- package/skills/code-review/trigger-cases.json +35 -0
- package/skills/commit-and-pr/trigger-cases.json +31 -0
- package/skills/content-creation/trigger-cases.json +30 -0
- package/skills/corporate-governance/trigger-cases.json +30 -0
- package/skills/crawl-chain/trigger-cases.json +31 -0
- package/skills/customer-service/trigger-cases.json +30 -0
- package/skills/data-analysis/trigger-cases.json +30 -0
- package/skills/data-chain/SKILL.md +1 -1
- package/skills/data-chain/trigger-cases.json +31 -0
- package/skills/data-governance/trigger-cases.json +30 -0
- package/skills/data-report-pro/trigger-cases.json +30 -0
- package/skills/data-streaming/trigger-cases.json +30 -0
- package/skills/data-wrangling/SKILL.md +1 -1
- package/skills/data-wrangling/trigger-cases.json +30 -0
- package/skills/db-es/trigger-cases.json +30 -0
- package/skills/db-migration/trigger-cases.json +30 -0
- package/skills/db-mysql/trigger-cases.json +30 -0
- package/skills/db-postgres/trigger-cases.json +30 -0
- package/skills/db-redis/trigger-cases.json +30 -0
- package/skills/debug-root-cause/trigger-cases.json +30 -0
- package/skills/dependency-audit/SKILL.md +56 -0
- package/skills/dependency-audit/trigger-cases.json +7 -0
- package/skills/dependency-upgrade/trigger-cases.json +31 -0
- package/skills/dev-cpp/trigger-cases.json +30 -0
- package/skills/dev-cross-platform/trigger-cases.json +30 -0
- package/skills/dev-csharp/SKILL.md +23 -0
- package/skills/dev-csharp/trigger-cases.json +30 -0
- package/skills/dev-frontend/SKILL.md +19 -0
- package/skills/dev-frontend/trigger-cases.json +30 -0
- package/skills/dev-go/trigger-cases.json +30 -0
- package/skills/dev-harmony/trigger-cases.json +30 -0
- package/skills/dev-java/SKILL.md +20 -0
- package/skills/dev-java/trigger-cases.json +30 -0
- package/skills/dev-mobile/trigger-cases.json +30 -0
- package/skills/dev-node/trigger-cases.json +30 -0
- package/skills/dev-php/trigger-cases.json +30 -0
- package/skills/dev-python/SKILL.md +21 -0
- package/skills/dev-python/trigger-cases.json +30 -0
- package/skills/dev-rust/trigger-cases.json +30 -0
- package/skills/dev-toolchain/trigger-cases.json +31 -0
- package/skills/doc-chain/trigger-cases.json +31 -0
- package/skills/doc-compare/trigger-cases.json +30 -0
- package/skills/docx-author/SKILL.md +127 -25
- package/skills/docx-author/scripts/__pycache__/docx_battery.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_build.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_check.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/docx_layout.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/__pycache__/zh_prose.cpython-312.pyc +0 -0
- package/skills/docx-author/scripts/docx_battery.py +586 -0
- package/skills/docx-author/scripts/docx_build.py +995 -0
- package/skills/docx-author/scripts/docx_check.py +1306 -0
- package/skills/docx-author/scripts/docx_doc.py +14 -154
- package/skills/docx-author/scripts/docx_layout.py +490 -0
- package/skills/docx-author/scripts/zh_prose.py +639 -0
- package/skills/docx-author/trigger-cases.json +58 -0
- package/skills/echo-brief/SKILL.md +84 -0
- package/skills/echo-brief/references/echo-format.md +68 -0
- package/skills/echo-brief/trigger-cases.json +40 -0
- package/skills/ecommerce-ops/trigger-cases.json +30 -0
- package/skills/education-training/trigger-cases.json +30 -0
- package/skills/ehs-safety/trigger-cases.json +30 -0
- package/skills/email-writing/trigger-cases.json +30 -0
- package/skills/eng-ai/trigger-cases.json +30 -0
- package/skills/eng-architecture/trigger-cases.json +31 -0
- package/skills/eng-automation/trigger-cases.json +31 -0
- package/skills/eng-collaboration/trigger-cases.json +30 -0
- package/skills/eng-complex-env/trigger-cases.json +30 -0
- package/skills/eng-data-platform/trigger-cases.json +31 -0
- package/skills/eng-database/trigger-cases.json +31 -0
- package/skills/eng-develop/trigger-cases.json +30 -0
- package/skills/eng-docs/SKILL.md +24 -0
- package/skills/eng-docs/trigger-cases.json +30 -0
- package/skills/eng-efficiency/trigger-cases.json +30 -0
- package/skills/eng-infra/trigger-cases.json +30 -0
- package/skills/eng-integration/trigger-cases.json +31 -0
- package/skills/eng-legacy/trigger-cases.json +31 -0
- package/skills/eng-observability/trigger-cases.json +31 -0
- package/skills/eng-ops/trigger-cases.json +31 -0
- package/skills/eng-performance/trigger-cases.json +31 -0
- package/skills/eng-planning/trigger-cases.json +31 -0
- package/skills/eng-quality/SKILL.md +8 -0
- package/skills/eng-quality/trigger-cases.json +31 -0
- package/skills/eng-release/trigger-cases.json +31 -0
- package/skills/eng-reliability/trigger-cases.json +31 -0
- package/skills/eng-requirements/trigger-cases.json +12 -0
- package/skills/eng-research/trigger-cases.json +30 -0
- package/skills/eng-security/trigger-cases.json +31 -0
- package/skills/eng-ux/trigger-cases.json +30 -0
- package/skills/engineering-chain/trigger-cases.json +30 -0
- package/skills/env-offline/trigger-cases.json +31 -0
- package/skills/env-private-deploy/trigger-cases.json +31 -0
- package/skills/env-xinchuang/trigger-cases.json +31 -0
- package/skills/equipment-tpm/trigger-cases.json +30 -0
- package/skills/esg-report/trigger-cases.json +30 -0
- package/skills/event-management/trigger-cases.json +30 -0
- package/skills/excel-analysis-chain/SKILL.md +17 -4
- package/skills/excel-analysis-chain/trigger-cases.json +31 -0
- package/skills/explain-codebase/trigger-cases.json +11 -0
- package/skills/file-ingest/trigger-cases.json +30 -0
- package/skills/finance-analysis/trigger-cases.json +31 -0
- package/skills/finance-chain/trigger-cases.json +31 -0
- package/skills/financial-modeling/trigger-cases.json +31 -0
- package/skills/find-simplifications/SKILL.md +43 -0
- package/skills/find-simplifications/trigger-cases.json +23 -0
- package/skills/foreign-trade/trigger-cases.json +30 -0
- package/skills/funnel-cohort/trigger-cases.json +30 -0
- package/skills/gov-document/trigger-cases.json +30 -0
- package/skills/gui-change-evidence/SKILL.md +47 -0
- package/skills/gui-change-evidence/trigger-cases.json +23 -0
- package/skills/hr-chain/trigger-cases.json +31 -0
- package/skills/hr-operations/trigger-cases.json +30 -0
- package/skills/info-disclosure/trigger-cases.json +31 -0
- package/skills/infra-gateway/trigger-cases.json +31 -0
- package/skills/infra-k8s/trigger-cases.json +31 -0
- package/skills/infra-mq/trigger-cases.json +30 -0
- package/skills/insurance-advisory/trigger-cases.json +30 -0
- package/skills/internal-audit/trigger-cases.json +30 -0
- package/skills/ip-management/trigger-cases.json +31 -0
- package/skills/ipo-listing/trigger-cases.json +31 -0
- package/skills/it-audit/trigger-cases.json +31 -0
- package/skills/itsm-ops/trigger-cases.json +31 -0
- package/skills/knowledge-sop/trigger-cases.json +31 -0
- package/skills/legal-chain/trigger-cases.json +31 -0
- package/skills/legal-contract/trigger-cases.json +30 -0
- package/skills/litigation-support/trigger-cases.json +31 -0
- package/skills/logistics-warehouse/trigger-cases.json +30 -0
- package/skills/long-doc-analysis/trigger-cases.json +31 -0
- package/skills/management-accounting/trigger-cases.json +30 -0
- package/skills/manufacturing-chain/trigger-cases.json +31 -0
- package/skills/manufacturing-quality/trigger-cases.json +30 -0
- package/skills/marketing-analytics/trigger-cases.json +31 -0
- package/skills/marketing-chain/trigger-cases.json +31 -0
- package/skills/meeting-minutes/trigger-cases.json +30 -0
- package/skills/metrics-system/trigger-cases.json +31 -0
- package/skills/negotiation-prep/trigger-cases.json +30 -0
- package/skills/obs-prometheus/trigger-cases.json +31 -0
- package/skills/office-automation/trigger-cases.json +31 -0
- package/skills/okr-review/trigger-cases.json +30 -0
- package/skills/ops-fleet/trigger-cases.json +31 -0
- package/skills/ops-linux/trigger-cases.json +31 -0
- package/skills/optimization-solver/trigger-cases.json +30 -0
- package/skills/patent-disclosure/SKILL.md +105 -0
- package/skills/patent-disclosure/references/figures.md +110 -0
- package/skills/patent-disclosure/references/outline.md +162 -0
- package/skills/patent-disclosure/scripts/patent_docx.py +230 -0
- package/skills/patent-disclosure/trigger-cases.json +31 -0
- package/skills/patent-drafting/SKILL.md +108 -0
- package/skills/patent-drafting/trigger-cases.json +31 -0
- package/skills/patent-portfolio/SKILL.md +81 -0
- package/skills/patent-portfolio/trigger-cases.json +31 -0
- package/skills/pdf-toolkit/trigger-cases.json +31 -0
- package/skills/perf-optimize/trigger-cases.json +31 -0
- package/skills/pivot-crosstab/trigger-cases.json +30 -0
- package/skills/policy-analysis/trigger-cases.json +31 -0
- package/skills/portfolio-analysis/trigger-cases.json +31 -0
- package/skills/ppt-chain/SKILL.md +14 -6
- package/skills/ppt-chain/trigger-cases.json +31 -0
- package/skills/pptx-author/SKILL.md +86 -33
- package/skills/pptx-author/scripts/__pycache__/pptx_check.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/__pycache__/pptx_deck.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/__pycache__/pptx_layout.cpython-312.pyc +0 -0
- package/skills/pptx-author/scripts/pptx_battery.py +178 -0
- package/skills/pptx-author/scripts/pptx_build.py +119 -0
- package/skills/pptx-author/scripts/pptx_check.py +1182 -0
- package/skills/pptx-author/scripts/pptx_deck.py +736 -145
- package/skills/pptx-author/scripts/pptx_layout.py +384 -0
- package/skills/pptx-author/trigger-cases.json +15 -0
- package/skills/pr-comms/trigger-cases.json +30 -0
- package/skills/procurement-supply/trigger-cases.json +31 -0
- package/skills/product-design/trigger-cases.json +31 -0
- package/skills/production-planning/trigger-cases.json +31 -0
- package/skills/project-management/trigger-cases.json +31 -0
- package/skills/project-proposal/trigger-cases.json +31 -0
- package/skills/prose-standard/SKILL.md +53 -0
- package/skills/prose-standard/trigger-cases.json +23 -0
- package/skills/qa-api-automation/trigger-cases.json +31 -0
- package/skills/qa-mobile-automation/trigger-cases.json +31 -0
- package/skills/qa-ui-automation/trigger-cases.json +31 -0
- package/skills/quant-analysis/trigger-cases.json +31 -0
- package/skills/rag-triage/SKILL.md +64 -0
- package/skills/rag-triage/evals.json +57 -0
- package/skills/rag-triage/references/triage-playbook.md +75 -0
- package/skills/rag-triage/trigger-cases.json +31 -0
- package/skills/real-estate-property/trigger-cases.json +30 -0
- package/skills/refactor-safely/SKILL.md +1 -1
- package/skills/refactor-safely/trigger-cases.json +30 -0
- package/skills/regression-forecast/trigger-cases.json +31 -0
- package/skills/release-checklist/trigger-cases.json +31 -0
- package/skills/report-craft/SKILL.md +76 -0
- package/skills/report-craft/references/feasibility.md +118 -0
- package/skills/report-craft/references/review-checklist.md +51 -0
- package/skills/report-craft/references/visuals.md +114 -0
- package/skills/report-craft/references/writing.md +80 -0
- package/skills/report-craft/scripts/__pycache__/chart_render.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/__pycache__/fin_model.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/__pycache__/project_facts.cpython-312.pyc +0 -0
- package/skills/report-craft/scripts/chart_render.py +1222 -0
- package/skills/report-craft/scripts/fin_model.py +602 -0
- package/skills/report-craft/scripts/project_facts.py +580 -0
- package/skills/report-craft/scripts/report_battery.py +349 -0
- package/skills/report-craft/trigger-cases.json +15 -0
- package/skills/retail-store-ops/trigger-cases.json +30 -0
- package/skills/risk-compliance/trigger-cases.json +31 -0
- package/skills/scope-creep/SKILL.md +45 -0
- package/skills/scope-creep/trigger-cases.json +7 -0
- package/skills/sec-auth/trigger-cases.json +31 -0
- package/skills/sec-compliance/trigger-cases.json +31 -0
- package/skills/securities-chain/trigger-cases.json +31 -0
- package/skills/securities-research/trigger-cases.json +31 -0
- package/skills/security-audit/trigger-cases.json +31 -0
- package/skills/slides-html/SKILL.md +25 -10
- package/skills/slides-html/trigger-cases.json +11 -0
- package/skills/sql-analysis/SKILL.md +110 -0
- package/skills/sql-analysis/trigger-cases.json +34 -0
- package/skills/sql-tuning/trigger-cases.json +31 -0
- package/skills/statistical-testing/trigger-cases.json +31 -0
- package/skills/strategy-planning/trigger-cases.json +30 -0
- package/skills/supply-chain/trigger-cases.json +31 -0
- package/skills/tax-compliance/trigger-cases.json +30 -0
- package/skills/tech-doc/SKILL.md +262 -0
- package/skills/tech-doc/scripts/__pycache__/archive_battery.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_build.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_check.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/archive_spec.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/__pycache__/doc_templates.cpython-312.pyc +0 -0
- package/skills/tech-doc/scripts/archive_battery.py +860 -0
- package/skills/tech-doc/scripts/archive_build.py +599 -0
- package/skills/tech-doc/scripts/archive_check.py +1307 -0
- package/skills/tech-doc/scripts/archive_spec.py +499 -0
- package/skills/tech-doc/scripts/doc_templates.py +624 -0
- package/skills/tech-doc/trigger-cases.json +57 -0
- package/skills/tech-research/trigger-cases.json +31 -0
- package/skills/tender-bidding/trigger-cases.json +31 -0
- package/skills/translation-pro/trigger-cases.json +30 -0
- package/skills/treasury-mgmt/trigger-cases.json +31 -0
- package/skills/trim-cot-leakage/SKILL.md +58 -0
- package/skills/trim-cot-leakage/trigger-cases.json +23 -0
- package/skills/web-craft/SKILL.md +103 -0
- package/skills/web-craft/references/craft-checklist.md +75 -0
- package/skills/web-craft/references/design-direction.md +122 -0
- package/skills/web-craft/references/h5-mobile.md +100 -0
- package/skills/web-craft/references/motion.md +136 -0
- package/skills/web-craft/references/recipes.md +74 -0
- package/skills/web-craft/templates/wedding-invitation.html +1180 -0
- package/skills/web-craft/trigger-cases.json +14 -0
- package/skills/web-scraping/trigger-cases.json +34 -0
- package/skills/web-search/SKILL.md +11 -10
- package/skills/web-search/trigger-cases.json +31 -0
- package/skills/weekly-report/SKILL.md +134 -0
- package/skills/weekly-report/trigger-cases.json +11 -0
- package/skills/write-tests/trigger-cases.json +31 -0
- package/skills/xlsx-analysis/SKILL.md +143 -77
- package/skills/xlsx-analysis/scripts/__pycache__/data_profile.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_build.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_check.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_layout.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/__pycache__/xlsx_toolkit.cpython-312.pyc +0 -0
- package/skills/xlsx-analysis/scripts/data_profile.py +391 -0
- package/skills/xlsx-analysis/scripts/xlsx_battery.py +389 -0
- package/skills/xlsx-analysis/scripts/xlsx_build.py +522 -0
- package/skills/xlsx-analysis/scripts/xlsx_check.py +924 -0
- package/skills/xlsx-analysis/scripts/xlsx_layout.py +235 -0
- package/skills/xlsx-analysis/scripts/xlsx_style.py +28 -66
- package/skills/xlsx-analysis/scripts/xlsx_toolkit.py +61 -5
- package/skills/xlsx-analysis/trigger-cases.json +59 -0
- package/squads/hc-defense.md +47 -0
- package/squads/hc-rdarchive.md +110 -0
- package/squads/hc-redteam.md +50 -0
- package/squads/hc-weekly.md +125 -0
- package/src/account.js +1 -1
- package/src/acp.js +1 -0
- package/src/advisor.js +1 -1
- package/src/agent.js +1 -1
- package/src/api.js +1 -1
- package/src/archaeology.js +1 -0
- package/src/ask-ui.js +1 -0
- package/src/assets-import.js +1 -1
- package/src/autofix.js +1 -1
- package/src/automation-tools.js +1 -1
- package/src/automation.js +1 -1
- package/src/autorun.js +1 -1
- package/src/banner.js +1 -1
- package/src/capability-probe.js +1 -0
- package/src/checkpoints.js +1 -1
- package/src/code-tools.js +1 -0
- package/src/codeindex.js +1 -1
- package/src/codemode.js +1 -0
- package/src/command-bridge.js +1 -0
- package/src/command-ui.js +1 -0
- package/src/commands.js +1 -1
- package/src/compaction.js +1 -1
- package/src/computer.js +1 -1
- package/src/config.js +1 -1
- package/src/consult.js +1 -1
- package/src/context-report.js +1 -1
- package/src/context-window.js +1 -0
- package/src/context.js +1 -1
- package/src/crew.js +1 -0
- package/src/crush.js +1 -0
- package/src/daemon.js +1 -1
- package/src/decisions.js +1 -1
- package/src/depaudit.js +1 -0
- package/src/device.js +1 -1
- package/src/diagram-draw.js +1 -0
- package/src/diagram-layouts.js +1 -0
- package/src/diagram-raster.js +1 -0
- package/src/diagram.js +1 -0
- package/src/dictation.js +1 -0
- package/src/diffview.js +1 -1
- package/src/doctor.js +1 -1
- package/src/docx-tools.js +1 -0
- package/src/errkind.js +1 -1
- package/src/evidence.js +1 -0
- package/src/executors.js +1 -1
- package/src/expert-catalog.js +1 -1
- package/src/experts-store.js +1 -1
- package/src/experts.js +1 -1
- package/src/external-agents.js +1 -0
- package/src/forks.js +1 -1
- package/src/fs-observe.js +1 -0
- package/src/gitflow.js +1 -1
- package/src/goalround.js +1 -0
- package/src/hooks.js +1 -1
- package/src/input.js +1 -1
- package/src/insights.js +1 -1
- package/src/jobs.js +1 -0
- package/src/kbsync.js +1 -1
- package/src/lsp.js +1 -0
- package/src/mcp-apps.js +1 -0
- package/src/mcp.js +1 -1
- package/src/memory.js +1 -1
- package/src/notify.js +1 -1
- package/src/permissions.js +1 -1
- package/src/plan-limits.js +1 -0
- package/src/policy.js +1 -0
- package/src/pptx-tools.js +1 -0
- package/src/presence.js +1 -1
- package/src/privatedir.js +1 -0
- package/src/pyruntime.js +1 -1
- package/src/radar.js +1 -0
- package/src/render.js +1 -1
- package/src/repl.js +1 -1
- package/src/report-tools.js +1 -0
- package/src/routing.js +1 -0
- package/src/sandbox-probe.js +1 -0
- package/src/sandbox-win-launcher.mjs +156 -0
- package/src/sandbox.js +1 -0
- package/src/scan.js +1 -1
- package/src/schedule.js +1 -1
- package/src/scopecreep.js +1 -0
- package/src/sdk.js +1 -0
- package/src/selection.js +1 -0
- package/src/session-events.js +1 -0
- package/src/session.js +1 -1
- package/src/sessionindex.js +1 -0
- package/src/sessionlog.js +1 -0
- package/src/skill-catalog.js +1 -0
- package/src/skill-lint.js +1 -0
- package/src/skill-optimize.js +1 -0
- package/src/skill-scan.js +1 -0
- package/src/skills.js +1 -1
- package/src/spill.js +1 -0
- package/src/squad.js +1 -1
- package/src/subagent.js +1 -1
- package/src/surface-state.js +1 -0
- package/src/tapd.js +1 -0
- package/src/terminal-select.js +1 -0
- package/src/terminal.js +1 -0
- package/src/test-runner.js +1 -0
- package/src/todo.js +1 -1
- package/src/toolpipe.js +1 -0
- package/src/tools.js +1 -1
- package/src/toon.js +1 -0
- package/src/transcript.js +1 -1
- package/src/tui/app.js +1 -1
- package/src/tui/command-menu.js +1 -0
- package/src/tui/progress.js +1 -0
- package/src/tui/scroll.js +1 -0
- package/src/tui/welcome.js +1 -0
- package/src/tui/workbench.js +1 -0
- package/src/ui-spec.js +1 -0
- package/src/uitree.js +1 -0
- package/src/uninstall.js +1 -1
- package/src/visual.js +1 -1
- package/src/voice-form.js +1 -0
- package/src/voice.js +1 -0
- package/src/watch.js +1 -1
- package/src/web-audit.js +1 -0
- package/src/web-cdp.js +1 -0
- package/src/web-inspect.js +1 -0
- package/src/websearch.js +1 -0
- package/src/weekly.js +1 -0
- package/src/workflow.js +1 -0
- package/src/worklog.js +1 -0
- package/src/xlsx-tools.js +1 -0
- package/ui/command-picker.js +79 -0
- package/skills/ab-testing/scripts/__pycache__/ab_test.cpython-312.pyc +0 -0
- package/skills/accounting-ops/scripts/__pycache__/acct_tools.cpython-312.pyc +0 -0
- package/skills/anomaly-detection/scripts/__pycache__/anomaly.cpython-312.pyc +0 -0
- package/skills/audit-assist/scripts/__pycache__/audit_sampling.cpython-312.pyc +0 -0
- package/skills/banking-credit/scripts/__pycache__/credit_metrics.cpython-312.pyc +0 -0
- package/skills/data-report-pro/scripts/__pycache__/bigdata.cpython-312.pyc +0 -0
- package/skills/data-wrangling/scripts/__pycache__/join_tools.cpython-312.pyc +0 -0
- package/skills/ecommerce-ops/scripts/__pycache__/gmv_decompose.cpython-312.pyc +0 -0
- package/skills/funnel-cohort/scripts/__pycache__/funnel.cpython-312.pyc +0 -0
- package/skills/management-accounting/scripts/__pycache__/costing.cpython-312.pyc +0 -0
- package/skills/manufacturing-quality/scripts/__pycache__/spc.cpython-312.pyc +0 -0
- package/skills/marketing-analytics/scripts/__pycache__/rfm.cpython-312.pyc +0 -0
- package/skills/optimization-solver/scripts/__pycache__/solver.cpython-312.pyc +0 -0
- package/skills/pivot-crosstab/scripts/__pycache__/pivot_tools.cpython-312.pyc +0 -0
- package/skills/portfolio-analysis/scripts/__pycache__/portfolio.cpython-312.pyc +0 -0
- package/skills/procurement-supply/scripts/__pycache__/supply.cpython-312.pyc +0 -0
- package/skills/production-planning/scripts/__pycache__/mrp_capacity.cpython-312.pyc +0 -0
- package/skills/project-management/scripts/__pycache__/cpm.cpython-312.pyc +0 -0
- package/skills/quant-analysis/scripts/__pycache__/quant.cpython-312.pyc +0 -0
- package/skills/real-estate-property/scripts/__pycache__/property_calc.cpython-312.pyc +0 -0
- package/skills/regression-forecast/scripts/__pycache__/regress.cpython-312.pyc +0 -0
- package/skills/securities-research/scripts/__pycache__/valuation.cpython-312.pyc +0 -0
- package/skills/statistical-testing/scripts/__pycache__/stat_tests.cpython-312.pyc +0 -0
- package/skills/treasury-mgmt/scripts/__pycache__/cashflow_forecast.cpython-312.pyc +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# 手机与微信:兼容、字体、日期、性能
|
|
2
|
+
|
|
3
|
+
H5 的访客几乎都在手机上、大半在微信里。桌面浏览器里一切正常,不代表他们打开时正常。
|
|
4
|
+
|
|
5
|
+
## 骨架(每个 H5 都照抄)
|
|
6
|
+
|
|
7
|
+
```html
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
9
|
+
<meta name="format-detection" content="telephone=no"> <!-- 否则 iOS 会把数字串变成蓝色电话链接 -->
|
|
10
|
+
<meta name="theme-color" content="#B3302A">
|
|
11
|
+
```
|
|
12
|
+
```css
|
|
13
|
+
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
|
|
14
|
+
body { -webkit-tap-highlight-color: transparent; overscroll-behavior-y: none; }
|
|
15
|
+
[hidden] { display: none !important; } /* 写了 display 的组件,hidden 属性会失效 */
|
|
16
|
+
.screen { min-height: 100vh; min-height: 100dvh; } /* 地址栏伸缩时不跳;老内核认第一行 */
|
|
17
|
+
.bottom-bar { padding-bottom: calc(12px + env(safe-area-inset-bottom)); }
|
|
18
|
+
input, textarea, select { font-size: 16px; } /* <16px 在 iOS 聚焦时整页放大且不缩回 */
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 中文字体栈(系统自带,零下载)
|
|
22
|
+
|
|
23
|
+
```css
|
|
24
|
+
--font-display: "STKaiti", "Kaiti SC", "KaiTi", "BiauKai", "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", "Noto Serif CJK SC", serif;
|
|
25
|
+
--font-serif: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", "Noto Serif CJK SC", "SimSun", serif;
|
|
26
|
+
--font-sans: -apple-system, BlinkMacSystemFont, "PingFang SC", "HarmonyOS Sans SC", "MiSans", "Microsoft YaHei", "Noto Sans SC", sans-serif;
|
|
27
|
+
--font-num: "Didot", "Bodoni 72", "Bodoni MT", "Times New Roman", var(--font-serif);
|
|
28
|
+
```
|
|
29
|
+
- 安卓大多没有楷体,会回退到宋体或黑体——设计要在回退字体下也成立(别让版式依赖某个字的宽度)。
|
|
30
|
+
- **不要用 Google Fonts / fonts.googleapis.com**:国内经常打不开,页面会卡在字体加载上。
|
|
31
|
+
- 确需书法字体:用 fonttools 按页面实际用到的字做子集(`pyftsubset font.ttf --text-file=chars.txt --flavor=woff2`),
|
|
32
|
+
通常几十 KB;并确认字体授权允许网页嵌入。
|
|
33
|
+
|
|
34
|
+
## 日期、星期、农历:用代码算
|
|
35
|
+
|
|
36
|
+
心算星期和农历是最常见的「事实性翻车」。时间一律带时区,按北京时间取各字段:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
const when = new Date('2026-10-18T11:58:00+08:00'); // 带 +08:00,外地访客也不会算错
|
|
40
|
+
new Intl.DateTimeFormat('zh-CN', { timeZone: 'Asia/Shanghai', weekday: 'long' }).format(when); // "星期日"
|
|
41
|
+
|
|
42
|
+
// 农历:浏览器自带中国历(主流内核都有),但「日」给的是数字,要自己换成「初九」
|
|
43
|
+
const DIGIT = '〇一二三四五六七八九';
|
|
44
|
+
const lunarDay = (n) => (n <= 10 ? '初' + (n === 10 ? '十' : DIGIT[n]) : n < 20 ? '十' + DIGIT[n - 10]
|
|
45
|
+
: n === 20 ? '二十' : n < 30 ? '廿' + DIGIT[n - 20] : '三十');
|
|
46
|
+
function lunarOf(d) {
|
|
47
|
+
const o = Object.fromEntries(new Intl.DateTimeFormat('zh-CN-u-ca-chinese', {
|
|
48
|
+
timeZone: 'Asia/Shanghai', year: 'numeric', month: 'long', day: 'numeric',
|
|
49
|
+
}).formatToParts(d).map((p) => [p.type, p.value]));
|
|
50
|
+
return `${o.yearName}年${o.month}${lunarDay(+o.day)}`; // "丙午年九月初九";month 还可能是「闰六月」「腊月」
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
写页面文案时也先跑一遍(run_python / node -e),把算出来的星期、农历写进去,再交给页面运行时复核。
|
|
54
|
+
算出来的日子如果碰上节日(九月初九是重阳、七月初七是七夕),可以做成文案亮点——前提是**算出来**的。
|
|
55
|
+
|
|
56
|
+
## 微信内置浏览器
|
|
57
|
+
|
|
58
|
+
| 场景 | 现象 | 做法 |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| 背景音乐 | 不能自动播放 | 首次点击(开启封面)时 `play()`;另挂 `WeixinJSBridgeReady` 兜底;`play()` 必须 `.catch()` |
|
|
61
|
+
| 分享卡片 | 自定义标题/图/描述需要公众号 JS-SDK 签名(后端) | 纯前端写好 `<title>` 与 description;按钮点了弹「点右上角 ··· 发送给朋友」引导层 |
|
|
62
|
+
| 下载文件 | .ics / .pdf 下载无反应 | 检测 `/MicroMessenger/i`,改为复制文本或提示「在浏览器打开」 |
|
|
63
|
+
| 复制 | 老版本没有 `navigator.clipboard` | 回退到隐藏 textarea + `document.execCommand('copy')` |
|
|
64
|
+
| 缓存 | 改了页面,好友打开还是旧的 | 静态资源带版本号(`style.css?v=2`);单文件 H5 换文件名或加查询参数 |
|
|
65
|
+
| 长按识别二维码 | CSS 背景图识别不了 | 二维码用 `<img>`,尺寸 ≥ 200px |
|
|
66
|
+
| 未备案域名 | 可能被提示「非微信官方网页」甚至拦截 | 国内分享用已备案域名的静态托管(对象存储 + CDN);GitHub Pages 在国内不稳定 |
|
|
67
|
+
|
|
68
|
+
web_inspect 可以用 `ua="wechat"` 模拟微信 UA,验证分支逻辑有没有走对(真机表现仍以手机为准)。
|
|
69
|
+
|
|
70
|
+
## 背景音乐(有 mp3 时)
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
const bgm = new Audio('music.mp3'); // 单声道 64–96kbps,≤1MB
|
|
74
|
+
bgm.loop = true; bgm.preload = 'auto';
|
|
75
|
+
let wanted = false;
|
|
76
|
+
const play = () => bgm.play().then(() => true, () => false); // 被拦:按钮保持「播放」态,等下一次点击
|
|
77
|
+
openButton.addEventListener('click', () => { wanted = true; play(); }); // 就在点击的调用栈里发起
|
|
78
|
+
document.addEventListener('WeixinJSBridgeReady', () => { if (wanted) play(); });
|
|
79
|
+
document.addEventListener('visibilitychange', () => { if (document.hidden) bgm.pause(); else if (wanted) play(); });
|
|
80
|
+
```
|
|
81
|
+
没有音乐文件时,不要引用一个不存在的 mp3——用模板里的 Web Audio 八音盒,或者干脆不做音乐按钮。
|
|
82
|
+
|
|
83
|
+
## 地图导航(不需要 key)
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
const kw = encodeURIComponent('西湖国宾馆'), city = encodeURIComponent('杭州');
|
|
87
|
+
`https://uri.amap.com/search?keyword=${kw}&city=${city}&callnative=1` // 高德(按名称检索)
|
|
88
|
+
`https://api.map.baidu.com/place/search?query=${kw}®ion=${city}&output=html&src=webapp.invite.h5` // 百度
|
|
89
|
+
`https://maps.apple.com/?q=${encodeURIComponent('杭州西湖国宾馆')}` // Apple 地图
|
|
90
|
+
// 有确切的高德坐标(GCJ-02)才用坐标:uri.amap.com/marker?position=经度,纬度&name=…
|
|
91
|
+
// 百度用坐标时加 coord_type=gcj02,否则会偏几百米
|
|
92
|
+
```
|
|
93
|
+
不要画一张「示意地图」冒充真地图——画错的地图比没有地图更糟。用插画 + 导航按钮。
|
|
94
|
+
|
|
95
|
+
## 性能预算(4G 网络、中端安卓)
|
|
96
|
+
|
|
97
|
+
- 首次加载总量 ≤ 1.5MB;单张图片 ≤ 300KB(WebP/AVIF,宽度按 2 倍屏给 ≤1080px);音乐 ≤ 1MB。
|
|
98
|
+
- 首屏以外的图片 `loading="lazy" decoding="async"`,并写死宽高或 `aspect-ratio`(防布局跳动)。
|
|
99
|
+
- 动画只动 transform / opacity;画布动画在页面不可见时停;粒子数量手机 ≤ 20。
|
|
100
|
+
- 不引框架也能做的单页 H5,就不引框架。确需第三方库,用国内镜像(npmmirror / bootcdn / staticfile)或打包进本地。
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# 动效配方
|
|
2
|
+
|
|
3
|
+
原则三条:**动效是编排,不是装饰**(让视线按你想要的顺序移动);**只动 transform / opacity**(其余属性逐帧重排、掉帧);
|
|
4
|
+
**尊重「减弱动态效果」**(`prefers-reduced-motion: reduce` 下一律直接显示终态)。
|
|
5
|
+
|
|
6
|
+
常用参数:时长 500–900ms(入场)/ 150–250ms(按压反馈);缓动 `cubic-bezier(.2,.7,.2,1)`(出场利落、收尾柔和);
|
|
7
|
+
弹性 `cubic-bezier(.34,1.56,.64,1)` 只给童趣类;同屏元素依次延迟 80–120ms。
|
|
8
|
+
|
|
9
|
+
## 1. 滚动入场(最常用,也最常写坏)
|
|
10
|
+
|
|
11
|
+
```css
|
|
12
|
+
/* 默认可见;只有脚本跑起来了才先藏——脚本出错时内容不会永远看不见 */
|
|
13
|
+
html.js .reveal { opacity: 0; transform: translateY(18px);
|
|
14
|
+
transition: opacity .9s var(--ease), transform .9s var(--ease); transition-delay: calc(var(--d, 0) * 110ms); }
|
|
15
|
+
html.js .reveal.is-in { opacity: 1; transform: none; }
|
|
16
|
+
@media (prefers-reduced-motion: reduce) { html.js .reveal { opacity: 1; transform: none; transition: none; } }
|
|
17
|
+
```
|
|
18
|
+
```html
|
|
19
|
+
<script>document.documentElement.classList.add('js')</script> <!-- 放在 <head> 里,先于首屏渲染 -->
|
|
20
|
+
<h2 class="reveal">标题</h2><p class="reveal" style="--d:1">副标题</p>
|
|
21
|
+
```
|
|
22
|
+
```js
|
|
23
|
+
const io = new IntersectionObserver((es) => es.forEach((e) => {
|
|
24
|
+
if (e.isIntersecting) { e.target.classList.add('is-in'); io.unobserve(e.target); }
|
|
25
|
+
}), { threshold: 0, rootMargin: '0px 0px -8% 0px' });
|
|
26
|
+
document.querySelectorAll('.reveal').forEach((el) => io.observe(el));
|
|
27
|
+
```
|
|
28
|
+
**两个坑**:`threshold: 0.5` 对比视口还高的元素永远达不到(长卡片、长表单永远看不见)——用 0 加底部内缩;
|
|
29
|
+
有全屏封面时,**等封面打开后再开始观察**,否则首屏入场在封面后面就放完了,访客看不到。
|
|
30
|
+
web_inspect 的「内容一直看不见」专抓这两类。
|
|
31
|
+
|
|
32
|
+
## 2. 首屏编排(封面打开后)
|
|
33
|
+
|
|
34
|
+
顺序:装饰先到(角花、枝叶淡入 600ms)→ 主视觉(印章落下 / 名字上浮)→ 副信息依次(日期、地点,每个 +110ms)→ 最后「向下」提示开始轻跳。
|
|
35
|
+
整段控制在 1.5 秒内——再长访客就开始滑了。
|
|
36
|
+
|
|
37
|
+
印章落下:
|
|
38
|
+
```css
|
|
39
|
+
@keyframes stamp { from { opacity: 0; transform: scale(1.9) rotate(-14deg); } to { opacity: 1; transform: scale(1) rotate(-4deg); } }
|
|
40
|
+
body.is-open .seal { animation: stamp .75s var(--ease) .25s both; }
|
|
41
|
+
html.js body:not(.is-open) .seal { opacity: 0; } /* 只在脚本可用时先藏 */
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## 3. 开门封面(请柬类的记忆点)
|
|
45
|
+
|
|
46
|
+
两扇门各占半屏、以外侧为轴转开:
|
|
47
|
+
```css
|
|
48
|
+
.gate { position: fixed; inset: 0; z-index: 50; perspective: 1400px; }
|
|
49
|
+
.door { position: absolute; top: 0; bottom: 0; width: 50.2%; transition: transform 1.25s var(--ease) .3s; }
|
|
50
|
+
.door--l { left: 0; transform-origin: left center; }
|
|
51
|
+
.door--r { right: 0; transform-origin: right center; }
|
|
52
|
+
.gate.is-opening .door--l { transform: rotateY(-108deg); }
|
|
53
|
+
.gate.is-opening .door--r { transform: rotateY(108deg); }
|
|
54
|
+
```
|
|
55
|
+
开门动画结束后必须真正移除封面(`hidden`),并解除滚动锁定与主体的 `inert`;
|
|
56
|
+
点击开门的那一次调用栈里同步发起 `music.play()`——它就是播放要的用户手势。完整实现见 `templates/wedding-invitation.html`。
|
|
57
|
+
|
|
58
|
+
## 4. SVG 描边(签名、藤蔓、线稿随滚动「画出来」)
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
const path = document.querySelector('.sign path');
|
|
62
|
+
const len = path.getTotalLength();
|
|
63
|
+
path.style.strokeDasharray = len; path.style.strokeDashoffset = len;
|
|
64
|
+
path.animate([{ strokeDashoffset: len }, { strokeDashoffset: 0 }], { duration: 1800, easing: 'ease-in-out', fill: 'forwards' });
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 5. 整屏翻页(一屏一屏滑的 H5)
|
|
68
|
+
|
|
69
|
+
```css
|
|
70
|
+
.pager { height: 100vh; height: 100dvh; overflow: hidden; touch-action: none; }
|
|
71
|
+
.track { height: 100%; transition: transform .7s var(--ease); will-change: transform; }
|
|
72
|
+
.page { height: 100%; overflow: hidden; }
|
|
73
|
+
```
|
|
74
|
+
```js
|
|
75
|
+
const track = document.querySelector('.track'), pages = track.children;
|
|
76
|
+
let i = 0, lock = false, y0 = 0;
|
|
77
|
+
const go = (n) => { if (lock || n < 0 || n >= pages.length || n === i) return; lock = true; i = n;
|
|
78
|
+
track.style.transform = `translate3d(0, ${-100 * i}%, 0)`; // 百分比相对 track 自身高度 = 一页高
|
|
79
|
+
pages[i].querySelectorAll('.reveal').forEach((el) => el.classList.add('is-in'));
|
|
80
|
+
setTimeout(() => { lock = false; }, 750); };
|
|
81
|
+
addEventListener('touchstart', (e) => { y0 = e.touches[0].clientY; }, { passive: true });
|
|
82
|
+
addEventListener('touchend', (e) => { const dy = e.changedTouches[0].clientY - y0; if (Math.abs(dy) > 50) go(i + (dy < 0 ? 1 : -1)); });
|
|
83
|
+
addEventListener('wheel', (e) => { if (Math.abs(e.deltaY) > 20) go(i + Math.sign(e.deltaY)); }, { passive: true });
|
|
84
|
+
addEventListener('keydown', (e) => { if (/ArrowDown|PageDown/.test(e.key)) go(i + 1); if (/ArrowUp|PageUp/.test(e.key)) go(i - 1); });
|
|
85
|
+
```
|
|
86
|
+
要点:每页内容必须能在最矮的屏(375×667)里放下,放不下就拆页;给页码指示器与「上滑」提示;
|
|
87
|
+
用 `translate3d(0, -100% * i, 0)` 时 track 的高度就是一页高(每个 .page 100%),不要写死像素。
|
|
88
|
+
**体检**:整页滚动走查翻不动这种页面——用 actions 的 `{"swipe":"up"}` 逐页翻,每页 `screenshot` / `expect_text`。
|
|
89
|
+
|
|
90
|
+
## 6. 数字滚动(倒计时、统计数字)
|
|
91
|
+
|
|
92
|
+
```js
|
|
93
|
+
function countUp(el, to, ms = 1200) {
|
|
94
|
+
const t0 = performance.now();
|
|
95
|
+
const step = (t) => { const p = Math.min(1, (t - t0) / ms); el.textContent = Math.round(to * (1 - Math.pow(1 - p, 3)));
|
|
96
|
+
if (p < 1) requestAnimationFrame(step); };
|
|
97
|
+
requestAnimationFrame(step);
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
数字列加 `font-variant-numeric: tabular-nums`,否则跳动时整行左右抖。
|
|
101
|
+
|
|
102
|
+
## 7. 金属光泽扫过(暗夜鎏金类标题)
|
|
103
|
+
|
|
104
|
+
```css
|
|
105
|
+
.shine { color: #D4B06A; } /* 回退色:不支持 background-clip 时照样可读 */
|
|
106
|
+
@supports (-webkit-background-clip: text) or (background-clip: text) {
|
|
107
|
+
.shine { color: transparent; -webkit-background-clip: text; background-clip: text;
|
|
108
|
+
background-image: linear-gradient(110deg, #B8924A 20%, #F6E3B4 40%, #B8924A 60%); background-size: 250% 100%;
|
|
109
|
+
animation: sweep 3.2s ease-in-out infinite; }
|
|
110
|
+
}
|
|
111
|
+
@keyframes sweep { from { background-position: 100% 0; } to { background-position: -100% 0; } }
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## 8. 轻视差
|
|
115
|
+
|
|
116
|
+
```js
|
|
117
|
+
const layers = [...document.querySelectorAll('[data-depth]')];
|
|
118
|
+
let ticking = false;
|
|
119
|
+
addEventListener('scroll', () => { if (ticking) return; ticking = true; requestAnimationFrame(() => {
|
|
120
|
+
const y = scrollY; layers.forEach((el) => { el.style.transform = `translate3d(0, ${y * el.dataset.depth}px, 0)`; }); ticking = false; }); }, { passive: true });
|
|
121
|
+
```
|
|
122
|
+
depth 取 -0.15~0.15;减弱动效时不绑定。只给装饰层用,文字层不要动。
|
|
123
|
+
|
|
124
|
+
## 9. 飘落粒子(花瓣、雪、彩纸)
|
|
125
|
+
|
|
126
|
+
画布铺满屏幕、`pointer-events:none`、`aria-hidden`;DPR 封顶 2;手机 ≤ 20 个粒子;
|
|
127
|
+
`visibilitychange` 时停帧;减弱动效时不启动。完整实现见模板的 `createPetals`。
|
|
128
|
+
|
|
129
|
+
## 反模式
|
|
130
|
+
|
|
131
|
+
- 所有元素同时淡入(没有编排 = 没有动效);
|
|
132
|
+
- 入场距离 >40px、时长 >1.2s(像卡顿);
|
|
133
|
+
- `transition: all`(连颜色、阴影、布局一起过渡,既慢又不可控);
|
|
134
|
+
- 在 `@keyframes` 里改 top/left/width/height/margin(web_inspect 会提示「动画动了布局属性」);
|
|
135
|
+
- 滚动劫持整页平滑滚动(除非是整屏翻页,否则别碰原生滚动);
|
|
136
|
+
- 永不停止的大面积动画(晕动症用户会直接关页面)。
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# 页面类型配方
|
|
2
|
+
|
|
3
|
+
每种页面列四件事:**必备模块**(缺一个访客就会问)、**加分项**(做了会被夸)、**文案要点**、**常见翻车**。
|
|
4
|
+
先按配方把模块列进 todo,再动手。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 婚礼请柬 → 直接用 `templates/wedding-invitation.html`
|
|
9
|
+
|
|
10
|
+
必备:新人名字、日期(公历 + 星期 + 农历)、时间、地点(名称 + 厅 + 地址 + 导航)、流程、回执、音乐开关、分享。
|
|
11
|
+
加分:开启封面、`?to=宾客名` 个性化称呼、加入日历、倒计时(婚后自动变「已相守 N 天」)、着装/停车提示、相册(有照片时)。
|
|
12
|
+
文案:
|
|
13
|
+
- 新人自己邀请:「谨定于公历……举行结婚典礼 敬备喜宴 恭候光临」,落款「新郎 新娘 敬邀」;
|
|
14
|
+
- 双方父母邀请:「谨定于……为长子 ××× 与 ××× 女士举行结婚典礼 恭请 光临」,落款父母姓名——**要问用户是哪种**;
|
|
15
|
+
- 诗词可用《诗经·桃夭》「桃之夭夭,灼灼其华。之子于归,宜其室家。」《诗经·击鼓》「执子之手,与子偕老。」
|
|
16
|
+
常见翻车:星期/农历写错;流程时间是自己编的却没标「待确认」;引用不存在的照片与音乐;把「把照片放到 assets 里」写在页面上。
|
|
17
|
+
|
|
18
|
+
## 2. 其它邀请函(生日 / 满月百日 / 乔迁 / 寿宴 / 开业 / 年会)
|
|
19
|
+
|
|
20
|
+
从婚礼模板改:换 `INVITE` 文案、删掉不需要的区块、换主题(见 design-direction.md)。
|
|
21
|
+
- **生日/满月**:童趣糖果或暖阳生活;主角名字 + 年龄/「满月」字样;满月宴文案「小女/小儿满月之喜,略备薄酒」;照片是灵魂(没有就用插画)。
|
|
22
|
+
- **寿宴**:新中式;「恭请光临 ××× 先生/女士 ×十大寿寿宴」;字号整体放大一档(长辈亲友多)。
|
|
23
|
+
- **乔迁**:「乔迁新居,略备薄酒」;导航与停车说明最重要;可加小区/楼栋/门牌。
|
|
24
|
+
- **开业**:暖阳生活或品牌色;开业时间、优惠、地址导航、营业时间、电话;回执可换成「预约到店」。
|
|
25
|
+
- **年会**:暗夜鎏金;议程、节目、抽奖说明、着装要求、座位/签到方式;回执收集部门与姓名。
|
|
26
|
+
|
|
27
|
+
## 3. 活动报名 / 会议
|
|
28
|
+
|
|
29
|
+
必备:活动名 + 一句价值、时间地点(加入日历 + 导航)、议程(时间轴)、报名表(校验 + 成功态 + 名额/截止)、主办方与联系方式。
|
|
30
|
+
加分:嘉宾介绍(**只用用户给的真实信息**)、往届亮点、FAQ(交通、是否收费、能否带人)、报名后生成入场凭证(二维码需真实服务)。
|
|
31
|
+
表单:字段尽量少(姓名、手机、单位足够);失败保留已填内容;提交按钮防重复;有接口就 POST,没有就如实说明「数据保存在本机,需要接收报名请提供接口或表单服务」。
|
|
32
|
+
翻车:虚构嘉宾头衔;报名成功只 alert 一下;没写截止时间。
|
|
33
|
+
|
|
34
|
+
## 4. 产品 / 品牌落地页
|
|
35
|
+
|
|
36
|
+
结构:首屏(一句价值主张 + 一个主按钮 + 产品画面)→ 痛点/场景 → 核心能力(按「用户得到什么」写,不按功能名写)→ 工作原理(三步)→
|
|
37
|
+
真实证据(客户、数据、案例——没有就不写)→ 价格/方案(如有)→ FAQ → 收尾号召 → 页脚。
|
|
38
|
+
设计:清透科技 / 杂志编辑 / 品牌色;首屏主视觉用 CSS/SVG 画的产品界面或抽象图形,不用外链图库。
|
|
39
|
+
SEO:`<title>`、description、og 标签、语义化标题层级、图片 alt。
|
|
40
|
+
翻车:紫蓝渐变 + 三列图标卡片;「10000+ 用户信赖」这类编造数字;五个按钮都叫「立即体验」。
|
|
41
|
+
|
|
42
|
+
## 5. 个人主页 / 作品集
|
|
43
|
+
|
|
44
|
+
结构:一句话自我定位 → 精选作品(每个:背景、我的角色、过程、结果)→ 关于我 → 联系方式。
|
|
45
|
+
设计:杂志编辑 / 水墨极简;作品图用 `aspect-ratio` 占位 + 懒加载;案例页可用同一模板复用。
|
|
46
|
+
翻车:技能进度条(「PS 90%」毫无信息量);作品只有图没有说明;联系方式是 `href="#"`。
|
|
47
|
+
|
|
48
|
+
## 6. 门店 / 餐厅
|
|
49
|
+
|
|
50
|
+
必备:营业时间(**按当前时间算「营业中/已打烊」**)、地址导航、一键拨号(`tel:`)、菜单/价目、环境照片。
|
|
51
|
+
加分:今日推荐、预约/排队、会员活动、外卖平台入口。
|
|
52
|
+
翻车:营业时间写死不判断;电话号码不能点;菜单图片 3MB 一张。
|
|
53
|
+
|
|
54
|
+
## 7. 互动小游戏 / 测试 H5
|
|
55
|
+
|
|
56
|
+
结构:开始页(规则一句话 + 开始按钮)→ 游戏/答题(状态机:ready → playing → paused → over)→ 结果页(得分/结论 + 再玩一次 + 分享)。
|
|
57
|
+
技术:`requestAnimationFrame` 主循环、按时间步进(不按帧数,否则高刷屏跑得快);触控与键盘两套输入;
|
|
58
|
+
`visibilitychange` 自动暂停;最高分存 localStorage;结果海报用 canvas 生成(`toDataURL` 后放进 `<img>` 才能在微信里长按保存)。
|
|
59
|
+
翻车:没有暂停;横竖屏切换后画布变形(监听 resize 重算);结果只能截图分享。
|
|
60
|
+
|
|
61
|
+
## 8. 工具型单页(计算器、换算、生成器)
|
|
62
|
+
|
|
63
|
+
必备:输入即算(防抖 150ms)、非法输入的即时提示、空状态说明、结果一键复制、清空。
|
|
64
|
+
加分:记住上次输入(localStorage)、键盘操作(Enter 计算、Esc 清空)、示例填充、结果可分享链接(参数写进 URL)。
|
|
65
|
+
翻车:浮点误差直接显示(`0.1+0.2`)——金额用整数分或 `toFixed` 后再显示;大数没有千分位;错误输入时页面报错白屏。
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 所有类型通用的收尾
|
|
70
|
+
|
|
71
|
+
1. web_inspect 三个视口必修清零;
|
|
72
|
+
2. 关键流程用 actions 走一遍(开启、提交、成功态、再次进入);
|
|
73
|
+
3. 过一遍 `craft-checklist.md`;
|
|
74
|
+
4. 交付说明写清:怎么打开/部署、怎么改内容、验证了什么、待确认什么。
|