@@ -8,6 +8,8 @@
|
|||||||
import type { SupportedAs } from "$lib/internal/elements";
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
||||||
import Render from "$lib/utils/Render.svelte";
|
import Render from "$lib/utils/Render.svelte";
|
||||||
|
import { Writable, writable } from "svelte/store";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component());
|
const forwardEvents = forwardEventsBuilder(get_current_component());
|
||||||
|
|
||||||
export let as: SupportedAs = "button";
|
export let as: SupportedAs = "button";
|
||||||
@@ -24,6 +26,9 @@
|
|||||||
$: isWithinPanel =
|
$: isWithinPanel =
|
||||||
panelContext === null ? false : panelContext === $api.panelId;
|
panelContext === null ? false : panelContext === $api.panelId;
|
||||||
|
|
||||||
|
let ourStore: Writable<HTMLElement | null> = writable(null);
|
||||||
|
$: if (!isWithinPanel) ourStore = buttonStore;
|
||||||
|
|
||||||
function handleClick() {
|
function handleClick() {
|
||||||
if (disabled) return;
|
if (disabled) return;
|
||||||
|
|
||||||
@@ -73,10 +78,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$: type = resolveButtonType({ type: $$props.type, as }, $ourStore);
|
||||||
$: propsWeControl = isWithinPanel
|
$: propsWeControl = isWithinPanel
|
||||||
? {}
|
? { type }
|
||||||
: {
|
: {
|
||||||
id,
|
id,
|
||||||
|
type,
|
||||||
"aria-expanded": disabled
|
"aria-expanded": disabled
|
||||||
? undefined
|
? undefined
|
||||||
: $api.disclosureState === DisclosureStates.Open,
|
: $api.disclosureState === DisclosureStates.Open,
|
||||||
@@ -97,6 +104,7 @@
|
|||||||
{slotProps}
|
{slotProps}
|
||||||
use={[...use, forwardEvents]}
|
use={[...use, forwardEvents]}
|
||||||
name={"DisclosureButton"}
|
name={"DisclosureButton"}
|
||||||
|
bind:el={$ourStore}
|
||||||
on:click={handleClick}
|
on:click={handleClick}
|
||||||
on:keydown={handleKeyDown}
|
on:keydown={handleKeyDown}
|
||||||
>
|
>
|
||||||
@@ -109,7 +117,7 @@
|
|||||||
{slotProps}
|
{slotProps}
|
||||||
use={[...use, forwardEvents]}
|
use={[...use, forwardEvents]}
|
||||||
name={"DisclosureButton"}
|
name={"DisclosureButton"}
|
||||||
bind:el={$buttonStore}
|
bind:el={$ourStore}
|
||||||
on:click={handleClick}
|
on:click={handleClick}
|
||||||
on:keydown={handleKeyDown}
|
on:keydown={handleKeyDown}
|
||||||
on:keyup={handleKeyUp}
|
on:keyup={handleKeyUp}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
||||||
import { get_current_component } from "svelte/internal";
|
import { get_current_component } from "svelte/internal";
|
||||||
import Render from "$lib/utils/Render.svelte";
|
import Render from "$lib/utils/Render.svelte";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
|
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component());
|
const forwardEvents = forwardEventsBuilder(get_current_component());
|
||||||
export let as: SupportedAs = "button";
|
export let as: SupportedAs = "button";
|
||||||
@@ -73,6 +74,7 @@
|
|||||||
|
|
||||||
$: propsWeControl = {
|
$: propsWeControl = {
|
||||||
id,
|
id,
|
||||||
|
type: resolveButtonType({ type: $$props.type, as }, $buttonRef),
|
||||||
"aria-haspopup": true,
|
"aria-haspopup": true,
|
||||||
"aria-controls": $optionsRef?.id,
|
"aria-controls": $optionsRef?.id,
|
||||||
"aria-expanded": $api.disabled
|
"aria-expanded": $api.disabled
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
import type { SupportedAs } from "$lib/internal/elements";
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder";
|
import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder";
|
||||||
import { get_current_component } from "svelte/internal";
|
import { get_current_component } from "svelte/internal";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component());
|
const forwardEvents = forwardEventsBuilder(get_current_component());
|
||||||
export let as: SupportedAs = "button";
|
export let as: SupportedAs = "button";
|
||||||
export let use: HTMLActionArray = [];
|
export let use: HTMLActionArray = [];
|
||||||
@@ -76,6 +77,7 @@
|
|||||||
|
|
||||||
$: propsWeControl = {
|
$: propsWeControl = {
|
||||||
id,
|
id,
|
||||||
|
type: resolveButtonType({ type: $$props.type, as }, $buttonStore),
|
||||||
"aria-haspopup": true,
|
"aria-haspopup": true,
|
||||||
"aria-controls": $itemsStore?.id,
|
"aria-controls": $itemsStore?.id,
|
||||||
"aria-expanded": disabled ? undefined : $api.menuState === MenuStates.Open,
|
"aria-expanded": disabled ? undefined : $api.menuState === MenuStates.Open,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
import type { SupportedAs } from "$lib/internal/elements";
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
||||||
import Render from "$lib/utils/Render.svelte";
|
import Render from "$lib/utils/Render.svelte";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component());
|
const forwardEvents = forwardEventsBuilder(get_current_component());
|
||||||
|
|
||||||
export let as: SupportedAs = "button";
|
export let as: SupportedAs = "button";
|
||||||
@@ -163,10 +164,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$: type = resolveButtonType({ type: $$props.type, as }, $ourStore);
|
||||||
$: propsWeControl = isWithinPanel
|
$: propsWeControl = isWithinPanel
|
||||||
? {}
|
? { type }
|
||||||
: {
|
: {
|
||||||
id: $api.buttonId,
|
id: $api.buttonId,
|
||||||
|
type,
|
||||||
"aria-expanded": disabled
|
"aria-expanded": disabled
|
||||||
? undefined
|
? undefined
|
||||||
: $api.popoverState === PopoverStates.Open,
|
: $api.popoverState === PopoverStates.Open,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
import type { SupportedAs } from "$lib/internal/elements";
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
||||||
import Render from "$lib/utils/Render.svelte";
|
import Render from "$lib/utils/Render.svelte";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component(), [
|
const forwardEvents = forwardEventsBuilder(get_current_component(), [
|
||||||
"change",
|
"change",
|
||||||
]);
|
]);
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
$: propsWeControl = {
|
$: propsWeControl = {
|
||||||
id,
|
id,
|
||||||
role: "switch",
|
role: "switch",
|
||||||
|
type: resolveButtonType({ type: $$props.type, as }, $switchStore),
|
||||||
tabIndex: 0,
|
tabIndex: 0,
|
||||||
"aria-checked": checked,
|
"aria-checked": checked,
|
||||||
"aria-labelledby": $labelContext?.labelIds,
|
"aria-labelledby": $labelContext?.labelIds,
|
||||||
@@ -80,7 +82,6 @@
|
|||||||
{slotProps}
|
{slotProps}
|
||||||
use={[...use, forwardEvents]}
|
use={[...use, forwardEvents]}
|
||||||
name={"Switch"}
|
name={"Switch"}
|
||||||
bind:el={$switchStore}
|
|
||||||
on:click={handleClick}
|
on:click={handleClick}
|
||||||
on:keyup={handleKeyUp}
|
on:keyup={handleKeyUp}
|
||||||
on:keypress={handleKeyPress}
|
on:keypress={handleKeyPress}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
import type { SupportedAs } from "$lib/internal/elements";
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
import type { HTMLActionArray } from "$lib/hooks/use-actions";
|
||||||
import Render from "$lib/utils/Render.svelte";
|
import Render from "$lib/utils/Render.svelte";
|
||||||
|
import { resolveButtonType } from "$lib/utils/resolve-button-type";
|
||||||
const forwardEvents = forwardEventsBuilder(get_current_component());
|
const forwardEvents = forwardEventsBuilder(get_current_component());
|
||||||
|
|
||||||
export let as: SupportedAs = "button";
|
export let as: SupportedAs = "button";
|
||||||
@@ -89,6 +90,7 @@
|
|||||||
$: propsWeControl = {
|
$: propsWeControl = {
|
||||||
id,
|
id,
|
||||||
role: "tab",
|
role: "tab",
|
||||||
|
type: resolveButtonType({ type: $$props.type, as }, tabRef),
|
||||||
"aria-controls": $api.panels[myIndex],
|
"aria-controls": $api.panels[myIndex],
|
||||||
"aria-selected": selected,
|
"aria-selected": selected,
|
||||||
tabIndex: selected ? 0 : -1,
|
tabIndex: selected ? 0 : -1,
|
||||||
|
|||||||
8
src/lib/utils/resolve-button-type.ts
Normal file
8
src/lib/utils/resolve-button-type.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import type { SupportedAs } from "$lib/internal/elements";
|
||||||
|
export function resolveButtonType(props: { type?: string, as?: SupportedAs }, ref: HTMLElement | null | undefined): string | undefined {
|
||||||
|
if (props.type) return props.type;
|
||||||
|
let tag = props.as ?? "button";
|
||||||
|
if (typeof tag === "string" && tag.toLowerCase() === "button") return "button";
|
||||||
|
if (ref instanceof HTMLButtonElement) return "button";
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user