@echoform/echo-ui 0.1.1 → 0.2.0

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 +41 -0
  44. package/dist/components/EchoMoreScreen.d.ts.map +1 -0
  45. package/dist/components/EchoMoreScreen.js +94 -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,48 @@
1
+ /**
2
+ * EchoProfileHero
3
+ *
4
+ * Presentation-only signed-in profile hero card extracted from the Echo UI Reference.
5
+ *
6
+ * Renders the 110×110 emblem area, Echo Color corner button, Echo Title with
7
+ * rarity color/glow, and Verified/Unverified badge — all driven purely by props.
8
+ *
9
+ * ACCESSIBILITY
10
+ * ─────────────
11
+ * • Grouped accessible element reports name, title, and verification state.
12
+ * • Echo Color button has label and hint.
13
+ * • All decorative inner elements are hidden from screen readers.
14
+ *
15
+ * No Expo Router, no auth, no contexts, no services, no storage, no app assets.
16
+ * Canonical shared component for @echoform/echo-ui.
17
+ */
18
+ import React from 'react';
19
+ import type { ImageSource } from 'expo-image';
20
+ import type { EchoTitleRarity } from '../titleRarity';
21
+ export type EchoProfileHeroProps = {
22
+ /** Display name for the signed-in Echo Profile. */
23
+ profileName?: string | null;
24
+ /** expo-image ImageSource for the active Echo Emblem. */
25
+ emblemSource?: ImageSource | null;
26
+ /** Display name of the active Echo Emblem (for accessibility). */
27
+ emblemDisplayName?: string;
28
+ /**
29
+ * Fallback image source shown when no emblem is active.
30
+ * If neither emblem nor fallback is supplied, a neutral icon is rendered.
31
+ */
32
+ fallbackProfileSource?: ImageSource | null;
33
+ /** True while emblem data is being loaded (shows spinner in emblem slot). */
34
+ emblemLoading?: boolean;
35
+ /** Active Echo Title, if any. */
36
+ title?: {
37
+ displayName: string;
38
+ rarity: EchoTitleRarity;
39
+ } | null;
40
+ /** Whether the user's email address has been verified. */
41
+ verified: boolean;
42
+ /** Current Echo Profile accent color hex. */
43
+ echoColor: string;
44
+ /** Called when the Echo Color palette button is pressed. */
45
+ onColorPress: () => void;
46
+ };
47
+ export declare function EchoProfileHero({ profileName, emblemSource, emblemDisplayName, fallbackProfileSource, emblemLoading, title, verified, echoColor, onColorPress, }: EchoProfileHeroProps): React.JSX.Element;
48
+ //# sourceMappingURL=EchoProfileHero.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileHero.d.ts","sourceRoot":"","sources":["../../src/components/EchoProfileHero.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,yDAAyD;IACzD,YAAY,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,6EAA6E;IAC7E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iCAAiC;IACjC,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,eAAe,CAAC;KACzB,GAAG,IAAI,CAAC;IACT,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAMF,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,aAAqB,EACrB,KAAK,EACL,QAAQ,EACR,SAAS,EACT,YAAY,GACb,EAAE,oBAAoB,qBA8JtB"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /**
3
+ * EchoProfileHero
4
+ *
5
+ * Presentation-only signed-in profile hero card extracted from the Echo UI Reference.
6
+ *
7
+ * Renders the 110×110 emblem area, Echo Color corner button, Echo Title with
8
+ * rarity color/glow, and Verified/Unverified badge — all driven purely by props.
9
+ *
10
+ * ACCESSIBILITY
11
+ * ─────────────
12
+ * • Grouped accessible element reports name, title, and verification state.
13
+ * • Echo Color button has label and hint.
14
+ * • All decorative inner elements are hidden from screen readers.
15
+ *
16
+ * No Expo Router, no auth, no contexts, no services, no storage, no app assets.
17
+ * Canonical shared component for @echoform/echo-ui.
18
+ */
19
+ var __importDefault = (this && this.__importDefault) || function (mod) {
20
+ return (mod && mod.__esModule) ? mod : { "default": mod };
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.EchoProfileHero = EchoProfileHero;
24
+ const react_1 = __importDefault(require("react"));
25
+ const react_native_1 = require("react-native");
26
+ const expo_image_1 = require("expo-image");
27
+ const vector_icons_1 = require("@expo/vector-icons");
28
+ const EchoEmblem_1 = require("./EchoEmblem");
29
+ const titleRarity_1 = require("../titleRarity");
30
+ const theme_1 = require("../theme");
31
+ // ─────────────────────────────────────────────────────────────────────────────
32
+ // Component
33
+ // ─────────────────────────────────────────────────────────────────────────────
34
+ function EchoProfileHero({ profileName, emblemSource, emblemDisplayName, fallbackProfileSource, emblemLoading = false, title, verified, echoColor, onColorPress, }) {
35
+ // ── Grouped accessibility label ──────────────────────────────────────────
36
+ const groupedA11yLabel = [
37
+ `Echo Profile: ${profileName !== null && profileName !== void 0 ? profileName : 'No name set'}`,
38
+ title ? `Echo Title: ${title.displayName}` : null,
39
+ verified ? 'Verified Echo' : 'Email not verified',
40
+ ]
41
+ .filter(Boolean)
42
+ .join('. ');
43
+ // ── Emblem slot content ──────────────────────────────────────────────────
44
+ let emblemContent;
45
+ if (emblemSource) {
46
+ emblemContent = (<EchoEmblem_1.EchoEmblem source={emblemSource} size={110} displayName={emblemDisplayName}/>);
47
+ }
48
+ else if (emblemLoading) {
49
+ emblemContent = (<react_native_1.View style={styles.emblemPlaceholder}>
50
+ <react_native_1.ActivityIndicator size="small" color={theme_1.COLORS.neonCyan}/>
51
+ </react_native_1.View>);
52
+ }
53
+ else if (fallbackProfileSource) {
54
+ emblemContent = (<expo_image_1.Image source={fallbackProfileSource} style={styles.emblemFallback} contentFit="contain" importantForAccessibility="no" accessibilityElementsHidden/>);
55
+ }
56
+ else {
57
+ // Package-safe neutral fallback — no host asset required
58
+ emblemContent = (<react_native_1.View style={styles.emblemNeutral}>
59
+ <vector_icons_1.MaterialIcons name="account-circle" size={88} color={theme_1.COLORS.textMuted} importantForAccessibility="no" accessibilityElementsHidden/>
60
+ </react_native_1.View>);
61
+ }
62
+ return (<react_native_1.View style={[
63
+ styles.hero,
64
+ {
65
+ borderColor: echoColor + '33',
66
+ shadowColor: echoColor,
67
+ },
68
+ ]}>
69
+ {/* ── Echo Color corner button ─────────────────────────────────────── */}
70
+ <react_native_1.Pressable onPress={onColorPress} style={({ pressed }) => [
71
+ styles.colorCornerBtn,
72
+ {
73
+ borderColor: echoColor + '88',
74
+ backgroundColor: echoColor + '15',
75
+ },
76
+ pressed ? { opacity: 0.7 } : null,
77
+ ]} accessibilityLabel="Echo Color" accessibilityRole="button" accessibilityHint="Change your Echo Profile accent color">
78
+ <vector_icons_1.MaterialIcons name="palette" size={18} color={echoColor} importantForAccessibility="no" accessibilityElementsHidden/>
79
+ </react_native_1.Pressable>
80
+
81
+ {/* ── Emblem slot ──────────────────────────────────────────────────── */}
82
+ <react_native_1.View style={styles.emblemWrapper} importantForAccessibility="no" accessibilityElementsHidden>
83
+ {emblemContent}
84
+ </react_native_1.View>
85
+
86
+ {/* ── Name + title + badge (grouped) ──────────────────────────────── */}
87
+ <react_native_1.View accessible accessibilityLabel={groupedA11yLabel} accessibilityRole="text">
88
+ <react_native_1.Text style={styles.heroName} importantForAccessibility="no" accessibilityElementsHidden>
89
+ {profileName !== null && profileName !== void 0 ? profileName : '—'}
90
+ </react_native_1.Text>
91
+
92
+ {title ? (<react_native_1.View style={styles.activeTitleRow} importantForAccessibility="no" accessibilityElementsHidden>
93
+ <react_native_1.Text style={[
94
+ styles.activeTitleText,
95
+ { color: (0, titleRarity_1.rarityColor)(title.rarity) },
96
+ (0, titleRarity_1.rarityGlowColor)(title.rarity)
97
+ ? {
98
+ textShadowColor: (0, titleRarity_1.rarityGlowColor)(title.rarity),
99
+ textShadowOffset: { width: 0, height: 0 },
100
+ textShadowRadius: title.rarity === 'legendary' ? 2 : 8,
101
+ }
102
+ : null,
103
+ ]} numberOfLines={1}>
104
+ {title.displayName}
105
+ </react_native_1.Text>
106
+ </react_native_1.View>) : null}
107
+
108
+ {verified ? (<react_native_1.View style={styles.verifiedBadge} importantForAccessibility="no" accessibilityElementsHidden>
109
+ <vector_icons_1.MaterialIcons name="verified" size={14} color={theme_1.COLORS.neonGreen}/>
110
+ <react_native_1.Text style={styles.verifiedBadgeText}>Verified Echo</react_native_1.Text>
111
+ </react_native_1.View>) : (<react_native_1.View style={[styles.verifiedBadge, styles.unverifiedBadge]} importantForAccessibility="no" accessibilityElementsHidden>
112
+ <vector_icons_1.MaterialIcons name="warning-amber" size={14} color={theme_1.COLORS.warning}/>
113
+ <react_native_1.Text style={[styles.verifiedBadgeText, { color: theme_1.COLORS.warning }]}>
114
+ Email not verified
115
+ </react_native_1.Text>
116
+ </react_native_1.View>)}
117
+ </react_native_1.View>
118
+ </react_native_1.View>);
119
+ }
120
+ // ─────────────────────────────────────────────────────────────────────────────
121
+ // Styles
122
+ // ─────────────────────────────────────────────────────────────────────────────
123
+ const styles = react_native_1.StyleSheet.create({
124
+ hero: {
125
+ alignItems: 'center',
126
+ gap: theme_1.SPACING.sm,
127
+ backgroundColor: theme_1.COLORS.surface,
128
+ borderRadius: theme_1.RADIUS.xl,
129
+ borderWidth: 1,
130
+ paddingVertical: theme_1.SPACING.xxxl,
131
+ paddingHorizontal: theme_1.SPACING.xl,
132
+ shadowOffset: { width: 0, height: 0 },
133
+ shadowOpacity: 0.1,
134
+ shadowRadius: 20,
135
+ elevation: 3,
136
+ },
137
+ colorCornerBtn: {
138
+ position: 'absolute',
139
+ top: theme_1.SPACING.md,
140
+ right: theme_1.SPACING.md,
141
+ width: 36,
142
+ height: 36,
143
+ borderRadius: 18,
144
+ borderWidth: 1,
145
+ alignItems: 'center',
146
+ justifyContent: 'center',
147
+ zIndex: 2,
148
+ },
149
+ emblemWrapper: {
150
+ width: 110,
151
+ height: 110,
152
+ marginBottom: theme_1.SPACING.sm,
153
+ },
154
+ emblemPlaceholder: {
155
+ width: 110,
156
+ height: 110,
157
+ alignItems: 'center',
158
+ justifyContent: 'center',
159
+ },
160
+ emblemFallback: {
161
+ width: 110,
162
+ height: 110,
163
+ },
164
+ emblemNeutral: {
165
+ width: 110,
166
+ height: 110,
167
+ alignItems: 'center',
168
+ justifyContent: 'center',
169
+ },
170
+ heroName: {
171
+ fontSize: 22,
172
+ fontWeight: '800',
173
+ color: theme_1.COLORS.textPrimary,
174
+ textAlign: 'center',
175
+ letterSpacing: 0.3,
176
+ },
177
+ activeTitleRow: {
178
+ flexDirection: 'row',
179
+ alignItems: 'center',
180
+ justifyContent: 'center',
181
+ gap: 4,
182
+ marginTop: 2,
183
+ marginBottom: 1,
184
+ },
185
+ activeTitleText: {
186
+ fontSize: theme_1.FONTS.sm,
187
+ fontWeight: '700',
188
+ letterSpacing: 0.4,
189
+ textAlign: 'center',
190
+ },
191
+ verifiedBadge: {
192
+ flexDirection: 'row',
193
+ alignItems: 'center',
194
+ gap: 5,
195
+ backgroundColor: theme_1.COLORS.neonGreen + '18',
196
+ borderRadius: theme_1.RADIUS.full,
197
+ borderWidth: 1,
198
+ borderColor: theme_1.COLORS.neonGreen + '44',
199
+ paddingVertical: 4,
200
+ paddingHorizontal: theme_1.SPACING.md,
201
+ marginTop: theme_1.SPACING.xs,
202
+ alignSelf: 'center',
203
+ },
204
+ unverifiedBadge: {
205
+ backgroundColor: theme_1.COLORS.warning + '18',
206
+ borderColor: theme_1.COLORS.warning + '44',
207
+ },
208
+ verifiedBadgeText: {
209
+ fontSize: theme_1.FONTS.xs,
210
+ fontWeight: '700',
211
+ color: theme_1.COLORS.neonGreen,
212
+ letterSpacing: 0.4,
213
+ },
214
+ });
215
+ //# sourceMappingURL=EchoProfileHero.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileHero.js","sourceRoot":"","sources":["../../src/components/EchoProfileHero.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * EchoProfileOverview
3
+ *
4
+ * Presentation-only layout wrapper for the signed-in profile screen content.
5
+ *
6
+ * Provides the canonical vertical gap used between all profile blocks
7
+ * (hero, section cards, action buttons) without owning navigation,
8
+ * scrolling, auth, or data.
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
+ import React from 'react';
14
+ export type EchoProfileOverviewProps = {
15
+ children: React.ReactNode;
16
+ };
17
+ export declare function EchoProfileOverview({ children }: EchoProfileOverviewProps): React.JSX.Element;
18
+ //# sourceMappingURL=EchoProfileOverview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileOverview.d.ts","sourceRoot":"","sources":["../../src/components/EchoProfileOverview.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAMF,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE,wBAAwB,qBAEzE"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * EchoProfileOverview
4
+ *
5
+ * Presentation-only layout wrapper for the signed-in profile screen content.
6
+ *
7
+ * Provides the canonical vertical gap used between all profile blocks
8
+ * (hero, section cards, action buttons) without owning navigation,
9
+ * scrolling, auth, or data.
10
+ *
11
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
12
+ * Canonical shared component for @echoform/echo-ui.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.EchoProfileOverview = EchoProfileOverview;
19
+ const react_1 = __importDefault(require("react"));
20
+ const react_native_1 = require("react-native");
21
+ const theme_1 = require("../theme");
22
+ // ─────────────────────────────────────────────────────────────────────────────
23
+ // Component
24
+ // ─────────────────────────────────────────────────────────────────────────────
25
+ function EchoProfileOverview({ children }) {
26
+ return <react_native_1.View style={styles.container}>{children}</react_native_1.View>;
27
+ }
28
+ // ─────────────────────────────────────────────────────────────────────────────
29
+ // Styles
30
+ // ─────────────────────────────────────────────────────────────────────────────
31
+ const styles = react_native_1.StyleSheet.create({
32
+ container: {
33
+ gap: theme_1.SPACING.lg,
34
+ },
35
+ });
36
+ //# sourceMappingURL=EchoProfileOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileOverview.js","sourceRoot":"","sources":["../../src/components/EchoProfileOverview.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;AAkBH,kDAEC;AAlBD,kDAA0B;AAC1B,+CAAgD;AAChD,oCAAmC;AAUnC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,SAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAA4B;IACxE,OAAO,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,mBAAI,CAAC,CAAC;AAC1D,CAAC;AAED,gFAAgF;AAChF,SAAS;AACT,gFAAgF;AAEhF,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,GAAG,EAAE,eAAO,CAAC,EAAE;KAChB;CACF,CAAC,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * EchoProfileRow
3
+ *
4
+ * Presentation-only profile row used throughout the signed-in Echo Profile screen.
5
+ * Extracted from the Echo UI Reference profileRow pattern.
6
+ *
7
+ * Supports an image or Material icon in a 52×52 icon wrapper, title/value
8
+ * typography, optional chevron, pressed state, and both button and text roles.
9
+ *
10
+ * The `loading` prop replaces the value text with a small ActivityIndicator,
11
+ * covering the Echo Coins loading state and similar cases.
12
+ *
13
+ * ACCESSIBILITY
14
+ * ─────────────
15
+ * • `accessibilityRole="button"` when `onPress` is provided.
16
+ * • `accessibilityRole="text"` when non-actionable.
17
+ * • All decorative image/icon content is hidden from screen readers.
18
+ * • The `accessibilityLabel` prop is always required so the host controls
19
+ * the exact announcement without business meaning leaking into this component.
20
+ *
21
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
22
+ * Canonical shared component for @echoform/echo-ui.
23
+ */
24
+ import React from 'react';
25
+ import type { ImageSource } from 'expo-image';
26
+ export type EchoProfileRowProps = {
27
+ /** Uppercase row category label, e.g. "ECHO PROFILE NAME". */
28
+ title: string;
29
+ /** Value text displayed below the title. Hidden when `loading` is true. */
30
+ value?: string | null;
31
+ /** Optional color override for the value text. */
32
+ valueColor?: string;
33
+ /** expo-image ImageSource for the left icon slot. */
34
+ imageSource?: ImageSource | null;
35
+ /** Size of the rendered image inside the icon wrapper. Defaults to 44. */
36
+ imageSize?: number;
37
+ /** Background color of the 52×52 icon wrapper. */
38
+ iconBackgroundColor?: string;
39
+ /** Material icon name, used when no imageSource is provided. */
40
+ materialIcon?: string;
41
+ /** Color for the materialIcon. Defaults to COLORS.neonCyan. */
42
+ materialIconColor?: string;
43
+ /** When provided, the row becomes a pressable button. */
44
+ onPress?: () => void;
45
+ /** Required: announcement text for VoiceOver / TalkBack. */
46
+ accessibilityLabel: string;
47
+ /** Optional hint appended after the label. */
48
+ accessibilityHint?: string;
49
+ /** When true, shows a spinner in place of the value text. */
50
+ loading?: boolean;
51
+ /** Color of the loading spinner. Defaults to COLORS.textMuted. */
52
+ loadingColor?: string;
53
+ /**
54
+ * When true, shows a right-side chevron.
55
+ * Defaults to `true` when `onPress` is provided, `false` otherwise.
56
+ */
57
+ showChevron?: boolean;
58
+ };
59
+ export declare function EchoProfileRow({ title, value, valueColor, imageSource, imageSize, iconBackgroundColor, materialIcon, materialIconColor, onPress, accessibilityLabel, accessibilityHint, loading, loadingColor, showChevron, }: EchoProfileRowProps): React.JSX.Element;
60
+ //# sourceMappingURL=EchoProfileRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileRow.d.ts","sourceRoot":"","sources":["../../src/components/EchoProfileRow.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,MAAM,mBAAmB,GAAG;IAChC,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4DAA4D;IAC5D,kBAAkB,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAMF,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,UAAU,EACV,WAAW,EACX,SAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,iBAAmC,EACnC,OAAO,EACP,kBAAkB,EAClB,iBAAiB,EACjB,OAAe,EACf,YAA+B,EAC/B,WAAW,GACZ,EAAE,mBAAmB,qBAoGrB"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * EchoProfileRow
4
+ *
5
+ * Presentation-only profile row used throughout the signed-in Echo Profile screen.
6
+ * Extracted from the Echo UI Reference profileRow pattern.
7
+ *
8
+ * Supports an image or Material icon in a 52×52 icon wrapper, title/value
9
+ * typography, optional chevron, pressed state, and both button and text roles.
10
+ *
11
+ * The `loading` prop replaces the value text with a small ActivityIndicator,
12
+ * covering the Echo Coins loading state and similar cases.
13
+ *
14
+ * ACCESSIBILITY
15
+ * ─────────────
16
+ * • `accessibilityRole="button"` when `onPress` is provided.
17
+ * • `accessibilityRole="text"` when non-actionable.
18
+ * • All decorative image/icon content is hidden from screen readers.
19
+ * • The `accessibilityLabel` prop is always required so the host controls
20
+ * the exact announcement without business meaning leaking into this component.
21
+ *
22
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
23
+ * Canonical shared component for @echoform/echo-ui.
24
+ */
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.EchoProfileRow = EchoProfileRow;
30
+ const react_1 = __importDefault(require("react"));
31
+ const react_native_1 = require("react-native");
32
+ const expo_image_1 = require("expo-image");
33
+ const vector_icons_1 = require("@expo/vector-icons");
34
+ const theme_1 = require("../theme");
35
+ // ─────────────────────────────────────────────────────────────────────────────
36
+ // Component
37
+ // ─────────────────────────────────────────────────────────────────────────────
38
+ function EchoProfileRow({ title, value, valueColor, imageSource, imageSize = 44, iconBackgroundColor, materialIcon, materialIconColor = theme_1.COLORS.neonCyan, onPress, accessibilityLabel, accessibilityHint, loading = false, loadingColor = theme_1.COLORS.textMuted, showChevron, }) {
39
+ const chevron = showChevron !== undefined ? showChevron : !!onPress;
40
+ // ── Icon slot ─────────────────────────────────────────────────────────────
41
+ const iconSlot = (<react_native_1.View style={[
42
+ styles.iconWrapper,
43
+ iconBackgroundColor ? { backgroundColor: iconBackgroundColor } : null,
44
+ ]} importantForAccessibility="no" accessibilityElementsHidden>
45
+ {imageSource ? (<expo_image_1.Image source={imageSource} style={{ width: imageSize, height: imageSize }} contentFit="contain" importantForAccessibility="no" accessibilityElementsHidden/>) : materialIcon ? (<vector_icons_1.MaterialIcons name={materialIcon} size={18} color={materialIconColor} importantForAccessibility="no" accessibilityElementsHidden/>) : null}
46
+ </react_native_1.View>);
47
+ // ── Content ───────────────────────────────────────────────────────────────
48
+ const content = (<>
49
+ {iconSlot}
50
+ <react_native_1.View style={styles.textArea}>
51
+ <react_native_1.Text style={styles.rowTitle} importantForAccessibility="no" accessibilityElementsHidden>
52
+ {title}
53
+ </react_native_1.Text>
54
+ {loading ? (<react_native_1.ActivityIndicator size="small" color={loadingColor} style={styles.loadingIndicator} importantForAccessibility="no"/>) : value !== undefined && value !== null ? (<react_native_1.Text style={[styles.rowValue, valueColor ? { color: valueColor } : null]} numberOfLines={1} importantForAccessibility="no" accessibilityElementsHidden>
55
+ {value}
56
+ </react_native_1.Text>) : null}
57
+ </react_native_1.View>
58
+ {chevron ? (<vector_icons_1.MaterialIcons name="chevron-right" size={20} color={theme_1.COLORS.textMuted} importantForAccessibility="no" accessibilityElementsHidden/>) : null}
59
+ </>);
60
+ // ── Render ────────────────────────────────────────────────────────────────
61
+ if (onPress) {
62
+ return (<react_native_1.Pressable onPress={onPress} style={({ pressed }) => [styles.row, pressed ? styles.rowPressed : null]} accessibilityLabel={accessibilityLabel} accessibilityHint={accessibilityHint} accessibilityRole="button">
63
+ {content}
64
+ </react_native_1.Pressable>);
65
+ }
66
+ return (<react_native_1.View style={styles.row} accessible accessibilityLabel={accessibilityLabel} accessibilityRole="text">
67
+ {content}
68
+ </react_native_1.View>);
69
+ }
70
+ // ─────────────────────────────────────────────────────────────────────────────
71
+ // Styles
72
+ // ─────────────────────────────────────────────────────────────────────────────
73
+ const styles = react_native_1.StyleSheet.create({
74
+ row: {
75
+ flexDirection: 'row',
76
+ alignItems: 'center',
77
+ gap: theme_1.SPACING.md,
78
+ paddingHorizontal: theme_1.SPACING.lg,
79
+ paddingVertical: theme_1.SPACING.md,
80
+ minHeight: 56,
81
+ },
82
+ rowPressed: {
83
+ backgroundColor: theme_1.COLORS.surfaceHigh,
84
+ },
85
+ iconWrapper: {
86
+ width: 52,
87
+ height: 52,
88
+ borderRadius: theme_1.RADIUS.md,
89
+ alignItems: 'center',
90
+ justifyContent: 'center',
91
+ },
92
+ textArea: {
93
+ flex: 1,
94
+ },
95
+ rowTitle: {
96
+ fontSize: theme_1.FONTS.xs,
97
+ color: theme_1.COLORS.textMuted,
98
+ fontWeight: '600',
99
+ textTransform: 'uppercase',
100
+ letterSpacing: 0.8,
101
+ },
102
+ rowValue: {
103
+ fontSize: theme_1.FONTS.md,
104
+ color: theme_1.COLORS.textPrimary,
105
+ fontWeight: '500',
106
+ marginTop: 2,
107
+ },
108
+ loadingIndicator: {
109
+ alignSelf: 'flex-start',
110
+ marginTop: 4,
111
+ },
112
+ });
113
+ //# sourceMappingURL=EchoProfileRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileRow.js","sourceRoot":"","sources":["../../src/components/EchoProfileRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * EchoProfileSection
3
+ *
4
+ * Presentation-only section card used in the signed-in Echo Profile screen.
5
+ * Extracted from the Echo UI Reference sectionCard pattern.
6
+ *
7
+ * Renders a dark surface card with XL radius, 1px border, hidden overflow,
8
+ * and an uppercase section header label above the supplied children.
9
+ *
10
+ * When `accentColor` is supplied, the border uses `${accentColor}33`,
11
+ * matching the signed-in profile's per-section Echo Color treatment.
12
+ *
13
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
14
+ * Canonical shared component for @echoform/echo-ui.
15
+ */
16
+ import React from 'react';
17
+ export type EchoProfileSectionProps = {
18
+ /** Section heading displayed in uppercase above the children. */
19
+ title: string;
20
+ /**
21
+ * Echo Color hex used for border tinting.
22
+ * When supplied, border becomes `${accentColor}33`.
23
+ * When omitted, falls back to `COLORS.border`.
24
+ */
25
+ accentColor?: string;
26
+ children: React.ReactNode;
27
+ };
28
+ export declare function EchoProfileSection({ title, accentColor, children, }: EchoProfileSectionProps): React.JSX.Element;
29
+ //# sourceMappingURL=EchoProfileSection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoProfileSection.d.ts","sourceRoot":"","sources":["../../src/components/EchoProfileSection.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,MAAM,uBAAuB,GAAG;IACpC,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAMF,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,WAAW,EACX,QAAQ,GACT,EAAE,uBAAuB,qBAWzB"}
@@ -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"}