Skip to content

Commit a4df13c

Browse files
committed
fix: sigh, svelte 5 doesn't support what classAdderBuilder needs, so it had to be refactored
1 parent cdb9833 commit a4df13c

File tree

114 files changed

+1513
-489
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

114 files changed

+1513
-489
lines changed

MIGRATING.md

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Note to Devs: remove `x = x;` statements after `push()` and the like. They aren'
2323
- Chips' Set now expects a `chip` snippet instead of using `let:chip`.
2424
- Chips' Set key function is now required to return `string`, not `string | number`.
2525
- SegmentedButton now expects a `segment` snippet instead of using `let:segment`.
26+
- `classAdderBuilder` is no longer available. Instead, the `ClassAdder` component is exported.
27+
- Svelte 5 doesn't seem to provide a way to reuse components the way classAdderBuilder needs. The version in beta.2 and before works only on the first render, but props were not reactive.
2628

2729
## Changes
2830

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<svelte:options runes />
2+
3+
<ClassAdder
4+
_smuiClass="mdc-card__action-buttons"
5+
tag="div"
6+
bind:this={element as ReturnType<C>}
7+
{...restProps}>{@render children?.()}</ClassAdder
8+
>
9+
10+
<script
11+
lang="ts"
12+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
13+
>
14+
import type { ComponentProps, Snippet } from 'svelte';
15+
import type {
16+
SmuiComponent,
17+
SmuiElementPropMap,
18+
SmuiEveryElement,
19+
} from '@smui/common';
20+
import { ClassAdder } from '@smui/common/classadder';
21+
22+
type OwnProps = {
23+
children?: Snippet;
24+
};
25+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
26+
$props();
27+
28+
let element: ReturnType<C>;
29+
30+
export function getElement() {
31+
return element.getElement();
32+
}
33+
</script>

packages/card/src/ActionButtons.ts

-7
This file was deleted.

packages/card/src/ActionIcons.svelte

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<svelte:options runes />
2+
3+
<ClassAdder
4+
_smuiClass="mdc-card__action-icons"
5+
tag="div"
6+
bind:this={element as ReturnType<C>}
7+
{...restProps}>{@render children?.()}</ClassAdder
8+
>
9+
10+
<script
11+
lang="ts"
12+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
13+
>
14+
import type { ComponentProps, Snippet } from 'svelte';
15+
import type {
16+
SmuiComponent,
17+
SmuiElementPropMap,
18+
SmuiEveryElement,
19+
} from '@smui/common';
20+
import { ClassAdder } from '@smui/common/classadder';
21+
22+
type OwnProps = {
23+
children?: Snippet;
24+
};
25+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
26+
$props();
27+
28+
let element: ReturnType<C>;
29+
30+
export function getElement() {
31+
return element.getElement();
32+
}
33+
</script>

packages/card/src/ActionIcons.ts

-7
This file was deleted.

packages/card/src/Content.svelte

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<svelte:options runes />
2+
3+
<ClassAdder
4+
_smuiClass="smui-card__content"
5+
tag="div"
6+
bind:this={element as ReturnType<C>}
7+
{...restProps}>{@render children?.()}</ClassAdder
8+
>
9+
10+
<script
11+
lang="ts"
12+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
13+
>
14+
import type { ComponentProps, Snippet } from 'svelte';
15+
import type {
16+
SmuiComponent,
17+
SmuiElementPropMap,
18+
SmuiEveryElement,
19+
} from '@smui/common';
20+
import { ClassAdder } from '@smui/common/classadder';
21+
22+
type OwnProps = {
23+
children?: Snippet;
24+
};
25+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
26+
$props();
27+
28+
let element: ReturnType<C>;
29+
30+
export function getElement() {
31+
return element.getElement();
32+
}
33+
</script>

packages/card/src/Content.ts

-7
This file was deleted.

packages/card/src/MediaContent.svelte

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<svelte:options runes />
2+
3+
<ClassAdder
4+
_smuiClass="mdc-card__media-content"
5+
tag="div"
6+
bind:this={element as ReturnType<C>}
7+
{...restProps}>{@render children?.()}</ClassAdder
8+
>
9+
10+
<script
11+
lang="ts"
12+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
13+
>
14+
import type { ComponentProps, Snippet } from 'svelte';
15+
import type {
16+
SmuiComponent,
17+
SmuiElementPropMap,
18+
SmuiEveryElement,
19+
} from '@smui/common';
20+
import { ClassAdder } from '@smui/common/classadder';
21+
22+
type OwnProps = {
23+
children?: Snippet;
24+
};
25+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
26+
$props();
27+
28+
let element: ReturnType<C>;
29+
30+
export function getElement() {
31+
return element.getElement();
32+
}
33+
</script>

packages/card/src/MediaContent.ts

-7
This file was deleted.

packages/card/src/index.d.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import Card from './Card.svelte';
44

5-
import Content from './Content.js';
5+
import Content from './Content.svelte';
66
import PrimaryAction from './PrimaryAction.svelte';
77
import Media from './Media.svelte';
8-
import MediaContent from './MediaContent.js';
8+
import MediaContent from './MediaContent.svelte';
99
import Actions from './Actions.svelte';
10-
import ActionButtons from './ActionButtons.js';
11-
import ActionIcons from './ActionIcons.js';
10+
import ActionButtons from './ActionButtons.svelte';
11+
import ActionIcons from './ActionIcons.svelte';
1212

