Skip to content
Back to skills

Greenshift Blocks

ASecurity

Generate WordPress Gutenberg blocks using Greenshift/GreenLight plugin. Use when user asks to create WordPress sections, blocks, layouts, hero sections, galleries, or any Gutenberg element. Triggers on keywords: wordpress, gutenberg, greenshift, section, block, layout, hero, gallery, columns, element.

  • 666 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added February 8, 2026
developmentjavascriptgojavadocumentation

Works with

  • cli

Security analysis

A100/100

Scanned February 12, 2026

npx -y skills add majiayu000/claude-skill-registry --skill greenshift-blocks --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Greenshift Blocks?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Greenshift Blocks
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-greenshift-blocks/badge)](https://www.skillsdirectory.com/skills/majiayu000-greenshift-blocks)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: greenshift-blocks
description: Generate WordPress Gutenberg blocks using Greenshift/GreenLight plugin. Use when user asks to create WordPress sections, blocks, layouts, hero sections, galleries, or any Gutenberg element. Triggers on keywords: wordpress, gutenberg, greenshift, section, block, layout, hero, gallery, columns, element.
---

# Greenshift Block Generator

## Purpose

Generate production-ready WordPress Gutenberg blocks using Greenshift/GreenLight Element block system. All output is HTML with JSON parameters in block comments - ready to paste directly into WordPress Gutenberg code editor.

## Documentation Structure

Detailed documentation is split into modular files in the `docs/` directory:

| File | Topic |
|------|-------|
| `docs/00-index.md` | Navigation index |
| `docs/01-core-structure.md` | Block format, JSON parameters, content types, styleAttributes |
| `docs/02-attributes.md` | HTML attributes, links, images, forms, icons |
| `docs/03-layouts.md` | Sections, columns, flexbox configurations |
| `docs/04-styling-advanced.md` | Local classes (dynamicGClasses), gradients, background images, parallax |
| `docs/05-animations.md` | AOS animations, CSS keyframes, scroll animations |
| `docs/06-slider.md` | Swiper slider block configuration |
| `docs/07-dynamic-content.md` | Dynamic text, query grids, placeholders |
| `docs/08-variations.md` | Accordion, tabs, counter, countdown, etc. |
| `docs/09-css-variables.md` | All CSS variables (fonts, spacing, shadows, etc.) |
| `docs/10-scripts.md` | Custom JavaScript and GSAP integration |
| `docs/11-charts.md` | ApexCharts integration |
| `docs/12-migration-rules.md` | **CRITICAL** - Typography stripping, semantic headings, minimal styling |

**Read relevant docs files when you need detailed information on specific topics.**

**IMPORTANT:** Always read `docs/12-migration-rules.md` when migrating or cloning blocks - it contains critical rules about what styles to REMOVE.

---

## Quick Reference

### Core Block Structure

Every Greenshift element follows this pattern:

```html
<!-- wp:greenshift-blocks/element {JSON Parameters} -->
<html_tag class="optional classes" ...attributes>
  <!-- Inner content -->
</html_tag>
<!-- /wp:greenshift-blocks/element -->
```

### Critical Rules

1. **Block IDs**: Unique `id` starting with `gsbp-` + 7 alphanumeric chars (e.g., `gsbp-b3c761b`). `localId` must be identical to `id`.

2. **Content Types** (`type` parameter):
   - `"text"`: Text-only blocks - requires `textContent` with duplicated text
   - `"inner"`: Container blocks - wrap plain text in `<span>` element blocks
   - `"no"`: Empty/spacer elements
   - `"chart"`: ApexCharts

3. **Styling** (`styleAttributes`):
   - Never use inline `style="..."` attributes
   - Properties use camelCase (e.g., `backgroundColor`, `paddingTop`)
   - Values are arrays for responsive: `["desktop", "tablet", "mobile_landscape", "mobile_portrait"]`
   - Single value `["10px"]` applies to all breakpoints
   - Pseudo-states: `backgroundColor_hover`, `color_focus`
   - If `styleAttributes` exists, add `localId` to HTML `class` attribute

4. **HTML Tags**: Default is `div`. Prefer `tag: "a"` over `tag: "button"` for buttons (except forms).

5. **Images**: Always `loading="lazy"`. Use `https://placehold.co/WIDTHxHEIGHT`. When using `originalWidth` and `originalHeight` in JSON, you MUST also add matching `width` and `height` HTML attributes to the `<img>` tag.

6. **Links**: `linkNewWindow: true` = `target="_blank"` + auto `rel="noopener"`

7. **Column Children with Padding**: Always add `boxSizing: ["border-box"]` to column children that have padding. Without this, padding adds to width and causes columns to wrap unexpectedly. See `docs/03-layouts.md` for details.

**See `docs/01-core-structure.md` and `docs/02-attributes.md` for full details.**

---

## Minimal Intervention Philosophy

### Core Principle: Less is More

When generating or migrating blocks, apply **minimal styling intervention**. Let the WordPress theme handle defaults.

**See `docs/12-migration-rules.md` for comprehensive migration-specific rules.**

### What NOT to Do

| Avoid | Why |
|-------|-----|
| Adding `fontSize` to headings (h1-h6) | Theme typography handles heading sizes |
| Adding `color` to headings/paragraphs | Theme colors cascade from settings |
| Adding `fontWeight` to headings | Theme defines heading weights |
| Adding `fontWeight: ["400"]` anywhere | It's the default - remove it |
| Adding `lineHeight` to headings | Theme handles heading line-heights |
| Setting responsive fontSize on headings | Theme's heading styles are already responsive |
| Using generic background colors | Use theme palette variables (palette-color-6, etc.) |

### Typography Rules (CRITICAL)

**Headings (h1, h2, h3, h4, h5, h6) - NEVER SET:**
- `fontSize` - theme handles heading sizes (even responsive ones)
- `fontWeight` - theme handles heading weights
- `color` - theme handles text colors (unless on dark background)
- `lineHeight` - theme handles heading line-heights

**Headings - OKAY TO SET:**
- `marginTop`, `marginBottom` - for spacing control
- `textAlign` - for layout/centering

**WRONG - Over-styled heading:**
```json
{
  "tag": "h2",
  "styleAttributes": {
    "fontSize": ["3rem", "2.7rem"],
    "fontWeight": ["700"],
    "lineHeight": ["1.2"]
  }
}
```

**CORRECT - Minimal heading:**
```json
{
  "tag": "h2",
  "styleAttributes": {
    "marginBottom": ["1rem"],
    "textAlign": ["center"]
  }
}
```

**Paragraphs and text - NEVER SET:**
- `color` - unless on dark/colored background
- `fontWeight: ["400"]` or `fontWeight: ["normal"]` - these are defaults
- `lineHeight` - unless custom fontSize requires adjustment

**Paragraphs and text - OKAY TO SET:**
- `fontSize` - ONLY for intentional accent/lead text (e.g., `["1.2rem"]`)
- `fontFamily` - for specific font choices
- `fontWeight: ["700"]` - for intentionally bold body text
- `maxWidth` - for constraining text width

**Exception - Text on dark backgrounds:**
When text is over a dark background (hero overlays, dark sections, card overlays):
- White text: `"color":["var(--wp--preset--color--white, #ffffff)"]`
- Semi-transparent white: `"color":["rgba(255,255,255,0.9)"]`

### Semantic Heading Hierarchy

Use proper HTML heading levels based on content structure:

```
h1 - Page title (usually in theme header)
h2 - Main section titles (one per section)
h3 - Subsection/card titles
h4 - Minor headings within cards/subsections
```

**Example - Step Cards:**
- Section intro: `h2`
- Grid/subsection title: `h3`
- Individual step headings: `h4`

**DON'T:** Use multiple h2s in same section or h3 for minor card headings.

### Background Colors - Use Theme Palette

**WRONG - Generic variables:**
```json
"backgroundColor": ["var(--wp--preset--color--white, #ffffff)"]
"backgroundColor": ["var(--wp--preset--color--light-grey, #f8f8f8)"]
```

**CORRECT - Theme palette:**
```json
"backgroundColor": ["var(--wp--preset--color--palette-color-6, var(--theme-palette-color-6, #f5f5f4))"]
"backgroundColor": ["var(--wp--preset--color--palette-color-7, var(--theme-palette-color-7, #fafaf9))"]
"backgroundColor": ["var(--wp--preset--color--palette-color-8, var(--theme-palette-color-8, #fffffe))"]
```

Palette colors (6, 7, 8) adapt to user's theme settings. Generic colors override theme customization.

### When TO Style

- **Text on dark backgrounds** - white/light colors needed for readability
- **Structural necessity** - flexbox layouts, positioning
- **Spacing control** - gaps between sections, margins for element separation
- **Explicit design override** - screenshot shows specific non-default styling

### Hardcoded Values vs CSS Variables

**WRONG - Over-styled:**
```json
{
  "styleAttributes": {
    "fontSize": ["16px"],
    "fontWeight": ["400"],
    "lineHeight": ["1.5"],
    "color": ["#333333"],
    "marginBottom": ["20px"]
  }
}
```

**CORRECT - Minimal:**
```json
{
  "styleAttributes": {
    "marginBottom": ["var(--wp--preset--spacing--50)"]
  }
}
```
Or even better - **no styleAttributes at all** if theme defaults are acceptable.

### Column/Flexbox Spacing

For column gaps, use CSS variables:
```json
{
  "styleAttributes": {
    "columnGap": ["var(--wp--preset--spacing--60, 2rem)"],
    "rowGap": ["var(--wp--preset--spacing--60, 2rem)"]
  }
}
```

**AVOID** hardcoded gaps like `"columnGap": ["25px"]` unless specifically required.

### Migration/Cloning Rule

When migrating or cloning:
1. **Preserve structure** - keep the layout working
2. **Remove unnecessary styles** - strip redundant fontSize, fontWeight, color
3. **Convert hardcoded to variables** - but only if the value is being kept
4. **Don't add styles** - if original didn't have it, don't add it

---

## Block Types Guide

### Always Use GreenLight Element

Always use `greenshift-blocks/element` for most content. Convert old blocks to GreenLight Element:

| Old Block (AVOID) | Replace With |
|-------------------|--------------|
| `greenshift-blocks/row` | `greenshift-blocks/element` with `tag:"section"`, `align:"full"` |
| `greenshift-blocks/row-column` | `greenshift-blocks/element` with `type:"inner"` or remove entirely |
| `greenshift-blocks/heading` | `greenshift-blocks/element` with `tag:"h1/h2/h3"`, `textContent` |

### Specialized Blocks (OK to use)

These specialized blocks are acceptable:

- `greenshift-blocks/element` - GreenLight Element (primary block)
- `greenshift-blocks/swiper` - Slider/carousel
- `greenshift-blocks/querygrid` - Query loop for posts
- `greenshift-blocks/dynamic-post-image` - Dynamic featured image
- `greenshift-blocks/dynamic-post-title` - Dynamic post title
- `greenshift-blocks/meta` - Post meta data

### Heading Conversion Example

**WRONG (old `greenshift-blocks/heading`):**
```html
<!-- wp:greenshift-blocks/heading {"id":"gsbp-xxx","headingContent":"Title","spacing":{...},"typography":{...}} -->
<h2 id="gspb_heading-id-gsbp-xxx" class="gspb_heading gspb_heading-id-gsbp-xxx">Title</h2>
<!-- /wp:greenshift-blocks/heading -->
```

**CORRECT (GreenLight Element - minimal):**
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-xxx","textContent":"Title","tag":"h2","localId":"gsbp-xxx","styleAttributes":{"marginBottom":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d50, 1.5rem)"]}} -->
<h2 class="gsbp-xxx">Title</h2>
<!-- /wp:greenshift-blocks/element -->
```

**Key differences:**
- Use `textContent` instead of `headingContent`
- Use `tag:"h2"` instead of default div
- **NO fontSize** - theme handles heading sizes
- **NO color** - theme handles text colors
- Only add `marginBottom` if spacing control needed
- Class is `gsbp-xxx` not `gspb_heading gspb_heading-id-gsbp-xxx`
- No `id` attribute in HTML, only `class`

---

## SVG Icons Encoding

SVG content inside the JSON `icon.icon.svg` parameter MUST use Unicode escape sequences, not raw HTML or escaped quotes.

### Character Encoding Table

| Character | Escape Sequence |
|-----------|-----------------|
| `<`       | `\u003c`        |
| `>`       | `\u003e`        |
| `"`       | `\u0022`        |

