Compare commits

..

2 Commits

Author SHA1 Message Date
Philipinho c36833ad5b 30 seconds 2026-03-12 02:27:09 +00:00
Philipinho 131511a94e feat(editor): add auto-save and unsaved changes protection for diagrams 2026-03-12 02:25:20 +00:00
8 changed files with 98 additions and 67 deletions
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
actorName: string; actorName: string;
@@ -23,7 +23,19 @@ export const CommentCreateEmail = ({
<strong>{pageTitle}</strong>. <strong>{pageTitle}</strong>.
</Text> </Text>
</Section> </Section>
<EmailButton href={pageUrl}>View</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={pageUrl} style={button}>
View
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
actorName: string; actorName: string;
@@ -23,7 +23,19 @@ export const CommentMentionEmail = ({
<strong>{pageTitle}</strong>. <strong>{pageTitle}</strong>.
</Text> </Text>
</Section> </Section>
<EmailButton href={pageUrl}>View</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={pageUrl} style={button}>
View
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
actorName: string; actorName: string;
@@ -23,7 +23,19 @@ export const CommentResolvedEmail = ({
<strong>{pageTitle}</strong>. <strong>{pageTitle}</strong>.
</Text> </Text>
</Section> </Section>
<EmailButton href={pageUrl}>View</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={pageUrl} style={button}>
View
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
inviteLink: string; inviteLink: string;
@@ -17,7 +17,19 @@ export const InvitationEmail = ({ inviteLink }: Props) => {
Please click the button below to accept this invitation. Please click the button below to accept this invitation.
</Text> </Text>
</Section> </Section>
<EmailButton href={inviteLink}>Accept Invite</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={inviteLink} style={button}>
Accept Invite
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
actorName: string; actorName: string;
@@ -19,7 +19,19 @@ export const PageMentionEmail = ({ actorName, pageTitle, pageUrl }: Props) => {
<strong>{pageTitle}</strong>. <strong>{pageTitle}</strong>.
</Text> </Text>
</Section> </Section>
<EmailButton href={pageUrl}>View</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={pageUrl} style={button}>
View
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,7 +1,7 @@
import { Section, Text } from '@react-email/components'; import { Section, Text, Button } from '@react-email/components';
import * as React from 'react'; import * as React from 'react';
import { content, paragraph } from '../css/styles'; import { button, content, paragraph } from '../css/styles';
import { EmailButton, MailBody } from '../partials/partials'; import { MailBody } from '../partials/partials';
interface Props { interface Props {
actorName: string; actorName: string;
@@ -25,7 +25,19 @@ export const PermissionGrantedEmail = ({
<strong>{pageTitle}</strong>. <strong>{pageTitle}</strong>.
</Text> </Text>
</Section> </Section>
<EmailButton href={pageUrl}>View</EmailButton> <Section
style={{
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
paddingLeft: '15px',
paddingBottom: '15px',
}}
>
<Button href={pageUrl} style={button}>
View
</Button>
</Section>
</MailBody> </MailBody>
); );
}; };
@@ -1,4 +1,4 @@
import { button as buttonStyle, container, footer, h1, logo, main } from '../css/styles'; import { container, footer, h1, logo, main } from '../css/styles';
import { import {
Body, Body,
Container, Container,
@@ -35,47 +35,6 @@ export function MailHeader() {
); );
} }
interface EmailButtonProps {
href: string;
children: React.ReactNode;
}
export function EmailButton({ href, children }: EmailButtonProps) {
return (
<table
role="presentation"
cellPadding="0"
cellSpacing="0"
style={{ margin: '0 0 15px 15px' }}
>
<tr>
<td
style={{
backgroundColor: buttonStyle.backgroundColor,
borderRadius: buttonStyle.borderRadius,
textAlign: 'center' as const,
}}
>
<a
href={href}
target="_blank"
style={{
color: buttonStyle.color,
fontFamily: buttonStyle.fontFamily,
fontSize: buttonStyle.fontSize,
textDecoration: 'none',
display: 'inline-block',
padding: '8px 16px',
}}
>
{children}
</a>
</td>
</tr>
</table>
);
}
export function MailFooter() { export function MailFooter() {
return ( return (
<Section style={footer}> <Section style={footer}>