Skip to content

Access to component class name #15718

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Vulcagon opened this issue Apr 9, 2025 · 1 comment
Closed

Access to component class name #15718

Vulcagon opened this issue Apr 9, 2025 · 1 comment

Comments

@Vulcagon
Copy link

Vulcagon commented Apr 9, 2025

Describe the problem

During compilation a Svelte component gets a unique class name to encapsulate styles. But unfortunately there isn't a way to access this component class name in any way.

Describe the proposed solution

It would be great to have a variable or rune (e.g. $class) which gets substituted by the component's unique class name during compilation. This would allow for a lot of stuff.

It would solve the problem of not being able to pass down scoped classes to child components in a parent component as you now could simply pass down the unique class name to the child component as well.

The current way of styling child components from a parent component looks something like the following:

<script>
    import ChildComponent from './ChildComponent.svlete';
</script>

<div class="parent-component">...</div>
<ChildComponent class="child-component">...</ChildComponent>

<style>
    .parent-component {
        ...
    }

    :global(.child-component) {
        ...
    }
</style>

This translates to the following during compilation. Every element of the parent component gets the unique class name of the parent component while every element of the child component only gets the unique class name of the child component and not the class name of the parent component:

<div class="component-id-1 parent-component">...</div>
<element class="component-id-2 child-component">...</element>
.component-id-1.parent-component {
    ...
}

.child-component {
    ...
}

Being able to get the unique class name of a component would make it possible to just pass down this unique class name to the child component:

<script>
    import ChildComponent from './ChildComponent.svlete';
</script>

<div class="parent-component">...</div>
<ChildComponent class="{$class} child-component">...</ChildComponent>

<style>
    .parent-component {
        ...
    }

    /*
        No need to use `:global` anymore
        since the child component now also
        has the unique class name of the
        parent (this component)
    */
    .child-component {
        ...
    }
</style>

Substituting $class with the unique class name of the component during compilation would give the following:

<div class="component-id-1 parent-component">...</div>
<element class="component-id-2 component-id-1 child-component">...</element>
.component-id-1.parent-component {
    ...
}

.component-id-1.child-component {
    ...
}

Not being able to properly style your child components from a parent component is a pretty important feature in my opinion when styling everything yourself without using CSS frameworks like tailwindcss. Not being able to do this in Svelte makes me seriously consider switching from Svelte to Vue, even though there are a lot of things in Svelte that I would miss in Vue.

But there are other issues addressing the same issue and providing a different fix like Issue #6972 which suggests forwarding the class property by using forward:class. But even if this proposal would make it into Svelte being able to access the class name of a component would still be a nice feature, even though the importance would decrease significantly in my opinion to a feature that would then only be "nice to have".

Being able to access the unique component class would also allow to add html elements programmatically while still giving them the unique component class making them get affected by the scoped styles of the component.

<script>
    let newElement = document.createElement('div');
    newElement.className = $class;
    componentHTMLElement.appendChild(newElement);
</script>

<!-- html -->

<style>
    /*
        `newElement` gets affected by these styles
        since it also has the component class as
        class name
    */
    div {
        ...
    }
</style>

Importance

I cannot use Svelte without it

@7nik
Copy link
Contributor

7nik commented Apr 9, 2025

No need to open a new issue, there is already #7776 and #8538 and a whole bunch of similar ones.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants