Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 43 additions & 8 deletions src/hygge-ui/dialog.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,47 @@
import { Dialog as ArkDialog, Portal } from "@ark-ui/react";
import { createContext, useContext } from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { LuX } from "react-icons/lu";
import { cn } from "./cn";
import { Button } from "./button";

export function DialogRoot(props: ArkDialog.RootProps) {
return <ArkDialog.Root {...props} />;
const dialogContentVariants = cva(
"bg-bg-default relative w-full rounded-lg shadow-[0_0_0_1px_#E9E8E6] dark:shadow-[0_0_0_1px_#2a2a28]",
{
variants: {
size: {
xs: "max-w-sm",
sm: "max-w-md",
md: "max-w-md",
lg: "max-w-lg",
xl: "max-w-xl",
cover: "max-h-[calc(100dvh-2rem)] max-w-[calc(100vw-2rem)]",
full: "h-dvh w-screen max-w-screen rounded-none!",
},
},
defaultVariants: {
size: "md",
},
},
);

const DialogContext = createContext<VariantProps<typeof dialogContentVariants>>(
{
size: "md",
},
);

type DialogRootProps = VariantProps<typeof dialogContentVariants> &
ArkDialog.RootProps;

export function DialogRoot(props: DialogRootProps) {
const { size, ...rest } = props;

return (
<DialogContext.Provider value={{ size }}>
<ArkDialog.Root {...rest} />
</DialogContext.Provider>
);
}

export function DialogTrigger(props: ArkDialog.TriggerProps) {
Expand All @@ -17,6 +54,7 @@ type DialogContentProps = {

export function DialogContent(props: DialogContentProps) {
const { showCloseTrigger = false, className, children, ...rest } = props;
const { size } = useContext(DialogContext);

return (
<Portal>
Expand All @@ -32,18 +70,15 @@ export function DialogContent(props: DialogContentProps) {
>
<ArkDialog.Content
{...rest}
className={cn(
"bg-bg-default relative w-full max-w-lg rounded-lg shadow-[0_0_0_1px_#E9E8E6] dark:shadow-[0_0_0_1px_#2a2a28]",
className,
)}
className={cn(dialogContentVariants({ size }), className)}
>
{children}
{showCloseTrigger ? (
<ArkDialog.CloseTrigger
asChild
className="absolute top-1 right-1 cursor-pointer"
>
<Button variant="ghost">
<Button variant="ghost" size="xs">
<LuX size={16} />
</Button>
</ArkDialog.CloseTrigger>
Expand Down Expand Up @@ -71,7 +106,7 @@ export function DialogDescription(props: ArkDialog.DescriptionProps) {
return (
<ArkDialog.Description
{...rest}
className={cn("text-fg-muted text-sm/6 font-semibold", className)}
className={cn("text-fg-muted text-sm/6", className)}
/>
);
}
Expand Down
73 changes: 44 additions & 29 deletions src/routes/docs.components.dialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import {
import { createFileRoute } from "@tanstack/react-router";
import { PageHeader } from "app/components/page-header";
import { PagePreviewCodeTabs } from "app/components/page-preview-code-tabs";
import { Heading } from "hygge-ui/heading";
import { Code, Text } from "hygge-ui/text";

export const Route = createFileRoute("/docs/components/dialog")({
component: DialogPage,
Expand All @@ -33,15 +35,14 @@ function DialogPage() {
description="Used to display a dialog prompt."
githubLink="https://github.com/malcodeman/hygge-ui/blob/main/src/components/dialog.tsx"
className="mb-2"
verified
/>
<PagePreviewCodeTabs
preview={
<DialogRoot>
<div>
<DialogTrigger asChild>
<Button variant="outline">Open dialog</Button>
</DialogTrigger>
</div>
<DialogTrigger asChild>
<Button variant="outline">Open dialog</Button>
</DialogTrigger>
<DialogContent showCloseTrigger>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
Expand All @@ -61,30 +62,44 @@ function DialogPage() {
</DialogContent>
</DialogRoot>
}
code={`<DialogRoot>
<div>
<DialogTrigger asChild>
<Button variant="outline">Open dialog</Button>
</DialogTrigger>
</div>
<DialogContent showCloseTrigger>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
</DialogHeader>
<DialogBody>
<DialogDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</DialogDescription>
</DialogBody>
<DialogFooter>
<DialogCloseTrigger asChild>
<Button variant="outline">Cancel</Button>
</DialogCloseTrigger>
<Button>Save</Button>
</DialogFooter>
</DialogContent>
</DialogRoot>`}
code={``}
/>
<Heading level={2} className="mt-10 mb-2">
Examples
</Heading>
<Heading level={3} size="lg" className="mb-2">
Error text
</Heading>
<Text className="mb-2">
Pass the <Code>size</Code> prop to change the size of the dialog
component.
</Text>
<PagePreviewCodeTabs
preview={
<DialogRoot size="xs">
<DialogTrigger asChild>
<Button variant="outline">Open dialog</Button>
</DialogTrigger>
<DialogContent showCloseTrigger>
<DialogHeader>
<DialogTitle>Dialog Title</DialogTitle>
</DialogHeader>
<DialogBody>
<DialogDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed
do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</DialogDescription>
</DialogBody>
<DialogFooter>
<DialogCloseTrigger asChild>
<Button variant="outline">Cancel</Button>
</DialogCloseTrigger>
<Button>Save</Button>
</DialogFooter>
</DialogContent>
</DialogRoot>
}
code={``}
/>
</>
);
Expand Down