Build a Shopify theme section from a Figma frame using plain CSS only — no Tailwind build step and no Shopify CLI. Each section ships ONE dedicated, conditionally-loaded CSS file; no inline Figma styles and no piling rules into a shared mega-stylesheet. Use when the user says "build this Figma section", "turn this design into a Shopify section", "add a new section to my theme", "implement this frame", or pastes a Figma frame and a theme repo. Because there is no local dev server, the skill verifies by loading a PREVIEW LINK the user shares (or a screenshot they paste) and diffing it against Figma before calling the work done.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shopify-section-builder:shopify-section-builderThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build a clean, self-contained Shopify section from a Figma design. This skill is
examples/feature-grid/README.mdexamples/feature-grid/assets/section-feature-grid.cssexamples/feature-grid/locales/en.default.schema.jsonexamples/feature-grid/sections/feature-grid.liquidexamples/feature-grid/snippets/component-feature-grid-card.liquidreferences/css-rules.mdreferences/gotchas.mdreferences/javascript.mdreferences/preview-and-verify.mdreferences/section-anatomy.mdreferences/setup.mdreferences/theme-conventions.mdscripts/validate-section.shBuild a clean, self-contained Shopify section from a Figma design. This skill is written for a workflow where:
npm run build:css, so write
plain CSS, not utility classes. (If the theme has a compiled tailwind.css,
you may reuse existing utility classes that already exist in it, but never add
new ones, and never rely on a build.)127.0.0.1. You preview by deploying to a Shopify theme and opening
its preview URL, then sharing that link (or a screenshot) for verification.style="...". This skill exists to STOP that pattern,
not extend it. Every new section is an island: its own .liquid, its own
assets/section-<name>.css, its own snippets.Read the matching references/*.md for each phase instead of holding all of it in
memory.
assets/section-<name>.css, conditionally loaded from the section. Never
append a section's rules to a shared/global stylesheet, and never edit another
section's CSS file.style="color:#...;padding:24px;font-size:18px"
pulled from a Figma fill. The only allowed inline <style> is a single
section-scoped block that writes CSS variables driven by theme-editor settings
(padding, background, color). Everything that comes from Figma goes in the CSS
file. See references/css-rules.md.#section-{{ section.id }} (or a section-unique
wrapper class) so two instances on one page never collide and styles never bleed
into other sections.Run in order. Skipping "read the theme" is how output drifts from the codebase.
Read references/setup.md. Confirm:
mcp__figma* tools, a shared frame link, or a
clear screenshot + spec). If you have nothing to build from, stop and ask.sections/, snippets/, assets/, templates/,
locales/, config/settings_schema.json).Read references/theme-conventions.md, then read the actual theme — don't
assume. Minimum reads:
sections/*.liquid closest to what you're building.snippets/css-variables.liquid or
similar) — colors, type scale, spacing, radius, breakpoints.assets/section-*.css to copy its CSS conventions (BEM?
variable names? media-query breakpoints?).config/settings_schema.json for color schemes and typography tokens.templates/*.json like the one you'll preview on, for the JSON shape.Read references/section-anatomy.md (scaffold + schema) and
references/css-rules.md (the CSS file). Write, at minimum:
sections/<name>.liquidassets/section-<name>.css ← the one and only place section styles livesnippets/component-<name>.liquid for any repeated card/item markuplocales/en.default.schema.json entries for every t: labelassets/section-<name>.js only if the section has real interactive behavior
(read references/javascript.md).Stamp the Figma source at the top so re-runs update instead of duplicate:
{%- comment -%} figma:<file-key>:<node-id> {%- endcomment -%}
A section file renders nothing on its own. Read references/preview-and-verify.md.
Add the section to the right templates/*.json with real sample content pulled
from the Figma text layers (empty defaults look broken and cause false-negative
diffs). Give the preview entry an obvious key like <name>-preview so it's easy to
remove later.
Read references/preview-and-verify.md § Verify. Because there's no local dev
server:
scripts/validate-section.sh on the section. Present screenshots + the diff
list + the file list, git add the files, and suggest a commit message.
Don't commit.style="..." baked from Figma fills that can't be themed or overridden.| File | Read when |
|---|---|
references/setup.md | Phase 1 — every run |
references/theme-conventions.md | Phase 2 — every run |
references/section-anatomy.md | Phase 3 — every run |
references/css-rules.md | Phase 3 — writing the CSS file |
references/javascript.md | Phase 3 — only if interactive |
references/preview-and-verify.md | Phases 4 & 5 — every run |
references/gotchas.md | When something renders wrong |
| Path | Purpose |
|---|---|
examples/feature-grid/ | A complete, conventions-correct section to copy from. |
scripts/validate-section.sh | Static checks before declaring done. |
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub haydonpowershopify/mother-root-sections --plugin shopify-section-builder