Skip to content

Commit 375fa3b

Browse files
authored
remove svelte-persisted-store (sveltejs#1088)
* use Persisted for details blocks * another * another * another * remove svelte-persisted-store
1 parent aa18988 commit 375fa3b

File tree

13 files changed

+76
-72
lines changed

13 files changed

+76
-72
lines changed

packages/site-kit/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@
4242
"@shikijs/twoslash": "^1.22.0",
4343
"esm-env": "^1.0.0",
4444
"json5": "^2.2.3",
45-
"shiki": "^1.22.0",
46-
"svelte-persisted-store": "^0.9.2"
45+
"shiki": "^1.22.0"
4746
},
4847
"devDependencies": {
4948
"@sveltejs/kit": "^2.12.1",

packages/site-kit/src/lib/actions/legacy-details.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { page } from '$app/stores';
2-
import { persisted } from 'svelte-persisted-store';
3-
import { get } from 'svelte/store';
42
import { fix_position } from './utils';
3+
import { Persisted } from '../state';
54

6-
const show_legacy = persisted('svelte:show-legacy', true);
5+
const show_legacy = new Persisted<'open' | 'closed'>('sv:show-legacy', 'open');
76

87
export function legacy_details(node: HTMLElement) {
98
function update() {
@@ -16,7 +15,7 @@ export function legacy_details(node: HTMLElement) {
1615
}
1716

1817
const details = node.querySelectorAll('details.legacy') as NodeListOf<HTMLDetailsElement>;
19-
const show = get(show_legacy);
18+
const show = show_legacy.current === 'open';
2019

2120
/** Whether the toggle was initiated by user action or `element.open = !element.open` */
2221
let secondary = false;
@@ -29,7 +28,7 @@ export function legacy_details(node: HTMLElement) {
2928
if (secondary) return;
3029
secondary = true;
3130

32-
show_legacy.set(detail.open);
31+
show_legacy.current = detail.open ? 'open' : 'closed';
3332

3433
fix_position(detail, () => {
3534
for (const other of details) {

packages/site-kit/src/lib/components/Banner.svelte

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
<script lang="ts">
22
import { quintOut } from 'svelte/easing';
33
import { fade } from 'svelte/transition';
4-
import { persisted } from 'svelte-persisted-store';
54
import Icon from './Icon.svelte';
65
import type { BannerData } from '../types';
76
import { browser } from '$app/environment';
7+
import { Persisted } from '../state';
88
99
let { banner }: { banner: BannerData } = $props();
1010
11-
const hidden = persisted<Record<string, boolean>>('svelte:hidden-banners', {});
11+
const persisted = new Persisted<string>('sv:hidden-banners', '{}');
12+
const hidden = $derived(JSON.parse(persisted.current));
1213
const time = +new Date();
1314
1415
let visible = $derived(
15-
browser && !$hidden[banner.id] && time > +banner.start && time < +banner.end
16+
browser && !hidden[banner.id] && time > +banner.start && time < +banner.end
1617
);
1718
1819
$effect(() => {
@@ -40,7 +41,10 @@
4041
aria-label="Dismiss"
4142
class="raised primary"
4243
onclick={() => {
43-
$hidden[banner.id] = true;
44+
persisted.current = JSON.stringify({
45+
...hidden,
46+
[banner.id]: true
47+
});
4448
}}
4549
>
4650
<Icon name="close" />

packages/site-kit/src/lib/components/Text.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script lang="ts">
22
import { afterNavigate } from '$app/navigation';
33
import type { Snippet } from 'svelte';
4-
import { prefers_ts } from '../stores/prefers_ts';
4+
import { code_preference } from '../state/code_preference';
55
import { fix_position } from '../actions/utils';
66
77
let { children }: { children: Snippet } = $props();
@@ -14,14 +14,14 @@
1414
const inputs = container.querySelectorAll('.ts-toggle') as NodeListOf<HTMLInputElement>;
1515
1616
for (const input of inputs) {
17-
input.checked = $prefers_ts;
17+
input.checked = code_preference.current === 'typescript';
1818
}
1919
}
2020
2121
function toggle(e: Event) {
2222
if ((e.target as HTMLElement).classList.contains('ts-toggle')) {
2323
const input = e.target as HTMLInputElement;
24-
$prefers_ts = input.checked;
24+
code_preference.current = input.checked ? 'typescript' : 'javascript';
2525
fix_position(input, update);
2626
}
2727
}

packages/site-kit/src/lib/nav/Nav.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ Top navigation bar for the application. It provides a slot for the left side, th
33
-->
44

55
<script lang="ts">
6-
import { overlay_open, searching, on_this_page_open } from '../stores';
6+
import { overlay_open, on_this_page_open } from '../stores';
7+
import { search } from '../state/search.svelte';
78
import Icon from '../components/Icon.svelte';
89
import { page } from '$app/stores';
910
import ThemeToggle from '../components/ThemeToggle.svelte';
@@ -67,7 +68,7 @@ Top navigation bar for the application. It provides a slot for the left side, th
6768

6869
<nav
6970
class:visible
70-
style:z-index={$overlay_open && ($searching || $on_this_page_open) ? 80 : null}
71+
style:z-index={$overlay_open && (search.active || $on_this_page_open) ? 80 : null}
7172
aria-label="Primary"
7273
>
7374
<a class="home-link" href="/" title={home_title} aria-label="Svelte"></a>
@@ -145,7 +146,7 @@ Top navigation bar for the application. It provides a slot for the left side, th
145146
aria-label="Search"
146147
class="raised icon search"
147148
onclick={() => {
148-
$searching = true;
149+
search.active = true;
149150
}}
150151
>
151152
<Icon name="search" size={18} />

packages/site-kit/src/lib/search/Search.svelte

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Renders a search widget which when clicked (or the corresponding keyboard shortc
33
-->
44
<script lang="ts">
55
import { BROWSER } from 'esm-env';
6-
import { search_query, searching } from '../stores/search';
6+
import { search } from '../state/search.svelte';
77
88
let { q = '', label = 'Search' }: { q?: string; label?: string } = $props();
99
</script>
@@ -12,20 +12,20 @@ Renders a search widget which when clicked (or the corresponding keyboard shortc
1212
<input
1313
value={q}
1414
oninput={(e) => {
15-
$search_query = e.currentTarget.value;
16-
$searching = true;
15+
search.query = e.currentTarget.value;
16+
search.active = true;
1717
e.currentTarget.value = '';
1818
e.currentTarget.blur();
1919
}}
2020
onmousedown={(event) => {
2121
event.preventDefault();
2222
event.currentTarget.blur();
23-
$searching = true;
23+
search.active = true;
2424
}}
2525
ontouchend={(event) => {
2626
event.preventDefault();
2727
event.currentTarget.blur();
28-
$searching = true;
28+
search.active = true;
2929
}}
3030
type="search"
3131
name="q"

packages/site-kit/src/lib/search/SearchBox.svelte

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ It appears when the user clicks on the `Search` component or presses the corresp
44
-->
55
<script lang="ts">
66
import { afterNavigate } from '$app/navigation';
7-
import { overlay_open, search_query, search_recent, searching } from '../stores';
7+
import { overlay_open } from '../stores';
8+
import { search } from '../state/search.svelte';
89
import { onMount, type Snippet } from 'svelte';
910
import { focusable_children, forcefocus, trap } from '../actions/focus.js';
1011
import Icon from '../components/Icon.svelte';
@@ -24,7 +25,7 @@ It appears when the user clicks on the `Search` component or presses the corresp
2425
let modal = $state() as HTMLElement;
2526
2627
// TODO proper types
27-
let search: any = $state(null);
28+
let searched: any = $state(null);
2829
let recent_searches: any[] = $state([]);
2930
3031
let last_scroll_position: number | null = null;
@@ -46,7 +47,7 @@ It appears when the user clicks on the `Search` component or presses the corresp
4647
}
4748
4849
if (type === 'results') {
49-
search = payload;
50+
searched = payload;
5051
}
5152
5253
if (type === 'recents') {
@@ -69,8 +70,8 @@ It appears when the user clicks on the `Search` component or presses the corresp
6970
});
7071
7172
async function close() {
72-
if ($searching) {
73-
$searching = false;
73+
if (search.active) {
74+
search.active = false;
7475
const scroll = last_scroll_position || 0;
7576
last_scroll_position = null;
7677
document.body.style.position = '';
@@ -79,14 +80,14 @@ It appears when the user clicks on the `Search` component or presses the corresp
7980
document.body.removeAttribute('tabindex');
8081
window.scrollTo(0, scroll);
8182
82-
$search_query = '';
83+
search.query = '';
8384
}
8485
85-
search = null;
86+
searched = null;
8687
}
8788
8889
function navigate(href: string) {
89-
$search_recent = [href, ...$search_recent.filter((x) => x !== href)];
90+
search.recent = [href, ...search.recent.filter((x) => x !== href)];
9091
close();
9192
}
9293
@@ -99,7 +100,7 @@ It appears when the user clicks on the `Search` component or presses the corresp
99100
type: 'query',
100101
id,
101102
payload: {
102-
query: $search_query,
103+
query: search.query,
103104
path: $page.url.pathname
104105
}
105106
});
@@ -108,16 +109,16 @@ It appears when the user clicks on the `Search` component or presses the corresp
108109
109110
$effect(() => {
110111
if (ready) {
111-
worker.postMessage({ type: 'recents', payload: $state.snapshot($search_recent) });
112+
worker.postMessage({ type: 'recents', payload: search.recent });
112113
}
113114
});
114115
115116
$effect(() => {
116-
$overlay_open = $searching;
117+
$overlay_open = search.active;
117118
});
118119
119120
$effect(() => {
120-
if ($searching) {
121+
if (search.active) {
121122
last_scroll_position = window.scrollY;
122123
}
123124
});
@@ -127,12 +128,12 @@ It appears when the user clicks on the `Search` component or presses the corresp
127128
onkeydown={(e) => {
128129
if (e.key === 'k' && (navigator.platform === 'MacIntel' ? e.metaKey : e.ctrlKey)) {
129130
e.preventDefault();
130-
$search_query = '';
131+
search.query = '';
131132

132-
if ($searching) {
133+
if (search.active) {
133134
close();
134135
} else {
135-
$searching = true;
136+
search.active = true;
136137
}
137138
}
138139

@@ -142,7 +143,7 @@ It appears when the user clicks on the `Search` component or presses the corresp
142143
}}
143144
/>
144145

145-
{#if $searching && ready}
146+
{#if search.active && ready}
146147
<div class="pseudo-overlay" aria-hidden="true" onclick={close}></div>
147148

148149
<!-- svelte-ignore a11y_no_static_element_interactions -->
@@ -178,16 +179,16 @@ It appears when the user clicks on the `Search` component or presses the corresp
178179
}
179180
}}
180181
oninput={(e) => {
181-
$search_query = e.currentTarget.value;
182+
search.query = e.currentTarget.value;
182183
}}
183-
value={$search_query}
184+
value={search.query}
184185
{placeholder}
185186
aria-describedby="search-description"
186187
aria-label={placeholder}
187188
spellcheck="false"
188189
/>
189190

190-
<button aria-label="Clear" onclick={() => ($search_query = '')}>
191+
<button aria-label="Clear" onclick={() => (search.query = '')}>
191192
<Icon name="close" />
192193
</button>
193194
</div>
@@ -207,11 +208,11 @@ It appears when the user clicks on the `Search` component or presses the corresp
207208
</span>
208209

209210
<div class="results">
210-
{#if search?.query}
211+
{#if searched?.query}
211212
<div class="results-container">
212213
<SearchResults
213-
results={search.results}
214-
query={search.query}
214+
results={searched.results}
215+
query={searched.query}
215216
onselect={(href) => {
216217
navigate(href);
217218
}}
@@ -229,17 +230,17 @@ It appears when the user clicks on the `Search` component or presses the corresp
229230
{#if recent_searches.length}
230231
<div class="results-container">
231232
<ul class="recent">
232-
{#each recent_searches as search}
233+
{#each recent_searches as result}
233234
<li>
234-
<a onclick={() => navigate(search.href)} href={search.href}>
235-
{search.breadcrumbs.at(-1)}
235+
<a onclick={() => navigate(result.href)} href={result.href}>
236+
{result.breadcrumbs.at(-1)}
236237
</a>
237238

238239
<button
239240
class="raised icon"
240241
aria-label="Delete"
241242
onclick={(e) => {
242-
$search_recent = $search_recent.filter((href) => href !== search.href);
243+
search.recent = search.recent.filter((href) => href !== result.href);
243244
e.stopPropagation();
244245
e.preventDefault();
245246
}}
@@ -258,7 +259,7 @@ It appears when the user clicks on the `Search` component or presses the corresp
258259
{/if}
259260

260261
<div aria-live="assertive" class="visually-hidden">
261-
{#if $searching && search?.results.length === 0}
262+
{#if search.active && searched?.results.length === 0}
262263
<p>
263264
{#if no_results}
264265
{@render no_results()}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { Persisted } from './Persisted.svelte';
2+
3+
export const code_preference = new Persisted<'typescript' | 'javascript'>(
4+
'sv:code_preference',
5+
'typescript'
6+
);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Persisted } from './Persisted.svelte';
2+
3+
class SearchState {
4+
#recent = new Persisted<string>('sv:recent-searches', '[]');
5+
active = $state(false);
6+
query = $state('');
7+
8+
get recent() {
9+
return JSON.parse(this.#recent.current) as string[];
10+
}
11+
12+
set recent(value) {
13+
this.#recent.current = JSON.stringify(value);
14+
}
15+
}
16+
17+
export const search = new SearchState();
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export { mql } from './mql';
22
export { nav_open, on_this_page_open, overlay_open, should_nav_autohide } from './nav';
33
export { reduced_motion } from './reduced-motion';
4-
export { search_query, search_recent, searching } from './search';

0 commit comments

Comments
 (0)