@echoform/echo-ui 0.1.0 → 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 (154) 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 +93 -0
  27. package/dist/components/EchoEmblem.d.ts.map +1 -0
  28. package/dist/components/EchoEmblem.js +308 -0
  29. package/dist/components/EchoEmblem.js.map +1 -0
  30. package/dist/components/EchoEmblemPicker.d.ts +71 -0
  31. package/dist/components/EchoEmblemPicker.d.ts.map +1 -0
  32. package/dist/components/EchoEmblemPicker.js +490 -0
  33. package/dist/components/EchoEmblemPicker.js.map +1 -0
  34. package/dist/components/EchoErrorBanner.d.ts +17 -0
  35. package/dist/components/EchoErrorBanner.d.ts.map +1 -0
  36. package/dist/components/EchoErrorBanner.js +48 -0
  37. package/dist/components/EchoErrorBanner.js.map +1 -0
  38. package/dist/components/EchoFormField.d.ts +27 -0
  39. package/dist/components/EchoFormField.d.ts.map +1 -0
  40. package/dist/components/EchoFormField.js +49 -0
  41. package/dist/components/EchoFormField.js.map +1 -0
  42. package/dist/components/EchoLinkButton.d.ts +16 -0
  43. package/dist/components/EchoLinkButton.d.ts.map +1 -0
  44. package/dist/components/EchoLinkButton.js +37 -0
  45. package/dist/components/EchoLinkButton.js.map +1 -0
  46. package/dist/components/EchoMoreScreen.d.ts +41 -0
  47. package/dist/components/EchoMoreScreen.d.ts.map +1 -0
  48. package/dist/components/EchoMoreScreen.js +94 -0
  49. package/dist/components/EchoMoreScreen.js.map +1 -0
  50. package/dist/components/EchoPasswordField.d.ts +28 -0
  51. package/dist/components/EchoPasswordField.d.ts.map +1 -0
  52. package/dist/components/EchoPasswordField.js +67 -0
  53. package/dist/components/EchoPasswordField.js.map +1 -0
  54. package/dist/components/EchoPrimaryButton.d.ts +23 -0
  55. package/dist/components/EchoPrimaryButton.d.ts.map +1 -0
  56. package/dist/components/EchoPrimaryButton.js +54 -0
  57. package/dist/components/EchoPrimaryButton.js.map +1 -0
  58. package/dist/components/EchoProfileCard.d.ts +35 -0
  59. package/dist/components/EchoProfileCard.d.ts.map +1 -0
  60. package/dist/components/EchoProfileCard.js +206 -0
  61. package/dist/components/EchoProfileCard.js.map +1 -0
  62. package/dist/components/EchoProfileDivider.d.ts +14 -0
  63. package/dist/components/EchoProfileDivider.d.ts.map +1 -0
  64. package/dist/components/EchoProfileDivider.js +31 -0
  65. package/dist/components/EchoProfileDivider.js.map +1 -0
  66. package/dist/components/EchoProfileHero.d.ts +48 -0
  67. package/dist/components/EchoProfileHero.d.ts.map +1 -0
  68. package/dist/components/EchoProfileHero.js +215 -0
  69. package/dist/components/EchoProfileHero.js.map +1 -0
  70. package/dist/components/EchoProfileOverview.d.ts +18 -0
  71. package/dist/components/EchoProfileOverview.d.ts.map +1 -0
  72. package/dist/components/EchoProfileOverview.js +36 -0
  73. package/dist/components/EchoProfileOverview.js.map +1 -0
  74. package/dist/components/EchoProfileRow.d.ts +60 -0
  75. package/dist/components/EchoProfileRow.d.ts.map +1 -0
  76. package/dist/components/EchoProfileRow.js +113 -0
  77. package/dist/components/EchoProfileRow.js.map +1 -0
  78. package/dist/components/EchoProfileSection.d.ts +29 -0
  79. package/dist/components/EchoProfileSection.d.ts.map +1 -0
  80. package/dist/components/EchoProfileSection.js +58 -0
  81. package/dist/components/EchoProfileSection.js.map +1 -0
  82. package/dist/components/EchoRewardNotificationBanner.d.ts +61 -0
  83. package/dist/components/EchoRewardNotificationBanner.d.ts.map +1 -0
  84. package/dist/components/EchoRewardNotificationBanner.js +272 -0
  85. package/dist/components/EchoRewardNotificationBanner.js.map +1 -0
  86. package/dist/components/EchoSettingsRow.d.ts +24 -0
  87. package/dist/components/EchoSettingsRow.d.ts.map +1 -0
  88. package/dist/components/EchoSettingsRow.js +84 -0
  89. package/dist/components/EchoSettingsRow.js.map +1 -0
  90. package/dist/components/EchoSettingsSection.d.ts +16 -0
  91. package/dist/components/EchoSettingsSection.d.ts.map +1 -0
  92. package/dist/components/EchoSettingsSection.js +48 -0
  93. package/dist/components/EchoSettingsSection.js.map +1 -0
  94. package/dist/components/EchoSignOutButton.d.ts +28 -0
  95. package/dist/components/EchoSignOutButton.d.ts.map +1 -0
  96. package/dist/components/EchoSignOutButton.js +67 -0
  97. package/dist/components/EchoSignOutButton.js.map +1 -0
  98. package/dist/components/EchoSuccessBanner.d.ts +17 -0
  99. package/dist/components/EchoSuccessBanner.d.ts.map +1 -0
  100. package/dist/components/EchoSuccessBanner.js +48 -0
  101. package/dist/components/EchoSuccessBanner.js.map +1 -0
  102. package/dist/components/EchoSyncPanel.d.ts +165 -0
  103. package/dist/components/EchoSyncPanel.d.ts.map +1 -0
  104. package/dist/components/EchoSyncPanel.js +913 -0
  105. package/dist/components/EchoSyncPanel.js.map +1 -0
  106. package/dist/components/EchoSyncPromptModal.d.ts +87 -0
  107. package/dist/components/EchoSyncPromptModal.d.ts.map +1 -0
  108. package/dist/components/EchoSyncPromptModal.js +351 -0
  109. package/dist/components/EchoSyncPromptModal.js.map +1 -0
  110. package/dist/components/EchoTitlePicker.d.ts +72 -0
  111. package/dist/components/EchoTitlePicker.d.ts.map +1 -0
  112. package/dist/components/EchoTitlePicker.js +487 -0
  113. package/dist/components/EchoTitlePicker.js.map +1 -0
  114. package/dist/components/EchoVerificationCodeInput.d.ts +40 -0
  115. package/dist/components/EchoVerificationCodeInput.d.ts.map +1 -0
  116. package/dist/components/EchoVerificationCodeInput.js +140 -0
  117. package/dist/components/EchoVerificationCodeInput.js.map +1 -0
  118. package/dist/components/EchoWelcome.d.ts +44 -0
  119. package/dist/components/EchoWelcome.d.ts.map +1 -0
  120. package/dist/components/EchoWelcome.js +289 -0
  121. package/dist/components/EchoWelcome.js.map +1 -0
  122. package/dist/components/EchoWhyBecomeAnEchoModal.d.ts +34 -0
  123. package/dist/components/EchoWhyBecomeAnEchoModal.d.ts.map +1 -0
  124. package/dist/components/EchoWhyBecomeAnEchoModal.js +321 -0
  125. package/dist/components/EchoWhyBecomeAnEchoModal.js.map +1 -0
  126. package/dist/components/EchoformInfoButton.d.ts +27 -0
  127. package/dist/components/EchoformInfoButton.d.ts.map +1 -0
  128. package/dist/components/EchoformInfoButton.js +60 -0
  129. package/dist/components/EchoformInfoButton.js.map +1 -0
  130. package/dist/components/EchoformInfoModal.d.ts +63 -0
  131. package/dist/components/EchoformInfoModal.d.ts.map +1 -0
  132. package/dist/components/EchoformInfoModal.js +347 -0
  133. package/dist/components/EchoformInfoModal.js.map +1 -0
  134. package/dist/echoColors.d.ts +58 -0
  135. package/dist/echoColors.d.ts.map +1 -0
  136. package/dist/echoColors.js +94 -0
  137. package/dist/echoColors.js.map +1 -0
  138. package/dist/index.d.ts +71 -3
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +86 -4
  141. package/dist/index.js.map +1 -1
  142. package/dist/theme.d.ts +48 -0
  143. package/dist/theme.d.ts.map +1 -0
  144. package/dist/theme.js +51 -0
  145. package/dist/theme.js.map +1 -0
  146. package/dist/titleRarity.d.ts +19 -0
  147. package/dist/titleRarity.d.ts.map +1 -0
  148. package/dist/titleRarity.js +46 -0
  149. package/dist/titleRarity.js.map +1 -0
  150. package/package.json +6 -5
  151. package/dist/components/EchoUITest.d.ts +0 -14
  152. package/dist/components/EchoUITest.d.ts.map +0 -1
  153. package/dist/components/EchoUITest.js +0 -53
  154. package/dist/components/EchoUITest.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,34 @@
