From 8ab23a1722d38a264a85bd152932bcafd1923416 Mon Sep 17 00:00:00 2001 From: Mats Bosson Date: Sun, 29 Mar 2026 05:54:12 +0700 Subject: [PATCH] Clean up Dialog internals --- .../src/components/dialog/dialog-close.tsx | 5 ++-- .../src/components/dialog/dialog-content.tsx | 28 +++++++++---------- .../src/components/dialog/dialog-context.ts | 3 -- .../src/components/dialog/dialog-portal.tsx | 8 ++---- .../src/components/dialog/dialog-root.tsx | 8 ++---- packages/core/src/components/dialog/index.ts | 2 +- 6 files changed, 22 insertions(+), 32 deletions(-) diff --git a/packages/core/src/components/dialog/dialog-close.tsx b/packages/core/src/components/dialog/dialog-close.tsx index 9a3fd10..846132b 100644 --- a/packages/core/src/components/dialog/dialog-close.tsx +++ b/packages/core/src/components/dialog/dialog-close.tsx @@ -1,6 +1,6 @@ // packages/core/src/components/dialog/dialog-close.tsx import type { Component, JSX } from "solid-js"; -import { splitProps } from "solid-js"; +import { mergeProps, splitProps } from "solid-js"; import { Dynamic } from "solid-js/web"; import { useInternalDialogContext } from "./dialog-context"; @@ -20,8 +20,9 @@ export function DialogClose(props: DialogCloseProps): JSX.Element { ctx.setOpen(false); }; + const closeProps = mergeProps(rest, { onClick: handleClick }); return ( - + {local.children} ); diff --git a/packages/core/src/components/dialog/dialog-content.tsx b/packages/core/src/components/dialog/dialog-content.tsx index 269f84d..e91fe7f 100644 --- a/packages/core/src/components/dialog/dialog-content.tsx +++ b/packages/core/src/components/dialog/dialog-content.tsx @@ -3,7 +3,6 @@ import type { JSX } from "solid-js"; import { Show, createEffect, onCleanup, splitProps } from "solid-js"; import { createDismiss } from "../../utilities/dismiss/create-dismiss"; import { createFocusTrap } from "../../utilities/focus-trap/create-focus-trap"; -import { Portal } from "../../utilities/portal/portal"; import { createScrollLock } from "../../utilities/scroll-lock/create-scroll-lock"; import { useInternalDialogContext } from "./dialog-context"; @@ -22,7 +21,8 @@ export interface DialogContentProps extends JSX.DialogHtmlAttributes - - - {local.children} - - + + {local.children} + ); } diff --git a/packages/core/src/components/dialog/dialog-context.ts b/packages/core/src/components/dialog/dialog-context.ts index 062979c..5e9384f 100644 --- a/packages/core/src/components/dialog/dialog-context.ts +++ b/packages/core/src/components/dialog/dialog-context.ts @@ -16,9 +16,6 @@ export interface InternalDialogContextValue { /** Registered ID from Dialog.Description — used for aria-describedby */ descriptionId: Accessor; setDescriptionId: (id: string | undefined) => void; - /** Whether Dialog.Trigger has been explicitly rendered */ - hasTrigger: Accessor; - setHasTrigger: (has: boolean) => void; } const InternalDialogContext = createContext(); diff --git a/packages/core/src/components/dialog/dialog-portal.tsx b/packages/core/src/components/dialog/dialog-portal.tsx index 8893cb4..1a17be5 100644 --- a/packages/core/src/components/dialog/dialog-portal.tsx +++ b/packages/core/src/components/dialog/dialog-portal.tsx @@ -1,6 +1,5 @@ // packages/core/src/components/dialog/dialog-portal.tsx import type { JSX } from "solid-js"; -import { splitProps } from "solid-js"; import { Portal } from "../../utilities/portal/portal"; export interface DialogPortalProps { @@ -11,10 +10,9 @@ export interface DialogPortalProps { /** Renders children into a portal (defaults to document.body). */ export function DialogPortal(props: DialogPortalProps): JSX.Element { - const [local, rest] = splitProps(props, ["target", "children"]); - return local.target !== undefined ? ( - {local.children} + return props.target !== undefined ? ( + {props.children} ) : ( - {local.children} + {props.children} ); } diff --git a/packages/core/src/components/dialog/dialog-root.tsx b/packages/core/src/components/dialog/dialog-root.tsx index 13d132f..9a446f0 100644 --- a/packages/core/src/components/dialog/dialog-root.tsx +++ b/packages/core/src/components/dialog/dialog-root.tsx @@ -1,6 +1,6 @@ // packages/core/src/components/dialog/dialog-root.tsx import type { JSX } from "solid-js"; -import { createSignal } from "solid-js"; +import { createUniqueId } from "solid-js"; import { type CreateDisclosureStateOptions, createDisclosureState, @@ -44,11 +44,9 @@ export function DialogRoot(props: DialogRootProps): JSX.Element { }, } as CreateDisclosureStateOptions); - const contentId = `pettyui-dialog-${Math.random().toString(36).slice(2, 9)}`; + const contentId = createUniqueId(); const [titleId, setTitleId] = createRegisterId(); const [descriptionId, setDescriptionId] = createRegisterId(); - const [hasTrigger, setHasTrigger] = createSignal(false); - const internalCtx: InternalDialogContextValue = { isOpen: disclosure.isOpen, setOpen: (open) => (open ? disclosure.open() : disclosure.close()), @@ -58,8 +56,6 @@ export function DialogRoot(props: DialogRootProps): JSX.Element { setTitleId, descriptionId, setDescriptionId, - hasTrigger, - setHasTrigger, }; return ( diff --git a/packages/core/src/components/dialog/index.ts b/packages/core/src/components/dialog/index.ts index 4697ea8..610b12d 100644 --- a/packages/core/src/components/dialog/index.ts +++ b/packages/core/src/components/dialog/index.ts @@ -1,10 +1,10 @@ +// packages/core/src/components/dialog/index.ts import { DialogClose } from "./dialog-close"; import { DialogContent } from "./dialog-content"; import { useDialogContext } from "./dialog-context"; import { DialogDescription } from "./dialog-description"; import { DialogOverlay } from "./dialog-overlay"; import { DialogPortal } from "./dialog-portal"; -// packages/core/src/components/dialog/index.ts import { DialogRoot } from "./dialog-root"; import { DialogTitle } from "./dialog-title"; import { DialogTrigger } from "./dialog-trigger";