@echoform/echo-ui 0.1.1 → 0.2.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 (147) hide show
  1. package/README.md +57 -10
  2. package/dist/components/EchoChangeProfileNameModal.d.ts +59 -0
  3. package/dist/components/EchoChangeProfileNameModal.d.ts.map +1 -0
  4. package/dist/components/EchoChangeProfileNameModal.js +317 -0
  5. package/dist/components/EchoChangeProfileNameModal.js.map +1 -0
  6. package/dist/components/EchoColorPicker.d.ts +34 -0
  7. package/dist/components/EchoColorPicker.d.ts.map +1 -0
  8. package/dist/components/EchoColorPicker.js +206 -0
  9. package/dist/components/EchoColorPicker.js.map +1 -0
  10. package/dist/components/EchoConnectedAppsModal.d.ts +40 -0
  11. package/dist/components/EchoConnectedAppsModal.d.ts.map +1 -0
  12. package/dist/components/EchoConnectedAppsModal.js +220 -0
  13. package/dist/components/EchoConnectedAppsModal.js.map +1 -0
  14. package/dist/components/EchoDeleteProfilePanel.d.ts +63 -0
  15. package/dist/components/EchoDeleteProfilePanel.d.ts.map +1 -0
  16. package/dist/components/EchoDeleteProfilePanel.js +286 -0
  17. package/dist/components/EchoDeleteProfilePanel.js.map +1 -0
  18. package/dist/components/EchoDeletionIntercept.d.ts +39 -0
  19. package/dist/components/EchoDeletionIntercept.d.ts.map +1 -0
  20. package/dist/components/EchoDeletionIntercept.js +212 -0
  21. package/dist/components/EchoDeletionIntercept.js.map +1 -0
  22. package/dist/components/EchoDeletionStatusCard.d.ts +35 -0
  23. package/dist/components/EchoDeletionStatusCard.d.ts.map +1 -0
  24. package/dist/components/EchoDeletionStatusCard.js +156 -0
  25. package/dist/components/EchoDeletionStatusCard.js.map +1 -0
  26. package/dist/components/EchoEmblem.d.ts +1 -1
  27. package/dist/components/EchoEmblemPicker.d.ts +71 -0
  28. package/dist/components/EchoEmblemPicker.d.ts.map +1 -0
  29. package/dist/components/EchoEmblemPicker.js +490 -0
  30. package/dist/components/EchoEmblemPicker.js.map +1 -0
  31. package/dist/components/EchoErrorBanner.d.ts +17 -0
  32. package/dist/components/EchoErrorBanner.d.ts.map +1 -0
  33. package/dist/components/EchoErrorBanner.js +48 -0
  34. package/dist/components/EchoErrorBanner.js.map +1 -0
  35. package/dist/components/EchoFormField.d.ts +27 -0
  36. package/dist/components/EchoFormField.d.ts.map +1 -0
  37. package/dist/components/EchoFormField.js +49 -0
  38. package/dist/components/EchoFormField.js.map +1 -0
  39. package/dist/components/EchoLinkButton.d.ts +16 -0
  40. package/dist/components/EchoLinkButton.d.ts.map +1 -0
  41. package/dist/components/EchoLinkButton.js +37 -0
  42. package/dist/components/EchoLinkButton.js.map +1 -0
  43. package/dist/components/EchoMoreScreen.d.ts +47 -0
  44. package/dist/components/EchoMoreScreen.d.ts.map +1 -0
  45. package/dist/components/EchoMoreScreen.js +121 -0
  46. package/dist/components/EchoMoreScreen.js.map +1 -0
  47. package/dist/components/EchoPasswordField.d.ts +28 -0
  48. package/dist/components/EchoPasswordField.d.ts.map +1 -0
  49. package/dist/components/EchoPasswordField.js +67 -0
  50. package/dist/components/EchoPasswordField.js.map +1 -0
  51. package/dist/components/EchoPrimaryButton.d.ts +23 -0
  52. package/dist/components/EchoPrimaryButton.d.ts.map +1 -0
  53. package/dist/components/EchoPrimaryButton.js +54 -0
  54. package/dist/components/EchoPrimaryButton.js.map +1 -0
  55. package/dist/components/EchoProfileCard.d.ts +7 -3
  56. package/dist/components/EchoProfileCard.d.ts.map +1 -1
  57. package/dist/components/EchoProfileCard.js +5 -10
  58. package/dist/components/EchoProfileCard.js.map +1 -1
  59. package/dist/components/EchoProfileDivider.d.ts +14 -0
  60. package/dist/components/EchoProfileDivider.d.ts.map +1 -0
  61. package/dist/components/EchoProfileDivider.js +31 -0
  62. package/dist/components/EchoProfileDivider.js.map +1 -0
  63. package/dist/components/EchoProfileHero.d.ts +48 -0
  64. package/dist/components/EchoProfileHero.d.ts.map +1 -0
  65. package/dist/components/EchoProfileHero.js +215 -0
  66. package/dist/components/EchoProfileHero.js.map +1 -0
  67. package/dist/components/EchoProfileOverview.d.ts +18 -0
  68. package/dist/components/EchoProfileOverview.d.ts.map +1 -0
  69. package/dist/components/EchoProfileOverview.js +36 -0
  70. package/dist/components/EchoProfileOverview.js.map +1 -0
  71. package/dist/components/EchoProfileRow.d.ts +60 -0
  72. package/dist/components/EchoProfileRow.d.ts.map +1 -0
  73. package/dist/components/EchoProfileRow.js +113 -0
  74. package/dist/components/EchoProfileRow.js.map +1 -0
  75. package/dist/components/EchoProfileSection.d.ts +29 -0
  76. package/dist/components/EchoProfileSection.d.ts.map +1 -0
  77. package/dist/components/EchoProfileSection.js +58 -0
  78. package/dist/components/EchoProfileSection.js.map +1 -0
  79. package/dist/components/EchoRewardNotificationBanner.d.ts +61 -0
  80. package/dist/components/EchoRewardNotificationBanner.d.ts.map +1 -0
  81. package/dist/components/EchoRewardNotificationBanner.js +272 -0
  82. package/dist/components/EchoRewardNotificationBanner.js.map +1 -0
  83. package/dist/components/EchoSettingsRow.d.ts +24 -0
  84. package/dist/components/EchoSettingsRow.d.ts.map +1 -0
  85. package/dist/components/EchoSettingsRow.js +84 -0
  86. package/dist/components/EchoSettingsRow.js.map +1 -0
  87. package/dist/components/EchoSettingsSection.d.ts +16 -0
  88. package/dist/components/EchoSettingsSection.d.ts.map +1 -0
  89. package/dist/components/EchoSettingsSection.js +48 -0
  90. package/dist/components/EchoSettingsSection.js.map +1 -0
  91. package/dist/components/EchoSignOutButton.d.ts +28 -0
  92. package/dist/components/EchoSignOutButton.d.ts.map +1 -0
  93. package/dist/components/EchoSignOutButton.js +67 -0
  94. package/dist/components/EchoSignOutButton.js.map +1 -0
  95. package/dist/components/EchoSuccessBanner.d.ts +17 -0
  96. package/dist/components/EchoSuccessBanner.d.ts.map +1 -0
  97. package/dist/components/EchoSuccessBanner.js +48 -0
  98. package/dist/components/EchoSuccessBanner.js.map +1 -0
  99. package/dist/components/EchoSyncPanel.d.ts +165 -0
  100. package/dist/components/EchoSyncPanel.d.ts.map +1 -0
  101. package/dist/components/EchoSyncPanel.js +913 -0
  102. package/dist/components/EchoSyncPanel.js.map +1 -0
  103. package/dist/components/EchoSyncPromptModal.d.ts +87 -0
  104. package/dist/components/EchoSyncPromptModal.d.ts.map +1 -0
  105. package/dist/components/EchoSyncPromptModal.js +351 -0
  106. package/dist/components/EchoSyncPromptModal.js.map +1 -0
  107. package/dist/components/EchoTitlePicker.d.ts +72 -0
  108. package/dist/components/EchoTitlePicker.d.ts.map +1 -0
  109. package/dist/components/EchoTitlePicker.js +487 -0
  110. package/dist/components/EchoTitlePicker.js.map +1 -0
  111. package/dist/components/EchoVerificationCodeInput.d.ts +40 -0
  112. package/dist/components/EchoVerificationCodeInput.d.ts.map +1 -0
  113. package/dist/components/EchoVerificationCodeInput.js +140 -0
  114. package/dist/components/EchoVerificationCodeInput.js.map +1 -0
  115. package/dist/components/EchoWelcome.d.ts +44 -0
  116. package/dist/components/EchoWelcome.d.ts.map +1 -0
  117. package/dist/components/EchoWelcome.js +289 -0
  118. package/dist/components/EchoWelcome.js.map +1 -0
  119. package/dist/components/EchoWhyBecomeAnEchoModal.d.ts +34 -0
  120. package/dist/components/EchoWhyBecomeAnEchoModal.d.ts.map +1 -0
  121. package/dist/components/EchoWhyBecomeAnEchoModal.js +321 -0
  122. package/dist/components/EchoWhyBecomeAnEchoModal.js.map +1 -0
  123. package/dist/components/EchoformInfoButton.d.ts +27 -0
  124. package/dist/components/EchoformInfoButton.d.ts.map +1 -0
  125. package/dist/components/EchoformInfoButton.js +60 -0
  126. package/dist/components/EchoformInfoButton.js.map +1 -0
  127. package/dist/components/EchoformInfoModal.d.ts +63 -0
  128. package/dist/components/EchoformInfoModal.d.ts.map +1 -0
  129. package/dist/components/EchoformInfoModal.js +347 -0
  130. package/dist/components/EchoformInfoModal.js.map +1 -0
  131. package/dist/echoColors.d.ts +58 -0
  132. package/dist/echoColors.d.ts.map +1 -0
  133. package/dist/echoColors.js +94 -0
  134. package/dist/echoColors.js.map +1 -0
  135. package/dist/index.d.ts +64 -3
  136. package/dist/index.d.ts.map +1 -1
  137. package/dist/index.js +71 -4
  138. package/dist/index.js.map +1 -1
  139. package/dist/titleRarity.d.ts +5 -0
  140. package/dist/titleRarity.d.ts.map +1 -1
  141. package/dist/titleRarity.js +13 -0
  142. package/dist/titleRarity.js.map +1 -1
  143. package/package.json +2 -3
  144. package/dist/components/EchoUITest.d.ts +0 -14
  145. package/dist/components/EchoUITest.d.ts.map +0 -1
  146. package/dist/components/EchoUITest.js +0 -53
  147. package/dist/components/EchoUITest.js.map +0 -1
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * EchoProfileSection
4
+ *
5
+ * Presentation-only section card used in the signed-in Echo Profile screen.
6
+ * Extracted from the Echo UI Reference sectionCard pattern.
7
+ *
8
+ * Renders a dark surface card with XL radius, 1px border, hidden overflow,
9
+ * and an uppercase section header label above the supplied children.
10
+ *
11
+ * When `accentColor` is supplied, the border uses `${accentColor}33`,
12
+ * matching the signed-in profile's per-section Echo Color treatment.
13
+ *
14
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
15
+ * Canonical shared component for @echoform/echo-ui.
16
+ */
17
+ var __importDefault = (this && this.__importDefault) || function (mod) {
18
+ return (mod && mod.__esModule) ? mod : { "default": mod };
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.EchoProfileSection = EchoProfileSection;
22
+ const react_1 = __importDefault(require("react"));
23
+ const react_native_1 = require("react-native");
24
+ const theme_1 = require("../theme");
25
+ // ─────────────────────────────────────────────────────────────────────────────
26
+ // Component
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ function EchoProfileSection({ title, accentColor, children, }) {
29
+ const borderColor = accentColor ? accentColor + '33' : theme_1.COLORS.border;
30
+ return (<react_native_1.View style={[styles.card, { borderColor }]}>
31
+ <react_native_1.Text style={styles.label} accessibilityRole="header">
32
+ {title}
33
+ </react_native_1.Text>
34
+ {children}
35
+ </react_native_1.View>);
36
+ }
37
+ // ─────────────────────────────────────────────────────────────────────────────
38
+ // Styles
39
+ // ─────────────────────────────────────────────────────────────────────────────
40
+ const styles = react_native_1.StyleSheet.create({
41
+ card: {
42
+ backgroundColor: theme_1.COLORS.surface,
43
+ borderRadius: theme_1.RADIUS.xl,
44
+ borderWidth: 1,
45
+ overflow: 'hidden',
46
+ },
47
+ label: {
48
+ fontSize: theme_1.FONTS.xs,
49
+ fontWeight: '700',
50
+ color: theme_1.COLORS.textMuted,
51
+ letterSpacing: 1.2,
52
+ textTransform: 'uppercase',
53
+ paddingHorizontal: theme_1.SPACING.lg,
54
+ paddingTop: theme_1.SPACING.md,
55
+ paddingBottom: theme_1.SPACING.xs,
56
+ },
57
+ });
58
+ //# sourceMappingURL=EchoProfileSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileSection.js","sourceRoot":"","sources":["../../src/components/EchoProfileSection.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;AA0BH,gDAeC;AAvCD,kDAA0B;AAC1B,+CAAsD;AACtD,oCAA0D;AAkB1D,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,SAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,QAAQ,GACgB;IACxB,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,cAAM,CAAC,MAAM,CAAC;IAErE,OAAO,CACL,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAC1C;MAAA,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CACnD;QAAA,CAAC,KAAK,CACR;MAAA,EAAE,mBAAI,CACN;MAAA,CAAC,QAAQ,CACX;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE;QACJ,eAAe,EAAE,cAAM,CAAC,OAAO;QAC/B,YAAY,EAAK,cAAM,CAAC,EAAE;QAC1B,WAAW,EAAM,CAAC;QAClB,QAAQ,EAAS,QAAQ;KAC1B;IACD,KAAK,EAAE;QACL,QAAQ,EAAW,aAAK,CAAC,EAAE;QAC3B,UAAU,EAAS,KAAK;QACxB,KAAK,EAAc,cAAM,CAAC,SAAS;QACnC,aAAa,EAAM,GAAG;QACtB,aAAa,EAAM,WAAW;QAC9B,iBAAiB,EAAE,eAAO,CAAC,EAAE;QAC7B,UAAU,EAAS,eAAO,CAAC,EAAE;QAC7B,aAAa,EAAM,eAAO,CAAC,EAAE;KAC9B;CACF,CAAC,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * EchoRewardNotificationBanner
3
+ *
4
+ * Generic Echo Profile reward modal. Shown whenever new Echo Titles or
5
+ * Emblems are unlocked during a session.
6
+ *
7
+ * Extracted from RewardNotificationBanner in the Echo UI Reference.
8
+ *
9
+ * DESIGN PHILOSOPHY
10
+ * ─────────────────
11
+ * The dialog uses a purple Echo-ecosystem treatment and communicates the
12
+ * *category* of reward unlocked (Title / Emblem / both) without revealing
13
+ * specific names, individual reward counts, or badge details. Discovery of
14
+ * the exact reward happens by opening the Echo Profile. This keeps the
15
+ * component generic and suitable for reuse across any Echoform app that
16
+ * grants Echo Profile rewards.
17
+ *
18
+ * MESSAGE LOGIC
19
+ * ─────────────
20
+ * Title-only → "New Echo Reward Unlocked!" / "You unlocked a new Echo Title."
21
+ * Emblem-only → "New Echo Reward Unlocked!" / "You unlocked a new Echo Emblem."
22
+ * Both → "New Echo Rewards Unlocked!" / "You unlocked new Echo Titles and Echo Emblems."
23
+ * Fallback → "New Echo Reward Unlocked!" / "Something new has been added to your Echo Profile."
24
+ *
25
+ * BEHAVIOR
26
+ * ────────
27
+ * • Renders as a centered transparent Modal with a dark backdrop.
28
+ * • Remains visible until the user explicitly taps Continue.
29
+ * • Backdrop taps, Android Back, and auto-dismiss timers are all disabled.
30
+ * • Host supplies the artwork image source.
31
+ *
32
+ * ACCESSIBILITY
33
+ * ─────────────
34
+ * • AccessibilityInfo.announceForAccessibility() fires once per reward event
35
+ * with a 350ms delay, combining heading and subtitle.
36
+ * • Each unique reward payload is announced exactly once.
37
+ * • accessibilityViewIsModal prevents VoiceOver/TalkBack from leaving the dialog.
38
+ * • Heading uses accessibilityRole="header".
39
+ * • Continue uses accessibilityRole="button" with label + hint.
40
+ * • Decorative artwork is hidden from accessibility trees.
41
+ *
42
+ * No app aliases, EchoCosmeticsContext, services, auth, Router, storage,
43
+ * or Supabase imports.
44
+ * Canonical shared component for @echoform/echo-ui.
45
+ */
46
+ import React from 'react';
47
+ import { ImageSource } from 'expo-image';
48
+ export type EchoRewardNotificationPayload = {
49
+ /** Number of newly granted Echo Titles (0 if none). */
50
+ newTitles: number;
51
+ /** Number of newly granted Echo Emblems (0 if none). */
52
+ newEmblems: number;
53
+ };
54
+ export type EchoRewardNotificationBannerProps = {
55
+ notification: EchoRewardNotificationPayload | null;
56
+ /** Host-supplied artwork rendered inside the glow area. */
57
+ artworkSource: ImageSource;
58
+ onDismiss: () => void;
59
+ };
60
+ export declare function EchoRewardNotificationBanner({ notification, artworkSource, onDismiss, }: EchoRewardNotificationBannerProps): React.JSX.Element | null;
61
+ //# sourceMappingURL=EchoRewardNotificationBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoRewardNotificationBanner.d.ts","sourceRoot":"","sources":["../../src/components/EchoRewardNotificationBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAA4B,MAAM,OAAO,CAAC;AASjD,OAAO,EAAS,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBhD,MAAM,MAAM,6BAA6B,GAAG;IAC1C,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,YAAY,EAAE,6BAA6B,GAAG,IAAI,CAAC;IACnD,2DAA2D;IAC3D,aAAa,EAAE,WAAW,CAAC;IAC3B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AA+CF,wBAAgB,4BAA4B,CAAC,EAC3C,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,iCAAiC,4BAyFnC"}
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ /**
3
+ * EchoRewardNotificationBanner
4
+ *
5
+ * Generic Echo Profile reward modal. Shown whenever new Echo Titles or
6
+ * Emblems are unlocked during a session.
7
+ *
8
+ * Extracted from RewardNotificationBanner in the Echo UI Reference.
9
+ *
10
+ * DESIGN PHILOSOPHY
11
+ * ─────────────────
12
+ * The dialog uses a purple Echo-ecosystem treatment and communicates the
13
+ * *category* of reward unlocked (Title / Emblem / both) without revealing
14
+ * specific names, individual reward counts, or badge details. Discovery of
15
+ * the exact reward happens by opening the Echo Profile. This keeps the
16
+ * component generic and suitable for reuse across any Echoform app that
17
+ * grants Echo Profile rewards.
18
+ *
19
+ * MESSAGE LOGIC
20
+ * ─────────────
21
+ * Title-only → "New Echo Reward Unlocked!" / "You unlocked a new Echo Title."
22
+ * Emblem-only → "New Echo Reward Unlocked!" / "You unlocked a new Echo Emblem."
23
+ * Both → "New Echo Rewards Unlocked!" / "You unlocked new Echo Titles and Echo Emblems."
24
+ * Fallback → "New Echo Reward Unlocked!" / "Something new has been added to your Echo Profile."
25
+ *
26
+ * BEHAVIOR
27
+ * ────────
28
+ * • Renders as a centered transparent Modal with a dark backdrop.
29
+ * • Remains visible until the user explicitly taps Continue.
30
+ * • Backdrop taps, Android Back, and auto-dismiss timers are all disabled.
31
+ * • Host supplies the artwork image source.
32
+ *
33
+ * ACCESSIBILITY
34
+ * ─────────────
35
+ * • AccessibilityInfo.announceForAccessibility() fires once per reward event
36
+ * with a 350ms delay, combining heading and subtitle.
37
+ * • Each unique reward payload is announced exactly once.
38
+ * • accessibilityViewIsModal prevents VoiceOver/TalkBack from leaving the dialog.
39
+ * • Heading uses accessibilityRole="header".
40
+ * • Continue uses accessibilityRole="button" with label + hint.
41
+ * • Decorative artwork is hidden from accessibility trees.
42
+ *
43
+ * No app aliases, EchoCosmeticsContext, services, auth, Router, storage,
44
+ * or Supabase imports.
45
+ * Canonical shared component for @echoform/echo-ui.
46
+ */
47
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
48
+ if (k2 === undefined) k2 = k;
49
+ var desc = Object.getOwnPropertyDescriptor(m, k);
50
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
51
+ desc = { enumerable: true, get: function() { return m[k]; } };
52
+ }
53
+ Object.defineProperty(o, k2, desc);
54
+ }) : (function(o, m, k, k2) {
55
+ if (k2 === undefined) k2 = k;
56
+ o[k2] = m[k];
57
+ }));
58
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
59
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
60
+ }) : function(o, v) {
61
+ o["default"] = v;
62
+ });
63
+ var __importStar = (this && this.__importStar) || (function () {
64
+ var ownKeys = function(o) {
65
+ ownKeys = Object.getOwnPropertyNames || function (o) {
66
+ var ar = [];
67
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
68
+ return ar;
69
+ };
70
+ return ownKeys(o);
71
+ };
72
+ return function (mod) {
73
+ if (mod && mod.__esModule) return mod;
74
+ var result = {};
75
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
76
+ __setModuleDefault(result, mod);
77
+ return result;
78
+ };
79
+ })();
80
+ Object.defineProperty(exports, "__esModule", { value: true });
81
+ exports.EchoRewardNotificationBanner = EchoRewardNotificationBanner;
82
+ const react_1 = __importStar(require("react"));
83
+ const react_native_1 = require("react-native");
84
+ const expo_image_1 = require("expo-image");
85
+ const theme_1 = require("../theme");
86
+ // ─────────────────────────────────────────────────────────────────────────────
87
+ // Purple palette — local to this component.
88
+ // ─────────────────────────────────────────────────────────────────────────────
89
+ const PURPLE = '#a855f7';
90
+ const PURPLE_LIGHT = '#c084fc';
91
+ const PURPLE_DIM = 'rgba(168, 85, 247, 0.18)';
92
+ const PURPLE_BORDER = 'rgba(168, 85, 247, 0.55)';
93
+ // ─────────────────────────────────────────────────────────────────────────────
94
+ // Message helpers
95
+ // ─────────────────────────────────────────────────────────────────────────────
96
+ /**
97
+ * Derives the heading and subtitle from the reward payload.
98
+ * Designed for extensibility: new reward categories can be wired in here
99
+ * without touching the modal shell or changing its accessibility behavior.
100
+ */
101
+ function buildRewardInfo(payload) {
102
+ const hasTitle = payload.newTitles > 0;
103
+ const hasEmblem = payload.newEmblems > 0;
104
+ if (hasTitle && hasEmblem) {
105
+ return {
106
+ heading: 'New Echo Rewards Unlocked!',
107
+ subtitle: 'You unlocked new Echo Titles and Echo Emblems.',
108
+ };
109
+ }
110
+ if (hasTitle) {
111
+ return {
112
+ heading: 'New Echo Reward Unlocked!',
113
+ subtitle: 'You unlocked a new Echo Title.',
114
+ };
115
+ }
116
+ if (hasEmblem) {
117
+ return {
118
+ heading: 'New Echo Reward Unlocked!',
119
+ subtitle: 'You unlocked a new Echo Emblem.',
120
+ };
121
+ }
122
+ // Fallback — should not be reached when the host guards newTitles + newEmblems > 0.
123
+ return {
124
+ heading: 'New Echo Reward Unlocked!',
125
+ subtitle: 'Something new has been added to your Echo Profile.',
126
+ };
127
+ }
128
+ // ─────────────────────────────────────────────────────────────────────────────
129
+ // Component
130
+ // ─────────────────────────────────────────────────────────────────────────────
131
+ function EchoRewardNotificationBanner({ notification, artworkSource, onDismiss, }) {
132
+ // Guard: announce each unique reward event exactly once.
133
+ // Key on the raw counts so merged payloads don't re-announce on re-renders.
134
+ const announcedKeyRef = (0, react_1.useRef)(null);
135
+ (0, react_1.useEffect)(() => {
136
+ if (!notification)
137
+ return;
138
+ const key = `${notification.newTitles}:${notification.newEmblems}`;
139
+ if (announcedKeyRef.current === key)
140
+ return;
141
+ announcedKeyRef.current = key;
142
+ const { heading, subtitle } = buildRewardInfo(notification);
143
+ // Brief delay lets the Modal finish its fade-in before the announcement.
144
+ const timer = setTimeout(() => {
145
+ react_native_1.AccessibilityInfo.announceForAccessibility(`${heading} ${subtitle}`);
146
+ }, 350);
147
+ return () => clearTimeout(timer);
148
+ }, [notification]);
149
+ if (!notification)
150
+ return null;
151
+ const { heading, subtitle } = buildRewardInfo(notification);
152
+ return (<react_native_1.Modal visible transparent animationType="fade" statusBarTranslucent onRequestClose={() => {
153
+ // Intentional no-op.
154
+ // Android hardware/software Back must not dismiss the dialog —
155
+ // the user is required to activate the Continue button.
156
+ }}>
157
+ {/* Backdrop — absorbs taps so they cannot reach background content. */}
158
+ <react_native_1.View style={styles.backdrop}>
159
+ {/* Reward card */}
160
+ <react_native_1.View style={styles.card} accessibilityViewIsModal>
161
+
162
+ {/* Echo Profile artwork — decorative, hidden from accessibility trees. */}
163
+ <react_native_1.View style={styles.logoGlow} accessible={false} importantForAccessibility="no-hide-descendants">
164
+ <expo_image_1.Image source={artworkSource} style={styles.logoImage} contentFit="contain" accessible={false} importantForAccessibility="no-hide-descendants"/>
165
+ </react_native_1.View>
166
+
167
+ {/* Heading */}
168
+ <react_native_1.Text style={styles.heading} accessibilityRole="header" accessibilityLabel={heading}>
169
+ {heading}
170
+ </react_native_1.Text>
171
+
172
+ {/* Category-specific subtitle */}
173
+ <react_native_1.Text style={styles.subtitle}>
174
+ {subtitle}
175
+ </react_native_1.Text>
176
+
177
+ {/* Continue — only way to dismiss the dialog. */}
178
+ <react_native_1.Pressable onPress={onDismiss} style={({ pressed }) => [
179
+ styles.continueBtn,
180
+ pressed && styles.continueBtnPressed,
181
+ ]} accessibilityRole="button" accessibilityLabel="Continue" accessibilityHint="Dismisses the reward notification and returns to the app">
182
+ <react_native_1.Text style={styles.continueBtnText}>Continue</react_native_1.Text>
183
+ </react_native_1.Pressable>
184
+ </react_native_1.View>
185
+ </react_native_1.View>
186
+ </react_native_1.Modal>);
187
+ }
188
+ // ─────────────────────────────────────────────────────────────────────────────
189
+ // Styles
190
+ // ─────────────────────────────────────────────────────────────────────────────
191
+ const styles = react_native_1.StyleSheet.create({
192
+ backdrop: {
193
+ flex: 1,
194
+ backgroundColor: 'rgba(0, 0, 0, 0.78)',
195
+ alignItems: 'center',
196
+ justifyContent: 'center',
197
+ paddingHorizontal: theme_1.SPACING.lg,
198
+ },
199
+ card: {
200
+ width: '100%',
201
+ maxWidth: 380,
202
+ backgroundColor: theme_1.COLORS.surface,
203
+ borderRadius: theme_1.RADIUS.xl,
204
+ borderWidth: 1.5,
205
+ borderColor: PURPLE_BORDER,
206
+ paddingVertical: theme_1.SPACING.xxl,
207
+ paddingHorizontal: theme_1.SPACING.xl,
208
+ alignItems: 'center',
209
+ gap: theme_1.SPACING.md,
210
+ // iOS glow
211
+ shadowColor: PURPLE,
212
+ shadowOffset: { width: 0, height: 0 },
213
+ shadowOpacity: 0.45,
214
+ shadowRadius: 28,
215
+ // Android
216
+ elevation: 18,
217
+ },
218
+ logoGlow: {
219
+ width: 88,
220
+ height: 88,
221
+ borderRadius: 44,
222
+ alignItems: 'center',
223
+ justifyContent: 'center',
224
+ overflow: 'hidden',
225
+ backgroundColor: PURPLE_DIM,
226
+ marginBottom: theme_1.SPACING.xs,
227
+ // iOS inner glow
228
+ shadowColor: PURPLE,
229
+ shadowOffset: { width: 0, height: 0 },
230
+ shadowOpacity: 0.55,
231
+ shadowRadius: 18,
232
+ // Android
233
+ elevation: 0,
234
+ },
235
+ logoImage: {
236
+ width: 104,
237
+ height: 104,
238
+ transform: [{ translateX: -1.5 }],
239
+ },
240
+ heading: {
241
+ fontSize: theme_1.FONTS.xl,
242
+ fontWeight: '700',
243
+ color: PURPLE_LIGHT,
244
+ textAlign: 'center',
245
+ letterSpacing: 0.3,
246
+ },
247
+ subtitle: {
248
+ fontSize: theme_1.FONTS.sm,
249
+ color: theme_1.COLORS.neonCyan,
250
+ textAlign: 'center',
251
+ lineHeight: 20,
252
+ },
253
+ continueBtn: {
254
+ width: '100%',
255
+ minHeight: 52,
256
+ borderRadius: theme_1.RADIUS.md,
257
+ alignItems: 'center',
258
+ justifyContent: 'center',
259
+ marginTop: theme_1.SPACING.md,
260
+ backgroundColor: PURPLE,
261
+ },
262
+ continueBtnPressed: {
263
+ opacity: 0.8,
264
+ },
265
+ continueBtnText: {
266
+ fontSize: theme_1.FONTS.md,
267
+ fontWeight: '700',
268
+ color: '#fff',
269
+ letterSpacing: 0.5,
270
+ },
271
+ });
272
+ //# sourceMappingURL=EchoRewardNotificationBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoRewardNotificationBanner.js","sourceRoot":"","sources":["../../src/components/EchoRewardNotificationBanner.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * EchoSettingsRow
3
+ *
4
+ * Presentation-only settings row extracted from the Echo UI Reference More screen.
5
+ * Supports an icon, label, optional value, optional right element, loading state,
6
+ * destructive styling, and full accessibility.
7
+ *
8
+ * No Supabase, no Expo Router, no app-specific services or contexts.
9
+ * Canonical shared component for @echoform/echo-ui.
10
+ */
11
+ import React from 'react';
12
+ export type EchoSettingsRowProps = {
13
+ icon: string;
14
+ label: string;
15
+ onPress?: () => void;
16
+ value?: string;
17
+ rightElement?: React.ReactNode;
18
+ color?: string;
19
+ destructive?: boolean;
20
+ loading?: boolean;
21
+ accessibilityHint?: string;
22
+ };
23
+ export declare function EchoSettingsRow({ icon, label, onPress, value, rightElement, color, destructive, loading, accessibilityHint: customHint, }: EchoSettingsRowProps): React.JSX.Element;
24
+ //# sourceMappingURL=EchoSettingsRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoSettingsRow.d.ts","sourceRoot":"","sources":["../../src/components/EchoSettingsRow.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,KAAK,EACL,YAAY,EACZ,KAAuB,EACvB,WAAmB,EACnB,OAAe,EACf,iBAAiB,EAAE,UAAU,GAC9B,EAAE,oBAAoB,qBAyDtB"}
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * EchoSettingsRow
4
+ *
5
+ * Presentation-only settings row extracted from the Echo UI Reference More screen.
6
+ * Supports an icon, label, optional value, optional right element, loading state,
7
+ * destructive styling, and full accessibility.
8
+ *
9
+ * No Supabase, no Expo Router, no app-specific services or contexts.
10
+ * Canonical shared component for @echoform/echo-ui.
11
+ */
12
+ var __importDefault = (this && this.__importDefault) || function (mod) {
13
+ return (mod && mod.__esModule) ? mod : { "default": mod };
14
+ };
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.EchoSettingsRow = EchoSettingsRow;
17
+ const react_1 = __importDefault(require("react"));
18
+ const react_native_1 = require("react-native");
19
+ const vector_icons_1 = require("@expo/vector-icons");
20
+ const theme_1 = require("../theme");
21
+ function EchoSettingsRow({ icon, label, onPress, value, rightElement, color = theme_1.COLORS.neonCyan, destructive = false, loading = false, accessibilityHint: customHint, }) {
22
+ const textColor = destructive ? theme_1.COLORS.error : theme_1.COLORS.textPrimary;
23
+ const iconColor = destructive ? theme_1.COLORS.error : color;
24
+ return (<react_native_1.Pressable onPress={onPress} disabled={!onPress || loading} style={({ pressed }) => [
25
+ styles.row,
26
+ pressed && onPress ? styles.rowPressed : null,
27
+ ]} accessibilityLabel={label + (value ? `, ${value}` : '')} accessibilityRole={onPress ? 'button' : 'text'} accessibilityState={{ busy: loading }} accessibilityHint={onPress
28
+ ? (customHint !== null && customHint !== void 0 ? customHint : `Activate to ${label.toLowerCase()}`)
29
+ : undefined}>
30
+ <react_native_1.View style={[
31
+ styles.rowIcon,
32
+ { backgroundColor: iconColor + '18' },
33
+ ]}>
34
+ {loading ? (<react_native_1.ActivityIndicator size="small" color={iconColor}/>) : (<vector_icons_1.MaterialIcons name={icon} size={20} color={iconColor}/>)}
35
+ </react_native_1.View>
36
+
37
+ <react_native_1.Text style={[styles.rowLabel, { color: textColor }]}>
38
+ {label}
39
+ </react_native_1.Text>
40
+
41
+ <react_native_1.View style={styles.rowRight}>
42
+ {value ? (<react_native_1.Text style={styles.rowValue}>{value}</react_native_1.Text>) : null}
43
+ {rightElement ? rightElement : null}
44
+ {onPress && !rightElement ? (<vector_icons_1.MaterialIcons name="chevron-right" size={18} color={theme_1.COLORS.textMuted}/>) : null}
45
+ </react_native_1.View>
46
+ </react_native_1.Pressable>);
47
+ }
48
+ const styles = react_native_1.StyleSheet.create({
49
+ row: {
50
+ flexDirection: 'row',
51
+ alignItems: 'center',
52
+ gap: theme_1.SPACING.md,
53
+ padding: theme_1.SPACING.md,
54
+ minHeight: 56,
55
+ borderBottomWidth: 1,
56
+ borderBottomColor: theme_1.COLORS.border,
57
+ },
58
+ rowPressed: {
59
+ backgroundColor: theme_1.COLORS.surfaceHigh,
60
+ },
61
+ rowIcon: {
62
+ width: 36,
63
+ height: 36,
64
+ borderRadius: theme_1.RADIUS.md,
65
+ alignItems: 'center',
66
+ justifyContent: 'center',
67
+ },
68
+ rowLabel: {
69
+ flex: 1,
70
+ fontSize: theme_1.FONTS.md,
71
+ fontWeight: '500',
72
+ },
73
+ rowRight: {
74
+ flexDirection: 'row',
75
+ alignItems: 'center',
76
+ gap: theme_1.SPACING.sm,
77
+ },
78
+ rowValue: {
79
+ fontSize: theme_1.FONTS.sm,
80
+ color: theme_1.COLORS.textMuted,
81
+ fontWeight: '500',
82
+ },
83
+ });
84
+ //# sourceMappingURL=EchoSettingsRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoSettingsRow.js","sourceRoot":"","sources":["../../src/components/EchoSettingsRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * EchoSettingsSection
3
+ *
4
+ * Presentation-only settings section extracted from the Echo UI Reference More screen.
5
+ * Renders a labelled group of settings rows inside the canonical dark card surface.
6
+ *
7
+ * No Supabase, no Expo Router, no app-specific services or contexts.
8
+ * Canonical shared component for @echoform/echo-ui.
9
+ */
10
+ import React from 'react';
11
+ export type EchoSettingsSectionProps = {
12
+ title: string;
13
+ children: React.ReactNode;
14
+ };
15
+ export declare function EchoSettingsSection({ title, children, }: EchoSettingsSectionProps): React.JSX.Element;
16
+ //# sourceMappingURL=EchoSettingsSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoSettingsSection.d.ts","sourceRoot":"","sources":["../../src/components/EchoSettingsSection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACT,EAAE,wBAAwB,qBAY1B"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * EchoSettingsSection
4
+ *
5
+ * Presentation-only settings section extracted from the Echo UI Reference More screen.
6
+ * Renders a labelled group of settings rows inside the canonical dark card surface.
7
+ *
8
+ * No Supabase, no Expo Router, no app-specific services or contexts.
9
+ * Canonical shared component for @echoform/echo-ui.
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.EchoSettingsSection = EchoSettingsSection;
16
+ const react_1 = __importDefault(require("react"));
17
+ const react_native_1 = require("react-native");
18
+ const theme_1 = require("../theme");
19
+ function EchoSettingsSection({ title, children, }) {
20
+ return (<react_native_1.View style={styles.section}>
21
+ <react_native_1.Text style={styles.sectionTitle} accessibilityRole="header">
22
+ {title}
23
+ </react_native_1.Text>
24
+ <react_native_1.View style={styles.sectionBody}>{children}</react_native_1.View>
25
+ </react_native_1.View>);
26
+ }
27
+ const styles = react_native_1.StyleSheet.create({
28
+ section: {
29
+ gap: theme_1.SPACING.xs,
30
+ },
31
+ sectionTitle: {
32
+ fontSize: theme_1.FONTS.xs,
33
+ fontWeight: '700',
34
+ color: theme_1.COLORS.textMuted,
35
+ letterSpacing: 1.2,
36
+ textTransform: 'uppercase',
37
+ paddingHorizontal: theme_1.SPACING.xs,
38
+ marginBottom: theme_1.SPACING.xs,
39
+ },
40
+ sectionBody: {
41
+ backgroundColor: theme_1.COLORS.surface,
42
+ borderRadius: theme_1.RADIUS.lg,
43
+ borderWidth: 1,
44
+ borderColor: theme_1.COLORS.border,
45
+ overflow: 'hidden',
46
+ },
47
+ });
48
+ //# sourceMappingURL=EchoSettingsSection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoSettingsSection.js","sourceRoot":"","sources":["../../src/components/EchoSettingsSection.tsx"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;AAYH,kDAeC;AAzBD,kDAA0B;AAC1B,+CAAsD;AAEtD,oCAA0D;AAO1D,SAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACiB;IACzB,OAAO,CACL,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAC1B;MAAA,CAAC,mBAAI,CACH,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAC3B,iBAAiB,CAAC,QAAQ,CAE1B;QAAA,CAAC,KAAK,CACR;MAAA,EAAE,mBAAI,CACN;MAAA,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,mBAAI,CACnD;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,OAAO,EAAE;QACP,GAAG,EAAE,eAAO,CAAC,EAAE;KAChB;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,aAAK,CAAC,EAAE;QAClB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,cAAM,CAAC,SAAS;QACvB,aAAa,EAAE,GAAG;QAClB,aAAa,EAAE,WAAW;QAC1B,iBAAiB,EAAE,eAAO,CAAC,EAAE;QAC7B,YAAY,EAAE,eAAO,CAAC,EAAE;KACzB;IACD,WAAW,EAAE;QACX,eAAe,EAAE,cAAM,CAAC,OAAO;QAC/B,YAAY,EAAE,cAAM,CAAC,EAAE;QACvB,WAAW,EAAE,CAAC;QACd,WAAW,EAAE,cAAM,CAAC,MAAM;QAC1B,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * EchoSignOutButton
3
+ *
4
+ * Presentation-only Sign Out button extracted from the Echo UI Reference.
5
+ *
6
+ * Renders a red translucent row button with a logout icon, 52pt minimum
7
+ * height, pressed opacity, and a loading spinner while the sign-out operation
8
+ * is in progress.
9
+ *
10
+ * ACCESSIBILITY
11
+ * ─────────────
12
+ * • accessibilityLabel: "Sign out of Echo Profile"
13
+ * • accessibilityRole: "button"
14
+ * • accessibilityState: { busy: loading }
15
+ * • Default hint: "Signs you out. Your local data will remain on this device."
16
+ *
17
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
18
+ * Canonical shared component for @echoform/echo-ui.
19
+ */
20
+ import React from 'react';
21
+ export type EchoSignOutButtonProps = {
22
+ onPress: () => void;
23
+ loading?: boolean;
24
+ /** Overrides the default VoiceOver / TalkBack hint. */
25
+ accessibilityHint?: string;
26
+ };
27
+ export declare function EchoSignOutButton({ onPress, loading, accessibilityHint, }: EchoSignOutButtonProps): React.JSX.Element;
28
+ //# sourceMappingURL=EchoSignOutButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoSignOutButton.d.ts","sourceRoot":"","sources":["../../src/components/EchoSignOutButton.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAc1B,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,OAAe,EACf,iBAAgF,GACjF,EAAE,sBAAsB,qBA4BxB"}