{
"columns": {
"blockSchema": {
"properties": {
"title": {
"title": "Title"
},
"top_images": {
"title": "Top Images",
"widget": "blocks_layout",
"allowedBlocks": [
"image"
]
},
"columns": {
"title": "Columns",
"widget": "blocks_layout",
"allowedBlocks": [
"column"
],
"maxLength": 4
}
}
}
},
"column": {
"blockSchema": {
"properties": {
"title": {
"title": "Title"
},
"blocks_layout": {
"title": "Content",
"widget": "blocks_layout",
"allowedBlocks": [
"slate",
"image"
],
"defaultBlockType": "slate"
}
}
}
}
}
{
"@type": "columns",
"title": "Our Services",
"blocks": {
"col-1": {
"@type": "column",
"title": "Design",
"blocks": {
"text-1": {
"@type": "slate",
"value": [
{
"type": "p",
"children": [
{
"text": "We craft beautiful interfaces."
}
]
}
]
}
},
"blocks_layout": {
"items": [
"text-1"
]
}
},
"col-2": {
"@type": "column",
"title": "Engineering",
"blocks": {
"text-2": {
"@type": "slate",
"value": [
{
"type": "p",
"children": [
{
"text": "We build robust systems."
}
]
}
]
}
},
"blocks_layout": {
"items": [
"text-2"
]
}
}
},
"columns": {
"items": [
"col-1",
"col-2"
]
}
}
function GridBlock({ block }) {
const blocks = block.blocks || {};
const items = block.blocks_layout?.items || [];
return (
<div data-block-uid={block['@uid']} className="grid-block">
<div style={{ display: 'grid', gridTemplateColumns: `repeat(${items.length}, 1fr)`, gap: '1rem' }}>
{items.map(id => {
const child = { ...blocks[id], '@uid': id };
return (
<div key={id} className="grid-cell">
<BlockRenderer block={child} />
</div>
);
})}
</div>
</div>
);
}<template>
<div :data-block-uid="block['@uid']" class="grid-block">
<div :style="{ display: 'grid', gridTemplateColumns: `repeat(${items.length}, 1fr)`, gap: '1rem' }">
<div v-for="id in items" :key="id" class="grid-cell">
<BlockRenderer :block="{ ...block.blocks[id], '@uid': id }" />
</div>
</div>
</div>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({ block: Object });
const items = computed(() => props.block.blocks_layout?.items || []);
</script><script>
import BlockRenderer from './BlockRenderer.svelte';
export let block;
$: blocks = block.blocks || {};
$: items = block.blocks_layout?.items || [];
</script>
<div data-block-uid={block['@uid']} class="grid-block">
<div style="display: grid; grid-template-columns: repeat({items.length}, 1fr); gap: 1rem">
{#each items as id (id)}
<div class="grid-cell">
<BlockRenderer block={{ ...blocks[id], '@uid': id }} />
</div>
{/each}
</div>
</div>
{
"columns": {
"blockSchema": {
"properties": {
"title": {
"title": "Title"
},
"top_images": {
"title": "Top Images",
"widget": "blocks_layout",
"allowedBlocks": [
"image"
]
},
"columns": {
"title": "Columns",
"widget": "blocks_layout",
"allowedBlocks": [
"column"
],
"maxLength": 4
}
}
}
},
"column": {
"blockSchema": {
"properties": {
"title": {
"title": "Title"
},
"blocks_layout": {
"title": "Content",
"widget": "blocks_layout",
"allowedBlocks": [
"slate",
"image"
],
"defaultBlockType": "slate"
}
}
}
}
}
{
"@type": "columns",
"title": "Our Services",
"blocks": {
"col-1": {
"@type": "column",
"title": "Design",
"blocks": {
"text-1": {
"@type": "slate",
"value": [
{
"type": "p",
"children": [
{
"text": "We craft beautiful interfaces."
}
]
}
]
}
},
"blocks_layout": {
"items": [
"text-1"
]
}
},
"col-2": {
"@type": "column",
"title": "Engineering",
"blocks": {
"text-2": {
"@type": "slate",
"value": [
{
"type": "p",
"children": [
{
"text": "We build robust systems."
}
]
}
]
}
},
"blocks_layout": {
"items": [
"text-2"
]
}
}
},
"columns": {
"items": [
"col-1",
"col-2"
]
}
}
function GridBlock({ block }) {
const blocks = block.blocks || {};
const items = block.blocks_layout?.items || [];
return (
<div data-block-uid={block['@uid']} className="grid-block">
<div style={{ display: 'grid', gridTemplateColumns: `repeat(${items.length}, 1fr)`, gap: '1rem' }}>
{items.map(id => {
const child = { ...blocks[id], '@uid': id };
return (
<div key={id} className="grid-cell">
<BlockRenderer block={child} />
</div>
);
})}
</div>
</div>
);
}<template>
<div :data-block-uid="block['@uid']" class="grid-block">
<div :style="{ display: 'grid', gridTemplateColumns: `repeat(${items.length}, 1fr)`, gap: '1rem' }">
<div v-for="id in items" :key="id" class="grid-cell">
<BlockRenderer :block="{ ...block.blocks[id], '@uid': id }" />
</div>
</div>
</div>
</template>
<script setup>
import { computed } from 'vue';
const props = defineProps({ block: Object });
const items = computed(() => props.block.blocks_layout?.items || []);
</script><script>
import BlockRenderer from './BlockRenderer.svelte';
export let block;
$: blocks = block.blocks || {};
$: items = block.blocks_layout?.items || [];
</script>
<div data-block-uid={block['@uid']} class="grid-block">
<div style="display: grid; grid-template-columns: repeat({items.length}, 1fr); gap: 1rem">
{#each items as id (id)}
<div class="grid-cell">
<BlockRenderer block={{ ...blocks[id], '@uid': id }} />
</div>
{/each}
</div>
</div>