Skip to content

Commit 2edb644

Browse files
authored
Merge pull request #600 from jermspeaks/migration/svelte-5
Migration to Svelte 5
2 parents e4fece3 + 7ed4741 commit 2edb644

24 files changed

+225
-178
lines changed

src/components/Animation.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script>
22
import { slide } from "svelte/transition";
3-
let items = ["Item 1", "Item 2", "Item 3"];
3+
let items = $state(["Item 1", "Item 2", "Item 3"]);
44
55
function addItem() {
66
items = [...items, `Item ${items.length + 1}`];
@@ -13,7 +13,7 @@
1313

1414
<button
1515
class="my-2 px-2 border-slate-800 dark:border-slate-200 border-2 rounded hover:bg-purple-500"
16-
on:click={addItem}>Add Item</button
16+
onclick={addItem}>Add Item</button
1717
>
1818

1919
<ul class="list-none">
@@ -22,7 +22,7 @@
2222
{item}
2323
<button
2424
class="my-2 px-2 border-slate-800 dark:border-slate-200 border-2 rounded hover:bg-purple-500"
25-
on:click={() => removeItem(index)}>Remove</button
25+
onclick={() => removeItem(index)}>Remove</button
2626
>
2727
</li>
2828
{/each}

src/components/CRUD.svelte

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
<!-- https://eugenkiss.github.io/7guis/tasks#crud -->
22

33
<script>
4-
let people = [
4+
import { run } from 'svelte/legacy';
5+
6+
let people = $state([
57
{ first: "Hans", last: "Emil" },
68
{ first: "Max", last: "Mustermann" },
79
{ first: "Roman", last: "Tisch" },
8-
];
10+
]);
911
10-
let prefix = "";
11-
let first = "";
12-
let last = "";
13-
let i = 0;
12+
let prefix = $state("");
13+
let first = $state("");
14+
let last = $state("");
15+
let i = $state(0);
1416
15-
$: filteredPeople = prefix
16-
? people.filter((person) => {
17-
const name = `${person.last}, ${person.first}`;
18-
return name.toLowerCase().startsWith(prefix.toLowerCase());
19-
})
20-
: people;
2117
22-
$: selected = filteredPeople[i];
2318
24-
$: reset_inputs(selected);
2519
2620
function create() {
2721
people = people.concat({ first, last });
@@ -48,6 +42,16 @@
4842
first = person ? person.first : "";
4943
last = person ? person.last : "";
5044
}
45+
let filteredPeople = $derived(prefix
46+
? people.filter((person) => {
47+
const name = `${person.last}, ${person.first}`;
48+
return name.toLowerCase().startsWith(prefix.toLowerCase());
49+
})
50+
: people);
51+
let selected = $derived(filteredPeople[i]);
52+
run(() => {
53+
reset_inputs(selected);
54+
});
5155
</script>
5256

5357
<input
@@ -78,11 +82,11 @@
7882
>
7983

8084
<div class="buttons">
81-
<button on:click={create} disabled={!first || !last}>create</button>
82-
<button on:click={update} disabled={!first || !last || !selected}
85+
<button onclick={create} disabled={!first || !last}>create</button>
86+
<button onclick={update} disabled={!first || !last || !selected}
8387
>update</button
8488
>
85-
<button on:click={remove} disabled={!selected}>delete</button>
89+
<button onclick={remove} disabled={!selected}>delete</button>
8690
</div>
8791

8892
<style>

src/components/Card.svelte

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script>
2-
export let title;
2+
let { title, children } = $props();
33
</script>
44

55
<section>
66
<h2>{title}</h2>
7-
<slot />
7+
{@render children?.()}
88
</section>
99

1010
<style>

src/components/Cells/Cell.svelte

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,37 @@
11
<script>
2-
export let j;
3-
export let i;
4-
export let focused;
5-
export let data;
6-
export let p;
7-
export let handleFocus;
8-
export let handleBlur;
9-
export let handleKeydown;
10-
export let handleInput;
2+
import { run } from 'svelte/legacy';
3+
4+
let {
5+
j,
6+
i,
7+
focused,
8+
data,
9+
p,
10+
handleFocus,
11+
handleBlur,
12+
handleKeydown,
13+
handleInput
14+
} = $props();
1115
1216
let key = j + i;
13-
let hasFocus = false;
14-
$: if (focused === key && !hasFocus) {
15-
hasFocus = true;
16-
} else if (focused !== key && hasFocus) {
17-
hasFocus = false;
18-
}
17+
let hasFocus = $state(false);
18+
run(() => {
19+
if (focused === key && !hasFocus) {
20+
hasFocus = true;
21+
} else if (focused !== key && hasFocus) {
22+
hasFocus = false;
23+
}
24+
});
1925
</script>
2026

2127
{#if hasFocus}
2228
<input
2329
id={"input-" + key}
2430
value={$data[key] || ""}
25-
on:focus={() => handleFocus(key)}
26-
on:blur={() => handleBlur(key)}
27-
on:keydown={(e) => handleKeydown(e, j, i)}
28-
on:input={(e) => handleInput(e, key)}
31+
onfocus={() => handleFocus(key)}
32+
onblur={() => handleBlur(key)}
33+
onkeydown={(e) => handleKeydown(e, j, i)}
34+
oninput={(e) => handleInput(e, key)}
2935
/>
3036
{:else}
3137
<div>{p.parse($data[key]) || ""}</div>

src/components/Cells/Cells.svelte

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
88
const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
99
10-
export let shape = [100, 100];
10+
let { shape = [100, 100] } = $props();
1111
const rows = range(shape[1]);
1212
const columns = letterRange(shape[0]);
1313
const p = new Parser(data, columns, rows);
14-
let focused;
15-
let tBody;
14+
let focused = $state();
15+
let tBody = $state();
1616
1717
function range(n) {
1818
return [...Array(n).keys()];
@@ -104,7 +104,7 @@
104104
<table>
105105
<thead>
106106
<tr>
107-
<td class="row-key" />
107+
<td class="row-key"></td>
108108
{#each columns as column}
109109
<td class="column-key">{column}</td>
110110
{/each}
@@ -115,7 +115,7 @@
115115
<tr id={"row-" + i}>
116116
<td class="row-key">{i}</td>
117117
{#each columns as j}
118-
<td id={j + i} on:click={() => handleFocus(j + i)}>
118+
<td id={j + i} onclick={() => handleFocus(j + i)}>
119119
<Cell
120120
{j}
121121
{i}
@@ -134,7 +134,7 @@
134134
</tbody>
135135
</table>
136136
</div>
137-
<button on:click={clear}>Clear</button>
137+
<button onclick={clear}>Clear</button>
138138

139139
<style>
140140
.wrapper {

src/components/CircleDrawer.svelte

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,28 @@ radius of the selected circle.
77
-->
88

99
<script>
10+
import { run, preventDefault, stopPropagation } from 'svelte/legacy';
11+
1012
const BASE_RADIUS = 30;
1113
12-
let step = 0;
13-
let snapshots = [[]];
14-
let radius = BASE_RADIUS;
15-
let resizing = false;
16-
$: present = snapshots[step];
17-
$: if (resizing) {
18-
let resizingIndex = present.findIndex(
19-
(circle) => circle.x === resizing.x && circle.y === resizing.y
20-
);
21-
let newPresent = present.slice();
22-
newPresent[resizingIndex] = { ...present[resizingIndex], r: radius };
23-
present = newPresent;
24-
}
14+
let step = $state(0);
15+
let snapshots = $state([[]]);
16+
let radius = $state(BASE_RADIUS);
17+
let resizing = $state(false);
18+
let present;
19+
run(() => {
20+
present = snapshots[step];
21+
});
22+
run(() => {
23+
if (resizing) {
24+
let resizingIndex = present.findIndex(
25+
(circle) => circle.x === resizing.x && circle.y === resizing.y
26+
);
27+
let newPresent = present.slice();
28+
newPresent[resizingIndex] = { ...present[resizingIndex], r: radius };
29+
present = newPresent;
30+
}
31+
});
2532
2633
function handleRightClick(e) {
2734
let circle = e.target;
@@ -67,23 +74,23 @@ radius of the selected circle.
6774

6875
<div class="wrapper">
6976
<div class="buttons">
70-
<button disabled={!step} on:click={undo}>Undo</button>
71-
<button disabled={step === snapshots.length - 1} on:click={redo}
77+
<button disabled={!step} onclick={undo}>Undo</button>
78+
<button disabled={step === snapshots.length - 1} onclick={redo}
7279
>Redo</button
7380
>
7481
</div>
7582
<div class="canvas">
76-
<!-- svelte-ignore a11y-click-events-have-key-events a11y-no-static-element-interactions -->
77-
<svg on:click={addCircle}>
83+
<!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions -->
84+
<svg onclick={addCircle}>
7885
{#each present as circle (circle.x + "," + circle.y)}
7986
<circle
8087
cx={circle.x}
8188
cy={circle.y}
8289
r={circle.r}
8390
fill="white"
8491
stroke="black"
85-
on:click|stopPropagation|preventDefault={() => {}}
86-
on:contextmenu|stopPropagation|preventDefault={handleRightClick}
92+
onclick={stopPropagation(preventDefault(() => {}))}
93+
oncontextmenu={stopPropagation(preventDefault(handleRightClick))}
8794
/>
8895
{/each}
8996
</svg>
@@ -92,11 +99,11 @@ radius of the selected circle.
9299
{#if resizing}
93100
<div
94101
class="overlay"
95-
on:click={endResize}
96-
on:keydown={endResize}
102+
onclick={endResize}
103+
onkeydown={endResize}
97104
tabindex="0"
98105
role="button"
99-
/>
106+
></div>
100107
<div class="resizer">
101108
<p>Adjust radius of circle at ({resizing.x}, {resizing.y})</p>
102109
<p>{radius}</p>

0 commit comments

Comments
 (0)