### Example

**WRONG:**
```json
"icon":{"icon":{"svg":"<svg viewBox=\"0 0 24 24\"><path d=\"M8 12l2 2\"/></svg>"},...}
```

**CORRECT:**
```json
"icon":{"icon":{"svg":"\u003csvg viewBox=\u00220 0 24 24\u0022\u003e\u003cpath d=\u0022M8 12l2 2\u0022/\u003e\u003c/svg\u003e"},...}
```

---

## Card Design Pattern: Inset Rounded Images

When creating cards with images that have rounded corners INSIDE the card (with visible margin/padding around them):

### Structure
```
Card Wrapper (white bg, border-radius: 15px, overflow: hidden)
├── Image Container (padding: 8px top/left/right, 0px bottom)
│   └── Image (border-radius: 10px on ALL 4 corners, object-fit: cover)
└── Footer/Label Area (padding for content)
```

### Key Points

1. **Card wrapper**: `overflow: hidden` + larger border-radius (e.g., 15px)
2. **Image container**: padding on 3 sides, `paddingBottom: 0px` (no gap to footer)
3. **Image itself**: SMALLER border-radius than card (e.g., 10px) on ALL 4 corners
4. This creates the "inset" look where white card background shows as margin around image

### Image styleAttributes for Inset Cards

