<!-- Source: https://scoped.svelte.page/examples/spread-forwarding -->

# Spread Forwarding

> A third-level child example where a middle component forwards an already-scoped prop through a spread.

**Source:** [https://scoped.svelte.page/examples/spread-forwarding](https://scoped.svelte.page/examples/spread-forwarding)

**Markdown mirror:** [https://scoped.svelte.page/examples/spread-forwarding.md](https://scoped.svelte.page/examples/spread-forwarding.md)

---

This mirror preserves the prose, implementation notes, and runnable Svelte source behind the live example page.

## FIG-001: spread forwarding.

The parent scopes the value at the boundary. After that, a middle component can spread the prop to a third child because the scoped class string is already just normal prop data.

**Metadata:** tag: `SPREAD` | syntax: `scoped:class` | path: `parent → middle → child` | status: `passing`

### Source

#### SpreadForwarding.svelte

Source file: [src/lib/examples/scoped-props/demos/SpreadForwarding.svelte](https://github.com/humanspeak/svelte-scoped-props/blob/main/docs/src/lib/examples/scoped-props/demos/SpreadForwarding.svelte)

```svelte
<script lang="ts">
    import MiddleSpreadCard from './components/spread/MiddleSpreadCard.svelte'
</script>

<article class="scoped-proof passed dk-demo-shell">
    <div class="render-grid">
        <div class="render-example">
            <span class="example-label">Native element</span>
            <div class="demo-card parent-owned">This div receives the parent class directly.</div>
        </div>
        <div class="render-example">
            <span class="example-label">Middle spread to third child</span>
            <MiddleSpreadCard scoped:class="parent-owned" />
        </div>
    </div>

    <div class="comparison-grid">
        <div class="comparison-head">
            <span class="example-label">Source</span>
            <span class="example-label">Current result</span>
        </div>

        <div class="comparison-row">
            <div class="comparison-cell comparison-source">
                <span>Native element</span>
                <code>&lt;div class="demo-card parent-owned"&gt;</code>
            </div>
            <div class="comparison-cell comparison-result">
                <span>Native element</span>
                <code>demo-card parent-owned svelte-parent</code>
                <strong>baseline</strong>
            </div>
        </div>

        <div class="comparison-row">
            <div class="comparison-cell comparison-source">
                <span>Forwarded scoped prop</span>
                <code>&lt;MiddleSpreadCard scoped:class="parent-owned" /&gt;</code>
                <code>&lt;SpreadGrandchildCard &#123;...forwardedProps&#125; /&gt;</code>
            </div>
            <div class="comparison-cell comparison-result">
                <span>Third child</span>
                <code>grandchild-card parent-owned svelte-parent svelte-grandchild</code>
                <strong>has parent hash</strong>
            </div>
        </div>

        <div class="comparison-row">
            <div class="comparison-cell comparison-source">
                <span>Parent spread boundary</span>
                <code>&lt;MiddleSpreadCard &#123;...propsWithClass&#125; /&gt;</code>
            </div>
            <div class="comparison-cell comparison-result comparison-boundary">
                <span>Still not magic</span>
                <code>propsWithClass.class = 'parent-owned'</code>
                <strong>does not express scoped intent at the parent call site</strong>
            </div>
        </div>
    </div>
</article>

<style>
    .parent-owned {
        border-color: var(--proof-parent-border, purple);
        color: var(--proof-parent-ink, purple);
        background: var(--proof-parent-bg, pink);
    }
</style>
```

#### MiddleSpreadCard.svelte

Source file: [src/lib/examples/scoped-props/demos/components/spread/MiddleSpreadCard.svelte](https://github.com/humanspeak/svelte-scoped-props/blob/main/docs/src/lib/examples/scoped-props/demos/components/spread/MiddleSpreadCard.svelte)

```svelte
<script lang="ts">
    import type { ClassValue } from '@humanspeak/svelte-scoped-props/runtime'
    import SpreadGrandchildCard from './SpreadGrandchildCard.svelte'

    type Props = {
        class?: ClassValue
        'scoped:class'?: ClassValue
    }

    let forwardedProps: Props = $props()
</script>

<div class="middle-card">
    <span class="middle-label">Middle child forwards props with spread</span>
    <SpreadGrandchildCard {...forwardedProps} />
</div>

<style>
    .middle-card {
        display: grid;
        grid-template-rows: auto minmax(116px, 1fr);
        gap: 8px;
        padding: 10px;
        border: 1px solid var(--proof-card-border, #d7dee7);
        border-radius: 6px;
        background: var(--proof-card-soft, #f7fafc);
    }

    .middle-label {
        color: var(--proof-card-muted, #5d6875);
        font-size: 0.8rem;
        font-weight: 700;
    }

    .middle-card :global(.grandchild-card) {
        height: 100%;
    }
</style>
```

#### SpreadGrandchildCard.svelte

Source file: [src/lib/examples/scoped-props/demos/components/spread/SpreadGrandchildCard.svelte](https://github.com/humanspeak/svelte-scoped-props/blob/main/docs/src/lib/examples/scoped-props/demos/components/spread/SpreadGrandchildCard.svelte)

```svelte
<script lang="ts">
    import type { ClassValue } from '@humanspeak/svelte-scoped-props/runtime'
    import { describeClass } from '../classValue'

    type Props = {
        class?: ClassValue
    }

    let { class: className }: Props = $props()
    let classText = $derived(describeClass(className))
</script>

<div class={['grandchild-card', className]}>
    Third child receives <code>class="{classText}"</code>.
</div>

<style>
    .grandchild-card {
        min-height: 116px;
        display: grid;
        place-items: center;
        padding: 18px;
        border: 2px dashed var(--proof-card-border, gray);
        border-radius: 6px;
        color: var(--proof-card-ink, black);
        text-align: center;
        background: var(--proof-card-bg, white);
    }

    code {
        padding: 2px 5px;
        border-radius: 4px;
        overflow-wrap: anywhere;
        background: var(--proof-code-bg, #eef2f7);
        color: var(--proof-code-ink, #111111);
        font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
        font-size: 0.95em;
    }
</style>
```
