diff --git a/src/lib/components/dialog/DialogTitle.svelte b/src/lib/components/dialog/DialogTitle.svelte index c60f2df..431e60f 100644 --- a/src/lib/components/dialog/DialogTitle.svelte +++ b/src/lib/components/dialog/DialogTitle.svelte @@ -7,7 +7,7 @@ onMount(() => { $api.setTitleId(id); - return () => $api.setTitleId(null); + return () => $api.setTitleId(undefined); }); $: propsWeControl = { id, diff --git a/src/lib/components/menu/Menu.svelte b/src/lib/components/menu/Menu.svelte index 56c7804..12a6874 100644 --- a/src/lib/components/menu/Menu.svelte +++ b/src/lib/components/menu/Menu.svelte @@ -36,8 +36,8 @@ export function useMenuContext( componentName: string - ): Writable { - let context: Writable | undefined = + ): Writable { + let context: Writable | undefined = getContext(MENU_CONTEXT_NAME); if (context === undefined) { @@ -58,10 +58,7 @@ let searchQuery: StateDefinition["searchQuery"] = ""; let activeItemIndex: StateDefinition["activeItemIndex"] = null; - let api: Writable = writable(); - setContext(MENU_CONTEXT_NAME, api); - - $: api.set({ + let api: Writable = writable({ menuState, buttonStore, itemsStore: itemsStore, @@ -125,6 +122,19 @@ })(); }, }); + setContext(MENU_CONTEXT_NAME, api); + + $: api.update((obj) => { + return { + ...obj, + menuState, + buttonStore, + itemsStore: itemsStore, + items, + searchQuery, + activeItemIndex, + }; + }); function handleWindowMousedown(event: MouseEvent): void { let target = event.target as HTMLElement; diff --git a/src/lib/components/popover/Popover.svelte b/src/lib/components/popover/Popover.svelte index 50baace..e34f8b4 100644 --- a/src/lib/components/popover/Popover.svelte +++ b/src/lib/components/popover/Popover.svelte @@ -28,9 +28,9 @@ const POPOVER_CONTEXT_NAME = "PopoverContext"; export function usePopoverContext( component: string - ): Writable { + ): Writable { let context = getContext(POPOVER_CONTEXT_NAME) as - | Writable + | Writable | undefined; if (context === undefined) { throw new Error( @@ -57,31 +57,18 @@ let popoverState: PopoverStates = PopoverStates.Closed; - let api: Writable = writable(); - setContext(POPOVER_CONTEXT_NAME, api); + let panel: Writable = writable(null); + setContext("PopoverPanelRef", panel); - let openClosedState: Writable | undefined = writable(); - setContext("OpenClosed", openClosedState); + let button: Writable = writable(null); + setContext("PopoverButtonRef", button); - $: $openClosedState = match(popoverState, { - [PopoverStates.Open]: State.Open, - [PopoverStates.Closed]: State.Closed, - }); - - let panelStore = writable(null); - setContext("PopoverPanelRef", panelStore); - $: panel = $panelStore; - - let buttonStore = writable(null); - setContext("PopoverButtonRef", buttonStore); - $: button = $buttonStore; - - $: api.set({ + let api: Writable = writable({ popoverState, buttonId, panelId, - panel, - button, + panel: $panel, + button: $button, togglePopover() { popoverState = match(popoverState, { [PopoverStates.Open]: PopoverStates.Closed, @@ -105,6 +92,26 @@ restoreElement?.focus(); }, }); + setContext(POPOVER_CONTEXT_NAME, api); + + let openClosedState: Writable | undefined = writable(); + setContext("OpenClosed", openClosedState); + + $: $openClosedState = match(popoverState, { + [PopoverStates.Open]: State.Open, + [PopoverStates.Closed]: State.Closed, + }); + + $: api.update((obj) => { + return { + ...obj, + popoverState, + buttonId, + panelId, + panel: $panel, + button: $button, + }; + }); const registerBag = { buttonId, @@ -121,8 +128,8 @@ function isFocusWithinPopoverGroup() { return ( groupContext?.isFocusWithinPopoverGroup() ?? - (button?.contains(document.activeElement) || - panel?.contains(document.activeElement)) + ($button?.contains(document.activeElement) || + $panel?.contains(document.activeElement)) ); } @@ -144,14 +151,14 @@ if (popoverState !== PopoverStates.Open) return; - if (button?.contains(target)) return; - if (panel?.contains(target)) return; + if ($button?.contains(target)) return; + if ($panel?.contains(target)) return; $api.closePopover(); if (!isFocusableElement(target, FocusableMode.Loose)) { event.preventDefault(); - button?.focus(); + $button?.focus(); } } diff --git a/src/lib/components/radio-group/RadioGroup.svelte b/src/lib/components/radio-group/RadioGroup.svelte index 9799c84..69ffeb5 100644 --- a/src/lib/components/radio-group/RadioGroup.svelte +++ b/src/lib/components/radio-group/RadioGroup.svelte @@ -29,9 +29,9 @@ const RADIO_GROUP_CONTEXT_NAME = "RadioGroupContext"; export function useRadioGroupContext( component: string - ): Writable { + ): Writable { const context = getContext(RADIO_GROUP_CONTEXT_NAME) as - | Writable + | Writable | undefined; if (context === undefined) { @@ -55,10 +55,7 @@ const dispatch = createEventDispatcher(); - let api: Writable = writable(); - setContext(RADIO_GROUP_CONTEXT_NAME, api); - - $: api.set({ + let api: Writable = writable({ options, value, disabled, @@ -83,6 +80,20 @@ options = options.filter((radio) => radio.id !== id); }, }); + setContext(RADIO_GROUP_CONTEXT_NAME, api); + + $: api.update((obj) => { + return { + ...obj, + options, + value, + disabled, + firstOption: options.find((option) => !option.propsRef.disabled), + containsCheckedOption: options.some( + (option) => option.propsRef.value === value + ), + }; + }); $: treeWalker({ container: radioGroupRef, diff --git a/src/lib/components/switch/Switch.svelte b/src/lib/components/switch/Switch.svelte index 9bcd4ce..9089ca7 100644 --- a/src/lib/components/switch/Switch.svelte +++ b/src/lib/components/switch/Switch.svelte @@ -1,10 +1,7 @@ @@ -19,18 +17,16 @@ let switchStore: Writable = writable(null); - let api: Writable = writable(); - setContext("SwitchApi", api); + let api: Writable = writable({ + switchStore, + }); + setContext(SWITCH_CONTEXT_NAME, api); function onClick() { if (!$switchStore) return; $switchStore.click(); $switchStore.focus({ preventScroll: true }); } - - $: api.set({ - switchStore, - });
diff --git a/src/lib/components/tabs/TabGroup.svelte b/src/lib/components/tabs/TabGroup.svelte index 98aad85..4344d29 100644 --- a/src/lib/components/tabs/TabGroup.svelte +++ b/src/lib/components/tabs/TabGroup.svelte @@ -27,10 +27,8 @@ const TABS_CONTEXT_NAME = "TabsContext"; - export function useTabsContext( - component: string - ): Writable { - let context: Writable | undefined = + export function useTabsContext(component: string): Writable { + let context: Writable | undefined = getContext(TABS_CONTEXT_NAME); if (context === undefined) { @@ -54,10 +52,7 @@ const dispatch = createEventDispatcher(); - let api: Writable = writable(); - setContext(TABS_CONTEXT_NAME, api); - - $: api.set({ + let api: Writable = writable({ selectedIndex, orientation: vertical ? "vertical" : "horizontal", activation: manual ? "manual" : "auto", @@ -81,6 +76,18 @@ panels = panels.filter((p) => p !== panel); }, }); + setContext(TABS_CONTEXT_NAME, api); + + $: api.update((obj) => { + return { + ...obj, + selectedIndex, + orientation: vertical ? "vertical" : "horizontal", + activation: manual ? "manual" : "auto", + tabs, + panels, + }; + }); onMount(() => { if ($api.tabs.length <= 0) return; diff --git a/src/lib/components/transitions/TransitionChild.svelte b/src/lib/components/transitions/TransitionChild.svelte index f9dae0a..c1259ce 100644 --- a/src/lib/components/transitions/TransitionChild.svelte +++ b/src/lib/components/transitions/TransitionChild.svelte @@ -154,7 +154,7 @@ } setContext(NESTING_CONTEXT_NAME, nesting); - let openClosedState: Writable | undefined = writable(State.Closed); + let openClosedState: Writable = writable(State.Closed); setContext("OpenClosed", openClosedState); $: openClosedState.set( diff --git a/src/lib/components/transitions/TransitionRoot.svelte b/src/lib/components/transitions/TransitionRoot.svelte index 694342d..363454a 100644 --- a/src/lib/components/transitions/TransitionRoot.svelte +++ b/src/lib/components/transitions/TransitionRoot.svelte @@ -114,16 +114,16 @@ import TransitionChild from "./TransitionChild.svelte"; import type { useId } from "$lib/hooks/use-id"; - export let show: boolean = null; + export let show: boolean | undefined = undefined; export let unmount = true; export let appear = false; let openClosedState: Writable | undefined = getContext("OpenClosed"); function computeShow( - show: boolean, + show: boolean | undefined, openClosedState: State | undefined - ): boolean { + ): boolean | undefined { if (show === null && openClosedState !== undefined) { return match(openClosedState, { [State.Open]: true, @@ -161,7 +161,7 @@ let initial = true; let transitionBag: Writable = writable(); $: transitionBag.set({ - show: shouldShow, + show: !!shouldShow, appear: appear || !initial, });