```json
"styleAttributes": {
  "width": ["100%"],
  "aspectRatio": ["16/10"],
  "objectFit": ["cover"],
  "borderTopLeftRadius": ["var(--wp--custom--border-radius--small, 10px)"],
  "borderTopRightRadius": ["var(--wp--custom--border-radius--small, 10px)"],
  "borderBottomLeftRadius": ["var(--wp--custom--border-radius--small, 10px)"],
  "borderBottomRightRadius": ["var(--wp--custom--border-radius--small, 10px)"],
  "borderRadiusLink_Extra": true
}
```

---

## Common CSS Variables

### Font Sizes
```
var(--wp--preset--font-size--mini, 11px)
var(--wp--preset--font-size--xs, 0.85rem)
var(--wp--preset--font-size--s, 1rem)
var(--wp--preset--font-size--m, 1.35rem)
var(--wp--preset--font-size--l, 1.55rem)
var(--wp--preset--font-size--xl, clamp(1.6rem, 2.75vw, 1.9rem))
var(--wp--preset--font-size--grand, clamp(2.2rem, 4vw, 2.8rem))
var(--wp--preset--font-size--giga, clamp(3rem, 5vw, 4.5rem))
var(--wp--preset--font-size--giant, clamp(3.2rem, 6.2vw, 6.5rem))
```

