",
"info": "Add custom HTML code"
}
```
#### richtext
WYSIWYG rich text editor:
```json
{
"type": "richtext",
"id": "announcement_content",
"label": "Announcement Bar Content",
"default": "
Free shipping on orders over $50!
"
}
```
### Numeric Inputs
#### number
Numeric input field:
```json
{
"type": "number",
"id": "products_per_page",
"label": "Products Per Page",
"default": 12,
"min": 1,
"max": 100,
"step": 1,
"info": "Number of products to show per page"
}
```
#### range
Slider input:
```json
{
"type": "range",
"id": "columns",
"label": "Number of Columns",
"min": 2,
"max": 6,
"step": 1,
"default": 4,
"unit": "columns",
"info": "Adjust the grid layout"
}
```
**Common units:**
- `px` - Pixels
- `%` - Percentage
- `em` - Em units
- `rem` - Root em units
- Custom text (like "columns", "items")
### Boolean Inputs
#### checkbox
Toggle checkbox:
```json
{
"type": "checkbox",
"id": "show_search",
"label": "Show Search Bar",
"default": true,
"info": "Display search in header"
}
```
#### boolean
Boolean setting (same as checkbox):
```json
{
"type": "boolean",
"id": "enable_feature",
"label": "Enable Feature",
"default": false
}
```
### Selection Inputs
#### select
Dropdown menu:
```json
{
"type": "select",
"id": "layout_style",
"label": "Layout Style",
"options": [
{
"value": "boxed",
"label": "Boxed"
},
{
"value": "full-width",
"label": "Full Width"
},
{
"value": "wide",
"label": "Wide"
}
],
"default": "full-width",
"info": "Choose your layout style"
}
```
#### radio
Radio button selection:
```json
{
"type": "radio",
"id": "text_alignment",
"label": "Text Alignment",
"options": [
{ "value": "left", "label": "Left" },
{ "value": "center", "label": "Centre" },
{ "value": "right", "label": "Right" }
],
"default": "center"
}
```
### Colour Inputs
#### color
Colour picker:
```json
{
"type": "color",
"id": "primary_color",
"label": "Primary Colour",
"default": "#000000",
"info": "Main brand colour"
}
```
#### color_background
Colour with gradient support:
```json
{
"type": "color_background",
"id": "section_background",
"label": "Section Background",
"default": "linear-gradient(#ffffff, #000000)"
}
```
**Supports:**
- Solid colours: `#ffffff`
- Linear gradients: `linear-gradient(#fff, #000)`
- Radial gradients
- With opacity
### Media Inputs
#### image_picker
Image upload and selection:
```json
{
"type": "image_picker",
"id": "logo",
"label": "Logo Image",
"info": "Recommended size: 300x100px"
}
```
Access in Liquid:
```liquid
{% if settings.logo %}
{% endif %}
{{ settings.logo.width }}
{{ settings.logo.height }}
{{ settings.logo.alt }}
{{ settings.logo.src }}
```
#### media
Image or video picker:
```json
{
"type": "media",
"id": "hero_media",
"label": "Hero Media",
"accept": ["image", "video"],
"info": "Upload image or video"
}
```
#### video_url
Video URL input (YouTube, Vimeo):
```json
{
"type": "video_url",
"id": "promo_video",
"label": "Promo Video",
"accept": ["youtube", "vimeo"],
"placeholder": "https://www.youtube.com/watch?v=...",
"info": "YouTube or Vimeo URL"
}
```
Access in Liquid:
```liquid
{% if settings.promo_video %}
{{ settings.promo_video.type }} {# youtube or vimeo #}
{{ settings.promo_video.id }} {# Video ID #}
{% endif %}
```
### Typography Inputs
#### font_picker
Google Fonts selector:
```json
{
"type": "font_picker",
"id": "heading_font",
"label": "Heading Font",
"default": "helvetica_n7",
"info": "Font for headings"
}
```
**Font format:** `family_weight`
- `n4` - Normal 400
- `n7` - Bold 700
- `i4` - Italic 400
Access in Liquid:
```liquid
{{ settings.heading_font.family }}
{{ settings.heading_font.weight }}
{{ settings.heading_font.style }}
{# CSS font face #}
```
### Resource Pickers
#### product
Product selector:
```json
{
"type": "product",
"id": "featured_product",
"label": "Featured Product",
"info": "Select a product to feature"
}
```
Access in Liquid:
```liquid
{% assign product = all_products[settings.featured_product] %}
{{ product.title }}
{{ product.price | money }}
```
#### collection
Collection selector:
```json
{
"type": "collection",
"id": "featured_collection",
"label": "Featured Collection",
"info": "Select a collection to feature"
}
```
Access in Liquid:
```liquid
{% assign collection = collections[settings.featured_collection] %}
{{ collection.title }}
{% for product in collection.products limit: 4 %}
{{ product.title }}
{% endfor %}
```
#### page
Page selector:
```json
{
"type": "page",
"id": "about_page",
"label": "About Page",
"info": "Link to about page"
}
```
Access in Liquid:
```liquid
{% assign page = pages[settings.about_page] %}
{{ page.title }}
{{ page.content }}
```
#### blog
Blog selector:
```json
{
"type": "blog",
"id": "main_blog",
"label": "Main Blog",
"info": "Select your primary blog"
}
```
Access in Liquid:
```liquid
{% assign blog = blogs[settings.main_blog] %}
{{ blog.title }}
{% for article in blog.articles limit: 3 %}
{{ article.title }}
{% endfor %}
```
#### article
Article (blog post) selector:
```json
{
"type": "article",
"id": "featured_article",
"label": "Featured Article",
"info": "Select an article to feature"
}
```
#### link_list
Menu/navigation selector:
```json
{
"type": "link_list",
"id": "main_menu",
"label": "Main Navigation",
"default": "main-menu",
"info": "Select menu for header"
}
```
Access in Liquid:
```liquid
{% assign menu = linklists[settings.main_menu] %}
{% for link in menu.links %}
{{ link.title }}
{% if link.links.size > 0 %}
{# Nested links #}
{% for child_link in link.links %}
{{ child_link.title }}
{% endfor %}
{% endif %}
{% endfor %}
```
### URL Inputs
#### url
URL input field:
```json
{
"type": "url",
"id": "twitter_url",
"label": "Twitter URL",
"placeholder": "https://twitter.com/username",
"info": "Your Twitter profile URL"
}
```
### Date & Time Inputs
#### date
Date picker:
```json
{
"type": "date",
"id": "sale_end_date",
"label": "Sale End Date",
"info": "When the sale ends"
}
```
Access in Liquid:
```liquid
{{ settings.sale_end_date | date: '%B %d, %Y' }}
```
### Organisation Elements
#### header
Visual separator with heading:
```json
{
"type": "header",
"content": "Colour Scheme Settings",
"info": "Configure your colour palette"
}
```
Not a setting, just a visual divider in the settings panel.
#### paragraph
Informational text block:
```json
{
"type": "paragraph",
"content": "These settings control the appearance of your product cards. Make sure to preview changes on different screen sizes."
}
```
### Advanced Inputs
#### liquid
Liquid code editor:
```json
{
"type": "liquid",
"id": "custom_liquid",
"label": "Custom Liquid Code",
"info": "Add custom Liquid code"
}
```
#### inline_richtext
Inline rich text (no `
` wrapper):
```json
{
"type": "inline_richtext",
"id": "banner_text",
"label": "Banner Text",
"default": "Welcome to our store!",
"info": "Text without paragraph wrapper"
}
```
## Best Practices
1. **Use JSON templates** for Online Store 2.0 compatibility
2. **Make sections dynamic** with blocks for merchant flexibility
3. **Add `shopify_attributes`** to section/block containers for theme editor
4. **Provide sensible defaults** in schema settings
5. **Use snippets** for repeated UI components
6. **Add `{% stylesheet %}` and `{% javascript %}`** blocks in sections for scoped styles
7. **Include accessibility** attributes (ARIA labels, alt text)
8. **Test in theme editor** to ensure live preview works
9. **Document snippet parameters** with comments
10. **Use semantic HTML** for better SEO
11. **Group related settings** into logical sections
12. **Provide clear labels and info text** for guidance
13. **Use appropriate input types** for each setting
14. **Add placeholder text** for URL and text inputs
15. **Use headers and paragraphs** to organise complex sections
16. **Limit range values** to reasonable min/max
17. **Test in theme customiser** to ensure good UX
18. **Document dependencies** between settings
19. **Consider mobile experience** when choosing input types