diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000..549d64f --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,31 @@ +// packages/core/src/index.ts +// Main entry — re-exports everything for convenience. +// Prefer sub-path imports (e.g. "pettyui/dialog") for tree-shaking. + +export { Dialog } from "./components/dialog/index"; +export type { DialogRootProps } from "./components/dialog/dialog-root"; +export type { DialogContentProps } from "./components/dialog/dialog-content"; +export type { DialogTitleProps } from "./components/dialog/dialog-title"; +export type { DialogDescriptionProps } from "./components/dialog/dialog-description"; +export type { DialogTriggerProps } from "./components/dialog/dialog-trigger"; +export type { DialogCloseProps } from "./components/dialog/dialog-close"; +export type { DialogPortalProps } from "./components/dialog/dialog-portal"; +export type { DialogOverlayProps } from "./components/dialog/dialog-overlay"; + +export { Presence } from "./utilities/presence/index"; +export type { PresenceProps, PresenceChildProps } from "./utilities/presence/index"; + +export { Portal } from "./utilities/portal/index"; +export type { PortalProps } from "./utilities/portal/index"; + +export { VisuallyHidden } from "./utilities/visually-hidden/index"; +export type { VisuallyHiddenProps } from "./utilities/visually-hidden/index"; + +export { createFocusTrap } from "./utilities/focus-trap/index"; +export type { FocusTrap } from "./utilities/focus-trap/index"; + +export { createScrollLock } from "./utilities/scroll-lock/index"; +export type { ScrollLock } from "./utilities/scroll-lock/index"; + +export { createDismiss } from "./utilities/dismiss/index"; +export type { CreateDismissOptions, Dismiss } from "./utilities/dismiss/index"; diff --git a/packages/core/src/primitives/create-disclosure-state.ts b/packages/core/src/primitives/create-disclosure-state.ts index 7e9a6b0..67ee140 100644 --- a/packages/core/src/primitives/create-disclosure-state.ts +++ b/packages/core/src/primitives/create-disclosure-state.ts @@ -19,9 +19,7 @@ export interface DisclosureState { * Tooltip, Collapsible, etc.). Wraps createControllableSignal with * convenience open/close/toggle methods. */ -export function createDisclosureState( - options: CreateDisclosureStateOptions, -): DisclosureState { +export function createDisclosureState(options: CreateDisclosureStateOptions): DisclosureState { const [isOpen, setIsOpen] = createControllableSignal({ value: () => options.open, defaultValue: () => options.defaultOpen ?? false, diff --git a/packages/core/src/utilities/focus-trap/create-focus-trap.ts b/packages/core/src/utilities/focus-trap/create-focus-trap.ts index c3dcc8d..b58cc50 100644 --- a/packages/core/src/utilities/focus-trap/create-focus-trap.ts +++ b/packages/core/src/utilities/focus-trap/create-focus-trap.ts @@ -36,8 +36,8 @@ export function createFocusTrap(getContainer: Accessor): Foc return; } - const first = focusable[0]!; - const last = focusable[focusable.length - 1]!; + const first = focusable[0] as HTMLElement; + const last = focusable[focusable.length - 1] as HTMLElement; if (e.shiftKey) { if (document.activeElement === first) { diff --git a/packages/core/src/utilities/portal/portal.tsx b/packages/core/src/utilities/portal/portal.tsx index c5ce33e..b4dddcc 100644 --- a/packages/core/src/utilities/portal/portal.tsx +++ b/packages/core/src/utilities/portal/portal.tsx @@ -17,9 +17,5 @@ export function Portal(props: PortalProps): JSX.Element { return <>{props.children}; } - return ( - - {props.children} - - ); + return {props.children}; } diff --git a/packages/core/src/utilities/presence/presence.tsx b/packages/core/src/utilities/presence/presence.tsx index 1d008f4..9e3af6d 100644 --- a/packages/core/src/utilities/presence/presence.tsx +++ b/packages/core/src/utilities/presence/presence.tsx @@ -75,12 +75,12 @@ export function Presence(props: PresenceProps): JSX.Element { // Wrap in a function so Show evaluates children lazily (only when mounted). return ( - {( - () => + { + (() => typeof props.children === "function" ? (props.children as (p: PresenceChildProps) => JSX.Element)(childProps) - : props.children - ) as unknown as JSX.Element} + : props.children) as unknown as JSX.Element + } ); } diff --git a/packages/core/tests/utilities/focus-trap.test.ts b/packages/core/tests/utilities/focus-trap.test.ts index 81dfb2f..2907ca0 100644 --- a/packages/core/tests/utilities/focus-trap.test.ts +++ b/packages/core/tests/utilities/focus-trap.test.ts @@ -96,7 +96,12 @@ describe("createFocusTrap", () => { const trap = createFocusTrap(() => container); trap.activate(); // button1 is already focused after activate - const event = new KeyboardEvent("keydown", { key: "Tab", shiftKey: true, bubbles: true, cancelable: true }); + const event = new KeyboardEvent("keydown", { + key: "Tab", + shiftKey: true, + bubbles: true, + cancelable: true, + }); document.dispatchEvent(event); expect(document.activeElement).toBe(button2); trap.deactivate(); @@ -138,7 +143,9 @@ describe("createFocusTrap", () => { // Tab from the only element — Tab wraps back to itself (first === last) // What matters is it doesn't fire twice causing erratic behaviour expect(() => { - document.dispatchEvent(new KeyboardEvent("keydown", { key: "Tab", bubbles: true, cancelable: true })); + document.dispatchEvent( + new KeyboardEvent("keydown", { key: "Tab", bubbles: true, cancelable: true }), + ); }).not.toThrow(); trap.deactivate(); dispose(); diff --git a/packages/core/tests/utilities/portal.test.tsx b/packages/core/tests/utilities/portal.test.tsx index 3f6dc7a..8141dd0 100644 --- a/packages/core/tests/utilities/portal.test.tsx +++ b/packages/core/tests/utilities/portal.test.tsx @@ -4,7 +4,11 @@ import { Portal } from "../../src/utilities/portal/portal"; describe("Portal", () => { it("renders children into document.body by default", () => { - render(() =>
hello
); + render(() => ( + +
hello
+
+ )); // Content should be in document.body, not the render container expect(document.body.querySelector("[data-testid='portal-content']")).toBeTruthy(); });