@learncard/email-templates 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +189 -0
  3. package/dist/branding.d.ts +36 -0
  4. package/dist/branding.d.ts.map +1 -0
  5. package/dist/branding.js +28 -0
  6. package/dist/branding.js.map +1 -0
  7. package/dist/components/CodeBlock.d.ts +16 -0
  8. package/dist/components/CodeBlock.d.ts.map +1 -0
  9. package/dist/components/CodeBlock.js +42 -0
  10. package/dist/components/CodeBlock.js.map +1 -0
  11. package/dist/components/EmailButton.d.ts +15 -0
  12. package/dist/components/EmailButton.d.ts.map +1 -0
  13. package/dist/components/EmailButton.js +20 -0
  14. package/dist/components/EmailButton.js.map +1 -0
  15. package/dist/components/IssuerLogo.d.ts +14 -0
  16. package/dist/components/IssuerLogo.d.ts.map +1 -0
  17. package/dist/components/IssuerLogo.js +23 -0
  18. package/dist/components/IssuerLogo.js.map +1 -0
  19. package/dist/components/Layout.d.ts +19 -0
  20. package/dist/components/Layout.d.ts.map +1 -0
  21. package/dist/components/Layout.js +95 -0
  22. package/dist/components/Layout.js.map +1 -0
  23. package/dist/components/LinkFallback.d.ts +12 -0
  24. package/dist/components/LinkFallback.d.ts.map +1 -0
  25. package/dist/components/LinkFallback.js +29 -0
  26. package/dist/components/LinkFallback.js.map +1 -0
  27. package/dist/index.d.ts +24 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +28 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/previews/_fixtures.d.ts +12 -0
  32. package/dist/previews/_fixtures.d.ts.map +1 -0
  33. package/dist/previews/_fixtures.js +34 -0
  34. package/dist/previews/_fixtures.js.map +1 -0
  35. package/dist/previews/account-approved-scenarios.d.ts +5 -0
  36. package/dist/previews/account-approved-scenarios.d.ts.map +1 -0
  37. package/dist/previews/account-approved-scenarios.js +7 -0
  38. package/dist/previews/account-approved-scenarios.js.map +1 -0
  39. package/dist/previews/endorsement-request-scenarios.d.ts +5 -0
  40. package/dist/previews/endorsement-request-scenarios.d.ts.map +1 -0
  41. package/dist/previews/endorsement-request-scenarios.js +7 -0
  42. package/dist/previews/endorsement-request-scenarios.js.map +1 -0
  43. package/dist/previews/guardian-approval-scenarios.d.ts +5 -0
  44. package/dist/previews/guardian-approval-scenarios.d.ts.map +1 -0
  45. package/dist/previews/guardian-approval-scenarios.js +7 -0
  46. package/dist/previews/guardian-approval-scenarios.js.map +1 -0
  47. package/dist/previews/guardian-credential-scenarios.d.ts +5 -0
  48. package/dist/previews/guardian-credential-scenarios.d.ts.map +1 -0
  49. package/dist/previews/guardian-credential-scenarios.js +11 -0
  50. package/dist/previews/guardian-credential-scenarios.js.map +1 -0
  51. package/dist/previews/inbox-claim-scenarios.d.ts +8 -0
  52. package/dist/previews/inbox-claim-scenarios.d.ts.map +1 -0
  53. package/dist/previews/inbox-claim-scenarios.js +7 -0
  54. package/dist/previews/inbox-claim-scenarios.js.map +1 -0
  55. package/dist/previews/recovery-key-scenarios.d.ts +5 -0
  56. package/dist/previews/recovery-key-scenarios.d.ts.map +1 -0
  57. package/dist/previews/recovery-key-scenarios.js +7 -0
  58. package/dist/previews/recovery-key-scenarios.js.map +1 -0
  59. package/dist/previews/verification-code-scenarios.d.ts +5 -0
  60. package/dist/previews/verification-code-scenarios.d.ts.map +1 -0
  61. package/dist/previews/verification-code-scenarios.js +7 -0
  62. package/dist/previews/verification-code-scenarios.js.map +1 -0
  63. package/dist/render.d.ts +185 -0
  64. package/dist/render.d.ts.map +1 -0
  65. package/dist/render.js +153 -0
  66. package/dist/render.js.map +1 -0
  67. package/dist/sms.d.ts +34 -0
  68. package/dist/sms.d.ts.map +1 -0
  69. package/dist/sms.js +34 -0
  70. package/dist/sms.js.map +1 -0
  71. package/dist/templates/account-approved.d.ts +17 -0
  72. package/dist/templates/account-approved.d.ts.map +1 -0
  73. package/dist/templates/account-approved.js +46 -0
  74. package/dist/templates/account-approved.js.map +1 -0
  75. package/dist/templates/credential-awaiting-guardian.d.ts +25 -0
  76. package/dist/templates/credential-awaiting-guardian.d.ts.map +1 -0
  77. package/dist/templates/credential-awaiting-guardian.js +65 -0
  78. package/dist/templates/credential-awaiting-guardian.js.map +1 -0
  79. package/dist/templates/email-verification.d.ts +21 -0
  80. package/dist/templates/email-verification.d.ts.map +1 -0
  81. package/dist/templates/email-verification.js +51 -0
  82. package/dist/templates/email-verification.js.map +1 -0
  83. package/dist/templates/endorsement-request.d.ts +28 -0
  84. package/dist/templates/endorsement-request.d.ts.map +1 -0
  85. package/dist/templates/endorsement-request.js +67 -0
  86. package/dist/templates/endorsement-request.js.map +1 -0
  87. package/dist/templates/guardian-approval.d.ts +23 -0
  88. package/dist/templates/guardian-approval.d.ts.map +1 -0
  89. package/dist/templates/guardian-approval.js +50 -0
  90. package/dist/templates/guardian-approval.js.map +1 -0
  91. package/dist/templates/guardian-approved-claim.d.ts +22 -0
  92. package/dist/templates/guardian-approved-claim.d.ts.map +1 -0
  93. package/dist/templates/guardian-approved-claim.js +49 -0
  94. package/dist/templates/guardian-approved-claim.js.map +1 -0
  95. package/dist/templates/guardian-credential-approval.d.ts +27 -0
  96. package/dist/templates/guardian-credential-approval.d.ts.map +1 -0
  97. package/dist/templates/guardian-credential-approval.js +51 -0
  98. package/dist/templates/guardian-credential-approval.js.map +1 -0
  99. package/dist/templates/guardian-email-otp.d.ts +16 -0
  100. package/dist/templates/guardian-email-otp.d.ts.map +1 -0
  101. package/dist/templates/guardian-email-otp.js +49 -0
  102. package/dist/templates/guardian-email-otp.js.map +1 -0
  103. package/dist/templates/guardian-rejected-credential.d.ts +24 -0
  104. package/dist/templates/guardian-rejected-credential.d.ts.map +1 -0
  105. package/dist/templates/guardian-rejected-credential.js +44 -0
  106. package/dist/templates/guardian-rejected-credential.js.map +1 -0
  107. package/dist/templates/inbox-claim.d.ts +28 -0
  108. package/dist/templates/inbox-claim.d.ts.map +1 -0
  109. package/dist/templates/inbox-claim.js +58 -0
  110. package/dist/templates/inbox-claim.js.map +1 -0
  111. package/dist/templates/index.d.ts +25 -0
  112. package/dist/templates/index.d.ts.map +1 -0
  113. package/dist/templates/index.js +13 -0
  114. package/dist/templates/index.js.map +1 -0
  115. package/dist/templates/recovery-key.d.ts +15 -0
  116. package/dist/templates/recovery-key.d.ts.map +1 -0
  117. package/dist/templates/recovery-key.js +46 -0
  118. package/dist/templates/recovery-key.js.map +1 -0
  119. package/dist/templates/verification-code.d.ts +24 -0
  120. package/dist/templates/verification-code.d.ts.map +1 -0
  121. package/dist/templates/verification-code.js +87 -0
  122. package/dist/templates/verification-code.js.map +1 -0
  123. package/dist/tenant-registry.d.ts +48 -0
  124. package/dist/tenant-registry.d.ts.map +1 -0
  125. package/dist/tenant-registry.js +146 -0
  126. package/dist/tenant-registry.js.map +1 -0
  127. package/package.json +40 -0
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @learncard/email-templates
3
+ *
4
+ * Git-managed, tenant-branded email and SMS templates for LearnCard services.
5
+ *
6
+ * Usage:
7
+ * import { renderEmail, renderSms, resolveBranding } from '@learncard/email-templates';
8
+ *
9
+ * const { html, text, subject } = await renderEmail('inbox-claim', branding, {
10
+ * claimUrl: 'https://...',
11
+ * credential: { name: 'Badge' },
12
+ * issuer: { name: 'Acme' },
13
+ * });
14
+ */
15
+ export { resolveBranding, DEFAULT_BRANDING } from './branding';
16
+ export type { TenantBranding } from './branding';
17
+ export { renderEmail } from './render';
18
+ export type { RenderedEmail, TemplateId, TemplateDataMap } from './render';
19
+ export type { VerificationCodeData, EmailVerificationData, InboxClaimData, GuardianApprovalData, AccountApprovedData, RecoveryKeyData, EndorsementRequestData, CredentialAwaitingGuardianData, GuardianApprovedClaimData, GuardianCredentialApprovalData, GuardianEmailOtpData, GuardianRejectedCredentialData, } from './render';
20
+ export { renderSms } from './sms';
21
+ export type { SmsTemplateId, SmsTemplateDataMap, SmsInboxClaimData, SmsVerificationData } from './sms';
22
+ export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding } from './tenant-registry';
23
+ export type { ResolvedTenant, RequestHeaders } from './tenant-registry';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3E,YAAY,EACR,oBAAoB,EACpB,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,sBAAsB,EACtB,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,8BAA8B,GACjC,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAGvG,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC5G,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @learncard/email-templates
3
+ *
4
+ * Git-managed, tenant-branded email and SMS templates for LearnCard services.
5
+ *
6
+ * Usage:
7
+ * import { renderEmail, renderSms, resolveBranding } from '@learncard/email-templates';
8
+ *
9
+ * const { html, text, subject } = await renderEmail('inbox-claim', branding, {
10
+ * claimUrl: 'https://...',
11
+ * credential: { name: 'Badge' },
12
+ * issuer: { name: 'Acme' },
13
+ * });
14
+ */
15
+ // Branding
16
+ export { resolveBranding, DEFAULT_BRANDING } from './branding';
17
+ // Email rendering
18
+ export { renderEmail } from './render';
19
+ // SMS rendering
20
+ export { renderSms } from './sms';
21
+ // Server-side tenant resolution
22
+ export { resolveTenantFromRequest, registerOriginMapping, registerTenantBranding } from './tenant-registry';
23
+ // Template components are intentionally NOT re-exported from the barrel.
24
+ // They contain JSX (.tsx) and would force every transitive consumer to
25
+ // configure `jsx` in their tsconfig. Use renderEmail() / renderSms() instead.
26
+ // For direct component access (testing / preview), import from
27
+ // '@learncard/email-templates/src/templates' explicitly.
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,WAAW;AACX,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,kBAAkB;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAiBvC,gBAAgB;AAChB,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGlC,gCAAgC;AAChC,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAG5G,yEAAyE;AACzE,uEAAuE;AACvE,8EAA8E;AAC9E,+DAA+D;AAC/D,yDAAyD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared preview fixtures — reusable branding configs and data objects
3
+ * for multi-scenario email previews.
4
+ */
5
+ import * as React from 'react';
6
+ import type { TenantBranding } from '../branding';
7
+ export declare const LEARNCARD_BRANDING: TenantBranding;
8
+ export declare const VETPASS_BRANDING: TenantBranding;
9
+ export declare const ScenarioDivider: React.FC<{
10
+ label: string;
11
+ }>;
12
+ //# sourceMappingURL=_fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fixtures.d.ts","sourceRoot":"","sources":["../../src/previews/_fixtures.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,eAAO,MAAM,kBAAkB,gBAAmB,CAAC;AAEnD,eAAO,MAAM,gBAAgB,EAAE,cAW7B,CAAC;AAMH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAiBvD,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DEFAULT_BRANDING, resolveBranding } from '../branding';
3
+ // ---------------------------------------------------------------------------
4
+ // Branding presets
5
+ // ---------------------------------------------------------------------------
6
+ export const LEARNCARD_BRANDING = DEFAULT_BRANDING;
7
+ export const VETPASS_BRANDING = resolveBranding({
8
+ brandName: 'VetPass',
9
+ logoUrl: 'https://vetpass.app/assets/icon/icon.png',
10
+ logoAlt: 'VetPass',
11
+ primaryColor: '#1B5E20',
12
+ primaryTextColor: '#ffffff',
13
+ supportEmail: 'support@vetpass.app',
14
+ websiteUrl: 'https://www.vetpass.app',
15
+ appUrl: 'https://vetpass.app',
16
+ fromDomain: 'vetpass.app',
17
+ copyrightHolder: 'VetPass',
18
+ });
19
+ // ---------------------------------------------------------------------------
20
+ // Scenario divider — renders a labeled horizontal rule between scenarios
21
+ // ---------------------------------------------------------------------------
22
+ export const ScenarioDivider = ({ label }) => (_jsx("div", { style: {
23
+ padding: '24px 0 16px',
24
+ textAlign: 'center',
25
+ fontFamily: 'ui-monospace, monospace',
26
+ fontSize: 11,
27
+ fontWeight: 600,
28
+ color: '#6b7280',
29
+ letterSpacing: '0.05em',
30
+ textTransform: 'uppercase',
31
+ borderTop: '2px dashed #d1d5db',
32
+ marginTop: 48,
33
+ }, children: label }));
34
+ //# sourceMappingURL=_fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_fixtures.js","sourceRoot":"","sources":["../../src/previews/_fixtures.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGhE,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAEnD,MAAM,CAAC,MAAM,gBAAgB,GAAmB,eAAe,CAAC;IAC5D,SAAS,EAAE,SAAS;IACpB,OAAO,EAAE,0CAA0C;IACnD,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,gBAAgB,EAAE,SAAS;IAC3B,YAAY,EAAE,qBAAqB;IACnC,UAAU,EAAE,yBAAyB;IACrC,MAAM,EAAE,qBAAqB;IAC7B,UAAU,EAAE,aAAa;IACzB,eAAe,EAAE,SAAS;CAC7B,CAAC,CAAC;AAEH,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAE9E,MAAM,CAAC,MAAM,eAAe,GAAgC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACvE,cACI,KAAK,EAAE;QACH,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,QAAQ;QACnB,UAAU,EAAE,yBAAyB;QACrC,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,GAAG;QACf,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,QAAQ;QACvB,aAAa,EAAE,WAAW;QAC1B,SAAS,EAAE,oBAAoB;QAC/B,SAAS,EAAE,EAAE;KAChB,YAEA,KAAK,GACJ,CACT,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * account-approved — all preview scenarios stacked.
3
+ */
4
+ export default function AccountApprovedScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=account-approved-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-approved-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/account-approved-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,OAAO,UAAU,wBAAwB,4CAqB/C"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AccountApproved } from '../templates/account-approved';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function AccountApprovedScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "With user display name" }), _jsx(AccountApproved, { branding: LEARNCARD_BRANDING, user: { displayName: 'Jane Doe' } }), _jsx(ScenarioDivider, { label: "No user info (fallback greeting)" }), _jsx(AccountApproved, { branding: LEARNCARD_BRANDING }), _jsx(ScenarioDivider, { label: "VetPass tenant branding" }), _jsx(AccountApproved, { branding: VETPASS_BRANDING, user: { displayName: 'Sgt. Alex Rivera' } })] }));
6
+ }
7
+ //# sourceMappingURL=account-approved-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-approved-scenarios.js","sourceRoot":"","sources":["../../src/previews/account-approved-scenarios.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,wBAAwB;IAC5C,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,wBAAwB,GAAG,EAClD,KAAC,eAAe,IACZ,QAAQ,EAAE,kBAAkB,EAC5B,IAAI,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,GACnC,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,kCAAkC,GAAG,EAC5D,KAAC,eAAe,IACZ,QAAQ,EAAE,kBAAkB,GAC9B,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAyB,GAAG,EACnD,KAAC,eAAe,IACZ,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,GAC3C,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * endorsement-request — all preview scenarios stacked.
3
+ */
4
+ export default function EndorsementRequestScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=endorsement-request-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endorsement-request-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/endorsement-request-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,OAAO,UAAU,2BAA2B,4CAwClD"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { EndorsementRequest } from '../templates/endorsement-request';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function EndorsementRequestScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Full \u2014 issuer + credential + message + recipient" }), _jsx(EndorsementRequest, { branding: LEARNCARD_BRANDING, shareLink: "https://learncard.app/share/xyz789", recipient: { name: 'Dr. Emily Chen' }, issuer: { name: 'John Doe', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' }, credential: { name: 'Professional Teaching Certificate' }, message: "I would greatly appreciate your endorsement of my teaching credential. We worked together at Springfield Academy for 3 years." }), _jsx(ScenarioDivider, { label: "Minimal \u2014 no recipient name, no credential, no message" }), _jsx(EndorsementRequest, { branding: LEARNCARD_BRANDING, shareLink: "https://learncard.app/share/xyz789", issuer: { name: 'John Doe' } }), _jsx(ScenarioDivider, { label: "With message, no credential name" }), _jsx(EndorsementRequest, { branding: LEARNCARD_BRANDING, shareLink: "https://learncard.app/share/xyz789", recipient: { name: 'Dr. Emily Chen' }, issuer: { name: 'John Doe' }, message: "Would you be willing to endorse my professional qualifications?" }), _jsx(ScenarioDivider, { label: "VetPass tenant branding" }), _jsx(EndorsementRequest, { branding: VETPASS_BRANDING, shareLink: "https://vetpass.app/share/abc456", recipient: { name: 'Col. Sarah Mitchell' }, issuer: { name: 'Sgt. Alex Rivera' }, credential: { name: 'Leadership Training Certificate' }, message: "Requesting your endorsement for my leadership training completed at Fort Bragg." })] }));
6
+ }
7
+ //# sourceMappingURL=endorsement-request-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endorsement-request-scenarios.js","sourceRoot":"","sources":["../../src/previews/endorsement-request-scenarios.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,2BAA2B;IAC/C,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,uDAAkD,GAAG,EAC5E,KAAC,kBAAkB,IACf,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAC,oCAAoC,EAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EACrC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,uDAAuD,EAAE,EAC9F,UAAU,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE,EACzD,OAAO,EAAC,+HAA+H,GACzI,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,6DAAwD,GAAG,EAClF,KAAC,kBAAkB,IACf,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAC,oCAAoC,EAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAC9B,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,kCAAkC,GAAG,EAC5D,KAAC,kBAAkB,IACf,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAC,oCAAoC,EAC9C,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,EACrC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAC5B,OAAO,EAAC,iEAAiE,GAC3E,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAyB,GAAG,EACnD,KAAC,kBAAkB,IACf,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAC,kCAAkC,EAC5C,SAAS,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAC1C,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EACpC,UAAU,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,EACvD,OAAO,EAAC,iFAAiF,GAC3F,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * guardian-approval — all preview scenarios stacked.
3
+ */
4
+ export default function GuardianApprovalScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=guardian-approval-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian-approval-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/guardian-approval-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,OAAO,UAAU,yBAAyB,4CA6BhD"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { GuardianApproval } from '../templates/guardian-approval';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function GuardianApprovalScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Full \u2014 requester name + guardian email" }), _jsx(GuardianApproval, { branding: LEARNCARD_BRANDING, approvalUrl: "https://learncard.app/approve?token=abc123", approvalToken: "abc123", requester: { displayName: 'Alex Smith', profileId: 'alex-smith-123' }, guardian: { email: 'parent@example.com' } }), _jsx(ScenarioDivider, { label: "Minimal \u2014 no requester name (fallback to 'Someone')" }), _jsx(GuardianApproval, { branding: LEARNCARD_BRANDING, approvalUrl: "https://learncard.app/approve?token=abc123", approvalToken: "abc123" }), _jsx(ScenarioDivider, { label: "VetPass tenant branding" }), _jsx(GuardianApproval, { branding: VETPASS_BRANDING, approvalUrl: "https://vetpass.app/approve?token=xyz789", approvalToken: "xyz789", requester: { displayName: 'Jamie Rodriguez' }, guardian: { email: 'guardian@example.com' } })] }));
6
+ }
7
+ //# sourceMappingURL=guardian-approval-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian-approval-scenarios.js","sourceRoot":"","sources":["../../src/previews/guardian-approval-scenarios.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,yBAAyB;IAC7C,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,6CAAwC,GAAG,EAClE,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAC,4CAA4C,EACxD,aAAa,EAAC,QAAQ,EACtB,SAAS,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,EACrE,QAAQ,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAC3C,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,0DAAqD,GAAG,EAC/E,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAC,4CAA4C,EACxD,aAAa,EAAC,QAAQ,GACxB,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAyB,GAAG,EACnD,KAAC,gBAAgB,IACb,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAC,0CAA0C,EACtD,aAAa,EAAC,QAAQ,EACtB,SAAS,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAC7C,QAAQ,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAC7C,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Guardian credential flow — approval, awaiting, approved, rejected scenarios.
3
+ */
4
+ export default function GuardianCredentialScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=guardian-credential-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian-credential-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/guardian-credential-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAWH,MAAM,CAAC,OAAO,UAAU,2BAA2B,4CA0ElD"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { GuardianCredentialApproval } from '../templates/guardian-credential-approval';
3
+ import { CredentialAwaitingGuardian } from '../templates/credential-awaiting-guardian';
4
+ import { GuardianApprovedClaim } from '../templates/guardian-approved-claim';
5
+ import { GuardianRejectedCredential } from '../templates/guardian-rejected-credential';
6
+ import { GuardianEmailOtp } from '../templates/guardian-email-otp';
7
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
8
+ export default function GuardianCredentialScenarios() {
9
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Guardian credential approval \u2014 full" }), _jsx(GuardianCredentialApproval, { branding: LEARNCARD_BRANDING, approvalUrl: "https://learncard.app/guardian/approve?token=abc123", approvalToken: "abc123", issuer: { name: 'Springfield School District', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' }, credential: { name: 'Perfect Attendance Award' }, recipient: { email: 'student@example.com' } }), _jsx(ScenarioDivider, { label: "Guardian credential approval \u2014 minimal (no issuer logo)" }), _jsx(GuardianCredentialApproval, { branding: LEARNCARD_BRANDING, approvalUrl: "https://learncard.app/guardian/approve?token=abc123", approvalToken: "abc123", credential: { name: 'Science Fair Winner' }, recipient: { email: 'kid@example.com' } }), _jsx(ScenarioDivider, { label: "Credential awaiting guardian \u2014 full" }), _jsx(CredentialAwaitingGuardian, { branding: LEARNCARD_BRANDING, issuer: { name: 'Springfield School District', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' }, credential: { name: 'Perfect Attendance Award' }, recipient: { email: 'student@example.com' } }), _jsx(ScenarioDivider, { label: "Guardian approved claim \u2014 full" }), _jsx(GuardianApprovedClaim, { branding: LEARNCARD_BRANDING, issuer: { name: 'Springfield School District', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' }, credential: { name: 'Perfect Attendance Award' } }), _jsx(ScenarioDivider, { label: "Guardian approved claim \u2014 no credential name" }), _jsx(GuardianApprovedClaim, { branding: LEARNCARD_BRANDING, issuer: { name: 'Springfield School District' } }), _jsx(ScenarioDivider, { label: "Guardian rejected credential \u2014 full" }), _jsx(GuardianRejectedCredential, { branding: LEARNCARD_BRANDING, issuer: { name: 'Springfield School District' }, credential: { name: 'Perfect Attendance Award' }, recipient: { email: 'student@example.com' } }), _jsx(ScenarioDivider, { label: "Guardian rejected credential \u2014 no credential name" }), _jsx(GuardianRejectedCredential, { branding: LEARNCARD_BRANDING, issuer: { name: 'Springfield School District' } }), _jsx(ScenarioDivider, { label: "Guardian email OTP" }), _jsx(GuardianEmailOtp, { branding: LEARNCARD_BRANDING, verificationCode: "847293" }), _jsx(ScenarioDivider, { label: "VetPass \u2014 guardian credential approval" }), _jsx(GuardianCredentialApproval, { branding: VETPASS_BRANDING, approvalUrl: "https://vetpass.app/guardian/approve?token=xyz789", approvalToken: "xyz789", issuer: { name: 'VA Medical Center' }, credential: { name: 'Health Records Access' }, recipient: { email: 'veteran@example.com' } })] }));
10
+ }
11
+ //# sourceMappingURL=guardian-credential-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardian-credential-scenarios.js","sourceRoot":"","sources":["../../src/previews/guardian-credential-scenarios.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * inbox-claim — all preview scenarios stacked.
3
+ *
4
+ * Covers: full info, minimal info, no issuer, no credential name,
5
+ * no recipient name, and custom tenant branding.
6
+ */
7
+ export default function InboxClaimScenarios(): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=inbox-claim-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-claim-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/inbox-claim-scenarios.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,CAAC,OAAO,UAAU,mBAAmB,4CAqD1C"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { InboxClaim } from '../templates/inbox-claim';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function InboxClaimScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Full \u2014 issuer + credential + recipient" }), _jsx(InboxClaim, { branding: LEARNCARD_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe', email: 'jane@example.com' }, issuer: { name: 'Acme University', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' }, credential: { name: 'Bachelor of Science', type: 'Achievement' } }), _jsx(ScenarioDivider, { label: "Minimal \u2014 no issuer, no credential name, no recipient name" }), _jsx(InboxClaim, { branding: LEARNCARD_BRANDING, claimUrl: "https://learncard.app/claim/abc123" }), _jsx(ScenarioDivider, { label: "No issuer branding (no logo, no name)" }), _jsx(InboxClaim, { branding: LEARNCARD_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe' }, credential: { name: 'Professional Teaching Certificate', type: 'Achievement' } }), _jsx(ScenarioDivider, { label: "Issuer name only (no logo)" }), _jsx(InboxClaim, { branding: LEARNCARD_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe' }, issuer: { name: 'Springfield School District' }, credential: { name: 'Perfect Attendance Award' } }), _jsx(ScenarioDivider, { label: "No credential name (fallback to 'achievement')" }), _jsx(InboxClaim, { branding: LEARNCARD_BRANDING, claimUrl: "https://learncard.app/claim/abc123", recipient: { name: 'Jane Doe' }, issuer: { name: 'Acme University', logoUrl: 'https://cdn.filestackcontent.com/J6suaVcQ467W9o1k48Kj' } }), _jsx(ScenarioDivider, { label: "VetPass tenant branding" }), _jsx(InboxClaim, { branding: VETPASS_BRANDING, claimUrl: "https://vetpass.app/claim/xyz789", recipient: { name: 'Sgt. Alex Rivera' }, issuer: { name: 'US Department of Veterans Affairs' }, credential: { name: 'DD-214 Service Record', type: 'record' } })] }));
6
+ }
7
+ //# sourceMappingURL=inbox-claim-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox-claim-scenarios.js","sourceRoot":"","sources":["../../src/previews/inbox-claim-scenarios.tsx"],"names":[],"mappings":";AASA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,mBAAmB;IACvC,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,6CAAwC,GAAG,EAClE,KAAC,UAAU,IACP,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAC,oCAAoC,EAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAC1D,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,uDAAuD,EAAE,EACrG,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa,EAAE,GAClE,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,iEAA4D,GAAG,EACtF,KAAC,UAAU,IACP,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAC,oCAAoC,GAC/C,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,uCAAuC,GAAG,EACjE,KAAC,UAAU,IACP,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAC,oCAAoC,EAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAC/B,UAAU,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE,IAAI,EAAE,aAAa,EAAE,GAChF,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,4BAA4B,GAAG,EACtD,KAAC,UAAU,IACP,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAC,oCAAoC,EAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAC/C,UAAU,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,GAClD,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,gDAAgD,GAAG,EAC1E,KAAC,UAAU,IACP,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAC,oCAAoC,EAC7C,SAAS,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,uDAAuD,EAAE,GACvG,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAyB,GAAG,EACnD,KAAC,UAAU,IACP,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAC,kCAAkC,EAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EACvC,MAAM,EAAE,EAAE,IAAI,EAAE,mCAAmC,EAAE,EACrD,UAAU,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAC/D,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * recovery-key — all preview scenarios stacked.
3
+ */
4
+ export default function RecoveryKeyScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=recovery-key-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-key-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/recovery-key-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,OAAO,UAAU,oBAAoB,4CAsB3C"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { RecoveryKey } from '../templates/recovery-key';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function RecoveryKeyScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Default \u2014 LearnCard branding" }), _jsx(RecoveryKey, { branding: LEARNCARD_BRANDING, recoveryKey: "mango-delta-fox-echo-bravo-seven-lima-niner" }), _jsx(ScenarioDivider, { label: "Long recovery key (wrapping test)" }), _jsx(RecoveryKey, { branding: LEARNCARD_BRANDING, recoveryKey: "alpha-bravo-charlie-delta-echo-foxtrot-golf-hotel-india-juliet-kilo-lima" }), _jsx(ScenarioDivider, { label: "VetPass tenant branding" }), _jsx(RecoveryKey, { branding: VETPASS_BRANDING, recoveryKey: "sierra-tango-uniform-victor-whiskey-xray" })] }));
6
+ }
7
+ //# sourceMappingURL=recovery-key-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-key-scenarios.js","sourceRoot":"","sources":["../../src/previews/recovery-key-scenarios.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,oBAAoB;IACxC,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,mCAA8B,GAAG,EACxD,KAAC,WAAW,IACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAC,6CAA6C,GAC3D,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,mCAAmC,GAAG,EAC7D,KAAC,WAAW,IACR,QAAQ,EAAE,kBAAkB,EAC5B,WAAW,EAAC,0EAA0E,GACxF,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAyB,GAAG,EACnD,KAAC,WAAW,IACR,QAAQ,EAAE,gBAAgB,EAC1B,WAAW,EAAC,0CAA0C,GACxD,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * verification-code — all variant + branding scenarios stacked.
3
+ */
4
+ export default function VerificationCodeScenarios(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=verification-code-scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-code-scenarios.d.ts","sourceRoot":"","sources":["../../src/previews/verification-code-scenarios.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,CAAC,OAAO,UAAU,yBAAyB,4CAkDhD"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { VerificationCode } from '../templates/verification-code';
3
+ import { LEARNCARD_BRANDING, VETPASS_BRANDING, ScenarioDivider } from './_fixtures';
4
+ export default function VerificationCodeScenarios() {
5
+ return (_jsxs(_Fragment, { children: [_jsx(ScenarioDivider, { label: "Login \u2014 with email" }), _jsx(VerificationCode, { branding: LEARNCARD_BRANDING, verificationCode: "847293", verificationEmail: "jane@example.com", variant: "login" }), _jsx(ScenarioDivider, { label: "Login \u2014 no email" }), _jsx(VerificationCode, { branding: LEARNCARD_BRANDING, verificationCode: "847293", variant: "login" }), _jsx(ScenarioDivider, { label: "Recovery email \u2014 with email" }), _jsx(VerificationCode, { branding: LEARNCARD_BRANDING, verificationCode: "192837", verificationEmail: "backup@example.com", variant: "recovery-email" }), _jsx(ScenarioDivider, { label: "Embed verification \u2014 with email" }), _jsx(VerificationCode, { branding: LEARNCARD_BRANDING, verificationCode: "564738", verificationEmail: "student@school.edu", variant: "embed-verification" }), _jsx(ScenarioDivider, { label: "Contact method" }), _jsx(VerificationCode, { branding: LEARNCARD_BRANDING, verificationCode: "029384", variant: "contact-method" }), _jsx(ScenarioDivider, { label: "VetPass \u2014 login variant" }), _jsx(VerificationCode, { branding: VETPASS_BRANDING, verificationCode: "738291", verificationEmail: "vet@example.com", variant: "login" })] }));
6
+ }
7
+ //# sourceMappingURL=verification-code-scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification-code-scenarios.js","sourceRoot":"","sources":["../../src/previews/verification-code-scenarios.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpF,MAAM,CAAC,OAAO,UAAU,yBAAyB;IAC7C,OAAO,CACH,8BACI,KAAC,eAAe,IAAC,KAAK,EAAC,yBAAoB,GAAG,EAC9C,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAC,QAAQ,EACzB,iBAAiB,EAAC,kBAAkB,EACpC,OAAO,EAAC,OAAO,GACjB,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,uBAAkB,GAAG,EAC5C,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAC,QAAQ,EACzB,OAAO,EAAC,OAAO,GACjB,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,kCAA6B,GAAG,EACvD,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAC,QAAQ,EACzB,iBAAiB,EAAC,oBAAoB,EACtC,OAAO,EAAC,gBAAgB,GAC1B,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,sCAAiC,GAAG,EAC3D,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAC,QAAQ,EACzB,iBAAiB,EAAC,oBAAoB,EACtC,OAAO,EAAC,oBAAoB,GAC9B,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,gBAAgB,GAAG,EAC1C,KAAC,gBAAgB,IACb,QAAQ,EAAE,kBAAkB,EAC5B,gBAAgB,EAAC,QAAQ,EACzB,OAAO,EAAC,gBAAgB,GAC1B,EAEF,KAAC,eAAe,IAAC,KAAK,EAAC,8BAAyB,GAAG,EACnD,KAAC,gBAAgB,IACb,QAAQ,EAAE,gBAAgB,EAC1B,gBAAgB,EAAC,QAAQ,EACzB,iBAAiB,EAAC,iBAAiB,EACnC,OAAO,EAAC,OAAO,GACjB,IACH,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * render.ts — the main rendering entry point.
3
+ *
4
+ * Consumers call `renderEmail(templateId, branding, data)` and get back
5
+ * `{ html, text, subject }` — ready to hand to any email provider.
6
+ *
7
+ * Template IDs map to the IDs used by brain-service and lca-api today,
8
+ * so migration can happen one template at a time.
9
+ */
10
+ import type { TenantBranding } from './branding';
11
+ export interface RenderedEmail {
12
+ html: string;
13
+ text: string;
14
+ subject: string;
15
+ }
16
+ /**
17
+ * Template ID → data shape mapping.
18
+ *
19
+ * Keys are the template IDs / aliases used at call sites in brain-service and lca-api.
20
+ * This provides full type safety: `renderEmail('inbox-claim', branding, data)` will
21
+ * require `data` to match `InboxClaimData`.
22
+ */
23
+ export interface TemplateDataMap {
24
+ /** brain-service: contact-methods.ts, embed flow */
25
+ 'embed-email-verification': VerificationCodeData;
26
+ /** brain-service: contact-methods.ts — link-based email verification */
27
+ 'contact-method-verification': EmailVerificationData;
28
+ /** lca-api: firebase.ts login flow */
29
+ 'login-verification-code': VerificationCodeData;
30
+ /** Postmark alias for login-verification-code */
31
+ 'contact-method-verification-1': VerificationCodeData;
32
+ /** lca-api: keys.ts recovery email verification */
33
+ 'recovery-email-code': VerificationCodeData;
34
+ /** Postmark alias for recovery-email-code */
35
+ 'recovery-email-verification': VerificationCodeData;
36
+ /** brain-service: inbox.helpers.ts */
37
+ 'inbox-claim': InboxClaimData;
38
+ /** Postmark alias for inbox-claim */
39
+ 'universal-inbox-claim': InboxClaimData;
40
+ /** brain-service: inbox.ts */
41
+ 'guardian-approval': GuardianApprovalData;
42
+ /** brain-service: inbox.ts */
43
+ 'account-approved': AccountApprovedData;
44
+ /** Postmark alias for account-approved */
45
+ 'account-approved-email': AccountApprovedData;
46
+ /** lca-api: keys.ts */
47
+ 'recovery-key': RecoveryKeyData;
48
+ /** Postmark alias for recovery-key */
49
+ 'recovery-key-backup': RecoveryKeyData;
50
+ /** lca-api: credentials.ts */
51
+ 'endorsement-request': EndorsementRequestData;
52
+ /** Postmark alias for endorsement-request */
53
+ 'universal-inbox-claim-1': EndorsementRequestData;
54
+ /** Sent to student: credential pending guardian approval */
55
+ 'credential-awaiting-guardian': CredentialAwaitingGuardianData;
56
+ /** Sent to student: guardian approved credential */
57
+ 'guardian-approved-claim': GuardianApprovedClaimData;
58
+ /** Sent to guardian: approve/decline a specific credential */
59
+ 'guardian-credential-approval': GuardianCredentialApprovalData;
60
+ /** Sent to guardian: OTP for identity verification */
61
+ 'guardian-email-otp': GuardianEmailOtpData;
62
+ /** Sent to student: guardian rejected credential */
63
+ 'guardian-rejected-credential': GuardianRejectedCredentialData;
64
+ }
65
+ export type TemplateId = keyof TemplateDataMap;
66
+ export interface VerificationCodeData {
67
+ verificationCode: string;
68
+ verificationEmail?: string;
69
+ }
70
+ export interface EmailVerificationData {
71
+ verificationToken: string;
72
+ recipient?: {
73
+ name?: string;
74
+ };
75
+ }
76
+ export interface InboxClaimData {
77
+ claimUrl: string;
78
+ recipient?: {
79
+ name?: string;
80
+ email?: string;
81
+ phone?: string;
82
+ };
83
+ issuer?: {
84
+ name?: string;
85
+ logoUrl?: string;
86
+ };
87
+ credential?: {
88
+ name?: string;
89
+ type?: string;
90
+ };
91
+ }
92
+ export interface GuardianApprovalData {
93
+ approvalUrl: string;
94
+ approvalToken: string;
95
+ requester?: {
96
+ displayName?: string;
97
+ profileId?: string;
98
+ };
99
+ guardian?: {
100
+ email?: string;
101
+ };
102
+ }
103
+ export interface AccountApprovedData {
104
+ user?: {
105
+ displayName?: string;
106
+ };
107
+ }
108
+ export interface RecoveryKeyData {
109
+ recoveryKey: string;
110
+ }
111
+ export interface EndorsementRequestData {
112
+ shareLink: string;
113
+ recipient?: {
114
+ name?: string;
115
+ email?: string;
116
+ };
117
+ issuer?: {
118
+ name?: string;
119
+ logoUrl?: string;
120
+ };
121
+ credential?: {
122
+ name?: string;
123
+ type?: string;
124
+ };
125
+ message?: string;
126
+ }
127
+ export interface CredentialAwaitingGuardianData {
128
+ issuer?: {
129
+ name?: string;
130
+ logoUrl?: string;
131
+ };
132
+ credential?: {
133
+ name?: string;
134
+ };
135
+ recipient?: {
136
+ email?: string;
137
+ };
138
+ }
139
+ export interface GuardianApprovedClaimData {
140
+ issuer?: {
141
+ name?: string;
142
+ logoUrl?: string;
143
+ };
144
+ credential?: {
145
+ name?: string;
146
+ };
147
+ }
148
+ export interface GuardianCredentialApprovalData {
149
+ approvalUrl: string;
150
+ approvalToken?: string;
151
+ issuer?: {
152
+ name?: string;
153
+ logoUrl?: string;
154
+ };
155
+ credential?: {
156
+ name?: string;
157
+ };
158
+ recipient?: {
159
+ email?: string;
160
+ };
161
+ }
162
+ export interface GuardianEmailOtpData {
163
+ verificationCode: string;
164
+ }
165
+ export interface GuardianRejectedCredentialData {
166
+ issuer?: {
167
+ name?: string;
168
+ };
169
+ credential?: {
170
+ name?: string;
171
+ };
172
+ recipient?: {
173
+ email?: string;
174
+ };
175
+ }
176
+ /**
177
+ * Render a fully branded email for the given template.
178
+ *
179
+ * @param templateId — one of the known template IDs
180
+ * @param branding — partial tenant branding (missing fields use LearnCard defaults)
181
+ * @param data — template-specific data
182
+ * @returns `{ html, text, subject }` ready for any email adapter
183
+ */
184
+ export declare function renderEmail<T extends TemplateId>(templateId: T, branding: Partial<TenantBranding> | TenantBranding, data: TemplateDataMap[T]): Promise<RenderedEmail>;
185
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}