From 4b4787d56c2156bf5ab410d28d5ecd7a52ae753c Mon Sep 17 00:00:00 2001 From: Abel Lopes Date: Thu, 21 Dec 2023 15:03:55 +0000 Subject: [PATCH] feat: update modal component - show modal overlay with pointer cursor when clickable - increase spacing - add internal & external open states, allowing to be uncontrolled - add open & close handlers --- packages/components/modal/src/Modal.tsx | 72 ++++++++++++------- .../modal/src/styles/index.module.scss | 11 ++- 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/packages/components/modal/src/Modal.tsx b/packages/components/modal/src/Modal.tsx index c3154887..297995f7 100644 --- a/packages/components/modal/src/Modal.tsx +++ b/packages/components/modal/src/Modal.tsx @@ -1,6 +1,6 @@ import classNames from "classnames"; import styles from "./styles/index.module.scss"; -import React, { useCallback, useMemo, useState } from "react"; +import React, { useCallback, useEffect, useMemo, useState } from "react"; import { ModalContext, type ModalContextProps, type ModalContextValue } from "./context"; import { Card } from "@react-ck/card"; import { Overlay } from "@react-ck/overlay"; @@ -40,33 +40,51 @@ export const Modal = ({ [setContextValue], ); + // Invoke open / close handlers + useEffect(() => { + if (internalOpen) onOpen?.(); + else onClose?.(); + }, [internalOpen, onClose, onOpen]); + + // Synchronize internal state with external state + useEffect(() => { + setInternalOpen(open); + }, [open]); + return ( - -
- - - - {props.header && ( -
- - {props.header.heading} - + internalOpen && ( + +
+ + + + {props.header && ( +
+ + {props.header.heading} + -
- )} -
{children}
- {props.footer && ( -
- )} - - -
-
+ {dismissable && ( +
+ )} +
{children}
+ {props.footer && ( +
+
+ ) ); }; diff --git a/packages/components/modal/src/styles/index.module.scss b/packages/components/modal/src/styles/index.module.scss index 5ce597cc..b0a1dc52 100644 --- a/packages/components/modal/src/styles/index.module.scss +++ b/packages/components/modal/src/styles/index.module.scss @@ -1,7 +1,7 @@ @import "@react-ck/theme"; .root { - @include define-css-var(modal, spacing, get-spacing(4)); + @include define-css-var(modal, spacing, get-spacing(5)); display: flex; align-items: center; @@ -13,6 +13,10 @@ width: 100%; } +.clickable_overlay { + cursor: pointer; +} + .card { position: relative; } @@ -22,12 +26,13 @@ align-items: center; justify-content: space-between; gap: get-css-var(modal, spacing); - padding-bottom: get-css-var(modal, spacing); + margin-bottom: get-css-var(modal, spacing); } .footer { display: flex; align-items: center; + justify-content: flex-end; gap: get-css-var(modal, spacing); - padding-top: get-css-var(modal, spacing); + margin-top: get-css-var(modal, spacing); }