Block Catalog
Every block available in the ECP Portal Builder, with the gates that control its availability and the settings it exposes.
Counts: 57 built-in block types + 1 runtime custom_block = 58 blocks, in 6 categories (Content, Entity, Service, Visualization, System, Custom).
Sources: types enums.ts, gates registry/index.tsx, settings property-panel/renderer/* (all in the epilot360-ecp-settings repo — not this one); labels epilot360-root-config/locales/{en,de}/end-customer-portal.json.
Gate & column key
- Gates — Top-level = addable directly; Nested = only inside the named parent; Container = holds blocks; Header/Footer = restricted to that area; Hidden = not in the add-block palette; Once = one per page/portal; flag
x= feature-flag gated; requiresx= portal setting; …context = required page context. - Standard visibility = shared section: Visible-for / Hidden-for targets (match any/all, private pages only) · scheduled start/end · toggles Hidden / mobile / desktop / in-App.
- Shared design (Layout style) = single select Stacked / Two columns.
The catalog
| Category | Block | type | Gates / availability | Content settings | Design | Visibility & other |
|---|---|---|---|---|---|---|
| Content | Title | title | Top-level | Title (rich text) | — | Standard |
| Content | Text | text | Top-level | Rich-text body | — | Standard (renderer reused by system_banner_content) |
| Content | Teaser | teaser | Top-level | Title · Subtitle · Button label · Action (None/Link/Journey/Seamless link/Portal functionality + fields) · Teaser image | — | Standard |
| Content | Button | button_link | Top-level | Label · Button text · Action (types vary by nesting) · Export-columns editor (Portal functionality → Export list + flag) | — | Standard |
| Content | Display field | display_field | Top-level | Label · Value · Hide empty value | — | Standard |
| Content | App Promo | app_promo | Top-level · flag portals-app-promo-block · public pages | Rich-text intro · Store links (App Store URL, Google Play URL) | — | Standard (defaults Hidden-in-App on) |
| Content | Group | group | Top-level · container | Group label | Shared (Layout style) | Standard |
| Content | Tabs | tabs | Top-level · container (holds Tab) | Label | — | Standard |
| Content | Tab | tab | Nested (in Tabs) | Label | — | Standard |
| Content | Stepper | stepper | Top-level · container (holds Step) · flag portals-stepper-block | Label | — | Standard |
| Content | Step | step | Nested (in Stepper) | Step label | Shared (Layout style) | Standard |
| Content | Step Progress | step_progress | Nested (in Step) | Progress label | — | — |
| Content | Step Actions | step_actions | Nested (in Step) | Step Actions label · Disable back button · Back button label · Next button label · Next button action (Go to next step / Trigger action) · Target step | — | — |
| Content | Step Summary | step_summary | Nested (in Step) | Summary label | — | — |
| Content | Footer | footer | Global · once · footer section · system | Description · Menu items (Label + URL; system links locked) | — | Standard |
| Content | Logo | logo | Hidden · system-managed | Logo image — light + dark (edits portal-wide logo) | — | — (none) |
| Content | System banner content | system_banner_content | Hidden · child of System banner | Rich-text body | — | Standard |
| Content | Page | page | Structural page node · once | Label · Slug · URL preview · Detail-page config (Use as detail page → Show in navigation + schema) · Parent page · Show in navigation · Global config (Logo, Favicon light/dark) · Maintenance mode (maintenance page only) | — | Custom "Page visibility" (targets portal_user/contact; scheduled; Hidden + Hidden-in-App only) |
| Entity | Entity selector | entity_selector | Header · once · requires contract entity · alt. of Global search · hidden if Global search exists | Pretitle · Title · List content templates (top/main/bottom) · Show/Hide inactive contracts (+ filter-inactive target) · Organize (Order by+Direction, Group by+Direction, Group title, Visible results, allow page-size change) · Search (Show search, Search for, end-users select attributes) | — | Standard |
| Entity | Global search | global_search | Header · once · alt. of Entity selector | Label · Title · Description · Button Prompt Text · Search Placeholder · Configurations list (per schema: schema, results name, destination page, title/list templates, filter/organize, enable search) | — | Standard |
| Entity | Entity List | entity_list | Top-level · can hold Quick actions/Button | Label · Title · Disable all interactions · Configurations list (schema, name, destination page, icon, content templates, main-content-right, Indication, context-filter mapping, filter-by-target, end-user filters) · Organize results (order/group/visible/search, Show active workflow + Audience, Selection for data injection [in stepper step], Enable multi-selection) | — | Standard + "Hidden when empty" |
| Entity | Requests | requests | Top-level | Label · Order templates (top/main/bottom) · Opportunity templates (top/main/bottom) · Organize results (filter/order/group/visible/search) · Show active workflow (+ Audience) | — | Standard |
| Entity | Attribute | attribute | Top-level | Attribute selector (+ related-schema attribute if relation) · Label · Hide empty value | — | Standard |
| Entity | Attribute Group | attribute_group | Top-level · holds Attribute | Group label · Selected attribute group · Hide empty value | Shared (Layout style) | Standard |
| Entity | Entity Attributes | entity_attributes | Top-level · deprecated | Entity/schema (contact/order/opportunity) · Hide empty value · Exclude groups · Exclude attributes | Shared (Layout style) | Standard |
| Entity | Products | products | Top-level | Entity/schema · Product mode + external catalog (flag journey-external-catalog-integration) · Title | — | Standard |
| Entity | Product Recommendations | product_recommendations | Top-level · flag ff-product-recommendations | Campaign · Product mode + external catalog · Product Availability (use delivery address / address template) · Input Mapping for Variable Prices · Appearance (Title, Subtitle, Button label, Action) · Pre-fill Journey Mapping (journey action) · Allow dismissal (+ label) · Teaser image | — | Standard |
| Entity | Documents | documents | Top-level · can hold Quick actions/Button | Entity/schema (incl. relations) · Title · File types · End-user filters (Field/Target) · Organize results (data injection [in stepper], multi-select, filter/sort/group/visible/search) | — | Standard |
| Entity | Contact card | contact_card | Top-level | Title · relation attribute selector · relation labels (optional filter) | — | Standard |
| Entity | Order summary | order_summary | Top-level · schema: opportunity/order | Title · Content top / Main (required) / Bottom templates | — | Standard |
| Entity | Pending Requests | pending_requests | Top-level | Entity · Attributes · Include pending meter readings (entity=meter) · Title · Empty state message | — | Standard |
| Entity | Balance | balance | Top-level · requires commodity_billing + contract context | Label | — | Standard |
| Entity | Payment Info | payment | Top-level · requires commodity_billing + contract context | Label | — | Standard |
| Entity | Meter selector | meter_selector | Top-level · requires contract context · schema: meter/meter_counter | Title · Content top/Main/Bottom (meter attribute templates) · Show decommissioned meters | — | Standard |
| Entity | Add meter reading | add_meter_reading | Top-level · depends on Meter selector | Label · Button label · Implausible-reading settings (disallow implausible, require remark, require photo, remark suggestions, billing decimal precision) | — | Standard |
| Entity | Meter readings details | meter_readings | Top-level · depends on Meter selector | Label · Visible results (page size) · Meter-counter templates (top/bottom) · Meter-reading templates (top/main/bottom) | — | Standard |
| Entity | Meter counters | meter_counters | Top-level · holds Attribute · depends on Meter selector | Label | — | Standard |
| Entity | Meter Readings | meter_reading | Top-level · deprecated · requires meter context | Headline | — | Standard |
| Entity | Account User Details | account_user_details | Requires user_account_self_management + portal-user context | Label | — | Standard |
| Service | Account Users | account_users | Top-level · requires user_account_self_management | Title · Button label · Section Titles (Invited/Active/Disabled) · Invite Form Fields (Email default + custom attribute fields) | — | Standard |
| Service | Journey Actions | journey_actions | Top-level | Entity/schema selector · Title | — | Standard |
| Service | Quick actions | quick_actions | Top-level · container (holds Quick action) | Title · Hide title | Inline: Layout (Grid/Scroll box/Stacked) · Theme style (Soft) | Standard |
| Service | Quick action | quick_action | Nested (in Quick actions) | Title · Subtitle · Icon · Action (Link/Journey/Seamless link/Portal functionality + fields; Export-columns when export-entities in Entity List) | Inline: Size (Small/Medium/Large) | Standard |
| Service | Order actions | order_actions | Top-level | Title | — | Standard |
| Service | Workflows | workflows | Top-level | Entity/schema selector · Audience (Customers/Installers) · Title · Show timestamps | — | Standard |
| Service | Campaign | campaign | Top-level | Campaign selector · Title · Subtitle · Button label · Action · Allow dismissal (+ label) · Teaser/background image | — | Standard |
| Service | Change installment rate | change_installment_rate | Top-level · requires commodity_billing | Label | — | Standard |
| Service | External links | external_links | Top-level · deprecated (use Quick actions) | — (none; placeholder) | — | Standard |
| Visualization | Consumption visualization | consumption_visualization | Top-level · requires meter context | Title · Integration select · Allow export · Compact layout (desktop only) | — | Standard |
| Visualization | Dynamic Tariff | dynamic_tariff | Top-level · requires contract context | Label · Headline · Subheadline · Integration select · Allow export | — | Standard |
| System | Login form | login_form | Hidden · system-managed | — (none; placeholder) | — | Standard |
| System | Registration form | registration_form | Hidden · system-managed | Consent/agreement rich text (per language) | — | Standard |
| System | Forgot password form | forgot_password_form | Hidden · system-managed | — (none; placeholder) | — | Standard |
| System | Forgot password change form | forgot_password_change_form | Hidden · system-managed | — (none; placeholder) | — | Standard |
| System | Set password new email form | set_password_new_email_form | Hidden · system-managed | — (none; placeholder) | — | Standard |
| System | Confirm email form | confirm_email_form | Hidden · system-managed | — (none; placeholder) | — | Standard |
| System | System banner | system_banner | Hidden · system-managed | Banner type (Information/Warning/Error) | — | Custom: Banner active · Start date · End-date toggle + End date |
| Custom | Custom block | custom_block | Hidden · runtime-registered by Spark SDK apps | Third-party info (App + Component name) + marketplace link · Position select (Main/Inline/Floating Right/Floating Left — when multiple supported) | — | Standard |
Custom blocks — this repo's extension point
The custom_block row above is the bridge to this repo: it's how a custom block (a Spark iframe app built with @epilot/spark-ui + @epilot/spark-sdk) appears inside ECP's built-in slot system. Every other row in this catalog is a built-in block with zero code in this repo — Spark's contribution to a portal page is that one row, registered at runtime as a Marketplace app component.
To build the app that fills that slot, see Build a block for the end-to-end walkthrough, or the Spark SDK overview for the handshake and lifecycle.
Keeping this current
This table is a point-in-time export from the epilot360-ecp-settings block registry and property renderers — a different repo this workspace has no code access to. It is refreshed by hand: paste a fresh export into the marked region above whenever blocks or their property panels change in that repo. Do not add automation here to keep it in sync; there is no live connection to source from this repo.