Type Disclosure with $$Props

This commit is contained in:
Ryan Gossiaux
2022-02-07 17:25:14 -08:00
parent 231775e60b
commit 696b25eb95
3 changed files with 55 additions and 8 deletions

View File

@@ -40,6 +40,13 @@
return context; return context;
} }
type TDisclosureProps<
TSlotProps extends {},
TAsProp extends SupportedAs
> = TPassThroughProps<TSlotProps, TAsProp> & {
defaultOpen?: boolean;
};
</script> </script>
<script lang="ts"> <script lang="ts">
@@ -50,13 +57,20 @@
import { get_current_component } from "svelte/internal"; import { get_current_component } from "svelte/internal";
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, { type TPassThroughProps } from "$lib/utils/Render.svelte";
const forwardEvents = forwardEventsBuilder(get_current_component());
/***** Props *****/
type TAsProp = $$Generic<SupportedAs>;
type $$Props = TDisclosureProps<typeof slotProps, TAsProp>;
export let as: SupportedAs = "div"; export let as: SupportedAs = "div";
export let use: HTMLActionArray = []; export let use: HTMLActionArray = [];
export let defaultOpen = false; export let defaultOpen = false;
/***** Events *****/
const forwardEvents = forwardEventsBuilder(get_current_component());
/***** Component *****/
let buttonId = `headlessui-disclosure-button-${useId()}`; let buttonId = `headlessui-disclosure-button-${useId()}`;
let panelId = `headlessui-disclosure-panel-${useId()}`; let panelId = `headlessui-disclosure-panel-${useId()}`;

View File

@@ -1,3 +1,12 @@
<script lang="ts" context="module">
type TDisclosureButtonProps<
TSlotProps extends {},
TAsProp extends SupportedAs
> = TPassThroughProps<TSlotProps, TAsProp> & {
disabled?: boolean;
};
</script>
<script lang="ts"> <script lang="ts">
import { useDisclosureContext, DisclosureStates } from "./Disclosure.svelte"; import { useDisclosureContext, DisclosureStates } from "./Disclosure.svelte";
import { usePanelContext } from "./DisclosurePanel.svelte"; import { usePanelContext } from "./DisclosurePanel.svelte";
@@ -6,15 +15,22 @@
import { get_current_component } from "svelte/internal"; import { get_current_component } from "svelte/internal";
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, { type TPassThroughProps } from "$lib/utils/Render.svelte";
import { writable } from "svelte/store"; import { writable } from "svelte/store";
import { resolveButtonType } from "$lib/utils/resolve-button-type"; import { resolveButtonType } from "$lib/utils/resolve-button-type";
const forwardEvents = forwardEventsBuilder(get_current_component());
/***** Props *****/
type TAsProp = $$Generic<SupportedAs>;
type $$Props = TDisclosureButtonProps<typeof slotProps, TAsProp>;
export let as: SupportedAs = "button"; export let as: SupportedAs = "button";
export let use: HTMLActionArray = []; export let use: HTMLActionArray = [];
export let disabled = false; export let disabled = false;
/***** Events *****/
const forwardEvents = forwardEventsBuilder(get_current_component());
/***** Component *****/
const api = useDisclosureContext("DisclosureButton"); const api = useDisclosureContext("DisclosureButton");
const panelContext = usePanelContext(); const panelContext = usePanelContext();

View File

@@ -5,6 +5,13 @@
export function usePanelContext(): string | undefined { export function usePanelContext(): string | undefined {
return getContext(DISCLOSURE_PANEL_CONTEXT_NAME); return getContext(DISCLOSURE_PANEL_CONTEXT_NAME);
} }
type TDisclosurePanelProps<
TSlotProps extends {},
TAsProp extends SupportedAs
> = TPassThroughProps<TSlotProps, TAsProp> & {
unmount?: boolean;
static?: boolean;
};
</script> </script>
<script lang="ts"> <script lang="ts">
@@ -14,12 +21,22 @@
import { get_current_component } from "svelte/internal"; import { get_current_component } from "svelte/internal";
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, { Features } from "$lib/utils/Render.svelte"; import Render, {
const forwardEvents = forwardEventsBuilder(get_current_component()); Features,
type TPassThroughProps,
} from "$lib/utils/Render.svelte";
/***** Props *****/
type TAsProp = $$Generic<SupportedAs>;
type $$Props = TDisclosurePanelProps<typeof slotProps, TAsProp>;
export let as: SupportedAs = "div"; export let as: SupportedAs = "div";
export let use: HTMLActionArray = []; export let use: HTMLActionArray = [];
/***** Events *****/
const forwardEvents = forwardEventsBuilder(get_current_component());
/***** Component *****/
const api = useDisclosureContext("DisclosurePanel"); const api = useDisclosureContext("DisclosurePanel");
let openClosedState = useOpenClosed(); let openClosedState = useOpenClosed();