freecodego 0.1.7-alpha.2.2 → 0.1.7-rc.2.3
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/README.i18n.yaml +45 -5
- package/README.md +11 -11
- package/README.zh.md +11 -11
- package/cordis.patch.yml +230 -126
- package/dist/assets/design/craft/FUTURE_SECTIONS.md +9 -0
- package/dist/assets/design/craft/LICENSE +201 -0
- package/dist/assets/design/craft/PROVENANCE.md +77 -0
- package/dist/assets/design/craft/README.md +106 -0
- package/dist/assets/design/craft/accessibility-baseline.md +201 -0
- package/dist/assets/design/craft/animation-discipline.md +154 -0
- package/dist/assets/design/craft/anti-ai-slop.md +84 -0
- package/dist/assets/design/craft/color.md +88 -0
- package/dist/assets/design/craft/form-validation.md +221 -0
- package/dist/assets/design/craft/laws-of-ux.md +296 -0
- package/dist/assets/design/craft/rtl-and-bidi.md +186 -0
- package/dist/assets/design/craft/state-coverage.md +134 -0
- package/dist/assets/design/craft/typography-hierarchy-editorial.md +182 -0
- package/dist/assets/design/craft/typography-hierarchy.md +165 -0
- package/dist/assets/design/craft/typography.md +122 -0
- package/dist/assets/design/react-bits/SKILL.md +130 -0
- package/dist/assets/design/skills/embedded-captions/CATALOG.md +91 -0
- package/dist/assets/design/skills/embedded-captions/SKILL.md +260 -0
- package/dist/assets/design/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/dist/assets/design/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/dist/assets/design/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/dist/assets/design/skills/embedded-captions/dna/README.md +148 -0
- package/dist/assets/design/skills/embedded-captions/dna/chrome.json +68 -0
- package/dist/assets/design/skills/embedded-captions/dna/cream.json +69 -0
- package/dist/assets/design/skills/embedded-captions/dna/documentary.json +62 -0
- package/dist/assets/design/skills/embedded-captions/dna/editorial.json +70 -0
- package/dist/assets/design/skills/embedded-captions/dna/glitch.json +82 -0
- package/dist/assets/design/skills/embedded-captions/dna/ink.json +65 -0
- package/dist/assets/design/skills/embedded-captions/dna/keynote.json +62 -0
- package/dist/assets/design/skills/embedded-captions/dna/loud.json +75 -0
- package/dist/assets/design/skills/embedded-captions/dna/neon.json +58 -0
- package/dist/assets/design/skills/embedded-captions/dna/velocity.json +89 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/dist/assets/design/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/dist/assets/design/skills/embedded-captions/modes/standard/_anatomy.md +232 -0
- package/dist/assets/design/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/dist/assets/design/skills/embedded-captions/references/aesthetic-principles.md +167 -0
- package/dist/assets/design/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/dist/assets/design/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/dist/assets/design/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/dist/assets/design/skills/embedded-captions/references/composition-craft.md +522 -0
- package/dist/assets/design/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/dist/assets/design/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/dist/assets/design/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/dist/assets/design/skills/embedded-captions/references/failure-modes.md +145 -0
- package/dist/assets/design/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/dist/assets/design/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/dist/assets/design/skills/embedded-captions/references/rail.md +68 -0
- package/dist/assets/design/skills/embedded-captions/references/reference-bar.md +47 -0
- package/dist/assets/design/skills/embedded-captions/references/scene-types.md +94 -0
- package/dist/assets/design/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/dist/assets/design/skills/embedded-captions/references/typography-presets.md +63 -0
- package/dist/assets/design/skills/embedded-captions/scripts/fixtures/heroless/theme.json +11 -0
- package/dist/assets/design/skills/embedded-captions/scripts/fixtures/heroless/transcript.json +10 -0
- package/dist/assets/design/skills/embedded-captions/themes/README.md +243 -0
- package/dist/assets/design/skills/embedded-captions/themes/anchor.json +27 -0
- package/dist/assets/design/skills/embedded-captions/themes/arcade.json +51 -0
- package/dist/assets/design/skills/embedded-captions/themes/aurora.json +41 -0
- package/dist/assets/design/skills/embedded-captions/themes/biolume.json +35 -0
- package/dist/assets/design/skills/embedded-captions/themes/brush.json +74 -0
- package/dist/assets/design/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/dist/assets/design/skills/embedded-captions/themes/dossier.json +56 -0
- package/dist/assets/design/skills/embedded-captions/themes/graffiti.json +62 -0
- package/dist/assets/design/skills/embedded-captions/themes/hologram.json +41 -0
- package/dist/assets/design/skills/embedded-captions/themes/inkwater.json +43 -0
- package/dist/assets/design/skills/embedded-captions/themes/laser.json +46 -0
- package/dist/assets/design/skills/embedded-captions/themes/lastpage.json +33 -0
- package/dist/assets/design/skills/embedded-captions/themes/neonsign.json +53 -0
- package/dist/assets/design/skills/embedded-captions/themes/ordnance.json +54 -0
- package/dist/assets/design/skills/embedded-captions/themes/papercut.json +37 -0
- package/dist/assets/design/skills/embedded-captions/themes/popup.json +46 -0
- package/dist/assets/design/skills/embedded-captions/themes/ransom.json +62 -0
- package/dist/assets/design/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/dist/assets/design/skills/embedded-captions/themes/spectrum.json +46 -0
- package/dist/assets/design/skills/embedded-captions/themes/stardust.json +29 -0
- package/dist/assets/design/skills/embedded-captions/themes/stomp.json +43 -0
- package/dist/assets/design/skills/embedded-captions/themes/terminal.json +49 -0
- package/dist/assets/design/skills/embedded-captions/themes/thunder.json +44 -0
- package/dist/assets/design/skills/embedded-captions/themes/transit.json +44 -0
- package/dist/assets/design/skills/embedded-captions/themes/vhs.json +47 -0
- package/dist/assets/design/skills/faceless-explainer/SKILL.md +235 -0
- package/dist/assets/design/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/dist/assets/design/skills/faceless-explainer/references/motion-language.md +156 -0
- package/dist/assets/design/skills/faceless-explainer/references/story-design.md +255 -0
- package/dist/assets/design/skills/faceless-explainer/references/visual-design.md +146 -0
- package/dist/assets/design/skills/faceless-explainer/sub-agents/frame-worker.md +12 -0
- package/dist/assets/design/skills/general-video/SKILL.md +164 -0
- package/dist/assets/design/skills/general-video/sub-agents/frame-worker.md +34 -0
- package/dist/assets/design/skills/hyperframes/SKILL.md +134 -0
- package/dist/assets/design/skills/hyperframes/references/brief-contract.md +108 -0
- package/dist/assets/design/skills/hyperframes/references/brief-format.md +72 -0
- package/dist/assets/design/skills/hyperframes/references/capability-menu.md +47 -0
- package/dist/assets/design/skills/hyperframes/references/frame-worker-core.md +80 -0
- package/dist/assets/design/skills/hyperframes/references/intent-interview.md +71 -0
- package/dist/assets/design/skills/hyperframes/references/pitch-round.md +40 -0
- package/dist/assets/design/skills/hyperframes/references/production-loop.md +26 -0
- package/dist/assets/design/skills/hyperframes/references/review-loop.md +37 -0
- package/dist/assets/design/skills/hyperframes/references/route-briefs.md +11 -0
- package/dist/assets/design/skills/hyperframes/references/routes/embedded-captions.md +11 -0
- package/dist/assets/design/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
- package/dist/assets/design/skills/hyperframes/references/routes/general-video.md +12 -0
- package/dist/assets/design/skills/hyperframes/references/routes/motion-graphics.md +11 -0
- package/dist/assets/design/skills/hyperframes/references/routes/music-to-video.md +12 -0
- package/dist/assets/design/skills/hyperframes/references/routes/pr-to-video.md +28 -0
- package/dist/assets/design/skills/hyperframes/references/routes/product-launch-video.md +13 -0
- package/dist/assets/design/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
- package/dist/assets/design/skills/hyperframes/references/routes/slideshow.md +11 -0
- package/dist/assets/design/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
- package/dist/assets/design/skills/hyperframes/references/script-format.md +52 -0
- package/dist/assets/design/skills/hyperframes/references/skill-lifecycle.md +30 -0
- package/dist/assets/design/skills/hyperframes/references/storyboard-format.md +99 -0
- package/dist/assets/design/skills/hyperframes/references/subagent-dispatch.md +35 -0
- package/dist/assets/design/skills/hyperframes/references/workflow-catalog.md +10 -0
- package/dist/assets/design/skills/hyperframes-animation/SKILL.md +86 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/animejs.md +130 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +199 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +129 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/lottie.md +130 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/three.md +145 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/typegpu.md +182 -0
- package/dist/assets/design/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/agent-progress-theater.md +76 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/camera-journey.md +61 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/constellation-hub.md +63 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/cta-morph-press.md +63 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +89 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/dataviz-countup.md +59 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/device-surface-showcase.md +68 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/fixed-anchor-cycle.md +46 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/grid-card-assemble.md +81 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +133 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +121 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/overwhelm-surround.md +58 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/panel-edit-live-sync.md +73 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/prompt-type-submit-generate.md +85 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/titlecard-reveal.md +80 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/transcript-scroll-artifact-reveal.md +45 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints/zoom-out-workspace-reveal.md +68 -0
- package/dist/assets/design/skills/hyperframes-animation/blueprints-index.md +202 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/dist/assets/design/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/dist/assets/design/skills/hyperframes-animation/references/motion-blur.md +133 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/3d-camera-flight.md +180 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/3d-page-scroll.md +135 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/3d-text-depth-layers.md +128 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/ai-tracking-box.md +139 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/ambient-glow-bloom.md +133 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/anchored-layout-expand.md +148 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/asr-keyword-glow.md +128 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/avatar-cloud-network.md +145 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/camera-cursor-tracking.md +133 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/card-morph-anchor.md +134 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/center-outward-expansion.md +88 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/chart-scrub-readout.md +151 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/chromatic-glitch.md +150 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/context-sensitive-cursor.md +140 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/control-target-sync.md +131 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/coordinate-target-zoom.md +138 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/counting-dynamic-scale.md +115 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/css-marker-patterns.md +208 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/cursor-click-ripple.md +104 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/cursor-drag.md +141 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/depth-of-field-blur.md +112 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/depth-scatter-assemble.md +139 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/discrete-text-sequence.md +146 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +149 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/gradient-text-sweep.md +136 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/gsap-effects.md +196 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/hacker-flip-3d.md +123 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/kinetic-beat-slam.md +137 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/motion-blur-streak.md +130 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/multi-cursor-choreography.md +133 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/multi-phase-camera.md +129 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/nudge-curve.md +47 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/orbit-3d-entry.md +148 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/particle-burst.md +149 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/physics-press-reaction.md +101 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/press-release-spring.md +108 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/reactive-displacement.md +92 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/scale-swap-transition.md +88 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/sine-wave-loop.md +85 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/split-tilt-cards.md +123 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/spring-pop-entrance.md +107 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/stat-bars-and-fills.md +145 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/svg-icon-enrichment.md +141 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/svg-path-draw.md +122 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/theme-crossfade-morph.md +126 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/vertical-spring-ticker.md +104 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/viewport-change.md +148 -0
- package/dist/assets/design/skills/hyperframes-animation/rules/waterfall-entry.md +81 -0
- package/dist/assets/design/skills/hyperframes-animation/rules-index.md +113 -0
- package/dist/assets/design/skills/hyperframes-animation/techniques.md +507 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +168 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/dist/assets/design/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/dist/assets/design/skills/hyperframes-audio/SKILL.md +476 -0
- package/dist/assets/design/skills/hyperframes-audio/references/attributes.md +138 -0
- package/dist/assets/design/skills/hyperframes-audio/references/diagnosis.md +274 -0
- package/dist/assets/design/skills/hyperframes-audio/references/fx-registry.md +84 -0
- package/dist/assets/design/skills/hyperframes-audio/references/presets.md +216 -0
- package/dist/assets/design/skills/hyperframes-core/SKILL.md +97 -0
- package/dist/assets/design/skills/hyperframes-core/references/composition-patterns.md +224 -0
- package/dist/assets/design/skills/hyperframes-core/references/creator-editing-recipes.md +491 -0
- package/dist/assets/design/skills/hyperframes-core/references/data-attributes.md +78 -0
- package/dist/assets/design/skills/hyperframes-core/references/determinism-rules.md +53 -0
- package/dist/assets/design/skills/hyperframes-core/references/full-screen-motion.md +67 -0
- package/dist/assets/design/skills/hyperframes-core/references/minimal-composition.md +69 -0
- package/dist/assets/design/skills/hyperframes-core/references/sub-compositions.md +176 -0
- package/dist/assets/design/skills/hyperframes-core/references/tailwind.md +104 -0
- package/dist/assets/design/skills/hyperframes-core/references/tracks-and-clips.md +87 -0
- package/dist/assets/design/skills/hyperframes-core/references/variables-and-media.md +107 -0
- package/dist/assets/design/skills/hyperframes-creative/SKILL.md +71 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/FRAME.md +277 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/caption-skin.html +224 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-eb-garamond.txt +93 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-inter.txt +93 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/fonts/OFL-jetbrains-mono.txt +93 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/code-editorial/frame-showcase.html +1438 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/dist/assets/design/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/dist/assets/design/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/dist/assets/design/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/dist/assets/design/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/dist/assets/design/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/dist/assets/design/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/dist/assets/design/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/dist/assets/design/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/dist/assets/design/skills/hyperframes-creative/references/house-style.md +73 -0
- package/dist/assets/design/skills/hyperframes-creative/references/motion-principles.md +151 -0
- package/dist/assets/design/skills/hyperframes-creative/references/narration.md +92 -0
- package/dist/assets/design/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/dist/assets/design/skills/hyperframes-creative/references/story-spine.md +45 -0
- package/dist/assets/design/skills/hyperframes-creative/references/storyboard-recipe.md +57 -0
- package/dist/assets/design/skills/hyperframes-creative/references/typography.md +218 -0
- package/dist/assets/design/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/dist/assets/design/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/dist/assets/design/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/dist/assets/design/skills/hyperframes-keyframes/SKILL.md +262 -0
- package/dist/assets/design/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/dist/assets/design/skills/hyperframes-keyframes/references/keyframe-patterns.md +108 -0
- package/dist/assets/design/skills/hyperframes-studio/SKILL.md +75 -0
- package/dist/assets/design/skills/motion-graphics/SKILL.md +175 -0
- package/dist/assets/design/skills/motion-graphics/agents/builder.md +41 -0
- package/dist/assets/design/skills/motion-graphics/agents/director.md +54 -0
- package/dist/assets/design/skills/motion-graphics/agents/finalize.md +17 -0
- package/dist/assets/design/skills/motion-graphics/catalog-map.md +52 -0
- package/dist/assets/design/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/dist/assets/design/skills/motion-graphics/categories/charts/module.md +22 -0
- package/dist/assets/design/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/dist/assets/design/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/dist/assets/design/skills/motion-graphics/categories/lower-thirds/module.md +20 -0
- package/dist/assets/design/skills/motion-graphics/categories/maps/module.md +61 -0
- package/dist/assets/design/skills/motion-graphics/categories/news/module.md +56 -0
- package/dist/assets/design/skills/motion-graphics/categories/stat/module.md +21 -0
- package/dist/assets/design/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/dist/assets/design/skills/motion-graphics/categories/webpage/module.md +30 -0
- package/dist/assets/design/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/dist/assets/design/skills/motion-graphics/phases/source/guide.md +21 -0
- package/dist/assets/design/skills/motion-graphics/references/builder-contract.md +38 -0
- package/dist/assets/design/skills/motion-graphics/references/motion-vocabulary.md +47 -0
- package/dist/assets/design/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/dist/assets/design/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/dist/assets/design/skills/music-to-video/SKILL.md +207 -0
- package/dist/assets/design/skills/music-to-video/references/frame-skeleton.md +100 -0
- package/dist/assets/design/skills/music-to-video/references/montage.md +55 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitive-catalog.md +75 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/3d-card-flip/scene.html +119 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/bg-flow-field/scene.html +294 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +54 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/binary-decrypt/scene.html +85 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/blur-resolve/scene.html +60 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/braam-punch/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/braam-punch/scene.html +100 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/chromatic-split/scene.html +111 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/chrome-sweep/scene.html +68 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/counting-punch/index.html +54 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/counting-punch/scene.html +119 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/crash-zoom-in/scene.html +120 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +55 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/datamosh-smear/scene.html +131 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/directional-fill/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/directional-fill/scene.html +103 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/dolly-zoom/scene.html +102 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/electric-arc/index.html +54 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/electric-arc/scene.html +105 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/flash-cut/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/flash-cut/scene.html +97 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +54 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/gooey-metaball/scene.html +206 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/hard-cut/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/hard-cut/scene.html +82 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/hypercut-whip/scene.html +44 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/iris-open/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/iris-open/scene.html +69 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/kinetic-letter-in/scene.html +64 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/liquid-morph/scene.html +96 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/mask-reveal/scene.html +74 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/mosaic-pack/scene.html +89 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/neon-flicker/scene.html +73 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/outline-to-fill/scene.html +82 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/palette-flip/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/palette-flip/scene.html +97 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/particle-burst/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/particle-burst/scene.html +106 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/pixel-dissolve/scene.html +86 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/radial-burst-lines/scene.html +130 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/screen-shake/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/screen-shake/scene.html +78 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/slot-machine-reveal/scene.html +100 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/spotlight-sweep/scene.html +102 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/staggered-exit/scene.html +82 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/text-spectral-rays/USAGE.md +42 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/text-spectral-rays/scene.html +280 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +54 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/text-wave-distort/scene.html +106 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/tile-mosaic/scene.html +109 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/typewriter-reveal/scene.html +91 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +53 -0
- package/dist/assets/design/skills/music-to-video/references/motion-primitives/word-grid-burst/scene.html +96 -0
- package/dist/assets/design/skills/music-to-video/references/planning.md +104 -0
- package/dist/assets/design/skills/music-to-video/references/storyboard-format.md +94 -0
- package/dist/assets/design/skills/music-to-video/references/template-catalog.md +106 -0
- package/dist/assets/design/skills/music-to-video/references/templates/card-flyby/index.html +527 -0
- package/dist/assets/design/skills/music-to-video/references/templates/card-flyby/program.json +13 -0
- package/dist/assets/design/skills/music-to-video/references/templates/held-message-living-field/index.html +485 -0
- package/dist/assets/design/skills/music-to-video/references/templates/held-text-strobe-burst/index.html +302 -0
- package/dist/assets/design/skills/music-to-video/references/templates/intro-kinetic-cascade/index.html +610 -0
- package/dist/assets/design/skills/music-to-video/references/templates/intro-kinetic-cascade/program.json +41 -0
- package/dist/assets/design/skills/music-to-video/references/templates/logo-split-lockup-pulse/index.html +596 -0
- package/dist/assets/design/skills/music-to-video/references/templates/poster-tile-mosaic/index.html +589 -0
- package/dist/assets/design/skills/music-to-video/references/templates/poster-tile-mosaic/program.json +25 -0
- package/dist/assets/design/skills/music-to-video/references/templates/roll-flipbook-word-cycle/index.html +267 -0
- package/dist/assets/design/skills/music-to-video/references/templates/split-anchor-word-slot/index.html +594 -0
- package/dist/assets/design/skills/music-to-video/references/templates/split-anchor-word-slot/program.json +39 -0
- package/dist/assets/design/skills/music-to-video/references/templates/typewriter-phrase-keyword-shuffle/index.html +238 -0
- package/dist/assets/design/skills/music-to-video/sub-agents/frame-worker.md +49 -0
- package/dist/assets/design/skills/pr-to-video/SKILL.md +271 -0
- package/dist/assets/design/skills/pr-to-video/references/code-vocabulary.md +112 -0
- package/dist/assets/design/skills/pr-to-video/references/cut-catalog.md +215 -0
- package/dist/assets/design/skills/pr-to-video/references/motion-language.md +156 -0
- package/dist/assets/design/skills/pr-to-video/references/story-design.md +230 -0
- package/dist/assets/design/skills/pr-to-video/references/visual-design.md +164 -0
- package/dist/assets/design/skills/pr-to-video/sub-agents/frame-worker.md +38 -0
- package/dist/assets/design/skills/product-launch-video/SKILL.md +262 -0
- package/dist/assets/design/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/dist/assets/design/skills/product-launch-video/references/motion-language.md +156 -0
- package/dist/assets/design/skills/product-launch-video/references/story-design.md +508 -0
- package/dist/assets/design/skills/product-launch-video/references/visual-design.md +126 -0
- package/dist/assets/design/skills/product-launch-video/sub-agents/frame-worker.md +21 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/SKILL.md +130 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/README.md +41 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +26 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/compositions/title.html +31 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +46 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/package.json +14 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/tsconfig.json +15 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +54 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +29 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-1.html +35 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-2.html +35 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-3.html +36 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +75 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/package.json +14 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/tsconfig.json +15 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md +85 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +41 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-1.html +52 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-2.html +99 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-3.html +55 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +70 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/package.json +15 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/tsconfig.json +15 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/README.md +51 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/expected.json +85 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/api-map.md +142 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/escape-hatch.md +115 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/eval.md +140 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/fonts.md +112 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/limitations.md +136 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/lottie.md +119 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/media.md +149 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/parameters.md +172 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/sequencing.md +251 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/timing.md +165 -0
- package/dist/assets/design/skills/remotion-to-hyperframes/references/transitions.md +113 -0
- package/dist/assets/design/skills/slideshow/SKILL.md +530 -0
- package/dist/assets/design/skills/slideshow/references/standalone-harness.md +1017 -0
- package/dist/assets/design/skills/talking-head-recut/NOTICE.md +39 -0
- package/dist/assets/design/skills/talking-head-recut/SKILL.md +1007 -0
- package/dist/assets/design/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/dist/assets/design/skills/talking-head-recut/references/confirm-visual-direction-with-user-do-this-first.md +211 -0
- package/dist/assets/design/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/dist/assets/design/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/dist/assets/design/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/dist/assets/design/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/dist/assets/design/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/dist/assets/design/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/dist/assets/design/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/dist/assets/design/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/dist/assets/design/taste/LICENSE +21 -0
- package/dist/assets/design/taste/PROVENANCE.md +70 -0
- package/dist/assets/design/taste/brandkit/SKILL.md +798 -0
- package/dist/assets/design/taste/brutalist-skill/SKILL.md +92 -0
- package/dist/assets/design/taste/gpt-tasteskill/SKILL.md +74 -0
- package/dist/assets/design/taste/image-to-code-skill/SKILL.md +1228 -0
- package/dist/assets/design/taste/imagegen-frontend-mobile/SKILL.md +1465 -0
- package/dist/assets/design/taste/imagegen-frontend-web/SKILL.md +987 -0
- package/dist/assets/design/taste/minimalist-skill/SKILL.md +85 -0
- package/dist/assets/design/taste/output-skill/SKILL.md +49 -0
- package/dist/assets/design/taste/redesign-skill/SKILL.md +178 -0
- package/dist/assets/design/taste/soft-skill/SKILL.md +98 -0
- package/dist/assets/design/taste/stitch-skill/DESIGN.md +121 -0
- package/dist/assets/design/taste/stitch-skill/SKILL.md +184 -0
- package/dist/assets/design/taste/taste-skill/SKILL.md +1043 -0
- package/dist/assets/design/taste/taste-skill/references/4-2-color-calibration.md +24 -0
- package/dist/assets/design/taste/taste-skill/references/4-7-layout-discipline-hard-rules-failing-any-of-.md +27 -0
- package/dist/assets/design/taste/taste-skill/references/4-8-image-visual-asset-strategy.md +35 -0
- package/dist/assets/design/taste/taste-skill/references/4-9-content-density.md +34 -0
- package/dist/assets/design/taste/taste-skill/references/9-f-production-test-tells-banned-outright.md +54 -0
- package/dist/assets/design/taste/taste-skill-v1/SKILL.md +226 -0
- package/dist/assets/engineering/skills-starter/engineering-ui-design/SKILL.md +84 -0
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/SKILL.md +68 -459
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/dispatch-and-review-rules.md +74 -0
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/example-workflow.md +70 -0
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/model-selection.md +40 -0
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/process-diagrams.md +92 -0
- package/dist/assets/engineering/skills-superpowers/subagent-driven-development/setup-and-ledger.md +75 -0
- package/dist/assets/uiux/LICENSE +21 -0
- package/dist/assets/uiux/PROVENANCE.md +110 -0
- package/dist/assets/uiux/data/app-interface.csv +33 -0
- package/dist/assets/uiux/data/charts.csv +26 -0
- package/dist/assets/uiux/data/colors.csv +193 -0
- package/dist/assets/uiux/data/icons.csv +106 -0
- package/dist/assets/uiux/data/landing.csv +35 -0
- package/dist/assets/uiux/data/motion.csv +18 -0
- package/dist/assets/uiux/data/products.csv +193 -0
- package/dist/assets/uiux/data/react-performance.csv +45 -0
- package/dist/assets/uiux/data/stacks/angular.csv +51 -0
- package/dist/assets/uiux/data/stacks/astro.csv +54 -0
- package/dist/assets/uiux/data/stacks/avalonia.csv +57 -0
- package/dist/assets/uiux/data/stacks/flutter.csv +53 -0
- package/dist/assets/uiux/data/stacks/html-tailwind.csv +60 -0
- package/dist/assets/uiux/data/stacks/javafx.csv +76 -0
- package/dist/assets/uiux/data/stacks/jetpack-compose.csv +53 -0
- package/dist/assets/uiux/data/stacks/laravel.csv +51 -0
- package/dist/assets/uiux/data/stacks/nextjs.csv +62 -0
- package/dist/assets/uiux/data/stacks/nuxt-ui.csv +77 -0
- package/dist/assets/uiux/data/stacks/nuxtjs.csv +68 -0
- package/dist/assets/uiux/data/stacks/react-native.csv +52 -0
- package/dist/assets/uiux/data/stacks/react.csv +67 -0
- package/dist/assets/uiux/data/stacks/shadcn.csv +69 -0
- package/dist/assets/uiux/data/stacks/svelte.csv +56 -0
- package/dist/assets/uiux/data/stacks/swiftui.csv +51 -0
- package/dist/assets/uiux/data/stacks/threejs.csv +54 -0
- package/dist/assets/uiux/data/stacks/uno.csv +60 -0
- package/dist/assets/uiux/data/stacks/uwp.csv +56 -0
- package/dist/assets/uiux/data/stacks/vue.csv +50 -0
- package/dist/assets/uiux/data/stacks/winui.csv +60 -0
- package/dist/assets/uiux/data/stacks/wpf.csv +57 -0
- package/dist/assets/uiux/data/styles.csv +89 -0
- package/dist/assets/uiux/data/typography.csv +75 -0
- package/dist/assets/uiux/data/ui-reasoning.csv +193 -0
- package/dist/assets/uiux/data/ux-guidelines.csv +120 -0
- package/dist/auto-review.js +38 -4
- package/dist/bootstrap.js +64299 -55761
- package/dist/client.cjs +5227 -3462
- package/dist/subagent-claude-code.js +493 -0
- package/dist/subagent-codex.js +1068 -0
- package/dist/tool-session-query.js +993 -0
- package/package.json +81 -74
- package/dist/agent-team.js +0 -16235
- package/dist/schedule.js +0 -15898
- package/dist/tool-agent-team.js +0 -16766
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Animation discipline craft rules
|
|
2
|
+
|
|
3
|
+
Universal rules for when motion earns its place in a UI and what numbers
|
|
4
|
+
constrain it. The active `DESIGN.md` decides brand-specific motion
|
|
5
|
+
personality; this file decides whether motion should run at all and at
|
|
6
|
+
what duration, easing, and accessibility floor.
|
|
7
|
+
|
|
8
|
+
> Grounded in primary sources: Tversky/Morrison/Bétrancourt 2002
|
|
9
|
+
> (IJHCS), Heer & Robertson TVCG 2007, Harrison/Yeo/Hudson CHI 2010,
|
|
10
|
+
> Doherty & Thadani IBM Systems Journal 1982, Chang & Ungar UIST 1993,
|
|
11
|
+
> Material 3 motion tokens, IBM `@carbon/motion`, Apple SwiftUI
|
|
12
|
+
> Animation API, W3C View Transitions, WCAG 2.2.2 + 2.3.3, WebKit's
|
|
13
|
+
> 2017 `prefers-reduced-motion` rationale.
|
|
14
|
+
|
|
15
|
+
## When motion earns its place
|
|
16
|
+
|
|
17
|
+
Tversky/Morrison/Bétrancourt's 2002 meta-analysis (IJHCS 57, pp. 247-262)
|
|
18
|
+
found that every study claiming animation aids comprehension had a
|
|
19
|
+
broken control — the static version had less information, different
|
|
20
|
+
procedures, or hidden interactivity. When equalised, animation does
|
|
21
|
+
**not** beat static for teaching complex systems. The single use case
|
|
22
|
+
the paper endorses is real-time spatial or temporal reorientation:
|
|
23
|
+
page transitions, container morphs, viewpoint changes, progress
|
|
24
|
+
indicators (p. 257).
|
|
25
|
+
|
|
26
|
+
A follow-on hazard: Palmiter & Elkerton found animation-trained users
|
|
27
|
+
*declined* one week after training, while text-trained users *improved*
|
|
28
|
+
(Tversky 2002, p. 255). Animation's apparent short-term parity hides
|
|
29
|
+
worse retention.
|
|
30
|
+
|
|
31
|
+
So animate when the user is moving through space, time, or state —
|
|
32
|
+
navigation, container expansion, progress feedback, gesture
|
|
33
|
+
follow-through. Don't animate to teach, decorate, signal "premium",
|
|
34
|
+
or fill silence.
|
|
35
|
+
|
|
36
|
+
## Duration thresholds
|
|
37
|
+
|
|
38
|
+
The cross-design-system convergence is **150 ms** — Material 3 `short3`,
|
|
39
|
+
IBM Carbon `moderate-01`, Shopify Polaris `150`, Tailwind default,
|
|
40
|
+
SLDS `duration-fast` all land here. Use it as the default duration for
|
|
41
|
+
state-confirmation feedback.
|
|
42
|
+
|
|
43
|
+
| Duration | Use |
|
|
44
|
+
|---|---|
|
|
45
|
+
| 50–100 ms | Instant feedback (button press, toggle commit, hover) |
|
|
46
|
+
| 150 ms | Default for state-confirmation |
|
|
47
|
+
| 200–300 ms | Entering UI (modals, sheets, dropdowns) |
|
|
48
|
+
| 300–500 ms | Cross-screen transitions, container morphs |
|
|
49
|
+
| > 500 ms | Reserved for cross-screen, staged, or platform-native transitions (e.g. M3 `long2`-`extraLong4`, Heer & Robertson 2007's per-stage recommendation). |
|
|
50
|
+
|
|
51
|
+
Non-navigation microinteractions — hover, press, toggle, validation,
|
|
52
|
+
chip selection, row expansion — should stay under 500 ms. Past that the
|
|
53
|
+
user notices the motion as motion and waits on the UI rather than
|
|
54
|
+
working through it. Two qualifications: frequent animations (a hover
|
|
55
|
+
effect seen 50 times per session) need to stay ≤200 ms; mobile
|
|
56
|
+
animations should run 20–30% shorter than desktop equivalents because
|
|
57
|
+
travel distances are shorter.
|
|
58
|
+
|
|
59
|
+
## Curve vs spring
|
|
60
|
+
|
|
61
|
+
Use a curve for opacity, color, and any property that changes value
|
|
62
|
+
between two known points. Use a spring for position, scale, rotation,
|
|
63
|
+
and gesture-driven motion — anything that should feel physical.
|
|
64
|
+
|
|
65
|
+
Material 3 standard easing is `cubic-bezier(0.2, 0, 0, 1)` — front-loaded;
|
|
66
|
+
the trailing zero makes the curve hit its target instantly and settle.
|
|
67
|
+
M2 standard was the symmetric `cubic-bezier(0.4, 0, 0.2, 1)`, preserved
|
|
68
|
+
in M3 under the name `legacy`. Anyone shipping the M2 curve and calling
|
|
69
|
+
it "M3" is on legacy tokens. M3 `emphasized` is a **two-segment Bézier
|
|
70
|
+
path**, not a single cubic-bezier; single-cubic approximations silently
|
|
71
|
+
lose the front-loaded character. CSS `linear()` (Chrome 113+) is the
|
|
72
|
+
only way to replicate it on a single property.
|
|
73
|
+
|
|
74
|
+
Apple's published SwiftUI default spring is
|
|
75
|
+
`(response: 0.5, dampingFraction: 0.825, blendDuration: 0)`. The widely
|
|
76
|
+
cited `.snappy = 0.25 s, .smooth = 0.35 s` numbers are wrong — Apple's
|
|
77
|
+
docs assign all three presets a 0.5 s base, differing only in bounce
|
|
78
|
+
(0 / 0.15 / 0.3).
|
|
79
|
+
|
|
80
|
+
Spring framework defaults disagree. motion.dev's physics-mode default
|
|
81
|
+
is ζ ≈ 0.5 (bouncy). React Spring's `default` is ζ = 0.997 (critically
|
|
82
|
+
damped). Same word "default", opposite feel — React Spring's `wobbly`
|
|
83
|
+
is the actual feel-equivalent of motion.dev's `default`. Pick
|
|
84
|
+
consciously.
|
|
85
|
+
|
|
86
|
+
## Reduced motion
|
|
87
|
+
|
|
88
|
+
Every animation that translates, scales, rotates, or parallaxes must
|
|
89
|
+
respect `@media (prefers-reduced-motion: reduce)`. WebKit shipped this
|
|
90
|
+
in 2017 to address vestibular triggers; the W3C MQ5 spec lets the UA
|
|
91
|
+
or author **strip motion entirely or substitute static imagery** —
|
|
92
|
+
the spec does not mandate which.
|
|
93
|
+
|
|
94
|
+
Working rule: strip motion-on-an-axis (translate, scale, rotate,
|
|
95
|
+
parallax). Keep opacity/color crossfades as substitutes when a state
|
|
96
|
+
change still needs to be conveyed. Be explicit — the View Transitions
|
|
97
|
+
API does **not** apply `prefers-reduced-motion` automatically; the
|
|
98
|
+
author must add a query override on the pseudo-elements or skip
|
|
99
|
+
`startViewTransition` entirely.
|
|
100
|
+
|
|
101
|
+
WCAG calibration: 2.2.2 (Pause/Stop/Hide) is Level A — the legal floor
|
|
102
|
+
under ADA Title II 2024 / EN 301 549 / EAA — but it names cognitive,
|
|
103
|
+
attentional, and reading populations, not vestibular. Vestibular
|
|
104
|
+
language lives in 2.3.3, which is **AAA**. Don't conflate the two.
|
|
105
|
+
Building for vestibular users is a craft commitment beyond the legal
|
|
106
|
+
floor, not a WCAG mandate.
|
|
107
|
+
|
|
108
|
+
**Flashing limits.** WCAG 2.3.1 (Level A) permits flashing only when
|
|
109
|
+
there are no more than three flashes within any one-second period, or
|
|
110
|
+
the flashing area stays below the general and red flash thresholds.
|
|
111
|
+
WCAG 2.3.2 (AAA) forbids flashing more than three times within any
|
|
112
|
+
one-second period, regardless of area or brightness. The protected
|
|
113
|
+
concern is photosensitive epilepsy; the legal floor isn't negotiable. For gamified UI, onboarding celebrations, sparkles,
|
|
114
|
+
confetti, level-up bursts, and shimmer: avoid rapid flashing unless
|
|
115
|
+
tested against the thresholds, and prefer one-shot animations over
|
|
116
|
+
loops.
|
|
117
|
+
|
|
118
|
+
## Repeated and ambient motion
|
|
119
|
+
|
|
120
|
+
The rules above target one-shot transitions. Looping motion (skeleton
|
|
121
|
+
shimmer, idle backgrounds, autoplay, reward bursts) has different
|
|
122
|
+
constraints.
|
|
123
|
+
|
|
124
|
+
- Cap iteration count: carousels at 3-5 cycles then pause; skeleton shimmer until content lands, never indefinitely.
|
|
125
|
+
- WCAG 2.2.2 (Level A) requires a pause control for any motion running longer than 5 seconds — moving, blinking, or scrolling content, not only video.
|
|
126
|
+
- Cancel ambient motion on route change.
|
|
127
|
+
- Reward animations are one-shot. Confetti, sparkles, level-up bursts fire once and dismiss; no looping timer.
|
|
128
|
+
- Spinners must not run indefinitely. Escalate to progress/cancel states and stop animation at 60 s, matching `state-coverage.md`.
|
|
129
|
+
|
|
130
|
+
## Cross-platform handoff
|
|
131
|
+
|
|
132
|
+
Native conventions diverge.
|
|
133
|
+
|
|
134
|
+
- **iOS** uses spring physics with perceptual `(response, dampingFraction)` parameters. Apple HIG documents principles, not numerical curves; the SwiftUI Animation API JSON is the source for actual numbers. UIView curve cubic-beziers commonly cited online are reverse-engineered, not Apple-published.
|
|
135
|
+
- **Android** uses cubic-bezier curves through M3 motion tokens (50–1000 ms range, 16 named durations). Predictive back is a *gesture-progress primitive*, not a transition primitive — `BackEvent.progress` is sampled per-frame from the touch stream and the destination is rendered behind the current surface while still on it. Cancellation is a first-class lifecycle state.
|
|
136
|
+
- **Web** has the View Transitions API (default 0.25 s, no easing specified by the spec — falls through to CSS `ease`). Same-document support 90.94%; cross-document 87.82%. Cross-document is same-origin and user-initiated only.
|
|
137
|
+
|
|
138
|
+
A "one curve fits all platforms" approach loses on each. If the brief
|
|
139
|
+
specifies platform fidelity, follow the platform; if it specifies brand
|
|
140
|
+
consistency, pick one motion vocabulary and apply it everywhere.
|
|
141
|
+
|
|
142
|
+
## Common mistakes (lint these)
|
|
143
|
+
|
|
144
|
+
- "Skeleton screens feel 11% faster" — Harrison/Yeo/Hudson CHI 2010 measured *backwards-decelerating ribbed determinate progress bars* (n=16). The induced-motion mechanism doesn't transfer to skeletons.
|
|
145
|
+
- "Heer & Robertson recommend 300–1000 ms eased transitions" — they tested 1.25 s and 2 s only. Their recommendation is "~1 second per stage".
|
|
146
|
+
- "Doherty Threshold = 400 ms" — the 1982 paper does not contain "400". The lowest threshold actually measured is 300 ms.
|
|
147
|
+
- M2 standard easing `cubic-bezier(0.4, 0, 0.2, 1)` labelled as "Material 3". M3's standard is `cubic-bezier(0.2, 0, 0, 1)`.
|
|
148
|
+
- Animations that *perform* a state change rather than *confirming* one that has already happened. Optimistic UI first; motion second.
|
|
149
|
+
- More than 500 ms on any non-cross-screen transition.
|
|
150
|
+
- Animation as the only signal of state change. Reduced-motion users miss it; always pair with a static affordance (color, position, label).
|
|
151
|
+
- Ignoring `prefers-reduced-motion` on transform-based animations — the highest-cost vestibular triggers.
|
|
152
|
+
- Curve-based animation on a `transform: scale()` that should feel physical. Use a spring.
|
|
153
|
+
- Hero choreography in productivity tools. Motion budget belongs inside the product on functional micro-feedback, not on landing-page sequences.
|
|
154
|
+
- Decorative motion in the working canvas of a productivity tool.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Anti-AI-slop rules
|
|
2
|
+
|
|
3
|
+
Concrete, checkable rules that distinguish "designed by a human who has
|
|
4
|
+
shipped product" from "default LLM output." Several rules below are
|
|
5
|
+
auto-enforced by the daemon's `lint-artifact` linter — failing an
|
|
6
|
+
enforced rule is not a style preference, it is a regression. The
|
|
7
|
+
rest are guidance for agents and reviewers and are flagged inline as
|
|
8
|
+
"(guidance, not auto-checked)" so the contract with the linter stays
|
|
9
|
+
honest.
|
|
10
|
+
|
|
11
|
+
> Adapted from [refero_skill](https://github.com/referodesign/refero_skill)
|
|
12
|
+
> (MIT), tightened to match OpenDesign's lint surface.
|
|
13
|
+
|
|
14
|
+
## The seven cardinal sins
|
|
15
|
+
|
|
16
|
+
These are the patterns the linter blocks at P0 (must-fix):
|
|
17
|
+
|
|
18
|
+
1. **Default Tailwind indigo as accent** — exactly `#6366f1`, `#4f46e5`,
|
|
19
|
+
`#4338ca`, `#3730a3`, `#8b5cf6`, `#7c3aed`, `#a855f7`. The active
|
|
20
|
+
`DESIGN.md` provides `--accent`; use it. Indigo is the textbook AI
|
|
21
|
+
tell. (The daemon's `lint-artifact` flags any of these as a solid
|
|
22
|
+
accent; keep this list in sync with `AI_DEFAULT_INDIGO` in
|
|
23
|
+
`apps/daemon/src/lint-artifact.ts`.)
|
|
24
|
+
2. **Two-stop "trust" gradient on the hero** — purple→blue, blue→cyan,
|
|
25
|
+
indigo→pink. A flat surface + intentional type beats this every
|
|
26
|
+
time.
|
|
27
|
+
3. **Emoji as feature icons** — ``U+2728 SPARKLES``, ``U+1F680 ROCKET``, ``U+1F3AF DIRECT HIT``, ``U+26A1 HIGH VOLTAGE``, ``U+1F525 FIRE``, ``U+1F4A1 LIGHT BULB``
|
|
28
|
+
inside `<h*>`, `<button>`, `<li>`, or `class*="icon"`. Use
|
|
29
|
+
1.6–1.8px-stroke monoline SVG with `currentColor`.
|
|
30
|
+
4. **Sans-serif on display text when the seed binds a serif** — h1/h2
|
|
31
|
+
must use `var(--font-display)`, not a hardcoded Inter / Roboto /
|
|
32
|
+
`system-ui`.
|
|
33
|
+
5. **Rounded card with a colored left-border accent** — the canonical
|
|
34
|
+
"AI dashboard tile" shape. Drop either the radius or the left
|
|
35
|
+
border.
|
|
36
|
+
6. **Invented metrics** — "10× faster", "99.9% uptime", "3× more
|
|
37
|
+
productive". Either pull from a real source or use a labelled
|
|
38
|
+
placeholder.
|
|
39
|
+
7. **Filler copy** — `lorem ipsum`, `feature one / two / three`,
|
|
40
|
+
`placeholder text`, `sample content`. An empty section is a design
|
|
41
|
+
problem to solve with composition, not by inventing words.
|
|
42
|
+
|
|
43
|
+
## Soft tells (P1 — should fix)
|
|
44
|
+
|
|
45
|
+
- **Standard "Hero → Features → Pricing → FAQ → CTA" sequence with no
|
|
46
|
+
variation** *(guidance, not auto-checked)*. This is the AI-template
|
|
47
|
+
skeleton; introduce at least one unconventional section (testimonial
|
|
48
|
+
wall as full-bleed quote, pricing as comparison-against-status-quo,
|
|
49
|
+
an inline mini-product-demo).
|
|
50
|
+
- **External placeholder image CDNs** (`unsplash.com`, `placehold.co`,
|
|
51
|
+
`placekitten.com`, `picsum.photos`). Fragile and obvious. Use the
|
|
52
|
+
shipped `.ph-img` placeholder class.
|
|
53
|
+
- **More than ~12 raw hex values outside `:root`.** Tokens were not
|
|
54
|
+
honoured.
|
|
55
|
+
- **`var(--accent)` used 6+ times in the rendered body.** Cap at 2
|
|
56
|
+
visible uses per screen.
|
|
57
|
+
|
|
58
|
+
## Polish tells (P2 — nice to fix)
|
|
59
|
+
|
|
60
|
+
- **Sections without `data-od-id`** — comment mode can't target them.
|
|
61
|
+
- **Decorative blob / wave SVG backgrounds** *(guidance, not
|
|
62
|
+
auto-checked)* — meaningless geometry.
|
|
63
|
+
- **Perfect symmetric layout with no visual tension** *(guidance, not
|
|
64
|
+
auto-checked)* — alternating density (one tight section, one
|
|
65
|
+
breathing section) reads as intentional.
|
|
66
|
+
|
|
67
|
+
## How to add soul without breaking the rules
|
|
68
|
+
|
|
69
|
+
Aim for **~80% proven patterns + ~20% distinctive choice**. The 20%
|
|
70
|
+
should live in:
|
|
71
|
+
|
|
72
|
+
- One bold visual move — a typography choice, a single color decision,
|
|
73
|
+
an unexpected proportion.
|
|
74
|
+
- Voice and microcopy — a button that says "Start tracking" beats one
|
|
75
|
+
that says "Get started".
|
|
76
|
+
- One micro-interaction the user will remember — a button press that
|
|
77
|
+
moves 2px, a number that counts up.
|
|
78
|
+
- One detail that could only have been put there by someone who used
|
|
79
|
+
the product (a subtle kbd shortcut hint, a status badge with
|
|
80
|
+
product-specific phrasing).
|
|
81
|
+
|
|
82
|
+
If a reviewer screenshots the artifact and someone outside the project
|
|
83
|
+
can identify which product it's from — you have soul. If not, you
|
|
84
|
+
shipped a template.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Color craft rules
|
|
2
|
+
|
|
3
|
+
Universal color rules applied on top of the active `DESIGN.md`. The
|
|
4
|
+
design system supplies the palette tokens; this file enforces how to
|
|
5
|
+
*use* them.
|
|
6
|
+
|
|
7
|
+
> Adapted from [refero_skill](https://github.com/referodesign/refero_skill)
|
|
8
|
+
> (MIT). All examples reference OpenDesign's standard tokens
|
|
9
|
+
> (`--bg`, `--surface`, `--fg`, `--muted`, `--border`, `--accent`).
|
|
10
|
+
|
|
11
|
+
## Palette structure
|
|
12
|
+
|
|
13
|
+
A coherent palette has four layers. Plan all four before writing any CSS.
|
|
14
|
+
|
|
15
|
+
| Layer | Share of pixels | Tokens |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| **Neutrals** | 70–90% | `--bg`, `--surface`, `--fg`, `--muted`, `--border` |
|
|
18
|
+
| **Accent** (one) | 5–10% | `--accent` only — never invent a second accent |
|
|
19
|
+
| **Semantic** | 0–5% | `--success`, `--warn`, `--danger` |
|
|
20
|
+
| **Effect** | <1% | gradients, glows; rarely justified |
|
|
21
|
+
|
|
22
|
+
## Accent discipline
|
|
23
|
+
|
|
24
|
+
The single biggest readability failure in AI-generated UIs is accent
|
|
25
|
+
overuse. Hard caps:
|
|
26
|
+
|
|
27
|
+
- **At most 2 visible uses of `--accent` per screen.** Typical pair:
|
|
28
|
+
one eyebrow / chip + one primary CTA. Or one accent card + one tab
|
|
29
|
+
pill. Pick a pair, not a flood.
|
|
30
|
+
- Links count as accent; demote to `--fg` underline if you also have a
|
|
31
|
+
CTA on the same screen.
|
|
32
|
+
- Hover/focus rings count as accent. Ration accordingly.
|
|
33
|
+
|
|
34
|
+
## Contrast minimums
|
|
35
|
+
|
|
36
|
+
Run these as gates, not goals:
|
|
37
|
+
|
|
38
|
+
| Pair | Minimum |
|
|
39
|
+
|---|---|
|
|
40
|
+
| Body text (≤16 px) on background | **4.5:1** |
|
|
41
|
+
| Large text (>18 px or 14 px bold) | **3:1** |
|
|
42
|
+
| UI components against adjacent surfaces | **3:1** |
|
|
43
|
+
|
|
44
|
+
When the brand color clashes (low-contrast indigo on light background is
|
|
45
|
+
common), darken the accent to a `600`-level shade for text use; reserve
|
|
46
|
+
the brand-bright variant for fills only.
|
|
47
|
+
|
|
48
|
+
## Dark themes
|
|
49
|
+
|
|
50
|
+
Avoid pure black and pure white — both cause vibration and eye strain.
|
|
51
|
+
|
|
52
|
+
| Token | Dark theme | Light theme |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| Background | `#0f0f0f` (not `#000`) | `#fafafa` (not `#fff`) |
|
|
55
|
+
| Foreground | `#f0f0f0` (not `#fff`) | `#111111` (not `#000`) |
|
|
56
|
+
|
|
57
|
+
On dark surfaces, prefer **semi-transparent white borders** over solid
|
|
58
|
+
dark borders — a 1px `rgba(255,255,255,0.08)` reads as structure
|
|
59
|
+
without adding visual noise.
|
|
60
|
+
|
|
61
|
+
## Semantic color naming
|
|
62
|
+
|
|
63
|
+
Always name tokens by **purpose**, never by hue:
|
|
64
|
+
|
|
65
|
+
```css
|
|
66
|
+
/* good */
|
|
67
|
+
--accent: #2f6feb;
|
|
68
|
+
--success: #17a34a;
|
|
69
|
+
|
|
70
|
+
/* bad — locks you out of theming */
|
|
71
|
+
--blue-500: #2f6feb;
|
|
72
|
+
--green-500: #17a34a;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Anti-defaults
|
|
76
|
+
|
|
77
|
+
- **Indigo `#6366f1`** (Tailwind `indigo-500`) is the most reliable
|
|
78
|
+
AI-slop tell. The active `DESIGN.md` provides `--accent`; use it. If
|
|
79
|
+
the brief truly needs indigo, make the user say so explicitly. If
|
|
80
|
+
your `DESIGN.md` encodes indigo as `--accent`, that is intentional —
|
|
81
|
+
the linter only flags hardcoded hex, so `var(--accent)` uses are
|
|
82
|
+
unaffected even when the resolved color happens to be `#6366f1`.
|
|
83
|
+
- **Two-stop "trust" gradient** (purple → blue, blue → cyan, etc.) on a
|
|
84
|
+
hero is the second most reliable tell. A flat surface + one
|
|
85
|
+
type-driven hierarchy beats it every time.
|
|
86
|
+
- **Decorative gradients with no functional purpose**. Gradients should
|
|
87
|
+
separate hierarchies (header → body, primary CTA → secondary), not
|
|
88
|
+
decorate empty space.
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Form validation craft rules
|
|
2
|
+
|
|
3
|
+
Universal rules for form validation lifecycle, error wiring beyond the
|
|
4
|
+
accessibility baseline, and the schema-as-contract layer that makes
|
|
5
|
+
the same validation work on the server and the client. The active
|
|
6
|
+
`DESIGN.md` decides how the field looks; this file decides *when* the
|
|
7
|
+
field tells the user it's wrong, *how* the error reaches assistive
|
|
8
|
+
tech, and *where* the rule lives.
|
|
9
|
+
|
|
10
|
+
> Grounded in primary sources: WHATWG HTML Living Standard
|
|
11
|
+
> (Constraint Validation section under "Form control infrastructure"),
|
|
12
|
+
> CSS Selectors L4 (`:user-invalid`), WCAG 2.2 SC 3.3.x
|
|
13
|
+
> Understanding pages, ARIA APG forms patterns, Standard Schema spec
|
|
14
|
+
> (`@standard-schema/spec`), Baymard 2024 inline-validation research
|
|
15
|
+
> checkout-UX benchmark, WebAIM Million 2026 forms findings.
|
|
16
|
+
|
|
17
|
+
## Prior art and scope
|
|
18
|
+
|
|
19
|
+
Existing OSS forms guidance for AI agents pins to one layer at a time
|
|
20
|
+
— `szilu/ux-designer-skill` is UX-opinion grade with no spec anchors,
|
|
21
|
+
`Community-Access/accessibility-agents/forms-specialist` is
|
|
22
|
+
WCAG-anchored but AT-only and doesn't reach the platform validity
|
|
23
|
+
layer or the schema contract. This file connects the four layers a
|
|
24
|
+
real form spans: **WHATWG Constraint Validation as the platform
|
|
25
|
+
floor, validation timing as a state machine on the input, WCAG 3.3.x
|
|
26
|
+
as the announcement and recovery contract, schema as the cross-stack
|
|
27
|
+
truth.** A11y wiring lives next door in `accessibility-baseline.md`
|
|
28
|
+
(label + describedby + invalid + `role="alert"` for inline errors);
|
|
29
|
+
this file picks up where that ends.
|
|
30
|
+
|
|
31
|
+
## The input state machine
|
|
32
|
+
|
|
33
|
+
Every input passes through these states. The names trace back to RHF /
|
|
34
|
+
Formik vocabulary on web; the *shape* applies regardless of stack.
|
|
35
|
+
Drive error chrome off the state, not off raw `:invalid` or
|
|
36
|
+
focus/blur booleans.
|
|
37
|
+
|
|
38
|
+
| State | Meaning | UI |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `pristine` | User has not interacted | No error chrome, no green check |
|
|
41
|
+
| `dirty` | User has typed but not committed (still focused) | No error chrome yet |
|
|
42
|
+
| `touched` | User has blurred at least once after editing | Field-level constraint runs |
|
|
43
|
+
| `invalid-after-touched` | Constraint failed after blur | Show error, link via `aria-describedby` |
|
|
44
|
+
| `invalid-after-submit` | Submit attempted, field still invalid | Same plus focus management to summary or first invalid field |
|
|
45
|
+
| `recovering` | User editing an already-invalid field | Re-validate on `input`, not on next blur |
|
|
46
|
+
| `submitting` | Action in flight | Disable submit, announce status via a polite live region |
|
|
47
|
+
| `server-error` | Server returned an error for this field | Use server's message text; treat as `invalid-after-submit` |
|
|
48
|
+
|
|
49
|
+
Decision rule that collapses validation-timing debates: errors appear
|
|
50
|
+
on transition into `invalid-after-touched`, clear on transition out
|
|
51
|
+
of any invalid state, and never appear from `pristine` or plain
|
|
52
|
+
`dirty`. CSS `:user-invalid` matches the `invalid-after-touched` /
|
|
53
|
+
`invalid-after-submit` states for free.
|
|
54
|
+
|
|
55
|
+
## Validation timing
|
|
56
|
+
|
|
57
|
+
Baymard's checkout-UX benchmark (2024-01-09 inline-validation article):
|
|
58
|
+
**31% of sites have no inline validation, and most of the rest fire
|
|
59
|
+
too early.** The participant quote that anchors the research: *"Why
|
|
60
|
+
are you telling me my email address is wrong, I haven't had a chance
|
|
61
|
+
to fill it all out yet?"* Premature firing is the loudest UX failure
|
|
62
|
+
in this space.
|
|
63
|
+
|
|
64
|
+
The four rules:
|
|
65
|
+
|
|
66
|
+
1. **First blur after edit** runs the field-level constraint. Not on focus, not on first keystroke, not on every keystroke.
|
|
67
|
+
2. **Once a field is invalid, switch to `input`-event re-validation** so the error clears the moment input becomes valid. Don't make the user blur again to dismiss it.
|
|
68
|
+
3. **On submit**, run the schema parse. Move focus to the error summary at the top of the form (a heading-led container with `tabindex="-1"`, no `role="alert"` — see the wiring section), or to the first invalid field if no summary exists. Don't move focus on every keystroke.
|
|
69
|
+
4. **Async checks** split into two paths. *Background preflight* (uniqueness while typing, address lookup) debounces 250-500 ms, announces via a polite live region, and never gates typing or keeps the submit button disabled indefinitely. *Authoritative server validation on submit* is different: the submit path must await the server's response and surface field errors from it, since the server is the truth. Don't conflate the two — the rule is "don't let a slow background check freeze the form," not "don't ever wait for the server."
|
|
70
|
+
|
|
71
|
+
CSS gets you most of timing rule 1 for free: style off `:user-invalid`
|
|
72
|
+
not `:invalid`. The `:user-invalid` selector is Baseline Newly
|
|
73
|
+
available 2023 (Chrome 119, Firefox 88, Safari 16.5; Firefox shipped
|
|
74
|
+
the prefixed `:-moz-ui-invalid` years earlier and unprefixed in v88)
|
|
75
|
+
and matches only after the user has either submitted the form or
|
|
76
|
+
blurred the field with bad input.
|
|
77
|
+
|
|
78
|
+
## Constraint Validation API as the platform floor
|
|
79
|
+
|
|
80
|
+
Native HTML constraints are not an alternative to JS validation; they
|
|
81
|
+
are the substrate the rest of the layers run on. They survive JS
|
|
82
|
+
failure, they integrate with autofill, and they are what
|
|
83
|
+
`reportValidity()` and screen-reader native announcements key off.
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<input type="email" name="email" required>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Use these declaratively for every field that has them: `required`,
|
|
90
|
+
`type` (email, url, number, tel), `pattern`, `min`/`max`,
|
|
91
|
+
`minlength`/`maxlength`, `step`. Cross-field rules and dynamic
|
|
92
|
+
constraints go through `setCustomValidity()` on both `input` and
|
|
93
|
+
`change` events — autofill flows historically fired one without the
|
|
94
|
+
other on some browsers, so listening on both is the cheap defense.
|
|
95
|
+
|
|
96
|
+
Rules of the API:
|
|
97
|
+
|
|
98
|
+
- **Empty string clears `setCustomValidity`.** Not `null`, not no-arg.
|
|
99
|
+
- **`form.requestSubmit()` honors validation; `form.submit()` skips it.** Never call the second.
|
|
100
|
+
- `disabled` controls are barred from validation and not submitted. The HTML spec says `readonly` is also barred, but `readonly` only has defined behavior on `<input>` and `<textarea>` — implementations diverge for `<select readonly>` and `<button readonly>` ([whatwg/html#11841](https://github.com/whatwg/html/issues/11841)). For non-input controls where the value must still submit, the safe pattern is `disabled` plus a same-named hidden `<input>` carrying the value, or rendering the non-editable text alongside a hidden `<input>`. `aria-readonly` alone is not enough — a `<select>` or custom widget tagged `aria-readonly="true"` is still interactable, so the visible control can drift while the hidden input ships a stale or different value. If you do use `aria-readonly`, you must also block the interaction or keep both values in sync.
|
|
101
|
+
- `inputmode` is a virtual-keyboard hint, **not** validation. `<input type="text" inputmode="numeric" pattern="[0-9]*">` is the Baymard-recommended shape for ZIPs / OTPs / card numbers; `pattern="[0-9]*"` is the historical iOS-Safari trigger for the numeric keypad on top of `inputmode`. `type="number"` adds spinners, strips leading zeros, applies locale-decimal handling, and varies field width across browsers — wrong for any of these.
|
|
102
|
+
|
|
103
|
+
## Error wiring beyond the baseline
|
|
104
|
+
|
|
105
|
+
The default error pattern in `accessibility-baseline.md` (`<label>` +
|
|
106
|
+
`aria-describedby` + `aria-invalid` + `role="alert"`) covers WCAG
|
|
107
|
+
3.3.1 / 3.3.2. Three additions matter for real forms:
|
|
108
|
+
|
|
109
|
+
**Adaptive error messages.** Baymard 2023: 98% of audited sites use
|
|
110
|
+
generic catch-all errors ("Provide a valid phone number") rather than
|
|
111
|
+
the specific subrule that fired ("Phone number is too short"). The
|
|
112
|
+
back end already knows the subrule; surfacing it cuts re-submit
|
|
113
|
+
attempts. Ship 4-7 distinct messages per high-traffic complex field
|
|
114
|
+
(email, phone, card, postal code). The scale of the problem matches
|
|
115
|
+
WebAIM Million 2026: missing form-input labels appear on **51% of
|
|
116
|
+
the top 1M home pages** (input-level rate **33.1%** of all 6.9M
|
|
117
|
+
inputs sampled) — labels and error messages are the categories
|
|
118
|
+
trending sideways or worse year-over-year while overall a11y errors
|
|
119
|
+
drop.
|
|
120
|
+
|
|
121
|
+
**Error summary at the top, on submit only.** Long forms benefit from
|
|
122
|
+
a summary list of in-page anchor links to invalid fields, focused on
|
|
123
|
+
submit:
|
|
124
|
+
|
|
125
|
+
```html
|
|
126
|
+
<div id="form-errors" tabindex="-1">
|
|
127
|
+
<h2>2 problems</h2>
|
|
128
|
+
<ul>
|
|
129
|
+
<li><a href="#email">Email is required</a></li>
|
|
130
|
+
<li><a href="#dob">Date of birth must be in the past</a></li>
|
|
131
|
+
</ul>
|
|
132
|
+
</div>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The container is heading-led with `tabindex="-1"` so JS can move
|
|
136
|
+
focus to it on submit (render the summary into the DOM, *then*
|
|
137
|
+
`.focus()` it; a `hidden` element can't take focus). It does **not**
|
|
138
|
+
carry `role="alert"` because combining a moved-focus target with an
|
|
139
|
+
alert role causes double-announcement: alert fires on insertion,
|
|
140
|
+
focus fires the accessible name + role. Reserve `role="alert"` for
|
|
141
|
+
inline per-field errors that appear without focus moving — that's
|
|
142
|
+
the canonical baseline pattern in `accessibility-baseline.md`. WCAG
|
|
143
|
+
technique G139 covers the summary; not required, high-value for long
|
|
144
|
+
forms.
|
|
145
|
+
|
|
146
|
+
**Preserve user input on error.** Baymard 2024: 34% of audited
|
|
147
|
+
checkouts wipe the credit-card field when an unrelated error reloads
|
|
148
|
+
the page. Direct cause of abandonment. Either field-level-validate
|
|
149
|
+
non-sensitive fields first, or split the payment step. PCI-wise,
|
|
150
|
+
persisting card values across an error reload is fine via tokenized
|
|
151
|
+
hosted iframes; never store raw PAN in your own session.
|
|
152
|
+
|
|
153
|
+
## Schema as the cross-stack contract
|
|
154
|
+
|
|
155
|
+
Validation expressed once, consumed everywhere. The 2026 React shape
|
|
156
|
+
— `useActionState` + Server Actions + Conform (which added Standard
|
|
157
|
+
Schema support during the v1.x line) + a Zod 4 / Valibot / ArkType
|
|
158
|
+
schema — is the most-cited concrete instance: one schema,
|
|
159
|
+
server-authoritative, validator hot-swappable via the `~standard`
|
|
160
|
+
interface. The same architecture works in TanStack Form, oRPC, Hono
|
|
161
|
+
validator middleware, Nuxt UForm, and any other consumer that reads
|
|
162
|
+
`~standard`.
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
const Signup = z.object({
|
|
166
|
+
email: z.email(), // Zod 4 top-level form
|
|
167
|
+
password: z.string().min(12),
|
|
168
|
+
});
|
|
169
|
+
// Same schema parses on the Server Action and on the Conform client.
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Three rules that survive across stacks:
|
|
173
|
+
|
|
174
|
+
- **Server is the truth, client is the optimization.** Same schema runs in both. Returning `{ errors }` from the action (not throwing) is what feeds back into `useActionState`'s state slot — throwing routes to the Error Boundary and loses the form data.
|
|
175
|
+
- **Standard Schema is the contract, not Zod.** A form library that ships per-validator resolver shims (`zodResolver`, `valibotResolver`, etc.) is yesterday's stack. Accept any `~standard`-compliant validator.
|
|
176
|
+
- **`novalidate` on `<form>` does not mean "skip validation".** It means "let the form library repaint errors instead of the browser's bubble." But the trade-off is real: a literal server-rendered `<form novalidate>` disables the browser's submit-blocking and native validation UI **even when JS is unavailable**, which loses the no-JS constraint-validation floor. Pick one of two patterns. **A:** render `<form>` without `novalidate` server-side and have the form library set `form.noValidate = true` after hydration — the no-JS user keeps the browser's native validation, the JS user gets the library's chrome. **B:** ship `novalidate` from the start only when the submit path reaches server validation without JS (Server Action, classic POST handler) so the no-JS user is still protected by the server. Either way, keep `required` / `pattern` / `type` attributes — they survive JS failure and integrate with autofill. (HTML attribute is lowercase `novalidate`; the IDL property on the form element is `noValidate`.)
|
|
177
|
+
|
|
178
|
+
## WCAG 3.3.x beyond Error Identification
|
|
179
|
+
|
|
180
|
+
`accessibility-baseline.md` covers 3.3.1 (Error ID), 3.3.2 (Labels),
|
|
181
|
+
and 3.3.7 (Redundant Entry). The rest of 3.3 binds harder on
|
|
182
|
+
transactional forms:
|
|
183
|
+
|
|
184
|
+
- **3.3.3 Error Suggestion (AA):** when the fix is determinable, suggest it in text. Adaptive errors satisfy this. "Date must be MM/DD/YYYY. You entered 5-3-26. Did you mean 05/03/2026?"
|
|
185
|
+
- **3.3.4 Error Prevention — Legal, Financial, Data (AA):** for any submission with legal / financial / data-modifying consequence, provide one of: reversibility, server-side check + correction step, or a confirm-summary screen before commit.
|
|
186
|
+
- **3.3.8 Accessible Authentication (AA, WCAG 2.2):** auth steps must not require a cognitive function test (remember a password, transcribe a code, recognize images) without an alternative. CAPTCHAs are the canonical thing this SC restricts; only object-recognition or personal-content variants escape via the narrow exceptions, and not all CAPTCHAs do. Practical floor: never block paste on password / verification-code fields, support password managers, accept verification-code paste from a clipboard.
|
|
187
|
+
- **3.3.9 Accessible Authentication, No Exception (AAA):** removes even the object-recognition / personal-content exceptions. Aspirational; flag if a project commits to it.
|
|
188
|
+
|
|
189
|
+
## Native mobile parity
|
|
190
|
+
|
|
191
|
+
Web validation primitives don't auto-translate. Each platform has its
|
|
192
|
+
own validity machinery and its own AT path. Skills that emit web-only
|
|
193
|
+
artifacts can skim this section; it's the entry point for skills
|
|
194
|
+
that ship to mobile (mobile-onboarding, mobile-app, etc.).
|
|
195
|
+
|
|
196
|
+
| Platform | Validity primitive | Error announcement |
|
|
197
|
+
|---|---|---|
|
|
198
|
+
| iOS UIKit | Hand-rolled state on the view controller; `UITextField` doesn't carry a built-in invalid flag | `UIAccessibility.post(notification: .announcement, argument: "Email is required")` |
|
|
199
|
+
| iOS SwiftUI | `TextField` + `@State`-driven validation; no built-in `Form`-level validity API as of iOS 18 | `AccessibilityNotification.Announcement("…").post()` (iOS 17+) |
|
|
200
|
+
| Android Compose | `OutlinedTextField(isError = true, supportingText = { Text("…") })` — `isError` wires the AT error semantic for you | `Modifier.semantics { liveRegion = LiveRegionMode.Polite }` on the supporting-text node, or `LocalView.current.announceForAccessibility(message)` |
|
|
201
|
+
| Flutter | `TextFormField(validator: (v) => …)` inside a `Form`, `formKey.currentState!.validate()` | `SemanticsService.announce(message, Directionality.of(context))` — never hardcode `TextDirection.ltr`; pull ambient direction so Arabic / Hebrew / Persian flows announce correctly |
|
|
202
|
+
| React Native | Hand-rolled per field; no platform validity flag | `accessibilityLiveRegion="polite"` on the error node (Android) + `AccessibilityInfo.announceForAccessibility(...)` (iOS) |
|
|
203
|
+
|
|
204
|
+
Two parity rules that catch most AI-generated mobile forms:
|
|
205
|
+
|
|
206
|
+
- **Use the platform's native validation flag — and pair it with the platform's error-message semantic where one exists.** On Compose, `isError = true` is the right boolean state for the field visuals and AT error-state cue, but it does *not* carry the localized error message. Pair it with `Modifier.semantics { error(message) }` so accessibility services get the actual text — the same string you render in `supportingText`. The trap is duplication: a hand-rolled `Modifier.semantics { error("Email is required") }` next to a different supporting-text string desyncs. Source `error()` from the same state field as `supportingText` so they stay in sync.
|
|
207
|
+
- **Don't mirror web ARIA into mobile semantics.** `aria-describedby` on a SwiftUI `TextField` is a no-op. Use the platform announcement primitive (`AccessibilityNotification.Announcement` on SwiftUI, `UIAccessibility.post` on UIKit, `announceForAccessibility` on Android, `SemanticsService.announce` on Flutter) for state-change events that need to reach the screen reader.
|
|
208
|
+
|
|
209
|
+
## Common mistakes (lint these)
|
|
210
|
+
|
|
211
|
+
- Styling off `input:invalid` instead of `input:user-invalid`. Red borders on page load is the loudest "this validation was added without testing" signal.
|
|
212
|
+
- Validating on every keystroke. Hostile; fires before the user has finished typing.
|
|
213
|
+
- Generic catch-all error messages ("Invalid input") when the back end already knows which subrule fired. Baymard 2023 found 98% of audited sites do this — the most-cited preventable validation failure in their corpus.
|
|
214
|
+
- Throwing from a Server Action on validation failure. Routes to the Error Boundary and loses the form data. Return `{ errors }` instead.
|
|
215
|
+
- `role="alert"` on the error-summary container that focus moves to. Double-announces. Reserve `role="alert"` for inline per-field errors that appear without focus moving.
|
|
216
|
+
- `aria-busy="true"` on the submit button while submitting. `aria-busy` is for stale containers; for buttons use `disabled` plus a polite live-region status message.
|
|
217
|
+
- Email-confirm fields ("retype your email"). 3.3.7 redundant entry — exceptions are essential / security / no-longer-valid, not "we want to catch typos." Allow paste and validate the single field instead.
|
|
218
|
+
- Per-validator resolver shims (`zodResolver`, `valibotResolver`) on a 2026 stack. Accept Standard Schema's `~standard` interface and the validator becomes swappable.
|
|
219
|
+
- Wiping the credit-card field when an unrelated field errors. Baymard 2024: 34% of audited e-commerce sites; direct abandonment cause.
|
|
220
|
+
- `setCustomValidity(null)` to clear an error. Pass empty string; `null` does not clear.
|
|
221
|
+
- Mirroring web ARIA onto SwiftUI / Compose / Flutter. Each platform has its own validity API; `aria-*` attributes don't reach the mobile AT path.
|