@hintoric/email 0.1.1 → 0.1.2

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.
package/dist/index.d.ts CHANGED
@@ -21,4 +21,5 @@ export { Chip } from './components/Chip';
21
21
  export type { ChipProps } from './components/Chip';
22
22
  export { HintoricLogo } from './components/HintoricLogo';
23
23
  export * from './templates/SecurityActivityAlert';
24
+ export * from './templates/WaitlistWelcome';
24
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,cAAc,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EACV,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,GACd,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC7G,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,cAAc,mCAAmC,CAAC;AAClD,cAAc,6BAA6B,CAAC"}
package/dist/index.js CHANGED
@@ -368,14 +368,14 @@ var A = {
368
368
  "body-md": "p",
369
369
  "body-sm": "p",
370
370
  "body-xs": "span"
371
- }, M = {
371
+ }, ee = {
372
372
  primary: "inkPrimary",
373
373
  secondary: "inkSecondary",
374
374
  tertiary: "inkTertiary",
375
375
  icon: "inkIcon"
376
376
  };
377
- function N({ level: e = "body-md", component: t, textAlign: n, textColor: r, style: i, children: a }) {
378
- let o = A[e], s = r ? M[r] : o.ink, c = t ?? j[e];
377
+ function M({ level: e = "body-md", component: t, textAlign: n, textColor: r, style: i, children: a }) {
378
+ let o = A[e], s = r ? ee[r] : o.ink, c = t ?? j[e];
379
379
  return /* @__PURE__ */ u(c, {
380
380
  className: w[s],
381
381
  style: {
@@ -394,7 +394,7 @@ function N({ level: e = "body-md", component: t, textAlign: n, textColor: r, sty
394
394
  }
395
395
  //#endregion
396
396
  //#region src/components/Button.tsx
397
- var P = {
397
+ var N = {
398
398
  sm: {
399
399
  minHeight: 32,
400
400
  paddingInline: 12,
@@ -414,10 +414,10 @@ var P = {
414
414
  lineHeight: 24
415
415
  }
416
416
  };
417
- function F({ href: e, variant: t = "solid", color: r = "primary", size: i = "md", pill: a = !1, fullWidth: o = !1, style: s, children: c }) {
417
+ function P({ href: e, variant: t = "solid", color: r = "primary", size: i = "md", pill: a = !1, fullWidth: o = !1, style: s, children: c }) {
418
418
  let l = S(e);
419
419
  if (!l || l.startsWith("mailto:")) return null;
420
- let d = P[i], f = g("light", t, r), p = +(t === "outlined"), m = (d.minHeight - d.lineHeight) / 2 - p;
420
+ let d = N[i], f = g("light", t, r), p = +(t === "outlined"), m = (d.minHeight - d.lineHeight) / 2 - p;
421
421
  return /* @__PURE__ */ u(n, {
422
422
  href: l,
423
423
  className: w.variant(t, r),
@@ -452,7 +452,7 @@ function F({ href: e, variant: t = "solid", color: r = "primary", size: i = "md"
452
452
  }
453
453
  //#endregion
454
454
  //#region src/components/Link.tsx
455
- function I({ href: e, color: t = "primary", underline: n = "always", style: r, children: i }) {
455
+ function F({ href: e, color: t = "primary", underline: n = "always", style: r, children: i }) {
456
456
  let a = S(e);
457
457
  return a ? /* @__PURE__ */ u(s, {
458
458
  href: a,
@@ -469,7 +469,7 @@ function I({ href: e, color: t = "primary", underline: n = "always", style: r, c
469
469
  }
470
470
  //#endregion
471
471
  //#region src/components/Divider.tsx
472
- function L({ style: e }) {
472
+ function I({ style: e }) {
473
473
  let t = v.light;
474
474
  return /* @__PURE__ */ u("div", {
475
475
  role: "separator",
@@ -489,7 +489,7 @@ function L({ style: e }) {
489
489
  }
490
490
  //#endregion
491
491
  //#region src/components/Card.tsx
492
- function R({ variant: e = "outlined", color: t = "neutral", style: n, children: r }) {
492
+ function L({ variant: e = "outlined", color: t = "neutral", style: n, children: r }) {
493
493
  let i = g("light", e, t), a = i.backgroundColor !== void 0;
494
494
  return /* @__PURE__ */ u("table", {
495
495
  role: "presentation",
@@ -515,7 +515,7 @@ function R({ variant: e = "outlined", color: t = "neutral", style: n, children:
515
515
  }
516
516
  //#endregion
517
517
  //#region src/components/Avatar.tsx
518
- var z = {
518
+ var te = {
519
519
  sm: {
520
520
  box: 32,
521
521
  fontSize: "14px",
@@ -532,8 +532,8 @@ var z = {
532
532
  fontWeight: 600
533
533
  }
534
534
  };
535
- function B({ variant: e = "soft", color: t = "neutral", size: n = "md", src: r, alt: i = "", children: a }) {
536
- let s = z[n], c = C(r);
535
+ function R({ variant: e = "soft", color: t = "neutral", size: n = "md", src: r, alt: i = "", children: a }) {
536
+ let s = te[n], c = C(r);
537
537
  if (c) return /* @__PURE__ */ u(o, {
538
538
  src: c,
539
539
  width: s.box,
@@ -581,7 +581,7 @@ function B({ variant: e = "soft", color: t = "neutral", size: n = "md", src: r,
581
581
  }
582
582
  //#endregion
583
583
  //#region src/components/Chip.tsx
584
- var V = {
584
+ var z = {
585
585
  sm: {
586
586
  minHeight: 20,
587
587
  paddingInline: 6,
@@ -598,8 +598,8 @@ var V = {
598
598
  fontSize: 16
599
599
  }
600
600
  };
601
- function H({ variant: e = "soft", color: t = "neutral", size: n = "md", style: r, children: i }) {
602
- let a = V[n], o = g("light", e, t), s = o.backgroundColor !== void 0, c = +!!o.borderColor, l = a.fontSize * 1.5, d = (a.minHeight - l) / 2 - c;
601
+ function B({ variant: e = "soft", color: t = "neutral", size: n = "md", style: r, children: i }) {
602
+ let a = z[n], o = g("light", e, t), s = o.backgroundColor !== void 0, c = +!!o.borderColor, l = a.fontSize * 1.5, d = (a.minHeight - l) / 2 - c;
603
603
  return /* @__PURE__ */ u("span", {
604
604
  className: [w.variant(e, t), s ? "" : w.surface].filter(Boolean).join(" "),
605
605
  style: {
@@ -623,17 +623,17 @@ function H({ variant: e = "soft", color: t = "neutral", size: n = "md", style: r
623
623
  }
624
624
  //#endregion
625
625
  //#region src/components/HintoricLogo.tsx
626
- var U = {
626
+ var V = {
627
627
  light: "https://cdn.hintoric.com/assets/logo/black.png",
628
628
  dark: "https://cdn.hintoric.com/assets/logo/white.png",
629
629
  width: 104,
630
630
  height: 32
631
631
  };
632
- function W() {
632
+ function H() {
633
633
  return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u(o, {
634
- src: U.light,
635
- width: U.width,
636
- height: U.height,
634
+ src: V.light,
635
+ width: V.width,
636
+ height: V.height,
637
637
  alt: "hintoric",
638
638
  className: w.logoLight,
639
639
  style: {
@@ -641,9 +641,9 @@ function W() {
641
641
  margin: "0 auto"
642
642
  }
643
643
  }), /* @__PURE__ */ u(o, {
644
- src: U.dark,
645
- width: U.width,
646
- height: U.height,
644
+ src: V.dark,
645
+ width: V.width,
646
+ height: V.height,
647
647
  alt: "hintoric",
648
648
  className: w.logoDark,
649
649
  style: {
@@ -654,27 +654,27 @@ function W() {
654
654
  }
655
655
  //#endregion
656
656
  //#region src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx
657
- function G(e) {
657
+ function U(e) {
658
658
  return {
659
659
  activity: e.activity,
660
660
  target: e.target,
661
- targetName: K(e),
661
+ targetName: W(e),
662
662
  occurredAt: e.messages.formatDateTime(e.activity.occurredAt, e.timeZone)
663
663
  };
664
664
  }
665
- function K({ target: e }) {
665
+ function W({ target: e }) {
666
666
  return e.type === "workspace" ? e.workspaceName : e.email;
667
667
  }
668
- function q(e) {
669
- return e.split(/\s+/).filter(Boolean).slice(0, 2).map((e) => e[0].toUpperCase()).join("");
668
+ function G(e) {
669
+ return e.split(/\s+/).map((e) => e.match(/\p{L}/u)?.[0]).filter((e) => e !== void 0).slice(0, 2).map((e) => e.toUpperCase()).join("");
670
670
  }
671
- function J(e) {
672
- let { messages: t } = e, n = G(e);
671
+ function K(e) {
672
+ let { messages: t } = e, n = U(e);
673
673
  return /* @__PURE__ */ u(O, {
674
674
  lang: t.lang,
675
675
  preview: t.preview(n),
676
676
  colorScheme: e.colorScheme,
677
- footer: /* @__PURE__ */ d(N, {
677
+ footer: /* @__PURE__ */ d(M, {
678
678
  level: "body-xs",
679
679
  component: "p",
680
680
  textAlign: "center",
@@ -682,17 +682,17 @@ function J(e) {
682
682
  style: { fontWeight: 400 },
683
683
  children: [t.footer(n), e.legalNotice && /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("br", {}), e.legalNotice] })]
684
684
  }),
685
- children: /* @__PURE__ */ u(Y, { ...e })
685
+ children: /* @__PURE__ */ u(q, { ...e })
686
686
  });
687
687
  }
688
- function Y(e) {
689
- let { messages: t, activityLogUrl: n } = e, r = G(e);
688
+ function q(e) {
689
+ let { messages: t, activityLogUrl: n } = e, r = U(e);
690
690
  return /* @__PURE__ */ d(l, { children: [
691
691
  /* @__PURE__ */ d("div", {
692
692
  style: { textAlign: "center" },
693
693
  children: [
694
- /* @__PURE__ */ u(W, {}),
695
- /* @__PURE__ */ u(N, {
694
+ /* @__PURE__ */ u(H, {}),
695
+ /* @__PURE__ */ u(M, {
696
696
  level: "h3",
697
697
  component: "h1",
698
698
  style: {
@@ -701,12 +701,12 @@ function Y(e) {
701
701
  },
702
702
  children: e.activity.title
703
703
  }),
704
- /* @__PURE__ */ u(B, {
704
+ /* @__PURE__ */ u(R, {
705
705
  size: "sm",
706
706
  color: "primary",
707
- children: q(r.targetName)
707
+ children: G(r.targetName)
708
708
  }),
709
- /* @__PURE__ */ u(N, {
709
+ /* @__PURE__ */ u(M, {
710
710
  level: "title-sm",
711
711
  component: "span",
712
712
  style: {
@@ -717,8 +717,8 @@ function Y(e) {
717
717
  })
718
718
  ]
719
719
  }),
720
- /* @__PURE__ */ u(L, { style: { margin: "32px 0" } }),
721
- /* @__PURE__ */ d(N, {
720
+ /* @__PURE__ */ u(I, { style: { margin: "32px 0" } }),
721
+ /* @__PURE__ */ d(M, {
722
722
  level: "body-sm",
723
723
  style: { marginBottom: "24px" },
724
724
  children: [
@@ -727,13 +727,13 @@ function Y(e) {
727
727
  t.guidance(r)
728
728
  ]
729
729
  }),
730
- /* @__PURE__ */ u(F, {
730
+ /* @__PURE__ */ u(P, {
731
731
  href: e.reviewUrl,
732
732
  size: "lg",
733
733
  fullWidth: !0,
734
734
  children: t.reviewButton
735
735
  }),
736
- n && /* @__PURE__ */ u(N, {
736
+ n && /* @__PURE__ */ u(M, {
737
737
  level: "body-xs",
738
738
  component: "p",
739
739
  textAlign: "center",
@@ -741,7 +741,7 @@ function Y(e) {
741
741
  marginTop: "24px",
742
742
  fontWeight: 400
743
743
  },
744
- children: t.activityLogHint((e) => /* @__PURE__ */ u(I, {
744
+ children: t.activityLogHint((e) => /* @__PURE__ */ u(F, {
745
745
  href: n,
746
746
  underline: "none",
747
747
  children: e
@@ -749,24 +749,24 @@ function Y(e) {
749
749
  })
750
750
  ] });
751
751
  }
752
- async function X(e) {
753
- let { html: t, text: n } = await f(/* @__PURE__ */ u(J, { ...e }));
752
+ async function J(e) {
753
+ let { html: t, text: n } = await f(/* @__PURE__ */ u(K, { ...e }));
754
754
  return {
755
- subject: e.messages.subject(G(e)),
755
+ subject: e.messages.subject(U(e)),
756
756
  html: t,
757
757
  text: n
758
758
  };
759
759
  }
760
760
  //#endregion
761
761
  //#region src/templates/SecurityActivityAlert/messages.tsx
762
- function Z(e) {
762
+ function Y(e) {
763
763
  return (t, n) => new Intl.DateTimeFormat(e, {
764
764
  dateStyle: "long",
765
765
  timeStyle: "short",
766
766
  timeZone: n
767
767
  }).format(t);
768
768
  }
769
- var Q = {
769
+ var X = {
770
770
  lang: "de",
771
771
  subject: ({ activity: e, targetName: t }) => `${e.title} – ${t}`,
772
772
  preview: ({ activity: e, occurredAt: t }) => `${e.actorName} · ${t}`,
@@ -779,8 +779,8 @@ var Q = {
779
779
  "."
780
780
  ] }),
781
781
  footer: ({ target: e }) => e.type === "workspace" ? "Wir haben dir diese E-Mail gesendet, um dich als Administrator über wichtige Änderungen in deinem Workspace zu informieren." : "Wir haben dir diese E-Mail gesendet, um dich über wichtige Änderungen an deinem hintoric-Konto zu informieren.",
782
- formatDateTime: Z("de-DE")
783
- }, $ = {
782
+ formatDateTime: Y("de-DE")
783
+ }, Z = {
784
784
  lang: "en",
785
785
  subject: ({ activity: e, targetName: t }) => `${e.title} – ${t}`,
786
786
  preview: ({ activity: e, occurredAt: t }) => `${e.actorName} · ${t}`,
@@ -793,9 +793,116 @@ var Q = {
793
793
  "."
794
794
  ] }),
795
795
  footer: ({ target: e }) => e.type === "workspace" ? "We sent you this email to let you know, as an admin, about important changes in your workspace." : "We sent you this email to let you know about important changes to your hintoric account.",
796
- formatDateTime: Z("en-GB")
796
+ formatDateTime: Y("en-GB")
797
+ };
798
+ //#endregion
799
+ //#region src/templates/WaitlistWelcome/WaitlistWelcomeEmail.tsx
800
+ function Q(e) {
801
+ let { messages: t } = e;
802
+ return /* @__PURE__ */ u(O, {
803
+ lang: t.lang,
804
+ preview: t.preview,
805
+ colorScheme: e.colorScheme,
806
+ footer: /* @__PURE__ */ d(M, {
807
+ level: "body-xs",
808
+ component: "p",
809
+ textAlign: "center",
810
+ textColor: "icon",
811
+ style: { fontWeight: 400 },
812
+ children: [t.footer, e.legalNotice && /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("br", {}), e.legalNotice] })]
813
+ }),
814
+ children: /* @__PURE__ */ u($, { ...e })
815
+ });
816
+ }
817
+ function $({ messages: e, websiteUrl: t }) {
818
+ return /* @__PURE__ */ d("div", {
819
+ style: { textAlign: "center" },
820
+ children: [
821
+ /* @__PURE__ */ u(H, {}),
822
+ /* @__PURE__ */ u(M, {
823
+ level: "body-xs",
824
+ component: "p",
825
+ textAlign: "center",
826
+ textColor: "icon",
827
+ style: {
828
+ margin: "24px 0 8px",
829
+ fontWeight: 400
830
+ },
831
+ children: e.eyebrow
832
+ }),
833
+ /* @__PURE__ */ u(M, {
834
+ level: "h3",
835
+ component: "h1",
836
+ style: {
837
+ margin: "0 0 16px",
838
+ fontFamily: y.heading
839
+ },
840
+ children: e.heading
841
+ }),
842
+ /* @__PURE__ */ u(M, {
843
+ level: "body-sm",
844
+ style: { marginBottom: "12px" },
845
+ children: e.body1
846
+ }),
847
+ /* @__PURE__ */ u(M, {
848
+ level: "body-sm",
849
+ style: { marginBottom: "24px" },
850
+ children: e.body2
851
+ }),
852
+ /* @__PURE__ */ u(P, {
853
+ href: t,
854
+ size: "lg",
855
+ fullWidth: !0,
856
+ children: e.cta
857
+ }),
858
+ /* @__PURE__ */ u(M, {
859
+ level: "body-xs",
860
+ component: "p",
861
+ textAlign: "center",
862
+ textColor: "icon",
863
+ style: {
864
+ margin: "24px 0 0",
865
+ fontWeight: 400
866
+ },
867
+ children: e.signoff
868
+ })
869
+ ]
870
+ });
871
+ }
872
+ async function ne(e) {
873
+ let { html: t, text: n } = await f(/* @__PURE__ */ u(Q, { ...e }));
874
+ return {
875
+ subject: e.messages.subject,
876
+ html: t,
877
+ text: n
878
+ };
879
+ }
880
+ //#endregion
881
+ //#region src/templates/WaitlistWelcome/messages.ts
882
+ var re = {
883
+ lang: "de",
884
+ subject: "Du bist auf der Hintoric-Warteliste",
885
+ preview: "Willkommen an Bord — Hintoric",
886
+ eyebrow: "Danke, dass du dabei bist",
887
+ heading: "Willkommen bei Hintoric",
888
+ body1: "Alles erledigt. Sobald dein Platz frei wird, melden wir uns sofort — du bist einer der Ersten, die Hintoric ausprobieren dürfen.",
889
+ body2: "Bis dahin halten wir dich auf dem Laufenden. Wenn jemand aus deinem Umfeld auch dazugehören sollte, leite diese Mail gerne weiter.",
890
+ cta: "Zu hintoric.com",
891
+ signoff: "— Dein Hintoric-Team",
892
+ footer: "Wir haben dir diese E-Mail gesendet, weil du dich für die Hintoric-Warteliste eingetragen hast."
893
+ }, ie = {
894
+ lang: "en",
895
+ subject: "You're on the Hintoric waitlist",
896
+ preview: "Welcome aboard — Hintoric",
897
+ eyebrow: "Thanks for joining",
898
+ heading: "Welcome to Hintoric",
899
+ body1: "You're all set. As soon as your spot opens up we'll let you know — you'll be one of the first to try Hintoric.",
900
+ body2: "Until then we'll keep you posted. If someone you know should be on the list too, feel free to forward this email.",
901
+ cta: "Go to hintoric.com",
902
+ signoff: "— Your Hintoric team",
903
+ footer: "We sent you this email because you signed up for the Hintoric waitlist."
797
904
  };
798
905
  //#endregion
799
- export { B as Avatar, F as Button, R as Card, H as Chip, k as ColorSchemeStyles, L as Divider, m as EMAIL_COLORS, h as EMAIL_VARIANTS, W as HintoricLogo, O as Layout, I as Link, Y as SecurityActivityAlertContent, J as SecurityActivityAlertEmail, N as Typography, y as emailFonts, p as emailPalette, b as emailRadius, v as emailSchemes, _ as mainColor, f as renderEmail, X as renderSecurityActivityAlert, S as safeHref, C as safeImageSrc, Q as securityActivityAlertMessagesDe, $ as securityActivityAlertMessagesEn, g as variantTokens };
906
+ export { R as Avatar, P as Button, L as Card, B as Chip, k as ColorSchemeStyles, I as Divider, m as EMAIL_COLORS, h as EMAIL_VARIANTS, H as HintoricLogo, O as Layout, F as Link, q as SecurityActivityAlertContent, K as SecurityActivityAlertEmail, M as Typography, $ as WaitlistWelcomeContent, Q as WaitlistWelcomeEmail, y as emailFonts, p as emailPalette, b as emailRadius, v as emailSchemes, _ as mainColor, f as renderEmail, J as renderSecurityActivityAlert, ne as renderWaitlistWelcome, S as safeHref, C as safeImageSrc, X as securityActivityAlertMessagesDe, Z as securityActivityAlertMessagesEn, g as variantTokens, re as waitlistWelcomeMessagesDe, ie as waitlistWelcomeMessagesEn };
800
907
 
801
908
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/render.ts","../src/tokens.ts","../src/safeUrl.ts","../src/styles.ts","../src/components/Layout.tsx","../src/components/Typography.tsx","../src/components/Button.tsx","../src/components/Link.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Avatar.tsx","../src/components/Chip.tsx","../src/components/HintoricLogo.tsx","../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx","../src/templates/SecurityActivityAlert/messages.tsx"],"sourcesContent":["import type * as React from 'react';\nimport { render } from '@react-email/render';\n\nexport interface RenderedEmailBody {\n html: string;\n /** The plain-text part. Multipart mails without one score worse with spam filters. */\n text: string;\n}\n\n/** Renders an email element — normally a `<Layout>` — to HTML and plain text. */\nexport async function renderEmail(element: React.ReactElement): Promise<RenderedEmailBody> {\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { html, text };\n}\n","/*\n * The email module's copy of theme.css, resolved to literal values.\n *\n * Email clients cannot use the component library's styling: Gmail, Outlook\n * and Apple Mail resolve neither CSS custom properties nor Tailwind classes,\n * and Gmail drops <style> blocks in some contexts. So every email component\n * paints with inline `style` values taken from here, and the dark scheme is a\n * progressive enhancement layered on top (see styles.ts).\n *\n * The raw stops are theme.css's; the per-variant mapping below is the same\n * formula theme.css spells out token by token (Joy's createLight/DarkMode\n * VariantVariables, with neutral's -700 plain/outlined override in light).\n * The parity tests in src/visual/email/*.visual.test.tsx compare every email\n * component against its web counterpart in both schemes, so a drift between\n * the two shows up as a failing computed-style assertion.\n */\n\nexport type EmailColor = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\nexport type EmailVariant = 'solid' | 'soft' | 'outlined' | 'plain';\nexport type EmailScheme = 'light' | 'dark';\n\ntype Stop = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport const emailPalette: Record<EmailColor, Record<Stop, string>> = {\n neutral: { 50: '#FBFCFE', 100: '#F0F4F8', 200: '#DDE7EE', 300: '#CDD7E1', 400: '#9FA6AD', 500: '#636B74', 600: '#555E68', 700: '#32383E', 800: '#171A1C', 900: '#0B0D0E' },\n primary: { 50: '#EDF5FD', 100: '#E3EFFB', 200: '#C7DFF7', 300: '#97C3F0', 400: '#4393E4', 500: '#0B6BCB', 600: '#185EA5', 700: '#12467B', 800: '#0A2744', 900: '#051423' },\n warning: { 50: '#FEFAF6', 100: '#FDF0E1', 200: '#FCE1C2', 300: '#F3C896', 400: '#EA9A3E', 500: '#9A5B13', 600: '#72430D', 700: '#492B08', 800: '#2E1B05', 900: '#1D1002' },\n danger: { 50: '#FEF6F6', 100: '#FCE4E4', 200: '#F7C5C5', 300: '#F09898', 400: '#E47474', 500: '#C41C1C', 600: '#A51818', 700: '#7D1212', 800: '#430A0A', 900: '#240505' },\n success: { 50: '#F6FEF6', 100: '#E3FBE3', 200: '#C7F7C7', 300: '#A1E8A1', 400: '#51BC51', 500: '#1F7A1F', 600: '#136C13', 700: '#0A470A', 800: '#042F04', 900: '#021D02' },\n};\n\nexport const EMAIL_COLORS: EmailColor[] = ['primary', 'neutral', 'danger', 'success', 'warning'];\nexport const EMAIL_VARIANTS: EmailVariant[] = ['solid', 'soft', 'outlined', 'plain'];\n\n/** What one variant × colour paints. `undefined` means \"leaves it to the surroundings\". */\nexport interface EmailVariantTokens {\n color: string;\n backgroundColor?: string;\n borderColor?: string;\n}\n\nexport function variantTokens(scheme: EmailScheme, variant: EmailVariant, color: EmailColor): EmailVariantTokens {\n const c = emailPalette[color];\n const dark = scheme === 'dark';\n switch (variant) {\n case 'solid':\n return { color: '#FFFFFF', backgroundColor: c[500] };\n case 'soft':\n return dark ? { color: c[200], backgroundColor: c[800] } : { color: c[700], backgroundColor: c[100] };\n case 'outlined':\n return dark\n ? { color: c[200], borderColor: c[700] }\n : { color: color === 'neutral' ? c[700] : c[500], borderColor: c[300] };\n case 'plain':\n return { color: dark ? c[300] : color === 'neutral' ? c[700] : c[500] };\n }\n}\n\n/** `--color-*-main`: step 500 in light, 400 in dark. What Link renders. */\nexport function mainColor(scheme: EmailScheme, color: EmailColor): string {\n return emailPalette[color][scheme === 'dark' ? 400 : 500];\n}\n\nexport interface EmailSchemeTokens {\n inkPrimary: string;\n inkSecondary: string;\n inkTertiary: string;\n /** `--color-ink-icon`: the faintest ink. */\n inkIcon: string;\n /** `--color-surface`: what a Sheet / Card paints under outlined and plain. */\n surface: string;\n /** `--color-surface-1`. */\n surface1: string;\n /**\n * `--color-divider`. Kept as the rgba() theme.css uses so it composites the\n * same way over any surface; Outlook's Word engine drops rgba(), which is\n * why Divider also sets a solid `dividerFallback`.\n */\n divider: string;\n /** `divider` flattened onto `surface`. */\n dividerFallback: string;\n}\n\nexport const emailSchemes: Record<EmailScheme, EmailSchemeTokens> = {\n light: {\n inkPrimary: emailPalette.neutral[800],\n inkSecondary: emailPalette.neutral[700],\n inkTertiary: emailPalette.neutral[600],\n inkIcon: emailPalette.neutral[500],\n surface: emailPalette.neutral[50],\n surface1: emailPalette.neutral[100],\n divider: 'rgba(99, 107, 116, 0.2)',\n dividerFallback: '#DCDFE2',\n },\n dark: {\n inkPrimary: emailPalette.neutral[100],\n inkSecondary: emailPalette.neutral[300],\n inkTertiary: emailPalette.neutral[400],\n inkIcon: emailPalette.neutral[400],\n surface: emailPalette.neutral[900],\n surface1: emailPalette.neutral[800],\n divider: 'rgba(159, 166, 173, 0.16)',\n dividerFallback: '#232628',\n },\n};\n\nexport const emailFonts = {\n // `--font-body`.\n body: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n // core's `--font-heading`. Only clients with the font installed or web-font\n // support (Apple Mail) show Montserrat; the rest fall back to the body stack.\n heading: \"Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n};\n\n/** theme.css's radius scale. */\nexport const emailRadius = { xs: '2px', sm: '6px', md: '8px', lg: '12px', xl: '16px' };\n","/*\n * Every link in an email is a link someone may click without a second look —\n * a security alert's \"review this activity\" button most of all. React escapes\n * text but not the scheme of an href, so a `javascript:` or `data:` URL that\n * reached a template through data would survive rendering intact. Only these\n * schemes are let through; anything else renders as plain, unlinked text.\n */\nconst LINK_PROTOCOLS = new Set(['https:', 'http:', 'mailto:']);\n\nexport function safeHref(href: string | undefined | null): string | undefined {\n if (!href) return undefined;\n try {\n const url = new URL(href);\n return LINK_PROTOCOLS.has(url.protocol) ? url.href : undefined;\n } catch {\n // Relative URLs are meaningless in an email: there is no base to resolve\n // them against once the message leaves the server.\n return undefined;\n }\n}\n\n/** Images additionally have to be https: mail clients block or warn on http. */\nexport function safeImageSrc(src: string | undefined | null): string | undefined {\n if (!src) return undefined;\n try {\n const url = new URL(src);\n return url.protocol === 'https:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import {\n EMAIL_COLORS,\n EMAIL_VARIANTS,\n emailSchemes,\n mainColor,\n variantTokens,\n type EmailColor,\n type EmailVariant,\n} from './tokens';\n\n/*\n * Inline styles carry the light scheme, so an email always renders correctly\n * even where <style> is stripped. Dark mode is a progressive enhancement: each\n * painted element also carries a class from here, and the stylesheet below\n * overrides it — `!important` because it has to beat the inline value.\n *\n * Two triggers, deliberately:\n * - `prefers-color-scheme: dark`, which Apple Mail, iOS Mail, Outlook for\n * Mac and Thunderbird honour. Guarded by `:not([data-color-scheme=\"light\"])`\n * so a preview forced to light stays light on a dark OS.\n * - `[data-color-scheme=\"dark\"]` on any ancestor — the same switch the\n * component library uses, so an email component rendered inside the docs\n * or a visual test follows the page's scheme.\n *\n * Gmail and Outlook.com ignore both and apply their own colour inversion,\n * which is out of any template's control.\n */\nexport const emailClass = {\n variant: (variant: EmailVariant, color: EmailColor) => `hx-${variant}-${color}`,\n main: (color: EmailColor) => `hx-main-${color}`,\n inkPrimary: 'hx-ink-1',\n inkSecondary: 'hx-ink-2',\n inkTertiary: 'hx-ink-3',\n inkIcon: 'hx-ink-icon',\n surface: 'hx-surface',\n divider: 'hx-divider',\n // Layout's AuthScreen shell: page and card swap surfaces in dark.\n layoutCanvas: 'hx-layout-canvas',\n layoutCard: 'hx-layout-card',\n // The card's inner area, which carries its padding. A div of our own rather\n // than react-email's cell: Container moves its `padding` onto an inner <td>,\n // so a rule on the card itself added to it instead of replacing it.\n layoutCardBody: 'hx-layout-card-body',\n // A logo pair: the light one shows by default, the dark one only once the\n // dark rules apply — clients without <style> support keep the light logo.\n logoLight: 'hx-logo-light',\n logoDark: 'hx-logo-dark',\n} as const;\n\nfunction darkRules(scope: string): string {\n const t = emailSchemes.dark;\n const rule = (selector: string, body: string) => `${scope} .${selector}{${body}}`;\n const rules = [\n rule(emailClass.inkPrimary, `color:${t.inkPrimary}!important;`),\n rule(emailClass.inkSecondary, `color:${t.inkSecondary}!important;`),\n rule(emailClass.inkTertiary, `color:${t.inkTertiary}!important;`),\n rule(emailClass.inkIcon, `color:${t.inkIcon}!important;`),\n rule(emailClass.surface, `background-color:${t.surface}!important;`),\n rule(emailClass.divider, `background-color:${t.divider}!important;`),\n rule(emailClass.layoutCanvas, `background-color:${t.surface}!important;`),\n // react-email's Body repeats its inline style on an inner wrapper cell\n // that carries no class, so the canvas colour has to reach it too.\n rule(`${emailClass.layoutCanvas}>table>tbody>tr>td`, `background-color:${t.surface}!important;`),\n rule(emailClass.logoLight, 'display:none!important;'),\n rule(emailClass.logoDark, 'display:inline-block!important;'),\n rule(emailClass.layoutCard,`background-color:${t.surface1}!important;border-color:${variantTokens('dark', 'outlined', 'neutral').borderColor}!important;`),\n ];\n for (const color of EMAIL_COLORS) {\n rules.push(rule(emailClass.main(color), `color:${mainColor('dark', color)}!important;`));\n for (const variant of EMAIL_VARIANTS) {\n const v = variantTokens('dark', variant, color);\n rules.push(\n rule(\n emailClass.variant(variant, color),\n [\n `color:${v.color}!important;`,\n v.backgroundColor && `background-color:${v.backgroundColor}!important;`,\n v.borderColor && `border-color:${v.borderColor}!important;`,\n ]\n .filter(Boolean)\n .join(''),\n ),\n );\n }\n }\n return rules.join('');\n}\n\n/*\n * AuthScreen's phone layout: the card stops being a card. It fills the width,\n * loses border and radius, insets its content by 24px, and the page around it\n * takes the card's colour — surface in light, surface-1 in dark. Last in the\n * sheet so it wins over the dark rules at equal specificity.\n */\nfunction phoneRules(): string {\n const canvas = (scope: string) => `${scope}.${emailClass.layoutCanvas},${scope}.${emailClass.layoutCanvas}>table>tbody>tr>td`;\n const dark = (scope: string) => `${canvas(scope)}{background-color:${emailSchemes.dark.surface1}!important;}`;\n return [\n `@media only screen and (max-width:600px){`,\n `.${emailClass.layoutCard}{max-width:100%!important;border:0!important;border-radius:0!important;}`,\n `.${emailClass.layoutCardBody}{padding:32px 24px!important;}`,\n `${canvas('')}{padding:0!important;background-color:${emailSchemes.light.surface}!important;}`,\n dark('[data-color-scheme=\"dark\"] '),\n `}`,\n `@media only screen and (max-width:600px) and (prefers-color-scheme:dark){${dark(':root:not([data-color-scheme=\"light\"]) ')}}`,\n ].join('');\n}\n\nexport const emailStylesheet = [\n // iOS turns dates and addresses into blue links that ignore the text colour.\n 'a[x-apple-data-detectors]{color:inherit!important;text-decoration:none!important;}',\n `@media (prefers-color-scheme:dark){${darkRules(':root:not([data-color-scheme=\"light\"])')}}`,\n darkRules('[data-color-scheme=\"dark\"]'),\n phoneRules(),\n].join('\\n');\n","import * as React from 'react';\nimport { Body, Container, Head, Html, Preview } from 'react-email';\nimport { emailClass, emailStylesheet } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens } from '../tokens';\n\nexport interface LayoutProps {\n /** The `lang` of the message — screen readers pick their voice from it. */\n lang: string;\n /**\n * The line inbox lists show after the subject. Without one, clients take the\n * first text they find, which is usually the brand name.\n */\n preview: string;\n /** Rendered under the card: why the reader got this, the sender's legal line. */\n footer?: React.ReactNode;\n /** Forces a scheme for previews. Left out, the email follows the reader's OS where the client supports that. */\n colorScheme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * The whole document, laid out like core's AuthScreen: a 440px outlined card\n * with a 20px radius and 48px padding on a `surface-1` page, the fine print\n * centred under it. In dark the page and card swap surfaces, as AuthScreen's do.\n */\nexport function Layout({ lang, preview, footer, colorScheme, children }: LayoutProps) {\n const t = emailSchemes.light;\n return (\n <Html lang={lang} data-color-scheme={colorScheme}>\n <Head>\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <ColorSchemeStyles />\n </Head>\n <Preview>{preview}</Preview>\n <Body className={emailClass.layoutCanvas} style={{ margin: 0, padding: '40px 0', backgroundColor: t.surface1, fontFamily: emailFonts.body }}>\n <Container\n className={emailClass.layoutCard}\n style={{\n width: '100%',\n maxWidth: '440px',\n boxSizing: 'border-box',\n backgroundColor: t.surface,\n border: `1px solid ${variantTokens('light', 'outlined', 'neutral').borderColor}`,\n borderRadius: '20px',\n }}\n >\n <div className={emailClass.layoutCardBody} style={{ padding: '48px' }}>\n {children}\n </div>\n </Container>\n {footer && <Container style={{ maxWidth: '440px', padding: '24px 24px 0', textAlign: 'center' }}>{footer}</Container>}\n </Body>\n </Html>\n );\n}\n\n/**\n * The dark-mode stylesheet on its own. Layout includes it; render it\n * once yourself when email components are shown inside a normal page — a\n * preview, the docs — so they follow that page's `data-color-scheme`.\n */\nexport function ColorSchemeStyles() {\n return <style dangerouslySetInnerHTML={{ __html: emailStylesheet }} />;\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes } from '../tokens';\n\nexport type TypographyLevel =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body-lg'\n | 'body-md'\n | 'body-sm'\n | 'body-xs';\n\ntype Ink = 'inkPrimary' | 'inkSecondary' | 'inkTertiary' | 'inkIcon';\n\n/*\n * Typography's typographyVariants.ts, resolved: Tailwind's text-4xl…text-xs\n * in px, its font-bold/semibold/medium as numbers, `tracking-tight` as\n * -0.025em, and the same unitless line-heights (1.33334, 1.5, 1.42858), so the\n * computed line box matches the web component to the sub-pixel.\n */\nconst LEVELS: Record<TypographyLevel, { fontSize: string; fontWeight: number; lineHeight: number; letterSpacing?: string; ink: Ink }> = {\n h1: { fontSize: '36px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h2: { fontSize: '30px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h3: { fontSize: '24px', fontWeight: 600, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h4: { fontSize: '20px', fontWeight: 600, lineHeight: 1.5, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n 'title-lg': { fontSize: '18px', fontWeight: 600, lineHeight: 1.33334, ink: 'inkPrimary' },\n 'title-md': { fontSize: '16px', fontWeight: 500, lineHeight: 1.5, ink: 'inkPrimary' },\n 'title-sm': { fontSize: '14px', fontWeight: 500, lineHeight: 1.42858, ink: 'inkPrimary' },\n 'body-lg': { fontSize: '18px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-md': { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-sm': { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, ink: 'inkTertiary' },\n 'body-xs': { fontSize: '12px', fontWeight: 500, lineHeight: 1.5, ink: 'inkTertiary' },\n};\n\nconst DEFAULT_TAG: Record<TypographyLevel, 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span'> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'title-lg': 'p',\n 'title-md': 'p',\n 'title-sm': 'p',\n 'body-lg': 'p',\n 'body-md': 'p',\n 'body-sm': 'p',\n 'body-xs': 'span',\n};\n\nexport interface TypographyProps {\n level?: TypographyLevel;\n /** The element to render. Defaults to the same tag the web Typography picks for the level. */\n component?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';\n textAlign?: 'left' | 'center' | 'right';\n /**\n * Overrides the level's ink, like Joy's `textColor=\"text.tertiary\"`.\n * `icon` is the theme's faintest ink — for fine print that should recede.\n */\n textColor?: 'primary' | 'secondary' | 'tertiary' | 'icon';\n /** Margin, spacing and the like — there is no Stack in email, so spacing lives on the text. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst TEXT_COLOR: Record<NonNullable<TypographyProps['textColor']>, Ink> = {\n primary: 'inkPrimary',\n secondary: 'inkSecondary',\n tertiary: 'inkTertiary',\n icon: 'inkIcon',\n};\n\n/** Typography for email: the same levels, sizes and ink colours, as inline styles. */\nexport function Typography({ level = 'body-md', component, textAlign, textColor, style, children }: TypographyProps) {\n const spec = LEVELS[level];\n const ink = textColor ? TEXT_COLOR[textColor] : spec.ink;\n const Tag = component ?? DEFAULT_TAG[level];\n return (\n <Tag\n className={emailClass[ink]}\n style={{\n margin: 0,\n fontFamily: emailFonts.body,\n fontSize: spec.fontSize,\n fontWeight: spec.fontWeight,\n lineHeight: spec.lineHeight,\n letterSpacing: spec.letterSpacing,\n color: emailSchemes.light[ink],\n textAlign,\n ...style,\n }}\n >\n {children}\n </Tag>\n );\n}\n","import * as React from 'react';\nimport { Button as ReactEmailButton } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\n/*\n * buttonVariants.ts, resolved. The web Button gets its height from\n * `min-h-8/9/11` and centres the label with flexbox; email has neither, so the\n * same box is built from line-height plus vertical padding:\n * (min-height − line-height) / 2, less the 1px border for outlined.\n */\nconst SIZES = {\n sm: { minHeight: 32, paddingInline: 12, fontSize: 14, lineHeight: 21 },\n md: { minHeight: 36, paddingInline: 16, fontSize: 14, lineHeight: 21 },\n lg: { minHeight: 44, paddingInline: 24, fontSize: 16, lineHeight: 24 },\n} as const;\n\nexport interface ButtonProps {\n /** Rendered only for http(s) URLs; anything else renders nothing — a button nobody can follow is worse than none. */\n href: string;\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** `rounded-full`, as on the web Button. */\n pill?: boolean;\n /** Stretches to the container — the usual call-to-action layout in a narrow email. */\n fullWidth?: boolean;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Button for email: a link styled as the web Button, built on react-email's Outlook-safe Button. */\nexport function Button({ href, variant = 'solid', color = 'primary', size = 'md', pill = false, fullWidth = false, style, children }: ButtonProps) {\n const safe = safeHref(href);\n if (!safe || safe.startsWith('mailto:')) return null;\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const border = variant === 'outlined' ? 1 : 0;\n const paddingBlock = (s.minHeight - s.lineHeight) / 2 - border;\n return (\n <ReactEmailButton\n href={safe}\n className={emailClass.variant(variant, color)}\n style={{\n display: fullWidth ? 'block' : 'inline-block',\n boxSizing: 'border-box',\n width: fullWidth ? '100%' : undefined,\n textAlign: 'center',\n paddingTop: `${paddingBlock}px`,\n paddingBottom: `${paddingBlock}px`,\n paddingLeft: `${s.paddingInline}px`,\n paddingRight: `${s.paddingInline}px`,\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 600,\n lineHeight: `${s.lineHeight}px`,\n textDecoration: 'none',\n borderRadius: pill ? '9999px' : emailRadius.sm,\n color: v.color,\n backgroundColor: v.backgroundColor ?? 'transparent',\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {/* react-email wraps the label in its own inline-block span at\n line-height 120%. In the modes mail is actually shown in — the\n limited-quirks mode its XHTML doctype yields, or full quirks where a\n webmail drops the doctype — the link's own line-height no longer\n props the line up, so the button shrank to 120% of the font plus\n padding: 4–5px short at every size. This span carries the full\n line-height itself, so the box no longer depends on the mode. */}\n <span style={{ display: 'inline-block', lineHeight: `${s.lineHeight}px` }}>{children}</span>\n </ReactEmailButton>\n );\n}\n","import * as React from 'react';\nimport { Link as ReactEmailLink } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, mainColor, type EmailColor } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\nexport interface LinkProps {\n /** Rendered only for http(s) and mailto URLs; anything else becomes plain text. */\n href: string;\n color?: EmailColor;\n /**\n * The web Link defaults to `hover`, but there is no reliable hover in email,\n * so the default here is `always`: an inbox reader needs to see a link is\n * one without touching it.\n */\n underline?: 'none' | 'always';\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Link for email: the web Link's `--color-*-main` colour, which steps from 500 to 400 in dark. */\nexport function Link({ href, color = 'primary', underline = 'always', style, children }: LinkProps) {\n const safe = safeHref(href);\n if (!safe) return <>{children}</>;\n return (\n <ReactEmailLink\n href={safe}\n className={emailClass.main(color)}\n style={{ fontFamily: emailFonts.body, color: mainColor('light', color), textDecoration: underline === 'always' ? 'underline' : 'none', wordBreak: 'break-word', ...style }}\n >\n {children}\n </ReactEmailLink>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailSchemes } from '../tokens';\n\nexport interface DividerProps {\n /** Spacing around the line — the web Divider has none of its own either. */\n style?: React.CSSProperties;\n}\n\n/**\n * Divider for email: a 1px line in `--color-divider`. A div rather than an\n * <hr>, whose borders Outlook and Gmail each draw differently. `background`\n * carries a solid fallback that Outlook's Word engine — which drops rgba() —\n * keeps; every other client takes the rgba `background-color` after it.\n */\nexport function Divider({ style }: DividerProps) {\n const t = emailSchemes.light;\n return (\n <div\n role=\"separator\"\n className={emailClass.divider}\n style={{ height: '1px', lineHeight: '1px', fontSize: '1px', background: t.dividerFallback, backgroundColor: t.divider, border: 'none', margin: 0, ...style }}\n >\n &nbsp;\n </div>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\nexport interface CardProps {\n variant?: EmailVariant;\n color?: EmailColor;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/**\n * Card for email: Sheet's variant colours plus Card's own `rounded-md p-4`,\n * defaulting to outlined / neutral like the web Card. Outlined and plain fill\n * with `surface`, as Joy's Sheet does. A one-cell table, because that is the\n * only box Outlook pads reliably; Card's `gap-2` has no email equivalent, so\n * spacing between children is theirs to set.\n */\nexport function Card({ variant = 'outlined', color = 'neutral', style, children }: CardProps) {\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n return (\n <table\n role=\"presentation\"\n width=\"100%\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n borderCollapse: 'separate',\n borderRadius: emailRadius.md,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n ...style,\n }}\n >\n <tbody>\n <tr>\n <td style={{ padding: '16px' }}>{children}</td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { Img } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeImageSrc } from '../safeUrl';\n\n/** avatarVariants.ts: 32/40/48px boxes, text-sm/base/lg, medium/medium/semibold. */\nconst SIZES = {\n sm: { box: 32, fontSize: '14px', fontWeight: 500 },\n md: { box: 40, fontSize: '16px', fontWeight: 500 },\n lg: { box: 48, fontSize: '18px', fontWeight: 600 },\n} as const;\n\nexport interface AvatarProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** An https image. Without one, `children` (usually initials) is shown. */\n src?: string;\n alt?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Avatar for email, defaulting to soft / neutral like the web Avatar. Unlike\n * Card, outlined and plain stay transparent — Joy's Avatar has no surface\n * fallback. The initials are centred by a table cell, since email has no flexbox.\n */\nexport function Avatar({ variant = 'soft', color = 'neutral', size = 'md', src, alt = '', children }: AvatarProps) {\n const s = SIZES[size];\n const safe = safeImageSrc(src);\n if (safe) {\n return <Img src={safe} width={s.box} height={s.box} alt={alt} style={{ display: 'inline-block', borderRadius: '50%', objectFit: 'cover' }} />;\n }\n const v = variantTokens('light', variant, color);\n return (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={emailClass.variant(variant, color)}\n style={{\n display: 'inline-table',\n boxSizing: 'border-box',\n width: `${s.box}px`,\n height: `${s.box}px`,\n borderCollapse: 'separate',\n borderRadius: '50%',\n backgroundColor: v.backgroundColor ?? 'transparent',\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n lineHeight: 1,\n verticalAlign: 'middle',\n }}\n >\n <tbody>\n <tr>\n <td align=\"center\" style={{ padding: 0, verticalAlign: 'middle', textAlign: 'center' }}>\n {children}\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\n/**\n * chipVariants.ts: `min-h-5/6/7`, `px-1.5/2/3`, `text-xs/sm/base` at a 1.5\n * line-height. As with Button, the min-height becomes vertical padding.\n */\nconst SIZES = {\n sm: { minHeight: 20, paddingInline: 6, fontSize: 12 },\n md: { minHeight: 24, paddingInline: 8, fontSize: 14 },\n lg: { minHeight: 28, paddingInline: 12, fontSize: 16 },\n} as const;\n\nexport interface ChipProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Chip for email, defaulting to soft / neutral like the web Chip; outlined and plain fill with `surface`. */\nexport function Chip({ variant = 'soft', color = 'neutral', size = 'md', style, children }: ChipProps) {\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n const border = v.borderColor ? 1 : 0;\n const lineHeight = s.fontSize * 1.5;\n const paddingBlock = (s.minHeight - lineHeight) / 2 - border;\n return (\n <span\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n display: 'inline-block',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n padding: `${paddingBlock}px ${s.paddingInline}px`,\n borderRadius: '1.5rem',\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 500,\n lineHeight: 1.5,\n color: v.color,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {children}\n </span>\n );\n}\n","import { Img } from 'react-email';\nimport { emailClass } from '../styles';\n\n/*\n * The hintoric wordmark as hosted PNGs (1336 × 410 artwork, shown at 104 × 32\n * so it stays sharp on HiDPI screens). PNG rather than SVG, which Gmail and\n * desktop Outlook don't display; linked rather than attached, so messages stay\n * small. A client that blocks remote images until asked shows the alt text.\n */\nconst LOGO = {\n light: 'https://cdn.hintoric.com/assets/logo/black.png',\n dark: 'https://cdn.hintoric.com/assets/logo/white.png',\n width: 104,\n height: 32,\n};\n\n/**\n * The email counterpart of the web HintoricLogo: the black wordmark, swapped\n * for the white one where the client applies the dark stylesheet.\n */\nexport function HintoricLogo() {\n return (\n <>\n <Img\n src={LOGO.light}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoLight}\n style={{ display: 'inline-block', margin: '0 auto' }}\n />\n <Img\n src={LOGO.dark}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoDark}\n style={{ display: 'none', margin: '0 auto' }}\n />\n </>\n );\n}\n","import { Avatar } from '../../components/Avatar';\nimport { Button } from '../../components/Button';\nimport { Divider } from '../../components/Divider';\nimport { Layout } from '../../components/Layout';\nimport { Link } from '../../components/Link';\nimport { Typography } from '../../components/Typography';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { SecurityActivityAlertContext, SecurityActivityAlertProps } from './types';\n\nfunction contextOf(props: SecurityActivityAlertProps): SecurityActivityAlertContext {\n return {\n activity: props.activity,\n target: props.target,\n targetName: targetNameOf(props),\n occurredAt: props.messages.formatDateTime(props.activity.occurredAt, props.timeZone),\n };\n}\n\nfunction targetNameOf({ target }: SecurityActivityAlertProps): string {\n return target.type === 'workspace' ? target.workspaceName : target.email;\n}\n\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => word[0]!.toUpperCase())\n .join('');\n}\n\n/**\n * For security-relevant activity: a change in a workspace (sent to its\n * admins) or to an account (sent to its owner) — see `SecurityActivityTarget`.\n * Deliberately short: what happened as the heading, what it concerns, one\n * sentence, one button, one link.\n */\nexport function SecurityActivityAlertEmail(props: SecurityActivityAlertProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <SecurityActivityAlertContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function SecurityActivityAlertContent(props: SecurityActivityAlertProps) {\n const { messages, activityLogUrl } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {props.activity.title}\n </Typography>\n {/* primary, not the default neutral: in dark the layout card is surface-1,\n exactly the soft-neutral avatar fill, which would make it vanish. */}\n <Avatar size=\"sm\" color=\"primary\">\n {initials(ctx.targetName)}\n </Avatar>\n <Typography level=\"title-sm\" component=\"span\" style={{ marginLeft: '8px', verticalAlign: 'middle' }}>\n {ctx.targetName}\n </Typography>\n </div>\n <Divider style={{ margin: '32px 0' }} />\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {props.activity.description?.trim() || messages.summary(ctx)} {messages.guidance(ctx)}\n </Typography>\n <Button href={props.reviewUrl} size=\"lg\" fullWidth>\n {messages.reviewButton}\n </Button>\n {activityLogUrl && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" style={{ marginTop: '24px', fontWeight: 400 }}>\n {messages.activityLogHint((label) => (\n <Link href={activityLogUrl} underline=\"none\">\n {label}\n </Link>\n ))}\n </Typography>\n )}\n </>\n );\n}\n\nexport interface RenderedEmail {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderSecurityActivityAlert(props: SecurityActivityAlertProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<SecurityActivityAlertEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { SecurityActivityAlertMessages } from './types';\n\nfunction dateTimeFormatter(locale: string) {\n return (date: Date, timeZone: string) =>\n new Intl.DateTimeFormat(locale, { dateStyle: 'long', timeStyle: 'short', timeZone }).format(date);\n}\n\nexport const securityActivityAlertMessagesDe: SecurityActivityAlertMessages = {\n lang: 'de',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} hat am ${occurredAt} eine sicherheitsrelevante Änderung vorgenommen.`,\n guidance: () => 'Wenn du diese Änderung nicht erwartet hast, prüfe die Aktivität jetzt.',\n reviewButton: 'Aktivität prüfen',\n activityLogHint: (link) => <>Alle sicherheitsrelevanten Aktivitäten findest du im {link('Aktivitätsprotokoll')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'Wir haben dir diese E-Mail gesendet, um dich als Administrator über wichtige Änderungen in deinem Workspace zu informieren.'\n : 'Wir haben dir diese E-Mail gesendet, um dich über wichtige Änderungen an deinem hintoric-Konto zu informieren.',\n formatDateTime: dateTimeFormatter('de-DE'),\n};\n\nexport const securityActivityAlertMessagesEn: SecurityActivityAlertMessages = {\n lang: 'en',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} made a security-relevant change on ${occurredAt}.`,\n guidance: () => \"If you didn't expect this change, review the activity now.\",\n reviewButton: 'Review activity',\n activityLogHint: (link) => <>You can see all security-relevant activity in the {link('activity log')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'We sent you this email to let you know, as an admin, about important changes in your workspace.'\n : 'We sent you this email to let you know about important changes to your hintoric account.',\n formatDateTime: dateTimeFormatter('en-GB'),\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/render.ts","../src/tokens.ts","../src/safeUrl.ts","../src/styles.ts","../src/components/Layout.tsx","../src/components/Typography.tsx","../src/components/Button.tsx","../src/components/Link.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Avatar.tsx","../src/components/Chip.tsx","../src/components/HintoricLogo.tsx","../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx","../src/templates/SecurityActivityAlert/messages.tsx","../src/templates/WaitlistWelcome/WaitlistWelcomeEmail.tsx","../src/templates/WaitlistWelcome/messages.ts"],"sourcesContent":["import type * as React from 'react';\nimport { render } from '@react-email/render';\n\nexport interface RenderedEmailBody {\n html: string;\n /** The plain-text part. Multipart mails without one score worse with spam filters. */\n text: string;\n}\n\n/** Renders an email element — normally a `<Layout>` — to HTML and plain text. */\nexport async function renderEmail(element: React.ReactElement): Promise<RenderedEmailBody> {\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { html, text };\n}\n","/*\n * The email module's copy of theme.css, resolved to literal values.\n *\n * Email clients cannot use the component library's styling: Gmail, Outlook\n * and Apple Mail resolve neither CSS custom properties nor Tailwind classes,\n * and Gmail drops <style> blocks in some contexts. So every email component\n * paints with inline `style` values taken from here, and the dark scheme is a\n * progressive enhancement layered on top (see styles.ts).\n *\n * The raw stops are theme.css's; the per-variant mapping below is the same\n * formula theme.css spells out token by token (Joy's createLight/DarkMode\n * VariantVariables, with neutral's -700 plain/outlined override in light).\n * The parity tests in src/visual/email/*.visual.test.tsx compare every email\n * component against its web counterpart in both schemes, so a drift between\n * the two shows up as a failing computed-style assertion.\n */\n\nexport type EmailColor = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\nexport type EmailVariant = 'solid' | 'soft' | 'outlined' | 'plain';\nexport type EmailScheme = 'light' | 'dark';\n\ntype Stop = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport const emailPalette: Record<EmailColor, Record<Stop, string>> = {\n neutral: { 50: '#FBFCFE', 100: '#F0F4F8', 200: '#DDE7EE', 300: '#CDD7E1', 400: '#9FA6AD', 500: '#636B74', 600: '#555E68', 700: '#32383E', 800: '#171A1C', 900: '#0B0D0E' },\n primary: { 50: '#EDF5FD', 100: '#E3EFFB', 200: '#C7DFF7', 300: '#97C3F0', 400: '#4393E4', 500: '#0B6BCB', 600: '#185EA5', 700: '#12467B', 800: '#0A2744', 900: '#051423' },\n warning: { 50: '#FEFAF6', 100: '#FDF0E1', 200: '#FCE1C2', 300: '#F3C896', 400: '#EA9A3E', 500: '#9A5B13', 600: '#72430D', 700: '#492B08', 800: '#2E1B05', 900: '#1D1002' },\n danger: { 50: '#FEF6F6', 100: '#FCE4E4', 200: '#F7C5C5', 300: '#F09898', 400: '#E47474', 500: '#C41C1C', 600: '#A51818', 700: '#7D1212', 800: '#430A0A', 900: '#240505' },\n success: { 50: '#F6FEF6', 100: '#E3FBE3', 200: '#C7F7C7', 300: '#A1E8A1', 400: '#51BC51', 500: '#1F7A1F', 600: '#136C13', 700: '#0A470A', 800: '#042F04', 900: '#021D02' },\n};\n\nexport const EMAIL_COLORS: EmailColor[] = ['primary', 'neutral', 'danger', 'success', 'warning'];\nexport const EMAIL_VARIANTS: EmailVariant[] = ['solid', 'soft', 'outlined', 'plain'];\n\n/** What one variant × colour paints. `undefined` means \"leaves it to the surroundings\". */\nexport interface EmailVariantTokens {\n color: string;\n backgroundColor?: string;\n borderColor?: string;\n}\n\nexport function variantTokens(scheme: EmailScheme, variant: EmailVariant, color: EmailColor): EmailVariantTokens {\n const c = emailPalette[color];\n const dark = scheme === 'dark';\n switch (variant) {\n case 'solid':\n return { color: '#FFFFFF', backgroundColor: c[500] };\n case 'soft':\n return dark ? { color: c[200], backgroundColor: c[800] } : { color: c[700], backgroundColor: c[100] };\n case 'outlined':\n return dark\n ? { color: c[200], borderColor: c[700] }\n : { color: color === 'neutral' ? c[700] : c[500], borderColor: c[300] };\n case 'plain':\n return { color: dark ? c[300] : color === 'neutral' ? c[700] : c[500] };\n }\n}\n\n/** `--color-*-main`: step 500 in light, 400 in dark. What Link renders. */\nexport function mainColor(scheme: EmailScheme, color: EmailColor): string {\n return emailPalette[color][scheme === 'dark' ? 400 : 500];\n}\n\nexport interface EmailSchemeTokens {\n inkPrimary: string;\n inkSecondary: string;\n inkTertiary: string;\n /** `--color-ink-icon`: the faintest ink. */\n inkIcon: string;\n /** `--color-surface`: what a Sheet / Card paints under outlined and plain. */\n surface: string;\n /** `--color-surface-1`. */\n surface1: string;\n /**\n * `--color-divider`. Kept as the rgba() theme.css uses so it composites the\n * same way over any surface; Outlook's Word engine drops rgba(), which is\n * why Divider also sets a solid `dividerFallback`.\n */\n divider: string;\n /** `divider` flattened onto `surface`. */\n dividerFallback: string;\n}\n\nexport const emailSchemes: Record<EmailScheme, EmailSchemeTokens> = {\n light: {\n inkPrimary: emailPalette.neutral[800],\n inkSecondary: emailPalette.neutral[700],\n inkTertiary: emailPalette.neutral[600],\n inkIcon: emailPalette.neutral[500],\n surface: emailPalette.neutral[50],\n surface1: emailPalette.neutral[100],\n divider: 'rgba(99, 107, 116, 0.2)',\n dividerFallback: '#DCDFE2',\n },\n dark: {\n inkPrimary: emailPalette.neutral[100],\n inkSecondary: emailPalette.neutral[300],\n inkTertiary: emailPalette.neutral[400],\n inkIcon: emailPalette.neutral[400],\n surface: emailPalette.neutral[900],\n surface1: emailPalette.neutral[800],\n divider: 'rgba(159, 166, 173, 0.16)',\n dividerFallback: '#232628',\n },\n};\n\nexport const emailFonts = {\n // `--font-body`.\n body: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n // core's `--font-heading`. Only clients with the font installed or web-font\n // support (Apple Mail) show Montserrat; the rest fall back to the body stack.\n heading: \"Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n};\n\n/** theme.css's radius scale. */\nexport const emailRadius = { xs: '2px', sm: '6px', md: '8px', lg: '12px', xl: '16px' };\n","/*\n * Every link in an email is a link someone may click without a second look —\n * a security alert's \"review this activity\" button most of all. React escapes\n * text but not the scheme of an href, so a `javascript:` or `data:` URL that\n * reached a template through data would survive rendering intact. Only these\n * schemes are let through; anything else renders as plain, unlinked text.\n */\nconst LINK_PROTOCOLS = new Set(['https:', 'http:', 'mailto:']);\n\nexport function safeHref(href: string | undefined | null): string | undefined {\n if (!href) return undefined;\n try {\n const url = new URL(href);\n return LINK_PROTOCOLS.has(url.protocol) ? url.href : undefined;\n } catch {\n // Relative URLs are meaningless in an email: there is no base to resolve\n // them against once the message leaves the server.\n return undefined;\n }\n}\n\n/** Images additionally have to be https: mail clients block or warn on http. */\nexport function safeImageSrc(src: string | undefined | null): string | undefined {\n if (!src) return undefined;\n try {\n const url = new URL(src);\n return url.protocol === 'https:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import {\n EMAIL_COLORS,\n EMAIL_VARIANTS,\n emailSchemes,\n mainColor,\n variantTokens,\n type EmailColor,\n type EmailVariant,\n} from './tokens';\n\n/*\n * Inline styles carry the light scheme, so an email always renders correctly\n * even where <style> is stripped. Dark mode is a progressive enhancement: each\n * painted element also carries a class from here, and the stylesheet below\n * overrides it — `!important` because it has to beat the inline value.\n *\n * Two triggers, deliberately:\n * - `prefers-color-scheme: dark`, which Apple Mail, iOS Mail, Outlook for\n * Mac and Thunderbird honour. Guarded by `:not([data-color-scheme=\"light\"])`\n * so a preview forced to light stays light on a dark OS.\n * - `[data-color-scheme=\"dark\"]` on any ancestor — the same switch the\n * component library uses, so an email component rendered inside the docs\n * or a visual test follows the page's scheme.\n *\n * Gmail and Outlook.com ignore both and apply their own colour inversion,\n * which is out of any template's control.\n */\nexport const emailClass = {\n variant: (variant: EmailVariant, color: EmailColor) => `hx-${variant}-${color}`,\n main: (color: EmailColor) => `hx-main-${color}`,\n inkPrimary: 'hx-ink-1',\n inkSecondary: 'hx-ink-2',\n inkTertiary: 'hx-ink-3',\n inkIcon: 'hx-ink-icon',\n surface: 'hx-surface',\n divider: 'hx-divider',\n // Layout's AuthScreen shell: page and card swap surfaces in dark.\n layoutCanvas: 'hx-layout-canvas',\n layoutCard: 'hx-layout-card',\n // The card's inner area, which carries its padding. A div of our own rather\n // than react-email's cell: Container moves its `padding` onto an inner <td>,\n // so a rule on the card itself added to it instead of replacing it.\n layoutCardBody: 'hx-layout-card-body',\n // A logo pair: the light one shows by default, the dark one only once the\n // dark rules apply — clients without <style> support keep the light logo.\n logoLight: 'hx-logo-light',\n logoDark: 'hx-logo-dark',\n} as const;\n\nfunction darkRules(scope: string): string {\n const t = emailSchemes.dark;\n const rule = (selector: string, body: string) => `${scope} .${selector}{${body}}`;\n const rules = [\n rule(emailClass.inkPrimary, `color:${t.inkPrimary}!important;`),\n rule(emailClass.inkSecondary, `color:${t.inkSecondary}!important;`),\n rule(emailClass.inkTertiary, `color:${t.inkTertiary}!important;`),\n rule(emailClass.inkIcon, `color:${t.inkIcon}!important;`),\n rule(emailClass.surface, `background-color:${t.surface}!important;`),\n rule(emailClass.divider, `background-color:${t.divider}!important;`),\n rule(emailClass.layoutCanvas, `background-color:${t.surface}!important;`),\n // react-email's Body repeats its inline style on an inner wrapper cell\n // that carries no class, so the canvas colour has to reach it too.\n rule(`${emailClass.layoutCanvas}>table>tbody>tr>td`, `background-color:${t.surface}!important;`),\n rule(emailClass.logoLight, 'display:none!important;'),\n rule(emailClass.logoDark, 'display:inline-block!important;'),\n rule(emailClass.layoutCard,`background-color:${t.surface1}!important;border-color:${variantTokens('dark', 'outlined', 'neutral').borderColor}!important;`),\n ];\n for (const color of EMAIL_COLORS) {\n rules.push(rule(emailClass.main(color), `color:${mainColor('dark', color)}!important;`));\n for (const variant of EMAIL_VARIANTS) {\n const v = variantTokens('dark', variant, color);\n rules.push(\n rule(\n emailClass.variant(variant, color),\n [\n `color:${v.color}!important;`,\n v.backgroundColor && `background-color:${v.backgroundColor}!important;`,\n v.borderColor && `border-color:${v.borderColor}!important;`,\n ]\n .filter(Boolean)\n .join(''),\n ),\n );\n }\n }\n return rules.join('');\n}\n\n/*\n * AuthScreen's phone layout: the card stops being a card. It fills the width,\n * loses border and radius, insets its content by 24px, and the page around it\n * takes the card's colour — surface in light, surface-1 in dark. Last in the\n * sheet so it wins over the dark rules at equal specificity.\n */\nfunction phoneRules(): string {\n const canvas = (scope: string) => `${scope}.${emailClass.layoutCanvas},${scope}.${emailClass.layoutCanvas}>table>tbody>tr>td`;\n const dark = (scope: string) => `${canvas(scope)}{background-color:${emailSchemes.dark.surface1}!important;}`;\n return [\n `@media only screen and (max-width:600px){`,\n `.${emailClass.layoutCard}{max-width:100%!important;border:0!important;border-radius:0!important;}`,\n `.${emailClass.layoutCardBody}{padding:32px 24px!important;}`,\n `${canvas('')}{padding:0!important;background-color:${emailSchemes.light.surface}!important;}`,\n dark('[data-color-scheme=\"dark\"] '),\n `}`,\n `@media only screen and (max-width:600px) and (prefers-color-scheme:dark){${dark(':root:not([data-color-scheme=\"light\"]) ')}}`,\n ].join('');\n}\n\nexport const emailStylesheet = [\n // iOS turns dates and addresses into blue links that ignore the text colour.\n 'a[x-apple-data-detectors]{color:inherit!important;text-decoration:none!important;}',\n `@media (prefers-color-scheme:dark){${darkRules(':root:not([data-color-scheme=\"light\"])')}}`,\n darkRules('[data-color-scheme=\"dark\"]'),\n phoneRules(),\n].join('\\n');\n","import * as React from 'react';\nimport { Body, Container, Head, Html, Preview } from 'react-email';\nimport { emailClass, emailStylesheet } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens } from '../tokens';\n\nexport interface LayoutProps {\n /** The `lang` of the message — screen readers pick their voice from it. */\n lang: string;\n /**\n * The line inbox lists show after the subject. Without one, clients take the\n * first text they find, which is usually the brand name.\n */\n preview: string;\n /** Rendered under the card: why the reader got this, the sender's legal line. */\n footer?: React.ReactNode;\n /** Forces a scheme for previews. Left out, the email follows the reader's OS where the client supports that. */\n colorScheme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * The whole document, laid out like core's AuthScreen: a 440px outlined card\n * with a 20px radius and 48px padding on a `surface-1` page, the fine print\n * centred under it. In dark the page and card swap surfaces, as AuthScreen's do.\n */\nexport function Layout({ lang, preview, footer, colorScheme, children }: LayoutProps) {\n const t = emailSchemes.light;\n return (\n <Html lang={lang} data-color-scheme={colorScheme}>\n <Head>\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <ColorSchemeStyles />\n </Head>\n <Preview>{preview}</Preview>\n <Body className={emailClass.layoutCanvas} style={{ margin: 0, padding: '40px 0', backgroundColor: t.surface1, fontFamily: emailFonts.body }}>\n <Container\n className={emailClass.layoutCard}\n style={{\n width: '100%',\n maxWidth: '440px',\n boxSizing: 'border-box',\n backgroundColor: t.surface,\n border: `1px solid ${variantTokens('light', 'outlined', 'neutral').borderColor}`,\n borderRadius: '20px',\n }}\n >\n <div className={emailClass.layoutCardBody} style={{ padding: '48px' }}>\n {children}\n </div>\n </Container>\n {footer && <Container style={{ maxWidth: '440px', padding: '24px 24px 0', textAlign: 'center' }}>{footer}</Container>}\n </Body>\n </Html>\n );\n}\n\n/**\n * The dark-mode stylesheet on its own. Layout includes it; render it\n * once yourself when email components are shown inside a normal page — a\n * preview, the docs — so they follow that page's `data-color-scheme`.\n */\nexport function ColorSchemeStyles() {\n return <style dangerouslySetInnerHTML={{ __html: emailStylesheet }} />;\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes } from '../tokens';\n\nexport type TypographyLevel =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body-lg'\n | 'body-md'\n | 'body-sm'\n | 'body-xs';\n\ntype Ink = 'inkPrimary' | 'inkSecondary' | 'inkTertiary' | 'inkIcon';\n\n/*\n * Typography's typographyVariants.ts, resolved: Tailwind's text-4xl…text-xs\n * in px, its font-bold/semibold/medium as numbers, `tracking-tight` as\n * -0.025em, and the same unitless line-heights (1.33334, 1.5, 1.42858), so the\n * computed line box matches the web component to the sub-pixel.\n */\nconst LEVELS: Record<TypographyLevel, { fontSize: string; fontWeight: number; lineHeight: number; letterSpacing?: string; ink: Ink }> = {\n h1: { fontSize: '36px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h2: { fontSize: '30px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h3: { fontSize: '24px', fontWeight: 600, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h4: { fontSize: '20px', fontWeight: 600, lineHeight: 1.5, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n 'title-lg': { fontSize: '18px', fontWeight: 600, lineHeight: 1.33334, ink: 'inkPrimary' },\n 'title-md': { fontSize: '16px', fontWeight: 500, lineHeight: 1.5, ink: 'inkPrimary' },\n 'title-sm': { fontSize: '14px', fontWeight: 500, lineHeight: 1.42858, ink: 'inkPrimary' },\n 'body-lg': { fontSize: '18px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-md': { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-sm': { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, ink: 'inkTertiary' },\n 'body-xs': { fontSize: '12px', fontWeight: 500, lineHeight: 1.5, ink: 'inkTertiary' },\n};\n\nconst DEFAULT_TAG: Record<TypographyLevel, 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span'> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'title-lg': 'p',\n 'title-md': 'p',\n 'title-sm': 'p',\n 'body-lg': 'p',\n 'body-md': 'p',\n 'body-sm': 'p',\n 'body-xs': 'span',\n};\n\nexport interface TypographyProps {\n level?: TypographyLevel;\n /** The element to render. Defaults to the same tag the web Typography picks for the level. */\n component?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';\n textAlign?: 'left' | 'center' | 'right';\n /**\n * Overrides the level's ink, like Joy's `textColor=\"text.tertiary\"`.\n * `icon` is the theme's faintest ink — for fine print that should recede.\n */\n textColor?: 'primary' | 'secondary' | 'tertiary' | 'icon';\n /** Margin, spacing and the like — there is no Stack in email, so spacing lives on the text. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst TEXT_COLOR: Record<NonNullable<TypographyProps['textColor']>, Ink> = {\n primary: 'inkPrimary',\n secondary: 'inkSecondary',\n tertiary: 'inkTertiary',\n icon: 'inkIcon',\n};\n\n/** Typography for email: the same levels, sizes and ink colours, as inline styles. */\nexport function Typography({ level = 'body-md', component, textAlign, textColor, style, children }: TypographyProps) {\n const spec = LEVELS[level];\n const ink = textColor ? TEXT_COLOR[textColor] : spec.ink;\n const Tag = component ?? DEFAULT_TAG[level];\n return (\n <Tag\n className={emailClass[ink]}\n style={{\n margin: 0,\n fontFamily: emailFonts.body,\n fontSize: spec.fontSize,\n fontWeight: spec.fontWeight,\n lineHeight: spec.lineHeight,\n letterSpacing: spec.letterSpacing,\n color: emailSchemes.light[ink],\n textAlign,\n ...style,\n }}\n >\n {children}\n </Tag>\n );\n}\n","import * as React from 'react';\nimport { Button as ReactEmailButton } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\n/*\n * buttonVariants.ts, resolved. The web Button gets its height from\n * `min-h-8/9/11` and centres the label with flexbox; email has neither, so the\n * same box is built from line-height plus vertical padding:\n * (min-height − line-height) / 2, less the 1px border for outlined.\n */\nconst SIZES = {\n sm: { minHeight: 32, paddingInline: 12, fontSize: 14, lineHeight: 21 },\n md: { minHeight: 36, paddingInline: 16, fontSize: 14, lineHeight: 21 },\n lg: { minHeight: 44, paddingInline: 24, fontSize: 16, lineHeight: 24 },\n} as const;\n\nexport interface ButtonProps {\n /** Rendered only for http(s) URLs; anything else renders nothing — a button nobody can follow is worse than none. */\n href: string;\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** `rounded-full`, as on the web Button. */\n pill?: boolean;\n /** Stretches to the container — the usual call-to-action layout in a narrow email. */\n fullWidth?: boolean;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Button for email: a link styled as the web Button, built on react-email's Outlook-safe Button. */\nexport function Button({ href, variant = 'solid', color = 'primary', size = 'md', pill = false, fullWidth = false, style, children }: ButtonProps) {\n const safe = safeHref(href);\n if (!safe || safe.startsWith('mailto:')) return null;\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const border = variant === 'outlined' ? 1 : 0;\n const paddingBlock = (s.minHeight - s.lineHeight) / 2 - border;\n return (\n <ReactEmailButton\n href={safe}\n className={emailClass.variant(variant, color)}\n style={{\n display: fullWidth ? 'block' : 'inline-block',\n boxSizing: 'border-box',\n width: fullWidth ? '100%' : undefined,\n textAlign: 'center',\n paddingTop: `${paddingBlock}px`,\n paddingBottom: `${paddingBlock}px`,\n paddingLeft: `${s.paddingInline}px`,\n paddingRight: `${s.paddingInline}px`,\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 600,\n lineHeight: `${s.lineHeight}px`,\n textDecoration: 'none',\n borderRadius: pill ? '9999px' : emailRadius.sm,\n color: v.color,\n backgroundColor: v.backgroundColor ?? 'transparent',\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {/* react-email wraps the label in its own inline-block span at\n line-height 120%. In the modes mail is actually shown in — the\n limited-quirks mode its XHTML doctype yields, or full quirks where a\n webmail drops the doctype — the link's own line-height no longer\n props the line up, so the button shrank to 120% of the font plus\n padding: 4–5px short at every size. This span carries the full\n line-height itself, so the box no longer depends on the mode. */}\n <span style={{ display: 'inline-block', lineHeight: `${s.lineHeight}px` }}>{children}</span>\n </ReactEmailButton>\n );\n}\n","import * as React from 'react';\nimport { Link as ReactEmailLink } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, mainColor, type EmailColor } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\nexport interface LinkProps {\n /** Rendered only for http(s) and mailto URLs; anything else becomes plain text. */\n href: string;\n color?: EmailColor;\n /**\n * The web Link defaults to `hover`, but there is no reliable hover in email,\n * so the default here is `always`: an inbox reader needs to see a link is\n * one without touching it.\n */\n underline?: 'none' | 'always';\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Link for email: the web Link's `--color-*-main` colour, which steps from 500 to 400 in dark. */\nexport function Link({ href, color = 'primary', underline = 'always', style, children }: LinkProps) {\n const safe = safeHref(href);\n if (!safe) return <>{children}</>;\n return (\n <ReactEmailLink\n href={safe}\n className={emailClass.main(color)}\n style={{ fontFamily: emailFonts.body, color: mainColor('light', color), textDecoration: underline === 'always' ? 'underline' : 'none', wordBreak: 'break-word', ...style }}\n >\n {children}\n </ReactEmailLink>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailSchemes } from '../tokens';\n\nexport interface DividerProps {\n /** Spacing around the line — the web Divider has none of its own either. */\n style?: React.CSSProperties;\n}\n\n/**\n * Divider for email: a 1px line in `--color-divider`. A div rather than an\n * <hr>, whose borders Outlook and Gmail each draw differently. `background`\n * carries a solid fallback that Outlook's Word engine — which drops rgba() —\n * keeps; every other client takes the rgba `background-color` after it.\n */\nexport function Divider({ style }: DividerProps) {\n const t = emailSchemes.light;\n return (\n <div\n role=\"separator\"\n className={emailClass.divider}\n style={{ height: '1px', lineHeight: '1px', fontSize: '1px', background: t.dividerFallback, backgroundColor: t.divider, border: 'none', margin: 0, ...style }}\n >\n &nbsp;\n </div>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\nexport interface CardProps {\n variant?: EmailVariant;\n color?: EmailColor;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/**\n * Card for email: Sheet's variant colours plus Card's own `rounded-md p-4`,\n * defaulting to outlined / neutral like the web Card. Outlined and plain fill\n * with `surface`, as Joy's Sheet does. A one-cell table, because that is the\n * only box Outlook pads reliably; Card's `gap-2` has no email equivalent, so\n * spacing between children is theirs to set.\n */\nexport function Card({ variant = 'outlined', color = 'neutral', style, children }: CardProps) {\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n return (\n <table\n role=\"presentation\"\n width=\"100%\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n borderCollapse: 'separate',\n borderRadius: emailRadius.md,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n ...style,\n }}\n >\n <tbody>\n <tr>\n <td style={{ padding: '16px' }}>{children}</td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { Img } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeImageSrc } from '../safeUrl';\n\n/** avatarVariants.ts: 32/40/48px boxes, text-sm/base/lg, medium/medium/semibold. */\nconst SIZES = {\n sm: { box: 32, fontSize: '14px', fontWeight: 500 },\n md: { box: 40, fontSize: '16px', fontWeight: 500 },\n lg: { box: 48, fontSize: '18px', fontWeight: 600 },\n} as const;\n\nexport interface AvatarProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** An https image. Without one, `children` (usually initials) is shown. */\n src?: string;\n alt?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Avatar for email, defaulting to soft / neutral like the web Avatar. Unlike\n * Card, outlined and plain stay transparent — Joy's Avatar has no surface\n * fallback. The initials are centred by a table cell, since email has no flexbox.\n */\nexport function Avatar({ variant = 'soft', color = 'neutral', size = 'md', src, alt = '', children }: AvatarProps) {\n const s = SIZES[size];\n const safe = safeImageSrc(src);\n if (safe) {\n return <Img src={safe} width={s.box} height={s.box} alt={alt} style={{ display: 'inline-block', borderRadius: '50%', objectFit: 'cover' }} />;\n }\n const v = variantTokens('light', variant, color);\n return (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={emailClass.variant(variant, color)}\n style={{\n display: 'inline-table',\n boxSizing: 'border-box',\n width: `${s.box}px`,\n height: `${s.box}px`,\n borderCollapse: 'separate',\n borderRadius: '50%',\n backgroundColor: v.backgroundColor ?? 'transparent',\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n lineHeight: 1,\n verticalAlign: 'middle',\n }}\n >\n <tbody>\n <tr>\n <td align=\"center\" style={{ padding: 0, verticalAlign: 'middle', textAlign: 'center' }}>\n {children}\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\n/**\n * chipVariants.ts: `min-h-5/6/7`, `px-1.5/2/3`, `text-xs/sm/base` at a 1.5\n * line-height. As with Button, the min-height becomes vertical padding.\n */\nconst SIZES = {\n sm: { minHeight: 20, paddingInline: 6, fontSize: 12 },\n md: { minHeight: 24, paddingInline: 8, fontSize: 14 },\n lg: { minHeight: 28, paddingInline: 12, fontSize: 16 },\n} as const;\n\nexport interface ChipProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Chip for email, defaulting to soft / neutral like the web Chip; outlined and plain fill with `surface`. */\nexport function Chip({ variant = 'soft', color = 'neutral', size = 'md', style, children }: ChipProps) {\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n const border = v.borderColor ? 1 : 0;\n const lineHeight = s.fontSize * 1.5;\n const paddingBlock = (s.minHeight - lineHeight) / 2 - border;\n return (\n <span\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n display: 'inline-block',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n padding: `${paddingBlock}px ${s.paddingInline}px`,\n borderRadius: '1.5rem',\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 500,\n lineHeight: 1.5,\n color: v.color,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {children}\n </span>\n );\n}\n","import { Img } from 'react-email';\nimport { emailClass } from '../styles';\n\n/*\n * The hintoric wordmark as hosted PNGs (1336 × 410 artwork, shown at 104 × 32\n * so it stays sharp on HiDPI screens). PNG rather than SVG, which Gmail and\n * desktop Outlook don't display; linked rather than attached, so messages stay\n * small. A client that blocks remote images until asked shows the alt text.\n */\nconst LOGO = {\n light: 'https://cdn.hintoric.com/assets/logo/black.png',\n dark: 'https://cdn.hintoric.com/assets/logo/white.png',\n width: 104,\n height: 32,\n};\n\n/**\n * The email counterpart of the web HintoricLogo: the black wordmark, swapped\n * for the white one where the client applies the dark stylesheet.\n */\nexport function HintoricLogo() {\n return (\n <>\n <Img\n src={LOGO.light}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoLight}\n style={{ display: 'inline-block', margin: '0 auto' }}\n />\n <Img\n src={LOGO.dark}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoDark}\n style={{ display: 'none', margin: '0 auto' }}\n />\n </>\n );\n}\n","import { Avatar } from '../../components/Avatar';\nimport { Button } from '../../components/Button';\nimport { Divider } from '../../components/Divider';\nimport { Layout } from '../../components/Layout';\nimport { Link } from '../../components/Link';\nimport { Typography } from '../../components/Typography';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { SecurityActivityAlertContext, SecurityActivityAlertProps } from './types';\n\nfunction contextOf(props: SecurityActivityAlertProps): SecurityActivityAlertContext {\n return {\n activity: props.activity,\n target: props.target,\n targetName: targetNameOf(props),\n occurredAt: props.messages.formatDateTime(props.activity.occurredAt, props.timeZone),\n };\n}\n\nfunction targetNameOf({ target }: SecurityActivityAlertProps): string {\n return target.type === 'workspace' ? target.workspaceName : target.email;\n}\n\n/**\n * The first letter of the first two words that have one: \"Müller & Söhne\"\n * is MS, not M&, and a quote or dash in front of a word does not count.\n */\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .map((word) => word.match(/\\p{L}/u)?.[0])\n .filter((letter): letter is string => letter !== undefined)\n .slice(0, 2)\n .map((letter) => letter.toUpperCase())\n .join('');\n}\n\n/**\n * For security-relevant activity: a change in a workspace (sent to its\n * admins) or to an account (sent to its owner) — see `SecurityActivityTarget`.\n * Deliberately short: what happened as the heading, what it concerns, one\n * sentence, one button, one link.\n */\nexport function SecurityActivityAlertEmail(props: SecurityActivityAlertProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <SecurityActivityAlertContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function SecurityActivityAlertContent(props: SecurityActivityAlertProps) {\n const { messages, activityLogUrl } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {props.activity.title}\n </Typography>\n {/* primary, not the default neutral: in dark the layout card is surface-1,\n exactly the soft-neutral avatar fill, which would make it vanish. */}\n <Avatar size=\"sm\" color=\"primary\">\n {initials(ctx.targetName)}\n </Avatar>\n <Typography level=\"title-sm\" component=\"span\" style={{ marginLeft: '8px', verticalAlign: 'middle' }}>\n {ctx.targetName}\n </Typography>\n </div>\n <Divider style={{ margin: '32px 0' }} />\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {props.activity.description?.trim() || messages.summary(ctx)} {messages.guidance(ctx)}\n </Typography>\n <Button href={props.reviewUrl} size=\"lg\" fullWidth>\n {messages.reviewButton}\n </Button>\n {activityLogUrl && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" style={{ marginTop: '24px', fontWeight: 400 }}>\n {messages.activityLogHint((label) => (\n <Link href={activityLogUrl} underline=\"none\">\n {label}\n </Link>\n ))}\n </Typography>\n )}\n </>\n );\n}\n\nexport interface RenderedEmail {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderSecurityActivityAlert(props: SecurityActivityAlertProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<SecurityActivityAlertEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { SecurityActivityAlertMessages } from './types';\n\nfunction dateTimeFormatter(locale: string) {\n return (date: Date, timeZone: string) =>\n new Intl.DateTimeFormat(locale, { dateStyle: 'long', timeStyle: 'short', timeZone }).format(date);\n}\n\nexport const securityActivityAlertMessagesDe: SecurityActivityAlertMessages = {\n lang: 'de',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} hat am ${occurredAt} eine sicherheitsrelevante Änderung vorgenommen.`,\n guidance: () => 'Wenn du diese Änderung nicht erwartet hast, prüfe die Aktivität jetzt.',\n reviewButton: 'Aktivität prüfen',\n activityLogHint: (link) => <>Alle sicherheitsrelevanten Aktivitäten findest du im {link('Aktivitätsprotokoll')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'Wir haben dir diese E-Mail gesendet, um dich als Administrator über wichtige Änderungen in deinem Workspace zu informieren.'\n : 'Wir haben dir diese E-Mail gesendet, um dich über wichtige Änderungen an deinem hintoric-Konto zu informieren.',\n formatDateTime: dateTimeFormatter('de-DE'),\n};\n\nexport const securityActivityAlertMessagesEn: SecurityActivityAlertMessages = {\n lang: 'en',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} made a security-relevant change on ${occurredAt}.`,\n guidance: () => \"If you didn't expect this change, review the activity now.\",\n reviewButton: 'Review activity',\n activityLogHint: (link) => <>You can see all security-relevant activity in the {link('activity log')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'We sent you this email to let you know, as an admin, about important changes in your workspace.'\n : 'We sent you this email to let you know about important changes to your hintoric account.',\n formatDateTime: dateTimeFormatter('en-GB'),\n};\n","import { Button } from '../../components/Button';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { Layout } from '../../components/Layout';\nimport { Typography } from '../../components/Typography';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { WaitlistWelcomeProps } from './types';\n\n/**\n * Sent right after someone joins the waitlist: a thank-you, what happens\n * next, one button to the website. Centred, like the other single-purpose\n * mails — logo, heading, two short paragraphs, button, sign-off.\n */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeEmail(props: WaitlistWelcomeProps) {\n const { messages } = props;\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <WaitlistWelcomeContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeContent({ messages, websiteUrl }: WaitlistWelcomeProps) {\n return (\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 8px', fontWeight: 400 }}>\n {messages.eyebrow}\n </Typography>\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '0 0 16px', fontFamily: emailFonts.heading }}>\n {messages.heading}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '12px' }}>\n {messages.body1}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {messages.body2}\n </Typography>\n <Button href={websiteUrl} size=\"lg\" fullWidth>\n {messages.cta}\n </Button>\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 0', fontWeight: 400 }}>\n {messages.signoff}\n </Typography>\n </div>\n );\n}\n\nexport interface RenderedWaitlistWelcome {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what SES, Resend and the like take. */\n/** @deprecated New consumers should not use this template. */\nexport async function renderWaitlistWelcome(props: WaitlistWelcomeProps): Promise<RenderedWaitlistWelcome> {\n const { html, text } = await renderEmail(<WaitlistWelcomeEmail {...props} />);\n return { subject: props.messages.subject, html, text };\n}\n","import type { WaitlistWelcomeMessages } from './types';\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesDe: WaitlistWelcomeMessages = {\n lang: 'de',\n subject: 'Du bist auf der Hintoric-Warteliste',\n preview: 'Willkommen an Bord — Hintoric',\n eyebrow: 'Danke, dass du dabei bist',\n heading: 'Willkommen bei Hintoric',\n body1: 'Alles erledigt. Sobald dein Platz frei wird, melden wir uns sofort — du bist einer der Ersten, die Hintoric ausprobieren dürfen.',\n body2: 'Bis dahin halten wir dich auf dem Laufenden. Wenn jemand aus deinem Umfeld auch dazugehören sollte, leite diese Mail gerne weiter.',\n cta: 'Zu hintoric.com',\n signoff: '— Dein Hintoric-Team',\n footer: 'Wir haben dir diese E-Mail gesendet, weil du dich für die Hintoric-Warteliste eingetragen hast.',\n};\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesEn: WaitlistWelcomeMessages = {\n lang: 'en',\n subject: \"You're on the Hintoric waitlist\",\n preview: 'Welcome aboard — Hintoric',\n eyebrow: 'Thanks for joining',\n heading: 'Welcome to Hintoric',\n body1: \"You're all set. As soon as your spot opens up we'll let you know — you'll be one of the first to try Hintoric.\",\n body2: \"Until then we'll keep you posted. If someone you know should be on the list too, feel free to forward this email.\",\n cta: 'Go to hintoric.com',\n signoff: '— Your Hintoric team',\n footer: 'We sent you this email because you signed up for the Hintoric waitlist.',\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityActivityAlertEmail.d.ts","sourceRoot":"","sources":["../../../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAgC,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAwBxF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,0BAA0B,+BAuB3E;AAED,qHAAqH;AACrH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,0BAA0B,+BAqC7E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,aAAa,CAAC,CAG3G"}
1
+ {"version":3,"file":"SecurityActivityAlertEmail.d.ts","sourceRoot":"","sources":["../../../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAgC,0BAA0B,EAAE,MAAM,SAAS,CAAC;AA6BxF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,0BAA0B,+BAuB3E;AAED,qHAAqH;AACrH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,0BAA0B,+BAqC7E;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,sFAAsF;AACtF,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,aAAa,CAAC,CAG3G"}
@@ -0,0 +1,20 @@
1
+ import { WaitlistWelcomeProps } from './types';
2
+ /**
3
+ * Sent right after someone joins the waitlist: a thank-you, what happens
4
+ * next, one button to the website. Centred, like the other single-purpose
5
+ * mails — logo, heading, two short paragraphs, button, sign-off.
6
+ */
7
+ /** @deprecated New consumers should not use this template. */
8
+ export declare function WaitlistWelcomeEmail(props: WaitlistWelcomeProps): import("react").JSX.Element;
9
+ /** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */
10
+ /** @deprecated New consumers should not use this template. */
11
+ export declare function WaitlistWelcomeContent({ messages, websiteUrl }: WaitlistWelcomeProps): import("react").JSX.Element;
12
+ export interface RenderedWaitlistWelcome {
13
+ subject: string;
14
+ html: string;
15
+ text: string;
16
+ }
17
+ /** Subject, HTML and plain-text body in one call — what SES, Resend and the like take. */
18
+ /** @deprecated New consumers should not use this template. */
19
+ export declare function renderWaitlistWelcome(props: WaitlistWelcomeProps): Promise<RenderedWaitlistWelcome>;
20
+ //# sourceMappingURL=WaitlistWelcomeEmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WaitlistWelcomeEmail.d.ts","sourceRoot":"","sources":["../../../src/templates/WaitlistWelcome/WaitlistWelcomeEmail.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD;;;;GAIG;AACH,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,+BAsB/D;AAED,qHAAqH;AACrH,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,oBAAoB,+BAwBpF;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0FAA0F;AAC1F,8DAA8D;AAC9D,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAGzG"}
@@ -0,0 +1,5 @@
1
+ export { WaitlistWelcomeEmail, WaitlistWelcomeContent, renderWaitlistWelcome } from './WaitlistWelcomeEmail';
2
+ export type { RenderedWaitlistWelcome } from './WaitlistWelcomeEmail';
3
+ export { waitlistWelcomeMessagesDe, waitlistWelcomeMessagesEn } from './messages';
4
+ export type { WaitlistWelcomeMessages, WaitlistWelcomeProps } from './types';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/WaitlistWelcome/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC7G,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { WaitlistWelcomeMessages } from './types';
2
+ /** @deprecated New consumers should not use this template. */
3
+ export declare const waitlistWelcomeMessagesDe: WaitlistWelcomeMessages;
4
+ /** @deprecated New consumers should not use this template. */
5
+ export declare const waitlistWelcomeMessagesEn: WaitlistWelcomeMessages;
6
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/templates/WaitlistWelcome/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB,EAAE,uBAWvC,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB,EAAE,uBAWvC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Every string the template shows. There are no built-in defaults — like the
3
+ * library's other blocks, the template doesn't decide what language its
4
+ * consumers speak. Pass `waitlistWelcomeMessagesDe` / `waitlistWelcomeMessagesEn`,
5
+ * or spread one and override what differs.
6
+ */
7
+ export interface WaitlistWelcomeMessages {
8
+ /** BCP 47 tag for `<html lang>`. */
9
+ lang: string;
10
+ subject: string;
11
+ /** The line inbox lists show after the subject. */
12
+ preview: string;
13
+ /** The small line above the heading. */
14
+ eyebrow: string;
15
+ heading: string;
16
+ body1: string;
17
+ body2: string;
18
+ cta: string;
19
+ signoff: string;
20
+ /** Under the card: why the reader got this mail. */
21
+ footer: string;
22
+ }
23
+ export interface WaitlistWelcomeProps {
24
+ messages: WaitlistWelcomeMessages;
25
+ /** Where the button leads — normally the marketing site. */
26
+ websiteUrl: string;
27
+ /** The sender's legal line under the footer — company, address. */
28
+ legalNotice?: string;
29
+ /** Previews only — see `Layout`. */
30
+ colorScheme?: 'light' | 'dark';
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/templates/WaitlistWelcome/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hintoric/email",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Transactional email components in @hintoric/ui's look, built on react-email.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -47,7 +47,7 @@
47
47
  "vite": "^8.2.2",
48
48
  "vite-plugin-dts": "^5.1.0",
49
49
  "vitest": "^4.1.11",
50
- "@hintoric/ui": "0.8.0"
50
+ "@hintoric/ui": "0.10.0"
51
51
  },
52
52
  "dependencies": {
53
53
  "@react-email/render": "^2.1.0",