lsd-pi 1.2.0 → 1.2.2
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/dist/cli.js +7 -1
- package/dist/onboarding.js +3 -3
- package/dist/resources/agents/scout.md +6 -0
- package/dist/resources/extensions/slash-commands/plan.js +7 -1
- package/dist/resources/extensions/subagent/index.js +10 -2
- package/dist/resources/extensions/usage/index.js +87 -36
- package/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +8 -2
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/src/agent.ts +8 -2
- package/packages/pi-ai/dist/models.generated.d.ts +222 -1
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +227 -6
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.test.js +28 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -1
- package/packages/pi-ai/scripts/generate-models.ts +10 -100
- package/packages/pi-ai/src/models.generated.ts +227 -6
- package/packages/pi-ai/src/models.test.ts +30 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +28 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +10 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/path-display.test.js +13 -0
- package/packages/pi-coding-agent/dist/tests/path-display.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js +15 -0
- package/packages/pi-coding-agent/dist/tests/settings-manager-scout-policy.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +35 -0
- package/packages/pi-coding-agent/src/core/settings-manager.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +26 -0
- package/packages/pi-coding-agent/src/index.ts +1 -0
- package/packages/pi-coding-agent/src/tests/path-display.test.ts +14 -0
- package/pkg/package.json +1 -1
- package/src/resources/agents/scout.md +6 -0
- package/src/resources/extensions/slash-commands/plan.ts +11 -1
- package/src/resources/extensions/subagent/index.ts +10 -2
- package/src/resources/extensions/usage/index.ts +92 -38
- package/dist/resources/agents/javascript-pro.md +0 -280
- package/dist/resources/agents/researcher.md +0 -29
- package/dist/resources/agents/teams-builder.md +0 -74
- package/dist/resources/agents/teams-reviewer.md +0 -113
- package/dist/resources/agents/typescript-pro.md +0 -255
- package/dist/resources/skills/accessibility/SKILL.md +0 -522
- package/dist/resources/skills/accessibility/references/WCAG.md +0 -162
- package/dist/resources/skills/core-web-vitals/SKILL.md +0 -441
- package/dist/resources/skills/core-web-vitals/references/LCP.md +0 -208
- package/dist/resources/skills/frontend-design/SKILL.md +0 -45
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
- package/dist/resources/skills/make-interfaces-feel-better/animations.md +0 -379
- package/dist/resources/skills/make-interfaces-feel-better/performance.md +0 -88
- package/dist/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
- package/dist/resources/skills/make-interfaces-feel-better/typography.md +0 -123
- package/dist/resources/skills/react-best-practices/README.md +0 -123
- package/dist/resources/skills/react-best-practices/SKILL.md +0 -136
- package/dist/resources/skills/react-best-practices/metadata.json +0 -15
- package/dist/resources/skills/react-best-practices/rules/_sections.md +0 -46
- package/dist/resources/skills/react-best-practices/rules/_template.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/dist/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
- package/dist/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
- package/dist/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/dist/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
- package/dist/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/dist/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/dist/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/dist/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/dist/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/dist/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/dist/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/dist/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/dist/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/dist/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/dist/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/dist/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/dist/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/dist/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/dist/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/dist/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/dist/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/dist/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/dist/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/dist/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/dist/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/dist/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/dist/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/dist/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/dist/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/dist/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/dist/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/dist/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/dist/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/dist/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/dist/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/dist/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/dist/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/dist/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/dist/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/dist/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/dist/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/dist/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
- package/dist/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/dist/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
- package/dist/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
- package/dist/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/dist/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
- package/dist/resources/skills/userinterface-wiki/SKILL.md +0 -253
- package/dist/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
- package/dist/resources/skills/userinterface-wiki/rules/_template.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
- package/dist/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
- package/dist/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
- package/dist/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
- package/dist/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
- package/dist/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
- package/dist/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
- package/dist/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
- package/dist/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
- package/dist/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
- package/dist/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
- package/dist/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
- package/dist/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
- package/dist/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
- package/dist/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
- package/dist/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
- package/dist/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
- package/dist/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
- package/dist/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
- package/dist/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
- package/dist/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
- package/dist/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
- package/dist/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
- package/dist/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
- package/dist/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
- package/dist/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
- package/dist/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
- package/dist/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
- package/dist/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
- package/dist/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
- package/dist/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
- package/dist/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
- package/dist/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
- package/dist/resources/skills/web-design-guidelines/SKILL.md +0 -39
- package/dist/resources/skills/web-quality-audit/SKILL.md +0 -168
- package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
- package/src/resources/agents/javascript-pro.md +0 -280
- package/src/resources/agents/researcher.md +0 -29
- package/src/resources/agents/teams-builder.md +0 -74
- package/src/resources/agents/teams-reviewer.md +0 -113
- package/src/resources/agents/typescript-pro.md +0 -255
- package/src/resources/skills/accessibility/SKILL.md +0 -522
- package/src/resources/skills/accessibility/references/WCAG.md +0 -162
- package/src/resources/skills/core-web-vitals/SKILL.md +0 -441
- package/src/resources/skills/core-web-vitals/references/LCP.md +0 -208
- package/src/resources/skills/frontend-design/SKILL.md +0 -45
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +0 -122
- package/src/resources/skills/make-interfaces-feel-better/animations.md +0 -379
- package/src/resources/skills/make-interfaces-feel-better/performance.md +0 -88
- package/src/resources/skills/make-interfaces-feel-better/surfaces.md +0 -247
- package/src/resources/skills/make-interfaces-feel-better/typography.md +0 -123
- package/src/resources/skills/react-best-practices/README.md +0 -123
- package/src/resources/skills/react-best-practices/SKILL.md +0 -136
- package/src/resources/skills/react-best-practices/metadata.json +0 -15
- package/src/resources/skills/react-best-practices/rules/_sections.md +0 -46
- package/src/resources/skills/react-best-practices/rules/_template.md +0 -28
- package/src/resources/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/src/resources/skills/react-best-practices/rules/advanced-init-once.md +0 -42
- package/src/resources/skills/react-best-practices/rules/advanced-use-latest.md +0 -39
- package/src/resources/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/src/resources/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/src/resources/skills/react-best-practices/rules/async-dependencies.md +0 -51
- package/src/resources/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/src/resources/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/src/resources/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/src/resources/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/src/resources/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/src/resources/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/src/resources/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/src/resources/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/src/resources/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/src/resources/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/src/resources/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/src/resources/skills/react-best-practices/rules/js-batch-dom-css.md +0 -107
- package/src/resources/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/src/resources/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/src/resources/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/src/resources/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/src/resources/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/src/resources/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/src/resources/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/src/resources/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/src/resources/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/src/resources/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/src/resources/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/src/resources/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/src/resources/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/src/resources/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/src/resources/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/src/resources/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
- package/src/resources/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/src/resources/skills/react-best-practices/rules/rendering-usetransition-loading.md +0 -75
- package/src/resources/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/src/resources/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/src/resources/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/src/resources/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/src/resources/skills/react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
- package/src/resources/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/src/resources/skills/react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
- package/src/resources/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
- package/src/resources/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/src/resources/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
- package/src/resources/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/src/resources/skills/react-best-practices/rules/server-auth-actions.md +0 -96
- package/src/resources/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/src/resources/skills/react-best-practices/rules/server-cache-react.md +0 -76
- package/src/resources/skills/react-best-practices/rules/server-dedup-props.md +0 -65
- package/src/resources/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/src/resources/skills/react-best-practices/rules/server-serialization.md +0 -38
- package/src/resources/skills/userinterface-wiki/SKILL.md +0 -253
- package/src/resources/skills/userinterface-wiki/rules/_sections.md +0 -66
- package/src/resources/skills/userinterface-wiki/rules/_template.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/a11y-reduced-motion-check.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/a11y-toggle-setting.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/a11y-visual-equivalent.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/a11y-volume-control.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/appropriate-confirmations-only.md +0 -19
- package/src/resources/skills/userinterface-wiki/rules/appropriate-errors-warnings.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-decorative.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-high-frequency.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/appropriate-no-punishing.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/container-callback-ref.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/container-guard-initial-zero.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/container-no-excessive-use.md +0 -13
- package/src/resources/skills/userinterface-wiki/rules/container-overflow-hidden.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/container-transition-delay.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/container-two-div-pattern.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/container-use-resize-observer.md +0 -48
- package/src/resources/skills/userinterface-wiki/rules/context-cleanup-nodes.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/context-resume-suspended.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/context-reuse-single.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/design-filter-for-character.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/design-noise-for-percussion.md +0 -26
- package/src/resources/skills/userinterface-wiki/rules/design-oscillator-for-tonal.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/duration-max-300ms.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-press-hover.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-shorten-before-curve.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/duration-small-state.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/easing-entrance-ease-out.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-exit-ease-in.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-for-state-change.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/easing-linear-only-progress.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/easing-natural-decay.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/easing-no-linear-motion.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/easing-transition-ease-in-out.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/envelope-exponential-decay.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/envelope-no-zero-target.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/envelope-set-initial-value.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/exit-key-required.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/exit-matches-initial.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/exit-prop-required.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/exit-requires-wrapper.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/impl-default-subtle.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/impl-preload-audio.md +0 -34
- package/src/resources/skills/userinterface-wiki/rules/impl-reset-current-time.md +0 -26
- package/src/resources/skills/userinterface-wiki/rules/mode-pop-layout-for-lists.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/mode-sync-layout-conflict.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/mode-wait-doubles-duration.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/morphing-aria-hidden.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/morphing-consistent-viewbox.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/morphing-group-variants.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/morphing-jump-non-grouped.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/morphing-reduced-motion.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/morphing-spring-rotation.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/morphing-strokelinecap-round.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/morphing-three-lines.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/morphing-use-collapsed.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/native-backdrop-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/native-placeholder-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/native-selection-styling.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/nested-consistent-timing.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/nested-propagate-required.md +0 -41
- package/src/resources/skills/userinterface-wiki/rules/none-context-menu-entrance.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/none-high-frequency.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/none-keyboard-navigation.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/param-click-duration.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-filter-frequency-range.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-q-value-range.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/param-reasonable-gain.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/physics-active-state.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/physics-no-excessive-stagger.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/physics-spring-for-overshoot.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/physics-subtle-deformation.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/prefetch-hit-slop.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/prefetch-keyboard-tab.md +0 -19
- package/src/resources/skills/userinterface-wiki/rules/prefetch-not-everything.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/prefetch-touch-fallback.md +0 -34
- package/src/resources/skills/userinterface-wiki/rules/prefetch-trajectory-over-hover.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/prefetch-use-selectively.md +0 -13
- package/src/resources/skills/userinterface-wiki/rules/presence-disable-interactions.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/presence-hook-in-child.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/presence-safe-to-remove.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/pseudo-content-required.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/pseudo-first-line-styling.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/pseudo-hit-target-expansion.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/pseudo-marker-styling.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/pseudo-over-dom-node.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/pseudo-position-relative-parent.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/pseudo-z-index-layering.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/spring-for-gestures.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/spring-for-interruptible.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/spring-params-balanced.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/spring-preserves-velocity.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/staging-dim-background.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/staging-one-focal-point.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/staging-z-index-hierarchy.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/timing-consistent.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/timing-no-entrance-context-menu.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/timing-under-300ms.md +0 -22
- package/src/resources/skills/userinterface-wiki/rules/transition-name-cleanup.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/transition-name-required.md +0 -27
- package/src/resources/skills/userinterface-wiki/rules/transition-name-unique.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/transition-over-js-library.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/transition-style-pseudo-elements.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/type-antialiased-on-retina.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/type-disambiguation-stylistic-set.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-font-display-swap.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/type-justify-with-hyphens.md +0 -24
- package/src/resources/skills/userinterface-wiki/rules/type-letter-spacing-uppercase.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/type-no-font-synthesis.md +0 -18
- package/src/resources/skills/userinterface-wiki/rules/type-oldstyle-nums-for-prose.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-opentype-contextual-alternates.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-optical-sizing-auto.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/type-proper-fractions.md +0 -15
- package/src/resources/skills/userinterface-wiki/rules/type-slashed-zero.md +0 -17
- package/src/resources/skills/userinterface-wiki/rules/type-tabular-nums-for-data.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-balance-headings.md +0 -21
- package/src/resources/skills/userinterface-wiki/rules/type-text-wrap-pretty.md +0 -16
- package/src/resources/skills/userinterface-wiki/rules/type-underline-offset.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/type-variable-weight-continuous.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/ux-aesthetic-usability.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/ux-cognitive-load-reduce.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/ux-common-region-boundaries.md +0 -50
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-perceived-speed.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/ux-doherty-under-400ms.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-hit-area.md +0 -32
- package/src/resources/skills/userinterface-wiki/rules/ux-fitts-target-size.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/ux-goal-gradient-progress.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/ux-hicks-minimize-choices.md +0 -45
- package/src/resources/skills/userinterface-wiki/rules/ux-jakobs-familiar-patterns.md +0 -37
- package/src/resources/skills/userinterface-wiki/rules/ux-millers-chunking.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/ux-pareto-prioritize-features.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/ux-peak-end-finish-strong.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/ux-postels-accept-messy-input.md +0 -45
- package/src/resources/skills/userinterface-wiki/rules/ux-pragnanz-simplify.md +0 -33
- package/src/resources/skills/userinterface-wiki/rules/ux-progressive-disclosure.md +0 -41
- package/src/resources/skills/userinterface-wiki/rules/ux-proximity-grouping.md +0 -38
- package/src/resources/skills/userinterface-wiki/rules/ux-serial-position.md +0 -31
- package/src/resources/skills/userinterface-wiki/rules/ux-similarity-consistency.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/ux-teslers-complexity.md +0 -28
- package/src/resources/skills/userinterface-wiki/rules/ux-uniform-connectedness.md +0 -43
- package/src/resources/skills/userinterface-wiki/rules/ux-von-restorff-emphasis.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/ux-zeigarnik-show-incomplete.md +0 -36
- package/src/resources/skills/userinterface-wiki/rules/visual-animate-shadow-pseudo.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/visual-border-alpha-colors.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-button-shadow-anatomy.md +0 -49
- package/src/resources/skills/userinterface-wiki/rules/visual-concentric-radius.md +0 -40
- package/src/resources/skills/userinterface-wiki/rules/visual-consistent-spacing-scale.md +0 -35
- package/src/resources/skills/userinterface-wiki/rules/visual-layered-shadows.md +0 -30
- package/src/resources/skills/userinterface-wiki/rules/visual-no-pure-black-shadow.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-direction.md +0 -25
- package/src/resources/skills/userinterface-wiki/rules/visual-shadow-matches-elevation.md +0 -23
- package/src/resources/skills/userinterface-wiki/rules/weight-duration-matches-action.md +0 -29
- package/src/resources/skills/userinterface-wiki/rules/weight-match-action.md +0 -32
- package/src/resources/skills/web-design-guidelines/SKILL.md +0 -39
- package/src/resources/skills/web-quality-audit/SKILL.md +0 -168
- package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -91
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Authenticate Server Actions Like API Routes
|
|
3
|
-
impact: CRITICAL
|
|
4
|
-
impactDescription: prevents unauthorized access to server mutations
|
|
5
|
-
tags: server, server-actions, authentication, security, authorization
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Authenticate Server Actions Like API Routes
|
|
9
|
-
|
|
10
|
-
**Impact: CRITICAL (prevents unauthorized access to server mutations)**
|
|
11
|
-
|
|
12
|
-
Server Actions (functions with `"use server"`) are exposed as public endpoints, just like API routes. Always verify authentication and authorization **inside** each Server Action—do not rely solely on middleware, layout guards, or page-level checks, as Server Actions can be invoked directly.
|
|
13
|
-
|
|
14
|
-
Next.js documentation explicitly states: "Treat Server Actions with the same security considerations as public-facing API endpoints, and verify if the user is allowed to perform a mutation."
|
|
15
|
-
|
|
16
|
-
**Incorrect (no authentication check):**
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
'use server'
|
|
20
|
-
|
|
21
|
-
export async function deleteUser(userId: string) {
|
|
22
|
-
// Anyone can call this! No auth check
|
|
23
|
-
await db.user.delete({ where: { id: userId } })
|
|
24
|
-
return { success: true }
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
**Correct (authentication inside the action):**
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
'use server'
|
|
32
|
-
|
|
33
|
-
import { verifySession } from '@/lib/auth'
|
|
34
|
-
import { unauthorized } from '@/lib/errors'
|
|
35
|
-
|
|
36
|
-
export async function deleteUser(userId: string) {
|
|
37
|
-
// Always check auth inside the action
|
|
38
|
-
const session = await verifySession()
|
|
39
|
-
|
|
40
|
-
if (!session) {
|
|
41
|
-
throw unauthorized('Must be logged in')
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Check authorization too
|
|
45
|
-
if (session.user.role !== 'admin' && session.user.id !== userId) {
|
|
46
|
-
throw unauthorized('Cannot delete other users')
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
await db.user.delete({ where: { id: userId } })
|
|
50
|
-
return { success: true }
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**With input validation:**
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
'use server'
|
|
58
|
-
|
|
59
|
-
import { verifySession } from '@/lib/auth'
|
|
60
|
-
import { z } from 'zod'
|
|
61
|
-
|
|
62
|
-
const updateProfileSchema = z.object({
|
|
63
|
-
userId: z.string().uuid(),
|
|
64
|
-
name: z.string().min(1).max(100),
|
|
65
|
-
email: z.string().email()
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
export async function updateProfile(data: unknown) {
|
|
69
|
-
// Validate input first
|
|
70
|
-
const validated = updateProfileSchema.parse(data)
|
|
71
|
-
|
|
72
|
-
// Then authenticate
|
|
73
|
-
const session = await verifySession()
|
|
74
|
-
if (!session) {
|
|
75
|
-
throw new Error('Unauthorized')
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// Then authorize
|
|
79
|
-
if (session.user.id !== validated.userId) {
|
|
80
|
-
throw new Error('Can only update own profile')
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// Finally perform the mutation
|
|
84
|
-
await db.user.update({
|
|
85
|
-
where: { id: validated.userId },
|
|
86
|
-
data: {
|
|
87
|
-
name: validated.name,
|
|
88
|
-
email: validated.email
|
|
89
|
-
}
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
return { success: true }
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Reference: [https://nextjs.org/docs/app/guides/authentication](https://nextjs.org/docs/app/guides/authentication)
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Cross-Request LRU Caching
|
|
3
|
-
impact: HIGH
|
|
4
|
-
impactDescription: caches across requests
|
|
5
|
-
tags: server, cache, lru, cross-request
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Cross-Request LRU Caching
|
|
9
|
-
|
|
10
|
-
`React.cache()` only works within one request. For data shared across sequential requests (user clicks button A then button B), use an LRU cache.
|
|
11
|
-
|
|
12
|
-
**Implementation:**
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
import { LRUCache } from 'lru-cache'
|
|
16
|
-
|
|
17
|
-
const cache = new LRUCache<string, any>({
|
|
18
|
-
max: 1000,
|
|
19
|
-
ttl: 5 * 60 * 1000 // 5 minutes
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
export async function getUser(id: string) {
|
|
23
|
-
const cached = cache.get(id)
|
|
24
|
-
if (cached) return cached
|
|
25
|
-
|
|
26
|
-
const user = await db.user.findUnique({ where: { id } })
|
|
27
|
-
cache.set(id, user)
|
|
28
|
-
return user
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Request 1: DB query, result cached
|
|
32
|
-
// Request 2: cache hit, no DB query
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Use when sequential user actions hit multiple endpoints needing the same data within seconds.
|
|
36
|
-
|
|
37
|
-
**With Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute):** LRU caching is especially effective because multiple concurrent requests can share the same function instance and cache. This means the cache persists across requests without needing external storage like Redis.
|
|
38
|
-
|
|
39
|
-
**In traditional serverless:** Each invocation runs in isolation, so consider Redis for cross-process caching.
|
|
40
|
-
|
|
41
|
-
Reference: [https://github.com/isaacs/node-lru-cache](https://github.com/isaacs/node-lru-cache)
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Per-Request Deduplication with React.cache()
|
|
3
|
-
impact: MEDIUM
|
|
4
|
-
impactDescription: deduplicates within request
|
|
5
|
-
tags: server, cache, react-cache, deduplication
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Per-Request Deduplication with React.cache()
|
|
9
|
-
|
|
10
|
-
Use `React.cache()` for server-side request deduplication. Authentication and database queries benefit most.
|
|
11
|
-
|
|
12
|
-
**Usage:**
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
import { cache } from 'react'
|
|
16
|
-
|
|
17
|
-
export const getCurrentUser = cache(async () => {
|
|
18
|
-
const session = await auth()
|
|
19
|
-
if (!session?.user?.id) return null
|
|
20
|
-
return await db.user.findUnique({
|
|
21
|
-
where: { id: session.user.id }
|
|
22
|
-
})
|
|
23
|
-
})
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Within a single request, multiple calls to `getCurrentUser()` execute the query only once.
|
|
27
|
-
|
|
28
|
-
**Avoid inline objects as arguments:**
|
|
29
|
-
|
|
30
|
-
`React.cache()` uses shallow equality (`Object.is`) to determine cache hits. Inline objects create new references each call, preventing cache hits.
|
|
31
|
-
|
|
32
|
-
**Incorrect (always cache miss):**
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
const getUser = cache(async (params: { uid: number }) => {
|
|
36
|
-
return await db.user.findUnique({ where: { id: params.uid } })
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Each call creates new object, never hits cache
|
|
40
|
-
getUser({ uid: 1 })
|
|
41
|
-
getUser({ uid: 1 }) // Cache miss, runs query again
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**Correct (cache hit):**
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
const getUser = cache(async (uid: number) => {
|
|
48
|
-
return await db.user.findUnique({ where: { id: uid } })
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
// Primitive args use value equality
|
|
52
|
-
getUser(1)
|
|
53
|
-
getUser(1) // Cache hit, returns cached result
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
If you must pass objects, pass the same reference:
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
const params = { uid: 1 }
|
|
60
|
-
getUser(params) // Query runs
|
|
61
|
-
getUser(params) // Cache hit (same reference)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Next.js-Specific Note:**
|
|
65
|
-
|
|
66
|
-
In Next.js, the `fetch` API is automatically extended with request memoization. Requests with the same URL and options are automatically deduplicated within a single request, so you don't need `React.cache()` for `fetch` calls. However, `React.cache()` is still essential for other async tasks:
|
|
67
|
-
|
|
68
|
-
- Database queries (Prisma, Drizzle, etc.)
|
|
69
|
-
- Heavy computations
|
|
70
|
-
- Authentication checks
|
|
71
|
-
- File system operations
|
|
72
|
-
- Any non-fetch async work
|
|
73
|
-
|
|
74
|
-
Use `React.cache()` to deduplicate these operations across your component tree.
|
|
75
|
-
|
|
76
|
-
Reference: [React.cache documentation](https://react.dev/reference/react/cache)
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Avoid Duplicate Serialization in RSC Props
|
|
3
|
-
impact: LOW
|
|
4
|
-
impactDescription: reduces network payload by avoiding duplicate serialization
|
|
5
|
-
tags: server, rsc, serialization, props, client-components
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Avoid Duplicate Serialization in RSC Props
|
|
9
|
-
|
|
10
|
-
**Impact: LOW (reduces network payload by avoiding duplicate serialization)**
|
|
11
|
-
|
|
12
|
-
RSC→client serialization deduplicates by object reference, not value. Same reference = serialized once; new reference = serialized again. Do transformations (`.toSorted()`, `.filter()`, `.map()`) in client, not server.
|
|
13
|
-
|
|
14
|
-
**Incorrect (duplicates array):**
|
|
15
|
-
|
|
16
|
-
```tsx
|
|
17
|
-
// RSC: sends 6 strings (2 arrays × 3 items)
|
|
18
|
-
<ClientList usernames={usernames} usernamesOrdered={usernames.toSorted()} />
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
**Correct (sends 3 strings):**
|
|
22
|
-
|
|
23
|
-
```tsx
|
|
24
|
-
// RSC: send once
|
|
25
|
-
<ClientList usernames={usernames} />
|
|
26
|
-
|
|
27
|
-
// Client: transform there
|
|
28
|
-
'use client'
|
|
29
|
-
const sorted = useMemo(() => [...usernames].sort(), [usernames])
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
**Nested deduplication behavior:**
|
|
33
|
-
|
|
34
|
-
Deduplication works recursively. Impact varies by data type:
|
|
35
|
-
|
|
36
|
-
- `string[]`, `number[]`, `boolean[]`: **HIGH impact** - array + all primitives fully duplicated
|
|
37
|
-
- `object[]`: **LOW impact** - array duplicated, but nested objects deduplicated by reference
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
// string[] - duplicates everything
|
|
41
|
-
usernames={['a','b']} sorted={usernames.toSorted()} // sends 4 strings
|
|
42
|
-
|
|
43
|
-
// object[] - duplicates array structure only
|
|
44
|
-
users={[{id:1},{id:2}]} sorted={users.toSorted()} // sends 2 arrays + 2 unique objects (not 4)
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Operations breaking deduplication (create new references):**
|
|
48
|
-
|
|
49
|
-
- Arrays: `.toSorted()`, `.filter()`, `.map()`, `.slice()`, `[...arr]`
|
|
50
|
-
- Objects: `{...obj}`, `Object.assign()`, `structuredClone()`, `JSON.parse(JSON.stringify())`
|
|
51
|
-
|
|
52
|
-
**More examples:**
|
|
53
|
-
|
|
54
|
-
```tsx
|
|
55
|
-
// ❌ Bad
|
|
56
|
-
<C users={users} active={users.filter(u => u.active)} />
|
|
57
|
-
<C product={product} productName={product.name} />
|
|
58
|
-
|
|
59
|
-
// ✅ Good
|
|
60
|
-
<C users={users} />
|
|
61
|
-
<C product={product} />
|
|
62
|
-
// Do filtering/destructuring in client
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
**Exception:** Pass derived data when transformation is expensive or client doesn't need original.
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Parallel Data Fetching with Component Composition
|
|
3
|
-
impact: CRITICAL
|
|
4
|
-
impactDescription: eliminates server-side waterfalls
|
|
5
|
-
tags: server, rsc, parallel-fetching, composition
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Parallel Data Fetching with Component Composition
|
|
9
|
-
|
|
10
|
-
React Server Components execute sequentially within a tree. Restructure with composition to parallelize data fetching.
|
|
11
|
-
|
|
12
|
-
**Incorrect (Sidebar waits for Page's fetch to complete):**
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
export default async function Page() {
|
|
16
|
-
const header = await fetchHeader()
|
|
17
|
-
return (
|
|
18
|
-
<div>
|
|
19
|
-
<div>{header}</div>
|
|
20
|
-
<Sidebar />
|
|
21
|
-
</div>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async function Sidebar() {
|
|
26
|
-
const items = await fetchSidebarItems()
|
|
27
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Correct (both fetch simultaneously):**
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
async function Header() {
|
|
35
|
-
const data = await fetchHeader()
|
|
36
|
-
return <div>{data}</div>
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async function Sidebar() {
|
|
40
|
-
const items = await fetchSidebarItems()
|
|
41
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export default function Page() {
|
|
45
|
-
return (
|
|
46
|
-
<div>
|
|
47
|
-
<Header />
|
|
48
|
-
<Sidebar />
|
|
49
|
-
</div>
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**Alternative with children prop:**
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
async function Header() {
|
|
58
|
-
const data = await fetchHeader()
|
|
59
|
-
return <div>{data}</div>
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function Sidebar() {
|
|
63
|
-
const items = await fetchSidebarItems()
|
|
64
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function Layout({ children }: { children: ReactNode }) {
|
|
68
|
-
return (
|
|
69
|
-
<div>
|
|
70
|
-
<Header />
|
|
71
|
-
{children}
|
|
72
|
-
</div>
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export default function Page() {
|
|
77
|
-
return (
|
|
78
|
-
<Layout>
|
|
79
|
-
<Sidebar />
|
|
80
|
-
</Layout>
|
|
81
|
-
)
|
|
82
|
-
}
|
|
83
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Minimize Serialization at RSC Boundaries
|
|
3
|
-
impact: HIGH
|
|
4
|
-
impactDescription: reduces data transfer size
|
|
5
|
-
tags: server, rsc, serialization, props
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Minimize Serialization at RSC Boundaries
|
|
9
|
-
|
|
10
|
-
The React Server/Client boundary serializes all object properties into strings and embeds them in the HTML response and subsequent RSC requests. This serialized data directly impacts page weight and load time, so **size matters a lot**. Only pass fields that the client actually uses.
|
|
11
|
-
|
|
12
|
-
**Incorrect (serializes all 50 fields):**
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
async function Page() {
|
|
16
|
-
const user = await fetchUser() // 50 fields
|
|
17
|
-
return <Profile user={user} />
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
'use client'
|
|
21
|
-
function Profile({ user }: { user: User }) {
|
|
22
|
-
return <div>{user.name}</div> // uses 1 field
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Correct (serializes only 1 field):**
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
async function Page() {
|
|
30
|
-
const user = await fetchUser()
|
|
31
|
-
return <Profile name={user.name} />
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
'use client'
|
|
35
|
-
function Profile({ name }: { name: string }) {
|
|
36
|
-
return <div>{name}</div>
|
|
37
|
-
}
|
|
38
|
-
```
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: userinterface-wiki
|
|
3
|
-
description: UI/UX best practices for interfaces. Use when reviewing animations, CSS, audio, typography, UX patterns, prefetching, or icon implementations. Covers 11 categories from animation principles to typography. Outputs file:line findings.
|
|
4
|
-
license: MIT
|
|
5
|
-
metadata:
|
|
6
|
-
author: raphael-salaja
|
|
7
|
-
version: "3.0.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# User Interface Wiki
|
|
11
|
-
|
|
12
|
-
Comprehensive UI/UX best practices guide for interfaces. Contains 152 rules across 12 categories, prioritized by impact to guide automated code review and generation.
|
|
13
|
-
|
|
14
|
-
## When to Apply
|
|
15
|
-
|
|
16
|
-
Reference these guidelines when:
|
|
17
|
-
- Implementing or reviewing animations (CSS transitions, Motion/Framer Motion)
|
|
18
|
-
- Choosing between springs, easing curves, or no animation
|
|
19
|
-
- Working with AnimatePresence and exit animations
|
|
20
|
-
- Writing CSS with pseudo-elements or View Transitions API
|
|
21
|
-
- Adding audio feedback or procedural sound to UI
|
|
22
|
-
- Building morphing icon components
|
|
23
|
-
- Animating container width/height with dynamic content
|
|
24
|
-
- Designing UI that respects cognitive psychology (Fitts's, Hick's, Miller's laws)
|
|
25
|
-
- Implementing predictive prefetching for perceived performance
|
|
26
|
-
- Setting up typography, OpenType features, or numeric formatting
|
|
27
|
-
|
|
28
|
-
## Rule Categories by Priority
|
|
29
|
-
|
|
30
|
-
| Priority | Category | Impact | Prefixes |
|
|
31
|
-
|----------|----------|--------|----------|
|
|
32
|
-
| 1 | Animation Principles | CRITICAL | `timing-`, `physics-`, `staging-` |
|
|
33
|
-
| 2 | Timing Functions | HIGH | `spring-`, `easing-`, `duration-`, `none-` |
|
|
34
|
-
| 3 | Exit Animations | HIGH | `exit-`, `presence-`, `mode-`, `nested-` |
|
|
35
|
-
| 4 | CSS Pseudo Elements | MEDIUM | `pseudo-`, `transition-`, `native-` |
|
|
36
|
-
| 5 | Audio Feedback | MEDIUM | `a11y-`, `appropriate-`, `impl-`, `weight-` |
|
|
37
|
-
| 6 | Sound Synthesis | MEDIUM | `context-`, `envelope-`, `design-`, `param-` |
|
|
38
|
-
| 7 | Morphing Icons | LOW | `morphing-` |
|
|
39
|
-
| 8 | Container Animation | MEDIUM | `container-` |
|
|
40
|
-
| 9 | Laws of UX | HIGH | `ux-` |
|
|
41
|
-
| 10 | Predictive Prefetching | MEDIUM | `prefetch-` |
|
|
42
|
-
| 11 | Typography | MEDIUM | `type-` |
|
|
43
|
-
| 12 | Visual Design | HIGH | `visual-` |
|
|
44
|
-
|
|
45
|
-
## Quick Reference
|
|
46
|
-
|
|
47
|
-
### 1. Animation Principles (CRITICAL)
|
|
48
|
-
|
|
49
|
-
- `timing-under-300ms` - User animations must complete within 300ms
|
|
50
|
-
- `timing-consistent` - Similar elements use identical timing values
|
|
51
|
-
- `timing-no-entrance-context-menu` - Context menus: no entrance animation, exit only
|
|
52
|
-
- `easing-natural-decay` - Use exponential ramps for natural decay, not linear
|
|
53
|
-
- `easing-no-linear-motion` - Linear easing only for progress indicators
|
|
54
|
-
- `physics-active-state` - Interactive elements need :active scale transform
|
|
55
|
-
- `physics-subtle-deformation` - Squash/stretch in 0.95-1.05 range
|
|
56
|
-
- `physics-spring-for-overshoot` - Springs for overshoot-and-settle, not easing
|
|
57
|
-
- `physics-no-excessive-stagger` - Stagger delays under 50ms per item
|
|
58
|
-
- `staging-one-focal-point` - One prominent animation at a time
|
|
59
|
-
- `staging-dim-background` - Dim modal/dialog backgrounds
|
|
60
|
-
- `staging-z-index-hierarchy` - Animated elements respect z-index layers
|
|
61
|
-
|
|
62
|
-
### 2. Timing Functions (HIGH)
|
|
63
|
-
|
|
64
|
-
- `spring-for-gestures` - Gesture-driven motion (drag, flick) must use springs
|
|
65
|
-
- `spring-for-interruptible` - Interruptible motion must use springs
|
|
66
|
-
- `spring-preserves-velocity` - Springs preserve input energy on release
|
|
67
|
-
- `spring-params-balanced` - Avoid excessive oscillation in spring params
|
|
68
|
-
- `easing-for-state-change` - System state changes use easing curves
|
|
69
|
-
- `easing-entrance-ease-out` - Entrances use ease-out
|
|
70
|
-
- `easing-exit-ease-in` - Exits use ease-in
|
|
71
|
-
- `easing-transition-ease-in-out` - View transitions use ease-in-out
|
|
72
|
-
- `easing-linear-only-progress` - Linear only for progress/time representation
|
|
73
|
-
- `duration-press-hover` - Press/hover: 120-180ms
|
|
74
|
-
- `duration-small-state` - Small state changes: 180-260ms
|
|
75
|
-
- `duration-max-300ms` - User-initiated max 300ms
|
|
76
|
-
- `duration-shorten-before-curve` - Fix slow feel with shorter duration, not curve
|
|
77
|
-
- `none-high-frequency` - No animation for high-frequency interactions
|
|
78
|
-
- `none-keyboard-navigation` - Keyboard navigation instant, no animation
|
|
79
|
-
- `none-context-menu-entrance` - Context menus: no entrance, exit only
|
|
80
|
-
|
|
81
|
-
### 3. Exit Animations (HIGH)
|
|
82
|
-
|
|
83
|
-
- `exit-requires-wrapper` - Conditional motion elements need AnimatePresence wrapper
|
|
84
|
-
- `exit-prop-required` - Elements in AnimatePresence need exit prop
|
|
85
|
-
- `exit-key-required` - Dynamic lists need unique keys, not index
|
|
86
|
-
- `exit-matches-initial` - Exit mirrors initial for symmetry
|
|
87
|
-
- `presence-hook-in-child` - useIsPresent in child, not parent
|
|
88
|
-
- `presence-safe-to-remove` - Call safeToRemove after async cleanup
|
|
89
|
-
- `presence-disable-interactions` - Disable interactions on exiting elements
|
|
90
|
-
- `mode-wait-doubles-duration` - Mode "wait" doubles duration; halve timing
|
|
91
|
-
- `mode-sync-layout-conflict` - Mode "sync" causes layout conflicts
|
|
92
|
-
- `mode-pop-layout-for-lists` - Use popLayout for list reordering
|
|
93
|
-
- `nested-propagate-required` - Nested AnimatePresence needs propagate prop
|
|
94
|
-
- `nested-consistent-timing` - Coordinate parent-child exit durations
|
|
95
|
-
|
|
96
|
-
### 4. CSS Pseudo Elements (MEDIUM)
|
|
97
|
-
|
|
98
|
-
- `pseudo-content-required` - ::before/::after need content property
|
|
99
|
-
- `pseudo-over-dom-node` - Pseudo-elements over extra DOM nodes for decoration
|
|
100
|
-
- `pseudo-position-relative-parent` - Parent needs position: relative
|
|
101
|
-
- `pseudo-z-index-layering` - Z-index for correct pseudo-element layering
|
|
102
|
-
- `pseudo-hit-target-expansion` - Negative inset for larger hit targets
|
|
103
|
-
- `pseudo-marker-styling` - Use ::marker for custom list bullet styles
|
|
104
|
-
- `pseudo-first-line-styling` - Use ::first-line for typographic treatments
|
|
105
|
-
- `transition-name-required` - View transitions need view-transition-name
|
|
106
|
-
- `transition-name-unique` - Each transition name unique during transition
|
|
107
|
-
- `transition-name-cleanup` - Remove transition name after completion
|
|
108
|
-
- `transition-over-js-library` - Prefer View Transitions API over JS libraries
|
|
109
|
-
- `transition-style-pseudo-elements` - Style ::view-transition-group for custom animations
|
|
110
|
-
- `native-backdrop-styling` - Use ::backdrop for dialog backgrounds
|
|
111
|
-
- `native-placeholder-styling` - Use ::placeholder for input styling
|
|
112
|
-
- `native-selection-styling` - Use ::selection for text selection styling
|
|
113
|
-
|
|
114
|
-
### 5. Audio Feedback (MEDIUM)
|
|
115
|
-
|
|
116
|
-
- `a11y-visual-equivalent` - Every sound must have a visual equivalent
|
|
117
|
-
- `a11y-toggle-setting` - Provide toggle to disable sounds
|
|
118
|
-
- `a11y-reduced-motion-check` - Respect prefers-reduced-motion for sound
|
|
119
|
-
- `a11y-volume-control` - Allow independent volume adjustment
|
|
120
|
-
- `appropriate-no-high-frequency` - No sound on typing or keyboard nav
|
|
121
|
-
- `appropriate-confirmations-only` - Sound for payments, uploads, submissions
|
|
122
|
-
- `appropriate-errors-warnings` - Sound for errors that can't be overlooked
|
|
123
|
-
- `appropriate-no-decorative` - No sound on hover or decorative moments
|
|
124
|
-
- `appropriate-no-punishing` - Inform, don't punish with harsh sounds
|
|
125
|
-
- `impl-preload-audio` - Preload audio files to avoid delay
|
|
126
|
-
- `impl-default-subtle` - Default volume subtle (0.3), not loud
|
|
127
|
-
- `impl-reset-current-time` - Reset currentTime before replay
|
|
128
|
-
- `weight-match-action` - Sound weight matches action importance
|
|
129
|
-
- `weight-duration-matches-action` - Sound duration matches action duration
|
|
130
|
-
|
|
131
|
-
### 6. Sound Synthesis (MEDIUM)
|
|
132
|
-
|
|
133
|
-
- `context-reuse-single` - Reuse single AudioContext, don't create per sound
|
|
134
|
-
- `context-resume-suspended` - Resume suspended AudioContext before playing
|
|
135
|
-
- `context-cleanup-nodes` - Disconnect audio nodes after playback
|
|
136
|
-
- `envelope-exponential-decay` - Exponential ramps for natural decay
|
|
137
|
-
- `envelope-no-zero-target` - Exponential ramps target 0.001, not 0
|
|
138
|
-
- `envelope-set-initial-value` - Set initial value before ramping
|
|
139
|
-
- `design-noise-for-percussion` - Filtered noise for clicks/taps
|
|
140
|
-
- `design-oscillator-for-tonal` - Oscillators with pitch sweep for tonal sounds
|
|
141
|
-
- `design-filter-for-character` - Bandpass filter to shape percussive sounds
|
|
142
|
-
- `param-click-duration` - Click sounds: 5-15ms duration
|
|
143
|
-
- `param-filter-frequency-range` - Click filter: 3000-6000Hz
|
|
144
|
-
- `param-reasonable-gain` - Gain under 1.0 to prevent clipping
|
|
145
|
-
- `param-q-value-range` - Filter Q: 2-5 for focused but natural
|
|
146
|
-
|
|
147
|
-
### 7. Morphing Icons (LOW)
|
|
148
|
-
|
|
149
|
-
- `morphing-three-lines` - Every icon uses exactly 3 SVG lines
|
|
150
|
-
- `morphing-use-collapsed` - Unused lines use collapsed constant
|
|
151
|
-
- `morphing-consistent-viewbox` - All icons share same viewBox (14x14)
|
|
152
|
-
- `morphing-group-variants` - Rotational variants share group and base lines
|
|
153
|
-
- `morphing-spring-rotation` - Spring physics for grouped icon rotation
|
|
154
|
-
- `morphing-reduced-motion` - Respect prefers-reduced-motion
|
|
155
|
-
- `morphing-jump-non-grouped` - Instant rotation jump between non-grouped icons
|
|
156
|
-
- `morphing-strokelinecap-round` - Round stroke line caps
|
|
157
|
-
- `morphing-aria-hidden` - Icon SVGs are aria-hidden
|
|
158
|
-
|
|
159
|
-
### 8. Container Animation (MEDIUM)
|
|
160
|
-
|
|
161
|
-
- `container-two-div-pattern` - Outer animated div, inner measured div; never same element
|
|
162
|
-
- `container-guard-initial-zero` - Guard bounds === 0 on initial render, fall back to "auto"
|
|
163
|
-
- `container-use-resize-observer` - Use ResizeObserver for measurement, not getBoundingClientRect
|
|
164
|
-
- `container-overflow-hidden` - Set overflow: hidden on animated container during transitions
|
|
165
|
-
- `container-no-excessive-use` - Use sparingly: buttons, accordions, interactive elements
|
|
166
|
-
- `container-callback-ref` - Use callback ref (not useRef) for measurement hooks
|
|
167
|
-
- `container-transition-delay` - Add small delay for natural catching-up feel
|
|
168
|
-
|
|
169
|
-
### 9. Laws of UX (HIGH)
|
|
170
|
-
|
|
171
|
-
- `ux-fitts-target-size` - Size interactive targets for easy clicking (min 32px)
|
|
172
|
-
- `ux-fitts-hit-area` - Expand hit areas with invisible padding or pseudo-elements
|
|
173
|
-
- `ux-hicks-minimize-choices` - Minimize choices to reduce decision time
|
|
174
|
-
- `ux-millers-chunking` - Chunk data into groups of 5-9 for scannability
|
|
175
|
-
- `ux-doherty-under-400ms` - Respond within 400ms to feel instant
|
|
176
|
-
- `ux-doherty-perceived-speed` - Fake speed with skeletons, optimistic UI, progress indicators
|
|
177
|
-
- `ux-postels-accept-messy-input` - Accept messy input, output clean data
|
|
178
|
-
- `ux-progressive-disclosure` - Show what matters now, reveal complexity later
|
|
179
|
-
- `ux-jakobs-familiar-patterns` - Use familiar UI patterns users know from other sites
|
|
180
|
-
- `ux-aesthetic-usability` - Visual polish increases perceived usability
|
|
181
|
-
- `ux-proximity-grouping` - Group related elements spatially with tighter spacing
|
|
182
|
-
- `ux-similarity-consistency` - Similar elements should look alike
|
|
183
|
-
- `ux-common-region-boundaries` - Use boundaries to group related content
|
|
184
|
-
- `ux-von-restorff-emphasis` - Make important elements visually distinct
|
|
185
|
-
- `ux-serial-position` - Place key items first or last in sequences
|
|
186
|
-
- `ux-peak-end-finish-strong` - End experiences with clear success states
|
|
187
|
-
- `ux-teslers-complexity` - Move complexity to the system, not the user
|
|
188
|
-
- `ux-goal-gradient-progress` - Show progress toward completion
|
|
189
|
-
- `ux-zeigarnik-show-incomplete` - Show incomplete state to drive completion
|
|
190
|
-
- `ux-pragnanz-simplify` - Simplify complex visuals into clear forms
|
|
191
|
-
- `ux-pareto-prioritize-features` - Prioritize the critical 20% of features
|
|
192
|
-
- `ux-cognitive-load-reduce` - Minimize extraneous cognitive load
|
|
193
|
-
- `ux-uniform-connectedness` - Visually connect related elements with lines or frames
|
|
194
|
-
|
|
195
|
-
### 10. Predictive Prefetching (MEDIUM)
|
|
196
|
-
|
|
197
|
-
- `prefetch-trajectory-over-hover` - Trajectory prediction over hover; reclaims 100-200ms
|
|
198
|
-
- `prefetch-not-everything` - Prefetch by intent, not viewport; avoid wasted bandwidth
|
|
199
|
-
- `prefetch-hit-slop` - Use hitSlop to trigger predictions earlier
|
|
200
|
-
- `prefetch-touch-fallback` - Fall back gracefully on touch devices (no cursor)
|
|
201
|
-
- `prefetch-keyboard-tab` - Prefetch on keyboard navigation when focus approaches
|
|
202
|
-
- `prefetch-use-selectively` - Use predictive prefetching where latency is noticeable
|
|
203
|
-
|
|
204
|
-
### 11. Typography (MEDIUM)
|
|
205
|
-
|
|
206
|
-
- `type-tabular-nums-for-data` - Tabular numbers for columns, dashboards, pricing
|
|
207
|
-
- `type-oldstyle-nums-for-prose` - Oldstyle numbers blend into body text
|
|
208
|
-
- `type-slashed-zero` - Slashed zero in code-adjacent UIs
|
|
209
|
-
- `type-opentype-contextual-alternates` - Keep calt enabled for contextual glyph adjustment
|
|
210
|
-
- `type-disambiguation-stylistic-set` - Enable ss02 to distinguish I/l/1 and 0/O
|
|
211
|
-
- `type-optical-sizing-auto` - Leave font-optical-sizing auto for size-adaptive glyphs
|
|
212
|
-
- `type-antialiased-on-retina` - Antialiased font smoothing on retina displays
|
|
213
|
-
- `type-text-wrap-balance-headings` - text-wrap: balance on headings for even lines
|
|
214
|
-
- `type-underline-offset` - Offset underlines below descenders
|
|
215
|
-
- `type-no-font-synthesis` - Disable font-synthesis to prevent faux bold/italic
|
|
216
|
-
- `type-font-display-swap` - Use font-display: swap to avoid invisible text during load
|
|
217
|
-
- `type-variable-weight-continuous` - Use continuous weight values (100-900) with variable fonts
|
|
218
|
-
- `type-text-wrap-pretty` - text-wrap: pretty for body text to reduce orphans
|
|
219
|
-
- `type-justify-with-hyphens` - Pair text-align: justify with hyphens: auto
|
|
220
|
-
- `type-letter-spacing-uppercase` - Add letter-spacing to uppercase and small-caps text
|
|
221
|
-
- `type-proper-fractions` - Use diagonal-fractions for proper typographic fractions
|
|
222
|
-
|
|
223
|
-
### 12. Visual Design (HIGH)
|
|
224
|
-
|
|
225
|
-
- `visual-concentric-radius` - Inner radius = outer radius minus padding for nested elements
|
|
226
|
-
- `visual-layered-shadows` - Layer multiple shadows for realistic depth
|
|
227
|
-
- `visual-shadow-direction` - All shadows share same offset direction (single light source)
|
|
228
|
-
- `visual-no-pure-black-shadow` - Use neutral colors, not pure black, for shadows
|
|
229
|
-
- `visual-shadow-matches-elevation` - Shadow size indicates elevation in consistent scale
|
|
230
|
-
- `visual-animate-shadow-pseudo` - Animate shadow via pseudo-element opacity for performance
|
|
231
|
-
- `visual-consistent-spacing-scale` - Use a consistent spacing scale, not arbitrary values
|
|
232
|
-
- `visual-border-alpha-colors` - Semi-transparent borders adapt to any background
|
|
233
|
-
- `visual-button-shadow-anatomy` - Six-layer shadow anatomy for polished buttons
|
|
234
|
-
|
|
235
|
-
## How to Use
|
|
236
|
-
|
|
237
|
-
Read individual rule files for detailed explanations and code examples:
|
|
238
|
-
|
|
239
|
-
```
|
|
240
|
-
rules/timing-under-300ms.md
|
|
241
|
-
rules/spring-for-gestures.md
|
|
242
|
-
rules/ux-doherty-under-400ms.md
|
|
243
|
-
rules/type-tabular-nums-for-data.md
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
Each rule file contains:
|
|
247
|
-
- Brief explanation of why it matters
|
|
248
|
-
- Incorrect code example with explanation
|
|
249
|
-
- Correct code example with explanation
|
|
250
|
-
|
|
251
|
-
## Full Compiled Document
|
|
252
|
-
|
|
253
|
-
For the complete guide with all rules expanded: `AGENTS.md`
|