@vrplatform/email 1.0.2-stage.39899710779 → 1.0.2-stage.39975977004

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/main/components/ActionEmailTemplate.d.ts +3 -1
  2. package/build/main/components/ActionEmailTemplate.js +9 -11
  3. package/build/main/components/ActionEmailTemplate.js.map +1 -1
  4. package/build/main/components/EmailHeading.d.ts +8 -0
  5. package/build/main/components/EmailHeading.js +21 -0
  6. package/build/main/components/EmailHeading.js.map +1 -0
  7. package/build/main/components/index.d.ts +1 -0
  8. package/build/main/components/index.js +1 -0
  9. package/build/main/components/index.js.map +1 -1
  10. package/build/main/templates/InviteOwnerEmailTemplate.js +1 -1
  11. package/build/main/templates/InviteOwnerEmailTemplate.js.map +1 -1
  12. package/build/main/templates/InvitePmEmailTemplate.js +1 -1
  13. package/build/main/templates/InvitePmEmailTemplate.js.map +1 -1
  14. package/build/main/templates/OwnerStatementEmailTemplate.js +2 -14
  15. package/build/main/templates/OwnerStatementEmailTemplate.js.map +1 -1
  16. package/build/main/templates/TenantDeletionEmailTemplate.js +2 -6
  17. package/build/main/templates/TenantDeletionEmailTemplate.js.map +1 -1
  18. package/build/main/templates/TenantSuspensionEmailTemplate.js +2 -6
  19. package/build/main/templates/TenantSuspensionEmailTemplate.js.map +1 -1
  20. package/build/module/components/ActionEmailTemplate.d.ts +3 -1
  21. package/build/module/components/ActionEmailTemplate.js +9 -11
  22. package/build/module/components/ActionEmailTemplate.js.map +1 -1
  23. package/build/module/components/EmailHeading.d.ts +8 -0
  24. package/build/module/components/EmailHeading.js +17 -0
  25. package/build/module/components/EmailHeading.js.map +1 -0
  26. package/build/module/components/index.d.ts +1 -0
  27. package/build/module/components/index.js +1 -0
  28. package/build/module/components/index.js.map +1 -1
  29. package/build/module/templates/InviteOwnerEmailTemplate.js +1 -1
  30. package/build/module/templates/InviteOwnerEmailTemplate.js.map +1 -1
  31. package/build/module/templates/InvitePmEmailTemplate.js +1 -1
  32. package/build/module/templates/InvitePmEmailTemplate.js.map +1 -1
  33. package/build/module/templates/OwnerStatementEmailTemplate.js +2 -14
  34. package/build/module/templates/OwnerStatementEmailTemplate.js.map +1 -1
  35. package/build/module/templates/TenantDeletionEmailTemplate.js +3 -7
  36. package/build/module/templates/TenantDeletionEmailTemplate.js.map +1 -1
  37. package/build/module/templates/TenantSuspensionEmailTemplate.js +3 -7
  38. package/build/module/templates/TenantSuspensionEmailTemplate.js.map +1 -1
  39. package/package.json +1 -1
  40. package/src/components/ActionEmailTemplate.tsx +11 -13
  41. package/src/components/EmailHeading.tsx +36 -0
  42. package/src/components/index.ts +1 -0
  43. package/src/templates/InviteOwnerEmailTemplate.tsx +1 -0
  44. package/src/templates/InvitePmEmailTemplate.tsx +1 -0
  45. package/src/templates/OwnerStatementEmailTemplate.tsx +3 -22
  46. package/src/templates/TenantDeletionEmailTemplate.tsx +9 -10
  47. package/src/templates/TenantSuspensionEmailTemplate.tsx +9 -10
@@ -12,4 +12,6 @@ export type ActionEmailData = {
12
12
  export interface ActionEmailTemplateProps extends EmailBaseProps {
13
13
  data: ActionEmailData;
14
14
  }
15
- export declare const ActionEmailTemplate: ({ data, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }: ActionEmailTemplateProps) => import("react").JSX.Element;
15
+ export declare const ActionEmailTemplate: ({ data, eyebrow, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }: ActionEmailTemplateProps & {
16
+ eyebrow: string;
17
+ }) => import("react").JSX.Element;
@@ -2,21 +2,19 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ActionEmailTemplate = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const heading_1 = require("@react-email/heading");
6
5
  const text_1 = require("@react-email/text");
7
6
  const EmailContainer_1 = require("./EmailContainer");
7
+ const EmailHeading_1 = require("./EmailHeading");
8
8
  const utils_1 = require("./utils");
9
9
  const Button_1 = require("./Button");
10
- const ActionEmailTemplate = ({ data, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }) => {
11
- return ((0, jsx_runtime_1.jsxs)(EmailContainer_1.EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [(0, jsx_runtime_1.jsx)(heading_1.Heading, { style: {
12
- fontSize: 28,
13
- fontWeight: 600,
14
- marginBottom: '50px',
15
- }, children: data.header?.trim() || `Welcome to ${tenant.name}!` }), data.banner?.trim() && ((0, jsx_runtime_1.jsx)(text_1.Text, { style: {
16
- padding: '24px',
17
- backgroundColor: '#f2f3f3',
10
+ const ActionEmailTemplate = ({ data, eyebrow, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }) => {
11
+ return ((0, jsx_runtime_1.jsxs)(EmailContainer_1.EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [(0, jsx_runtime_1.jsx)(EmailHeading_1.EmailHeading, { eyebrow: eyebrow, themeColors: themeColors, children: data.header?.trim() || `Welcome to ${tenant.name}!` }), data.banner?.trim() && ((0, jsx_runtime_1.jsx)(text_1.Text, { style: {
12
+ padding: '16px 20px',
13
+ backgroundColor: '#f8f9fa',
14
+ borderLeft: `3px solid ${themeColors[8]}`,
18
15
  borderRadius: '4px',
19
- marginBottom: '40px',
16
+ margin: '0 0 32px',
17
+ whiteSpace: 'pre-line',
20
18
  }, children: data.banner.trim() })), (0, jsx_runtime_1.jsx)("div", {
21
19
  // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>
22
20
  dangerouslySetInnerHTML: {
@@ -26,7 +24,7 @@ const ActionEmailTemplate = ({ data, tenant, themeColors, mode, user, listing, m
26
24
  date: month || '',
27
25
  listingName: listing || '',
28
26
  }),
29
- } }), (0, jsx_runtime_1.jsx)(Button_1.Button, { href: data.href, mode: mode, "data-testid": "accept-invite-button", label: data.buttonText?.trim() || 'Accept Invitation', themeColors: themeColors }), (0, jsx_runtime_1.jsx)("div", {
27
+ } }), (0, jsx_runtime_1.jsx)(Button_1.Button, { href: data.href, mode: mode, "data-testid": "accept-invite-button", label: data.buttonText?.trim() || 'Accept Invitation', themeColors: themeColors, style: { marginTop: '24px', marginBottom: '32px' } }), (0, jsx_runtime_1.jsx)("div", {
30
28
  // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>
31
29
  dangerouslySetInnerHTML: {
32
30
  __html: (0, utils_1.parseEmailHtml)(data.bodyTwo, {
@@ -1 +1 @@
1
- {"version":3,"file":"ActionEmailTemplate.js","sourceRoot":"src/","sources":["components/ActionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,kDAA+C;AAC/C,4CAAyC;AACzC,qDAAkD;AAElD,mCAAyC;AACzC,qCAAkC;AAiB3B,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,GACU,EAAE,EAAE;IAC7B,OAAO,CACL,wBAAC,+BAAc,IACb,KAAK,EAAE,IAAI,CAAC,OAAO,EACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,aAEhC,uBAAC,iBAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,cAAc,MAAM,CAAC,IAAI,GAAG,GAC5C,EAET,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CACtB,uBAAC,WAAI,IACH,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,eAAe,EAAE,SAAS;oBAC1B,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GACd,CACR,EAED;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,IAAA,sBAAc,EAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,EAEF,uBAAC,eAAM,IACL,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,iBACE,sBAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,mBAAmB,EACrD,WAAW,EAAE,WAAW,GACxB,EAEF;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,IAAA,sBAAc,EAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,IACa,CAClB,CAAC;AACJ,CAAC,CAAC;AA1EW,QAAA,mBAAmB,uBA0E9B","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from './EmailContainer';\nimport type { EmailBaseProps } from '../types';\nimport { parseEmailHtml } from './utils';\nimport { Button } from './Button';\n\nexport type ActionEmailData = {\n subject: string;\n shortDescription: string;\n banner?: string;\n header: string;\n bodyOne: string;\n bodyTwo: string;\n href: string;\n buttonText: string;\n};\n\nexport interface ActionEmailTemplateProps extends EmailBaseProps {\n data: ActionEmailData;\n}\n\nexport const ActionEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n}: ActionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {data.header?.trim() || `Welcome to ${tenant.name}!`}\n </Heading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '24px',\n backgroundColor: '#f2f3f3',\n borderRadius: '4px',\n marginBottom: '40px',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyOne, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"accept-invite-button\"\n label={data.buttonText?.trim() || 'Accept Invitation'}\n themeColors={themeColors}\n />\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyTwo, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"ActionEmailTemplate.js","sourceRoot":"src/","sources":["components/ActionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,qDAAkD;AAClD,iDAA8C;AAE9C,mCAAyC;AACzC,qCAAkC;AAiB3B,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,GACgC,EAAE,EAAE;IACnD,OAAO,CACL,wBAAC,+BAAc,IACb,KAAK,EAAE,IAAI,CAAC,OAAO,EACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,aAEhC,uBAAC,2BAAY,IAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,YACrD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,cAAc,MAAM,CAAC,IAAI,GAAG,GACvC,EAEd,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CACtB,uBAAC,WAAI,IACH,KAAK,EAAE;oBACL,OAAO,EAAE,WAAW;oBACpB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE;oBACzC,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,UAAU;oBAClB,UAAU,EAAE,UAAU;iBACvB,YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GACd,CACR,EAED;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,IAAA,sBAAc,EAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,EAEF,uBAAC,eAAM,IACL,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,iBACE,sBAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,mBAAmB,EACrD,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAClD,EAEF;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,IAAA,sBAAc,EAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,IACa,CAClB,CAAC;AACJ,CAAC,CAAC;AAxEW,QAAA,mBAAmB,uBAwE9B","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer } from './EmailContainer';\nimport { EmailHeading } from './EmailHeading';\nimport type { EmailBaseProps } from '../types';\nimport { parseEmailHtml } from './utils';\nimport { Button } from './Button';\n\nexport type ActionEmailData = {\n subject: string;\n shortDescription: string;\n banner?: string;\n header: string;\n bodyOne: string;\n bodyTwo: string;\n href: string;\n buttonText: string;\n};\n\nexport interface ActionEmailTemplateProps extends EmailBaseProps {\n data: ActionEmailData;\n}\n\nexport const ActionEmailTemplate = ({\n data,\n eyebrow,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n}: ActionEmailTemplateProps & { eyebrow: string }) => {\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <EmailHeading eyebrow={eyebrow} themeColors={themeColors}>\n {data.header?.trim() || `Welcome to ${tenant.name}!`}\n </EmailHeading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyOne, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"accept-invite-button\"\n label={data.buttonText?.trim() || 'Accept Invitation'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyTwo, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n </EmailContainer>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { EmailBaseProps } from '../types';
2
+ type Props = {
3
+ eyebrow: string;
4
+ children: React.ReactNode;
5
+ themeColors: EmailBaseProps['themeColors'];
6
+ };
7
+ export declare const EmailHeading: ({ eyebrow, children, themeColors }: Props) => import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EmailHeading = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const heading_1 = require("@react-email/heading");
6
+ const text_1 = require("@react-email/text");
7
+ const EmailHeading = ({ eyebrow, children, themeColors }) => ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(text_1.Text, { style: {
8
+ color: themeColors[8],
9
+ fontSize: 12,
10
+ fontWeight: 600,
11
+ letterSpacing: '0.08em',
12
+ textTransform: 'uppercase',
13
+ margin: '0 0 8px',
14
+ }, children: eyebrow }), (0, jsx_runtime_1.jsx)(heading_1.Heading, { style: {
15
+ fontSize: 26,
16
+ fontWeight: 600,
17
+ lineHeight: '34px',
18
+ margin: '0 0 32px',
19
+ }, children: children })] }));
20
+ exports.EmailHeading = EmailHeading;
21
+ //# sourceMappingURL=EmailHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailHeading.js","sourceRoot":"src/","sources":["components/EmailHeading.tsx"],"names":[],"mappings":";;;;AAAA,kDAA+C;AAC/C,4CAAyC;AASlC,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAS,EAAE,EAAE,CAAC,CACzE,6DACE,uBAAC,WAAI,IACH,KAAK,EAAE;gBACL,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrB,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,QAAQ;gBACvB,aAAa,EAAE,WAAW;gBAC1B,MAAM,EAAE,SAAS;aAClB,YAEA,OAAO,GACH,EACP,uBAAC,iBAAO,IACN,KAAK,EAAE;gBACL,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,MAAM;gBAClB,MAAM,EAAE,UAAU;aACnB,YAEA,QAAQ,GACD,IACT,CACJ,CAAC;AAzBW,QAAA,YAAY,gBAyBvB","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport type { EmailBaseProps } from '../types';\n\ntype Props = {\n eyebrow: string;\n children: React.ReactNode;\n themeColors: EmailBaseProps['themeColors'];\n};\n\nexport const EmailHeading = ({ eyebrow, children, themeColors }: Props) => (\n <>\n <Text\n style={{\n color: themeColors[8],\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n margin: '0 0 8px',\n }}\n >\n {eyebrow}\n </Text>\n <Heading\n style={{\n fontSize: 26,\n fontWeight: 600,\n lineHeight: '34px',\n margin: '0 0 32px',\n }}\n >\n {children}\n </Heading>\n </>\n);\n"]}
@@ -1,2 +1,3 @@
1
1
  export * from './EmailContainer';
2
2
  export * from './ActionEmailTemplate';
3
+ export * from './EmailHeading';
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./EmailContainer"), exports);
18
18
  __exportStar(require("./ActionEmailTemplate"), exports);
19
+ __exportStar(require("./EmailHeading"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["components/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,wDAAsC","sourcesContent":["export * from './EmailContainer';\nexport * from './ActionEmailTemplate';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["components/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,wDAAsC;AACtC,iDAA+B","sourcesContent":["export * from './EmailContainer';\nexport * from './ActionEmailTemplate';\nexport * from './EmailHeading';\n"]}
@@ -18,7 +18,7 @@ const getDefaultInviteOwnerEmailData = (mode, args) => {
18
18
  };
19
19
  exports.getDefaultInviteOwnerEmailData = getDefaultInviteOwnerEmailData;
20
20
  const InviteOwnerEmailTemplate = ({ ownerAccessRole = 'admin', ...props }) => {
21
- return ((0, jsx_runtime_1.jsx)(components_1.ActionEmailTemplate, { ...props, data: {
21
+ return ((0, jsx_runtime_1.jsx)(components_1.ActionEmailTemplate, { ...props, eyebrow: "Owner Portal invitation", data: {
22
22
  ...props.data,
23
23
  // Add guidance at render time so saved custom templates receive it too.
24
24
  bodyTwo: `${props.data.bodyTwo}<hr style="width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,
@@ -1 +1 @@
1
- {"version":3,"file":"InviteOwnerEmailTemplate.js","sourceRoot":"src/","sources":["templates/InviteOwnerEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,8CAA4D;AAC5D,8CAIuB;AAEhB,MAAM,8BAA8B,GAAG,CAC5C,IAAoB,EACpB,IAGC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,wCAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,qDAAqD,IAAI,CAAC,OAAO,gEAAgE;QAC1I,OAAO,EAAE,wGAAwG,UAAU,MAAM;QACjI,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,+BAA+B;QACvC,gBAAgB,EAAE,wDAAwD;QAC1E,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,0BAA0B,IAAI,CAAC,OAAO,eAAe;KAC/D,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,8BAA8B,kCAmBzC;AAEK,MAAM,wBAAwB,GAAG,CAAC,EACvC,eAAe,GAAG,OAAO,EACzB,GAAG,KAAK,EAGT,EAAE,EAAE;IACH,OAAO,CACL,uBAAC,gCAAmB,OACd,KAAK,EACT,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,mYAAmY,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC,sCAAsC;SAC3hB,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,wBAAwB,4BAgBnC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInviteOwnerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.signInLink;\n\n return {\n bodyOne: `<p>You are invited to access your Owner Portal on ${args.appName}.</p><p>Accept the invitation below to set up your access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can copy and paste the link below into your browser: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to your Owner Portal!',\n shortDescription: 'Set up your Owner Portal access using your invitation.',\n href: args.signInLink,\n subject: `Your invitation to the ${args.appName} Owner Portal`,\n };\n};\n\nexport const InviteOwnerEmailTemplate = ({\n ownerAccessRole = 'admin',\n ...props\n}: ActionEmailTemplateProps & {\n ownerAccessRole?: 'admin' | 'viewer';\n}) => {\n return (\n <ActionEmailTemplate\n {...props}\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,\n }}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"InviteOwnerEmailTemplate.js","sourceRoot":"src/","sources":["templates/InviteOwnerEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,8CAA4D;AAC5D,8CAIuB;AAEhB,MAAM,8BAA8B,GAAG,CAC5C,IAAoB,EACpB,IAGC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,wCAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,qDAAqD,IAAI,CAAC,OAAO,gEAAgE;QAC1I,OAAO,EAAE,wGAAwG,UAAU,MAAM;QACjI,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,+BAA+B;QACvC,gBAAgB,EAAE,wDAAwD;QAC1E,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,0BAA0B,IAAI,CAAC,OAAO,eAAe;KAC/D,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,8BAA8B,kCAmBzC;AAEK,MAAM,wBAAwB,GAAG,CAAC,EACvC,eAAe,GAAG,OAAO,EACzB,GAAG,KAAK,EAGT,EAAE,EAAE;IACH,OAAO,CACL,uBAAC,gCAAmB,OACd,KAAK,EACT,OAAO,EAAC,yBAAyB,EACjC,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,mYAAmY,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC,sCAAsC;SAC3hB,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AAjBW,QAAA,wBAAwB,4BAiBnC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInviteOwnerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.signInLink;\n\n return {\n bodyOne: `<p>You are invited to access your Owner Portal on ${args.appName}.</p><p>Accept the invitation below to set up your access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can copy and paste the link below into your browser: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to your Owner Portal!',\n shortDescription: 'Set up your Owner Portal access using your invitation.',\n href: args.signInLink,\n subject: `Your invitation to the ${args.appName} Owner Portal`,\n };\n};\n\nexport const InviteOwnerEmailTemplate = ({\n ownerAccessRole = 'admin',\n ...props\n}: ActionEmailTemplateProps & {\n ownerAccessRole?: 'admin' | 'viewer';\n}) => {\n return (\n <ActionEmailTemplate\n {...props}\n eyebrow=\"Owner Portal invitation\"\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,\n }}\n />\n );\n};\n"]}
@@ -20,7 +20,7 @@ const getDefaultInvitePropertyManagerEmailData = (mode, args) => {
20
20
  };
21
21
  exports.getDefaultInvitePropertyManagerEmailData = getDefaultInvitePropertyManagerEmailData;
22
22
  const InvitePmEmailTemplate = (props) => {
23
- return ((0, jsx_runtime_1.jsx)(components_1.ActionEmailTemplate, { ...props, data: {
23
+ return ((0, jsx_runtime_1.jsx)(components_1.ActionEmailTemplate, { ...props, eyebrow: "Team invitation", data: {
24
24
  ...props.data,
25
25
  // Add guidance at render time so saved custom templates receive it too.
26
26
  bodyTwo: `${props.data.bodyTwo}<hr style="width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,
@@ -1 +1 @@
1
- {"version":3,"file":"InvitePmEmailTemplate.js","sourceRoot":"src/","sources":["templates/InvitePmEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,8CAA4D;AAC5D,8CAIuB;AAEhB,MAAM,wCAAwC,GAAG,CACtD,IAAoB,EACpB,IAIC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK;QACZ,CAAC,CAAC,wCAA2B;QAC7B,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,qBAAqB,IAAI,CAAC,UAAU,MAAM,CAAC;IAE5E,OAAO;QACL,OAAO,EAAE,8BAA8B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,qEAAqE;QAC5I,OAAO,EAAE,qFAAqF,UAAU,MAAM;QAC9G,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,sBAAsB;QAC9B,gBAAgB,EAAE,kCAAkC,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,GAAG;QACvF,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,2BAA2B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE;KACvE,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,wCAAwC,4CAsBnD;AAEK,MAAM,qBAAqB,GAAG,CAAC,KAA+B,EAAE,EAAE;IACvE,OAAO,CACL,uBAAC,gCAAmB,OACd,KAAK,EACT,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,6aAA6a;SAC5c,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,qBAAqB,yBAWhC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInvitePropertyManagerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n teamName: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag'\n ? EMAIL_ACTION_LINK_COMPONENT\n : `<a href='${args.signInLink}' target='_blank'>${args.signInLink}</a>`;\n\n return {\n bodyOne: `<p>You are invited to join ${args.teamName} on ${args.appName}.</p><p>Accept the invitation below to set up your team access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can use the following link below: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to the team!',\n shortDescription: `Accept your invitation to join ${args.teamName} on ${args.appName}.`,\n href: args.signInLink,\n subject: `You are invited to join ${args.teamName} on ${args.appName}`,\n };\n};\n\nexport const InvitePmEmailTemplate = (props: ActionEmailTemplateProps) => {\n return (\n <ActionEmailTemplate\n {...props}\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,\n }}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"InvitePmEmailTemplate.js","sourceRoot":"src/","sources":["templates/InvitePmEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,8CAA4D;AAC5D,8CAIuB;AAEhB,MAAM,wCAAwC,GAAG,CACtD,IAAoB,EACpB,IAIC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK;QACZ,CAAC,CAAC,wCAA2B;QAC7B,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,qBAAqB,IAAI,CAAC,UAAU,MAAM,CAAC;IAE5E,OAAO;QACL,OAAO,EAAE,8BAA8B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,qEAAqE;QAC5I,OAAO,EAAE,qFAAqF,UAAU,MAAM;QAC9G,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,sBAAsB;QAC9B,gBAAgB,EAAE,kCAAkC,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,GAAG;QACvF,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,2BAA2B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE;KACvE,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,wCAAwC,4CAsBnD;AAEK,MAAM,qBAAqB,GAAG,CAAC,KAA+B,EAAE,EAAE;IACvE,OAAO,CACL,uBAAC,gCAAmB,OACd,KAAK,EACT,OAAO,EAAC,iBAAiB,EACzB,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,6aAA6a;SAC5c,GACD,CACH,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,qBAAqB,yBAYhC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInvitePropertyManagerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n teamName: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag'\n ? EMAIL_ACTION_LINK_COMPONENT\n : `<a href='${args.signInLink}' target='_blank'>${args.signInLink}</a>`;\n\n return {\n bodyOne: `<p>You are invited to join ${args.teamName} on ${args.appName}.</p><p>Accept the invitation below to set up your team access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can use the following link below: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to the team!',\n shortDescription: `Accept your invitation to join ${args.teamName} on ${args.appName}.`,\n href: args.signInLink,\n subject: `You are invited to join ${args.teamName} on ${args.appName}`,\n };\n};\n\nexport const InvitePmEmailTemplate = (props: ActionEmailTemplateProps) => {\n return (\n <ActionEmailTemplate\n {...props}\n eyebrow=\"Team invitation\"\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,\n }}\n />\n );\n};\n"]}
@@ -2,11 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OwnerStatementEmailTemplate = exports.getDefaultOwnerStatementEmailData = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const heading_1 = require("@react-email/heading");
6
5
  const text_1 = require("@react-email/text");
7
6
  const extensions_1 = require("../extensions");
8
7
  const Button_1 = require("../components/Button");
9
8
  const EmailContainer_1 = require("../components/EmailContainer");
9
+ const EmailHeading_1 = require("../components/EmailHeading");
10
10
  const utils_1 = require("../components/utils");
11
11
  const getDefaultOwnerStatementEmailData = (mode, args) => {
12
12
  const ownerStatementHref = mode === 'tag' ? extensions_1.EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;
@@ -41,19 +41,7 @@ const OwnerStatementEmailTemplate = ({ data, tenant, themeColors, mode, user, li
41
41
  date: month || '',
42
42
  listingName: listing || '',
43
43
  });
44
- return ((0, jsx_runtime_1.jsxs)(EmailContainer_1.EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [(0, jsx_runtime_1.jsx)(text_1.Text, { style: {
45
- color: themeColors[8],
46
- fontSize: 12,
47
- fontWeight: 600,
48
- letterSpacing: '0.08em',
49
- textTransform: 'uppercase',
50
- margin: '0 0 8px',
51
- }, children: "Owner statement" }), (0, jsx_runtime_1.jsx)(heading_1.Heading, { style: {
52
- fontSize: 26,
53
- fontWeight: 600,
54
- lineHeight: '34px',
55
- margin: '0 0 32px',
56
- }, children: data.header?.trim() || 'Your owner statement is ready' }), data.banner?.trim() && ((0, jsx_runtime_1.jsx)(text_1.Text, { style: {
44
+ return ((0, jsx_runtime_1.jsxs)(EmailContainer_1.EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [(0, jsx_runtime_1.jsx)(EmailHeading_1.EmailHeading, { eyebrow: "Owner statement", themeColors: themeColors, children: data.header?.trim() || 'Your owner statement is ready' }), data.banner?.trim() && ((0, jsx_runtime_1.jsx)(text_1.Text, { style: {
57
45
  padding: '16px 20px',
58
46
  backgroundColor: '#f8f9fa',
59
47
  borderLeft: `3px solid ${themeColors[8]}`,
@@ -1 +1 @@
1
- {"version":3,"file":"OwnerStatementEmailTemplate.js","sourceRoot":"src/","sources":["templates/OwnerStatementEmailTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport {\n EMAIL_ACTION_LINK_COMPONENT,\n EMAIL_DATE_COMPONENT,\n EMAIL_LISTING_COMPONENT,\n EMAIL_USER_NAME_COMPONENT,\n} from '../extensions';\nimport type {\n ActionEmailData,\n ActionEmailTemplateProps,\n} from '../components/ActionEmailTemplate';\nimport { Button } from '../components/Button';\nimport { EmailContainer } from '../components/EmailContainer';\nimport { parseEmailHtml } from '../components/utils';\n\nexport const getDefaultOwnerStatementEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n ownerStatementHref: string;\n listingName: string;\n userName: string;\n month: string;\n }\n): ActionEmailData => {\n const ownerStatementHref =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;\n\n const listingName =\n mode === 'tag' ? EMAIL_LISTING_COMPONENT : args.listingName;\n const month = mode === 'tag' ? EMAIL_DATE_COMPONENT : args.month;\n const userName = mode === 'tag' ? EMAIL_USER_NAME_COMPONENT : args.userName;\n\n // Owners open the statement by link without a login and viewers log in to\n // the owner portal, so the text names neither. Subject and preview text are\n // plain text without tokens, so a saved template must not keep the editor's\n // sample month and listing.\n return {\n subject:\n mode === 'tag'\n ? 'Your owner statement is ready'\n : `Your ${args.month} owner statement for ${args.listingName}`,\n shortDescription:\n mode === 'tag'\n ? 'Your owner statement is ready to view.'\n : `Your ${args.month} statement for ${args.listingName} is ready to view.`,\n header: 'Your owner statement is ready',\n bodyOne: `<p>Hi ${userName},</p><p>${args.appName} published your ${month} owner statement for ${listingName}. Open it with the button below.</p>`,\n buttonText: 'View statement',\n bodyTwo: `<p style=\"color:#737373;font-size:13px\">If the button doesn't work, copy this link into your browser: ${ownerStatementHref}</p>`,\n href: args.ownerStatementHref,\n };\n};\n\nconst mutedColor = '#737373';\nconst borderColor = '#e5e7eb';\n\nexport const OwnerStatementEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n renewHref,\n}: ActionEmailTemplateProps & {\n /** Requests a new no-login link once the emailed one has expired. */\n renewHref?: string;\n}) => {\n const parse = (html: string) =>\n parseEmailHtml(html, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n });\n\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <Text\n style={{\n color: themeColors[8],\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n margin: '0 0 8px',\n }}\n >\n Owner statement\n </Text>\n <Heading\n style={{\n fontSize: 26,\n fontWeight: 600,\n lineHeight: '34px',\n margin: '0 0 32px',\n }}\n >\n {data.header?.trim() || 'Your owner statement is ready'}\n </Heading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyOne) }}\n />\n\n {(listing || month) && (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n width=\"100%\"\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: '8px',\n borderCollapse: 'separate',\n margin: '24px 0 0',\n }}\n >\n <tbody>\n {[\n ['Property', listing],\n ['Statement', month],\n ].map(([label, value], index) =>\n value ? (\n <tr key={label}>\n <td\n style={{\n padding: '14px 20px',\n color: mutedColor,\n fontSize: 14,\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {label}\n </td>\n <td\n style={{\n padding: '14px 20px',\n fontSize: 14,\n fontWeight: 600,\n textAlign: 'right',\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {value}\n </td>\n </tr>\n ) : null\n )}\n </tbody>\n </table>\n )}\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"view-owner-statement-button\"\n label={data.buttonText?.trim() || 'View statement'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n {renewHref && (\n <div\n style={{\n padding: '20px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '32px',\n }}\n >\n <Text style={{ fontWeight: 600, margin: '0 0 4px' }}>\n Link expired?\n </Text>\n <Text style={{ color: mutedColor, fontSize: 14, margin: 0 }}>\n For your security, this link opens only this statement and works for\n 7 days. After that, request a new one and we'll email it to this\n address.\n </Text>\n <Button\n href={renewHref}\n mode={mode}\n data-testid=\"renew-owner-statement-link-button\"\n label=\"Send me a new link\"\n themeColors={themeColors}\n style={{\n background: '#ffffff',\n border: `1px solid ${themeColors[8]}`,\n color: themeColors[8],\n marginTop: '16px',\n marginBottom: 0,\n }}\n />\n </div>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyTwo) }}\n />\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"OwnerStatementEmailTemplate.js","sourceRoot":"src/","sources":["templates/OwnerStatementEmailTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Text } from '@react-email/text';\nimport {\n EMAIL_ACTION_LINK_COMPONENT,\n EMAIL_DATE_COMPONENT,\n EMAIL_LISTING_COMPONENT,\n EMAIL_USER_NAME_COMPONENT,\n} from '../extensions';\nimport type {\n ActionEmailData,\n ActionEmailTemplateProps,\n} from '../components/ActionEmailTemplate';\nimport { Button } from '../components/Button';\nimport { EmailContainer } from '../components/EmailContainer';\nimport { EmailHeading } from '../components/EmailHeading';\nimport { parseEmailHtml } from '../components/utils';\n\nexport const getDefaultOwnerStatementEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n ownerStatementHref: string;\n listingName: string;\n userName: string;\n month: string;\n }\n): ActionEmailData => {\n const ownerStatementHref =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;\n\n const listingName =\n mode === 'tag' ? EMAIL_LISTING_COMPONENT : args.listingName;\n const month = mode === 'tag' ? EMAIL_DATE_COMPONENT : args.month;\n const userName = mode === 'tag' ? EMAIL_USER_NAME_COMPONENT : args.userName;\n\n // Owners open the statement by link without a login and viewers log in to\n // the owner portal, so the text names neither. Subject and preview text are\n // plain text without tokens, so a saved template must not keep the editor's\n // sample month and listing.\n return {\n subject:\n mode === 'tag'\n ? 'Your owner statement is ready'\n : `Your ${args.month} owner statement for ${args.listingName}`,\n shortDescription:\n mode === 'tag'\n ? 'Your owner statement is ready to view.'\n : `Your ${args.month} statement for ${args.listingName} is ready to view.`,\n header: 'Your owner statement is ready',\n bodyOne: `<p>Hi ${userName},</p><p>${args.appName} published your ${month} owner statement for ${listingName}. Open it with the button below.</p>`,\n buttonText: 'View statement',\n bodyTwo: `<p style=\"color:#737373;font-size:13px\">If the button doesn't work, copy this link into your browser: ${ownerStatementHref}</p>`,\n href: args.ownerStatementHref,\n };\n};\n\nconst mutedColor = '#737373';\nconst borderColor = '#e5e7eb';\n\nexport const OwnerStatementEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n renewHref,\n}: ActionEmailTemplateProps & {\n /** Requests a new no-login link once the emailed one has expired. */\n renewHref?: string;\n}) => {\n const parse = (html: string) =>\n parseEmailHtml(html, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n });\n\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <EmailHeading eyebrow=\"Owner statement\" themeColors={themeColors}>\n {data.header?.trim() || 'Your owner statement is ready'}\n </EmailHeading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyOne) }}\n />\n\n {(listing || month) && (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n width=\"100%\"\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: '8px',\n borderCollapse: 'separate',\n margin: '24px 0 0',\n }}\n >\n <tbody>\n {[\n ['Property', listing],\n ['Statement', month],\n ].map(([label, value], index) =>\n value ? (\n <tr key={label}>\n <td\n style={{\n padding: '14px 20px',\n color: mutedColor,\n fontSize: 14,\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {label}\n </td>\n <td\n style={{\n padding: '14px 20px',\n fontSize: 14,\n fontWeight: 600,\n textAlign: 'right',\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {value}\n </td>\n </tr>\n ) : null\n )}\n </tbody>\n </table>\n )}\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"view-owner-statement-button\"\n label={data.buttonText?.trim() || 'View statement'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n {renewHref && (\n <div\n style={{\n padding: '20px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '32px',\n }}\n >\n <Text style={{ fontWeight: 600, margin: '0 0 4px' }}>\n Link expired?\n </Text>\n <Text style={{ color: mutedColor, fontSize: 14, margin: 0 }}>\n For your security, this link opens only this statement and works for\n 7 days. After that, request a new one and we'll email it to this\n address.\n </Text>\n <Button\n href={renewHref}\n mode={mode}\n data-testid=\"renew-owner-statement-link-button\"\n label=\"Send me a new link\"\n themeColors={themeColors}\n style={{\n background: '#ffffff',\n border: `1px solid ${themeColors[8]}`,\n color: themeColors[8],\n marginTop: '16px',\n marginBottom: 0,\n }}\n />\n </div>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyTwo) }}\n />\n </EmailContainer>\n );\n};\n"]}
@@ -2,17 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TenantDeletionEmail = exports.TenantDeletionEmailTemplate = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const heading_1 = require("@react-email/heading");
6
5
  const text_1 = require("@react-email/text");
7
6
  const components_1 = require("../components");
7
+ const theme_1 = require("../theme");
8
8
  const TenantDeletionEmailTemplate = ({ tenant, mode, user, }) => {
9
9
  return ((0, jsx_runtime_1.jsxs)(components_1.EmailContainer, { title: 'Team Account Deletion Notification', shortDescription: "We're reaching out to inform you that your VRPlatform team has been deleted.", tenant: {
10
10
  logo: undefined,
11
- }, mode: mode, children: [(0, jsx_runtime_1.jsx)(heading_1.Heading, { style: {
12
- fontSize: 28,
13
- fontWeight: 600,
14
- marginBottom: '50px',
15
- }, children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["We wanted to inform you that the team account \"", tenant.name, "\" has been deleted. This action has resulted in the removal of the following data associated with the team:"] }), (0, jsx_runtime_1.jsxs)("ul", { children: [(0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Payments:" }), " All payment records linked to the team have been permanently deleted."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Reservations:" }), " Any reservations made under this team account have been erased."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Owner Statements:" }), " All statements generated for owners within this team are no longer accessible."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Owner Data:" }), " Personal and transactional data of the owners connected to this team have been removed."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Connections:" }), " Any established connections or integrations related to this team have been terminated."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Other Related Data:" }), " All other data associated with this team has been permanently deleted."] }) })] }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: "If you have any questions or need further assistance, please don't hesitate to reach out." }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["Best regards,", (0, jsx_runtime_1.jsx)("br", {}), "The VRPlatform Team"] })] }));
11
+ }, mode: mode, children: [(0, jsx_runtime_1.jsx)(components_1.EmailHeading, { eyebrow: "Team deleted", themeColors: theme_1.THEME_COLORS.vrplatform, children: "Your team was deleted" }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["We wanted to inform you that the team account \"", tenant.name, "\" has been deleted. This action has resulted in the removal of the following data associated with the team:"] }), (0, jsx_runtime_1.jsxs)("ul", { children: [(0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Payments:" }), " All payment records linked to the team have been permanently deleted."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Reservations:" }), " Any reservations made under this team account have been erased."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Owner Statements:" }), " All statements generated for owners within this team are no longer accessible."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Owner Data:" }), " Personal and transactional data of the owners connected to this team have been removed."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Connections:" }), " Any established connections or integrations related to this team have been terminated."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Other Related Data:" }), " All other data associated with this team has been permanently deleted."] }) })] }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: "If you have any questions or need further assistance, please don't hesitate to reach out." }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["Best regards,", (0, jsx_runtime_1.jsx)("br", {}), "The VRPlatform Team"] })] }));
16
12
  };
17
13
  exports.TenantDeletionEmailTemplate = TenantDeletionEmailTemplate;
18
14
  const TenantDeletionEmail = (props) => {
@@ -1 +1 @@
1
- {"version":3,"file":"TenantDeletionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantDeletionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,kDAA+C;AAC/C,4CAAyC;AACzC,8CAA+C;AASxC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,MAAM,EACN,IAAI,EACJ,IAAI,GAC6B,EAAE,EAAE;IACrC,OAAO,CACL,wBAAC,2BAAc,IACb,KAAK,EAAE,oCAAoC,EAC3C,gBAAgB,EACd,8EAA8E,EAEhF,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,uBAAC,iBAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GACjD,EAEV,wBAAC,WAAI,mEAC6C,MAAM,CAAC,IAAI,oHAGtD,EACP,2CACE,yCACE,wBAAC,WAAI,eACH,sDAAgB,8EAEX,GACJ,EACL,yCACE,wBAAC,WAAI,eACH,0DAAoB,wEAEf,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,8DAAwB,uFAEnB,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,wDAAkB,gGAEb,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,yDAAmB,+FAEd,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,gEAA0B,+EAErB,GACJ,IACF,EACL,uBAAC,WAAI,4GAGE,EACP,wBAAC,WAAI,gCAEH,gCAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AApFW,QAAA,2BAA2B,+BAoFtC;AAEK,MAAM,mBAAmB,GAAG,CACjC,KAAuC,EACvC,EAAE;IACF,OAAO,uBAAC,mCAA2B,OAAK,KAAK,GAAI,CAAC;AACpD,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from '../components';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantDeletionEmailTemplateProps = {\n tenant: EmailBaseProps['tenant'];\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n};\n\nexport const TenantDeletionEmailTemplate = ({\n tenant,\n mode,\n user,\n}: TenantDeletionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Team Account Deletion Notification'}\n shortDescription={\n \"We're reaching out to inform you that your VRPlatform team has been deleted.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}\n </Heading>\n\n <Text>\n We wanted to inform you that the team account \"{tenant.name}\" has been\n deleted. This action has resulted in the removal of the following data\n associated with the team:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Payments:</b> All payment records linked to the team have been\n permanently deleted.\n </Text>\n </li>\n <li>\n <Text>\n <b>Reservations:</b> Any reservations made under this team account\n have been erased.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Statements:</b> All statements generated for owners within\n this team are no longer accessible.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Data:</b> Personal and transactional data of the owners\n connected to this team have been removed.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Connections:</b> Any established connections or integrations\n related to this team have been terminated.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Other Related Data:</b> All other data associated with this team\n has been permanently deleted.\n </Text>\n </li>\n </ul>\n <Text>\n If you have any questions or need further assistance, please don't\n hesitate to reach out.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n\nexport const TenantDeletionEmail = (\n props: TenantDeletionEmailTemplateProps\n) => {\n return <TenantDeletionEmailTemplate {...props} />;\n};\n"]}
1
+ {"version":3,"file":"TenantDeletionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantDeletionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,8CAA6D;AAC7D,oCAAwC;AASjC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,MAAM,EACN,IAAI,EACJ,IAAI,GAC6B,EAAE,EAAE;IACrC,OAAO,CACL,wBAAC,2BAAc,IACb,KAAK,EAAE,oCAAoC,EAC3C,gBAAgB,EACd,8EAA8E,EAEhF,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,uBAAC,yBAAY,IACX,OAAO,EAAC,cAAc,EACtB,WAAW,EAAE,oBAAY,CAAC,UAAU,sCAGvB,EAEf,uBAAC,WAAI,cAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GAAQ,EAEvE,wBAAC,WAAI,mEAC6C,MAAM,CAAC,IAAI,oHAGtD,EACP,2CACE,yCACE,wBAAC,WAAI,eACH,sDAAgB,8EAEX,GACJ,EACL,yCACE,wBAAC,WAAI,eACH,0DAAoB,wEAEf,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,8DAAwB,uFAEnB,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,wDAAkB,gGAEb,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,yDAAmB,+FAEd,GACJ,EAEL,yCACE,wBAAC,WAAI,eACH,gEAA0B,+EAErB,GACJ,IACF,EACL,uBAAC,WAAI,4GAGE,EACP,wBAAC,WAAI,gCAEH,gCAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AAnFW,QAAA,2BAA2B,+BAmFtC;AAEK,MAAM,mBAAmB,GAAG,CACjC,KAAuC,EACvC,EAAE;IACF,OAAO,uBAAC,mCAA2B,OAAK,KAAK,GAAI,CAAC;AACpD,CAAC,CAAC;AAJW,QAAA,mBAAmB,uBAI9B","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer, EmailHeading } from '../components';\nimport { THEME_COLORS } from '../theme';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantDeletionEmailTemplateProps = {\n tenant: EmailBaseProps['tenant'];\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n};\n\nexport const TenantDeletionEmailTemplate = ({\n tenant,\n mode,\n user,\n}: TenantDeletionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Team Account Deletion Notification'}\n shortDescription={\n \"We're reaching out to inform you that your VRPlatform team has been deleted.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <EmailHeading\n eyebrow=\"Team deleted\"\n themeColors={THEME_COLORS.vrplatform}\n >\n Your team was deleted\n </EmailHeading>\n\n <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>\n\n <Text>\n We wanted to inform you that the team account \"{tenant.name}\" has been\n deleted. This action has resulted in the removal of the following data\n associated with the team:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Payments:</b> All payment records linked to the team have been\n permanently deleted.\n </Text>\n </li>\n <li>\n <Text>\n <b>Reservations:</b> Any reservations made under this team account\n have been erased.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Statements:</b> All statements generated for owners within\n this team are no longer accessible.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Data:</b> Personal and transactional data of the owners\n connected to this team have been removed.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Connections:</b> Any established connections or integrations\n related to this team have been terminated.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Other Related Data:</b> All other data associated with this team\n has been permanently deleted.\n </Text>\n </li>\n </ul>\n <Text>\n If you have any questions or need further assistance, please don't\n hesitate to reach out.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n\nexport const TenantDeletionEmail = (\n props: TenantDeletionEmailTemplateProps\n) => {\n return <TenantDeletionEmailTemplate {...props} />;\n};\n"]}
@@ -2,17 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TenantSuspensionEmailTemplate = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const heading_1 = require("@react-email/heading");
6
5
  const text_1 = require("@react-email/text");
7
6
  const components_1 = require("../components");
7
+ const theme_1 = require("../theme");
8
8
  const TenantSuspensionEmailTemplate = ({ mode, user, tenant, }) => {
9
9
  return ((0, jsx_runtime_1.jsxs)(components_1.EmailContainer, { title: 'Action Required: Your VRPlatform Account Access', shortDescription: "We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.", tenant: {
10
10
  logo: undefined,
11
- }, mode: mode, children: [(0, jsx_runtime_1.jsx)(heading_1.Heading, { style: {
12
- fontSize: 28,
13
- fontWeight: 600,
14
- marginBottom: '50px',
15
- }, children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["We're reaching out to inform you that as of today, access to your team", ' ', (0, jsx_runtime_1.jsx)("b", { children: tenant.name }), " has been temporarily suspended. This includes access to features such as accounting automations, owner statements, management commissions and the owner portal (including portal access for all owners)."] }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: "At VRPlatform, we take the security and functionality of our platform seriously, ensuring that our partners have the best possible experience. This step, though necessary, is intended to be temporary and is part of our commitment to maintain the highest standards of service." }), (0, jsx_runtime_1.jsx)(text_1.Text, { style: {
11
+ }, mode: mode, children: [(0, jsx_runtime_1.jsx)(components_1.EmailHeading, { eyebrow: "Team suspended", themeColors: theme_1.THEME_COLORS.vrplatform, children: "Your team access is suspended" }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["We're reaching out to inform you that as of today, access to your team", ' ', (0, jsx_runtime_1.jsx)("b", { children: tenant.name }), " has been temporarily suspended. This includes access to features such as accounting automations, owner statements, management commissions and the owner portal (including portal access for all owners)."] }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: "At VRPlatform, we take the security and functionality of our platform seriously, ensuring that our partners have the best possible experience. This step, though necessary, is intended to be temporary and is part of our commitment to maintain the highest standards of service." }), (0, jsx_runtime_1.jsx)(text_1.Text, { style: {
16
12
  fontWeight: 'bold',
17
13
  }, children: "Next Steps to Regain Access:" }), (0, jsx_runtime_1.jsxs)("ul", { children: [(0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Immediate Action:" }), " To adress this and help you regain access to your account, please contact our support team at your earliest convenience. We're here to assist you with the necessary steps to restore your services."] }) }), (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)(text_1.Text, { children: [(0, jsx_runtime_1.jsx)("b", { children: "Contact Information:" }), " You can reach us by emailing support@vrplatform.app. Our dedicated team is ready to support you in resolving this matter promptly."] }) })] }), (0, jsx_runtime_1.jsx)(text_1.Text, { children: "Thank you for your prompt attention to this important matter. We value your partnership and are here to support you every step of the way." }), (0, jsx_runtime_1.jsxs)(text_1.Text, { children: ["Best regards,", (0, jsx_runtime_1.jsx)("br", {}), "The VRPlatform Team"] })] }));
18
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TenantSuspensionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantSuspensionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,kDAA+C;AAC/C,4CAAyC;AACzC,8CAA+C;AASxC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,IAAI,EACJ,MAAM,GAC6B,EAAE,EAAE;IACvC,OAAO,CACL,wBAAC,2BAAc,IACb,KAAK,EAAE,iDAAiD,EACxD,gBAAgB,EACd,sGAAsG,EAExG,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,uBAAC,iBAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GACjD,EAEV,wBAAC,WAAI,yFACoE,GAAG,EAC1E,wCAAI,MAAM,CAAC,IAAI,GAAK,iNAIf,EACP,uBAAC,WAAI,sSAKE,EACP,uBAAC,WAAI,IACH,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;iBACnB,6CAGI,EACP,2CACE,yCACE,wBAAC,WAAI,eACH,8DAAwB,6MAInB,GACJ,EACL,yCACE,wBAAC,WAAI,eACH,iEAA2B,2IAGtB,GACJ,IACF,EACL,uBAAC,WAAI,6JAGE,EACP,wBAAC,WAAI,gCAEH,gCAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AA1EW,QAAA,6BAA6B,iCA0ExC","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from '../components';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantSuspensionEmailTemplateProps = {\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n tenant: Omit<EmailBaseProps['tenant'], 'logo'>;\n};\n\nexport const TenantSuspensionEmailTemplate = ({\n mode,\n user,\n tenant,\n}: TenantSuspensionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Action Required: Your VRPlatform Account Access'}\n shortDescription={\n \"We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}\n </Heading>\n\n <Text>\n We're reaching out to inform you that as of today, access to your team{' '}\n <b>{tenant.name}</b> has been temporarily suspended. This includes\n access to features such as accounting automations, owner statements,\n management commissions and the owner portal (including portal access for\n all owners).\n </Text>\n <Text>\n At VRPlatform, we take the security and functionality of our platform\n seriously, ensuring that our partners have the best possible experience.\n This step, though necessary, is intended to be temporary and is part of\n our commitment to maintain the highest standards of service.\n </Text>\n <Text\n style={{\n fontWeight: 'bold',\n }}\n >\n Next Steps to Regain Access:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Immediate Action:</b> To adress this and help you regain access\n to your account, please contact our support team at your earliest\n convenience. We're here to assist you with the necessary steps to\n restore your services.\n </Text>\n </li>\n <li>\n <Text>\n <b>Contact Information:</b> You can reach us by emailing\n support@vrplatform.app. Our dedicated team is ready to support you\n in resolving this matter promptly.\n </Text>\n </li>\n </ul>\n <Text>\n Thank you for your prompt attention to this important matter. We value\n your partnership and are here to support you every step of the way.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"TenantSuspensionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantSuspensionEmailTemplate.tsx"],"names":[],"mappings":";;;;AAAA,4CAAyC;AACzC,8CAA6D;AAC7D,oCAAwC;AASjC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,IAAI,EACJ,MAAM,GAC6B,EAAE,EAAE;IACvC,OAAO,CACL,wBAAC,2BAAc,IACb,KAAK,EAAE,iDAAiD,EACxD,gBAAgB,EACd,sGAAsG,EAExG,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,uBAAC,yBAAY,IACX,OAAO,EAAC,gBAAgB,EACxB,WAAW,EAAE,oBAAY,CAAC,UAAU,8CAGvB,EAEf,uBAAC,WAAI,cAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GAAQ,EAEvE,wBAAC,WAAI,yFACoE,GAAG,EAC1E,wCAAI,MAAM,CAAC,IAAI,GAAK,iNAIf,EACP,uBAAC,WAAI,sSAKE,EACP,uBAAC,WAAI,IACH,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;iBACnB,6CAGI,EACP,2CACE,yCACE,wBAAC,WAAI,eACH,8DAAwB,6MAInB,GACJ,EACL,yCACE,wBAAC,WAAI,eACH,iEAA2B,2IAGtB,GACJ,IACF,EACL,uBAAC,WAAI,6JAGE,EACP,wBAAC,WAAI,gCAEH,gCAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AAzEW,QAAA,6BAA6B,iCAyExC","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer, EmailHeading } from '../components';\nimport { THEME_COLORS } from '../theme';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantSuspensionEmailTemplateProps = {\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n tenant: Omit<EmailBaseProps['tenant'], 'logo'>;\n};\n\nexport const TenantSuspensionEmailTemplate = ({\n mode,\n user,\n tenant,\n}: TenantSuspensionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Action Required: Your VRPlatform Account Access'}\n shortDescription={\n \"We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <EmailHeading\n eyebrow=\"Team suspended\"\n themeColors={THEME_COLORS.vrplatform}\n >\n Your team access is suspended\n </EmailHeading>\n\n <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>\n\n <Text>\n We're reaching out to inform you that as of today, access to your team{' '}\n <b>{tenant.name}</b> has been temporarily suspended. This includes\n access to features such as accounting automations, owner statements,\n management commissions and the owner portal (including portal access for\n all owners).\n </Text>\n <Text>\n At VRPlatform, we take the security and functionality of our platform\n seriously, ensuring that our partners have the best possible experience.\n This step, though necessary, is intended to be temporary and is part of\n our commitment to maintain the highest standards of service.\n </Text>\n <Text\n style={{\n fontWeight: 'bold',\n }}\n >\n Next Steps to Regain Access:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Immediate Action:</b> To adress this and help you regain access\n to your account, please contact our support team at your earliest\n convenience. We're here to assist you with the necessary steps to\n restore your services.\n </Text>\n </li>\n <li>\n <Text>\n <b>Contact Information:</b> You can reach us by emailing\n support@vrplatform.app. Our dedicated team is ready to support you\n in resolving this matter promptly.\n </Text>\n </li>\n </ul>\n <Text>\n Thank you for your prompt attention to this important matter. We value\n your partnership and are here to support you every step of the way.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n"]}
@@ -12,4 +12,6 @@ export type ActionEmailData = {
12
12
  export interface ActionEmailTemplateProps extends EmailBaseProps {
13
13
  data: ActionEmailData;
14
14
  }
15
- export declare const ActionEmailTemplate: ({ data, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }: ActionEmailTemplateProps) => import("react").JSX.Element;
15
+ export declare const ActionEmailTemplate: ({ data, eyebrow, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }: ActionEmailTemplateProps & {
16
+ eyebrow: string;
17
+ }) => import("react").JSX.Element;
@@ -1,19 +1,17 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Heading } from '@react-email/heading';
3
2
  import { Text } from '@react-email/text';
4
3
  import { EmailContainer } from './EmailContainer';
4
+ import { EmailHeading } from './EmailHeading';
5
5
  import { parseEmailHtml } from './utils';
6
6
  import { Button } from './Button';
7
- export const ActionEmailTemplate = ({ data, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }) => {
8
- return (_jsxs(EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [_jsx(Heading, { style: {
9
- fontSize: 28,
10
- fontWeight: 600,
11
- marginBottom: '50px',
12
- }, children: data.header?.trim() || `Welcome to ${tenant.name}!` }), data.banner?.trim() && (_jsx(Text, { style: {
13
- padding: '24px',
14
- backgroundColor: '#f2f3f3',
7
+ export const ActionEmailTemplate = ({ data, eyebrow, tenant, themeColors, mode, user, listing, month, unsubscribeHref, }) => {
8
+ return (_jsxs(EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [_jsx(EmailHeading, { eyebrow: eyebrow, themeColors: themeColors, children: data.header?.trim() || `Welcome to ${tenant.name}!` }), data.banner?.trim() && (_jsx(Text, { style: {
9
+ padding: '16px 20px',
10
+ backgroundColor: '#f8f9fa',
11
+ borderLeft: `3px solid ${themeColors[8]}`,
15
12
  borderRadius: '4px',
16
- marginBottom: '40px',
13
+ margin: '0 0 32px',
14
+ whiteSpace: 'pre-line',
17
15
  }, children: data.banner.trim() })), _jsx("div", {
18
16
  // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>
19
17
  dangerouslySetInnerHTML: {
@@ -23,7 +21,7 @@ export const ActionEmailTemplate = ({ data, tenant, themeColors, mode, user, lis
23
21
  date: month || '',
24
22
  listingName: listing || '',
25
23
  }),
26
- } }), _jsx(Button, { href: data.href, mode: mode, "data-testid": "accept-invite-button", label: data.buttonText?.trim() || 'Accept Invitation', themeColors: themeColors }), _jsx("div", {
24
+ } }), _jsx(Button, { href: data.href, mode: mode, "data-testid": "accept-invite-button", label: data.buttonText?.trim() || 'Accept Invitation', themeColors: themeColors, style: { marginTop: '24px', marginBottom: '32px' } }), _jsx("div", {
27
25
  // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>
28
26
  dangerouslySetInnerHTML: {
29
27
  __html: parseEmailHtml(data.bodyTwo, {
@@ -1 +1 @@
1
- {"version":3,"file":"ActionEmailTemplate.js","sourceRoot":"src/","sources":["components/ActionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAiBlC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,GACU,EAAE,EAAE;IAC7B,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,IAAI,CAAC,OAAO,EACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,aAEhC,KAAC,OAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,cAAc,MAAM,CAAC,IAAI,GAAG,GAC5C,EAET,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CACtB,KAAC,IAAI,IACH,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,eAAe,EAAE,SAAS;oBAC1B,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GACd,CACR,EAED;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,EAEF,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,iBACE,sBAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,mBAAmB,EACrD,WAAW,EAAE,WAAW,GACxB,EAEF;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,IACa,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from './EmailContainer';\nimport type { EmailBaseProps } from '../types';\nimport { parseEmailHtml } from './utils';\nimport { Button } from './Button';\n\nexport type ActionEmailData = {\n subject: string;\n shortDescription: string;\n banner?: string;\n header: string;\n bodyOne: string;\n bodyTwo: string;\n href: string;\n buttonText: string;\n};\n\nexport interface ActionEmailTemplateProps extends EmailBaseProps {\n data: ActionEmailData;\n}\n\nexport const ActionEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n}: ActionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {data.header?.trim() || `Welcome to ${tenant.name}!`}\n </Heading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '24px',\n backgroundColor: '#f2f3f3',\n borderRadius: '4px',\n marginBottom: '40px',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyOne, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"accept-invite-button\"\n label={data.buttonText?.trim() || 'Accept Invitation'}\n themeColors={themeColors}\n />\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyTwo, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"ActionEmailTemplate.js","sourceRoot":"src/","sources":["components/ActionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAiBlC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,GACgC,EAAE,EAAE;IACnD,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,IAAI,CAAC,OAAO,EACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,aAEhC,KAAC,YAAY,IAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,YACrD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,cAAc,MAAM,CAAC,IAAI,GAAG,GACvC,EAEd,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CACtB,KAAC,IAAI,IACH,KAAK,EAAE;oBACL,OAAO,EAAE,WAAW;oBACpB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE;oBACzC,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,UAAU;oBAClB,UAAU,EAAE,UAAU;iBACvB,YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GACd,CACR,EAED;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,EAEF,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,iBACE,sBAAsB,EAClC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,mBAAmB,EACrD,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAClD,EAEF;gBACE,sEAAsE;gBACtE,uBAAuB,EAAE;oBACvB,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE;wBACnC,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;wBAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;wBACjB,WAAW,EAAE,OAAO,IAAI,EAAE;qBAC3B,CAAC;iBACH,GACD,IACa,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer } from './EmailContainer';\nimport { EmailHeading } from './EmailHeading';\nimport type { EmailBaseProps } from '../types';\nimport { parseEmailHtml } from './utils';\nimport { Button } from './Button';\n\nexport type ActionEmailData = {\n subject: string;\n shortDescription: string;\n banner?: string;\n header: string;\n bodyOne: string;\n bodyTwo: string;\n href: string;\n buttonText: string;\n};\n\nexport interface ActionEmailTemplateProps extends EmailBaseProps {\n data: ActionEmailData;\n}\n\nexport const ActionEmailTemplate = ({\n data,\n eyebrow,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n}: ActionEmailTemplateProps & { eyebrow: string }) => {\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <EmailHeading eyebrow={eyebrow} themeColors={themeColors}>\n {data.header?.trim() || `Welcome to ${tenant.name}!`}\n </EmailHeading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyOne, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"accept-invite-button\"\n label={data.buttonText?.trim() || 'Accept Invitation'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: <explanation>\n dangerouslySetInnerHTML={{\n __html: parseEmailHtml(data.bodyTwo, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n }),\n }}\n />\n </EmailContainer>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { EmailBaseProps } from '../types';
2
+ type Props = {
3
+ eyebrow: string;
4
+ children: React.ReactNode;
5
+ themeColors: EmailBaseProps['themeColors'];
6
+ };
7
+ export declare const EmailHeading: ({ eyebrow, children, themeColors }: Props) => import("react").JSX.Element;
8
+ export {};
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Heading } from '@react-email/heading';
3
+ import { Text } from '@react-email/text';
4
+ export const EmailHeading = ({ eyebrow, children, themeColors }) => (_jsxs(_Fragment, { children: [_jsx(Text, { style: {
5
+ color: themeColors[8],
6
+ fontSize: 12,
7
+ fontWeight: 600,
8
+ letterSpacing: '0.08em',
9
+ textTransform: 'uppercase',
10
+ margin: '0 0 8px',
11
+ }, children: eyebrow }), _jsx(Heading, { style: {
12
+ fontSize: 26,
13
+ fontWeight: 600,
14
+ lineHeight: '34px',
15
+ margin: '0 0 32px',
16
+ }, children: children })] }));
17
+ //# sourceMappingURL=EmailHeading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailHeading.js","sourceRoot":"src/","sources":["components/EmailHeading.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AASzC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAS,EAAE,EAAE,CAAC,CACzE,8BACE,KAAC,IAAI,IACH,KAAK,EAAE;gBACL,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;gBACrB,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,GAAG;gBACf,aAAa,EAAE,QAAQ;gBACvB,aAAa,EAAE,WAAW;gBAC1B,MAAM,EAAE,SAAS;aAClB,YAEA,OAAO,GACH,EACP,KAAC,OAAO,IACN,KAAK,EAAE;gBACL,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,MAAM;gBAClB,MAAM,EAAE,UAAU;aACnB,YAEA,QAAQ,GACD,IACT,CACJ,CAAC","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport type { EmailBaseProps } from '../types';\n\ntype Props = {\n eyebrow: string;\n children: React.ReactNode;\n themeColors: EmailBaseProps['themeColors'];\n};\n\nexport const EmailHeading = ({ eyebrow, children, themeColors }: Props) => (\n <>\n <Text\n style={{\n color: themeColors[8],\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n margin: '0 0 8px',\n }}\n >\n {eyebrow}\n </Text>\n <Heading\n style={{\n fontSize: 26,\n fontWeight: 600,\n lineHeight: '34px',\n margin: '0 0 32px',\n }}\n >\n {children}\n </Heading>\n </>\n);\n"]}
@@ -1,2 +1,3 @@
1
1
  export * from './EmailContainer';
2
2
  export * from './ActionEmailTemplate';
3
+ export * from './EmailHeading';
@@ -1,3 +1,4 @@
1
1
  export * from './EmailContainer';
2
2
  export * from './ActionEmailTemplate';
3
+ export * from './EmailHeading';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"src/","sources":["components/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from './EmailContainer';\nexport * from './ActionEmailTemplate';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"src/","sources":["components/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC","sourcesContent":["export * from './EmailContainer';\nexport * from './ActionEmailTemplate';\nexport * from './EmailHeading';\n"]}
@@ -14,7 +14,7 @@ export const getDefaultInviteOwnerEmailData = (mode, args) => {
14
14
  };
15
15
  };
16
16
  export const InviteOwnerEmailTemplate = ({ ownerAccessRole = 'admin', ...props }) => {
17
- return (_jsx(ActionEmailTemplate, { ...props, data: {
17
+ return (_jsx(ActionEmailTemplate, { ...props, eyebrow: "Owner Portal invitation", data: {
18
18
  ...props.data,
19
19
  // Add guidance at render time so saved custom templates receive it too.
20
20
  bodyTwo: `${props.data.bodyTwo}<hr style="width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,
@@ -1 +1 @@
1
- {"version":3,"file":"InviteOwnerEmailTemplate.js","sourceRoot":"src/","sources":["templates/InviteOwnerEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAEL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,IAAoB,EACpB,IAGC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,qDAAqD,IAAI,CAAC,OAAO,gEAAgE;QAC1I,OAAO,EAAE,wGAAwG,UAAU,MAAM;QACjI,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,+BAA+B;QACvC,gBAAgB,EAAE,wDAAwD;QAC1E,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,0BAA0B,IAAI,CAAC,OAAO,eAAe;KAC/D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,eAAe,GAAG,OAAO,EACzB,GAAG,KAAK,EAGT,EAAE,EAAE;IACH,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,mYAAmY,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC,sCAAsC;SAC3hB,GACD,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInviteOwnerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.signInLink;\n\n return {\n bodyOne: `<p>You are invited to access your Owner Portal on ${args.appName}.</p><p>Accept the invitation below to set up your access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can copy and paste the link below into your browser: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to your Owner Portal!',\n shortDescription: 'Set up your Owner Portal access using your invitation.',\n href: args.signInLink,\n subject: `Your invitation to the ${args.appName} Owner Portal`,\n };\n};\n\nexport const InviteOwnerEmailTemplate = ({\n ownerAccessRole = 'admin',\n ...props\n}: ActionEmailTemplateProps & {\n ownerAccessRole?: 'admin' | 'viewer';\n}) => {\n return (\n <ActionEmailTemplate\n {...props}\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,\n }}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"InviteOwnerEmailTemplate.js","sourceRoot":"src/","sources":["templates/InviteOwnerEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAEL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,IAAoB,EACpB,IAGC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IAEjE,OAAO;QACL,OAAO,EAAE,qDAAqD,IAAI,CAAC,OAAO,gEAAgE;QAC1I,OAAO,EAAE,wGAAwG,UAAU,MAAM;QACjI,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,+BAA+B;QACvC,gBAAgB,EAAE,wDAAwD;QAC1E,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,0BAA0B,IAAI,CAAC,OAAO,eAAe;KAC/D,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,EACvC,eAAe,GAAG,OAAO,EACzB,GAAG,KAAK,EAGT,EAAE,EAAE;IACH,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,OAAO,EAAC,yBAAyB,EACjC,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,mYAAmY,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,kCAAkC,sCAAsC;SAC3hB,GACD,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInviteOwnerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.signInLink;\n\n return {\n bodyOne: `<p>You are invited to access your Owner Portal on ${args.appName}.</p><p>Accept the invitation below to set up your access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can copy and paste the link below into your browser: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to your Owner Portal!',\n shortDescription: 'Set up your Owner Portal access using your invitation.',\n href: args.signInLink,\n subject: `Your invitation to the ${args.appName} Owner Portal`,\n };\n};\n\nexport const InviteOwnerEmailTemplate = ({\n ownerAccessRole = 'admin',\n ...props\n}: ActionEmailTemplateProps & {\n ownerAccessRole?: 'admin' | 'viewer';\n}) => {\n return (\n <ActionEmailTemplate\n {...props}\n eyebrow=\"Owner Portal invitation\"\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your Owner Portal access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your property manager for a new invitation.</p><p>For questions about ${ownerAccessRole === 'viewer' ? 'portal access' : 'your statements or portal access'}, contact your property manager.</p>`,\n }}\n />\n );\n};\n"]}
@@ -16,7 +16,7 @@ export const getDefaultInvitePropertyManagerEmailData = (mode, args) => {
16
16
  };
17
17
  };
18
18
  export const InvitePmEmailTemplate = (props) => {
19
- return (_jsx(ActionEmailTemplate, { ...props, data: {
19
+ return (_jsx(ActionEmailTemplate, { ...props, eyebrow: "Team invitation", data: {
20
20
  ...props.data,
21
21
  // Add guidance at render time so saved custom templates receive it too.
22
22
  bodyTwo: `${props.data.bodyTwo}<hr style="width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,
@@ -1 +1 @@
1
- {"version":3,"file":"InvitePmEmailTemplate.js","sourceRoot":"src/","sources":["templates/InvitePmEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAEL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,IAAoB,EACpB,IAIC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK;QACZ,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,qBAAqB,IAAI,CAAC,UAAU,MAAM,CAAC;IAE5E,OAAO;QACL,OAAO,EAAE,8BAA8B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,qEAAqE;QAC5I,OAAO,EAAE,qFAAqF,UAAU,MAAM;QAC9G,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,sBAAsB;QAC9B,gBAAgB,EAAE,kCAAkC,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,GAAG;QACvF,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,2BAA2B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE;KACvE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAA+B,EAAE,EAAE;IACvE,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,6aAA6a;SAC5c,GACD,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInvitePropertyManagerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n teamName: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag'\n ? EMAIL_ACTION_LINK_COMPONENT\n : `<a href='${args.signInLink}' target='_blank'>${args.signInLink}</a>`;\n\n return {\n bodyOne: `<p>You are invited to join ${args.teamName} on ${args.appName}.</p><p>Accept the invitation below to set up your team access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can use the following link below: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to the team!',\n shortDescription: `Accept your invitation to join ${args.teamName} on ${args.appName}.`,\n href: args.signInLink,\n subject: `You are invited to join ${args.teamName} on ${args.appName}`,\n };\n};\n\nexport const InvitePmEmailTemplate = (props: ActionEmailTemplateProps) => {\n return (\n <ActionEmailTemplate\n {...props}\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,\n }}\n />\n );\n};\n"]}
1
+ {"version":3,"file":"InvitePmEmailTemplate.js","sourceRoot":"src/","sources":["templates/InvitePmEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAEL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,MAAM,wCAAwC,GAAG,CACtD,IAAoB,EACpB,IAIC,EACgB,EAAE;IACnB,MAAM,UAAU,GACd,IAAI,KAAK,KAAK;QACZ,CAAC,CAAC,2BAA2B;QAC7B,CAAC,CAAC,YAAY,IAAI,CAAC,UAAU,qBAAqB,IAAI,CAAC,UAAU,MAAM,CAAC;IAE5E,OAAO;QACL,OAAO,EAAE,8BAA8B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,qEAAqE;QAC5I,OAAO,EAAE,qFAAqF,UAAU,MAAM;QAC9G,UAAU,EAAE,mBAAmB;QAC/B,MAAM,EAAE,sBAAsB;QAC9B,gBAAgB,EAAE,kCAAkC,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,GAAG;QACvF,IAAI,EAAE,IAAI,CAAC,UAAU;QACrB,OAAO,EAAE,2BAA2B,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,OAAO,EAAE;KACvE,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAA+B,EAAE,EAAE;IACvE,OAAO,CACL,KAAC,mBAAmB,OACd,KAAK,EACT,OAAO,EAAC,iBAAiB,EACzB,IAAI,EAAE;YACJ,GAAG,KAAK,CAAC,IAAI;YACb,wEAAwE;YACxE,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,6aAA6a;SAC5c,GACD,CACH,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { EMAIL_ACTION_LINK_COMPONENT } from '../extensions';\nimport {\n type ActionEmailData,\n ActionEmailTemplate,\n type ActionEmailTemplateProps,\n} from '../components';\n\nexport const getDefaultInvitePropertyManagerEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n signInLink: string;\n teamName: string;\n }\n): ActionEmailData => {\n const signInLink =\n mode === 'tag'\n ? EMAIL_ACTION_LINK_COMPONENT\n : `<a href='${args.signInLink}' target='_blank'>${args.signInLink}</a>`;\n\n return {\n bodyOne: `<p>You are invited to join ${args.teamName} on ${args.appName}.</p><p>Accept the invitation below to set up your team access.</p>`,\n bodyTwo: `<p>If you have any trouble with the button, you can use the following link below: ${signInLink}</p>`,\n buttonText: 'Accept Invitation',\n header: 'Welcome to the team!',\n shortDescription: `Accept your invitation to join ${args.teamName} on ${args.appName}.`,\n href: args.signInLink,\n subject: `You are invited to join ${args.teamName} on ${args.appName}`,\n };\n};\n\nexport const InvitePmEmailTemplate = (props: ActionEmailTemplateProps) => {\n return (\n <ActionEmailTemplate\n {...props}\n eyebrow=\"Team invitation\"\n data={{\n ...props.data,\n // Add guidance at render time so saved custom templates receive it too.\n bodyTwo: `${props.data.bodyTwo}<hr style=\"width:100%;border:none;border-top:1px solid #eaeaea;margin:24px 0\" /><p>This invitation link is for one-time setup of your team access and expires after 7 days. Sign up using the exact email address this invitation was sent to.</p><p>If your invitation expires before setup is complete, contact your team administrator for a new invitation.</p><p>For questions about team access, contact your team administrator.</p>`,\n }}\n />\n );\n};\n"]}
@@ -1,9 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Heading } from '@react-email/heading';
3
2
  import { Text } from '@react-email/text';
4
3
  import { EMAIL_ACTION_LINK_COMPONENT, EMAIL_DATE_COMPONENT, EMAIL_LISTING_COMPONENT, EMAIL_USER_NAME_COMPONENT, } from '../extensions';
5
4
  import { Button } from '../components/Button';
6
5
  import { EmailContainer } from '../components/EmailContainer';
6
+ import { EmailHeading } from '../components/EmailHeading';
7
7
  import { parseEmailHtml } from '../components/utils';
8
8
  export const getDefaultOwnerStatementEmailData = (mode, args) => {
9
9
  const ownerStatementHref = mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;
@@ -37,19 +37,7 @@ export const OwnerStatementEmailTemplate = ({ data, tenant, themeColors, mode, u
37
37
  date: month || '',
38
38
  listingName: listing || '',
39
39
  });
40
- return (_jsxs(EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [_jsx(Text, { style: {
41
- color: themeColors[8],
42
- fontSize: 12,
43
- fontWeight: 600,
44
- letterSpacing: '0.08em',
45
- textTransform: 'uppercase',
46
- margin: '0 0 8px',
47
- }, children: "Owner statement" }), _jsx(Heading, { style: {
48
- fontSize: 26,
49
- fontWeight: 600,
50
- lineHeight: '34px',
51
- margin: '0 0 32px',
52
- }, children: data.header?.trim() || 'Your owner statement is ready' }), data.banner?.trim() && (_jsx(Text, { style: {
40
+ return (_jsxs(EmailContainer, { title: data.subject, shortDescription: data.shortDescription, tenant: tenant, mode: mode, unsubscribeHref: unsubscribeHref, children: [_jsx(EmailHeading, { eyebrow: "Owner statement", themeColors: themeColors, children: data.header?.trim() || 'Your owner statement is ready' }), data.banner?.trim() && (_jsx(Text, { style: {
53
41
  padding: '16px 20px',
54
42
  backgroundColor: '#f8f9fa',
55
43
  borderLeft: `3px solid ${themeColors[8]}`,
@@ -1 +1 @@
1
- {"version":3,"file":"OwnerStatementEmailTemplate.js","sourceRoot":"src/","sources":["templates/OwnerStatementEmailTemplate.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport {\n EMAIL_ACTION_LINK_COMPONENT,\n EMAIL_DATE_COMPONENT,\n EMAIL_LISTING_COMPONENT,\n EMAIL_USER_NAME_COMPONENT,\n} from '../extensions';\nimport type {\n ActionEmailData,\n ActionEmailTemplateProps,\n} from '../components/ActionEmailTemplate';\nimport { Button } from '../components/Button';\nimport { EmailContainer } from '../components/EmailContainer';\nimport { parseEmailHtml } from '../components/utils';\n\nexport const getDefaultOwnerStatementEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n ownerStatementHref: string;\n listingName: string;\n userName: string;\n month: string;\n }\n): ActionEmailData => {\n const ownerStatementHref =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;\n\n const listingName =\n mode === 'tag' ? EMAIL_LISTING_COMPONENT : args.listingName;\n const month = mode === 'tag' ? EMAIL_DATE_COMPONENT : args.month;\n const userName = mode === 'tag' ? EMAIL_USER_NAME_COMPONENT : args.userName;\n\n // Owners open the statement by link without a login and viewers log in to\n // the owner portal, so the text names neither. Subject and preview text are\n // plain text without tokens, so a saved template must not keep the editor's\n // sample month and listing.\n return {\n subject:\n mode === 'tag'\n ? 'Your owner statement is ready'\n : `Your ${args.month} owner statement for ${args.listingName}`,\n shortDescription:\n mode === 'tag'\n ? 'Your owner statement is ready to view.'\n : `Your ${args.month} statement for ${args.listingName} is ready to view.`,\n header: 'Your owner statement is ready',\n bodyOne: `<p>Hi ${userName},</p><p>${args.appName} published your ${month} owner statement for ${listingName}. Open it with the button below.</p>`,\n buttonText: 'View statement',\n bodyTwo: `<p style=\"color:#737373;font-size:13px\">If the button doesn't work, copy this link into your browser: ${ownerStatementHref}</p>`,\n href: args.ownerStatementHref,\n };\n};\n\nconst mutedColor = '#737373';\nconst borderColor = '#e5e7eb';\n\nexport const OwnerStatementEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n renewHref,\n}: ActionEmailTemplateProps & {\n /** Requests a new no-login link once the emailed one has expired. */\n renewHref?: string;\n}) => {\n const parse = (html: string) =>\n parseEmailHtml(html, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n });\n\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <Text\n style={{\n color: themeColors[8],\n fontSize: 12,\n fontWeight: 600,\n letterSpacing: '0.08em',\n textTransform: 'uppercase',\n margin: '0 0 8px',\n }}\n >\n Owner statement\n </Text>\n <Heading\n style={{\n fontSize: 26,\n fontWeight: 600,\n lineHeight: '34px',\n margin: '0 0 32px',\n }}\n >\n {data.header?.trim() || 'Your owner statement is ready'}\n </Heading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyOne) }}\n />\n\n {(listing || month) && (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n width=\"100%\"\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: '8px',\n borderCollapse: 'separate',\n margin: '24px 0 0',\n }}\n >\n <tbody>\n {[\n ['Property', listing],\n ['Statement', month],\n ].map(([label, value], index) =>\n value ? (\n <tr key={label}>\n <td\n style={{\n padding: '14px 20px',\n color: mutedColor,\n fontSize: 14,\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {label}\n </td>\n <td\n style={{\n padding: '14px 20px',\n fontSize: 14,\n fontWeight: 600,\n textAlign: 'right',\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {value}\n </td>\n </tr>\n ) : null\n )}\n </tbody>\n </table>\n )}\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"view-owner-statement-button\"\n label={data.buttonText?.trim() || 'View statement'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n {renewHref && (\n <div\n style={{\n padding: '20px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '32px',\n }}\n >\n <Text style={{ fontWeight: 600, margin: '0 0 4px' }}>\n Link expired?\n </Text>\n <Text style={{ color: mutedColor, fontSize: 14, margin: 0 }}>\n For your security, this link opens only this statement and works for\n 7 days. After that, request a new one and we'll email it to this\n address.\n </Text>\n <Button\n href={renewHref}\n mode={mode}\n data-testid=\"renew-owner-statement-link-button\"\n label=\"Send me a new link\"\n themeColors={themeColors}\n style={{\n background: '#ffffff',\n border: `1px solid ${themeColors[8]}`,\n color: themeColors[8],\n marginTop: '16px',\n marginBottom: 0,\n }}\n />\n </div>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyTwo) }}\n />\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"OwnerStatementEmailTemplate.js","sourceRoot":"src/","sources":["templates/OwnerStatementEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,IAAoB,EACpB,IAMC,EACgB,EAAE;IACnB,MAAM,kBAAkB,GACtB,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;IAEzE,MAAM,WAAW,GACf,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAE5E,0EAA0E;IAC1E,4EAA4E;IAC5E,4EAA4E;IAC5E,4BAA4B;IAC5B,OAAO;QACL,OAAO,EACL,IAAI,KAAK,KAAK;YACZ,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,wBAAwB,IAAI,CAAC,WAAW,EAAE;QAClE,gBAAgB,EACd,IAAI,KAAK,KAAK;YACZ,CAAC,CAAC,wCAAwC;YAC1C,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,kBAAkB,IAAI,CAAC,WAAW,oBAAoB;QAC9E,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,SAAS,QAAQ,WAAW,IAAI,CAAC,OAAO,mBAAmB,KAAK,wBAAwB,WAAW,sCAAsC;QAClJ,UAAU,EAAE,gBAAgB;QAC5B,OAAO,EAAE,yGAAyG,kBAAkB,MAAM;QAC1I,IAAI,EAAE,IAAI,CAAC,kBAAkB;KAC9B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,SAAS,CAAC;AAC7B,MAAM,WAAW,GAAG,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,IAAI,EACJ,MAAM,EACN,WAAW,EACX,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,KAAK,EACL,eAAe,EACf,SAAS,GAIV,EAAE,EAAE;IACH,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,cAAc,CAAC,IAAI,EAAE;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QAC9B,IAAI,EAAE,KAAK,IAAI,EAAE;QACjB,WAAW,EAAE,OAAO,IAAI,EAAE;KAC3B,CAAC,CAAC;IAEL,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,IAAI,CAAC,OAAO,EACnB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,EACV,eAAe,EAAE,eAAe,aAEhC,KAAC,YAAY,IAAC,OAAO,EAAC,iBAAiB,EAAC,WAAW,EAAE,WAAW,YAC7D,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,+BAA+B,GAC1C,EAEd,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CACtB,KAAC,IAAI,IACH,KAAK,EAAE;oBACL,OAAO,EAAE,WAAW;oBACpB,eAAe,EAAE,SAAS;oBAC1B,UAAU,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE;oBACzC,YAAY,EAAE,KAAK;oBACnB,MAAM,EAAE,UAAU;oBAClB,UAAU,EAAE,UAAU;iBACvB,YAEA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GACd,CACR,EAED;gBACE,6FAA6F;gBAC7F,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GACxD,EAED,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CACrB,gBACE,IAAI,EAAC,cAAc,EACnB,WAAW,EAAE,CAAC,EACd,WAAW,EAAE,CAAC,EACd,KAAK,EAAC,MAAM,EACZ,KAAK,EAAE;oBACL,MAAM,EAAE,aAAa,WAAW,EAAE;oBAClC,YAAY,EAAE,KAAK;oBACnB,cAAc,EAAE,UAAU;oBAC1B,MAAM,EAAE,UAAU;iBACnB,YAED,0BACG;wBACC,CAAC,UAAU,EAAE,OAAO,CAAC;wBACrB,CAAC,WAAW,EAAE,KAAK,CAAC;qBACrB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAC9B,KAAK,CAAC,CAAC,CAAC,CACN,yBACE,aACE,KAAK,EAAE;oCACL,OAAO,EAAE,WAAW;oCACpB,KAAK,EAAE,UAAU;oCACjB,QAAQ,EAAE,EAAE;oCACZ,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM;iCACvD,YAEA,KAAK,GACH,EACL,aACE,KAAK,EAAE;oCACL,OAAO,EAAE,WAAW;oCACpB,QAAQ,EAAE,EAAE;oCACZ,UAAU,EAAE,GAAG;oCACf,SAAS,EAAE,OAAO;oCAClB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM;iCACvD,YAEA,KAAK,GACH,KArBE,KAAK,CAsBT,CACN,CAAC,CAAC,CAAC,IAAI,CACT,GACK,GACF,CACT,EAED,KAAC,MAAM,IACL,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,IAAI,EAAE,IAAI,iBACE,6BAA6B,EACzC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,gBAAgB,EAClD,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAClD,EAED,SAAS,IAAI,CACZ,eACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,eAAe,EAAE,SAAS;oBAC1B,YAAY,EAAE,KAAK;oBACnB,YAAY,EAAE,MAAM;iBACrB,aAED,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,8BAE5C,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,+JAIpD,EACP,KAAC,MAAM,IACL,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,IAAI,iBACE,mCAAmC,EAC/C,KAAK,EAAC,oBAAoB,EAC1B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE;4BACL,UAAU,EAAE,SAAS;4BACrB,MAAM,EAAE,aAAa,WAAW,CAAC,CAAC,CAAC,EAAE;4BACrC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;4BACrB,SAAS,EAAE,MAAM;4BACjB,YAAY,EAAE,CAAC;yBAChB,GACD,IACE,CACP,EAED;gBACE,6FAA6F;gBAC7F,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GACxD,IACa,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Text } from '@react-email/text';\nimport {\n EMAIL_ACTION_LINK_COMPONENT,\n EMAIL_DATE_COMPONENT,\n EMAIL_LISTING_COMPONENT,\n EMAIL_USER_NAME_COMPONENT,\n} from '../extensions';\nimport type {\n ActionEmailData,\n ActionEmailTemplateProps,\n} from '../components/ActionEmailTemplate';\nimport { Button } from '../components/Button';\nimport { EmailContainer } from '../components/EmailContainer';\nimport { EmailHeading } from '../components/EmailHeading';\nimport { parseEmailHtml } from '../components/utils';\n\nexport const getDefaultOwnerStatementEmailData = (\n mode: 'tag' | 'text',\n args: {\n appName: string;\n ownerStatementHref: string;\n listingName: string;\n userName: string;\n month: string;\n }\n): ActionEmailData => {\n const ownerStatementHref =\n mode === 'tag' ? EMAIL_ACTION_LINK_COMPONENT : args.ownerStatementHref;\n\n const listingName =\n mode === 'tag' ? EMAIL_LISTING_COMPONENT : args.listingName;\n const month = mode === 'tag' ? EMAIL_DATE_COMPONENT : args.month;\n const userName = mode === 'tag' ? EMAIL_USER_NAME_COMPONENT : args.userName;\n\n // Owners open the statement by link without a login and viewers log in to\n // the owner portal, so the text names neither. Subject and preview text are\n // plain text without tokens, so a saved template must not keep the editor's\n // sample month and listing.\n return {\n subject:\n mode === 'tag'\n ? 'Your owner statement is ready'\n : `Your ${args.month} owner statement for ${args.listingName}`,\n shortDescription:\n mode === 'tag'\n ? 'Your owner statement is ready to view.'\n : `Your ${args.month} statement for ${args.listingName} is ready to view.`,\n header: 'Your owner statement is ready',\n bodyOne: `<p>Hi ${userName},</p><p>${args.appName} published your ${month} owner statement for ${listingName}. Open it with the button below.</p>`,\n buttonText: 'View statement',\n bodyTwo: `<p style=\"color:#737373;font-size:13px\">If the button doesn't work, copy this link into your browser: ${ownerStatementHref}</p>`,\n href: args.ownerStatementHref,\n };\n};\n\nconst mutedColor = '#737373';\nconst borderColor = '#e5e7eb';\n\nexport const OwnerStatementEmailTemplate = ({\n data,\n tenant,\n themeColors,\n mode,\n user,\n listing,\n month,\n unsubscribeHref,\n renewHref,\n}: ActionEmailTemplateProps & {\n /** Requests a new no-login link once the emailed one has expired. */\n renewHref?: string;\n}) => {\n const parse = (html: string) =>\n parseEmailHtml(html, {\n href: data.href,\n userName: user.firstName || '',\n date: month || '',\n listingName: listing || '',\n });\n\n return (\n <EmailContainer\n title={data.subject}\n shortDescription={data.shortDescription}\n tenant={tenant}\n mode={mode}\n unsubscribeHref={unsubscribeHref}\n >\n <EmailHeading eyebrow=\"Owner statement\" themeColors={themeColors}>\n {data.header?.trim() || 'Your owner statement is ready'}\n </EmailHeading>\n\n {data.banner?.trim() && (\n <Text\n style={{\n padding: '16px 20px',\n backgroundColor: '#f8f9fa',\n borderLeft: `3px solid ${themeColors[8]}`,\n borderRadius: '4px',\n margin: '0 0 32px',\n whiteSpace: 'pre-line',\n }}\n >\n {data.banner.trim()}\n </Text>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyOne) }}\n />\n\n {(listing || month) && (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n width=\"100%\"\n style={{\n border: `1px solid ${borderColor}`,\n borderRadius: '8px',\n borderCollapse: 'separate',\n margin: '24px 0 0',\n }}\n >\n <tbody>\n {[\n ['Property', listing],\n ['Statement', month],\n ].map(([label, value], index) =>\n value ? (\n <tr key={label}>\n <td\n style={{\n padding: '14px 20px',\n color: mutedColor,\n fontSize: 14,\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {label}\n </td>\n <td\n style={{\n padding: '14px 20px',\n fontSize: 14,\n fontWeight: 600,\n textAlign: 'right',\n borderTop: index ? `1px solid ${borderColor}` : 'none',\n }}\n >\n {value}\n </td>\n </tr>\n ) : null\n )}\n </tbody>\n </table>\n )}\n\n <Button\n href={data.href}\n mode={mode}\n data-testid=\"view-owner-statement-button\"\n label={data.buttonText?.trim() || 'View statement'}\n themeColors={themeColors}\n style={{ marginTop: '24px', marginBottom: '32px' }}\n />\n\n {renewHref && (\n <div\n style={{\n padding: '20px',\n backgroundColor: '#f8f9fa',\n borderRadius: '8px',\n marginBottom: '32px',\n }}\n >\n <Text style={{ fontWeight: 600, margin: '0 0 4px' }}>\n Link expired?\n </Text>\n <Text style={{ color: mutedColor, fontSize: 14, margin: 0 }}>\n For your security, this link opens only this statement and works for\n 7 days. After that, request a new one and we'll email it to this\n address.\n </Text>\n <Button\n href={renewHref}\n mode={mode}\n data-testid=\"renew-owner-statement-link-button\"\n label=\"Send me a new link\"\n themeColors={themeColors}\n style={{\n background: '#ffffff',\n border: `1px solid ${themeColors[8]}`,\n color: themeColors[8],\n marginTop: '16px',\n marginBottom: 0,\n }}\n />\n </div>\n )}\n\n <div\n // biome-ignore lint/security/noDangerouslySetInnerHtml: values are escaped by parseEmailHtml\n dangerouslySetInnerHTML={{ __html: parse(data.bodyTwo) }}\n />\n </EmailContainer>\n );\n};\n"]}
@@ -1,15 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Heading } from '@react-email/heading';
3
2
  import { Text } from '@react-email/text';
4
- import { EmailContainer } from '../components';
3
+ import { EmailContainer, EmailHeading } from '../components';
4
+ import { THEME_COLORS } from '../theme';
5
5
  export const TenantDeletionEmailTemplate = ({ tenant, mode, user, }) => {
6
6
  return (_jsxs(EmailContainer, { title: 'Team Account Deletion Notification', shortDescription: "We're reaching out to inform you that your VRPlatform team has been deleted.", tenant: {
7
7
  logo: undefined,
8
- }, mode: mode, children: [_jsx(Heading, { style: {
9
- fontSize: 28,
10
- fontWeight: 600,
11
- marginBottom: '50px',
12
- }, children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), _jsxs(Text, { children: ["We wanted to inform you that the team account \"", tenant.name, "\" has been deleted. This action has resulted in the removal of the following data associated with the team:"] }), _jsxs("ul", { children: [_jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Payments:" }), " All payment records linked to the team have been permanently deleted."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Reservations:" }), " Any reservations made under this team account have been erased."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Owner Statements:" }), " All statements generated for owners within this team are no longer accessible."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Owner Data:" }), " Personal and transactional data of the owners connected to this team have been removed."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Connections:" }), " Any established connections or integrations related to this team have been terminated."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Other Related Data:" }), " All other data associated with this team has been permanently deleted."] }) })] }), _jsx(Text, { children: "If you have any questions or need further assistance, please don't hesitate to reach out." }), _jsxs(Text, { children: ["Best regards,", _jsx("br", {}), "The VRPlatform Team"] })] }));
8
+ }, mode: mode, children: [_jsx(EmailHeading, { eyebrow: "Team deleted", themeColors: THEME_COLORS.vrplatform, children: "Your team was deleted" }), _jsx(Text, { children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), _jsxs(Text, { children: ["We wanted to inform you that the team account \"", tenant.name, "\" has been deleted. This action has resulted in the removal of the following data associated with the team:"] }), _jsxs("ul", { children: [_jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Payments:" }), " All payment records linked to the team have been permanently deleted."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Reservations:" }), " Any reservations made under this team account have been erased."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Owner Statements:" }), " All statements generated for owners within this team are no longer accessible."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Owner Data:" }), " Personal and transactional data of the owners connected to this team have been removed."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Connections:" }), " Any established connections or integrations related to this team have been terminated."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Other Related Data:" }), " All other data associated with this team has been permanently deleted."] }) })] }), _jsx(Text, { children: "If you have any questions or need further assistance, please don't hesitate to reach out." }), _jsxs(Text, { children: ["Best regards,", _jsx("br", {}), "The VRPlatform Team"] })] }));
13
9
  };
14
10
  export const TenantDeletionEmail = (props) => {
15
11
  return _jsx(TenantDeletionEmailTemplate, { ...props });
@@ -1 +1 @@
1
- {"version":3,"file":"TenantDeletionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantDeletionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAS/C,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,MAAM,EACN,IAAI,EACJ,IAAI,GAC6B,EAAE,EAAE;IACrC,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,oCAAoC,EAC3C,gBAAgB,EACd,8EAA8E,EAEhF,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,KAAC,OAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GACjD,EAEV,MAAC,IAAI,mEAC6C,MAAM,CAAC,IAAI,oHAGtD,EACP,yBACE,uBACE,MAAC,IAAI,eACH,oCAAgB,8EAEX,GACJ,EACL,uBACE,MAAC,IAAI,eACH,wCAAoB,wEAEf,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,4CAAwB,uFAEnB,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,sCAAkB,gGAEb,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,uCAAmB,+FAEd,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,8CAA0B,+EAErB,GACJ,IACF,EACL,KAAC,IAAI,4GAGE,EACP,MAAC,IAAI,gCAEH,cAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAuC,EACvC,EAAE;IACF,OAAO,KAAC,2BAA2B,OAAK,KAAK,GAAI,CAAC;AACpD,CAAC,CAAC","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from '../components';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantDeletionEmailTemplateProps = {\n tenant: EmailBaseProps['tenant'];\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n};\n\nexport const TenantDeletionEmailTemplate = ({\n tenant,\n mode,\n user,\n}: TenantDeletionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Team Account Deletion Notification'}\n shortDescription={\n \"We're reaching out to inform you that your VRPlatform team has been deleted.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}\n </Heading>\n\n <Text>\n We wanted to inform you that the team account \"{tenant.name}\" has been\n deleted. This action has resulted in the removal of the following data\n associated with the team:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Payments:</b> All payment records linked to the team have been\n permanently deleted.\n </Text>\n </li>\n <li>\n <Text>\n <b>Reservations:</b> Any reservations made under this team account\n have been erased.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Statements:</b> All statements generated for owners within\n this team are no longer accessible.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Data:</b> Personal and transactional data of the owners\n connected to this team have been removed.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Connections:</b> Any established connections or integrations\n related to this team have been terminated.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Other Related Data:</b> All other data associated with this team\n has been permanently deleted.\n </Text>\n </li>\n </ul>\n <Text>\n If you have any questions or need further assistance, please don't\n hesitate to reach out.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n\nexport const TenantDeletionEmail = (\n props: TenantDeletionEmailTemplateProps\n) => {\n return <TenantDeletionEmailTemplate {...props} />;\n};\n"]}
1
+ {"version":3,"file":"TenantDeletionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantDeletionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AASxC,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,EAC1C,MAAM,EACN,IAAI,EACJ,IAAI,GAC6B,EAAE,EAAE;IACrC,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,oCAAoC,EAC3C,gBAAgB,EACd,8EAA8E,EAEhF,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,KAAC,YAAY,IACX,OAAO,EAAC,cAAc,EACtB,WAAW,EAAE,YAAY,CAAC,UAAU,sCAGvB,EAEf,KAAC,IAAI,cAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GAAQ,EAEvE,MAAC,IAAI,mEAC6C,MAAM,CAAC,IAAI,oHAGtD,EACP,yBACE,uBACE,MAAC,IAAI,eACH,oCAAgB,8EAEX,GACJ,EACL,uBACE,MAAC,IAAI,eACH,wCAAoB,wEAEf,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,4CAAwB,uFAEnB,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,sCAAkB,gGAEb,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,uCAAmB,+FAEd,GACJ,EAEL,uBACE,MAAC,IAAI,eACH,8CAA0B,+EAErB,GACJ,IACF,EACL,KAAC,IAAI,4GAGE,EACP,MAAC,IAAI,gCAEH,cAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAuC,EACvC,EAAE;IACF,OAAO,KAAC,2BAA2B,OAAK,KAAK,GAAI,CAAC;AACpD,CAAC,CAAC","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer, EmailHeading } from '../components';\nimport { THEME_COLORS } from '../theme';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantDeletionEmailTemplateProps = {\n tenant: EmailBaseProps['tenant'];\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n};\n\nexport const TenantDeletionEmailTemplate = ({\n tenant,\n mode,\n user,\n}: TenantDeletionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Team Account Deletion Notification'}\n shortDescription={\n \"We're reaching out to inform you that your VRPlatform team has been deleted.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <EmailHeading\n eyebrow=\"Team deleted\"\n themeColors={THEME_COLORS.vrplatform}\n >\n Your team was deleted\n </EmailHeading>\n\n <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>\n\n <Text>\n We wanted to inform you that the team account \"{tenant.name}\" has been\n deleted. This action has resulted in the removal of the following data\n associated with the team:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Payments:</b> All payment records linked to the team have been\n permanently deleted.\n </Text>\n </li>\n <li>\n <Text>\n <b>Reservations:</b> Any reservations made under this team account\n have been erased.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Statements:</b> All statements generated for owners within\n this team are no longer accessible.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Owner Data:</b> Personal and transactional data of the owners\n connected to this team have been removed.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Connections:</b> Any established connections or integrations\n related to this team have been terminated.\n </Text>\n </li>\n\n <li>\n <Text>\n <b>Other Related Data:</b> All other data associated with this team\n has been permanently deleted.\n </Text>\n </li>\n </ul>\n <Text>\n If you have any questions or need further assistance, please don't\n hesitate to reach out.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n\nexport const TenantDeletionEmail = (\n props: TenantDeletionEmailTemplateProps\n) => {\n return <TenantDeletionEmailTemplate {...props} />;\n};\n"]}
@@ -1,15 +1,11 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Heading } from '@react-email/heading';
3
2
  import { Text } from '@react-email/text';
4
- import { EmailContainer } from '../components';
3
+ import { EmailContainer, EmailHeading } from '../components';
4
+ import { THEME_COLORS } from '../theme';
5
5
  export const TenantSuspensionEmailTemplate = ({ mode, user, tenant, }) => {
6
6
  return (_jsxs(EmailContainer, { title: 'Action Required: Your VRPlatform Account Access', shortDescription: "We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.", tenant: {
7
7
  logo: undefined,
8
- }, mode: mode, children: [_jsx(Heading, { style: {
9
- fontSize: 28,
10
- fontWeight: 600,
11
- marginBottom: '50px',
12
- }, children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), _jsxs(Text, { children: ["We're reaching out to inform you that as of today, access to your team", ' ', _jsx("b", { children: tenant.name }), " has been temporarily suspended. This includes access to features such as accounting automations, owner statements, management commissions and the owner portal (including portal access for all owners)."] }), _jsx(Text, { children: "At VRPlatform, we take the security and functionality of our platform seriously, ensuring that our partners have the best possible experience. This step, though necessary, is intended to be temporary and is part of our commitment to maintain the highest standards of service." }), _jsx(Text, { style: {
8
+ }, mode: mode, children: [_jsx(EmailHeading, { eyebrow: "Team suspended", themeColors: THEME_COLORS.vrplatform, children: "Your team access is suspended" }), _jsx(Text, { children: user.firstName ? `Dear ${user.firstName},` : 'Hi there,' }), _jsxs(Text, { children: ["We're reaching out to inform you that as of today, access to your team", ' ', _jsx("b", { children: tenant.name }), " has been temporarily suspended. This includes access to features such as accounting automations, owner statements, management commissions and the owner portal (including portal access for all owners)."] }), _jsx(Text, { children: "At VRPlatform, we take the security and functionality of our platform seriously, ensuring that our partners have the best possible experience. This step, though necessary, is intended to be temporary and is part of our commitment to maintain the highest standards of service." }), _jsx(Text, { style: {
13
9
  fontWeight: 'bold',
14
10
  }, children: "Next Steps to Regain Access:" }), _jsxs("ul", { children: [_jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Immediate Action:" }), " To adress this and help you regain access to your account, please contact our support team at your earliest convenience. We're here to assist you with the necessary steps to restore your services."] }) }), _jsx("li", { children: _jsxs(Text, { children: [_jsx("b", { children: "Contact Information:" }), " You can reach us by emailing support@vrplatform.app. Our dedicated team is ready to support you in resolving this matter promptly."] }) })] }), _jsx(Text, { children: "Thank you for your prompt attention to this important matter. We value your partnership and are here to support you every step of the way." }), _jsxs(Text, { children: ["Best regards,", _jsx("br", {}), "The VRPlatform Team"] })] }));
15
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TenantSuspensionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantSuspensionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAS/C,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,IAAI,EACJ,MAAM,GAC6B,EAAE,EAAE;IACvC,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,iDAAiD,EACxD,gBAAgB,EACd,sGAAsG,EAExG,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,KAAC,OAAO,IACN,KAAK,EAAE;oBACL,QAAQ,EAAE,EAAE;oBACZ,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM;iBACrB,YAEA,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GACjD,EAEV,MAAC,IAAI,yFACoE,GAAG,EAC1E,sBAAI,MAAM,CAAC,IAAI,GAAK,iNAIf,EACP,KAAC,IAAI,sSAKE,EACP,KAAC,IAAI,IACH,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;iBACnB,6CAGI,EACP,yBACE,uBACE,MAAC,IAAI,eACH,4CAAwB,6MAInB,GACJ,EACL,uBACE,MAAC,IAAI,eACH,+CAA2B,2IAGtB,GACJ,IACF,EACL,KAAC,IAAI,6JAGE,EACP,MAAC,IAAI,gCAEH,cAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Heading } from '@react-email/heading';\nimport { Text } from '@react-email/text';\nimport { EmailContainer } from '../components';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantSuspensionEmailTemplateProps = {\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n tenant: Omit<EmailBaseProps['tenant'], 'logo'>;\n};\n\nexport const TenantSuspensionEmailTemplate = ({\n mode,\n user,\n tenant,\n}: TenantSuspensionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Action Required: Your VRPlatform Account Access'}\n shortDescription={\n \"We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <Heading\n style={{\n fontSize: 28,\n fontWeight: 600,\n marginBottom: '50px',\n }}\n >\n {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}\n </Heading>\n\n <Text>\n We're reaching out to inform you that as of today, access to your team{' '}\n <b>{tenant.name}</b> has been temporarily suspended. This includes\n access to features such as accounting automations, owner statements,\n management commissions and the owner portal (including portal access for\n all owners).\n </Text>\n <Text>\n At VRPlatform, we take the security and functionality of our platform\n seriously, ensuring that our partners have the best possible experience.\n This step, though necessary, is intended to be temporary and is part of\n our commitment to maintain the highest standards of service.\n </Text>\n <Text\n style={{\n fontWeight: 'bold',\n }}\n >\n Next Steps to Regain Access:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Immediate Action:</b> To adress this and help you regain access\n to your account, please contact our support team at your earliest\n convenience. We're here to assist you with the necessary steps to\n restore your services.\n </Text>\n </li>\n <li>\n <Text>\n <b>Contact Information:</b> You can reach us by emailing\n support@vrplatform.app. Our dedicated team is ready to support you\n in resolving this matter promptly.\n </Text>\n </li>\n </ul>\n <Text>\n Thank you for your prompt attention to this important matter. We value\n your partnership and are here to support you every step of the way.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n"]}
1
+ {"version":3,"file":"TenantSuspensionEmailTemplate.js","sourceRoot":"src/","sources":["templates/TenantSuspensionEmailTemplate.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AASxC,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,EAC5C,IAAI,EACJ,IAAI,EACJ,MAAM,GAC6B,EAAE,EAAE;IACvC,OAAO,CACL,MAAC,cAAc,IACb,KAAK,EAAE,iDAAiD,EACxD,gBAAgB,EACd,sGAAsG,EAExG,MAAM,EAAE;YACN,IAAI,EAAE,SAAS;SAChB,EACD,IAAI,EAAE,IAAI,aAEV,KAAC,YAAY,IACX,OAAO,EAAC,gBAAgB,EACxB,WAAW,EAAE,YAAY,CAAC,UAAU,8CAGvB,EAEf,KAAC,IAAI,cAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,WAAW,GAAQ,EAEvE,MAAC,IAAI,yFACoE,GAAG,EAC1E,sBAAI,MAAM,CAAC,IAAI,GAAK,iNAIf,EACP,KAAC,IAAI,sSAKE,EACP,KAAC,IAAI,IACH,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM;iBACnB,6CAGI,EACP,yBACE,uBACE,MAAC,IAAI,eACH,4CAAwB,6MAInB,GACJ,EACL,uBACE,MAAC,IAAI,eACH,+CAA2B,2IAGtB,GACJ,IACF,EACL,KAAC,IAAI,6JAGE,EACP,MAAC,IAAI,gCAEH,cAAM,2BAED,IACQ,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { Text } from '@react-email/text';\nimport { EmailContainer, EmailHeading } from '../components';\nimport { THEME_COLORS } from '../theme';\nimport type { EmailBaseProps } from '../types';\n\nexport type TenantSuspensionEmailTemplateProps = {\n mode: EmailBaseProps['mode'];\n user: EmailBaseProps['user'];\n tenant: Omit<EmailBaseProps['tenant'], 'logo'>;\n};\n\nexport const TenantSuspensionEmailTemplate = ({\n mode,\n user,\n tenant,\n}: TenantSuspensionEmailTemplateProps) => {\n return (\n <EmailContainer\n title={'Action Required: Your VRPlatform Account Access'}\n shortDescription={\n \"We're reaching out to inform you that access to your VRPlatform team has been temporarily suspended.\"\n }\n tenant={{\n logo: undefined,\n }}\n mode={mode}\n >\n <EmailHeading\n eyebrow=\"Team suspended\"\n themeColors={THEME_COLORS.vrplatform}\n >\n Your team access is suspended\n </EmailHeading>\n\n <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>\n\n <Text>\n We're reaching out to inform you that as of today, access to your team{' '}\n <b>{tenant.name}</b> has been temporarily suspended. This includes\n access to features such as accounting automations, owner statements,\n management commissions and the owner portal (including portal access for\n all owners).\n </Text>\n <Text>\n At VRPlatform, we take the security and functionality of our platform\n seriously, ensuring that our partners have the best possible experience.\n This step, though necessary, is intended to be temporary and is part of\n our commitment to maintain the highest standards of service.\n </Text>\n <Text\n style={{\n fontWeight: 'bold',\n }}\n >\n Next Steps to Regain Access:\n </Text>\n <ul>\n <li>\n <Text>\n <b>Immediate Action:</b> To adress this and help you regain access\n to your account, please contact our support team at your earliest\n convenience. We're here to assist you with the necessary steps to\n restore your services.\n </Text>\n </li>\n <li>\n <Text>\n <b>Contact Information:</b> You can reach us by emailing\n support@vrplatform.app. Our dedicated team is ready to support you\n in resolving this matter promptly.\n </Text>\n </li>\n </ul>\n <Text>\n Thank you for your prompt attention to this important matter. We value\n your partnership and are here to support you every step of the way.\n </Text>\n <Text>\n Best regards,\n <br />\n The VRPlatform Team\n </Text>\n </EmailContainer>\n );\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vrplatform/email",
3
- "version": "1.0.2-stage.39899710779",
3
+ "version": "1.0.2-stage.39975977004",
4
4
  "description": "VRTrust transactional email templates and Postmark transport",
5
5
  "license": "ISC",
6
6
  "main": "build/main/index.js",
@@ -1,6 +1,6 @@
1
- import { Heading } from '@react-email/heading';
2
1
  import { Text } from '@react-email/text';
3
2
  import { EmailContainer } from './EmailContainer';
3
+ import { EmailHeading } from './EmailHeading';
4
4
  import type { EmailBaseProps } from '../types';
5
5
  import { parseEmailHtml } from './utils';
6
6
  import { Button } from './Button';
@@ -22,6 +22,7 @@ export interface ActionEmailTemplateProps extends EmailBaseProps {
22
22
 
23
23
  export const ActionEmailTemplate = ({
24
24
  data,
25
+ eyebrow,
25
26
  tenant,
26
27
  themeColors,
27
28
  mode,
@@ -29,7 +30,7 @@ export const ActionEmailTemplate = ({
29
30
  listing,
30
31
  month,
31
32
  unsubscribeHref,
32
- }: ActionEmailTemplateProps) => {
33
+ }: ActionEmailTemplateProps & { eyebrow: string }) => {
33
34
  return (
34
35
  <EmailContainer
35
36
  title={data.subject}
@@ -38,23 +39,19 @@ export const ActionEmailTemplate = ({
38
39
  mode={mode}
39
40
  unsubscribeHref={unsubscribeHref}
40
41
  >
41
- <Heading
42
- style={{
43
- fontSize: 28,
44
- fontWeight: 600,
45
- marginBottom: '50px',
46
- }}
47
- >
42
+ <EmailHeading eyebrow={eyebrow} themeColors={themeColors}>
48
43
  {data.header?.trim() || `Welcome to ${tenant.name}!`}
49
- </Heading>
44
+ </EmailHeading>
50
45
 
51
46
  {data.banner?.trim() && (
52
47
  <Text
53
48
  style={{
54
- padding: '24px',
55
- backgroundColor: '#f2f3f3',
49
+ padding: '16px 20px',
50
+ backgroundColor: '#f8f9fa',
51
+ borderLeft: `3px solid ${themeColors[8]}`,
56
52
  borderRadius: '4px',
57
- marginBottom: '40px',
53
+ margin: '0 0 32px',
54
+ whiteSpace: 'pre-line',
58
55
  }}
59
56
  >
60
57
  {data.banner.trim()}
@@ -79,6 +76,7 @@ export const ActionEmailTemplate = ({
79
76
  data-testid="accept-invite-button"
80
77
  label={data.buttonText?.trim() || 'Accept Invitation'}
81
78
  themeColors={themeColors}
79
+ style={{ marginTop: '24px', marginBottom: '32px' }}
82
80
  />
83
81
 
84
82
  <div
@@ -0,0 +1,36 @@
1
+ import { Heading } from '@react-email/heading';
2
+ import { Text } from '@react-email/text';
3
+ import type { EmailBaseProps } from '../types';
4
+
5
+ type Props = {
6
+ eyebrow: string;
7
+ children: React.ReactNode;
8
+ themeColors: EmailBaseProps['themeColors'];
9
+ };
10
+
11
+ export const EmailHeading = ({ eyebrow, children, themeColors }: Props) => (
12
+ <>
13
+ <Text
14
+ style={{
15
+ color: themeColors[8],
16
+ fontSize: 12,
17
+ fontWeight: 600,
18
+ letterSpacing: '0.08em',
19
+ textTransform: 'uppercase',
20
+ margin: '0 0 8px',
21
+ }}
22
+ >
23
+ {eyebrow}
24
+ </Text>
25
+ <Heading
26
+ style={{
27
+ fontSize: 26,
28
+ fontWeight: 600,
29
+ lineHeight: '34px',
30
+ margin: '0 0 32px',
31
+ }}
32
+ >
33
+ {children}
34
+ </Heading>
35
+ </>
36
+ );
@@ -1,2 +1,3 @@
1
1
  export * from './EmailContainer';
2
2
  export * from './ActionEmailTemplate';
3
+ export * from './EmailHeading';
@@ -35,6 +35,7 @@ export const InviteOwnerEmailTemplate = ({
35
35
  return (
36
36
  <ActionEmailTemplate
37
37
  {...props}
38
+ eyebrow="Owner Portal invitation"
38
39
  data={{
39
40
  ...props.data,
40
41
  // Add guidance at render time so saved custom templates receive it too.
@@ -33,6 +33,7 @@ export const InvitePmEmailTemplate = (props: ActionEmailTemplateProps) => {
33
33
  return (
34
34
  <ActionEmailTemplate
35
35
  {...props}
36
+ eyebrow="Team invitation"
36
37
  data={{
37
38
  ...props.data,
38
39
  // Add guidance at render time so saved custom templates receive it too.
@@ -1,4 +1,3 @@
1
- import { Heading } from '@react-email/heading';
2
1
  import { Text } from '@react-email/text';
3
2
  import {
4
3
  EMAIL_ACTION_LINK_COMPONENT,
@@ -12,6 +11,7 @@ import type {
12
11
  } from '../components/ActionEmailTemplate';
13
12
  import { Button } from '../components/Button';
14
13
  import { EmailContainer } from '../components/EmailContainer';
14
+ import { EmailHeading } from '../components/EmailHeading';
15
15
  import { parseEmailHtml } from '../components/utils';
16
16
 
17
17
  export const getDefaultOwnerStatementEmailData = (
@@ -86,28 +86,9 @@ export const OwnerStatementEmailTemplate = ({
86
86
  mode={mode}
87
87
  unsubscribeHref={unsubscribeHref}
88
88
  >
89
- <Text
90
- style={{
91
- color: themeColors[8],
92
- fontSize: 12,
93
- fontWeight: 600,
94
- letterSpacing: '0.08em',
95
- textTransform: 'uppercase',
96
- margin: '0 0 8px',
97
- }}
98
- >
99
- Owner statement
100
- </Text>
101
- <Heading
102
- style={{
103
- fontSize: 26,
104
- fontWeight: 600,
105
- lineHeight: '34px',
106
- margin: '0 0 32px',
107
- }}
108
- >
89
+ <EmailHeading eyebrow="Owner statement" themeColors={themeColors}>
109
90
  {data.header?.trim() || 'Your owner statement is ready'}
110
- </Heading>
91
+ </EmailHeading>
111
92
 
112
93
  {data.banner?.trim() && (
113
94
  <Text
@@ -1,6 +1,6 @@
1
- import { Heading } from '@react-email/heading';
2
1
  import { Text } from '@react-email/text';
3
- import { EmailContainer } from '../components';
2
+ import { EmailContainer, EmailHeading } from '../components';
3
+ import { THEME_COLORS } from '../theme';
4
4
  import type { EmailBaseProps } from '../types';
5
5
 
6
6
  export type TenantDeletionEmailTemplateProps = {
@@ -25,15 +25,14 @@ export const TenantDeletionEmailTemplate = ({
25
25
  }}
26
26
  mode={mode}
27
27
  >
28
- <Heading
29
- style={{
30
- fontSize: 28,
31
- fontWeight: 600,
32
- marginBottom: '50px',
33
- }}
28
+ <EmailHeading
29
+ eyebrow="Team deleted"
30
+ themeColors={THEME_COLORS.vrplatform}
34
31
  >
35
- {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}
36
- </Heading>
32
+ Your team was deleted
33
+ </EmailHeading>
34
+
35
+ <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>
37
36
 
38
37
  <Text>
39
38
  We wanted to inform you that the team account "{tenant.name}" has been
@@ -1,6 +1,6 @@
1
- import { Heading } from '@react-email/heading';
2
1
  import { Text } from '@react-email/text';
3
- import { EmailContainer } from '../components';
2
+ import { EmailContainer, EmailHeading } from '../components';
3
+ import { THEME_COLORS } from '../theme';
4
4
  import type { EmailBaseProps } from '../types';
5
5
 
6
6
  export type TenantSuspensionEmailTemplateProps = {
@@ -25,15 +25,14 @@ export const TenantSuspensionEmailTemplate = ({
25
25
  }}
26
26
  mode={mode}
27
27
  >
28
- <Heading
29
- style={{
30
- fontSize: 28,
31
- fontWeight: 600,
32
- marginBottom: '50px',
33
- }}
28
+ <EmailHeading
29
+ eyebrow="Team suspended"
30
+ themeColors={THEME_COLORS.vrplatform}
34
31
  >
35
- {user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}
36
- </Heading>
32
+ Your team access is suspended
33
+ </EmailHeading>
34
+
35
+ <Text>{user.firstName ? `Dear ${user.firstName},` : 'Hi there,'}</Text>
37
36
 
38
37
  <Text>
39
38
  We're reaching out to inform you that as of today, access to your team{' '}