From c8e4904ad85ad1eb6f780fd4056eaecb62d760cd Mon Sep 17 00:00:00 2001 From: jordanarldt Date: Thu, 20 Mar 2025 12:50:10 -0500 Subject: [PATCH 1/2] feat: Update Modal component --- apps/web/vibes/soul/docs/modal.mdx | 35 +++++----- .../soul/examples/primitives/modal/index.tsx | 4 +- .../web/vibes/soul/primitives/modal/index.tsx | 64 +++++++++++++++---- 3 files changed, 73 insertions(+), 30 deletions(-) diff --git a/apps/web/vibes/soul/docs/modal.mdx b/apps/web/vibes/soul/docs/modal.mdx index 37e729a6b..d4067cb9b 100644 --- a/apps/web/vibes/soul/docs/modal.mdx +++ b/apps/web/vibes/soul/docs/modal.mdx @@ -16,17 +16,17 @@ import { useState } from 'react'; import { Modal } from '@/vibes/soul/primitives/modal'; function Usage() { - const [isOpen, setIsOpen] = useState(true); + const [isOpen, setIsOpen] = useState(true); return ( - Open Modal} - > -

Put your content here!

-
+ Open Modal} + > +

Put your content here!

+
); } `} @@ -40,13 +40,16 @@ This component uses the Dialog component from Radix UI. Refer to the [Radix UI D ### ModalProps -| Prop | Type | Default | -| ----------- | ------------------------- | ------- | -| `isOpen*` | `boolean` | | -| `setOpen*` | `(open: boolean) => void` | | -| `title*` | `string` | | -| `trigger*` | `ReactNode` | | -| `children*` | `ReactNode` | | +| Prop | Type | Default | +| ------------ | ------------------------- | ------- | +| `className` | `string` | | +| `isOpen` | `boolean` | | +| `setOpen` | `(open: boolean) => void` | | +| `required` | `boolean` | `false` | +| `hideHeader` | `boolean` | `false` | +| `title*` | `string` | | +| `trigger*` | `ReactNode` | | +| `children*` | `ReactNode` | | ### CSS Variables diff --git a/apps/web/vibes/soul/examples/primitives/modal/index.tsx b/apps/web/vibes/soul/examples/primitives/modal/index.tsx index f89d24feb..e8790533b 100644 --- a/apps/web/vibes/soul/examples/primitives/modal/index.tsx +++ b/apps/web/vibes/soul/examples/primitives/modal/index.tsx @@ -1,12 +1,12 @@ 'use client'; -import { useState } from 'react'; - import { Button } from '@/vibes/soul/primitives/button'; import { Modal } from '@/vibes/soul/primitives/modal'; +import { useState } from 'react'; export default function Preview() { const [isOpen, setIsOpen] = useState(true); + return (
diff --git a/apps/web/vibes/soul/primitives/modal/index.tsx b/apps/web/vibes/soul/primitives/modal/index.tsx index 5985798ae..801af9a5c 100644 --- a/apps/web/vibes/soul/primitives/modal/index.tsx +++ b/apps/web/vibes/soul/primitives/modal/index.tsx @@ -1,13 +1,21 @@ import * as Dialog from '@radix-ui/react-dialog'; import { clsx } from 'clsx'; -import { ReactNode } from 'react'; +import { XIcon } from 'lucide-react'; -export interface ModalProps { - isOpen: boolean; - setOpen: (open: boolean) => void; +import { Button } from '@/vibes/soul/primitives/button'; + +export interface ModalProps extends React.PropsWithChildren { + className?: string; + isOpen?: boolean; + setOpen?: (open: boolean) => void; + /** Title should always be given for screen reader support. */ title: string; - trigger: ReactNode; - children: ReactNode; + /** Element to trigger the modal. Not required if the modal is being controlled manually. */ + trigger?: React.ReactNode; + /** If `true`, a user will be required to make a choice by clicking on one of the provided actions. Defaults to `false`. */ + required?: boolean; + /** Hides the header / top of the modal. */ + hideHeader?: boolean; } /** @@ -21,23 +29,55 @@ export interface ModalProps { * } * ``` */ -export const Modal = function Modal({ isOpen, setOpen, title, trigger, children }: ModalProps) { +export const Modal = ({ + className = '', + isOpen, + setOpen, + title, + trigger, + children, + required = false, + hideHeader = false, +}: ModalProps) => { return ( - {trigger} + {trigger != null && {trigger}} e.preventDefault()} + onEscapeKeyDown={required ? (event) => event.preventDefault() : undefined} + onInteractOutside={required ? (event) => event.preventDefault() : undefined} + onPointerDownOutside={required ? (event) => event.preventDefault() : undefined} > - {title} - {children} +
+
+ +

{title}

+
+ {!(required || hideHeader) && ( +
+ + + +
+ )} +
+
{children}
+
From 7dd938d324839cf8e2250a945384c54063c5cd3a Mon Sep 17 00:00:00 2001 From: jordanarldt Date: Thu, 20 Mar 2025 12:53:08 -0500 Subject: [PATCH 2/2] fix: fix linting issues --- apps/web/vibes/soul/examples/form/checkbox-group/index.tsx | 7 ++++--- apps/web/vibes/soul/examples/form/number-input/index.tsx | 2 +- apps/web/vibes/soul/examples/form/select/index.tsx | 2 +- apps/web/vibes/soul/examples/pages/blog/post/electric.tsx | 2 +- apps/web/vibes/soul/examples/pages/blog/post/luxury.tsx | 2 +- apps/web/vibes/soul/examples/pages/blog/post/warm.tsx | 2 +- apps/web/vibes/soul/examples/pages/cart/electric.tsx | 2 +- apps/web/vibes/soul/examples/pages/cart/luxury.tsx | 2 +- apps/web/vibes/soul/examples/pages/cart/warm.tsx | 2 +- apps/web/vibes/soul/examples/pages/error/index.tsx | 2 +- apps/web/vibes/soul/examples/pages/not-found/electric.tsx | 2 +- apps/web/vibes/soul/examples/pages/product/electric.tsx | 2 +- apps/web/vibes/soul/examples/pages/product/luxury.tsx | 2 +- apps/web/vibes/soul/examples/pages/product/warm.tsx | 2 +- apps/web/vibes/soul/examples/pages/products/electric.tsx | 2 +- apps/web/vibes/soul/examples/pages/products/luxury.tsx | 2 +- apps/web/vibes/soul/examples/primitives/modal/index.tsx | 3 ++- .../vibes/soul/examples/sections/forgot-password/index.tsx | 5 +++-- .../vibes/soul/examples/sections/reset-password/index.tsx | 4 ++-- apps/web/vibes/soul/examples/sections/sign-in/index.tsx | 5 +++-- apps/web/vibes/soul/primitives/modal/index.tsx | 2 +- .../web/vibes/soul/sections/address-list-section/index.tsx | 4 ++-- apps/web/vibes/soul/sections/reviews/index.tsx | 6 +++--- 23 files changed, 35 insertions(+), 31 deletions(-) diff --git a/apps/web/vibes/soul/examples/form/checkbox-group/index.tsx b/apps/web/vibes/soul/examples/form/checkbox-group/index.tsx index 9ef52c664..cd7b7ddd9 100644 --- a/apps/web/vibes/soul/examples/form/checkbox-group/index.tsx +++ b/apps/web/vibes/soul/examples/form/checkbox-group/index.tsx @@ -1,22 +1,23 @@ 'use client'; -import { CheckboxGroup } from '@/vibes/soul/form/checkbox-group'; import { useState } from 'react'; +import { CheckboxGroup } from '@/vibes/soul/form/checkbox-group'; + export default function Preview() { const [value, setValue] = useState([]); return (
); diff --git a/apps/web/vibes/soul/examples/form/number-input/index.tsx b/apps/web/vibes/soul/examples/form/number-input/index.tsx index 2ab03c31e..9824126cc 100644 --- a/apps/web/vibes/soul/examples/form/number-input/index.tsx +++ b/apps/web/vibes/soul/examples/form/number-input/index.tsx @@ -3,7 +3,7 @@ import { NumberInput } from '@/vibes/soul/form/number-input'; export default function Preview() { return (
- +
); } diff --git a/apps/web/vibes/soul/examples/form/select/index.tsx b/apps/web/vibes/soul/examples/form/select/index.tsx index cfd9d9575..f3836e554 100644 --- a/apps/web/vibes/soul/examples/form/select/index.tsx +++ b/apps/web/vibes/soul/examples/form/select/index.tsx @@ -4,8 +4,8 @@ export default function Preview() { return (