# All Visible Content from Schema Settings

Never hardcode visible text or media in templates. Every piece of content must come from schema settings so merchants can edit it in the theme customizer.

```liquid
{% comment %} BAD: hardcoded content — not editable {% endcomment %}
<h2>Our Features</h2>
<p>We offer the best services for your business.</p>
<img src="hero.jpg" alt="Hero">

{% comment %} GOOD: all content from schema settings {% endcomment %}
{%- if section.settings.title != blank -%}
  <h2>{{ section.settings.title }}</h2>
{%- endif -%}
{%- if section.settings.text != blank -%}
  <p>{{ section.settings.text }}</p>
{%- endif -%}
{%- if section.settings.image != blank -%}
  <img src="{{ section.settings.image | image_url: width: 1440 }}" alt="{{ section.settings.image.alt }}">
{%- endif -%}
```

Use `default` in the schema to provide placeholder content that shows before the merchant edits:

```json
{% schema %}
{
  "settings": [
    { "type": "text", "id": "title", "label": "Title", "default": "Our Features" },
    { "type": "richtext", "id": "text", "label": "Description", "default": "<p>We offer the best services for your business.</p>" }
  ]
}
{% endschema %}
```
