@akin-travel/partner-sdk 1.0.5

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 (204) hide show
  1. package/README.md +1204 -0
  2. package/dist/account/components/AccountInfoSection.d.ts +46 -0
  3. package/dist/account/components/AccountInfoSection.d.ts.map +1 -0
  4. package/dist/account/components/AccountInfoSection.js +52 -0
  5. package/dist/account/components/AccountInfoSection.js.map +1 -0
  6. package/dist/account/components/NotificationPreferencesSection.d.ts +40 -0
  7. package/dist/account/components/NotificationPreferencesSection.d.ts.map +1 -0
  8. package/dist/account/components/NotificationPreferencesSection.js +116 -0
  9. package/dist/account/components/NotificationPreferencesSection.js.map +1 -0
  10. package/dist/account/components/PasskeySection.d.ts +49 -0
  11. package/dist/account/components/PasskeySection.d.ts.map +1 -0
  12. package/dist/account/components/PasskeySection.js +298 -0
  13. package/dist/account/components/PasskeySection.js.map +1 -0
  14. package/dist/account/hooks/useAccountForm.d.ts +23 -0
  15. package/dist/account/hooks/useAccountForm.d.ts.map +1 -0
  16. package/dist/account/hooks/useAccountForm.js +133 -0
  17. package/dist/account/hooks/useAccountForm.js.map +1 -0
  18. package/dist/account/index.d.ts +10 -0
  19. package/dist/account/index.d.ts.map +1 -0
  20. package/dist/account/index.js +21 -0
  21. package/dist/account/index.js.map +1 -0
  22. package/dist/auth/AkinAuthProvider.d.ts +31 -0
  23. package/dist/auth/AkinAuthProvider.d.ts.map +1 -0
  24. package/dist/auth/AkinAuthProvider.js +632 -0
  25. package/dist/auth/AkinAuthProvider.js.map +1 -0
  26. package/dist/auth/components/LoginForm.d.ts +63 -0
  27. package/dist/auth/components/LoginForm.d.ts.map +1 -0
  28. package/dist/auth/components/LoginForm.js +230 -0
  29. package/dist/auth/components/LoginForm.js.map +1 -0
  30. package/dist/auth/components/MagicLinkForm.d.ts +41 -0
  31. package/dist/auth/components/MagicLinkForm.d.ts.map +1 -0
  32. package/dist/auth/components/MagicLinkForm.js +88 -0
  33. package/dist/auth/components/MagicLinkForm.js.map +1 -0
  34. package/dist/auth/components/RequireAuth.d.ts +62 -0
  35. package/dist/auth/components/RequireAuth.d.ts.map +1 -0
  36. package/dist/auth/components/RequireAuth.js +63 -0
  37. package/dist/auth/components/RequireAuth.js.map +1 -0
  38. package/dist/auth/components/RequireGuest.d.ts +60 -0
  39. package/dist/auth/components/RequireGuest.d.ts.map +1 -0
  40. package/dist/auth/components/RequireGuest.js +64 -0
  41. package/dist/auth/components/RequireGuest.js.map +1 -0
  42. package/dist/auth/components/SignupForm.d.ts +45 -0
  43. package/dist/auth/components/SignupForm.d.ts.map +1 -0
  44. package/dist/auth/components/SignupForm.js +167 -0
  45. package/dist/auth/components/SignupForm.js.map +1 -0
  46. package/dist/auth/index.d.ts +10 -0
  47. package/dist/auth/index.d.ts.map +1 -0
  48. package/dist/auth/index.js +21 -0
  49. package/dist/auth/index.js.map +1 -0
  50. package/dist/client.d.ts +17 -0
  51. package/dist/client.d.ts.map +1 -0
  52. package/dist/client.js +136 -0
  53. package/dist/client.js.map +1 -0
  54. package/dist/components/PhoneInput.d.ts +62 -0
  55. package/dist/components/PhoneInput.d.ts.map +1 -0
  56. package/dist/components/PhoneInput.js +65 -0
  57. package/dist/components/PhoneInput.js.map +1 -0
  58. package/dist/components/index.d.ts +2 -0
  59. package/dist/components/index.d.ts.map +1 -0
  60. package/dist/components/index.js +9 -0
  61. package/dist/components/index.js.map +1 -0
  62. package/dist/config.d.ts +111 -0
  63. package/dist/config.d.ts.map +1 -0
  64. package/dist/config.js +56 -0
  65. package/dist/config.js.map +1 -0
  66. package/dist/constants/preferences.d.ts +22 -0
  67. package/dist/constants/preferences.d.ts.map +1 -0
  68. package/dist/constants/preferences.js +52 -0
  69. package/dist/constants/preferences.js.map +1 -0
  70. package/dist/currency/CurrencyProvider.d.ts +46 -0
  71. package/dist/currency/CurrencyProvider.d.ts.map +1 -0
  72. package/dist/currency/CurrencyProvider.js +145 -0
  73. package/dist/currency/CurrencyProvider.js.map +1 -0
  74. package/dist/currency/components/CurrencySelector.d.ts +43 -0
  75. package/dist/currency/components/CurrencySelector.d.ts.map +1 -0
  76. package/dist/currency/components/CurrencySelector.js +58 -0
  77. package/dist/currency/components/CurrencySelector.js.map +1 -0
  78. package/dist/currency/exchangeRates.d.ts +40 -0
  79. package/dist/currency/exchangeRates.d.ts.map +1 -0
  80. package/dist/currency/exchangeRates.js +90 -0
  81. package/dist/currency/exchangeRates.js.map +1 -0
  82. package/dist/currency/index.d.ts +6 -0
  83. package/dist/currency/index.d.ts.map +1 -0
  84. package/dist/currency/index.js +20 -0
  85. package/dist/currency/index.js.map +1 -0
  86. package/dist/header/components/CurrencyAccordion.d.ts +45 -0
  87. package/dist/header/components/CurrencyAccordion.d.ts.map +1 -0
  88. package/dist/header/components/CurrencyAccordion.js +54 -0
  89. package/dist/header/components/CurrencyAccordion.js.map +1 -0
  90. package/dist/header/components/HeaderMenu.d.ts +49 -0
  91. package/dist/header/components/HeaderMenu.d.ts.map +1 -0
  92. package/dist/header/components/HeaderMenu.js +95 -0
  93. package/dist/header/components/HeaderMenu.js.map +1 -0
  94. package/dist/header/components/LanguageAccordion.d.ts +45 -0
  95. package/dist/header/components/LanguageAccordion.d.ts.map +1 -0
  96. package/dist/header/components/LanguageAccordion.js +54 -0
  97. package/dist/header/components/LanguageAccordion.js.map +1 -0
  98. package/dist/header/components/UserAvatar.d.ts +26 -0
  99. package/dist/header/components/UserAvatar.d.ts.map +1 -0
  100. package/dist/header/components/UserAvatar.js +46 -0
  101. package/dist/header/components/UserAvatar.js.map +1 -0
  102. package/dist/header/index.d.ts +10 -0
  103. package/dist/header/index.d.ts.map +1 -0
  104. package/dist/header/index.js +13 -0
  105. package/dist/header/index.js.map +1 -0
  106. package/dist/i18n/I18nProvider.d.ts +57 -0
  107. package/dist/i18n/I18nProvider.d.ts.map +1 -0
  108. package/dist/i18n/I18nProvider.js +205 -0
  109. package/dist/i18n/I18nProvider.js.map +1 -0
  110. package/dist/i18n/components/LanguageSelector.d.ts +43 -0
  111. package/dist/i18n/components/LanguageSelector.d.ts.map +1 -0
  112. package/dist/i18n/components/LanguageSelector.js +57 -0
  113. package/dist/i18n/components/LanguageSelector.js.map +1 -0
  114. package/dist/i18n/index.d.ts +5 -0
  115. package/dist/i18n/index.d.ts.map +1 -0
  116. package/dist/i18n/index.js +14 -0
  117. package/dist/i18n/index.js.map +1 -0
  118. package/dist/i18n/translations/en.json +283 -0
  119. package/dist/i18n/translations/es.json +283 -0
  120. package/dist/index.d.ts +81 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +191 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/loyalty/AkinLoyaltyProvider.d.ts +18 -0
  125. package/dist/loyalty/AkinLoyaltyProvider.d.ts.map +1 -0
  126. package/dist/loyalty/AkinLoyaltyProvider.js +399 -0
  127. package/dist/loyalty/AkinLoyaltyProvider.js.map +1 -0
  128. package/dist/loyalty/components/LoyaltyCard.d.ts +48 -0
  129. package/dist/loyalty/components/LoyaltyCard.d.ts.map +1 -0
  130. package/dist/loyalty/components/LoyaltyCard.js +140 -0
  131. package/dist/loyalty/components/LoyaltyCard.js.map +1 -0
  132. package/dist/loyalty/components/PointsDisplay.d.ts +40 -0
  133. package/dist/loyalty/components/PointsDisplay.d.ts.map +1 -0
  134. package/dist/loyalty/components/PointsDisplay.js +32 -0
  135. package/dist/loyalty/components/PointsDisplay.js.map +1 -0
  136. package/dist/loyalty/components/PreviousStays.d.ts +59 -0
  137. package/dist/loyalty/components/PreviousStays.d.ts.map +1 -0
  138. package/dist/loyalty/components/PreviousStays.js +101 -0
  139. package/dist/loyalty/components/PreviousStays.js.map +1 -0
  140. package/dist/loyalty/components/SimpleTierCards.d.ts +51 -0
  141. package/dist/loyalty/components/SimpleTierCards.d.ts.map +1 -0
  142. package/dist/loyalty/components/SimpleTierCards.js +96 -0
  143. package/dist/loyalty/components/SimpleTierCards.js.map +1 -0
  144. package/dist/loyalty/components/TierCard.d.ts +30 -0
  145. package/dist/loyalty/components/TierCard.d.ts.map +1 -0
  146. package/dist/loyalty/components/TierCard.js +41 -0
  147. package/dist/loyalty/components/TierCard.js.map +1 -0
  148. package/dist/loyalty/components/TierProgress.d.ts +32 -0
  149. package/dist/loyalty/components/TierProgress.d.ts.map +1 -0
  150. package/dist/loyalty/components/TierProgress.js +41 -0
  151. package/dist/loyalty/components/TierProgress.js.map +1 -0
  152. package/dist/loyalty/components/TierRequirementsTable.d.ts +54 -0
  153. package/dist/loyalty/components/TierRequirementsTable.d.ts.map +1 -0
  154. package/dist/loyalty/components/TierRequirementsTable.js +104 -0
  155. package/dist/loyalty/components/TierRequirementsTable.js.map +1 -0
  156. package/dist/loyalty/components/TransactionList.d.ts +44 -0
  157. package/dist/loyalty/components/TransactionList.d.ts.map +1 -0
  158. package/dist/loyalty/components/TransactionList.js +112 -0
  159. package/dist/loyalty/components/TransactionList.js.map +1 -0
  160. package/dist/loyalty/components/UpcomingStays.d.ts +49 -0
  161. package/dist/loyalty/components/UpcomingStays.d.ts.map +1 -0
  162. package/dist/loyalty/components/UpcomingStays.js +60 -0
  163. package/dist/loyalty/components/UpcomingStays.js.map +1 -0
  164. package/dist/loyalty/index.d.ts +12 -0
  165. package/dist/loyalty/index.d.ts.map +1 -0
  166. package/dist/loyalty/index.js +27 -0
  167. package/dist/loyalty/index.js.map +1 -0
  168. package/dist/types/account.d.ts +108 -0
  169. package/dist/types/account.d.ts.map +1 -0
  170. package/dist/types/account.js +3 -0
  171. package/dist/types/account.js.map +1 -0
  172. package/dist/types/auth.d.ts +205 -0
  173. package/dist/types/auth.d.ts.map +1 -0
  174. package/dist/types/auth.js +3 -0
  175. package/dist/types/auth.js.map +1 -0
  176. package/dist/types/currency.d.ts +102 -0
  177. package/dist/types/currency.d.ts.map +1 -0
  178. package/dist/types/currency.js +3 -0
  179. package/dist/types/currency.js.map +1 -0
  180. package/dist/types/header.d.ts +105 -0
  181. package/dist/types/header.d.ts.map +1 -0
  182. package/dist/types/header.js +3 -0
  183. package/dist/types/header.js.map +1 -0
  184. package/dist/types/i18n.d.ts +90 -0
  185. package/dist/types/i18n.d.ts.map +1 -0
  186. package/dist/types/i18n.js +3 -0
  187. package/dist/types/i18n.js.map +1 -0
  188. package/dist/types/index.d.ts +3 -0
  189. package/dist/types/index.d.ts.map +1 -0
  190. package/dist/types/index.js +3 -0
  191. package/dist/types/index.js.map +1 -0
  192. package/dist/types/loyalty.d.ts +312 -0
  193. package/dist/types/loyalty.d.ts.map +1 -0
  194. package/dist/types/loyalty.js +3 -0
  195. package/dist/types/loyalty.js.map +1 -0
  196. package/dist/utils/index.d.ts +2 -0
  197. package/dist/utils/index.d.ts.map +1 -0
  198. package/dist/utils/index.js +10 -0
  199. package/dist/utils/index.js.map +1 -0
  200. package/dist/utils/tierLabels.d.ts +27 -0
  201. package/dist/utils/tierLabels.d.ts.map +1 -0
  202. package/dist/utils/tierLabels.js +110 -0
  203. package/dist/utils/tierLabels.js.map +1 -0
  204. package/package.json +60 -0
