sveltejs / svelte

Cybernetically enhanced web apps
https://svelte.dev
MIT License
76.98k stars 4k forks source link

chore: more slot/snippet interop #11619

Open dummdidumm opened 2 weeks ago

dummdidumm commented 2 weeks ago

This builds on top of #10800 and explores what it takes to make slots and snippets interoperable. It allows you to use render tags already when your consumers still pass slots, or pass snippets already when the component you pass it to still uses slots. From my guess the latter is likely more common (you're depending on some third party library which hasn't updated yet).

Implementation-wise it passes { $$slots: { foo: true } } for a snippet prop named foo, and the render functions for snippets/slots were adjusted to check both locations for content, and react accordingly.

The drawback is that it's a bit more runtime code, and it's somewhat brittle, because it will only work for render tags with 0 or 1 argument (<slot {foo} {bar} /> === @render children({foo, bar})) which could be a bit confusing. It's very nice that it "just works" in the common case though.

Putting this up for completeness even if it's unlikely that we land this.

Before submitting the PR, please make sure you do the following

Tests and linting

changeset-bot[bot] commented 2 weeks ago

⚠️ No Changeset found

Latest commit: be3b08cbe5042de0f7ecae53eaeb3d69b1a0cbf7

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR