@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.
- package/README.md +57 -10
- package/dist/components/EchoChangeProfileNameModal.d.ts +59 -0
- package/dist/components/EchoChangeProfileNameModal.d.ts.map +1 -0
- package/dist/components/EchoChangeProfileNameModal.js +317 -0
- package/dist/components/EchoChangeProfileNameModal.js.map +1 -0
- package/dist/components/EchoColorPicker.d.ts +34 -0
- package/dist/components/EchoColorPicker.d.ts.map +1 -0
- package/dist/components/EchoColorPicker.js +206 -0
- package/dist/components/EchoColorPicker.js.map +1 -0
- package/dist/components/EchoConnectedAppsModal.d.ts +40 -0
- package/dist/components/EchoConnectedAppsModal.d.ts.map +1 -0
- package/dist/components/EchoConnectedAppsModal.js +220 -0
- package/dist/components/EchoConnectedAppsModal.js.map +1 -0
- package/dist/components/EchoDeleteProfilePanel.d.ts +63 -0
- package/dist/components/EchoDeleteProfilePanel.d.ts.map +1 -0
- package/dist/components/EchoDeleteProfilePanel.js +286 -0
- package/dist/components/EchoDeleteProfilePanel.js.map +1 -0
- package/dist/components/EchoDeletionIntercept.d.ts +39 -0
- package/dist/components/EchoDeletionIntercept.d.ts.map +1 -0
- package/dist/components/EchoDeletionIntercept.js +212 -0
- package/dist/components/EchoDeletionIntercept.js.map +1 -0
- package/dist/components/EchoDeletionStatusCard.d.ts +35 -0
- package/dist/components/EchoDeletionStatusCard.d.ts.map +1 -0
- package/dist/components/EchoDeletionStatusCard.js +156 -0
- package/dist/components/EchoDeletionStatusCard.js.map +1 -0
- package/dist/components/EchoEmblem.d.ts +93 -0
- package/dist/components/EchoEmblem.d.ts.map +1 -0
- package/dist/components/EchoEmblem.js +308 -0
- package/dist/components/EchoEmblem.js.map +1 -0
- package/dist/components/EchoEmblemPicker.d.ts +71 -0
- package/dist/components/EchoEmblemPicker.d.ts.map +1 -0
- package/dist/components/EchoEmblemPicker.js +490 -0
- package/dist/components/EchoEmblemPicker.js.map +1 -0
- package/dist/components/EchoErrorBanner.d.ts +17 -0
- package/dist/components/EchoErrorBanner.d.ts.map +1 -0
- package/dist/components/EchoErrorBanner.js +48 -0
- package/dist/components/EchoErrorBanner.js.map +1 -0
- package/dist/components/EchoFormField.d.ts +27 -0
- package/dist/components/EchoFormField.d.ts.map +1 -0
- package/dist/components/EchoFormField.js +49 -0
- package/dist/components/EchoFormField.js.map +1 -0
- package/dist/components/EchoLinkButton.d.ts +16 -0
- package/dist/components/EchoLinkButton.d.ts.map +1 -0
- package/dist/components/EchoLinkButton.js +37 -0
- package/dist/components/EchoLinkButton.js.map +1 -0
- package/dist/components/EchoMoreScreen.d.ts +41 -0
- package/dist/components/EchoMoreScreen.d.ts.map +1 -0
- package/dist/components/EchoMoreScreen.js +94 -0
- package/dist/components/EchoMoreScreen.js.map +1 -0
- package/dist/components/EchoPasswordField.d.ts +28 -0
- package/dist/components/EchoPasswordField.d.ts.map +1 -0
- package/dist/components/EchoPasswordField.js +67 -0
- package/dist/components/EchoPasswordField.js.map +1 -0
- package/dist/components/EchoPrimaryButton.d.ts +23 -0
- package/dist/components/EchoPrimaryButton.d.ts.map +1 -0
- package/dist/components/EchoPrimaryButton.js +54 -0
- package/dist/components/EchoPrimaryButton.js.map +1 -0
- package/dist/components/EchoProfileCard.d.ts +35 -0
- package/dist/components/EchoProfileCard.d.ts.map +1 -0
- package/dist/components/EchoProfileCard.js +206 -0
- package/dist/components/EchoProfileCard.js.map +1 -0
- package/dist/components/EchoProfileDivider.d.ts +14 -0
- package/dist/components/EchoProfileDivider.d.ts.map +1 -0
- package/dist/components/EchoProfileDivider.js +31 -0
- package/dist/components/EchoProfileDivider.js.map +1 -0
- package/dist/components/EchoProfileHero.d.ts +48 -0
- package/dist/components/EchoProfileHero.d.ts.map +1 -0
- package/dist/components/EchoProfileHero.js +215 -0
- package/dist/components/EchoProfileHero.js.map +1 -0
- package/dist/components/EchoProfileOverview.d.ts +18 -0
- package/dist/components/EchoProfileOverview.d.ts.map +1 -0
- package/dist/components/EchoProfileOverview.js +36 -0
- package/dist/components/EchoProfileOverview.js.map +1 -0
- package/dist/components/EchoProfileRow.d.ts +60 -0
- package/dist/components/EchoProfileRow.d.ts.map +1 -0
- package/dist/components/EchoProfileRow.js +113 -0
- package/dist/components/EchoProfileRow.js.map +1 -0
- package/dist/components/EchoProfileSection.d.ts +29 -0
- package/dist/components/EchoProfileSection.d.ts.map +1 -0
- package/dist/components/EchoProfileSection.js +58 -0
- package/dist/components/EchoProfileSection.js.map +1 -0
- package/dist/components/EchoRewardNotificationBanner.d.ts +61 -0
- package/dist/components/EchoRewardNotificationBanner.d.ts.map +1 -0
- package/dist/components/EchoRewardNotificationBanner.js +272 -0
- package/dist/components/EchoRewardNotificationBanner.js.map +1 -0
- package/dist/components/EchoSettingsRow.d.ts +24 -0
- package/dist/components/EchoSettingsRow.d.ts.map +1 -0
- package/dist/components/EchoSettingsRow.js +84 -0
- package/dist/components/EchoSettingsRow.js.map +1 -0
- package/dist/components/EchoSettingsSection.d.ts +16 -0
- package/dist/components/EchoSettingsSection.d.ts.map +1 -0
- package/dist/components/EchoSettingsSection.js +48 -0
- package/dist/components/EchoSettingsSection.js.map +1 -0
- package/dist/components/EchoSignOutButton.d.ts +28 -0
- package/dist/components/EchoSignOutButton.d.ts.map +1 -0
- package/dist/components/EchoSignOutButton.js +67 -0
- package/dist/components/EchoSignOutButton.js.map +1 -0
- package/dist/components/EchoSuccessBanner.d.ts +17 -0
- package/dist/components/EchoSuccessBanner.d.ts.map +1 -0
- package/dist/components/EchoSuccessBanner.js +48 -0
- package/dist/components/EchoSuccessBanner.js.map +1 -0
- package/dist/components/EchoSyncPanel.d.ts +165 -0
- package/dist/components/EchoSyncPanel.d.ts.map +1 -0
- package/dist/components/EchoSyncPanel.js +913 -0
- package/dist/components/EchoSyncPanel.js.map +1 -0
- package/dist/components/EchoSyncPromptModal.d.ts +87 -0
- package/dist/components/EchoSyncPromptModal.d.ts.map +1 -0
- package/dist/components/EchoSyncPromptModal.js +351 -0
- package/dist/components/EchoSyncPromptModal.js.map +1 -0
- package/dist/components/EchoTitlePicker.d.ts +72 -0
- package/dist/components/EchoTitlePicker.d.ts.map +1 -0
- package/dist/components/EchoTitlePicker.js +487 -0
- package/dist/components/EchoTitlePicker.js.map +1 -0
- package/dist/components/EchoVerificationCodeInput.d.ts +40 -0
- package/dist/components/EchoVerificationCodeInput.d.ts.map +1 -0
- package/dist/components/EchoVerificationCodeInput.js +140 -0
- package/dist/components/EchoVerificationCodeInput.js.map +1 -0
- package/dist/components/EchoWelcome.d.ts +44 -0
- package/dist/components/EchoWelcome.d.ts.map +1 -0
- package/dist/components/EchoWelcome.js +289 -0
- package/dist/components/EchoWelcome.js.map +1 -0
- package/dist/components/EchoWhyBecomeAnEchoModal.d.ts +34 -0
- package/dist/components/EchoWhyBecomeAnEchoModal.d.ts.map +1 -0
- package/dist/components/EchoWhyBecomeAnEchoModal.js +321 -0
- package/dist/components/EchoWhyBecomeAnEchoModal.js.map +1 -0
- package/dist/components/EchoformInfoButton.d.ts +27 -0
- package/dist/components/EchoformInfoButton.d.ts.map +1 -0
- package/dist/components/EchoformInfoButton.js +60 -0
- package/dist/components/EchoformInfoButton.js.map +1 -0
- package/dist/components/EchoformInfoModal.d.ts +63 -0
- package/dist/components/EchoformInfoModal.d.ts.map +1 -0
- package/dist/components/EchoformInfoModal.js +347 -0
- package/dist/components/EchoformInfoModal.js.map +1 -0
- package/dist/echoColors.d.ts +58 -0
- package/dist/echoColors.d.ts.map +1 -0
- package/dist/echoColors.js +94 -0
- package/dist/echoColors.js.map +1 -0
- package/dist/index.d.ts +71 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -4
- package/dist/index.js.map +1 -1
- package/dist/theme.d.ts +48 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +51 -0
- package/dist/theme.js.map +1 -0
- package/dist/titleRarity.d.ts +19 -0
- package/dist/titleRarity.d.ts.map +1 -0
- package/dist/titleRarity.js +46 -0
- package/dist/titleRarity.js.map +1 -0
- package/package.json +6 -5
- package/dist/components/EchoUITest.d.ts +0 -14
- package/dist/components/EchoUITest.d.ts.map +0 -1
- package/dist/components/EchoUITest.js +0 -53
- 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
|
|
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 (
|
|
39
|
+
├── app/ ← Expo Router host app (Echo UI Reference)
|
|
12
40
|
│ ├── _layout.tsx
|
|
13
41
|
│ └── (tabs)/
|
|
14
42
|
│ ├── _layout.tsx
|
|
15
|
-
│ └── index.tsx ←
|
|
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
|
-
└──
|
|
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
|
-
|
|
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.
|
|
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"}
|