From d21287eace2ff6c6b4a7e5d2ec4db33ca9744817 Mon Sep 17 00:00:00 2001 From: Ryan Gossiaux Date: Wed, 22 Dec 2021 11:55:52 -0800 Subject: [PATCH] Support Features rendering / static/unmount props Fixes #1 --- src/lib/components/dialog/Dialog.svelte | 80 +++++++++---------- .../disclosure/DisclosurePanel.svelte | 26 +++--- .../components/listbox/ListboxOptions.svelte | 30 +++---- src/lib/components/menu/MenuItems.svelte | 30 +++---- .../components/popover/PopoverOverlay.svelte | 28 +++---- .../components/popover/PopoverPanel.svelte | 30 +++---- src/lib/components/tabs/TabPanel.svelte | 22 ++--- .../transitions/TransitionChild.svelte | 9 +-- .../transitions/TransitionRoot.svelte | 4 +- src/lib/utils/Render.svelte | 60 +++++++++++--- 10 files changed, 178 insertions(+), 141 deletions(-) diff --git a/src/lib/components/dialog/Dialog.svelte b/src/lib/components/dialog/Dialog.svelte index 43bc80c..6a65324 100644 --- a/src/lib/components/dialog/Dialog.svelte +++ b/src/lib/components/dialog/Dialog.svelte @@ -59,7 +59,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component(), [ "close", ]); @@ -247,42 +247,42 @@ on:mousedown={handleWindowMousedown} on:keydown={handleWindowKeydown} /> -{#if visible} - - { - return match(message, { - [StackMessage.Add]() { - containers.add(element); - }, - [StackMessage.Remove]() { - containers.delete(element); - }, - }); - }} - > - - - - - - - - - - - - - - -{/if} + + { + return match(message, { + [StackMessage.Add]() { + containers.add(element); + }, + [StackMessage.Remove]() { + containers.delete(element); + }, + }); + }} +> + + + + + + + + + + + + + + diff --git a/src/lib/components/disclosure/DisclosurePanel.svelte b/src/lib/components/disclosure/DisclosurePanel.svelte index 5d0fe0c..06e885a 100644 --- a/src/lib/components/disclosure/DisclosurePanel.svelte +++ b/src/lib/components/disclosure/DisclosurePanel.svelte @@ -14,7 +14,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component()); export let as: SupportedAs = "div"; @@ -41,15 +41,15 @@ }; -{#if visible} - - - -{/if} + + + diff --git a/src/lib/components/listbox/ListboxOptions.svelte b/src/lib/components/listbox/ListboxOptions.svelte index 5839a85..f3b04a2 100644 --- a/src/lib/components/listbox/ListboxOptions.svelte +++ b/src/lib/components/listbox/ListboxOptions.svelte @@ -6,7 +6,7 @@ import { Keys } from "$lib/utils/keyboard"; import { Focus } from "$lib/utils/calculate-active-index"; import { State, useOpenClosed } from "$lib/internal/open-closed"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; @@ -120,17 +120,17 @@ $: slotProps = { open: $api.listboxState === ListboxStates.Open }; -{#if visible} - - - -{/if} + + + diff --git a/src/lib/components/menu/MenuItems.svelte b/src/lib/components/menu/MenuItems.svelte index f9a4432..d4cfe5d 100644 --- a/src/lib/components/menu/MenuItems.svelte +++ b/src/lib/components/menu/MenuItems.svelte @@ -8,7 +8,7 @@ import { tick } from "svelte"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; import type { SupportedAs } from "$lib/internal/elements"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; import { get_current_component } from "svelte/internal"; @@ -138,17 +138,17 @@ $: slotProps = { open: $api.menuState === MenuStates.Open }; -{#if visible} - - - -{/if} + + + diff --git a/src/lib/components/popover/PopoverOverlay.svelte b/src/lib/components/popover/PopoverOverlay.svelte index d1eabfe..17b55d2 100644 --- a/src/lib/components/popover/PopoverOverlay.svelte +++ b/src/lib/components/popover/PopoverOverlay.svelte @@ -5,7 +5,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component()); export let as: SupportedAs = "div"; @@ -27,16 +27,16 @@ $: slotProps = { open: $api.popoverState === PopoverStates.Open }; -{#if visible} - - - -{/if} + + + diff --git a/src/lib/components/popover/PopoverPanel.svelte b/src/lib/components/popover/PopoverPanel.svelte index 89668f1..4cfa723 100644 --- a/src/lib/components/popover/PopoverPanel.svelte +++ b/src/lib/components/popover/PopoverPanel.svelte @@ -28,7 +28,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component()); export let as: SupportedAs = "div"; @@ -135,17 +135,17 @@ on:keydown={handleWindowKeydown} on:focus|capture={handleFocus} /> -{#if visible} - - - -{/if} + + + diff --git a/src/lib/components/tabs/TabPanel.svelte b/src/lib/components/tabs/TabPanel.svelte index 27bc861..7cec664 100644 --- a/src/lib/components/tabs/TabPanel.svelte +++ b/src/lib/components/tabs/TabPanel.svelte @@ -6,7 +6,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component()); export let as: SupportedAs = "div"; @@ -31,13 +31,13 @@ }; -{#if selected} - - - -{/if} + + + diff --git a/src/lib/components/transitions/TransitionChild.svelte b/src/lib/components/transitions/TransitionChild.svelte index ae42cd8..9138b90 100644 --- a/src/lib/components/transitions/TransitionChild.svelte +++ b/src/lib/components/transitions/TransitionChild.svelte @@ -18,7 +18,7 @@ import { get_current_component } from "svelte/internal"; import type { SupportedAs } from "$lib/internal/elements"; import type { HTMLActionArray } from "$lib/hooks/use-actions"; - import Render from "$lib/utils/Render.svelte"; + import Render, { Features, RenderStrategy } from "$lib/utils/Render.svelte"; const forwardEvents = forwardEventsBuilder(get_current_component(), [ "beforeEnter", "beforeLeave", @@ -29,7 +29,6 @@ export let as: SupportedAs = "div"; export let use: HTMLActionArray = []; - export let unmount = true; export let enter = ""; export let enterFrom = ""; export let enterTo = ""; @@ -186,8 +185,8 @@ name={"TransitionChild"} bind:el={container} class={classes} + visible={state === TreeStates.Visible} + features={Features.RenderStrategy} > - {#if state === TreeStates.Visible} - - {/if} + diff --git a/src/lib/components/transitions/TransitionRoot.svelte b/src/lib/components/transitions/TransitionRoot.svelte index 823a67e..992e399 100644 --- a/src/lib/components/transitions/TransitionRoot.svelte +++ b/src/lib/components/transitions/TransitionRoot.svelte @@ -126,7 +126,6 @@ export let use: HTMLActionArray = []; export let show: boolean | undefined = undefined; - export let unmount = true; export let appear = false; let openClosedState = useOpenClosed(); @@ -191,12 +190,11 @@ setContext(TRANSITION_CONTEXT_NAME, transitionBag); -{#if state === TreeStates.Visible} +{#if state === TreeStates.Visible || $$props.unmount === false} import type { ActionArray } from "$lib/hooks/use-actions"; import { forwardEventsBuilder } from "$lib/internal/forwardEventsBuilder"; + const forwardEvents = forwardEventsBuilder(get_current_component()); export let name: string; export let as: SvelteComponent | SupportedElement; export let el: HTMLElement | null = null; export let use: ActionArray = []; export let slotProps: unknown = {}; - const forwardEvents = forwardEventsBuilder(get_current_component()); + export let visible = true; + export let features: Features = Features.None; + // The static and unmount props are only used in conjunction with the render strategies + export let unmount = true; if (!as) { throw new Error(`<${name}> did not provide an \`as\` value to `); @@ -34,14 +58,30 @@ } $: classStyle = $$props.class; + + $: show = + visible || + (features & Features.Static && $$props.static) || + !(features & Features.RenderStrategy && unmount); + $: hidden = + !visible && + !(features & Features.Static && $$props.static) && + features & Features.RenderStrategy && + !unmount; - - - +{#if show} + +{/if}