Skip to content

Commit ae985f3

Browse files
committed
feat: migrate components in accordion to runes
1 parent 451d7c0 commit ae985f3

15 files changed

+399
-242
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ Click a component/package below to go to the documentation. (Note that this docu
148148

149149
Svelte 5 Runes mode is being migrated to slowly. This is the todo list of components as they are migrated.
150150

151-
- [ ] Accordion
151+
- [x] Accordion
152152
- Action Buttons
153153
- [x] Button
154154
- [x] Floating Action Button

packages/accordion/src/Accordion.svelte

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<svelte:options runes={false} />
1+
<svelte:options runes />
22

33
<div
44
bind:this={element}
@@ -9,51 +9,63 @@
99
'smui-accordion--multiple': multiple,
1010
'smui-accordion--with-open-dialog': withOpenDialog,
1111
})}
12-
{...$$restProps}
12+
{...restProps}
1313
onSMUIAccordionPanelActivate={(e) => {
1414
handlePanelActivate(e);
15-
$$restProps.onSMUIAccordionPanelActivate?.(e);
15+
restProps.onSMUIAccordionPanelActivate?.(e);
1616
}}
1717
onSMUIAccordionPanelOpening={(e) => {
1818
handlePanelOpening(e);
19-
$$restProps.onSMUIAccordionPanelOpening?.(e);
19+
restProps.onSMUIAccordionPanelOpening?.(e);
2020
}}
2121
onSMUIDialogOpeningcapture={(e) => {
2222
withOpenDialog = true;
23-
$$restProps.onSMUIDialogOpeningcapture?.(e);
23+
restProps.onSMUIDialogOpeningcapture?.(e);
2424
}}
2525
onSMUIDialogClosedcapture={(e) => {
2626
withOpenDialog = false;
27-
$$restProps.onSMUIDialogClosedcapture?.(e);
27+
restProps.onSMUIDialogClosedcapture?.(e);
2828
}}
2929
>
30-
<slot />
30+
{@render children?.()}
3131
</div>
3232

3333
<script lang="ts">
34+
import type { Snippet } from 'svelte';
3435
import { setContext } from 'svelte';
3536
import type { SmuiAttrs } from '@smui/common';
3637
import type { ActionArray } from '@smui/common/internal';
3738
import { classMap, useActions } from '@smui/common/internal';
3839
40+
import type { SMUIAccordionPanelAccessor } from './Panel.types.js';
41+
3942
type OwnProps = {
43+
/**
44+
* An array of Action or [Action, ActionProps] to be applied to the element.
45+
*/
4046
use?: ActionArray;
47+
/**
48+
* A space separated list of CSS classes.
49+
*/
4150
class?: string;
51+
/**
52+
* Whether multiple panels can be open at once.
53+
*/
4254
multiple?: boolean;
43-
};
44-
type $$Props = OwnProps & SmuiAttrs<'div', keyof OwnProps>;
4555
46-
import type { SMUIAccordionPanelAccessor } from './Panel.types.js';
47-
48-
// Remember to update $$Props if you add/remove/rename props.
49-
export let use: ActionArray = [];
50-
let className = '';
51-
export { className as class };
52-
export let multiple = false;
56+
children?: Snippet;
57+
};
58+
let {
59+
use = [],
60+
class: className = '',
61+
multiple = false,
62+
children,
63+
...restProps
64+
}: OwnProps & SmuiAttrs<'div', keyof OwnProps> = $props();
5365
5466
let element: HTMLDivElement;
5567
let panelAccessorSet = new Set<SMUIAccordionPanelAccessor>();
56-
let withOpenDialog = false;
68+
let withOpenDialog = $state(false);
5769
5870
setContext(
5971
'SMUI:accordion:panel:mount',

packages/accordion/src/Header.svelte

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<svelte:options runes={false} />
1+
<svelte:options runes />
22

33
<div
44
bind:this={element}
@@ -24,14 +24,14 @@
2424
role="button"
2525
tabindex={$nonInteractive ? -1 : 0}
2626
aria-expanded={$open ? 'true' : 'false'}
27-
{...$$restProps}
27+
{...restProps}
2828
onclick={(e) => {
2929
handleClick(e);
30-
$$restProps.onclick?.(e);
30+
restProps.onclick?.(e);
3131
}}
3232
onkeydown={(e) => {
3333
handleKeyDown(e);
34-
$$restProps.onkeydown?.(e);
34+
restProps.onkeydown?.(e);
3535
}}
3636
>
3737
{#if ripple}
@@ -40,48 +40,73 @@
4040
<div
4141
class={classMap({
4242
'smui-accordion__header__title': true,
43-
'smui-accordion__header__title--with-description': $$slots.description,
43+
'smui-accordion__header__title--with-description': description,
4444
})}
4545
>
46-
<slot />
46+
{@render children?.()}
4747
</div>
48-
{#if $$slots.description}
48+
{#if description}
4949
<div class="smui-accordion__header__description">
50-
<slot name="description" />
50+
{@render description?.()}
5151
</div>
5252
{/if}
53-
{#if $$slots.icon}
53+
{#if icon}
5454
<div class="smui-accordion__header__icon">
55-
<slot name="icon" />
55+
{@render icon?.()}
5656
</div>
5757
{/if}
5858
</div>
5959

6060
<script lang="ts">
61+
import type { Snippet } from 'svelte';
6162
import { getContext } from 'svelte';
6263
import type { SmuiAttrs } from '@smui/common';
6364
import type { ActionArray } from '@smui/common/internal';
6465
import { classMap, useActions, dispatch } from '@smui/common/internal';
6566
import Ripple from '@smui/ripple';
6667
6768
type OwnProps = {
69+
/**
70+
* An array of Action or [Action, ActionProps] to be applied to the element.
71+
*/
6872
use?: ActionArray;
73+
/**
74+
* A space separated list of CSS classes.
75+
*/
6976
class?: string;
77+
/**
78+
* A list of CSS styles.
79+
*/
7080
style?: string;
81+
/**
82+
* Whether to show a ripple animation.
83+
*/
7184
ripple?: boolean;
72-
};
73-
type $$Props = OwnProps & SmuiAttrs<'div', keyof OwnProps>;
7485
75-
// Remember to update $$Props if you add/remove/rename props.
76-
export let use: ActionArray = [];
77-
let className = '';
78-
export { className as class };
79-
export let style = '';
80-
export let ripple = true;
86+
children?: Snippet;
87+
/**
88+
* A spot for the description.
89+
*/
90+
description?: Snippet;
91+
/**
92+
* A spot for the icon.
93+
*/
94+
icon?: Snippet;
95+
};
96+
let {
97+
use = [],
98+
class: className = '',
99+
style = '',
100+
ripple = true,
101+
children,
102+
description,
103+
icon,
104+
...restProps
105+
}: OwnProps & SmuiAttrs<'div', keyof OwnProps> = $props();
81106
82107
let element: HTMLDivElement;
83-
let internalClasses: { [k: string]: boolean } = {};
84-
let internalStyles: { [k: string]: string } = {};
108+
let internalClasses: { [k: string]: boolean } = $state({});
109+
let internalStyles: { [k: string]: string } = $state({});
85110
86111
const disabled = getContext<SvelteStore<boolean>>(
87112
'SMUI:accordion:panel:disabled',

0 commit comments

Comments
 (0)