@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,490 @@
1
+ "use strict";
2
+ /**
3
+ * EchoEmblemPicker
4
+ *
5
+ * Presentation-only modal for selecting or clearing an Echo Emblem.
6
+ * Extracted from the Echo UI Reference EmblemPicker.
7
+ *
8
+ * The host app owns all data fetching and the savingId state.
9
+ * This component is purely presentational and accessible.
10
+ *
11
+ * DYNAMIC COLLECTION FILTERS
12
+ * ──────────────────────────
13
+ * Filters are generated from the owned Emblem list — no hardcoded app names:
14
+ *
15
+ * "All" → shows every owned Emblem.
16
+ * "Starter" → shows Emblems whose app_key is null (platform-wide collection).
17
+ * <AppName> → one chip per distinct app_key present in the owned list,
18
+ * using metadata.collection_name when available, falling back
19
+ * to a title-cased label derived from app_key itself.
20
+ *
21
+ * ACCESSIBILITY
22
+ * ─────────────
23
+ * • Modal heading announced on open.
24
+ * • Each filter chip is a button with selected state announced.
25
+ * • Each emblem cell is a button with selected/disabled/busy state.
26
+ * • Saving overlay announces busy on the active cell.
27
+ * • Error and empty states are accessible alert/text roles.
28
+ *
29
+ * No Expo Router, no safe-area hooks, no auth, no contexts, no services,
30
+ * no storage, no app-specific code.
31
+ * Canonical shared component for @echoform/echo-ui.
32
+ */
33
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ var desc = Object.getOwnPropertyDescriptor(m, k);
36
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
37
+ desc = { enumerable: true, get: function() { return m[k]; } };
38
+ }
39
+ Object.defineProperty(o, k2, desc);
40
+ }) : (function(o, m, k, k2) {
41
+ if (k2 === undefined) k2 = k;
42
+ o[k2] = m[k];
43
+ }));
44
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
45
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
46
+ }) : function(o, v) {
47
+ o["default"] = v;
48
+ });
49
+ var __importStar = (this && this.__importStar) || (function () {
50
+ var ownKeys = function(o) {
51
+ ownKeys = Object.getOwnPropertyNames || function (o) {
52
+ var ar = [];
53
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
54
+ return ar;
55
+ };
56
+ return ownKeys(o);
57
+ };
58
+ return function (mod) {
59
+ if (mod && mod.__esModule) return mod;
60
+ var result = {};
61
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
62
+ __setModuleDefault(result, mod);
63
+ return result;
64
+ };
65
+ })();
66
+ Object.defineProperty(exports, "__esModule", { value: true });
67
+ exports.EchoEmblemPicker = EchoEmblemPicker;
68
+ const react_1 = __importStar(require("react"));
69
+ const react_native_1 = require("react-native");
70
+ const vector_icons_1 = require("@expo/vector-icons");
71
+ const EchoEmblem_1 = require("./EchoEmblem");
72
+ const theme_1 = require("../theme");
73
+ /**
74
+ * Derive a clean display label for an app_key when metadata.collection_name
75
+ * is absent. Converts "rig_vault" → "Rig Vault", etc.
76
+ */
77
+ function appKeyToLabel(appKey) {
78
+ return appKey
79
+ .replace(/_/g, ' ')
80
+ .replace(/-/g, ' ')
81
+ .replace(/\b\w/g, c => c.toUpperCase())
82
+ .trim();
83
+ }
84
+ /**
85
+ * Try to extract collection_name from an Emblem's metadata field.
86
+ */
87
+ function extractCollectionName(emblem) {
88
+ const meta = emblem.metadata;
89
+ if (meta && typeof meta === 'object' && !Array.isArray(meta)) {
90
+ const cname = meta['collection_name'];
91
+ if (typeof cname === 'string' && cname.trim().length > 0)
92
+ return cname.trim();
93
+ }
94
+ return null;
95
+ }
96
+ /**
97
+ * Build the ordered filter list from an owned Emblem array.
98
+ *
99
+ * Order: "All" → "Starter" (if any starter emblems exist) →
100
+ * app collections sorted alphabetically by label.
101
+ */
102
+ function buildFilters(emblems) {
103
+ if (emblems.length === 0)
104
+ return [];
105
+ const filters = [{ key: '__all__', label: 'All' }];
106
+ const hasStarter = emblems.some(e => e.app_key === null);
107
+ if (hasStarter) {
108
+ filters.push({ key: '__starter__', label: 'Starter' });
109
+ }
110
+ const appMap = new Map();
111
+ for (const emblem of emblems) {
112
+ if (emblem.app_key === null)
113
+ continue;
114
+ if (appMap.has(emblem.app_key))
115
+ continue;
116
+ const collectionName = extractCollectionName(emblem);
117
+ appMap.set(emblem.app_key, collectionName !== null && collectionName !== void 0 ? collectionName : appKeyToLabel(emblem.app_key));
118
+ }
119
+ const sortedApps = Array.from(appMap.entries()).sort(([, a], [, b]) => a.localeCompare(b));
120
+ for (const [appKey, label] of sortedApps) {
121
+ filters.push({ key: appKey, label });
122
+ }
123
+ if (filters.length <= 1)
124
+ return [];
125
+ return filters;
126
+ }
127
+ function applyFilter(emblems, filterKey) {
128
+ if (filterKey === '__all__')
129
+ return emblems;
130
+ if (filterKey === '__starter__')
131
+ return emblems.filter(e => e.app_key === null);
132
+ return emblems.filter(e => e.app_key === filterKey);
133
+ }
134
+ // ─────────────────────────────────────────────────────────────────────────────
135
+ // Component
136
+ // ─────────────────────────────────────────────────────────────────────────────
137
+ function EchoEmblemPicker({ visible, emblems, loading, error, onClose, onSelect, savingId, onRetry, topInset = 0, bottomInset = 0, }) {
138
+ // Responsive grid — Dimensions.get pattern required by project conventions.
139
+ const [screenW, setScreenW] = (0, react_1.useState)(() => Math.max(300, react_native_1.Dimensions.get('window').width));
140
+ (0, react_1.useEffect)(() => {
141
+ const sub = react_native_1.Dimensions.addEventListener('change', ({ window }) => {
142
+ setScreenW(Math.max(300, window.width));
143
+ });
144
+ return () => sub.remove();
145
+ }, []);
146
+ // ── Dynamic collection filters ──────────────────────────────────────────
147
+ const filters = (0, react_1.useMemo)(() => buildFilters(emblems), [emblems]);
148
+ const [activeFilter, setActiveFilter] = (0, react_1.useState)('__all__');
149
+ (0, react_1.useEffect)(() => {
150
+ if (filters.length > 0 && !filters.some(f => f.key === activeFilter)) {
151
+ setActiveFilter('__all__');
152
+ }
153
+ }, [filters, activeFilter]);
154
+ const filteredEmblems = (0, react_1.useMemo)(() => applyFilter(emblems, activeFilter), [emblems, activeFilter]);
155
+ // Grid sizing
156
+ const numCols = screenW >= 500 ? 3 : 2;
157
+ const hPad = theme_1.SPACING.lg * 2;
158
+ const cellGap = theme_1.SPACING.sm;
159
+ const cellW = Math.max(80, Math.floor((screenW - hPad - cellGap * (numCols - 1)) / numCols));
160
+ const emblemSz = Math.min(64, Math.floor(cellW * 0.58));
161
+ const isSaving = savingId !== null;
162
+ const handleFilterPress = (0, react_1.useCallback)((key) => {
163
+ setActiveFilter(key);
164
+ }, []);
165
+ return (<react_native_1.Modal visible={visible} animationType="slide" presentationStyle={react_native_1.Platform.OS === 'ios' ? 'pageSheet' : 'fullScreen'} onRequestClose={onClose} accessibilityViewIsModal>
166
+ <react_native_1.View style={[styles.root, { paddingTop: topInset || theme_1.SPACING.xl }]}>
167
+ {/* ── Header ─────────────────────────────────────────────────────── */}
168
+ <react_native_1.View style={styles.header}>
169
+ <react_native_1.Text style={styles.heading} accessibilityRole="header">
170
+ Choose Echo Emblem
171
+ </react_native_1.Text>
172
+ <react_native_1.Pressable onPress={onClose} disabled={isSaving} style={({ pressed }) => [styles.closeBtn, pressed ? { opacity: 0.7 } : null]} accessibilityLabel="Close Echo Emblem picker" accessibilityRole="button" hitSlop={8}>
173
+ <vector_icons_1.MaterialIcons name="close" size={22} color={theme_1.COLORS.textSecondary}/>
174
+ </react_native_1.Pressable>
175
+ </react_native_1.View>
176
+
177
+ {/* ── Collection filter chips ──────────────────────────────────────
178
+ Only shown when the user owns Emblems from 2+ collections.
179
+ Filters are derived from the owned list — never hardcoded. */}
180
+ {!loading && !error && filters.length > 0 ? (<react_native_1.View style={styles.filterBarOuter} accessible={false}>
181
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.filterBarContent} keyboardShouldPersistTaps="handled">
182
+ {filters.map(f => {
183
+ const isSelected = f.key === activeFilter;
184
+ return (<react_native_1.Pressable key={f.key} onPress={() => handleFilterPress(f.key)} style={({ pressed }) => [
185
+ styles.filterChip,
186
+ isSelected ? styles.filterChipActive : null,
187
+ (pressed && !isSelected) ? styles.filterChipPressed : null,
188
+ ]} accessibilityRole="button" accessibilityLabel={f.label} accessibilityHint={isSelected
189
+ ? `Currently showing ${f.label} Emblems`
190
+ : `Show only ${f.label} Emblems`} accessibilityState={{ selected: isSelected }}>
191
+ <react_native_1.Text style={[
192
+ styles.filterChipText,
193
+ isSelected ? styles.filterChipTextActive : null,
194
+ ]} importantForAccessibility="no" accessibilityElementsHidden>
195
+ {f.label}
196
+ </react_native_1.Text>
197
+ </react_native_1.Pressable>);
198
+ })}
199
+ </react_native_1.ScrollView>
200
+ </react_native_1.View>) : null}
201
+
202
+ {/* ── Body ───────────────────────────────────────────────────────── */}
203
+ {loading ? (<react_native_1.View style={styles.centerState}>
204
+ <react_native_1.ActivityIndicator size="large" color={theme_1.COLORS.neonCyan}/>
205
+ <react_native_1.Text style={styles.centerStateText} accessibilityLiveRegion="polite" accessibilityLabel="Loading your Echo Emblems">
206
+ Loading your Echo Emblems…
207
+ </react_native_1.Text>
208
+ </react_native_1.View>) : error ? (<react_native_1.View style={styles.centerState} accessible accessibilityRole="alert" accessibilityLabel={`Error loading Echo Emblems: ${error}`}>
209
+ <vector_icons_1.MaterialIcons name="error-outline" size={44} color={theme_1.COLORS.error}/>
210
+ <react_native_1.Text style={styles.errorText}>{error}</react_native_1.Text>
211
+ <react_native_1.Pressable onPress={onRetry} style={({ pressed }) => [styles.retryBtn, pressed ? { opacity: 0.75 } : null]} accessibilityLabel="Retry loading Echo Emblems" accessibilityRole="button">
212
+ <vector_icons_1.MaterialIcons name="refresh" size={18} color={theme_1.COLORS.neonCyan}/>
213
+ <react_native_1.Text style={styles.retryBtnText}>Try Again</react_native_1.Text>
214
+ </react_native_1.Pressable>
215
+ </react_native_1.View>) : emblems.length === 0 ? (<react_native_1.View style={styles.centerState} accessible accessibilityRole="text" accessibilityLabel="You have not unlocked any Echo Emblems yet.">
216
+ <vector_icons_1.MaterialIcons name="image-not-supported" size={52} color={theme_1.COLORS.textMuted}/>
217
+ <react_native_1.Text style={styles.emptyTitle}>No Echo Emblems Yet</react_native_1.Text>
218
+ <react_native_1.Text style={styles.emptyBody}>
219
+ You have not unlocked any Echo Emblems yet.
220
+ </react_native_1.Text>
221
+ </react_native_1.View>) : filteredEmblems.length === 0 ? (<react_native_1.View style={styles.centerState} accessible accessibilityRole="text" accessibilityLabel="No Emblems in this collection.">
222
+ <vector_icons_1.MaterialIcons name="filter-none" size={44} color={theme_1.COLORS.textMuted}/>
223
+ <react_native_1.Text style={styles.emptyTitle}>No Emblems Here</react_native_1.Text>
224
+ <react_native_1.Text style={styles.emptyBody}>
225
+ You do not own any Emblems in this collection.
226
+ </react_native_1.Text>
227
+ </react_native_1.View>) : (<react_native_1.ScrollView contentContainerStyle={[
228
+ styles.scroll,
229
+ { paddingBottom: bottomInset + 40 },
230
+ ]} showsVerticalScrollIndicator={false}>
231
+ {/* No Emblem — clear option */}
232
+ <NoEmblemCell isSaving={savingId === 'clear'} disabled={isSaving} onPress={() => { void onSelect(null); }}/>
233
+
234
+ {/* Grid of filtered owned Emblems */}
235
+ <react_native_1.View style={[styles.grid, { gap: cellGap }]}>
236
+ {filteredEmblems.map((emblem) => (<EmblemCell key={emblem.asset_id} emblem={emblem} emblemSize={emblemSz} cellWidth={cellW} isSaving={savingId === emblem.asset_id} disabled={isSaving} onPress={() => { void onSelect(emblem.asset_id); }}/>))}
237
+ </react_native_1.View>
238
+ </react_native_1.ScrollView>)}
239
+ </react_native_1.View>
240
+ </react_native_1.Modal>);
241
+ }
242
+ function EmblemCell({ emblem, emblemSize, cellWidth, isSaving, disabled, onPress, }) {
243
+ const isActive = emblem.is_currently_active;
244
+ return (<react_native_1.Pressable onPress={disabled ? undefined : onPress} disabled={disabled} style={({ pressed }) => [
245
+ styles.emblemCell,
246
+ { width: cellWidth, minHeight: cellWidth },
247
+ isActive ? styles.emblemCellActive : null,
248
+ (pressed && !disabled) ? styles.emblemCellPressed : null,
249
+ ]} accessibilityRole="button" accessibilityLabel={`${emblem.display_name} Echo Emblem${isActive ? ', currently equipped' : ''}`} accessibilityHint={isActive ? 'Currently equipped' : 'Double tap to equip this Echo Emblem'} accessibilityState={{ selected: isActive, disabled, busy: isSaving }}>
250
+ <react_native_1.View style={styles.emblemCellContent}>
251
+ <react_native_1.View style={styles.emblemImageContainer}>
252
+ <EchoEmblem_1.EchoEmblem source={{ uri: emblem.image_url }} size={emblemSize} displayName={emblem.display_name} selected={isActive} showSelectionIndicator={isActive} accessibilityLabel=""/>
253
+ </react_native_1.View>
254
+ <react_native_1.Text style={[styles.emblemCellLabel, isActive ? styles.emblemCellLabelActive : null]} numberOfLines={2} importantForAccessibility="no" accessibilityElementsHidden>
255
+ {emblem.display_name}
256
+ </react_native_1.Text>
257
+ </react_native_1.View>
258
+
259
+ {/* Saving overlay */}
260
+ {isSaving ? (<react_native_1.View style={styles.savingOverlay} importantForAccessibility="no" accessibilityElementsHidden>
261
+ <react_native_1.ActivityIndicator size="small" color={theme_1.COLORS.neonCyan}/>
262
+ </react_native_1.View>) : null}
263
+
264
+ {/* Active check badge */}
265
+ {isActive && !isSaving ? (<react_native_1.View style={styles.activeBadge} importantForAccessibility="no" accessibilityElementsHidden>
266
+ <vector_icons_1.MaterialIcons name="check-circle" size={18} color={theme_1.COLORS.neonCyan}/>
267
+ </react_native_1.View>) : null}
268
+ </react_native_1.Pressable>);
269
+ }
270
+ function NoEmblemCell({ isSaving, disabled, onPress }) {
271
+ return (<react_native_1.Pressable onPress={disabled ? undefined : onPress} disabled={disabled} style={({ pressed }) => [
272
+ styles.noEmblemBtn,
273
+ (pressed && !disabled) ? styles.noEmblemBtnPressed : null,
274
+ ]} accessibilityRole="button" accessibilityLabel="Remove active Echo Emblem" accessibilityHint="Clears the Echo Emblem from your Echo Profile" accessibilityState={{ disabled, busy: isSaving }}>
275
+ {isSaving ? (<react_native_1.ActivityIndicator size="small" color={theme_1.COLORS.textMuted}/>) : (<vector_icons_1.MaterialIcons name="do-not-disturb" size={20} color={theme_1.COLORS.textMuted}/>)}
276
+ <react_native_1.Text style={styles.noEmblemText}>No Emblem</react_native_1.Text>
277
+ </react_native_1.Pressable>);
278
+ }
279
+ // ─────────────────────────────────────────────────────────────────────────────
280
+ // Styles
281
+ // ─────────────────────────────────────────────────────────────────────────────
282
+ const styles = react_native_1.StyleSheet.create({
283
+ root: {
284
+ flex: 1,
285
+ backgroundColor: theme_1.COLORS.bg,
286
+ },
287
+ // Header
288
+ header: {
289
+ flexDirection: 'row',
290
+ alignItems: 'center',
291
+ justifyContent: 'space-between',
292
+ paddingHorizontal: theme_1.SPACING.lg,
293
+ paddingBottom: theme_1.SPACING.md,
294
+ borderBottomWidth: 1,
295
+ borderBottomColor: theme_1.COLORS.border,
296
+ },
297
+ heading: {
298
+ fontSize: theme_1.FONTS.xl,
299
+ fontWeight: '800',
300
+ color: theme_1.COLORS.neonCyan,
301
+ letterSpacing: 0.3,
302
+ },
303
+ closeBtn: {
304
+ width: 44,
305
+ height: 44,
306
+ borderRadius: 22,
307
+ backgroundColor: theme_1.COLORS.surfaceHigh,
308
+ alignItems: 'center',
309
+ justifyContent: 'center',
310
+ },
311
+ // Filter chips
312
+ filterBarOuter: {
313
+ borderBottomWidth: 1,
314
+ borderBottomColor: theme_1.COLORS.border,
315
+ minHeight: 54,
316
+ justifyContent: 'center',
317
+ },
318
+ filterBarContent: {
319
+ flexDirection: 'row',
320
+ alignItems: 'center',
321
+ paddingHorizontal: theme_1.SPACING.lg,
322
+ paddingVertical: theme_1.SPACING.sm,
323
+ gap: theme_1.SPACING.sm,
324
+ },
325
+ filterChip: {
326
+ height: 36,
327
+ borderRadius: 18,
328
+ paddingHorizontal: theme_1.SPACING.md,
329
+ paddingVertical: theme_1.SPACING.xs,
330
+ backgroundColor: theme_1.COLORS.surfaceHigh,
331
+ borderWidth: 1,
332
+ borderColor: theme_1.COLORS.border,
333
+ alignItems: 'center',
334
+ justifyContent: 'center',
335
+ },
336
+ filterChipActive: {
337
+ backgroundColor: theme_1.COLORS.neonCyan + '25',
338
+ borderColor: theme_1.COLORS.neonCyan + 'BB',
339
+ },
340
+ filterChipPressed: {
341
+ opacity: 0.7,
342
+ },
343
+ filterChipText: {
344
+ fontSize: theme_1.FONTS.sm,
345
+ fontWeight: '600',
346
+ color: theme_1.COLORS.textSecondary,
347
+ },
348
+ filterChipTextActive: {
349
+ color: theme_1.COLORS.neonCyan,
350
+ },
351
+ // Center states
352
+ centerState: {
353
+ flex: 1,
354
+ alignItems: 'center',
355
+ justifyContent: 'center',
356
+ gap: theme_1.SPACING.md,
357
+ padding: theme_1.SPACING.xl,
358
+ },
359
+ centerStateText: {
360
+ fontSize: theme_1.FONTS.sm,
361
+ color: theme_1.COLORS.textSecondary,
362
+ textAlign: 'center',
363
+ },
364
+ errorText: {
365
+ fontSize: theme_1.FONTS.sm,
366
+ color: theme_1.COLORS.error,
367
+ textAlign: 'center',
368
+ lineHeight: 20,
369
+ },
370
+ retryBtn: {
371
+ flexDirection: 'row',
372
+ alignItems: 'center',
373
+ gap: theme_1.SPACING.sm,
374
+ backgroundColor: theme_1.COLORS.neonCyan + '15',
375
+ borderRadius: theme_1.RADIUS.lg,
376
+ borderWidth: 1,
377
+ borderColor: theme_1.COLORS.neonCyan + '55',
378
+ paddingVertical: theme_1.SPACING.sm,
379
+ paddingHorizontal: theme_1.SPACING.lg,
380
+ minHeight: 44,
381
+ },
382
+ retryBtnText: {
383
+ fontSize: theme_1.FONTS.sm,
384
+ fontWeight: '700',
385
+ color: theme_1.COLORS.neonCyan,
386
+ },
387
+ emptyTitle: {
388
+ fontSize: theme_1.FONTS.md,
389
+ fontWeight: '700',
390
+ color: theme_1.COLORS.textSecondary,
391
+ textAlign: 'center',
392
+ },
393
+ emptyBody: {
394
+ fontSize: theme_1.FONTS.sm,
395
+ color: theme_1.COLORS.textMuted,
396
+ textAlign: 'center',
397
+ lineHeight: 20,
398
+ maxWidth: 260,
399
+ },
400
+ // Scroll + grid
401
+ scroll: {
402
+ paddingHorizontal: theme_1.SPACING.lg,
403
+ paddingTop: theme_1.SPACING.lg,
404
+ gap: theme_1.SPACING.lg,
405
+ },
406
+ grid: {
407
+ flexDirection: 'row',
408
+ flexWrap: 'wrap',
409
+ },
410
+ // Emblem cell
411
+ emblemCell: {
412
+ alignItems: 'center',
413
+ justifyContent: 'center',
414
+ backgroundColor: theme_1.COLORS.surface,
415
+ borderRadius: theme_1.RADIUS.lg,
416
+ borderWidth: 1,
417
+ borderColor: theme_1.COLORS.border,
418
+ padding: theme_1.SPACING.md,
419
+ position: 'relative',
420
+ overflow: 'visible',
421
+ },
422
+ emblemCellContent: {
423
+ flex: 1,
424
+ width: '100%',
425
+ alignItems: 'center',
426
+ justifyContent: 'center',
427
+ gap: theme_1.SPACING.xs,
428
+ },
429
+ emblemCellActive: {
430
+ borderColor: theme_1.COLORS.neonCyan + '88',
431
+ backgroundColor: theme_1.COLORS.neonCyan + '0A',
432
+ shadowColor: theme_1.COLORS.neonCyan,
433
+ shadowOffset: { width: 0, height: 0 },
434
+ shadowOpacity: 0.25,
435
+ shadowRadius: 8,
436
+ elevation: 4,
437
+ },
438
+ emblemCellPressed: {
439
+ opacity: 0.75,
440
+ },
441
+ emblemImageContainer: {
442
+ width: '100%',
443
+ alignItems: 'center',
444
+ justifyContent: 'center',
445
+ },
446
+ emblemCellLabel: {
447
+ fontSize: theme_1.FONTS.xs,
448
+ color: theme_1.COLORS.textSecondary,
449
+ fontWeight: '500',
450
+ textAlign: 'center',
451
+ lineHeight: 16,
452
+ width: '100%',
453
+ },
454
+ emblemCellLabelActive: {
455
+ color: theme_1.COLORS.neonCyan,
456
+ fontWeight: '700',
457
+ },
458
+ savingOverlay: Object.assign(Object.assign({}, react_native_1.StyleSheet.absoluteFillObject), { backgroundColor: theme_1.COLORS.bg + 'BB', borderRadius: theme_1.RADIUS.lg, alignItems: 'center', justifyContent: 'center' }),
459
+ activeBadge: {
460
+ position: 'absolute',
461
+ top: -7,
462
+ right: -7,
463
+ backgroundColor: theme_1.COLORS.surface,
464
+ borderRadius: 11,
465
+ padding: 1,
466
+ },
467
+ // No Emblem clear option
468
+ noEmblemBtn: {
469
+ flexDirection: 'row',
470
+ alignItems: 'center',
471
+ gap: theme_1.SPACING.sm,
472
+ backgroundColor: theme_1.COLORS.surfaceHigh,
473
+ borderRadius: theme_1.RADIUS.lg,
474
+ borderWidth: 1,
475
+ borderColor: theme_1.COLORS.border,
476
+ paddingVertical: theme_1.SPACING.md,
477
+ paddingHorizontal: theme_1.SPACING.lg,
478
+ minHeight: 52,
479
+ alignSelf: 'flex-start',
480
+ },
481
+ noEmblemBtnPressed: {
482
+ opacity: 0.7,
483
+ },
484
+ noEmblemText: {
485
+ fontSize: theme_1.FONTS.sm,
486
+ color: theme_1.COLORS.textMuted,
487
+ fontWeight: '600',
488
+ },
489
+ });
490
+ //# sourceMappingURL=EchoEmblemPicker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoEmblemPicker.js","sourceRoot":"","sources":["../../src/components/EchoEmblemPicker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * EchoErrorBanner
3
+ *
4
+ * Presentation-only error status banner extracted from the Echo UI Reference.
5
+ * Renders null when message is null.
6
+ *
7
+ * Accessibility: role="alert", polite live region, "Error: [message]" label.
8
+ *
9
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
10
+ * Canonical shared component for @echoform/echo-ui.
11
+ */
12
+ import React from 'react';
13
+ export type EchoErrorBannerProps = {
14
+ message: string | null;
15
+ };
16
+ export declare function EchoErrorBanner({ message }: EchoErrorBannerProps): React.JSX.Element | null;
17
+ //# sourceMappingURL=EchoErrorBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoErrorBanner.d.ts","sourceRoot":"","sources":["../../src/components/EchoErrorBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,EAAE,oBAAoB,4BAchE"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * EchoErrorBanner
4
+ *
5
+ * Presentation-only error status banner extracted from the Echo UI Reference.
6
+ * Renders null when message is null.
7
+ *
8
+ * Accessibility: role="alert", polite live region, "Error: [message]" label.
9
+ *
10
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
11
+ * Canonical shared component for @echoform/echo-ui.
12
+ */
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.EchoErrorBanner = EchoErrorBanner;
18
+ const react_1 = __importDefault(require("react"));
19
+ const react_native_1 = require("react-native");
20
+ const vector_icons_1 = require("@expo/vector-icons");
21
+ const theme_1 = require("../theme");
22
+ function EchoErrorBanner({ message }) {
23
+ if (!message)
24
+ return null;
25
+ return (<react_native_1.View style={styles.banner} accessible accessibilityRole="alert" accessibilityLiveRegion="polite" accessibilityLabel={`Error: ${message}`}>
26
+ <vector_icons_1.MaterialIcons name="error-outline" size={16} color={theme_1.COLORS.error}/>
27
+ <react_native_1.Text style={styles.text}>{message}</react_native_1.Text>
28
+ </react_native_1.View>);
29
+ }
30
+ const styles = react_native_1.StyleSheet.create({
31
+ banner: {
32
+ flexDirection: 'row',
33
+ alignItems: 'flex-start',
34
+ gap: theme_1.SPACING.sm,
35
+ backgroundColor: theme_1.COLORS.error + '15',
36
+ borderRadius: theme_1.RADIUS.md,
37
+ borderWidth: 1,
38
+ borderColor: theme_1.COLORS.error + '55',
39
+ padding: theme_1.SPACING.md,
40
+ },
41
+ text: {
42
+ flex: 1,
43
+ color: theme_1.COLORS.error,
44
+ fontSize: theme_1.FONTS.sm,
45
+ lineHeight: 20,
46
+ },
47
+ });
48
+ //# sourceMappingURL=EchoErrorBanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoErrorBanner.js","sourceRoot":"","sources":["../../src/components/EchoErrorBanner.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;AAWH,0CAcC;AAvBD,kDAA0B;AAC1B,+CAAsD;AACtD,qDAAmD;AACnD,oCAA0D;AAM1D,SAAgB,eAAe,CAAC,EAAE,OAAO,EAAwB;IAC/D,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,CACL,CAAC,mBAAI,CACH,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACrB,UAAU,CACV,iBAAiB,CAAC,OAAO,CACzB,uBAAuB,CAAC,QAAQ,CAChC,kBAAkB,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC,CAExC;MAAA,CAAC,4BAAa,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,cAAM,CAAC,KAAK,CAAC,EAClE;MAAA,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,mBAAI,CAC3C;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,MAAM,EAAE;QACN,aAAa,EAAG,KAAK;QACrB,UAAU,EAAM,YAAY;QAC5B,GAAG,EAAa,eAAO,CAAC,EAAE;QAC1B,eAAe,EAAE,cAAM,CAAC,KAAK,GAAG,IAAI;QACpC,YAAY,EAAI,cAAM,CAAC,EAAE;QACzB,WAAW,EAAK,CAAC;QACjB,WAAW,EAAK,cAAM,CAAC,KAAK,GAAG,IAAI;QACnC,OAAO,EAAS,eAAO,CAAC,EAAE;KAC3B;IACD,IAAI,EAAE;QACJ,IAAI,EAAQ,CAAC;QACb,KAAK,EAAO,cAAM,CAAC,KAAK;QACxB,QAAQ,EAAI,aAAK,CAAC,EAAE;QACpB,UAAU,EAAE,EAAE;KACf;CACF,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * EchoFormField
3
+ *
4
+ * Presentation-only labeled text input extracted from the Echo UI Reference.
5
+ * Provides a label, styled input, disabled appearance, and full accessibility.
6
+ *
7
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
8
+ * Canonical shared component for @echoform/echo-ui.
9
+ */
10
+ import React from 'react';
11
+ import { TextInput } from 'react-native';
12
+ export type EchoFormFieldProps = {
13
+ label: string;
14
+ value: string;
15
+ onChangeText: (value: string) => void;
16
+ placeholder?: string;
17
+ secureTextEntry?: boolean;
18
+ keyboardType?: 'email-address' | 'default';
19
+ autoCapitalize?: 'none' | 'sentences' | 'words';
20
+ returnKeyType?: 'next' | 'done' | 'go';
21
+ onSubmitEditing?: () => void;
22
+ accessibilityHint?: string;
23
+ editable?: boolean;
24
+ inputRef?: React.RefObject<TextInput | null>;
25
+ };
26
+ export declare function EchoFormField({ label, value, onChangeText, placeholder, secureTextEntry, keyboardType, autoCapitalize, returnKeyType, onSubmitEditing, accessibilityHint, editable, inputRef, }: EchoFormFieldProps): React.JSX.Element;
27
+ //# sourceMappingURL=EchoFormField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoFormField.d.ts","sourceRoot":"","sources":["../../src/components/EchoFormField.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAGL,SAAS,EAEV,MAAM,cAAc,CAAC;AAGtB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,YAAY,EACZ,WAAW,EACX,eAAe,EACf,YAAwB,EACxB,cAAuB,EACvB,aAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,QAAe,EACf,QAAQ,GACT,EAAE,kBAAkB,qBAwBpB"}