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,247 +0,0 @@
|
|
|
1
|
-
# Surfaces
|
|
2
|
-
|
|
3
|
-
Border radius, optical alignment, shadows, and image outlines.
|
|
4
|
-
|
|
5
|
-
## Concentric Border Radius
|
|
6
|
-
|
|
7
|
-
When nesting rounded elements, the outer radius must equal the inner radius plus the padding between them:
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
outerRadius = innerRadius + padding
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
This rule is most useful when nested surfaces are close together. If padding is larger than `24px`, treat the layers as separate surfaces and choose each radius independently instead of forcing strict concentric math.
|
|
14
|
-
|
|
15
|
-
### Example
|
|
16
|
-
|
|
17
|
-
```css
|
|
18
|
-
/* Good — concentric radii */
|
|
19
|
-
.card {
|
|
20
|
-
border-radius: 20px; /* 12 + 8 */
|
|
21
|
-
padding: 8px;
|
|
22
|
-
}
|
|
23
|
-
.card-inner {
|
|
24
|
-
border-radius: 12px;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/* Bad — same radius on both */
|
|
28
|
-
.card {
|
|
29
|
-
border-radius: 12px;
|
|
30
|
-
padding: 8px;
|
|
31
|
-
}
|
|
32
|
-
.card-inner {
|
|
33
|
-
border-radius: 12px;
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
### Tailwind Example
|
|
38
|
-
|
|
39
|
-
```tsx
|
|
40
|
-
// Good — outer radius accounts for padding
|
|
41
|
-
<div className="rounded-2xl p-2"> {/* 16px radius, 8px padding */}
|
|
42
|
-
<div className="rounded-lg"> {/* 8px radius = 16 - 8 ✓ */}
|
|
43
|
-
...
|
|
44
|
-
</div>
|
|
45
|
-
</div>
|
|
46
|
-
|
|
47
|
-
// Bad — same radius on both
|
|
48
|
-
<div className="rounded-xl p-2">
|
|
49
|
-
<div className="rounded-xl"> {/* same radius, looks off */}
|
|
50
|
-
...
|
|
51
|
-
</div>
|
|
52
|
-
</div>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Mismatched border radii on nested elements is one of the most common things that makes interfaces feel off. Always calculate concentrically.
|
|
56
|
-
|
|
57
|
-
## Optical Alignment
|
|
58
|
-
|
|
59
|
-
When geometric centering looks off, align optically instead.
|
|
60
|
-
|
|
61
|
-
### Buttons with Text + Icon
|
|
62
|
-
|
|
63
|
-
Use slightly less padding on the icon side to make the button feel balanced. A reliable rule of thumb is:
|
|
64
|
-
`icon-side padding = text-side padding - 2px`.
|
|
65
|
-
|
|
66
|
-
```css
|
|
67
|
-
/* Good — less padding on icon side */
|
|
68
|
-
.button-with-icon {
|
|
69
|
-
padding-left: 16px;
|
|
70
|
-
padding-right: 14px; /* icon side = text side - 2px */
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/* Bad — equal padding looks like icon is pushed too far right */
|
|
74
|
-
.button-with-icon {
|
|
75
|
-
padding: 0 16px;
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
```tsx
|
|
80
|
-
// Tailwind
|
|
81
|
-
<button className="pl-4 pr-3.5 flex items-center gap-2">
|
|
82
|
-
<span>Continue</span>
|
|
83
|
-
<ArrowRightIcon />
|
|
84
|
-
</button>
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Play Button Triangles
|
|
88
|
-
|
|
89
|
-
Play icons are triangular and their geometric center is not their visual center. Shift slightly right:
|
|
90
|
-
|
|
91
|
-
```css
|
|
92
|
-
/* Good — optically centered */
|
|
93
|
-
.play-button svg {
|
|
94
|
-
margin-left: 2px; /* shift right to account for triangle shape */
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* Bad — geometrically centered but looks off */
|
|
98
|
-
.play-button svg {
|
|
99
|
-
/* no adjustment */
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### Asymmetric Icons (Stars, Arrows, Carets)
|
|
104
|
-
|
|
105
|
-
Some icons have uneven visual weight. The best fix is adjusting the SVG directly so no extra margin/padding is needed in the component code.
|
|
106
|
-
|
|
107
|
-
```tsx
|
|
108
|
-
// Best — fix in the SVG itself
|
|
109
|
-
// Adjust the viewBox or path to visually center the icon
|
|
110
|
-
|
|
111
|
-
// Fallback — adjust with margin
|
|
112
|
-
<span className="ml-px">
|
|
113
|
-
<StarIcon />
|
|
114
|
-
</span>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Shadows Instead of Borders
|
|
118
|
-
|
|
119
|
-
For **buttons, cards, and containers** that use a border for depth or elevation, prefer replacing it with a subtle `box-shadow`. Shadows adapt to any background since they use transparency; solid borders don't. This also helps when using images or multiple colors as backgrounds — solid border colors don't work well on backgrounds other than the ones they were designed for.
|
|
120
|
-
|
|
121
|
-
**Do not apply this to dividers** (`border-b`, `border-t`, side borders) or any border whose purpose is layout separation rather than element depth. Those should stay as borders.
|
|
122
|
-
|
|
123
|
-
### Shadow as Border (Light Mode)
|
|
124
|
-
|
|
125
|
-
The shadow is comprised of three layers. The first acts as a 1px border ring, the second adds subtle lift, and the third provides ambient depth:
|
|
126
|
-
|
|
127
|
-
```css
|
|
128
|
-
:root {
|
|
129
|
-
--shadow-border:
|
|
130
|
-
0px 0px 0px 1px rgba(0, 0, 0, 0.06),
|
|
131
|
-
0px 1px 2px -1px rgba(0, 0, 0, 0.06),
|
|
132
|
-
0px 2px 4px 0px rgba(0, 0, 0, 0.04);
|
|
133
|
-
--shadow-border-hover:
|
|
134
|
-
0px 0px 0px 1px rgba(0, 0, 0, 0.08),
|
|
135
|
-
0px 1px 2px -1px rgba(0, 0, 0, 0.08),
|
|
136
|
-
0px 2px 4px 0px rgba(0, 0, 0, 0.06);
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Shadow as Border (Dark Mode)
|
|
141
|
-
|
|
142
|
-
In dark mode, simplify to a single white ring — layered depth shadows aren't visible on dark backgrounds:
|
|
143
|
-
|
|
144
|
-
```css
|
|
145
|
-
/* Dark mode — adapt to whatever setup the project uses
|
|
146
|
-
(prefers-color-scheme, class, data attribute, etc.) */
|
|
147
|
-
--shadow-border: 0 0 0 1px rgba(255, 255, 255, 0.08);
|
|
148
|
-
--shadow-border-hover: 0 0 0 1px rgba(255, 255, 255, 0.13);
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
### Usage with Hover Transition
|
|
152
|
-
|
|
153
|
-
Apply the variable and add `transition-[box-shadow]` for a smooth hover:
|
|
154
|
-
|
|
155
|
-
```css
|
|
156
|
-
.card {
|
|
157
|
-
box-shadow: var(--shadow-border);
|
|
158
|
-
transition-property: box-shadow;
|
|
159
|
-
transition-duration: 150ms;
|
|
160
|
-
transition-timing-function: ease-out;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
.card:hover {
|
|
164
|
-
box-shadow: var(--shadow-border-hover);
|
|
165
|
-
}
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### When to Use Shadows vs. Borders
|
|
169
|
-
|
|
170
|
-
| Use shadows | Use borders |
|
|
171
|
-
| --- | --- |
|
|
172
|
-
| Cards, containers with depth | Dividers between list items |
|
|
173
|
-
| Buttons with bordered styles | Table cell boundaries |
|
|
174
|
-
| Elevated elements (dropdowns, modals) | Form input outlines (for accessibility) |
|
|
175
|
-
| Elements on varied backgrounds | Hairline separators in dense UI |
|
|
176
|
-
| Hover/focus states for lift effect | |
|
|
177
|
-
|
|
178
|
-
## Image Outlines
|
|
179
|
-
|
|
180
|
-
Add a subtle `1px` outline with low opacity to images. This creates consistent depth, especially in design systems where other elements use borders or shadows.
|
|
181
|
-
|
|
182
|
-
### Light Mode
|
|
183
|
-
|
|
184
|
-
```css
|
|
185
|
-
img {
|
|
186
|
-
outline: 1px solid rgba(0, 0, 0, 0.1);
|
|
187
|
-
outline-offset: -1px; /* inset so it doesn't add to layout */
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Dark Mode
|
|
192
|
-
|
|
193
|
-
```css
|
|
194
|
-
img {
|
|
195
|
-
outline: 1px solid rgba(255, 255, 255, 0.1);
|
|
196
|
-
outline-offset: -1px;
|
|
197
|
-
}
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Tailwind with Dark Mode
|
|
201
|
-
|
|
202
|
-
```tsx
|
|
203
|
-
<img
|
|
204
|
-
className="outline outline-1 -outline-offset-1 outline-black/10 dark:outline-white/10"
|
|
205
|
-
src={src}
|
|
206
|
-
alt={alt}
|
|
207
|
-
/>
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
**Why outline instead of border?** `outline` doesn't affect layout (no added width/height), and `outline-offset: -1px` keeps it inset so images stay their intended size.
|
|
211
|
-
|
|
212
|
-
## Minimum Hit Area
|
|
213
|
-
|
|
214
|
-
Interactive elements should have a minimum hit area of 44×44px (WCAG) or at least 40×40px. If the visible element is smaller (e.g., a 20×20 checkbox), extend the hit area with a pseudo-element.
|
|
215
|
-
|
|
216
|
-
### CSS Example
|
|
217
|
-
|
|
218
|
-
```css
|
|
219
|
-
/* Small checkbox with expanded hit area */
|
|
220
|
-
.checkbox {
|
|
221
|
-
position: relative;
|
|
222
|
-
width: 20px;
|
|
223
|
-
height: 20px;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
.checkbox::after {
|
|
227
|
-
content: "";
|
|
228
|
-
position: absolute;
|
|
229
|
-
top: 50%;
|
|
230
|
-
left: 50%;
|
|
231
|
-
transform: translate(-50%, -50%);
|
|
232
|
-
width: 40px;
|
|
233
|
-
height: 40px;
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Tailwind Example
|
|
238
|
-
|
|
239
|
-
```tsx
|
|
240
|
-
<button className="relative size-5 after:absolute after:top-1/2 after:left-1/2 after:size-10 after:-translate-1/2">
|
|
241
|
-
<CheckIcon />
|
|
242
|
-
</button>
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### Collision Rule
|
|
246
|
-
|
|
247
|
-
If the extended hit area overlaps another interactive element, shrink the pseudo-element — but make it as large as possible without colliding. Two interactive elements should never have overlapping hit areas.
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# Typography
|
|
2
|
-
|
|
3
|
-
Typography rendering details that make interfaces feel better.
|
|
4
|
-
|
|
5
|
-
## Text Wrapping
|
|
6
|
-
|
|
7
|
-
### text-wrap: balance
|
|
8
|
-
|
|
9
|
-
Distributes text evenly across lines, preventing orphaned words on headings and short text blocks. **Only works on blocks of 6 lines or fewer** (Chromium) or 10 lines or fewer (Firefox) — the balancing algorithm is computationally expensive, so browsers limit it to short text.
|
|
10
|
-
|
|
11
|
-
```css
|
|
12
|
-
/* Good — even line lengths on short text */
|
|
13
|
-
h1, h2, h3 {
|
|
14
|
-
text-wrap: balance;
|
|
15
|
-
}
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
```css
|
|
19
|
-
/* Bad — default wrapping leaves orphans */
|
|
20
|
-
h1 {
|
|
21
|
-
/* no text-wrap rule → "Read our
|
|
22
|
-
blog" instead of balanced lines */
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
```css
|
|
27
|
-
/* Bad — balance on long paragraphs (silently ignored, wastes intent) */
|
|
28
|
-
.article-body p {
|
|
29
|
-
text-wrap: balance;
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
**Tailwind:** `text-balance`
|
|
34
|
-
|
|
35
|
-
### text-wrap: pretty
|
|
36
|
-
|
|
37
|
-
Optimizes the last line to avoid orphans using a slower algorithm that favors better typography over performance. Unlike `balance`, it works on longer text — use this for body copy where you want to minimize orphans without the 6-line limit.
|
|
38
|
-
|
|
39
|
-
```css
|
|
40
|
-
p {
|
|
41
|
-
text-wrap: pretty;
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### When to Use Which
|
|
46
|
-
|
|
47
|
-
| Scenario | Use |
|
|
48
|
-
| --- | --- |
|
|
49
|
-
| Headings, titles, short text (≤6 lines) | `text-wrap: balance` |
|
|
50
|
-
| Body paragraphs, descriptions | `text-wrap: pretty` |
|
|
51
|
-
| Code blocks, pre-formatted text | Neither — leave default |
|
|
52
|
-
|
|
53
|
-
## Font Smoothing (macOS)
|
|
54
|
-
|
|
55
|
-
On macOS, text renders heavier than intended by default. Apply antialiased smoothing to the root layout so all text renders crisper and thinner.
|
|
56
|
-
|
|
57
|
-
```css
|
|
58
|
-
/* CSS */
|
|
59
|
-
html {
|
|
60
|
-
-webkit-font-smoothing: antialiased;
|
|
61
|
-
-moz-osx-font-smoothing: grayscale;
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
```tsx
|
|
66
|
-
// Tailwind — apply to root layout
|
|
67
|
-
<html className="antialiased">
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Good vs. Bad
|
|
71
|
-
|
|
72
|
-
```css
|
|
73
|
-
/* Good — applied once at the root */
|
|
74
|
-
html {
|
|
75
|
-
-webkit-font-smoothing: antialiased;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* Bad — applied per-element, inconsistent */
|
|
79
|
-
.heading {
|
|
80
|
-
-webkit-font-smoothing: antialiased;
|
|
81
|
-
}
|
|
82
|
-
.body {
|
|
83
|
-
/* no smoothing → heavier than heading */
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**Note:** This only affects macOS rendering. Other platforms ignore these properties, so it's safe to apply universally.
|
|
88
|
-
|
|
89
|
-
## Tabular Numbers
|
|
90
|
-
|
|
91
|
-
When numbers update dynamically (counters, prices, timers, table columns), use tabular-nums to make all digits equal width. This prevents layout shift as values change.
|
|
92
|
-
|
|
93
|
-
```css
|
|
94
|
-
/* CSS */
|
|
95
|
-
.counter {
|
|
96
|
-
font-variant-numeric: tabular-nums;
|
|
97
|
-
}
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
```tsx
|
|
101
|
-
// Tailwind
|
|
102
|
-
<span className="tabular-nums">{count}</span>
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### When to Use
|
|
106
|
-
|
|
107
|
-
| Use tabular-nums | Don't use tabular-nums |
|
|
108
|
-
| --- | --- |
|
|
109
|
-
| Counters and timers | Static display numbers |
|
|
110
|
-
| Prices that update | Decorative large numbers |
|
|
111
|
-
| Table columns with numbers | Phone numbers, zip codes |
|
|
112
|
-
| Animated number transitions | Version numbers (v2.1.0) |
|
|
113
|
-
| Scoreboards, dashboards | |
|
|
114
|
-
|
|
115
|
-
### Caveat
|
|
116
|
-
|
|
117
|
-
Some fonts (like Inter) change the visual appearance of numerals with this property — specifically, the digit `1` becomes wider and centered. This is expected behavior and usually desirable for alignment, but verify it looks right in your specific font.
|
|
118
|
-
|
|
119
|
-
```css
|
|
120
|
-
/* With Inter font:
|
|
121
|
-
Default: 1234 → proportional, "1" is narrow
|
|
122
|
-
Tabular: 1234 → all digits equal width, "1" centered */
|
|
123
|
-
```
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# React Best Practices
|
|
2
|
-
|
|
3
|
-
A structured repository for creating and maintaining React Best Practices optimized for agents and LLMs.
|
|
4
|
-
|
|
5
|
-
## Structure
|
|
6
|
-
|
|
7
|
-
- `rules/` - Individual rule files (one per rule)
|
|
8
|
-
- `_sections.md` - Section metadata (titles, impacts, descriptions)
|
|
9
|
-
- `_template.md` - Template for creating new rules
|
|
10
|
-
- `area-description.md` - Individual rule files
|
|
11
|
-
- `src/` - Build scripts and utilities
|
|
12
|
-
- `metadata.json` - Document metadata (version, organization, abstract)
|
|
13
|
-
- __`AGENTS.md`__ - Compiled output (generated)
|
|
14
|
-
- __`test-cases.json`__ - Test cases for LLM evaluation (generated)
|
|
15
|
-
|
|
16
|
-
## Getting Started
|
|
17
|
-
|
|
18
|
-
1. Install dependencies:
|
|
19
|
-
```bash
|
|
20
|
-
pnpm install
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
2. Build AGENTS.md from rules:
|
|
24
|
-
```bash
|
|
25
|
-
pnpm build
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
3. Validate rule files:
|
|
29
|
-
```bash
|
|
30
|
-
pnpm validate
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
4. Extract test cases:
|
|
34
|
-
```bash
|
|
35
|
-
pnpm extract-tests
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## Creating a New Rule
|
|
39
|
-
|
|
40
|
-
1. Copy `rules/_template.md` to `rules/area-description.md`
|
|
41
|
-
2. Choose the appropriate area prefix:
|
|
42
|
-
- `async-` for Eliminating Waterfalls (Section 1)
|
|
43
|
-
- `bundle-` for Bundle Size Optimization (Section 2)
|
|
44
|
-
- `server-` for Server-Side Performance (Section 3)
|
|
45
|
-
- `client-` for Client-Side Data Fetching (Section 4)
|
|
46
|
-
- `rerender-` for Re-render Optimization (Section 5)
|
|
47
|
-
- `rendering-` for Rendering Performance (Section 6)
|
|
48
|
-
- `js-` for JavaScript Performance (Section 7)
|
|
49
|
-
- `advanced-` for Advanced Patterns (Section 8)
|
|
50
|
-
3. Fill in the frontmatter and content
|
|
51
|
-
4. Ensure you have clear examples with explanations
|
|
52
|
-
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json
|
|
53
|
-
|
|
54
|
-
## Rule File Structure
|
|
55
|
-
|
|
56
|
-
Each rule file should follow this structure:
|
|
57
|
-
|
|
58
|
-
```markdown
|
|
59
|
-
---
|
|
60
|
-
title: Rule Title Here
|
|
61
|
-
impact: MEDIUM
|
|
62
|
-
impactDescription: Optional description
|
|
63
|
-
tags: tag1, tag2, tag3
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Rule Title Here
|
|
67
|
-
|
|
68
|
-
Brief explanation of the rule and why it matters.
|
|
69
|
-
|
|
70
|
-
**Incorrect (description of what's wrong):**
|
|
71
|
-
|
|
72
|
-
```typescript
|
|
73
|
-
// Bad code example
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**Correct (description of what's right):**
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
// Good code example
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Optional explanatory text after examples.
|
|
83
|
-
|
|
84
|
-
Reference: [Link](https://example.com)
|
|
85
|
-
|
|
86
|
-
## File Naming Convention
|
|
87
|
-
|
|
88
|
-
- Files starting with `_` are special (excluded from build)
|
|
89
|
-
- Rule files: `area-description.md` (e.g., `async-parallel.md`)
|
|
90
|
-
- Section is automatically inferred from filename prefix
|
|
91
|
-
- Rules are sorted alphabetically by title within each section
|
|
92
|
-
- IDs (e.g., 1.1, 1.2) are auto-generated during build
|
|
93
|
-
|
|
94
|
-
## Impact Levels
|
|
95
|
-
|
|
96
|
-
- `CRITICAL` - Highest priority, major performance gains
|
|
97
|
-
- `HIGH` - Significant performance improvements
|
|
98
|
-
- `MEDIUM-HIGH` - Moderate-high gains
|
|
99
|
-
- `MEDIUM` - Moderate performance improvements
|
|
100
|
-
- `LOW-MEDIUM` - Low-medium gains
|
|
101
|
-
- `LOW` - Incremental improvements
|
|
102
|
-
|
|
103
|
-
## Scripts
|
|
104
|
-
|
|
105
|
-
- `pnpm build` - Compile rules into AGENTS.md
|
|
106
|
-
- `pnpm validate` - Validate all rule files
|
|
107
|
-
- `pnpm extract-tests` - Extract test cases for LLM evaluation
|
|
108
|
-
- `pnpm dev` - Build and validate
|
|
109
|
-
|
|
110
|
-
## Contributing
|
|
111
|
-
|
|
112
|
-
When adding or modifying rules:
|
|
113
|
-
|
|
114
|
-
1. Use the correct filename prefix for your section
|
|
115
|
-
2. Follow the `_template.md` structure
|
|
116
|
-
3. Include clear bad/good examples with explanations
|
|
117
|
-
4. Add appropriate tags
|
|
118
|
-
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json
|
|
119
|
-
6. Rules are automatically sorted by title - no need to manage numbers!
|
|
120
|
-
|
|
121
|
-
## Acknowledgments
|
|
122
|
-
|
|
123
|
-
Originally created by [@shuding](https://x.com/shuding) at [Vercel](https://vercel.com).
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: react-best-practices
|
|
3
|
-
description: React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
|
|
4
|
-
license: MIT
|
|
5
|
-
metadata:
|
|
6
|
-
author: vercel
|
|
7
|
-
version: "1.0.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Vercel React Best Practices
|
|
11
|
-
|
|
12
|
-
Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 57 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.
|
|
13
|
-
|
|
14
|
-
## When to Apply
|
|
15
|
-
|
|
16
|
-
Reference these guidelines when:
|
|
17
|
-
- Writing new React components or Next.js pages
|
|
18
|
-
- Implementing data fetching (client or server-side)
|
|
19
|
-
- Reviewing code for performance issues
|
|
20
|
-
- Refactoring existing React/Next.js code
|
|
21
|
-
- Optimizing bundle size or load times
|
|
22
|
-
|
|
23
|
-
## Rule Categories by Priority
|
|
24
|
-
|
|
25
|
-
| Priority | Category | Impact | Prefix |
|
|
26
|
-
|----------|----------|--------|--------|
|
|
27
|
-
| 1 | Eliminating Waterfalls | CRITICAL | `async-` |
|
|
28
|
-
| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |
|
|
29
|
-
| 3 | Server-Side Performance | HIGH | `server-` |
|
|
30
|
-
| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |
|
|
31
|
-
| 5 | Re-render Optimization | MEDIUM | `rerender-` |
|
|
32
|
-
| 6 | Rendering Performance | MEDIUM | `rendering-` |
|
|
33
|
-
| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |
|
|
34
|
-
| 8 | Advanced Patterns | LOW | `advanced-` |
|
|
35
|
-
|
|
36
|
-
## Quick Reference
|
|
37
|
-
|
|
38
|
-
### 1. Eliminating Waterfalls (CRITICAL)
|
|
39
|
-
|
|
40
|
-
- `async-defer-await` - Move await into branches where actually used
|
|
41
|
-
- `async-parallel` - Use Promise.all() for independent operations
|
|
42
|
-
- `async-dependencies` - Use better-all for partial dependencies
|
|
43
|
-
- `async-api-routes` - Start promises early, await late in API routes
|
|
44
|
-
- `async-suspense-boundaries` - Use Suspense to stream content
|
|
45
|
-
|
|
46
|
-
### 2. Bundle Size Optimization (CRITICAL)
|
|
47
|
-
|
|
48
|
-
- `bundle-barrel-imports` - Import directly, avoid barrel files
|
|
49
|
-
- `bundle-dynamic-imports` - Use next/dynamic for heavy components
|
|
50
|
-
- `bundle-defer-third-party` - Load analytics/logging after hydration
|
|
51
|
-
- `bundle-conditional` - Load modules only when feature is activated
|
|
52
|
-
- `bundle-preload` - Preload on hover/focus for perceived speed
|
|
53
|
-
|
|
54
|
-
### 3. Server-Side Performance (HIGH)
|
|
55
|
-
|
|
56
|
-
- `server-auth-actions` - Authenticate server actions like API routes
|
|
57
|
-
- `server-cache-react` - Use React.cache() for per-request deduplication
|
|
58
|
-
- `server-cache-lru` - Use LRU cache for cross-request caching
|
|
59
|
-
- `server-dedup-props` - Avoid duplicate serialization in RSC props
|
|
60
|
-
- `server-serialization` - Minimize data passed to client components
|
|
61
|
-
- `server-parallel-fetching` - Restructure components to parallelize fetches
|
|
62
|
-
- `server-after-nonblocking` - Use after() for non-blocking operations
|
|
63
|
-
|
|
64
|
-
### 4. Client-Side Data Fetching (MEDIUM-HIGH)
|
|
65
|
-
|
|
66
|
-
- `client-swr-dedup` - Use SWR for automatic request deduplication
|
|
67
|
-
- `client-event-listeners` - Deduplicate global event listeners
|
|
68
|
-
- `client-passive-event-listeners` - Use passive listeners for scroll
|
|
69
|
-
- `client-localstorage-schema` - Version and minimize localStorage data
|
|
70
|
-
|
|
71
|
-
### 5. Re-render Optimization (MEDIUM)
|
|
72
|
-
|
|
73
|
-
- `rerender-defer-reads` - Don't subscribe to state only used in callbacks
|
|
74
|
-
- `rerender-memo` - Extract expensive work into memoized components
|
|
75
|
-
- `rerender-memo-with-default-value` - Hoist default non-primitive props
|
|
76
|
-
- `rerender-dependencies` - Use primitive dependencies in effects
|
|
77
|
-
- `rerender-derived-state` - Subscribe to derived booleans, not raw values
|
|
78
|
-
- `rerender-derived-state-no-effect` - Derive state during render, not effects
|
|
79
|
-
- `rerender-functional-setstate` - Use functional setState for stable callbacks
|
|
80
|
-
- `rerender-lazy-state-init` - Pass function to useState for expensive values
|
|
81
|
-
- `rerender-simple-expression-in-memo` - Avoid memo for simple primitives
|
|
82
|
-
- `rerender-move-effect-to-event` - Put interaction logic in event handlers
|
|
83
|
-
- `rerender-transitions` - Use startTransition for non-urgent updates
|
|
84
|
-
- `rerender-use-ref-transient-values` - Use refs for transient frequent values
|
|
85
|
-
|
|
86
|
-
### 6. Rendering Performance (MEDIUM)
|
|
87
|
-
|
|
88
|
-
- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element
|
|
89
|
-
- `rendering-content-visibility` - Use content-visibility for long lists
|
|
90
|
-
- `rendering-hoist-jsx` - Extract static JSX outside components
|
|
91
|
-
- `rendering-svg-precision` - Reduce SVG coordinate precision
|
|
92
|
-
- `rendering-hydration-no-flicker` - Use inline script for client-only data
|
|
93
|
-
- `rendering-hydration-suppress-warning` - Suppress expected mismatches
|
|
94
|
-
- `rendering-activity` - Use Activity component for show/hide
|
|
95
|
-
- `rendering-conditional-render` - Use ternary, not && for conditionals
|
|
96
|
-
- `rendering-usetransition-loading` - Prefer useTransition for loading state
|
|
97
|
-
|
|
98
|
-
### 7. JavaScript Performance (LOW-MEDIUM)
|
|
99
|
-
|
|
100
|
-
- `js-batch-dom-css` - Group CSS changes via classes or cssText
|
|
101
|
-
- `js-index-maps` - Build Map for repeated lookups
|
|
102
|
-
- `js-cache-property-access` - Cache object properties in loops
|
|
103
|
-
- `js-cache-function-results` - Cache function results in module-level Map
|
|
104
|
-
- `js-cache-storage` - Cache localStorage/sessionStorage reads
|
|
105
|
-
- `js-combine-iterations` - Combine multiple filter/map into one loop
|
|
106
|
-
- `js-length-check-first` - Check array length before expensive comparison
|
|
107
|
-
- `js-early-exit` - Return early from functions
|
|
108
|
-
- `js-hoist-regexp` - Hoist RegExp creation outside loops
|
|
109
|
-
- `js-min-max-loop` - Use loop for min/max instead of sort
|
|
110
|
-
- `js-set-map-lookups` - Use Set/Map for O(1) lookups
|
|
111
|
-
- `js-tosorted-immutable` - Use toSorted() for immutability
|
|
112
|
-
|
|
113
|
-
### 8. Advanced Patterns (LOW)
|
|
114
|
-
|
|
115
|
-
- `advanced-event-handler-refs` - Store event handlers in refs
|
|
116
|
-
- `advanced-init-once` - Initialize app once per app load
|
|
117
|
-
- `advanced-use-latest` - useLatest for stable callback refs
|
|
118
|
-
|
|
119
|
-
## How to Use
|
|
120
|
-
|
|
121
|
-
Read individual rule files for detailed explanations and code examples:
|
|
122
|
-
|
|
123
|
-
```
|
|
124
|
-
rules/async-parallel.md
|
|
125
|
-
rules/bundle-barrel-imports.md
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Each rule file contains:
|
|
129
|
-
- Brief explanation of why it matters
|
|
130
|
-
- Incorrect code example with explanation
|
|
131
|
-
- Correct code example with explanation
|
|
132
|
-
- Additional context and references
|
|
133
|
-
|
|
134
|
-
## Full Compiled Document
|
|
135
|
-
|
|
136
|
-
For the complete guide with all rules expanded: `AGENTS.md`
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "1.0.0",
|
|
3
|
-
"organization": "Vercel Engineering",
|
|
4
|
-
"date": "January 2026",
|
|
5
|
-
"abstract": "Comprehensive performance optimization guide for React and Next.js applications, designed for AI agents and LLMs. Contains 40+ rules across 8 categories, prioritized by impact from critical (eliminating waterfalls, reducing bundle size) to incremental (advanced patterns). Each rule includes detailed explanations, real-world examples comparing incorrect vs. correct implementations, and specific impact metrics to guide automated refactoring and code generation.",
|
|
6
|
-
"references": [
|
|
7
|
-
"https://react.dev",
|
|
8
|
-
"https://nextjs.org",
|
|
9
|
-
"https://swr.vercel.app",
|
|
10
|
-
"https://github.com/shuding/better-all",
|
|
11
|
-
"https://github.com/isaacs/node-lru-cache",
|
|
12
|
-
"https://vercel.com/blog/how-we-optimized-package-imports-in-next-js",
|
|
13
|
-
"https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
# Sections
|
|
2
|
-
|
|
3
|
-
This file defines all sections, their ordering, impact levels, and descriptions.
|
|
4
|
-
The section ID (in parentheses) is the filename prefix used to group rules.
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 1. Eliminating Waterfalls (async)
|
|
9
|
-
|
|
10
|
-
**Impact:** CRITICAL
|
|
11
|
-
**Description:** Waterfalls are the #1 performance killer. Each sequential await adds full network latency. Eliminating them yields the largest gains.
|
|
12
|
-
|
|
13
|
-
## 2. Bundle Size Optimization (bundle)
|
|
14
|
-
|
|
15
|
-
**Impact:** CRITICAL
|
|
16
|
-
**Description:** Reducing initial bundle size improves Time to Interactive and Largest Contentful Paint.
|
|
17
|
-
|
|
18
|
-
## 3. Server-Side Performance (server)
|
|
19
|
-
|
|
20
|
-
**Impact:** HIGH
|
|
21
|
-
**Description:** Optimizing server-side rendering and data fetching eliminates server-side waterfalls and reduces response times.
|
|
22
|
-
|
|
23
|
-
## 4. Client-Side Data Fetching (client)
|
|
24
|
-
|
|
25
|
-
**Impact:** MEDIUM-HIGH
|
|
26
|
-
**Description:** Automatic deduplication and efficient data fetching patterns reduce redundant network requests.
|
|
27
|
-
|
|
28
|
-
## 5. Re-render Optimization (rerender)
|
|
29
|
-
|
|
30
|
-
**Impact:** MEDIUM
|
|
31
|
-
**Description:** Reducing unnecessary re-renders minimizes wasted computation and improves UI responsiveness.
|
|
32
|
-
|
|
33
|
-
## 6. Rendering Performance (rendering)
|
|
34
|
-
|
|
35
|
-
**Impact:** MEDIUM
|
|
36
|
-
**Description:** Optimizing the rendering process reduces the work the browser needs to do.
|
|
37
|
-
|
|
38
|
-
## 7. JavaScript Performance (js)
|
|
39
|
-
|
|
40
|
-
**Impact:** LOW-MEDIUM
|
|
41
|
-
**Description:** Micro-optimizations for hot paths can add up to meaningful improvements.
|
|
42
|
-
|
|
43
|
-
## 8. Advanced Patterns (advanced)
|
|
44
|
-
|
|
45
|
-
**Impact:** LOW
|
|
46
|
-
**Description:** Advanced patterns for specific cases that require careful implementation.
|