fix: class toggle

pull/18058/head
paoloricciuti 5 months ago
parent 63d87445db
commit 02d23d1bf0

@ -770,7 +770,7 @@ export function set_css_text(element, value) {
*/ */
export function class_list_toggle(element, name, force) { export function class_list_toggle(element, name, force) {
if (renderer) { if (renderer) {
const classes = element.getAttribute('class')?.split(/\s+/) ?? []; const classes = renderer.getAttribute(element, 'class')?.split(/\s+/) ?? [];
const has_class = classes.includes(name); const has_class = classes.includes(name);
if (force === has_class) { if (force === has_class) {
return; return;
@ -783,7 +783,7 @@ export function class_list_toggle(element, name, force) {
classes.splice(index, 1); classes.splice(index, 1);
} }
} }
element.setAttribute('class', classes.join(' ')); renderer.setAttribute(element, 'class', classes.join(' '));
return; return;
} }
element.classList.toggle(name, force); element.classList.toggle(name, force);

@ -0,0 +1,27 @@
import { flushSync } from 'svelte';
import { test } from '../../test';
export default test({
html: '<div class="base">content</div> <button>toggle</button>',
test({ assert, target, serialize, dispatch_event }) {
const button = target.children.find(
(/**@type {any} */ n) => n.type === 'element' && n.name === 'button'
);
assert.ok(button);
// Click to add the "active" class
dispatch_event(button, 'click');
flushSync();
assert.equal(
serialize(target),
'<div class="base active">content</div> <button>toggle</button>'
);
// Click again to remove the "active" class
dispatch_event(button, 'click');
flushSync();
assert.equal(serialize(target), '<div class="base">content</div> <button>toggle</button>');
}
});

@ -0,0 +1,6 @@
<script>
let active = $state(false);
</script>
<div class="base" class:active>content</div>
<button onclick={() => active = !active}>toggle</button>
Loading…
Cancel
Save