- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 4.7k
Description
Describe the problem
It's a common thing using components to have personalized HTML elements.
For example <img /> element, i can make a <Image> component that uses <picture> by default or loading="lazy" attribute. So it's easier to re-use or change.
The problem is its still common to add custom styles to image element, like background-color object-fit and many other stuff, like aspect-ratio, width etc.
Svelte components doesn't allow that unless you make somehow :global() hacks. Which doesn't give warnings when invalid and looks hacky. And when you not try to use :global() it becomes even more hacky and makes you use a lot of boilerplate code.
Describe the proposed solution
A CSS component selector to select all of the root elements in the component.
Example:
foo.svelte
<div>
  <img />
<div/>
<a />bar.svelte
<div>
  <Foo />
</div>
<Foo />
<style>
  div > $Foo { /* Selects `div` and `a` element in the `Foo` component, because they are in the root  */
    ...
  }
<style />syntax can change.
Alternatives considered
An option to bind everything(attributes(class), events...) in a root element in the component.
Example:
foo.svelte
<div bind:$$root>
   <img />
<div />
<div />bar.svelte
<Foo class="thing" on:click={() => alert()}>
<style>
.thing { /* this would only select the first `div` element in the `Foo` component
  ...
}
<style />if none of these are applicable at least having a way to bind/pass/inherit all of the events would be cool.
Importance
would make my life easier