### Spacing
```
var(--wp--preset--spacing--40, 1rem)
var(--wp--preset--spacing--50, 1.5rem)
var(--wp--preset--spacing--60, 2.25rem)
var(--wp--preset--spacing--70, 3.38rem)
var(--wp--preset--spacing--80, 5.06rem)
```

### Border Radius
```
var(--wp--custom--border-radius--mini, 5px)
var(--wp--custom--border-radius--small, 10px)
var(--wp--custom--border-radius--medium, 15px)
var(--wp--custom--border-radius--large, 20px)
```

### Shadows & Transitions
```
var(--wp--preset--shadow--soft, 0px 15px 30px 0px rgba(119, 123, 146, 0.1))
var(--wp--preset--shadow--elegant, 0px 5px 23px 0px rgba(188, 207, 219, 0.35))
var(--wp--custom--transition--ease, all 0.5s ease)
var(--wp--custom--transition--smooth, all 1s cubic-bezier(0.66,0,0.34,1))
```

**See `docs/09-css-variables.md` for complete list.**

---

## Common Patterns

### Page Wrapper (for multi-section pages)

**ALWAYS** wrap full pages in a single container. This is critical for controlling spacing.

**Why Page Wrapper is essential:**
- **Eliminates unwanted gaps** - WordPress/themes often add margins between blocks
- **Unified control** - one place to manage page-level spacing
- **Prevents theme interference** - overrides default block margins
- **Consistent structure** - predictable behavior across themes

```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-page001","type":"inner","localId":"gsbp-page001","align":"full","styleAttributes":{"marginBlockStart":["0px"]},"metadata":{"name":"Page Wrapper"}} -->
<div class="gsbp-page001 alignfull">
  <!-- All sections go here -->
</div>
<!-- /wp:greenshift-blocks/element -->
```

**Key points:**
- `align:"full"` in JSON + `alignfull` in HTML class
- `marginBlockStart:["0px"]` removes top margin forced by themes
- All section wrappers go inside this container
- Sections inside should NOT have extra top/bottom margins

### Full-Width Section Wrapper
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","tag":"section","type":"inner","localId":"gsbp-XXXXXXX","align":"full","styleAttributes":{"display":["flex"],"justifyContent":["center"],"flexDirection":["column"],"alignItems":["center"],"paddingRight":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dspacing\u002d\u002dside, min(3vw, 20px))"],"paddingLeft":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dspacing\u002d\u002dside, min(3vw, 20px))"],"paddingTop":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d80, 5rem)"],"paddingBottom":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d80, 5rem)"],"marginBlockStart":["0px"]},"isVariation":"contentwrapper"} -->
<section class="gsbp-XXXXXXX alignfull">
  <!-- Content Area -->
