@gong-ym/ai-spec-auto 0.2.13 → 0.2.15
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/.agents/commands/README.md +33 -33
- package/.agents/commands/claude/spec-start-review.md +88 -88
- package/.agents/commands/codex/spec-continue.md +74 -74
- package/.agents/commands/codex/spec-orchestrate.md +35 -35
- package/.agents/commands/codex/spec-start-review.md +88 -88
- package/.agents/commands/codex/spec-start.md +67 -67
- package/.agents/commands/codex/spec-status.md +22 -22
- package/.agents/commands/codex/spec-stop.md +29 -29
- package/.agents/commands/codex/spec-update.md +40 -40
- package/.agents/commands/common/branch-review.md +117 -117
- package/.agents/commands/common/project-init.md +25 -25
- package/.agents/commands/common/spec-continue.md +74 -74
- package/.agents/commands/common/spec-orchestrate.md +35 -35
- package/.agents/commands/common/spec-start-review.md +82 -82
- package/.agents/commands/common/spec-start.md +67 -67
- package/.agents/commands/common/spec-status.md +22 -22
- package/.agents/commands/common/spec-stop.md +29 -29
- package/.agents/commands/common/spec-update.md +60 -40
- package/.agents/commands/cursor/opsx-apply.md +55 -55
- package/.agents/commands/cursor/opsx-archive.md +48 -48
- package/.agents/commands/cursor/opsx-explore.md +45 -45
- package/.agents/commands/cursor/opsx-propose.md +59 -59
- package/.agents/commands/cursor/spec-continue.md +63 -63
- package/.agents/commands/cursor/spec-orchestrate.md +53 -53
- package/.agents/commands/cursor/spec-start-review.md +78 -78
- package/.agents/commands/cursor/spec-start.md +59 -59
- package/.agents/commands/cursor/spec-status.md +30 -30
- package/.agents/commands/cursor/spec-stop.md +29 -29
- package/.agents/commands/cursor/spec-update.md +41 -41
- package/.agents/flows/FRONTMATTER.md +263 -263
- package/.agents/flows/RUN_OUTPUT.md +263 -263
- package/.agents/flows/common/README.md +29 -29
- package/.agents/flows/common/bugfix-to-verification.md +95 -95
- package/.agents/flows/common/change-to-architecture-review.md +89 -89
- package/.agents/flows/common/change-to-release.md +94 -94
- package/.agents/flows/common/prd-to-delivery.md +184 -184
- package/.agents/flows/common/requirement-to-observability.md +97 -97
- package/.agents/orchestration/README.md +22 -22
- package/.agents/orchestration/expert-dispatch-spec.md +155 -155
- package/.agents/orchestration/expert-executor-spec.md +84 -84
- package/.agents/orchestration/expert-runtime-action-spec.md +73 -73
- package/.agents/orchestration/runtime-state-handoff-spec.md +264 -264
- package/.agents/orchestration/task-anchor-spec.md +212 -212
- package/.agents/orchestration/task-orchestrator-adapter-payload.md +153 -153
- package/.agents/orchestration/task-orchestrator-bootstrap-payload.md +145 -145
- package/.agents/orchestration/task-orchestrator-output-extractor-spec.md +93 -93
- package/.agents/orchestration/task-orchestrator-run-plan-template.md +312 -312
- package/.agents/orchestration/task-orchestrator-runtime-hooks.md +214 -214
- package/.agents/registry/README.md +63 -63
- package/.agents/registry/flows.json +125 -125
- package/.agents/registry/profiles.json +101 -101
- package/.agents/registry/roles.json +1265 -1265
- package/.agents/registry/rules.json +148 -148
- package/.agents/registry/scenario-packages.json +123 -123
- package/.agents/registry/skills.json +130 -130
- package/.agents/roles/INDEX.md +346 -346
- package/.agents/roles/common/README.md +76 -76
- package/.agents/roles/common/archive-change.md +80 -80
- package/.agents/roles/common/backend-implementer.md +92 -92
- package/.agents/roles/common/code-guardian.md +151 -151
- package/.agents/roles/common/frontend-implementer.md +146 -146
- package/.agents/roles/common/requirement-analyst.md +138 -138
- package/.agents/roles/common/task-orchestrator-routing.md +301 -301
- package/.agents/roles/common/task-orchestrator.md +224 -224
- package/.agents/roles/common/tooling-implementer.md +92 -92
- package/.agents/roles/domains/README.md +35 -35
- package/.agents/roles/domains/delivery/README.md +11 -11
- package/.agents/roles/domains/delivery/container-specialist.md +50 -50
- package/.agents/roles/domains/delivery/deployment-specialist.md +50 -50
- package/.agents/roles/domains/delivery/pipeline-specialist.md +50 -50
- package/.agents/roles/domains/demand-design/README.md +16 -16
- package/.agents/roles/domains/demand-design/api-contract-specialist.md +52 -52
- package/.agents/roles/domains/demand-design/design-collaborator.md +58 -58
- package/.agents/roles/domains/documentation/README.md +11 -11
- package/.agents/roles/domains/documentation/api-doc-specialist.md +50 -50
- package/.agents/roles/domains/documentation/component-doc-specialist.md +49 -49
- package/.agents/roles/domains/documentation/technical-writing-specialist.md +48 -48
- package/.agents/roles/domains/engineering/README.md +17 -17
- package/.agents/roles/domains/engineering/architecture-advisor.md +53 -53
- package/.agents/roles/domains/engineering/build-specialist.md +51 -51
- package/.agents/roles/domains/engineering/dependency-governor.md +52 -52
- package/.agents/roles/domains/governance/README.md +17 -17
- package/.agents/roles/domains/governance/api-governance-specialist.md +51 -51
- package/.agents/roles/domains/governance/lint-policy-specialist.md +49 -49
- package/.agents/roles/domains/governance/route-governance-specialist.md +52 -52
- package/.agents/roles/domains/observability/README.md +11 -11
- package/.agents/roles/domains/observability/error-tracker.md +50 -50
- package/.agents/roles/domains/observability/event-instrumentation-specialist.md +51 -51
- package/.agents/roles/domains/observability/rum-analyst.md +50 -50
- package/.agents/roles/domains/performance/README.md +11 -11
- package/.agents/roles/domains/performance/asset-optimizer.md +50 -50
- package/.agents/roles/domains/performance/performance-auditor.md +56 -56
- package/.agents/roles/domains/performance/vitals-analyst.md +50 -50
- package/.agents/roles/domains/security-a11y/README.md +11 -11
- package/.agents/roles/domains/security-a11y/a11y-auditor.md +50 -50
- package/.agents/roles/domains/security-a11y/aria-specialist.md +51 -51
- package/.agents/roles/domains/security-a11y/security-reviewer.md +49 -49
- package/.agents/roles/domains/testing/README.md +12 -12
- package/.agents/roles/domains/testing/coverage-analyst.md +50 -50
- package/.agents/roles/domains/testing/e2e-test-specialist.md +51 -51
- package/.agents/roles/domains/testing/unit-test-specialist.md +56 -56
- package/.agents/roles/domains/testing/verification-reviewer.md +67 -67
- package/.agents/rules/README.md +87 -87
- package/.agents/rules/common/02-/347/274/226/347/240/201/350/247/204/350/214/203.md +45 -45
- package/.agents/rules/common/08-/351/200/232/347/224/250/347/272/246/346/235/237.md +63 -63
- package/.agents/rules/common/10-/346/226/207/346/241/243/350/247/204/350/214/203.md +101 -101
- package/.agents/rules/common/12-Superpowers/346/211/247/350/241/214/350/247/204/350/214/203.md +46 -46
- package/.agents/rules/common/14-/345/256/241/350/256/241/346/261/207/346/212/245/350/247/204/350/214/203.md +107 -107
- package/.agents/rules/common/15-visual-gate-wait.md +90 -90
- package/.agents/rules/profiles/nestjs/01-/351/241/271/347/233/256/346/246/202/350/277/260.md +27 -27
- package/.agents/rules/profiles/nestjs/03-/351/241/271/347/233/256/347/273/223/346/236/204.md +20 -20
- package/.agents/rules/profiles/nestjs/04-/346/250/241/345/235/227/347/273/223/346/236/204/350/247/204/350/214/203.md +24 -24
- package/.agents/rules/profiles/nestjs/05-/346/216/245/345/217/243/344/270/216/345/245/221/347/272/246/350/247/204/350/214/203.md +24 -24
- package/.agents/rules/profiles/nestjs/06-/346/225/260/346/215/256/350/256/277/351/227/256/350/247/204/350/214/203.md +24 -24
- package/.agents/rules/profiles/nestjs/07-/351/205/215/347/275/256/344/270/216/350/277/220/350/241/214/346/227/266/350/247/204/350/214/203.md +20 -20
- package/.agents/rules/profiles/nestjs/09-/345/274/202/345/270/270/344/270/216/346/227/245/345/277/227/350/247/204/350/214/203.md +20 -20
- package/.agents/rules/profiles/nestjs/11-/346/265/213/350/257/225/350/247/204/350/214/203.md +24 -24
- package/.agents/rules/profiles/nestjs/13-/344/273/243/347/240/201/346/240/274/345/274/217/345/214/226/344/270/216/346/243/200/346/237/245.md +20 -20
- package/.agents/rules/profiles/node-tooling/01-/351/241/271/347/233/256/346/246/202/350/277/260.md +30 -30
- package/.agents/rules/profiles/node-tooling/03-/351/241/271/347/233/256/347/273/223/346/236/204.md +37 -37
- package/.agents/rules/profiles/node-tooling/04-CLI/344/270/216/346/250/241/345/235/227/350/247/204/350/214/203.md +42 -42
- package/.agents/rules/profiles/node-tooling/05-Contract/344/270/216Schema/350/247/204/350/214/203.md +42 -42
- package/.agents/rules/profiles/node-tooling/06-/350/277/220/350/241/214/346/227/266/346/226/207/344/273/266/350/247/204/350/214/203.md +30 -30
- package/.agents/rules/profiles/node-tooling/07-/346/227/245/345/277/227/344/270/216/351/224/231/350/257/257/345/244/204/347/220/206/350/247/204/350/214/203.md +60 -60
- package/.agents/rules/profiles/node-tooling/09-/350/204/232/346/234/254/344/270/216/345/205/245/345/217/243/350/247/204/350/214/203.md +45 -45
- package/.agents/rules/profiles/node-tooling/11-/346/265/213/350/257/225/350/247/204/350/214/203.md +41 -41
- package/.agents/rules/profiles/node-tooling/13-/344/273/243/347/240/201/346/240/274/345/274/217/345/214/226/344/270/216/346/243/200/346/237/245.md +55 -55
- package/.agents/rules/profiles/react/01-/351/241/271/347/233/256/346/246/202/350/277/260.md +29 -29
- package/.agents/rules/profiles/react/03-/351/241/271/347/233/256/347/273/223/346/236/204.md +104 -104
- package/.agents/rules/profiles/react/04-/347/273/204/344/273/266/350/247/204/350/214/203.md +46 -46
- package/.agents/rules/profiles/react/05-API/350/247/204/350/214/203.md +67 -67
- package/.agents/rules/profiles/react/06-/350/267/257/347/224/261/350/247/204/350/214/203.md +54 -54
- package/.agents/rules/profiles/react/07-/347/212/266/346/200/201/347/256/241/347/220/206.md +226 -226
- package/.agents/rules/profiles/react/09-/346/240/267/345/274/217/350/247/204/350/214/203.md +71 -71
- package/.agents/rules/profiles/react/11-/346/265/213/350/257/225/350/247/204/350/214/203.md +80 -80
- package/.agents/rules/profiles/react/13-/344/273/243/347/240/201/346/240/274/345/274/217/345/214/226/344/270/216/346/243/200/346/237/245.md +159 -159
- package/.agents/rules/profiles/springboot/01-/351/241/271/347/233/256/346/246/202/350/277/260.md +31 -31
- package/.agents/rules/profiles/springboot/03-/351/241/271/347/233/256/347/273/223/346/236/204.md +37 -37
- package/.agents/rules/profiles/springboot/04-/345/210/206/345/261/202/350/247/204/350/214/203.md +33 -33
- package/.agents/rules/profiles/springboot/05-/346/216/245/345/217/243/344/270/216/345/245/221/347/272/246/350/247/204/350/214/203.md +51 -51
- package/.agents/rules/profiles/springboot/06-/346/225/260/346/215/256/350/256/277/351/227/256/350/247/204/350/214/203.md +34 -34
- package/.agents/rules/profiles/springboot/07-/351/205/215/347/275/256/344/270/216/350/277/220/350/241/214/346/227/266/350/247/204/350/214/203.md +38 -38
- package/.agents/rules/profiles/springboot/09-/345/274/202/345/270/270/344/270/216/346/227/245/345/277/227/350/247/204/350/214/203.md +48 -48
- package/.agents/rules/profiles/springboot/11-/346/265/213/350/257/225/350/247/204/350/214/203.md +43 -43
- package/.agents/rules/profiles/springboot/13-/344/273/243/347/240/201/346/240/274/345/274/217/345/214/226/344/270/216/346/243/200/346/237/245.md +48 -48
- package/.agents/rules/profiles/vue/01-/351/241/271/347/233/256/346/246/202/350/277/260.md +47 -47
- package/.agents/rules/profiles/vue/03-/351/241/271/347/233/256/347/273/223/346/236/204.md +106 -106
- package/.agents/rules/profiles/vue/04-/347/273/204/344/273/266/350/247/204/350/214/203.md +61 -61
- package/.agents/rules/profiles/vue/05-API/350/247/204/350/214/203.md +67 -67
- package/.agents/rules/profiles/vue/06-/350/267/257/347/224/261/350/247/204/350/214/203.md +69 -69
- package/.agents/rules/profiles/vue/07-/347/212/266/346/200/201/347/256/241/347/220/206.md +93 -93
- package/.agents/rules/profiles/vue/09-/346/240/267/345/274/217/350/247/204/350/214/203.md +67 -67
- package/.agents/rules/profiles/vue/11-/346/265/213/350/257/225/350/247/204/350/214/203.md +80 -80
- package/.agents/rules/profiles/vue/13-/344/273/243/347/240/201/346/240/274/345/274/217/345/214/226/344/270/216/346/243/200/346/237/245.md +159 -159
- package/.agents/skills/README.md +171 -171
- package/.agents/skills/common/archive-change/SKILL.md +180 -180
- package/.agents/skills/common/branch-code-reviewer/SKILL.md +533 -459
- package/.agents/skills/common/branch-code-reviewer/references/business-risk-guide.md +293 -293
- package/.agents/skills/common/branch-code-reviewer/references/html-template-guide.md +121 -121
- package/.agents/skills/common/config-and-secret-scan/SKILL.md +99 -99
- package/.agents/skills/common/create-proposal/SKILL.md +192 -192
- package/.agents/skills/common/create-proposal/evals/evals.json +16 -16
- package/.agents/skills/common/create-proposal/evals/train_queries.json +18 -18
- package/.agents/skills/common/create-proposal/evals/validation_queries.json +18 -18
- package/.agents/skills/common/create-proposal/references/interaction-spec-template.md +42 -42
- package/.agents/skills/common/create-test/SKILL.md +292 -292
- package/.agents/skills/common/dependency-impact-graph/SKILL.md +80 -80
- package/.agents/skills/common/execute-task/SKILL.md +206 -206
- package/.agents/skills/common/execute-task/evals/evals.json +16 -16
- package/.agents/skills/common/execute-task/evals/train_queries.json +18 -18
- package/.agents/skills/common/execute-task/evals/validation_queries.json +18 -18
- package/.agents/skills/common/find-skills/SKILL.md +144 -144
- package/.agents/skills/common/install-ai-spec-auto/SKILL.md +260 -260
- package/.agents/skills/common/install-ai-spec-auto/evals/evals.json +17 -17
- package/.agents/skills/common/install-ai-spec-auto/evals/train_queries.json +18 -18
- package/.agents/skills/common/install-ai-spec-auto/evals/validation_queries.json +18 -18
- package/.agents/skills/common/project-init/SKILL.md +178 -178
- package/.agents/skills/common/project-init/evals/evals.json +16 -16
- package/.agents/skills/common/project-init/evals/train_queries.json +18 -18
- package/.agents/skills/common/project-init/evals/validation_queries.json +18 -18
- package/.agents/skills/common/project-init/references/custom-rule-generation.md +89 -89
- package/.agents/skills/common/project-init/references/deep-scan-rules.md +67 -67
- package/.agents/skills/common/project-init/references/output-contracts.md +71 -71
- package/.agents/skills/common/project-init/references/repo-fact-gathering.md +83 -83
- package/.agents/skills/common/project-init/references/scope-resolution.md +76 -76
- package/.agents/skills/common/project-init/scripts/inspect-project.js +112 -112
- package/.agents/skills/common/skill-creator/LICENSE.txt +201 -201
- package/.agents/skills/common/skill-creator/SKILL.md +370 -370
- package/.agents/skills/common/skill-creator/evals/evals.json +16 -16
- package/.agents/skills/common/skill-creator/evals/train_queries.json +18 -18
- package/.agents/skills/common/skill-creator/evals/validation_queries.json +18 -18
- package/.agents/skills/common/skill-creator/references/output-patterns.md +82 -82
- package/.agents/skills/common/skill-creator/references/workflows.md +27 -27
- package/.agents/skills/common/skill-creator/scripts/init_skill.py +209 -209
- package/.agents/skills/common/skill-creator/scripts/package_skill.py +110 -110
- package/.agents/skills/common/skill-creator/scripts/quick_validate.py +51 -51
- package/.agents/skills/common/skill-optimizer/SKILL.md +102 -102
- package/.agents/skills/common/skill-optimizer/evals/evals.json +16 -16
- package/.agents/skills/common/skill-optimizer/evals/train_queries.json +18 -18
- package/.agents/skills/common/skill-optimizer/evals/validation_queries.json +18 -18
- package/.agents/skills/common/skill-optimizer/references/design-patterns.md +26 -26
- package/.agents/skills/common/skill-optimizer/references/review-checklist.md +22 -22
- package/.agents/skills/common/using-superpowers/SKILL.md +151 -151
- package/.agents/skills/common/wait-for-gate-signal/SKILL.md +85 -85
- package/.agents/skills/domains/README.md +19 -19
- package/.agents/skills/domains/ui-ux-pro-max/SKILL.md +58 -58
- package/.agents/skills/domains/web/design-analysis/SKILL.md +89 -89
- package/.agents/skills/domains/web/design-analysis/rules/analysis-order.md +61 -61
- package/.agents/skills/domains/web/design-analysis/rules/analysis-priorities.md +136 -136
- package/.agents/skills/domains/web/design-analysis/rules/checklist-common-misses.md +107 -107
- package/.agents/skills/domains/web/design-analysis/rules/implementation-common-errors.md +204 -204
- package/.agents/skills/domains/web/design-analysis/rules/implementation-guidelines.md +211 -211
- package/.agents/skills/domains/web/design-analysis/rules/output-analysis-checklist.md +247 -247
- package/.agents/skills/domains/web/design-analysis/rules/tools-design-guidelines.md +108 -108
- package/.agents/skills/domains/web/design-analysis/rules/workflow-element-extraction.md +162 -162
- package/.agents/skills/domains/web/design-analysis/rules/workflow-layout-map.md +131 -131
- package/.agents/skills/domains/web/design-analysis/rules/workflow-output-checklist.md +70 -70
- package/.agents/skills/domains/web/design-analysis/rules/workflow-style-summary.md +91 -91
- package/.agents/skills/domains/web/route-permission-map/SKILL.md +103 -103
- package/.agents/skills/domains/web/ui-verification/SKILL.md +114 -114
- package/.agents/skills/domains/web/ui-verification/evals/evals.json +16 -16
- package/.agents/skills/domains/web/ui-verification/evals/train_queries.json +18 -18
- package/.agents/skills/domains/web/ui-verification/evals/validation_queries.json +18 -18
- package/.agents/skills/domains/web/ui-verification/rules/comparison-content-image.md +34 -34
- package/.agents/skills/domains/web/ui-verification/rules/comparison-content-text.md +30 -30
- package/.agents/skills/domains/web/ui-verification/rules/comparison-hierarchy.md +33 -33
- package/.agents/skills/domains/web/ui-verification/rules/comparison-layout.md +35 -35
- package/.agents/skills/domains/web/ui-verification/rules/errors-alignment.md +42 -42
- package/.agents/skills/domains/web/ui-verification/rules/errors-button-dimensions.md +28 -28
- package/.agents/skills/domains/web/ui-verification/rules/errors-button-position.md +25 -25
- package/.agents/skills/domains/web/ui-verification/rules/errors-css-priority.md +50 -50
- package/.agents/skills/domains/web/ui-verification/rules/errors-flex-column-width.md +46 -46
- package/.agents/skills/domains/web/ui-verification/rules/errors-flex-layout.md +46 -46
- package/.agents/skills/domains/web/ui-verification/rules/errors-grid-container-width.md +44 -44
- package/.agents/skills/domains/web/ui-verification/rules/errors-page-container-width.md +39 -39
- package/.agents/skills/domains/web/ui-verification/rules/tools-browser-navigation.md +53 -53
- package/.agents/skills/domains/web/ui-verification/rules/tools-design-guidelines.md +53 -53
- package/.agents/skills/domains/web/ui-verification/rules/workflow-checklist.md +27 -27
- package/.agents/skills/domains/web/ui-verification/rules/workflow-problem-list.md +56 -56
- package/.agents/skills/domains/web/ui-verification/rules/workflow-reflection.md +44 -44
- package/.agents/skills/domains/web/ui-verification/rules/writing-alignment.md +44 -44
- package/.agents/skills/domains/web/ui-verification/rules/writing-element-completeness.md +63 -63
- package/.agents/skills/domains/web/ui-verification/rules/writing-list-layout.md +75 -75
- package/.agents/skills/domains/web/ui-verification/rules/writing-page-container-width.md +37 -37
- package/.agents/skills/domains/web/web-design-guidelines/SKILL.md +40 -40
- package/.agents/skills/profiles/nestjs/README.md +4 -4
- package/.agents/skills/profiles/node-tooling/README.md +9 -9
- package/.agents/skills/profiles/react/create-api/SKILL.md +145 -145
- package/.agents/skills/profiles/react/create-component/SKILL.md +160 -160
- package/.agents/skills/profiles/react/create-route/SKILL.md +168 -168
- package/.agents/skills/profiles/react/create-store/SKILL.md +262 -262
- package/.agents/skills/profiles/react/theme-variables/SKILL.md +82 -82
- package/.agents/skills/profiles/react/vercel-composition-patterns/AGENTS.md +899 -899
- package/.agents/skills/profiles/react/vercel-composition-patterns/SKILL.md +81 -81
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -100
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/architecture-compound-components.md +112 -112
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -87
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -100
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/state-context-interface.md +191 -191
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -113
- package/.agents/skills/profiles/react/vercel-composition-patterns/rules/state-lift-state.md +125 -125
- package/.agents/skills/profiles/react/vercel-react-best-practices/AGENTS.md +2934 -2934
- package/.agents/skills/profiles/react/vercel-react-best-practices/SKILL.md +136 -136
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -55
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/advanced-init-once.md +42 -42
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/advanced-use-latest.md +39 -39
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/async-api-routes.md +38 -38
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/async-defer-await.md +80 -80
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/async-dependencies.md +51 -51
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/async-parallel.md +28 -28
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -99
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/bundle-barrel-imports.md +59 -59
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/bundle-conditional.md +31 -31
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -49
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -35
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/bundle-preload.md +50 -50
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/client-event-listeners.md +74 -74
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -71
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -48
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/client-swr-dedup.md +56 -56
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -107
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-cache-function-results.md +80 -80
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-cache-property-access.md +28 -28
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-cache-storage.md +70 -70
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-combine-iterations.md +32 -32
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-early-exit.md +50 -50
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -45
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-index-maps.md +37 -37
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-length-check-first.md +49 -49
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-min-max-loop.md +82 -82
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -24
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -57
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-activity.md +26 -26
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -47
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -40
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -38
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -46
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -82
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -30
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -28
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -75
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -39
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-dependencies.md +45 -45
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -40
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-derived-state.md +29 -29
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -74
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -58
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -38
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-memo.md +44 -44
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -45
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -35
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-transitions.md +40 -40
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -73
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -73
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-auth-actions.md +96 -96
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-cache-lru.md +41 -41
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-cache-react.md +76 -76
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-dedup-props.md +65 -65
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -83
- package/.agents/skills/profiles/react/vercel-react-best-practices/rules/server-serialization.md +38 -38
- package/.agents/skills/profiles/springboot/README.md +10 -10
- package/.agents/skills/profiles/vue/create-api/SKILL.md +105 -105
- package/.agents/skills/profiles/vue/create-component/SKILL.md +76 -76
- package/.agents/skills/profiles/vue/create-route/SKILL.md +141 -141
- package/.agents/skills/profiles/vue/create-store/SKILL.md +97 -97
- package/.agents/skills/profiles/vue/create-view/SKILL.md +81 -81
- package/.agents/skills/profiles/vue/theme-variables/SKILL.md +73 -73
- package/.agents/skills/profiles/vue/vue-best-practices/SKILL.md +166 -166
- package/.agents/skills/profiles/vue/vue-best-practices/references/animation-class-based-technique.md +254 -254
- package/.agents/skills/profiles/vue/vue-best-practices/references/animation-state-driven-technique.md +291 -291
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-async.md +97 -97
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-data-flow.md +307 -307
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-fallthrough-attrs.md +174 -174
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-keep-alive.md +137 -137
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-slots.md +216 -216
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-suspense.md +228 -228
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-teleport.md +108 -108
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-transition-group.md +128 -128
- package/.agents/skills/profiles/vue/vue-best-practices/references/component-transition.md +125 -125
- package/.agents/skills/profiles/vue/vue-best-practices/references/composables.md +290 -290
- package/.agents/skills/profiles/vue/vue-best-practices/references/directives.md +162 -162
- package/.agents/skills/profiles/vue/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -159
- package/.agents/skills/profiles/vue/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -182
- package/.agents/skills/profiles/vue/vue-best-practices/references/perf-virtualize-large-lists.md +187 -187
- package/.agents/skills/profiles/vue/vue-best-practices/references/plugins.md +166 -166
- package/.agents/skills/profiles/vue/vue-best-practices/references/reactivity.md +344 -344
- package/.agents/skills/profiles/vue/vue-best-practices/references/render-functions.md +201 -201
- package/.agents/skills/profiles/vue/vue-best-practices/references/sfc.md +310 -310
- package/.agents/skills/profiles/vue/vue-best-practices/references/state-management.md +135 -135
- package/.agents/skills/profiles/vue/vue-best-practices/references/updated-hook-performance.md +187 -187
- package/.agents/templates/common/README.md +23 -23
- package/.agents/templates/common/bugfix.md +22 -22
- package/.agents/templates/common/create-expert-package.md +458 -458
- package/.agents/templates/common/mock-page.md +28 -28
- package/.agents/templates/common/new-component.md +25 -25
- package/.agents/templates/common/new-page.md +31 -31
- package/.cursor/mcp.json +35 -35
- package/.qoder/mcp.json +26 -26
- package/bin/archive-change.js +560 -474
- package/bin/check-command.js +62 -62
- package/bin/cli.js +0 -0
- package/bin/command-template-renderer.js +40 -40
- package/bin/context-command.js +102 -102
- package/bin/demo-runtime-smoke.js +760 -760
- package/bin/execution-semantics.js +821 -821
- package/bin/executor-command.js +93 -93
- package/bin/expert-dispatch.js +334 -334
- package/bin/expert-executor.js +1148 -1148
- package/bin/guard-command.js +52 -52
- package/bin/hub-command.js +876 -876
- package/bin/ide-command.js +242 -242
- package/bin/init-command.js +193 -193
- package/bin/install-workflow.js +35 -3
- package/bin/manifest-export.js +34 -34
- package/bin/profile-registry.js +90 -90
- package/bin/protocol-workflow.js +452 -446
- package/bin/repair-command.js +161 -161
- package/bin/repo-map.js +177 -177
- package/bin/report-command.js +236 -236
- package/bin/runtime-bootstrap.js +428 -428
- package/bin/runtime-embedded.js +101 -101
- package/bin/runtime-fallback.js +106 -106
- package/bin/runtime-launcher.js +116 -116
- package/bin/runtime-paths.js +177 -177
- package/bin/runtime-registry.js +289 -289
- package/bin/runtime-state.js +2541 -2541
- package/bin/scan.js +96 -96
- package/bin/self-upgrade.js +206 -206
- package/bin/skill-spec-validator.js +457 -457
- package/bin/spec-command.js +366 -366
- package/bin/superpowers.js +384 -384
- package/bin/sync-command.js +59 -59
- package/bin/sync.js +1904 -1904
- package/bin/task-orchestrator-adapter.js +341 -341
- package/bin/task-orchestrator-extractor.js +274 -274
- package/bin/task-orchestrator-runner.js +1208 -1208
- package/bin/telemetry/README.md +66 -66
- package/bin/telemetry/aspect.js +153 -153
- package/bin/telemetry/collect.js +67 -67
- package/bin/telemetry/config.js +114 -114
- package/bin/telemetry/defaults.json +5 -5
- package/bin/telemetry/healthcheck.js +195 -195
- package/bin/telemetry/identity.js +53 -53
- package/bin/telemetry/index.js +25 -25
- package/bin/telemetry/reporter.js +83 -83
- package/bin/telemetry/safe.js +39 -39
- package/bin/validate-registry.js +740 -740
- package/bin/visual-bridge-config.js +117 -117
- package/bin/visual-bridge.js +287 -287
- package/bin/visual-command.js +432 -432
- package/bin/worktree-command.js +194 -194
- package/configs/common/.editorconfig +15 -15
- package/configs/common/.husky/commit-msg +4 -4
- package/configs/common/.husky/pre-commit +4 -4
- package/configs/common/.lintstagedrc +11 -11
- package/configs/common/.prettierignore +11 -11
- package/configs/common/.prettierrc.json +11 -11
- package/configs/common/.stylelintignore +14 -14
- package/configs/common/.stylelintrc.json +21 -21
- package/configs/common/commitlint.config.js +3 -3
- package/configs/profiles/nestjs/.gitkeep +1 -1
- package/configs/profiles/node-tooling/.gitkeep +1 -1
- package/configs/profiles/react/.eslintignore +6 -6
- package/configs/profiles/react/.eslintrc.js +16 -16
- package/configs/profiles/react/.stylelintrc.json +18 -18
- package/configs/profiles/springboot/.gitkeep +1 -1
- package/configs/profiles/vue/.eslintignore +6 -6
- package/configs/profiles/vue/.eslintrc.cjs +17 -17
- package/contracts/README.md +28 -28
- package/contracts/fixtures/asset-package.fixture.json +26 -26
- package/contracts/fixtures/asset-usage-feedback.fixture.json +14 -14
- package/contracts/fixtures/evidence-report.fixture.json +28 -28
- package/contracts/fixtures/manifest.fixture.json +20 -20
- package/contracts/fixtures/run-event.fixture.json +15 -15
- package/contracts/schemas/asset-package.schema.json +76 -76
- package/contracts/schemas/asset-usage-feedback.schema.json +57 -57
- package/contracts/schemas/evidence-report.schema.json +60 -60
- package/contracts/schemas/manifest.schema.json +63 -63
- package/contracts/schemas/run-event.schema.json +72 -72
- package/install.ps1 +35 -35
- package/install.sh +17 -17
- package/internal/ai-protocol-workflow.js +5824 -5600
- package/internal/hub-client.js +98 -98
- package/internal/hub-sync-selection.js +69 -69
- package/internal/visual-hooks/README.md +481 -481
- package/internal/visual-hooks/config-loader.js +218 -218
- package/internal/visual-hooks/control-puller.js +206 -206
- package/internal/visual-hooks/gate-signal.js +150 -150
- package/internal/visual-hooks/inbox-consumer.js +469 -469
- package/internal/visual-hooks/index.js +197 -197
- package/internal/visual-hooks/push-client.js +189 -189
- package/internal/visual-hooks/receipt-pusher.js +176 -176
- package/internal/visual-hooks/runtime-state-pusher.js +128 -128
- package/openspec/config.yaml.template +52 -52
- package/openspec/schemas/expert-delivery/schema.yaml +68 -68
- package/openspec/schemas/expert-delivery/templates/checklist.md +39 -39
- package/openspec/schemas/expert-delivery/templates/design.md +61 -61
- package/openspec/schemas/expert-delivery/templates/iterations.md +25 -25
- package/openspec/schemas/expert-delivery/templates/proposal.md +45 -45
- package/openspec/schemas/expert-delivery/templates/spec.md +29 -29
- package/openspec/schemas/expert-delivery/templates/tasks.md +24 -24
- package/package.json +1 -1
- package/scripts/acceptance-zero-intrusion.sh +168 -168
- package/scripts/hub-sync-assets.config.example.json +296 -296
- package/scripts/hub-sync-assets.js +2038 -2038
- package/scripts/local-verify.sh +280 -280
- package/scripts/post-publish-auto-fix-check.js +404 -404
- package/scripts/post-publish-verify.sh +175 -175
- package/scripts/setup-cursor-manual-test.sh +107 -107
- package/scripts/setup-cursor-spec-archive-test.sh +111 -111
- package/scripts/setup-visual-integration.sh +225 -225
- package/scripts/test-integration.sh +176 -176
- package/scripts/update-test-project.sh +93 -93
- package/scripts/upload-four-web.sh +57 -57
- package/scripts/verify-install-ps1-bom.js +26 -26
- package/src/agent/agent-context.js +259 -259
- package/src/agent/agent-profile.js +185 -185
- package/src/agent/agent-templates.js +161 -161
- package/src/agent/agent-types.js +108 -108
- package/src/agent/collaboration-protocol.js +333 -333
- package/src/agent/conflict-handler.js +364 -364
- package/src/agent/file-permission.js +121 -121
- package/src/agent/index.js +38 -38
- package/src/agent/permission-audit.js +151 -151
- package/src/agent/review-repair-loop.js +270 -270
- package/src/agent/tool-permission.js +101 -101
- package/src/asset/asset-dependency.js +322 -322
- package/src/asset/asset-feedback.js +350 -350
- package/src/asset/asset-fork.js +300 -300
- package/src/asset/asset-install.js +278 -278
- package/src/asset/asset-installer.js +497 -497
- package/src/asset/asset-lifecycle.js +324 -324
- package/src/asset/asset-manager.js +245 -245
- package/src/asset/asset-package-manager.js +349 -349
- package/src/asset/asset-package.js +186 -186
- package/src/asset/asset-quality.js +262 -262
- package/src/asset/asset-registry.js +387 -387
- package/src/asset/asset-version.js +293 -293
- package/src/asset/index.js +86 -86
- package/src/cache/agent-profile-cache.js +59 -59
- package/src/cache/asset-cache.js +63 -63
- package/src/cache/global-cache.js +61 -61
- package/src/cache/manifest-cache.js +30 -30
- package/src/check/check-service.js +32 -32
- package/src/config/config-layer.js +343 -343
- package/src/config/config-loader.js +60 -60
- package/src/config/defaults.js +49 -49
- package/src/connectors/hub/asset-package.js +72 -72
- package/src/connectors/hub/asset-usage-feedback.js +46 -46
- package/src/connectors/hub/hub-connector.js +44 -44
- package/src/connectors/hub/index.js +21 -21
- package/src/connectors/visual/evidence-report.js +49 -49
- package/src/connectors/visual/index.js +15 -15
- package/src/connectors/visual/queue.js +41 -41
- package/src/connectors/visual/run-event.js +81 -81
- package/src/connectors/visual/visual-connector.js +77 -77
- package/src/context/context-budget.js +59 -59
- package/src/context/context-builder.js +285 -285
- package/src/context/context-loader.js +116 -116
- package/src/context/context-planner.js +158 -158
- package/src/context/types.js +96 -96
- package/src/contracts/index.js +63 -63
- package/src/executor/executor-registry.js +78 -78
- package/src/executor/executor-result-parser.js +44 -44
- package/src/executor/executor-runner.js +141 -141
- package/src/executor/executor-selector.js +139 -139
- package/src/executor/executor-timeout.js +36 -36
- package/src/executor/providers/base-provider-utils.js +189 -189
- package/src/executor/providers/claude-code-executor-provider.js +128 -128
- package/src/executor/providers/codex-executor-provider.js +126 -126
- package/src/executor/providers/cursor-executor-provider.js +99 -99
- package/src/executor/types.js +137 -137
- package/src/git/branch-manager.js +71 -71
- package/src/git/dirty-checker.js +43 -43
- package/src/git/dirty-strategy-handler.js +29 -29
- package/src/git/git-command.js +37 -37
- package/src/git/git-repository-detector.js +45 -45
- package/src/git/multi-repo-worktree-planner.js +88 -88
- package/src/git/policy.js +19 -19
- package/src/git/strategies/block-dirty-strategy.js +34 -34
- package/src/git/strategies/ignore-dirty-strategy.js +33 -33
- package/src/git/strategies/patch-snapshot-strategy.js +53 -53
- package/src/git/strategies/wip-commit-strategy.js +38 -38
- package/src/git/types.js +71 -71
- package/src/git/worktree-manager.js +85 -85
- package/src/governance/asset-review.js +351 -351
- package/src/governance/audit-log.js +368 -368
- package/src/governance/gray-release.js +312 -312
- package/src/governance/index.js +31 -31
- package/src/governance/policy-types.js +56 -56
- package/src/governance/rbac-types.js +171 -171
- package/src/governance/rbac.js +382 -382
- package/src/governance/rollback.js +360 -360
- package/src/governance/security-policy.js +354 -354
- package/src/hook/hook-config-writer.js +125 -125
- package/src/hub/hub-client.js +186 -186
- package/src/hub/hub-config.js +39 -39
- package/src/hub/project-facts.js +31 -31
- package/src/hub/runtime-feedback-reporter.js +55 -55
- package/src/ide/adapters/adapter-protocol.js +385 -385
- package/src/ide/adapters/claude-adapter.js +419 -419
- package/src/ide/adapters/codex-adapter.js +60 -60
- package/src/ide/adapters/cursor-adapter.js +484 -484
- package/src/ide/adapters/index.js +24 -24
- package/src/ide/anchors/markdown-anchor-writer.js +152 -152
- package/src/ide/ide-service.js +270 -270
- package/src/ide/ide-types.js +94 -94
- package/src/ide/links/link-mode-resolver.js +160 -160
- package/src/ide/registry/ide-registry-builder.js +165 -165
- package/src/incident/incident-writer.js +47 -47
- package/src/incident/types.js +22 -22
- package/src/init/ide-linker.js +126 -126
- package/src/init/ide-pointer-injector.js +75 -75
- package/src/init/init-applier.js +197 -197
- package/src/init/init-plan.js +294 -294
- package/src/init/init-service.js +65 -65
- package/src/init/manifest-installer.js +302 -302
- package/src/init/types.js +26 -26
- package/src/project/config-writer.js +83 -83
- package/src/project/context-index-writer.js +82 -82
- package/src/project/json-utils.js +72 -72
- package/src/project/local-state-writer.js +50 -50
- package/src/project/lock-file-writer.js +98 -98
- package/src/project/manifest-writer.js +126 -126
- package/src/project/policy-config-writer.js +91 -91
- package/src/project/project-config-writer.js +74 -74
- package/src/project/project-files.js +39 -39
- package/src/project/registry-index-writer.js +43 -43
- package/src/project/workspace-config-writer.js +63 -63
- package/src/run/index.js +11 -11
- package/src/run/run-id.js +32 -32
- package/src/run/run-service.js +269 -269
- package/src/run/run-store.js +80 -80
- package/src/scanner/aggregator/detection-aggregator.js +23 -23
- package/src/scanner/boundary/boundary-resolver.js +229 -229
- package/src/scanner/detectors/detector-registry.js +44 -44
- package/src/scanner/detectors/fastapi-detector.js +46 -46
- package/src/scanner/detectors/go-detector.js +46 -46
- package/src/scanner/detectors/nestjs-detector.js +57 -57
- package/src/scanner/detectors/nextjs-detector.js +52 -52
- package/src/scanner/detectors/react-vite-detector.js +52 -52
- package/src/scanner/detectors/react-webpack-detector.js +57 -57
- package/src/scanner/detectors/springboot-detector.js +46 -46
- package/src/scanner/detectors/springcloud-detector.js +46 -46
- package/src/scanner/detectors/springmvc-detector.js +46 -46
- package/src/scanner/detectors/vue-vite-detector.js +52 -52
- package/src/scanner/engine.js +72 -72
- package/src/scanner/facts/fact-extractor.js +211 -211
- package/src/scanner/types.js +30 -30
- package/src/security/asset-tamper-checker.js +188 -188
- package/src/security/checksum.js +40 -40
- package/src/spec/spec-writer.js +302 -302
- package/src/state-machine/circuit-breaker.js +112 -112
- package/src/state-machine/escape-hatch.js +49 -49
- package/src/state-machine/stage-runner.js +281 -281
- package/src/state-machine/state-machine.js +24 -24
- package/src/state-machine/transition-guard.js +36 -36
- package/src/state-machine/types.js +37 -37
- package/src/sync/sync-service.js +192 -192
- package/src/visual/agent-visual.js +142 -142
- package/src/visual/event-gateway.js +357 -357
- package/src/visual/event-mapper.js +128 -128
- package/src/visual/hook-dashboard.js +216 -216
- package/src/visual/index.js +27 -27
- package/src/visual/metrics.js +287 -287
- package/src/visual/privacy-filter.js +100 -100
- package/src/visual/risk-board.js +252 -252
- package/src/visual/timeline.js +245 -245
- package/src/visual/visual-client.js +94 -94
- package/src/visual/visual-config.js +40 -40
- package/src/visual/visual-reporter.js +88 -88
|
@@ -1,228 +1,228 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Suspense Component Best Practices
|
|
3
|
-
impact: MEDIUM
|
|
4
|
-
impactDescription: Suspense coordinates async dependencies with fallback UI; misconfiguration leads to missing loading states or confusing UX
|
|
5
|
-
type: best-practice
|
|
6
|
-
tags: [vue3, suspense, async-components, async-setup, loading, fallback, router, transition, keepalive]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Suspense Component Best Practices
|
|
10
|
-
|
|
11
|
-
**Impact: MEDIUM** - `<Suspense>` coordinates async dependencies (async components or async setup) and renders a fallback while they resolve. Misconfiguration leads to missing loading states, empty renders, or subtle UX bugs.
|
|
12
|
-
|
|
13
|
-
## Task List
|
|
14
|
-
|
|
15
|
-
- Wrap default and fallback slot content in a single root node
|
|
16
|
-
- Use `timeout` when you need the fallback to appear on reverts
|
|
17
|
-
- Force root replacement with `:key` when you need Suspense to re-trigger
|
|
18
|
-
- Add `suspensible` to nested Suspense boundaries (Vue 3.3+)
|
|
19
|
-
- Use `@pending`, `@resolve`, and `@fallback` for programmatic loading state
|
|
20
|
-
- Nest `RouterView` -> `Transition` -> `KeepAlive` -> `Suspense` in that order
|
|
21
|
-
- Keep Suspense usage centralized and documented in production
|
|
22
|
-
|
|
23
|
-
## Single Root in Default and Fallback Slots
|
|
24
|
-
|
|
25
|
-
Suspense tracks a single immediate child in both slots. Wrap multiple elements in a single element or component.
|
|
26
|
-
|
|
27
|
-
**BAD:**
|
|
28
|
-
```vue
|
|
29
|
-
<template>
|
|
30
|
-
<Suspense>
|
|
31
|
-
<AsyncHeader />
|
|
32
|
-
<AsyncList />
|
|
33
|
-
|
|
34
|
-
<template #fallback>
|
|
35
|
-
<LoadingSpinner />
|
|
36
|
-
<LoadingHint />
|
|
37
|
-
</template>
|
|
38
|
-
</Suspense>
|
|
39
|
-
</template>
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
**GOOD:**
|
|
43
|
-
```vue
|
|
44
|
-
<template>
|
|
45
|
-
<Suspense>
|
|
46
|
-
<div>
|
|
47
|
-
<AsyncHeader />
|
|
48
|
-
<AsyncList />
|
|
49
|
-
</div>
|
|
50
|
-
|
|
51
|
-
<template #fallback>
|
|
52
|
-
<div>
|
|
53
|
-
<LoadingSpinner />
|
|
54
|
-
<LoadingHint />
|
|
55
|
-
</div>
|
|
56
|
-
</template>
|
|
57
|
-
</Suspense>
|
|
58
|
-
</template>
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Fallback Timing on Reverts (`timeout`)
|
|
62
|
-
|
|
63
|
-
When Suspense is already resolved and new async work starts, the previous content remains visible until the timeout elapses. Use `timeout="0"` for immediate fallback or a short delay to avoid flicker.
|
|
64
|
-
|
|
65
|
-
**BAD:**
|
|
66
|
-
```vue
|
|
67
|
-
<template>
|
|
68
|
-
<Suspense>
|
|
69
|
-
<component :is="currentView" :key="viewKey" />
|
|
70
|
-
|
|
71
|
-
<template #fallback>
|
|
72
|
-
Loading...
|
|
73
|
-
</template>
|
|
74
|
-
</Suspense>
|
|
75
|
-
</template>
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
**GOOD:**
|
|
79
|
-
```vue
|
|
80
|
-
<template>
|
|
81
|
-
<Suspense :timeout="200">
|
|
82
|
-
<component :is="currentView" :key="viewKey" />
|
|
83
|
-
|
|
84
|
-
<template #fallback>
|
|
85
|
-
Loading...
|
|
86
|
-
</template>
|
|
87
|
-
</Suspense>
|
|
88
|
-
</template>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Pending State Only Re-triggers on Root Replacement
|
|
92
|
-
|
|
93
|
-
Once resolved, Suspense only re-enters pending when the root node of the default slot changes. If async work happens deeper in the tree, no fallback appears.
|
|
94
|
-
|
|
95
|
-
**BAD:**
|
|
96
|
-
```vue
|
|
97
|
-
<template>
|
|
98
|
-
<Suspense>
|
|
99
|
-
<TabContainer>
|
|
100
|
-
<AsyncDashboard v-if="tab === 'dashboard'" />
|
|
101
|
-
<AsyncSettings v-else />
|
|
102
|
-
</TabContainer>
|
|
103
|
-
|
|
104
|
-
<template #fallback>
|
|
105
|
-
Loading...
|
|
106
|
-
</template>
|
|
107
|
-
</Suspense>
|
|
108
|
-
</template>
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
**GOOD:**
|
|
112
|
-
```vue
|
|
113
|
-
<template>
|
|
114
|
-
<Suspense>
|
|
115
|
-
<component :is="tabs[tab]" :key="tab" />
|
|
116
|
-
|
|
117
|
-
<template #fallback>
|
|
118
|
-
Loading...
|
|
119
|
-
</template>
|
|
120
|
-
</Suspense>
|
|
121
|
-
</template>
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Use `suspensible` for Nested Suspense (Vue 3.3+)
|
|
125
|
-
|
|
126
|
-
Nested Suspense boundaries need `suspensible` on the inner boundary so the parent can coordinate loading state. Without it, inner async content may render empty nodes until resolved.
|
|
127
|
-
|
|
128
|
-
**BAD:**
|
|
129
|
-
```vue
|
|
130
|
-
<template>
|
|
131
|
-
<Suspense>
|
|
132
|
-
<LayoutShell>
|
|
133
|
-
<Suspense>
|
|
134
|
-
<AsyncWidget />
|
|
135
|
-
<template #fallback>Loading widget...</template>
|
|
136
|
-
</Suspense>
|
|
137
|
-
</LayoutShell>
|
|
138
|
-
|
|
139
|
-
<template #fallback>Loading layout...</template>
|
|
140
|
-
</Suspense>
|
|
141
|
-
</template>
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
**GOOD:**
|
|
145
|
-
```vue
|
|
146
|
-
<template>
|
|
147
|
-
<Suspense>
|
|
148
|
-
<LayoutShell>
|
|
149
|
-
<Suspense suspensible>
|
|
150
|
-
<AsyncWidget />
|
|
151
|
-
<template #fallback>Loading widget...</template>
|
|
152
|
-
</Suspense>
|
|
153
|
-
</LayoutShell>
|
|
154
|
-
|
|
155
|
-
<template #fallback>Loading layout...</template>
|
|
156
|
-
</Suspense>
|
|
157
|
-
</template>
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Track Loading with Suspense Events
|
|
161
|
-
|
|
162
|
-
Use `@pending`, `@resolve`, and `@fallback` for analytics, global loading indicators, or coordinating UI outside the Suspense boundary.
|
|
163
|
-
|
|
164
|
-
```vue
|
|
165
|
-
<script setup>
|
|
166
|
-
import { ref } from 'vue'
|
|
167
|
-
|
|
168
|
-
const isLoading = ref(false)
|
|
169
|
-
|
|
170
|
-
const onPending = () => {
|
|
171
|
-
isLoading.value = true
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
const onResolve = () => {
|
|
175
|
-
isLoading.value = false
|
|
176
|
-
}
|
|
177
|
-
</script>
|
|
178
|
-
|
|
179
|
-
<template>
|
|
180
|
-
<LoadingBar v-if="isLoading" />
|
|
181
|
-
|
|
182
|
-
<Suspense @pending="onPending" @resolve="onResolve">
|
|
183
|
-
<AsyncPage />
|
|
184
|
-
<template #fallback>
|
|
185
|
-
<PageSkeleton />
|
|
186
|
-
</template>
|
|
187
|
-
</Suspense>
|
|
188
|
-
</template>
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## Recommended Nesting with RouterView, Transition, KeepAlive
|
|
192
|
-
|
|
193
|
-
When combining these components, the nesting order should be `RouterView` -> `Transition` -> `KeepAlive` -> `Suspense` so each wrapper works correctly.
|
|
194
|
-
|
|
195
|
-
**BAD:**
|
|
196
|
-
```vue
|
|
197
|
-
<template>
|
|
198
|
-
<RouterView v-slot="{ Component }">
|
|
199
|
-
<Suspense>
|
|
200
|
-
<KeepAlive>
|
|
201
|
-
<Transition mode="out-in">
|
|
202
|
-
<component :is="Component" />
|
|
203
|
-
</Transition>
|
|
204
|
-
</KeepAlive>
|
|
205
|
-
</Suspense>
|
|
206
|
-
</RouterView>
|
|
207
|
-
</template>
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**GOOD:**
|
|
211
|
-
```vue
|
|
212
|
-
<template>
|
|
213
|
-
<RouterView v-slot="{ Component }">
|
|
214
|
-
<Transition mode="out-in">
|
|
215
|
-
<KeepAlive>
|
|
216
|
-
<Suspense>
|
|
217
|
-
<component :is="Component" />
|
|
218
|
-
<template #fallback>Loading...</template>
|
|
219
|
-
</Suspense>
|
|
220
|
-
</KeepAlive>
|
|
221
|
-
</Transition>
|
|
222
|
-
</RouterView>
|
|
223
|
-
</template>
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## Treat Suspense Cautiously in Production
|
|
227
|
-
|
|
228
|
-
In production code, keep Suspense boundaries minimal, document where they are used, and have a fallback loading strategy if you ever need to replace or refactor them.
|
|
1
|
+
---
|
|
2
|
+
title: Suspense Component Best Practices
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Suspense coordinates async dependencies with fallback UI; misconfiguration leads to missing loading states or confusing UX
|
|
5
|
+
type: best-practice
|
|
6
|
+
tags: [vue3, suspense, async-components, async-setup, loading, fallback, router, transition, keepalive]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Suspense Component Best Practices
|
|
10
|
+
|
|
11
|
+
**Impact: MEDIUM** - `<Suspense>` coordinates async dependencies (async components or async setup) and renders a fallback while they resolve. Misconfiguration leads to missing loading states, empty renders, or subtle UX bugs.
|
|
12
|
+
|
|
13
|
+
## Task List
|
|
14
|
+
|
|
15
|
+
- Wrap default and fallback slot content in a single root node
|
|
16
|
+
- Use `timeout` when you need the fallback to appear on reverts
|
|
17
|
+
- Force root replacement with `:key` when you need Suspense to re-trigger
|
|
18
|
+
- Add `suspensible` to nested Suspense boundaries (Vue 3.3+)
|
|
19
|
+
- Use `@pending`, `@resolve`, and `@fallback` for programmatic loading state
|
|
20
|
+
- Nest `RouterView` -> `Transition` -> `KeepAlive` -> `Suspense` in that order
|
|
21
|
+
- Keep Suspense usage centralized and documented in production
|
|
22
|
+
|
|
23
|
+
## Single Root in Default and Fallback Slots
|
|
24
|
+
|
|
25
|
+
Suspense tracks a single immediate child in both slots. Wrap multiple elements in a single element or component.
|
|
26
|
+
|
|
27
|
+
**BAD:**
|
|
28
|
+
```vue
|
|
29
|
+
<template>
|
|
30
|
+
<Suspense>
|
|
31
|
+
<AsyncHeader />
|
|
32
|
+
<AsyncList />
|
|
33
|
+
|
|
34
|
+
<template #fallback>
|
|
35
|
+
<LoadingSpinner />
|
|
36
|
+
<LoadingHint />
|
|
37
|
+
</template>
|
|
38
|
+
</Suspense>
|
|
39
|
+
</template>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**GOOD:**
|
|
43
|
+
```vue
|
|
44
|
+
<template>
|
|
45
|
+
<Suspense>
|
|
46
|
+
<div>
|
|
47
|
+
<AsyncHeader />
|
|
48
|
+
<AsyncList />
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<template #fallback>
|
|
52
|
+
<div>
|
|
53
|
+
<LoadingSpinner />
|
|
54
|
+
<LoadingHint />
|
|
55
|
+
</div>
|
|
56
|
+
</template>
|
|
57
|
+
</Suspense>
|
|
58
|
+
</template>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Fallback Timing on Reverts (`timeout`)
|
|
62
|
+
|
|
63
|
+
When Suspense is already resolved and new async work starts, the previous content remains visible until the timeout elapses. Use `timeout="0"` for immediate fallback or a short delay to avoid flicker.
|
|
64
|
+
|
|
65
|
+
**BAD:**
|
|
66
|
+
```vue
|
|
67
|
+
<template>
|
|
68
|
+
<Suspense>
|
|
69
|
+
<component :is="currentView" :key="viewKey" />
|
|
70
|
+
|
|
71
|
+
<template #fallback>
|
|
72
|
+
Loading...
|
|
73
|
+
</template>
|
|
74
|
+
</Suspense>
|
|
75
|
+
</template>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**GOOD:**
|
|
79
|
+
```vue
|
|
80
|
+
<template>
|
|
81
|
+
<Suspense :timeout="200">
|
|
82
|
+
<component :is="currentView" :key="viewKey" />
|
|
83
|
+
|
|
84
|
+
<template #fallback>
|
|
85
|
+
Loading...
|
|
86
|
+
</template>
|
|
87
|
+
</Suspense>
|
|
88
|
+
</template>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Pending State Only Re-triggers on Root Replacement
|
|
92
|
+
|
|
93
|
+
Once resolved, Suspense only re-enters pending when the root node of the default slot changes. If async work happens deeper in the tree, no fallback appears.
|
|
94
|
+
|
|
95
|
+
**BAD:**
|
|
96
|
+
```vue
|
|
97
|
+
<template>
|
|
98
|
+
<Suspense>
|
|
99
|
+
<TabContainer>
|
|
100
|
+
<AsyncDashboard v-if="tab === 'dashboard'" />
|
|
101
|
+
<AsyncSettings v-else />
|
|
102
|
+
</TabContainer>
|
|
103
|
+
|
|
104
|
+
<template #fallback>
|
|
105
|
+
Loading...
|
|
106
|
+
</template>
|
|
107
|
+
</Suspense>
|
|
108
|
+
</template>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**GOOD:**
|
|
112
|
+
```vue
|
|
113
|
+
<template>
|
|
114
|
+
<Suspense>
|
|
115
|
+
<component :is="tabs[tab]" :key="tab" />
|
|
116
|
+
|
|
117
|
+
<template #fallback>
|
|
118
|
+
Loading...
|
|
119
|
+
</template>
|
|
120
|
+
</Suspense>
|
|
121
|
+
</template>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Use `suspensible` for Nested Suspense (Vue 3.3+)
|
|
125
|
+
|
|
126
|
+
Nested Suspense boundaries need `suspensible` on the inner boundary so the parent can coordinate loading state. Without it, inner async content may render empty nodes until resolved.
|
|
127
|
+
|
|
128
|
+
**BAD:**
|
|
129
|
+
```vue
|
|
130
|
+
<template>
|
|
131
|
+
<Suspense>
|
|
132
|
+
<LayoutShell>
|
|
133
|
+
<Suspense>
|
|
134
|
+
<AsyncWidget />
|
|
135
|
+
<template #fallback>Loading widget...</template>
|
|
136
|
+
</Suspense>
|
|
137
|
+
</LayoutShell>
|
|
138
|
+
|
|
139
|
+
<template #fallback>Loading layout...</template>
|
|
140
|
+
</Suspense>
|
|
141
|
+
</template>
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**GOOD:**
|
|
145
|
+
```vue
|
|
146
|
+
<template>
|
|
147
|
+
<Suspense>
|
|
148
|
+
<LayoutShell>
|
|
149
|
+
<Suspense suspensible>
|
|
150
|
+
<AsyncWidget />
|
|
151
|
+
<template #fallback>Loading widget...</template>
|
|
152
|
+
</Suspense>
|
|
153
|
+
</LayoutShell>
|
|
154
|
+
|
|
155
|
+
<template #fallback>Loading layout...</template>
|
|
156
|
+
</Suspense>
|
|
157
|
+
</template>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Track Loading with Suspense Events
|
|
161
|
+
|
|
162
|
+
Use `@pending`, `@resolve`, and `@fallback` for analytics, global loading indicators, or coordinating UI outside the Suspense boundary.
|
|
163
|
+
|
|
164
|
+
```vue
|
|
165
|
+
<script setup>
|
|
166
|
+
import { ref } from 'vue'
|
|
167
|
+
|
|
168
|
+
const isLoading = ref(false)
|
|
169
|
+
|
|
170
|
+
const onPending = () => {
|
|
171
|
+
isLoading.value = true
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const onResolve = () => {
|
|
175
|
+
isLoading.value = false
|
|
176
|
+
}
|
|
177
|
+
</script>
|
|
178
|
+
|
|
179
|
+
<template>
|
|
180
|
+
<LoadingBar v-if="isLoading" />
|
|
181
|
+
|
|
182
|
+
<Suspense @pending="onPending" @resolve="onResolve">
|
|
183
|
+
<AsyncPage />
|
|
184
|
+
<template #fallback>
|
|
185
|
+
<PageSkeleton />
|
|
186
|
+
</template>
|
|
187
|
+
</Suspense>
|
|
188
|
+
</template>
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Recommended Nesting with RouterView, Transition, KeepAlive
|
|
192
|
+
|
|
193
|
+
When combining these components, the nesting order should be `RouterView` -> `Transition` -> `KeepAlive` -> `Suspense` so each wrapper works correctly.
|
|
194
|
+
|
|
195
|
+
**BAD:**
|
|
196
|
+
```vue
|
|
197
|
+
<template>
|
|
198
|
+
<RouterView v-slot="{ Component }">
|
|
199
|
+
<Suspense>
|
|
200
|
+
<KeepAlive>
|
|
201
|
+
<Transition mode="out-in">
|
|
202
|
+
<component :is="Component" />
|
|
203
|
+
</Transition>
|
|
204
|
+
</KeepAlive>
|
|
205
|
+
</Suspense>
|
|
206
|
+
</RouterView>
|
|
207
|
+
</template>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**GOOD:**
|
|
211
|
+
```vue
|
|
212
|
+
<template>
|
|
213
|
+
<RouterView v-slot="{ Component }">
|
|
214
|
+
<Transition mode="out-in">
|
|
215
|
+
<KeepAlive>
|
|
216
|
+
<Suspense>
|
|
217
|
+
<component :is="Component" />
|
|
218
|
+
<template #fallback>Loading...</template>
|
|
219
|
+
</Suspense>
|
|
220
|
+
</KeepAlive>
|
|
221
|
+
</Transition>
|
|
222
|
+
</RouterView>
|
|
223
|
+
</template>
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Treat Suspense Cautiously in Production
|
|
227
|
+
|
|
228
|
+
In production code, keep Suspense boundaries minimal, document where they are used, and have a fallback loading strategy if you ever need to replace or refactor them.
|
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Teleport Component Best Practices
|
|
3
|
-
impact: MEDIUM
|
|
4
|
-
impactDescription: Teleport renders content outside the component's DOM position, which is essential for overlays but affects styling and layout
|
|
5
|
-
type: best-practice
|
|
6
|
-
tags: [vue3, teleport, modal, overlay, positioning, responsive]
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Teleport Component Best Practices
|
|
10
|
-
|
|
11
|
-
**Impact: MEDIUM** - `<Teleport>` renders part of a component's template in a different place in the DOM while preserving the Vue component hierarchy. Use it for overlays (modals, toasts, tooltips) or any UI that must escape stacking contexts, overflow, or fixed positioning constraints.
|
|
12
|
-
|
|
13
|
-
## Task List
|
|
14
|
-
|
|
15
|
-
- Teleport overlays to `body` or a dedicated container outside the app root
|
|
16
|
-
- Keep a shared target for similar UI (`#modals`, `#notifications`) and control layering with order or z-index
|
|
17
|
-
- Use `:disabled` for responsive layouts that should render inline on small screens
|
|
18
|
-
- Remember props, emits, and provide/inject still work through teleport
|
|
19
|
-
- Avoid relying on parent stacking contexts or transforms for teleported UI
|
|
20
|
-
|
|
21
|
-
## Teleport Overlays Out of Transformed Containers
|
|
22
|
-
|
|
23
|
-
When an ancestor has `transform`, `filter`, or `perspective`, fixed-position overlays can behave like they are locally positioned. Teleport escapes that context.
|
|
24
|
-
|
|
25
|
-
**BAD:**
|
|
26
|
-
```vue
|
|
27
|
-
<template>
|
|
28
|
-
<div class="animated-container">
|
|
29
|
-
<button @click="open = true">Open</button>
|
|
30
|
-
|
|
31
|
-
<!-- Broken: fixed positioning is scoped to the transformed parent -->
|
|
32
|
-
<div v-if="open" class="modal">Modal</div>
|
|
33
|
-
</div>
|
|
34
|
-
</template>
|
|
35
|
-
|
|
36
|
-
<style>
|
|
37
|
-
.animated-container {
|
|
38
|
-
transform: translateZ(0);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.modal {
|
|
42
|
-
position: fixed;
|
|
43
|
-
inset: 0;
|
|
44
|
-
z-index: 9999;
|
|
45
|
-
}
|
|
46
|
-
</style>
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**GOOD:**
|
|
50
|
-
```vue
|
|
51
|
-
<template>
|
|
52
|
-
<div class="animated-container">
|
|
53
|
-
<button @click="open = true">Open</button>
|
|
54
|
-
|
|
55
|
-
<Teleport to="body">
|
|
56
|
-
<div v-if="open" class="modal">Modal</div>
|
|
57
|
-
</Teleport>
|
|
58
|
-
</div>
|
|
59
|
-
</template>
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Responsive Layouts with `disabled`
|
|
63
|
-
|
|
64
|
-
Use `:disabled` to render inline on mobile and teleport on larger screens:
|
|
65
|
-
|
|
66
|
-
```vue
|
|
67
|
-
<script setup>
|
|
68
|
-
import { useMediaQuery } from '@vueuse/core'
|
|
69
|
-
|
|
70
|
-
const isMobile = useMediaQuery('(max-width: 768px)')
|
|
71
|
-
</script>
|
|
72
|
-
|
|
73
|
-
<template>
|
|
74
|
-
<Teleport to="body" :disabled="isMobile">
|
|
75
|
-
<nav class="sidebar">Navigation</nav>
|
|
76
|
-
</Teleport>
|
|
77
|
-
</template>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Logical Hierarchy Is Preserved
|
|
81
|
-
|
|
82
|
-
Teleport changes DOM position, not the Vue component tree. Props, emits, slots, and provide/inject still work:
|
|
83
|
-
|
|
84
|
-
```vue
|
|
85
|
-
<template>
|
|
86
|
-
<Teleport to="body">
|
|
87
|
-
<ChildPanel :message="message" @close="open = false" />
|
|
88
|
-
</Teleport>
|
|
89
|
-
</template>
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## Multiple Teleports to the Same Target
|
|
93
|
-
|
|
94
|
-
Teleports to the same target append in declaration order:
|
|
95
|
-
|
|
96
|
-
```vue
|
|
97
|
-
<template>
|
|
98
|
-
<Teleport to="#notifications">
|
|
99
|
-
<div>First</div>
|
|
100
|
-
</Teleport>
|
|
101
|
-
|
|
102
|
-
<Teleport to="#notifications">
|
|
103
|
-
<div>Second</div>
|
|
104
|
-
</Teleport>
|
|
105
|
-
</template>
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
Use a shared container to keep stacking predictable, and apply z-index only when you need explicit layering.
|
|
1
|
+
---
|
|
2
|
+
title: Teleport Component Best Practices
|
|
3
|
+
impact: MEDIUM
|
|
4
|
+
impactDescription: Teleport renders content outside the component's DOM position, which is essential for overlays but affects styling and layout
|
|
5
|
+
type: best-practice
|
|
6
|
+
tags: [vue3, teleport, modal, overlay, positioning, responsive]
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Teleport Component Best Practices
|
|
10
|
+
|
|
11
|
+
**Impact: MEDIUM** - `<Teleport>` renders part of a component's template in a different place in the DOM while preserving the Vue component hierarchy. Use it for overlays (modals, toasts, tooltips) or any UI that must escape stacking contexts, overflow, or fixed positioning constraints.
|
|
12
|
+
|
|
13
|
+
## Task List
|
|
14
|
+
|
|
15
|
+
- Teleport overlays to `body` or a dedicated container outside the app root
|
|
16
|
+
- Keep a shared target for similar UI (`#modals`, `#notifications`) and control layering with order or z-index
|
|
17
|
+
- Use `:disabled` for responsive layouts that should render inline on small screens
|
|
18
|
+
- Remember props, emits, and provide/inject still work through teleport
|
|
19
|
+
- Avoid relying on parent stacking contexts or transforms for teleported UI
|
|
20
|
+
|
|
21
|
+
## Teleport Overlays Out of Transformed Containers
|
|
22
|
+
|
|
23
|
+
When an ancestor has `transform`, `filter`, or `perspective`, fixed-position overlays can behave like they are locally positioned. Teleport escapes that context.
|
|
24
|
+
|
|
25
|
+
**BAD:**
|
|
26
|
+
```vue
|
|
27
|
+
<template>
|
|
28
|
+
<div class="animated-container">
|
|
29
|
+
<button @click="open = true">Open</button>
|
|
30
|
+
|
|
31
|
+
<!-- Broken: fixed positioning is scoped to the transformed parent -->
|
|
32
|
+
<div v-if="open" class="modal">Modal</div>
|
|
33
|
+
</div>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<style>
|
|
37
|
+
.animated-container {
|
|
38
|
+
transform: translateZ(0);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.modal {
|
|
42
|
+
position: fixed;
|
|
43
|
+
inset: 0;
|
|
44
|
+
z-index: 9999;
|
|
45
|
+
}
|
|
46
|
+
</style>
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**GOOD:**
|
|
50
|
+
```vue
|
|
51
|
+
<template>
|
|
52
|
+
<div class="animated-container">
|
|
53
|
+
<button @click="open = true">Open</button>
|
|
54
|
+
|
|
55
|
+
<Teleport to="body">
|
|
56
|
+
<div v-if="open" class="modal">Modal</div>
|
|
57
|
+
</Teleport>
|
|
58
|
+
</div>
|
|
59
|
+
</template>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Responsive Layouts with `disabled`
|
|
63
|
+
|
|
64
|
+
Use `:disabled` to render inline on mobile and teleport on larger screens:
|
|
65
|
+
|
|
66
|
+
```vue
|
|
67
|
+
<script setup>
|
|
68
|
+
import { useMediaQuery } from '@vueuse/core'
|
|
69
|
+
|
|
70
|
+
const isMobile = useMediaQuery('(max-width: 768px)')
|
|
71
|
+
</script>
|
|
72
|
+
|
|
73
|
+
<template>
|
|
74
|
+
<Teleport to="body" :disabled="isMobile">
|
|
75
|
+
<nav class="sidebar">Navigation</nav>
|
|
76
|
+
</Teleport>
|
|
77
|
+
</template>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Logical Hierarchy Is Preserved
|
|
81
|
+
|
|
82
|
+
Teleport changes DOM position, not the Vue component tree. Props, emits, slots, and provide/inject still work:
|
|
83
|
+
|
|
84
|
+
```vue
|
|
85
|
+
<template>
|
|
86
|
+
<Teleport to="body">
|
|
87
|
+
<ChildPanel :message="message" @close="open = false" />
|
|
88
|
+
</Teleport>
|
|
89
|
+
</template>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Multiple Teleports to the Same Target
|
|
93
|
+
|
|
94
|
+
Teleports to the same target append in declaration order:
|
|
95
|
+
|
|
96
|
+
```vue
|
|
97
|
+
<template>
|
|
98
|
+
<Teleport to="#notifications">
|
|
99
|
+
<div>First</div>
|
|
100
|
+
</Teleport>
|
|
101
|
+
|
|
102
|
+
<Teleport to="#notifications">
|
|
103
|
+
<div>Second</div>
|
|
104
|
+
</Teleport>
|
|
105
|
+
</template>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Use a shared container to keep stacking predictable, and apply z-index only when you need explicit layering.
|