0.0.16 • Published 7 months ago

svelte-pass-class v0.0.16

Weekly downloads
-
License
MIT
Repository
-
Last release
7 months ago

svelte-pass-class

This is current experimental and totally not ready for any production. At current stage, this package is only a proof of concept.

This package is meant to provide the ability to pass the style classes into the child component. It is done by using the svelte preprocessor.

Installation

npm i -D svelte-pass-class
// svelte.config.js
import sveltePassClass from 'svelte-pass-class';

const config = {
  // ...other settings

	preprocess: [
    sveltePassClass,
    // ...other preprocessor
  ],

  // ...other settings
};

export default config;

Usage

This preprocessor introduced 2 pseudo-class, :export and :let.

:export

Syntax: :export(.<Class name>) { /* style */ }

The :export tells the preprocessor the class inside the parenthesis may be passed in from the parent component, so don't directly apply the style to the element.

Example

<div class="a">Hello</div>

<style>
  :export(.a) {
    color: red;
  }
</style>

will be compiled to

<script>
  export let __spc_class_swap_table__ = {};
</script>

<div class="{__spc_class_swap_table__["a"] ?? "a"}">Hello</div>

<style>
  .a {
    color: red;
  }
</style>

:let

Syntax: :let(<Component name>).<Class name> { /* style */ }

The :let tells the preprocessor to apply the styles to the class field for all components it specified. Such as :let(Foo).bar { /* style */ } will apply the style to the bar field of all the Foo component.

Example

<script>
  import Foo from './Foo.svelte';
</script>

<Foo />
<Foo />

<style>
  :let(Foo).bar {
    color: red;
  }
</style>

will be compiled to

<script>
  import Foo from './Foo.svelte';
</script>

<Foo __spc_class_swap_table__={{"bar":"spc-xxxxxxxxxx"}} />
<Foo __spc_class_swap_table__={{"bar":"spc-xxxxxxxxxx"}} />

<style>
  :global(.spc-xxxxxxxxxx) {
    color: red;
  }
</style>

More Applies

Except for using :let to apply the styles, you can also use the class attribute to apply it. Using :let will have a lower priority than using class attribute, because the class attribute is closer to the element visually.

Component

For components, you have only 1 way to apply with class attribute, that is class:bar="name" where bar is the exported class name from the component and name is the class name you want to apply.

To reduce the verbosity, you can also use class:bar as the shorthand for class:bar="bar".

<script>
  import Foo from './Foo.svelte';
</script>

<Foo class:bar          />
<Foo class:bar="foobar" />

<style>
  .bar {
    color: red;
  }

  .foobar {
    color: blue;
  }
</style>

will be compiled to

<script>
  import Foo from './Foo.svelte';
</script>

<Foo __spc_class_swap_table__={{"bar":"spc-xxxxxxxxxx"}} />
<Foo __spc_class_swap_table__={{"bar":"spc-oooooooooo"}} />

<style>
  :global(.spc-xxxxxxxxxx), .bar {
    color: red;
  }

  :global(.spc-oooooooooo), .foobar {
    color: blue;
  }

Element

For elements, you can use the class directly to apply the style. And also the method mentioned above with little difference.

The difference is that the class:bar={true} in the above example is using {} instead of "", this is because it's the native svelte syntax, but the preprocessor will still recognize it.

Example 1

In this example, you'll find out that before and after is the same, that is because the preprocessor only do the transformation when the class is exported.

<div class="bar" />
<div class:bar={true} />

<style>
  .bar {
    color: red;
  }
</style>

will be compiled to

<div class="bar" />
<div class:bar={true} />

<style>
  .bar {
    color: red;
  }
</style>

Example 2

This example shows that the class:bar will be transformed.

<div class="bar" />
<div class:bar={true} />

<style>
  :export(.bar) {
    color: red;
  }
</style>

will be compiled to

<script>
  export let __spc_class_swap_table__ = {};

  $: __random_uuid__ = (true) ? (__spc_class_swap_table__["bar"] ?? "bar") : "";
</script>

<div class="{__spc_class_swap_table__["bar"] ?? "bar"}" />
<div class="{__random_uuid__}" />

<style>
  .bar {
    color: red;
  }
</style>

Forwarding

If the exported class is passed into the child component, the preprocessor will forward the class to the child component.

<script>
  import Child from './Child.svelte';
</script>

<Child class:bar />

<style>
  :export(.bar) {
    color: red;
  }
</style>

will be compiled to

<script>
  import Child from './Child.svelte';

  export let __spc_class_swap_table__ = {};
</script>

<Child __spc_class_swap_table__={{"bar": __spc_class_swap_table__["bar"] ?? "bar"}} />

<style>
  .bar {
    color: red;
  }
</style>
0.0.16

7 months ago

0.0.15

7 months ago

0.0.14

7 months ago

0.0.13

7 months ago

0.0.12

7 months ago

0.0.11

7 months ago

0.0.10

7 months ago

0.0.9

7 months ago

0.0.8

7 months ago

0.0.7

7 months ago

0.0.6

7 months ago

0.0.5

7 months ago

0.0.4

7 months ago

0.0.3

7 months ago

0.0.2

7 months ago

0.0.1

7 months ago