theme-ui#Close TypeScript Examples
The following examples show how to use
theme-ui#Close.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: Sidebar.tsx From nextjs-shopify with MIT License | 6 votes |
Sidebar: FC<Props> = ({ children, open = false, onClose }) => {
const width = useResponsiveValue(['100%', 500])
return (
<BaseModal
isOpen={open}
onDismiss={onClose}
contentProps={{
style: {
width,
position: 'absolute',
top: 0,
right: 0,
height: '100%',
},
}}
contentTransition={{
from: { transform: 'translateX(100%)' },
enter: { transform: 'translateX(0)' },
leave: { transform: 'translateX(100%)' },
}}
>
<ModalCloseTarget>
<Themed.div
sx={{
display: 'flex',
justifyContent: 'space-between',
py: 1,
bg: 'text',
color: 'background',
}}
>
<Close />
</Themed.div>
</ModalCloseTarget>
{children}
</BaseModal>
)
}
Example #2
Source File: index.tsx From slice-machine with Apache License 2.0 | 5 votes |
SetupDrawer: React.FunctionComponent = () => {
const { closeSetupDrawer } = useSliceMachineActions();
const {
isSetupDrawerOpen,
linkToStorybookDocs,
framework,
isSimulatorAvailableForFramework,
} = useSelector((state: SliceMachineStoreType) => ({
isSetupDrawerOpen: selectIsSetupDrawerOpen(state),
framework: getFramework(state),
linkToStorybookDocs: getLinkToStorybookDocs(state),
isSimulatorAvailableForFramework:
selectIsSimulatorAvailableForFramework(state),
}));
// We close the drawer if the framework cannot handle the simulator
useEffect(() => {
if (isSimulatorAvailableForFramework) return;
closeSetupDrawer();
}, [isSimulatorAvailableForFramework]);
return (
<Drawer
placement="right"
open={isSetupDrawerOpen}
level={null}
onClose={closeSetupDrawer}
width={492}
>
<Flex
sx={{
display: "flex",
flexDirection: "column",
height: "100%",
}}
>
<Flex
sx={{
p: "20px",
justifyContent: "space-between",
borderBottomStyle: "solid",
borderBottomWidth: "1px",
borderBottomColor: (t) => t.colors?.borders,
}}
>
<Text sx={{ fontSize: 3 }}>Setup Slice Simulator</Text>
<Close
data-testid="close-set-up-simulator"
color={"#4E4E55"}
onClick={closeSetupDrawer}
/>
</Flex>
<Flex
sx={{
flex: 1,
overflow: "auto",
flexDirection: "column",
pl: "24px",
pr: "24px",
}}
>
<Flex as={"section"} sx={{ flexDirection: "column" }}>
<Stepper
framework={framework}
isSimulatorAvailableForFramework={
isSimulatorAvailableForFramework
}
/>
</Flex>
</Flex>
<StorybookSection linkToStorybookDocs={linkToStorybookDocs} />
</Flex>
</Drawer>
);
}
Example #3
Source File: VideoItem.tsx From slice-machine with Apache License 2.0 | 4 votes |
VideoItem: React.FC<VideoItemProps> = ({
sliceMachineVersion,
framework,
hasSeenTutorialsTooTip,
onClose,
}) => {
const ref = React.createRef<HTMLParagraphElement>();
const id = "video-tool-tip";
const handleClose = () => {
void Tracker.get().trackClickOnVideoTutorials(
framework,
sliceMachineVersion
);
onClose();
};
React.useEffect(() => {
if (!hasSeenTutorialsTooTip && ref.current) {
const currentRef = ref.current;
setTimeout(() => ReactTooltip.show(currentRef), 5000);
}
}, []);
return (
<>
<Item
ref={ref}
data-for={id}
data-tip=""
data-testid="video-toolbar"
link={{
title: "Video tutorials",
Icon: MdPlayCircleFilled,
href: "https://youtube.com/playlist?list=PLUVZjQltoA3wnaQudcqQ3qdZNZ6hyfyhH",
target: "_blank",
match: () => false,
}}
theme={"emphasis"}
onClick={handleClose}
/>
{!hasSeenTutorialsTooTip && (
<ReactTooltip
id={id}
effect="solid"
backgroundColor="#5B3DF5"
clickable={true}
className={style.videoTutorialsContainer}
afterHide={handleClose}
offset={{
left: 80,
}}
getContent={() => (
<Flex
data-testid="video-tooltip"
sx={{
maxWidth: "268px",
flexDirection: "column",
}}
>
<Flex
sx={{
flexDirection: "row",
alignItems: "center",
justifyContent: "space-between",
mb: 1,
}}
>
<Paragraph sx={{ color: "#FFF", fontWeight: 700 }}>
Need Help?
</Paragraph>
<Close
data-testid="video-tooltip-close-button"
onClick={handleClose}
sx={{
width: "26px",
}}
/>
</Flex>
<Paragraph sx={{ color: "#FFF", fontWeight: 400 }}>
Follow our Quick Start guide to learn the basics of Slice
Machine
</Paragraph>
</Flex>
)}
/>
)}
</>
);
}
Example #4
Source File: index.tsx From slice-machine with Apache License 2.0 | 4 votes |
LoginModal: React.FunctionComponent = () => {
Modal.setAppElement("#__next");
const { env, isOpen, isLoginLoading } = useSelector(
(store: SliceMachineStoreType) => ({
isOpen: isModalOpen(store, ModalKeysEnum.LOGIN),
isLoginLoading: isLoading(store, LoadingKeysEnum.LOGIN),
env: getEnvironment(store),
})
);
const { closeLoginModal, startLoadingLogin, stopLoadingLogin, openToaster } =
useSliceMachineActions();
const prismicBase = preferWroomBase(env.manifest.apiEndpoint);
const loginRedirectUrl = `${
buildEndpoints(prismicBase).Dashboard.cliLogin
}&port=${new URL(env.sliceMachineAPIUrl).port}&path=/api/auth`;
const onClick = async () => {
if (!loginRedirectUrl) {
return;
}
try {
startLoadingLogin();
await startAuth();
window.open(loginRedirectUrl, "_blank");
const { shortId, intercomHash } = await startPolling<
CheckAuthStatusResponse,
ValidAuthStatus
>(
checkAuthStatus,
(status: CheckAuthStatusResponse): status is ValidAuthStatus =>
status.status === "ok" &&
Boolean(status.shortId) &&
Boolean(status.intercomHash),
3000,
60
);
void Tracker.get().identifyUser(shortId, intercomHash);
openToaster("Logged in", ToasterType.SUCCESS);
stopLoadingLogin();
closeLoginModal();
} catch (e) {
stopLoadingLogin();
openToaster("Logging fail", ToasterType.ERROR);
}
};
return (
<SliceMachineModal
isOpen={isOpen}
shouldCloseOnOverlayClick
onRequestClose={closeLoginModal}
contentLabel={"login_modal"}
style={{
content: {
position: "static",
display: "flex",
margin: "auto",
minHeight: "initial",
},
overlay: {
display: "flex",
},
}}
>
<Card>
<Flex
sx={{
p: "16px",
bg: "headSection",
alignItems: "center",
justifyContent: "space-between",
borderRadius: "8px 8px 0px 0px",
borderBottom: (t) => `1px solid ${String(t.colors?.borders)}`,
}}
>
<Heading sx={{ fontSize: "16px" }}>You're not connected</Heading>
<Close sx={{ p: 0 }} type="button" onClick={closeLoginModal} />
</Flex>
<Flex
sx={{
flexDirection: "column",
p: 3,
justifyContent: "center",
alignItems: "stretch",
}}
>
<Text
variant={"xs"}
sx={{
mb: 3,
maxWidth: 280,
textAlign: "center",
}}
>
{isLoginLoading ? (
<>
Not seeing the browser tab? <br />
<Link target={"_blank"} href={loginRedirectUrl}>
Click here
</Link>
</>
) : (
<>
Your session has expired.
<br />
Please log in again.
</>
)}
</Text>
<Button
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
width: 240,
mb: 3,
}}
onClick={() => void onClick()}
>
{isLoginLoading ? (
<Spinner color="#FFF" size={16} />
) : (
<>Signin to Prismic</>
)}
</Button>
</Flex>
</Card>
</SliceMachineModal>
);
}
Example #5
Source File: index.tsx From slice-machine with Apache License 2.0 | 4 votes |
function ModalCard<Values>({
children,
close,
isOpen,
formId,
validate,
onSubmit,
widthInPx,
initialValues,
content: { title },
cardProps,
omitFooter = false,
isLoading = false,
buttonLabel = "Save",
dataCy,
}: ModalCardProps<Values>): JSX.Element {
Modal.setAppElement("#__next");
return (
<SliceMachineModal
isOpen={isOpen}
shouldCloseOnOverlayClick
onRequestClose={close}
contentLabel={title}
style={{
content: {
width: widthInPx || "900px",
},
}}
>
<Formik
validateOnChange
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
initialValues={initialValues}
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
validate={(values) => (validate ? validate(values) : undefined)}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onSubmit={(values) => {
onSubmit(values);
close();
}}
>
{({
isValid,
isSubmitting,
values,
errors,
touched,
setFieldValue,
}) => (
<Form id={formId} {...(dataCy ? { "data-cy": dataCy } : null)}>
<Card
borderFooter
footerSx={{ p: 3 }}
bodySx={{ px: 4, py: 4 }}
sx={{ border: "none" }}
{...cardProps}
Header={({ radius }: { radius: string | number }) => (
<Flex
sx={{
p: "16px",
pl: 4,
bg: "headSection",
alignItems: "center",
justifyContent: "space-between",
borderTopLeftRadius: radius,
borderTopRightRadius: radius,
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
borderBottom: (t) => `1px solid ${t.colors?.borders}`,
}}
>
<Heading sx={{ fontSize: "20px" }}>{title}</Heading>
<Close type="button" onClick={close} />
</Flex>
)}
Footer={
!omitFooter ? (
<Flex sx={{ alignItems: "space-between" }}>
<Box sx={{ ml: "auto" }} />
<ThemeButton
mr={2}
type="button"
onClick={close}
variant="secondary"
>
Cancel
</ThemeButton>
<Button
form={formId}
type="submit"
disabled={!isValid || isSubmitting || isLoading}
isLoading={isLoading}
>
{buttonLabel}
</Button>
</Flex>
) : null
}
>
{children({
isValid,
isSubmitting,
values,
errors,
touched,
setFieldValue,
})}
</Card>
</Form>
)}
</Formik>
</SliceMachineModal>
);
}
Example #6
Source File: index.tsx From slice-machine with Apache License 2.0 | 4 votes |
ReviewModal: React.FunctionComponent = () => {
const libraries = useContext(LibrariesContext);
const {
env,
isReviewLoading,
isLoginModalOpen,
hasSendAReview,
hasDoneTheOnboarding,
customTypeCount,
} = useSelector((store: SliceMachineStoreType) => ({
env: getEnvironment(store),
isReviewLoading: isLoading(store, LoadingKeysEnum.REVIEW),
isLoginModalOpen: isModalOpen(store, ModalKeysEnum.LOGIN),
hasSendAReview: userHasSendAReview(store),
hasDoneTheOnboarding: userHasDoneTheOnboarding(store),
customTypeCount: selectCustomTypeCount(store),
}));
const { skipReview, sendAReview, startLoadingReview, stopLoadingReview } =
useSliceMachineActions();
const sliceCount =
libraries && libraries.length
? libraries.reduce((count, lib) => {
if (!lib) {
return count;
}
return count + lib.components.length;
}, 0)
: 0;
const userHasCreateEnoughContent = sliceCount >= 1 && customTypeCount >= 1;
const onSendAReview = (rating: number, comment: string): void => {
startLoadingReview();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
Tracker.get().trackReview(env.framework, rating, comment);
sendAReview();
stopLoadingReview();
};
const validateReview = ({ rating }: { rating: number; comment: string }) => {
if (!rating) {
return { id: "Please Choose a rating" };
}
};
return (
<SliceMachineModal
isOpen={
userHasCreateEnoughContent && !hasSendAReview && hasDoneTheOnboarding
}
shouldCloseOnOverlayClick={false}
onRequestClose={() => skipReview()}
closeTimeoutMS={500}
contentLabel={"Review Modal"}
portalClassName={"ReviewModal"}
style={{
content: {
display: "flex",
position: "initial",
padding: "none",
top: "initial",
left: "initial",
minHeight: "initial",
},
overlay: {
top: "initial",
left: "initial",
right: 32,
bottom: 32,
position: "absolute",
height: "fit-content",
width: "fit-content",
backgroundColor: "unset",
},
}}
>
<Formik
validateOnMount
validateOnChange
initialValues={{
rating: 0,
comment: "",
}}
validate={validateReview}
onSubmit={(values) => {
onSendAReview(values.rating, values.comment);
}}
>
{({ isValid, values }) => (
<Form id="review-form">
<Card>
<Flex
sx={{
p: "16px",
pl: 4,
bg: "headSection",
alignItems: "center",
justifyContent: "space-between",
borderRadius: "8px 8px 0px 0px",
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
borderBottom: (t) => `1px solid ${t.colors?.borders}`,
}}
>
<Heading sx={{ fontSize: "20px", mr: 4 }}>
Give us your opinion
</Heading>
<Close
type="button"
onClick={() => skipReview()}
data-cy="close-review"
/>
</Flex>
<Flex
sx={{
flexDirection: "column",
padding: "16px 24px 32px",
bg: "headSection",
}}
>
<Text variant={"xs"} as={"p"} sx={{ maxWidth: 302, mb: 3 }}>
Overall, how difficult was your first experience using
Slicemachine?
</Text>
<Box
mb={2}
sx={{
display: "flex",
flex: 1,
justifyContent: "space-between",
}}
>
<Text variant={"xs"} as={"p"}>
Very difficult
</Text>
<Text variant={"xs"} as={"p"}>
Very easy
</Text>
</Box>
<Field name={"rating"} component={SelectReviewComponent} />
<Field
name={"comment"}
type="text"
placeholder={
"Sorry about that! What did you find the most difficult?"
}
as={Textarea}
autoComplete="off"
className={
values.rating >= 5 || values.rating === 0 ? "hidden" : ""
}
sx={{
height: 80,
opacity: 1,
mb: 3,
transition: "all 300ms",
"&.hidden": {
height: 0,
opacity: 0,
mb: 0,
p: 0,
border: "none",
},
}}
/>
<Button
form={"review-form"}
type="submit"
disabled={!isValid || isReviewLoading || isLoginModalOpen}
>
Submit
</Button>
</Flex>
</Card>
</Form>
)}
</Formik>
</SliceMachineModal>
);
}