godpowers 0.15.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/AGENTS.md +37 -0
- package/CHANGELOG.md +639 -0
- package/INSPIRATION.md +52 -0
- package/LICENSE +21 -0
- package/README.md +232 -0
- package/SKILL.md +500 -0
- package/agents/god-archaeologist.md +139 -0
- package/agents/god-architect.md +92 -0
- package/agents/god-auditor.md +150 -0
- package/agents/god-browser-tester.md +144 -0
- package/agents/god-context-writer.md +137 -0
- package/agents/god-coordinator.md +138 -0
- package/agents/god-debt-assessor.md +132 -0
- package/agents/god-debugger.md +77 -0
- package/agents/god-deploy-engineer.md +87 -0
- package/agents/god-deps-auditor.md +111 -0
- package/agents/god-design-reviewer.md +137 -0
- package/agents/god-designer.md +171 -0
- package/agents/god-docs-writer.md +102 -0
- package/agents/god-executor.md +76 -0
- package/agents/god-explorer.md +110 -0
- package/agents/god-harden-auditor.md +163 -0
- package/agents/god-incident-investigator.md +144 -0
- package/agents/god-launch-strategist.md +103 -0
- package/agents/god-migration-strategist.md +126 -0
- package/agents/god-observability-engineer.md +76 -0
- package/agents/god-orchestrator.md +728 -0
- package/agents/god-org-context-loader.md +124 -0
- package/agents/god-planner.md +73 -0
- package/agents/god-pm.md +105 -0
- package/agents/god-quality-reviewer.md +74 -0
- package/agents/god-reconciler.md +230 -0
- package/agents/god-reconstructor.md +124 -0
- package/agents/god-repo-scaffolder.md +60 -0
- package/agents/god-retrospective.md +109 -0
- package/agents/god-roadmap-reconciler.md +123 -0
- package/agents/god-roadmap-updater.md +89 -0
- package/agents/god-roadmapper.md +82 -0
- package/agents/god-spec-reviewer.md +70 -0
- package/agents/god-spike-runner.md +119 -0
- package/agents/god-stack-selector.md +93 -0
- package/agents/god-standards-check.md +132 -0
- package/agents/god-storyteller.md +116 -0
- package/agents/god-updater.md +174 -0
- package/bin/install.js +514 -0
- package/extensions/data-pack/README.md +33 -0
- package/extensions/data-pack/agents/god-dashboard-builder.md +66 -0
- package/extensions/data-pack/agents/god-etl-engineer.md +64 -0
- package/extensions/data-pack/agents/god-ml-feature-engineer.md +66 -0
- package/extensions/data-pack/manifest.yaml +39 -0
- package/extensions/data-pack/package.json +42 -0
- package/extensions/data-pack/skills/god-dashboard.md +28 -0
- package/extensions/data-pack/skills/god-etl.md +28 -0
- package/extensions/data-pack/skills/god-ml-feature.md +28 -0
- package/extensions/data-pack/workflows/dashboard-arc.yaml +13 -0
- package/extensions/data-pack/workflows/etl-arc.yaml +13 -0
- package/extensions/data-pack/workflows/ml-feature-arc.yaml +13 -0
- package/extensions/launch-pack/README.md +36 -0
- package/extensions/launch-pack/agents/god-indie-hackers-strategist.md +128 -0
- package/extensions/launch-pack/agents/god-oss-release-strategist.md +125 -0
- package/extensions/launch-pack/agents/god-product-hunt-strategist.md +118 -0
- package/extensions/launch-pack/agents/god-show-hn-strategist.md +113 -0
- package/extensions/launch-pack/manifest.yaml +45 -0
- package/extensions/launch-pack/package.json +41 -0
- package/extensions/launch-pack/skills/god-indie-hackers.md +39 -0
- package/extensions/launch-pack/skills/god-oss-release.md +43 -0
- package/extensions/launch-pack/skills/god-product-hunt.md +41 -0
- package/extensions/launch-pack/skills/god-show-hn.md +40 -0
- package/extensions/launch-pack/workflows/indie-hackers.yaml +13 -0
- package/extensions/launch-pack/workflows/oss-release.yaml +13 -0
- package/extensions/launch-pack/workflows/product-hunt.yaml +13 -0
- package/extensions/launch-pack/workflows/show-hn.yaml +13 -0
- package/extensions/security-pack/README.md +48 -0
- package/extensions/security-pack/agents/god-hipaa-auditor.md +117 -0
- package/extensions/security-pack/agents/god-pci-auditor.md +100 -0
- package/extensions/security-pack/agents/god-soc2-auditor.md +107 -0
- package/extensions/security-pack/manifest.yaml +39 -0
- package/extensions/security-pack/package.json +42 -0
- package/extensions/security-pack/skills/god-hipaa-audit.md +41 -0
- package/extensions/security-pack/skills/god-pci-audit.md +40 -0
- package/extensions/security-pack/skills/god-soc2-audit.md +42 -0
- package/extensions/security-pack/workflows/hipaa-arc.yaml +15 -0
- package/extensions/security-pack/workflows/pci-arc.yaml +15 -0
- package/extensions/security-pack/workflows/soc2-arc.yaml +15 -0
- package/hooks/pre-tool-use.sh +40 -0
- package/hooks/session-start.sh +74 -0
- package/lib/README.md +28 -0
- package/lib/agent-browser-driver.js +215 -0
- package/lib/agent-cache.js +194 -0
- package/lib/agent-validator.js +275 -0
- package/lib/artifact-diff.js +168 -0
- package/lib/artifact-linter.js +142 -0
- package/lib/awesome-design.js +312 -0
- package/lib/browser-bridge.js +209 -0
- package/lib/budget.js +215 -0
- package/lib/checkpoint.js +390 -0
- package/lib/code-scanner.js +262 -0
- package/lib/context-budget.js +170 -0
- package/lib/context-writer.js +348 -0
- package/lib/cost-tracker.js +325 -0
- package/lib/cross-artifact-impact.js +162 -0
- package/lib/cross-repo-linkage.js +150 -0
- package/lib/design-detector.js +167 -0
- package/lib/design-spec.js +348 -0
- package/lib/drift-detector.js +212 -0
- package/lib/event-reader.js +174 -0
- package/lib/events.js +183 -0
- package/lib/extensions.js +257 -0
- package/lib/have-nots-validator.js +647 -0
- package/lib/impact.js +314 -0
- package/lib/impeccable-bridge.js +139 -0
- package/lib/intent.js +177 -0
- package/lib/linkage.js +232 -0
- package/lib/meta-linter.js +263 -0
- package/lib/multi-repo-detector.js +182 -0
- package/lib/otel-exporter.js +308 -0
- package/lib/recipes.js +186 -0
- package/lib/reverse-sync.js +332 -0
- package/lib/review-required.js +224 -0
- package/lib/router.js +278 -0
- package/lib/runtime-audit.js +455 -0
- package/lib/runtime-test.js +309 -0
- package/lib/skillui-bridge.js +216 -0
- package/lib/state-lock.js +201 -0
- package/lib/state.js +142 -0
- package/lib/story-validator.js +301 -0
- package/lib/suite-state.js +220 -0
- package/lib/workflow-parser.js +109 -0
- package/lib/workflow-runner.js +221 -0
- package/package.json +63 -0
- package/references/HAVE-NOTS.md +573 -0
- package/references/building/BUILD-ANTIPATTERNS.md +102 -0
- package/references/building/BUILD-VERTICAL-SLICES.md +75 -0
- package/references/building/BUILD-WAVES.md +61 -0
- package/references/building/README.md +17 -0
- package/references/design/COLOR.md +122 -0
- package/references/design/DESIGN-ANATOMY.md +121 -0
- package/references/design/DESIGN-ANTIPATTERNS.md +108 -0
- package/references/design/INTERACTION.md +148 -0
- package/references/design/MOTION.md +120 -0
- package/references/design/RESPONSIVE.md +157 -0
- package/references/design/SPATIAL.md +109 -0
- package/references/design/TYPOGRAPHY.md +121 -0
- package/references/design/UX-WRITING.md +135 -0
- package/references/orchestration/MODE-DETECTION.md +74 -0
- package/references/orchestration/README.md +18 -0
- package/references/orchestration/SCALE-DETECTION.md +81 -0
- package/references/planning/ARCH-ANATOMY.md +143 -0
- package/references/planning/ARCH-ANTIPATTERNS.md +52 -0
- package/references/planning/PRD-ANATOMY.md +117 -0
- package/references/planning/PRD-ANTIPATTERNS.md +138 -0
- package/references/planning/README.md +16 -0
- package/references/planning/ROADMAP-ANATOMY.md +43 -0
- package/references/planning/ROADMAP-ANTIPATTERNS.md +94 -0
- package/references/planning/STACK-ANATOMY.md +60 -0
- package/references/planning/STACK-ANTIPATTERNS.md +95 -0
- package/references/shared/GLOSSARY.md +80 -0
- package/references/shared/ORCHESTRATORS.md +76 -0
- package/references/shared/README.md +14 -0
- package/references/shipping/DEPLOY-ANTIPATTERNS.md +64 -0
- package/references/shipping/DEPLOY-PATTERNS.md +110 -0
- package/references/shipping/HARDEN-ANTIPATTERNS.md +66 -0
- package/references/shipping/HARDEN-OWASP-WORKSHEETS.md +89 -0
- package/references/shipping/LAUNCH-ANTIPATTERNS.md +68 -0
- package/references/shipping/OBSERVE-ANTIPATTERNS.md +62 -0
- package/references/shipping/OBSERVE-SLO-EXAMPLES.md +107 -0
- package/references/shipping/README.md +18 -0
- package/routing/god-add-backlog.yaml +24 -0
- package/routing/god-add-tests.yaml +27 -0
- package/routing/god-add-todo.yaml +24 -0
- package/routing/god-agent-audit.yaml +24 -0
- package/routing/god-arch.yaml +46 -0
- package/routing/god-archaeology.yaml +28 -0
- package/routing/god-audit.yaml +32 -0
- package/routing/god-budget.yaml +24 -0
- package/routing/god-build-agent.yaml +24 -0
- package/routing/god-build.yaml +46 -0
- package/routing/god-cache-clear.yaml +24 -0
- package/routing/god-check-todos.yaml +24 -0
- package/routing/god-context-scan.yaml +24 -0
- package/routing/god-context.yaml +44 -0
- package/routing/god-cost.yaml +24 -0
- package/routing/god-debug.yaml +28 -0
- package/routing/god-deploy.yaml +34 -0
- package/routing/god-design-impact.yaml +25 -0
- package/routing/god-design.yaml +67 -0
- package/routing/god-discuss.yaml +27 -0
- package/routing/god-docs.yaml +33 -0
- package/routing/god-doctor.yaml +27 -0
- package/routing/god-explore.yaml +27 -0
- package/routing/god-extension-add.yaml +24 -0
- package/routing/god-extension-info.yaml +24 -0
- package/routing/god-extension-list.yaml +24 -0
- package/routing/god-extension-remove.yaml +24 -0
- package/routing/god-extract-learnings.yaml +24 -0
- package/routing/god-fast.yaml +27 -0
- package/routing/god-feature.yaml +34 -0
- package/routing/god-graph.yaml +24 -0
- package/routing/god-harden.yaml +41 -0
- package/routing/god-help.yaml +27 -0
- package/routing/god-hotfix.yaml +34 -0
- package/routing/god-hygiene.yaml +28 -0
- package/routing/god-init.yaml +37 -0
- package/routing/god-intel.yaml +24 -0
- package/routing/god-launch.yaml +41 -0
- package/routing/god-lifecycle.yaml +27 -0
- package/routing/god-link.yaml +24 -0
- package/routing/god-lint.yaml +24 -0
- package/routing/god-list-assumptions.yaml +27 -0
- package/routing/god-locate.yaml +24 -0
- package/routing/god-logs.yaml +24 -0
- package/routing/god-map-codebase.yaml +24 -0
- package/routing/god-metrics.yaml +24 -0
- package/routing/god-mode.yaml +31 -0
- package/routing/god-next.yaml +27 -0
- package/routing/god-note.yaml +24 -0
- package/routing/god-observe.yaml +34 -0
- package/routing/god-org-context.yaml +28 -0
- package/routing/god-party.yaml +24 -0
- package/routing/god-pause-work.yaml +27 -0
- package/routing/god-plant-seed.yaml +24 -0
- package/routing/god-postmortem.yaml +34 -0
- package/routing/god-pr-branch.yaml +25 -0
- package/routing/god-prd.yaml +49 -0
- package/routing/god-quick.yaml +28 -0
- package/routing/god-reconcile.yaml +48 -0
- package/routing/god-reconstruct.yaml +36 -0
- package/routing/god-redo.yaml +27 -0
- package/routing/god-refactor.yaml +36 -0
- package/routing/god-repair.yaml +27 -0
- package/routing/god-repo.yaml +35 -0
- package/routing/god-restore.yaml +27 -0
- package/routing/god-resume-work.yaml +27 -0
- package/routing/god-review-changes.yaml +25 -0
- package/routing/god-review.yaml +28 -0
- package/routing/god-roadmap-check.yaml +39 -0
- package/routing/god-roadmap-update.yaml +37 -0
- package/routing/god-roadmap.yaml +42 -0
- package/routing/god-rollback.yaml +27 -0
- package/routing/god-scan.yaml +24 -0
- package/routing/god-set-profile.yaml +24 -0
- package/routing/god-settings.yaml +24 -0
- package/routing/god-skip.yaml +27 -0
- package/routing/god-smite.yaml +29 -0
- package/routing/god-spike.yaml +35 -0
- package/routing/god-sprint.yaml +25 -0
- package/routing/god-stack.yaml +41 -0
- package/routing/god-standards.yaml +24 -0
- package/routing/god-status.yaml +27 -0
- package/routing/god-stories.yaml +24 -0
- package/routing/god-story-build.yaml +25 -0
- package/routing/god-story-close.yaml +25 -0
- package/routing/god-story-verify.yaml +25 -0
- package/routing/god-story.yaml +24 -0
- package/routing/god-suite-init.yaml +24 -0
- package/routing/god-suite-patch.yaml +25 -0
- package/routing/god-suite-release.yaml +25 -0
- package/routing/god-suite-status.yaml +25 -0
- package/routing/god-suite-sync.yaml +25 -0
- package/routing/god-sync.yaml +33 -0
- package/routing/god-tech-debt.yaml +32 -0
- package/routing/god-test-extension.yaml +24 -0
- package/routing/god-test-runtime.yaml +25 -0
- package/routing/god-thread.yaml +24 -0
- package/routing/god-trace.yaml +24 -0
- package/routing/god-undo.yaml +27 -0
- package/routing/god-update-deps.yaml +39 -0
- package/routing/god-upgrade.yaml +33 -0
- package/routing/god-version.yaml +24 -0
- package/routing/god-workstream.yaml +24 -0
- package/routing/god.yaml +24 -0
- package/routing/recipes/add-feature-defer-current-milestone.yaml +21 -0
- package/routing/recipes/add-feature-future-conditional.yaml +21 -0
- package/routing/recipes/add-feature-mid-arc-pause.yaml +33 -0
- package/routing/recipes/add-feature-next-milestone.yaml +23 -0
- package/routing/recipes/add-feature-parallel.yaml +29 -0
- package/routing/recipes/add-feature-prd-update.yaml +21 -0
- package/routing/recipes/add-feature-small.yaml +24 -0
- package/routing/recipes/add-feature-tiny.yaml +24 -0
- package/routing/recipes/bluefield-org-aware.yaml +27 -0
- package/routing/recipes/broken-install.yaml +22 -0
- package/routing/recipes/brownfield-onboarding.yaml +32 -0
- package/routing/recipes/bug-no-urgency.yaml +21 -0
- package/routing/recipes/capture-idea.yaml +22 -0
- package/routing/recipes/capture-todo.yaml +21 -0
- package/routing/recipes/clean-pr.yaml +21 -0
- package/routing/recipes/code-cleanup.yaml +23 -0
- package/routing/recipes/docs-drift.yaml +21 -0
- package/routing/recipes/existing-codebase-onboarding.yaml +32 -0
- package/routing/recipes/extract-learnings.yaml +22 -0
- package/routing/recipes/greenfield-fast.yaml +25 -0
- package/routing/recipes/greenfield-manual.yaml +32 -0
- package/routing/recipes/greenfield-with-ideation.yaml +29 -0
- package/routing/recipes/incident-postmortem.yaml +24 -0
- package/routing/recipes/major-framework-upgrade.yaml +23 -0
- package/routing/recipes/monthly-deps.yaml +22 -0
- package/routing/recipes/multi-repo-suite.yaml +56 -0
- package/routing/recipes/parallel-engineers.yaml +26 -0
- package/routing/recipes/pause-handoff.yaml +21 -0
- package/routing/recipes/production-broken.yaml +26 -0
- package/routing/recipes/rerun-tier.yaml +21 -0
- package/routing/recipes/returning-after-break.yaml +31 -0
- package/routing/recipes/state-drift.yaml +21 -0
- package/routing/recipes/undo-last.yaml +21 -0
- package/routing/recipes/weekly-health-check.yaml +24 -0
- package/routing/recipes/whats-next.yaml +22 -0
- package/routing/recipes/where-am-i.yaml +21 -0
- package/schema/events.v1.json +63 -0
- package/schema/extension-manifest.v1.json +84 -0
- package/schema/intent.v1.yaml.json +116 -0
- package/schema/recipe.v1.json +120 -0
- package/schema/routing.v1.json +163 -0
- package/schema/state.v1.json +146 -0
- package/schema/workflow.v1.json +96 -0
- package/skills/god-add-backlog.md +40 -0
- package/skills/god-add-tests.md +53 -0
- package/skills/god-add-todo.md +32 -0
- package/skills/god-agent-audit.md +87 -0
- package/skills/god-arch.md +81 -0
- package/skills/god-archaeology.md +48 -0
- package/skills/god-audit.md +65 -0
- package/skills/god-budget.md +103 -0
- package/skills/god-build-agent.md +91 -0
- package/skills/god-build.md +90 -0
- package/skills/god-cache-clear.md +75 -0
- package/skills/god-check-todos.md +42 -0
- package/skills/god-context-scan.md +125 -0
- package/skills/god-context.md +147 -0
- package/skills/god-cost.md +118 -0
- package/skills/god-debug.md +30 -0
- package/skills/god-deploy.md +76 -0
- package/skills/god-design-impact.md +86 -0
- package/skills/god-design.md +275 -0
- package/skills/god-discuss.md +46 -0
- package/skills/god-docs.md +81 -0
- package/skills/god-doctor.md +94 -0
- package/skills/god-explore.md +50 -0
- package/skills/god-export-otel.md +87 -0
- package/skills/god-extension-add.md +79 -0
- package/skills/god-extension-info.md +75 -0
- package/skills/god-extension-list.md +55 -0
- package/skills/god-extension-remove.md +66 -0
- package/skills/god-extract-learnings.md +60 -0
- package/skills/god-fast.md +47 -0
- package/skills/god-feature.md +114 -0
- package/skills/god-graph.md +56 -0
- package/skills/god-harden.md +106 -0
- package/skills/god-help.md +66 -0
- package/skills/god-hotfix.md +139 -0
- package/skills/god-hygiene.md +104 -0
- package/skills/god-init.md +161 -0
- package/skills/god-intel.md +36 -0
- package/skills/god-launch.md +86 -0
- package/skills/god-lifecycle.md +119 -0
- package/skills/god-link.md +90 -0
- package/skills/god-lint.md +128 -0
- package/skills/god-list-assumptions.md +56 -0
- package/skills/god-locate.md +97 -0
- package/skills/god-logs.md +57 -0
- package/skills/god-map-codebase.md +45 -0
- package/skills/god-metrics.md +51 -0
- package/skills/god-mode.md +159 -0
- package/skills/god-next.md +257 -0
- package/skills/god-note.md +39 -0
- package/skills/god-observe.md +76 -0
- package/skills/god-org-context.md +81 -0
- package/skills/god-party.md +87 -0
- package/skills/god-pause-work.md +64 -0
- package/skills/god-plant-seed.md +59 -0
- package/skills/god-postmortem.md +103 -0
- package/skills/god-pr-branch.md +50 -0
- package/skills/god-prd.md +90 -0
- package/skills/god-quick.md +50 -0
- package/skills/god-reconcile.md +90 -0
- package/skills/god-reconstruct.md +72 -0
- package/skills/god-redo.md +73 -0
- package/skills/god-refactor.md +137 -0
- package/skills/god-repair.md +82 -0
- package/skills/god-repo.md +49 -0
- package/skills/god-restore.md +91 -0
- package/skills/god-resume-work.md +42 -0
- package/skills/god-review-changes.md +93 -0
- package/skills/god-review.md +52 -0
- package/skills/god-roadmap-check.md +66 -0
- package/skills/god-roadmap-update.md +64 -0
- package/skills/god-roadmap.md +77 -0
- package/skills/god-rollback.md +88 -0
- package/skills/god-scan.md +106 -0
- package/skills/god-set-profile.md +58 -0
- package/skills/god-settings.md +44 -0
- package/skills/god-skip.md +78 -0
- package/skills/god-smite.md +86 -0
- package/skills/god-spike.md +120 -0
- package/skills/god-sprint.md +77 -0
- package/skills/god-stack.md +74 -0
- package/skills/god-standards.md +62 -0
- package/skills/god-status.md +99 -0
- package/skills/god-stories.md +60 -0
- package/skills/god-story-build.md +76 -0
- package/skills/god-story-close.md +82 -0
- package/skills/god-story-verify.md +71 -0
- package/skills/god-story.md +55 -0
- package/skills/god-suite-init.md +75 -0
- package/skills/god-suite-patch.md +64 -0
- package/skills/god-suite-release.md +58 -0
- package/skills/god-suite-status.md +63 -0
- package/skills/god-suite-sync.md +49 -0
- package/skills/god-sync.md +102 -0
- package/skills/god-tech-debt.md +56 -0
- package/skills/god-test-extension.md +87 -0
- package/skills/god-test-runtime.md +144 -0
- package/skills/god-thread.md +39 -0
- package/skills/god-trace.md +50 -0
- package/skills/god-undo.md +68 -0
- package/skills/god-update-deps.md +134 -0
- package/skills/god-upgrade.md +139 -0
- package/skills/god-version.md +37 -0
- package/skills/god-workstream.md +61 -0
- package/skills/god.md +207 -0
- package/templates/ARCH.md +99 -0
- package/templates/DEPS-AUDIT.md +66 -0
- package/templates/DESIGN.md +71 -0
- package/templates/DOCS-UPDATE-LOG.md +64 -0
- package/templates/HARDEN-FINDINGS.md +69 -0
- package/templates/MIGRATION.md +86 -0
- package/templates/POSTMORTEM.md +88 -0
- package/templates/PRD.md +80 -0
- package/templates/PROGRESS.md +49 -0
- package/templates/ROADMAP.md +47 -0
- package/templates/SPIKE.md +72 -0
- package/templates/STACK-DECISION.md +61 -0
- package/workflows/audit-only.yaml +22 -0
- package/workflows/bluefield-arc.yaml +87 -0
- package/workflows/brownfield-arc.yaml +44 -0
- package/workflows/deps-audit.yaml +56 -0
- package/workflows/docs-arc.yaml +22 -0
- package/workflows/feature-arc.yaml +59 -0
- package/workflows/full-arc.yaml +84 -0
- package/workflows/hotfix-arc.yaml +59 -0
- package/workflows/hygiene.yaml +43 -0
- package/workflows/migration-arc.yaml +73 -0
- package/workflows/postmortem.yaml +31 -0
- package/workflows/refactor-arc.yaml +59 -0
- package/workflows/spike.yaml +23 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Motion
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for animation and transition.
|
|
4
|
+
> Shallower than
|
|
5
|
+
> [Impeccable's motion-design reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/motion-design.md).
|
|
6
|
+
|
|
7
|
+
## Three durations, three easings
|
|
8
|
+
|
|
9
|
+
Most products need only this:
|
|
10
|
+
|
|
11
|
+
| Duration | Use |
|
|
12
|
+
|---|---|
|
|
13
|
+
| `100ms` | Hover states, focus rings, color shifts |
|
|
14
|
+
| `200ms` | Element appear/disappear, expand/collapse |
|
|
15
|
+
| `400ms` | Page transitions, route changes, modals |
|
|
16
|
+
|
|
17
|
+
```css
|
|
18
|
+
:root {
|
|
19
|
+
--motion-fast: 100ms;
|
|
20
|
+
--motion-default: 200ms;
|
|
21
|
+
--motion-slow: 400ms;
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Anything longer than 500ms feels broken or theatrical (unless it's a
|
|
26
|
+
page transition with intentional staging).
|
|
27
|
+
|
|
28
|
+
## Easings
|
|
29
|
+
|
|
30
|
+
| Curve | When |
|
|
31
|
+
|---|---|
|
|
32
|
+
| `ease-out` (cubic-bezier(0.16, 1, 0.3, 1)) | Default for most things |
|
|
33
|
+
| `ease-in-out` (cubic-bezier(0.65, 0, 0.35, 1)) | Both ends matter (modals, drawers) |
|
|
34
|
+
| `linear` | Loading bars, scroll progress, durations the user controls |
|
|
35
|
+
|
|
36
|
+
Avoid:
|
|
37
|
+
|
|
38
|
+
- **Bounce** (cubic-bezier with overshoot): feels dated, mid-2010s
|
|
39
|
+
- **Elastic** / spring with too much stiffness: distracting in product UI
|
|
40
|
+
- **ease-in alone**: feels heavy, fights user attention
|
|
41
|
+
|
|
42
|
+
## Anti-patterns
|
|
43
|
+
|
|
44
|
+
- **Animating everything.** Page-level animations on every interaction
|
|
45
|
+
are exhausting. Restrict to: state changes, navigation, gating.
|
|
46
|
+
- **Slow exits.** When something should leave the screen (modal close,
|
|
47
|
+
toast dismiss), use `100ms`. Slow exits make the user wait.
|
|
48
|
+
- **Motion without intent.** A spinning logo, ambient particles,
|
|
49
|
+
hover pulses on every card. Decoration that doesn't serve.
|
|
50
|
+
- **Ignoring `prefers-reduced-motion`.** Always honor.
|
|
51
|
+
- **Bounce on production UI.** Acceptable in marketing/illustration;
|
|
52
|
+
in product UI it reads as toy.
|
|
53
|
+
|
|
54
|
+
## prefers-reduced-motion
|
|
55
|
+
|
|
56
|
+
Always respect:
|
|
57
|
+
|
|
58
|
+
```css
|
|
59
|
+
@media (prefers-reduced-motion: reduce) {
|
|
60
|
+
*, *::before, *::after {
|
|
61
|
+
animation-duration: 0.01ms !important;
|
|
62
|
+
animation-iteration-count: 1 !important;
|
|
63
|
+
transition-duration: 0.01ms !important;
|
|
64
|
+
scroll-behavior: auto !important;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Or in JS via `window.matchMedia('(prefers-reduced-motion: reduce)')`.
|
|
70
|
+
Disable nonessential motion entirely; keep essential transitions
|
|
71
|
+
near-instant.
|
|
72
|
+
|
|
73
|
+
## Staggering
|
|
74
|
+
|
|
75
|
+
When multiple elements animate together (e.g., a list rendering),
|
|
76
|
+
stagger by 30-50ms per item, max 8-10 items before the cascade feels
|
|
77
|
+
like a wait.
|
|
78
|
+
|
|
79
|
+
```js
|
|
80
|
+
items.forEach((item, i) => {
|
|
81
|
+
item.style.transitionDelay = `${i * 40}ms`;
|
|
82
|
+
});
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Beyond 10 items: animate the container, not each child.
|
|
86
|
+
|
|
87
|
+
## Scroll-driven motion
|
|
88
|
+
|
|
89
|
+
Use sparingly. One scroll-tied animation per long page is plenty.
|
|
90
|
+
|
|
91
|
+
Acceptable:
|
|
92
|
+
- Hero parallax (subtle, < 30% velocity ratio)
|
|
93
|
+
- Progress indicator at the top
|
|
94
|
+
- Reveal-on-scroll for hero sections
|
|
95
|
+
|
|
96
|
+
Not acceptable:
|
|
97
|
+
- Every section parallax
|
|
98
|
+
- Counter-scroll text
|
|
99
|
+
- Multiple scroll-pinned sections
|
|
100
|
+
|
|
101
|
+
## Loading patterns
|
|
102
|
+
|
|
103
|
+
| Wait | Pattern |
|
|
104
|
+
|---|---|
|
|
105
|
+
| < 200ms | No indicator |
|
|
106
|
+
| 200-1000ms | Subtle skeleton or muted spinner |
|
|
107
|
+
| > 1000ms | Skeleton with shape, optional progress bar |
|
|
108
|
+
| > 5000ms | Status text + progress bar |
|
|
109
|
+
| User-initiated long task | Indeterminate -> determinate progress, ETA if known |
|
|
110
|
+
|
|
111
|
+
## Have-Nots
|
|
112
|
+
|
|
113
|
+
You fail motion if:
|
|
114
|
+
|
|
115
|
+
- `prefers-reduced-motion` not honored
|
|
116
|
+
- Bounce/elastic easing on production UI
|
|
117
|
+
- Animation duration > 500ms for non-page-level transitions
|
|
118
|
+
- Slow exits (> 200ms) on dismissable elements
|
|
119
|
+
- Decorative motion without intent
|
|
120
|
+
- Stagger applied to > 10 items
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Responsive Design
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for breakpoints, fluid design, and mobile.
|
|
4
|
+
> Shallower than
|
|
5
|
+
> [Impeccable's responsive-design reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/responsive-design.md).
|
|
6
|
+
|
|
7
|
+
## Mobile-first, always
|
|
8
|
+
|
|
9
|
+
Write the smallest screen first. Add media queries to scale up.
|
|
10
|
+
|
|
11
|
+
```css
|
|
12
|
+
/* default: mobile */
|
|
13
|
+
.container { padding: 16px; font-size: 1rem; }
|
|
14
|
+
|
|
15
|
+
@media (min-width: 768px) {
|
|
16
|
+
.container { padding: 32px; font-size: 1.125rem; }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@media (min-width: 1280px) {
|
|
20
|
+
.container { padding: 64px; font-size: 1.25rem; }
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Don't default to desktop and reverse. Mobile-first compresses better
|
|
25
|
+
for the small majority.
|
|
26
|
+
|
|
27
|
+
## Breakpoints
|
|
28
|
+
|
|
29
|
+
Pick three. More than three is decoration; fewer is a missed
|
|
30
|
+
opportunity.
|
|
31
|
+
|
|
32
|
+
| Name | Min | Targets |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `sm` | 640px | Large phones, small tablets |
|
|
35
|
+
| `md` | 768px | Tablets |
|
|
36
|
+
| `lg` | 1024px | Small laptops |
|
|
37
|
+
| `xl` | 1280px | Most laptops, monitors |
|
|
38
|
+
| `2xl` | 1536px | Large monitors |
|
|
39
|
+
|
|
40
|
+
Recommended starter trio: `768px`, `1024px`, `1280px`. Add others only
|
|
41
|
+
when content demands.
|
|
42
|
+
|
|
43
|
+
## Container queries (when supported)
|
|
44
|
+
|
|
45
|
+
Modern browsers support `@container`. Use when components need to
|
|
46
|
+
adapt based on their parent's width, not the viewport's:
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
.card-list { container-type: inline-size; }
|
|
50
|
+
|
|
51
|
+
@container (min-width: 600px) {
|
|
52
|
+
.card { display: grid; grid-template-columns: 200px 1fr; }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Better than viewport queries for component libraries that ship in
|
|
57
|
+
varied contexts.
|
|
58
|
+
|
|
59
|
+
## Fluid type and spacing
|
|
60
|
+
|
|
61
|
+
Use `clamp()` to interpolate between breakpoints:
|
|
62
|
+
|
|
63
|
+
```css
|
|
64
|
+
.heading {
|
|
65
|
+
font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
|
|
66
|
+
/* min 1.5rem, scales with viewport, caps at 3rem */
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
This collapses three media queries into one declaration. Type stops
|
|
71
|
+
being staircased.
|
|
72
|
+
|
|
73
|
+
## Touch targets
|
|
74
|
+
|
|
75
|
+
iOS HIG: 44x44px minimum.
|
|
76
|
+
Android Material: 48x48px minimum.
|
|
77
|
+
|
|
78
|
+
Use 48x48px or larger for primary actions. Smaller targets fail tap
|
|
79
|
+
tests for users with motor impairments.
|
|
80
|
+
|
|
81
|
+
```css
|
|
82
|
+
.button { min-height: 48px; min-width: 48px; padding: 0 16px; }
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Apply to icon-only buttons especially. A 24px icon + 12px padding all
|
|
86
|
+
sides = 48x48 hit target.
|
|
87
|
+
|
|
88
|
+
## Anti-patterns
|
|
89
|
+
|
|
90
|
+
- **Hover-only interactions.** Touch devices have no hover. Anything
|
|
91
|
+
triggered by hover must also be reachable by tap.
|
|
92
|
+
- **Hidden mobile content.** "Show on desktop only" loses critical
|
|
93
|
+
information. If desktop has it, mobile needs it (possibly
|
|
94
|
+
reorganized, never disappeared).
|
|
95
|
+
- **Tiny text scales.** `font-size: 11px` on body is unreadable on
|
|
96
|
+
mobile. Minimum 14px, typically 16px.
|
|
97
|
+
- **Horizontal scroll on mobile.** Always a bug unless explicitly
|
|
98
|
+
designed (carousel).
|
|
99
|
+
- **Fixed pixel widths.** Use rems, percentages, or CSS Grid. Fixed
|
|
100
|
+
px breaks at unusual viewports.
|
|
101
|
+
|
|
102
|
+
## Common layouts that adapt
|
|
103
|
+
|
|
104
|
+
### Grid that flows
|
|
105
|
+
|
|
106
|
+
```css
|
|
107
|
+
.grid {
|
|
108
|
+
display: grid;
|
|
109
|
+
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
|
110
|
+
gap: 24px;
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
This auto-collapses to fewer columns as the viewport narrows. No media
|
|
115
|
+
queries needed.
|
|
116
|
+
|
|
117
|
+
### Hero that re-flows
|
|
118
|
+
|
|
119
|
+
```css
|
|
120
|
+
.hero {
|
|
121
|
+
display: flex;
|
|
122
|
+
flex-direction: column; /* mobile: stacked */
|
|
123
|
+
gap: 32px;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@media (min-width: 768px) {
|
|
127
|
+
.hero { flex-direction: row; align-items: center; }
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Navigation that collapses
|
|
132
|
+
|
|
133
|
+
Mobile: hamburger or bottom-tab bar.
|
|
134
|
+
Tablet: condensed top nav.
|
|
135
|
+
Desktop: full top nav with all items visible.
|
|
136
|
+
|
|
137
|
+
Use `<nav>` with semantic markup; let CSS hide/show variants. Avoid
|
|
138
|
+
duplicating navigation structure for breakpoints.
|
|
139
|
+
|
|
140
|
+
## Dark mode + responsive
|
|
141
|
+
|
|
142
|
+
Test both: dark mode on mobile and dark mode on desktop. Light
|
|
143
|
+
backgrounds at small sizes can be glaring; dark variants tend to feel
|
|
144
|
+
more natural on phones at night.
|
|
145
|
+
|
|
146
|
+
## Have-Nots
|
|
147
|
+
|
|
148
|
+
You fail responsive if:
|
|
149
|
+
|
|
150
|
+
- Body font < 14px on mobile
|
|
151
|
+
- Hover-only interactions exist
|
|
152
|
+
- Touch targets < 44x44px
|
|
153
|
+
- Horizontal scroll appears on screens >= 320px
|
|
154
|
+
- Mobile loses content that desktop has
|
|
155
|
+
- Breakpoints scattered randomly (not on the chosen scale)
|
|
156
|
+
- Components use viewport queries when container queries are appropriate
|
|
157
|
+
- Fixed-px widths in layout containers
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Spatial Design
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for spacing, grids, and rhythm.
|
|
4
|
+
> Shallower than
|
|
5
|
+
> [Impeccable's spatial-design reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/spatial-design.md).
|
|
6
|
+
|
|
7
|
+
## Pick one spacing scale, use it everywhere
|
|
8
|
+
|
|
9
|
+
Match the typography ratio. If your type uses 1.25 (Major Third), use
|
|
10
|
+
the same for spacing:
|
|
11
|
+
|
|
12
|
+
```yaml
|
|
13
|
+
spacing:
|
|
14
|
+
xs: 8px
|
|
15
|
+
sm: 12px # 8 * 1.25^1
|
|
16
|
+
md: 16px # 8 * 1.25^2 (rounded)
|
|
17
|
+
lg: 24px # 8 * 1.25^3.5 (rounded to grid)
|
|
18
|
+
xl: 32px
|
|
19
|
+
2xl: 48px
|
|
20
|
+
3xl: 64px
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Powers-of-2 friendly values (8, 16, 24, 32, 48, 64) are good defaults
|
|
24
|
+
because they hit common breakpoints and feel anchored.
|
|
25
|
+
|
|
26
|
+
## Anti-patterns
|
|
27
|
+
|
|
28
|
+
- **Random px values** (13px, 17px, 22px). The reader can't tell, but
|
|
29
|
+
the system feels noisy. Stick to the scale.
|
|
30
|
+
- **Cards-in-cards-in-cards.** Wrap once. Twice if structurally needed.
|
|
31
|
+
Three times means you're nesting visual containers to hide a layout
|
|
32
|
+
problem.
|
|
33
|
+
- **Same padding everywhere.** Buttons, cards, and sections need
|
|
34
|
+
different breathing room. Tokenize: `padding-button: md`,
|
|
35
|
+
`padding-card: lg`, `padding-section: 3xl`.
|
|
36
|
+
- **Cramped touch targets.** Mobile minimum: 44x44px. UI buttons under
|
|
37
|
+
that fail accessibility heuristics.
|
|
38
|
+
- **Inconsistent vertical rhythm.** All baselines should snap to a
|
|
39
|
+
multiple of 4px or 8px.
|
|
40
|
+
|
|
41
|
+
## Grid
|
|
42
|
+
|
|
43
|
+
Pick a grid that matches content density:
|
|
44
|
+
|
|
45
|
+
| Density | Columns | Gutter | Use |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| Marketing | 12 | 24-32px | Long-form, varied content |
|
|
48
|
+
| Product | 8-10 | 16-24px | Tables, dashboards, lists |
|
|
49
|
+
| Editorial | 6 | 24-40px | Reading, articles |
|
|
50
|
+
| Single-column | 1 | n/a | Narrow product, mobile-first |
|
|
51
|
+
|
|
52
|
+
Containers cap at:
|
|
53
|
+
|
|
54
|
+
- 1280-1440px for product UI
|
|
55
|
+
- 720-960px for reading content
|
|
56
|
+
- 480-640px for forms, focused tasks
|
|
57
|
+
|
|
58
|
+
Wider than 1440px feels theatrical. Narrower than 480px crowds.
|
|
59
|
+
|
|
60
|
+
## Whitespace philosophy
|
|
61
|
+
|
|
62
|
+
Whitespace is a primary layout tool, not "what's left over."
|
|
63
|
+
|
|
64
|
+
- **Breathing room around blocks**: 2-4x the line-height
|
|
65
|
+
- **Adjacent unrelated sections**: 4-8x the line-height
|
|
66
|
+
- **Tight related elements**: 0.5-1x the line-height (icon + label,
|
|
67
|
+
caption + image)
|
|
68
|
+
- **Padding inside containers**: matches the outer rhythm; 16-32px is
|
|
69
|
+
the typical band
|
|
70
|
+
|
|
71
|
+
The eye reads grouped elements as related. Gestalt's law of proximity
|
|
72
|
+
does layout for you if you let it.
|
|
73
|
+
|
|
74
|
+
## Container padding
|
|
75
|
+
|
|
76
|
+
Default rule: container padding equals or exceeds the largest gap
|
|
77
|
+
between children. If children sit 24px apart, container padding is at
|
|
78
|
+
least 24px.
|
|
79
|
+
|
|
80
|
+
```css
|
|
81
|
+
.section { padding: 64px 32px; } /* 64 vert, 32 horiz */
|
|
82
|
+
.card { padding: 24px; }
|
|
83
|
+
.cta-box { padding: 32px 24px; }
|
|
84
|
+
.button { padding: 12px 20px; }
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Vertical rhythm
|
|
88
|
+
|
|
89
|
+
Section spacing dominates the page feel:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
Tight: 32-48px between sections
|
|
93
|
+
Default: 64-96px
|
|
94
|
+
Generous: 96-160px
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Mismatched section spacing reads as "designed in pieces." Keep it
|
|
98
|
+
consistent within a page.
|
|
99
|
+
|
|
100
|
+
## Have-Nots
|
|
101
|
+
|
|
102
|
+
You fail spatial if:
|
|
103
|
+
|
|
104
|
+
- Random px values not on the scale (e.g., 13, 17, 21, 27)
|
|
105
|
+
- Touch targets < 44x44px
|
|
106
|
+
- Cards nested 3+ levels deep
|
|
107
|
+
- Section spacing inconsistent within a page (>20% variance)
|
|
108
|
+
- Container padding < largest inner gap
|
|
109
|
+
- More than 3 distinct grid systems in one project
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Typography
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for type. Shallower than
|
|
4
|
+
> [Impeccable's typography reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/typography.md);
|
|
5
|
+
> use this when Impeccable isn't installed. Our opinions, not theirs.
|
|
6
|
+
|
|
7
|
+
## Pick at most two type families
|
|
8
|
+
|
|
9
|
+
Most projects need exactly two: a **display** family for headlines and a
|
|
10
|
+
**body** family for paragraphs and UI. A third, monospace family for
|
|
11
|
+
code or numerics is fine. Beyond three, the system fragments.
|
|
12
|
+
|
|
13
|
+
### Recommended pairings
|
|
14
|
+
|
|
15
|
+
| Register | Display | Body | Why |
|
|
16
|
+
|---|---|---|---|
|
|
17
|
+
| Editorial / serious | Fraunces, Newsreader, Instrument Serif | Inter, Söhne, system-ui | Serif gravity + sans clarity |
|
|
18
|
+
| Software / product | Geist, Söhne, Inter | Inter, system-ui | Single sans family at varying weights |
|
|
19
|
+
| Brand / playful | Cabinet Grotesk, Mona Sans | Inter, Söhne | Geometric display + neutral body |
|
|
20
|
+
| Technical / docs | IBM Plex Sans / Mono | IBM Plex Sans | One family across roles |
|
|
21
|
+
|
|
22
|
+
## Anti-patterns
|
|
23
|
+
|
|
24
|
+
- **Inter for everything.** It's a fine body face; using it for display
|
|
25
|
+
flattens hierarchy. Pair it with a display face you actually pick.
|
|
26
|
+
- **System default fallback chains in production.** `system-ui` is fine
|
|
27
|
+
in dev; ship a real loaded face for display.
|
|
28
|
+
- **Five weights of one family used randomly.** Pick three weights:
|
|
29
|
+
body (400), strong (500/600), display (600/700). Stop there.
|
|
30
|
+
- **Letter-spacing larger than 0.05em on body text.** Reads like a
|
|
31
|
+
headline; tires the eye.
|
|
32
|
+
- **Italic for emphasis on UI elements.** Use weight (or color); italic
|
|
33
|
+
belongs in editorial copy.
|
|
34
|
+
|
|
35
|
+
## Modular scale
|
|
36
|
+
|
|
37
|
+
Use a ratio, not arbitrary px values. Common ratios:
|
|
38
|
+
|
|
39
|
+
| Ratio | Name | Feel |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| 1.125 | Major Second | Very tight, technical |
|
|
42
|
+
| 1.200 | Minor Third | Compact, dense UI |
|
|
43
|
+
| 1.250 | Major Third | Balanced, common default |
|
|
44
|
+
| 1.333 | Perfect Fourth | Editorial, generous |
|
|
45
|
+
| 1.500 | Perfect Fifth | Marketing, dramatic |
|
|
46
|
+
|
|
47
|
+
Pick one. Apply to your spacing scale too (Spatial reference).
|
|
48
|
+
|
|
49
|
+
### Practical scale (1.250)
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
xs: 0.75rem 12px
|
|
53
|
+
sm: 0.875rem 14px
|
|
54
|
+
base: 1rem 16px
|
|
55
|
+
lg: 1.25rem 20px
|
|
56
|
+
xl: 1.5rem 24px
|
|
57
|
+
2xl: 1.875rem 30px
|
|
58
|
+
3xl: 2.5rem 40px
|
|
59
|
+
4xl: 3.75rem 60px
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Line height
|
|
63
|
+
|
|
64
|
+
| Use | Line height |
|
|
65
|
+
|---|---|
|
|
66
|
+
| Display (>32px) | 1.05-1.15 |
|
|
67
|
+
| Headline (24-32px) | 1.2-1.3 |
|
|
68
|
+
| Body (14-18px) | 1.5-1.65 |
|
|
69
|
+
| Dense UI / labels | 1.3-1.4 |
|
|
70
|
+
|
|
71
|
+
Display lines look broken at 1.5; body lines look cramped at 1.2.
|
|
72
|
+
|
|
73
|
+
## Tabular numerals
|
|
74
|
+
|
|
75
|
+
Always enable for numeric columns and tables:
|
|
76
|
+
|
|
77
|
+
```css
|
|
78
|
+
font-feature-settings: "tnum";
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Or in your DESIGN.md typography token:
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
typography:
|
|
85
|
+
numeric:
|
|
86
|
+
fontFamily: Inter
|
|
87
|
+
fontSize: 2.5rem
|
|
88
|
+
fontFeature: tnum
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Without `tnum`, columns of numbers wobble.
|
|
92
|
+
|
|
93
|
+
## OpenType features worth using
|
|
94
|
+
|
|
95
|
+
| Feature | When |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `tnum` | Tables, columns, dashboards |
|
|
98
|
+
| `case` | All-caps text; aligns punctuation |
|
|
99
|
+
| `salt` | Designer-chosen alternates (single-storey 'a', etc.) |
|
|
100
|
+
| `liga` | Standard ligatures (default in most browsers) |
|
|
101
|
+
| `kern` | Pair kerning (default in modern browsers) |
|
|
102
|
+
|
|
103
|
+
## Loading
|
|
104
|
+
|
|
105
|
+
- Self-host `.woff2` whenever possible. Google Fonts is fine; their
|
|
106
|
+
CDN adds latency and a third-party request.
|
|
107
|
+
- `font-display: swap` for body, `optional` for display (avoid FOIT).
|
|
108
|
+
- Subset to the characters you actually use. A full Latin face is
|
|
109
|
+
~100KB; a subset can be 20KB.
|
|
110
|
+
|
|
111
|
+
## Have-Nots
|
|
112
|
+
|
|
113
|
+
You fail typography if:
|
|
114
|
+
|
|
115
|
+
- More than 2 families in use (3 if monospace counts; do not exceed 3)
|
|
116
|
+
- Letter-spacing > 0.05em on body
|
|
117
|
+
- Italic used for UI emphasis
|
|
118
|
+
- No tabular numerals on table columns
|
|
119
|
+
- Body line-height < 1.4 or > 1.7
|
|
120
|
+
- Display line-height > 1.2
|
|
121
|
+
- All five weights of the same family in active use
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# UX Writing
|
|
2
|
+
|
|
3
|
+
> Godpowers' baseline guidance for product copy. Shallower than
|
|
4
|
+
> [Impeccable's ux-writing reference](https://github.com/pbakaus/impeccable/blob/main/skill/reference/ux-writing.md).
|
|
5
|
+
|
|
6
|
+
## Write for the person doing the task
|
|
7
|
+
|
|
8
|
+
Every word in the UI should serve the next action. If a button says
|
|
9
|
+
"Submit," the user has to translate that to "submit what?" If it says
|
|
10
|
+
"Send invoice," they don't.
|
|
11
|
+
|
|
12
|
+
## Buttons: verb-noun, never "click here"
|
|
13
|
+
|
|
14
|
+
| Bad | Better |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Click Here | View invoice |
|
|
17
|
+
| OK | Save changes |
|
|
18
|
+
| Submit | Send invitation |
|
|
19
|
+
| Cancel | Discard changes |
|
|
20
|
+
| Yes | Confirm delete |
|
|
21
|
+
|
|
22
|
+
The button labels its outcome, not the user's gesture.
|
|
23
|
+
|
|
24
|
+
## Empty states: name the next action
|
|
25
|
+
|
|
26
|
+
| Bad | Better |
|
|
27
|
+
|---|---|
|
|
28
|
+
| No data. | No invoices yet. Connect Stripe to import. |
|
|
29
|
+
| Empty list. | Nothing in your queue. Add a task to get started. |
|
|
30
|
+
| Loading... | Loading your dashboard... |
|
|
31
|
+
|
|
32
|
+
Empty states are onboarding opportunities, not error states.
|
|
33
|
+
|
|
34
|
+
## Error messages: 3 rules
|
|
35
|
+
|
|
36
|
+
1. **Be specific.** "Invalid input" is useless. "Email needs an @
|
|
37
|
+
symbol" is actionable.
|
|
38
|
+
2. **Be forward-looking.** Tell them what to do, not what they
|
|
39
|
+
did wrong. "Try a longer password" beats "Password too short."
|
|
40
|
+
3. **Avoid blame.** "We couldn't reach Stripe" is better than "You
|
|
41
|
+
entered an invalid Stripe key."
|
|
42
|
+
|
|
43
|
+
### Status codes by user-facing severity
|
|
44
|
+
|
|
45
|
+
| Code | User sees |
|
|
46
|
+
|---|---|
|
|
47
|
+
| 4xx (user error) | Specific, fixable, actionable |
|
|
48
|
+
| 5xx (our error) | "Something went wrong on our end. Try again, or contact support." |
|
|
49
|
+
| Network failure | "Lost connection. Check your network and retry." |
|
|
50
|
+
| Validation | Inline, near the field |
|
|
51
|
+
|
|
52
|
+
Never show a stack trace or raw error code in production UI.
|
|
53
|
+
|
|
54
|
+
## Numbers and dates
|
|
55
|
+
|
|
56
|
+
- **Dates**: relative for recent ("3 days ago"), absolute for far
|
|
57
|
+
("March 15, 2026").
|
|
58
|
+
- **Times**: include timezone unless the user's local context is
|
|
59
|
+
obvious. "9:00 AM ET" not "9:00 AM."
|
|
60
|
+
- **Money**: always with currency symbol AND code on first reference
|
|
61
|
+
("$50 USD"). Subsequent refs can drop the code.
|
|
62
|
+
- **Counts**: pluralize correctly. "1 invoice" / "12 invoices."
|
|
63
|
+
Internationalize for non-English locales.
|
|
64
|
+
|
|
65
|
+
## Pronouns
|
|
66
|
+
|
|
67
|
+
- **Second person ("you")** for instructions: "Click here to verify
|
|
68
|
+
your email."
|
|
69
|
+
- **First person ("I", "we")** for product voice or reflective
|
|
70
|
+
statements: "We'll send you a receipt." / "I want to delete this."
|
|
71
|
+
- **Avoid third person** in product UI: "The user can configure..."
|
|
72
|
+
feels like a manual.
|
|
73
|
+
|
|
74
|
+
## Tone calibration
|
|
75
|
+
|
|
76
|
+
| Project type | Tone |
|
|
77
|
+
|---|---|
|
|
78
|
+
| Productivity / serious | Direct, terse, no exclamation marks |
|
|
79
|
+
| Creative / playful | Conversational, occasional warmth, light wit |
|
|
80
|
+
| Healthcare / financial | Calm, precise, never urgent unless truly is |
|
|
81
|
+
| Developer tools | Technical, dense, can use jargon if appropriate |
|
|
82
|
+
|
|
83
|
+
Pick one. Mismatched tone within a single product reads as
|
|
84
|
+
inconsistent.
|
|
85
|
+
|
|
86
|
+
## Anti-patterns
|
|
87
|
+
|
|
88
|
+
- **Exclamation overload.** "Welcome! Sign in! Get started!" reads as
|
|
89
|
+
fake enthusiasm. Use exclamations sparingly: success messages,
|
|
90
|
+
achievements, intentional surprise.
|
|
91
|
+
- **"Awesome" / "Sweet" / "Boom".** Friendly tone gone too casual.
|
|
92
|
+
Tells the reader the team is trying too hard.
|
|
93
|
+
- **All caps for emphasis.** Reads as shouting. Use weight or color.
|
|
94
|
+
- **Jargon without explanation.** "OAuth flow failed" means nothing to
|
|
95
|
+
most users. "We couldn't connect to Stripe; please try logging in
|
|
96
|
+
again."
|
|
97
|
+
- **Long form labels.** "What is your favorite color?" inside a label
|
|
98
|
+
is a question, not a label. Use "Favorite color" + helper text below.
|
|
99
|
+
|
|
100
|
+
## Microcopy templates
|
|
101
|
+
|
|
102
|
+
### Confirmation
|
|
103
|
+
|
|
104
|
+
> Delete invoice? This cannot be undone.
|
|
105
|
+
> [Cancel] [Delete]
|
|
106
|
+
|
|
107
|
+
### Destructive action
|
|
108
|
+
|
|
109
|
+
> You're about to delete the production database.
|
|
110
|
+
> Type `delete-production` to confirm.
|
|
111
|
+
|
|
112
|
+
### Success
|
|
113
|
+
|
|
114
|
+
> Saved. (toast, dismisses after 4s)
|
|
115
|
+
|
|
116
|
+
### Loading (long task)
|
|
117
|
+
|
|
118
|
+
> Generating your report. We'll email you when it's ready.
|
|
119
|
+
|
|
120
|
+
### Onboarding
|
|
121
|
+
|
|
122
|
+
> Welcome to MRR Tracker. Let's connect your first Stripe account.
|
|
123
|
+
> [Connect Stripe]
|
|
124
|
+
|
|
125
|
+
## Have-Nots
|
|
126
|
+
|
|
127
|
+
You fail UX writing if:
|
|
128
|
+
|
|
129
|
+
- Buttons say "Click here," "Submit," "OK," "Cancel" generically
|
|
130
|
+
- Error messages don't tell the user what to do
|
|
131
|
+
- Empty states don't suggest a next action
|
|
132
|
+
- Dates have no timezone
|
|
133
|
+
- Money values lack currency code on first reference
|
|
134
|
+
- Stack traces or raw error codes shown in production
|
|
135
|
+
- Tone shifts within the same product (jokey signup, terse settings)
|