I didn't find any package for generating short css names for classes in svelte and I decided to make it myself.
npm i svelte-css-short-name-preprocess --save-devsvelte.config.js:
```javascript
const autoPreprocess = require("svelte-preprocess");
const cssShortNamePreprocess = require('svelte-css-short-name-preprocess');module.exports = { preprocess: [ autoPreprocess({ defaults: { script: "typescript", }, }), cssShortNamePreprocess({ srcPath: 'src' }), // read API section below to configure ], };
## Rules
1. Don't use shadowed variables in your JS code;
2. Don't use string concatenations for your classnames and another difficult computations;
## API
### constructor options
| Option | Required | Type | Default | Description |
|---------|----------|--------|---------|--------------------------------------------------------|
| srcPath | false | string | 'src' | Path to *.svelte sources relative to the project root. |
| jsBindEnabled | false | boolean | false | EXPERIMENTAL. You can use this option to enable minification for svelte class directive shorthans. THIS WILL AFFECT ON YOUR JS CODE. |
## Examples
<details>
<summary>Simple</summary>
if you have some *.svelte file like the next one:
```sveltehtml
<script lang="typescript">
</script>
<div class="App">
</div>
<style>
.App {
background-color: gray;
}
</style>
you will get the next result in a browser:
<div class="root test-class
meow peow
end">
</div>
App.svele:
<script lang="typescript">
import TailwindWidget from './Tailwind/TailwindWidget.svelte';
</script>
<div class="App">
<TailwindWidget />
</div>
<style>
.App {
background-color: gray;
}
</style>
./Tailwind/TailwindWidget.svelte:
<script lang="typescript">
import './TailwindStyles.svelte';
</script>
<div class="rounded-full py-3 px-6 bg-green-500">
Tailwind Button
</div>
<div class="rounded-full py-3 px-6 bg-green-500">
Tailwind Button
</div>
<style></style>
./Tailwind/TailwindStyles.svelte:
<style global>
@tailwind base;
@tailwind components;
@tailwind utilities;
</style>
result:
<script lang="typescript">
import './Tailwind/TailwindStyles.svelte';
import Toggle from './Toggle/Toggle.svelte';
let toggle = false;
function handleToggle(e) {
toggle = e.detail.value;
}
</script>
<div class="App hello1 {toggle ? 'por' : 'meow'} " class:active={toggle}>
<Toggle label="Switch background" on:toggle={handleToggle}/>
</div>
<style>
.App.active {
background-color: #9ca3af;
}
</style>
You can easily get a short css names for ternary operator (even nested)
Note: this example won't transform your active css class since it's not related with any JS variable directly, it's bound with toggle. You can see bound example below.
This is an EXPERIMENTAL feature, since there is a high risk to use it with such simple background as I had time for this yet.
RegExp:
new RegExp(`(?<!(function\\s|bind:|['"].*))\\b${key}\\b`, 'gm')
Maybe, it can affect some JS code what I couldn't expect, but, anyway, it works fine with simple components;
Let's move on to example:
<script>
import { createEventDispatcher } from 'svelte';
const dispatch = createEventDispatcher();
export let label = 'label';
let checked = false;
function onToggle() {
dispatch('toggle', {
value: checked
});
}
</script>
<div class="flex items-center justify-center w-full mb-12">
<label for="toggleB" class="flex items-center cursor-pointer">
<div class="relative">
<input type="checkbox" id="toggleB" class="sr-only" bind:checked={checked} on:change={onToggle}>
<div class="block bg-gray-600 w-14 h-8 rounded-full"></div>
<div class:checked class="dot absolute left-1 top-1 bg-white w-6 h-6 rounded-full transition"></div>
</div>
<div class="ml-3 text-gray-700 font-medium">
{label}
</div>
</label>
</div>
<style>
.dot.checked {
transform: translateX(100%);
background-color: #48bb78;
}
</style>
All code that related with class name based on checked variable will be shortened with new name, expect of bind:checked part, since it's not related with styles.
If you like this package, you can support me via Patreon: https://www.patreon.com/naararouter