1
1
  # @echoform/echo-ui
2
2
 
3
- Shared React Native / Expo UI component library by **Echoform Productions**.
3
+ Shared React Native / Expo presentation library for the Echoform ecosystem.
4
+
5
+ Built and maintained by **Echoform Productions**.
6
+
7
+ ---
8
+
9
+ ## Architectural boundary
10
+
11
+ ### Package owns
12
+
13
+ - Shared Echoform presentation components
14
+ - Echo Profile UI (hero, rows, sections, dividers, sign-out)
15
+ - Echo Emblems / Titles / Color presentation and pickers
16
+ - Account-form primitives (fields, buttons, banners, verification input)
17
+ - Echo Profile Sync presentation (`EchoSyncPanel`, `EchoSyncPromptModal`)
18
+ - Welcome / onboarding flow and modals
19
+ - Reward notification banner
20
+ - Accessibility contracts and interaction patterns
21
+ - Theme design tokens (`COLORS`, `FONTS`, `SPACING`, `RADIUS`)
22
+
23
+ ### Host apps own
24
+
25
+ - Authentication and session management
26
+ - Routing and navigation (Expo Router / React Navigation)
27
+ - Supabase / EchoBrain services and RPCs
28
+ - App-specific data, schemas, and storage
29
+ - Synchronisation and reconciliation logic
30
+ - All navigation actions and callbacks supplied to package components
31
+ - App-specific wording passed through `dataLabel`, `hostAppName`, `appName`, and similar props
4
32
 
