Components and Adapters
Every @block compiles into a typed component for your framework. The adapter is responsible for this — a separate package for each framework (React, Vue, Svelte, SolidJS, Astro) and for plain DOM. Which adapter is active is set by defaultAdapter in the configuration.
Component name
The component name is a prefix plus the block name. By default the prefix is E:
@block Button→EButton@block Card→ECard
The prefix is configured with the componentNamePrefix option. The component is imported directly from the .ecss file:
import { EButton } from './Button.ecss';Parameters — the params prop
A block's parameters are passed via a single params prop. Their types are inferred from the @param declarations, so you can't pass an invalid value:
<EButton as="button" params={{ variant: 'primary' }}>
Click me
</EButton>For more on the @param ↔ params link, see the Parameters and States section.
Tag — the as prop
By default the component renders as a <div>. The as prop changes the root tag, and the typing adjusts the allowed HTML attributes to the chosen tag:
<EButton as="button" type="submit" params={{ variant: 'primary' }}>Submit</EButton>
<EButton as="a" href="/about" params={{ variant: 'ghost' }}>Link</EButton>TIP
Don't forget as for semantics: <EButton> without as renders as a <div>. For a button specify as="button", for a link as="a".
Nested elements
If a block declares @element, they are available as nested components through the root's static properties:
<EButton params={{ withIcon: true }}>
<EButton.Icon>★</EButton.Icon>
<EButton.Text>Click me</EButton.Text>
</EButton>Which adapter to choose
All adapters have the same API (params, as, sub-components) — only the syntax of the specific framework differs. Choose yours:
- React · Vue · Svelte · SolidJS
- Astro — static pages and SSR without client-side JS
- Vanilla JS (DOM) — without a framework
The common API of all adapters is described in the adapters overview.