lsd-pi 1.1.10 → 1.2.1
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/onboarding.js +3 -3
- package/dist/resources/agents/scout.md +6 -0
- package/dist/resources/extensions/slash-commands/index.js +2 -0
- package/dist/resources/extensions/slash-commands/init.js +47 -0
- package/dist/resources/extensions/slash-commands/plan.js +238 -51
- package/dist/resources/extensions/slash-commands/tools.js +14 -27
- package/dist/resources/extensions/subagent/index.js +14 -11
- package/dist/resources/extensions/usage/index.js +87 -36
- package/package.json +1 -1
- 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 +39 -5
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js +59 -7
- package/packages/pi-coding-agent/dist/core/resource-loader-lsd-md.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resource-loader.js +4 -4
- package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +18 -7
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.test.js +80 -0
- package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +12 -5
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +23 -9
- 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/modes/interactive/components/settings-selector.d.ts +8 -4
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +32 -5
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +34 -25
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.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 +48 -5
- package/packages/pi-coding-agent/src/core/resource-loader-lsd-md.test.ts +67 -7
- package/packages/pi-coding-agent/src/core/resource-loader.ts +4 -4
- package/packages/pi-coding-agent/src/core/sdk.test.ts +100 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +23 -8
- package/packages/pi-coding-agent/src/core/settings-manager.ts +36 -15
- package/packages/pi-coding-agent/src/core/system-prompt.ts +26 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +41 -10
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +11 -0
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +43 -27
- 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/index.ts +2 -0
- package/src/resources/extensions/slash-commands/init.ts +55 -0
- package/src/resources/extensions/slash-commands/plan.ts +279 -53
- package/src/resources/extensions/slash-commands/tools.ts +15 -29
- package/src/resources/extensions/subagent/index.ts +14 -11
- 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,441 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: core-web-vitals
|
|
3
|
-
description: Optimize Core Web Vitals (LCP, INP, CLS) for better page experience and search ranking. Use when asked to "improve Core Web Vitals", "fix LCP", "reduce CLS", "optimize INP", "page experience optimization", or "fix layout shifts".
|
|
4
|
-
license: MIT
|
|
5
|
-
metadata:
|
|
6
|
-
author: web-quality-skills
|
|
7
|
-
version: "1.0"
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
# Core Web Vitals optimization
|
|
11
|
-
|
|
12
|
-
Targeted optimization for the three Core Web Vitals metrics that affect Google Search ranking and user experience.
|
|
13
|
-
|
|
14
|
-
## The three metrics
|
|
15
|
-
|
|
16
|
-
| Metric | Measures | Good | Needs work | Poor |
|
|
17
|
-
|--------|----------|------|------------|------|
|
|
18
|
-
| **LCP** | Loading | ≤ 2.5s | 2.5s – 4s | > 4s |
|
|
19
|
-
| **INP** | Interactivity | ≤ 200ms | 200ms – 500ms | > 500ms |
|
|
20
|
-
| **CLS** | Visual Stability | ≤ 0.1 | 0.1 – 0.25 | > 0.25 |
|
|
21
|
-
|
|
22
|
-
Google measures at the **75th percentile** — 75% of page visits must meet "Good" thresholds.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## LCP: Largest Contentful Paint
|
|
27
|
-
|
|
28
|
-
LCP measures when the largest visible content element renders. Usually this is:
|
|
29
|
-
- Hero image or video
|
|
30
|
-
- Large text block
|
|
31
|
-
- Background image
|
|
32
|
-
- `<svg>` element
|
|
33
|
-
|
|
34
|
-
### Common LCP issues
|
|
35
|
-
|
|
36
|
-
**1. Slow server response (TTFB > 800ms)**
|
|
37
|
-
```
|
|
38
|
-
Fix: CDN, caching, optimized backend, edge rendering
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**2. Render-blocking resources**
|
|
42
|
-
```html
|
|
43
|
-
<!-- ❌ Blocks rendering -->
|
|
44
|
-
<link rel="stylesheet" href="/all-styles.css">
|
|
45
|
-
|
|
46
|
-
<!-- ✅ Critical CSS inlined, rest deferred -->
|
|
47
|
-
<style>/* Critical above-fold CSS */</style>
|
|
48
|
-
<link rel="preload" href="/styles.css" as="style"
|
|
49
|
-
onload="this.onload=null;this.rel='stylesheet'">
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
**3. Slow resource load times**
|
|
53
|
-
```html
|
|
54
|
-
<!-- ❌ No hints, discovered late -->
|
|
55
|
-
<img src="/hero.jpg" alt="Hero">
|
|
56
|
-
|
|
57
|
-
<!-- ✅ Preloaded with high priority -->
|
|
58
|
-
<link rel="preload" href="/hero.webp" as="image" fetchpriority="high">
|
|
59
|
-
<img src="/hero.webp" alt="Hero" fetchpriority="high">
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
**4. Client-side rendering delays**
|
|
63
|
-
```javascript
|
|
64
|
-
// ❌ Content loads after JavaScript
|
|
65
|
-
useEffect(() => {
|
|
66
|
-
fetch('/api/hero-text').then(r => r.json()).then(setHeroText);
|
|
67
|
-
}, []);
|
|
68
|
-
|
|
69
|
-
// ✅ Server-side or static rendering
|
|
70
|
-
// Use SSR, SSG, or streaming to send HTML with content
|
|
71
|
-
export async function getServerSideProps() {
|
|
72
|
-
const heroText = await fetchHeroText();
|
|
73
|
-
return { props: { heroText } };
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### LCP optimization checklist
|
|
78
|
-
|
|
79
|
-
```markdown
|
|
80
|
-
- [ ] TTFB < 800ms (use CDN, edge caching)
|
|
81
|
-
- [ ] LCP image preloaded with fetchpriority="high"
|
|
82
|
-
- [ ] LCP image optimized (WebP/AVIF, correct size)
|
|
83
|
-
- [ ] Critical CSS inlined (< 14KB)
|
|
84
|
-
- [ ] No render-blocking JavaScript in <head>
|
|
85
|
-
- [ ] Fonts don't block text rendering (font-display: swap)
|
|
86
|
-
- [ ] LCP element in initial HTML (not JS-rendered)
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### LCP element identification
|
|
90
|
-
```javascript
|
|
91
|
-
// Find your LCP element
|
|
92
|
-
new PerformanceObserver((list) => {
|
|
93
|
-
const entries = list.getEntries();
|
|
94
|
-
const lastEntry = entries[entries.length - 1];
|
|
95
|
-
console.log('LCP element:', lastEntry.element);
|
|
96
|
-
console.log('LCP time:', lastEntry.startTime);
|
|
97
|
-
}).observe({ type: 'largest-contentful-paint', buffered: true });
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## INP: Interaction to Next Paint
|
|
103
|
-
|
|
104
|
-
INP measures responsiveness across ALL interactions (clicks, taps, key presses) during a page visit. It reports the worst interaction (at 98th percentile for high-traffic pages).
|
|
105
|
-
|
|
106
|
-
### INP breakdown
|
|
107
|
-
|
|
108
|
-
Total INP = **Input Delay** + **Processing Time** + **Presentation Delay**
|
|
109
|
-
|
|
110
|
-
| Phase | Target | Optimization |
|
|
111
|
-
|-------|--------|--------------|
|
|
112
|
-
| Input Delay | < 50ms | Reduce main thread blocking |
|
|
113
|
-
| Processing | < 100ms | Optimize event handlers |
|
|
114
|
-
| Presentation | < 50ms | Minimize rendering work |
|
|
115
|
-
|
|
116
|
-
### Common INP issues
|
|
117
|
-
|
|
118
|
-
**1. Long tasks blocking main thread**
|
|
119
|
-
```javascript
|
|
120
|
-
// ❌ Long synchronous task
|
|
121
|
-
function processLargeArray(items) {
|
|
122
|
-
items.forEach(item => expensiveOperation(item));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// ✅ Break into chunks with yielding
|
|
126
|
-
async function processLargeArray(items) {
|
|
127
|
-
const CHUNK_SIZE = 100;
|
|
128
|
-
for (let i = 0; i < items.length; i += CHUNK_SIZE) {
|
|
129
|
-
const chunk = items.slice(i, i + CHUNK_SIZE);
|
|
130
|
-
chunk.forEach(item => expensiveOperation(item));
|
|
131
|
-
|
|
132
|
-
// Yield to main thread
|
|
133
|
-
await new Promise(r => setTimeout(r, 0));
|
|
134
|
-
// Or use scheduler.yield() when available
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
**2. Heavy event handlers**
|
|
140
|
-
```javascript
|
|
141
|
-
// ❌ All work in handler
|
|
142
|
-
button.addEventListener('click', () => {
|
|
143
|
-
// Heavy computation
|
|
144
|
-
const result = calculateComplexThing();
|
|
145
|
-
// DOM updates
|
|
146
|
-
updateUI(result);
|
|
147
|
-
// Analytics
|
|
148
|
-
trackEvent('click');
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
// ✅ Prioritize visual feedback
|
|
152
|
-
button.addEventListener('click', () => {
|
|
153
|
-
// Immediate visual feedback
|
|
154
|
-
button.classList.add('loading');
|
|
155
|
-
|
|
156
|
-
// Defer non-critical work
|
|
157
|
-
requestAnimationFrame(() => {
|
|
158
|
-
const result = calculateComplexThing();
|
|
159
|
-
updateUI(result);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
// Use requestIdleCallback for analytics
|
|
163
|
-
requestIdleCallback(() => trackEvent('click'));
|
|
164
|
-
});
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
**3. Third-party scripts**
|
|
168
|
-
```javascript
|
|
169
|
-
// ❌ Eagerly loaded, blocks interactions
|
|
170
|
-
<script src="https://heavy-widget.com/widget.js"></script>
|
|
171
|
-
|
|
172
|
-
// ✅ Lazy loaded on interaction or visibility
|
|
173
|
-
const loadWidget = () => {
|
|
174
|
-
import('https://heavy-widget.com/widget.js')
|
|
175
|
-
.then(widget => widget.init());
|
|
176
|
-
};
|
|
177
|
-
button.addEventListener('click', loadWidget, { once: true });
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
**4. Excessive re-renders (React/Vue)**
|
|
181
|
-
```javascript
|
|
182
|
-
// ❌ Re-renders entire tree
|
|
183
|
-
function App() {
|
|
184
|
-
const [count, setCount] = useState(0);
|
|
185
|
-
return (
|
|
186
|
-
<div>
|
|
187
|
-
<Counter count={count} />
|
|
188
|
-
<ExpensiveComponent /> {/* Re-renders on every count change */}
|
|
189
|
-
</div>
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// ✅ Memoized expensive components
|
|
194
|
-
const MemoizedExpensive = React.memo(ExpensiveComponent);
|
|
195
|
-
|
|
196
|
-
function App() {
|
|
197
|
-
const [count, setCount] = useState(0);
|
|
198
|
-
return (
|
|
199
|
-
<div>
|
|
200
|
-
<Counter count={count} />
|
|
201
|
-
<MemoizedExpensive />
|
|
202
|
-
</div>
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
### INP optimization checklist
|
|
208
|
-
|
|
209
|
-
```markdown
|
|
210
|
-
- [ ] No tasks > 50ms on main thread
|
|
211
|
-
- [ ] Event handlers complete quickly (< 100ms)
|
|
212
|
-
- [ ] Visual feedback provided immediately
|
|
213
|
-
- [ ] Heavy work deferred with requestIdleCallback
|
|
214
|
-
- [ ] Third-party scripts don't block interactions
|
|
215
|
-
- [ ] Debounced input handlers where appropriate
|
|
216
|
-
- [ ] Web Workers for CPU-intensive operations
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
### INP debugging
|
|
220
|
-
```javascript
|
|
221
|
-
// Identify slow interactions
|
|
222
|
-
new PerformanceObserver((list) => {
|
|
223
|
-
for (const entry of list.getEntries()) {
|
|
224
|
-
if (entry.duration > 200) {
|
|
225
|
-
console.warn('Slow interaction:', {
|
|
226
|
-
type: entry.name,
|
|
227
|
-
duration: entry.duration,
|
|
228
|
-
processingStart: entry.processingStart,
|
|
229
|
-
processingEnd: entry.processingEnd,
|
|
230
|
-
target: entry.target
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}).observe({ type: 'event', buffered: true, durationThreshold: 16 });
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## CLS: Cumulative Layout Shift
|
|
240
|
-
|
|
241
|
-
CLS measures unexpected layout shifts. A shift occurs when a visible element changes position between frames without user interaction.
|
|
242
|
-
|
|
243
|
-
**CLS Formula:** `impact fraction × distance fraction`
|
|
244
|
-
|
|
245
|
-
### Common CLS causes
|
|
246
|
-
|
|
247
|
-
**1. Images without dimensions**
|
|
248
|
-
```html
|
|
249
|
-
<!-- ❌ Causes layout shift when loaded -->
|
|
250
|
-
<img src="photo.jpg" alt="Photo">
|
|
251
|
-
|
|
252
|
-
<!-- ✅ Space reserved -->
|
|
253
|
-
<img src="photo.jpg" alt="Photo" width="800" height="600">
|
|
254
|
-
|
|
255
|
-
<!-- ✅ Or use aspect-ratio -->
|
|
256
|
-
<img src="photo.jpg" alt="Photo" style="aspect-ratio: 4/3; width: 100%;">
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
**2. Ads, embeds, and iframes**
|
|
260
|
-
```html
|
|
261
|
-
<!-- ❌ Unknown size until loaded -->
|
|
262
|
-
<iframe src="https://ad-network.com/ad"></iframe>
|
|
263
|
-
|
|
264
|
-
<!-- ✅ Reserve space with min-height -->
|
|
265
|
-
<div style="min-height: 250px;">
|
|
266
|
-
<iframe src="https://ad-network.com/ad" height="250"></iframe>
|
|
267
|
-
</div>
|
|
268
|
-
|
|
269
|
-
<!-- ✅ Or use aspect-ratio container -->
|
|
270
|
-
<div style="aspect-ratio: 16/9;">
|
|
271
|
-
<iframe src="https://youtube.com/embed/..."
|
|
272
|
-
style="width: 100%; height: 100%;"></iframe>
|
|
273
|
-
</div>
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
**3. Dynamically injected content**
|
|
277
|
-
```javascript
|
|
278
|
-
// ❌ Inserts content above viewport
|
|
279
|
-
notifications.prepend(newNotification);
|
|
280
|
-
|
|
281
|
-
// ✅ Insert below viewport or use transform
|
|
282
|
-
const insertBelow = viewport.bottom < newNotification.top;
|
|
283
|
-
if (insertBelow) {
|
|
284
|
-
notifications.prepend(newNotification);
|
|
285
|
-
} else {
|
|
286
|
-
// Animate in without shifting
|
|
287
|
-
newNotification.style.transform = 'translateY(-100%)';
|
|
288
|
-
notifications.prepend(newNotification);
|
|
289
|
-
requestAnimationFrame(() => {
|
|
290
|
-
newNotification.style.transform = '';
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
**4. Web fonts causing FOUT**
|
|
296
|
-
```css
|
|
297
|
-
/* ❌ Font swap shifts text */
|
|
298
|
-
@font-face {
|
|
299
|
-
font-family: 'Custom';
|
|
300
|
-
src: url('custom.woff2') format('woff2');
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/* ✅ Optional font (no shift if slow) */
|
|
304
|
-
@font-face {
|
|
305
|
-
font-family: 'Custom';
|
|
306
|
-
src: url('custom.woff2') format('woff2');
|
|
307
|
-
font-display: optional;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/* ✅ Or match fallback metrics */
|
|
311
|
-
@font-face {
|
|
312
|
-
font-family: 'Custom';
|
|
313
|
-
src: url('custom.woff2') format('woff2');
|
|
314
|
-
font-display: swap;
|
|
315
|
-
size-adjust: 105%; /* Match fallback size */
|
|
316
|
-
ascent-override: 95%;
|
|
317
|
-
descent-override: 20%;
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
**5. Animations triggering layout**
|
|
322
|
-
```css
|
|
323
|
-
/* ❌ Animates layout properties */
|
|
324
|
-
.animate {
|
|
325
|
-
transition: height 0.3s, width 0.3s;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
/* ✅ Use transform instead */
|
|
329
|
-
.animate {
|
|
330
|
-
transition: transform 0.3s;
|
|
331
|
-
}
|
|
332
|
-
.animate.expanded {
|
|
333
|
-
transform: scale(1.2);
|
|
334
|
-
}
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### CLS optimization checklist
|
|
338
|
-
|
|
339
|
-
```markdown
|
|
340
|
-
- [ ] All images have width/height or aspect-ratio
|
|
341
|
-
- [ ] All videos/embeds have reserved space
|
|
342
|
-
- [ ] Ads have min-height containers
|
|
343
|
-
- [ ] Fonts use font-display: optional or matched metrics
|
|
344
|
-
- [ ] Dynamic content inserted below viewport
|
|
345
|
-
- [ ] Animations use transform/opacity only
|
|
346
|
-
- [ ] No content injected above existing content
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
### CLS debugging
|
|
350
|
-
```javascript
|
|
351
|
-
// Track layout shifts
|
|
352
|
-
new PerformanceObserver((list) => {
|
|
353
|
-
for (const entry of list.getEntries()) {
|
|
354
|
-
if (!entry.hadRecentInput) {
|
|
355
|
-
console.log('Layout shift:', entry.value);
|
|
356
|
-
entry.sources?.forEach(source => {
|
|
357
|
-
console.log(' Shifted element:', source.node);
|
|
358
|
-
console.log(' Previous rect:', source.previousRect);
|
|
359
|
-
console.log(' Current rect:', source.currentRect);
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}).observe({ type: 'layout-shift', buffered: true });
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
---
|
|
367
|
-
|
|
368
|
-
## Measurement tools
|
|
369
|
-
|
|
370
|
-
### Lab testing
|
|
371
|
-
- **Chrome DevTools** → Performance panel, Lighthouse
|
|
372
|
-
- **WebPageTest** → Detailed waterfall, filmstrip
|
|
373
|
-
- **Lighthouse CLI** → `npx lighthouse <url>`
|
|
374
|
-
|
|
375
|
-
### Field data (real users)
|
|
376
|
-
- **Chrome User Experience Report (CrUX)** → BigQuery or API
|
|
377
|
-
- **Search Console** → Core Web Vitals report
|
|
378
|
-
- **web-vitals library** → Send to your analytics
|
|
379
|
-
|
|
380
|
-
```javascript
|
|
381
|
-
import {onLCP, onINP, onCLS} from 'web-vitals';
|
|
382
|
-
|
|
383
|
-
function sendToAnalytics({name, value, rating}) {
|
|
384
|
-
gtag('event', name, {
|
|
385
|
-
event_category: 'Web Vitals',
|
|
386
|
-
value: Math.round(name === 'CLS' ? value * 1000 : value),
|
|
387
|
-
event_label: rating
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
onLCP(sendToAnalytics);
|
|
392
|
-
onINP(sendToAnalytics);
|
|
393
|
-
onCLS(sendToAnalytics);
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
---
|
|
397
|
-
|
|
398
|
-
## Framework quick fixes
|
|
399
|
-
|
|
400
|
-
### Next.js
|
|
401
|
-
```jsx
|
|
402
|
-
// LCP: Use next/image with priority
|
|
403
|
-
import Image from 'next/image';
|
|
404
|
-
<Image src="/hero.jpg" priority fill alt="Hero" />
|
|
405
|
-
|
|
406
|
-
// INP: Use dynamic imports
|
|
407
|
-
const HeavyComponent = dynamic(() => import('./Heavy'), { ssr: false });
|
|
408
|
-
|
|
409
|
-
// CLS: Image component handles dimensions automatically
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### React
|
|
413
|
-
```jsx
|
|
414
|
-
// LCP: Preload in head
|
|
415
|
-
<link rel="preload" href="/hero.jpg" as="image" fetchpriority="high" />
|
|
416
|
-
|
|
417
|
-
// INP: Memoize and useTransition
|
|
418
|
-
const [isPending, startTransition] = useTransition();
|
|
419
|
-
startTransition(() => setExpensiveState(newValue));
|
|
420
|
-
|
|
421
|
-
// CLS: Always specify dimensions in img tags
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
### Vue/Nuxt
|
|
425
|
-
```vue
|
|
426
|
-
<!-- LCP: Use nuxt/image with preload -->
|
|
427
|
-
<NuxtImg src="/hero.jpg" preload loading="eager" />
|
|
428
|
-
|
|
429
|
-
<!-- INP: Use async components -->
|
|
430
|
-
<component :is="() => import('./Heavy.vue')" />
|
|
431
|
-
|
|
432
|
-
<!-- CLS: Use aspect-ratio CSS -->
|
|
433
|
-
<img :style="{ aspectRatio: '16/9' }" />
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
## References
|
|
437
|
-
|
|
438
|
-
- [web.dev LCP](https://web.dev/articles/lcp)
|
|
439
|
-
- [web.dev INP](https://web.dev/articles/inp)
|
|
440
|
-
- [web.dev CLS](https://web.dev/articles/cls)
|
|
441
|
-
- [Code Optimizer skill](../code-optimizer/SKILL.md)
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
# LCP optimization reference
|
|
2
|
-
|
|
3
|
-
## What is LCP?
|
|
4
|
-
|
|
5
|
-
Largest Contentful Paint (LCP) measures when the largest content element in the viewport becomes visible. This is typically:
|
|
6
|
-
|
|
7
|
-
- An `<img>` element
|
|
8
|
-
- An `<image>` element inside `<svg>`
|
|
9
|
-
- A `<video>` element with poster image
|
|
10
|
-
- An element with a background image via `url()`
|
|
11
|
-
- A block-level element containing text nodes
|
|
12
|
-
|
|
13
|
-
## LCP timeline
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
[ Server Response ][ Resource Load ][ Render ]
|
|
17
|
-
TTFB Download Paint
|
|
18
|
-
└─────────────────────────────────────┘
|
|
19
|
-
LCP Time
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Detailed optimizations
|
|
23
|
-
|
|
24
|
-
### 1. Server response time (TTFB)
|
|
25
|
-
|
|
26
|
-
Target: < 800ms
|
|
27
|
-
|
|
28
|
-
**Causes:**
|
|
29
|
-
- Slow server/database queries
|
|
30
|
-
- No CDN/edge caching
|
|
31
|
-
- Inefficient backend code
|
|
32
|
-
- Cold starts (serverless)
|
|
33
|
-
|
|
34
|
-
**Solutions:**
|
|
35
|
-
```javascript
|
|
36
|
-
// Use edge functions for dynamic content
|
|
37
|
-
// Vercel example
|
|
38
|
-
export const config = { runtime: 'edge' };
|
|
39
|
-
|
|
40
|
-
// Use stale-while-revalidate caching
|
|
41
|
-
// Cache-Control header
|
|
42
|
-
res.setHeader('Cache-Control', 's-maxage=60, stale-while-revalidate=300');
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### 2. Resource load time
|
|
46
|
-
|
|
47
|
-
**For images:**
|
|
48
|
-
```html
|
|
49
|
-
<!-- Preload LCP image -->
|
|
50
|
-
<link rel="preload" as="image" href="/hero.webp"
|
|
51
|
-
imagesrcset="/hero-400.webp 400w, /hero-800.webp 800w"
|
|
52
|
-
imagesizes="100vw"
|
|
53
|
-
fetchpriority="high">
|
|
54
|
-
|
|
55
|
-
<!-- Modern format with fallback -->
|
|
56
|
-
<picture>
|
|
57
|
-
<source srcset="/hero.avif" type="image/avif">
|
|
58
|
-
<source srcset="/hero.webp" type="image/webp">
|
|
59
|
-
<img src="/hero.jpg" width="1200" height="600"
|
|
60
|
-
fetchpriority="high" alt="Hero">
|
|
61
|
-
</picture>
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**For text (web fonts):**
|
|
65
|
-
```css
|
|
66
|
-
@font-face {
|
|
67
|
-
font-family: 'Heading';
|
|
68
|
-
src: url('/fonts/heading.woff2') format('woff2');
|
|
69
|
-
font-display: swap; /* Show fallback immediately */
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### 3. Render blocking resources
|
|
74
|
-
|
|
75
|
-
**Critical CSS pattern:**
|
|
76
|
-
```html
|
|
77
|
-
<head>
|
|
78
|
-
<!-- Inline critical CSS -->
|
|
79
|
-
<style>
|
|
80
|
-
/* Only above-fold styles, < 14KB */
|
|
81
|
-
.hero { /* ... */ }
|
|
82
|
-
.nav { /* ... */ }
|
|
83
|
-
</style>
|
|
84
|
-
|
|
85
|
-
<!-- Defer non-critical CSS -->
|
|
86
|
-
<link rel="preload" href="/styles.css" as="style"
|
|
87
|
-
onload="this.onload=null;this.rel='stylesheet'">
|
|
88
|
-
</head>
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
**Defer JavaScript:**
|
|
92
|
-
```html
|
|
93
|
-
<!-- ❌ Blocks parsing -->
|
|
94
|
-
<script src="/app.js"></script>
|
|
95
|
-
|
|
96
|
-
<!-- ✅ Deferred (runs after HTML parsed) -->
|
|
97
|
-
<script defer src="/app.js"></script>
|
|
98
|
-
|
|
99
|
-
<!-- ✅ Module (deferred by default) -->
|
|
100
|
-
<script type="module" src="/app.mjs"></script>
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
### 4. Client-side rendering
|
|
104
|
-
|
|
105
|
-
**Problem:** Content not in initial HTML.
|
|
106
|
-
|
|
107
|
-
**Solutions:**
|
|
108
|
-
|
|
109
|
-
**Server-side rendering (SSR):**
|
|
110
|
-
```javascript
|
|
111
|
-
// Next.js
|
|
112
|
-
export async function getServerSideProps() {
|
|
113
|
-
const data = await fetchHeroContent();
|
|
114
|
-
return { props: { hero: data } };
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Static site generation (SSG):**
|
|
119
|
-
```javascript
|
|
120
|
-
// Next.js
|
|
121
|
-
export async function getStaticProps() {
|
|
122
|
-
const data = await fetchHeroContent();
|
|
123
|
-
return { props: { hero: data }, revalidate: 3600 };
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
**Streaming SSR:**
|
|
128
|
-
```jsx
|
|
129
|
-
// React 18+
|
|
130
|
-
import { Suspense } from 'react';
|
|
131
|
-
|
|
132
|
-
function Page() {
|
|
133
|
-
return (
|
|
134
|
-
<Suspense fallback={<HeroSkeleton />}>
|
|
135
|
-
<Hero />
|
|
136
|
-
</Suspense>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
## Framework-specific tips
|
|
142
|
-
|
|
143
|
-
### Next.js
|
|
144
|
-
```jsx
|
|
145
|
-
import Image from 'next/image';
|
|
146
|
-
|
|
147
|
-
// LCP image with priority
|
|
148
|
-
<Image
|
|
149
|
-
src="/hero.jpg"
|
|
150
|
-
priority
|
|
151
|
-
fill
|
|
152
|
-
sizes="100vw"
|
|
153
|
-
alt="Hero"
|
|
154
|
-
/>
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Nuxt
|
|
158
|
-
```vue
|
|
159
|
-
<NuxtImg
|
|
160
|
-
src="/hero.jpg"
|
|
161
|
-
preload
|
|
162
|
-
loading="eager"
|
|
163
|
-
sizes="100vw"
|
|
164
|
-
/>
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
### Astro
|
|
168
|
-
```astro
|
|
169
|
-
---
|
|
170
|
-
import { Image } from 'astro:assets';
|
|
171
|
-
import hero from '../assets/hero.jpg';
|
|
172
|
-
---
|
|
173
|
-
<Image
|
|
174
|
-
src={hero}
|
|
175
|
-
loading="eager"
|
|
176
|
-
decoding="sync"
|
|
177
|
-
alt="Hero"
|
|
178
|
-
/>
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Debugging LCP
|
|
182
|
-
|
|
183
|
-
```javascript
|
|
184
|
-
// Identify LCP element
|
|
185
|
-
new PerformanceObserver((entryList) => {
|
|
186
|
-
const entries = entryList.getEntries();
|
|
187
|
-
const lastEntry = entries[entries.length - 1];
|
|
188
|
-
|
|
189
|
-
console.log('LCP:', {
|
|
190
|
-
element: lastEntry.element,
|
|
191
|
-
time: lastEntry.startTime,
|
|
192
|
-
size: lastEntry.size,
|
|
193
|
-
url: lastEntry.url,
|
|
194
|
-
renderTime: lastEntry.renderTime,
|
|
195
|
-
loadTime: lastEntry.loadTime
|
|
196
|
-
});
|
|
197
|
-
}).observe({ type: 'largest-contentful-paint', buffered: true });
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
## Common issues
|
|
201
|
-
|
|
202
|
-
| Issue | Impact | Fix |
|
|
203
|
-
|-------|--------|-----|
|
|
204
|
-
| No preload for LCP image | +500-1000ms | Add `<link rel="preload">` |
|
|
205
|
-
| Large unoptimized image | +300-800ms | Compress, use WebP/AVIF |
|
|
206
|
-
| Render-blocking CSS | +200-500ms | Inline critical CSS |
|
|
207
|
-
| Slow TTFB | +300-2000ms | CDN, edge caching |
|
|
208
|
-
| Client-rendered content | +500-2000ms | SSR/SSG |
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: frontend-design
|
|
3
|
-
description: Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.
|
|
4
|
-
license: Complete terms in LICENSE.txt
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
This skill guides creation of distinctive, production-grade frontend interfaces that avoid generic "AI slop" aesthetics. Implement real working code with exceptional attention to aesthetic details and creative choices.
|
|
8
|
-
|
|
9
|
-
The user provides frontend requirements: a component, page, application, or interface to build. They may include context about the purpose, audience, or technical constraints.
|
|
10
|
-
|
|
11
|
-
## Design Thinking
|
|
12
|
-
|
|
13
|
-
Before coding, understand the context and commit to a BOLD aesthetic direction:
|
|
14
|
-
|
|
15
|
-
- **Purpose**: What problem does this interface solve? Who uses it?
|
|
16
|
-
- **Tone**: Pick an extreme: brutally minimal, maximalist chaos, retro-futuristic, organic/natural, luxury/refined, playful/toy-like, editorial/magazine, brutalist/raw, art deco/geometric, soft/pastel, industrial/utilitarian, etc. There are so many flavors to choose from. Use these for inspiration but design one that is true to the aesthetic direction.
|
|
17
|
-
- **Constraints**: Technical requirements (framework, performance, accessibility).
|
|
18
|
-
- **Differentiation**: What makes this UNFORGETTABLE? What's the one thing someone will remember?
|
|
19
|
-
|
|
20
|
-
**CRITICAL**: Choose a clear conceptual direction and execute it with precision. Bold maximalism and refined minimalism both work - the key is intentionality, not intensity.
|
|
21
|
-
|
|
22
|
-
Then implement working code (HTML/CSS/JS, React, Vue, etc.) that is:
|
|
23
|
-
|
|
24
|
-
- Production-grade and functional
|
|
25
|
-
- Visually striking and memorable
|
|
26
|
-
- Cohesive with a clear aesthetic point-of-view
|
|
27
|
-
- Meticulously refined in every detail
|
|
28
|
-
|
|
29
|
-
## Frontend Aesthetics Guidelines
|
|
30
|
-
|
|
31
|
-
Focus on:
|
|
32
|
-
|
|
33
|
-
- **Typography**: Choose fonts that are beautiful, unique, and interesting. Avoid generic fonts like Arial and Inter; opt instead for distinctive choices that elevate the frontend's aesthetics; unexpected, characterful font choices. Pair a distinctive display font with a refined body font.
|
|
34
|
-
- **Color & Theme**: Commit to a cohesive aesthetic. Use CSS variables for consistency. Dominant colors with sharp accents outperform timid, evenly-distributed palettes.
|
|
35
|
-
- **Motion**: Use animations for effects and micro-interactions. Prioritize CSS-only solutions for HTML. Use Motion library for React when available. Focus on high-impact moments: one well-orchestrated page load with staggered reveals (animation-delay) creates more delight than scattered micro-interactions. Use scroll-triggering and hover states that surprise.
|
|
36
|
-
- **Spatial Composition**: Unexpected layouts. Asymmetry. Overlap. Diagonal flow. Grid-breaking elements. Generous negative space OR controlled density.
|
|
37
|
-
- **Backgrounds & Visual Details**: Create atmosphere and depth rather than defaulting to solid colors. Add contextual effects and textures that match the overall aesthetic. Apply creative forms like gradient meshes, noise textures, geometric patterns, layered transparencies, dramatic shadows, decorative borders, custom cursors, and grain overlays.
|
|
38
|
-
|
|
39
|
-
NEVER use generic AI-generated aesthetics like overused font families (Inter, Roboto, Arial, system fonts), cliched color schemes (particularly purple gradients on white backgrounds), predictable layouts and component patterns, and cookie-cutter design that lacks context-specific character.
|
|
40
|
-
|
|
41
|
-
Interpret creatively and make unexpected choices that feel genuinely designed for the context. No design should be the same. Vary between light and dark themes, different fonts, different aesthetics. NEVER converge on common choices (Space Grotesk, for example) across generations.
|
|
42
|
-
|
|
43
|
-
**IMPORTANT**: Match implementation complexity to the aesthetic vision. Maximalist designs need elaborate code with extensive animations and effects. Minimalist or refined designs need restraint, precision, and careful attention to spacing, typography, and subtle details. Elegance comes from executing the vision well.
|
|
44
|
-
|
|
45
|
-
Remember: Claude is capable of extraordinary creative work. Don't hold back, show what can truly be created when thinking outside the box and committing fully to a distinctive vision.
|