</section>
<!-- /wp:greenshift-blocks/element -->
```

### Content Area (Centered Container)

**IMPORTANT:** Use `content-size` (not `wide-size`) for content width:

```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","type":"inner","localId":"gsbp-XXXXXXX","styleAttributes":{"maxWidth":["100%"],"width":["var(\u002d\u002dwp\u002d\u002dstyle\u002d\u002dglobal\u002d\u002dcontent-size, 1290px)"]},"isVariation":"nocolumncontent","metadata":{"name":"Content Area"}} -->
<div class="gsbp-XXXXXXX">
  <!-- Inner content -->
</div>
<!-- /wp:greenshift-blocks/element -->
```

### Two-Column Layout
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","type":"inner","localId":"gsbp-XXXXXXX","styleAttributes":{"display":["flex"],"flexColumns_Extra":2,"flexWidths_Extra":{"desktop":{"name":"50/50","widths":[50,50]},"tablet":{"name":"50/50","widths":[50,50]},"mobile":{"name":"100/100","widths":[100,100]}},"flexDirection":["row"],"columnGap":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d60, 2rem)"],"rowGap":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d60, 2rem)"],"flexWrap":["wrap"]},"isVariation":"contentarea"} -->
<div class="gsbp-XXXXXXX">
  <!-- Column 1 -->
  <!-- Column 2 -->
</div>
<!-- /wp:greenshift-blocks/element -->
```

**See `docs/03-layouts.md` for more layout patterns.**

### Heading with Animation
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","textContent":"Your Heading","tag":"h2","animation":{"duration":800,"easing":"ease","type":"fade-up","onlyonce":true},"localId":"gsbp-XXXXXXX","styleAttributes":{"marginBottom":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dspacing\u002d\u002d50, 1.5rem)"]}} -->
<h2 data-aos="fade-up" data-aos-easing="ease" data-aos-duration="800" data-aos-once="true" class="gsbp-XXXXXXX">Your Heading</h2>
<!-- /wp:greenshift-blocks/element -->
```

**Note:** No `fontSize` or `color` on heading - theme handles typography. Only `marginBottom` for spacing.

**See `docs/05-animations.md` for all animation options.**

### Button/Link
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","textContent":"Click Here","tag":"a","localId":"gsbp-XXXXXXX","href":"#","styleAttributes":{"display":["inline-flex"],"paddingTop":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dbutton\u002d\u002dspacing\u002d\u002dvertical, 1rem)"],"paddingBottom":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dbutton\u002d\u002dspacing\u002d\u002dvertical, 1rem)"],"paddingLeft":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dbutton\u002d\u002dspacing\u002d\u002dhorizontal, 2rem)"],"paddingRight":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dbutton\u002d\u002dspacing\u002d\u002dhorizontal, 2rem)"],"backgroundColor":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dcolor\u002d\u002dprimary, #000)"],"color":["#fff"],"borderRadius":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dborder-radius\u002d\u002dmedium, 15px)"],"textDecoration":["none"],"transition":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dtransition\u002d\u002dease, all 0.5s ease)"],"backgroundColor_hover":["var(\u002d\u002dwp\u002d\u002dpreset\u002d\u002dcolor\u002d\u002dsecondary, #333)"]}} -->
<a class="gsbp-XXXXXXX" href="#">Click Here</a>
<!-- /wp:greenshift-blocks/element -->
```

### Image
```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-XXXXXXX","tag":"img","localId":"gsbp-XXXXXXX","src":"https://placehold.co/800x600","alt":"Description","originalWidth":800,"originalHeight":600,"styleAttributes":{"width":["100%"],"height":["auto"],"objectFit":["cover"],"borderRadius":["var(\u002d\u002dwp\u002d\u002dcustom\u002d\u002dborder-radius\u002d\u002dsmall, 10px)"]}} -->
<img class="gsbp-XXXXXXX" src="https://placehold.co/800x600" alt="Description" width="800" height="600" loading="lazy"/>
<!-- /wp:greenshift-blocks/element -->
```

---

## Block Variations (`isVariation`)

