# Blueprint

# Schema

# What is the schema?

The schema defines all the components that are available to the theme:

<table border="1" id="bkmrk-concept-description-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 50%;"></col><col style="width: 50%;"></col></colgroup><tbody><tr><td>**Component**  
</td><td>**Description**  
</td></tr><tr><td>**Templates**</td><td>The major page types (e.g. homepage, product page).

</td></tr><tr><td>**Sections**</td><td>Reusable layout components that can contain blocks.

</td></tr><tr><td>**Blocks**</td><td>Reusable items available for use inside sections.

</td></tr><tr><td>**Settings**</td><td>Configurable options for the entire theme, specific sections or specific blocks.

</td></tr><tr><td>**Presets**</td><td>Configurable presets for options to avoid repetition.

</td></tr></tbody></table>

---

## Location

The schema should be created at the following location in your local storage disk:

```
"themes/{$theme}/blueprint/schema.json";
```

When you have made unsaved changes to the schema a copy will be temporarily made at:

```
"blueprint/{$theme}/temp/versions/{$version}/schema.json"
```

And when you save any changes a new schema will be stored at:

```
"blueprint/{$theme}/versions/{$version}/schema.json"
```

Where `$theme` is your store's theme and `$version` is the current active version (defaults to `main`).

---

## Templates

Templates define the major page types that your theme supports.

### Types

These are the supported template types as of `10/27/2025`:

- `homepage`
- `listings`
- `products`
- `pages`
- `cart`
- `blogs` (if [`aerocargo/blog`](https://agora.aerocommerce.com/packages/aerocargo/blog) `1.x` or `2.x` is installed)
- `blog-listings` (if [`aerocargo/blog`](https://agora.aerocommerce.com/packages/aerocargo/blog) `2.x` is installed)
- `error-404`

### Structure

<table border="1" id="bkmrk-key-description-requ" style="border-collapse: collapse; width: 100%; height: 178.781px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**  
</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`id`</td><td>A unique identifier for the template.</td><td class="align-left">Yes</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`type`</td><td>The type of template (e.g. `homepage`, `products`, `pages`).</td><td class="align-left">Yes</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`variants`</td><td>An array of variations for this template.</td><td class="align-left">No</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`variants.*.id`</td><td>A unique identifier for the template variant.</td><td class="align-left">Yes</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`variants.*.name`</td><td>The name of the template variants.</td><td class="align-left">Yes</td></tr></tbody></table>

### Example

```json
{
    "templates": {
        "homepage": {
            "id": "homepage",
            "type": "homepage"
        },
        "products": {
            "id": "products",
            "type": "products",
            "variants": [
                {
                    "id": "default",
                    "name": "Default Product"
                }
            ]
        }
    }
}
```

---

## Sections

Sections are reusable building blocks that can be added to templates.

### Structure

<table border="1" id="bkmrk-key-description-requ-1" style="border-collapse: collapse; width: 100%; height: 437.953px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`id`</td><td style="height: 46.5938px;">A unique alpha-numeric identifier for the section.</td><td class="align-left" style="height: 46.5938px;">Yes</td></tr><tr style="height: 80.1875px;"><td style="height: 80.1875px;">`preview`</td><td style="height: 80.1875px;">Filename of an image located in public storage at `/images/blueprint/previews` (used in the section picker).</td><td class="align-left" style="height: 80.1875px;">No</td></tr><tr style="height: 63.3906px;"><td style="height: 63.3906px;">`icon`</td><td style="height: 63.3906px;">The key of an icon to use (overrides the predicted icon determined by what settings the section contains).</td><td class="align-left" style="height: 63.3906px;">No</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`name`</td><td style="height: 29.7969px;">The display name of the section.</td><td class="align-left" style="height: 29.7969px;">Yes</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`max_blocks`</td><td style="height: 46.5938px;">The maximum number of blocks allowed in this section.</td><td class="align-left" style="height: 46.5938px;">No</td></tr><tr style="height: 35.3984px;"><td style="height: 35.3984px;">`settings`</td><td style="height: 35.3984px;">An array of Setting objects.</td><td class="align-left" style="height: 35.3984px;">No</td></tr><tr style="height: 35.3984px;"><td style="height: 35.3984px;">`blocks`</td><td style="height: 35.3984px;">An array of Block objects.</td><td class="align-left" style="height: 35.3984px;">No</td></tr><tr style="height: 35.3984px;"><td style="height: 35.3984px;">`scopes`</td><td style="height: 35.3984px;">An array of Scope objects.</td><td class="align-left" style="height: 35.3984px;">No</td></tr><tr style="height: 35.3984px;"><td style="height: 35.3984px;">`variations`</td><td style="height: 35.3984px;">An array of Variation objects.</td><td class="align-left" style="height: 35.3984px;">No</td></tr></tbody></table>

### Example

```json
{
    "id": "announcement-bar",
    "preview": "announcement-bar.png",
    "name": "Announcement Bar",
    "max_blocks": 4
}
```

---

## Blocks

Blocks represent repeatable content items within a section.

##### Structure

<table border="1" id="bkmrk-key-description-requ-2" style="border-collapse: collapse; width: 100%; height: 178.781px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`type`</td><td>The type of block (e.g. `message`, `image`, `button`)</td><td class="align-left">Yes</td></tr><tr><td>`display`</td><td>The title of the block (overrides the auto-generated one determined from the block’s settings)</td><td class="align-left">No</td></tr><tr><td>`name`</td><td>The name of the block (displayed in the block picker)</td><td class="align-left">Yes</td></tr><tr><td>`settings`</td><td>An array of [Setting](https://github.com/aerocommerce/blueprint#schema--settings) objects</td><td class="align-left">Yes</td></tr></tbody></table>

### Example

```json
{
  "type": "message",
  "name": "Message",
  "settings": []
}
```

---

## Settings

Settings are configurable options for the entire theme, specific sections or specific blocks

### Types

These are the supported setting types as of `10/27/2025`:

- `checkbox`
- `color`
- `css`
- `eloquent`
- `html`
- `image`
- `link`
- `number`
- `pill_select`
- `radio`
- `range`
- `richtext`
- `select`
- `text`
- `video`

### Structure

#### Base Setting

<table border="1" id="bkmrk-key-description-requ-3" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`id`</td><td style="height: 29.7969px;">A unique identifier for the setting</td><td class="align-left" style="height: 29.7969px;">Yes</td></tr><tr style="height: 63.3906px;"><td style="height: 63.3906px;">`type`</td><td style="height: 63.3906px;">The setting type (e.g. `color`, `select`, `checkbox`, `eloquent`)</td><td class="align-left" style="height: 63.3906px;">Yes</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`label`</td><td style="height: 46.5938px;">The name of the setting shown in the editor</td><td class="align-left" style="height: 46.5938px;">Yes</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`default`</td><td style="height: 29.7969px;">The default value for this setting</td><td class="align-left" style="height: 29.7969px;">No</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`group`</td><td style="height: 46.5938px;">A group name (e.g. `custom_styling`) to organize related settings</td><td class="align-left" style="height: 46.5938px;">No</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`info`</td><td style="height: 29.7969px;">Additional helper text or hint</td><td class="align-left" style="height: 29.7969px;">No</td></tr><tr style="height: 46.5938px;"><td style="height: 46.5938px;">`rules`</td><td style="height: 46.5938px;">A rule string that determines when the setting should show/hide</td><td class="align-left" style="height: 46.5938px;">No</td></tr></tbody></table>

#### Eloquent Setting

<table border="1" id="bkmrk-key-description-requ-4" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col><col style="width: 33.3731%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`model`</td><td>The model that the eloquent setting is for, e.g. `product`</td><td align="center" class="align-left">Yes</td></tr></tbody></table>

#### Number Setting

<table border="1" id="bkmrk-key-description-requ-5" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`unit`</td><td>The unit of the number, e.g. `mph`</td><td class="align-left">No</td></tr><tr><td>`min`</td><td>The minimum value the number setting can be</td><td class="align-left">No</td></tr><tr><td>`max`</td><td>The maximum value the number setting can be</td><td class="align-left">No</td></tr><tr><td>`step`</td><td>The step size used</td><td class="align-left">No</td></tr></tbody></table>

#### Radio Setting

<table border="1" id="bkmrk-key-description-requ-6" style="border-collapse: collapse; width: 100%; height: 148.984px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`preset`</td><td style="height: 29.7969px;">An id of an options preset to use</td><td class="align-left" style="height: 29.7969px;">`*`</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`options`</td><td style="height: 29.7969px;">An array of options</td><td class="align-left" style="height: 29.7969px;">`*`</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`options.*.value`</td><td style="height: 29.7969px;">The value of the option</td><td class="align-left" style="height: 29.7969px;">Yes</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">`options.*.label`</td><td style="height: 29.7969px;">The label for the option</td><td class="align-left" style="height: 29.7969px;">Yes</td></tr></tbody></table>

`*` One of `preset` and `options` is required, if both are present `preset` will take priority.

#### Range Setting

<table border="1" id="bkmrk-key-description-requ-7" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`unit`</td><td>The unit of the number, e.g. `mph`</td><td class="align-left">No</td></tr><tr><td>`min`</td><td>The minimum value the number setting can be</td><td class="align-left">No</td></tr><tr><td>`max`</td><td>The maximum value the number setting can be</td><td class="align-left">No</td></tr><tr><td>`step`</td><td>The step size used</td><td class="align-left">No</td></tr></tbody></table>

#### Select Setting

<table border="1" id="bkmrk-key-description-requ-8" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`preset`</td><td>An id of an options preset to use</td><td class="align-left">`*`</td></tr><tr><td>`options`</td><td>An array of options</td><td class="align-left">`*`</td></tr><tr><td>`options.*.value`</td><td>The value of the option</td><td class="align-left">Yes</td></tr><tr><td>`options.*.label`</td><td>The label for the option</td><td class="align-left">Yes</td></tr></tbody></table>

`*` One of `preset` and `options` is required, if both are present `preset` will take priority.

#### Pill Select Setting

<table border="1" id="bkmrk-key-description-requ-9" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`preset`</td><td>An id of an options preset to use</td><td align="center">`*`</td></tr><tr><td>`options`</td><td>An array of options</td><td align="center">`*`</td></tr><tr><td>`options.*.value`</td><td>The value of the option</td><td align="center">Yes</td></tr><tr><td>`options.*.label`</td><td>The label for the option</td><td align="center">Yes</td></tr></tbody></table>

`*` One of `preset` and `options` is required, if both are present `preset` will take priority.

### Examples

```json
[
    {
        "id": "background_color",
        "type": "color",
        "label": "Background colour",
        "default": "#ffffff"
    },
    {
        "id": "border",
        "type": "checkbox",
        "label": "Show separator line",
        "default": true
    },
    {
        "id": "padding_bottom",
        "group": "custom_styling",
        "label": "Padding bottom",
        "type": "select",
        "default": "xxs",
        "options": [
            {
                "label": "None",
                "value": "0"
            },
            {
                "label": "Small",
                "value": "sm"
            },
            {
                "label": "Medium",
                "value": "md"
            },
            {
                "label": "Large",
                "value": "lg"
            }
        ]
    },
    {
        "id": "scoped_css",
        "group": "custom_styling",
        "label": "CSS",
        "type": "css",
        "info": "Add custom styles to this section only."
    },
    {
        "id": "text",
        "type": "richtext",
        "label": "Text",
        "default": "Welcome to our store"
    },
    {
        "id": "link",
        "type": "link",
        "label": "Link"
    }
]
```

---

## Scopes

Scopes are used in sections to define which configs/templates they are available for use in.

### Structure

<table border="1" id="bkmrk-key-description-requ-10" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`id`</td><td>The config or template that the scope applies for</td><td class="align-left">Yes</td></tr><tr><td>`allowed`</td><td>If the section is allowed or not in that config/template</td><td class="align-left">Yes</td></tr></tbody></table>

### Example

```json
[
    {
        "id": "header",
        "allowed": true
    }
]
```

<p class="callout info">A section which the above scope will only be available for use inside the `header` config.</p>

---

## Presets

Presets are configurable options to avoid repetition.

### Structure

<table border="1" id="bkmrk-key-description-requ-11" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`options`</td><td>An array of options</td><td class="align-left">No</td></tr><tr><td>`options.*.value`</td><td>The value of the option</td><td class="align-left">Yes</td></tr><tr><td>`options.*.label`</td><td>The label for the option</td><td class="align-left">Yes</td></tr></tbody></table>

### Example

```json
{
    "options": {
        "padding": [
            {
                "label": "None",
                "value": "0"
            },
            {
                "label": "Extra extra small",
                "value": "xxs"
            },
            {
                "label": "Extra small",
                "value": "xs"
            },
            {
                "label": "Small",
                "value": "sm"
            },
            {
                "label": "Medium",
                "value": "md"
            },
            {
                "label": "Large",
                "value": "lg"
            },
            {
                "label": "Extra large",
                "value": "xl"
            }
        ]
    }
}
```

<p class="callout info">Adding this preset to a setting will allow it to inherit these options without having to explicitly define them on it.</p>

---

## Variations

Variations are used in sections to define layout presets for blocks.

### Structure

<table border="1" id="bkmrk-key-description-requ-12" style="border-collapse: collapse; width: 100%; height: 322.36px;"><colgroup><col style="width: 33.3731%;"></col><col style="width: 33.2539%;"></col><col style="width: 33.4923%;"></col></colgroup><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">**Key**  
</td><td style="height: 29.7969px;">**Description**  
</td><td style="height: 29.7969px;">**Required?**</td></tr><tr><td>`id`</td><td>A unique identifier for the variation</td><td align="center">Yes</td></tr><tr><td>`name`</td><td>The name of the variation</td><td align="center">Yes</td></tr><tr><td>`blocks`</td><td>An array of Block objects</td><td align="center">Yes</td></tr></tbody></table>

### Example

```json
{
    "id": "cms-grid",
    "name": "Content Grid",
    "settings": [],
    "blocks": [
        {
            "type": "image",
            "name": "Image",
            "settings": []
        },
        {
            "type": "text",
            "name": "Text",
            "settings": []
        }
    ],
    "variations": [
        {
            "id": "image-text",
            "name": "Image (Left), Text (Right)",
            "blocks": [
                {
                    "type": "image"
                },
                {
                    "type": "text"
                }
            ]
        },
        {
            "id": "text-image",
            "name": "Text (Left), Image (Right)",
            "blocks": [
                {
                    "type": "text"
                },
                {
                    "type": "image"
                }
            ]
        }
    ]
}
```

# How do I change where the schema is loaded from?

### Fallback Schema Location

The default fallback schema location is: `themes/{$theme}/blueprint/schema.json`. It is the base version of the schema, one that has had no changes made via the editor.

`setFallbackSchemaLoader` allows you to change the location that the fallback version of the schema is located at.

For example:

```php
\Aero\Blueprint\Facades\SchemaRepository::setFallbackSchemaLoader(function () {
    $path = base_path("modules/aerocargo/acme/schema.json");

    if (file_exists($path)) {
        return json_decode(file_get_contents($path), true);
    }

    return [];
});
```

### Temp Schema Location

The default temp schema location is: `blueprint/{$theme}/temp/versions/{$version}/schema.json`. It is the version of the schema that is temporarily saved while changes are pending via the editor.

`setTempSchemaLoader` allows you to change the location that the temp versions of schemas are located at.

For example:

```php
\Aero\Blueprint\Facades\SchemaRepository::setTempSchemaLoader(function (string $version) {
    $path = base_path("modules/aerocargo/acme/temp/versions/{$version}/schema.json");

    if (file_exists($path)) {
        return json_decode(file_get_contents($path), true);
    }

    return [];
});
```

### Active Schema Location

The default active schema location is: `blueprint/{$theme}/versions/{$version}/schema.json`. It is the version of the schema currently active for the theme.

`setActiveSchemaLoader` allows you to change the location that the active versions of schemas are located at.

For example:

```php
\Aero\Blueprint\Facades\SchemaRepository::setActiveSchemaLoader(function (string $version) {
    $path = base_path("modules/aerocargo/acme/versions/{$version}/schema.json");

    if (file_exists($path)) {
        return json_decode(file_get_contents($path), true);
    }

    return [];
});
```

<p class="callout warning">If you move the location that the active schema is loaded from, you will likely need to also use `setActiveSchemaPathResolver` and `setSaveSchemaHandler` to handle saving the schema appropriately.</p>

Or perhaps, you'd like to load the fallback schema as the active schema with only the templates from the actual active schema merged in:

```php
\Aero\Blueprint\Facades\SchemaRepository::setActiveSchemaLoader(function (string $version, string $disk, string $path) {
    // This is the one from storage that is currently active
    $activeSchema = json_decode(Storage::disk($disk)->get($path), true) ?? [];

    // This is the preset schema (the one from the theme)
    $fallbackSchema = \Aero\Blueprint\Facades\SchemaRepository::getFallbackSchema();

    // Merge only the templates from the active schema into the fallback schema
    return array_merge($fallbackSchema, [
        'templates' => $activeSchema['templates'] ?? $fallbackSchema['templates'] ?? [],
    ]);
});
```

### Saving Active Schema to Custom Location

`setActiveSchemaPathResolver` allows you to change the path that the active schema is considered to be located, it should be used in conjunction with `setActiveSchemaLoader` so that functionality such as saving collision checks still work.

For example:

```php
\Aero\Blueprint\Facades\SchemaRepository::setActiveSchemaPathResolver(function (string $version) {
    return base_path("modules/aerocargo/acme/versions/{$version}/schema.json");
});
```

`setSaveSchemaHandler` allows you to change how the schema is saved, it should be used in conjunction with `setActiveSchemaLoader` so that the schema is saved correctly to the new location.

```php
\Aero\Blueprint\Facades\SchemaRepository::setSaveSchemaHandler(function (string $version, array $schema) {
    \Illuminate\Support\Facades\File::put(
        base_path("modules/aerocargo/acme/versions/{$version}/schema.json"),
        json_encode($schema, JSON_PRETTY_PRINT)
    );
});
```

# Configs

# What is a config?

A config stores a JSON representation of the page layout created via the theme editor.

---

### Location

Configs should be created at the following location in your local storage disk:

```
"themes/{$theme}/blueprint/presets/config/{$key}.json"
```

When you have made unsaved changes to the config a copy will be temporarily made at:

```
"blueprint/{$theme}/temp/versions/{$previewVersion}/config/{$key}.json"
```

And when you save any changes a new config will be stored at:

```
"blueprint/{$theme}/versions/{$version}/config/{$key}.json"
```

Where `$theme` is your store's theme, `$key` is the configs name, `$version` is the current active version (defaults to `main`) and `$previewVersion` is the current preview version (auto-generated).

---

### Example

```json
{
    "containers": [
        {
            "id": "container__6ca06df5184f4189b8e741baf8a07857",
            "columns": [
                {
                    "id": "column__e226403543f44bb4ae2e692ba02acc58",
                    "sections": [
                        {
                            "id": "section__announcement-bar__f79ee129ad1f4df49dd0b9532a74d7bd",
                            "key": "announcement-bar",
                            "blocks": [
                                {
                                    "id": "block__message__82eb8b4a2e524a4fb7ab0e69a6c1c39f",
                                    "type": "message"
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}
```