1313
export default Card;
1414

packages/card/src/index.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import Card from './Card.svelte';
44

5-
import Content from './Content.js';
5+
import Content from './Content.svelte';
66
import PrimaryAction from './PrimaryAction.svelte';
77
import Media from './Media.svelte';
8-
import MediaContent from './MediaContent.js';
8+
import MediaContent from './MediaContent.svelte';
99
import Actions from './Actions.svelte';
10-
import ActionButtons from './ActionButtons.js';
11-
import ActionIcons from './ActionIcons.js';
10+
import ActionButtons from './ActionButtons.svelte';
11+
import ActionIcons from './ActionIcons.svelte';
1212

1313
export default Card;
1414

packages/common/README.md

+65-26
Original file line numberDiff line numberDiff line change
@@ -415,45 +415,84 @@ A fragment component (only contains a `{@render children?.()}`) used to define a
415415

416416
## classadder/ClassAdder.svelte
417417

418-
A base component that adds a class to an element. The ClassAdder is used to provide simple components. It usually uses the `SmuiElement` component shown above, but you can specify a different component for it to use.
418+
Use this to make a ClassAdder component.
419419

420-
### Props / Defaults
421-
422-
- `component`: `(depends on context)` - The component to extend. Usually it is set to `SmuiElement`.
423-
- `tag`: `(depends on context)` - The HTML tag name `SmuiElement` will use.
424-
- `use`: `[]` - An array of Svelte actions and/or arrays of an action and its options.
425-
- `class`: `''` - A CSS class string.
420+
```svelte
421+
<ClassAdder
422+
_smuiClass="my-added-class"
423+
tag="div"
424+
bind:this={element as ReturnType<C>}
425+
{...restProps}>{@render children?.()}</ClassAdder
426+
>
426427
427-
## classAdderBuilder
428+
<script
429+
lang="ts"
430+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
431+
>
432+
import type { ComponentProps, Snippet } from 'svelte';
433+
import type {
434+
SmuiComponent,
435+
SmuiElementPropMap,
436+
SmuiEveryElement,
437+
} from '@smui/common';
438+
import { ClassAdder } from '@smui/common/classadder';
428439
429-
Use this to build a ClassAdder component. ClassAdder components are useful for reducing the size of your bundle. If you have tons of simple components that just need to add classes/props or set a context, using ClassAdder components means there's only one actual Svelte component in your bundle for all of these many tiny components.
440+
type OwnProps = {
441+
children?: Snippet;
442+
};
443+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
444+
$props();
430445
431-
```js
432-
import { classAdderBuilder } from '@smui/common/classadder';
446+
let element: ReturnType<C>;
433447
434-
export default classAdderBuilder({
435-
class: 'my-added-class',
436-
tag: 'div',
437-
});
448+
export function getElement() {
449+
return element.getElement();
450+
}
451+
</script>
438452
```
439453

440454
You can also supply a component that implements the `SmuiComponent` interface.
441455

442-
```js
443-
import { classAdderBuilder } from '@smui/common/classadder';
444-
import Button from '@smui/button';
456+
```svelte
457+
<ClassAdder
458+
_smuiClass="my-added-class"
459+
component={Button as unknown as SmuiComponent}
460+
bind:this={element as ReturnType<C>}
461+
{...restProps}>{@render children?.()}</ClassAdder
462+
>
463+
464+
<script
465+
lang="ts"
466+
generics="T extends SmuiEveryElement = keyof SmuiElementPropMap, C extends SmuiComponent = SmuiComponent"
467+
>
468+
import type { ComponentProps, Snippet } from 'svelte';
469+
import type {
470+
SmuiComponent,
471+
SmuiElementPropMap,
472+
SmuiEveryElement,
473+
} from '@smui/common';
474+
import { ClassAdder } from '@smui/common/classadder';
475+
import Button from '@smui/button';
445476
446-
export default classAdderBuilder({
447-
class: 'my-added-class',
448-
component: Button,
449-
});
477+
type OwnProps = {
478+
children?: Snippet;
479+
};
480+
let { children, ...restProps }: OwnProps & ComponentProps<ClassAdder<T, C>> =
481+
$props();
482+
483+
let element: ReturnType<C>;
484+
485+
export function getElement() {
486+
return element.getElement();
487+
}
488+
</script>
450489
```
451490

452491
### Props / Defaults
453492

454493
- `component`: `SmuiElement` - An SMUI compatible component.
455494
- `tag`: `'div'` - An HTML tag name. (Only means anything for the `SmuiElement` component.)
456-
- `class`: `''` - The class to add.
457-
- `classMap`: `{}` - A map of classes to contexts. The context should resolve to a Svelte store, and the class will be added if the Svelte store's value is true.
458-
- `contexts`: `{}` - A map of contexts to values to set for them.
459-
- `props`: `{}` - A map of props to add to the element.
495+
- `_smuiClass`: `''` - The class to add.
496+
- `_smuiClassMap`: `{}` - A map of classes to contexts. The context should resolve to a Svelte store, and the class will be added if the Svelte store's value is true.
497+
- `_smuiContexts`: `{}` - A map of contexts to values to set for them.
498+
- `_smuiProps`: `{}` - A map of props to add to the element.

0 commit comments

Comments
 (0)