Skip to content

Commit c0d730d

Browse files
committed
fix(svelte): support class objects in subcomponents
1 parent fc1487c commit c0d730d

7 files changed

Lines changed: 35 additions & 47 deletions

File tree

package-lock.json

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/stacks-svelte/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
},
3232
"peerDependencies": {
3333
"@stackoverflow/stacks": "^2.0.0 || ^3.0.0-beta.0 || ^3.0.0",
34-
"svelte": "^5.0.0"
34+
"svelte": "^5.19.0"
3535
},
3636
"dependencies": {
3737
"clsx": "^2.1.1",

packages/stacks-svelte/src/components/Menu/MenuCheckItem.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
</script>
44

55
<script lang="ts">
6+
import clsx from "clsx";
7+
import type { ClassValue } from "svelte/elements";
68
import Checkbox from "../Checkbox/Checkbox.svelte";
79
import Radio from "../RadioGroup/Radio.svelte";
810
import Icon from "../Icon/Icon.svelte";
@@ -56,7 +58,7 @@
5658
/**
5759
* Additional CSS classes added to the check control container
5860
*/
59-
class?: string;
61+
class?: ClassValue;
6062
}
6163
6264
const {
@@ -72,8 +74,8 @@
7274
class: className = "",
7375
}: Props = $props();
7476
75-
const getItemClasses = (className: string) => {
76-
return `s-menu--item${className ? ` ${className}` : ""}`;
77+
const getItemClasses = (className: ClassValue) => {
78+
return clsx("s-menu--item", className);
7779
};
7880
7981
const itemClasses = $derived(getItemClasses(className));

packages/stacks-svelte/src/components/Menu/MenuDivider.svelte

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
<script lang="ts">
2+
import clsx from "clsx";
3+
import type { ClassValue } from "svelte/elements";
4+
25
interface Props {
36
/**
47
* Additional CSS classes added to the element
58
*/
6-
class?: string;
9+
class?: ClassValue;
710
}
811
912
let { class: className = "" }: Props = $props();
1013
11-
const getClasses = (className: string) => {
12-
const base = "s-menu--divider";
13-
let classes = base;
14-
15-
if (className) {
16-
classes += ` ${className}`;
17-
}
18-
19-
return classes;
14+
const getClasses = (className: ClassValue) => {
15+
return clsx("s-menu--divider", className);
2016
};
2117
2218
const classes = $derived(getClasses(className));

packages/stacks-svelte/src/components/Menu/MenuItem.svelte

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
</script>
44

55
<script lang="ts">
6+
import clsx from "clsx";
67
import type { Snippet } from "svelte";
78
import type {
9+
ClassValue,
810
HTMLAnchorAttributes,
911
HTMLButtonAttributes,
1012
} from "svelte/elements";
@@ -37,7 +39,7 @@
3739
/**
3840
* Additional CSS classes added to the element
3941
*/
40-
class?: string;
42+
class?: ClassValue;
4143
4244
/**
4345
* Snippet for the menu item content
@@ -56,31 +58,21 @@
5658
...restProps
5759
}: Props = $props();
5860
59-
const getItemClasses = (className: string) => {
60-
return `s-menu--item${className ? ` ${className}` : ""}`;
61+
const getItemClasses = (className: ClassValue) => {
62+
return clsx("s-menu--item", className);
6163
};
6264
6365
const getLinkClasses = (
64-
className: string,
66+
className: ClassValue,
6567
danger: boolean,
6668
selected: boolean
6769
) => {
68-
const base = "s-menu--action";
69-
let classes = base;
70-
71-
if (danger) {
72-
classes += ` ${base}__danger`;
73-
}
74-
75-
if (className) {
76-
classes += ` ${className}`;
77-
}
78-
79-
if (selected) {
80-
classes += ` is--selected`;
81-
}
82-
83-
return classes;
70+
return clsx(
71+
"s-menu--action",
72+
danger && "s-menu--action__danger",
73+
className,
74+
selected && "is--selected"
75+
);
8476
};
8577
8678
const itemClasses = $derived(getItemClasses(className));

packages/stacks-svelte/src/components/Menu/MenuTitle.svelte

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
</script>
44

55
<script lang="ts">
6+
import clsx from "clsx";
67
import type { Snippet } from "svelte";
8+
import type { ClassValue } from "svelte/elements";
79
810
interface Props {
911
/**
1012
* Additional CSS classes added to the element
1113
*/
12-
class?: string;
14+
class?: ClassValue;
1315
1416
/**
1517
* Sets whether the menu title is rendered within a fieldset
@@ -24,15 +26,8 @@
2426
2527
let { class: className = "", type = "li", children }: Props = $props();
2628
27-
const getClasses = (className: string) => {
28-
const base = "s-menu--title";
29-
let classes = base;
30-
31-
if (className) {
32-
classes += ` ${className}`;
33-
}
34-
35-
return classes;
29+
const getClasses = (className: ClassValue) => {
30+
return clsx("s-menu--title", className);
3631
};
3732
3833
const classes = $derived(getClasses(className));

packages/stacks-svelte/src/components/Popover/PopoverCloseButton.svelte

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
<script lang="ts">
2+
import clsx from "clsx";
3+
import type { ClassValue } from "svelte/elements";
24
import Icon from "../Icon/Icon.svelte";
35
import { IconCross } from "@stackoverflow/stacks-icons/icons";
46
import { usePopoverContext } from "./Popover.svelte";
@@ -11,7 +13,7 @@
1113
/**
1214
* Additional CSS classes added to the element
1315
*/
14-
class?: string;
16+
class?: ClassValue;
1517
/**
1618
* Callback fired when the close button is clicked
1719
*/
@@ -30,7 +32,7 @@
3032

3133
<button
3234
aria-label={label}
33-
class={`s-popover--close s-btn s-btn__tonal ps-absolute${className ? ` ${className}` : ""}`}
35+
class={clsx("s-popover--close s-btn s-btn__tonal ps-absolute", className)}
3436
type="button"
3537
onclick={handleClick}
3638
>

0 commit comments

Comments
 (0)