5
33
  ---
6
34
 
@@ -8,11 +36,11 @@ Shared React Native / Expo UI component library by **Echoform Productions**.
8
36
 
9
37
  ```
10
38
  (OnSpace project root)
11
- ├── app/ ← Expo Router host app (preview only)
39
+ ├── app/ ← Expo Router host app (Echo UI Reference)
12
40
  │ ├── _layout.tsx
13
41
  │ └── (tabs)/
14
42
  │ ├── _layout.tsx
15
- │ └── index.tsx ← Demo screen
43
+ │ └── index.tsx ← Reference screen
16
44
 
17
45
  └── packages/
18
46
  └── echo-ui/ ← Publishable npm package
@@ -20,8 +48,31 @@ Shared React Native / Expo UI component library by **Echoform Productions**.
20
48
  ├── tsconfig.json
21
49
  └── src/
22
50
  ├── index.ts ← Public entry point
51
+ ├── theme.ts
52
+ ├── titleRarity.ts
53
+ ├── echoColors.ts
23
54
  └── components/
24
- └── EchoUITest.tsx
55
+ └── *.tsx
56
+ ```
57
+
58
+ ---
59
+
60
+ ## Current import example
61
+
62
+ ```tsx
63
+ import {
64
+ EchoProfileCard,
65
+ EchoSyncPanel,
66
+ EchoColorPicker,
67
+ EchoEmblemPicker,
68
+ EchoTitlePicker,
69
+ EchoWelcome,
70
+ EchoMoreScreen,
71
+ EchoSettingsRow,
72
+ EchoSettingsSection,
73
+ EchoRewardNotificationBanner,
74
+ COLORS,
75
+ } from '@echoform/echo-ui';
25
76
  ```
26
77
 
27
78
  ---
@@ -61,11 +112,7 @@ After publishing:
61
112
  npx expo install @echoform/echo-ui
