Skip to content

Commit 697c790

Browse files
committed
fix(computedStyles): Add attribution MutationObserver to respond to class and style changes
1 parent aa788bf commit 697c790

File tree

3 files changed

+57
-6
lines changed

3 files changed

+57
-6
lines changed

.changeset/fresh-rivers-march.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@layerstack/svelte-actions': patch
3+
---
4+
5+
fix(computedStyles): Add attribution MutationObserver to respond to `class` and `style` changes

packages/svelte-actions/src/lib/styles.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ export const computedStyles: Action<HTMLElement | SVGElement, ComputedStylesCall
4040
node,
4141
callback
4242
) => {
43-
const computedStyles: CSSStyleDeclaration = window.getComputedStyle(node);
44-
callback(computedStyles);
43+
callback(window.getComputedStyle(node));
44+
45+
let mutationObserver = new MutationObserver((entries, observer) => {
46+
callback(window.getComputedStyle(node));
47+
});
48+
mutationObserver.observe(node, { attributes: true, attributeFilter: ['class', 'style'] });
49+
50+
return {
51+
destroy() {
52+
mutationObserver.disconnect();
53+
},
54+
};
4555
};

sites/docs/src/routes/docs/svelte-actions/styles/+page.svelte

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
<script lang="ts">
2-
import { TextField } from 'svelte-ux';
2+
import { cls, Field, TextField, ToggleGroup, ToggleOption } from 'svelte-ux';
33
import { computedStyles, styleProps } from '@layerstack/svelte-actions';
44
55
import Preview from '$docs/Preview.svelte';
66
import Code from '$docs/Code.svelte';
77
import Json from '$docs/Json.svelte';
88
99
let _styles: CSSStyleDeclaration;
10+
let backgroundClass = 'bg-primary';
11+
let outlineStyle = 'solid';
12+
1013
let background = '#ddd';
1114
let border = '1px solid #aaa';
1215
</script>
@@ -27,8 +30,41 @@
2730
</h2>
2831

2932
<Preview>
30-
<div class="bg-primary" use:computedStyles={(styles) => (_styles = styles)}></div>
31-
<Json value={_styles} defaultExpandedPaths={[]} />
33+
<div class="grid gap-3">
34+
<div
35+
use:computedStyles={(styles) => (_styles = styles)}
36+
class={cls('size-10 rounded outline-offset-2', backgroundClass)}
37+
style:outline-style={outlineStyle}
38+
></div>
39+
40+
<div class="grid grid-cols-2 gap-3">
41+
<Field label="Background Class">
42+
<ToggleGroup bind:value={backgroundClass} variant="outline" inset>
43+
<ToggleOption value="bg-primary">primary</ToggleOption>
44+
<ToggleOption value="bg-secondary">secondary</ToggleOption>
45+
</ToggleGroup>
46+
</Field>
47+
48+
<Field label="Outline Style">
49+
<ToggleGroup bind:value={outlineStyle} variant="outline" inset>
50+
<ToggleOption value="solid">solid</ToggleOption>
51+
<ToggleOption value="dashed">dashed</ToggleOption>
52+
<ToggleOption value="dotted">dotted</ToggleOption>
53+
</ToggleGroup>
54+
</Field>
55+
</div>
56+
57+
<Field label="Focal styles">
58+
<Json
59+
value={{ backgroundColor: _styles?.backgroundColor, outlineStyle: _styles?.outlineStyle }}
60+
defaultExpandedPaths={[]}
61+
/>
62+
</Field>
63+
64+
<Field label="All styles">
65+
<Json value={_styles} defaultExpandedPaths={[]} />
66+
</Field>
67+
</div>
3268
</Preview>
3369

3470
<h2>styleProps <small>Reactively set style properties using a single object.</small></h2>
@@ -37,7 +73,7 @@
3773
{@const styles = { '--background': background, '--border': border }}
3874
<div class="grid gap-4" use:styleProps={styles}>
3975
<div
40-
class="w-10 h-10 rounded"
76+
class="size-10 rounded"
4177
style:background-color="var(--background)"
4278
style:border="var(--border)"
4379
></div>

0 commit comments

Comments
 (0)