What problem does it solve? Adding client-side interactivity to Astro pages without pulling in React or another framework runtime requires a disciplined pattern. This Skill encodes the project's vanilla custom-element convention so every interactive component follows the same lifecycle, state, and accessibility rules. ## Core Features & Use Cases - Component pairing pattern: Pairs Component.astro (server-rendered markup with a kebab-case tag and data-* hooks) with ComponentElement.ts (an HTMLElement subclass) for all public-page behavior. - Lifecycle and state conventions: Enforces private #field state initialized in connectedCallback, arrow-function event handlers, listener teardown in disconnectedCallback, and guarded customElements.define registration. - Nested element safety: Provides queryUpgraded/queryAllUpgraded helpers to avoid silent instanceof failures after <ClientRouter /> page swaps. - Use Case: When adding a contact form with fetch submission, honeypot spam protection, and aria-live status messages to a public Astro page, this Skill produces the correct element pair with progressive enhancement so the form works without JavaScript. ## Quick Start Add a custom element for a filterable card list on the blog index page following the custom-elements pattern.