62
113
  ```
63
114
 
64
- ```tsx
65
- import { EchoUITest } from '@echoform/echo-ui';
66
-
67
- <EchoUITest label="Rig Vault – Echo" />
68
- ```
115
+ Then import from the compiled package as shown in the example above.
69
116
 
70
117
  ---
71
118
 
@@ -83,4 +130,4 @@ Consuming projects always import from the compiled npm package.
83
130
 
84
131
  | Version | Notes |
85
132
  |---------|-------|
86
- | 0.1.0 | Initial scaffold — `EchoUITest` smoke-test component only |
133
+ | 0.1.x | Initial transport, smoke-test, and early package-development series |
@@ -0,0 +1,59 @@
1
+ /**
2
+ * EchoChangeProfileNameModal
3
+ *
4
+ * Presentation-only Change Echo Profile Name modal.
5
+ * Extracted from ChangeUsernameModal in the Echo UI Reference account screen.
6
+ *
7
+ * The host owns all business logic:
8
+ * • Regex/format validation
9
+ * • Same-name detection
10
+ * • Debounced availability RPC
11
+ * • 30-day lock-status RPC
12
+ * • Username-change RPC
13
+ * • Keyboard management
14
+ *
15
+ * This component only renders the supplied state.
16
+ *
17
+ * ACCESSIBILITY
18
+ * ─────────────
19
+ * • Live regions on availability and lock status announcements
20
+ * • Alert roles on error/unavailable/invalid states
21
+ * • Busy state on checking indicator
22
+ * • accessibilityViewIsModal on the outer Modal
23
+ *
24
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
25
+ * Canonical shared component for @echoform/echo-ui.
26
+ */
27
+ import React from 'react';
28
+ export type EchoNameAvailabilityState = 'idle' | 'checking' | 'invalid' | 'same' | 'available' | 'unavailable' | 'check_failed';
29
+ export type EchoChangeProfileNameModalProps = {
30
+ visible: boolean;
31
+ /** Current Echo Profile name shown in the read-only row. */
32
+ currentUsername: string | null;
33
+ /** Controlled value for the new name text field. */
34
+ newUsername: string;
35
+ /** Called on every keystroke with the updated value. */
36
+ onChangeUsername: (value: string) => void;
37
+ /** Availability/validation state computed by the host. */
38
+ availability: EchoNameAvailabilityState;
39
+ /** True while the lock-status RPC is in flight. */
40
+ statusLoading?: boolean;
41
+ /** True when the 30-day change lock is active. */
42
+ locked?: boolean;
43
+ /** Days remaining in the lock period. */
44
+ daysRemaining?: number;
45
+ /** ISO date string for when the lock expires, if known. */
46
+ nextEligibleDate?: string | null;
47
+ /** Error message to display in the error banner. */
48
+ error?: string | null;
49
+ /** True while the username-change RPC is in flight. */
50
+ submitting?: boolean;
51
+ /** Whether all conditions required to submit are met. */
52
+ canSubmit: boolean;
53
+ onClose: () => void;
54
+ onSubmit: () => void;
55
+ /** Top inset supplied by the host. Defaults to 0. */
56
+ topInset?: number;
57
+ };
58
+ export declare function EchoChangeProfileNameModal({ visible, currentUsername, newUsername, onChangeUsername, availability, statusLoading, locked, daysRemaining, nextEligibleDate, error, submitting, canSubmit, onClose, onSubmit, topInset, }: EchoChangeProfileNameModalProps): React.JSX.Element;
59
+ //# sourceMappingURL=EchoChangeProfileNameModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoChangeProfileNameModal.d.ts","sourceRoot":"","sources":["../../src/components/EchoChangeProfileNameModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAiB,MAAM,OAAO,CAAC;AAuBtC,MAAM,MAAM,yBAAyB,GACjC,MAAM,GACN,UAAU,GACV,SAAS,GACT,MAAM,GACN,WAAW,GACX,aAAa,GACb,cAAc,CAAC;AAEnB,MAAM,MAAM,+BAA+B,GAAG;IAC5C,OAAO,EAAW,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,eAAe,EAAG,MAAM,GAAG,IAAI,CAAC;IAChC,oDAAoD;IACpD,WAAW,EAAO,MAAM,CAAC;IACzB,wDAAwD;IACxD,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,0DAA0D;IAC1D,YAAY,EAAM,yBAAyB,CAAC;IAC5C,mDAAmD;IACnD,aAAa,CAAC,EAAI,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAW,OAAO,CAAC;IAC1B,yCAAyC;IACzC,aAAa,CAAC,EAAI,MAAM,CAAC;IACzB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,oDAAoD;IACpD,KAAK,CAAC,EAAY,MAAM,GAAG,IAAI,CAAC;IAChC,uDAAuD;IACvD,UAAU,CAAC,EAAO,OAAO,CAAC;IAC1B,yDAAyD;IACzD,SAAS,EAAS,OAAO,CAAC;IAC1B,OAAO,EAAW,MAAM,IAAI,CAAC;IAC7B,QAAQ,EAAU,MAAM,IAAI,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,EAAS,MAAM,CAAC;CAC1B,CAAC;AAsBF,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,aAAqB,EACrB,MAAqB,EACrB,aAAiB,EACjB,gBAAgB,EAChB,KAAK,EACL,UAAqB,EACrB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,QAAiB,GAClB,EAAE,+BAA+B,qBAmQjC"}
@@ -0,0 +1,317 @@
1
+ "use strict";
2
+ /**
3
+ * EchoChangeProfileNameModal
4
+ *
5
+ * Presentation-only Change Echo Profile Name modal.
6
+ * Extracted from ChangeUsernameModal in the Echo UI Reference account screen.
7
+ *
8
+ * The host owns all business logic:
9
+ * • Regex/format validation
10
+ * • Same-name detection
11
+ * • Debounced availability RPC
12
+ * • 30-day lock-status RPC
13
+ * • Username-change RPC
14
+ * • Keyboard management
15
+ *
16
+ * This component only renders the supplied state.
17
+ *
18
+ * ACCESSIBILITY
19
+ * ─────────────
20
+ * • Live regions on availability and lock status announcements
21
+ * • Alert roles on error/unavailable/invalid states
22
+ * • Busy state on checking indicator
23
+ * • accessibilityViewIsModal on the outer Modal
24
+ *
25
+ * No Expo Router, no auth, no contexts, no services, no app-specific code.
26
+ * Canonical shared component for @echoform/echo-ui.
27
+ */
28
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
+ if (k2 === undefined) k2 = k;
30
+ var desc = Object.getOwnPropertyDescriptor(m, k);
31
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
32
+ desc = { enumerable: true, get: function() { return m[k]; } };
33
+ }
34
+ Object.defineProperty(o, k2, desc);
35
+ }) : (function(o, m, k, k2) {
36
+ if (k2 === undefined) k2 = k;
37
+ o[k2] = m[k];
38
+ }));
39
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
40
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
41
+ }) : function(o, v) {
42
+ o["default"] = v;
43
+ });
44
+ var __importStar = (this && this.__importStar) || (function () {
45
+ var ownKeys = function(o) {
46
+ ownKeys = Object.getOwnPropertyNames || function (o) {
47
+ var ar = [];
48
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
49
+ return ar;
50
+ };
51
+ return ownKeys(o);
52
+ };
53
+ return function (mod) {
54
+ if (mod && mod.__esModule) return mod;
55
+ var result = {};
56
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
57
+ __setModuleDefault(result, mod);
58
+ return result;
59
+ };
60
+ })();
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ exports.EchoChangeProfileNameModal = EchoChangeProfileNameModal;
63
+ const react_1 = __importStar(require("react"));
64
+ const react_native_1 = require("react-native");
65
+ const vector_icons_1 = require("@expo/vector-icons");
66
+ const EchoFormField_1 = require("./EchoFormField");
67
+ const EchoErrorBanner_1 = require("./EchoErrorBanner");
68
+ const EchoPrimaryButton_1 = require("./EchoPrimaryButton");
69
+ const theme_1 = require("../theme");
70
+ // ─────────────────────────────────────────────────────────────────────────────
71
+ // Package-local date formatter
72
+ // ─────────────────────────────────────────────────────────────────────────────
73
+ function formatDate(iso) {
74
+ try {
75
+ return new Date(iso).toLocaleDateString(undefined, {
76
+ day: 'numeric',
77
+ month: 'long',
78
+ year: 'numeric',
79
+ });
80
+ }
81
+ catch (_a) {
82
+ return iso;
83
+ }
84
+ }
85
+ // ─────────────────────────────────────────────────────────────────────────────
86
+ // Component
87
+ // ─────────────────────────────────────────────────────────────────────────────
88
+ function EchoChangeProfileNameModal({ visible, currentUsername, newUsername, onChangeUsername, availability, statusLoading = false, locked = false, daysRemaining = 0, nextEligibleDate, error, submitting = false, canSubmit, onClose, onSubmit, topInset = 0, }) {
89
+ const inputRef = (0, react_1.useRef)(null);
90
+ return (<react_native_1.Modal visible={visible} animationType="slide" presentationStyle="pageSheet" onRequestClose={onClose} accessibilityViewIsModal>
91
+ <react_native_1.KeyboardAvoidingView style={[styles.root, { paddingTop: topInset || theme_1.SPACING.lg }]} behavior={react_native_1.Platform.OS === 'ios' ? 'padding' : 'height'}>
92
+ {/* Header */}
93
+ <react_native_1.View style={styles.header}>
94
+ <react_native_1.Text style={styles.heading} accessibilityRole="header">
95
+ Change Echo Profile Name
96
+ </react_native_1.Text>
97
+ <react_native_1.Pressable onPress={onClose} hitSlop={8} accessibilityLabel="Close" accessibilityRole="button" style={({ pressed }) => (pressed ? { opacity: 0.7 } : undefined)}>
98
+ <vector_icons_1.MaterialIcons name="close" size={24} color={theme_1.COLORS.textSecondary}/>
99
+ </react_native_1.Pressable>
100
+ </react_native_1.View>
101
+
102
+ <react_native_1.ScrollView contentContainerStyle={styles.content} keyboardShouldPersistTaps="handled" showsVerticalScrollIndicator={false}>
103
+ {/* Current name read-only row */}
104
+ <react_native_1.View style={styles.currentNameRow} accessible accessibilityLabel={`Current Echo Profile name: ${currentUsername !== null && currentUsername !== void 0 ? currentUsername : 'None set'}`} accessibilityRole="text">
105
+ <react_native_1.Text style={styles.currentNameLabel} importantForAccessibility="no">
106
+ Current name
107
+ </react_native_1.Text>
108
+ <react_native_1.Text style={styles.currentNameValue} importantForAccessibility="no">
109
+ {currentUsername !== null && currentUsername !== void 0 ? currentUsername : '—'}
110
+ </react_native_1.Text>
111
+ </react_native_1.View>
112
+
113
+ {statusLoading ? (<react_native_1.ActivityIndicator color={theme_1.COLORS.neonCyan} style={{ marginVertical: theme_1.SPACING.xl }} accessibilityLabel="Loading account status"/>) : locked ? (
114
+ /* ── Name Change Locked warning ─────────────────────────────── */
115
+ <react_native_1.View style={styles.lockWarning} accessible accessibilityRole="alert" accessibilityLabel={[
116
+ 'Name change locked.',
117
+ `You can change your Echo Profile name in ${daysRemaining} day${daysRemaining !== 1 ? 's' : ''}.`,
118
+ nextEligibleDate
119
+ ? `Eligible from ${formatDate(nextEligibleDate)}.`
120
+ : '',
121
+ ]
122
+ .filter(Boolean)
123
+ .join(' ')}>
124
+ <vector_icons_1.MaterialIcons name="lock-clock" size={24} color={theme_1.COLORS.warning} importantForAccessibility="no" accessibilityElementsHidden/>
125
+ <react_native_1.View style={{ flex: 1, gap: theme_1.SPACING.xs }}>
126
+ <react_native_1.Text style={styles.lockWarningTitle}>Name Change Locked</react_native_1.Text>
127
+ <react_native_1.Text style={styles.lockWarningBody}>
128
+ {`You can change your Echo Profile name in ${daysRemaining} day${daysRemaining !== 1 ? 's' : ''}.`}
129
+ </react_native_1.Text>
130
+ {nextEligibleDate ? (<react_native_1.Text style={styles.lockWarningBody}>
131
+ {`Eligible from: ${formatDate(nextEligibleDate)}`}
132
+ </react_native_1.Text>) : null}
133
+ </react_native_1.View>
134
+ </react_native_1.View>) : (
135
+ /* ── Normal input state ─────────────────────────────────────── */
136
+ <>
137
+ <EchoErrorBanner_1.EchoErrorBanner message={error !== null && error !== void 0 ? error : null}/>
138
+
139
+ <EchoFormField_1.EchoFormField label="New Echo Profile Name" value={newUsername} onChangeText={onChangeUsername} placeholder="e.g. Prowler" autoCapitalize="none" returnKeyType="done" onSubmitEditing={onSubmit} accessibilityHint="Enter your new Echo Profile name. 2 to 30 characters, letters, numbers, and underscores only. No spaces." inputRef={inputRef}/>
140
+
141
+ {/* ── Availability indicator ─────────────────────────────── */}
142
+ {newUsername.length >= 2 ? (availability === 'checking' ? (<react_native_1.View style={styles.availRow}>
143
+ <react_native_1.ActivityIndicator size="small" color={theme_1.COLORS.textMuted}/>
144
+ <react_native_1.Text style={styles.availText} accessibilityLiveRegion="polite" accessibilityLabel="Checking name availability">
145
+ Checking…
146
+ </react_native_1.Text>
147
+ </react_native_1.View>) : availability === 'invalid' ? (<react_native_1.View style={styles.availRow} accessible accessibilityRole="alert" accessibilityLabel="Invalid format">
148
+ <vector_icons_1.MaterialIcons name="error-outline" size={16} color={theme_1.COLORS.error} accessibilityElementsHidden/>
149
+ <react_native_1.Text style={[styles.availText, { color: theme_1.COLORS.error }]}>
150
+ Invalid format
151
+ </react_native_1.Text>
152
+ </react_native_1.View>) : availability === 'same' ? (<react_native_1.View style={styles.availRow} accessible accessibilityLabel="Same as current name">
153
+ <vector_icons_1.MaterialIcons name="info-outline" size={16} color={theme_1.COLORS.textMuted} accessibilityElementsHidden/>
154
+ <react_native_1.Text style={[styles.availText, { color: theme_1.COLORS.textMuted }]}>
155
+ Same as current name
156
+ </react_native_1.Text>
157
+ </react_native_1.View>) : availability === 'available' ? (<react_native_1.View style={styles.availRow} accessible accessibilityRole="text" accessibilityLiveRegion="polite" accessibilityLabel="Name is available">
158
+ <vector_icons_1.MaterialIcons name="check-circle" size={16} color={theme_1.COLORS.neonGreen} accessibilityElementsHidden/>
159
+ <react_native_1.Text style={[styles.availText, { color: theme_1.COLORS.neonGreen }]}>
160
+ Available
161
+ </react_native_1.Text>
162
+ </react_native_1.View>) : availability === 'unavailable' ? (<react_native_1.View style={styles.availRow} accessible accessibilityRole="alert" accessibilityLiveRegion="polite" accessibilityLabel="Name already taken">
163
+ <vector_icons_1.MaterialIcons name="cancel" size={16} color={theme_1.COLORS.error} accessibilityElementsHidden/>
164
+ <react_native_1.Text style={[styles.availText, { color: theme_1.COLORS.error }]}>
165
+ Already taken
166
+ </react_native_1.Text>
167
+ </react_native_1.View>) : availability === 'check_failed' ? (<react_native_1.View style={styles.availRow} accessible accessibilityRole="alert" accessibilityLiveRegion="polite" accessibilityLabel="Could not check availability">
168
+ <vector_icons_1.MaterialIcons name="wifi-off" size={16} color={theme_1.COLORS.warning} accessibilityElementsHidden/>
169
+ <react_native_1.Text style={[styles.availText, { color: theme_1.COLORS.warning }]}>
170
+ Could not check
171
+ </react_native_1.Text>
172
+ </react_native_1.View>) : null) : null}
173
+
174
+ {/* Format hint */}
175
+ <react_native_1.View style={styles.hintRow}>
176
+ <vector_icons_1.MaterialIcons name="info-outline" size={14} color={theme_1.COLORS.textMuted} accessibilityElementsHidden/>
177
+ <react_native_1.Text style={styles.hintText}>
178
+ 2–30 characters. Letters, numbers, and underscores only. No spaces.
179
+ </react_native_1.Text>
180
+ </react_native_1.View>
181
+
182
+ {/* 30-day notice */}
183
+ <react_native_1.View style={styles.lockNotice}>
184
+ <vector_icons_1.MaterialIcons name="schedule" size={14} color={theme_1.COLORS.neonBlue} accessibilityElementsHidden/>
185
+ <react_native_1.Text style={styles.lockNoticeText}>
186
+ Echo Profile names can only be changed once every 30 days. Choose carefully.
187
+ </react_native_1.Text>
188
+ </react_native_1.View>
189
+
190
+ {/* Cancel + Confirm actions */}
191
+ <react_native_1.View style={styles.actions}>
192
+ <EchoPrimaryButton_1.EchoPrimaryButton label="Cancel" onPress={onClose} color={theme_1.COLORS.textMuted}/>
193
+ <EchoPrimaryButton_1.EchoPrimaryButton label={submitting ? 'Saving…' : 'Confirm Change'} onPress={onSubmit} loading={submitting} disabled={!canSubmit} color={theme_1.COLORS.neonCyan}/>
194
+ </react_native_1.View>
195
+ </>)}
196
+ </react_native_1.ScrollView>
197
+ </react_native_1.KeyboardAvoidingView>
198
+ </react_native_1.Modal>);
199
+ }
200
+ // ─────────────────────────────────────────────────────────────────────────────
201
+ // Styles
202
+ // ─────────────────────────────────────────────────────────────────────────────
203
+ const styles = react_native_1.StyleSheet.create({
204
+ root: {
205
+ flex: 1,
206
+ backgroundColor: theme_1.COLORS.bg,
207
+ },
208
+ // Header
209
+ header: {
210
+ flexDirection: 'row',
211
+ alignItems: 'center',
212
+ justifyContent: 'space-between',
213
+ paddingHorizontal: theme_1.SPACING.lg,
214
+ paddingVertical: theme_1.SPACING.md,
215
+ borderBottomWidth: 1,
216
+ borderBottomColor: theme_1.COLORS.border,
217
+ },
218
+ heading: {
219
+ fontSize: theme_1.FONTS.lg,
220
+ fontWeight: '700',
221
+ color: theme_1.COLORS.textPrimary,
222
+ },
223
+ // Scroll content
224
+ content: {
225
+ padding: theme_1.SPACING.lg,
226
+ gap: theme_1.SPACING.md,
227
+ },
228
+ // Current name row
229
+ currentNameRow: {
230
+ flexDirection: 'row',
231
+ alignItems: 'center',
232
+ justifyContent: 'space-between',
233
+ backgroundColor: theme_1.COLORS.surfaceHigh,
234
+ borderRadius: theme_1.RADIUS.md,
235
+ paddingHorizontal: theme_1.SPACING.md,
236
+ paddingVertical: theme_1.SPACING.sm,
237
+ },
238
+ currentNameLabel: {
239
+ fontSize: theme_1.FONTS.sm,
240
+ color: theme_1.COLORS.textMuted,
241
+ fontWeight: '600',
242
+ },
243
+ currentNameValue: {
244
+ fontSize: theme_1.FONTS.md,
245
+ color: theme_1.COLORS.neonCyan,
246
+ fontWeight: '700',
247
+ },
248
+ // Lock warning
249
+ lockWarning: {
250
+ flexDirection: 'row',
251
+ gap: theme_1.SPACING.md,
252
+ alignItems: 'flex-start',
253
+ backgroundColor: theme_1.COLORS.warning + '15',
254
+ borderRadius: theme_1.RADIUS.lg,
255
+ borderWidth: 1,
256
+ borderColor: theme_1.COLORS.warning + '55',
257
+ padding: theme_1.SPACING.md,
258
+ },
259
+ lockWarningTitle: {
260
+ fontSize: theme_1.FONTS.md,
261
+ fontWeight: '700',
262
+ color: theme_1.COLORS.warning,
263
+ marginBottom: theme_1.SPACING.xs,
264
+ },
265
+ lockWarningBody: {
266
+ fontSize: theme_1.FONTS.sm,
267
+ color: theme_1.COLORS.textSecondary,
268
+ lineHeight: 20,
269
+ },
270
+ // Availability indicator row
271
+ availRow: {
272
+ flexDirection: 'row',
273
+ alignItems: 'center',
274
+ gap: theme_1.SPACING.xs,
275
+ paddingVertical: theme_1.SPACING.xs,
276
+ },
277
+ availText: {
278
+ fontSize: theme_1.FONTS.sm,
279
+ fontWeight: '600',
280
+ color: theme_1.COLORS.textSecondary,
281
+ },
282
+ // Hint rows
283
+ hintRow: {
284
+ flexDirection: 'row',
285
+ alignItems: 'flex-start',
286
+ gap: theme_1.SPACING.xs,
287
+ },
288
+ hintText: {
289
+ flex: 1,
290
+ fontSize: theme_1.FONTS.xs,
291
+ color: theme_1.COLORS.textMuted,
292
+ lineHeight: 18,
293
+ },
294
+ lockNotice: {
295
+ flexDirection: 'row',
296
+ alignItems: 'flex-start',
297
+ gap: theme_1.SPACING.xs,
298
+ backgroundColor: theme_1.COLORS.neonBlue + '10',
299
+ borderRadius: theme_1.RADIUS.md,
300
+ borderWidth: 1,
301
+ borderColor: theme_1.COLORS.neonBlue + '33',
302
+ padding: theme_1.SPACING.sm,
303
+ },
304
+ lockNoticeText: {
305
+ flex: 1,
306
+ fontSize: theme_1.FONTS.xs,
307
+ color: theme_1.COLORS.textSecondary,
308
+ lineHeight: 18,
309
+ },
310
+ // Actions row
311
+ actions: {
312
+ flexDirection: 'row',
313
+ gap: theme_1.SPACING.md,
314
+ marginTop: theme_1.SPACING.md,
315
+ },
316
+ });
317
+ //# sourceMappingURL=EchoChangeProfileNameModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoChangeProfileNameModal.js","sourceRoot":"","sources":["../../src/components/EchoChangeProfileNameModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * EchoColorPicker
3
+ *
4
+ * Presentation-only modal for selecting an Echo Profile accent color.
5
+ * Extracted from the Echo UI Reference EchoColorPickerModal.
6
+ *
7
+ * Renders all 15 approved Echo Colors as swatches in a grid.
8
+ * The current color is highlighted with a glow border, a colored label,
9
+ * and a checkmark badge (or saving spinner while saving).
10
+ *
11
+ * ACCESSIBILITY
12
+ * ─────────────
13
+ * • Modal heading announced on open.
14
+ * • Each swatch is a button with label, selected state, and busy state.
15
+ * • Current color summary row is an accessible text element.
16
+ *
17
+ * No Expo Router, no safe-area hooks, no auth, no contexts, no services,
18
+ * no storage, no app-specific code.
19
+ * Canonical shared component for @echoform/echo-ui.
20
+ */
21
+ import React from 'react';
22
+ export type EchoColorPickerProps = {
23
+ visible: boolean;
24
+ currentColor: string;
25
+ saving: boolean;
26
+ onClose: () => void;
27
+ onSelect: (hex: string) => void | Promise<void>;
28
+ /** Safe-area top inset supplied by the host. Defaults to 0. */
29
+ topInset?: number;
30
+ /** Safe-area bottom inset used for scroll padding. Defaults to 0. */
31
+ bottomInset?: number;
32
+ };
33
+ export declare function EchoColorPicker({ visible, currentColor, saving, onClose, onSelect, topInset, bottomInset, }: EchoColorPickerProps): React.JSX.Element;
34
+ //# sourceMappingURL=EchoColorPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EchoColorPicker.d.ts","sourceRoot":"","sources":["../../src/components/EchoColorPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAMF,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAY,EACZ,WAAe,GAChB,EAAE,oBAAoB,qBA4ItB"}