👽️ Updated legacy svelte components to runes
All checks were successful
Build and deploy website / build (push) Successful in 1m7s

This commit is contained in:
Martin Berg Alstad 2025-02-15 14:34:47 +01:00
parent 7c5b228e59
commit 04f279dab3
Signed by: martials
GPG Key ID: 706F53DD087A91DE
8 changed files with 39 additions and 24 deletions

View File

@ -8,6 +8,7 @@
"myLinks": "My links",
"myProjects": "My projects",
"uses": "Uses",
"hardware": "Hardware",
"accessories": "Accessories",
"sourceCode": "Source code",
"createdAt": "Created at",

View File

@ -8,6 +8,7 @@
"myLinks": "Mine lenker",
"myProjects": "Mine prosjekter",
"uses": "Uses",
"hardware": "Maskinvare",
"accessories": "Tilbehør",
"sourceCode": "Kildekode",
"createdAt": "Opprettet",

View File

@ -8,6 +8,7 @@
"build": "paraglide-js compile --project ./project.inlang --outdir ./src/paraglide && astro check && astro build",
"preview": "astro preview",
"astro": "astro",
"type-check": "astro check",
"postinstall": "paraglide-js compile --project ./project.inlang --outdir ./src/paraglide",
"format": "prettier --write \"./src/**/*.{js,mjs,ts,astro,svelte,css,md,json}\"",
"watch-messages": "paraglide-js compile --watch --project ./project.inlang --outdir ./src/paraglide"

View File

@ -1,20 +1,23 @@
<script lang="ts">
import { createEventDispatcher } from "svelte"
// TODO move to types?
interface Option {
key: string
interface Option<Key> {
key: Key
value: string
}
export let options: Option[] = []
// TODO bind data instead of dispatching events
const dispatch = createEventDispatcher<{ change: string }>()
interface Props<Key = string> {
selected: Key
options?: Option<Key>[]
class?: string
}
let { selected = $bindable(), options = [], class: clazz }: Props = $props()
</script>
<select
class="select select-bordered w-full max-w-xs ${$$restProps.class}"
on:change={(value) => dispatch("change", value.currentTarget.value)}
bind:value={selected}
class="select select-bordered w-full max-w-xs ${clazz}"
>
{#each options as { key, value }}
<option value={key}>{value}</option>

View File

@ -2,32 +2,32 @@
import Select from "./Select.svelte"
import * as m from "@/paraglide/messages"
import CollapseList from "@/components/collapse/CollapseList.svelte"
import type { CollectionEntry } from "astro:content"
export let uses: any[] = []
interface Props {
uses: CollectionEntry<'uses'>[]
}
const { uses }: Props = $props()
const hardwareOptions = uses.map((item) => ({
key: item.id,
value: item.data.title
}))
let selectedHardwareKey: string = uses[0].id
$: selectedHardware = uses.find((item) => item.id === selectedHardwareKey)!
// TODO bind to component
// TODO onChange not called
function onChange({ detail }: CustomEvent<string>) {
selectedHardwareKey = detail
}
let selectedHardwareKey = $state(uses[0].id)
let selectedHardware = $derived(uses.find((item) => item.id === selectedHardwareKey)!)
</script>
<div class="px-2 max-w-[750px] sm:min-w-[750px] w-screen">
<h1 class="text-center">{m.uses()}</h1>
<div>
<Select options={hardwareOptions} on:change={onChange} class="mx-auto w-max" />
<Select options={hardwareOptions} bind:selected={selectedHardwareKey} class="mx-auto w-max" />
</div>
<br />
<CollapseList items={selectedHardware.data.hardware} title={m.uses()} />
<CollapseList items={selectedHardware.data.hardware} title={m.hardware()} />
<div class="my-2"></div>
{#if (selectedHardware.data.accessories)}
<CollapseList items={selectedHardware.data.accessories} title={m.accessories()} />

View File

@ -1,10 +1,16 @@
<script lang="ts">
export let title: string = ""
interface Props {
title?: string
children: any
}
const { title = "", children }: Props = $props()
</script>
<details class="collapse collapse-arrow bg-base-200">
<summary class="collapse-title text-xl font-medium">{title}</summary>
<div class="collapse-content">
<slot />
{@render children()}
</div>
</details>

View File

@ -1,9 +1,12 @@
<script lang="ts">
import Collapse from "@/components/collapse/Collapse.svelte"
export let items: string[] = []
export let title: string = ""
interface Props {
items?: string[]
title?: string
}
const { items = [], title = "" }: Props = $props()
</script>
<Collapse title={title}>

View File

@ -8,5 +8,5 @@ const uses = await getCollection("uses")
---
<Layout title="Hardware" class="mx-auto max-w-[750px]">
<UsesPage server:defer uses={uses} />
<UsesPage client:load uses={uses} />
</Layout>