| Variation | Use Case | Details |
|-----------|----------|---------|
| `"contentwrapper"` | Full-width section wrapper | See `docs/03-layouts.md` |
| `"nocolumncontent"` | Centered content area | See `docs/03-layouts.md` |
| `"contentcolumns"` / `"contentarea"` | Column layouts | See `docs/03-layouts.md` |
| `"accordion"` | Collapsible accordion | See `docs/08-variations.md` |
| `"tabs"` | Tab interface | See `docs/08-variations.md` |
| `"counter"` | Animated number counter | See `docs/08-variations.md` |
| `"countdown"` | Countdown timer | See `docs/08-variations.md` |
| `"marquee"` | Scrolling marquee | See `docs/08-variations.md` |
| `"buttoncomponent"` | Styled button | See `docs/08-variations.md` |
| `"videolightbox"` | Video with lightbox | See `docs/08-variations.md` |

---

## Animation Options

Available `animation.type` values:
- `fade`, `fade-up`, `fade-down`, `fade-left`, `fade-right`
- `zoom-in`, `zoom-in-up`, `zoom-in-down`, `zoom-out`
- `slide-up`, `slide-down`, `slide-left`, `slide-right`
- `flip-up`, `flip-down`, `flip-left`, `flip-right`
- `clip-right`, `clip-left`, `clip-up`, `clip-down`

Animation parameters: `duration` (ms), `delay` (ms), `easing`, `onlyonce` (boolean)

**See `docs/05-animations.md` for keyframe animations and scroll-linked animations.**

---

## Dynamic Content

For blocks displaying WordPress data (posts, users, taxonomies):

```html
<!-- wp:greenshift-blocks/element {"id":"gsbp-xxx","textContent":"<dynamictext></dynamictext>","dynamictext":{"dynamicEnable":true,"dynamicType":"postdata","dynamicSource":"latest_item","dynamicPostData":"post_title"},"localId":"gsbp-xxx"} -->
<div class="gsbp-xxx"><dynamictext></dynamictext></div>
<!-- /wp:greenshift-blocks/element -->
```

**See `docs/07-dynamic-content.md` for all dynamic types and query grids.**

---

## Slider Blocks

Use `greenshift-blocks/swiper` for image galleries and hero sliders.

**CRITICAL:** For image gallery slides, use `greenshift-blocks/element` with `tag:"img"` inside `slider-content-zone`. Do NOT put images directly in `slider-image-wrapper`.

**See `docs/06-slider.md` for complete slider documentation and correct structure.**

---

## Design Detail Attention Checklist

Before generating output, verify these visual details from the reference design:

### 1. Border Radius
- Card/container radius vs image/inner element radius (usually different)
- Are corners rounded on all 4 sides or specific corners only?
- Is it subtle (5-10px), medium (15px), large (20-30px), or pill (50px+)?

### 2. Padding/Margins
- Is image edge-to-edge or inset with visible container background?
- Gap between image and footer/content below
- Internal padding of content areas

### 3. Image Handling
- Does image fill container (`object-fit: cover`) or maintain aspect ratio (`object-fit: contain`)?
- Does image have its own rounded corners separate from container?
- Aspect ratio of image area
- `originalWidth`/`originalHeight` in JSON → matching `width`/`height` in HTML

### 4. Shadows
- Subtle vs prominent shadow
- Shadow on card vs shadow on image

### 5. Background Relationships
- Section background vs card background vs image background
- Overlay effects or gradients

---

## Output Validation Rules

Before outputting Greenshift blocks, verify these critical rules:

1. **No HTML comments** - Use `metadata:{"name":"..."}` instead of `<!-- Section Name -->`
2. **Page wrapper required** - Multi-section pages MUST be wrapped in element with `align:"full"` and `<div class="... alignfull">`
3. **Image dimensions** - When `originalWidth`/`originalHeight` in JSON, add matching `width`/`height` to HTML `<img>` tag
4. **SVG attributes** - Don't include `fill="none"` on outer `<svg>` element (WordPress strips it - put on `<path>` elements)
5. **Slider images** - Use `greenshift-blocks/element` blocks in `slider-content-zone`, NOT direct `<img>` in `slider-image-wrapper`
6. **Slider swipe JSON** - Use `imageurl:""` (empty string), add `bgContain:false`

---

## Output Requirements

- Return **only** the generated block code
- Block names: `wp:greenshift-blocks/element` (or specialized like `swiper`, `querygrid`)
- No explanations or surrounding text
- **No HTML comments** - WordPress strips them; use `metadata:{"name":"..."}` for organization
- Ready to paste directly into WordPress Gutenberg code editor
- Save output as `.html` files

---

## Example Templates

Reference templates are in the `templates/` directory:
- `section-wrapper.html` - Full-width section wrapper
- `two-columns.html` - Two-column responsive layout
- `hero-section.html` - Hero section with background
- `card-grid.html` - Card grid layout

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.