diff --git a/src/demos.md b/src/demos.md index d0d01fd7..d3d36e07 100644 --- a/src/demos.md +++ b/src/demos.md @@ -173,6 +173,7 @@ let iconType: "none" | "left" | "full" = $state("none"); x={position.startsWith("inner") ? "inner" : "right"} y={position.endsWith("down") ? "down" : "up"} onclick={() => {}} + id="splitbutton" > {#if iconType == "none"} Hello @@ -182,7 +183,7 @@ let iconType: "none" | "left" | "full" = $state("none"); {/if} {#snippet menu()} - + {}}>Hi {}}>Howdy {}}>G'day @@ -328,7 +329,7 @@ let supporting = $derived( {"<" + type + ">"} {#snippet demo()} -
+
{#snippet leading()} {#if type == "label"}
@@ -389,7 +390,7 @@ let supporting = $derived( Minimal demo: ```svelte - + Undo Redo Cut @@ -413,7 +414,7 @@ let icons = $state(false); {icons ? "Icons" : "No icons"} {#snippet demo()} - + {}}>Cut {}}>Undo {}}>Redo @@ -628,12 +629,12 @@ let selected = $state(false); Minimal demo: ```svelte - - - - - - + + + + + + ``` Full demo: @@ -673,17 +674,34 @@ let percent = $state(10); {#snippet demo()} {#if estimate && type == "linear"} - + {:else if estimate && type == "linear-wavy"} - + {:else if estimate && type == "circular"} - + {:else if type == "linear"} - + {:else if type == "linear-wavy"} - + {:else if type == "circular"} - + {/if} {/snippet} @@ -699,7 +717,7 @@ let percent = $state(10); Minimal demo: ```svelte - + ``` Full demo: @@ -719,7 +737,7 @@ let container = $state(false); {#snippet demo()} - + {/snippet} ``` diff --git a/src/lib/buttons/ConnectedButtons.svelte b/src/lib/buttons/ConnectedButtons.svelte index cbc188e0..352e71c7 100644 --- a/src/lib/buttons/ConnectedButtons.svelte +++ b/src/lib/buttons/ConnectedButtons.svelte @@ -4,7 +4,7 @@ let { round = false, children }: { round?: boolean; children: Snippet } = $props(); -
+
{@render children()}
diff --git a/src/lib/containers/Dialog.svelte b/src/lib/containers/Dialog.svelte index 7145376a..971e9192 100644 --- a/src/lib/containers/Dialog.svelte +++ b/src/lib/containers/Dialog.svelte @@ -34,6 +34,8 @@ if (open) dialog.showModal(); else dialog.close(); }); + + const id = $props.id(); {#if icon} {/if} -

{headline}

+

{headline}

{@render children()}
diff --git a/src/lib/containers/Menu.svelte b/src/lib/containers/Menu.svelte index 6b2ab057..8a298130 100644 --- a/src/lib/containers/Menu.svelte +++ b/src/lib/containers/Menu.svelte @@ -1,10 +1,11 @@ -
+ diff --git a/src/lib/containers/MenuItem.svelte b/src/lib/containers/MenuItem.svelte index d27f4003..121224d3 100644 --- a/src/lib/containers/MenuItem.svelte +++ b/src/lib/containers/MenuItem.svelte @@ -17,7 +17,13 @@ } = $props(); - - @@ -56,6 +62,7 @@ class="arrow" disabled={focusedYear <= startYear} onclick={() => focusedYear--} + aria-label={(focusedYear - 1).toString()} > @@ -75,6 +82,7 @@ class="arrow" disabled={focusedYear >= endYear} onclick={() => focusedYear++} + aria-label={(focusedYear + 1).toString()} > diff --git a/src/lib/forms/_picker/Item.svelte b/src/lib/forms/_picker/Item.svelte index efa80b5f..f89655b8 100644 --- a/src/lib/forms/_picker/Item.svelte +++ b/src/lib/forms/_picker/Item.svelte @@ -2,28 +2,21 @@ import Layer from "$lib/misc/Layer.svelte"; let { - disabled, today, selected, label, - onclick, + ...extra }: { disabled: boolean; today: boolean; selected: boolean; label: string; onclick: () => void; + "aria-label": string; } = $props(); - diff --git a/src/lib/misc/Icon.svelte b/src/lib/misc/Icon.svelte index fbacd800..69eb52d3 100644 --- a/src/lib/misc/Icon.svelte +++ b/src/lib/misc/Icon.svelte @@ -17,6 +17,7 @@ height={size || "1em"} viewBox="0 0 {icon.width} {icon.height}" data-badge={icon.body.includes("") ? "" : undefined} + aria-hidden={!extra["aria-label"] && !extra["aria-labelledby"]} {...extra} > {@html icon.body} diff --git a/src/lib/misc/typing-utils.ts b/src/lib/misc/typing-utils.ts index 938f5d83..e4ba6ac8 100644 --- a/src/lib/misc/typing-utils.ts +++ b/src/lib/misc/typing-utils.ts @@ -13,3 +13,9 @@ export type NotButton = Omit; export type ButtonAttrs = HTMLButtonAttributes & Required>; export type DivAttrs = NotButton>; + +// thanks to https://stackoverflow.com/a/52140738/15557835 +export type OneOf = TKey extends keyof T + ? { [P in TKey]-?: T[TKey] } & Partial, never>> + : never; +export type LabelledAria = OneOf<{ "aria-label": string; "aria-labelledby": string }>; diff --git a/src/lib/nav/Tabs.svelte b/src/lib/nav/Tabs.svelte index 6ab5c13d..f0b1f415 100644 --- a/src/lib/nav/Tabs.svelte +++ b/src/lib/nav/Tabs.svelte @@ -21,11 +21,20 @@ const name = $props.id(); -
-
+
+ {#each items as item} {@const id = name + item.value} - + {/each} -
+