vtex-io-render-runtime-and-blocks
Apply when connecting React components to Store Framework blocks and render-runtime behavior in VTEX IO. Covers interfaces.json, block registration, block composition, and how storefront components become configurable theme blocks. Use for block mapping, theme integration, or reviewing whether a React component is correctly exposed to Store Framework.
What this skill does
# Render Runtime & Block Registration ## When this skill applies Use this skill when a VTEX IO storefront component needs to be exposed to Store Framework as a block. - Registering components in `store/interfaces.json` - Mapping block names to React components - Defining block composition and allowed children - Reviewing whether a component is correctly wired into theme JSON Do not use this skill for: - shopper-facing component internals - admin interfaces - backend service or route design - policy modeling ## Decision rules - Every block visible to Store Framework must be registered in `store/interfaces.json`. - Keep block names, component mapping, and composition explicit. - The block ID used as the key in `store/interfaces.json`, for example `product-reviews`, is the same ID that storefront themes reference under `blocks` in `store/*.json`. - The `component` field should map to the React entry name under `react/`, such as `ProductReviews`, or a nested path such as `product/ProductReviews` when the app structure is hierarchical. - Use `composition` intentionally when the block needs an explicit child model. `children` means the component renders nested blocks through `props.children`, while `blocks` means the block exposes named block slots controlled by Store Framework. - `composition` is optional. For many simple blocks, declaring `component` and, when needed, `allowed` is enough. - Block IDs are scoped by the **declaring app's MAJOR version**. `vtex.pages-graphql` resolves a block reference such as `acme-related-products` against `[email protected]:acme-related-products` for the major actually installed in the workspace. A block declared in `0.x` is not the same block as one declared in `5.x`, even if the ID is identical. - A consumer theme that references a block ID through `store/blocks.json` only sees the block if the declaring app is installed at a major matching the dependency range. Mismatches surface as `Missing block [email protected]:block-id` errors at the resolver and break the page. - Use this skill for the render/runtime contract, and use storefront/admin skills for the component implementation itself. ## Hard constraints ### Constraint: Storefront blocks must be declared in interfaces.json Every React component intended for Store Framework use MUST have a corresponding `interfaces.json` entry. **Why this matters** Without the interface declaration, the component cannot be referenced from theme JSON. **Detection** If a storefront React component is intended to be used as a block but has no matching interface entry, STOP and add it first. **Correct** ```json { "product-reviews": { "component": "ProductReviews" } } ``` **Wrong** ```tsx // react/ProductReviews.tsx exists with no interfaces.json mapping ``` ### Constraint: Component mapping must resolve to real React entry files The `component` field in `interfaces.json` MUST map to a real exported React entry file. **Why this matters** Broken mapping silently disconnects block contracts from implementation. **Detection** If an interface points to a component name with no corresponding React entry file, STOP and fix the mapping. **Correct** ```json { "product-reviews": { "component": "ProductReviews" } } ``` **Wrong** ```json { "product-reviews": { "component": "MissingComponent" } } ``` ### Constraint: Block IDs must resolve under the installed major of the declaring app Block IDs referenced from a theme app's `store/blocks.json` MUST resolve to an `interfaces.json` entry in an installed app whose MAJOR version matches the consumer's dependency range. The render-time resolver is keyed by `[email protected]:block-id`, not by the bare block ID. **Why this matters** `vtex.pages-graphql` uses the declaring app's major version as part of the block lookup. A block that exists in `[email protected]` is not visible to a consumer that resolves `[email protected]`, even if the block ID is identical. Mismatches return `Missing block` errors at the GraphQL layer and the page falls back to default content or fails outright. **Detection** If a consumer theme references a block ID and the declaring app's installed major does not match the consumer's dependency range, STOP and align the dependency range or move the block declaration to the correct major. **Correct** ```json // consumer theme manifest.json { "dependencies": { "acme.product-widgets": "0.x" } } ``` ```json // [email protected] ships store/interfaces.json with: { "acme-related-products": { "component": "RelatedProducts" } } ``` ```json // consumer theme store/blocks.json { "store.product": { "children": ["acme-related-products"] } } ``` **Wrong** ```json // consumer theme depends on [email protected] // but the block "acme-related-products" was added in @5.x and never backported { "store.product": { "children": ["acme-related-products"] } } ``` The resolver returns `Missing block [email protected]:acme-related-products`. ### Constraint: Block composition must be intentional Composition and allowed child blocks MUST match the component's actual layout and runtime expectations. **Why this matters** Incorrect composition contracts make theme usage brittle and confusing. **Detection** If `allowed` or `composition` do not reflect how the component is supposed to receive children, STOP and correct the block contract. **Correct** ```json { "product-reviews": { "component": "ProductReviews", "composition": "children", "allowed": ["product-review-item"] } } ``` **Wrong** ```json { "product-reviews": { "component": "ProductReviews", "composition": "blocks", "allowed": [] } } ``` ## Preferred pattern Keep block contracts explicit in `interfaces.json` and keep block implementation concerns separate from render-runtime registration. Minimal block lifecycle: ```json // store/interfaces.json { "product-reviews": { "component": "ProductReviews", "composition": "children", "allowed": ["product-review-item"] }, "product-review-item": { "component": "ProductReviewItem" } } ``` ```json // store/home.json { "store.home": { "blocks": ["product-reviews"] } } ``` ```tsx // react/ProductReviews.tsx export default function ProductReviews() { return <div>...</div> } ``` This wiring makes the block name visible in the theme, maps it to a real React entry, and keeps composition rules explicit at the render-runtime boundary. ## Common failure modes - Forgetting to register a storefront component as a block. - Mapping block names to missing React entry files. - Using the wrong composition model. - Adding a new block to a `5.x` line and assuming consumers depending on `0.x` will see it. Block visibility is scoped by the declaring app's installed major. - Renaming a block ID without coordinating with consumer themes that already reference it; the rename is effectively a breaking change for stored content. ## Review checklist - [ ] Is the block declared in `interfaces.json`? - [ ] Does the component mapping resolve correctly? - [ ] Are composition and allowed children intentional? - [ ] Is runtime registration clearly separated from component internals? - [ ] Is the declaring app installed at a major that matches every consumer's dependency range? ## Related skills - [`vtex-io-storefront-theme-app`](../vtex-io-storefront-theme-app/SKILL.md) — Use when the question is how a consumer theme composes these blocks into pages and routes. - [`vtex-io-storefront-theme-versioning`](../vtex-io-storefront-theme-versioning/SKILL.md) — Use when the question is how a major version change in a block-declaring app affects merchants who already reference those blocks in stored content. ## Reference - [Store Framework](https://developers.vtex.com/docs/guides/vtex-io-documentation-store-framework) - Block and theme context - [Interfaces](https://developers.vtex.com/docs/guides/vtex-io-doc
Related in Design
contribute
IncludedLocal-only OSS contribution command center. Auto-refreshes the user's in-flight PR and issue state on invoke so conversations start with full context — no need to brief Claude on what's in flight. Helps the user find issues to contribute to on GitHub, builds per-repo dossiers of what each upstream expects (CLA, DCO, branch convention, AI policy, draft-first, review bots, issue templates), runs deterministic gates before any external action so AI-assisted contributions don't reach maintainers as slop. State is markdown-only: candidate files at ~/.contribute-system/candidates/, repo dossiers at ~/.contribute-system/research/, append-only event log at ~/.contribute-system/log.jsonl. No database, no cloud calls. Use when the user asks about their PRs / issues / contributions, wants to find new work to take on, claim an issue, build/refresh a repo's dossier, or draft a Design Issue or PR. Trigger with "/contribute", "what's my PR status", "find a contribution", "claim issue X", "draft a Design Issue for Y", "refresh dossier for Z".
architectural-analysis
IncludedUser-triggered deep architectural analysis of a codebase or scoped subtree across eight modes — information architecture, data flow, integration points, UI surfaces, interaction patterns, data model, control flow, and failure modes. This skill should be used when the user asks to "diagram this codebase," "map the architecture," "show the data flow," "give me an ERD," "trace control flow," "find the integration points," "verify the layout pattern," "audit the UX architecture," or any similar request whose primary deliverable is mermaid diagrams plus cited reports under docs/architecture/. Dispatches haiku/sonnet sub-agents in parallel for per-mode exploration, then verifies every citation mechanically before any node lands in a diagram. Not for one-off prose explanations of code (use code-explanation) or for high-level system design from scratch (use system-design).
mcp
IncludedModel Context Protocol (MCP) server development and tool management. Languages: Python, TypeScript. Capabilities: build MCP servers, integrate external APIs, discover/execute MCP tools, manage multi-server configs, design agent-centric tools. Actions: create, build, integrate, discover, execute, configure MCP servers/tools. Keywords: MCP, Model Context Protocol, MCP server, MCP tool, stdio transport, SSE transport, tool discovery, resource provider, prompt template, external API integration, Gemini CLI MCP, Claude MCP, agent tools, tool execution, server config. Use when: building MCP servers, integrating external APIs as MCP tools, discovering available MCP tools, executing MCP capabilities, configuring multi-server setups, designing tools for AI agents.
react-native-skia
IncludedDesign, build, debug, and optimise high-polish animated graphics in React Native or Expo using @shopify/react-native-skia, Reanimated, and Gesture Handler. Use when the user wants canvas-driven UI, shaders, paths, rich text, image filters, sprite fields, Skottie, video frames, snapshots, web CanvasKit setup, or performance tuning for custom motion-heavy elements such as loaders, hero art, cards, charts, progress indicators, particle systems, or gesture-driven surfaces. Also use when the user asks for fluid, glow, glass, blob, parallax, 60fps/120fps, or GPU-friendly animated effects in React Native, even if they do not explicitly say "Skia". Do not use for ordinary form/layout work with standard views.
plaid
IncludedProduct Led AI Development — guides founders from idea to launched product. Six capabilities: Idea (discover a product idea), Validate (pressure-test the idea against fatal flaws, problem reality, competition, and 2-week MVP feasibility), Plan (vision intake + document generation), Design (translate image references into a design.md spec), Launch (go-to-market strategy), and Build (roadmap execution). Use when someone says "PLAID", "plaid idea", "help me find an idea", "product idea", "idea from my business", "idea from my expertise", "plaid validate", "validate my idea", "pressure-test", "is this idea good", "find fatal flaws", "validate the problem", "plan a product", "define my vision", "generate a PRD", "product strategy", "plaid design", "design from image", "translate image to design", "create design.md", "extract design tokens", "plaid launch", "go-to-market", "launch plan", "GTM strategy", "launch playbook", "plaid build", "build the app", "start building", or "execute the roadmap".
nextjs-framer-motion-animations
IncludedAdds production-safe Motion for React or Framer Motion animations to Next.js apps, including reveal, hover and tap micro-interactions, whileInView, stagger, AnimatePresence, layout and layoutId transitions, reorder, scroll-linked UI, and lightweight route-content transitions. Use when the user asks to add, refactor, or debug Motion or Framer Motion in App Router or Pages Router codebases, especially around server/client boundaries, reduced motion, LazyMotion, bundle size, hydration, or route transitions. Avoid for GSAP-style timelines, WebGL or 3D scenes, heavy scroll storytelling, or CSS-only effects unless Motion is explicitly requested.