@echoform/echo-ui 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/EchoProfileCard.d.ts +31 -0
- package/dist/components/EchoProfileCard.d.ts.map +1 -0
- package/dist/components/EchoProfileCard.js +211 -0
- package/dist/components/EchoProfileCard.js.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -2
- 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 +14 -0
- package/dist/titleRarity.d.ts.map +1 -0
- package/dist/titleRarity.js +33 -0
- package/dist/titleRarity.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EchoEmblem — Universal Echo Emblem display component.
|
|
3
|
+
*
|
|
4
|
+
* RENDERING CONTRACT
|
|
5
|
+
* ──────────────────
|
|
6
|
+
* • Reserves a fixed square slot of `size × size` logical pixels.
|
|
7
|
+
* • Images are rendered with contentFit="contain" — no cropping, no stretching.
|
|
8
|
+
* • No overflow:hidden on any container — decorative PNG details outside the
|
|
9
|
+
* circular artwork must never be clipped.
|
|
10
|
+
* • No borderRadius mask applied to the image slot.
|
|
11
|
+
* • Transparent PNG margins are preserved; layout never shifts while the image
|
|
12
|
+
* loads from the network.
|
|
13
|
+
* • The selection ring extends 4pt outside the slot using absolute positioning;
|
|
14
|
+
* it is visible because no parent clips it.
|
|
15
|
+
*
|
|
16
|
+
* STATES
|
|
17
|
+
* ──────
|
|
18
|
+
* Normal | Loading (spinner) | Error (fallback icon) | Selected (ring) | Disabled (opacity)
|
|
19
|
+
*
|
|
20
|
+
* ACCESSIBILITY
|
|
21
|
+
* ─────────────
|
|
22
|
+
* • accessibilityRole="button" when onPress is provided, "image" otherwise.
|
|
23
|
+
* • accessibilityState: selected, disabled, busy (while loading).
|
|
24
|
+
* • Label auto-computes from displayName; overridable via accessibilityLabel.
|
|
25
|
+
* • Inner image and overlays are hidden from screen readers.
|
|
26
|
+
*
|
|
27
|
+
* STUCK-SPINNER FIX
|
|
28
|
+
* ─────────────────
|
|
29
|
+
* The source prop frequently arrives as a new object literal on every render:
|
|
30
|
+
*
|
|
31
|
+
* source={{ uri: imageUrl }} // new object every render
|
|
32
|
+
*
|
|
33
|
+
* If useEffect depended on the object reference, it would reset loading/error
|
|
34
|
+
* states on every render — even when the URI itself has not changed — leaving
|
|
35
|
+
* the spinner permanently visible for already-cached images that never fire
|
|
36
|
+
* onLoadStart again after the first render.
|
|
37
|
+
*
|
|
38
|
+
* Fix: derive a stable string key from the actual URI or require() number,
|
|
39
|
+
* and reset internal state ONLY when that key changes. The wrapper object's
|
|
40
|
+
* identity is intentionally ignored.
|
|
41
|
+
*/
|
|
42
|
+
import React from 'react';
|
|
43
|
+
import type { ImageSource } from 'expo-image';
|
|
44
|
+
export type EchoEmblemProps = {
|
|
45
|
+
/**
|
|
46
|
+
* Remote: `{ uri: 'https://...' }`
|
|
47
|
+
* Local: `require('@/assets/my-emblem.png')`
|
|
48
|
+
*
|
|
49
|
+
* Uses expo-image ImageSource — covers both forms natively.
|
|
50
|
+
*/
|
|
51
|
+
source: ImageSource;
|
|
52
|
+
/**
|
|
53
|
+
* Square slot size in logical pixels.
|
|
54
|
+
* Tested: 32 | 48 | 64 | 96 | 144.
|
|
55
|
+
* Defaults to 96.
|
|
56
|
+
*/
|
|
57
|
+
size?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Human-readable emblem name.
|
|
60
|
+
* Drives the auto-computed accessibility label:
|
|
61
|
+
* "Smiley Echo Emblem"
|
|
62
|
+
* "Smiley Echo Emblem, selected"
|
|
63
|
+
* "Smiley Echo Emblem, unavailable"
|
|
64
|
+
*/
|
|
65
|
+
displayName?: string;
|
|
66
|
+
/** True while this emblem is the active/chosen selection. */
|
|
67
|
+
selected?: boolean;
|
|
68
|
+
/** True when the emblem is locked or otherwise unavailable to the user. */
|
|
69
|
+
disabled?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* External loading override.
|
|
72
|
+
* Pass true while fetching emblem metadata before the URL is resolved.
|
|
73
|
+
* The component's internal image-load tracking runs independently.
|
|
74
|
+
*/
|
|
75
|
+
loading?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* When true (default), a neon cyan ring is rendered around the slot
|
|
78
|
+
* when `selected` is true.
|
|
79
|
+
*/
|
|
80
|
+
showSelectionIndicator?: boolean;
|
|
81
|
+
/** Overrides the auto-computed VoiceOver / TalkBack label. */
|
|
82
|
+
accessibilityLabel?: string;
|
|
83
|
+
/** Optional hint appended by screen readers after the label. */
|
|
84
|
+
accessibilityHint?: string;
|
|
85
|
+
/**
|
|
86
|
+
* When provided, the component renders as an accessible Pressable button
|
|
87
|
+
* with scale + opacity press feedback.
|
|
88
|
+
* Without onPress it renders as an accessible image view.
|
|
89
|
+
*/
|
|
90
|
+
onPress?: () => void;
|
|
91
|
+
};
|
|
92
|
+
export declare function EchoEmblem({ source, size, displayName, selected, disabled, loading: externalLoading, showSelectionIndicator, accessibilityLabel: customLabel, accessibilityHint, onPress, }: EchoEmblemProps): React.JSX.Element;
|
|
93
|
+
//# sourceMappingURL=EchoEmblem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EchoEmblem.d.ts","sourceRoot":"","sources":["../../src/components/EchoEmblem.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AASjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;OAKG;IACH,MAAM,EAAE,WAAW,CAAC;IAEpB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAwCF,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,IAAS,EACT,WAAW,EACX,QAAgB,EAChB,QAAgB,EAChB,OAAO,EAAE,eAAuB,EAChC,sBAA6B,EAC7B,kBAAkB,EAAE,WAAW,EAC/B,iBAAiB,EACjB,OAAO,GACR,EAAE,eAAe,qBAoNjB"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* EchoEmblem — Universal Echo Emblem display component.
|
|
4
|
+
*
|
|
5
|
+
* RENDERING CONTRACT
|
|
6
|
+
* ──────────────────
|
|
7
|
+
* • Reserves a fixed square slot of `size × size` logical pixels.
|
|
8
|
+
* • Images are rendered with contentFit="contain" — no cropping, no stretching.
|
|
9
|
+
* • No overflow:hidden on any container — decorative PNG details outside the
|
|
10
|
+
* circular artwork must never be clipped.
|
|
11
|
+
* • No borderRadius mask applied to the image slot.
|
|
12
|
+
* • Transparent PNG margins are preserved; layout never shifts while the image
|
|
13
|
+
* loads from the network.
|
|
14
|
+
* • The selection ring extends 4pt outside the slot using absolute positioning;
|
|
15
|
+
* it is visible because no parent clips it.
|
|
16
|
+
*
|
|
17
|
+
* STATES
|
|
18
|
+
* ──────
|
|
19
|
+
* Normal | Loading (spinner) | Error (fallback icon) | Selected (ring) | Disabled (opacity)
|
|
20
|
+
*
|
|
21
|
+
* ACCESSIBILITY
|
|
22
|
+
* ─────────────
|
|
23
|
+
* • accessibilityRole="button" when onPress is provided, "image" otherwise.
|
|
24
|
+
* • accessibilityState: selected, disabled, busy (while loading).
|
|
25
|
+
* • Label auto-computes from displayName; overridable via accessibilityLabel.
|
|
26
|
+
* • Inner image and overlays are hidden from screen readers.
|
|
27
|
+
*
|
|
28
|
+
* STUCK-SPINNER FIX
|
|
29
|
+
* ─────────────────
|
|
30
|
+
* The source prop frequently arrives as a new object literal on every render:
|
|
31
|
+
*
|
|
32
|
+
* source={{ uri: imageUrl }} // new object every render
|
|
33
|
+
*
|
|
34
|
+
* If useEffect depended on the object reference, it would reset loading/error
|
|
35
|
+
* states on every render — even when the URI itself has not changed — leaving
|
|
36
|
+
* the spinner permanently visible for already-cached images that never fire
|
|
37
|
+
* onLoadStart again after the first render.
|
|
38
|
+
*
|
|
39
|
+
* Fix: derive a stable string key from the actual URI or require() number,
|
|
40
|
+
* and reset internal state ONLY when that key changes. The wrapper object's
|
|
41
|
+
* identity is intentionally ignored.
|
|
42
|
+
*/
|
|
43
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
44
|
+
if (k2 === undefined) k2 = k;
|
|
45
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
46
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
47
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
48
|
+
}
|
|
49
|
+
Object.defineProperty(o, k2, desc);
|
|
50
|
+
}) : (function(o, m, k, k2) {
|
|
51
|
+
if (k2 === undefined) k2 = k;
|
|
52
|
+
o[k2] = m[k];
|
|
53
|
+
}));
|
|
54
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
55
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
56
|
+
}) : function(o, v) {
|
|
57
|
+
o["default"] = v;
|
|
58
|
+
});
|
|
59
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
60
|
+
var ownKeys = function(o) {
|
|
61
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
62
|
+
var ar = [];
|
|
63
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
64
|
+
return ar;
|
|
65
|
+
};
|
|
66
|
+
return ownKeys(o);
|
|
67
|
+
};
|
|
68
|
+
return function (mod) {
|
|
69
|
+
if (mod && mod.__esModule) return mod;
|
|
70
|
+
var result = {};
|
|
71
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
72
|
+
__setModuleDefault(result, mod);
|
|
73
|
+
return result;
|
|
74
|
+
};
|
|
75
|
+
})();
|
|
76
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
77
|
+
exports.EchoEmblem = EchoEmblem;
|
|
78
|
+
const react_1 = __importStar(require("react"));
|
|
79
|
+
const react_native_1 = require("react-native");
|
|
80
|
+
const expo_image_1 = require("expo-image");
|
|
81
|
+
const vector_icons_1 = require("@expo/vector-icons");
|
|
82
|
+
const theme_1 = require("../theme");
|
|
83
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
84
|
+
// Stable source key
|
|
85
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
86
|
+
/**
|
|
87
|
+
* Derive a stable primitive key from an ImageSource.
|
|
88
|
+
*
|
|
89
|
+
* WHY: Callers frequently pass `source={{ uri: url }}` which creates a NEW
|
|
90
|
+
* object on every render. Using the object reference in a useEffect dep would
|
|
91
|
+
* reset loading/error on every render — even for already-cached images that
|
|
92
|
+
* will not fire onLoadStart again, causing the spinner to stick forever.
|
|
93
|
+
*
|
|
94
|
+
* By extracting the underlying string (URI) or number (require() asset),
|
|
95
|
+
* the effect only resets state when the actual image content changes.
|
|
96
|
+
*/
|
|
97
|
+
function getSourceKey(source) {
|
|
98
|
+
if (typeof source === 'number')
|
|
99
|
+
return source; // local require()
|
|
100
|
+
if (typeof source === 'string')
|
|
101
|
+
return source; // bare URI string
|
|
102
|
+
if (source && typeof source === 'object') {
|
|
103
|
+
// { uri: string } — most common remote form
|
|
104
|
+
if ('uri' in source && typeof source.uri === 'string')
|
|
105
|
+
return source.uri;
|
|
106
|
+
// Array form: use first entry's uri or index
|
|
107
|
+
if (Array.isArray(source)) {
|
|
108
|
+
const first = source[0];
|
|
109
|
+
if (typeof first === 'string')
|
|
110
|
+
return first;
|
|
111
|
+
if (typeof first === 'number')
|
|
112
|
+
return first;
|
|
113
|
+
if (first && typeof first === 'object' && 'uri' in first && typeof first.uri === 'string') {
|
|
114
|
+
return first.uri;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return '__unknown__';
|
|
119
|
+
}
|
|
120
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
121
|
+
// Component
|
|
122
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
123
|
+
function EchoEmblem({ source, size = 96, displayName, selected = false, disabled = false, loading: externalLoading = false, showSelectionIndicator = true, accessibilityLabel: customLabel, accessibilityHint, onPress, }) {
|
|
124
|
+
// Prevent state updates after the component unmounts.
|
|
125
|
+
const mountedRef = (0, react_1.useRef)(true);
|
|
126
|
+
(0, react_1.useEffect)(() => () => { mountedRef.current = false; }, []);
|
|
127
|
+
const [imageLoading, setImageLoading] = (0, react_1.useState)(true);
|
|
128
|
+
const [imageFailed, setImageFailed] = (0, react_1.useState)(false);
|
|
129
|
+
/**
|
|
130
|
+
* Stable primitive key derived from the actual image URI / asset number.
|
|
131
|
+
*
|
|
132
|
+
* OBJECT IDENTITY MUST NOT BE USED HERE.
|
|
133
|
+
* Callers often write: source={{ uri: url }}
|
|
134
|
+
* That creates a new object on every render, even if `url` is identical.
|
|
135
|
+
* Depending on `source` (the object) in useEffect would reset loading/error
|
|
136
|
+
* on every render cycle, permanently showing the spinner for cached images
|
|
137
|
+
* that never re-fire onLoadStart after their first successful load.
|
|
138
|
+
*
|
|
139
|
+
* We derive `sourceKey` — a string or number — so the effect only runs
|
|
140
|
+
* when the actual image content changes.
|
|
141
|
+
*/
|
|
142
|
+
const sourceKey = (0, react_1.useMemo)(() => getSourceKey(source), [source]);
|
|
143
|
+
// Reset internal load state only when the actual image source changes.
|
|
144
|
+
// This is the core fix for the stuck-spinner bug.
|
|
145
|
+
(0, react_1.useEffect)(() => {
|
|
146
|
+
setImageLoading(true);
|
|
147
|
+
setImageFailed(false);
|
|
148
|
+
}, [sourceKey]);
|
|
149
|
+
const handleLoadStart = (0, react_1.useCallback)(() => {
|
|
150
|
+
if (!mountedRef.current)
|
|
151
|
+
return;
|
|
152
|
+
setImageLoading(true);
|
|
153
|
+
setImageFailed(false);
|
|
154
|
+
}, []);
|
|
155
|
+
const handleLoad = (0, react_1.useCallback)(() => {
|
|
156
|
+
if (!mountedRef.current)
|
|
157
|
+
return;
|
|
158
|
+
setImageLoading(false);
|
|
159
|
+
}, []);
|
|
160
|
+
// expo-image also fires `onDisplay` when a cached frame is shown without
|
|
161
|
+
// a network round-trip — clear the spinner in that case too so cached
|
|
162
|
+
// images never leave the spinner visible.
|
|
163
|
+
const handleDisplay = (0, react_1.useCallback)(() => {
|
|
164
|
+
if (!mountedRef.current)
|
|
165
|
+
return;
|
|
166
|
+
setImageLoading(false);
|
|
167
|
+
}, []);
|
|
168
|
+
const handleError = (0, react_1.useCallback)(() => {
|
|
169
|
+
if (!mountedRef.current)
|
|
170
|
+
return;
|
|
171
|
+
setImageLoading(false);
|
|
172
|
+
setImageFailed(true);
|
|
173
|
+
}, []);
|
|
174
|
+
// Derived display states
|
|
175
|
+
const showSpinner = externalLoading || imageLoading;
|
|
176
|
+
const showError = imageFailed && !externalLoading;
|
|
177
|
+
// ── Accessibility label ─────────────────────────────────────────────────
|
|
178
|
+
const baseLabel = displayName ? `${displayName} Echo Emblem` : 'Echo Emblem';
|
|
179
|
+
const computedLabel = customLabel !== null && customLabel !== void 0 ? customLabel : (showError
|
|
180
|
+
? `${baseLabel} image unavailable`
|
|
181
|
+
: disabled
|
|
182
|
+
? `${baseLabel}, unavailable`
|
|
183
|
+
: selected
|
|
184
|
+
? `${baseLabel}, selected`
|
|
185
|
+
: baseLabel);
|
|
186
|
+
// hitSlop ensures the minimum 44pt touch target on small sizes.
|
|
187
|
+
const hitSlop = size < 44
|
|
188
|
+
? {
|
|
189
|
+
top: Math.ceil((44 - size) / 2),
|
|
190
|
+
bottom: Math.ceil((44 - size) / 2),
|
|
191
|
+
left: Math.ceil((44 - size) / 2),
|
|
192
|
+
right: Math.ceil((44 - size) / 2),
|
|
193
|
+
}
|
|
194
|
+
: undefined;
|
|
195
|
+
// Selection ring geometry: 8pt gutter around the slot, no clipping needed.
|
|
196
|
+
const ringSize = size + 8;
|
|
197
|
+
const ringOffset = -4;
|
|
198
|
+
const ringRadius = ringSize / 2;
|
|
199
|
+
// ── Inner visual content (shared between pressable and image-only) ───────
|
|
200
|
+
const innerContent = (<react_native_1.View
|
|
201
|
+
// Fixed square slot. No overflow:hidden. No borderRadius. No mask.
|
|
202
|
+
// aspectRatio stabilises layout if the parent constrains one axis.
|
|
203
|
+
style={[styles.slot, { width: size, height: size }]}
|
|
204
|
+
// Android: hide all inner elements from TalkBack — outer wrapper speaks.
|
|
205
|
+
importantForAccessibility="no-hide-descendants">
|
|
206
|
+
{/*
|
|
207
|
+
* expo-image with contentFit="contain":
|
|
208
|
+
* • Scales the full PNG (transparent margins included) to fit the slot.
|
|
209
|
+
* • Never crops or stretches the artwork.
|
|
210
|
+
* • Always rendered (even during load) so image events fire correctly.
|
|
211
|
+
*/}
|
|
212
|
+
<expo_image_1.Image source={source} style={{ width: size, height: size }} contentFit="contain" onLoadStart={handleLoadStart} onLoad={handleLoad} onDisplay={handleDisplay} onError={handleError} accessible={false}/>
|
|
213
|
+
|
|
214
|
+
{/* Loading spinner — floats above the image while it loads */}
|
|
215
|
+
{showSpinner && !showError ? (<react_native_1.View style={[styles.overlay, { width: size, height: size }]} accessible={false} importantForAccessibility="no">
|
|
216
|
+
<react_native_1.ActivityIndicator color={theme_1.COLORS.neonCyan} size={size >= 64 ? 'large' : 'small'}/>
|
|
217
|
+
</react_native_1.View>) : null}
|
|
218
|
+
|
|
219
|
+
{/* Error placeholder — replaces the broken image indicator */}
|
|
220
|
+
{showError ? (<react_native_1.View style={[
|
|
221
|
+
styles.overlay,
|
|
222
|
+
styles.errorPlaceholder,
|
|
223
|
+
{ width: size, height: size, borderRadius: Math.round(size * 0.12) },
|
|
224
|
+
]} accessible={false} importantForAccessibility="no">
|
|
225
|
+
<vector_icons_1.MaterialIcons name="image-not-supported" size={Math.max(14, Math.floor(size * 0.38))} color={theme_1.COLORS.textMuted}/>
|
|
226
|
+
</react_native_1.View>) : null}
|
|
227
|
+
|
|
228
|
+
{/*
|
|
229
|
+
* Selection ring: absolute, extends OUTSIDE the slot via negative insets.
|
|
230
|
+
* Visible because the slot container has no overflow:hidden.
|
|
231
|
+
* Decorative only — hidden from screen readers.
|
|
232
|
+
* iOS: shadow creates neon glow. Android: elevation approximates it.
|
|
233
|
+
*/}
|
|
234
|
+
{selected && showSelectionIndicator && !showError ? (<react_native_1.View style={[
|
|
235
|
+
styles.selectionRing,
|
|
236
|
+
{
|
|
237
|
+
width: ringSize,
|
|
238
|
+
height: ringSize,
|
|
239
|
+
borderRadius: ringRadius,
|
|
240
|
+
top: ringOffset,
|
|
241
|
+
left: ringOffset,
|
|
242
|
+
},
|
|
243
|
+
react_native_1.Platform.OS === 'ios'
|
|
244
|
+
? {
|
|
245
|
+
shadowColor: theme_1.COLORS.neonCyan,
|
|
246
|
+
shadowOffset: { width: 0, height: 0 },
|
|
247
|
+
shadowOpacity: 0.9,
|
|
248
|
+
shadowRadius: 10,
|
|
249
|
+
}
|
|
250
|
+
: { elevation: 5 },
|
|
251
|
+
]} accessible={false} importantForAccessibility="no"/>) : null}
|
|
252
|
+
</react_native_1.View>);
|
|
253
|
+
// ── Pressable (interactive) ─────────────────────────────────────────────
|
|
254
|
+
if (onPress) {
|
|
255
|
+
return (<react_native_1.Pressable onPress={disabled ? undefined : onPress} disabled={disabled} hitSlop={hitSlop} accessibilityRole="button" accessibilityLabel={computedLabel} accessibilityHint={accessibilityHint} accessibilityState={{ selected, disabled, busy: showSpinner }} style={({ pressed }) => [
|
|
256
|
+
disabled ? styles.disabled : undefined,
|
|
257
|
+
pressed && !disabled ? styles.pressed : undefined,
|
|
258
|
+
]}>
|
|
259
|
+
{innerContent}
|
|
260
|
+
</react_native_1.Pressable>);
|
|
261
|
+
}
|
|
262
|
+
// ── Image-only (non-interactive) ────────────────────────────────────────
|
|
263
|
+
return (<react_native_1.View accessible accessibilityRole="image" accessibilityLabel={computedLabel} accessibilityState={{ disabled, busy: showSpinner }} style={disabled ? styles.disabled : undefined}>
|
|
264
|
+
{innerContent}
|
|
265
|
+
</react_native_1.View>);
|
|
266
|
+
}
|
|
267
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
268
|
+
// Styles
|
|
269
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
270
|
+
const styles = react_native_1.StyleSheet.create({
|
|
271
|
+
slot: {
|
|
272
|
+
// Core contract: fixed square, centered content, no clipping.
|
|
273
|
+
aspectRatio: 1,
|
|
274
|
+
alignItems: 'center',
|
|
275
|
+
justifyContent: 'center',
|
|
276
|
+
// overflow:hidden is intentionally absent — decorative artwork details
|
|
277
|
+
// outside the circular border must remain visible.
|
|
278
|
+
// borderRadius is intentionally absent — we never mask the PNG.
|
|
279
|
+
},
|
|
280
|
+
overlay: {
|
|
281
|
+
// Used by both the loading spinner and the error placeholder.
|
|
282
|
+
position: 'absolute',
|
|
283
|
+
top: 0,
|
|
284
|
+
left: 0,
|
|
285
|
+
alignItems: 'center',
|
|
286
|
+
justifyContent: 'center',
|
|
287
|
+
},
|
|
288
|
+
errorPlaceholder: {
|
|
289
|
+
backgroundColor: theme_1.COLORS.surfaceHigh,
|
|
290
|
+
},
|
|
291
|
+
selectionRing: {
|
|
292
|
+
// Ring lives outside the slot bounds (negative top/left).
|
|
293
|
+
// No parent clips it because slot has no overflow:hidden.
|
|
294
|
+
position: 'absolute',
|
|
295
|
+
borderWidth: 2.5,
|
|
296
|
+
borderColor: theme_1.COLORS.neonCyan,
|
|
297
|
+
},
|
|
298
|
+
disabled: {
|
|
299
|
+
// Communicates unavailability without making the artwork unreadable.
|
|
300
|
+
opacity: 0.42,
|
|
301
|
+
},
|
|
302
|
+
pressed: {
|
|
303
|
+
// Provides clear tactile feedback without distorting the image slot.
|
|
304
|
+
opacity: 0.72,
|
|
305
|
+
transform: [{ scale: 0.94 }],
|
|
306
|
+
},
|
|
307
|
+
});
|
|
308
|
+
//# sourceMappingURL=EchoEmblem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EchoEmblem.js","sourceRoot":"","sources":["../../src/components/EchoEmblem.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EchoProfileCard
|
|
3
|
+
*
|
|
4
|
+
* Presentation-only card showing a signed-in Echo Profile or a guest state.
|
|
5
|
+
* No Supabase, no Expo Router, no app-specific services or contexts.
|
|
6
|
+
*
|
|
7
|
+
* Canonical shared component for @echoform/echo-ui.
|
|
8
|
+
* Rig Vault More-page implementation – theme/rarity imports only changed.
|
|
9
|
+
*/
|
|
10
|
+
import React from 'react';
|
|
11
|
+
import { ImageSource } from 'expo-image';
|
|
12
|
+
import { EchoTitleRarity } from '../titleRarity';
|
|
13
|
+
export type EchoProfileCardProps = {
|
|
14
|
+
signedIn: boolean;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
profileName?: string | null;
|
|
17
|
+
email?: string | null;
|
|
18
|
+
emailVerified?: boolean;
|
|
19
|
+
emblemSource?: ImageSource | null;
|
|
20
|
+
emblemDisplayName?: string;
|
|
21
|
+
title?: {
|
|
22
|
+
displayName: string;
|
|
23
|
+
rarity: EchoTitleRarity;
|
|
24
|
+
} | null;
|
|
25
|
+
accentColor?: string;
|
|
26
|
+
guestItemCount?: number;
|
|
27
|
+
onPress: () => void;
|
|
28
|
+
accessibilityHint?: string;
|
|
29
|
+
};
|
|
30
|
+
export declare function EchoProfileCard({ signedIn, loading, profileName, email, emailVerified, emblemSource, emblemDisplayName, title, accentColor, guestItemCount, onPress, accessibilityHint, }: EchoProfileCardProps): React.JSX.Element;
|
|
31
|
+
//# sourceMappingURL=EchoProfileCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EchoProfileCard.d.ts","sourceRoot":"","sources":["../../src/components/EchoProfileCard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAgC,MAAM,gBAAgB,CAAC;AAM/E,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,eAAe,CAAC;KACzB,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAe,EACf,WAAW,EACX,KAAK,EACL,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,KAAK,EACL,WAA6B,EAC7B,cAAc,EACd,OAAO,EACP,iBAAiB,GAClB,EAAE,oBAAoB,qBAsGtB"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* EchoProfileCard
|
|
4
|
+
*
|
|
5
|
+
* Presentation-only card showing a signed-in Echo Profile or a guest state.
|
|
6
|
+
* No Supabase, no Expo Router, no app-specific services or contexts.
|
|
7
|
+
*
|
|
8
|
+
* Canonical shared component for @echoform/echo-ui.
|
|
9
|
+
* Rig Vault More-page implementation – theme/rarity imports only changed.
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EchoProfileCard = EchoProfileCard;
|
|
16
|
+
const react_1 = __importDefault(require("react"));
|
|
17
|
+
const react_native_1 = require("react-native");
|
|
18
|
+
const vector_icons_1 = require("@expo/vector-icons");
|
|
19
|
+
const theme_1 = require("../theme");
|
|
20
|
+
const titleRarity_1 = require("../titleRarity");
|
|
21
|
+
const EchoEmblem_1 = require("./EchoEmblem");
|
|
22
|
+
const EMBLEM_SIZE = 84;
|
|
23
|
+
const GUEST_AVATAR_SIZE = 52;
|
|
24
|
+
function EchoProfileCard({ signedIn, loading = false, profileName, email, emailVerified, emblemSource, emblemDisplayName, title, accentColor = theme_1.COLORS.neonCyan, guestItemCount, onPress, accessibilityHint, }) {
|
|
25
|
+
var _a;
|
|
26
|
+
// ── Accessibility label ───────────────────────────────────────────────────
|
|
27
|
+
const a11yLabel = signedIn
|
|
28
|
+
? [
|
|
29
|
+
`Echo Profile: ${(_a = profileName !== null && profileName !== void 0 ? profileName : email) !== null && _a !== void 0 ? _a : 'Echo Profile'}.`,
|
|
30
|
+
title ? `Echo Title: ${title.displayName}.` : null,
|
|
31
|
+
'Double tap to manage your Echo Profile.',
|
|
32
|
+
]
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join(' ')
|
|
35
|
+
: 'Guest mode. Double tap to sign in or create an Echo Profile.';
|
|
36
|
+
const borderColor = `${accentColor}44`;
|
|
37
|
+
return (<react_native_1.Pressable onPress={onPress} accessible accessibilityRole="button" accessibilityLabel={a11yLabel} accessibilityHint={accessibilityHint !== null && accessibilityHint !== void 0 ? accessibilityHint : 'Opens the Echo Profile screen'} accessibilityState={{ busy: loading }} style={({ pressed }) => [
|
|
38
|
+
styles.card,
|
|
39
|
+
{
|
|
40
|
+
borderColor,
|
|
41
|
+
shadowColor: accentColor,
|
|
42
|
+
},
|
|
43
|
+
pressed && styles.cardPressed,
|
|
44
|
+
]}>
|
|
45
|
+
<react_native_1.View style={styles.row}>
|
|
46
|
+
{/* ── Avatar / Emblem area ── */}
|
|
47
|
+
<react_native_1.View style={styles.avatarArea}>
|
|
48
|
+
{loading ? (<react_native_1.View style={[
|
|
49
|
+
styles.avatarLoading,
|
|
50
|
+
signedIn
|
|
51
|
+
? styles.avatarLoadingSignedIn
|
|
52
|
+
: styles.avatarLoadingGuest,
|
|
53
|
+
]}>
|
|
54
|
+
<react_native_1.ActivityIndicator size="small" color={accentColor}/>
|
|
55
|
+
</react_native_1.View>) : signedIn ? (emblemSource ? (<EchoEmblem_1.EchoEmblem source={emblemSource} size={EMBLEM_SIZE} displayName={emblemDisplayName}/>) : (<react_native_1.View style={[
|
|
56
|
+
styles.emblemFallback,
|
|
57
|
+
{ width: EMBLEM_SIZE, height: EMBLEM_SIZE },
|
|
58
|
+
]}>
|
|
59
|
+
<vector_icons_1.MaterialIcons name="account-circle" size={EMBLEM_SIZE * 0.72} color={theme_1.COLORS.textMuted}/>
|
|
60
|
+
</react_native_1.View>)) : (<react_native_1.View style={styles.guestAvatar}>
|
|
61
|
+
<vector_icons_1.MaterialIcons name="devices" size={28} color={theme_1.COLORS.textSecondary}/>
|
|
62
|
+
</react_native_1.View>)}
|
|
63
|
+
</react_native_1.View>
|
|
64
|
+
|
|
65
|
+
{/* ── Text block ── */}
|
|
66
|
+
<react_native_1.View style={styles.textBlock}>
|
|
67
|
+
{signedIn ? (<SignedInText profileName={profileName} email={email} emailVerified={emailVerified} title={title}/>) : (<GuestText guestItemCount={guestItemCount}/>)}
|
|
68
|
+
</react_native_1.View>
|
|
69
|
+
|
|
70
|
+
{/* ── Chevron ── */}
|
|
71
|
+
<vector_icons_1.MaterialIcons name="chevron-right" size={20} color={theme_1.COLORS.textMuted}/>
|
|
72
|
+
</react_native_1.View>
|
|
73
|
+
</react_native_1.Pressable>);
|
|
74
|
+
}
|
|
75
|
+
function SignedInText({ profileName, email, emailVerified, title, }) {
|
|
76
|
+
var _a;
|
|
77
|
+
const displayLabel = (_a = profileName !== null && profileName !== void 0 ? profileName : email) !== null && _a !== void 0 ? _a : 'Echo Profile';
|
|
78
|
+
const titleColor = title ? (0, titleRarity_1.rarityColor)(title.rarity) : undefined;
|
|
79
|
+
const titleGlow = title ? (0, titleRarity_1.rarityGlowColor)(title.rarity) : undefined;
|
|
80
|
+
// Glow radius: legendary → 1, other glowing rarities → 7
|
|
81
|
+
const glowRadius = (title === null || title === void 0 ? void 0 : title.rarity) === 'legendary' ? 1 : 7;
|
|
82
|
+
const verifiedText = emailVerified
|
|
83
|
+
? 'Signed in · Verified'
|
|
84
|
+
: 'Signed in · Email not verified';
|
|
85
|
+
return (<>
|
|
86
|
+
<react_native_1.Text style={styles.profileName} numberOfLines={1}>
|
|
87
|
+
{displayLabel}
|
|
88
|
+
</react_native_1.Text>
|
|
89
|
+
|
|
90
|
+
{title ? (<react_native_1.Text style={[
|
|
91
|
+
styles.titleText,
|
|
92
|
+
{ color: titleColor },
|
|
93
|
+
titleGlow
|
|
94
|
+
? {
|
|
95
|
+
textShadowColor: titleGlow,
|
|
96
|
+
textShadowOffset: { width: 0, height: 0 },
|
|
97
|
+
textShadowRadius: glowRadius,
|
|
98
|
+
}
|
|
99
|
+
: undefined,
|
|
100
|
+
]} numberOfLines={1}>
|
|
101
|
+
{title.displayName}
|
|
102
|
+
</react_native_1.Text>) : null}
|
|
103
|
+
|
|
104
|
+
<react_native_1.Text style={[styles.accountNote, { color: theme_1.COLORS.textSecondary }]}>
|
|
105
|
+
{verifiedText}
|
|
106
|
+
</react_native_1.Text>
|
|
107
|
+
</>);
|
|
108
|
+
}
|
|
109
|
+
function GuestText({ guestItemCount }) {
|
|
110
|
+
const countText = typeof guestItemCount === 'number'
|
|
111
|
+
? guestItemCount === 1
|
|
112
|
+
? '1 item in vault'
|
|
113
|
+
: `${guestItemCount} items in vault`
|
|
114
|
+
: null;
|
|
115
|
+
return (<>
|
|
116
|
+
<react_native_1.Text style={styles.profileName}>Guest (This Device)</react_native_1.Text>
|
|
117
|
+
|
|
118
|
+
{countText ? (<react_native_1.Text style={styles.guestItemCount}>{countText}</react_native_1.Text>) : null}
|
|
119
|
+
|
|
120
|
+
<react_native_1.Text style={styles.accountNote}>
|
|
121
|
+
Tap to sign in or create an Echo Profile
|
|
122
|
+
</react_native_1.Text>
|
|
123
|
+
</>);
|
|
124
|
+
}
|
|
125
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
126
|
+
// Styles
|
|
127
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
128
|
+
const styles = react_native_1.StyleSheet.create({
|
|
129
|
+
card: {
|
|
130
|
+
backgroundColor: theme_1.COLORS.surface,
|
|
131
|
+
borderRadius: theme_1.RADIUS.lg,
|
|
132
|
+
borderWidth: 1,
|
|
133
|
+
padding: theme_1.SPACING.lg,
|
|
134
|
+
// iOS shadow
|
|
135
|
+
shadowOffset: { width: 0, height: 0 },
|
|
136
|
+
shadowOpacity: 0.15,
|
|
137
|
+
shadowRadius: 12,
|
|
138
|
+
// Android
|
|
139
|
+
elevation: 4,
|
|
140
|
+
},
|
|
141
|
+
cardPressed: {
|
|
142
|
+
opacity: 0.85,
|
|
143
|
+
},
|
|
144
|
+
row: {
|
|
145
|
+
flexDirection: 'row',
|
|
146
|
+
alignItems: 'center',
|
|
147
|
+
gap: theme_1.SPACING.md,
|
|
148
|
+
},
|
|
149
|
+
avatarArea: {
|
|
150
|
+
alignItems: 'center',
|
|
151
|
+
justifyContent: 'center',
|
|
152
|
+
},
|
|
153
|
+
avatarLoading: {
|
|
154
|
+
alignItems: 'center',
|
|
155
|
+
justifyContent: 'center',
|
|
156
|
+
},
|
|
157
|
+
avatarLoadingSignedIn: {
|
|
158
|
+
width: EMBLEM_SIZE,
|
|
159
|
+
height: EMBLEM_SIZE,
|
|
160
|
+
},
|
|
161
|
+
avatarLoadingGuest: {
|
|
162
|
+
width: GUEST_AVATAR_SIZE,
|
|
163
|
+
height: GUEST_AVATAR_SIZE,
|
|
164
|
+
borderRadius: 26,
|
|
165
|
+
backgroundColor: theme_1.COLORS.surfaceHigh,
|
|
166
|
+
borderWidth: 1,
|
|
167
|
+
borderColor: theme_1.COLORS.border,
|
|
168
|
+
},
|
|
169
|
+
emblemFallback: {
|
|
170
|
+
alignItems: 'center',
|
|
171
|
+
justifyContent: 'center',
|
|
172
|
+
backgroundColor: theme_1.COLORS.surfaceHigh,
|
|
173
|
+
borderRadius: theme_1.RADIUS.md,
|
|
174
|
+
},
|
|
175
|
+
guestAvatar: {
|
|
176
|
+
width: GUEST_AVATAR_SIZE,
|
|
177
|
+
height: GUEST_AVATAR_SIZE,
|
|
178
|
+
borderRadius: 26,
|
|
179
|
+
backgroundColor: theme_1.COLORS.surfaceHigh,
|
|
180
|
+
borderWidth: 1,
|
|
181
|
+
borderColor: theme_1.COLORS.border,
|
|
182
|
+
alignItems: 'center',
|
|
183
|
+
justifyContent: 'center',
|
|
184
|
+
},
|
|
185
|
+
textBlock: {
|
|
186
|
+
flex: 1,
|
|
187
|
+
},
|
|
188
|
+
profileName: {
|
|
189
|
+
color: theme_1.COLORS.textPrimary,
|
|
190
|
+
fontSize: theme_1.FONTS.lg,
|
|
191
|
+
fontWeight: '700',
|
|
192
|
+
},
|
|
193
|
+
titleText: {
|
|
194
|
+
fontSize: theme_1.FONTS.xs,
|
|
195
|
+
fontWeight: '700',
|
|
196
|
+
letterSpacing: 0.4,
|
|
197
|
+
marginTop: 1,
|
|
198
|
+
},
|
|
199
|
+
guestItemCount: {
|
|
200
|
+
color: theme_1.COLORS.textSecondary,
|
|
201
|
+
fontSize: theme_1.FONTS.sm,
|
|
202
|
+
marginTop: 2,
|
|
203
|
+
},
|
|
204
|
+
accountNote: {
|
|
205
|
+
fontSize: theme_1.FONTS.xs,
|
|
206
|
+
color: theme_1.COLORS.neonCyan,
|
|
207
|
+
marginTop: 3,
|
|
208
|
+
fontWeight: '600',
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
//# sourceMappingURL=EchoProfileCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EchoProfileCard.js","sourceRoot":"","sources":["../../src/components/EchoProfileCard.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,8 +3,15 @@
|
|
|
3
3
|
* Public package entry point.
|
|
4
4
|
*
|
|
5
5
|
* Export every public component and utility from here.
|
|
6
|
-
* Consumers import directly: import {
|
|
6
|
+
* Consumers import directly: import { EchoEmblem } from '@echoform/echo-ui'
|
|
7
7
|
*/
|
|
8
8
|
export { EchoUITest } from './components/EchoUITest';
|
|
9
9
|
export type { EchoUITestProps } from './components/EchoUITest';
|
|
10
|
+
export { COLORS, FONTS, SPACING, RADIUS } from './theme';
|
|
11
|
+
export type { EchoTitleRarity } from './titleRarity';
|
|
12
|
+
export { rarityColor, rarityGlowColor } from './titleRarity';
|
|
13
|
+
export { EchoEmblem } from './components/EchoEmblem';
|
|
14
|
+
export type { EchoEmblemProps } from './components/EchoEmblem';
|
|
15
|
+
export { EchoProfileCard } from './components/EchoProfileCard';
|
|
16
|
+
export type { EchoProfileCardProps } from './components/EchoProfileCard';
|
|
10
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGzD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,10 +4,25 @@
|
|
|
4
4
|
* Public package entry point.
|
|
5
5
|
*
|
|
6
6
|
* Export every public component and utility from here.
|
|
7
|
-
* Consumers import directly: import {
|
|
7
|
+
* Consumers import directly: import { EchoEmblem } from '@echoform/echo-ui'
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.EchoUITest = void 0;
|
|
10
|
+
exports.EchoProfileCard = exports.EchoEmblem = exports.rarityGlowColor = exports.rarityColor = exports.RADIUS = exports.SPACING = exports.FONTS = exports.COLORS = exports.EchoUITest = void 0;
|
|
11
|
+
// ── Smoke-test component (remove once real components are established) ────────
|
|
11
12
|
var EchoUITest_1 = require("./components/EchoUITest");
|
|
12
13
|
Object.defineProperty(exports, "EchoUITest", { enumerable: true, get: function () { return EchoUITest_1.EchoUITest; } });
|
|
14
|
+
// ── Design tokens ─────────────────────────────────────────────────────────────
|
|
15
|
+
var theme_1 = require("./theme");
|
|
16
|
+
Object.defineProperty(exports, "COLORS", { enumerable: true, get: function () { return theme_1.COLORS; } });
|
|
17
|
+
Object.defineProperty(exports, "FONTS", { enumerable: true, get: function () { return theme_1.FONTS; } });
|
|
18
|
+
Object.defineProperty(exports, "SPACING", { enumerable: true, get: function () { return theme_1.SPACING; } });
|
|
19
|
+
Object.defineProperty(exports, "RADIUS", { enumerable: true, get: function () { return theme_1.RADIUS; } });
|
|
20
|
+
var titleRarity_1 = require("./titleRarity");
|
|
21
|
+
Object.defineProperty(exports, "rarityColor", { enumerable: true, get: function () { return titleRarity_1.rarityColor; } });
|
|
22
|
+
Object.defineProperty(exports, "rarityGlowColor", { enumerable: true, get: function () { return titleRarity_1.rarityGlowColor; } });
|
|
23
|
+
// ── Components ────────────────────────────────────────────────────────────────
|
|
24
|
+
var EchoEmblem_1 = require("./components/EchoEmblem");
|
|
25
|
+
Object.defineProperty(exports, "EchoEmblem", { enumerable: true, get: function () { return EchoEmblem_1.EchoEmblem; } });
|
|
26
|
+
var EchoProfileCard_1 = require("./components/EchoProfileCard");
|
|
27
|
+
Object.defineProperty(exports, "EchoProfileCard", { enumerable: true, get: function () { return EchoProfileCard_1.EchoProfileCard; } });
|
|
13
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,sDAAqD;AAA5C,wGAAA,UAAU,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,iFAAiF;AACjF,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AAGnB,iFAAiF;AACjF,iCAAyD;AAAhD,+FAAA,MAAM,OAAA;AAAE,8FAAA,KAAK,OAAA;AAAE,gGAAA,OAAO,OAAA;AAAE,+FAAA,MAAM,OAAA;AAIvC,6CAA6D;AAApD,0GAAA,WAAW,OAAA;AAAE,8GAAA,eAAe,OAAA;AAErC,iFAAiF;AACjF,sDAAqD;AAA5C,wGAAA,UAAU,OAAA;AAGnB,gEAA+D;AAAtD,kHAAA,eAAe,OAAA"}
|
package/dist/theme.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export declare const COLORS: {
|
|
2
|
+
readonly bg: "#06080f";
|
|
3
|
+
readonly surface: "#0d1117";
|
|
4
|
+
readonly surfaceHigh: "#141c27";
|
|
5
|
+
readonly surfaceHigher: "#1a2333";
|
|
6
|
+
readonly border: "#1a2535";
|
|
7
|
+
readonly neonCyan: "#00e5ff";
|
|
8
|
+
readonly neonPurple: "#a855f7";
|
|
9
|
+
readonly neonGreen: "#00ff9f";
|
|
10
|
+
readonly neonBlue: "#4488ff";
|
|
11
|
+
readonly neonPink: "#ff4dac";
|
|
12
|
+
readonly echoGold: "#ffaa00";
|
|
13
|
+
readonly glowCyan: "rgba(0, 229, 255, 0.25)";
|
|
14
|
+
readonly glowPurple: "rgba(168, 85, 247, 0.25)";
|
|
15
|
+
readonly glowGreen: "rgba(0, 255, 159, 0.25)";
|
|
16
|
+
readonly glowBlue: "rgba(68, 136, 255, 0.25)";
|
|
17
|
+
readonly textPrimary: "#e8f4ff";
|
|
18
|
+
readonly textSecondary: "#7a9bb5";
|
|
19
|
+
readonly textMuted: "#4a6580";
|
|
20
|
+
readonly error: "#ff4466";
|
|
21
|
+
readonly warning: "#ffaa00";
|
|
22
|
+
};
|
|
23
|
+
export declare const FONTS: {
|
|
24
|
+
readonly xs: 11;
|
|
25
|
+
readonly sm: 13;
|
|
26
|
+
readonly md: 15;
|
|
27
|
+
readonly lg: 17;
|
|
28
|
+
readonly xl: 20;
|
|
29
|
+
readonly xxl: 24;
|
|
30
|
+
readonly xxxl: 30;
|
|
31
|
+
};
|
|
32
|
+
export declare const SPACING: {
|
|
33
|
+
readonly xs: 4;
|
|
34
|
+
readonly sm: 8;
|
|
35
|
+
readonly md: 12;
|
|
36
|
+
readonly lg: 16;
|
|
37
|
+
readonly xl: 20;
|
|
38
|
+
readonly xxl: 24;
|
|
39
|
+
readonly xxxl: 32;
|
|
40
|
+
};
|
|
41
|
+
export declare const RADIUS: {
|
|
42
|
+
readonly sm: 8;
|
|
43
|
+
readonly md: 12;
|
|
44
|
+
readonly lg: 16;
|
|
45
|
+
readonly xl: 20;
|
|
46
|
+
readonly full: 9999;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;CAqBT,CAAC;AAEX,eAAO,MAAM,KAAK;;;;;;;;CAQR,CAAC;AAEX,eAAO,MAAM,OAAO;;;;;;;;CAQV,CAAC;AAEX,eAAO,MAAM,MAAM;;;;;;CAMT,CAAC"}
|
package/dist/theme.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RADIUS = exports.SPACING = exports.FONTS = exports.COLORS = void 0;
|
|
4
|
+
exports.COLORS = {
|
|
5
|
+
bg: '#06080f',
|
|
6
|
+
surface: '#0d1117',
|
|
7
|
+
surfaceHigh: '#141c27',
|
|
8
|
+
surfaceHigher: '#1a2333',
|
|
9
|
+
border: '#1a2535',
|
|
10
|
+
neonCyan: '#00e5ff',
|
|
11
|
+
neonPurple: '#a855f7',
|
|
12
|
+
neonGreen: '#00ff9f',
|
|
13
|
+
neonBlue: '#4488ff',
|
|
14
|
+
neonPink: '#ff4dac',
|
|
15
|
+
echoGold: '#ffaa00',
|
|
16
|
+
glowCyan: 'rgba(0, 229, 255, 0.25)',
|
|
17
|
+
glowPurple: 'rgba(168, 85, 247, 0.25)',
|
|
18
|
+
glowGreen: 'rgba(0, 255, 159, 0.25)',
|
|
19
|
+
glowBlue: 'rgba(68, 136, 255, 0.25)',
|
|
20
|
+
textPrimary: '#e8f4ff',
|
|
21
|
+
textSecondary: '#7a9bb5',
|
|
22
|
+
textMuted: '#4a6580',
|
|
23
|
+
error: '#ff4466',
|
|
24
|
+
warning: '#ffaa00',
|
|
25
|
+
};
|
|
26
|
+
exports.FONTS = {
|
|
27
|
+
xs: 11,
|
|
28
|
+
sm: 13,
|
|
29
|
+
md: 15,
|
|
30
|
+
lg: 17,
|
|
31
|
+
xl: 20,
|
|
32
|
+
xxl: 24,
|
|
33
|
+
xxxl: 30,
|
|
34
|
+
};
|
|
35
|
+
exports.SPACING = {
|
|
36
|
+
xs: 4,
|
|
37
|
+
sm: 8,
|
|
38
|
+
md: 12,
|
|
39
|
+
lg: 16,
|
|
40
|
+
xl: 20,
|
|
41
|
+
xxl: 24,
|
|
42
|
+
xxxl: 32,
|
|
43
|
+
};
|
|
44
|
+
exports.RADIUS = {
|
|
45
|
+
sm: 8,
|
|
46
|
+
md: 12,
|
|
47
|
+
lg: 16,
|
|
48
|
+
xl: 20,
|
|
49
|
+
full: 9999,
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IACpB,EAAE,EAAE,SAAS;IACb,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,SAAS;IACjB,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,yBAAyB;IACnC,UAAU,EAAE,0BAA0B;IACtC,SAAS,EAAE,yBAAyB;IACpC,QAAQ,EAAE,0BAA0B;IACpC,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,SAAS;IACxB,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;CACV,CAAC;AAEE,QAAA,KAAK,GAAG;IACnB,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;CACA,CAAC;AAEE,QAAA,OAAO,GAAG;IACrB,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,GAAG,EAAE,EAAE;IACP,IAAI,EAAE,EAAE;CACA,CAAC;AAEE,QAAA,MAAM,GAAG;IACpB,EAAE,EAAE,CAAC;IACL,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,IAAI,EAAE,IAAI;CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @echoform/echo-ui – Title rarity helpers
|
|
3
|
+
*
|
|
4
|
+
* Canonical rarity colours and glow values shared across all Echo apps.
|
|
5
|
+
*/
|
|
6
|
+
export type EchoTitleRarity = 'common' | 'rare' | 'legendary' | 'mythic';
|
|
7
|
+
/** Returns the foreground colour for a given rarity. */
|
|
8
|
+
export declare function rarityColor(rarity: EchoTitleRarity): string;
|
|
9
|
+
/**
|
|
10
|
+
* Returns the glow/shadow colour for a given rarity, or `undefined` if the
|
|
11
|
+
* rarity has no glow effect (common, rare).
|
|
12
|
+
*/
|
|
13
|
+
export declare function rarityGlowColor(rarity: EchoTitleRarity): string | undefined;
|
|
14
|
+
//# sourceMappingURL=titleRarity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"titleRarity.d.ts","sourceRoot":"","sources":["../src/titleRarity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAgBzE,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAE3E"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @echoform/echo-ui – Title rarity helpers
|
|
4
|
+
*
|
|
5
|
+
* Canonical rarity colours and glow values shared across all Echo apps.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.rarityColor = rarityColor;
|
|
9
|
+
exports.rarityGlowColor = rarityGlowColor;
|
|
10
|
+
const RARITY_COLOR = {
|
|
11
|
+
common: '#00e5ff',
|
|
12
|
+
rare: '#a855f7',
|
|
13
|
+
legendary: '#ff6b00',
|
|
14
|
+
mythic: '#ffd700',
|
|
15
|
+
};
|
|
16
|
+
const RARITY_GLOW = {
|
|
17
|
+
common: undefined,
|
|
18
|
+
rare: undefined,
|
|
19
|
+
legendary: '#ffd700',
|
|
20
|
+
mythic: '#ff6600',
|
|
21
|
+
};
|
|
22
|
+
/** Returns the foreground colour for a given rarity. */
|
|
23
|
+
function rarityColor(rarity) {
|
|
24
|
+
return RARITY_COLOR[rarity];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns the glow/shadow colour for a given rarity, or `undefined` if the
|
|
28
|
+
* rarity has no glow effect (common, rare).
|
|
29
|
+
*/
|
|
30
|
+
function rarityGlowColor(rarity) {
|
|
31
|
+
return RARITY_GLOW[rarity];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=titleRarity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"titleRarity.js","sourceRoot":"","sources":["../src/titleRarity.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAmBH,kCAEC;AAMD,0CAEC;AAzBD,MAAM,YAAY,GAAoC;IACpD,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,WAAW,GAAgD;IAC/D,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,wDAAwD;AACxD,SAAgB,WAAW,CAAC,MAAuB;IACjD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,MAAuB;IACrD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@echoform/echo-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Echoform Productions – shared React Native / Expo UI component library",
|
|
5
5
|
"author": "Echoform Productions",
|
|
6
6
|
"license": "MIT",
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
19
|
"react": ">=18.0.0",
|
|
20
|
-
"react-native": ">=0.73.0"
|
|
20
|
+
"react-native": ">=0.73.0",
|
|
21
|
+
"expo-image": ">=2.0.0",
|
|
22
|
+
"@expo/vector-icons": ">=14.0.0"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {},
|
|
23
25
|
"keywords": [
|
|
@@ -29,7 +31,7 @@
|
|
|
29
31
|
],
|
|
30
32
|
"repository": {
|
|
31
33
|
"type": "git",
|
|
32
|
-
"url": "https://github.com/echoformproductions/Echo-UI.git"
|
|
34
|
+
"url": "git+https://github.com/echoformproductions/Echo-UI.git"
|
|
33
35
|
},
|
|
34
36
|
"publishConfig": {
|
|
35
37
|
"access": "public"
|