@@ -0,0 +1,48 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { LoyaltyCardRenderProps } from '../../types/loyalty';
3
+ interface LoyaltyCardProps {
4
+ /**
5
+ * Render function that receives loyalty card data
6
+ * Use this to build your own styled loyalty card
7
+ */
8
+ children: (props: LoyaltyCardRenderProps) => ReactNode;
9
+ /** Called when "Book now" button is clicked */
10
+ onBookNow?: () => void;
11
+ /** Called when "Add a stay" button is clicked */
12
+ onAddStay?: () => void;
13
+ /** Called when "Refer a friend" button is clicked */
14
+ onReferFriend?: () => void;
15
+ /** Called when "Set preferences" button is clicked */
16
+ onSetPreferences?: () => void;
17
+ }
18
+ /**
19
+ * Headless LoyaltyCard component
20
+ *
21
+ * Provides comprehensive loyalty data including stats and progress.
22
+ * Use this as the main loyalty card at the top of a rewards page.
23
+ *
24
+ * @example
25
+ * ```tsx
26
+ * <LoyaltyCard>
27
+ * {({ firstName, tierDisplayName, points, membershipYearStats, tierProgress }) => (
28
+ * <div className="loyalty-card">
29
+ * <h1>Welcome back, {firstName}!</h1>
30
+ * <div className="tier">{tierDisplayName}</div>
31
+ * <div className="points">{points.toLocaleString()} points</div>
32
+ * <div className="stats">
33
+ * <span>{membershipYearStats.totalStays} stays this year</span>
34
+ * <span>{membershipYearStats.totalNights} nights this year</span>
35
+ * </div>
36
+ * {tierProgress?.nextTier && (
37
+ * <div className="progress">
38
+ * {tierProgress.pointsToNextTier} points to next tier
39
+ * </div>
40
+ * )}
41
+ * </div>
42
+ * )}
43
+ * </LoyaltyCard>
44
+ * ```
45
+ */
46
+ export declare function LoyaltyCard({ children, onBookNow, onAddStay, onReferFriend, onSetPreferences, }: LoyaltyCardProps): import("react/jsx-runtime").JSX.Element;
47
+ export {};
48
+ //# sourceMappingURL=LoyaltyCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoyaltyCard.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/LoyaltyCard.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAW,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAE,sBAAsB,EAAc,MAAM,qBAAqB,CAAC;AAgB9E,UAAU,gBAAgB;IACxB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAGvD,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,EAAE,gBAAgB,2CAkElB"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ 'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.LoyaltyCard = LoyaltyCard;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const react_1 = __importStar(require("react"));
40
+ const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
41
+ const AkinAuthProvider_1 = require("../../auth/AkinAuthProvider");
42
+ /**
43
+ * Get the membership year dates based on calendar year
44
+ * Most loyalty programs use calendar year (Jan 1 - Dec 31)
45
+ */
46
+ function getMembershipYearDates() {
47
+ const now = new Date();
48
+ const currentYear = now.getFullYear();
49
+ return {
50
+ start: new Date(currentYear, 0, 1), // Jan 1
51
+ end: new Date(currentYear, 11, 31), // Dec 31
52
+ };
53
+ }
54
+ /**
55
+ * Headless LoyaltyCard component
56
+ *
57
+ * Provides comprehensive loyalty data including stats and progress.
58
+ * Use this as the main loyalty card at the top of a rewards page.
59
+ *
60
+ * @example
61
+ * ```tsx
62
+ * <LoyaltyCard>
63
+ * {({ firstName, tierDisplayName, points, membershipYearStats, tierProgress }) => (
64
+ * <div className="loyalty-card">
65
+ * <h1>Welcome back, {firstName}!</h1>
66
+ * <div className="tier">{tierDisplayName}</div>
67
+ * <div className="points">{points.toLocaleString()} points</div>
68
+ * <div className="stats">
69
+ * <span>{membershipYearStats.totalStays} stays this year</span>
70
+ * <span>{membershipYearStats.totalNights} nights this year</span>
71
+ * </div>
72
+ * {tierProgress?.nextTier && (
73
+ * <div className="progress">
74
+ * {tierProgress.pointsToNextTier} points to next tier
75
+ * </div>
76
+ * )}
77
+ * </div>
78
+ * )}
79
+ * </LoyaltyCard>
80
+ * ```
81
+ */
82
+ function LoyaltyCard({ children, onBookNow, onAddStay, onReferFriend, onSetPreferences, }) {
83
+ const { member } = (0, AkinAuthProvider_1.useAkinAuth)();
84
+ const { tier, tierConfig, tierConfigs, tierProgress, points, isLoading, previousStays } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
85
+ // Get membership year dates
86
+ const membershipYearDates = (0, react_1.useMemo)(() => getMembershipYearDates(), []);
87
+ // Default to TIER1 if no tier is set, and find the corresponding config
88
+ const effectiveTier = tier || 'TIER1';
89
+ const effectiveTierConfig = (0, react_1.useMemo)(() => {
90
+ if (tierConfig)
91
+ return tierConfig;
92
+ // Find TIER1 config as default
93
+ return tierConfigs.find((t) => t.tierName === 'TIER1') || null;
94
+ }, [tierConfig, tierConfigs]);
95
+ // Calculate stats from previous stays
96
+ const membershipYearStats = react_1.default.useMemo(() => {
97
+ const startOfYear = membershipYearDates.start;
98
+ const thisYearStays = previousStays.filter((s) => new Date(s.checkOut) >= startOfYear);
99
+ return {
100
+ points: thisYearStays.reduce((sum, s) => sum + (s.pointsEarned || 0), 0),
101
+ totalStays: thisYearStays.length,
102
+ originStays: 0, // Would need partner context to calculate
103
+ totalNights: thisYearStays.reduce((sum, s) => sum + s.nights, 0),
104
+ };
105
+ }, [previousStays, membershipYearDates.start]);
106
+ const lifetimeStats = react_1.default.useMemo(() => {
107
+ // Total network points = spendable + unspendable
108
+ const totalPoints = (member?.spendableNetworkPoints || 0) + (member?.unspendableNetworkPoints || 0);
109
+ return {
110
+ points: totalPoints,
111
+ totalStays: previousStays.length,
112
+ originStays: 0, // Would need partner context to calculate
113
+ totalNights: previousStays.reduce((sum, s) => sum + s.nights, 0),
114
+ };
115
+ }, [previousStays, member?.spendableNetworkPoints, member?.unspendableNetworkPoints]);
116
+ const props = {
117
+ firstName: member?.firstName || '',
118
+ fullName: member ? `${member.firstName} ${member.lastName}`.trim() : '',
119
+ loyaltyNumber: member?.loyaltyNumber || '',
120
+ currentTier: effectiveTier,
121
+ tierDisplayName: effectiveTierConfig?.displayName || null,
122
+ tierColor: effectiveTierConfig?.tierColor || null,
123
+ memberSince: member?.createdAt ? new Date(member.createdAt) : null,
124
+ membershipYearStart: membershipYearDates.start,
125
+ membershipYearEnd: membershipYearDates.end,
126
+ points,
127
+ lifetimePoints: lifetimeStats.points,
128
+ membershipYearStats,
129
+ lifetimeStats,
130
+ tierProgress,
131
+ isLoading,
132
+ // Action callbacks
133
+ onBookNow,
134
+ onAddStay,
135
+ onReferFriend,
136
+ onSetPreferences,
137
+ };
138
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
139
+ }
140
+ //# sourceMappingURL=LoyaltyCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoyaltyCard.js","sourceRoot":"","sources":["../../../src/loyalty/components/LoyaltyCard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { type ReactNode } from 'react';
2
+ interface PointsDisplayRenderProps {
3
+ /** Current points balance */
4
+ points: number;
5
+ /** Formatted points string (e.g., "1,234") */
6
+ formattedPoints: string;
7
+ /** Whether data is loading */
8
+ isLoading: boolean;
9
+ }
10
+ interface PointsDisplayProps {
11
+ /**
12
+ * Render function that receives points data
13
+ * Use this to build your own styled points display
14
+ */
15
+ children: (props: PointsDisplayRenderProps) => ReactNode;
16
+ /**
17
+ * Locale for number formatting
18
+ * @default 'en-US'
19
+ */
20
+ locale?: string;
21
+ }
22
+ /**
23
+ * Headless PointsDisplay component
24
+ *
25
+ * Provides points balance - you provide the UI.
26
+ *
27
+ * @example
28
+ * ```tsx
29
+ * <PointsDisplay>
30
+ * {({ formattedPoints, isLoading }) => (
31
+ * <div className="your-points">
32
+ * {isLoading ? 'Loading...' : `${formattedPoints} points`}
33
+ * </div>
34
+ * )}
35
+ * </PointsDisplay>
36
+ * ```
37
+ */
38
+ export declare function PointsDisplay({ children, locale }: PointsDisplayProps): import("react/jsx-runtime").JSX.Element;
39
+ export {};
40
+ //# sourceMappingURL=PointsDisplay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointsDisplay.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/PointsDisplay.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,UAAU,wBAAwB;IAChC,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAgB,EAAE,EAAE,kBAAkB,2CAU/E"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.PointsDisplay = PointsDisplay;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
7
+ /**
8
+ * Headless PointsDisplay component
9
+ *
10
+ * Provides points balance - you provide the UI.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <PointsDisplay>
15
+ * {({ formattedPoints, isLoading }) => (
16
+ * <div className="your-points">
17
+ * {isLoading ? 'Loading...' : `${formattedPoints} points`}
18
+ * </div>
19
+ * )}
20
+ * </PointsDisplay>
21
+ * ```
22
+ */
23
+ function PointsDisplay({ children, locale = 'en-US' }) {
24
+ const { points, isLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
25
+ const props = {
26
+ points,
27
+ formattedPoints: points.toLocaleString(locale),
28
+ isLoading,
29
+ };
30
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
31
+ }
32
+ //# sourceMappingURL=PointsDisplay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointsDisplay.js","sourceRoot":"","sources":["../../../src/loyalty/components/PointsDisplay.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA4Cb,sCAUC;;AAnDD,gEAAwD;AAyBxD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAsB;IAC9E,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IAE/C,MAAM,KAAK,GAA6B;QACtC,MAAM;QACN,eAAe,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QAC9C,SAAS;KACV,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { PreviousStaysRenderProps } from '../../types/loyalty';
3
+ interface PreviousStaysProps {
4
+ /**
5
+ * Render function that receives previous stays data
6
+ * Use this to build your own styled previous stays list
7
+ */
8
+ children: (props: PreviousStaysRenderProps) => ReactNode;
9
+ /**
10
+ * Number of stays to display initially and per page
11
+ * @default 10
12
+ */
13
+ limit?: number;
14
+ }
15
+ /**
16
+ * Headless PreviousStays component
17
+ *
18
+ * Provides previous stay data for display with pagination.
19
+ * Shows stays with past check-out dates, sorted most recent first.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <PreviousStays limit={10}>
24
+ * {({ stays, isEmpty, isLoading, hasMore, loadMore }) => (
25
+ * <div className="previous-stays">
26
+ * <h2>Previous Stays</h2>
27
+ * {isLoading && stays.length === 0 ? (
28
+ * <p>Loading...</p>
29
+ * ) : isEmpty ? (
30
+ * <p>No previous stays yet. Your travel history will appear here.</p>
31
+ * ) : (
32
+ * <>
33
+ * <ul>
34
+ * {stays.map((stay) => (
35
+ * <li key={stay.id}>
36
+ * <strong>{stay.propertyName}</strong>
37
+ * <span>{new Date(stay.checkOut).toLocaleDateString()}</span>
38
+ * <span>{stay.nights} nights</span>
39
+ * {stay.pointsEarned && (
40
+ * <span>+{stay.pointsEarned} points</span>
41
+ * )}
42
+ * </li>
43
+ * ))}
44
+ * </ul>
45
+ * {hasMore && (
46
+ * <button onClick={loadMore} disabled={isLoading}>
47
+ * {isLoading ? 'Loading...' : 'Load More'}
48
+ * </button>
49
+ * )}
50
+ * </>
51
+ * )}
52
+ * </div>
53
+ * )}
54
+ * </PreviousStays>
55
+ * ```
56
+ */
57
+ export declare function PreviousStays({ children, limit }: PreviousStaysProps): import("react/jsx-runtime").JSX.Element;
58
+ export {};
59
+ //# sourceMappingURL=PreviousStays.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviousStays.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/PreviousStays.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAyB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,UAAU,kBAAkB;IAC1B;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAEzD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAU,EAAE,EAAE,kBAAkB,2CAqBzE"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ 'use client';
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.PreviousStays = PreviousStays;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ const react_1 = __importStar(require("react"));
40
+ const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
41
+ /**
42
+ * Headless PreviousStays component
43
+ *
44
+ * Provides previous stay data for display with pagination.
45
+ * Shows stays with past check-out dates, sorted most recent first.
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * <PreviousStays limit={10}>
50
+ * {({ stays, isEmpty, isLoading, hasMore, loadMore }) => (
51
+ * <div className="previous-stays">
52
+ * <h2>Previous Stays</h2>
53
+ * {isLoading && stays.length === 0 ? (
54
+ * <p>Loading...</p>
55
+ * ) : isEmpty ? (
56
+ * <p>No previous stays yet. Your travel history will appear here.</p>
57
+ * ) : (
58
+ * <>
59
+ * <ul>
60
+ * {stays.map((stay) => (
61
+ * <li key={stay.id}>
62
+ * <strong>{stay.propertyName}</strong>
63
+ * <span>{new Date(stay.checkOut).toLocaleDateString()}</span>
64
+ * <span>{stay.nights} nights</span>
65
+ * {stay.pointsEarned && (
66
+ * <span>+{stay.pointsEarned} points</span>
67
+ * )}
68
+ * </li>
69
+ * ))}
70
+ * </ul>
71
+ * {hasMore && (
72
+ * <button onClick={loadMore} disabled={isLoading}>
73
+ * {isLoading ? 'Loading...' : 'Load More'}
74
+ * </button>
75
+ * )}
76
+ * </>
77
+ * )}
78
+ * </div>
79
+ * )}
80
+ * </PreviousStays>
81
+ * ```
82
+ */
83
+ function PreviousStays({ children, limit = 10 }) {
84
+ const { previousStays, isLoading: contextLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
85
+ const [displayCount, setDisplayCount] = (0, react_1.useState)(limit);
86
+ const displayedStays = react_1.default.useMemo(() => {
87
+ return previousStays.slice(0, displayCount);
88
+ }, [previousStays, displayCount]);
89
+ const loadMore = (0, react_1.useCallback)(() => {
90
+ setDisplayCount((prev) => prev + limit);
91
+ }, [limit]);
92
+ const props = {
93
+ stays: displayedStays,
94
+ isLoading: contextLoading,
95
+ hasMore: previousStays.length > displayCount,
96
+ loadMore,
97
+ isEmpty: previousStays.length === 0,
98
+ };
99
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
100
+ }
101
+ //# sourceMappingURL=PreviousStays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviousStays.js","sourceRoot":"","sources":["../../../src/loyalty/components/PreviousStays.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8Db,sCAqBC;;AAjFD,+CAAqE;AACrE,gEAAwD;AAiBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAsB;IACxE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IACtE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAExD,MAAM,cAAc,GAAG,eAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAElC,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE;QAChC,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAC1C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,KAAK,GAA6B;QACtC,KAAK,EAAE,cAAc;QACrB,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,YAAY;QAC5C,QAAQ;QACR,OAAO,EAAE,aAAa,CAAC,MAAM,KAAK,CAAC;KACpC,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { SimpleTierCardsRenderProps } from '../../types/loyalty';
3
+ interface SimpleTierCardsProps {
4
+ /**
5
+ * Partner name for dynamic labels (e.g., "Haka stays")
6
+ * @default 'Origin'
7
+ */
8
+ partnerName?: string;
9
+ /**
10
+ * Render function that receives tier card data
11
+ * Use this to build your own styled tier cards
12
+ */
13
+ children: (props: SimpleTierCardsRenderProps) => ReactNode;
14
+ }
15
+ /**
16
+ * Headless SimpleTierCards component
17
+ *
18
+ * Provides tier card data for building custom tier card displays.
19
+ * You provide the UI, we provide the data and utilities.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * <SimpleTierCards partnerName="Haka">
24
+ * {({ tierConfigs, formatRequirement, getTextColor }) => (
25
+ * <div className="grid grid-cols-4 gap-4">
26
+ * {tierConfigs.map((tier, index) => (
27
+ * <div
28
+ * key={tier.id}
29
+ * style={{
30
+ * backgroundColor: tier.tierColor || '#382108',
31
+ * color: getTextColor(tier.tierColor || '#382108'),
32
+ * }}
33
+ * className="p-4 rounded-lg"
34
+ * >
35
+ * <h3 className="text-2xl font-bold">{tier.displayName}</h3>
36
+ * <span className="text-sm">Tier {index + 1}</span>
37
+ * {tier.requirements?.filter(r => r.active).map(req => (
38
+ * <p key={req.id} className="text-xs opacity-80">
39
+ * {formatRequirement(req)}
40
+ * </p>
41
+ * ))}
42
+ * </div>
43
+ * ))}
44
+ * </div>
45
+ * )}
46
+ * </SimpleTierCards>
47
+ * ```
48
+ */
49
+ export declare function SimpleTierCards({ partnerName, children }: SimpleTierCardsProps): import("react/jsx-runtime").JSX.Element;
50
+ export {};
51
+ //# sourceMappingURL=SimpleTierCards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleTierCards.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/SimpleTierCards.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAW,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvD,OAAO,KAAK,EAAmB,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEvF,UAAU,oBAAoB;IAC5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;CAC5D;AAsBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,eAAe,CAAC,EAAE,WAAsB,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CA6CzF"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SimpleTierCards = SimpleTierCards;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const AkinLoyaltyProvider_1 = require("../AkinLoyaltyProvider");
8
+ const tierLabels_1 = require("../../utils/tierLabels");
9
+ /**
10
+ * Get a contrasting text color (black or white) based on background luminance
11
+ */
12
+ function getContrastingTextColor(bgColor) {
13
+ // Handle empty or invalid colors
14
+ if (!bgColor || !bgColor.startsWith('#')) {
15
+ return '#FFFFFF';
16
+ }
17
+ const hex = bgColor.replace('#', '');
18
+ const r = parseInt(hex.substr(0, 2), 16);
19
+ const g = parseInt(hex.substr(2, 2), 16);
20
+ const b = parseInt(hex.substr(4, 2), 16);
21
+ // Calculate relative luminance
22
+ const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
23
+ return luminance > 0.5 ? '#000000' : '#FFFFFF';
24
+ }
25
+ /**
26
+ * Headless SimpleTierCards component
27
+ *
28
+ * Provides tier card data for building custom tier card displays.
29
+ * You provide the UI, we provide the data and utilities.
30
+ *
31
+ * @example
32
+ * ```tsx
33
+ * <SimpleTierCards partnerName="Haka">
34
+ * {({ tierConfigs, formatRequirement, getTextColor }) => (
35
+ * <div className="grid grid-cols-4 gap-4">
36
+ * {tierConfigs.map((tier, index) => (
37
+ * <div
38
+ * key={tier.id}
39
+ * style={{
40
+ * backgroundColor: tier.tierColor || '#382108',
41
+ * color: getTextColor(tier.tierColor || '#382108'),
42
+ * }}
43
+ * className="p-4 rounded-lg"
44
+ * >
45
+ * <h3 className="text-2xl font-bold">{tier.displayName}</h3>
46
+ * <span className="text-sm">Tier {index + 1}</span>
47
+ * {tier.requirements?.filter(r => r.active).map(req => (
48
+ * <p key={req.id} className="text-xs opacity-80">
49
+ * {formatRequirement(req)}
50
+ * </p>
51
+ * ))}
52
+ * </div>
53
+ * ))}
54
+ * </div>
55
+ * )}
56
+ * </SimpleTierCards>
57
+ * ```
58
+ */
59
+ function SimpleTierCards({ partnerName = 'Origin', children }) {
60
+ const { tierConfigs, isLoading } = (0, AkinLoyaltyProvider_1.useAkinLoyalty)();
61
+ // Sort tiers by display order
62
+ const sortedTiers = (0, react_1.useMemo)(() => [...tierConfigs].sort((a, b) => a.displayOrder - b.displayOrder), [tierConfigs]);
63
+ /**
64
+ * Format a requirement for display (e.g., "10+ Origin stays")
65
+ */
66
+ const formatRequirement = (req) => {
67
+ const label = (0, tierLabels_1.getLabel)(req.requirementKey, partnerName, req.displayName);
68
+ const value = req.requirementValue;
69
+ // Achievement-type requirements just show the label (e.g., "By invitation")
70
+ if (req.requirementKey.startsWith('achievement_')) {
71
+ return label;
72
+ }
73
+ // Format based on operator
74
+ switch (req.operator) {
75
+ case 'gte':
76
+ return `${value}+ ${label}`;
77
+ case 'gt':
78
+ return `>${value} ${label}`;
79
+ case 'lte':
80
+ return `≤${value} ${label}`;
81
+ case 'lt':
82
+ return `<${value} ${label}`;
83
+ case 'eq':
84
+ default:
85
+ return `${value} ${label}`;
86
+ }
87
+ };
88
+ const props = {
89
+ tierConfigs: sortedTiers,
90
+ formatRequirement,
91
+ getTextColor: getContrastingTextColor,
92
+ isLoading,
93
+ };
94
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: children(props) });
95
+ }
96
+ //# sourceMappingURL=SimpleTierCards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleTierCards.js","sourceRoot":"","sources":["../../../src/loyalty/components/SimpleTierCards.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;AA0Eb,0CA6CC;;AArHD,iCAAuD;AACvD,gEAAwD;AACxD,uDAAkD;AAgBlD;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC9C,iCAAiC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzC,+BAA+B;IAC/B,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IAE5D,OAAO,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAgB,eAAe,CAAC,EAAE,WAAW,GAAG,QAAQ,EAAE,QAAQ,EAAwB;IACxF,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAA,oCAAc,GAAE,CAAC;IAEpD,8BAA8B;IAC9B,MAAM,WAAW,GAAG,IAAA,eAAO,EACzB,GAAG,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,EACtE,CAAC,WAAW,CAAC,CACd,CAAC;IAEF;;OAEG;IACH,MAAM,iBAAiB,GAAG,CAAC,GAAoB,EAAU,EAAE;QACzD,MAAM,KAAK,GAAG,IAAA,qBAAQ,EAAC,GAAG,CAAC,cAAc,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,CAAC;QAEnC,4EAA4E;QAC5E,IAAI,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2BAA2B;QAC3B,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,KAAK;gBACR,OAAO,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI;gBACP,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,KAAK;gBACR,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI;gBACP,OAAO,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC;YACV;gBACE,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,KAAK,GAA+B;QACxC,WAAW,EAAE,WAAW;QACxB,iBAAiB;QACjB,YAAY,EAAE,uBAAuB;QACrC,SAAS;KACV,CAAC;IAEF,OAAO,2DAAG,QAAQ,CAAC,KAAK,CAAC,GAAI,CAAC;AAChC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { TierCardRenderProps } from '../../types/loyalty';
3
+ interface TierCardProps {
4
+ /**
5
+ * Render function that receives tier data
6
+ * Use this to build your own styled tier card
7
+ */
8
+ children: (props: TierCardRenderProps) => ReactNode;
9
+ }
10
+ /**
11
+ * Headless TierCard component
12
+ *
13
+ * Provides tier data for display - you provide the UI.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <TierCard>
18
+ * {({ tier, displayName, color, points, loyaltyNumber }) => (
19
+ * <div style={{ backgroundColor: color }} className="your-tier-card">
20
+ * <h2>{displayName}</h2>
21
+ * <p>{points.toLocaleString()} points</p>
22
+ * <span>#{loyaltyNumber}</span>
23
+ * </div>
24
+ * )}
25
+ * </TierCard>
26
+ * ```
27
+ */
28
+ export declare function TierCard({ children }: TierCardProps): import("react/jsx-runtime").JSX.Element;
29
+ export {};
30
+ //# sourceMappingURL=TierCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TierCard.d.ts","sourceRoot":"","sources":["../../../src/loyalty/components/TierCard.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,UAAU,aAAa;IACrB;;;OAGG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;CACrD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAgBnD"}